get-shit-done-cc 1.3.27 → 1.3.29

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 CHANGED
@@ -302,11 +302,14 @@ You're never locked in. The system adapts.
302
302
  | `/gsd:plan-phase [N]` | Generate task plans for phase |
303
303
  | `/gsd:execute-plan` | Run plan via subagent |
304
304
  | `/gsd:progress` | Where am I? What's next? |
305
+ | `/gsd:verify-work [N]`* | User acceptance test of phase or plan |
306
+ | `/gsd:plan-fix [plan]` | Plan fixes for UAT issues from verify-work |
305
307
  | `/gsd:complete-milestone` | Ship it, prep next version |
306
308
  | `/gsd:discuss-milestone` | Gather context for next milestone |
307
309
  | `/gsd:new-milestone [name]` | Create new milestone with phases |
308
310
  | `/gsd:add-phase` | Append phase to roadmap |
309
311
  | `/gsd:insert-phase [N]` | Insert urgent work |
312
+ | `/gsd:remove-phase [N]` | Remove future phase, renumber subsequent |
310
313
  | `/gsd:discuss-phase [N]` | Gather context before planning |
311
314
  | `/gsd:research-phase [N]` | Deep ecosystem research for niche domains |
312
315
  | `/gsd:list-phase-assumptions [N]` | See what Claude thinks before you correct it |
@@ -315,6 +318,8 @@ You're never locked in. The system adapts.
315
318
  | `/gsd:consider-issues` | Review deferred issues, close resolved, identify urgent |
316
319
  | `/gsd:help` | Show all commands and usage guide |
317
320
 
321
+ *Contributed by reddit user OracleGreyBeard
322
+
318
323
  ---
319
324
 
320
325
  ## Troubleshooting
package/bin/install.js CHANGED
@@ -33,8 +33,61 @@ const args = process.argv.slice(2);
33
33
  const hasGlobal = args.includes('--global') || args.includes('-g');
34
34
  const hasLocal = args.includes('--local') || args.includes('-l');
35
35
 
36
+ // Parse --config-dir argument
37
+ function parseConfigDirArg() {
38
+ const configDirIndex = args.findIndex(arg => arg === '--config-dir' || arg === '-c');
39
+ if (configDirIndex !== -1) {
40
+ const nextArg = args[configDirIndex + 1];
41
+ // Error if --config-dir is provided without a value or next arg is another flag
42
+ if (!nextArg || nextArg.startsWith('-')) {
43
+ console.error(` ${yellow}--config-dir requires a path argument${reset}`);
44
+ process.exit(1);
45
+ }
46
+ return nextArg;
47
+ }
48
+ // Also handle --config-dir=value format
49
+ const configDirArg = args.find(arg => arg.startsWith('--config-dir=') || arg.startsWith('-c='));
50
+ if (configDirArg) {
51
+ return configDirArg.split('=')[1];
52
+ }
53
+ return null;
54
+ }
55
+ const explicitConfigDir = parseConfigDirArg();
56
+ const hasHelp = args.includes('--help') || args.includes('-h');
57
+
36
58
  console.log(banner);
37
59
 
60
+ // Show help if requested
61
+ if (hasHelp) {
62
+ console.log(` ${yellow}Usage:${reset} npx get-shit-done-cc [options]
63
+
64
+ ${yellow}Options:${reset}
65
+ ${cyan}-g, --global${reset} Install globally (to Claude config directory)
66
+ ${cyan}-l, --local${reset} Install locally (to ./.claude in current directory)
67
+ ${cyan}-c, --config-dir <path>${reset} Specify custom Claude config directory
68
+ ${cyan}-h, --help${reset} Show this help message
69
+
70
+ ${yellow}Examples:${reset}
71
+ ${dim}# Install to default ~/.claude directory${reset}
72
+ npx get-shit-done-cc --global
73
+
74
+ ${dim}# Install to custom config directory (for multiple Claude accounts)${reset}
75
+ npx get-shit-done-cc --global --config-dir ~/.claude-bc
76
+
77
+ ${dim}# Using environment variable${reset}
78
+ CLAUDE_CONFIG_DIR=~/.claude-bc npx get-shit-done-cc --global
79
+
80
+ ${dim}# Install to current project only${reset}
81
+ npx get-shit-done-cc --local
82
+
83
+ ${yellow}Notes:${reset}
84
+ The --config-dir option is useful when you have multiple Claude Code
85
+ configurations (e.g., for different subscriptions). It takes priority
86
+ over the CLAUDE_CONFIG_DIR environment variable.
87
+ `);
88
+ process.exit(0);
89
+ }
90
+
38
91
  /**
39
92
  * Expand ~ to home directory (shell doesn't expand in env vars passed to node)
40
93
  */
@@ -75,7 +128,8 @@ function copyWithPathReplacement(srcDir, destDir, pathPrefix) {
75
128
  */
76
129
  function install(isGlobal) {
77
130
  const src = path.join(__dirname, '..');
78
- const configDir = expandTilde(process.env.CLAUDE_CONFIG_DIR);
131
+ // Priority: explicit --config-dir arg > CLAUDE_CONFIG_DIR env var > default ~/.claude
132
+ const configDir = expandTilde(explicitConfigDir) || expandTilde(process.env.CLAUDE_CONFIG_DIR);
79
133
  const defaultGlobalDir = configDir || path.join(os.homedir(), '.claude');
80
134
  const claudeDir = isGlobal
81
135
  ? defaultGlobalDir
@@ -123,7 +177,8 @@ function promptLocation() {
123
177
  output: process.stdout
124
178
  });
125
179
 
126
- const globalPath = expandTilde(process.env.CLAUDE_CONFIG_DIR) || path.join(os.homedir(), '.claude');
180
+ const configDir = expandTilde(explicitConfigDir) || expandTilde(process.env.CLAUDE_CONFIG_DIR);
181
+ const globalPath = configDir || path.join(os.homedir(), '.claude');
127
182
  const globalLabel = globalPath.replace(os.homedir(), '~');
128
183
 
129
184
  console.log(` ${yellow}Where would you like to install?${reset}
@@ -144,6 +199,9 @@ function promptLocation() {
144
199
  if (hasGlobal && hasLocal) {
145
200
  console.error(` ${yellow}Cannot specify both --global and --local${reset}`);
146
201
  process.exit(1);
202
+ } else if (explicitConfigDir && hasLocal) {
203
+ console.error(` ${yellow}Cannot use --config-dir with --local${reset}`);
204
+ process.exit(1);
147
205
  } else if (hasGlobal) {
148
206
  install(true);
149
207
  } else if (hasLocal) {
@@ -137,6 +137,17 @@ Insert urgent work as decimal phase between existing phases.
137
137
  Usage: `/gsd:insert-phase 7 "Fix critical auth bug"`
138
138
  Result: Creates Phase 7.1
139
139
 
140
+ **`/gsd:remove-phase <number>`**
141
+ Remove a future phase and renumber subsequent phases.
142
+
143
+ - Deletes phase directory and all references
144
+ - Renumbers all subsequent phases to close the gap
145
+ - Only works on future (unstarted) phases
146
+ - Git commit preserves historical record
147
+
148
+ Usage: `/gsd:remove-phase 17`
149
+ Result: Phase 17 deleted, phases 18-20 become 17-19
150
+
140
151
  ### Milestone Management
141
152
 
142
153
  **`/gsd:discuss-milestone`**
@@ -0,0 +1,205 @@
1
+ ---
2
+ name: gsd:plan-fix
3
+ description: Plan fixes for UAT issues from verify-work
4
+ argument-hint: "[plan, e.g., '04-02']"
5
+ allowed-tools:
6
+ - Read
7
+ - Bash
8
+ - Write
9
+ - Glob
10
+ - Grep
11
+ - AskUserQuestion
12
+ ---
13
+
14
+ <objective>
15
+ Create FIX.md plan from UAT issues found during verify-work.
16
+
17
+ Purpose: Plan fixes for issues logged in phase-scoped ISSUES.md files.
18
+ Output: {plan}-FIX.md in the phase directory, ready for execution.
19
+ </objective>
20
+
21
+ <execution_context>
22
+ @~/.claude/get-shit-done/references/plan-format.md
23
+ @~/.claude/get-shit-done/references/checkpoints.md
24
+ </execution_context>
25
+
26
+ <context>
27
+ Plan number: $ARGUMENTS (required - e.g., "04-02" or "09-01")
28
+
29
+ **Load project state:**
30
+ @.planning/STATE.md
31
+ @.planning/ROADMAP.md
32
+ </context>
33
+
34
+ <process>
35
+
36
+ <step name="parse">
37
+ **Parse plan argument:**
38
+
39
+ $ARGUMENTS should be a plan number like "04-02" or "09-01".
40
+ Extract phase number (XX) and plan number (NN).
41
+
42
+ If no argument provided:
43
+ ```
44
+ Error: Plan number required.
45
+
46
+ Usage: /gsd:plan-fix 04-02
47
+
48
+ This creates a fix plan from .planning/phases/XX-name/04-02-ISSUES.md
49
+ ```
50
+ Exit.
51
+ </step>
52
+
53
+ <step name="find">
54
+ **Find ISSUES.md file:**
55
+
56
+ Search for matching ISSUES.md:
57
+ ```bash
58
+ ls .planning/phases/*/{plan}-ISSUES.md 2>/dev/null
59
+ ```
60
+
61
+ If not found:
62
+ ```
63
+ No ISSUES.md found for plan {plan}.
64
+
65
+ ISSUES.md files are created by /gsd:verify-work when UAT finds issues.
66
+ If no issues were found during testing, no fix plan is needed.
67
+ ```
68
+ Exit.
69
+ </step>
70
+
71
+ <step name="read">
72
+ **Read issues:**
73
+
74
+ Read the ISSUES.md file.
75
+ Parse each issue:
76
+ - ID (UAT-XXX)
77
+ - Title
78
+ - Severity (critical/major/minor)
79
+ - Description/steps to reproduce
80
+ - Acceptance criteria
81
+
82
+ Count total issues by severity.
83
+ </step>
84
+
85
+ <step name="plan">
86
+ **Create fix tasks:**
87
+
88
+ For each issue (or logical group):
89
+ - Create one task per issue OR
90
+ - Group related minor issues into single task
91
+
92
+ Task structure:
93
+ ```xml
94
+ <task type="auto">
95
+ <name>Fix UAT-001: [issue title]</name>
96
+ <files>[affected files from issue]</files>
97
+ <action>
98
+ [What to fix based on issue description]
99
+ [Reference original acceptance criteria]
100
+ </action>
101
+ <verify>[Test that issue is resolved]</verify>
102
+ <done>[Issue acceptance criteria met]</done>
103
+ </task>
104
+ ```
105
+
106
+ Prioritize: critical → major → minor
107
+ </step>
108
+
109
+ <step name="write">
110
+ **Write FIX.md:**
111
+
112
+ Create `.planning/phases/XX-name/{plan}-FIX.md`:
113
+
114
+ ```markdown
115
+ ---
116
+ phase: XX-name
117
+ plan: {plan}-FIX
118
+ type: fix
119
+ ---
120
+
121
+ <objective>
122
+ Fix {N} UAT issues from plan {plan}.
123
+
124
+ Source: {plan}-ISSUES.md
125
+ Priority: {critical count} critical, {major count} major, {minor count} minor
126
+ </objective>
127
+
128
+ <execution_context>
129
+ @~/.claude/get-shit-done/workflows/execute-phase.md
130
+ @~/.claude/get-shit-done/templates/summary.md
131
+ </execution_context>
132
+
133
+ <context>
134
+ @.planning/STATE.md
135
+ @.planning/ROADMAP.md
136
+
137
+ **Issues being fixed:**
138
+ @.planning/phases/XX-name/{plan}-ISSUES.md
139
+
140
+ **Original plan for reference:**
141
+ @.planning/phases/XX-name/{plan}-PLAN.md
142
+ </context>
143
+
144
+ <tasks>
145
+ [Generated fix tasks]
146
+ </tasks>
147
+
148
+ <verification>
149
+ Before declaring plan complete:
150
+ - [ ] All critical issues fixed
151
+ - [ ] All major issues fixed
152
+ - [ ] Minor issues fixed or documented as deferred
153
+ - [ ] Original acceptance criteria from issues met
154
+ </verification>
155
+
156
+ <success_criteria>
157
+ - All UAT issues from {plan}-ISSUES.md addressed
158
+ - Tests pass
159
+ - Ready for re-verification
160
+ </success_criteria>
161
+
162
+ <output>
163
+ After completion, create `.planning/phases/XX-name/{plan}-FIX-SUMMARY.md`
164
+ </output>
165
+ ```
166
+ </step>
167
+
168
+ <step name="offer">
169
+ **Offer execution:**
170
+
171
+ ```
172
+ ---
173
+
174
+ ## ✓ Fix Plan Created
175
+
176
+ **{plan}-FIX.md** — {N} issues to fix
177
+
178
+ | Severity | Count |
179
+ |----------|-------|
180
+ | Critical | {n} |
181
+ | Major | {n} |
182
+ | Minor | {n} |
183
+
184
+ ---
185
+
186
+ Would you like to:
187
+ 1. Execute the fix plan now
188
+ 2. Review the plan first
189
+ 3. Modify the plan before executing
190
+
191
+ ---
192
+ ```
193
+
194
+ Use AskUserQuestion to get response.
195
+ If execute: `/gsd:execute-plan .planning/phases/XX-name/{plan}-FIX.md`
196
+ </step>
197
+
198
+ </process>
199
+
200
+ <success_criteria>
201
+ - [ ] ISSUES.md found and parsed
202
+ - [ ] Fix tasks created for each issue
203
+ - [ ] FIX.md written with proper structure
204
+ - [ ] User offered to execute or review
205
+ </success_criteria>
@@ -92,21 +92,35 @@ CONTEXT: [✓ if CONTEXT.md exists | - if not]
92
92
  <step name="route">
93
93
  **Determine next action based on verified counts.**
94
94
 
95
- **Step 1: Count plans and summaries in current phase**
95
+ **Step 1: Count plans, summaries, and issues in current phase**
96
96
 
97
97
  List files in the current phase directory:
98
98
 
99
99
  ```bash
100
100
  ls -1 .planning/phases/[current-phase-dir]/*-PLAN.md 2>/dev/null | wc -l
101
101
  ls -1 .planning/phases/[current-phase-dir]/*-SUMMARY.md 2>/dev/null | wc -l
102
+ ls -1 .planning/phases/[current-phase-dir]/*-ISSUES.md 2>/dev/null | wc -l
103
+ ls -1 .planning/phases/[current-phase-dir]/*-FIX.md 2>/dev/null | wc -l
104
+ ls -1 .planning/phases/[current-phase-dir]/*-FIX-SUMMARY.md 2>/dev/null | wc -l
102
105
  ```
103
106
 
104
- State: "This phase has {X} plans and {Y} summaries."
107
+ State: "This phase has {X} plans, {Y} summaries, {Z} issues files, {W} fix plans."
108
+
109
+ **Step 1.5: Check for unaddressed UAT issues**
110
+
111
+ For each *-ISSUES.md file, check if matching *-FIX.md exists.
112
+ For each *-FIX.md file, check if matching *-FIX-SUMMARY.md exists.
113
+
114
+ Track:
115
+ - `issues_without_fix`: ISSUES.md files without FIX.md
116
+ - `fixes_without_summary`: FIX.md files without FIX-SUMMARY.md
105
117
 
106
118
  **Step 2: Route based on counts**
107
119
 
108
120
  | Condition | Meaning | Action |
109
121
  |-----------|---------|--------|
122
+ | fixes_without_summary > 0 | Unexecuted fix plans exist | Go to **Route A** (with FIX.md) |
123
+ | issues_without_fix > 0 | UAT issues need fix plans | Go to **Route E** |
110
124
  | summaries < plans | Unexecuted plans exist | Go to **Route A** |
111
125
  | summaries = plans AND plans > 0 | Phase complete | Go to Step 3 |
112
126
  | plans = 0 | Phase not yet planned | Go to **Route B** |
@@ -180,6 +194,32 @@ Check if `{phase}-CONTEXT.md` exists in phase directory.
180
194
 
181
195
  ---
182
196
 
197
+ **Route E: UAT issues need fix plans**
198
+
199
+ ISSUES.md exists without matching FIX.md. User needs to plan fixes.
200
+
201
+ ```
202
+ ---
203
+
204
+ ## ⚠ UAT Issues Found
205
+
206
+ **{plan}-ISSUES.md** has {N} issues without a fix plan.
207
+
208
+ `/gsd:plan-fix {plan}`
209
+
210
+ <sub>`/clear` first → fresh context window</sub>
211
+
212
+ ---
213
+
214
+ **Also available:**
215
+ - `/gsd:execute-plan [path]` — continue with other work first
216
+ - `/gsd:verify-work {phase}` — run more UAT testing
217
+
218
+ ---
219
+ ```
220
+
221
+ ---
222
+
183
223
  **Step 3: Check milestone status (only when phase complete)**
184
224
 
185
225
  Read ROADMAP.md and identify:
@@ -219,6 +259,7 @@ Read ROADMAP.md to get the next phase's name and goal.
219
259
  ---
220
260
 
221
261
  **Also available:**
262
+ - `/gsd:verify-work {Z}` — user acceptance test before continuing
222
263
  - `/gsd:discuss-phase {Z+1}` — gather context first
223
264
  - `/gsd:research-phase {Z+1}` — investigate unknowns
224
265
 
@@ -244,6 +285,11 @@ All {N} phases finished!
244
285
 
245
286
  <sub>`/clear` first → fresh context window</sub>
246
287
 
288
+ ---
289
+
290
+ **Also available:**
291
+ - `/gsd:verify-work` — user acceptance test before completing milestone
292
+
247
293
  ---
248
294
  ```
249
295
 
@@ -0,0 +1,338 @@
1
+ ---
2
+ name: gsd:remove-phase
3
+ description: Remove a future phase from roadmap and renumber subsequent phases
4
+ argument-hint: <phase-number>
5
+ allowed-tools:
6
+ - Read
7
+ - Write
8
+ - Bash
9
+ - Glob
10
+ ---
11
+
12
+ <objective>
13
+ Remove an unstarted future phase from the roadmap and renumber all subsequent phases to maintain a clean, linear sequence.
14
+
15
+ Purpose: Clean removal of work you've decided not to do, without polluting context with cancelled/deferred markers.
16
+ Output: Phase deleted, all subsequent phases renumbered, git commit as historical record.
17
+ </objective>
18
+
19
+ <execution_context>
20
+ @.planning/ROADMAP.md
21
+ @.planning/STATE.md
22
+ </execution_context>
23
+
24
+ <process>
25
+
26
+ <step name="parse_arguments">
27
+ Parse the command arguments:
28
+ - Argument is the phase number to remove (integer or decimal)
29
+ - Example: `/gsd:remove-phase 17` → phase = 17
30
+ - Example: `/gsd:remove-phase 16.1` → phase = 16.1
31
+
32
+ If no argument provided:
33
+
34
+ ```
35
+ ERROR: Phase number required
36
+ Usage: /gsd:remove-phase <phase-number>
37
+ Example: /gsd:remove-phase 17
38
+ ```
39
+
40
+ Exit.
41
+ </step>
42
+
43
+ <step name="load_state">
44
+ Load project state:
45
+
46
+ ```bash
47
+ cat .planning/STATE.md 2>/dev/null
48
+ cat .planning/ROADMAP.md 2>/dev/null
49
+ ```
50
+
51
+ Parse current phase number from STATE.md "Current Position" section.
52
+ </step>
53
+
54
+ <step name="validate_phase_exists">
55
+ Verify the target phase exists in ROADMAP.md:
56
+
57
+ 1. Search for `### Phase {target}:` heading
58
+ 2. If not found:
59
+
60
+ ```
61
+ ERROR: Phase {target} not found in roadmap
62
+ Available phases: [list phase numbers]
63
+ ```
64
+
65
+ Exit.
66
+ </step>
67
+
68
+ <step name="validate_future_phase">
69
+ Verify the phase is a future phase (not started):
70
+
71
+ 1. Compare target phase to current phase from STATE.md
72
+ 2. Target must be > current phase number
73
+
74
+ If target <= current phase:
75
+
76
+ ```
77
+ ERROR: Cannot remove Phase {target}
78
+
79
+ Only future phases can be removed:
80
+ - Current phase: {current}
81
+ - Phase {target} is current or completed
82
+
83
+ To abandon current work, use /gsd:pause-work instead.
84
+ ```
85
+
86
+ Exit.
87
+
88
+ 3. Check for SUMMARY.md files in phase directory:
89
+
90
+ ```bash
91
+ ls .planning/phases/{target}-*/*-SUMMARY.md 2>/dev/null
92
+ ```
93
+
94
+ If any SUMMARY.md files exist:
95
+
96
+ ```
97
+ ERROR: Phase {target} has completed work
98
+
99
+ Found executed plans:
100
+ - {list of SUMMARY.md files}
101
+
102
+ Cannot remove phases with completed work.
103
+ ```
104
+
105
+ Exit.
106
+ </step>
107
+
108
+ <step name="gather_phase_info">
109
+ Collect information about the phase being removed:
110
+
111
+ 1. Extract phase name from ROADMAP.md heading: `### Phase {target}: {Name}`
112
+ 2. Find phase directory: `.planning/phases/{target}-{slug}/`
113
+ 3. Find all subsequent phases (integer and decimal) that need renumbering
114
+
115
+ **Subsequent phase detection:**
116
+
117
+ For integer phase removal (e.g., 17):
118
+ - Find all phases > 17 (integers: 18, 19, 20...)
119
+ - Find all decimal phases >= 17.0 and < 18.0 (17.1, 17.2...) → these become 16.x
120
+ - Find all decimal phases for subsequent integers (18.1, 19.1...) → renumber with their parent
121
+
122
+ For decimal phase removal (e.g., 17.1):
123
+ - Find all decimal phases > 17.1 and < 18 (17.2, 17.3...) → renumber down
124
+ - Integer phases unchanged
125
+
126
+ List all phases that will be renumbered.
127
+ </step>
128
+
129
+ <step name="confirm_removal">
130
+ Present removal summary and confirm:
131
+
132
+ ```
133
+ Removing Phase {target}: {Name}
134
+
135
+ This will:
136
+ - Delete: .planning/phases/{target}-{slug}/
137
+ - Renumber {N} subsequent phases:
138
+ - Phase 18 → Phase 17
139
+ - Phase 18.1 → Phase 17.1
140
+ - Phase 19 → Phase 18
141
+ [etc.]
142
+
143
+ Proceed? (y/n)
144
+ ```
145
+
146
+ Wait for confirmation.
147
+ </step>
148
+
149
+ <step name="delete_phase_directory">
150
+ Delete the target phase directory if it exists:
151
+
152
+ ```bash
153
+ if [ -d ".planning/phases/{target}-{slug}" ]; then
154
+ rm -rf ".planning/phases/{target}-{slug}"
155
+ echo "Deleted: .planning/phases/{target}-{slug}/"
156
+ fi
157
+ ```
158
+
159
+ If directory doesn't exist, note: "No directory to delete (phase not yet created)"
160
+ </step>
161
+
162
+ <step name="renumber_directories">
163
+ Rename all subsequent phase directories:
164
+
165
+ For each phase directory that needs renumbering (in reverse order to avoid conflicts):
166
+
167
+ ```bash
168
+ # Example: renaming 18-dashboard to 17-dashboard
169
+ mv ".planning/phases/18-dashboard" ".planning/phases/17-dashboard"
170
+ ```
171
+
172
+ Process in descending order (20→19, then 19→18, then 18→17) to avoid overwriting.
173
+
174
+ Also rename decimal phase directories:
175
+ - `17.1-fix-bug` → `16.1-fix-bug` (if removing integer 17)
176
+ - `17.2-hotfix` → `17.1-hotfix` (if removing decimal 17.1)
177
+ </step>
178
+
179
+ <step name="rename_files_in_directories">
180
+ Rename plan files inside renumbered directories:
181
+
182
+ For each renumbered directory, rename files that contain the phase number:
183
+
184
+ ```bash
185
+ # Inside 17-dashboard (was 18-dashboard):
186
+ mv "18-01-PLAN.md" "17-01-PLAN.md"
187
+ mv "18-02-PLAN.md" "17-02-PLAN.md"
188
+ mv "18-01-SUMMARY.md" "17-01-SUMMARY.md" # if exists
189
+ # etc.
190
+ ```
191
+
192
+ Also handle CONTEXT.md and DISCOVERY.md (these don't have phase prefixes, so no rename needed).
193
+ </step>
194
+
195
+ <step name="update_roadmap">
196
+ Update ROADMAP.md:
197
+
198
+ 1. **Remove the phase section entirely:**
199
+ - Delete from `### Phase {target}:` to the next phase heading (or section end)
200
+
201
+ 2. **Remove from phase list:**
202
+ - Delete line `- [ ] **Phase {target}: {Name}**` or similar
203
+
204
+ 3. **Remove from Progress table:**
205
+ - Delete the row for Phase {target}
206
+
207
+ 4. **Renumber all subsequent phases:**
208
+ - `### Phase 18:` → `### Phase 17:`
209
+ - `- [ ] **Phase 18:` → `- [ ] **Phase 17:`
210
+ - Table rows: `| 18. Dashboard |` → `| 17. Dashboard |`
211
+ - Plan references: `18-01:` → `17-01:`
212
+
213
+ 5. **Update dependency references:**
214
+ - `**Depends on:** Phase 18` → `**Depends on:** Phase 17`
215
+ - For the phase that depended on the removed phase:
216
+ - `**Depends on:** Phase 17` (removed) → `**Depends on:** Phase 16`
217
+
218
+ 6. **Renumber decimal phases:**
219
+ - `### Phase 17.1:` → `### Phase 16.1:` (if integer 17 removed)
220
+ - Update all references consistently
221
+
222
+ Write updated ROADMAP.md.
223
+ </step>
224
+
225
+ <step name="update_state">
226
+ Update STATE.md:
227
+
228
+ 1. **Update total phase count:**
229
+ - `Phase: 16 of 20` → `Phase: 16 of 19`
230
+
231
+ 2. **Recalculate progress percentage:**
232
+ - New percentage based on completed plans / new total plans
233
+
234
+ Do NOT add a "Roadmap Evolution" note - the git commit is the record.
235
+
236
+ Write updated STATE.md.
237
+ </step>
238
+
239
+ <step name="update_file_contents">
240
+ Search for and update phase references inside plan files:
241
+
242
+ ```bash
243
+ # Find files that reference the old phase numbers
244
+ grep -r "Phase 18" .planning/phases/17-*/ 2>/dev/null
245
+ grep -r "Phase 19" .planning/phases/18-*/ 2>/dev/null
246
+ # etc.
247
+ ```
248
+
249
+ Update any internal references to reflect new numbering.
250
+ </step>
251
+
252
+ <step name="commit">
253
+ Stage and commit the removal:
254
+
255
+ ```bash
256
+ git add .planning/
257
+ git commit -m "chore: remove phase {target} ({original-phase-name})"
258
+ ```
259
+
260
+ The commit message preserves the historical record of what was removed.
261
+ </step>
262
+
263
+ <step name="completion">
264
+ Present completion summary:
265
+
266
+ ```
267
+ Phase {target} ({original-name}) removed.
268
+
269
+ Changes:
270
+ - Deleted: .planning/phases/{target}-{slug}/
271
+ - Renumbered: Phases {first-renumbered}-{last-old} → {first-renumbered-1}-{last-new}
272
+ - Updated: ROADMAP.md, STATE.md
273
+ - Committed: chore: remove phase {target} ({original-name})
274
+
275
+ Current roadmap: {total-remaining} phases
276
+ Current position: Phase {current} of {new-total}
277
+
278
+ ---
279
+
280
+ ## What's Next
281
+
282
+ Would you like to:
283
+ - `/gsd:progress` — see updated roadmap status
284
+ - Continue with current phase
285
+ - Review roadmap
286
+
287
+ ---
288
+ ```
289
+ </step>
290
+
291
+ </process>
292
+
293
+ <anti_patterns>
294
+
295
+ - Don't remove completed phases (have SUMMARY.md files)
296
+ - Don't remove current or past phases
297
+ - Don't leave gaps in numbering - always renumber
298
+ - Don't add "removed phase" notes to STATE.md - git commit is the record
299
+ - Don't ask about each decimal phase - just renumber them
300
+ - Don't modify completed phase directories
301
+ </anti_patterns>
302
+
303
+ <edge_cases>
304
+
305
+ **Removing a decimal phase (e.g., 17.1):**
306
+ - Only affects other decimals in same series (17.2 → 17.1, 17.3 → 17.2)
307
+ - Integer phases unchanged
308
+ - Simpler operation
309
+
310
+ **No subsequent phases to renumber:**
311
+ - Removing the last phase (e.g., Phase 20 when that's the end)
312
+ - Just delete and update ROADMAP.md, no renumbering needed
313
+
314
+ **Phase directory doesn't exist:**
315
+ - Phase may be in ROADMAP.md but directory not created yet
316
+ - Skip directory deletion, proceed with ROADMAP.md updates
317
+
318
+ **Decimal phases under removed integer:**
319
+ - Removing Phase 17 when 17.1, 17.2 exist
320
+ - 17.1 → 16.1, 17.2 → 16.2
321
+ - They maintain their position in execution order (after current last integer)
322
+
323
+ </edge_cases>
324
+
325
+ <success_criteria>
326
+ Phase removal is complete when:
327
+
328
+ - [ ] Target phase validated as future/unstarted
329
+ - [ ] Phase directory deleted (if existed)
330
+ - [ ] All subsequent phase directories renumbered
331
+ - [ ] Files inside directories renamed ({old}-01-PLAN.md → {new}-01-PLAN.md)
332
+ - [ ] ROADMAP.md updated (section removed, all references renumbered)
333
+ - [ ] STATE.md updated (phase count, progress percentage)
334
+ - [ ] Dependency references updated in subsequent phases
335
+ - [ ] Changes committed with descriptive message
336
+ - [ ] No gaps in phase numbering
337
+ - [ ] User informed of changes
338
+ </success_criteria>
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: gsd:verify-work
3
+ description: Guide manual user acceptance testing of recently built features
4
+ argument-hint: "[optional: phase or plan number, e.g., '4' or '04-02']"
5
+ allowed-tools:
6
+ - Read
7
+ - Bash
8
+ - Glob
9
+ - Grep
10
+ - Edit
11
+ - Write
12
+ - AskUserQuestion
13
+ ---
14
+
15
+ <objective>
16
+ Guide the user through manual acceptance testing of recently built features.
17
+
18
+ Purpose: Validate that what Claude thinks was built actually works from the user's perspective. The USER performs all testing — Claude generates the test checklist, guides the process, and captures issues.
19
+
20
+ Output: Validation of features, any issues logged to phase-scoped ISSUES.md
21
+ </objective>
22
+
23
+ <execution_context>
24
+ @~/.claude/get-shit-done/workflows/verify-work.md
25
+ @~/.claude/get-shit-done/templates/uat-issues.md
26
+ </execution_context>
27
+
28
+ <context>
29
+ Scope: $ARGUMENTS (optional)
30
+ - If provided: Test specific phase or plan (e.g., "4" or "04-02")
31
+ - If not provided: Test most recently completed plan
32
+
33
+ **Load project state:**
34
+ @.planning/STATE.md
35
+
36
+ **Load roadmap:**
37
+ @.planning/ROADMAP.md
38
+ </context>
39
+
40
+ <process>
41
+ 1. Validate arguments (if provided, parse as phase or plan number)
42
+ 2. Find relevant SUMMARY.md (specified or most recent)
43
+ 3. Follow verify-work.md workflow:
44
+ - Extract testable deliverables
45
+ - Generate test checklist
46
+ - Guide through each test via AskUserQuestion
47
+ - Collect and categorize issues
48
+ - Log issues to `.planning/phases/XX-name/{phase}-{plan}-ISSUES.md`
49
+ - Present summary with verdict
50
+ 4. Offer next steps based on results:
51
+ - If all passed: Continue to next phase
52
+ - If issues found: `/gsd:plan-fix {phase} {plan}` to create fix plan
53
+ </process>
54
+
55
+ <anti_patterns>
56
+ - Don't run automated tests (that's for CI/test suites)
57
+ - Don't make assumptions about test results — USER reports outcomes
58
+ - Don't skip the guidance — walk through each test
59
+ - Don't dismiss minor issues — log everything user reports
60
+ - Don't fix issues during testing — capture for later
61
+ </anti_patterns>
62
+
63
+ <success_criteria>
64
+ - [ ] Test scope identified from SUMMARY.md
65
+ - [ ] Checklist generated based on deliverables
66
+ - [ ] User guided through each test
67
+ - [ ] All test results captured (pass/fail/partial/skip)
68
+ - [ ] Any issues logged to phase-scoped ISSUES.md (not global)
69
+ - [ ] Summary presented with verdict
70
+ - [ ] User knows next steps based on results
71
+ </success_criteria>
@@ -0,0 +1,143 @@
1
+ # UAT Issues Template
2
+
3
+ Template for `.planning/phases/XX-name/{phase}-{plan}-ISSUES.md` - phase-scoped issues discovered during user acceptance testing.
4
+
5
+ **Purpose:** Capture issues found during /gsd:verify-work. Unlike global ISSUES.md (for deferred enhancements), this file tracks bugs and problems in specific delivered work.
6
+
7
+ **Location:** Same directory as the SUMMARY.md being tested.
8
+
9
+ ---
10
+
11
+ ## File Template
12
+
13
+ ```markdown
14
+ # UAT Issues: Phase [X] Plan [Y]
15
+
16
+ **Tested:** [date]
17
+ **Source:** [path to SUMMARY.md that was tested]
18
+ **Tester:** User via /gsd:verify-work
19
+
20
+ ## Open Issues
21
+
22
+ ### UAT-001: [Brief description]
23
+
24
+ **Discovered:** [date]
25
+ **Phase/Plan:** [XX]-[YY]
26
+ **Severity:** [Blocker/Major/Minor/Cosmetic]
27
+ **Feature:** [Which feature from the test checklist]
28
+ **Description:** [User's description of the problem]
29
+ **Expected:** [What should have happened]
30
+ **Actual:** [What actually happened]
31
+ **Repro:** [Steps to reproduce, if captured]
32
+
33
+ ### UAT-002: [Brief description]
34
+
35
+ ...
36
+
37
+ ## Resolved Issues
38
+
39
+ [Moved here after /gsd:plan-fix executes and fixes are verified]
40
+
41
+ ### UAT-001: [Brief description]
42
+ **Resolved:** [date] - Fixed in [phase]-[plan]-FIX.md
43
+ **Commit:** [hash]
44
+
45
+ ---
46
+
47
+ *Phase: XX-name*
48
+ *Plan: YY*
49
+ *Tested: [date]*
50
+ ```
51
+
52
+ ---
53
+
54
+ ## Severity Guide
55
+
56
+ | Severity | Definition | Example |
57
+ |----------|------------|---------|
58
+ | **Blocker** | Feature completely unusable | App crashes on button click |
59
+ | **Major** | Feature works but significant problem | Form submits but data not saved |
60
+ | **Minor** | Feature usable but has issues | Button text slightly cut off |
61
+ | **Cosmetic** | Visual only, no functional impact | Wrong shade of color |
62
+
63
+ ---
64
+
65
+ ## UAT Numbering
66
+
67
+ - **Prefix:** `UAT-` (distinguishes from ISS- enhancement issues)
68
+ - **Scope:** Per-file numbering (UAT-001, UAT-002, etc. within each file)
69
+ - **No global numbering:** Each {phase}-{plan}-ISSUES.md has its own sequence
70
+
71
+ ---
72
+
73
+ <good_examples>
74
+ ```markdown
75
+ # UAT Issues: Phase 5 Plan 2
76
+
77
+ **Tested:** 2025-01-15
78
+ **Source:** .planning/phases/05-auth/05-02-SUMMARY.md
79
+ **Tester:** User via /gsd:verify-work
80
+
81
+ ## Open Issues
82
+
83
+ ### UAT-001: Login form doesn't show validation errors
84
+
85
+ **Discovered:** 2025-01-15
86
+ **Phase/Plan:** 05-02
87
+ **Severity:** Major
88
+ **Feature:** User login form
89
+ **Description:** When I enter an invalid email, nothing happens. No error message appears.
90
+ **Expected:** Red error message below email field saying "Invalid email format"
91
+ **Actual:** Field border turns red but no text explanation
92
+ **Repro:**
93
+ 1. Go to /login
94
+ 2. Enter "notanemail" in email field
95
+ 3. Click Login button
96
+
97
+ ### UAT-002: Password field allows paste
98
+
99
+ **Discovered:** 2025-01-15
100
+ **Phase/Plan:** 05-02
101
+ **Severity:** Cosmetic
102
+ **Feature:** User login form
103
+ **Description:** Can paste into password field. Minor UX inconsistency.
104
+ **Expected:** Paste disabled (matches signup form)
105
+ **Actual:** Paste works in login but not signup
106
+ **Repro:** Ctrl+V in password field
107
+
108
+ ## Resolved Issues
109
+
110
+ [None yet]
111
+
112
+ ---
113
+
114
+ *Phase: 05-auth*
115
+ *Plan: 02*
116
+ *Tested: 2025-01-15*
117
+ ```
118
+ </good_examples>
119
+
120
+ <guidelines>
121
+ **When to create:**
122
+ - First time /gsd:verify-work finds an issue for a plan
123
+ - One file per plan tested
124
+
125
+ **Location:**
126
+ - `.planning/phases/XX-name/{phase}-{plan}-ISSUES.md`
127
+ - Lives alongside SUMMARY.md being tested
128
+
129
+ **Difference from global ISSUES.md:**
130
+ - Global ISSUES.md: Deferred enhancements (Rule 5 - nice-to-haves)
131
+ - UAT ISSUES.md: Actual problems found during testing
132
+
133
+ **Workflow:**
134
+ 1. /gsd:verify-work creates this file with issues
135
+ 2. /gsd:plan-fix reads this file and creates FIX.md plan
136
+ 3. After FIX.md executes, issues move to "Resolved" section
137
+ 4. File becomes historical record of what was found and fixed
138
+
139
+ **Resolution:**
140
+ - Don't delete resolved issues - move to "Resolved Issues" section
141
+ - Include fix reference (commit hash, plan that fixed it)
142
+ - File serves as audit trail
143
+ </guidelines>
@@ -0,0 +1,202 @@
1
+ <purpose>
2
+ Guide manual user acceptance testing of recently built features. Extract deliverables from SUMMARY.md, generate test checklist, guide user through each test, log issues to phase-scoped file.
3
+
4
+ The USER performs all testing — Claude generates the checklist, guides the process, and captures issues.
5
+ </purpose>
6
+
7
+ <process>
8
+
9
+ <step name="identify">
10
+ **Determine what to test:**
11
+
12
+ If $ARGUMENTS provided:
13
+ - Parse as phase number (e.g., "4") or plan number (e.g., "04-02")
14
+ - Find corresponding SUMMARY.md file(s)
15
+
16
+ If no arguments:
17
+ - Find most recently modified SUMMARY.md
18
+
19
+ ```bash
20
+ find .planning/phases -name "*SUMMARY.md" -type f -exec ls -lt {} + | head -5
21
+ ```
22
+
23
+ Read the SUMMARY.md to understand what was built.
24
+ </step>
25
+
26
+ <step name="extract">
27
+ **Extract testable deliverables from SUMMARY.md:**
28
+
29
+ Parse for:
30
+ 1. **Accomplishments** - Features/functionality added
31
+ 2. **Files Created/Modified** - What changed
32
+ 3. **User-facing changes** - UI, workflows, interactions
33
+
34
+ Focus on USER-OBSERVABLE outcomes, not implementation details.
35
+
36
+ Examples:
37
+ - "Check-in menu item added to navigation" → User can see/click Check-in in nav
38
+ - "HomePage refreshes after check-in" → After check-in, home shows updated state
39
+ </step>
40
+
41
+ <step name="generate">
42
+ **Generate manual test checklist:**
43
+
44
+ Create structured test plan:
45
+
46
+ ```
47
+ # User Acceptance Test: [Plan/Phase Name]
48
+
49
+ **Scope:** [What was built - from SUMMARY.md]
50
+ **Testing:** Manual user validation
51
+
52
+ ## Pre-flight
53
+ - [ ] Application builds and runs without errors
54
+ - [ ] Application launches to expected state
55
+
56
+ ## Feature Tests
57
+
58
+ ### [Feature 1 from deliverables]
59
+ **What to test:** [User-observable behavior]
60
+ **Steps:**
61
+ 1. [Specific action to take]
62
+ 2. [What to look for]
63
+ 3. [Expected result]
64
+
65
+ ### [Feature 2 from deliverables]
66
+ ...
67
+
68
+ ## Edge Cases
69
+ - [ ] [Relevant edge case based on feature]
70
+ - [ ] [Another edge case]
71
+
72
+ ## Visual/UX Check
73
+ - [ ] UI matches expected design
74
+ - [ ] No visual glitches or layout issues
75
+ - [ ] Responsive to interactions
76
+ ```
77
+
78
+ Present this checklist to user.
79
+ </step>
80
+
81
+ <step name="guide">
82
+ **Guide user through each test:**
83
+
84
+ For each test item, use AskUserQuestion:
85
+ - header: "[Feature name]"
86
+ - question: "[Test description] - Did this work as expected?"
87
+ - options:
88
+ - "Pass" — Works correctly
89
+ - "Fail" — Doesn't work as expected
90
+ - "Partial" — Works but with issues
91
+ - "Skip" — Can't test right now
92
+
93
+ **If Pass:** Move to next test
94
+
95
+ **If Fail or Partial:**
96
+ Follow up with AskUserQuestion:
97
+ - header: "Issue details"
98
+ - question: "What went wrong?"
99
+ - options:
100
+ - "Crashes/errors" — Application error or exception
101
+ - "Wrong behavior" — Does something unexpected
102
+ - "Missing feature" — Expected functionality not present
103
+ - "UI/visual issue" — Looks wrong but functions
104
+ - "Let me describe" — Free-form description needed
105
+ </step>
106
+
107
+ <step name="collect">
108
+ **Collect and categorize issues:**
109
+
110
+ For each failed/partial test, gather:
111
+ - Feature affected
112
+ - What went wrong (from user input)
113
+ - Severity:
114
+ - **Blocker** — Can't use the feature at all
115
+ - **Major** — Feature works but significant problem
116
+ - **Minor** — Small issue, feature still usable
117
+ - **Cosmetic** — Visual only, no functional impact
118
+ </step>
119
+
120
+ <step name="log">
121
+ **Log issues to phase-scoped file:**
122
+
123
+ If any issues found:
124
+
125
+ 1. Create `.planning/phases/XX-name/{phase}-{plan}-ISSUES.md` if doesn't exist
126
+ 2. Use template from `@~/.claude/get-shit-done/templates/uat-issues.md`
127
+ 3. Add each issue:
128
+
129
+ ```markdown
130
+ ### UAT-[NNN]: [Brief description]
131
+
132
+ **Discovered:** [date] during user acceptance testing
133
+ **Phase/Plan:** [phase]-[plan] that was tested
134
+ **Severity:** [Blocker/Major/Minor/Cosmetic]
135
+ **Description:** [User's description of the problem]
136
+ **Expected:** [What should have happened]
137
+ **Actual:** [What actually happened]
138
+ ```
139
+
140
+ **Note:** Issues go to phase-scoped file, NOT global `.planning/ISSUES.md`. This keeps UAT findings tied to the specific work being tested and enables `/gsd:plan-fix` to address them.
141
+ </step>
142
+
143
+ <step name="summarize">
144
+ **Present test summary:**
145
+
146
+ ```
147
+ # Test Results: [Plan/Phase Name]
148
+
149
+ **Tests run:** [N]
150
+ **Passed:** [N]
151
+ **Failed:** [N]
152
+ **Partial:** [N]
153
+ **Skipped:** [N]
154
+
155
+ ## Issues Found
156
+ [List any issues with severity]
157
+
158
+ ## Verdict
159
+ [Based on results:]
160
+ - ALL PASS: "All tests passed. Feature validated."
161
+ - MINOR ISSUES: "Feature works with minor issues logged."
162
+ - MAJOR ISSUES: "Significant issues found - review before proceeding."
163
+ - BLOCKERS: "Blocking issues found - must fix before continuing."
164
+
165
+ ## Next Steps
166
+ [Based on verdict:]
167
+ - If clean: Suggest proceeding to next phase
168
+ - If issues: Suggest /gsd:plan-fix to address
169
+ ```
170
+ </step>
171
+
172
+ <step name="offer">
173
+ **Offer next actions based on results:**
174
+
175
+ Use AskUserQuestion:
176
+ - header: "Next"
177
+ - question: "What would you like to do?"
178
+ - options (based on results):
179
+
180
+ If all passed:
181
+ - "Continue to next phase" — Proceed with confidence
182
+ - "Test more" — Run additional manual tests
183
+ - "Done" — Finish testing session
184
+
185
+ If issues found:
186
+ - "Plan fixes" — Create plan to address issues (/gsd:plan-fix)
187
+ - "Log and continue" — Issues logged, proceed anyway
188
+ - "Review issues" — Look at logged issues in detail
189
+ - "Done" — Finish testing session
190
+ </step>
191
+
192
+ </process>
193
+
194
+ <success_criteria>
195
+ - [ ] Test scope identified from SUMMARY.md
196
+ - [ ] Checklist generated based on deliverables
197
+ - [ ] User guided through each test via AskUserQuestion
198
+ - [ ] All test results captured (pass/fail/partial/skip)
199
+ - [ ] Any issues logged to phase-scoped ISSUES.md
200
+ - [ ] Summary presented with verdict
201
+ - [ ] User knows next steps based on results
202
+ </success_criteria>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "get-shit-done-cc",
3
- "version": "1.3.27",
3
+ "version": "1.3.29",
4
4
  "description": "A meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.",
5
5
  "bin": {
6
6
  "get-shit-done-cc": "bin/install.js"