@slowcook-ai/cli 0.17.0-alpha.5 → 0.17.0-alpha.7

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.
@@ -0,0 +1,343 @@
1
+ /**
2
+ * @slowcook 0.17.6+ — recon shape-preservation tests.
3
+ *
4
+ * Reads mock UI files for a story and emits structural assertions to
5
+ * tests/integration/story-N-shape.test.tsx. Pure deterministic; no LLM.
6
+ *
7
+ * Asserts SHAPE only (per `feedback_shape_tests_belong_to_recon_not_testgen`):
8
+ * - testid presence + cardinality
9
+ * - DOM containment (e.g. badge inside <header>)
10
+ * - className tokens (visual/a11y signals like `rounded-full`, `min-h-[44px]`)
11
+ * - CSS variable tokens (no inline hex/rgb)
12
+ *
13
+ * Never asserts WIRING (per `feedback_testgen_must_not_over_assert_mock`):
14
+ * - No spied-on hooks, no import existence, no readFileSync of source
15
+ * - No mock-only chrome (subtrees marked `data-mock-chrome="true"` are
16
+ * mechanically excluded from the testid+class extraction)
17
+ *
18
+ * Test rendering uses plain props (no scenario-runtime), so mock-chrome
19
+ * never actually renders in the test even if it weren't filtered.
20
+ */
21
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
22
+ import { join, relative } from "node:path";
23
+ const TOKENS_OF_INTEREST = [
24
+ // Shape tokens
25
+ "rounded-full", "rounded-2xl", "rounded-xl", "rounded-lg", "rounded-md", "rounded-sm",
26
+ // Tap-target / a11y mandates
27
+ "min-h-[44px]", "min-h-11", "h-11", "min-w-[44px]",
28
+ // Common layout primitives that imply structural intent
29
+ "flex", "grid", "inline-flex",
30
+ ];
31
+ /**
32
+ * Scan a mock UI file, return the SHAPE-relevant facts after stripping
33
+ * mock-only chrome subtrees.
34
+ */
35
+ export function extractShape(absFile, repoRoot) {
36
+ if (!existsSync(absFile))
37
+ return null;
38
+ const body = readFileSync(absFile, "utf8");
39
+ const fileRel = relative(repoRoot, absFile).replace(/\\/g, "/");
40
+ // Strip mock-only chrome subtrees BEFORE extraction.
41
+ const cleaned = stripMockChromeSubtrees(body);
42
+ // Component name: simplest extraction.
43
+ const nameMatch = cleaned.match(/export\s+(?:default\s+)?function\s+([A-Z]\w*)/);
44
+ const componentName = nameMatch ? nameMatch[1] ?? null : null;
45
+ const testids = [...new Set(extractTestids(cleaned))];
46
+ const visualTokens = [...new Set(extractTokens(cleaned, TOKENS_OF_INTEREST))];
47
+ const hasHeader = /<header\b/.test(cleaned);
48
+ return { file: fileRel, testids, visualTokens, hasHeader, componentName };
49
+ }
50
+ /**
51
+ * Strip JSX subtrees marked as mock-only chrome. Two conventions:
52
+ * 1. data-mock-chrome="true" attribute on the wrapping element
53
+ * 2. JSX comment immediately preceding (matching /Mock-only/i)
54
+ *
55
+ * Conservative — false positives (treating real shape as chrome) are
56
+ * worse than false negatives.
57
+ */
58
+ export function stripMockChromeSubtrees(source) {
59
+ let out = source;
60
+ // Pass 1: strip elements opened with data-mock-chrome="true" (and their
61
+ // children up to the matching closing tag).
62
+ out = stripBalancedJsxBlock(out, /<(\w+)\b[^>]*\bdata-mock-chrome\s*=\s*["']true["'][^>]*>/);
63
+ // Pass 2: best-effort — strip the JSX block that immediately follows
64
+ // a `{/* Mock-only ... */}` JSX comment.
65
+ out = stripBalancedJsxBlockAfter(out, /\{\/\*\s*Mock-only[^*]*\*\/\s*\}\s*/);
66
+ return out;
67
+ }
68
+ /**
69
+ * Repeatedly find a JSX opening tag matching `openRe` and remove the
70
+ * balanced subtree (open tag + children + close tag).
71
+ *
72
+ * Self-closing tags (e.g. `<Foo />`) are also handled. Tag-name balanced.
73
+ */
74
+ function stripBalancedJsxBlock(source, openRe) {
75
+ let s = source;
76
+ for (let safety = 0; safety < 64; safety++) {
77
+ const m = openRe.exec(s);
78
+ if (!m)
79
+ break;
80
+ const start = m.index;
81
+ const tagName = m[1];
82
+ const openTag = m[0];
83
+ // Self-closing? remove just that.
84
+ if (openTag.endsWith("/>")) {
85
+ s = s.slice(0, start) + s.slice(start + openTag.length);
86
+ openRe.lastIndex = 0;
87
+ continue;
88
+ }
89
+ // Walk forward to find balanced close.
90
+ let depth = 1;
91
+ let i = start + openTag.length;
92
+ const openTagRe = new RegExp(`<${tagName}\\b[^>]*?>`, "g");
93
+ const closeTagRe = new RegExp(`</${tagName}\\s*>`, "g");
94
+ while (i < s.length && depth > 0) {
95
+ openTagRe.lastIndex = i;
96
+ closeTagRe.lastIndex = i;
97
+ const oNext = openTagRe.exec(s);
98
+ const cNext = closeTagRe.exec(s);
99
+ if (!cNext)
100
+ break;
101
+ if (oNext && oNext.index < cNext.index) {
102
+ // skip self-closing inside (rare for compound tag)
103
+ if (!oNext[0].endsWith("/>"))
104
+ depth++;
105
+ i = oNext.index + oNext[0].length;
106
+ }
107
+ else {
108
+ depth--;
109
+ i = cNext.index + cNext[0].length;
110
+ if (depth === 0) {
111
+ s = s.slice(0, start) + s.slice(i);
112
+ break;
113
+ }
114
+ }
115
+ }
116
+ openRe.lastIndex = 0;
117
+ }
118
+ return s;
119
+ }
120
+ function stripBalancedJsxBlockAfter(source, markerRe) {
121
+ let s = source;
122
+ for (let safety = 0; safety < 32; safety++) {
123
+ const m = markerRe.exec(s);
124
+ if (!m)
125
+ break;
126
+ // Find the JSX opening tag immediately after the marker.
127
+ const after = s.slice(m.index + m[0].length);
128
+ const tagMatch = /^\s*<(\w+)\b[^>]*>/.exec(after);
129
+ if (!tagMatch) {
130
+ // Marker not followed by a JSX tag; just remove the marker comment.
131
+ s = s.slice(0, m.index) + s.slice(m.index + m[0].length);
132
+ continue;
133
+ }
134
+ // Use stripBalancedJsxBlock at the marker position with the tag-specific regex.
135
+ const openTagAbsoluteIdx = m.index + m[0].length + (after.indexOf("<"));
136
+ const tagName = tagMatch[1];
137
+ if (!tagName) {
138
+ s = s.slice(0, m.index) + s.slice(m.index + m[0].length);
139
+ continue;
140
+ }
141
+ const openTagRe = new RegExp(`<${tagName}\\b[^>]*?>`);
142
+ const sliced = s.slice(openTagAbsoluteIdx);
143
+ const stripped = stripBalancedJsxBlock(sliced, openTagRe);
144
+ s = s.slice(0, m.index) + stripped;
145
+ markerRe.lastIndex = 0;
146
+ }
147
+ return s;
148
+ }
149
+ function extractTestids(source) {
150
+ const out = [];
151
+ for (const m of source.matchAll(/data-testid\s*=\s*["']([^"']+)["']/g)) {
152
+ if (m[1])
153
+ out.push(m[1]);
154
+ }
155
+ return out;
156
+ }
157
+ function extractTokens(source, tokens) {
158
+ const out = [];
159
+ for (const t of tokens) {
160
+ // Look in className strings/template literals.
161
+ const re = new RegExp(`className\\s*=\\s*["'\`][^"'\`]*\\b${escapeRegExp(t)}\\b`);
162
+ if (re.test(source))
163
+ out.push(t);
164
+ }
165
+ return out;
166
+ }
167
+ function escapeRegExp(s) {
168
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
169
+ }
170
+ export function synthesiseShapeTestFile(opts) {
171
+ const { story, shapes } = opts;
172
+ const lines = [];
173
+ lines.push("// @vitest-environment jsdom");
174
+ lines.push("//");
175
+ lines.push(`// AUTO-GENERATED by slowcook recon (story-${story}). Do not edit by hand.`);
176
+ lines.push("// Asserts STRUCTURAL SHAPE only (DOM containment, testid cardinality,");
177
+ lines.push("// className tokens, CSS-variable usage). Behavioral assertions live in");
178
+ lines.push(`// the testgen-emitted story-${story}-*.test.{ts,tsx} files.`);
179
+ lines.push("//");
180
+ lines.push("// Mock-only chrome (data-mock-chrome=\"true\" subtrees) is excluded.");
181
+ lines.push("// Re-running recon regenerates this file.");
182
+ lines.push("");
183
+ lines.push(`import { describe, it, expect } from "vitest";`);
184
+ lines.push(`import { readFileSync, existsSync } from "node:fs";`);
185
+ lines.push("");
186
+ lines.push(`describe("story-${story} structural shape (recon-emitted)", () => {`);
187
+ // Source-grep based assertions: cheap + always work without a render.
188
+ // The mock's testids/tokens must persist in src/ after brew's edits.
189
+ const allTestids = [...new Set(shapes.flatMap((s) => s.testids))];
190
+ if (allTestids.length === 0 && shapes.every((s) => s.visualTokens.length === 0)) {
191
+ lines.push(` it.skip("no testids/tokens found in mock UI — nothing to assert", () => {});`);
192
+ }
193
+ else {
194
+ for (const shape of shapes) {
195
+ const srcPath = mockToSrcPath(shape.file);
196
+ lines.push(` describe("from mock ${shape.file}", () => {`);
197
+ lines.push(` const srcPath = "${srcPath}";`);
198
+ lines.push(` const src = existsSync(srcPath) ? readFileSync(srcPath, "utf8") : "";`);
199
+ lines.push(``);
200
+ for (const tid of shape.testids) {
201
+ lines.push(` it("preserves data-testid='${tid}' (mock-only chrome excluded)", () => {`);
202
+ lines.push(` expect(src).toMatch(/data-testid\\s*=\\s*["']${escapeRegexForTest(tid)}["']/);`);
203
+ lines.push(` });`);
204
+ }
205
+ for (const token of shape.visualTokens) {
206
+ lines.push(` it("preserves visual token '${token}'", () => {`);
207
+ lines.push(` expect(src).toMatch(/className=[^>]*\\b${escapeRegexForTest(token)}\\b/);`);
208
+ lines.push(` });`);
209
+ }
210
+ if (shape.hasHeader) {
211
+ lines.push(` it("retains a <header> element (semantic landmark)", () => {`);
212
+ lines.push(` expect(src).toMatch(/<header\\b/);`);
213
+ lines.push(` });`);
214
+ }
215
+ lines.push(` });`);
216
+ lines.push(``);
217
+ }
218
+ // Anti-wiring assertion: no inline hex colors (force token-family preservation).
219
+ lines.push(` describe("token-family preservation", () => {`);
220
+ for (const shape of shapes) {
221
+ const srcPath = mockToSrcPath(shape.file);
222
+ lines.push(` it("${shape.componentName ?? shape.file}: no inline hex/rgb colors (use var(--) tokens)", () => {`);
223
+ lines.push(` const src = existsSync("${srcPath}") ? readFileSync("${srcPath}", "utf8") : "";`);
224
+ lines.push(` // Allow hex in JSDoc/comments; only flag in className/style attribute values.`);
225
+ lines.push(` const styled = src.match(/(?:className|style)\\s*=\\s*[\"\`'][^\"\`']*?[#][0-9a-fA-F]{3,8}[^\"\`']*?[\"\`']/g) || [];`);
226
+ lines.push(` expect(styled, "no inline hex in className/style").toEqual([]);`);
227
+ lines.push(` });`);
228
+ }
229
+ lines.push(` });`);
230
+ }
231
+ lines.push(`});`);
232
+ return lines.join("\n") + "\n";
233
+ }
234
+ function mockToSrcPath(mockPath) {
235
+ // mock/src/components/X.tsx → src/components/X.tsx
236
+ return mockPath.replace(/^mock\/src\//, "src/");
237
+ }
238
+ function escapeRegexForTest(s) {
239
+ return s.replace(/[.*+?^${}()|[\]\\\/]/g, "\\\\$&");
240
+ }
241
+ // ---- Discovery: which mock files belong to a story ----
242
+ /**
243
+ * Walk mock/src/ + return any file that contains `story-N` in source
244
+ * OR is referenced by a scenario file for the story.
245
+ *
246
+ * For 0.17.6 first cut: simple — any file under mock/src/components/
247
+ * that lives in a directory referenced by the story's scenario.
248
+ * Conservative — caller can pass explicit list via --mock-files.
249
+ */
250
+ export function findMockFilesForStory(repoRoot, story) {
251
+ const out = new Set();
252
+ // Look for mock/scenarios/story-N*.ts
253
+ const scenariosDir = join(repoRoot, "mock/scenarios");
254
+ if (existsSync(scenariosDir)) {
255
+ for (const name of readdirSync(scenariosDir)) {
256
+ if (!name.startsWith(`story-${story}`))
257
+ continue;
258
+ const body = readFileSync(join(scenariosDir, name), "utf8");
259
+ // Pull `from "@/components/X/Y"` imports
260
+ for (const m of body.matchAll(/from\s+["']@\/(components\/[\w\-./[\]]+)["']/g)) {
261
+ if (m[1]) {
262
+ const candidates = [
263
+ `mock/src/${m[1]}.tsx`,
264
+ `mock/src/${m[1]}.ts`,
265
+ `mock/src/${m[1]}/index.tsx`,
266
+ ];
267
+ for (const c of candidates) {
268
+ if (existsSync(join(repoRoot, c)))
269
+ out.add(c);
270
+ }
271
+ }
272
+ }
273
+ }
274
+ }
275
+ // Also: any mock component referenced by a story-N test file
276
+ const testsDir = join(repoRoot, "tests/integration");
277
+ if (existsSync(testsDir)) {
278
+ for (const name of readdirSync(testsDir)) {
279
+ if (!name.startsWith(`story-${story}`))
280
+ continue;
281
+ const body = readFileSync(join(testsDir, name), "utf8");
282
+ for (const m of body.matchAll(/from\s+["']@\/(components\/[\w\-./[\]]+)["']/g)) {
283
+ if (m[1]) {
284
+ const candidates = [
285
+ `mock/src/${m[1]}.tsx`,
286
+ `mock/src/${m[1]}.ts`,
287
+ ];
288
+ for (const c of candidates) {
289
+ if (existsSync(join(repoRoot, c)))
290
+ out.add(c);
291
+ }
292
+ }
293
+ }
294
+ }
295
+ }
296
+ // Transitive walk: keep expanding until no new files added.
297
+ const visited = new Set();
298
+ for (let safety = 0; safety < 20; safety++) {
299
+ let added = false;
300
+ for (const file of [...out]) {
301
+ if (visited.has(file))
302
+ continue;
303
+ visited.add(file);
304
+ const body = readFileSync(join(repoRoot, file), "utf8");
305
+ const dir = file.split("/").slice(0, -1).join("/");
306
+ for (const m of body.matchAll(/from\s+["']\.\/([\w\-./]+)["']/g)) {
307
+ if (!m[1])
308
+ continue;
309
+ const candidates = [
310
+ `${dir}/${m[1]}.tsx`,
311
+ `${dir}/${m[1]}.ts`,
312
+ `${dir}/${m[1]}/index.tsx`,
313
+ ];
314
+ for (const c of candidates) {
315
+ if (existsSync(join(repoRoot, c)) && !out.has(c)) {
316
+ out.add(c);
317
+ added = true;
318
+ }
319
+ }
320
+ }
321
+ for (const m of body.matchAll(/from\s+["']@\/(components\/[\w\-./[\]]+)["']/g)) {
322
+ if (!m[1])
323
+ continue;
324
+ const candidates = [`mock/src/${m[1]}.tsx`, `mock/src/${m[1]}.ts`];
325
+ for (const c of candidates) {
326
+ if (existsSync(join(repoRoot, c)) && !out.has(c)) {
327
+ out.add(c);
328
+ added = true;
329
+ }
330
+ }
331
+ }
332
+ }
333
+ if (!added)
334
+ break;
335
+ }
336
+ return [...out];
337
+ }
338
+ // Re-export for tests
339
+ export { join as _join };
340
+ // re-export to placate tsc unused-import warnings
341
+ void readdirSync;
342
+ void statSync;
343
+ //# sourceMappingURL=shape-preserve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-preserve.js","sourceRoot":"","sources":["../../../src/commands/recon/shape-preserve.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slowcook-ai/cli",
3
- "version": "0.17.0-alpha.5",
3
+ "version": "0.17.0-alpha.7",
4
4
  "description": "CLI for the slowcook brewing harness",
5
5
  "license": "MIT",
6
6
  "author": "aminazar",
@@ -38,12 +38,12 @@
38
38
  "ts-morph": "^24.0.0",
39
39
  "yaml": "^2.6.0",
40
40
  "zod": "^3.23.8",
41
+ "@slowcook-ai/review-overlay": "^0.5.3",
42
+ "@slowcook-ai/llm-anthropic": "^0.13.6",
41
43
  "@slowcook-ai/core": "^0.13.0",
42
44
  "@slowcook-ai/stack-ts": "^0.9.8",
43
- "@slowcook-ai/forge-github": "^0.11.6",
44
- "@slowcook-ai/llm-anthropic": "^0.13.1",
45
45
  "@slowcook-ai/recorder": "^0.9.1",
46
- "@slowcook-ai/review-overlay": "^0.5.3"
46
+ "@slowcook-ai/forge-github": "^0.11.6"
47
47
  },
48
48
  "publishConfig": {
49
49
  "access": "public"