--- name: "cs-book-to-plugin" description: "/cs:book-to-plugin [--domain ] — wrap a compiled book skill in a claude-skills plugin package (manifest + cs-* agent + /cs:* command + README) so the rest of the library can route to it. Use after /cs:book-to-skill, or when an existing knowledge-base skill folder needs to become an installable plugin." --- # /cs:book-to-plugin — Ingest a Compiled Skill into the Library **Command:** `/cs:book-to-plugin [--domain ] [--rights ]` A folder in `~/.claude/skills/` is invisible to this repository: no manifest, no agent, no command, no marketplace entry, so nothing else in the library can route to it. This command closes that gap. ## What it emits ``` // ├── .claude-plugin/plugin.json manifest, ./skills/, provenance + rights metadata ├── README.md what the skill knows, where it came from, its limits ├── agents/cs-.md persona that answers from the source and cites chapters ├── commands/cs-.md /cs: [topic | framework | chNN] └── skills// the compiled skill, copied verbatim ``` …then prints the `.claude-plugin/marketplace.json` entry to register. It never edits marketplace.json itself — registration is a repo-wide change and stays a human decision. ## Gates | Gate | Behaviour | |------|-----------| | Source has no `SKILL.md` | Refuses. This is not a compiled book skill. | | Source has validation errors | Refuses and lists them. A package built on a broken index stays broken. `--skip-validation` overrides, and is almost always the wrong call. | | Destination already exists | Refuses without `--force`. | | `--distribution shareable` without `--rights` | **Refuses.** Compiled notes from a copyrighted work are personal study notes; redistributing them needs a basis. | Accepted rights bases: `public-domain`, `open-license`, `internal-docs`, `author-permission`. Fair use is deliberately not one — it is a defence, not a licence, and not a script's call. Without a basis the package emits as `--distribution local` and records `source.cleared_for_distribution: false` in the manifest. ## Run ```bash SKILL_ROOT=engineering/book-to-skill/skills/book-to-skill # see exactly what would be written, first python3 "$SKILL_ROOT/scripts/skill_plugin_emitter.py" \ --skill-dir ~/.claude/skills/ \ --dest ./engineering --domain engineering \ --source-note " by " \ --dry-run # write it python3 "$SKILL_ROOT/scripts/skill_plugin_emitter.py" \ --skill-dir ~/.claude/skills/ \ --dest ./engineering --domain engineering \ --source-note " by " ``` ## After emitting 1. Paste the printed entry into `.claude-plugin/marketplace.json` → `plugins`. 2. Re-derive the headline counters: `python3 scripts/derive_counters.py --check`, then update `README.md`, `CLAUDE.md` and the marketplace description to match. 3. Read the generated agent and command — they are scaffolds keyed to the source, and the voice is worth a pass by hand. 4. Open the PR against `dev`. Never `main`. ## Related - `/cs:book-to-skill` — compile the source in the first place - `/cs:plugin-audit` — 8-phase audit of the emitted package before merge