RoninForge / Tsuba
Scaffold marketplace-ready Claude Code skills and plugins in seconds. Every scaffolded plugin ships with a correct .claude-plugin/plugin.json, a sample skill, LICENSE, and README, and passes hanko validation on the first run.
鍔 (tsuba) is the guard on a katana - the disc between blade and handle that lets a swordsman grip the blade safely and hand it off. tsuba does the same for your plugin: gives it a handle marketplaces can accept cleanly.
Also install hanko for tsuba validate to work.
Four commands cover the shipping path: scaffold, fill in the placeholder content, validate, commit.
tsuba new plugin my-plugin.skills/hello/SKILL.md. Describe when Claude should load it.tsuba validate to catch any schema issues via hanko.$ tsuba new plugin my-plugin Scaffolded plugin at my-plugin .claude-plugin/plugin.json README.md LICENSE skills/hello/SKILL.md $ cd my-plugin && tsuba validate ok ./.claude-plugin/plugin.json: clean
| Command | Purpose |
|---|---|
| tsuba new plugin <name> | Scaffold a full plugin directory with a sample skill. |
| tsuba new skill <name> | Scaffold a standalone SKILL.md under skills/<name>/. |
| tsuba validate [path] | Delegate to hanko for plugin manifest validation. |
| tsuba doctor | Report local environment state (hanko on PATH, git identity, cwd). |
| tsuba list marketplaces | Show the four supported marketplace submission targets and their quirks. |
| tsuba version | Print version, commit, and build date. |
Drop this into .github/workflows/validate.yml on any plugin repo. The action installs tsuba and hanko and runs tsuba validate on every PR.
name: Plugin validation on: pull_request: paths: [ '.claude-plugin/**' ] jobs: tsuba: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: RoninForge/tsuba@v0
tsuba new is fully offline. Templates live embedded inside the binary; no registry, no phone-home.
The scaffolder refuses to write outside the directory it was asked to create, even if a template is modified to try.
The scaffolded output is plain Markdown and JSON. You can edit, move, rename, or delete any generated file without coming back to tsuba.
Today, two kinds: a full Claude Code plugin directory (.claude-plugin/plugin.json + sample skill + LICENSE + README) and a standalone SKILL.md under skills/<name>/. Hook and agent scaffolding ships in v0.2.
Hanko validates existing plugin manifests. Tsuba generates new plugin directories. They stack: tsuba scaffolds a plugin, then delegates to hanko to validate it.
Only for tsuba validate. Scaffolding works without it. Run tsuba doctor to see the state of your environment.
Yes for the base schema. tsuba list marketplaces prints the four supported targets and their quirks. Per-marketplace overlays (buildwithclaude directory conventions, cc-marketplace stricter required fields) land in v0.2 with tsuba publish.
Tsuba (鍔) is the guard on a katana - the disc between blade and handle that lets a swordsman grip the blade safely and hand it off to someone else. tsuba the tool does the same thing for your plugin.
Run curl -fsSL https://roninforge.org/tsuba/install.sh | sh. Then install hanko so tsuba validate works: curl -fsSL https://roninforge.org/hanko/install.sh | sh. Or use Homebrew: brew install roninforge/tap/tsuba && brew install roninforge/tap/hanko. Supports macOS, Linux (amd64, arm64), and Windows (amd64).
Tsuba is part of RoninForge. Sibling: Hanko (plugin manifest validator). Also shipped: BudgetClaw (Claude Code spend monitor).