get-shit-done-cc 1.22.3 → 1.22.4

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 (36) hide show
  1. package/README.md +1 -1
  2. package/agents/gsd-debugger.md +1 -0
  3. package/agents/gsd-executor.md +1 -0
  4. package/agents/gsd-nyquist-auditor.md +2 -0
  5. package/agents/gsd-phase-researcher.md +1 -0
  6. package/agents/gsd-plan-checker.md +1 -0
  7. package/agents/gsd-planner.md +1 -0
  8. package/commands/gsd/debug.md +1 -0
  9. package/commands/gsd/quick.md +6 -2
  10. package/commands/gsd/research-phase.md +1 -0
  11. package/get-shit-done/references/planning-config.md +4 -0
  12. package/get-shit-done/workflows/add-phase.md +1 -0
  13. package/get-shit-done/workflows/add-tests.md +1 -0
  14. package/get-shit-done/workflows/add-todo.md +1 -0
  15. package/get-shit-done/workflows/audit-milestone.md +1 -0
  16. package/get-shit-done/workflows/check-todos.md +1 -0
  17. package/get-shit-done/workflows/complete-milestone.md +1 -0
  18. package/get-shit-done/workflows/discuss-phase.md +1 -0
  19. package/get-shit-done/workflows/execute-phase.md +1 -0
  20. package/get-shit-done/workflows/execute-plan.md +1 -0
  21. package/get-shit-done/workflows/insert-phase.md +1 -0
  22. package/get-shit-done/workflows/map-codebase.md +1 -0
  23. package/get-shit-done/workflows/new-milestone.md +1 -0
  24. package/get-shit-done/workflows/new-project.md +1 -0
  25. package/get-shit-done/workflows/plan-phase.md +1 -0
  26. package/get-shit-done/workflows/progress.md +1 -0
  27. package/get-shit-done/workflows/quick.md +152 -4
  28. package/get-shit-done/workflows/remove-phase.md +1 -0
  29. package/get-shit-done/workflows/research-phase.md +1 -0
  30. package/get-shit-done/workflows/resume-project.md +1 -0
  31. package/get-shit-done/workflows/set-profile.md +1 -0
  32. package/get-shit-done/workflows/settings.md +1 -0
  33. package/get-shit-done/workflows/validate-phase.md +1 -0
  34. package/get-shit-done/workflows/verify-phase.md +1 -0
  35. package/get-shit-done/workflows/verify-work.md +1 -0
  36. package/package.json +1 -1
package/README.md CHANGED
@@ -516,7 +516,7 @@ You're never locked in. The system adapts.
516
516
  | `/gsd:add-todo [desc]` | Capture idea for later |
517
517
  | `/gsd:check-todos` | List pending todos |
518
518
  | `/gsd:debug [desc]` | Systematic debugging with persistent state |
519
- | `/gsd:quick [--full]` | Execute ad-hoc task with GSD guarantees (`--full` adds plan-checking and verification) |
519
+ | `/gsd:quick [--full] [--discuss]` | Execute ad-hoc task with GSD guarantees (`--full` adds plan-checking and verification, `--discuss` gathers context first) |
520
520
  | `/gsd:health [--repair]` | Validate `.planning/` directory integrity, auto-repair with `--repair` |
521
521
 
522
522
  <sup>¹ Contributed by reddit user OracleGreyBeard</sup>
@@ -1038,6 +1038,7 @@ mv .planning/debug/{slug}.md .planning/debug/resolved/
1038
1038
 
1039
1039
  ```bash
1040
1040
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
1041
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
1041
1042
  # commit_docs is in the JSON output
1042
1043
  ```
1043
1044
 
@@ -46,6 +46,7 @@ Load execution context:
46
46
 
47
47
  ```bash
48
48
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "${PHASE}")
49
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
49
50
  ```
50
51
 
51
52
  Extract from init JSON: `executor_model`, `commit_docs`, `phase_dir`, `plans`, `incomplete_plans`.
@@ -9,6 +9,8 @@ tools:
9
9
  - Glob
10
10
  - Grep
11
11
  color: "#8B5CF6"
12
+ skills:
13
+ - gsd-nyquist-auditor-workflow
12
14
  ---
13
15
 
14
16
  <role>
@@ -368,6 +368,7 @@ Orchestrator provides: phase number/name, description/goal, requirements, constr
368
368
  Load phase context using init command:
369
369
  ```bash
370
370
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE}")
371
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
371
372
  ```
372
373
 
373
374
  Extract from init JSON: `phase_dir`, `padded_phase`, `phase_number`, `commit_docs`.
@@ -381,6 +381,7 @@ If FAIL: return to planner with specific fixes. Same revision loop as other dime
381
381
  Load phase operation context:
382
382
  ```bash
383
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
384
385
  ```
385
386
 
386
387
  Extract from init JSON: `phase_dir`, `phase_number`, `has_plans`, `plan_count`.
@@ -973,6 +973,7 @@ Load planning context:
973
973
 
974
974
  ```bash
975
975
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init plan-phase "${PHASE}")
976
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
976
977
  ```
977
978
 
978
979
  Extract from init JSON: `planner_model`, `researcher_model`, `checker_model`, `commit_docs`, `research_enabled`, `phase_dir`, `phase_number`, `has_research`, `has_context`.
@@ -32,6 +32,7 @@ ls .planning/debug/*.md 2>/dev/null | grep -v resolved | head -5
32
32
 
33
33
  ```bash
34
34
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
35
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
35
36
  ```
36
37
 
37
38
  Extract `commit_docs` from init JSON. Resolve debugger model:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: gsd:quick
3
3
  description: Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agents
4
- argument-hint: "[--full]"
4
+ argument-hint: "[--full] [--discuss]"
5
5
  allowed-tools:
6
6
  - Read
7
7
  - Write
@@ -20,9 +20,13 @@ Quick mode is the same system with a shorter path:
20
20
  - Quick tasks live in `.planning/quick/` separate from planned phases
21
21
  - Updates STATE.md "Quick Tasks Completed" table (NOT ROADMAP.md)
22
22
 
23
- **Default:** Skips research, plan-checker, verifier. Use when you know exactly what to do.
23
+ **Default:** Skips research, discussion, plan-checker, verifier. Use when you know exactly what to do.
24
+
25
+ **`--discuss` flag:** Lightweight discussion phase before planning. Surfaces assumptions, clarifies gray areas, captures decisions in CONTEXT.md. Use when the task has ambiguity worth resolving upfront.
24
26
 
25
27
  **`--full` flag:** Enables plan-checking (max 2 iterations) and post-execution verification. Use when you want quality guarantees without full milestone ceremony.
28
+
29
+ Flags are composable: `--discuss --full` gives discussion + plan-checking + verification.
26
30
  </objective>
27
31
 
28
32
  <execution_context>
@@ -35,6 +35,7 @@ Normalize phase input in step 1 before any directory lookups.
35
35
 
36
36
  ```bash
37
37
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "$ARGUMENTS")
38
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
38
39
  ```
39
40
 
40
41
  Extract from init JSON: `phase_dir`, `phase_number`, `phase_name`, `phase_found`, `commit_docs`, `has_research`, `state_path`, `requirements_path`, `context_path`, `research_path`.
@@ -44,10 +44,12 @@ node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: update state"
44
44
 
45
45
  # Load config via state load (returns JSON):
46
46
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
47
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
47
48
  # commit_docs is available in the JSON output
48
49
 
49
50
  # Or use init commands which include commit_docs:
50
51
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "1")
52
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
51
53
  # commit_docs is included in all init command outputs
52
54
  ```
53
55
 
@@ -145,12 +147,14 @@ To use uncommitted mode:
145
147
  Use `init execute-phase` which returns all config as JSON:
146
148
  ```bash
147
149
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "1")
150
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
148
151
  # JSON output includes: branching_strategy, phase_branch_template, milestone_branch_template
149
152
  ```
150
153
 
151
154
  Or use `state load` for the config values:
152
155
  ```bash
153
156
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
157
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
154
158
  # Parse branching_strategy, phase_branch_template, milestone_branch_template from JSON
155
159
  ```
156
160
 
@@ -30,6 +30,7 @@ Load phase operation context:
30
30
 
31
31
  ```bash
32
32
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "0")
33
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
33
34
  ```
34
35
 
35
36
  Check `roadmap_exists` from init JSON. If false:
@@ -34,6 +34,7 @@ Load phase operation context:
34
34
 
35
35
  ```bash
36
36
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}")
37
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
37
38
  ```
38
39
 
39
40
  Extract from init JSON: `phase_dir`, `phase_number`, `phase_name`.
@@ -13,6 +13,7 @@ Load todo context:
13
13
 
14
14
  ```bash
15
15
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init todos)
16
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
16
17
  ```
17
18
 
18
19
  Extract from init JSON: `commit_docs`, `date`, `timestamp`, `todo_count`, `todos`, `pending_dir`, `todos_dir_exists`.
@@ -12,6 +12,7 @@ Read all files referenced by the invoking prompt's execution_context before star
12
12
 
13
13
  ```bash
14
14
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init milestone-op)
15
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
15
16
  ```
16
17
 
17
18
  Extract from init JSON: `milestone_version`, `milestone_name`, `phase_count`, `completed_phases`, `commit_docs`.
@@ -13,6 +13,7 @@ Load todo context:
13
13
 
14
14
  ```bash
15
15
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init todos)
16
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
16
17
  ```
17
18
 
18
19
  Extract from init JSON: `todo_count`, `todos`, `pending_dir`.
@@ -529,6 +529,7 @@ Use `init milestone-op` for context, or load config directly:
529
529
 
530
530
  ```bash
531
531
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "1")
532
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
532
533
  ```
533
534
 
534
535
  Extract `branching_strategy`, `phase_branch_template`, `milestone_branch_template`, and `commit_docs` from init JSON.
@@ -114,6 +114,7 @@ Phase number from argument (required).
114
114
 
115
115
  ```bash
116
116
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE}")
117
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
117
118
  ```
118
119
 
119
120
  Parse JSON for: `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`, `has_research`, `has_context`, `has_plans`, `has_verification`, `plan_count`, `roadmap_exists`, `planning_exists`.
@@ -17,6 +17,7 @@ Load all context in one call:
17
17
 
18
18
  ```bash
19
19
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "${PHASE_ARG}")
20
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
20
21
  ```
21
22
 
22
23
  Parse JSON for: `executor_model`, `verifier_model`, `commit_docs`, `parallelization`, `branching_strategy`, `branch_name`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `plans`, `incomplete_plans`, `plan_count`, `incomplete_count`, `state_exists`, `roadmap_exists`, `phase_req_ids`.
@@ -16,6 +16,7 @@ Load execution context (paths only to minimize orchestrator context):
16
16
 
17
17
  ```bash
18
18
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init execute-phase "${PHASE}")
19
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
19
20
  ```
20
21
 
21
22
  Extract from init JSON: `executor_model`, `commit_docs`, `phase_dir`, `phase_number`, `plans`, `summaries`, `incomplete_plans`, `state_path`, `config_path`.
@@ -35,6 +35,7 @@ Load phase operation context:
35
35
 
36
36
  ```bash
37
37
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${after_phase}")
38
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
38
39
  ```
39
40
 
40
41
  Check `roadmap_exists` from init JSON. If false:
@@ -27,6 +27,7 @@ Load codebase mapping context:
27
27
 
28
28
  ```bash
29
29
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init map-codebase)
30
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
30
31
  ```
31
32
 
32
33
  Extract from init JSON: `mapper_model`, `commit_docs`, `codebase_dir`, `existing_maps`, `has_maps`, `codebase_dir_exists`.
@@ -79,6 +79,7 @@ node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" commit "docs: start milesto
79
79
 
80
80
  ```bash
81
81
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init new-milestone)
82
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
82
83
  ```
83
84
 
84
85
  Extract from init JSON: `researcher_model`, `synthesizer_model`, `roadmapper_model`, `commit_docs`, `research_enabled`, `current_milestone`, `project_exists`, `roadmap_exists`.
@@ -47,6 +47,7 @@ The document should describe what you want to build.
47
47
 
48
48
  ```bash
49
49
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init new-project)
50
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
50
51
  ```
51
52
 
52
53
  Parse JSON for: `researcher_model`, `synthesizer_model`, `roadmapper_model`, `commit_docs`, `project_exists`, `has_codebase_map`, `planning_exists`, `has_existing_code`, `has_package_file`, `is_brownfield`, `needs_codebase_map`, `has_git`, `project_path`.
@@ -16,6 +16,7 @@ Load all context in one call (paths only to minimize orchestrator context):
16
16
 
17
17
  ```bash
18
18
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init plan-phase "$PHASE")
19
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
19
20
  ```
20
21
 
21
22
  Parse JSON for: `researcher_model`, `planner_model`, `checker_model`, `research_enabled`, `plan_checker_enabled`, `nyquist_validation_enabled`, `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`, `has_research`, `has_context`, `has_plans`, `plan_count`, `planning_exists`, `roadmap_exists`, `phase_req_ids`.
@@ -13,6 +13,7 @@ Read all files referenced by the invoking prompt's execution_context before star
13
13
 
14
14
  ```bash
15
15
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init progress)
16
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
16
17
  ```
17
18
 
18
19
  Extract from init JSON: `project_exists`, `roadmap_exists`, `state_exists`, `phases`, `current_phase`, `next_phase`, `milestone_version`, `completed_count`, `phase_count`, `paused_at`, `state_path`, `roadmap_path`, `project_path`, `config_path`.
@@ -1,7 +1,11 @@
1
1
  <purpose>
2
2
  Execute small, ad-hoc tasks with GSD guarantees (atomic commits, STATE.md tracking). Quick mode spawns gsd-planner (quick mode) + gsd-executor(s), tracks tasks in `.planning/quick/`, and updates STATE.md's "Quick Tasks Completed" table.
3
3
 
4
+ With `--discuss` flag: lightweight discussion phase before planning. Surfaces assumptions, clarifies gray areas, captures decisions in CONTEXT.md so the planner treats them as locked.
5
+
4
6
  With `--full` flag: enables plan-checking (max 2 iterations) and post-execution verification for quality guarantees without full milestone ceremony.
7
+
8
+ Flags are composable: `--discuss --full` gives discussion + plan-checking + verification.
5
9
  </purpose>
6
10
 
7
11
  <required_reading>
@@ -13,6 +17,7 @@ Read all files referenced by the invoking prompt's execution_context before star
13
17
 
14
18
  Parse `$ARGUMENTS` for:
15
19
  - `--full` flag → store as `$FULL_MODE` (true/false)
20
+ - `--discuss` flag → store as `$DISCUSS_MODE` (true/false)
16
21
  - Remaining text → use as `$DESCRIPTION` if non-empty
17
22
 
18
23
  If `$DESCRIPTION` is empty after parsing, prompt user interactively:
@@ -29,7 +34,27 @@ Store response as `$DESCRIPTION`.
29
34
 
30
35
  If still empty, re-prompt: "Please provide a task description."
31
36
 
32
- If `$FULL_MODE`:
37
+ Display banner based on active flags:
38
+
39
+ If `$DISCUSS_MODE` and `$FULL_MODE`:
40
+ ```
41
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
42
+ GSD ► QUICK TASK (DISCUSS + FULL)
43
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
44
+
45
+ ◆ Discussion + plan checking + verification enabled
46
+ ```
47
+
48
+ If `$DISCUSS_MODE` only:
49
+ ```
50
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
51
+ GSD ► QUICK TASK (DISCUSS)
52
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
53
+
54
+ ◆ Discussion phase enabled — surfacing gray areas before planning
55
+ ```
56
+
57
+ If `$FULL_MODE` only:
33
58
  ```
34
59
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
35
60
  GSD ► QUICK TASK (FULL MODE)
@@ -44,6 +69,7 @@ If `$FULL_MODE`:
44
69
 
45
70
  ```bash
46
71
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init quick "$DESCRIPTION")
72
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
47
73
  ```
48
74
 
49
75
  Parse JSON for: `planner_model`, `executor_model`, `checker_model`, `verifier_model`, `commit_docs`, `next_num`, `slug`, `date`, `timestamp`, `quick_dir`, `task_dir`, `roadmap_exists`, `planning_exists`.
@@ -81,6 +107,124 @@ Store `$QUICK_DIR` for use in orchestration.
81
107
 
82
108
  ---
83
109
 
110
+ **Step 4.5: Discussion phase (only when `$DISCUSS_MODE`)**
111
+
112
+ Skip this step entirely if NOT `$DISCUSS_MODE`.
113
+
114
+ Display banner:
115
+ ```
116
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
117
+ GSD ► DISCUSSING QUICK TASK
118
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
119
+
120
+ ◆ Surfacing gray areas for: ${DESCRIPTION}
121
+ ```
122
+
123
+ **4.5a. Identify gray areas**
124
+
125
+ Analyze `$DESCRIPTION` to identify 2-4 gray areas — implementation decisions that would change the outcome and that the user should weigh in on.
126
+
127
+ Use the domain-aware heuristic to generate phase-specific (not generic) gray areas:
128
+ - Something users **SEE** → layout, density, interactions, states
129
+ - Something users **CALL** → responses, errors, auth, versioning
130
+ - Something users **RUN** → output format, flags, modes, error handling
131
+ - Something users **READ** → structure, tone, depth, flow
132
+ - Something being **ORGANIZED** → criteria, grouping, naming, exceptions
133
+
134
+ Each gray area should be a concrete decision point, not a vague category. Example: "Loading behavior" not "UX".
135
+
136
+ **4.5b. Present gray areas**
137
+
138
+ ```
139
+ AskUserQuestion(
140
+ header: "Gray Areas",
141
+ question: "Which areas need clarification before planning?",
142
+ options: [
143
+ { label: "${area_1}", description: "${why_it_matters_1}" },
144
+ { label: "${area_2}", description: "${why_it_matters_2}" },
145
+ { label: "${area_3}", description: "${why_it_matters_3}" },
146
+ { label: "All clear", description: "Skip discussion — I know what I want" }
147
+ ],
148
+ multiSelect: true
149
+ )
150
+ ```
151
+
152
+ If user selects "All clear" → skip to Step 5 (no CONTEXT.md written).
153
+
154
+ **4.5c. Discuss selected areas**
155
+
156
+ For each selected area, ask 1-2 focused questions via AskUserQuestion:
157
+
158
+ ```
159
+ AskUserQuestion(
160
+ header: "${area_name}",
161
+ question: "${specific_question_about_this_area}",
162
+ options: [
163
+ { label: "${concrete_choice_1}", description: "${what_this_means}" },
164
+ { label: "${concrete_choice_2}", description: "${what_this_means}" },
165
+ { label: "${concrete_choice_3}", description: "${what_this_means}" },
166
+ { label: "You decide", description: "Claude's discretion" }
167
+ ],
168
+ multiSelect: false
169
+ )
170
+ ```
171
+
172
+ Rules:
173
+ - Options must be concrete choices, not abstract categories
174
+ - Highlight recommended choice where you have a clear opinion
175
+ - If user selects "Other" with freeform text, switch to plain text follow-up (per questioning.md freeform rule)
176
+ - If user selects "You decide", capture as Claude's Discretion in CONTEXT.md
177
+ - Max 2 questions per area — this is lightweight, not a deep dive
178
+
179
+ Collect all decisions into `$DECISIONS`.
180
+
181
+ **4.5d. Write CONTEXT.md**
182
+
183
+ Write `${QUICK_DIR}/${next_num}-CONTEXT.md` using the standard context template structure:
184
+
185
+ ```markdown
186
+ # Quick Task ${next_num}: ${DESCRIPTION} - Context
187
+
188
+ **Gathered:** ${date}
189
+ **Status:** Ready for planning
190
+
191
+ <domain>
192
+ ## Task Boundary
193
+
194
+ ${DESCRIPTION}
195
+
196
+ </domain>
197
+
198
+ <decisions>
199
+ ## Implementation Decisions
200
+
201
+ ### ${area_1_name}
202
+ - ${decision_from_discussion}
203
+
204
+ ### ${area_2_name}
205
+ - ${decision_from_discussion}
206
+
207
+ ### Claude's Discretion
208
+ ${areas_where_user_said_you_decide_or_areas_not_discussed}
209
+
210
+ </decisions>
211
+
212
+ <specifics>
213
+ ## Specific Ideas
214
+
215
+ ${any_specific_references_or_examples_from_discussion}
216
+
217
+ [If none: "No specific requirements — open to standard approaches"]
218
+
219
+ </specifics>
220
+ ```
221
+
222
+ Note: Quick task CONTEXT.md omits `<code_context>` and `<deferred>` sections (no codebase scouting, no phase scope to defer to). Keep it lean.
223
+
224
+ Report: `Context captured: ${QUICK_DIR}/${next_num}-CONTEXT.md`
225
+
226
+ ---
227
+
84
228
  **Step 5: Spawn planner (quick mode)**
85
229
 
86
230
  **If `$FULL_MODE`:** Use `quick-full` mode with stricter constraints.
@@ -99,6 +243,7 @@ Task(
99
243
  <files_to_read>
100
244
  - .planning/STATE.md (Project State)
101
245
  - ./CLAUDE.md (if exists — follow project-specific guidelines)
246
+ ${DISCUSS_MODE ? '- ' + QUICK_DIR + '/' + next_num + '-CONTEXT.md (User decisions — locked, do not revisit)' : ''}
102
247
  </files_to_read>
103
248
 
104
249
  **Project skills:** Check .claude/skills/ or .agents/skills/ directory (if either exists) — read SKILL.md files, plans should account for project skill rules
@@ -168,7 +313,8 @@ Checker prompt:
168
313
  - Scope sanity: Is this appropriately sized for a quick task (1-3 tasks)?
169
314
  - must_haves derivation: Are must_haves traceable to the task description?
170
315
 
171
- Skip: context compliance (no CONTEXT.md), cross-plan deps (single plan), ROADMAP alignment
316
+ Skip: cross-plan deps (single plan), ROADMAP alignment
317
+ ${DISCUSS_MODE ? '- Context compliance: Does the plan honor locked decisions from CONTEXT.md?' : '- Skip: context compliance (no CONTEXT.md)'}
172
318
  </check_dimensions>
173
319
 
174
320
  <expected_output>
@@ -389,6 +535,7 @@ Build file list:
389
535
  - `${QUICK_DIR}/${next_num}-PLAN.md`
390
536
  - `${QUICK_DIR}/${next_num}-SUMMARY.md`
391
537
  - `.planning/STATE.md`
538
+ - If `$DISCUSS_MODE` and context file exists: `${QUICK_DIR}/${next_num}-CONTEXT.md`
392
539
  - If `$FULL_MODE` and verification file exists: `${QUICK_DIR}/${next_num}-VERIFICATION.md`
393
540
 
394
541
  ```bash
@@ -440,11 +587,12 @@ Ready for next task: /gsd:quick
440
587
  <success_criteria>
441
588
  - [ ] ROADMAP.md validation passes
442
589
  - [ ] User provides task description
443
- - [ ] `--full` flag parsed from arguments when present
590
+ - [ ] `--full` and `--discuss` flags parsed from arguments when present
444
591
  - [ ] Slug generated (lowercase, hyphens, max 40 chars)
445
592
  - [ ] Next number calculated (001, 002, 003...)
446
593
  - [ ] Directory created at `.planning/quick/NNN-slug/`
447
- - [ ] `${next_num}-PLAN.md` created by planner
594
+ - [ ] (--discuss) Gray areas identified and presented, decisions captured in `${next_num}-CONTEXT.md`
595
+ - [ ] `${next_num}-PLAN.md` created by planner (honors CONTEXT.md decisions when --discuss)
448
596
  - [ ] (--full) Plan checker validates plan, revision loop capped at 2
449
597
  - [ ] `${next_num}-SUMMARY.md` created by executor
450
598
  - [ ] (--full) `${next_num}-VERIFICATION.md` created by verifier
@@ -30,6 +30,7 @@ Load phase operation context:
30
30
 
31
31
  ```bash
32
32
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${target}")
33
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
33
34
  ```
34
35
 
35
36
  Extract: `phase_found`, `phase_dir`, `phase_number`, `commit_docs`, `roadmap_exists`.
@@ -35,6 +35,7 @@ If exists: Offer update/view/skip options.
35
35
 
36
36
  ```bash
37
37
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE}")
38
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
38
39
  # Extract: phase_dir, padded_phase, phase_number, state_path, requirements_path, context_path
39
40
  ```
40
41
 
@@ -21,6 +21,7 @@ Load all context in one call:
21
21
 
22
22
  ```bash
23
23
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init resume)
24
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
24
25
  ```
25
26
 
26
27
  Parse JSON for: `state_exists`, `roadmap_exists`, `project_exists`, `planning_exists`, `has_interrupted_agent`, `interrupted_agent_id`, `commit_docs`.
@@ -25,6 +25,7 @@ Ensure config exists and load current state:
25
25
  ```bash
26
26
  node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-ensure-section
27
27
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
28
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
28
29
  ```
29
30
 
30
31
  This creates `.planning/config.json` with defaults if missing and loads current config.
@@ -14,6 +14,7 @@ Ensure config exists and load current state:
14
14
  ```bash
15
15
  node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" config-ensure-section
16
16
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" state load)
17
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
17
18
  ```
18
19
 
19
20
  Creates `.planning/config.json` with defaults if missing and loads current config values.
@@ -12,6 +12,7 @@ Audit Nyquist validation gaps for a completed phase. Generate missing tests. Upd
12
12
 
13
13
  ```bash
14
14
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}")
15
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
15
16
  ```
16
17
 
17
18
  Parse: `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`.
@@ -29,6 +29,7 @@ Load phase operation context:
29
29
 
30
30
  ```bash
31
31
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init phase-op "${PHASE_ARG}")
32
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
32
33
  ```
33
34
 
34
35
  Extract from init JSON: `phase_dir`, `phase_number`, `phase_name`, `has_plans`, `plan_count`.
@@ -25,6 +25,7 @@ If $ARGUMENTS contains a phase number, load context:
25
25
 
26
26
  ```bash
27
27
  INIT=$(node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" init verify-work "${PHASE_ARG}")
28
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
28
29
  ```
29
30
 
30
31
  Parse JSON for: `planner_model`, `checker_model`, `commit_docs`, `phase_found`, `phase_dir`, `phase_number`, `phase_name`, `has_verification`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "get-shit-done-cc",
3
- "version": "1.22.3",
3
+ "version": "1.22.4",
4
4
  "description": "A meta-prompting, context engineering and spec-driven development system for Claude Code, OpenCode, Gemini and Codex by TÂCHES.",
5
5
  "bin": {
6
6
  "get-shit-done-cc": "bin/install.js"