RoninForge / Tsuba

~660 tokens | View as Markdown |

Tsuba

v0.2.1

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.

Quickstart

Four commands cover the shipping path: scaffold, fill in the placeholder content, validate, commit.

  1. 1 Scaffold a plugin directory with tsuba new plugin my-plugin.
  2. 2 Edit skills/hello/SKILL.md. Describe when Claude should load it.
  3. 3 Run tsuba validate to catch any schema issues via hanko.
  4. 4 Commit, push, and submit to a marketplace.
$ 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

Commands

CommandPurpose
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 doctorReport local environment state (hanko on PATH, git identity, cwd).
tsuba list marketplacesShow the four supported marketplace submission targets and their quirks.
tsuba versionPrint version, commit, and build date.

GitHub Action

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

What it will not do

No network on scaffold

tsuba new is fully offline. Templates live embedded inside the binary; no registry, no phone-home.

No write outside target

The scaffolder refuses to write outside the directory it was asked to create, even if a template is modified to try.

No lock-in

The scaffolded output is plain Markdown and JSON. You can edit, move, rename, or delete any generated file without coming back to tsuba.

Frequently asked questions

What does tsuba scaffold? +

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.

How is tsuba different from hanko? +

Hanko validates existing plugin manifests. Tsuba generates new plugin directories. They stack: tsuba scaffolds a plugin, then delegates to hanko to validate it.

Do I need hanko installed? +

Only for tsuba validate. Scaffolding works without it. Run tsuba doctor to see the state of your environment.

Will the generated plugin pass marketplace submission? +

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.

Why the name Tsuba? +

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.

How do I install tsuba? +

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).