A Claude Code skill that scans your installed skills / plugins / agents, recommends a per-stage workflow for a task, and lets you pick which tool runs at each stage.
- Scans every
SKILL.md(user + plugin) and every agent.mdon your machine. - Classifies each one into stages (
discover / plan / design / execute / debug / review / verify / ship+ orthogonalsafety / meta) via a frontmatter-keyword heuristic. Anything the heuristic isn't confident about is left asunclassifiedand filled in on demand by an inline LLM pass. - Recommends a stage sequence for the task you typed.
- Runs a per-stage menu loop — at each stage you see the tools that fit + meta actions (
ask / skip / manual / back / done) + contextual safety/meta helpers. Pick one, run it, advance. - Persists a run log so
/assemble resumepicks up where you stopped.
git clone https://github.com/etinpres/assemble ~/.claude/skills/assemble
# Python 3, stdlib only — no pip install required.Reload Claude Code and run:
/assemble build a small CLI for parsing CSV files
The heuristic classifier is conservative — anything it can't confidently map is left unclassified. Instead of a bulk pre-warm pass, the inline LLM classifier picks up the top-2 unclassified entries most relevant to the current /assemble <task> and classifies them on the spot. Results persist across runs in ~/.claude/channels/assemble/inventory.json, so each task only pays for its relevant classifications — never the whole inventory.
There's also a CLI at bin/classify-inventory for dedicated bulk runs; it emits a JSONL prompt bundle on stdout and applies JSONL responses via --apply <file>. Most users never need it.
Everything is English by default. A Korean locale is bundled:
export ASSEMBLE_LOCALE=ko # menu labels & helper text switch to KoreanTo contribute another locale, copy config/i18n/en.json → config/i18n/<code>.json, translate the strings, and set ASSEMBLE_LOCALE=<code>. Missing keys fall back to English so partial translations still work.
- Python 3 (stdlib only — no external packages).
- Claude Code with the
Skill+AskUserQuestiontools. - Optional:
pytestif you want to run the test suite.
SKILL.md # Claude-facing procedure (the actual skill)
server/ # Stdlib-only Python module
__init__.py # Facade — always import from `server`
inventory.py # Skill/agent scan, heuristic classifier
classify.py # LLM classification prompt + parser
sequence.py # Stage-sequence prompt + parser
menu.py # Stage-menu builder (tools + meta + helpers)
progress.py # Run lifecycle (create / mark / resume / list)
state_store.py # Atomic JSON read/write with file locking
i18n.py # Locale loader (env-var driven)
bin/
classify-inventory # Offline bulk-classification CLI
config/
stages.json # Stage ids only (display text lives in i18n/)
stage_roles.json # Role names used by contextual_helpers
i18n/
en.json # English (default)
ko.json # Korean
tests/ # 56 pytest cases (unit + e2e)
cd ~/.claude/skills/assemble
python3 -m pytest testsExpected: 56 passed in under a second.
- No global skill-name table. The earlier design shipped
pre_mapping.jsonwith a baked-in list of known skills. It was retired because you can't pre-map what isn't installed. Classification now reads each skill's ownSKILL.mdfrontmatter. - User > plugin precedence. If two skills share a name, the user-installed one wins via path-priority first-wins dedupe.
- Corrupt cache is quarantined, not silently destroyed. A bad
inventory.jsonis renamedinventory.json.bad-<ts>and rebuilt. You can inspect the bad file later. - Concurrent writers are safe.
scan()andapply_classification()shareupdate_json_locked, so an/assemblerun and a backgroundclassify-inventorydon't clobber each other. - No skill bodies in the menu.
build_stage_options()returns only{label, kind, description(≤80), tool_path}— bodies load lazily whenSkillactually invokes the tool. - Plays well with other plugins. SessionStart and file-pattern hooks from installed plugins (Vercel, gstack, etc.) are Claude Code runtime behavior; they don't interfere with the
/assemblestage loop. Instead, those plugins' skills get classified into stages and become candidate tools — e.g.vercel-clishows up undership,vercel-agentunderreview/debug.
- Write all code comments in English.
- User-visible strings go in
config/i18n/*.json, never hardcoded. from server import ...only — don't reach into submodules.- Run
python3 -m pytest testsbefore opening a PR.
MIT.