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.
- package/README.md +1 -1
- package/agents/gsd-debugger.md +1 -0
- package/agents/gsd-executor.md +1 -0
- package/agents/gsd-nyquist-auditor.md +2 -0
- package/agents/gsd-phase-researcher.md +1 -0
- package/agents/gsd-plan-checker.md +1 -0
- package/agents/gsd-planner.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/quick.md +6 -2
- package/commands/gsd/research-phase.md +1 -0
- package/get-shit-done/references/planning-config.md +4 -0
- package/get-shit-done/workflows/add-phase.md +1 -0
- package/get-shit-done/workflows/add-tests.md +1 -0
- package/get-shit-done/workflows/add-todo.md +1 -0
- package/get-shit-done/workflows/audit-milestone.md +1 -0
- package/get-shit-done/workflows/check-todos.md +1 -0
- package/get-shit-done/workflows/complete-milestone.md +1 -0
- package/get-shit-done/workflows/discuss-phase.md +1 -0
- package/get-shit-done/workflows/execute-phase.md +1 -0
- package/get-shit-done/workflows/execute-plan.md +1 -0
- package/get-shit-done/workflows/insert-phase.md +1 -0
- package/get-shit-done/workflows/map-codebase.md +1 -0
- package/get-shit-done/workflows/new-milestone.md +1 -0
- package/get-shit-done/workflows/new-project.md +1 -0
- package/get-shit-done/workflows/plan-phase.md +1 -0
- package/get-shit-done/workflows/progress.md +1 -0
- package/get-shit-done/workflows/quick.md +152 -4
- package/get-shit-done/workflows/remove-phase.md +1 -0
- package/get-shit-done/workflows/research-phase.md +1 -0
- package/get-shit-done/workflows/resume-project.md +1 -0
- package/get-shit-done/workflows/set-profile.md +1 -0
- package/get-shit-done/workflows/settings.md +1 -0
- package/get-shit-done/workflows/validate-phase.md +1 -0
- package/get-shit-done/workflows/verify-phase.md +1 -0
- package/get-shit-done/workflows/verify-work.md +1 -0
- 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>
|
package/agents/gsd-debugger.md
CHANGED
|
@@ -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
|
|
package/agents/gsd-executor.md
CHANGED
|
@@ -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`.
|
|
@@ -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`.
|
package/agents/gsd-planner.md
CHANGED
|
@@ -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`.
|
package/commands/gsd/debug.md
CHANGED
|
@@ -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:
|
package/commands/gsd/quick.md
CHANGED
|
@@ -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
|
|
|
@@ -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`.
|
|
@@ -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
|
-
|
|
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:
|
|
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`
|
|
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}-
|
|
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
|
+
"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"
|