@kennethsolomon/shipkit 3.10.0 → 3.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -45
- package/commands/sk/autopilot.md +2 -2
- package/commands/sk/security-check.md +2 -2
- package/commands/sk/status.md +4 -9
- package/package.json +1 -1
- package/skills/.claude/settings.local.json +20 -1
- package/skills/sk:accessibility/SKILL.md +10 -1
- package/skills/sk:autopilot/SKILL.md +26 -45
- package/skills/sk:brainstorming/SKILL.md +6 -6
- package/skills/sk:context/SKILL.md +11 -15
- package/skills/sk:dashboard/SKILL.md +3 -4
- package/skills/sk:dashboard/server.js +0 -65
- package/skills/sk:debug/__pycache__/debug_conductor.cpython-314.pyc +0 -0
- package/skills/sk:debug/debug_conductor.py +0 -8
- package/skills/sk:debug/lib/__pycache__/findings_writer.cpython-314.pyc +0 -0
- package/skills/sk:debug/lib/__pycache__/lessons_writer.cpython-314.pyc +0 -0
- package/skills/sk:debug/lib/__pycache__/step_runner.cpython-314.pyc +0 -0
- package/skills/sk:debug/lib/findings_writer.py +2 -2
- package/skills/sk:debug/lib/lessons_writer.py +2 -2
- package/skills/sk:debug/lib/step_runner.py +8 -10
- package/skills/sk:e2e/SKILL.md +3 -3
- package/skills/sk:fast-track/SKILL.md +0 -9
- package/skills/sk:frontend-design/SKILL.md +232 -0
- package/skills/sk:gates/SKILL.md +2 -3
- package/skills/sk:lint/SKILL.md +5 -5
- package/skills/sk:perf/SKILL.md +3 -3
- package/skills/sk:retro/SKILL.md +1 -2
- package/skills/sk:review/SKILL.md +2 -2
- package/skills/sk:setup-claude/SKILL.md +1 -2
- package/skills/sk:setup-claude/scripts/__pycache__/apply_setup_claude.cpython-314.pyc +0 -0
- package/skills/sk:setup-claude/scripts/apply_setup_claude.py +12 -4
- package/skills/sk:setup-claude/templates/.claude/statusline.sh +1 -15
- package/skills/sk:setup-claude/templates/CLAUDE.md.template +61 -137
- package/skills/sk:setup-claude/templates/commands/brainstorm.md.template +2 -13
- package/skills/sk:setup-claude/templates/hooks/pre-compact.sh +1 -12
- package/skills/sk:setup-claude/templates/hooks/session-start.sh +0 -11
- package/skills/sk:setup-claude/templates/hooks/session-stop.sh +0 -7
- package/skills/sk:setup-claude/tests/__pycache__/test_apply_setup_claude.cpython-314.pyc +0 -0
- package/skills/sk:setup-claude/tests/test_apply_setup_claude.py +2 -33
- package/skills/sk:setup-optimizer/SKILL.md +9 -7
- package/skills/sk:setup-optimizer/lib/__pycache__/discover.cpython-314.pyc +0 -0
- package/skills/sk:setup-optimizer/lib/discover.py +9 -10
- package/skills/sk:skill-creator/scripts/__pycache__/generate_report.cpython-314.pyc +0 -0
- package/skills/sk:skill-creator/scripts/__pycache__/improve_description.cpython-314.pyc +0 -0
- package/skills/sk:skill-creator/scripts/__pycache__/package_skill.cpython-314.pyc +0 -0
- package/skills/sk:skill-creator/scripts/__pycache__/run_eval.cpython-314.pyc +0 -0
- package/skills/sk:skill-creator/scripts/__pycache__/run_loop.cpython-314.pyc +0 -0
- package/skills/sk:skill-creator/scripts/__pycache__/utils.cpython-314.pyc +0 -0
- package/skills/sk:skill-creator/scripts/generate_report.py +2 -0
- package/skills/sk:skill-creator/scripts/improve_description.py +2 -0
- package/skills/sk:skill-creator/scripts/package_skill.py +4 -0
- package/skills/sk:skill-creator/scripts/run_eval.py +3 -1
- package/skills/sk:skill-creator/scripts/run_loop.py +2 -0
- package/skills/sk:skill-creator/scripts/utils.py +2 -0
- package/skills/sk:start/SKILL.md +9 -11
- package/skills/sk:test/SKILL.md +5 -5
- package/skills/sk:setup-claude/templates/tasks/workflow-status.md.template +0 -28
package/README.md
CHANGED
|
@@ -55,8 +55,8 @@ That's it. `/sk:setup-claude` creates your project scaffolding: planning files,
|
|
|
55
55
|
| I want to... | Run this | What happens |
|
|
56
56
|
|--------------|----------|-------------|
|
|
57
57
|
| **Not sure — let ShipKit decide** | `/sk:start` | Classifies your task, routes to optimal flow/mode/agents |
|
|
58
|
-
| **Build a new feature** | `/sk:brainstorm` | Full workflow: plan → TDD →
|
|
59
|
-
| **Build hands-free** | `/sk:autopilot` | All
|
|
58
|
+
| **Build a new feature** | `/sk:brainstorm` | Full workflow: plan → TDD → quality gates → PR |
|
|
59
|
+
| **Build hands-free** | `/sk:autopilot` | All 8 steps, auto-skip, auto-advance, auto-commit |
|
|
60
60
|
| **Full-stack feature (parallel)** | `/sk:team` | Parallel domain agents (backend + frontend + QA) |
|
|
61
61
|
| **Make a small change** | `/sk:fast-track` | Skip planning, keep all quality gates |
|
|
62
62
|
| **Fix a bug** | `/sk:debug` | Investigate → regression test → fix → gates → PR |
|
|
@@ -74,20 +74,13 @@ That's it. `/sk:setup-claude` creates your project scaffolding: planning files,
|
|
|
74
74
|
| Step | Command | What it does | Phase |
|
|
75
75
|
|------|---------|-------------|-------|
|
|
76
76
|
| 1 | `/sk:brainstorm` | Explore requirements, propose approaches | Think |
|
|
77
|
-
| 2 | `/sk:frontend-design` | *Optional* — UI mockup (
|
|
78
|
-
| 3 | `/sk:
|
|
79
|
-
| 4 | `/sk:
|
|
80
|
-
| 5 | `/sk:write-plan` |
|
|
81
|
-
| 6 | `/sk:
|
|
82
|
-
| 7 | `/sk:
|
|
83
|
-
| 8 | `/sk:
|
|
84
|
-
| 9 | `/sk:execute-plan` | TDD green — make tests pass | Build |
|
|
85
|
-
| 10 | `/sk:smart-commit` | Conventional commit | Build |
|
|
86
|
-
| 11 | `/sk:gates` | All 6 quality gates (parallel) | Verify |
|
|
87
|
-
| 12 | `/sk:update-task` | Mark done | Ship |
|
|
88
|
-
| 13 | `/sk:finish-feature` | Changelog + PR | Ship |
|
|
89
|
-
| 14 | `/sk:features` | Sync feature specs | Ship |
|
|
90
|
-
| 15 | `/sk:release` | *Optional* — version bump + tag | Ship |
|
|
77
|
+
| 2 | `/sk:frontend-design` or `/sk:api-design` | *Optional* — UI mockup or API contracts (includes accessibility) | Think |
|
|
78
|
+
| 3 | `/sk:write-plan` | Write decision-complete plan | Think |
|
|
79
|
+
| 4 | `/sk:branch` | Create feature branch | Build |
|
|
80
|
+
| 5 | `/sk:write-tests` + `/sk:execute-plan` | TDD: write failing tests, then implement | Build |
|
|
81
|
+
| 6 | `/sk:smart-commit` | Conventional commit | Build |
|
|
82
|
+
| 7 | `/sk:gates` | All 6 quality gates (parallel batches) | Verify |
|
|
83
|
+
| 8 | `/sk:finish-feature` | Update task, changelog, PR, feature sync, release | Ship |
|
|
91
84
|
|
|
92
85
|
---
|
|
93
86
|
|
|
@@ -97,14 +90,11 @@ That's it. `/sk:setup-claude` creates your project scaffolding: planning files,
|
|
|
97
90
|
|
|
98
91
|
| Step | Command | What it does | Phase |
|
|
99
92
|
|------|---------|-------------|-------|
|
|
100
|
-
|
|
|
101
|
-
|
|
|
102
|
-
|
|
|
103
|
-
| 4 | `/sk:
|
|
104
|
-
| 5 |
|
|
105
|
-
| 6 | `/sk:smart-commit` | Conventional commit | Build |
|
|
106
|
-
| 7 | `/sk:gates` | All 6 quality gates (parallel) | Verify |
|
|
107
|
-
| 8 | `/sk:finish-feature` | Changelog + PR | Ship |
|
|
93
|
+
| 1 | `/sk:branch` | Create feature branch | Build |
|
|
94
|
+
| 2 | implement directly | No TDD — write code | Build |
|
|
95
|
+
| 3 | `/sk:smart-commit` | Conventional commit | Build |
|
|
96
|
+
| 4 | `/sk:gates` | All quality gates (parallel batches) | Verify |
|
|
97
|
+
| 5 | `/sk:finish-feature` | Changelog + PR | Ship |
|
|
108
98
|
|
|
109
99
|
Guard rails: warns if diff > 300 lines or > 5 new files.
|
|
110
100
|
|
|
@@ -116,15 +106,13 @@ Guard rails: warns if diff > 300 lines or > 5 new files.
|
|
|
116
106
|
|
|
117
107
|
| Step | Command | What it does | Phase |
|
|
118
108
|
|------|---------|-------------|-------|
|
|
119
|
-
|
|
|
120
|
-
|
|
|
121
|
-
| 3 | `/sk:
|
|
122
|
-
| 4 |
|
|
123
|
-
| 5 | `/sk:
|
|
124
|
-
| 6 |
|
|
125
|
-
| 7 | `/sk:
|
|
126
|
-
| 8 | `/sk:gates` | All 6 quality gates (parallel) | Verify |
|
|
127
|
-
| 9 | `/sk:finish-feature` | Changelog + PR | Ship |
|
|
109
|
+
| 1 | `/sk:debug` | Reproduce, isolate, hypothesize, verify | Think |
|
|
110
|
+
| 2 | `/sk:branch` | Create fix branch | Build |
|
|
111
|
+
| 3 | `/sk:write-tests` | Regression test that reproduces the bug | Build |
|
|
112
|
+
| 4 | implement the fix | Make regression test pass | Build |
|
|
113
|
+
| 5 | `/sk:smart-commit` | Commit fix + test | Build |
|
|
114
|
+
| 6 | `/sk:gates` | All quality gates (parallel batches) | Verify |
|
|
115
|
+
| 7 | `/sk:finish-feature` | Changelog + PR | Ship |
|
|
128
116
|
|
|
129
117
|
---
|
|
130
118
|
|
|
@@ -134,16 +122,12 @@ Guard rails: warns if diff > 300 lines or > 5 new files.
|
|
|
134
122
|
|
|
135
123
|
| Step | Command | What it does | Phase |
|
|
136
124
|
|------|---------|-------------|-------|
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
|
140
|
-
| 4 | `/sk:
|
|
141
|
-
| 5 | `/sk:
|
|
142
|
-
| 6 |
|
|
143
|
-
| 7 | run existing tests | Must still pass | Build |
|
|
144
|
-
| 8 | `/sk:smart-commit` | Commit the fix | Build |
|
|
145
|
-
| 9 | `/sk:gates` | All 6 quality gates (parallel) | Verify |
|
|
146
|
-
| 10 | `/sk:finish-feature` | Changelog + PR (marked as hotfix) | Ship |
|
|
125
|
+
| 1 | `/sk:debug` | Root-cause analysis | Think |
|
|
126
|
+
| 2 | `/sk:branch` | Create hotfix branch | Build |
|
|
127
|
+
| 3 | implement directly | Fix the issue | Build |
|
|
128
|
+
| 4 | `/sk:smart-commit` | Commit the fix | Build |
|
|
129
|
+
| 5 | `/sk:gates` | All quality gates (parallel batches) | Verify |
|
|
130
|
+
| 6 | `/sk:finish-feature` | Changelog + PR (marked as hotfix) | Ship |
|
|
147
131
|
|
|
148
132
|
After merging: add regression test + lesson to `tasks/lessons.md`.
|
|
149
133
|
|
|
@@ -172,7 +156,7 @@ One command runs all 6 gates in parallel batches:
|
|
|
172
156
|
| **3** | code review | Needs deep understanding |
|
|
173
157
|
| **4** | E2E Tests | Needs review fixes |
|
|
174
158
|
|
|
175
|
-
Each gate auto-fixes
|
|
159
|
+
Each gate auto-fixes and re-runs until clean. Fixes are squashed into one commit per gate pass. If a gate fails 3 times, it stops and asks for help.
|
|
176
160
|
|
|
177
161
|
Pre-existing issues are logged to `tasks/tech-debt.md` — not fixed inline.
|
|
178
162
|
|
|
@@ -265,7 +249,7 @@ Use these anytime — they're not part of any workflow.
|
|
|
265
249
|
|
|
266
250
|
| Topic | Where |
|
|
267
251
|
|-------|-------|
|
|
268
|
-
| Detailed workflow steps (
|
|
252
|
+
| Detailed workflow steps (8-step flow) | [DOCUMENTATION.md](.claude/docs/DOCUMENTATION.md) |
|
|
269
253
|
| Feature specifications | [docs/FEATURES.md](docs/FEATURES.md) |
|
|
270
254
|
| Model routing profiles & config | [DOCUMENTATION.md — Config](.claude/docs/DOCUMENTATION.md#config-reference) |
|
|
271
255
|
| Infrastructure (hooks, agents, rules) | [DOCUMENTATION.md — Setup](.claude/docs/DOCUMENTATION.md#what-gets-created) |
|
package/commands/sk/autopilot.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Hands-free workflow — all
|
|
2
|
+
description: "Hands-free workflow — all 8 steps, auto-skip, auto-advance, auto-commit. Stops only for direction approval and PR push."
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# /sk:autopilot
|
|
@@ -8,7 +8,7 @@ Run the full ShipIt workflow in hands-free mode.
|
|
|
8
8
|
|
|
9
9
|
Usage: `/sk:autopilot <task description>`
|
|
10
10
|
|
|
11
|
-
Executes all
|
|
11
|
+
Executes all 8 workflow steps with:
|
|
12
12
|
- **Auto-skip** — optional steps skipped when clearly not needed
|
|
13
13
|
- **Auto-advance** — no manual step transitions
|
|
14
14
|
- **Auto-commit** — conventional format, no approval prompt
|
|
@@ -12,7 +12,7 @@ By default, this checks only files changed on the current branch. Use `--all` to
|
|
|
12
12
|
|
|
13
13
|
## Hard Rules
|
|
14
14
|
|
|
15
|
-
- **Fix all in-scope findings** (files in `git diff main..HEAD --name-only`) immediately after the audit.
|
|
15
|
+
- **Fix all in-scope findings** (files in `git diff main..HEAD --name-only`) immediately after the audit. Re-run the audit until 0 findings remain. Once clean, make ONE squash commit: `fix(security): resolve security findings`.
|
|
16
16
|
- **Pre-existing findings** (files outside the current branch diff): log to `tasks/tech-debt.md` using this format — do NOT fix inline:
|
|
17
17
|
```
|
|
18
18
|
### [YYYY-MM-DD] Found during: sk:security-check
|
|
@@ -20,7 +20,7 @@ By default, this checks only files changed on the current branch. Use `--all` to
|
|
|
20
20
|
Issue: description of the vulnerability
|
|
21
21
|
Severity: critical | high | medium | low
|
|
22
22
|
```
|
|
23
|
-
- **
|
|
23
|
+
- **Squash gate commits** — collect all fixes for the pass, then one commit. Do not commit after each individual fix.
|
|
24
24
|
- **DO NOT skip checks** because the project is small or simple. Production is production.
|
|
25
25
|
- **Every finding must cite a specific file and line number.**
|
|
26
26
|
- **Every finding must reference the standard it violates** (OWASP, CWE, NIST, etc.).
|
package/commands/sk/status.md
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Show planning and workflow status at a glance."
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
<!-- Generated by /sk:setup-claude -->
|
|
6
6
|
|
|
7
7
|
# /sk:status
|
|
8
8
|
|
|
9
|
-
Read `tasks/todo.md
|
|
9
|
+
Read `tasks/todo.md`, then display a compact status summary.
|
|
10
10
|
|
|
11
11
|
## What to show
|
|
12
12
|
|
|
13
|
-
### Workflow Status (from `tasks/workflow-status.md`)
|
|
14
|
-
- Current step: show the step marked `>> next <<`
|
|
15
|
-
- Completed steps: count of `done` steps vs total
|
|
16
|
-
- Any steps marked `partial` or with notable Notes
|
|
17
|
-
- If no workflow file exists, say “No active workflow”
|
|
18
|
-
|
|
19
13
|
### Task Status (from `tasks/todo.md`)
|
|
20
14
|
- Total plan items vs completed plan items (checkbox count)
|
|
15
|
+
- Current git branch
|
|
21
16
|
- Errors count (if the file has an Errors section/table)
|
|
22
17
|
- Whether `tasks/findings.md` and `tasks/progress.md` exist
|
|
23
18
|
|
|
24
|
-
Keep it brief: answer
|
|
19
|
+
Keep it brief: answer "where am I?" and "what's next?".
|
|
25
20
|
|
package/package.json
CHANGED
|
@@ -12,7 +12,26 @@
|
|
|
12
12
|
"Bash(done)",
|
|
13
13
|
"Bash(tasks/security-findings.md:*)",
|
|
14
14
|
"Bash(git push:*)",
|
|
15
|
-
"Bash(git tag:*)"
|
|
15
|
+
"Bash(git tag:*)",
|
|
16
|
+
"Bash(find /Users/kennethsolomon/Herd/shipit -type f -name *.md -path */node_modules/*commands/sk/*)",
|
|
17
|
+
"Bash(grep -r \"sk:\" /Users/kennethsolomon/Herd/shipit/commands/sk/*.md)",
|
|
18
|
+
"Bash(find /Users/kennethsolomon/Herd/shipit/.claude/docs -name *.md)",
|
|
19
|
+
"Bash(grep -v \"^Command$\")",
|
|
20
|
+
"Bash(find /Users/kennethsolomon/Herd/shipit -path */test* -o -path */__tests__/* -o -path */spec/*)",
|
|
21
|
+
"Bash(find /Users/kennethsolomon/Herd/shipit/commands/sk -type f -name *.md)",
|
|
22
|
+
"Bash(find /Users/kennethsolomon/Herd/shipit/skills -maxdepth 1 -type d -name sk:*)",
|
|
23
|
+
"Bash(python3 -m py_compile skills/sk:debug/lib/step_runner.py)",
|
|
24
|
+
"Bash(python3 -m py_compile skills/sk:debug/debug_conductor.py)",
|
|
25
|
+
"Bash(python3 -m py_compile skills/sk:setup-optimizer/lib/discover.py)",
|
|
26
|
+
"Bash(python3 -m py_compile skills/sk:debug/lib/findings_writer.py)",
|
|
27
|
+
"Bash(python3 -m py_compile skills/sk:debug/lib/lessons_writer.py)",
|
|
28
|
+
"Bash(python3 -m py_compile skills/sk:skill-creator/scripts/run_eval.py)",
|
|
29
|
+
"Bash(python3 -m py_compile skills/sk:skill-creator/scripts/run_loop.py)",
|
|
30
|
+
"Bash(python3 -m py_compile skills/sk:skill-creator/scripts/improve_description.py)",
|
|
31
|
+
"Bash(python3 -m py_compile skills/sk:skill-creator/scripts/generate_report.py)",
|
|
32
|
+
"Bash(python3 -m py_compile skills/sk:skill-creator/scripts/utils.py)",
|
|
33
|
+
"Bash(git:*)",
|
|
34
|
+
"Bash(npm publish:*)"
|
|
16
35
|
]
|
|
17
36
|
}
|
|
18
37
|
}
|
|
@@ -43,6 +43,8 @@ Run this skill:
|
|
|
43
43
|
- Visible focus indicator on all interactive elements (not removed with `outline: none` without replacement)
|
|
44
44
|
- Modal/dialog focus management: focus moves into modal on open, returns to trigger on close
|
|
45
45
|
- Skip navigation link present for pages with repeated navigation
|
|
46
|
+
- Modals and multi-step flows must have a visible cancel/back affordance — no dead ends (WCAG 3.2.2)
|
|
47
|
+
- Do not override or intercept system/platform keyboard shortcuts (Tab, arrow keys, Escape, VoiceOver gestures)
|
|
46
48
|
|
|
47
49
|
### 3. ARIA & Semantics (WCAG 4.1.2, 1.3.1)
|
|
48
50
|
- Semantic HTML first (`<button>`, `<nav>`, `<main>`, `<header>`) — ARIA only when HTML is insufficient
|
|
@@ -70,7 +72,14 @@ Run this skill:
|
|
|
70
72
|
- All non-essential animations respect `prefers-reduced-motion` media query
|
|
71
73
|
- Auto-playing animations can be paused, stopped, or hidden
|
|
72
74
|
|
|
73
|
-
### 7.
|
|
75
|
+
### 7. iOS Dynamic Type (Apple HIG)
|
|
76
|
+
- UI must remain fully readable and usable when system font size is at the largest accessibility setting
|
|
77
|
+
- No text truncation at large sizes — prefer wrapping over ellipsis
|
|
78
|
+
- All layouts must reflow correctly without overlapping or clipping at Dynamic Type XXL
|
|
79
|
+
- Avoid fixed heights on elements that contain text — use dynamic sizing
|
|
80
|
+
- Test at: Settings → Accessibility → Display & Text Size → Larger Text (max slider)
|
|
81
|
+
|
|
82
|
+
### 8. Content & Structure (WCAG 1.3.1, 2.4.6, 2.4.2)
|
|
74
83
|
- Single `<h1>` per page; heading hierarchy is logical (no skipped levels)
|
|
75
84
|
- Page has a descriptive `<title>`
|
|
76
85
|
- Link text is descriptive standalone ("Read the docs" not "Click here")
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sk:autopilot
|
|
3
|
-
description: Hands-free workflow — runs all
|
|
3
|
+
description: Hands-free workflow — runs all 8 steps with auto-skip, auto-advance, auto-commit. Stops only for direction approval, 3-strike failures, and PR push.
|
|
4
4
|
user_invocable: true
|
|
5
5
|
allowed_tools: Read, Write, Bash, Glob, Grep, Agent, Skill
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Autopilot Mode
|
|
9
9
|
|
|
10
|
-
Hands-free workflow that executes all
|
|
10
|
+
Hands-free workflow that executes all 8 steps of the ShipIt workflow with minimal interruptions. Same quality gates, same fix loops, same 100% coverage — just fewer stops.
|
|
11
11
|
|
|
12
12
|
## When to Use
|
|
13
13
|
|
|
@@ -23,30 +23,19 @@ Hands-free workflow that executes all 21 steps of the ShipIt workflow with minim
|
|
|
23
23
|
|
|
24
24
|
## Quality Guarantee
|
|
25
25
|
|
|
26
|
-
Autopilot runs the EXACT same
|
|
26
|
+
Autopilot runs the EXACT same 8 steps as manual mode:
|
|
27
27
|
- ALL quality gates enforced (lint, test, security, perf, review, e2e)
|
|
28
|
-
- ALL fix-
|
|
28
|
+
- ALL fix-rerun loops active
|
|
29
29
|
- 100% test coverage required on new code
|
|
30
30
|
- 0 security issues required
|
|
31
31
|
- The ONLY difference: auto-advance between steps instead of stopping
|
|
32
32
|
|
|
33
33
|
## Steps
|
|
34
34
|
|
|
35
|
-
###
|
|
35
|
+
### 1. Load Context + Brainstorm + Direction Approval (STOP — requires user input)
|
|
36
36
|
|
|
37
|
-
Read `tasks/
|
|
38
|
-
|
|
39
|
-
### 1. Load Context (auto — no prompt)
|
|
40
|
-
|
|
41
|
-
- Read `tasks/todo.md`
|
|
42
|
-
- Read `tasks/lessons.md` (apply all active lessons as constraints)
|
|
43
|
-
- Read `tasks/findings.md` (if exists)
|
|
44
|
-
- Read `tasks/tech-debt.md` (if exists)
|
|
45
|
-
|
|
46
|
-
### 2. Brainstorm + Direction Approval (STOP — requires user input)
|
|
47
|
-
|
|
48
|
-
Run brainstorm internally:
|
|
49
|
-
- Explore the codebase (3 parallel Explore agents)
|
|
37
|
+
- Read `tasks/todo.md`, `tasks/lessons.md`, `tasks/findings.md`, `tasks/tech-debt.md`
|
|
38
|
+
- Run brainstorm internally (3 parallel Explore agents)
|
|
50
39
|
- Propose 2-3 approaches with trade-offs
|
|
51
40
|
|
|
52
41
|
**Present ONE direction summary and ask:**
|
|
@@ -57,40 +46,33 @@ Run brainstorm internally:
|
|
|
57
46
|
|
|
58
47
|
Wait for explicit `y` before continuing. This is the ONLY planning stop.
|
|
59
48
|
|
|
49
|
+
### 2. Design (auto-skip if no frontend/API keywords)
|
|
50
|
+
|
|
51
|
+
Run `/sk:frontend-design` or `/sk:api-design` if applicable. Auto-skip if no frontend/API keywords detected. Log: `Auto-skipped: Design ([reason])`
|
|
52
|
+
|
|
60
53
|
### 3. Plan (auto-advance)
|
|
61
54
|
|
|
62
|
-
Write the implementation plan to `tasks/todo.md`. Do NOT ask for plan approval — the direction approval in step
|
|
55
|
+
Write the implementation plan to `tasks/todo.md`. Do NOT ask for plan approval — the direction approval in step 1 covers this.
|
|
63
56
|
|
|
64
57
|
### 4. Branch (auto-advance)
|
|
65
58
|
|
|
66
59
|
Create feature branch auto-named from the task. Do NOT ask for confirmation.
|
|
67
60
|
|
|
68
|
-
### 5.
|
|
61
|
+
### 5. Write Tests + Implement (auto-advance)
|
|
69
62
|
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
- **Performance (step 15)**: auto-skip if no frontend AND no database keywords
|
|
63
|
+
- Run `/sk:write-tests` (TDD red phase)
|
|
64
|
+
- Run `/sk:schema-migrate` if database keywords detected
|
|
65
|
+
- Run `/sk:execute-plan` (TDD green phase)
|
|
66
|
+
- Auto-advance when done
|
|
75
67
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
### 6. Write Tests (auto-advance)
|
|
79
|
-
|
|
80
|
-
Write failing tests based on the plan (TDD red phase). Auto-advance when done.
|
|
81
|
-
|
|
82
|
-
### 7. Implement (auto-advance)
|
|
83
|
-
|
|
84
|
-
Execute the plan — make failing tests pass. Use wave-based sub-agents for parallel work where possible.
|
|
85
|
-
|
|
86
|
-
### 8. Commit (auto-commit)
|
|
68
|
+
### 6. Commit (auto-commit)
|
|
87
69
|
|
|
88
70
|
Auto-commit with conventional commit format. Do NOT ask for commit message approval.
|
|
89
71
|
Format: `type(scope): description`
|
|
90
72
|
|
|
91
|
-
###
|
|
73
|
+
### 7. Gates (auto-advance on clean pass)
|
|
92
74
|
|
|
93
|
-
Run all quality gates
|
|
75
|
+
Run all quality gates via `/sk:gates`:
|
|
94
76
|
1. Lint + dep audit
|
|
95
77
|
2. Test (100% coverage)
|
|
96
78
|
3. Security (0 issues)
|
|
@@ -98,9 +80,9 @@ Run all quality gates. Use `/sk:gates` if available, otherwise run sequentially:
|
|
|
98
80
|
5. Review + simplify
|
|
99
81
|
6. E2E
|
|
100
82
|
|
|
101
|
-
Each gate auto-fixes and re-runs internally.
|
|
83
|
+
Each gate auto-fixes and re-runs internally. Squash gate commits — one commit per gate pass.
|
|
102
84
|
|
|
103
|
-
###
|
|
85
|
+
### 8. PR Push (STOP — requires user confirmation)
|
|
104
86
|
|
|
105
87
|
**This is the second mandatory stop.** Present:
|
|
106
88
|
> "All gates passed. Ready to create PR.
|
|
@@ -110,11 +92,10 @@ Each gate auto-fixes and re-runs internally. Auto-advance to next gate on clean
|
|
|
110
92
|
|
|
111
93
|
Wait for explicit confirmation — pushing is visible to others.
|
|
112
94
|
|
|
113
|
-
|
|
114
|
-
|
|
95
|
+
After confirmation:
|
|
115
96
|
- Create PR
|
|
116
97
|
- Sync features (`/sk:features`)
|
|
117
|
-
- Ask about release (
|
|
98
|
+
- Ask about release (never auto-skipped)
|
|
118
99
|
|
|
119
100
|
## 3-Strike Protocol
|
|
120
101
|
|
|
@@ -128,9 +109,9 @@ If any step fails 3 times:
|
|
|
128
109
|
|
|
129
110
|
| Stop | When | Why |
|
|
130
111
|
|------|------|-----|
|
|
131
|
-
| Direction approval | After brainstorm (step
|
|
112
|
+
| Direction approval | After brainstorm (step 1) | User must approve the approach |
|
|
132
113
|
| 3-strike failure | Any step fails 3x | Needs human judgment |
|
|
133
|
-
| PR push | Before creating PR (step
|
|
114
|
+
| PR push | Before creating PR (step 8) | Visible to others — always confirm |
|
|
134
115
|
|
|
135
116
|
Everything else auto-advances.
|
|
136
117
|
|
|
@@ -34,7 +34,7 @@ You MUST create a task for each of these items and complete them in order:
|
|
|
34
34
|
- Open questions (if any remain)
|
|
35
35
|
Additionally, **append** an ADR entry to `docs/decisions.md` (see "Decisions Log" section below).
|
|
36
36
|
(Optionally also write a full design doc to docs/plans/YYYY-MM-DD-<topic>-design.md)
|
|
37
|
-
6. **Transition to implementation** — invoke
|
|
37
|
+
6. **Transition to implementation** — invoke `/sk:write-plan` skill to create implementation plan
|
|
38
38
|
|
|
39
39
|
## Process Flow
|
|
40
40
|
|
|
@@ -46,7 +46,7 @@ digraph brainstorming {
|
|
|
46
46
|
"Present design sections" [shape=box];
|
|
47
47
|
"User approves design?" [shape=diamond];
|
|
48
48
|
"Write design doc" [shape=box];
|
|
49
|
-
"Invoke
|
|
49
|
+
"Invoke `/sk:write-plan` skill" [shape=doublecircle];
|
|
50
50
|
|
|
51
51
|
"Explore project context" -> "Ask clarifying questions";
|
|
52
52
|
"Ask clarifying questions" -> "Propose 2-3 approaches";
|
|
@@ -54,11 +54,11 @@ digraph brainstorming {
|
|
|
54
54
|
"Present design sections" -> "User approves design?";
|
|
55
55
|
"User approves design?" -> "Present design sections" [label="no, revise"];
|
|
56
56
|
"User approves design?" -> "Write design doc" [label="yes"];
|
|
57
|
-
"Write design doc" -> "Invoke
|
|
57
|
+
"Write design doc" -> "Invoke `/sk:write-plan` skill";
|
|
58
58
|
}
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
**The terminal state is invoking
|
|
61
|
+
**The terminal state is invoking `/sk:write-plan`.** Do NOT invoke frontend-design, mcp-builder, or any other implementation skill. The ONLY skill you invoke after brainstorming is `/sk:write-plan`.
|
|
62
62
|
|
|
63
63
|
## The Process
|
|
64
64
|
|
|
@@ -95,8 +95,8 @@ digraph brainstorming {
|
|
|
95
95
|
- Commit the findings, decisions log entry, and any design document to git
|
|
96
96
|
|
|
97
97
|
**Implementation:**
|
|
98
|
-
- Invoke the
|
|
99
|
-
- Do NOT invoke any other skill.
|
|
98
|
+
- Invoke the `/sk:write-plan` skill to create a detailed implementation plan
|
|
99
|
+
- Do NOT invoke any other skill. `/sk:write-plan` is the next step.
|
|
100
100
|
|
|
101
101
|
## Decisions Log
|
|
102
102
|
|
|
@@ -26,21 +26,19 @@ Load all project context files into the conversation and output a formatted sess
|
|
|
26
26
|
| # | File | What to Extract |
|
|
27
27
|
|---|------|-----------------|
|
|
28
28
|
| 1 | `tasks/todo.md` | Task name (from `# TODO —` heading), milestone progress, count of `- [x]` (done) vs `- [ ]` (pending) checkboxes |
|
|
29
|
-
| 2 | `tasks/
|
|
30
|
-
| 3 | `tasks/
|
|
31
|
-
| 4 | `tasks/
|
|
32
|
-
| 5 | `
|
|
33
|
-
| 6 | `docs/
|
|
34
|
-
| 7 | `
|
|
35
|
-
| 8 | `tasks/tech-debt.md` | If exists: count entries with no `Resolved:` line (unresolved), highest severity among unresolved |
|
|
29
|
+
| 2 | `tasks/progress.md` | Last 5 entries only (most recent work). If file is large, read only the last 50 lines. |
|
|
30
|
+
| 3 | `tasks/findings.md` | Current decisions, chosen approach, open questions |
|
|
31
|
+
| 4 | `tasks/lessons.md` | All active lessons — read in full, apply as constraints for this session |
|
|
32
|
+
| 5 | `docs/decisions.md` | If exists: last 3 ADR entries. If missing: note "no decisions log yet" |
|
|
33
|
+
| 6 | `docs/vision.md` | If exists: product name + value proposition. If missing: note "no vision.md found" |
|
|
34
|
+
| 7 | `tasks/tech-debt.md` | If exists: count entries with no `Resolved:` line (unresolved), highest severity among unresolved |
|
|
36
35
|
|
|
37
36
|
### Reading Strategy
|
|
38
37
|
|
|
39
|
-
- Read files 1-
|
|
40
|
-
- Files 6
|
|
38
|
+
- Read files 1-4 first (these are the core context).
|
|
39
|
+
- Files 5-6 are optional — check if they exist before reading.
|
|
41
40
|
- For `tasks/progress.md`: only read the last 50 lines to avoid loading a huge file.
|
|
42
41
|
- If `tasks/todo.md` is missing: the project has no active task.
|
|
43
|
-
- If `tasks/workflow-status.md` is missing: the workflow hasn't started.
|
|
44
42
|
|
|
45
43
|
---
|
|
46
44
|
|
|
@@ -54,9 +52,8 @@ After reading all files, output this session brief:
|
|
|
54
52
|
╚══════════════════════════════════════════╝
|
|
55
53
|
Branch: [current git branch]
|
|
56
54
|
Task: [task name from todo.md, or "No active task"]
|
|
57
|
-
|
|
55
|
+
Progress: [N done] / [M total] checkboxes in todo.md
|
|
58
56
|
Last done: [last progress.md entry summary, 1 line]
|
|
59
|
-
Pending: [N] checkboxes remaining in todo.md
|
|
60
57
|
Lessons: [count] active — [most critical 1-liner from lessons.md]
|
|
61
58
|
Open Qs: [open questions from findings.md, or "none"]
|
|
62
59
|
Tech Debt: [N] unresolved — highest: [severity] ([file:line])
|
|
@@ -68,9 +65,8 @@ Product: [value prop from vision.md, or "no vision.md found"]
|
|
|
68
65
|
|
|
69
66
|
- **Branch:** Run `git branch --show-current` to get the current branch name.
|
|
70
67
|
- **Task:** Extract from the first `# TODO —` line in `tasks/todo.md`. If the file doesn't exist or all checkboxes are done, show "No active task — ready to start fresh".
|
|
71
|
-
- **
|
|
68
|
+
- **Progress:** Count `- [x]` (done) and `- [ ]` (pending) lines in `tasks/todo.md`. Stop counting at the first `## Verification`, `## Acceptance Criteria`, or `## Risks` heading (these are meta-sections, not tasks). Show `N done / M total`.
|
|
72
69
|
- **Last done:** The most recent entry from `tasks/progress.md`. Summarize in one line.
|
|
73
|
-
- **Pending:** Count `- [ ]` lines in `tasks/todo.md`. Stop counting at the first `## Verification`, `## Acceptance Criteria`, or `## Risks` heading (these are meta-sections, not tasks).
|
|
74
70
|
- **Lessons:** Count `### [` headings in `tasks/lessons.md` (each lesson starts with `### [YYYY-MM-DD]`). Show the count + the **Prevention:** line from the most recent lesson.
|
|
75
71
|
- **Open Qs:** Check for an "## Open Questions" section in `tasks/findings.md`. List them or say "none".
|
|
76
72
|
- **Tech Debt:** Read `tasks/tech-debt.md` if it exists. Count entries that have no `Resolved:` line — each entry starts with `### [`. For unresolved entries, find the highest severity. Show `N unresolved — highest: [severity] ([file])`. If file missing or 0 unresolved, show `none`.
|
|
@@ -93,7 +89,7 @@ After outputting the session brief:
|
|
|
93
89
|
| Scenario | Behavior |
|
|
94
90
|
|----------|----------|
|
|
95
91
|
| No `tasks/todo.md` | Show "No active task — ready to start fresh" |
|
|
96
|
-
|
|
|
92
|
+
| All checkboxes done in todo.md | Show "Task complete — 0 pending" for Progress field |
|
|
97
93
|
| No `tasks/progress.md` | Show "No progress logged yet" for Last done |
|
|
98
94
|
| No `tasks/findings.md` | Show "none" for Open Qs |
|
|
99
95
|
| No `tasks/lessons.md` | Show "0 active" for Lessons |
|
|
@@ -29,9 +29,8 @@ PORT=4000 node skills/sk:dashboard/server.js
|
|
|
29
29
|
## What It Shows
|
|
30
30
|
|
|
31
31
|
- **Swimlanes per worktree** — one row per worktree discovered via `git worktree list`
|
|
32
|
-
- **Phase timeline** — workflow steps laid out as columns (
|
|
33
|
-
- **
|
|
34
|
-
- **Progress bars** — percentage of steps completed per worktree
|
|
32
|
+
- **Phase timeline** — workflow steps laid out as columns (Explore, Design, Plan, Branch, Tests+Implement, Commit, Gates, Finalize)
|
|
33
|
+
- **Progress bars** — percentage of todo.md checkboxes completed per worktree
|
|
35
34
|
- **Current task** — the active task name from `tasks/todo.md`
|
|
36
35
|
|
|
37
36
|
## Architecture
|
|
@@ -39,7 +38,7 @@ PORT=4000 node skills/sk:dashboard/server.js
|
|
|
39
38
|
Zero-dependency Node.js server. Uses only built-in modules (`http`, `fs`, `path`, `child_process`).
|
|
40
39
|
|
|
41
40
|
- `server.js` serves the dashboard HTML and exposes `/api/status`
|
|
42
|
-
- `/api/status` reads `tasks/
|
|
41
|
+
- `/api/status` reads `tasks/todo.md` from each worktree, parses checkbox progress, and returns JSON
|
|
43
42
|
- `dashboard.html` is a single-file UI (HTML + embedded CSS + JS) that polls `/api/status` every 3 seconds
|
|
44
43
|
- Worktree discovery via `git worktree list`
|
|
45
44
|
|
|
@@ -7,9 +7,6 @@ const { execSync } = require("child_process");
|
|
|
7
7
|
const PORT =
|
|
8
8
|
parseInt(process.argv.find((_, i, a) => a[i - 1] === "--port") || process.env.PORT, 10) || 3333;
|
|
9
9
|
|
|
10
|
-
const HARD_GATES = new Set([12, 14, 16, 20, 22]);
|
|
11
|
-
const OPTIONALS = new Set([4, 5, 8, 18, 27]);
|
|
12
|
-
|
|
13
10
|
function stripMd(s) {
|
|
14
11
|
return (s || "").replace(/\*\*/g, "").replace(/`/g, "").trim();
|
|
15
12
|
}
|
|
@@ -34,53 +31,6 @@ function discoverWorktrees() {
|
|
|
34
31
|
}
|
|
35
32
|
}
|
|
36
33
|
|
|
37
|
-
function parseWorkflowStatus(worktreePath) {
|
|
38
|
-
const filePath = path.join(worktreePath, "tasks", "workflow-status.md");
|
|
39
|
-
try {
|
|
40
|
-
const lines = fs.readFileSync(filePath, "utf8").split("\n");
|
|
41
|
-
|
|
42
|
-
let headerFound = false;
|
|
43
|
-
let separatorSkipped = false;
|
|
44
|
-
const steps = [];
|
|
45
|
-
|
|
46
|
-
for (const line of lines) {
|
|
47
|
-
if (!headerFound) {
|
|
48
|
-
if (line.includes("| # |")) headerFound = true;
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
if (!separatorSkipped) {
|
|
52
|
-
separatorSkipped = true;
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
const cells = line.split("|").slice(1, -1).map((c) => c.trim());
|
|
56
|
-
if (cells.length < 3) continue;
|
|
57
|
-
|
|
58
|
-
const number = parseInt(cells[0], 10);
|
|
59
|
-
if (isNaN(number)) continue;
|
|
60
|
-
|
|
61
|
-
const rawStep = stripMd(cells[1]);
|
|
62
|
-
const cmdMatch = rawStep.match(/\((.+?)\)/);
|
|
63
|
-
const command = cmdMatch ? cmdMatch[1].trim() : "";
|
|
64
|
-
const name = rawStep.replace(/\s*\(.+?\)\s*/, "").trim();
|
|
65
|
-
|
|
66
|
-
steps.push({
|
|
67
|
-
number,
|
|
68
|
-
name,
|
|
69
|
-
command,
|
|
70
|
-
status: stripMd(cells[2]),
|
|
71
|
-
notes: stripMd(cells[3]),
|
|
72
|
-
isHardGate: HARD_GATES.has(number),
|
|
73
|
-
isOptional: OPTIONALS.has(number),
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
return steps;
|
|
77
|
-
} catch (err) {
|
|
78
|
-
if (err.code === "ENOENT") return [];
|
|
79
|
-
process.stderr.write(`Error parsing workflow-status.md: ${err.message}\n`);
|
|
80
|
-
return [];
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
34
|
const STOP_HEADERS = new Set(["Verification", "Acceptance Criteria", "Risks", "Change Log", "Summary"]);
|
|
85
35
|
|
|
86
36
|
function parseTodo(worktreePath) {
|
|
@@ -137,18 +87,8 @@ function parseTodo(worktreePath) {
|
|
|
137
87
|
function buildStatus() {
|
|
138
88
|
const worktrees = discoverWorktrees();
|
|
139
89
|
return worktrees.map((wt) => {
|
|
140
|
-
const steps = parseWorkflowStatus(wt.path);
|
|
141
90
|
const todo = parseTodo(wt.path);
|
|
142
91
|
|
|
143
|
-
let currentStep = 0;
|
|
144
|
-
let totalDone = 0;
|
|
145
|
-
let totalSkipped = 0;
|
|
146
|
-
for (const s of steps) {
|
|
147
|
-
if (s.status === ">> next <<") currentStep = s.number;
|
|
148
|
-
if (s.status === "done") totalDone++;
|
|
149
|
-
if (s.status === "skipped") totalSkipped++;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
92
|
return {
|
|
153
93
|
path: wt.path,
|
|
154
94
|
branch: wt.branch,
|
|
@@ -156,11 +96,6 @@ function buildStatus() {
|
|
|
156
96
|
todosDone: todo.todosDone,
|
|
157
97
|
todosTotal: todo.todosTotal,
|
|
158
98
|
todoItems: todo.todoItems,
|
|
159
|
-
currentStep,
|
|
160
|
-
totalDone,
|
|
161
|
-
totalSkipped,
|
|
162
|
-
totalSteps: steps.length,
|
|
163
|
-
steps,
|
|
164
99
|
};
|
|
165
100
|
});
|
|
166
101
|
}
|
|
Binary file
|