feat: rewrite build-skills.ts as copy-only from the pinned boxel-skills tag#5501
Merged
lukemelia merged 5 commits intoJul 14, 2026
Conversation
boxel-skills is markdown-first now — skills/<name>/SKILL.md directories and commands/<name>.md slash-command files are already in the shape Claude Code consumes — so the cards-to-SKILL.md transform (aggregator emission, description overrides, host-only exclusions) is gone. The script copies skills/ and commands/ verbatim into plugin/, keeps the pinned-tag model (bumped to v0.0.28, the first tag with the new layout), and keeps the manifest-based stale sweep, now covering commands too. The plugin README's auto-generated block lists both catalogs from each file's frontmatter; the publish workflow stages the new outputs. Linear: CS-11543 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The on-main publish workflow runs build:skills and commits the content cutover itself; this branch carries only the build machinery. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
lukemelia
force-pushed
the
cs-11543-rewrite-packagesboxel-cliscriptsbuild-skillsts-as-copy-only
branch
from
July 14, 2026 20:02
a7e9095 to
410876f
Compare
…agesboxel-cliscriptsbuild-skillsts-as-copy-only
lint-staged routes staged markdown through prettier, which rewrites the verbatim copies away from the upstream bytes (its markdown parser even mangles underscore emphasis like error_doc). Ignore plugin/skills/ and plugin/commands/ so pre-commit and format passes leave the copies alone, and restore the one file the hook already mangled. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR rewrites packages/boxel-cli/scripts/build-skills.ts to stop generating/translating skill content and instead verbatim-copy skills/ and commands/ from a pinned cardstack/boxel-skills git tag into packages/boxel-cli/plugin/, while keeping a manifest-based stale sweep and regenerating the plugin README tables from frontmatter.
Changes:
- Replace the previous JSON-card → markdown emission pipeline with a copy-only pipeline from
boxel-skills@v0.0.28, including stale-entry sweeping for bothplugin/skills/andplugin/commands/. - Update unit tests to cover the new manifest shape/back-compat and the minimal frontmatter parser used for README table generation.
- Ensure repo formatting tooling doesn’t rewrite the copied markdown, and ensure the publish workflow stages the new generated surfaces.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| packages/boxel-cli/scripts/build-skills.ts | Replaces “emit” logic with copy-only skills/ + commands/, updates manifest shape, and updates README regeneration from frontmatter. |
| packages/boxel-cli/tests/scripts/build-skills.test.ts | Drops emission-plan tests; adds coverage for new manifest parsing/back-compat and frontmatter parsing. |
| .prettierignore | Ignores copied plugin markdown to avoid prettier drifting verbatim upstream bytes. |
| .github/workflows/boxel-cli-publish.yml | Adds plugin/commands, plugin/README.md, and the manifest to the staged regen commit set. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
The README auto-gen skill table emitted bare frontmatter names (e.g. `boxel`) while the command table and all surrounding README text use the `/boxel-cli:<name>` slash-invocation form. Key skill rows by their directory name with the same prefix, matching the command loop. Extract the block builder into a pure `renderCatalogBlock` so the table/escaping/prefixing logic is unit-tested without touching the real plugin README. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
habdelra
approved these changes
Jul 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linear: CS-11543
boxel-skills is markdown-first now (
skills/<name>/SKILL.md+references/+scripts/directories,commands/<name>.mdslash-command files), so the plugin build no longer transforms Skill card JSON into SKILL.md files. Per Spec §7,build-skills.tsreduces to copyingskills/andcommands/from the pinned tag intoplugin/, byte-for-byte.This PR ships only the machinery (4 files). The ~234-file content cutover is intentionally not committed here: the on-main publish workflow runs
pnpm build:skillsafter merge and commits the regeneratedplugin/itself, as it does for every regen. The content is byte-copies of the already-reviewed boxel-skills v0.0.28 tag.What stays, per the ticket:
boxel.commands→boxel.toolsrename.BOXEL_SKILLS_REPO=/pathstill overrides for local iteration.scripts/.boxel-skills-manifest.jsonrecords copied skills and commands; entries that drop out of the source get deleted fromplugin/. CLI-authored skills (file-ops,realm-sync, …) are never in the manifest, so the sweep can't touch them. The old manifest shape (nocommandskey) still loads, which is what lets the first post-merge run sweep the four retired generated dirs (boxel-development,dev-*).What's gone: the SkillSet/SkillPlusMarkdown emission plan,
DESCRIPTION_OVERRIDES, andEXCLUDED_IDS— descriptions are authored in each SKILL.md's frontmatter, and the new content is written for this consumer (the previously host-onlyboxel-environmentmaterial now drives Boxel vianpx boxel).New surfaces after the post-merge regen:
plugin/commands/ships the 17 upstream commands as/boxel-cli:<name>slash commands.plugin/README.md's auto-generated block gains skill and command tables, read from frontmatter (minimal single-line reader — the copied files are the contract; the table is a convenience). The README is the only file the script still prettier-formats.plugin/commands,plugin/README.md, and the manifest alongsideplugin/skills..prettierignorecoversplugin/skills/andplugin/commands/: lint-staged routes staged markdown through prettier, which rewrites the verbatim copies away from upstream bytes (its markdown parser even mangles underscore emphasis likeerror_doc). Verifiedeslint .andtscare unaffected by the copied content (including the patterns'example.gtsfiles, which this package's eslint config doesn't lint).Verified: copies are byte-identical to the tag (
diff -r; the only extras underplugin/skills/are the nine CLI-authored skills), a secondpnpm build:skillsrun is a no-op, 13 unit tests cover manifest back-compat / stale-sweep math / the frontmatter reader, and the full boxel-cli unit suite passes (348).Version bump is left to the release automation (
feat:+ plugin surface → minor).🤖 Generated with Claude Code