4905d63b97
setStage() left detected_stage/signal/at untouched across a real transition, so a prior task's leftover inference (e.g. `tests` from earlier work) both misrepresented a fresh task's progress and — because recordDetection is forward-only — silently rejected every real detection behind it until the old one aged past DETECTION_TTL_MS. A real stage change now clears the detection columns; a same-stage heartbeat leaves a live detection alone. Also excludes `.superpowers/` from the `implement` node's Write detect rule - brainstorm-companion scratch files were being counted as implementation work. fix(client): disable Node's default --experimental-webstorage in tests Node 25 enables --experimental-webstorage by default, which defines a broken global `localStorage` (no backing file configured) ahead of jsdom's own full polyfill. Every test touching real localStorage failed with "localStorage.clear/getItem is not a function" — not flaky, not test-specific, just this one Node default. NODE_OPTIONS=--no-experimental-webstorage on the test scripts lets jsdom's polyfill take over as before.
140 lines
2.6 KiB
JSON
140 lines
2.6 KiB
JSON
{
|
|
"id": "default",
|
|
"name": "Default feature pipeline",
|
|
"nodes": [
|
|
{
|
|
"id": "intake",
|
|
"label": "intake",
|
|
"icon": "📝",
|
|
"gate": false,
|
|
"aliases": [
|
|
"assigned",
|
|
"claimed",
|
|
"start"
|
|
]
|
|
},
|
|
{
|
|
"id": "plan",
|
|
"label": "plan",
|
|
"icon": "🧭",
|
|
"gate": false,
|
|
"aliases": [
|
|
"planning",
|
|
"brainstorm",
|
|
"design"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Skill",
|
|
"match": "brainstorming|writing-plans"
|
|
},
|
|
{
|
|
"tool": "Write",
|
|
"match": "docs/.*plan.*\\.md"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "implement",
|
|
"label": "implement",
|
|
"icon": "🛠",
|
|
"gate": false,
|
|
"aliases": [
|
|
"implementing",
|
|
"coding",
|
|
"build"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Edit"
|
|
},
|
|
{
|
|
"tool": "Write",
|
|
"match": "^(?!.*(?:^|/)(?:docs|\\.superpowers)/)"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "tests",
|
|
"label": "tests",
|
|
"icon": "🧪",
|
|
"gate": true,
|
|
"aliases": [
|
|
"testing",
|
|
"unit",
|
|
"gates",
|
|
"pre-push-gate"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\b(npm (run )?test|pytest|vitest|jest|go test|cargo test|node\\s+--test)\\b"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "review",
|
|
"label": "review",
|
|
"icon": "👀",
|
|
"gate": true,
|
|
"aliases": [
|
|
"reviewing",
|
|
"code-review",
|
|
"self-review"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Skill",
|
|
"match": "code-review|requesting-code-review"
|
|
},
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bgh\\b[^;&|]*\\bpr diff\\b"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "gate",
|
|
"label": "gate",
|
|
"icon": "🚦",
|
|
"gate": true,
|
|
"aliases": [
|
|
"verify",
|
|
"verification",
|
|
"sr-gate",
|
|
"gate-blocked"
|
|
]
|
|
},
|
|
{
|
|
"id": "ship",
|
|
"label": "ship",
|
|
"icon": "🔀",
|
|
"gate": false,
|
|
"aliases": [
|
|
"pr",
|
|
"pr-open",
|
|
"publishing",
|
|
"commit",
|
|
"push"
|
|
],
|
|
"detect": [
|
|
{
|
|
"tool": "Bash",
|
|
"match": "\\bgit\\b(?:\\s+-c\\s+[\\w.-]+=(?:'[^']*'|\\\"[^\\\"]*\\\"|\\S+)|\\s+-{1,2}[\\w.-]+(?:=(?:'[^']*'|\\\"[^\\\"]*\\\"|\\S+))?)*\\s+push\\b|\\bgh\\b[^;&|]*\\bpr create\\b"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"id": "done",
|
|
"label": "done",
|
|
"icon": "✅",
|
|
"gate": false,
|
|
"aliases": [
|
|
"complete",
|
|
"completed",
|
|
"merged"
|
|
]
|
|
}
|
|
]
|
|
}
|