Scaffold, validate, and publish new Claude Code plugins with proper structure, MCP tool wiring, AND the canonical plugin contract (ADR + smoke + Compatibility + namespace coordination).
/plugin marketplace add ruvnet/ruflo
/plugin install ruflo-plugin-creator@ruflo
- Scaffold plugins: Generate complete plugin directory structure in seconds, including the canonical contract (ADR-0001, scripts/smoke.sh, README contract sections)
- Validate format: Check plugin.json, SKILL.md frontmatter, and file references
- MCP tool wiring: Auto-discover and wire ruflo MCP tools into skills, with drift warnings for known-broken tool references (
embeddings_embed, namespace passed toagentdb_hierarchical-*/agentdb_pattern-*) - Marketplace integration: Update marketplace.json for distribution
/create-plugin-- Interactively scaffold a new Claude Code plugin
create-plugin-- Generate plugin structure with skills, commands, agents, ADR-0001, smoke test, and contract sectionsvalidate-plugin-- Validate plugin format and catch issues before publishingcreate-mod-- Scaffold a Claude Code mod (function hooks) fromtemplates/mod/(scripts/scaffold-mod.mjs <name> <dir>; the manifest isplugin.json.tmplso validators do not read it as a nested plugin): hybridhooks.jsonwith a classic fallback that stands down while the module runs, a host adapter over literal$calls,userConfig, engine-kit tests, tsconfig. Validated withclaude plugin validateandclaude plugin test(ruflo ADR-404)
- CLI: pinned to
@claude-flow/cliv3.6 major+minor. - Verification:
bash plugins/ruflo-plugin-creator/scripts/smoke.shis the contract.
Every plugin scaffolded by this plugin inherits the same shape every other plugin in the ruflo family adopted via its own ADR-0001:
plugins/<name>/
├── .claude-plugin/plugin.json # version, keywords, mcp keyword
├── skills/<skill>/SKILL.md # name + description + allowed-tools (no wildcards)
├── commands/<command>.md # name + description + dispatch logic
├── agents/<agent>.md # name + description + model
├── docs/adrs/0001-<name>-contract.md # ADR (Proposed) — pinning, namespace, smoke scope
├── scripts/smoke.sh # Structural contract, ≥8 checks
└── README.md # Compatibility + Namespace coordination + Verification + ADR
Lessons learned from sibling-ADR fixes — the scaffolder warns about these:
bash plugins/ruflo-plugin-creator/scripts/smoke.sh
# Expected: "11 passed, 0 failed"ruflo-agentdb— namespace convention owner;agentdb_controllersruntime is the canonical controller listruflo-cost-tracker,ruflo-market-data,ruflo-migrations,ruflo-observability— each fixed namespace-routing bugs the scaffolder now warns aboutruflo-knowledge-graph,ruflo-market-data— each fixedembeddings_embedreferences the scaffolder now warns about
Function-hook mod (ADR-445, pattern of ruflo-agentdb), loaded from hooks/hooks.json → hooks/register.ts. This plugin's own tools only search the plugin store, so there is no guard and no userConfig: the mod is a local command and a status file.
- Command:
/creator-modanswers locally with no model call, read-only. Verbs:status;reserved <plugin-dir>lists the command and skill names a plugin already uses (a mod command must not reuse one);check <plugin-dir>summarises its manifest,hooks.jsonmodules anduserConfigoptions. Paths with..are refused. - Status file:
.claude-flow/creator-mod/status.json({version, updatedMs, checked, reserved, lastTarget}). - Safety: no network, no process spawning.
- Scaffold status contract (0.4.1):
/create-modscaffoldshooks/status.ts, which writes.claude-flow/<name>-mod/status.jsonwith the fields the console's Mods section reads:version: 1,summary,modVersion,guard,calls(a number),blocked,lastDenied(only once the mod has refused something), plusupdatedMs/startedMs. The scaffold'stests/status.test.tsasserts that shape; the steps are inskills/create-mod/SKILL.md. - Test:
claude plugin validate plugins/ruflo-plugin-creator,claude plugin test plugins/ruflo-plugin-creator,bash plugins/ruflo-plugin-creator/scripts/smoke.sh. The runner sweeps intemplates/mod/tests(the scaffold's own test, which only passes against a scaffolded mod), so expect that one file to fail from the plugin root.node plugins/ruflo-plugin-creator/scripts/test-scaffold-mod.mjsscaffolds a mod from the template and holds it toclaude plugin validateandclaude plugin test.
