gsd-opencode 1.3.31
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/bin/install.js +222 -0
- package/command/gsd/add-phase.md +207 -0
- package/command/gsd/complete-milestone.md +105 -0
- package/command/gsd/consider-issues.md +201 -0
- package/command/gsd/create-roadmap.md +115 -0
- package/command/gsd/discuss-milestone.md +47 -0
- package/command/gsd/discuss-phase.md +60 -0
- package/command/gsd/execute-plan.md +128 -0
- package/command/gsd/help.md +315 -0
- package/command/gsd/insert-phase.md +227 -0
- package/command/gsd/list-phase-assumptions.md +50 -0
- package/command/gsd/map-codebase.md +84 -0
- package/command/gsd/new-milestone.md +59 -0
- package/command/gsd/new-project.md +316 -0
- package/command/gsd/pause-work.md +122 -0
- package/command/gsd/plan-fix.md +205 -0
- package/command/gsd/plan-phase.md +67 -0
- package/command/gsd/progress.md +316 -0
- package/command/gsd/remove-phase.md +338 -0
- package/command/gsd/research-phase.md +91 -0
- package/command/gsd/resume-work.md +40 -0
- package/command/gsd/verify-work.md +71 -0
- package/get-shit-done/references/checkpoints.md +287 -0
- package/get-shit-done/references/continuation-format.md +255 -0
- package/get-shit-done/references/git-integration.md +254 -0
- package/get-shit-done/references/plan-format.md +428 -0
- package/get-shit-done/references/principles.md +157 -0
- package/get-shit-done/references/questioning.md +162 -0
- package/get-shit-done/references/research-pitfalls.md +215 -0
- package/get-shit-done/references/scope-estimation.md +172 -0
- package/get-shit-done/references/tdd.md +263 -0
- package/get-shit-done/templates/codebase/architecture.md +255 -0
- package/get-shit-done/templates/codebase/concerns.md +310 -0
- package/get-shit-done/templates/codebase/conventions.md +307 -0
- package/get-shit-done/templates/codebase/integrations.md +280 -0
- package/get-shit-done/templates/codebase/stack.md +186 -0
- package/get-shit-done/templates/codebase/structure.md +285 -0
- package/get-shit-done/templates/codebase/testing.md +480 -0
- package/get-shit-done/templates/config.json +18 -0
- package/get-shit-done/templates/context.md +161 -0
- package/get-shit-done/templates/continue-here.md +78 -0
- package/get-shit-done/templates/discovery.md +146 -0
- package/get-shit-done/templates/issues.md +32 -0
- package/get-shit-done/templates/milestone-archive.md +123 -0
- package/get-shit-done/templates/milestone-context.md +93 -0
- package/get-shit-done/templates/milestone.md +115 -0
- package/get-shit-done/templates/phase-prompt.md +303 -0
- package/get-shit-done/templates/project.md +184 -0
- package/get-shit-done/templates/research.md +529 -0
- package/get-shit-done/templates/roadmap.md +196 -0
- package/get-shit-done/templates/state.md +210 -0
- package/get-shit-done/templates/summary.md +273 -0
- package/get-shit-done/templates/uat-issues.md +143 -0
- package/get-shit-done/workflows/complete-milestone.md +643 -0
- package/get-shit-done/workflows/create-milestone.md +416 -0
- package/get-shit-done/workflows/create-roadmap.md +481 -0
- package/get-shit-done/workflows/discovery-phase.md +293 -0
- package/get-shit-done/workflows/discuss-milestone.md +236 -0
- package/get-shit-done/workflows/discuss-phase.md +247 -0
- package/get-shit-done/workflows/execute-phase.md +1625 -0
- package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/get-shit-done/workflows/map-codebase.md +434 -0
- package/get-shit-done/workflows/plan-phase.md +488 -0
- package/get-shit-done/workflows/research-phase.md +436 -0
- package/get-shit-done/workflows/resume-project.md +287 -0
- package/get-shit-done/workflows/transition.md +580 -0
- package/get-shit-done/workflows/verify-work.md +202 -0
- package/package.json +38 -0
package/bin/install.js
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const os = require("os");
|
|
6
|
+
const readline = require("readline");
|
|
7
|
+
|
|
8
|
+
// Colors
|
|
9
|
+
const cyan = "\x1b[36m";
|
|
10
|
+
const green = "\x1b[32m";
|
|
11
|
+
const yellow = "\x1b[33m";
|
|
12
|
+
const dim = "\x1b[2m";
|
|
13
|
+
const reset = "\x1b[0m";
|
|
14
|
+
|
|
15
|
+
// Get version from package.json
|
|
16
|
+
const pkg = require("../package.json");
|
|
17
|
+
|
|
18
|
+
const banner = `
|
|
19
|
+
${cyan} ██████╗ ███████╗██████╗
|
|
20
|
+
██╔════╝ ██╔════╝██╔══██╗
|
|
21
|
+
██║ ███╗█████╗ ██║ ██║
|
|
22
|
+
██║ ██║╚════██║██║ ██║
|
|
23
|
+
╚██████╔╝███████║██████╔╝
|
|
24
|
+
╚═════╝ ╚══════╝╚═════╝${reset}
|
|
25
|
+
|
|
26
|
+
Get Shit Done ${dim}v${pkg.version}${reset}
|
|
27
|
+
A meta-prompting, context engineering and spec-driven
|
|
28
|
+
development system for OpenCode by TÂCHES.
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
// Parse args
|
|
32
|
+
const args = process.argv.slice(2);
|
|
33
|
+
const hasGlobal = args.includes("--global") || args.includes("-g");
|
|
34
|
+
const hasLocal = args.includes("--local") || args.includes("-l");
|
|
35
|
+
|
|
36
|
+
// Parse --config-dir argument
|
|
37
|
+
function parseConfigDirArg() {
|
|
38
|
+
const configDirIndex = args.findIndex(
|
|
39
|
+
(arg) => arg === "--config-dir" || arg === "-c",
|
|
40
|
+
);
|
|
41
|
+
if (configDirIndex !== -1) {
|
|
42
|
+
const nextArg = args[configDirIndex + 1];
|
|
43
|
+
// Error if --config-dir is provided without a value or next arg is another flag
|
|
44
|
+
if (!nextArg || nextArg.startsWith("-")) {
|
|
45
|
+
console.error(` ${yellow}--config-dir requires a path argument${reset}`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
return nextArg;
|
|
49
|
+
}
|
|
50
|
+
// Also handle --config-dir=value format
|
|
51
|
+
const configDirArg = args.find(
|
|
52
|
+
(arg) => arg.startsWith("--config-dir=") || arg.startsWith("-c="),
|
|
53
|
+
);
|
|
54
|
+
if (configDirArg) {
|
|
55
|
+
return configDirArg.split("=")[1];
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const explicitConfigDir = parseConfigDirArg();
|
|
60
|
+
const hasHelp = args.includes("--help") || args.includes("-h");
|
|
61
|
+
|
|
62
|
+
console.log(banner);
|
|
63
|
+
|
|
64
|
+
// Show help if requested
|
|
65
|
+
if (hasHelp) {
|
|
66
|
+
console.log(` ${yellow}Usage:${reset} npx gsd-opencode [options]
|
|
67
|
+
|
|
68
|
+
${yellow}Options:${reset}
|
|
69
|
+
${cyan}-g, --global${reset} Install globally (to OpenCode config directory)
|
|
70
|
+
${cyan}-l, --local${reset} Install locally (to .opencode in current directory)
|
|
71
|
+
${cyan}-c, --config-dir <path>${reset} Specify custom OpenCode config directory
|
|
72
|
+
${cyan}-h, --help${reset} Show this help message
|
|
73
|
+
|
|
74
|
+
${yellow}Examples:${reset}
|
|
75
|
+
${dim}# Install to default ~/.config/opencode directory${reset}
|
|
76
|
+
npx gsd-opencode --global
|
|
77
|
+
|
|
78
|
+
${dim}# Install to custom config directory (for multiple OpenCode accounts)${reset}
|
|
79
|
+
npx gsd-opencode --global --config-dir ~/.opencode-bc
|
|
80
|
+
|
|
81
|
+
${dim}# Using environment variable${reset}
|
|
82
|
+
OPENCODE_CONFIG_DIR=~/.opencode-bc npx gsd-opencode --global
|
|
83
|
+
|
|
84
|
+
${dim}# Install to current project only${reset}
|
|
85
|
+
npx gsd-opencode --local
|
|
86
|
+
|
|
87
|
+
${yellow}Notes:${reset}
|
|
88
|
+
The --config-dir option is useful when you have multiple OpenCode
|
|
89
|
+
configurations (e.g., for different subscriptions). It takes priority
|
|
90
|
+
over the OPENCODE_CONFIG_DIR environment variable.
|
|
91
|
+
`);
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Expand ~ to home directory (shell doesn't expand in env vars passed to node)
|
|
97
|
+
*/
|
|
98
|
+
function expandTilde(filePath) {
|
|
99
|
+
if (filePath && filePath.startsWith("~/")) {
|
|
100
|
+
return path.join(os.homedir(), filePath.slice(2));
|
|
101
|
+
}
|
|
102
|
+
return filePath;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Recursively copy directory, replacing paths in .md files
|
|
107
|
+
*/
|
|
108
|
+
function copyWithPathReplacement(srcDir, destDir, pathPrefix) {
|
|
109
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
110
|
+
|
|
111
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
112
|
+
|
|
113
|
+
for (const entry of entries) {
|
|
114
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
115
|
+
const destPath = path.join(destDir, entry.name);
|
|
116
|
+
|
|
117
|
+
if (entry.isDirectory()) {
|
|
118
|
+
copyWithPathReplacement(srcPath, destPath, pathPrefix);
|
|
119
|
+
} else if (entry.name.endsWith(".md")) {
|
|
120
|
+
// Replace ~/.claude/ and ./.claude/ with OpenCode paths
|
|
121
|
+
let content = fs.readFileSync(srcPath, "utf8");
|
|
122
|
+
content = content.replace(/~\/\.claude\//g, pathPrefix);
|
|
123
|
+
content = content.replace(/\.\/\.claude\//g, "./.opencode/");
|
|
124
|
+
fs.writeFileSync(destPath, content);
|
|
125
|
+
} else {
|
|
126
|
+
fs.copyFileSync(srcPath, destPath);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Install to the specified directory
|
|
133
|
+
*/
|
|
134
|
+
function install(isGlobal) {
|
|
135
|
+
const src = path.join(__dirname, "..");
|
|
136
|
+
// Priority: explicit --config-dir arg > OPENCODE_CONFIG_DIR env var > default ~/.config/opencode
|
|
137
|
+
const configDir =
|
|
138
|
+
expandTilde(explicitConfigDir) ||
|
|
139
|
+
expandTilde(process.env.OPENCODE_CONFIG_DIR);
|
|
140
|
+
const defaultGlobalDir = configDir || path.join(os.homedir(), ".config", "opencode");
|
|
141
|
+
const opencodeDir = isGlobal
|
|
142
|
+
? defaultGlobalDir
|
|
143
|
+
: path.join(process.cwd(), ".opencode");
|
|
144
|
+
|
|
145
|
+
const locationLabel = isGlobal
|
|
146
|
+
? opencodeDir.replace(os.homedir(), "~")
|
|
147
|
+
: opencodeDir.replace(process.cwd(), ".");
|
|
148
|
+
|
|
149
|
+
// Path prefix for file references
|
|
150
|
+
// Use actual path when OPENCODE_CONFIG_DIR is set, otherwise use ~ shorthand
|
|
151
|
+
const pathPrefix = isGlobal
|
|
152
|
+
? configDir
|
|
153
|
+
? `${opencodeDir}/`
|
|
154
|
+
: "~/.config/opencode/"
|
|
155
|
+
: "./.opencode/";
|
|
156
|
+
|
|
157
|
+
console.log(` Installing to ${cyan}${locationLabel}${reset}\n`);
|
|
158
|
+
|
|
159
|
+
// Create commands directory (singular "command" not "commands")
|
|
160
|
+
const commandsDir = path.join(opencodeDir, "command");
|
|
161
|
+
fs.mkdirSync(commandsDir, { recursive: true });
|
|
162
|
+
|
|
163
|
+
// Copy commands/gsd with path replacement
|
|
164
|
+
const gsdSrc = path.join(src, "command", "gsd");
|
|
165
|
+
const gsdDest = path.join(commandsDir, "gsd");
|
|
166
|
+
copyWithPathReplacement(gsdSrc, gsdDest, pathPrefix);
|
|
167
|
+
console.log(` ${green}✓${reset} Installed command/gsd`);
|
|
168
|
+
|
|
169
|
+
// Copy get-shit-done skill with path replacement
|
|
170
|
+
const skillSrc = path.join(src, "get-shit-done");
|
|
171
|
+
const skillDest = path.join(opencodeDir, "get-shit-done");
|
|
172
|
+
copyWithPathReplacement(skillSrc, skillDest, pathPrefix);
|
|
173
|
+
console.log(` ${green}✓${reset} Installed get-shit-done`);
|
|
174
|
+
|
|
175
|
+
console.log(`
|
|
176
|
+
${green}Done!${reset} Run ${cyan}/gsd:help${reset} to get started.
|
|
177
|
+
`);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Prompt for install location
|
|
182
|
+
*/
|
|
183
|
+
function promptLocation() {
|
|
184
|
+
const rl = readline.createInterface({
|
|
185
|
+
input: process.stdin,
|
|
186
|
+
output: process.stdout,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const configDir =
|
|
190
|
+
expandTilde(explicitConfigDir) ||
|
|
191
|
+
expandTilde(process.env.OPENCODE_CONFIG_DIR);
|
|
192
|
+
const globalPath = configDir || path.join(os.homedir(), ".config", "opencode");
|
|
193
|
+
const globalLabel = globalPath.replace(os.homedir(), "~");
|
|
194
|
+
|
|
195
|
+
console.log(` ${yellow}Where would you like to install?${reset}
|
|
196
|
+
|
|
197
|
+
${cyan}1${reset}) Global ${dim}(${globalLabel})${reset} - available in all projects
|
|
198
|
+
${cyan}2${reset}) Local ${dim}(./.opencode)${reset} - this project only
|
|
199
|
+
`);
|
|
200
|
+
|
|
201
|
+
rl.question(` Choice ${dim}[1]${reset}: `, (answer) => {
|
|
202
|
+
rl.close();
|
|
203
|
+
const choice = answer.trim() || "1";
|
|
204
|
+
const isGlobal = choice !== "2";
|
|
205
|
+
install(isGlobal);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Main
|
|
210
|
+
if (hasGlobal && hasLocal) {
|
|
211
|
+
console.error(` ${yellow}Cannot specify both --global and --local${reset}`);
|
|
212
|
+
process.exit(1);
|
|
213
|
+
} else if (explicitConfigDir && hasLocal) {
|
|
214
|
+
console.error(` ${yellow}Cannot use --config-dir with --local${reset}`);
|
|
215
|
+
process.exit(1);
|
|
216
|
+
} else if (hasGlobal) {
|
|
217
|
+
install(true);
|
|
218
|
+
} else if (hasLocal) {
|
|
219
|
+
install(false);
|
|
220
|
+
} else {
|
|
221
|
+
promptLocation();
|
|
222
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd:add-phase
|
|
3
|
+
description: Add phase to end of current milestone in roadmap
|
|
4
|
+
argument-hint: <description>
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Write
|
|
8
|
+
- Bash
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<objective>
|
|
12
|
+
Add a new integer phase to the end of the current milestone in the roadmap.
|
|
13
|
+
|
|
14
|
+
This command appends sequential phases to the current milestone's phase list, automatically calculating the next phase number based on existing phases.
|
|
15
|
+
|
|
16
|
+
Purpose: Add planned work discovered during execution that belongs at the end of current milestone.
|
|
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
|
+
- All arguments become the phase description
|
|
29
|
+
- Example: `/gsd:add-phase Add authentication` → description = "Add authentication"
|
|
30
|
+
- Example: `/gsd:add-phase Fix critical performance issues` → description = "Fix critical performance issues"
|
|
31
|
+
|
|
32
|
+
If no arguments provided:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
ERROR: Phase description required
|
|
36
|
+
Usage: /gsd:add-phase <description>
|
|
37
|
+
Example: /gsd:add-phase Add authentication system
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Exit.
|
|
41
|
+
</step>
|
|
42
|
+
|
|
43
|
+
<step name="load_roadmap">
|
|
44
|
+
Load the roadmap file:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
if [ -f .planning/ROADMAP.md ]; then
|
|
48
|
+
ROADMAP=".planning/ROADMAP.md"
|
|
49
|
+
else
|
|
50
|
+
echo "ERROR: No roadmap found (.planning/ROADMAP.md)"
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Read roadmap content for parsing.
|
|
56
|
+
</step>
|
|
57
|
+
|
|
58
|
+
<step name="find_current_milestone">
|
|
59
|
+
Parse the roadmap to find the current milestone section:
|
|
60
|
+
|
|
61
|
+
1. Locate the "## Current Milestone:" heading
|
|
62
|
+
2. Extract milestone name and version
|
|
63
|
+
3. Identify all phases under this milestone (before next "---" separator or next milestone heading)
|
|
64
|
+
4. Parse existing phase numbers (including decimals if present)
|
|
65
|
+
|
|
66
|
+
Example structure:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
## Current Milestone: v1.0 Foundation
|
|
70
|
+
|
|
71
|
+
### Phase 4: Focused Command System
|
|
72
|
+
### Phase 5: Path Routing & Validation
|
|
73
|
+
### Phase 6: Documentation & Distribution
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
</step>
|
|
77
|
+
|
|
78
|
+
<step name="calculate_next_phase">
|
|
79
|
+
Find the highest integer phase number in the current milestone:
|
|
80
|
+
|
|
81
|
+
1. Extract all phase numbers from phase headings (### Phase N:)
|
|
82
|
+
2. Filter to integer phases only (ignore decimals like 4.1, 4.2)
|
|
83
|
+
3. Find the maximum integer value
|
|
84
|
+
4. Add 1 to get the next phase number
|
|
85
|
+
|
|
86
|
+
Example: If phases are 4, 5, 5.1, 6 → next is 7
|
|
87
|
+
|
|
88
|
+
Format as two-digit: `printf "%02d" $next_phase`
|
|
89
|
+
</step>
|
|
90
|
+
|
|
91
|
+
<step name="generate_slug">
|
|
92
|
+
Convert the phase description to a kebab-case slug:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Example transformation:
|
|
96
|
+
# "Add authentication" → "add-authentication"
|
|
97
|
+
# "Fix critical performance issues" → "fix-critical-performance-issues"
|
|
98
|
+
|
|
99
|
+
slug=$(echo "$description" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Phase directory name: `{two-digit-phase}-{slug}`
|
|
103
|
+
Example: `07-add-authentication`
|
|
104
|
+
</step>
|
|
105
|
+
|
|
106
|
+
<step name="create_phase_directory">
|
|
107
|
+
Create the phase directory structure:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
phase_dir=".planning/phases/${phase_num}-${slug}"
|
|
111
|
+
mkdir -p "$phase_dir"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Confirm: "Created directory: $phase_dir"
|
|
115
|
+
</step>
|
|
116
|
+
|
|
117
|
+
<step name="update_roadmap">
|
|
118
|
+
Add the new phase entry to the roadmap:
|
|
119
|
+
|
|
120
|
+
1. Find the insertion point (after last phase in current milestone, before "---" separator)
|
|
121
|
+
2. Insert new phase heading:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
### Phase {N}: {Description}
|
|
125
|
+
|
|
126
|
+
**Goal:** [To be planned]
|
|
127
|
+
**Depends on:** Phase {N-1}
|
|
128
|
+
**Plans:** 0 plans
|
|
129
|
+
|
|
130
|
+
Plans:
|
|
131
|
+
- [ ] TBD (run /gsd:plan-phase {N} to break down)
|
|
132
|
+
|
|
133
|
+
**Details:**
|
|
134
|
+
[To be added during planning]
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
3. Write updated roadmap back to file
|
|
138
|
+
|
|
139
|
+
Preserve all other content exactly (formatting, spacing, other phases).
|
|
140
|
+
</step>
|
|
141
|
+
|
|
142
|
+
<step name="update_project_state">
|
|
143
|
+
Update STATE.md to reflect the new phase:
|
|
144
|
+
|
|
145
|
+
1. Read `.planning/STATE.md`
|
|
146
|
+
2. Under "## Current Position" → "**Next Phase:**" add reference to new phase
|
|
147
|
+
3. Under "## Accumulated Context" → "### Roadmap Evolution" add entry:
|
|
148
|
+
```
|
|
149
|
+
- Phase {N} added: {description}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
If "Roadmap Evolution" section doesn't exist, create it.
|
|
153
|
+
</step>
|
|
154
|
+
|
|
155
|
+
<step name="completion">
|
|
156
|
+
Present completion summary:
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
Phase {N} added to current milestone:
|
|
160
|
+
- Description: {description}
|
|
161
|
+
- Directory: .planning/phases/{phase-num}-{slug}/
|
|
162
|
+
- Status: Not planned yet
|
|
163
|
+
|
|
164
|
+
Roadmap updated: {roadmap-path}
|
|
165
|
+
Project state updated: .planning/STATE.md
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## ▶ Next Up
|
|
170
|
+
|
|
171
|
+
**Phase {N}: {description}**
|
|
172
|
+
|
|
173
|
+
`/gsd:plan-phase {N}`
|
|
174
|
+
|
|
175
|
+
*`/clear` first → fresh context window*
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
**Also available:**
|
|
180
|
+
- `/gsd:add-phase <description>` — add another phase
|
|
181
|
+
- Review roadmap
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
```
|
|
185
|
+
</step>
|
|
186
|
+
|
|
187
|
+
</process>
|
|
188
|
+
|
|
189
|
+
<anti_patterns>
|
|
190
|
+
|
|
191
|
+
- Don't modify phases outside current milestone
|
|
192
|
+
- Don't renumber existing phases
|
|
193
|
+
- Don't use decimal numbering (that's /gsd:insert-phase)
|
|
194
|
+
- Don't create plans yet (that's /gsd:plan-phase)
|
|
195
|
+
- Don't commit changes (user decides when to commit)
|
|
196
|
+
</anti_patterns>
|
|
197
|
+
|
|
198
|
+
<success_criteria>
|
|
199
|
+
Phase addition is complete when:
|
|
200
|
+
|
|
201
|
+
- [ ] Phase directory created: `.planning/phases/{NN}-{slug}/`
|
|
202
|
+
- [ ] Roadmap updated with new phase entry
|
|
203
|
+
- [ ] STATE.md updated with roadmap evolution note
|
|
204
|
+
- [ ] New phase appears at end of current milestone
|
|
205
|
+
- [ ] Next phase number calculated correctly (ignoring decimals)
|
|
206
|
+
- [ ] User informed of next steps
|
|
207
|
+
</success_criteria>
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd:complete-milestone
|
|
3
|
+
description: Archive completed milestone and prepare for next version
|
|
4
|
+
argument-hint: <version>
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Write
|
|
8
|
+
- Bash
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<objective>
|
|
12
|
+
Mark milestone {{version}} complete, archive to milestones/, and update ROADMAP.md.
|
|
13
|
+
|
|
14
|
+
Purpose: Create historical record of shipped version, collapse completed work in roadmap, and prepare for next milestone.
|
|
15
|
+
Output: Milestone archived, roadmap reorganized, git tagged.
|
|
16
|
+
</objective>
|
|
17
|
+
|
|
18
|
+
<execution_context>
|
|
19
|
+
**Load these files NOW (before proceeding):**
|
|
20
|
+
|
|
21
|
+
- @~/.config/opencode/get-shit-done/workflows/complete-milestone.md (main workflow)
|
|
22
|
+
- @~/.config/opencode/get-shit-done/templates/milestone-archive.md (archive template)
|
|
23
|
+
</execution_context>
|
|
24
|
+
|
|
25
|
+
<context>
|
|
26
|
+
**Project files:**
|
|
27
|
+
- `.planning/ROADMAP.md`
|
|
28
|
+
- `.planning/STATE.md`
|
|
29
|
+
- `.planning/PROJECT.md`
|
|
30
|
+
|
|
31
|
+
**User input:**
|
|
32
|
+
|
|
33
|
+
- Version: {{version}} (e.g., "1.0", "1.1", "2.0")
|
|
34
|
+
</context>
|
|
35
|
+
|
|
36
|
+
<process>
|
|
37
|
+
|
|
38
|
+
**Follow complete-milestone.md workflow:**
|
|
39
|
+
|
|
40
|
+
1. **Verify readiness:**
|
|
41
|
+
|
|
42
|
+
- Check all phases in milestone have completed plans (SUMMARY.md exists)
|
|
43
|
+
- Present milestone scope and stats
|
|
44
|
+
- Wait for confirmation
|
|
45
|
+
|
|
46
|
+
2. **Gather stats:**
|
|
47
|
+
|
|
48
|
+
- Count phases, plans, tasks
|
|
49
|
+
- Calculate git range, file changes, LOC
|
|
50
|
+
- Extract timeline from git log
|
|
51
|
+
- Present summary, confirm
|
|
52
|
+
|
|
53
|
+
3. **Extract accomplishments:**
|
|
54
|
+
|
|
55
|
+
- Read all phase SUMMARY.md files in milestone range
|
|
56
|
+
- Extract 4-6 key accomplishments
|
|
57
|
+
- Present for approval
|
|
58
|
+
|
|
59
|
+
4. **Archive milestone:**
|
|
60
|
+
|
|
61
|
+
- Create `.planning/milestones/v{{version}}-ROADMAP.md`
|
|
62
|
+
- Extract full phase details from ROADMAP.md
|
|
63
|
+
- Fill milestone-archive.md template
|
|
64
|
+
- Update ROADMAP.md to one-line summary with link
|
|
65
|
+
- Offer to create next milestone
|
|
66
|
+
|
|
67
|
+
5. **Update PROJECT.md:**
|
|
68
|
+
|
|
69
|
+
- Add "Current State" section with shipped version
|
|
70
|
+
- Add "Next Milestone Goals" section
|
|
71
|
+
- Archive previous content in `<details>` (if v1.1+)
|
|
72
|
+
|
|
73
|
+
6. **Commit and tag:**
|
|
74
|
+
|
|
75
|
+
- Stage: MILESTONES.md, PROJECT.md, ROADMAP.md, STATE.md, archive file
|
|
76
|
+
- Commit: `chore: archive v{{version}} milestone`
|
|
77
|
+
- Tag: `git tag -a v{{version}} -m "[milestone summary]"`
|
|
78
|
+
- Ask about pushing tag
|
|
79
|
+
|
|
80
|
+
7. **Offer next steps:**
|
|
81
|
+
- Plan next milestone
|
|
82
|
+
- Archive planning
|
|
83
|
+
- Done for now
|
|
84
|
+
|
|
85
|
+
</process>
|
|
86
|
+
|
|
87
|
+
<success_criteria>
|
|
88
|
+
|
|
89
|
+
- Milestone archived to `.planning/milestones/v{{version}}-ROADMAP.md`
|
|
90
|
+
- ROADMAP.md collapsed to one-line entry
|
|
91
|
+
- PROJECT.md updated with current state
|
|
92
|
+
- Git tag v{{version}} created
|
|
93
|
+
- Commit successful
|
|
94
|
+
- User knows next steps
|
|
95
|
+
</success_criteria>
|
|
96
|
+
|
|
97
|
+
<critical_rules>
|
|
98
|
+
|
|
99
|
+
- **Load workflow first:** Read complete-milestone.md before executing
|
|
100
|
+
- **Verify completion:** All phases must have SUMMARY.md files
|
|
101
|
+
- **User confirmation:** Wait for approval at verification gates
|
|
102
|
+
- **Archive before collapsing:** Always create archive file before updating ROADMAP.md
|
|
103
|
+
- **One-line summary:** Collapsed milestone in ROADMAP.md should be single line with link
|
|
104
|
+
- **Context efficiency:** Archive keeps ROADMAP.md constant size
|
|
105
|
+
</critical_rules>
|