Give Claude Code users one-command, per-skill installs: teach scripts/build-dist.mjs to emit a curated skills/ catalog into dist/ , so npx skills add shawn-sandy/agentics-kit --skill <name> -a claude-code drops a hand-picked, standalone-safe skill into ~/.claude/skills/ without adopting the whole plugin — zero new workflow wiring, source repo layout untouched, and the same catalog remains installable by other skills-CLI agents as a bonus.
Read and implement all steps in the plan at docs/plans/distribute-skills-via-skill-box-catalog.md — Distribute skills via a skill-box catalog (Option 3). Verify against the plan's Tests, Verification, and Acceptance Criteria before reporting done. If everything passed, mark completion in docs/plans/distribute-skills-via-skill-box-catalog.md — tick each step's [x] marker and each criterion's - [x], set status: completed — and re-render the HTML from the spec. If any check failed, leave status: in-progress and say which.
More ways to run this plan — goal & workflow prompts, file path
Achieve this goal: Distribute skills via a skill-box catalog (Option 3). The plan at docs/plans/distribute-skills-via-skill-box-catalog.md describes one approach — use it as reference, but optimize for the outcome. Fan out across parallel subagents where that serves the outcome. Verify against the plan's Tests, Verification, and Acceptance Criteria before reporting done. If everything passed, mark completion in docs/plans/distribute-skills-via-skill-box-catalog.md — tick each step's [x] marker and each criterion's - [x], set status: completed — and re-render the HTML from the spec. If any check failed, leave status: in-progress and say which.
Run a workflow to implement the plan at docs/plans/distribute-skills-via-skill-box-catalog.md — Distribute skills via a skill-box catalog (Option 3). Brief subagents with the plan file at docs/plans/distribute-skills-via-skill-box-catalog.md. Reserve a final verification phase for the lead agent, not a subagent. Verify against the plan's Tests, Verification, and Acceptance Criteria before reporting done. If everything passed, mark completion in docs/plans/distribute-skills-via-skill-box-catalog.md — tick each step's [x] marker and each criterion's - [x], set status: completed — and re-render the HTML from the spec. If any check failed, leave status: in-progress and say which.
distribute-skills-via-skill-box-catalog.html
docs/plans/distribute-skills-via-skill-box-catalog.html
docs/plans/distribute-skills-via-skill-box-catalog.md
Context
The story behind this plan — what prompted the work and why it matters now.
The repo distributes plugins through the Claude Code plugin marketplace ( .claude-plugin/marketplace.json → scripts/build-dist.mjs → published to agentics-kit by .github/workflows/publish-dist.yml ). The vercel-labs/skills CLI ( npx skills ) is a separate, cross-agent channel that installs individual skills (any directory with a SKILL.md carrying name + description ) into Claude Code ( ./.claude/skills/ or ~/.claude/skills/ ) — and into 70+ other agents, though Claude Code users are the primary audience here. For a Claude user the catalog's value is granularity: install one curated skill without adopting its whole plugin via /plugin install .
That CLI discovers skills under a root skills/ directory (flat skills/<name>/SKILL.md or catalog skills/<category>/<name>/SKILL.md ). This repo nests skills at kit/plugins/<plugin>/skills/<name>/SKILL.md — too deep for a bare repo-level install to find. Option 3 closes that gap by having build-dist.mjs emit a curated skills/ catalog into dist/ , which the existing publish step copies to the agentics-kit root.
Decisions already made (do not re-litigate):
Catalog home: dist/ only → published to agentics-kit . Install surface is npx skills add shawn-sandy/agentics-kit . Source repo stays clean; no new workflow wiring.
Curation: an explicit allowlist in scripts/skill-catalog.json plus a build-time lint guard — not a heuristic.
Layout: catalog form dist/skills/<plugin>/<skill>/… , copying the whole skill directory (skill dirs carry references/ , assets/ , scripts/ ).
Hard constraints discovered during investigation:
The skills CLI copies only the skill directory — no sibling commands/ , agents/ , or hooks/ . Any skill whose SKILL.md body invokes a /<plugin>:<command> , spawns a plugin agent, or relies on a hook is broken when installed standalone. Curation must exclude these.
A heuristic like "plugins with no commands/ dir" is unreliable: kit/plugins/issue-agent/skills/create-issue/SKILL.md references a slash command despite issue-agent being skills-only.
On the user's machine the CLI flattens installs to .claude/skills/<name>/ , so cataloged skill names must be globally unique. They are today (no duplicate SKILL.md directory names across plugins) — the build must enforce this so a future collision fails the build, not the user's install.
Skill dirs carry real payload (58 supporting files across references/ , assets/ , scripts/ , reference/ ). The copy must take the whole dir.
Frontmatter: every SKILL.md already has name + description . The extra allowed-tools key is Claude-specific and ignored by other agents — leave it.
Files that change
Every file this plan touches, and what happens to each one.
- scripts/
build-dist.mjsmodified buildSkillCatalog() pass + check() extensionskill-catalog.jsonnew curated allowlist of exported skills
- tests/publish/
smoke-clean-dist.shmodified assert catalog presence in disttest-skill-catalog.mjsnew catalog validation test
.claude/rules/marketplace.mdmodified name the curation surface.github/workflows/publish-dist.ymlmodified run the new catalog testCHANGELOG.mdmodified [Unreleased] entry for the skill-box channelCLAUDE.mdmodified note the skill-box channelREADME.mdmodified npx skills add install instructionsdocs/plans/distribute-skills-via-skill-box-catalog.htmlnew this plan — commit with the changestests/fixtures/skill-catalog/new valid + invalid stub SKILL.md fixtures
Steps
The step-by-step work, in order — each step says what to do, why it matters, and how to check it worked.
Tests
The tests that prove the change does what it promises.
Definition of done
The plan counts as done when every statement below is true — check each one off as you verify it.
Final check
One last pass to confirm the whole change works end to end.
Before implementation: confirm the npx skills CLI discovers the two-level skills/<plugin>/<skill>/ catalog layout — read the CLI source or run npx skills add against a scratch repo carrying both layouts. If only flat skills/<name>/ is supported, flatten the catalog to dist/skills/<skill-name>/ and adjust Steps 3–6 before coding.
node scripts/build-dist.mjs — confirm dist/skills/<plugin>/<skill>/ is created for each allowlist entry, with SKILL.md and all support files.
node scripts/build-dist.mjs --check — passes (catalog present, names unique, no DROP leaks).
bash tests/publish/smoke-clean-dist.sh — passes with the new catalog assertions.
node tests/publish/test-skill-catalog.mjs — passes.
Negative checks: temporarily add a non-existent skill, a duplicate name, and a skill with a /plugin:command ref to skill-catalog.json ; confirm the build throws on each, then revert.
Manual end-to-end (optional, post-publish): in a scratch dir, npx skills add shawn-sandy/agentics-kit --skill agentic-memory-doctor -a claude-code -y ; confirm it lands in .claude/skills/ and that the skill auto-activates in a fresh Claude Code session when a matching request is made.
Wrapping up
Three gates that must all pass before this plan is marked completed.
Completion Report
No items to report — all requirements met.