2103dde889
A pipeline template may now declare the slash command that drives it (`skill`), so the choice of pipeline is the choice of workflow rather than just a picture on the dashboard: - `ccam ship-full "<req>"` runs the 16-node `ship-feature` template's skill (`/ccam:ship-feature-lane`) — through gates, QC and the senior gate to a published PR, watched until a human merges it. - `ccam ship-quick "<req>"` runs the 8-node `default` template's skill (`/ccam:ship-feature`) — in-repo feature work that stops at the gate. Each command puts the lane on its own template before spawning, so the dashboard renders the right node count from the first stage instead of after the skill self-corrects. `--print` shows the command, switches nothing and runs nothing. The prompt reaches `claude` as one argv element, never through a shell. The same field feeds the Workspace run console, which pre-fills its prompt with the lane's driving skill and never overwrites a prompt the user has already edited.
279 lines
5.7 KiB
JSON
279 lines
5.7 KiB
JSON
{
|
|
"id": "ship-feature",
|
|
"name": "Ship feature (lane pipeline)",
|
|
"skill": "/ccam:ship-feature-lane",
|
|
"nodes": [
|
|
{
|
|
"id": "intake",
|
|
"label": "intake",
|
|
"icon": "📝",
|
|
"gate": false,
|
|
"aliases": [
|
|
"assigned",
|
|
"claimed",
|
|
"start",
|
|
"bootstrapping"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Skill",
|
|
"match": "brainstorming"
|
|
},
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bccam\\b[^;&|]*\\bfeature activate\\b"
|
|
},
|
|
{
|
|
"tool": "Agent",
|
|
"match": "^Explore$"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "plan",
|
|
"label": "plan",
|
|
"icon": "🧭",
|
|
"gate": false,
|
|
"aliases": [
|
|
"planning",
|
|
"brainstorm",
|
|
"design"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Skill",
|
|
"match": "writing-plans"
|
|
},
|
|
{
|
|
"tool": "Write",
|
|
"match": "docs/superpowers/specs/lane-.*\\.md"
|
|
},
|
|
{
|
|
"tool": "Agent",
|
|
"match": "^Plan$|Software Architect"
|
|
},
|
|
{
|
|
"tool": "TaskCreate"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "implementing",
|
|
"label": "implement (TDD)",
|
|
"icon": "🛠",
|
|
"gate": false,
|
|
"aliases": [
|
|
"implement",
|
|
"coding",
|
|
"build"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Skill",
|
|
"match": "test-driven-development|executing-plans|subagent-driven-development|systematic-debugging"
|
|
},
|
|
{
|
|
"tool": "Edit",
|
|
"match": "^(?!.*docs/superpowers/specs/)"
|
|
},
|
|
{
|
|
"tool": "Write",
|
|
"match": "^(?!.*(?:^|/)docs/)"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "gates",
|
|
"label": "CI gates + preflight",
|
|
"icon": "🧪",
|
|
"gate": true,
|
|
"aliases": [
|
|
"pre-push-gate",
|
|
"tests",
|
|
"migration-collision",
|
|
"sync-conflict"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bccam\\b[^;&|]*(\\bhook ci-gate\\b|\\bsync-base --check\\b)"
|
|
},
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\b(npm (run )?test|pytest|vitest|jest|go test|cargo test|node\\s+--test|rspec|phpunit|dotnet test|mvn test|gradle test)\\b"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "e2e-feature",
|
|
"label": "e2e on feature branch",
|
|
"icon": "🧪",
|
|
"gate": false,
|
|
"aliases": [
|
|
"e2e",
|
|
"e2e-scoped",
|
|
"booting",
|
|
"live"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bccam\\b[^;&|]*(\\bup --qc\\b|\\bhook e2e\\b)"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "e2e-feature-passed",
|
|
"label": "e2e passed",
|
|
"icon": "🧪",
|
|
"gate": true,
|
|
"aliases": [
|
|
"e2e-passed"
|
|
]
|
|
},
|
|
{
|
|
"id": "review",
|
|
"label": "code review",
|
|
"icon": "👀",
|
|
"gate": true,
|
|
"aliases": [
|
|
"reviewing",
|
|
"code-review",
|
|
"self-review"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Skill",
|
|
"match": "code-review|requesting-code-review|receiving-code-review"
|
|
},
|
|
{
|
|
"tool": "Agent",
|
|
"match": "(?<!senior-gate-)[Rr]eviewer"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "qc-plan",
|
|
"label": "QC plan",
|
|
"icon": "📋",
|
|
"gate": false,
|
|
"aliases": []
|
|
},
|
|
{
|
|
"id": "qc",
|
|
"label": "browser QC",
|
|
"icon": "🔍",
|
|
"gate": true,
|
|
"aliases": [],
|
|
"detect": [
|
|
{
|
|
"tool": "Agent",
|
|
"match": "qc-local|Evidence Collector|Accessibility Auditor"
|
|
},
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bccam\\b[^;&|]*\\blanes proof-link\\b"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "gate",
|
|
"label": "senior GO/NO-GO gate",
|
|
"icon": "🚦",
|
|
"gate": true,
|
|
"aliases": [
|
|
"sr-gate",
|
|
"verify",
|
|
"verification",
|
|
"gate-blocked"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Agent",
|
|
"match": "senior-gate-reviewer|Reality Checker"
|
|
},
|
|
{
|
|
"tool": "Skill",
|
|
"match": "verification-before-completion"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "publishing",
|
|
"label": "publish PR",
|
|
"icon": "🔀",
|
|
"gate": false,
|
|
"aliases": [
|
|
"push"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Skill",
|
|
"match": "finishing-a-development-branch"
|
|
},
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bgit\\b(?:\\s+-c\\s+[\\w.-]+=(?:'[^']*'|\\\"[^\\\"]*\\\"|\\S+)|\\s+-{1,2}[\\w.-]+(?:=(?:'[^']*'|\\\"[^\\\"]*\\\"|\\S+))?)*\\s+push\\b"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "pr-open",
|
|
"label": "PR open",
|
|
"icon": "🔀",
|
|
"gate": false,
|
|
"aliases": [
|
|
"ship",
|
|
"pr",
|
|
"push-conflict",
|
|
"push-revalidate"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bgh\\b[^;&|]*\\bpr create\\b"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "reported",
|
|
"label": "reported",
|
|
"icon": "📣",
|
|
"gate": false,
|
|
"aliases": []
|
|
},
|
|
{
|
|
"id": "watching-pr",
|
|
"label": "watching PR",
|
|
"icon": "👁",
|
|
"gate": false,
|
|
"aliases": [
|
|
"pr-comment-fix"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bgh\\b[^;&|]*\\bpr view\\b"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "merged",
|
|
"label": "merged — post-verify",
|
|
"icon": "🔗",
|
|
"gate": false,
|
|
"aliases": []
|
|
},
|
|
{
|
|
"id": "done",
|
|
"label": "done",
|
|
"icon": "✅",
|
|
"gate": false,
|
|
"aliases": [
|
|
"complete",
|
|
"completed"
|
|
]
|
|
}
|
|
]
|
|
}
|