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 +5 -0
- package/bin/install.js +60 -2
- package/commands/gsd/help.md +11 -0
- package/commands/gsd/plan-fix.md +205 -0
- package/commands/gsd/progress.md +48 -2
- package/commands/gsd/remove-phase.md +338 -0
- package/commands/gsd/verify-work.md +71 -0
- package/get-shit-done/templates/uat-issues.md +143 -0
- package/get-shit-done/workflows/verify-work.md +202 -0
- package/package.json +1 -1
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
|
-
|
|
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
|
|
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) {
|
package/commands/gsd/help.md
CHANGED
|
@@ -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>
|
package/commands/gsd/progress.md
CHANGED
|
@@ -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
|
|
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
|
|
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