pi-gsd 1.1.0 → 1.2.2
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/.gsd/extensions/gsd-hooks.ts +212 -212
- package/README.md +45 -44
- package/dist/{gsd-tools.js → pi-gsd-tools.js} +54 -54
- package/package.json +6 -6
- package/scripts/postinstall.js +253 -293
- package/skills/gsd-add-backlog/SKILL.md +3 -3
- package/skills/gsd-add-phase/SKILL.md +2 -2
- package/skills/gsd-add-tests/SKILL.md +2 -2
- package/skills/gsd-add-todo/SKILL.md +2 -2
- package/skills/gsd-audit-milestone/SKILL.md +2 -2
- package/skills/gsd-audit-uat/SKILL.md +1 -1
- package/skills/gsd-autonomous/SKILL.md +4 -4
- package/skills/gsd-check-todos/SKILL.md +2 -2
- package/skills/gsd-cleanup/SKILL.md +2 -2
- package/skills/gsd-complete-milestone/SKILL.md +2 -2
- package/skills/gsd-debug/SKILL.md +2 -2
- package/skills/gsd-discuss-phase/SKILL.md +6 -6
- package/skills/gsd-do/SKILL.md +3 -3
- package/skills/gsd-execute-phase/SKILL.md +4 -4
- package/skills/gsd-fast/SKILL.md +2 -2
- package/skills/gsd-forensics/SKILL.md +2 -2
- package/skills/gsd-health/SKILL.md +4 -4
- package/skills/gsd-help/SKILL.md +2 -2
- package/skills/gsd-insert-phase/SKILL.md +2 -2
- package/skills/gsd-list-phase-assumptions/SKILL.md +1 -1
- package/skills/gsd-list-workspaces/SKILL.md +3 -3
- package/skills/gsd-manager/SKILL.md +4 -4
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-milestone-summary/SKILL.md +2 -2
- package/skills/gsd-new-milestone/SKILL.md +6 -6
- package/skills/gsd-new-project/SKILL.md +6 -6
- package/skills/gsd-new-workspace/SKILL.md +3 -3
- package/skills/gsd-next/SKILL.md +2 -2
- package/skills/gsd-note/SKILL.md +3 -3
- package/skills/gsd-pause-work/SKILL.md +2 -2
- package/skills/gsd-plan-milestone-gaps/SKILL.md +2 -2
- package/skills/gsd-plan-phase/SKILL.md +3 -3
- package/skills/gsd-plant-seed/SKILL.md +2 -2
- package/skills/gsd-pr-branch/SKILL.md +2 -2
- package/skills/gsd-profile-user/SKILL.md +2 -2
- package/skills/gsd-progress/SKILL.md +4 -4
- package/skills/gsd-quick/SKILL.md +2 -2
- package/skills/gsd-remove-phase/SKILL.md +2 -2
- package/skills/gsd-remove-workspace/SKILL.md +3 -3
- package/skills/gsd-research-phase/SKILL.md +3 -3
- package/skills/gsd-resume-work/SKILL.md +2 -2
- package/skills/gsd-review/SKILL.md +2 -2
- package/skills/gsd-review-backlog/SKILL.md +2 -2
- package/skills/gsd-session-report/SKILL.md +2 -2
- package/skills/gsd-set-profile/SKILL.md +1 -1
- package/skills/gsd-settings/SKILL.md +2 -2
- package/skills/gsd-setup-pi/SKILL.md +15 -13
- package/skills/gsd-ship/SKILL.md +2 -2
- package/skills/gsd-stats/SKILL.md +4 -4
- package/skills/gsd-thread/SKILL.md +2 -2
- package/skills/gsd-ui-phase/SKILL.md +3 -3
- package/skills/gsd-ui-review/SKILL.md +3 -3
- package/skills/gsd-update/SKILL.md +2 -2
- package/skills/gsd-validate-phase/SKILL.md +2 -2
- package/skills/gsd-verify-work/SKILL.md +3 -3
- package/skills/gsd-workstreams/SKILL.md +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* gsd-hooks.ts
|
|
2
|
+
* gsd-hooks.ts - GSD pi Extension
|
|
3
3
|
* gsd-extension-version: 1.30.0
|
|
4
4
|
*
|
|
5
5
|
* Pi lifecycle extension for the Get Shit Done (GSD) workflow framework.
|
|
@@ -23,215 +23,215 @@ import { join } from "node:path";
|
|
|
23
23
|
import type { ContextUsage, ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
24
24
|
|
|
25
25
|
export default function (pi: ExtensionAPI) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
26
|
+
// ── session_start: GSD update check ──────────────────────────────────────
|
|
27
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
28
|
+
try {
|
|
29
|
+
const cacheDir = join(homedir(), ".pi", "cache");
|
|
30
|
+
const cacheFile = join(cacheDir, "gsd-update-check.json");
|
|
31
|
+
const CACHE_TTL_SECONDS = 86_400; // 24 hours
|
|
32
|
+
|
|
33
|
+
// Show cached update notification if available
|
|
34
|
+
if (existsSync(cacheFile)) {
|
|
35
|
+
try {
|
|
36
|
+
const cache = JSON.parse(readFileSync(cacheFile, "utf8")) as {
|
|
37
|
+
update_available?: boolean;
|
|
38
|
+
installed?: string;
|
|
39
|
+
latest?: string;
|
|
40
|
+
checked?: number;
|
|
41
|
+
};
|
|
42
|
+
const ageSeconds =
|
|
43
|
+
Math.floor(Date.now() / 1000) - (cache.checked ?? 0);
|
|
44
|
+
|
|
45
|
+
if (cache.update_available && cache.latest) {
|
|
46
|
+
ctx.ui.notify(
|
|
47
|
+
`GSD update available: ${cache.installed ?? "?"} → ${cache.latest}. Run: npm i -g pi-gsd`,
|
|
48
|
+
"info",
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Cache is fresh - skip network check
|
|
53
|
+
if (ageSeconds < CACHE_TTL_SECONDS) return;
|
|
54
|
+
} catch {
|
|
55
|
+
// Corrupt cache - fall through to fresh check
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Run network check asynchronously after 3 s to avoid blocking startup
|
|
60
|
+
setTimeout(() => {
|
|
61
|
+
try {
|
|
62
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
63
|
+
|
|
64
|
+
// Resolve installed version from project or global GSD install
|
|
65
|
+
let installed = "0.0.0";
|
|
66
|
+
const versionPaths = [
|
|
67
|
+
join(ctx.cwd, ".pi", "gsd", "VERSION"),
|
|
68
|
+
join(homedir(), ".pi", "gsd", "VERSION"),
|
|
69
|
+
];
|
|
70
|
+
for (const vp of versionPaths) {
|
|
71
|
+
if (existsSync(vp)) {
|
|
72
|
+
try {
|
|
73
|
+
installed = readFileSync(vp, "utf8").trim();
|
|
74
|
+
break;
|
|
75
|
+
} catch {
|
|
76
|
+
/* skip unreadable */
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
let latest: string | null = null;
|
|
82
|
+
try {
|
|
83
|
+
latest = execSync("npm view pi-gsd version", {
|
|
84
|
+
encoding: "utf8",
|
|
85
|
+
timeout: 10_000,
|
|
86
|
+
windowsHide: true,
|
|
87
|
+
}).trim();
|
|
88
|
+
} catch {
|
|
89
|
+
/* offline or npm unavailable */
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
writeFileSync(
|
|
93
|
+
cacheFile,
|
|
94
|
+
JSON.stringify({
|
|
95
|
+
update_available:
|
|
96
|
+
latest !== null &&
|
|
97
|
+
installed !== "0.0.0" &&
|
|
98
|
+
installed !== latest,
|
|
99
|
+
installed,
|
|
100
|
+
latest: latest ?? "unknown",
|
|
101
|
+
checked: Math.floor(Date.now() / 1000),
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
104
|
+
} catch {
|
|
105
|
+
/* silent fail */
|
|
106
|
+
}
|
|
107
|
+
}, 3_000);
|
|
108
|
+
} catch {
|
|
109
|
+
/* silent fail - never throw from session_start */
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// ── tool_call: workflow guard (advisory only, never blocking) ────────────
|
|
114
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
115
|
+
try {
|
|
116
|
+
// Only guard write and edit tool calls
|
|
117
|
+
if (event.toolName !== "write" && event.toolName !== "edit")
|
|
118
|
+
return undefined;
|
|
119
|
+
|
|
120
|
+
const filePath = (event.input as { path?: string }).path ?? "";
|
|
121
|
+
|
|
122
|
+
// Allow .planning/ edits (GSD state management)
|
|
123
|
+
if (filePath.includes(".planning/")) return undefined;
|
|
124
|
+
|
|
125
|
+
// Allow common config/docs files that don't need GSD tracking
|
|
126
|
+
const allowed = [
|
|
127
|
+
/\.gitignore$/,
|
|
128
|
+
/\.env/,
|
|
129
|
+
/AGENTS\.md$/,
|
|
130
|
+
/settings\.json$/,
|
|
131
|
+
/gsd-hooks\.ts$/,
|
|
132
|
+
];
|
|
133
|
+
if (allowed.some((p) => p.test(filePath))) return undefined;
|
|
134
|
+
|
|
135
|
+
// Only activate when GSD project has workflow_guard enabled
|
|
136
|
+
const configPath = join(ctx.cwd, ".planning", "config.json");
|
|
137
|
+
if (!existsSync(configPath)) return undefined; // No GSD project
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
const config = JSON.parse(readFileSync(configPath, "utf8")) as {
|
|
141
|
+
hooks?: { workflow_guard?: boolean };
|
|
142
|
+
};
|
|
143
|
+
if (!config.hooks?.workflow_guard) return undefined; // Guard disabled (default)
|
|
144
|
+
} catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Advisory only - never block tool execution
|
|
149
|
+
const fileName = filePath.split("/").pop() ?? filePath;
|
|
150
|
+
ctx.ui.notify(
|
|
151
|
+
`⚠️ GSD: Editing ${fileName} outside a GSD workflow. Consider /gsd-fast or /gsd-quick to maintain state tracking.`,
|
|
152
|
+
"info",
|
|
153
|
+
);
|
|
154
|
+
} catch {
|
|
155
|
+
/* silent fail - never block tool execution */
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return undefined;
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// ── tool_result: context usage monitor ───────────────────────────────────
|
|
162
|
+
const WARNING_THRESHOLD = 35; // warn when remaining % ≤ 35
|
|
163
|
+
const CRITICAL_THRESHOLD = 25; // critical when remaining % ≤ 25
|
|
164
|
+
const DEBOUNCE_CALLS = 5; // minimum tool uses between repeated warnings
|
|
165
|
+
|
|
166
|
+
let callsSinceWarn = 0;
|
|
167
|
+
let lastLevel: "warning" | "critical" | null = null;
|
|
168
|
+
|
|
169
|
+
pi.on("tool_result", async (_event, ctx) => {
|
|
170
|
+
try {
|
|
171
|
+
const usage: ContextUsage | undefined = ctx.getContextUsage();
|
|
172
|
+
if (!usage || usage.percent === null) return undefined;
|
|
173
|
+
|
|
174
|
+
const usedPct = Math.round(usage.percent);
|
|
175
|
+
const remaining = 100 - usedPct;
|
|
176
|
+
|
|
177
|
+
// Below warning threshold - just increment debounce counter
|
|
178
|
+
if (remaining > WARNING_THRESHOLD) {
|
|
179
|
+
callsSinceWarn++;
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Respect opt-out via project config
|
|
184
|
+
const configPath = join(ctx.cwd, ".planning", "config.json");
|
|
185
|
+
if (existsSync(configPath)) {
|
|
186
|
+
try {
|
|
187
|
+
const config = JSON.parse(readFileSync(configPath, "utf8")) as {
|
|
188
|
+
hooks?: { context_warnings?: boolean };
|
|
189
|
+
};
|
|
190
|
+
if (config.hooks?.context_warnings === false) return undefined;
|
|
191
|
+
} catch {
|
|
192
|
+
/* ignore config errors */
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const isCritical = remaining <= CRITICAL_THRESHOLD;
|
|
197
|
+
const currentLevel: "warning" | "critical" = isCritical
|
|
198
|
+
? "critical"
|
|
199
|
+
: "warning";
|
|
200
|
+
|
|
201
|
+
callsSinceWarn++;
|
|
202
|
+
|
|
203
|
+
// Debounce - allow severity escalation (warning → critical bypasses debounce)
|
|
204
|
+
const severityEscalated =
|
|
205
|
+
currentLevel === "critical" && lastLevel === "warning";
|
|
206
|
+
if (
|
|
207
|
+
lastLevel !== null &&
|
|
208
|
+
callsSinceWarn < DEBOUNCE_CALLS &&
|
|
209
|
+
!severityEscalated
|
|
210
|
+
) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
callsSinceWarn = 0;
|
|
215
|
+
lastLevel = currentLevel;
|
|
216
|
+
|
|
217
|
+
const isGsdActive = existsSync(join(ctx.cwd, ".planning", "STATE.md"));
|
|
218
|
+
|
|
219
|
+
let msg: string;
|
|
220
|
+
if (isCritical) {
|
|
221
|
+
msg = isGsdActive
|
|
222
|
+
? `🔴 CONTEXT CRITICAL: ${usedPct}% used (${remaining}% left). GSD state is in STATE.md. Inform user to run /gsd-pause-work.`
|
|
223
|
+
: `🔴 CONTEXT CRITICAL: ${usedPct}% used (${remaining}% left). Inform user context is nearly exhausted.`;
|
|
224
|
+
} else {
|
|
225
|
+
msg = isGsdActive
|
|
226
|
+
? `⚠️ CONTEXT WARNING: ${usedPct}% used (${remaining}% left). Avoid starting new complex work.`
|
|
227
|
+
: `⚠️ CONTEXT WARNING: ${usedPct}% used (${remaining}% left). Context is getting limited.`;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
ctx.ui.notify(msg, isCritical ? "error" : "info");
|
|
231
|
+
} catch {
|
|
232
|
+
/* silent fail - never throw from tool_result */
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return undefined;
|
|
236
|
+
});
|
|
237
237
|
}
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](#skills)
|
|
8
8
|
|
|
9
|
-
GSD is a structured software-delivery framework for AI coding agents. It wraps any AI coding session with a six-step phase lifecycle, 57 slash commands, 18 specialized subagents, background hooks, and model profiles
|
|
9
|
+
GSD is a structured software-delivery framework for AI coding agents. It wraps any AI coding session with a six-step phase lifecycle, 57 slash commands, 18 specialized subagents, background hooks, and model profiles - all backed by a git-committed `.planning/` directory that survives context resets.
|
|
10
10
|
|
|
11
11
|
This package installs GSD into your project for pi (and optionally Claude Code, Gemini CLI, Cursor, Windsurf, OpenCode, Codex, and GitHub Copilot) automatically on `npm install`.
|
|
12
12
|
|
|
@@ -39,7 +39,7 @@ After install, run your first GSD command:
|
|
|
39
39
|
| Artifact | Count | Description |
|
|
40
40
|
| ---------- | ----: | ----------------------------------------------------------------- |
|
|
41
41
|
| Skills | 57 | pi skill definitions (`/gsd-*`) loaded automatically |
|
|
42
|
-
| CLI binary | 1 | `gsd-tools`
|
|
42
|
+
| CLI binary | 1 | `pi-gsd-tools` - state management, scaffolding, model routing |
|
|
43
43
|
| Hooks | 5 | Background hooks (context monitor, workflow guard, statusline, …) |
|
|
44
44
|
|
|
45
45
|
---
|
|
@@ -56,7 +56,7 @@ After install, run your first GSD command:
|
|
|
56
56
|
└─► (next phase or /gsd-complete-milestone)
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
All project state lives in `.planning/`
|
|
59
|
+
All project state lives in `.planning/` - committed to git, survives `/clear` and context resets.
|
|
60
60
|
|
|
61
61
|
---
|
|
62
62
|
|
|
@@ -77,26 +77,26 @@ Run `/gsd-help` for the full list with descriptions.
|
|
|
77
77
|
|
|
78
78
|
---
|
|
79
79
|
|
|
80
|
-
## CLI: `gsd-tools`
|
|
80
|
+
## CLI: `pi-gsd-tools`
|
|
81
81
|
|
|
82
|
-
The `gsd-tools` binary is the runtime backbone called by GSD workflow files. It manages all `.planning/` state. You rarely need to call it directly, but it's available:
|
|
82
|
+
The `pi-gsd-tools` binary is the runtime backbone called by GSD workflow files. It manages all `.planning/` state. You rarely need to call it directly, but it's available:
|
|
83
83
|
|
|
84
84
|
```sh
|
|
85
|
-
gsd-tools state json # dump current STATE.md as JSON
|
|
86
|
-
gsd-tools state update <field> <value> # update a state field
|
|
87
|
-
gsd-tools find-phase <N> # locate a phase directory
|
|
88
|
-
gsd-tools roadmap analyze # analyse ROADMAP.md structure
|
|
89
|
-
gsd-tools validate health --repair # check and auto-repair .planning/
|
|
90
|
-
gsd-tools stats json # project statistics
|
|
91
|
-
gsd-tools progress json # progress summary
|
|
92
|
-
gsd-tools commit "message" --files a b c # commit with GSD tracking
|
|
85
|
+
pi-gsd-tools state json # dump current STATE.md as JSON
|
|
86
|
+
pi-gsd-tools state update <field> <value> # update a state field
|
|
87
|
+
pi-gsd-tools find-phase <N> # locate a phase directory
|
|
88
|
+
pi-gsd-tools roadmap analyze # analyse ROADMAP.md structure
|
|
89
|
+
pi-gsd-tools validate health --repair # check and auto-repair .planning/
|
|
90
|
+
pi-gsd-tools stats json # project statistics
|
|
91
|
+
pi-gsd-tools progress json # progress summary
|
|
92
|
+
pi-gsd-tools commit "message" --files a b c # commit with GSD tracking
|
|
93
93
|
|
|
94
94
|
# Output formatting (pi-native)
|
|
95
|
-
gsd-tools state json --output toon # pretty-print with toon renderer
|
|
96
|
-
gsd-tools state json --pick phase # extract a single field
|
|
95
|
+
pi-gsd-tools state json --output toon # pretty-print with toon renderer
|
|
96
|
+
pi-gsd-tools state json --pick phase # extract a single field
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
Run `gsd-tools --help` for the full command reference.
|
|
99
|
+
Run `pi-gsd-tools --help` for the full command reference.
|
|
100
100
|
|
|
101
101
|
---
|
|
102
102
|
|
|
@@ -106,8 +106,8 @@ GSD routes subagents to different models based on your active profile:
|
|
|
106
106
|
|
|
107
107
|
| Profile | Description |
|
|
108
108
|
| ---------- | ----------------------------------------------------- |
|
|
109
|
-
| `quality` | Maximum reasoning
|
|
110
|
-
| `balanced` | Default
|
|
109
|
+
| `quality` | Maximum reasoning - Opus/Pro for all decision agents |
|
|
110
|
+
| `balanced` | Default - Sonnet/Flash tier, good cost/quality ratio |
|
|
111
111
|
| `budget` | Cheapest available model per agent |
|
|
112
112
|
| `inherit` | Use the session's currently selected model everywhere |
|
|
113
113
|
|
|
@@ -117,35 +117,36 @@ Switch profile: `/gsd-set-profile <profile>`
|
|
|
117
117
|
|
|
118
118
|
## Comparison with GSD v1.30.0
|
|
119
119
|
|
|
120
|
-
|
|
|
121
|
-
|
|
|
122
|
-
|
|
|
123
|
-
|
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
|
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
|
140
|
-
|
|
|
141
|
-
|
|
142
|
-
|
|
|
120
|
+
| Feature | gsd v1.30 | pi-gsd | Details |
|
|
121
|
+
| -----------------------------------: | :-------: | :----: | :--------------------------------------------------------------------------------------------------- |
|
|
122
|
+
| `.planning/` data format | ✔️ | ✔️ | 100% compatible - projects are portable across tools |
|
|
123
|
+
| Workstreams | ✔️ | ✔️ | Full workstream isolation |
|
|
124
|
+
| 4 model profiles | ✔️ | ✔️ | quality / balanced / budget / inherit |
|
|
125
|
+
| 18 subagents | ✔️ | ✔️ | Identical agent definitions |
|
|
126
|
+
| 57 GSD skills | ✔️ | ✔️ | All commands available via pi ~~skill system~~ prompt dispatcher (_more details below_) |
|
|
127
|
+
| Different skills paths for pi | ✔️ | ⚡ | All 57 skills moved to `.pi/gsd/` to allow for advanced `pi-gsd-tools` usage (_more details below_) |
|
|
128
|
+
| pi harness (`.pi/`) | ❌ | ✔️ | New - GSD installs into pi's config dir |
|
|
129
|
+
| Background hooks (pi) | ❌ | ✔️ | TypeScript extension (`gsd-hooks.ts`) installed via postinstall |
|
|
130
|
+
| Pi session history ingestion | ❌ | ✔️ | `/gsd-profile-user` reads pi JSONL sessions from `~/.pi/agent/sessions/` |
|
|
131
|
+
| `/gsd-setup-pi` onboarding | ❌ | ✔️ | Setup skill for `bun install` where postinstall is skipped (default untrusted behavior) |
|
|
132
|
+
| `gsd-tools` →`pi-gsd-tools` CLI | ✔️ | ⚡ | Same commands basic signatures as original (`gsd-tools`) but enhanced |
|
|
133
|
+
| `[-o\|--output] [toon\|json]` output | ❌ | ⚡ | Token-efficient toon renderer output (or json, if LLM absolutely needs it...) |
|
|
134
|
+
| `[-p\|--pick] {JSONPath}` extraction | ❌ | ⚡ | Field extraction from CLI output |
|
|
135
|
+
| TypeScript source | ❌ | ⚡ | Full TS port of gsd-tools (~9k lines) |
|
|
136
|
+
| Compile-time type safety | ❌ | ⚡ | Fully typed - no `any`, only Zod-inferred types |
|
|
137
|
+
| Runtime validation (Zod) | ❌ | ⚡ | Schema-driven `validate health` with field-path errors |
|
|
138
|
+
| Smarter `--repair` | ❌ | ⚡ | Zod schema defaults fill all missing/invalid fields at once |
|
|
139
|
+
| Instant commands (no LLM cost) | ❌ | 🚧 | `/gsd-progress`, `/gsd-stats`, `/gsd-help`, `/gsd-health` via pi extension commands |
|
|
140
|
+
| Prompt-dispatch for all skills | ❌ | 🚧 | Pi prompt templates replace skill dispatch - clean autocomplete + arg hints |
|
|
141
|
+
|
|
142
|
+
<!-- | Pi harness config entry | ❌ | ✔️ | `HARNESS_CONFIG` pi entry - generates `AGENTS.md` via `/gsd-profile-user` | -->
|
|
143
|
+
<!-- | Toon output in skills | ❌ | ✔️ | `gsd-progress`, `gsd-stats`, `gsd-health` use `--output toon` | -->
|
|
143
144
|
|
|
144
145
|
---
|
|
145
146
|
|
|
146
147
|
## Data Format Compatibility
|
|
147
148
|
|
|
148
|
-
This package is a **faithful port** of GSD v1.30.0. The `.planning/` directory layout, all file formats (`STATE.md`, `ROADMAP.md`, `REQUIREMENTS.md`, `PLAN.md`, `SUMMARY.md`, `UAT.md`), frontmatter schemas, and `gsd-tools` command signatures are **byte-compatible** with the original `get-shit-done-cc` package.
|
|
149
|
+
This package is a **faithful port** of GSD v1.30.0. The `.planning/` directory layout, all file formats (`STATE.md`, `ROADMAP.md`, `REQUIREMENTS.md`, `PLAN.md`, `SUMMARY.md`, `UAT.md`), frontmatter schemas, and `pi-gsd-tools` command signatures are **byte-compatible** with the original `get-shit-done-cc` package.
|
|
149
150
|
|
|
150
151
|
Projects started with the original GSD work without migration.
|
|
151
152
|
|
|
@@ -157,7 +158,7 @@ Projects started with the original GSD work without migration.
|
|
|
157
158
|
# Type-check
|
|
158
159
|
npm run typecheck
|
|
159
160
|
|
|
160
|
-
# Build CLI (TypeScript → dist/gsd-tools.js)
|
|
161
|
+
# Build CLI (TypeScript → dist/pi-gsd-tools.js)
|
|
161
162
|
npm run build
|
|
162
163
|
|
|
163
164
|
# Validate integrity
|
|
@@ -168,4 +169,4 @@ node scripts/validate-model-profiles.cjs
|
|
|
168
169
|
|
|
169
170
|
## License
|
|
170
171
|
|
|
171
|
-
MIT
|
|
172
|
+
MIT - this is an unofficial port. Original GSD by [Get Shit Done](https://github.com/gsd-build/get-shit-done).
|