get-shit-done-ios 0.11.0 → 1.1.0

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.
Files changed (62) hide show
  1. package/README.md +3 -3
  2. package/agents/gsd-codebase-mapper.md +9 -1
  3. package/agents/gsd-debugger.md +33 -0
  4. package/agents/gsd-executor.md +93 -2
  5. package/agents/gsd-integration-checker.md +2 -0
  6. package/agents/gsd-nyquist-auditor.md +179 -0
  7. package/agents/gsd-phase-researcher.md +21 -4
  8. package/agents/gsd-plan-checker.md +18 -2
  9. package/agents/gsd-planner.md +53 -10
  10. package/agents/gsd-project-researcher.md +10 -0
  11. package/agents/gsd-research-synthesizer.md +10 -0
  12. package/agents/gsd-roadmapper.md +23 -13
  13. package/agents/gsd-verifier.md +22 -0
  14. package/bin/install.js +26 -23
  15. package/commands/gsd/debug.md +1 -0
  16. package/commands/gsd/discuss-phase.md +15 -11
  17. package/commands/gsd/quick.md +6 -2
  18. package/commands/gsd/reapply-patches.md +17 -4
  19. package/commands/gsd/research-phase.md +22 -19
  20. package/commands/gsd/validate-phase.md +35 -0
  21. package/get-shit-done/bin/lib/core.cjs +75 -7
  22. package/get-shit-done/bin/lib/state.cjs +100 -59
  23. package/get-shit-done/references/checkpoints.md +1 -1
  24. package/get-shit-done/references/decimal-phase-calculation.md +2 -2
  25. package/get-shit-done/references/ios-frameworks.md +7 -0
  26. package/get-shit-done/references/ios-swift-guidelines.md +9 -0
  27. package/get-shit-done/references/model-profiles.md +1 -0
  28. package/get-shit-done/references/phase-argument-parsing.md +1 -1
  29. package/get-shit-done/references/planning-config.md +6 -2
  30. package/get-shit-done/references/questioning.md +17 -0
  31. package/get-shit-done/templates/roadmap.md +1 -1
  32. package/get-shit-done/workflows/add-phase.md +1 -0
  33. package/get-shit-done/workflows/add-todo.md +6 -5
  34. package/get-shit-done/workflows/audit-milestone.md +35 -0
  35. package/get-shit-done/workflows/check-todos.md +1 -0
  36. package/get-shit-done/workflows/complete-milestone.md +1 -0
  37. package/get-shit-done/workflows/diagnose-issues.md +1 -1
  38. package/get-shit-done/workflows/discuss-phase.md +120 -59
  39. package/get-shit-done/workflows/execute-phase.md +15 -5
  40. package/get-shit-done/workflows/execute-plan.md +1 -0
  41. package/get-shit-done/workflows/health.md +3 -0
  42. package/get-shit-done/workflows/insert-phase.md +1 -0
  43. package/get-shit-done/workflows/map-codebase.md +1 -0
  44. package/get-shit-done/workflows/new-milestone.md +4 -2
  45. package/get-shit-done/workflows/new-project.md +29 -34
  46. package/get-shit-done/workflows/plan-milestone-gaps.md +1 -1
  47. package/get-shit-done/workflows/progress.md +1 -0
  48. package/get-shit-done/workflows/quick.md +154 -6
  49. package/get-shit-done/workflows/remove-phase.md +1 -0
  50. package/get-shit-done/workflows/research-phase.md +1 -0
  51. package/get-shit-done/workflows/resume-project.md +1 -0
  52. package/get-shit-done/workflows/set-profile.md +1 -0
  53. package/get-shit-done/workflows/settings.md +3 -2
  54. package/get-shit-done/workflows/transition.md +2 -2
  55. package/get-shit-done/workflows/update.md +35 -10
  56. package/get-shit-done/workflows/validate-phase.md +167 -0
  57. package/get-shit-done/workflows/verify-phase.md +1 -0
  58. package/get-shit-done/workflows/verify-work.md +14 -0
  59. package/hooks/dist/gsd-check-update.js +22 -3
  60. package/hooks/dist/gsd-context-monitor.js +28 -9
  61. package/hooks/dist/gsd-statusline.js +19 -12
  62. package/package.json +9 -4
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  **Solves context rot — the quality degradation that happens as Claude fills its context window.**
10
10
 
11
11
  [![License](https://img.shields.io/badge/license-MIT-blue?style=for-the-badge)](LICENSE)
12
- [![Based on GSD](https://img.shields.io/badge/Based_on-GSD_1.21.0-orange?style=for-the-badge)](https://github.com/glittercowboy/get-shit-done)
12
+ [![Based on GSD](https://img.shields.io/badge/Based_on-GSD_1.22.4-orange?style=for-the-badge)](https://github.com/glittercowboy/get-shit-done)
13
13
 
14
14
  ```bash
15
15
  npx get-shit-done-ios@latest
@@ -515,7 +515,7 @@ You're never locked in. The system adapts.
515
515
  | `/gsd:add-todo [desc]` | Capture idea for later |
516
516
  | `/gsd:check-todos` | List pending todos |
517
517
  | `/gsd:debug [desc]` | Systematic debugging with persistent state |
518
- | `/gsd:quick [--full]` | Execute ad-hoc task with GSD guarantees (`--full` adds plan-checking and verification) |
518
+ | `/gsd:quick [--discuss] [--full]` | Execute ad-hoc task with GSD guarantees (`--discuss` for pre-planning context, `--full` adds plan-checking and verification) |
519
519
  | `/gsd:health [--repair]` | Validate `.planning/` directory integrity, auto-repair with `--repair` |
520
520
 
521
521
  <sup>¹ Contributed by reddit user OracleGreyBeard</sup>
@@ -531,7 +531,7 @@ GSD stores project settings in `.planning/config.json`. Configure during `/gsd:n
531
531
  | Setting | Options | Default | What it controls |
532
532
  |---------|---------|---------|------------------|
533
533
  | `mode` | `yolo`, `interactive` | `interactive` | Auto-approve vs confirm at each step |
534
- | `depth` | `quick`, `standard`, `comprehensive` | `standard` | Planning thoroughness (phases × plans) |
534
+ | `granularity` | `coarse`, `standard`, `fine` | `standard` | Planning thoroughness (phases × plans) |
535
535
 
536
536
  ### Model Profiles
537
537
 
@@ -3,6 +3,14 @@ name: gsd-codebase-mapper
3
3
  description: Explores codebase and writes structured analysis documents. Spawned by map-codebase with a focus area (tech, arch, quality, concerns). Writes documents directly to reduce orchestrator context load.
4
4
  tools: Read, Bash, Grep, Glob, Write
5
5
  color: cyan
6
+ skills:
7
+ - gsd-mapper-workflow
8
+ # hooks:
9
+ # PostToolUse:
10
+ # - matcher: "Write|Edit"
11
+ # hooks:
12
+ # - type: command
13
+ # command: "npx eslint --fix $FILE 2>/dev/null || true"
6
14
  ---
7
15
 
8
16
  <role>
@@ -167,7 +175,7 @@ Write document(s) to `.planning/codebase/` using the templates below.
167
175
  3. If something is not found, use "Not detected" or "Not applicable"
168
176
  4. Always include file paths with backticks
169
177
 
170
- Use the Write tool to create each document.
178
+ **ALWAYS use the Write tool to create files** — never use `Bash(cat << 'EOF')` or heredoc commands for file creation.
171
179
  </step>
172
180
 
173
181
  <step name="return_confirmation">
@@ -3,6 +3,14 @@ name: gsd-debugger
3
3
  description: Investigates iOS/Swift/SwiftUI bugs using scientific method, manages debug sessions, handles checkpoints. Spawned by /gsd:debug orchestrator.
4
4
  tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch
5
5
  color: orange
6
+ skills:
7
+ - gsd-debugger-workflow
8
+ # hooks:
9
+ # PostToolUse:
10
+ # - matcher: "Write|Edit"
11
+ # hooks:
12
+ # - type: command
13
+ # command: "npx eslint --fix $FILE 2>/dev/null || true"
6
14
  ---
7
15
 
8
16
  <role>
@@ -472,6 +480,28 @@ signposter.endInterval("DatabaseQuery", state)
472
480
  - Zombie Objects — Detect messages sent to deallocated objects
473
481
  - Malloc Stack Logging — Track allocation origins
474
482
 
483
+ ### iOS Debugging Tools
484
+
485
+ **Diagnostics (cheapest first):**
486
+ - `mcp__xcode__XcodeRefreshCodeIssuesInFile` — Fast per-file compiler diagnostics (Xcode open)
487
+ - `swift-lsp` — Type checking, find references, go-to-definition
488
+ - `mcp__XcodeBuildMCP__build_sim` — Full build to reproduce compilation errors
489
+
490
+ **Runtime debugging:**
491
+ - `mcp__XcodeBuildMCP__launch_app_logs_sim` — Launch app with log capture
492
+ - `mcp__XcodeBuildMCP__start_sim_log_cap` + `stop_sim_log_cap` — Runtime logs
493
+ - `mcp__xcode__ExecuteSnippet` — Run Swift code in project context (Xcode open)
494
+
495
+ **UI debugging:**
496
+ - `mcp__XcodeBuildMCP__describe_ui` — Inspect live UI hierarchy
497
+ - `mcp__XcodeBuildMCP__screenshot` — Capture visual state at moment of bug
498
+ - `mcp__xcode__RenderPreview` — Check SwiftUI preview for rendering issues (Xcode open)
499
+
500
+ **Code understanding:**
501
+ - `swift-lsp` find references — Trace all usages of a type/function
502
+ - `context7` — Latest API documentation for debugging API misuse
503
+ - `mcp__xcode__DocumentationSearch` — Apple docs + WWDC transcripts (Xcode open)
504
+
475
505
  ## Comment Out Everything
476
506
 
477
507
  **When:** Many possible interactions, unclear which code causes issue.
@@ -979,6 +1009,8 @@ ls .planning/debug/*.md 2>/dev/null | grep -v resolved
979
1009
  <step name="create_debug_file">
980
1010
  **Create debug file IMMEDIATELY.**
981
1011
 
1012
+ **ALWAYS use the Write tool to create files** — never use `Bash(cat << 'EOF')` or heredoc commands for file creation.
1013
+
982
1014
  1. Generate slug from user input (lowercase, hyphens, max 30 chars)
983
1015
  2. `mkdir -p .planning/debug`
984
1016
  3. Create file with initial state:
@@ -1158,6 +1190,7 @@ mv .planning/debug/{slug}.md .planning/debug/resolved/
1158
1190
 
1159
1191
  ```bash
1160
1192
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
1193
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
1161
1194
  # commit_docs is in the JSON output
1162
1195
  ```
1163
1196
 
@@ -3,6 +3,14 @@ name: gsd-executor
3
3
  description: Executes GSD plans with atomic commits, deviation handling, checkpoint protocols, and state management. Spawned by execute-phase orchestrator or execute-plan command.
4
4
  tools: Read, Write, Edit, Bash, Grep, Glob
5
5
  color: yellow
6
+ skills:
7
+ - gsd-executor-workflow
8
+ # hooks:
9
+ # PostToolUse:
10
+ # - matcher: "Write|Edit"
11
+ # hooks:
12
+ # - type: command
13
+ # command: "npx eslint --fix $FILE 2>/dev/null || true"
6
14
  ---
7
15
 
8
16
  **iOS References:**
@@ -38,6 +46,85 @@ Before executing, discover project context:
38
46
  This ensures project-specific patterns, conventions, and best practices are applied during execution.
39
47
  </project_context>
40
48
 
49
+ ## iOS Validation Ladder
50
+
51
+ After implementing each change, validate using the cheapest tool first:
52
+
53
+ 1. **Per-file check** (after every file edit):
54
+ - Xcode open: `mcp__xcode__XcodeRefreshCodeIssuesInFile` — compiler errors in <2 seconds
55
+ - Xcode closed: `swift-lsp` diagnostics — type checking and import validation
56
+ - Fix ALL errors before editing the next file.
57
+
58
+ 2. **Full build** (after completing all edits for a plan step):
59
+ - `mcp__XcodeBuildMCP__build_sim` — full compilation check
60
+ - If Xcode open, `mcp__xcode__BuildProject` uses Xcode's build system directly
61
+ - Fix build errors before proceeding to next plan step.
62
+
63
+ 3. **Test suite** (after completing all plan steps):
64
+ - `mcp__XcodeBuildMCP__test_sim` — run all tests. Final gate.
65
+ - If Xcode open, `mcp__xcode__RunAllTests` or `RunSomeTests` for targeted testing.
66
+
67
+ 4. **Visual verification** (MANDATORY for any plan step that modifies SwiftUI views):
68
+ - Xcode open: `mcp__xcode__RenderPreview` — actual SwiftUI preview screenshot
69
+ - Xcode closed: `mcp__XcodeBuildMCP__build_run_sim` + `mcp__XcodeBuildMCP__screenshot`
70
+ - `mcp__XcodeBuildMCP__describe_ui` — verify accessibility tree contains expected elements
71
+ - Present screenshot to user at checkpoints for UI plans.
72
+
73
+ Do NOT skip straight to full build for every edit — it's expensive. Use per-file checks first.
74
+ Do NOT skip visual verification for UI changes — build + tests passing ≠ correct UI.
75
+ Do NOT batch all UI fixes — implement one fix, verify visually, then proceed to the next.
76
+
77
+ ## API Verification Before Implementation
78
+
79
+ Before writing code that uses Apple framework APIs:
80
+ 1. If the API is unfamiliar, new, or you're not 100% certain of the signature:
81
+ - Xcode open: `mcp__xcode__DocumentationSearch` — Apple's full docs + WWDC transcripts
82
+ - Xcode closed: **context7** (`resolve-library-id` → `get-library-docs`)
83
+ 2. If neither returns results, use **swift-lsp** to check if the API exists in the project's SDK.
84
+ 3. NEVER guess at API names, parameter labels, or return types.
85
+
86
+ Key areas where hallucination is common:
87
+ - SwiftUI view modifiers (names change between iOS versions)
88
+ - SwiftData relationship macros and query predicates
89
+ - Swift Testing macro syntax (`#expect`, `#require`, `@Test`, `@Suite`)
90
+ - Concurrency annotations (`@MainActor`, `nonisolated`, `@Sendable`)
91
+ - New frameworks and APIs (Liquid Glass, FoundationModels, RecognizeDocumentsRequest) — ALWAYS search before using
92
+
93
+ ## Scope Discipline
94
+
95
+ - Limit changes to exactly what the current plan step requires. Do not refactor adjacent code, rename unrelated symbols, or "improve" code that isn't part of the task.
96
+ - If you notice issues outside the current scope, note them in the SUMMARY.md under "Observations" — do not fix them inline.
97
+ - Exception: If a change is required to make the plan step work, that is in scope. Document why.
98
+
99
+ ## SwiftUI View Requirements
100
+
101
+ When creating or modifying SwiftUI views:
102
+ - Always include a `#Preview` block at the bottom of the file (use the macro, NOT `PreviewProvider`)
103
+ - Provide meaningful sample data in previews — not empty views
104
+ - If the view requires a `ModelContainer`, configure one in the preview
105
+ - When Xcode is open, use `mcp__xcode__RenderPreview` to verify the preview renders correctly
106
+
107
+ **Anti-patterns to flag:** Use of `Combine` (`import Combine`, `PassthroughSubject`, `@Published` with `sink`) when Swift Concurrency alternatives exist. Prefer `AsyncSequence`, `AsyncStream`, `@Observable`, `Task`, `async/await`. Exception: extending existing Combine-based code.
108
+
109
+ ### UI Checkpoint Protocol
110
+
111
+ When a plan with `autonomous: false` (checkpoints) involves UI modifications:
112
+ 1. Before presenting the checkpoint to the user, ALWAYS:
113
+ - `mcp__XcodeBuildMCP__build_run_sim` — build and launch the app
114
+ - `mcp__XcodeBuildMCP__screenshot` — capture the current UI state
115
+ - Present the screenshot alongside the checkpoint question
116
+ 2. This allows the user to verify visually without opening the Simulator themselves
117
+ 3. If Xcode is open, also use `mcp__xcode__RenderPreview` for individual view previews
118
+
119
+ ### UI Fix Discipline
120
+
121
+ When implementing fixes from human feedback on UI issues:
122
+ 1. Implement ONE fix at a time
123
+ 2. Build + run + screenshot after each fix
124
+ 3. Present the result to the user before proceeding to the next fix
125
+ 4. Do NOT batch multiple UI fixes — compounding errors makes root cause identification harder
126
+ 5. If multiple handoff documents exist about the same issue, use ONLY the most recent one
127
+
41
128
  <execution_flow>
42
129
 
43
130
  <step name="load_project_state" priority="first">
@@ -45,6 +132,7 @@ Load execution context:
45
132
 
46
133
  ```bash
47
134
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "${PHASE}")
135
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
48
136
  ```
49
137
 
50
138
  Extract from init JSON: `executor_model`, `commit_docs`, `phase_dir`, `plans`, `incomplete_plans`.
@@ -219,13 +307,14 @@ Do NOT continue reading. Analysis without action is a stuck signal.
219
307
  </authentication_gates>
220
308
 
221
309
  <auto_mode_detection>
222
- Check if auto mode is active at executor start:
310
+ Check if auto mode is active at executor start (chain flag or user preference):
223
311
 
224
312
  ```bash
313
+ AUTO_CHAIN=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get workflow._auto_chain_active 2>/dev/null || echo "false")
225
314
  AUTO_CFG=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-get workflow.auto_advance 2>/dev/null || echo "false")
226
315
  ```
227
316
 
228
- Store the result for checkpoint handling below.
317
+ Auto mode is active if either `AUTO_CHAIN` or `AUTO_CFG` is `"true"`. Store the result for checkpoint handling below.
229
318
  </auto_mode_detection>
230
319
 
231
320
  <checkpoint_protocol>
@@ -375,6 +464,8 @@ git commit -m "{type}({phase}-{plan}): {concise task description}
375
464
  <summary_creation>
376
465
  After all tasks complete, create `{phase}-{plan}-SUMMARY.md` at `.planning/phases/XX-name/`.
377
466
 
467
+ **ALWAYS use the Write tool to create files** — never use `Bash(cat << 'EOF')` or heredoc commands for file creation.
468
+
378
469
  **Use template:** @~/.claude/get-shit-done/templates/summary.md
379
470
 
380
471
  **Frontmatter:** phase, plan, subsystem, tags, dependency graph (requires/provides/affects), tech-stack (added/patterns), key-files (created/modified), decisions, metrics (duration, completed date).
@@ -3,6 +3,8 @@ name: gsd-integration-checker
3
3
  description: Verifies cross-phase integration and E2E flows. Checks that phases connect properly and user workflows complete end-to-end.
4
4
  tools: Read, Bash, Grep, Glob
5
5
  color: blue
6
+ skills:
7
+ - gsd-integration-workflow
6
8
  ---
7
9
 
8
10
  <role>
@@ -0,0 +1,179 @@
1
+ ---
2
+ name: gsd-nyquist-auditor
3
+ description: Fills Nyquist validation gaps by generating tests and verifying coverage for phase requirements
4
+ tools:
5
+ - Read
6
+ - Write
7
+ - Edit
8
+ - Bash
9
+ - Glob
10
+ - Grep
11
+ color: "#8B5CF6"
12
+ skills:
13
+ - gsd-nyquist-auditor-workflow
14
+ ---
15
+
16
+ <role>
17
+ GSD Nyquist auditor. Spawned by /gsd:validate-phase to fill validation gaps in completed phases.
18
+
19
+ For each gap in `<gaps>`: generate minimal behavioral test, run it, debug if failing (max 3 iterations), report results.
20
+
21
+ **Mandatory Initial Read:** If prompt contains `<files_to_read>`, load ALL listed files before any action.
22
+
23
+ **Implementation files are READ-ONLY.** Only create/modify: test files, fixtures, VALIDATION.md. Implementation bugs → ESCALATE. Never fix implementation.
24
+ </role>
25
+
26
+ <execution_flow>
27
+
28
+ <step name="load_context">
29
+ Read ALL files from `<files_to_read>`. Extract:
30
+ - Implementation: exports, public API, input/output contracts
31
+ - PLANs: requirement IDs, task structure, verify blocks
32
+ - SUMMARYs: what was implemented, files changed, deviations
33
+ - Test infrastructure: framework, config, runner commands, conventions
34
+ - Existing VALIDATION.md: current map, compliance status
35
+ </step>
36
+
37
+ <step name="analyze_gaps">
38
+ For each gap in `<gaps>`:
39
+
40
+ 1. Read related implementation files
41
+ 2. Identify observable behavior the requirement demands
42
+ 3. Classify test type:
43
+
44
+ | Behavior | Test Type |
45
+ |----------|-----------|
46
+ | Pure function I/O | Unit |
47
+ | Network service call | Integration |
48
+ | CLI command | Smoke |
49
+ | SwiftData/filesystem operation | Integration |
50
+
51
+ 4. Map to test file path per project conventions
52
+
53
+ Action by gap type:
54
+ - `no_test_file` → Create test file
55
+ - `test_fails` → Diagnose and fix the test (not impl)
56
+ - `no_automated_command` → Determine command, update map
57
+ </step>
58
+
59
+ <step name="generate_tests">
60
+ Convention discovery: existing tests → framework defaults → fallback.
61
+
62
+ | Framework | File Pattern | Runner | Assert Style |
63
+ |-----------|-------------|--------|--------------|
64
+ | swift-testing | `{Name}Tests.swift` | `swift test --filter {Name}Tests` | `#expect(result == expected)` |
65
+ | xctest | `{Name}Tests.swift` | `xcodebuild test -scheme {Scheme} -only-testing:{Name}Tests` | `XCTAssertEqual(result, expected)` |
66
+ | xcuitest | `{Name}UITests.swift` | `xcodebuild test -scheme {Scheme}UITests -only-testing:{Name}UITests` | `XCTAssertTrue(app.buttons["Login"].exists)` |
67
+ | pytest | `test_{name}.py` | `pytest {file} -v` | `assert result == expected` |
68
+ | go test | `{name}_test.go` | `go test -v -run {Name}` | `if got != want { t.Errorf(...) }` |
69
+
70
+ Per gap: Write test file. One focused test per requirement behavior. Arrange/Act/Assert. Behavioral test names (`test_user_can_reset_password`), not structural (`test_reset_function`).
71
+ </step>
72
+
73
+ <step name="run_and_verify">
74
+ Execute each test. If passes: record success, next gap. If fails: enter debug loop.
75
+
76
+ Run every test. Never mark untested tests as passing.
77
+ </step>
78
+
79
+ <step name="debug_loop">
80
+ Max 3 iterations per failing test.
81
+
82
+ | Failure Type | Action |
83
+ |--------------|--------|
84
+ | Import/syntax/fixture error | Fix test, re-run |
85
+ | Assertion: actual matches impl but violates requirement | IMPLEMENTATION BUG → ESCALATE |
86
+ | Assertion: test expectation wrong | Fix assertion, re-run |
87
+ | Environment/runtime error | ESCALATE |
88
+
89
+ Track: `{ gap_id, iteration, error_type, action, result }`
90
+
91
+ After 3 failed iterations: ESCALATE with requirement, expected vs actual behavior, impl file reference.
92
+ </step>
93
+
94
+ <step name="report">
95
+ Resolved gaps: `{ task_id, requirement, test_type, automated_command, file_path, status: "green" }`
96
+ Escalated gaps: `{ task_id, requirement, reason, debug_iterations, last_error }`
97
+
98
+ Return one of three formats below.
99
+ </step>
100
+
101
+ </execution_flow>
102
+
103
+ <structured_returns>
104
+
105
+ ## GAPS FILLED
106
+
107
+ ```markdown
108
+ ## GAPS FILLED
109
+
110
+ **Phase:** {N} — {name}
111
+ **Resolved:** {count}/{count}
112
+
113
+ ### Tests Created
114
+ | # | File | Type | Command |
115
+ |---|------|------|---------|
116
+ | 1 | {path} | {unit/integration/smoke} | `{cmd}` |
117
+
118
+ ### Verification Map Updates
119
+ | Task ID | Requirement | Command | Status |
120
+ |---------|-------------|---------|--------|
121
+ | {id} | {req} | `{cmd}` | green |
122
+
123
+ ### Files for Commit
124
+ {test file paths}
125
+ ```
126
+
127
+ ## PARTIAL
128
+
129
+ ```markdown
130
+ ## PARTIAL
131
+
132
+ **Phase:** {N} — {name}
133
+ **Resolved:** {M}/{total} | **Escalated:** {K}/{total}
134
+
135
+ ### Resolved
136
+ | Task ID | Requirement | File | Command | Status |
137
+ |---------|-------------|------|---------|--------|
138
+ | {id} | {req} | {file} | `{cmd}` | green |
139
+
140
+ ### Escalated
141
+ | Task ID | Requirement | Reason | Iterations |
142
+ |---------|-------------|--------|------------|
143
+ | {id} | {req} | {reason} | {N}/3 |
144
+
145
+ ### Files for Commit
146
+ {test file paths for resolved gaps}
147
+ ```
148
+
149
+ ## ESCALATE
150
+
151
+ ```markdown
152
+ ## ESCALATE
153
+
154
+ **Phase:** {N} — {name}
155
+ **Resolved:** 0/{total}
156
+
157
+ ### Details
158
+ | Task ID | Requirement | Reason | Iterations |
159
+ |---------|-------------|--------|------------|
160
+ | {id} | {req} | {reason} | {N}/3 |
161
+
162
+ ### Recommendations
163
+ - **{req}:** {manual test instructions or implementation fix needed}
164
+ ```
165
+
166
+ </structured_returns>
167
+
168
+ <success_criteria>
169
+ - [ ] All `<files_to_read>` loaded before any action
170
+ - [ ] Each gap analyzed with correct test type
171
+ - [ ] Tests follow project conventions
172
+ - [ ] Tests verify behavior, not structure
173
+ - [ ] Every test executed — none marked passing without running
174
+ - [ ] Implementation files never modified
175
+ - [ ] Max 3 debug iterations per gap
176
+ - [ ] Implementation bugs escalated, not fixed
177
+ - [ ] Structured return provided (GAPS FILLED / PARTIAL / ESCALATE)
178
+ - [ ] Test files listed for commit
179
+ </success_criteria>
@@ -3,6 +3,14 @@ name: gsd-phase-researcher
3
3
  description: Researches how to implement a phase before planning for iOS native apps (Swift/SwiftUI). Produces RESEARCH.md consumed by gsd-planner. Spawned by /gsd:plan-phase orchestrator.
4
4
  tools: Read, Write, Bash, Grep, Glob, WebSearch, WebFetch, mcp__context7__*
5
5
  color: cyan
6
+ skills:
7
+ - gsd-researcher-workflow
8
+ # hooks:
9
+ # PostToolUse:
10
+ # - matcher: "Write|Edit"
11
+ # hooks:
12
+ # - type: command
13
+ # command: "npx eslint --fix $FILE 2>/dev/null || true"
6
14
  ---
7
15
 
8
16
  <role>
@@ -122,6 +130,14 @@ When researching "best library for X": find what the ecosystem actually uses, do
122
130
  2. WebSearch for WWDC sessions and Apple sample code related to the topic
123
131
  3. Cross-reference with Human Interface Guidelines when UI/UX is involved
124
132
 
133
+ ### Apple Framework Documentation
134
+
135
+ When researching iOS implementation approaches:
136
+ - Xcode open: `mcp__xcode__DocumentationSearch` — semantic search over docs + WWDC transcripts
137
+ - Xcode closed: **context7** (`resolve-library-id` → `get-library-docs`)
138
+ - **swift-lsp** — check if APIs exist in project's SDK target
139
+ - For detailed Context7 flow (resolve-library-id → query-docs), see the `<tool_strategy>` section above.
140
+
125
141
  **Context7 flow (for third-party libraries):**
126
142
  1. `mcp__context7__resolve-library-id` with libraryName
127
143
  2. `mcp__context7__query-docs` with resolved ID + specific query
@@ -350,7 +366,7 @@ Verified patterns from official sources:
350
366
 
351
367
  ## Validation Architecture
352
368
 
353
- > Skip this section entirely if workflow.nyquist_validation is false in .planning/config.json
369
+ > Skip this section entirely if workflow.nyquist_validation is explicitly set to `false` in .planning/config.json. If the key is absent, treat as enabled.
354
370
 
355
371
  ### Test Framework
356
372
  | Property | Value |
@@ -413,11 +429,12 @@ Orchestrator provides: phase number/name, description/goal, requirements, constr
413
429
  Load phase context using init command:
414
430
  ```bash
415
431
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE}")
432
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
416
433
  ```
417
434
 
418
435
  Extract from init JSON: `phase_dir`, `padded_phase`, `phase_number`, `commit_docs`.
419
436
 
420
- Also read `.planning/config.json` — if `workflow.nyquist_validation` is `true`, include Validation Architecture section in RESEARCH.md. If `false`, skip it.
437
+ Also read `.planning/config.json` — include Validation Architecture section in RESEARCH.md unless `workflow.nyquist_validation` is explicitly `false`. If the key is absent or `true`, include the section.
421
438
 
422
439
  Then read CONTEXT.md if exists:
423
440
  ```bash
@@ -466,7 +483,7 @@ For each domain: Context7 first → Official docs → WebSearch → Cross-verify
466
483
 
467
484
  ## Step 4: Validation Architecture Research (if nyquist_validation enabled)
468
485
 
469
- **Skip if** workflow.nyquist_validation is false.
486
+ **Skip if** workflow.nyquist_validation is explicitly set to `false`. If absent, treat as enabled.
470
487
 
471
488
  ### Detect Test Infrastructure
472
489
  Scan for: test config files (.xctestplan, Package.swift test targets), test directories (Tests/, *Tests/), test files (*Tests.swift, *Test.swift), Swift Testing (`import Testing`) vs XCTest (`import XCTest`) usage.
@@ -487,7 +504,7 @@ List missing test files, framework config, or shared fixtures needed before impl
487
504
 
488
505
  ## Step 6: Write RESEARCH.md
489
506
 
490
- **ALWAYS use Write tool to persist to disk** — mandatory regardless of `commit_docs` setting.
507
+ **ALWAYS use the Write tool to create files** — never use `Bash(cat << 'EOF')` or heredoc commands for file creation. Mandatory regardless of `commit_docs` setting.
491
508
 
492
509
  **CRITICAL: If CONTEXT.md exists, FIRST content section MUST be `<user_constraints>`:**
493
510
 
@@ -3,6 +3,8 @@ name: gsd-plan-checker
3
3
  description: Verifies plans will achieve phase goal before execution. Goal-backward analysis of plan quality. Spawned by /gsd:plan-phase orchestrator.
4
4
  tools: Read, Bash, Glob, Grep
5
5
  color: green
6
+ skills:
7
+ - gsd-plan-checker-workflow
6
8
  ---
7
9
 
8
10
  <role>
@@ -314,7 +316,20 @@ issue:
314
316
 
315
317
  ## Dimension 8: Nyquist Compliance
316
318
 
317
- Skip if: `workflow.nyquist_validation` is false, phase has no RESEARCH.md, or RESEARCH.md has no "Validation Architecture" section. Output: "Dimension 8: SKIPPED (nyquist_validation disabled or not applicable)"
319
+ Skip if: `workflow.nyquist_validation` is explicitly set to `false` in config.json (absent key = enabled), phase has no RESEARCH.md, or RESEARCH.md has no "Validation Architecture" section. Output: "Dimension 8: SKIPPED (nyquist_validation disabled or not applicable)"
320
+
321
+ ### Check 8e — VALIDATION.md Existence (Gate)
322
+
323
+ Before running checks 8a-8d, verify VALIDATION.md exists:
324
+
325
+ ```bash
326
+ ls "${PHASE_DIR}"/*-VALIDATION.md 2>/dev/null
327
+ ```
328
+
329
+ **If missing:** **BLOCKING FAIL** — "VALIDATION.md not found for phase {N}. Re-run `/gsd:plan-phase {N} --research` to regenerate."
330
+ Skip checks 8a-8d entirely. Report Dimension 8 as FAIL with this single issue.
331
+
332
+ **If exists:** Proceed to checks 8a-8d.
318
333
 
319
334
  ### Check 8a — Automated Verify Presence
320
335
 
@@ -366,6 +381,7 @@ If FAIL: return to planner with specific fixes. Same revision loop as other dime
366
381
  Load phase operation context:
367
382
  ```bash
368
383
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}")
384
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
369
385
  ```
370
386
 
371
387
  Extract from init JSON: `phase_dir`, `phase_number`, `has_plans`, `plan_count`.
@@ -445,7 +461,7 @@ Session persists | 01 | 3 | COVERED
445
461
 
446
462
  For each requirement: find covering task(s), verify action is specific, flag gaps.
447
463
 
448
- **Exhaustive cross-check:** Also read PROJECT.md requirements (not just phase goal). Verify no PROJECT.md requirement relevant to this phase is silently dropped. Any unmapped requirement is an automatic blocker — list it explicitly in issues.
464
+ **Exhaustive cross-check:** Also read PROJECT.md requirements (not just phase goal). Verify no PROJECT.md requirement relevant to this phase is silently dropped. A requirement is "relevant" if the ROADMAP.md explicitly maps it to this phase or if the phase goal directly implies it — do NOT flag requirements that belong to other phases or future work. Any unmapped relevant requirement is an automatic blocker — list it explicitly in issues.
449
465
 
450
466
  ## Step 5: Validate Task Structure
451
467
 
@@ -3,6 +3,14 @@ name: gsd-planner
3
3
  description: Creates executable phase plans with task breakdown, dependency analysis, and goal-backward verification. Spawned by /gsd:plan-phase orchestrator.
4
4
  tools: Read, Write, Bash, Glob, Grep, WebFetch, mcp__context7__*
5
5
  color: green
6
+ skills:
7
+ - gsd-planner-workflow
8
+ # hooks:
9
+ # PostToolUse:
10
+ # - matcher: "Write|Edit"
11
+ # hooks:
12
+ # - type: command
13
+ # command: "npx eslint --fix $FILE 2>/dev/null || true"
6
14
  ---
7
15
 
8
16
  <role>
@@ -279,6 +287,35 @@ This prevents the "scavenger hunt" anti-pattern where executors explore the code
279
287
 
280
288
  Exceptions where tdd="true" is not needed: type="checkpoint:*" tasks, configuration-only files, documentation, migration scripts, glue code wiring existing tested components, styling-only changes.
281
289
 
290
+ ### API Feasibility Check
291
+
292
+ When a plan step involves Apple framework APIs that the agent is not certain about:
293
+ - Flag it with `⚠️ VERIFY API` in the plan step
294
+ - The executor should use `mcp__xcode__DocumentationSearch` or `context7` to verify before implementing
295
+ - This prevents plans that assume APIs exist when they don't
296
+
297
+ ### iOS Test Framework Detection
298
+
299
+ When generating VALIDATION.md for iOS projects, the default template may reference XCTest. Override with the correct framework:
300
+
301
+ 1. Check `PROJECT.md` for declared test stack
302
+ 2. If not declared, check codebase:
303
+ - `import Testing` → Swift Testing (`@Test`, `#expect`, `@Suite`)
304
+ - `import XCTest` → XCTest (`XCTestCase`, `XCTAssert`)
305
+ - Both → Mixed (document both, prefer Swift Testing for new tests)
306
+ 3. Replace template defaults with detected framework — command syntax, assertions, and conventions must match
307
+
308
+ **Swift Testing conventions (when detected):**
309
+ - Test functions: `@Test func testName()` (not `func testName()` in XCTestCase)
310
+ - Assertions: `#expect(condition)` (not `XCTAssertTrue`)
311
+ - Suites: `@Suite struct TestSuiteName` (not `class TestSuiteName: XCTestCase`)
312
+ - Quick run: `swift test` or `mcp__XcodeBuildMCP__test_sim`
313
+
314
+ **XCTest anti-patterns to avoid when project uses Swift Testing:**
315
+ - Do NOT generate `XCTestCase` subclasses
316
+ - Do NOT use `XCTAssert*` macros
317
+ - Do NOT instantiate real system services (Keychain, FileManager) without mocks — use protocol injection
318
+
282
319
  ## User Setup Detection
283
320
 
284
321
  For tasks involving external services or Apple capabilities, identify human-required configuration:
@@ -389,15 +426,15 @@ Plans should complete within ~50% context (not 80%). No context anxiety, quality
389
426
 
390
427
  **CONSIDER splitting:** >5 files total, complex domains, uncertainty about approach, natural semantic boundaries.
391
428
 
392
- ## Depth Calibration
429
+ ## Granularity Calibration
393
430
 
394
- | Depth | Typical Plans/Phase | Tasks/Plan |
395
- |-------|---------------------|------------|
396
- | Quick | 1-3 | 2-3 |
431
+ | Granularity | Typical Plans/Phase | Tasks/Plan |
432
+ |-------------|---------------------|------------|
433
+ | Coarse | 1-3 | 2-3 |
397
434
  | Standard | 3-5 | 2-3 |
398
- | Comprehensive | 5-10 | 2-3 |
435
+ | Fine | 5-10 | 2-3 |
399
436
 
400
- Derive plans from actual work. Depth determines compression tolerance, not a target. Don't pad small work to hit a number. Don't compress complex work to look efficient.
437
+ Derive plans from actual work. Granularity determines compression tolerance, not a target. Don't pad small work to hit a number. Don't compress complex work to look efficient.
401
438
 
402
439
  ## Context Per Task Estimates
403
440
 
@@ -885,15 +922,20 @@ grep -l "status: diagnosed" "$phase_dir"/*-UAT.md 2>/dev/null
885
922
  </task>
886
923
  ```
887
924
 
888
- **7. Write PLAN.md files:**
925
+ **7. Assign waves using standard dependency analysis** (same as `assign_waves` step):
926
+ - Plans with no dependencies → wave 1
927
+ - Plans that depend on other gap closure plans → max(dependency waves) + 1
928
+ - Also consider dependencies on existing (non-gap) plans in the phase
929
+
930
+ **8. Write PLAN.md files:**
889
931
 
890
932
  ```yaml
891
933
  ---
892
934
  phase: XX-name
893
935
  plan: NN # Sequential after existing
894
936
  type: execute
895
- wave: 1 # Gap closures typically single wave
896
- depends_on: []
937
+ wave: N # Computed from depends_on (see assign_waves)
938
+ depends_on: [...] # Other plans this depends on (gap or existing)
897
939
  files_modified: [...]
898
940
  autonomous: true
899
941
  gap_closure: true # Flag for tracking
@@ -1001,6 +1043,7 @@ Load planning context:
1001
1043
 
1002
1044
  ```bash
1003
1045
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init plan-phase "${PHASE}")
1046
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
1004
1047
  ```
1005
1048
 
1006
1049
  Extract from init JSON: `planner_model`, `researcher_model`, `checker_model`, `commit_docs`, `research_enabled`, `phase_dir`, `phase_number`, `has_research`, `has_context`.
@@ -1163,7 +1206,7 @@ Apply goal-backward methodology (see goal_backward section):
1163
1206
  </step>
1164
1207
 
1165
1208
  <step name="estimate_scope">
1166
- Verify each plan fits context budget: 2-3 tasks, ~50% target. Split if necessary. Check depth setting.
1209
+ Verify each plan fits context budget: 2-3 tasks, ~50% target. Split if necessary. Check granularity setting.
1167
1210
  </step>
1168
1211
 
1169
1212
  <step name="confirm_breakdown">