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.
- package/.gsd/extensions/pi-gsd-hooks.ts +108 -65
- package/README.md +2 -4
- package/package.json +1 -1
- package/prompts/gsd-add-phase.md +1 -1
- package/prompts/gsd-add-tests.md +1 -1
- package/prompts/gsd-add-todo.md +1 -1
- package/prompts/gsd-audit-milestone.md +1 -1
- package/prompts/gsd-audit-uat.md +1 -1
- package/prompts/gsd-autonomous.md +2 -2
- package/prompts/gsd-check-todos.md +1 -1
- package/prompts/gsd-cleanup.md +1 -1
- package/prompts/gsd-discuss-phase.md +3 -3
- package/prompts/gsd-do.md +2 -2
- package/prompts/gsd-execute-milestone.md +5 -5
- package/prompts/gsd-execute-phase.md +2 -2
- package/prompts/gsd-fast.md +1 -1
- package/prompts/gsd-forensics.md +1 -1
- package/prompts/gsd-insert-phase.md +1 -1
- package/prompts/gsd-list-phase-assumptions.md +1 -1
- package/prompts/gsd-list-workspaces.md +1 -1
- package/prompts/gsd-manager.md +1 -1
- package/prompts/gsd-map-codebase.md +1 -1
- package/prompts/gsd-milestone-summary.md +1 -1
- package/prompts/gsd-new-milestone.md +5 -5
- package/prompts/gsd-new-project.md +5 -5
- package/prompts/gsd-new-workspace.md +1 -1
- package/prompts/gsd-note.md +1 -1
- package/prompts/gsd-pause-work.md +1 -1
- package/prompts/gsd-plan-milestone-gaps.md +1 -1
- package/prompts/gsd-plan-milestone.md +4 -4
- package/prompts/gsd-plan-phase.md +2 -2
- package/prompts/gsd-plant-seed.md +1 -1
- package/prompts/gsd-pr-branch.md +1 -1
- package/prompts/gsd-profile-user.md +1 -1
- package/prompts/gsd-quick.md +1 -1
- package/prompts/gsd-remove-phase.md +1 -1
- package/prompts/gsd-remove-workspace.md +1 -1
- package/prompts/gsd-resume-work.md +1 -1
- package/prompts/gsd-review.md +1 -1
- package/prompts/gsd-session-report.md +1 -1
- package/prompts/gsd-settings.md +1 -1
- package/prompts/gsd-ship.md +1 -1
- package/prompts/gsd-ui-phase.md +2 -2
- package/prompts/gsd-ui-review.md +2 -2
- package/prompts/gsd-validate-phase.md +1 -1
- 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:
|
|
100
|
-
// Replaces
|
|
101
|
-
//
|
|
102
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
|
103
|
+
const errors: string[] = [];
|
|
125
104
|
let transformed = text;
|
|
126
105
|
|
|
127
|
-
for (const match of
|
|
128
|
-
const
|
|
129
|
-
const
|
|
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,
|
|
133
|
-
...(
|
|
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
|
|
138
|
-
for (const
|
|
120
|
+
let raw: string | null = null;
|
|
121
|
+
for (const c of candidates) {
|
|
139
122
|
try {
|
|
140
|
-
if (existsSync(
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
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 (
|
|
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" };
|
|
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
|
-
|
|
|
143
|
-
|
|
|
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
package/prompts/gsd-add-phase.md
CHANGED
package/prompts/gsd-add-tests.md
CHANGED
package/prompts/gsd-add-todo.md
CHANGED
package/prompts/gsd-audit-uat.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Run all remaining phases autonomously - discuss→plan→execute per phase
|
|
3
3
|
---
|
|
4
|
-
|
|
5
|
-
|
|
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
|
package/prompts/gsd-cleanup.md
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
5
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
5
|
-
|
|
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
|
package/prompts/gsd-fast.md
CHANGED
package/prompts/gsd-forensics.md
CHANGED
package/prompts/gsd-manager.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Start a new milestone cycle - update PROJECT.md and route to requirements
|
|
3
3
|
---
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
package/prompts/gsd-note.md
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
5
|
-
|
|
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
|
package/prompts/gsd-pr-branch.md
CHANGED
package/prompts/gsd-quick.md
CHANGED
package/prompts/gsd-review.md
CHANGED
package/prompts/gsd-settings.md
CHANGED
package/prompts/gsd-ship.md
CHANGED
package/prompts/gsd-ui-phase.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Generate UI design contract (UI-SPEC.md) for frontend phases
|
|
3
3
|
---
|
|
4
|
-
|
|
5
|
-
|
|
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
|
package/prompts/gsd-ui-review.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Retroactive 6-pillar visual audit of implemented frontend code
|
|
3
3
|
---
|
|
4
|
-
|
|
5
|
-
|
|
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
|