pi-gsd 1.11.6 → 1.12.1

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 (46) hide show
  1. package/.gsd/extensions/pi-gsd-hooks.ts +108 -65
  2. package/README.md +2 -4
  3. package/package.json +1 -1
  4. package/prompts/gsd-add-phase.md +1 -1
  5. package/prompts/gsd-add-tests.md +1 -1
  6. package/prompts/gsd-add-todo.md +1 -1
  7. package/prompts/gsd-audit-milestone.md +1 -1
  8. package/prompts/gsd-audit-uat.md +1 -1
  9. package/prompts/gsd-autonomous.md +2 -2
  10. package/prompts/gsd-check-todos.md +1 -1
  11. package/prompts/gsd-cleanup.md +1 -1
  12. package/prompts/gsd-discuss-phase.md +3 -3
  13. package/prompts/gsd-do.md +2 -2
  14. package/prompts/gsd-execute-milestone.md +5 -5
  15. package/prompts/gsd-execute-phase.md +2 -2
  16. package/prompts/gsd-fast.md +1 -1
  17. package/prompts/gsd-forensics.md +1 -1
  18. package/prompts/gsd-insert-phase.md +1 -1
  19. package/prompts/gsd-list-phase-assumptions.md +1 -1
  20. package/prompts/gsd-list-workspaces.md +1 -1
  21. package/prompts/gsd-manager.md +1 -1
  22. package/prompts/gsd-map-codebase.md +1 -1
  23. package/prompts/gsd-milestone-summary.md +1 -1
  24. package/prompts/gsd-new-milestone.md +5 -5
  25. package/prompts/gsd-new-project.md +5 -5
  26. package/prompts/gsd-new-workspace.md +1 -1
  27. package/prompts/gsd-note.md +1 -1
  28. package/prompts/gsd-pause-work.md +1 -1
  29. package/prompts/gsd-plan-milestone-gaps.md +1 -1
  30. package/prompts/gsd-plan-milestone.md +4 -4
  31. package/prompts/gsd-plan-phase.md +2 -2
  32. package/prompts/gsd-plant-seed.md +1 -1
  33. package/prompts/gsd-pr-branch.md +1 -1
  34. package/prompts/gsd-profile-user.md +1 -1
  35. package/prompts/gsd-quick.md +1 -1
  36. package/prompts/gsd-remove-phase.md +1 -1
  37. package/prompts/gsd-remove-workspace.md +1 -1
  38. package/prompts/gsd-resume-work.md +1 -1
  39. package/prompts/gsd-review.md +1 -1
  40. package/prompts/gsd-session-report.md +1 -1
  41. package/prompts/gsd-settings.md +1 -1
  42. package/prompts/gsd-ship.md +1 -1
  43. package/prompts/gsd-ui-phase.md +2 -2
  44. package/prompts/gsd-ui-review.md +2 -2
  45. package/prompts/gsd-validate-phase.md +1 -1
  46. package/prompts/gsd-verify-work.md +2 -2
@@ -76,102 +76,148 @@ const ensureHarnessSymlink = (cwd: string): void => {
76
76
  }
77
77
  };
78
78
 
79
- const syncReferenceToCore = (cwd: string, ref: string[]): void => {
80
- try {
81
- const refsDir = join(cwd, ".pi", "gsd", "references");
82
- const refName = ref.join("-") + ".md";
83
- const coreName = [...ref, "core"].join("-") + ".md";
84
- const src = join(refsDir, refName);
85
- const dst = join(refsDir, coreName);
86
- if (!existsSync(src)) return;
87
- const srcMtime = statSync(src).mtimeMs;
88
- const dstMtime = existsSync(dst) ? statSync(dst).mtimeMs : 0;
89
- if (srcMtime <= dstMtime) return; // already in sync
90
- const content = readFileSync(src, "utf8");
91
- const match = content.match(/<core>([\s\S]*?)<\/core>/i);
92
- writeFileSync(dst, match ? match[1].trim() : content, "utf8");
93
- } catch {
94
- /* silent — never block session startup or tool execution */
95
- }
96
- };
97
79
 
98
80
  export default function (pi: ExtensionAPI) {
99
- // ── input: inject @file contents before the LLM sees the message ──────────
100
- // Replaces @.pi/gsd/... and @.planning/... references with actual file
101
- // contents programmatically. Zero tool calls, provider-agnostic.
102
- // Missing files → red error + action:"handled" skips the LLM entirely.
81
+ // ── input: <gsd-include> injection ───────────────────────────────────
82
+ // Replaces <gsd-include path="..." /> tags with actual file contents.
83
+ // Supports selectors: tag:NAME, heading:TEXT, lines:N-M
84
+ // Valid chains: tag|heading, tag|lines, heading|lines, heading|tag
85
+ // On ANY failure: red error + abort (action:"handled"). No partial injection.
103
86
  pi.on("input", async (event, ctx) => {
104
- ctx.ui.notify(`[GSD:input] FIRED. source=${event.source} text.len=${event.text?.length ?? "undef"} text.start=${JSON.stringify((event.text ?? "").slice(0, 120))}`, "info");
105
-
106
- if (event.source === "extension") {
107
- ctx.ui.notify("[GSD:input] SKIP: source=extension", "info");
108
- return { action: "continue" };
109
- }
87
+ if (event.source === "extension") return { action: "continue" };
110
88
 
111
89
  const text = event.text;
112
- const fileRefPattern = /@(\.pi\/gsd\/[^\s]+|\.planning\/[^\s]+)/g;
113
- const refs = [...text.matchAll(fileRefPattern)];
114
- ctx.ui.notify(`[GSD:input] refs found: ${refs.length}. Matches: ${refs.map(m => m[0]).join(", ") || "NONE"}`, "info");
90
+ ctx.ui.notify(`[GSD:DBG] text.len=${text?.length} first200=${JSON.stringify((text ?? "").slice(0, 200))}`, "info");
115
91
 
116
- if (refs.length === 0) return { action: "continue" };
92
+ const includePattern = /<gsd-include\s+path="([^"]+)"(?:\s+select="([^"]*)")?\s*\/>/g;
93
+ const includes = [...text.matchAll(includePattern)];
94
+ ctx.ui.notify(`[GSD:DBG] includes=${includes.length}`, "info");
95
+ if (includes.length === 0) return { action: "continue" };
117
96
 
97
+ // Package harness fallback path
118
98
  const extFile = typeof __filename !== "undefined" ? __filename : "";
119
- ctx.ui.notify(`[GSD:input] __filename=${extFile || "UNDEFINED"}`, "info");
120
- const pkgHarness = extFile ? join(dirname(extFile), "..", "harnesses", "pi", "get-shit-done") : "";
121
- ctx.ui.notify(`[GSD:input] pkgHarness=${pkgHarness || "EMPTY"} exists=${pkgHarness ? existsSync(pkgHarness) : false}`, "info");
122
- ctx.ui.notify(`[GSD:input] cwd=${ctx.cwd}`, "info");
99
+ const pkgHarness = extFile
100
+ ? join(dirname(extFile), "..", "harnesses", "pi", "get-shit-done")
101
+ : "";
123
102
 
124
- const failed: string[] = [];
103
+ const errors: string[] = [];
125
104
  let transformed = text;
126
105
 
127
- for (const match of refs) {
128
- const relPath = match[1];
129
- const subPath = relPath.replace(/^\.pi\/gsd\//, "");
106
+ for (const match of includes) {
107
+ const fullMatch = match[0];
108
+ const filePath = match[1];
109
+ const selectExpr = match[2] ?? "";
130
110
 
111
+ // ── Resolve file path ───────────────────────────────────────
112
+ const subPath = filePath.replace(/^\.pi\/gsd\//, "");
131
113
  const candidates = [
132
- join(ctx.cwd, relPath),
133
- ...(relPath.startsWith(".pi/gsd/") ? [join(pkgHarness, subPath)] : []),
114
+ join(ctx.cwd, filePath),
115
+ ...(filePath.startsWith(".pi/gsd/") && pkgHarness
116
+ ? [join(pkgHarness, subPath)]
117
+ : []),
134
118
  ];
135
- ctx.ui.notify(`[GSD:input] ref=${relPath} candidates=${JSON.stringify(candidates)} exists=${candidates.map(c => existsSync(c))}`, "info");
136
119
 
137
- let fileContent: string | null = null;
138
- for (const candidate of candidates) {
120
+ let raw: string | null = null;
121
+ for (const c of candidates) {
139
122
  try {
140
- if (existsSync(candidate)) {
141
- fileContent = readFileSync(candidate, "utf8");
142
- ctx.ui.notify(`[GSD:input] FOUND ${candidate} (${fileContent.length} bytes)`, "info");
123
+ if (existsSync(c)) { raw = readFileSync(c, "utf8"); break; }
124
+ } catch { /* try next */ }
125
+ }
126
+ if (raw === null) {
127
+ errors.push(`File not found: ${filePath}`);
128
+ continue;
129
+ }
130
+
131
+ // ── Apply selector ─────────────────────────────────────────
132
+ let result = raw;
133
+ if (selectExpr) {
134
+ const parts = selectExpr.split("|");
135
+ if (parts.length > 2) {
136
+ errors.push(`Invalid selector (max 2 segments): ${selectExpr}`);
137
+ continue;
138
+ }
139
+ // lines: must be standalone — reject any chain involving lines
140
+ if (parts.length > 1 && parts.some((p) => p.trim().startsWith("lines:"))) {
141
+ errors.push(`lines: cannot be chained — use it alone: ${selectExpr}`);
142
+ continue;
143
+ }
144
+
145
+ for (let i = 0; i < parts.length; i++) {
146
+ const part = parts[i].trim();
147
+ const prev = i > 0 ? parts[i - 1].trim().split(":")[0] : null;
148
+
149
+ if (part.startsWith("tag:")) {
150
+ const tagName = part.slice(4);
151
+ const tagRe = new RegExp(
152
+ `<${tagName}>([\\s\\S]*?)</${tagName}>`,
153
+ "i",
154
+ );
155
+ const tagMatch = result.match(tagRe);
156
+ if (!tagMatch) {
157
+ errors.push(`Tag <${tagName}> not found in ${filePath}`);
158
+ result = "";
159
+ break;
160
+ }
161
+ result = tagMatch[1].trim();
162
+
163
+ } else if (part.startsWith("heading:")) {
164
+ const headingText = part.slice(8);
165
+ const headingRe = new RegExp(
166
+ `(^|\\n)(#{1,6})\\s+${headingText.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&")}\\s*\\n`,
167
+ );
168
+ const hMatch = result.match(headingRe);
169
+ if (!hMatch) {
170
+ errors.push(`Heading \"${headingText}\" not found in ${filePath}`);
171
+ result = "";
172
+ break;
173
+ }
174
+ const level = hMatch[2].length;
175
+ const startIdx = (hMatch.index ?? 0) + hMatch[0].length;
176
+ const nextHeading = result.slice(startIdx).search(
177
+ new RegExp(`\\n#{1,${level}}\\s`),
178
+ );
179
+ result = nextHeading === -1
180
+ ? result.slice(startIdx).trim()
181
+ : result.slice(startIdx, startIdx + nextHeading).trim();
182
+
183
+ } else if (part.startsWith("lines:")) {
184
+ const rangeMatch = part.match(/^lines:(\d+)-(\d+)$/);
185
+ if (!rangeMatch) {
186
+ errors.push(`Invalid lines selector: ${part}`);
187
+ result = "";
188
+ break;
189
+ }
190
+ const start = parseInt(rangeMatch[1], 10) - 1;
191
+ const end = parseInt(rangeMatch[2], 10);
192
+ result = result.split("\n").slice(start, end).join("\n");
193
+
194
+ } else {
195
+ errors.push(`Unknown selector: ${part}`);
196
+ result = "";
143
197
  break;
144
198
  }
145
- } catch (e) {
146
- ctx.ui.notify(`[GSD:input] ERROR reading ${candidate}: ${e}`, "error");
147
199
  }
200
+ if (result === "") continue; // error already logged
148
201
  }
149
202
 
150
- if (fileContent === null) {
151
- ctx.ui.notify(`[GSD:input] FAILED: ${relPath} — no candidate found`, "error");
152
- failed.push(relPath);
153
- } else {
154
- transformed = transformed.replace(match[0], fileContent);
155
- }
203
+ transformed = transformed.replace(fullMatch, result);
156
204
  }
157
205
 
158
- if (failed.length > 0) {
159
- ctx.ui.notify(
160
- `❌ GSD context injection failed — missing files:\n${failed.map((f) => ` • ${f}`).join("\n")}\n\nRun /gsd-setup-pi to reinstall the harness.`,
206
+ if (errors.length > 0) {
207
+ ctx.ui.notify("\u274c GSD include failed:\n" + errors.map((e) => " \u2022 " + e).join("\n"),
161
208
  "error",
162
209
  );
163
- return { action: "handled" }; // skip LLM entirely
210
+ return { action: "handled" };
164
211
  }
165
212
 
166
213
  return { action: "transform", text: transformed };
167
214
  });
215
+
168
216
  // ── session_start: GSD update check ──────────────────────────────────────
169
217
  pi.on("session_start", async (_event, ctx) => {
170
218
  // Ensure harness files are reachable via .pi/gsd/ symlink
171
219
  ensureHarnessSymlink(ctx.cwd);
172
220
 
173
- // Sync derived core files from tagged reference sources
174
- syncReferenceToCore(ctx.cwd, ["ui", "brand"]);
175
221
 
176
222
  try {
177
223
  const cacheDir = join(homedir(), ".pi", "cache");
@@ -677,9 +723,6 @@ export default function (pi: ExtensionAPI) {
677
723
  let lastLevel: "warning" | "critical" | null = null;
678
724
 
679
725
  pi.on("tool_result", async (_event, ctx) => {
680
- // Keep derived core files in sync after any tool write (e.g. gsd-new-project
681
- // creating ui-brand.md mid-session — no reboot needed)
682
- syncReferenceToCore(ctx.cwd, ["ui", "brand"]);
683
726
 
684
727
  try {
685
728
  const usage: ContextUsage | undefined = ctx.getContextUsage();
package/README.md CHANGED
@@ -139,10 +139,8 @@ Switch profile: `/gsd-set-profile <profile>`
139
139
  | Instant commands (no LLM cost) | ❌ | ✔️ | `/gsd-progress`, `/gsd-stats`, `/gsd-health`, `/gsd-help`, `/gsd-next` - zero LLM, editor pivot |
140
140
  | `/gsd-next` auto-advance | ❌ | ✔️ | Deterministic phase routing, pre-fills editor with the correct next command |
141
141
  | Prompt-dispatch for all skills | ❌ | ✔️ | 54 pi prompt templates - clean autocomplete, arg hints, direct workflow dispatch |
142
- | `ui-brand` context modularity | ❌ | ✔️ | `<core>` tag splits ui-brand.md planning gets 103 lines, UI commands get full 166 |
143
- | `syncReferenceToCore` utility | ❌ | ✔️ | Auto-derives `-core.md` from any `<core>`-tagged reference; syncs on session start + after tool writes |
144
- | Programmatic `@file` injection | ❌ | ✔️ | Extension intercepts `@.pi/gsd/...` refs, injects file contents before LLM sees them — zero tool calls |
145
- | Auto harness symlink + self-repair | ❌ | ✔️ | `.pi/gsd/` → package harness; detects stale dirs, replaces with symlink; fallback to package root |
142
+ | `<gsd-include>` context injection | ❌ | ✔️ | `<gsd-include path select>` replaces file refs before LLM sees them selectors: tag, heading, lines |
143
+ | Auto harness symlink + self-repair | ❌ | ✔️ | `.pi/gsd/` package harness; detects stale dirs, replaces with symlink; fallback to package root |
146
144
  | `/gsd-plan-milestone` command | ❌ | ✔️ | Plan all unplanned phases - one mode question, scope pre-check per phase, context-safe checkpoint |
147
145
  | `/gsd-execute-milestone` command | ❌ | ✔️ | Execute all phases + scope guardian + auto gap/debt retry loop (insert-phase) + audit→complete→cleanup |
148
146
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-gsd",
3
- "version": "1.11.6",
3
+ "version": "1.12.1",
4
4
  "description": "Get Shit Done - Unofficial port of the renowned AI-native project-planning spec-driven toolkit",
5
5
  "main": "dist/pi-gsd-tools.js",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Add phase to end of current milestone in roadmap
3
3
  ---
4
- @.pi/gsd/workflows/add-phase.md
4
+ <gsd-include path=".pi/gsd/workflows/add-phase.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Generate tests for a completed phase based on UAT criteria and implementation
3
3
  ---
4
- @.pi/gsd/workflows/add-tests.md
4
+ <gsd-include path=".pi/gsd/workflows/add-tests.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Capture idea or task as todo from current conversation context
3
3
  ---
4
- @.pi/gsd/workflows/add-todo.md
4
+ <gsd-include path=".pi/gsd/workflows/add-todo.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Audit milestone completion against original intent before archiving
3
3
  ---
4
- @.pi/gsd/workflows/audit-milestone.md
4
+ <gsd-include path=".pi/gsd/workflows/audit-milestone.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Cross-phase audit of all outstanding UAT and verification items
3
3
  ---
4
- @.pi/gsd/workflows/audit-uat.md
4
+ <gsd-include path=".pi/gsd/workflows/audit-uat.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Run all remaining phases autonomously - discuss→plan→execute per phase
3
3
  ---
4
- @.pi/gsd/workflows/autonomous.md
5
- @.pi/gsd/references/ui-brand-core.md
4
+ <gsd-include path=".pi/gsd/workflows/autonomous.md" />
5
+ <gsd-include path=".pi/gsd/references/ui-brand.md" select="tag:core" />
6
6
 
7
7
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: List pending todos and select one to work on
3
3
  ---
4
- @.pi/gsd/workflows/check-todos.md
4
+ <gsd-include path=".pi/gsd/workflows/check-todos.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Archive accumulated phase directories from completed milestones
3
3
  ---
4
- @.pi/gsd/workflows/cleanup.md
4
+ <gsd-include path=".pi/gsd/workflows/cleanup.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  description: Gather phase context through adaptive questioning before planning. Use --auto to skip interactive questions (the agent picks recommended defaults).
3
3
  ---
4
- @.pi/gsd/workflows/discuss-phase.md
5
- @.pi/gsd/workflows/discuss-phase-assumptions.md
6
- @.pi/gsd/templates/context.md
4
+ <gsd-include path=".pi/gsd/workflows/discuss-phase.md" />
5
+ <gsd-include path=".pi/gsd/workflows/discuss-phase-assumptions.md" />
6
+ <gsd-include path=".pi/gsd/templates/context.md" />
7
7
 
8
8
  $ARGUMENTS
package/prompts/gsd-do.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Route freeform text to the right GSD command automatically
3
3
  ---
4
- @.pi/gsd/workflows/do.md
5
- @.pi/gsd/references/ui-brand-core.md
4
+ <gsd-include path=".pi/gsd/workflows/do.md" />
5
+ <gsd-include path=".pi/gsd/references/ui-brand.md" select="tag:core" />
6
6
 
7
7
  $ARGUMENTS
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  description: Execute all planned phases + full lifecycle (audit→complete→cleanup), scope guardian, UAT gates, worktree isolation
3
3
  ---
4
- @.pi/gsd/workflows/execute-milestone.md
5
- @.pi/gsd/references/ui-brand.md
6
- @.planning/REQUIREMENTS.md
7
- @.planning/ROADMAP.md
8
- @.planning/STATE.md
4
+ <gsd-include path=".pi/gsd/workflows/execute-milestone.md" />
5
+ <gsd-include path=".pi/gsd/references/ui-brand.md" />
6
+ <gsd-include path=".planning/REQUIREMENTS.md" />
7
+ <gsd-include path=".planning/ROADMAP.md" />
8
+ <gsd-include path=".planning/STATE.md" />
9
9
 
10
10
  $ARGUMENTS
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Execute all plans in a phase with wave-based parallelization
3
3
  ---
4
- @.pi/gsd/workflows/execute-phase.md
5
- @.pi/gsd/references/ui-brand.md
4
+ <gsd-include path=".pi/gsd/workflows/execute-phase.md" />
5
+ <gsd-include path=".pi/gsd/references/ui-brand.md" />
6
6
 
7
7
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Execute a trivial task inline - no subagents, no planning overhead
3
3
  ---
4
- @.pi/gsd/workflows/fast.md
4
+ <gsd-include path=".pi/gsd/workflows/fast.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Post-mortem investigation for failed GSD workflows - analyzes git history, artifacts, and state to diagnose what went wrong
3
3
  ---
4
- @.pi/gsd/workflows/forensics.md
4
+ <gsd-include path=".pi/gsd/workflows/forensics.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Insert urgent work as decimal phase (e.g., 72.1) between existing phases
3
3
  ---
4
- @.pi/gsd/workflows/insert-phase.md
4
+ <gsd-include path=".pi/gsd/workflows/insert-phase.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Surface the agent's assumptions about a phase approach before planning
3
3
  ---
4
- @.pi/gsd/workflows/list-phase-assumptions.md
4
+ <gsd-include path=".pi/gsd/workflows/list-phase-assumptions.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: List active GSD workspaces and their status
3
3
  ---
4
- @.pi/gsd/workflows/list-workspaces.md
4
+ <gsd-include path=".pi/gsd/workflows/list-workspaces.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Interactive command center for managing multiple phases from one terminal
3
3
  ---
4
- @.pi/gsd/workflows/manager.md
4
+ <gsd-include path=".pi/gsd/workflows/manager.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Analyze codebase with parallel mapper agents to produce .planning/codebase/ documents
3
3
  ---
4
- @.pi/gsd/workflows/map-codebase.md
4
+ <gsd-include path=".pi/gsd/workflows/map-codebase.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Generate a comprehensive project summary from milestone artifacts for team onboarding and review
3
3
  ---
4
- @.pi/gsd/workflows/milestone-summary.md
4
+ <gsd-include path=".pi/gsd/workflows/milestone-summary.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  description: Start a new milestone cycle - update PROJECT.md and route to requirements
3
3
  ---
4
- @.pi/gsd/workflows/new-milestone.md
5
- @.pi/gsd/references/questioning.md
6
- @.pi/gsd/references/ui-brand-core.md
7
- @.pi/gsd/templates/project.md
8
- @.pi/gsd/templates/requirements.md
4
+ <gsd-include path=".pi/gsd/workflows/new-milestone.md" />
5
+ <gsd-include path=".pi/gsd/references/questioning.md" />
6
+ <gsd-include path=".pi/gsd/references/ui-brand.md" select="tag:core" />
7
+ <gsd-include path=".pi/gsd/templates/project.md" />
8
+ <gsd-include path=".pi/gsd/templates/requirements.md" />
9
9
 
10
10
  $ARGUMENTS
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  description: Initialize a new project with deep context gathering and PROJECT.md
3
3
  ---
4
- @.pi/gsd/workflows/new-project.md
5
- @.pi/gsd/references/questioning.md
6
- @.pi/gsd/references/ui-brand-core.md
7
- @.pi/gsd/templates/project.md
8
- @.pi/gsd/templates/requirements.md
4
+ <gsd-include path=".pi/gsd/workflows/new-project.md" />
5
+ <gsd-include path=".pi/gsd/references/questioning.md" />
6
+ <gsd-include path=".pi/gsd/references/ui-brand.md" select="tag:core" />
7
+ <gsd-include path=".pi/gsd/templates/project.md" />
8
+ <gsd-include path=".pi/gsd/templates/requirements.md" />
9
9
 
10
10
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Create an isolated workspace with repo copies and independent .planning/
3
3
  ---
4
- @.pi/gsd/workflows/new-workspace.md
4
+ <gsd-include path=".pi/gsd/workflows/new-workspace.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Zero-friction idea capture. Append, list, or promote notes to todos.
3
3
  ---
4
- @.pi/gsd/workflows/note.md
4
+ <gsd-include path=".pi/gsd/workflows/note.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Create context handoff when pausing work mid-phase
3
3
  ---
4
- @.pi/gsd/workflows/pause-work.md
4
+ <gsd-include path=".pi/gsd/workflows/pause-work.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Create phases to close all gaps identified by milestone audit
3
3
  ---
4
- @.pi/gsd/workflows/plan-milestone-gaps.md
4
+ <gsd-include path=".pi/gsd/workflows/plan-milestone-gaps.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  description: Plan all unplanned phases in the current milestone — one mode question, scope pre-check per phase, context-safe checkpointing
3
3
  ---
4
- @.pi/gsd/workflows/plan-milestone.md
5
- @.pi/gsd/references/ui-brand-core.md
6
- @.planning/REQUIREMENTS.md
7
- @.planning/ROADMAP.md
4
+ <gsd-include path=".pi/gsd/workflows/plan-milestone.md" />
5
+ <gsd-include path=".pi/gsd/references/ui-brand.md" select="tag:core" />
6
+ <gsd-include path=".planning/REQUIREMENTS.md" />
7
+ <gsd-include path=".planning/ROADMAP.md" />
8
8
 
9
9
  $ARGUMENTS
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Create detailed phase plan (PLAN.md) with verification loop
3
3
  ---
4
- @.pi/gsd/workflows/plan-phase.md
5
- @.pi/gsd/references/ui-brand-core.md
4
+ <gsd-include path=".pi/gsd/workflows/plan-phase.md" />
5
+ <gsd-include path=".pi/gsd/references/ui-brand.md" select="tag:core" />
6
6
 
7
7
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Capture a forward-looking idea with trigger conditions - surfaces automatically at the right milestone
3
3
  ---
4
- @.pi/gsd/workflows/plant-seed.md
4
+ <gsd-include path=".pi/gsd/workflows/plant-seed.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Create a clean PR branch by filtering out .planning/ commits - ready for code review
3
3
  ---
4
- @.pi/gsd/workflows/pr-branch.md
4
+ <gsd-include path=".pi/gsd/workflows/pr-branch.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Generate developer behavioral profile and create Claude-discoverable artifacts
3
3
  ---
4
- @.pi/gsd/workflows/profile-user.md
4
+ <gsd-include path=".pi/gsd/workflows/profile-user.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agents
3
3
  ---
4
- @.pi/gsd/workflows/quick.md
4
+ <gsd-include path=".pi/gsd/workflows/quick.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Remove a future phase from roadmap and renumber subsequent phases
3
3
  ---
4
- @.pi/gsd/workflows/remove-phase.md
4
+ <gsd-include path=".pi/gsd/workflows/remove-phase.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Remove a GSD workspace and clean up worktrees
3
3
  ---
4
- @.pi/gsd/workflows/remove-workspace.md
4
+ <gsd-include path=".pi/gsd/workflows/remove-workspace.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Resume work from previous session with full context restoration
3
3
  ---
4
- @.pi/gsd/workflows/resume-project.md
4
+ <gsd-include path=".pi/gsd/workflows/resume-project.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Request cross-AI peer review of phase plans from external AI CLIs
3
3
  ---
4
- @.pi/gsd/workflows/review.md
4
+ <gsd-include path=".pi/gsd/workflows/review.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Generate a session report with token usage estimates, work summary, and outcomes
3
3
  ---
4
- @.pi/gsd/workflows/session-report.md
4
+ <gsd-include path=".pi/gsd/workflows/session-report.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Configure GSD workflow toggles and model profile
3
3
  ---
4
- @.pi/gsd/workflows/settings.md
4
+ <gsd-include path=".pi/gsd/workflows/settings.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Create PR, run review, and prepare for merge after verification passes
3
3
  ---
4
- @.pi/gsd/workflows/ship.md
4
+ <gsd-include path=".pi/gsd/workflows/ship.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Generate UI design contract (UI-SPEC.md) for frontend phases
3
3
  ---
4
- @.pi/gsd/workflows/ui-phase.md
5
- @.pi/gsd/references/ui-brand.md
4
+ <gsd-include path=".pi/gsd/workflows/ui-phase.md" />
5
+ <gsd-include path=".pi/gsd/references/ui-brand.md" />
6
6
 
7
7
  $ARGUMENTS
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Retroactive 6-pillar visual audit of implemented frontend code
3
3
  ---
4
- @.pi/gsd/workflows/ui-review.md
5
- @.pi/gsd/references/ui-brand.md
4
+ <gsd-include path=".pi/gsd/workflows/ui-review.md" />
5
+ <gsd-include path=".pi/gsd/references/ui-brand.md" />
6
6
 
7
7
  $ARGUMENTS
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Retroactively audit and fill Nyquist validation gaps for a completed phase
3
3
  ---
4
- @.pi/gsd/workflows/validate-phase.md
4
+ <gsd-include path=".pi/gsd/workflows/validate-phase.md" />
5
5
 
6
6
  $ARGUMENTS
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Validate built features through conversational UAT
3
3
  ---
4
- @.pi/gsd/workflows/verify-work.md
5
- @.pi/gsd/templates/UAT.md
4
+ <gsd-include path=".pi/gsd/workflows/verify-work.md" />
5
+ <gsd-include path=".pi/gsd/templates/UAT.md" />
6
6
 
7
7
  $ARGUMENTS