@slowcook-ai/cli 0.13.0-alpha.3 → 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 +25 -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/chef/classify.d.ts +65 -0
- package/dist/commands/chef/classify.d.ts.map +1 -0
- package/dist/commands/chef/classify.js +102 -0
- package/dist/commands/chef/classify.js.map +1 -0
- package/dist/commands/chef/index.d.ts +22 -0
- package/dist/commands/chef/index.d.ts.map +1 -0
- package/dist/commands/chef/index.js +287 -0
- package/dist/commands/chef/index.js.map +1 -0
- 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/agent.d.ts.map +1 -1
- package/dist/commands/investigate/agent.js +39 -1
- package/dist/commands/investigate/agent.js.map +1 -1
- package/dist/commands/investigate/index.d.ts.map +1 -1
- package/dist/commands/investigate/index.js +126 -9
- package/dist/commands/investigate/index.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 -187
- 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/recipe-regression/agent.d.ts +94 -0
- package/dist/commands/recipe-regression/agent.d.ts.map +1 -0
- package/dist/commands/recipe-regression/agent.js +442 -0
- package/dist/commands/recipe-regression/agent.js.map +1 -0
- package/dist/commands/recipe-regression/index.d.ts +12 -1
- package/dist/commands/recipe-regression/index.d.ts.map +1 -1
- package/dist/commands/recipe-regression/index.js +45 -8
- package/dist/commands/recipe-regression/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/agent.d.ts +52 -0
- package/dist/commands/sift/agent.d.ts.map +1 -0
- package/dist/commands/sift/agent.js +392 -0
- package/dist/commands/sift/agent.js.map +1 -0
- package/dist/commands/sift/index.d.ts +23 -0
- package/dist/commands/sift/index.d.ts.map +1 -0
- package/dist/commands/sift/index.js +314 -0
- package/dist/commands/sift/index.js.map +1 -0
- package/dist/commands/sift/prompts.d.ts +6 -0
- package/dist/commands/sift/prompts.d.ts.map +1 -0
- package/dist/commands/sift/prompts.js +6 -0
- package/dist/commands/sift/prompts.js.map +1 -0
- 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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0.13.3 (brownfield-extraction track for 0.14 mockup-first refinement) —
|
|
3
|
+
* walk `**\/*.css` files (excluding build output) and extract design tokens
|
|
4
|
+
* declared via `:root { --var: value }` and `@theme { --var: value }` blocks.
|
|
5
|
+
*
|
|
6
|
+
* Supports the Tailwind v4 idiom (inline `@theme`) and classic CSS-vars
|
|
7
|
+
* theming. Light/dark variants captured separately when `:root` lives
|
|
8
|
+
* inside `@media (prefers-color-scheme: dark)`.
|
|
9
|
+
*
|
|
10
|
+
* Output: `.brewing/diagrams/tokens.md` — refine reads this so its
|
|
11
|
+
* mockup proposals reuse the consumer's existing palette / scale rather
|
|
12
|
+
* than inventing arbitrary hex values.
|
|
13
|
+
*/
|
|
14
|
+
export interface TokenEntry {
|
|
15
|
+
name: string;
|
|
16
|
+
value: string;
|
|
17
|
+
variant: "light" | "dark";
|
|
18
|
+
source: string;
|
|
19
|
+
}
|
|
20
|
+
export interface TokenCatalog {
|
|
21
|
+
light: TokenEntry[];
|
|
22
|
+
dark: TokenEntry[];
|
|
23
|
+
themeMappings: TokenEntry[];
|
|
24
|
+
filesScanned: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse a CSS file's :root and @theme blocks into TokenEntry rows.
|
|
28
|
+
*
|
|
29
|
+
* Strategy: walk top-level by tracking brace depth + remembering the
|
|
30
|
+
* last selector / at-rule prefix. We need only enough to distinguish:
|
|
31
|
+
* - `:root { ... }` at depth 0 → light variant
|
|
32
|
+
* - `:root { ... }` inside `@media (prefers-color-scheme: dark)` → dark
|
|
33
|
+
* - `@theme { ... }` → theme mappings (Tailwind v4)
|
|
34
|
+
*
|
|
35
|
+
* We are not building a full CSS AST; the regex+brace pass is enough
|
|
36
|
+
* for the conventional vars-in-:root pattern and degrades gracefully
|
|
37
|
+
* on weird input by emitting fewer rows.
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseCssTokens(content: string, sourceLabel: string): {
|
|
40
|
+
light: TokenEntry[];
|
|
41
|
+
dark: TokenEntry[];
|
|
42
|
+
themeMappings: TokenEntry[];
|
|
43
|
+
};
|
|
44
|
+
export declare function emitTokensCatalog(repoRoot: string): {
|
|
45
|
+
written: boolean;
|
|
46
|
+
filesScanned: number;
|
|
47
|
+
lightCount?: number;
|
|
48
|
+
darkCount?: number;
|
|
49
|
+
themeCount?: number;
|
|
50
|
+
skippedReason?: string;
|
|
51
|
+
};
|
|
52
|
+
export declare function renderTokensMarkdown(catalog: TokenCatalog): string;
|
|
53
|
+
//# sourceMappingURL=emit-tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-tokens.d.ts","sourceRoot":"","sources":["../../../src/commands/map/emit-tokens.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB;AA0CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,IAAI,EAAE,UAAU,EAAE,CAAC;IAAC,aAAa,EAAE,UAAU,EAAE,CAAA;CAAE,CAsE1E;AAkGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAoDA;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAmDlE"}
|
|
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAc,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AA8B3C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,cAAc;IACd,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;IACL,SAAS;IACT,MAAM;IACN,UAAU;IACV,UAAU;IACV,SAAS;CACV,CAAC,CAAC;AAEH,SAAS,OAAO,CAAC,IAAY,EAAE,MAAgB,EAAE,EAAE,MAAc,IAAI;IACnE,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,WAAmB;IAEnB,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAiB,EAAE,CAAC;IAEvC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,wBAAwB;IACxB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACf,8BAA8B;QAC9B,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;YAAE,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,GAAG,GAAG,CAAC;gBAAE,MAAM;YACnB,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,8DAA8D;QAC9D,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC;gBACrD,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;gBACb,SAAS;YACX,CAAC;QACH,CAAC;QACD,0CAA0C;QAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,SAAS,GAAG,CAAC;YAAE,MAAM;QACzB,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,oEAAoE;QACpE,qEAAqE;QACrE,gBAAgB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,QAAQ,IAAI,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAC/C,IAAI,IAAI,IAAI,IAAI;YAAE,MAAM;QAExB,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3E,8DAA8D;YAC9D,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACrD,uEAAuE;YACvE,uEAAuE;YACvE,IAAI,CAAC,IAAI,CACP,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAe,EAAE,CAAC,CAAC,EAC/D,GAAG,KAAK,CAAC,IAAI,CACd,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACjD,MAAM,OAAO,GAAqB,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YACxE,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,+EAA+E;QAE/E,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;IACf,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACxC,CAAC;AAED,2FAA2F;AAC3F,SAAS,SAAS,CAAC,CAAS,EAAE,KAAa;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YACzB,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+DAA+D;AAC/D,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,GAAG,GAAsC,EAAE,CAAC;IAClD,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACvD,yEAAyE;IACzE,sEAAsE;IACtE,wBAAwB;IACxB,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC9D,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,cAAc,GAAG,yDAAyD,CAAC;AACjF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,aAAa;IACb,cAAc;IACd,OAAO;IACP,OAAO;IACP,KAAK;IACL,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,CAAS,EAAE,SAA8B;IAC7D,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC5D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;QACzC,IAAI,MAAM;YAAE,OAAO,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAE,SAA8B;IAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,IACE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxB,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;QACxB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACpB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACpB,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,EAC9B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,YAAY,CAAC;IAC7F,IACE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QACrB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAQhD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC;IACnF,CAAC;IAED,MAAM,OAAO,GAAiB;QAC5B,KAAK,EAAE,EAAE;QACT,IAAI,EAAE,EAAE;QACR,aAAa,EAAE,EAAE;QACjB,YAAY,EAAE,QAAQ,CAAC,MAAM;KAC9B,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IAED,IACE,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QACzB,OAAO,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAClC,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,aAAa,EAAE,WAAW,QAAQ,CAAC,MAAM,gDAAgD;SAC1F,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACzC,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,WAAW,CAAC,CAAC;IAC1C,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAEnC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC7B,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;QAChC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;QAC9B,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,GAAG,CAAC,IAAI,CACN,sFAAsF,CACvF,CAAC;IACF,GAAG,CAAC,IAAI,CACN,gBAAgB,OAAO,CAAC,YAAY,kBAAkB,OAAO,CAAC,KAAK,CAAC,MAAM,WAAW,OAAO,CAAC,IAAI,CAAC,MAAM,UAAU,OAAO,CAAC,aAAa,CAAC,MAAM,yBAAyB,CACxK,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACxC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,GAAG,CAAC,IAAI,CACN,+EAA+E,CAChF,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEb,MAAM,MAAM,GAA8D;QACxE,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,yBAAyB,CAAC;QACnD,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,sDAAsD,CAAC;QAC9E,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,yCAAyC,CAAC;KAC5E,CAAC;IAEF,KAAK,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEb,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,EAAkB,EAAE,UAAU,EAAE,EAAkB,EAAE,OAAO,EAAE,EAAkB,EAAE,KAAK,EAAE,EAAkB,EAAE,CAAC;QACtI,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAyB,CAAC;YACvE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,KAAK,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACzC,GAAG,CAAC,IAAI,CAAC,OAAO,UAAU,KAAK,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YACxD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,UAAU,KAAK,UAAU,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC;YACjE,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC/B,CAAC"}
|
|
@@ -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":"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"}
|