Generator for linear Spec-Driven Development (SDD) workflow plugins for Claude Code. Define a workflow in one configs/<name>.yaml file and regenerate all commands, install scripts, and plugin manifests mechanically.
git clone https://github.com/sermakarevich/ccw.git
cd ccw
just install
# or: bash bin/install.sh --localThe installer symlinks ~/.claude/ccw → this repo, installs the ccw CLI (via uv tool install --editable if uv is on PATH, otherwise pip install --user -e), and registers the four Claude Code commands under ~/.claude/commands/ccw/. Re-running the script is idempotent.
| Command | Purpose |
|---|---|
/ccw:scaffold <name> |
Render a workflow plugin from configs/<name>.yaml. Idempotent; preserves hand-written content. |
/ccw:instruct <name> <step> |
Walk through authoring content for a step, bucket by bucket. |
/ccw:validate <name> |
Validate a config against CCW rules. |
/ccw:help [<name>] |
Show workflow overview or per-step content status. |
configs/myflow.yaml:
plugin:
name: myflow
version: "0.1.0"
description: "My workflow"
author:
name: "You"
email: "you@example.com"
repo_url: "https://github.com/you/myflow"
# Optional. Relative path; scaffold writes to <output_dir>/<workflow-name>/ at cwd.
# Omit to write to ./<workflow-name>/. Absolute paths and `..` segments are rejected.
output_dir: examples
common_instructions:
- instructions/common.md
command_instructions:
- instructions
- questionnaires
workflow:
- id: requirements
description: "Gather requirements for a feature"
argument:
name: feature-name
hint: "Name of the feature"
standalone:
- id: chat
description: "Quick chat about a feature"
argument:
name: feature-name
hint: "Feature to chat about"Then:
ccw scaffold myflow # write <output_dir>/myflow/ (or ./myflow/ if unset)
ccw validate myflow # config check
ccw help myflow # per-step content statusconfigs/sddw.yaml ships with this repo and sets output_dir: examples, so ccw scaffold sddw writes to examples/sddw/ — a full worked reference tree (commands, plugin manifest, install script, justfile, size-0 content stubs).
just uninstallRemoves ~/.claude/ccw and ~/.claude/commands/ccw/. The Python CLI remains installed — remove it with uv tool uninstall ccw or pip uninstall ccw.
pip install -e ".[dev]"
pytestccw/— Python package (CLI, rendering, validation)commands/— Claude Code command markdown for/ccw:*configs/— workflow configs (one<name>.yamlper plugin)examples/— committed scaffold outputs for reference (e.g.examples/sddw/).claude-plugin/plugin.json— plugin manifestbin/install.sh— installer (CCW eats its own dogfood; install paths hardcoded)tests/— pytest suite
