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.
Files changed (61) hide show
  1. package/.gsd/extensions/gsd-hooks.ts +212 -212
  2. package/README.md +45 -44
  3. package/dist/{gsd-tools.js → pi-gsd-tools.js} +54 -54
  4. package/package.json +6 -6
  5. package/scripts/postinstall.js +253 -293
  6. package/skills/gsd-add-backlog/SKILL.md +3 -3
  7. package/skills/gsd-add-phase/SKILL.md +2 -2
  8. package/skills/gsd-add-tests/SKILL.md +2 -2
  9. package/skills/gsd-add-todo/SKILL.md +2 -2
  10. package/skills/gsd-audit-milestone/SKILL.md +2 -2
  11. package/skills/gsd-audit-uat/SKILL.md +1 -1
  12. package/skills/gsd-autonomous/SKILL.md +4 -4
  13. package/skills/gsd-check-todos/SKILL.md +2 -2
  14. package/skills/gsd-cleanup/SKILL.md +2 -2
  15. package/skills/gsd-complete-milestone/SKILL.md +2 -2
  16. package/skills/gsd-debug/SKILL.md +2 -2
  17. package/skills/gsd-discuss-phase/SKILL.md +6 -6
  18. package/skills/gsd-do/SKILL.md +3 -3
  19. package/skills/gsd-execute-phase/SKILL.md +4 -4
  20. package/skills/gsd-fast/SKILL.md +2 -2
  21. package/skills/gsd-forensics/SKILL.md +2 -2
  22. package/skills/gsd-health/SKILL.md +4 -4
  23. package/skills/gsd-help/SKILL.md +2 -2
  24. package/skills/gsd-insert-phase/SKILL.md +2 -2
  25. package/skills/gsd-list-phase-assumptions/SKILL.md +1 -1
  26. package/skills/gsd-list-workspaces/SKILL.md +3 -3
  27. package/skills/gsd-manager/SKILL.md +4 -4
  28. package/skills/gsd-map-codebase/SKILL.md +1 -1
  29. package/skills/gsd-milestone-summary/SKILL.md +2 -2
  30. package/skills/gsd-new-milestone/SKILL.md +6 -6
  31. package/skills/gsd-new-project/SKILL.md +6 -6
  32. package/skills/gsd-new-workspace/SKILL.md +3 -3
  33. package/skills/gsd-next/SKILL.md +2 -2
  34. package/skills/gsd-note/SKILL.md +3 -3
  35. package/skills/gsd-pause-work/SKILL.md +2 -2
  36. package/skills/gsd-plan-milestone-gaps/SKILL.md +2 -2
  37. package/skills/gsd-plan-phase/SKILL.md +3 -3
  38. package/skills/gsd-plant-seed/SKILL.md +2 -2
  39. package/skills/gsd-pr-branch/SKILL.md +2 -2
  40. package/skills/gsd-profile-user/SKILL.md +2 -2
  41. package/skills/gsd-progress/SKILL.md +4 -4
  42. package/skills/gsd-quick/SKILL.md +2 -2
  43. package/skills/gsd-remove-phase/SKILL.md +2 -2
  44. package/skills/gsd-remove-workspace/SKILL.md +3 -3
  45. package/skills/gsd-research-phase/SKILL.md +3 -3
  46. package/skills/gsd-resume-work/SKILL.md +2 -2
  47. package/skills/gsd-review/SKILL.md +2 -2
  48. package/skills/gsd-review-backlog/SKILL.md +2 -2
  49. package/skills/gsd-session-report/SKILL.md +2 -2
  50. package/skills/gsd-set-profile/SKILL.md +1 -1
  51. package/skills/gsd-settings/SKILL.md +2 -2
  52. package/skills/gsd-setup-pi/SKILL.md +15 -13
  53. package/skills/gsd-ship/SKILL.md +2 -2
  54. package/skills/gsd-stats/SKILL.md +4 -4
  55. package/skills/gsd-thread/SKILL.md +2 -2
  56. package/skills/gsd-ui-phase/SKILL.md +3 -3
  57. package/skills/gsd-ui-review/SKILL.md +3 -3
  58. package/skills/gsd-update/SKILL.md +2 -2
  59. package/skills/gsd-validate-phase/SKILL.md +2 -2
  60. package/skills/gsd-verify-work/SKILL.md +3 -3
  61. package/skills/gsd-workstreams/SKILL.md +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * gsd-hooks.ts GSD pi Extension
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
- // ── 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", "get-shit-done", "VERSION"),
68
- join(homedir(), ".pi", "get-shit-done", "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
- });
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: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
7
  [![skills: 57](https://img.shields.io/badge/skills-57-orange.svg)](#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 all backed by a git-committed `.planning/` directory that survives context resets.
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` state management, scaffolding, model routing |
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/` committed to git, survives `/clear` and context resets.
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 Opus/Pro for all decision agents |
110
- | `balanced` | Default Sonnet/Flash tier, good cost/quality ratio |
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
- | Feature | gsd v1.30 | pi-gsd | Details |
121
- | ---: | :---: | :---: | :--- |
122
- | `.planning/` data format | ✔️ | ✔️ | 100% compatible projects are portable across tools |
123
- | `gsd-tools` CLI | ✔️ | ✔️ | Full TypeScript port, same command signatures |
124
- | 57 GSD skills | ✔️ | ✔️ | All commands available via pi skill system |
125
- | 18 subagents | ✔️ | ✔️ | Identical agent definitions |
126
- | 4 model profiles | ✔️ | ✔️ | quality / balanced / budget / inherit |
127
- | Workstreams | ✔️ | ✔️ | Full workstream isolation |
128
- | Multi-harness install | ✔️ | ✔️ | 8 harnesses via postinstall |
129
- | pi harness (`.pi/`) | | ✔️ | New GSD installs into pi's config dir |
130
- | Background hooks (Claude/Gemini) | ✔️ | ✔️ | All 5 hooks, hardlinked |
131
- | Background hooks (pi) | | ✔️ | TypeScript extension (`gsd-hooks.ts`) installed via postinstall |
132
- | Correct skill paths for pi | ✔️ | ✔️ | All 57 skills use `.pi/get-shit-done/` paths |
133
- | Pi harness config entry | | ✔️ | `HARNESS_CONFIG` pi entry generates `AGENTS.md` via `/gsd-profile-user` |
134
- | `-o toon` output | | ✔️ | Token-efficient toon renderer output |
135
- | `--pick` JSONPath extraction | | ✔️ | Field extraction from CLI output |
136
- | TypeScript source | | ✔️ | Full TS port of gsd-tools (9 k lines) |
137
- | Compile-time type safety | | ✔️ | Fully typed `Record<string, any>` replaced with Zod-inferred types |
138
- | Runtime validation (Zod) | | ✔️ | Schema-driven `validate health` with field-path errors |
139
- | Smarter `--repair` | | ✔️ | Zod schema defaults fill all missing / invalid fields at once |
140
- | Toon output in skills | | ✔️ | `gsd-progress`, `gsd-stats`, `gsd-health` use `--output toon` |
141
- | Pi session history ingestion | ❌ | ✔️ | `/gsd-profile-user` reads pi JSONL sessions from `~/.pi/agent/sessions/` |
142
- | `/gsd-setup-pi` onboarding | | ✔️ | Setup skill for bun installs where postinstall is skipped |
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 this is an unofficial port. Original GSD by [Get Shit Done](https://github.com/gsd-build/get-shit-done).
172
+ MIT - this is an unofficial port. Original GSD by [Get Shit Done](https://github.com/gsd-build/get-shit-done).