gsd-opencode 1.22.1 → 1.33.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 (188) hide show
  1. package/agents/gsd-advisor-researcher.md +112 -0
  2. package/agents/gsd-assumptions-analyzer.md +110 -0
  3. package/agents/gsd-codebase-mapper.md +0 -2
  4. package/agents/gsd-debugger.md +117 -2
  5. package/agents/gsd-doc-verifier.md +207 -0
  6. package/agents/gsd-doc-writer.md +608 -0
  7. package/agents/gsd-executor.md +45 -4
  8. package/agents/gsd-integration-checker.md +0 -2
  9. package/agents/gsd-nyquist-auditor.md +0 -2
  10. package/agents/gsd-phase-researcher.md +191 -5
  11. package/agents/gsd-plan-checker.md +152 -5
  12. package/agents/gsd-planner.md +131 -157
  13. package/agents/gsd-project-researcher.md +28 -3
  14. package/agents/gsd-research-synthesizer.md +0 -2
  15. package/agents/gsd-roadmapper.md +29 -2
  16. package/agents/gsd-security-auditor.md +129 -0
  17. package/agents/gsd-ui-auditor.md +485 -0
  18. package/agents/gsd-ui-checker.md +305 -0
  19. package/agents/gsd-ui-researcher.md +368 -0
  20. package/agents/gsd-user-profiler.md +173 -0
  21. package/agents/gsd-verifier.md +207 -22
  22. package/commands/gsd/gsd-add-backlog.md +76 -0
  23. package/commands/gsd/gsd-analyze-dependencies.md +34 -0
  24. package/commands/gsd/gsd-audit-uat.md +24 -0
  25. package/commands/gsd/gsd-autonomous.md +45 -0
  26. package/commands/gsd/gsd-cleanup.md +5 -0
  27. package/commands/gsd/gsd-debug.md +29 -21
  28. package/commands/gsd/gsd-discuss-phase.md +15 -36
  29. package/commands/gsd/gsd-do.md +30 -0
  30. package/commands/gsd/gsd-docs-update.md +48 -0
  31. package/commands/gsd/gsd-execute-phase.md +24 -2
  32. package/commands/gsd/gsd-fast.md +30 -0
  33. package/commands/gsd/gsd-forensics.md +56 -0
  34. package/commands/gsd/gsd-help.md +2 -0
  35. package/commands/gsd/gsd-join-discord.md +2 -1
  36. package/commands/gsd/gsd-list-workspaces.md +19 -0
  37. package/commands/gsd/gsd-manager.md +40 -0
  38. package/commands/gsd/gsd-milestone-summary.md +51 -0
  39. package/commands/gsd/gsd-new-project.md +4 -0
  40. package/commands/gsd/gsd-new-workspace.md +44 -0
  41. package/commands/gsd/gsd-next.md +24 -0
  42. package/commands/gsd/gsd-note.md +34 -0
  43. package/commands/gsd/gsd-plan-phase.md +8 -1
  44. package/commands/gsd/gsd-plant-seed.md +28 -0
  45. package/commands/gsd/gsd-pr-branch.md +25 -0
  46. package/commands/gsd/gsd-profile-user.md +46 -0
  47. package/commands/gsd/gsd-quick.md +7 -3
  48. package/commands/gsd/gsd-reapply-patches.md +178 -45
  49. package/commands/gsd/gsd-remove-workspace.md +26 -0
  50. package/commands/gsd/gsd-research-phase.md +7 -12
  51. package/commands/gsd/gsd-review-backlog.md +62 -0
  52. package/commands/gsd/gsd-review.md +38 -0
  53. package/commands/gsd/gsd-secure-phase.md +35 -0
  54. package/commands/gsd/gsd-session-report.md +19 -0
  55. package/commands/gsd/gsd-set-profile.md +24 -23
  56. package/commands/gsd/gsd-ship.md +23 -0
  57. package/commands/gsd/gsd-stats.md +18 -0
  58. package/commands/gsd/gsd-thread.md +127 -0
  59. package/commands/gsd/gsd-ui-phase.md +34 -0
  60. package/commands/gsd/gsd-ui-review.md +32 -0
  61. package/commands/gsd/gsd-workstreams.md +71 -0
  62. package/get-shit-done/bin/gsd-tools.cjs +450 -90
  63. package/get-shit-done/bin/lib/commands.cjs +489 -24
  64. package/get-shit-done/bin/lib/config.cjs +329 -48
  65. package/get-shit-done/bin/lib/core.cjs +1143 -102
  66. package/get-shit-done/bin/lib/docs.cjs +267 -0
  67. package/get-shit-done/bin/lib/frontmatter.cjs +125 -43
  68. package/get-shit-done/bin/lib/init.cjs +918 -106
  69. package/get-shit-done/bin/lib/milestone.cjs +65 -33
  70. package/get-shit-done/bin/lib/model-profiles.cjs +70 -0
  71. package/get-shit-done/bin/lib/phase.cjs +434 -404
  72. package/get-shit-done/bin/lib/profile-output.cjs +1048 -0
  73. package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
  74. package/get-shit-done/bin/lib/roadmap.cjs +156 -101
  75. package/get-shit-done/bin/lib/schema-detect.cjs +238 -0
  76. package/get-shit-done/bin/lib/security.cjs +384 -0
  77. package/get-shit-done/bin/lib/state.cjs +711 -79
  78. package/get-shit-done/bin/lib/template.cjs +2 -2
  79. package/get-shit-done/bin/lib/uat.cjs +282 -0
  80. package/get-shit-done/bin/lib/verify.cjs +254 -42
  81. package/get-shit-done/bin/lib/workstream.cjs +495 -0
  82. package/get-shit-done/references/agent-contracts.md +79 -0
  83. package/get-shit-done/references/artifact-types.md +113 -0
  84. package/get-shit-done/references/checkpoints.md +12 -10
  85. package/get-shit-done/references/context-budget.md +49 -0
  86. package/get-shit-done/references/continuation-format.md +15 -15
  87. package/get-shit-done/references/decimal-phase-calculation.md +2 -3
  88. package/get-shit-done/references/domain-probes.md +125 -0
  89. package/get-shit-done/references/gate-prompts.md +100 -0
  90. package/get-shit-done/references/git-integration.md +47 -0
  91. package/get-shit-done/references/model-profile-resolution.md +2 -0
  92. package/get-shit-done/references/model-profiles.md +62 -16
  93. package/get-shit-done/references/phase-argument-parsing.md +2 -2
  94. package/get-shit-done/references/planner-gap-closure.md +62 -0
  95. package/get-shit-done/references/planner-reviews.md +39 -0
  96. package/get-shit-done/references/planner-revision.md +87 -0
  97. package/get-shit-done/references/planning-config.md +18 -1
  98. package/get-shit-done/references/revision-loop.md +97 -0
  99. package/get-shit-done/references/ui-brand.md +2 -2
  100. package/get-shit-done/references/universal-anti-patterns.md +58 -0
  101. package/get-shit-done/references/user-profiling.md +681 -0
  102. package/get-shit-done/references/workstream-flag.md +111 -0
  103. package/get-shit-done/templates/SECURITY.md +61 -0
  104. package/get-shit-done/templates/UAT.md +21 -3
  105. package/get-shit-done/templates/UI-SPEC.md +100 -0
  106. package/get-shit-done/templates/VALIDATION.md +3 -3
  107. package/get-shit-done/templates/claude-md.md +145 -0
  108. package/get-shit-done/templates/config.json +14 -3
  109. package/get-shit-done/templates/context.md +61 -6
  110. package/get-shit-done/templates/debug-subagent-prompt.md +2 -6
  111. package/get-shit-done/templates/dev-preferences.md +21 -0
  112. package/get-shit-done/templates/discussion-log.md +63 -0
  113. package/get-shit-done/templates/phase-prompt.md +46 -5
  114. package/get-shit-done/templates/planner-subagent-prompt.md +2 -10
  115. package/get-shit-done/templates/project.md +2 -0
  116. package/get-shit-done/templates/state.md +2 -2
  117. package/get-shit-done/templates/user-profile.md +146 -0
  118. package/get-shit-done/workflows/add-phase.md +4 -4
  119. package/get-shit-done/workflows/add-tests.md +4 -4
  120. package/get-shit-done/workflows/add-todo.md +4 -4
  121. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  122. package/get-shit-done/workflows/audit-milestone.md +20 -16
  123. package/get-shit-done/workflows/audit-uat.md +109 -0
  124. package/get-shit-done/workflows/autonomous.md +1036 -0
  125. package/get-shit-done/workflows/check-todos.md +4 -4
  126. package/get-shit-done/workflows/cleanup.md +4 -4
  127. package/get-shit-done/workflows/complete-milestone.md +22 -10
  128. package/get-shit-done/workflows/diagnose-issues.md +21 -7
  129. package/get-shit-done/workflows/discovery-phase.md +2 -2
  130. package/get-shit-done/workflows/discuss-phase-assumptions.md +671 -0
  131. package/get-shit-done/workflows/discuss-phase-power.md +291 -0
  132. package/get-shit-done/workflows/discuss-phase.md +558 -47
  133. package/get-shit-done/workflows/do.md +104 -0
  134. package/get-shit-done/workflows/docs-update.md +1093 -0
  135. package/get-shit-done/workflows/execute-phase.md +741 -58
  136. package/get-shit-done/workflows/execute-plan.md +77 -12
  137. package/get-shit-done/workflows/fast.md +105 -0
  138. package/get-shit-done/workflows/forensics.md +265 -0
  139. package/get-shit-done/workflows/health.md +28 -6
  140. package/get-shit-done/workflows/help.md +127 -7
  141. package/get-shit-done/workflows/insert-phase.md +4 -4
  142. package/get-shit-done/workflows/list-phase-assumptions.md +2 -2
  143. package/get-shit-done/workflows/list-workspaces.md +56 -0
  144. package/get-shit-done/workflows/manager.md +363 -0
  145. package/get-shit-done/workflows/map-codebase.md +83 -44
  146. package/get-shit-done/workflows/milestone-summary.md +223 -0
  147. package/get-shit-done/workflows/new-milestone.md +133 -25
  148. package/get-shit-done/workflows/new-project.md +216 -54
  149. package/get-shit-done/workflows/new-workspace.md +237 -0
  150. package/get-shit-done/workflows/next.md +97 -0
  151. package/get-shit-done/workflows/node-repair.md +92 -0
  152. package/get-shit-done/workflows/note.md +156 -0
  153. package/get-shit-done/workflows/pause-work.md +132 -15
  154. package/get-shit-done/workflows/plan-milestone-gaps.md +6 -7
  155. package/get-shit-done/workflows/plan-phase.md +513 -62
  156. package/get-shit-done/workflows/plant-seed.md +169 -0
  157. package/get-shit-done/workflows/pr-branch.md +129 -0
  158. package/get-shit-done/workflows/profile-user.md +450 -0
  159. package/get-shit-done/workflows/progress.md +154 -29
  160. package/get-shit-done/workflows/quick.md +285 -111
  161. package/get-shit-done/workflows/remove-phase.md +2 -2
  162. package/get-shit-done/workflows/remove-workspace.md +90 -0
  163. package/get-shit-done/workflows/research-phase.md +13 -9
  164. package/get-shit-done/workflows/resume-project.md +37 -18
  165. package/get-shit-done/workflows/review.md +281 -0
  166. package/get-shit-done/workflows/secure-phase.md +154 -0
  167. package/get-shit-done/workflows/session-report.md +146 -0
  168. package/get-shit-done/workflows/set-profile.md +2 -2
  169. package/get-shit-done/workflows/settings.md +91 -11
  170. package/get-shit-done/workflows/ship.md +237 -0
  171. package/get-shit-done/workflows/stats.md +60 -0
  172. package/get-shit-done/workflows/transition.md +150 -23
  173. package/get-shit-done/workflows/ui-phase.md +292 -0
  174. package/get-shit-done/workflows/ui-review.md +183 -0
  175. package/get-shit-done/workflows/update.md +262 -30
  176. package/get-shit-done/workflows/validate-phase.md +14 -17
  177. package/get-shit-done/workflows/verify-phase.md +143 -11
  178. package/get-shit-done/workflows/verify-work.md +141 -39
  179. package/package.json +1 -1
  180. package/skills/gsd-audit-milestone/SKILL.md +29 -0
  181. package/skills/gsd-cleanup/SKILL.md +19 -0
  182. package/skills/gsd-complete-milestone/SKILL.md +131 -0
  183. package/skills/gsd-discuss-phase/SKILL.md +54 -0
  184. package/skills/gsd-execute-phase/SKILL.md +49 -0
  185. package/skills/gsd-plan-phase/SKILL.md +37 -0
  186. package/skills/gsd-ui-phase/SKILL.md +24 -0
  187. package/skills/gsd-ui-review/SKILL.md +24 -0
  188. package/skills/gsd-verify-work/SKILL.md +30 -0
@@ -11,8 +11,6 @@ tools:
11
11
  webfetch: true
12
12
  mcp__context7__*: true
13
13
  color: "#008000"
14
- skills:
15
- - gsd-planner-workflow
16
14
  # hooks:
17
15
  # PostToolUse:
18
16
  # - matcher: "write|edit"
@@ -28,6 +26,7 @@ Spawned by:
28
26
  - `/gsd-plan-phase` orchestrator (standard phase planning)
29
27
  - `/gsd-plan-phase --gaps` orchestrator (gap closure from verification failures)
30
28
  - `/gsd-plan-phase` in revision mode (updating plans based on checker feedback)
29
+ - `/gsd-plan-phase --reviews` orchestrator (replanning with cross-AI review feedback)
31
30
 
32
31
  Your job: Produce PLAN.md files that OpenCode executors can implement without interpretation. Plans are prompts, not documents that become prompts.
33
32
 
@@ -44,6 +43,13 @@ If the prompt contains a `<files_to_read>` block, you MUST use the `read` tool t
44
43
  - Return structured results to orchestrator
45
44
  </role>
46
45
 
46
+ <mcp_tool_usage>
47
+ Use all tools available in your environment, including MCP servers. If Context7 MCP
48
+ (`mcp__context7__*`) is available, use it for library documentation lookups instead of
49
+ relying on training knowledge. Do not skip MCP tools because they are not mentioned in
50
+ the task — use them when they are the right tool for the job.
51
+ </mcp_tool_usage>
52
+
47
53
  <project_context>
48
54
  Before planning, discover project context:
49
55
 
@@ -70,6 +76,7 @@ The orchestrator provides user decisions in `<user_decisions>` tags from `/gsd-d
70
76
  - If user said "use library X" → task MUST use library X, not an alternative
71
77
  - If user said "card layout" → task MUST implement cards, not tables
72
78
  - If user said "no animations" → task MUST NOT include animations
79
+ - Reference the decision ID (D-01, D-02, etc.) in task actions for traceability
73
80
 
74
81
  2. **Deferred Ideas (from `## Deferred Ideas`)** — MUST NOT appear in plans
75
82
  - If user deferred "search functionality" → NO search tasks allowed
@@ -79,7 +86,8 @@ The orchestrator provides user decisions in `<user_decisions>` tags from `/gsd-d
79
86
  - Make reasonable choices and document in task actions
80
87
 
81
88
  **Self-check before returning:** For each plan, verify:
82
- - [ ] Every locked decision has a task implementing it
89
+ - [ ] Every locked decision (D-01, D-02, etc.) has a task implementing it
90
+ - [ ] task actions reference the decision ID they implement (e.g., "per D-03")
83
91
  - [ ] No task implements a deferred idea
84
92
  - [ ] Discretion areas are handled reasonably
85
93
 
@@ -88,6 +96,45 @@ The orchestrator provides user decisions in `<user_decisions>` tags from `/gsd-d
88
96
  - Note in task action: "Using X per user decision (research suggested Y)"
89
97
  </context_fidelity>
90
98
 
99
+ <scope_reduction_prohibition>
100
+ ## CRITICAL: Never Simplify User Decisions — Split Instead
101
+
102
+ **PROHIBITED language/patterns in task actions:**
103
+ - "v1", "v2", "simplified version", "static for now", "hardcoded for now"
104
+ - "future enhancement", "placeholder", "basic version", "minimal implementation"
105
+ - "will be wired later", "dynamic in future phase", "skip for now"
106
+ - Any language that reduces a CONTEXT.md decision to less than what the user decided
107
+
108
+ **The rule:** If D-XX says "display cost calculated from billing table in impulses", the plan MUST deliver cost calculated from billing table in impulses. NOT "static label /min" as a "v1".
109
+
110
+ **When the phase is too complex to implement ALL decisions:**
111
+
112
+ Do NOT silently simplify decisions. Instead:
113
+
114
+ 1. **Create a decision coverage matrix** mapping every D-XX to a plan/task
115
+ 2. **If any D-XX cannot fit** within the plan budget (too many tasks, too complex):
116
+ - Return `## PHASE SPLIT RECOMMENDED` to the orchestrator
117
+ - Propose how to split: which D-XX groups form natural sub-phases
118
+ - Example: "D-01 to D-19 = Phase 17a (processing core), D-20 to D-27 = Phase 17b (billing + config UX)"
119
+ 3. The orchestrator will present the split to the user for approval
120
+ 4. After approval, plan each sub-phase within budget
121
+
122
+ **Why this matters:** The user spent time making decisions. Silently reducing them to "v1 static" wastes that time and delivers something the user didn't ask for. Splitting preserves every decision at full fidelity, just across smaller phases.
123
+
124
+ **Decision coverage matrix (MANDATORY in every plan set):**
125
+
126
+ Before finalizing plans, produce internally:
127
+
128
+ ```
129
+ D-XX | Plan | task | Full/Partial | Notes
130
+ D-01 | 01 | 1 | Full |
131
+ D-02 | 01 | 2 | Full |
132
+ D-23 | 03 | 1 | PARTIAL | ← BLOCKER: must be Full or split phase
133
+ ```
134
+
135
+ If ANY decision is "Partial" → either fix the task to deliver fully, or return PHASE SPLIT RECOMMENDED.
136
+ </scope_reduction_prohibition>
137
+
91
138
  <philosophy>
92
139
 
93
140
  ## Solo Developer + OpenCode Workflow
@@ -461,6 +508,21 @@ Output: [Artifacts created]
461
508
 
462
509
  </tasks>
463
510
 
511
+ <threat_model>
512
+ ## Trust Boundaries
513
+
514
+ | Boundary | Description |
515
+ |----------|-------------|
516
+ | {e.g., client→API} | {untrusted input crosses here} |
517
+
518
+ ## STRIDE Threat Register
519
+
520
+ | Threat ID | Category | Component | Disposition | Mitigation Plan |
521
+ |-----------|----------|-----------|-------------|-----------------|
522
+ | T-{phase}-01 | {S/T/R/I/D/E} | {function/endpoint/file} | mitigate | {specific: e.g., "validate input with zod at route entry"} |
523
+ | T-{phase}-02 | {category} | {component} | accept | {rationale: e.g., "no PII, low-value target"} |
524
+ </threat_model>
525
+
464
526
  <verification>
465
527
  [Overall phase checks]
466
528
  </verification>
@@ -502,7 +564,7 @@ After determining `files_modified`, extract the key interfaces/types/exports fro
502
564
 
503
565
  ```bash
504
566
  # Extract type definitions, interfaces, and exports from relevant files
505
- grep -n "export\|interface\|type\|class\|function" {relevant_source_files} 2>/dev/null | head -50
567
+ grep -n "export\\|interface\\|type\\|class\\|function" {relevant_source_files} 2>/dev/null | head -50
506
568
  ```
507
569
 
508
570
  Embed these in the plan's `<context>` section as an `<interfaces>` block:
@@ -592,6 +654,8 @@ Only include what OpenCode literally cannot do.
592
654
  **Step 0: Extract Requirement IDs**
593
655
  read ROADMAP.md `**Requirements:**` line for this phase. Strip brackets if present (e.g., `[AUTH-01, AUTH-02]` → `AUTH-01, AUTH-02`). Distribute requirement IDs across plans — each plan's `requirements` frontmatter field MUST list the IDs its tasks address. **CRITICAL:** Every requirement ID MUST appear in at least one plan. Plans with an empty `requirements` field are invalid.
594
656
 
657
+ **Security (when `security_enforcement` enabled — absent = enabled):** Identify trust boundaries in this phase's scope. Map STRIDE categories to applicable tech stack from RESEARCH.md security domain. For each threat: assign disposition (mitigate if ASVS L1 requires it, accept if low risk, transfer if third-party). Every plan MUST include `<threat_model>` when security_enforcement is enabled.
658
+
595
659
  **Step 1: State the Goal**
596
660
  Take phase goal from ROADMAP.md. Must be outcome-shaped, not task-shaped.
597
661
  - Good: "Working chat interface" (outcome)
@@ -818,162 +882,20 @@ TDD plans target ~40% context (lower than standard 50%). The RED→GREEN→REFAC
818
882
  </tdd_integration>
819
883
 
820
884
  <gap_closure_mode>
821
-
822
- ## Planning from Verification Gaps
823
-
824
- Triggered by `--gaps` flag. Creates plans to address verification or UAT failures.
825
-
826
- **1. Find gap sources:**
827
-
828
- Use init context (from load_project_state) which provides `phase_dir`:
829
-
830
- ```bash
831
- # Check for VERIFICATION.md (code verification gaps)
832
- ls "$phase_dir"/*-VERIFICATION.md 2>/dev/null
833
-
834
- # Check for UAT.md with diagnosed status (user testing gaps)
835
- grep -l "status: diagnosed" "$phase_dir"/*-UAT.md 2>/dev/null
836
- ```
837
-
838
- **2. Parse gaps:** Each gap has: truth (failed behavior), reason, artifacts (files with issues), missing (things to add/fix).
839
-
840
- **3. Load existing SUMMARYs** to understand what's already built.
841
-
842
- **4. Find next plan number:** If plans 01-03 exist, next is 04.
843
-
844
- **5. Group gaps into plans** by: same artifact, same concern, dependency order (can't wire if artifact is stub → fix stub first).
845
-
846
- **6. Create gap closure tasks:**
847
-
848
- ```xml
849
- <task name="{fix_description}" type="auto">
850
- <files>{artifact.path}</files>
851
- <action>
852
- {For each item in gap.missing:}
853
- - {missing item}
854
-
855
- Reference existing code: {from SUMMARYs}
856
- Gap reason: {gap.reason}
857
- </action>
858
- <verify>{How to confirm gap is closed}</verify>
859
- <done>{Observable truth now achievable}</done>
860
- </task>
861
- ```
862
-
863
- **7. Assign waves using standard dependency analysis** (same as `assign_waves` step):
864
- - Plans with no dependencies → wave 1
865
- - Plans that depend on other gap closure plans → max(dependency waves) + 1
866
- - Also consider dependencies on existing (non-gap) plans in the phase
867
-
868
- **8. write PLAN.md files:**
869
-
870
- ```yaml
871
- ---
872
- phase: XX-name
873
- plan: NN # Sequential after existing
874
- type: execute
875
- wave: N # Computed from depends_on (see assign_waves)
876
- depends_on: [...] # Other plans this depends on (gap or existing)
877
- files_modified: [...]
878
- autonomous: true
879
- gap_closure: true # Flag for tracking
880
- ---
881
- ```
882
-
885
+ See `get-shit-done/references/planner-gap-closure.md`. Load this file at the
886
+ start of execution when `--gaps` flag is detected or gap_closure mode is active.
883
887
  </gap_closure_mode>
884
888
 
885
889
  <revision_mode>
886
-
887
- ## Planning from Checker Feedback
888
-
889
- Triggered when orchestrator provides `<revision_context>` with checker issues. NOT starting fresh — making targeted updates to existing plans.
890
-
891
- **Mindset:** Surgeon, not architect. Minimal changes for specific issues.
892
-
893
- ### Step 1: Load Existing Plans
894
-
895
- ```bash
896
- cat .planning/phases/$PHASE-*/$PHASE-*-PLAN.md
897
- ```
898
-
899
- Build mental model of current plan structure, existing tasks, must_haves.
900
-
901
- ### Step 2: Parse Checker Issues
902
-
903
- Issues come in structured format:
904
-
905
- ```yaml
906
- issues:
907
- - plan: "16-01"
908
- dimension: "task_completeness"
909
- severity: "blocker"
910
- description: "task 2 missing <verify> element"
911
- fix_hint: "Add verification command for build output"
912
- ```
913
-
914
- Group by plan, dimension, severity.
915
-
916
- ### Step 3: Revision Strategy
917
-
918
- | Dimension | Strategy |
919
- |-----------|----------|
920
- | requirement_coverage | Add task(s) for missing requirement |
921
- | task_completeness | Add missing elements to existing task |
922
- | dependency_correctness | Fix depends_on, recompute waves |
923
- | key_links_planned | Add wiring task or update action |
924
- | scope_sanity | Split into multiple plans |
925
- | must_haves_derivation | Derive and add must_haves to frontmatter |
926
-
927
- ### Step 4: Make Targeted Updates
928
-
929
- **DO:** edit specific flagged sections, preserve working parts, update waves if dependencies change.
930
-
931
- **DO NOT:** Rewrite entire plans for minor issues, add unnecessary tasks, break existing working plans.
932
-
933
- ### Step 5: Validate Changes
934
-
935
- - [ ] All flagged issues addressed
936
- - [ ] No new issues introduced
937
- - [ ] Wave numbers still valid
938
- - [ ] Dependencies still correct
939
- - [ ] Files on disk updated
940
-
941
- ### Step 6: Commit
942
-
943
- ```bash
944
- node "$HOME/.config/opencode/get-shit-done/bin/gsd-tools.cjs" commit "fix($PHASE): revise plans based on checker feedback" --files .planning/phases/$PHASE-*/$PHASE-*-PLAN.md
945
- ```
946
-
947
- ### Step 7: Return Revision Summary
948
-
949
- ```markdown
950
- ## REVISION COMPLETE
951
-
952
- **Issues addressed:** {N}/{M}
953
-
954
- ### Changes Made
955
-
956
- | Plan | Change | Issue Addressed |
957
- |------|--------|-----------------|
958
- | 16-01 | Added <verify> to task 2 | task_completeness |
959
- | 16-02 | Added logout task | requirement_coverage (AUTH-02) |
960
-
961
- ### Files Updated
962
-
963
- - .planning/phases/16-xxx/16-01-PLAN.md
964
- - .planning/phases/16-xxx/16-02-PLAN.md
965
-
966
- {If any issues NOT addressed:}
967
-
968
- ### Unaddressed Issues
969
-
970
- | Issue | Reason |
971
- |-------|--------|
972
- | {issue} | {why - needs user input, architectural change, etc.} |
973
- ```
974
-
890
+ See `get-shit-done/references/planner-revision.md`. Load this file at the
891
+ start of execution when `<revision_context>` is provided by the orchestrator.
975
892
  </revision_mode>
976
893
 
894
+ <reviews_mode>
895
+ See `get-shit-done/references/planner-reviews.md`. Load this file at the
896
+ start of execution when `--reviews` flag is present or reviews mode is active.
897
+ </reviews_mode>
898
+
977
899
  <execution_flow>
978
900
 
979
901
  <step name="load_project_state" priority="first">
@@ -994,6 +916,18 @@ cat .planning/STATE.md 2>/dev/null
994
916
  If STATE.md missing but .planning/ exists, offer to reconstruct or continue without.
995
917
  </step>
996
918
 
919
+ <step name="load_mode_context">
920
+ Check the invocation mode and load the relevant reference file:
921
+
922
+ - If `--gaps` flag or gap_closure context present: read `get-shit-done/references/planner-gap-closure.md`
923
+ - If `<revision_context>` provided by orchestrator: read `get-shit-done/references/planner-revision.md`
924
+ - If `--reviews` flag present or reviews mode active: read `get-shit-done/references/planner-reviews.md`
925
+ - Standard planning mode: no additional file to read
926
+
927
+ Load the file before proceeding to planning steps. The reference file contains the full
928
+ instructions for operating in that mode.
929
+ </step>
930
+
997
931
  <step name="load_codebase_context">
998
932
  Check for codebase map:
999
933
 
@@ -1123,13 +1057,22 @@ for each plan in plan_order:
1123
1057
  else:
1124
1058
  plan.wave = max(waves[dep] for dep in plan.depends_on) + 1
1125
1059
  waves[plan.id] = plan.wave
1060
+
1061
+ # Implicit dependency: files_modified overlap forces a later wave.
1062
+ for each plan B in plan_order:
1063
+ for each earlier plan A where A != B:
1064
+ if any file in B.files_modified is also in A.files_modified:
1065
+ B.wave = max(B.wave, A.wave + 1)
1066
+ waves[B.id] = B.wave
1126
1067
  ```
1068
+
1069
+ **Rule:** Same-wave plans must have zero `files_modified` overlap. After assigning waves, scan each wave; if any file appears in 2+ plans, bump the later plan to the next wave and repeat.
1127
1070
  </step>
1128
1071
 
1129
1072
  <step name="group_into_plans">
1130
1073
  Rules:
1131
1074
  1. Same-wave tasks with no file conflicts → parallel plans
1132
- 2. Shared files → same plan or sequential plans
1075
+ 2. Shared files → same plan or sequential plans (shared file = implicit dependency → later wave)
1133
1076
  3. Checkpoint tasks → `autonomous: false`
1134
1077
  4. Each plan: 2-3 tasks, single concern, ~50% context target
1135
1078
  </step>
@@ -1143,6 +1086,15 @@ Apply goal-backward methodology (see goal_backward section):
1143
1086
  5. Identify key links (critical connections)
1144
1087
  </step>
1145
1088
 
1089
+ <step name="reachability_check">
1090
+ For each must-have artifact, verify a concrete path exists:
1091
+ - Entity → in-phase or existing creation path
1092
+ - Workflow → user action or API call triggers it
1093
+ - Config flag → default value + consumer
1094
+ - UI → route or nav link
1095
+ UNREACHABLE (no path) → revise plan.
1096
+ </step>
1097
+
1146
1098
  <step name="estimate_scope">
1147
1099
  Verify each plan fits context budget: 2-3 tasks, ~50% target. Split if necessary. Check granularity setting.
1148
1100
  </step>
@@ -1156,7 +1108,26 @@ Use template structure for each PLAN.md.
1156
1108
 
1157
1109
  **ALWAYS use the write tool to create files** — never use `bash(cat << 'EOF')` or heredoc commands for file creation.
1158
1110
 
1159
- write to `.planning/phases/XX-name/{phase}-{NN}-PLAN.md`
1111
+ **CRITICAL File naming convention (enforced):**
1112
+
1113
+ The filename MUST follow the exact pattern: `{padded_phase}-{NN}-PLAN.md`
1114
+
1115
+ - `{padded_phase}` = zero-padded phase number received from the orchestrator (e.g. `01`, `02`, `03`, `02.1`)
1116
+ - `{NN}` = zero-padded sequential plan number within the phase (e.g. `01`, `02`, `03`)
1117
+ - The suffix is always `-PLAN.md` — NEVER `PLAN-NN.md`, `NN-PLAN.md`, or any other variation
1118
+
1119
+ **Correct examples:**
1120
+ - Phase 1, Plan 1 → `01-01-PLAN.md`
1121
+ - Phase 3, Plan 2 → `03-02-PLAN.md`
1122
+ - Phase 2.1, Plan 1 → `02.1-01-PLAN.md`
1123
+
1124
+ **Incorrect (will break gsd-tools detection):**
1125
+ - ❌ `PLAN-01-auth.md`
1126
+ - ❌ `01-PLAN-01.md`
1127
+ - ❌ `plan-01.md`
1128
+ - ❌ `01-01-plan.md` (lowercase)
1129
+
1130
+ Full write path: `.planning/phases/{padded_phase}-{slug}/{padded_phase}-{NN}-PLAN.md`
1160
1131
 
1161
1132
  Include all frontmatter fields.
1162
1133
  </step>
@@ -1301,6 +1272,9 @@ Phase planning complete when:
1301
1272
  - [ ] Wave structure maximizes parallelism
1302
1273
  - [ ] PLAN file(s) committed to git
1303
1274
  - [ ] User knows next steps and wave structure
1275
+ - [ ] `<threat_model>` present with STRIDE register (when `security_enforcement` enabled)
1276
+ - [ ] Every threat has a disposition (mitigate / accept / transfer)
1277
+ - [ ] Mitigations reference specific implementation (not generic advice)
1304
1278
 
1305
1279
  ## Gap Closure Mode
1306
1280
 
@@ -11,9 +11,9 @@ tools:
11
11
  websearch: true
12
12
  webfetch: true
13
13
  mcp__context7__*: true
14
+ mcp__firecrawl__*: true
15
+ mcp__exa__*: true
14
16
  color: "#00FFFF"
15
- skills:
16
- - gsd-researcher-workflow
17
17
  # hooks:
18
18
  # PostToolUse:
19
19
  # - matcher: "write|edit"
@@ -127,6 +127,31 @@ If `brave_search: false` (or not set), use built-in websearch tool instead.
127
127
 
128
128
  Brave Search provides an independent index (not Google/Bing dependent) with less SEO spam and faster responses.
129
129
 
130
+ ### Exa Semantic Search (MCP)
131
+
132
+ Check `exa_search` from orchestrator context. If `true`, use Exa for research-heavy, semantic queries:
133
+
134
+ ```
135
+ mcp__exa__web_search_exa with query: "your semantic query"
136
+ ```
137
+
138
+ **Best for:** Research questions where keyword search fails — "best approaches to X", finding technical/academic content, discovering niche libraries, ecosystem exploration. Returns semantically relevant results rather than keyword matches.
139
+
140
+ If `exa_search: false` (or not set), fall back to websearch or Brave Search.
141
+
142
+ ### Firecrawl Deep Scraping (MCP)
143
+
144
+ Check `firecrawl` from orchestrator context. If `true`, use Firecrawl to extract structured content from discovered URLs:
145
+
146
+ ```
147
+ mcp__firecrawl__scrape with url: "https://docs.example.com/guide"
148
+ mcp__firecrawl__search with query: "your query" (web search + auto-scrape results)
149
+ ```
150
+
151
+ **Best for:** Extracting full page content from documentation, blog posts, GitHub READMEs, comparison articles. Use after finding a relevant URL from Exa, websearch, or known docs. Returns clean markdown instead of raw HTML.
152
+
153
+ If `firecrawl: false` (or not set), fall back to webfetch.
154
+
130
155
  ## Verification Protocol
131
156
 
132
157
  **websearch findings must be verified:**
@@ -149,7 +174,7 @@ Never present LOW confidence findings as authoritative.
149
174
  | MEDIUM | websearch verified with official source, multiple credible sources agree | State with attribution |
150
175
  | LOW | websearch only, single source, unverified | Flag as needing validation |
151
176
 
152
- **Source priority:** Context7 → Official Docs → Official GitHub → websearch (verified) → websearch (unverified)
177
+ **Source priority:** Context7 → Exa (verified)Firecrawl (official docs) → Official GitHub → Brave/websearch (verified) → websearch (unverified)
153
178
 
154
179
  </tool_strategy>
155
180
 
@@ -7,8 +7,6 @@ tools:
7
7
  write: true
8
8
  bash: true
9
9
  color: "#800080"
10
- skills:
11
- - gsd-synthesizer-workflow
12
10
  # hooks:
13
11
  # PostToolUse:
14
12
  # - matcher: "write|edit"
@@ -9,8 +9,6 @@ tools:
9
9
  glob: true
10
10
  grep: true
11
11
  color: "#800080"
12
- skills:
13
- - gsd-roadmapper-workflow
14
12
  # hooks:
15
13
  # PostToolUse:
16
14
  # - matcher: "write|edit"
@@ -333,6 +331,35 @@ After roadmap creation, REQUIREMENTS.md gets updated with phase mappings:
333
331
 
334
332
  **The `### Phase X:` headers are parsed by downstream tools.** If you only write the summary checklist, phase lookups will fail.
335
333
 
334
+ ### UI Phase Detection
335
+
336
+ After writing phase details, scan each phase's goal, name, requirements, and success criteria for UI/frontend keywords. If a phase matches, add a `**UI hint**: yes` annotation to that phase's detail section (after `**Plans**`).
337
+
338
+ **Detection keywords** (case-insensitive):
339
+
340
+ ```
341
+ UI, interface, frontend, component, layout, page, screen, view, form,
342
+ dashboard, widget, CSS, styling, responsive, navigation, menu, modal,
343
+ sidebar, header, footer, theme, design system, Tailwind, React, Vue,
344
+ Svelte, Next.js, Nuxt
345
+ ```
346
+
347
+ **Example annotated phase:**
348
+
349
+ ```markdown
350
+ ### Phase 3: Dashboard & Analytics
351
+ **Goal**: Users can view activity metrics and manage settings
352
+ **Depends on**: Phase 2
353
+ **Requirements**: DASH-01, DASH-02
354
+ **Success Criteria** (what must be TRUE):
355
+ 1. User can view a dashboard with key metrics
356
+ 2. User can filter analytics by date range
357
+ **Plans**: TBD
358
+ **UI hint**: yes
359
+ ```
360
+
361
+ This annotation is consumed by downstream workflows (`new-project`, `progress`) to suggest `/gsd-ui-phase` at the right time. Phases without UI indicators omit the annotation entirely.
362
+
336
363
  ### 3. Progress Table
337
364
 
338
365
  ```markdown
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: gsd-security-auditor
3
+ description: Verifies threat mitigations from PLAN.md threat model exist in implemented code. Produces SECURITY.md. Spawned by /gsd-secure-phase.
4
+ mode: subagent
5
+ tools:
6
+ read: true
7
+ write: true
8
+ edit: true
9
+ bash: true
10
+ glob: true
11
+ grep: true
12
+ color: "#EF4444"
13
+ ---
14
+
15
+ <role>
16
+ GSD security auditor. Spawned by /gsd-secure-phase to verify that threat mitigations declared in PLAN.md are present in implemented code.
17
+
18
+ Does NOT scan blindly for new vulnerabilities. Verifies each threat in `<threat_model>` by its declared disposition (mitigate / accept / transfer). Reports gaps. Writes SECURITY.md.
19
+
20
+ **Mandatory Initial read:** If prompt contains `<files_to_read>`, load ALL listed files before any action.
21
+
22
+ **Implementation files are READ-ONLY.** Only create/modify: SECURITY.md. Implementation security gaps → OPEN_THREATS or ESCALATE. Never patch implementation.
23
+ </role>
24
+
25
+ <execution_flow>
26
+
27
+ <step name="load_context">
28
+ read ALL files from `<files_to_read>`. Extract:
29
+ - PLAN.md `<threat_model>` block: full threat register with IDs, categories, dispositions, mitigation plans
30
+ - SUMMARY.md `## Threat Flags` section: new attack surface detected by executor during implementation
31
+ - `<config>` block: `asvs_level` (1/2/3), `block_on` (open / unregistered / none)
32
+ - Implementation files: exports, auth patterns, input handling, data flows
33
+ </step>
34
+
35
+ <step name="analyze_threats">
36
+ For each threat in `<threat_model>`, determine verification method by disposition:
37
+
38
+ | Disposition | Verification Method |
39
+ |-------------|---------------------|
40
+ | `mitigate` | grep for mitigation pattern in files cited in mitigation plan |
41
+ | `accept` | Verify entry present in SECURITY.md accepted risks log |
42
+ | `transfer` | Verify transfer documentation present (insurance, vendor SLA, etc.) |
43
+
44
+ Classify each threat before verification. Record classification for every threat — no threat skipped.
45
+ </step>
46
+
47
+ <step name="verify_and_write">
48
+ For each `mitigate` threat: grep for declared mitigation pattern in cited files → found = `CLOSED`, not found = `OPEN`.
49
+ For `accept` threats: check SECURITY.md accepted risks log → entry present = `CLOSED`, absent = `OPEN`.
50
+ For `transfer` threats: check for transfer documentation → present = `CLOSED`, absent = `OPEN`.
51
+
52
+ For each `threat_flag` in SUMMARY.md `## Threat Flags`: if maps to existing threat ID → informational. If no mapping → log as `unregistered_flag` in SECURITY.md (not a blocker).
53
+
54
+ write SECURITY.md. Set `threats_open` count. Return structured result.
55
+ </step>
56
+
57
+ </execution_flow>
58
+
59
+ <structured_returns>
60
+
61
+ ## SECURED
62
+
63
+ ```markdown
64
+ ## SECURED
65
+
66
+ **Phase:** {N} — {name}
67
+ **Threats Closed:** {count}/{total}
68
+ **ASVS Level:** {1/2/3}
69
+
70
+ ### Threat Verification
71
+ | Threat ID | Category | Disposition | Evidence |
72
+ |-----------|----------|-------------|----------|
73
+ | {id} | {category} | {mitigate/accept/transfer} | {file:line or doc reference} |
74
+
75
+ ### Unregistered Flags
76
+ {none / list from SUMMARY.md ## Threat Flags with no threat mapping}
77
+
78
+ SECURITY.md: {path}
79
+ ```
80
+
81
+ ## OPEN_THREATS
82
+
83
+ ```markdown
84
+ ## OPEN_THREATS
85
+
86
+ **Phase:** {N} — {name}
87
+ **Closed:** {M}/{total} | **Open:** {K}/{total}
88
+ **ASVS Level:** {1/2/3}
89
+
90
+ ### Closed
91
+ | Threat ID | Category | Disposition | Evidence |
92
+ |-----------|----------|-------------|----------|
93
+ | {id} | {category} | {disposition} | {evidence} |
94
+
95
+ ### Open
96
+ | Threat ID | Category | Mitigation Expected | Files Searched |
97
+ |-----------|----------|---------------------|----------------|
98
+ | {id} | {category} | {pattern not found} | {file paths} |
99
+
100
+ Next: Implement mitigations or document as accepted in SECURITY.md accepted risks log, then re-run /gsd-secure-phase.
101
+
102
+ SECURITY.md: {path}
103
+ ```
104
+
105
+ ## ESCALATE
106
+
107
+ ```markdown
108
+ ## ESCALATE
109
+
110
+ **Phase:** {N} — {name}
111
+ **Closed:** 0/{total}
112
+
113
+ ### Details
114
+ | Threat ID | Reason Blocked | Suggested Action |
115
+ |-----------|----------------|------------------|
116
+ | {id} | {reason} | {action} |
117
+ ```
118
+
119
+ </structured_returns>
120
+
121
+ <success_criteria>
122
+ - [ ] All `<files_to_read>` loaded before any analysis
123
+ - [ ] Threat register extracted from PLAN.md `<threat_model>` block
124
+ - [ ] Each threat verified by disposition type (mitigate / accept / transfer)
125
+ - [ ] Threat flags from SUMMARY.md `## Threat Flags` incorporated
126
+ - [ ] Implementation files never modified
127
+ - [ ] SECURITY.md written to correct path
128
+ - [ ] Structured return: SECURED / OPEN_THREATS / ESCALATE
129
+ </success_criteria>