@slowcook-ai/cli 0.13.0 → 0.14.0-alpha.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/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/brew/prompts.d.ts +3 -290
- package/dist/commands/brew/prompts.d.ts.map +1 -1
- package/dist/commands/brew/prompts.js +3 -462
- package/dist/commands/brew/prompts.js.map +1 -1
- package/dist/commands/extract/index.d.ts +2 -0
- package/dist/commands/extract/index.d.ts.map +1 -0
- package/dist/commands/extract/index.js +90 -0
- package/dist/commands/extract/index.js.map +1 -0
- package/dist/commands/init/templates.d.ts.map +1 -1
- package/dist/commands/init/templates.js +4 -0
- package/dist/commands/init/templates.js.map +1 -1
- package/dist/commands/investigate/prompts.d.ts +7 -87
- package/dist/commands/investigate/prompts.d.ts.map +1 -1
- package/dist/commands/investigate/prompts.js +7 -234
- package/dist/commands/investigate/prompts.js.map +1 -1
- package/dist/commands/map/emit-tokens.d.ts +53 -0
- package/dist/commands/map/emit-tokens.d.ts.map +1 -0
- package/dist/commands/map/emit-tokens.js +316 -0
- package/dist/commands/map/emit-tokens.js.map +1 -0
- package/dist/commands/map/index.d.ts +17 -0
- package/dist/commands/map/index.d.ts.map +1 -1
- package/dist/commands/map/index.js +72 -5
- package/dist/commands/map/index.js.map +1 -1
- package/dist/commands/refine/agent.d.ts.map +1 -1
- package/dist/commands/refine/agent.js +21 -0
- package/dist/commands/refine/agent.js.map +1 -1
- package/dist/commands/refine/context.d.ts +11 -0
- package/dist/commands/refine/context.d.ts.map +1 -1
- package/dist/commands/refine/context.js +45 -0
- package/dist/commands/refine/context.js.map +1 -1
- package/dist/commands/refine/mock-fixtures.d.ts +39 -0
- package/dist/commands/refine/mock-fixtures.d.ts.map +1 -0
- package/dist/commands/refine/mock-fixtures.js +86 -0
- package/dist/commands/refine/mock-fixtures.js.map +1 -0
- package/dist/commands/refine/prompts.d.ts +10 -21
- package/dist/commands/refine/prompts.d.ts.map +1 -1
- package/dist/commands/refine/prompts.js +10 -376
- package/dist/commands/refine/prompts.js.map +1 -1
- package/dist/commands/refine/spec-yaml.d.ts +306 -128
- package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
- package/dist/commands/refine/spec-yaml.js +33 -0
- package/dist/commands/refine/spec-yaml.js.map +1 -1
- package/dist/commands/sift/prompts.d.ts +3 -111
- package/dist/commands/sift/prompts.d.ts.map +1 -1
- package/dist/commands/sift/prompts.js +3 -190
- package/dist/commands/sift/prompts.js.map +1 -1
- package/dist/commands/testgen/prompts.d.ts +3 -13
- package/dist/commands/testgen/prompts.d.ts.map +1 -1
- package/dist/commands/testgen/prompts.js +3 -384
- package/dist/commands/testgen/prompts.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { readFileSync, mkdirSync, writeFileSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
const SKIP_DIRS = new Set([
|
|
4
|
+
"node_modules",
|
|
5
|
+
".next",
|
|
6
|
+
".open-next",
|
|
7
|
+
".turbo",
|
|
8
|
+
"dist",
|
|
9
|
+
"build",
|
|
10
|
+
"out",
|
|
11
|
+
".vercel",
|
|
12
|
+
".git",
|
|
13
|
+
"coverage",
|
|
14
|
+
".brewing",
|
|
15
|
+
".claude",
|
|
16
|
+
]);
|
|
17
|
+
function walkCss(root, acc = [], cur = root) {
|
|
18
|
+
let entries;
|
|
19
|
+
try {
|
|
20
|
+
entries = readdirSync(cur);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return acc;
|
|
24
|
+
}
|
|
25
|
+
for (const name of entries) {
|
|
26
|
+
if (SKIP_DIRS.has(name))
|
|
27
|
+
continue;
|
|
28
|
+
const full = join(cur, name);
|
|
29
|
+
let st;
|
|
30
|
+
try {
|
|
31
|
+
st = statSync(full);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (st.isDirectory()) {
|
|
37
|
+
walkCss(root, acc, full);
|
|
38
|
+
}
|
|
39
|
+
else if (name.endsWith(".css")) {
|
|
40
|
+
acc.push(full);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return acc;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parse a CSS file's :root and @theme blocks into TokenEntry rows.
|
|
47
|
+
*
|
|
48
|
+
* Strategy: walk top-level by tracking brace depth + remembering the
|
|
49
|
+
* last selector / at-rule prefix. We need only enough to distinguish:
|
|
50
|
+
* - `:root { ... }` at depth 0 → light variant
|
|
51
|
+
* - `:root { ... }` inside `@media (prefers-color-scheme: dark)` → dark
|
|
52
|
+
* - `@theme { ... }` → theme mappings (Tailwind v4)
|
|
53
|
+
*
|
|
54
|
+
* We are not building a full CSS AST; the regex+brace pass is enough
|
|
55
|
+
* for the conventional vars-in-:root pattern and degrades gracefully
|
|
56
|
+
* on weird input by emitting fewer rows.
|
|
57
|
+
*/
|
|
58
|
+
export function parseCssTokens(content, sourceLabel) {
|
|
59
|
+
const light = [];
|
|
60
|
+
const dark = [];
|
|
61
|
+
const themeMappings = [];
|
|
62
|
+
let i = 0;
|
|
63
|
+
const len = content.length;
|
|
64
|
+
// Track if we're inside a dark-mode @media block so nested :root captures
|
|
65
|
+
// are routed to dark[].
|
|
66
|
+
let mediaDarkDepth = 0;
|
|
67
|
+
while (i < len) {
|
|
68
|
+
// Skip whitespace + comments.
|
|
69
|
+
while (i < len && /\s/.test(content[i]))
|
|
70
|
+
i++;
|
|
71
|
+
if (i + 1 < len && content[i] === "/" && content[i + 1] === "*") {
|
|
72
|
+
const end = content.indexOf("*/", i + 2);
|
|
73
|
+
if (end < 0)
|
|
74
|
+
break;
|
|
75
|
+
i = end + 2;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Handle bodyless at-rules (`@import "x";`, `@charset "y";`, `@use ...`)
|
|
79
|
+
// that would otherwise get glued onto the next selector head.
|
|
80
|
+
if (content[i] === "@") {
|
|
81
|
+
const semi = content.indexOf(";", i);
|
|
82
|
+
const braceLook = content.indexOf("{", i);
|
|
83
|
+
if (semi >= 0 && (braceLook < 0 || semi < braceLook)) {
|
|
84
|
+
i = semi + 1;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Find next selector / at-rule up to `{`.
|
|
89
|
+
const braceOpen = content.indexOf("{", i);
|
|
90
|
+
if (braceOpen < 0)
|
|
91
|
+
break;
|
|
92
|
+
let head = content.slice(i, braceOpen).trim();
|
|
93
|
+
// Defense in depth: if any bodyless at-rule still slipped into head
|
|
94
|
+
// (e.g. `@import "x"; :root`), keep only the trailing selector after
|
|
95
|
+
// the last `;`.
|
|
96
|
+
const lastSemi = head.lastIndexOf(";");
|
|
97
|
+
if (lastSemi >= 0)
|
|
98
|
+
head = head.slice(lastSemi + 1).trim();
|
|
99
|
+
const body = readBlock(content, braceOpen + 1);
|
|
100
|
+
if (body == null)
|
|
101
|
+
break;
|
|
102
|
+
if (/^@media\b/.test(head) && /prefers-color-scheme\s*:\s*dark/.test(head)) {
|
|
103
|
+
// Recurse into the media block's body so nested :root → dark.
|
|
104
|
+
const inner = parseCssTokens(body.text, sourceLabel);
|
|
105
|
+
// Inner light entries (i.e. :root inside the dark @media) become dark.
|
|
106
|
+
// Inner dark entries (nested @media — unusual) collapse into dark too.
|
|
107
|
+
dark.push(...inner.light.map((e) => ({ ...e, variant: "dark" })), ...inner.dark);
|
|
108
|
+
themeMappings.push(...inner.themeMappings);
|
|
109
|
+
}
|
|
110
|
+
else if (/^@theme\b/.test(head)) {
|
|
111
|
+
for (const v of parseVars(body.text)) {
|
|
112
|
+
themeMappings.push({ ...v, variant: "light", source: sourceLabel });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (head === ":root" || /(^|,)\s*:root\s*($|,)/.test(head)) {
|
|
116
|
+
const target = mediaDarkDepth > 0 ? dark : light;
|
|
117
|
+
const variant = mediaDarkDepth > 0 ? "dark" : "light";
|
|
118
|
+
for (const v of parseVars(body.text)) {
|
|
119
|
+
target.push({ ...v, variant, source: sourceLabel });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Other selectors (`body`, `.foo`) are ignored — we only want declared tokens.
|
|
123
|
+
i = body.end;
|
|
124
|
+
}
|
|
125
|
+
return { light, dark, themeMappings };
|
|
126
|
+
}
|
|
127
|
+
/** Read a block starting after the opening `{`, returns text + index after closing `}`. */
|
|
128
|
+
function readBlock(s, start) {
|
|
129
|
+
let depth = 1;
|
|
130
|
+
let i = start;
|
|
131
|
+
while (i < s.length && depth > 0) {
|
|
132
|
+
const ch = s[i];
|
|
133
|
+
if (ch === "{")
|
|
134
|
+
depth++;
|
|
135
|
+
else if (ch === "}") {
|
|
136
|
+
depth--;
|
|
137
|
+
if (depth === 0)
|
|
138
|
+
return { text: s.slice(start, i), end: i + 1 };
|
|
139
|
+
}
|
|
140
|
+
else if (ch === "/" && s[i + 1] === "*") {
|
|
141
|
+
const end = s.indexOf("*/", i + 2);
|
|
142
|
+
if (end < 0)
|
|
143
|
+
return null;
|
|
144
|
+
i = end + 2;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
i++;
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
/** Extract `--name: value;` declarations from a block body. */
|
|
152
|
+
function parseVars(body) {
|
|
153
|
+
const out = [];
|
|
154
|
+
// Strip block comments first.
|
|
155
|
+
const stripped = body.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
156
|
+
// Match `--name: value;` (value may contain colons/parens, so non-greedy
|
|
157
|
+
// up to the next semicolon at depth 0). Simple approach: split on `;`
|
|
158
|
+
// and check each piece.
|
|
159
|
+
for (const raw of stripped.split(";")) {
|
|
160
|
+
const piece = raw.trim();
|
|
161
|
+
if (!piece)
|
|
162
|
+
continue;
|
|
163
|
+
const m = piece.match(/^(--[A-Za-z0-9_-]+)\s*:\s*([\s\S]+)$/);
|
|
164
|
+
if (!m)
|
|
165
|
+
continue;
|
|
166
|
+
out.push({ name: m[1], value: m[2].trim() });
|
|
167
|
+
}
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
const COLOR_VALUE_RE = /^(#|rgb\(|rgba\(|hsl\(|hsla\(|color\(|oklch\(|oklab\()/i;
|
|
171
|
+
const NAMED_COLORS = new Set([
|
|
172
|
+
"transparent",
|
|
173
|
+
"currentcolor",
|
|
174
|
+
"black",
|
|
175
|
+
"white",
|
|
176
|
+
"red",
|
|
177
|
+
"green",
|
|
178
|
+
"blue",
|
|
179
|
+
"yellow",
|
|
180
|
+
"orange",
|
|
181
|
+
"purple",
|
|
182
|
+
"pink",
|
|
183
|
+
"gray",
|
|
184
|
+
"grey",
|
|
185
|
+
"brown",
|
|
186
|
+
]);
|
|
187
|
+
function isColorValue(v, allTokens) {
|
|
188
|
+
const trimmed = v.trim();
|
|
189
|
+
if (COLOR_VALUE_RE.test(trimmed))
|
|
190
|
+
return true;
|
|
191
|
+
if (NAMED_COLORS.has(trimmed.toLowerCase()))
|
|
192
|
+
return true;
|
|
193
|
+
const varRef = trimmed.match(/^var\((--[A-Za-z0-9_-]+)\)$/);
|
|
194
|
+
if (varRef) {
|
|
195
|
+
const target = allTokens.get(varRef[1]);
|
|
196
|
+
if (target)
|
|
197
|
+
return isColorValue(target, allTokens);
|
|
198
|
+
}
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
function classify(name, value, allTokens) {
|
|
202
|
+
const n = name.toLowerCase();
|
|
203
|
+
if (n.includes("color") ||
|
|
204
|
+
n.includes("bg") ||
|
|
205
|
+
n.includes("background") ||
|
|
206
|
+
n.includes("foreground") ||
|
|
207
|
+
n.includes("border") ||
|
|
208
|
+
n.includes("tint") ||
|
|
209
|
+
n.includes("shadow") ||
|
|
210
|
+
isColorValue(value, allTokens)) {
|
|
211
|
+
return "color";
|
|
212
|
+
}
|
|
213
|
+
if (n.startsWith("--font") || n.includes("font") || n.includes("text-"))
|
|
214
|
+
return "typography";
|
|
215
|
+
if (n.includes("space") ||
|
|
216
|
+
n.includes("spacing") ||
|
|
217
|
+
n.includes("gap") ||
|
|
218
|
+
n.includes("size") ||
|
|
219
|
+
n.includes("radius")) {
|
|
220
|
+
return "spacing";
|
|
221
|
+
}
|
|
222
|
+
return "other";
|
|
223
|
+
}
|
|
224
|
+
export function emitTokensCatalog(repoRoot) {
|
|
225
|
+
const cssFiles = walkCss(repoRoot);
|
|
226
|
+
if (cssFiles.length === 0) {
|
|
227
|
+
return { written: false, filesScanned: 0, skippedReason: "no .css files found" };
|
|
228
|
+
}
|
|
229
|
+
const catalog = {
|
|
230
|
+
light: [],
|
|
231
|
+
dark: [],
|
|
232
|
+
themeMappings: [],
|
|
233
|
+
filesScanned: cssFiles.length,
|
|
234
|
+
};
|
|
235
|
+
for (const file of cssFiles) {
|
|
236
|
+
let content;
|
|
237
|
+
try {
|
|
238
|
+
content = readFileSync(file, "utf8");
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const rel = relative(repoRoot, file);
|
|
244
|
+
const parsed = parseCssTokens(content, rel);
|
|
245
|
+
catalog.light.push(...parsed.light);
|
|
246
|
+
catalog.dark.push(...parsed.dark);
|
|
247
|
+
catalog.themeMappings.push(...parsed.themeMappings);
|
|
248
|
+
}
|
|
249
|
+
if (catalog.light.length === 0 &&
|
|
250
|
+
catalog.dark.length === 0 &&
|
|
251
|
+
catalog.themeMappings.length === 0) {
|
|
252
|
+
return {
|
|
253
|
+
written: false,
|
|
254
|
+
filesScanned: cssFiles.length,
|
|
255
|
+
skippedReason: `scanned ${cssFiles.length} .css file(s), found no :root or @theme tokens`,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
const md = renderTokensMarkdown(catalog);
|
|
259
|
+
const outDir = join(repoRoot, ".brewing/diagrams");
|
|
260
|
+
mkdirSync(outDir, { recursive: true });
|
|
261
|
+
const outPath = join(outDir, "tokens.md");
|
|
262
|
+
writeFileSync(outPath, md, "utf8");
|
|
263
|
+
return {
|
|
264
|
+
written: true,
|
|
265
|
+
filesScanned: cssFiles.length,
|
|
266
|
+
lightCount: catalog.light.length,
|
|
267
|
+
darkCount: catalog.dark.length,
|
|
268
|
+
themeCount: catalog.themeMappings.length,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
export function renderTokensMarkdown(catalog) {
|
|
272
|
+
const allTokens = new Map();
|
|
273
|
+
for (const e of [...catalog.light, ...catalog.dark, ...catalog.themeMappings]) {
|
|
274
|
+
if (!allTokens.has(e.name))
|
|
275
|
+
allTokens.set(e.name, e.value);
|
|
276
|
+
}
|
|
277
|
+
const out = [];
|
|
278
|
+
out.push("<!-- Auto-emitted by `slowcook map --emit-tokens`. Do not hand-edit; regenerate. -->");
|
|
279
|
+
out.push(`<!-- Source: ${catalog.filesScanned} .css file(s); ${catalog.light.length} light, ${catalog.dark.length} dark, ${catalog.themeMappings.length} @theme mapping(s). -->`);
|
|
280
|
+
out.push("");
|
|
281
|
+
out.push("# Design tokens (extracted)");
|
|
282
|
+
out.push("");
|
|
283
|
+
out.push("Brownfield extraction of `:root { --var }` + `@theme { --var }` declarations.");
|
|
284
|
+
out.push("");
|
|
285
|
+
const groups = [
|
|
286
|
+
["light", catalog.light, "Light variant (`:root`)"],
|
|
287
|
+
["dark", catalog.dark, "Dark variant (`@media (prefers-color-scheme: dark)`)"],
|
|
288
|
+
["theme", catalog.themeMappings, "Theme mappings (`@theme` — Tailwind v4)"],
|
|
289
|
+
];
|
|
290
|
+
for (const [, entries, heading] of groups) {
|
|
291
|
+
if (entries.length === 0)
|
|
292
|
+
continue;
|
|
293
|
+
out.push(`## ${heading}`);
|
|
294
|
+
out.push("");
|
|
295
|
+
const buckets = { color: [], typography: [], spacing: [], other: [] };
|
|
296
|
+
for (const e of entries) {
|
|
297
|
+
const k = classify(e.name, e.value, allTokens);
|
|
298
|
+
buckets[k].push(e);
|
|
299
|
+
}
|
|
300
|
+
for (const [bucketName, bucketEntries] of Object.entries(buckets)) {
|
|
301
|
+
if (bucketEntries.length === 0)
|
|
302
|
+
continue;
|
|
303
|
+
out.push(`### ${bucketName} (${bucketEntries.length})`);
|
|
304
|
+
out.push("");
|
|
305
|
+
out.push("| Token | Value | Source |");
|
|
306
|
+
out.push("| --- | --- | --- |");
|
|
307
|
+
for (const e of bucketEntries) {
|
|
308
|
+
const value = e.value.replace(/\|/g, "\\|");
|
|
309
|
+
out.push(`| \`${e.name}\` | \`${value}\` | \`${e.source}\` |`);
|
|
310
|
+
}
|
|
311
|
+
out.push("");
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return out.join("\n") + "\n";
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=emit-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-tokens.js","sourceRoot":"","sources":["../../../src/commands/map/emit-tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
import type { CodeMap } from "./scan.js";
|
|
2
|
+
export { emitTokensCatalog } from "./emit-tokens.js";
|
|
2
3
|
export declare function map(argv: string[], cliVersion: string): Promise<void>;
|
|
3
4
|
export declare function writeFreshMap(repoRoot: string, outJson: string, outMd: string, fresh: CodeMap): void;
|
|
5
|
+
/**
|
|
6
|
+
* 0.13.2 (brownfield-extraction track for 0.14 mockup-first refinement) —
|
|
7
|
+
* walk `supabase/migrations/*.sql`, concatenate, hand to ddlToMermaidErd,
|
|
8
|
+
* write `.brewing/diagrams/schema.mmd`. Refine reads this file later as
|
|
9
|
+
* project-awareness so its proposals (new tables / FKs) align with the
|
|
10
|
+
* existing entity vocabulary instead of inventing.
|
|
11
|
+
*
|
|
12
|
+
* Skipped silently when no `supabase/migrations/` directory exists —
|
|
13
|
+
* not every consumer uses Supabase.
|
|
14
|
+
*/
|
|
15
|
+
export declare function emitSchemaDiagram(repoRoot: string): {
|
|
16
|
+
written: boolean;
|
|
17
|
+
entityCount?: number;
|
|
18
|
+
migrationsCount?: number;
|
|
19
|
+
skippedReason?: string;
|
|
20
|
+
};
|
|
4
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/map/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/map/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAuFrD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6E3E;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,GACb,IAAI,CAMN;AAWD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAuBA"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import { writeFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
1
|
+
import { writeFileSync, readFileSync, existsSync, mkdirSync, readdirSync } from "node:fs";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { generateMap } from "./scan.js";
|
|
4
4
|
import { renderJson, renderMarkdown, mapsEqual, CODE_MAP_JSON_PATH, CODE_MAP_MD_PATH, } from "./render.js";
|
|
5
|
+
import { ddlToMermaidErd } from "../refine/mermaid.js";
|
|
6
|
+
import { emitTokensCatalog } from "./emit-tokens.js";
|
|
7
|
+
export { emitTokensCatalog } from "./emit-tokens.js";
|
|
5
8
|
function parseArgs(argv) {
|
|
6
9
|
const args = {
|
|
7
10
|
subcommand: "generate",
|
|
8
11
|
repoRoot: process.cwd(),
|
|
9
12
|
out: CODE_MAP_JSON_PATH,
|
|
10
13
|
md: CODE_MAP_MD_PATH,
|
|
14
|
+
emitSchema: false,
|
|
15
|
+
emitTokens: false,
|
|
11
16
|
};
|
|
12
17
|
const first = argv[0];
|
|
13
18
|
if (first === "generate" || first === "check") {
|
|
@@ -38,6 +43,12 @@ function parseArgs(argv) {
|
|
|
38
43
|
args.md = next;
|
|
39
44
|
i++;
|
|
40
45
|
}
|
|
46
|
+
else if (a === "--emit-schema") {
|
|
47
|
+
args.emitSchema = true;
|
|
48
|
+
}
|
|
49
|
+
else if (a === "--emit-tokens") {
|
|
50
|
+
args.emitTokens = true;
|
|
51
|
+
}
|
|
41
52
|
else if (a === "--help" || a === "-h") {
|
|
42
53
|
printHelp();
|
|
43
54
|
process.exit(0);
|
|
@@ -55,7 +66,7 @@ helper functions, and domain types. Lives at \`.brewing/code-map.json\`
|
|
|
55
66
|
context so it doesn't have to re-read files every iteration.
|
|
56
67
|
|
|
57
68
|
Usage:
|
|
58
|
-
slowcook map generate [--cwd <path>] [--out <path>] [--md <path>]
|
|
69
|
+
slowcook map generate [--cwd <path>] [--out <path>] [--md <path>] [--emit-schema] [--emit-tokens]
|
|
59
70
|
slowcook map check [--cwd <path>] [--out <path>]
|
|
60
71
|
|
|
61
72
|
generate Write a fresh map to .brewing/code-map.{json,md}.
|
|
@@ -63,9 +74,15 @@ Usage:
|
|
|
63
74
|
generation. Meant for CI — keeps the map honest.
|
|
64
75
|
|
|
65
76
|
Options:
|
|
66
|
-
--cwd <path>
|
|
67
|
-
--out <path>
|
|
68
|
-
--md <path>
|
|
77
|
+
--cwd <path> Repo root (default: cwd).
|
|
78
|
+
--out <path> JSON output path (default: .brewing/code-map.json).
|
|
79
|
+
--md <path> Markdown output path (default: .brewing/code-map.md).
|
|
80
|
+
--emit-schema Brownfield: also emit .brewing/diagrams/schema.mmd from
|
|
81
|
+
supabase/migrations/*.sql (Mermaid erDiagram). Skipped
|
|
82
|
+
silently when no migrations directory exists.
|
|
83
|
+
--emit-tokens Brownfield: also emit .brewing/diagrams/tokens.md by
|
|
84
|
+
walking **/*.css for :root + @theme tokens. Skipped
|
|
85
|
+
silently when no .css files / no tokens are found.
|
|
69
86
|
`);
|
|
70
87
|
}
|
|
71
88
|
export async function map(argv, cliVersion) {
|
|
@@ -77,6 +94,24 @@ export async function map(argv, cliVersion) {
|
|
|
77
94
|
if (args.subcommand === "generate") {
|
|
78
95
|
writeFreshMap(args.repoRoot, args.out, args.md, fresh);
|
|
79
96
|
summary(fresh);
|
|
97
|
+
if (args.emitSchema) {
|
|
98
|
+
const schemaResult = emitSchemaDiagram(args.repoRoot);
|
|
99
|
+
if (schemaResult.written) {
|
|
100
|
+
console.log(`Wrote .brewing/diagrams/schema.mmd (${schemaResult.entityCount} entities, ${schemaResult.migrationsCount} migrations parsed).`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(`Skipped schema emit: ${schemaResult.skippedReason}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (args.emitTokens) {
|
|
107
|
+
const tokensResult = emitTokensCatalog(args.repoRoot);
|
|
108
|
+
if (tokensResult.written) {
|
|
109
|
+
console.log(`Wrote .brewing/diagrams/tokens.md (${tokensResult.lightCount} light, ${tokensResult.darkCount} dark, ${tokensResult.themeCount} @theme; ${tokensResult.filesScanned} css file(s) scanned).`);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(`Skipped tokens emit: ${tokensResult.skippedReason}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
80
115
|
return;
|
|
81
116
|
}
|
|
82
117
|
// check: compare existing committed map to a fresh regen.
|
|
@@ -128,4 +163,36 @@ function summary(map) {
|
|
|
128
163
|
function summaryCounts(m) {
|
|
129
164
|
return `${m.api_routes.length} routes, ${m.pages.length} pages, ${m.components.length} components, ${m.helpers.length} helpers, ${m.types.length} types`;
|
|
130
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* 0.13.2 (brownfield-extraction track for 0.14 mockup-first refinement) —
|
|
168
|
+
* walk `supabase/migrations/*.sql`, concatenate, hand to ddlToMermaidErd,
|
|
169
|
+
* write `.brewing/diagrams/schema.mmd`. Refine reads this file later as
|
|
170
|
+
* project-awareness so its proposals (new tables / FKs) align with the
|
|
171
|
+
* existing entity vocabulary instead of inventing.
|
|
172
|
+
*
|
|
173
|
+
* Skipped silently when no `supabase/migrations/` directory exists —
|
|
174
|
+
* not every consumer uses Supabase.
|
|
175
|
+
*/
|
|
176
|
+
export function emitSchemaDiagram(repoRoot) {
|
|
177
|
+
const dir = join(repoRoot, "supabase/migrations");
|
|
178
|
+
if (!existsSync(dir)) {
|
|
179
|
+
return { written: false, skippedReason: "no supabase/migrations/ directory" };
|
|
180
|
+
}
|
|
181
|
+
const files = readdirSync(dir).filter((f) => f.endsWith(".sql")).sort();
|
|
182
|
+
if (files.length === 0) {
|
|
183
|
+
return { written: false, skippedReason: "supabase/migrations/ is empty" };
|
|
184
|
+
}
|
|
185
|
+
const ddl = files.map((f) => readFileSync(join(dir, f), "utf8")).join("\n");
|
|
186
|
+
const mermaid = ddlToMermaidErd(ddl);
|
|
187
|
+
// Count entities — quick parse of the rendered output.
|
|
188
|
+
// Each entity becomes a ` NAME {` line in the erDiagram block.
|
|
189
|
+
const entityCount = (mermaid.match(/^ {2}[A-Z_]+\s*\{/gm) ?? []).length;
|
|
190
|
+
const outDir = join(repoRoot, ".brewing/diagrams");
|
|
191
|
+
mkdirSync(outDir, { recursive: true });
|
|
192
|
+
const outPath = join(outDir, "schema.mmd");
|
|
193
|
+
const header = `<!-- Auto-emitted by \`slowcook map --emit-schema\`. Do not hand-edit; regenerate. -->\n` +
|
|
194
|
+
`<!-- Source: ${files.length} migration file(s) under supabase/migrations/. -->\n\n`;
|
|
195
|
+
writeFileSync(outPath, header + mermaid + "\n", "utf8");
|
|
196
|
+
return { written: true, entityCount, migrationsCount: files.length };
|
|
197
|
+
}
|
|
131
198
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/map/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/map/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACL,UAAU,EACV,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAuBrD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAY;QACpB,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE;QACvB,GAAG,EAAE,kBAAkB;QACvB,EAAE,EAAE,gBAAgB;QACpB,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,KAAK;KAClB,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;SAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;QAC9C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAAC,CAAC,EAAE,CAAC;QAAC,CAAC;aACpD,IAAI,CAAC,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAAC,CAAC,EAAE,CAAC;QAAC,CAAC;aACpD,IAAI,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YAAC,CAAC,EAAE,CAAC;QAAC,CAAC;aAClD,IAAI,CAAC,KAAK,eAAe,EAAE,CAAC;YAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAAC,CAAC;aACtD,IAAI,CAAC,KAAK,eAAe,EAAE,CAAC;YAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAAC,CAAC;aACtD,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAAC,SAAS,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,UAAkB;IAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,KAAK,GAAG,WAAW,CAAC;QACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACnC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CACT,uCAAuC,YAAY,CAAC,WAAW,cAAc,YAAY,CAAC,eAAe,sBAAsB,CAChI,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,wBAAwB,YAAY,CAAC,aAAa,EAAE,CACrD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CACT,sCAAsC,YAAY,CAAC,UAAU,WAAW,YAAY,CAAC,SAAS,UAAU,YAAY,CAAC,UAAU,YAAY,YAAY,CAAC,YAAY,wBAAwB,CAC7L,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,wBAAwB,YAAY,CAAC,aAAa,EAAE,CACrD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,0DAA0D;IAC1D,EAAE;IACF,iEAAiE;IACjE,6DAA6D;IAC7D,gEAAgE;IAChE,kEAAkE;IAClE,8DAA8D;IAC9D,8DAA8D;IAC9D,WAAW;IACX,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CACT,yBAAyB,IAAI,CAAC,GAAG,+CAA+C;YAC9E,+FAA+F,CAClG,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAY,CAAC;IACvE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,qCAAqC,IAAI,CAAC,GAAG,MAAO,CAAW,CAAC,OAAO,6CAA6C,CACrH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,wBAAwB,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IACD,OAAO,CAAC,KAAK,CACX,mCAAmC,IAAI,CAAC,GAAG,6EAA6E;QACtH,gBAAgB,aAAa,CAAC,QAAQ,CAAC,IAAI;QAC3C,gBAAgB,aAAa,CAAC,KAAK,CAAC,MAAM;QAC1C,iEAAiE;QACjE,mEAAmE;QACnE,uHAAuH,CAC1H,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,OAAe,EACf,KAAa,EACb,KAAc;IAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACnD,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,OAAO,CAAC,GAAY;IAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,kBAAkB,MAAM,gBAAgB,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC,UAAU,CAAC,MAAM,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC3J,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAMhD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,mCAAmC,EAAE,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,+BAA+B,EAAE,CAAC;IAC5E,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACrC,uDAAuD;IACvD,gEAAgE;IAChE,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAExE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACnD,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,MAAM,GACV,0FAA0F;QAC1F,gBAAgB,KAAK,CAAC,MAAM,wDAAwD,CAAC;IACvF,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACvE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import YAML from "yaml";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { costMarker } from "./llm.js";
|
|
4
4
|
import { synthesizeProposalsFromSpec } from "./proposals-synth.js";
|
|
5
|
+
import { writeMockFixtures } from "./mock-fixtures.js";
|
|
5
6
|
import { SpecProposalsSchema } from "./spec-yaml.js";
|
|
6
7
|
import { REFINEMENT_ANALYST_SYSTEM, SPEC_CHECKLIST_MD, AMENDMENT_SYSTEM, draftPrTitle, draftPrBody, } from "./prompts.js";
|
|
7
8
|
import { readIndex, writeIndex, writeSpec, readSpec, listActiveSpecs, nextStoryId, entryFromSpec, SPECS_DIR, } from "./spec-yaml.js";
|
|
@@ -141,10 +142,20 @@ export async function runRefinement(ctx) {
|
|
|
141
142
|
const index = readIndex(ctx.repoRoot);
|
|
142
143
|
const updatedIndex = applySupersede(index, { id: spec.story_id, entry: entryFromSpec(spec) }, supersedes);
|
|
143
144
|
writeIndex(ctx.repoRoot, updatedIndex);
|
|
145
|
+
// 0.14.0-α.1 mockup-first data-layer seam — emit `.mock.ts` files
|
|
146
|
+
// when the spec has `proposals.fixtures.by_domain`. Skipped silently
|
|
147
|
+
// for specs without fixtures, so this is a no-op for pre-α.1 specs.
|
|
148
|
+
const mockResult = writeMockFixtures(ctx.repoRoot, spec);
|
|
149
|
+
if (mockResult.written.length > 0) {
|
|
150
|
+
console.log(`[refine] wrote ${mockResult.written.length} mock fixture file(s): ${mockResult.written.join(", ")}`);
|
|
151
|
+
}
|
|
144
152
|
const branch = `slowcook/spec/story-${spec.story_id}`;
|
|
145
153
|
await ctx.forge.git.createBranch(branch);
|
|
146
154
|
await ctx.forge.git.stage(specPath);
|
|
147
155
|
await ctx.forge.git.stage(`specs/_index.yaml`);
|
|
156
|
+
for (const f of mockResult.written) {
|
|
157
|
+
await ctx.forge.git.stage(f);
|
|
158
|
+
}
|
|
148
159
|
await ctx.forge.git.commit(`slowcook: spec story-${spec.story_id} — ${spec.title}\n\nRefined from #${ctx.issueNumber}.`);
|
|
149
160
|
await ctx.forge.git.push(branch);
|
|
150
161
|
// PR creation can fail with 403 if the org/repo setting "Allow GitHub
|
|
@@ -623,6 +634,16 @@ export async function runResubmitRefinement(ctx) {
|
|
|
623
634
|
// Write, stage, commit
|
|
624
635
|
const specPath = writeSpec(ctx.repoRoot, parsed.spec);
|
|
625
636
|
await ctx.forge.git.stage(join(SPECS_DIR, `story-${storyId}.yaml`));
|
|
637
|
+
// 0.14.0-α.1 mockup-first data-layer seam — emit `.mock.ts` files
|
|
638
|
+
// for any fixture domains in the amended spec. Skipped silently
|
|
639
|
+
// when proposals.fixtures is absent or rejected.
|
|
640
|
+
const mockResult = writeMockFixtures(ctx.repoRoot, parsed.spec);
|
|
641
|
+
if (mockResult.written.length > 0) {
|
|
642
|
+
console.log(`[refine amend] wrote ${mockResult.written.length} mock fixture file(s): ${mockResult.written.join(", ")}`);
|
|
643
|
+
for (const f of mockResult.written) {
|
|
644
|
+
await ctx.forge.git.stage(f);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
626
647
|
// 0.11.12+ — detect "LLM produced a spec byte-identical to current
|
|
627
648
|
// state" no-op. Before 0.11.12 we called `git commit` directly here,
|
|
628
649
|
// which exits 1 with "nothing to commit" when the LLM rewrote the
|