From f4a3cc104b559156e0689ff8ad9962cbc896f44f Mon Sep 17 00:00:00 2001 From: Matt Van Horn Date: Wed, 15 Apr 2026 09:25:45 -0400 Subject: [PATCH] fix: restore skills/ and .claude-plugin/ in plugin install tarball (#262) v3.0.1 added .gitattributes rules that excluded both directories from git archive output, shrinking the claude.ai .skill bundle. But Claude Code's /plugin install fetches the SAME archive, so users installing v3.0.1 or v3.0.2 received a tarball with no plugin manifest and no skill files. Install appeared successful but the plugin was a useless empty shell. Proof: git archive v3.0.0 | grep 'skills/|\.claude-plugin/' | wc -l # 8 git archive v3.0.1 | grep 'skills/|\.claude-plugin/' | wc -l # 0 git archive v3.0.2 | grep 'skills/|\.claude-plugin/' | wc -l # 0 No issue reports yet because: - Cached pre-v3.0.1 installs keep working (it's the new-install path that's broken) - The breakage is under 24 hours old - Users invoking the skill via natural language go through skill-selector rather than /last30days slash command Also reverts v3.0.2's "skills": ["skills"] back to "./", the value that shipped in every tag from v2.1.0 through v3.0.0. That change was a misdiagnosis; the manifest wasn't in the tarball anyway so it had no effect on user-visible installs. Archive file count after fix: 97 (cap is 200, plenty of room). Follow-up: move claude.ai-specific bundle exclusions into scripts/build-skill.sh where they belong, rather than .gitattributes which cannot distinguish between the two distribution channels. Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 4 ++-- .gitattributes | 8 ++++---- CHANGELOG.md | 16 ++++++++++++++++ gemini-extension.json | 2 +- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index aef8f1b..b607b63 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -10,7 +10,7 @@ { "name": "last30days", "description": "Research any topic across Reddit, X, YouTube, TikTok, Instagram, HN, Polymarket, GitHub, and 5+ more sources.", - "version": "3.0.2", + "version": "3.0.3", "author": { "name": "Matt Van Horn", "url": "https://github.com/mvanhorn" diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 8d40c9d..56045f0 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "last30days", - "version": "3.0.2", + "version": "3.0.3", "description": "Research any topic across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, GitHub, and 5+ more sources. AI agent scores by upvotes, likes, and real money - not editors.", "author": { "name": "Matt Van Horn", @@ -11,6 +11,6 @@ "repository": "https://github.com/mvanhorn/last30days-skill", "license": "MIT", "keywords": ["research", "reddit", "twitter", "youtube", "tiktok", "instagram", "trends", "prompts", "polymarket", "github", "perplexity", "threads", "pinterest", "eli5", "hacker-news"], - "skills": ["skills"], + "skills": ["./"], "hooks": {} } diff --git a/.gitattributes b/.gitattributes index 5769a19..06fa5fc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16,9 +16,10 @@ docs/ export-ignore fixtures/ export-ignore assets/ export-ignore -# Second SKILL.md files would confuse claude.ai's uploader -# (skills/last30days/ is an internal spec; skills/last30days-nux/ is a symlink) -skills/ export-ignore +# NOTE: skills/ and .claude-plugin/ are NOT export-ignored here because +# Claude Code's /plugin install fetches this same git archive tarball. +# Removing those from the archive (as v3.0.1 did) silently breaks installs. +# claude.ai-bundle-specific exclusions live in scripts/build-skill.sh. # Historical + repo-only manifests SKILL-original.md export-ignore @@ -35,7 +36,6 @@ uv.lock export-ignore .agents/ export-ignore .codex-plugin/ export-ignore .hermes-plugin/ export-ignore -.claude-plugin/ export-ignore # CI workflows - repo-only, not needed at skill runtime .github/ export-ignore diff --git a/CHANGELOG.md b/CHANGELOG.md index 6309ed2..9fff660 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.0.3] - 2026-04-15 + +### Fixed + +- **Restored `skills/` and `.claude-plugin/` to the plugin install tarball.** v3.0.1 added `.gitattributes` rules that excluded both directories from `git archive` output to shrink the claude.ai `.skill` bundle. Claude Code's `/plugin install` fetches the same archive, so users installing v3.0.1 or v3.0.2 received a tarball with no plugin manifest and no skill files. `git archive v3.0.0` contained 8 files under those paths; `v3.0.1` and `v3.0.2` contained 0. This release reverts those `.gitattributes` lines. +- **Reverted `plugin.json` `"skills"` field to `["./"]`.** v3.0.2 changed this to `["skills"]` based on a misdiagnosis — the manifest change had no effect because the manifest wasn't in the tarball at all. The historical `["./"]` value shipped in every release from v2.1.0 through v3.0.0 without issues and is restored here. + +### Recovery + +Users on v3.0.1 or v3.0.2: run `/plugin update last30days` then `/reload-plugins`. If autoUpdate is enabled, the next session start will pull v3.0.3 automatically. Users on cached v3.0.0 or earlier installs were unaffected. + +### Notes + +- The claude.ai `.skill` bundle built by `scripts/build-skill.sh` still works — the archive grew from 89 to 97 files, well under the 200-file cap. +- claude.ai-specific exclusions (avoiding duplicate `SKILL.md` files in the bundle) should move into `scripts/build-skill.sh` rather than `.gitattributes` in a future release, since `.gitattributes` cannot distinguish between the two distribution channels. + ## [3.0.2] - 2026-04-15 ### Fixed diff --git a/gemini-extension.json b/gemini-extension.json index 9ce995c..8a202bf 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "last30days-skill", - "version": "3.0.2", + "version": "3.0.3", "description": "Research a topic from the last 30 days across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web.", "settings": [ {