@slowcook-ai/cli 0.19.0-alpha.17 → 0.19.0-alpha.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/AGENTS.md +2 -1
  2. package/dist/cli.js +37 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/brand/index.d.ts +58 -0
  5. package/dist/commands/brand/index.d.ts.map +1 -0
  6. package/dist/commands/brand/index.js +257 -0
  7. package/dist/commands/brand/index.js.map +1 -0
  8. package/dist/commands/budget/index.d.ts +2 -0
  9. package/dist/commands/budget/index.d.ts.map +1 -0
  10. package/dist/commands/budget/index.js +252 -0
  11. package/dist/commands/budget/index.js.map +1 -0
  12. package/dist/commands/dev-env/config.d.ts +136 -0
  13. package/dist/commands/dev-env/config.d.ts.map +1 -0
  14. package/dist/commands/dev-env/config.js +96 -0
  15. package/dist/commands/dev-env/config.js.map +1 -0
  16. package/dist/commands/dev-env/index.d.ts +27 -0
  17. package/dist/commands/dev-env/index.d.ts.map +1 -0
  18. package/dist/commands/dev-env/index.js +226 -0
  19. package/dist/commands/dev-env/index.js.map +1 -0
  20. package/dist/commands/dev-env/init.d.ts +28 -0
  21. package/dist/commands/dev-env/init.d.ts.map +1 -0
  22. package/dist/commands/dev-env/init.js +135 -0
  23. package/dist/commands/dev-env/init.js.map +1 -0
  24. package/dist/commands/eval/index.d.ts +54 -0
  25. package/dist/commands/eval/index.d.ts.map +1 -0
  26. package/dist/commands/eval/index.js +283 -0
  27. package/dist/commands/eval/index.js.map +1 -0
  28. package/dist/commands/init/mock-vite.d.ts +54 -0
  29. package/dist/commands/init/mock-vite.d.ts.map +1 -0
  30. package/dist/commands/init/mock-vite.js +611 -0
  31. package/dist/commands/init/mock-vite.js.map +1 -0
  32. package/dist/commands/init/mock.d.ts +6 -0
  33. package/dist/commands/init/mock.d.ts.map +1 -1
  34. package/dist/commands/init/mock.js +20 -4
  35. package/dist/commands/init/mock.js.map +1 -1
  36. package/dist/commands/init/plan.d.ts +26 -1
  37. package/dist/commands/init/plan.d.ts.map +1 -1
  38. package/dist/commands/init/plan.js +41 -3
  39. package/dist/commands/init/plan.js.map +1 -1
  40. package/dist/commands/plate/agent.d.ts +7 -0
  41. package/dist/commands/plate/agent.d.ts.map +1 -1
  42. package/dist/commands/plate/agent.js +1 -1
  43. package/dist/commands/plate/agent.js.map +1 -1
  44. package/dist/commands/plate/index.d.ts.map +1 -1
  45. package/dist/commands/plate/index.js +6 -0
  46. package/dist/commands/plate/index.js.map +1 -1
  47. package/dist/commands/recon/index.d.ts +1 -1
  48. package/dist/commands/recon/index.d.ts.map +1 -1
  49. package/dist/commands/recon/index.js +26 -0
  50. package/dist/commands/recon/index.js.map +1 -1
  51. package/dist/commands/recon/migration-gate.d.ts +59 -0
  52. package/dist/commands/recon/migration-gate.d.ts.map +1 -0
  53. package/dist/commands/recon/migration-gate.js +131 -0
  54. package/dist/commands/recon/migration-gate.js.map +1 -0
  55. package/dist/commands/refine/agent.d.ts +12 -0
  56. package/dist/commands/refine/agent.d.ts.map +1 -1
  57. package/dist/commands/refine/agent.js +173 -13
  58. package/dist/commands/refine/agent.js.map +1 -1
  59. package/dist/commands/refine/brownfield-answer.d.ts +81 -0
  60. package/dist/commands/refine/brownfield-answer.d.ts.map +1 -0
  61. package/dist/commands/refine/brownfield-answer.js +231 -0
  62. package/dist/commands/refine/brownfield-answer.js.map +1 -0
  63. package/dist/commands/refine/context.d.ts.map +1 -1
  64. package/dist/commands/refine/context.js +18 -0
  65. package/dist/commands/refine/context.js.map +1 -1
  66. package/dist/commands/refine/history-index.d.ts +59 -0
  67. package/dist/commands/refine/history-index.d.ts.map +1 -1
  68. package/dist/commands/refine/history-index.js +195 -8
  69. package/dist/commands/refine/history-index.js.map +1 -1
  70. package/dist/commands/refine/index.d.ts.map +1 -1
  71. package/dist/commands/refine/index.js +32 -1
  72. package/dist/commands/refine/index.js.map +1 -1
  73. package/dist/commands/refine/proposals-synth.d.ts +50 -1
  74. package/dist/commands/refine/proposals-synth.d.ts.map +1 -1
  75. package/dist/commands/refine/proposals-synth.js +199 -35
  76. package/dist/commands/refine/proposals-synth.js.map +1 -1
  77. package/dist/commands/refine/spec-yaml.d.ts +274 -250
  78. package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
  79. package/dist/commands/refine/spec-yaml.js +10 -0
  80. package/dist/commands/refine/spec-yaml.js.map +1 -1
  81. package/dist/commands/run-mock/index.d.ts.map +1 -1
  82. package/dist/commands/run-mock/index.js +7 -1
  83. package/dist/commands/run-mock/index.js.map +1 -1
  84. package/dist/commands/testgen/agent.d.ts.map +1 -1
  85. package/dist/commands/testgen/agent.js +34 -9
  86. package/dist/commands/testgen/agent.js.map +1 -1
  87. package/dist/commands/vibe/agent.d.ts +7 -0
  88. package/dist/commands/vibe/agent.d.ts.map +1 -1
  89. package/dist/commands/vibe/agent.js +2 -2
  90. package/dist/commands/vibe/agent.js.map +1 -1
  91. package/dist/commands/vibe/index.d.ts.map +1 -1
  92. package/dist/commands/vibe/index.js +7 -1
  93. package/dist/commands/vibe/index.js.map +1 -1
  94. package/dist/cost-store.d.ts +52 -0
  95. package/dist/cost-store.d.ts.map +1 -0
  96. package/dist/cost-store.js +108 -0
  97. package/dist/cost-store.js.map +1 -0
  98. package/dist/lib/budget.d.ts +123 -0
  99. package/dist/lib/budget.d.ts.map +1 -0
  100. package/dist/lib/budget.js +225 -0
  101. package/dist/lib/budget.js.map +1 -0
  102. package/dist/lib/mock-shape.d.ts +44 -0
  103. package/dist/lib/mock-shape.d.ts.map +1 -0
  104. package/dist/lib/mock-shape.js +77 -0
  105. package/dist/lib/mock-shape.js.map +1 -0
  106. package/package.json +4 -4
@@ -0,0 +1,283 @@
1
+ /**
2
+ * `slowcook eval` — 0.19.0-α.17 (closes #19, partial).
3
+ *
4
+ * No-regression gate for prompt-changing PRs. Loads frozen fixtures
5
+ * from `packages/cli/eval/fixtures/<id>/fixture.json`, calls the
6
+ * relevant `build*Prompt(args)` function from `@slowcook-ai/llm-anthropic`,
7
+ * and asserts the resulting prompt string contains all of the
8
+ * fixture's `expected_prompt_includes` substrings and none of its
9
+ * `expected_prompt_excludes` substrings.
10
+ *
11
+ * Why prompt-shape assertions instead of running the LLM against the
12
+ * fixture: the regression class #19 names ("subtle prompt drift that
13
+ * drops critical context") is structural. Asserting on construction
14
+ * shape catches it deterministically without burning Anthropic credit
15
+ * or introducing nondeterminism into CI. A future fixture-class can
16
+ * layer LLM-output assertions on top once we have a recorded-replay
17
+ * shape; today this gate is the cheap, fast, contract-grade floor.
18
+ *
19
+ * Discovery model: walks `packages/cli/eval/fixtures/<id>/` directly
20
+ * by listing subdirectories with a `fixture.json` inside. No central
21
+ * registry — each fixture is self-describing.
22
+ */
23
+ import { readFileSync, readdirSync, existsSync, statSync } from "node:fs";
24
+ import { dirname, join } from "node:path";
25
+ import { fileURLToPath } from "node:url";
26
+ import { buildChefPrompt, buildChefOrchestratePrompt, buildInvestigateUserPrompt, buildNavigatorPrompt, buildPlateAmendmentPrompt, buildSiftTurnPrompt, buildVibeUserPrompt, REFINEMENT_ANALYST_SYSTEM, BROWNFIELD_ANSWER_SYSTEM, } from "@slowcook-ai/llm-anthropic";
27
+ /**
28
+ * Map from `fixture.agent` → prompt-builder function. Each builder is
29
+ * the canonical entrypoint that consumer agents call at runtime — so
30
+ * a prompt regression that drops context will show up here.
31
+ *
32
+ * Plate's builder returns Array<...> rather than string; we render its
33
+ * concatenated text for the substring check.
34
+ */
35
+ const BUILDERS = {
36
+ chef: (args) => buildChefPrompt(args),
37
+ "chef-orchestrate": (args) => buildChefOrchestratePrompt(args),
38
+ investigate: (args) => buildInvestigateUserPrompt(args),
39
+ navigator: (args) => buildNavigatorPrompt(args),
40
+ plate: (args) => {
41
+ const blocks = buildPlateAmendmentPrompt(args);
42
+ return blocks
43
+ .map((b) => {
44
+ if (typeof b === "string")
45
+ return b;
46
+ if (b && typeof b === "object" && "text" in b)
47
+ return String(b.text);
48
+ return JSON.stringify(b);
49
+ })
50
+ .join("\n\n");
51
+ },
52
+ sift: (args) => buildSiftTurnPrompt(args),
53
+ vibe: (args) => buildVibeUserPrompt(args),
54
+ refine: (args) => {
55
+ // REFINEMENT_ANALYST_SYSTEM is the system prompt — the surface
56
+ // where the PM-facing question-shape + decide-first rules live.
57
+ // Eval fixtures assert on the system prompt's contents.
58
+ const a = args;
59
+ return REFINEMENT_ANALYST_SYSTEM(a.checklist ?? "", a.projectContext ?? "");
60
+ },
61
+ "refine-brownfield-answer": () => {
62
+ // 0.19.0-α.36 — Pass B reflexive brownfield-answer prompt. Static,
63
+ // no inputs woven in; the prompt is consumed as-is. Eval fixtures
64
+ // assert on its required-rules surface (verbatim copy, source
65
+ // citation, conservative-ambiguous, JSON output, etc.).
66
+ return BROWNFIELD_ANSWER_SYSTEM;
67
+ },
68
+ };
69
+ function parseArgs(argv) {
70
+ const args = { all: false, list: false };
71
+ for (let i = 0; i < argv.length; i++) {
72
+ const a = argv[i];
73
+ const next = argv[i + 1];
74
+ if (a === "--fixture" && next) {
75
+ args.fixtureId = next;
76
+ i++;
77
+ }
78
+ else if (a === "--all") {
79
+ args.all = true;
80
+ }
81
+ else if (a === "--list") {
82
+ args.list = true;
83
+ }
84
+ else if (a === "--fixtures-dir" && next) {
85
+ args.fixturesDir = next;
86
+ i++;
87
+ }
88
+ else if (a === "--help" || a === "-h") {
89
+ printHelp();
90
+ process.exit(0);
91
+ }
92
+ }
93
+ return args;
94
+ }
95
+ function printHelp() {
96
+ console.log(`
97
+ slowcook eval — prompt-regression gate
98
+
99
+ Loads frozen fixtures from packages/cli/eval/fixtures/<id>/fixture.json
100
+ and asserts the agent's prompt-builder output contains all expected
101
+ substrings (and none of the excluded ones).
102
+
103
+ Usage:
104
+ slowcook eval --fixture <id> Run one fixture by id.
105
+ slowcook eval --all Run every discovered fixture.
106
+ slowcook eval --list List fixture ids + descriptions.
107
+
108
+ Options:
109
+ --fixtures-dir <path> Override the default fixtures location
110
+ (mostly for tests / local experiments).
111
+
112
+ Exit code:
113
+ 0 all targeted fixtures passed
114
+ 1 at least one fixture failed or errored
115
+ 64 usage error
116
+ `);
117
+ }
118
+ /**
119
+ * Resolve the default fixtures directory. Walks up from the CLI's
120
+ * compiled location to find the `packages/cli/eval/fixtures/` tree.
121
+ * In tests + local dev the caller passes `--fixtures-dir` directly.
122
+ */
123
+ export function defaultFixturesDir() {
124
+ const here = dirname(fileURLToPath(import.meta.url));
125
+ // here is .../packages/cli/dist/commands/eval — climb out to packages/cli/.
126
+ return join(here, "..", "..", "..", "eval", "fixtures");
127
+ }
128
+ export function listFixtureIds(fixturesDir) {
129
+ if (!existsSync(fixturesDir))
130
+ return [];
131
+ return readdirSync(fixturesDir)
132
+ .filter((name) => {
133
+ const path = join(fixturesDir, name);
134
+ if (!statSync(path).isDirectory())
135
+ return false;
136
+ return existsSync(join(path, "fixture.json"));
137
+ })
138
+ .sort();
139
+ }
140
+ export function loadFixture(fixturesDir, id) {
141
+ const path = join(fixturesDir, id, "fixture.json");
142
+ if (!existsSync(path)) {
143
+ throw new Error(`Fixture not found: ${id} (expected ${path})`);
144
+ }
145
+ const raw = readFileSync(path, "utf8");
146
+ let parsed;
147
+ try {
148
+ parsed = JSON.parse(raw);
149
+ }
150
+ catch (e) {
151
+ throw new Error(`Fixture ${id} is not valid JSON: ${e.message}`);
152
+ }
153
+ validateFixture(parsed, id);
154
+ return parsed;
155
+ }
156
+ function validateFixture(f, idHint) {
157
+ if (!f.id)
158
+ throw new Error(`Fixture ${idHint}: missing 'id'`);
159
+ if (!f.agent)
160
+ throw new Error(`Fixture ${f.id}: missing 'agent'`);
161
+ if (!(f.agent in BUILDERS)) {
162
+ throw new Error(`Fixture ${f.id}: unknown agent '${f.agent}'. Known: ${Object.keys(BUILDERS).sort().join(", ")}`);
163
+ }
164
+ if (!f.input || typeof f.input !== "object") {
165
+ throw new Error(`Fixture ${f.id}: missing 'input' object`);
166
+ }
167
+ if (!Array.isArray(f.expected_prompt_includes)) {
168
+ throw new Error(`Fixture ${f.id}: 'expected_prompt_includes' must be an array of strings`);
169
+ }
170
+ if (f.expected_prompt_includes.length === 0) {
171
+ throw new Error(`Fixture ${f.id}: 'expected_prompt_includes' is empty — a fixture must assert at least one substring`);
172
+ }
173
+ if (f.expected_prompt_excludes && !Array.isArray(f.expected_prompt_excludes)) {
174
+ throw new Error(`Fixture ${f.id}: 'expected_prompt_excludes' must be an array of strings if present`);
175
+ }
176
+ }
177
+ export function runFixture(f) {
178
+ const builder = BUILDERS[f.agent];
179
+ if (!builder) {
180
+ return {
181
+ id: f.id,
182
+ agent: f.agent,
183
+ status: "error",
184
+ missingIncludes: [],
185
+ unexpectedExcludes: [],
186
+ errorMessage: `No builder registered for agent '${f.agent}'`,
187
+ };
188
+ }
189
+ let prompt;
190
+ try {
191
+ prompt = builder(f.input);
192
+ }
193
+ catch (e) {
194
+ return {
195
+ id: f.id,
196
+ agent: f.agent,
197
+ status: "error",
198
+ missingIncludes: [],
199
+ unexpectedExcludes: [],
200
+ errorMessage: `Prompt builder threw: ${e.message}`,
201
+ };
202
+ }
203
+ const missing = f.expected_prompt_includes.filter((s) => !prompt.includes(s));
204
+ const unexpected = (f.expected_prompt_excludes ?? []).filter((s) => prompt.includes(s));
205
+ return {
206
+ id: f.id,
207
+ agent: f.agent,
208
+ status: missing.length === 0 && unexpected.length === 0 ? "pass" : "fail",
209
+ missingIncludes: missing,
210
+ unexpectedExcludes: unexpected,
211
+ };
212
+ }
213
+ function reportResult(r) {
214
+ const icon = r.status === "pass" ? "✓" : r.status === "fail" ? "✗" : "!";
215
+ console.log(`${icon} [${r.agent}] ${r.id}`);
216
+ if (r.status === "fail") {
217
+ if (r.missingIncludes.length > 0) {
218
+ console.log(" Missing required substrings:");
219
+ for (const s of r.missingIncludes)
220
+ console.log(` - ${JSON.stringify(s)}`);
221
+ }
222
+ if (r.unexpectedExcludes.length > 0) {
223
+ console.log(" Found forbidden substrings:");
224
+ for (const s of r.unexpectedExcludes)
225
+ console.log(` - ${JSON.stringify(s)}`);
226
+ }
227
+ }
228
+ else if (r.status === "error") {
229
+ console.log(` ${r.errorMessage}`);
230
+ }
231
+ }
232
+ export async function evalCmd(argv) {
233
+ const args = parseArgs(argv);
234
+ const fixturesDir = args.fixturesDir ?? defaultFixturesDir();
235
+ if (!args.all && !args.fixtureId && !args.list) {
236
+ console.error("slowcook eval: one of --all / --fixture / --list is required");
237
+ printHelp();
238
+ process.exit(64);
239
+ }
240
+ const allIds = listFixtureIds(fixturesDir);
241
+ if (allIds.length === 0) {
242
+ console.error(`No fixtures found under ${fixturesDir}`);
243
+ process.exit(1);
244
+ }
245
+ if (args.list) {
246
+ console.log(`Fixtures in ${fixturesDir}:`);
247
+ for (const id of allIds) {
248
+ const f = loadFixture(fixturesDir, id);
249
+ console.log(` ${id} [${f.agent}] ${f.description}`);
250
+ }
251
+ return;
252
+ }
253
+ const targets = args.all ? allIds : [args.fixtureId];
254
+ const results = [];
255
+ for (const id of targets) {
256
+ let f;
257
+ try {
258
+ f = loadFixture(fixturesDir, id);
259
+ }
260
+ catch (e) {
261
+ results.push({
262
+ id,
263
+ agent: "?",
264
+ status: "error",
265
+ missingIncludes: [],
266
+ unexpectedExcludes: [],
267
+ errorMessage: e.message,
268
+ });
269
+ continue;
270
+ }
271
+ results.push(runFixture(f));
272
+ }
273
+ for (const r of results)
274
+ reportResult(r);
275
+ const passed = results.filter((r) => r.status === "pass").length;
276
+ const failed = results.filter((r) => r.status === "fail").length;
277
+ const errored = results.filter((r) => r.status === "error").length;
278
+ console.log("");
279
+ console.log(`Eval summary: ${passed} passed, ${failed} failed, ${errored} errored.`);
280
+ if (failed > 0 || errored > 0)
281
+ process.exit(1);
282
+ }
283
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/eval/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AAqBpC;;;;;;;GAOG;AACH,MAAM,QAAQ,GAA8C;IAC1D,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAA6C,CAAC;IAC9E,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC3B,0BAA0B,CAAC,IAAwD,CAAC;IACtF,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CACpB,0BAA0B,CAAC,IAAwD,CAAC;IACtF,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAClB,oBAAoB,CAAC,IAAkD,CAAC;IAC1E,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,yBAAyB,CACtC,IAAuD,CACxD,CAAC;QACF,OAAO,MAAM;aACV,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE;YAClB,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC;gBAAE,OAAO,MAAM,CAAE,CAAuB,CAAC,IAAI,CAAC,CAAC;YAC5F,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAiD,CAAC;IACtF,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAiD,CAAC;IACtF,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,+DAA+D;QAC/D,gEAAgE;QAChE,wDAAwD;QACxD,MAAM,CAAC,GAAG,IAAuD,CAAC;QAClE,OAAO,yBAAyB,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,0BAA0B,EAAE,GAAG,EAAE;QAC/B,mEAAmE;QACnE,kEAAkE;QAClE,8DAA8D;QAC9D,wDAAwD;QACxD,OAAO,wBAAwB,CAAC;IAClC,CAAC;CACF,CAAC;AASF,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAa,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACnD,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,WAAW,IAAI,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,CAAC,KAAK,gBAAgB,IAAI,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;CAoBb,CAAC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,4EAA4E;IAC5E,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,OAAO,WAAW,CAAC,WAAW,CAAC;SAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAC;QAChD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC;SACD,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,EAAU;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,cAAc,IAAI,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,uBAAwB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,CAAU,EAAE,MAAc;IACjD,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,gBAAgB,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAClE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,WAAW,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,KAAK,aAAa,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,0DAA0D,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,CAAC,wBAAwB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,WAAW,CAAC,CAAC,EAAE,sFAAsF,CACtG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,wBAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,qEAAqE,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,OAAO;YACf,eAAe,EAAE,EAAE;YACnB,kBAAkB,EAAE,EAAE;YACtB,YAAY,EAAE,oCAAoC,CAAC,CAAC,KAAK,GAAG;SAC7D,CAAC;IACJ,CAAC;IACD,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,OAAO;YACf,eAAe,EAAE,EAAE;YACnB,kBAAkB,EAAE,EAAE;YACtB,YAAY,EAAE,yBAA0B,CAAW,CAAC,OAAO,EAAE;SAC9D,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACzE,eAAe,EAAE,OAAO;QACxB,kBAAkB,EAAE,UAAU;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,CAAgB;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe;gBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB;gBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;IAE7D,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,WAAW,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,GAAG,CAAC,CAAC;QAC3C,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;IAEtD,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,CAAU,CAAC;QACf,IAAI,CAAC;YACH,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE;gBACF,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,OAAO;gBACf,eAAe,EAAE,EAAE;gBACnB,kBAAkB,EAAE,EAAE;gBACtB,YAAY,EAAG,CAAW,CAAC,OAAO;aACnC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,YAAY,MAAM,YAAY,OAAO,WAAW,CAAC,CAAC;IAErF,IAAI,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * `slowcook init mock --shape vite` — scaffold a Vite/React SPA mock.
3
+ *
4
+ * Sibling of the Next.js scaffolder (`mock.ts`). The Vite shape is the
5
+ * preferred default for new consumers as of sc#82 — solves the focus-
6
+ * loss / hydration-mismatch / `'use client'`-everywhere class of bugs
7
+ * that the Next.js shape inherits from production.
8
+ *
9
+ * Layout produced:
10
+ *
11
+ * mock/
12
+ * ├── package.json vite + react + react-router-dom + @slowcook-ai/mock-runtime
13
+ * ├── vite.config.ts port 3100; @/ → src/ alias
14
+ * ├── tsconfig.json ESNext + bundler resolution + jsx react-jsx
15
+ * ├── index.html #root mount
16
+ * ├── .gitignore node_modules, dist
17
+ * ├── README.md run instructions + how vibe extends the router
18
+ * └── src/
19
+ * ├── main.tsx StrictMode + BrowserRouter + ScenarioRegistryProvider
20
+ * ├── App.tsx <Routes /> — vibe appends new screen routes here
21
+ * ├── design-system/ ← `slowcook brand` populates this; seeded minimal here
22
+ * │ ├── tokens.ts
23
+ * │ ├── css.ts
24
+ * │ └── index.ts
25
+ * ├── lib/
26
+ * │ └── scenario-registry.ts
27
+ * └── apps/.gitkeep
28
+ *
29
+ * Plus, at the repo root:
30
+ * .brewing/mock.yaml downstream agents read this to know the shape
31
+ *
32
+ * The design-system files seeded here are MINIMAL — a neutral palette,
33
+ * just enough so `npm run dev` renders something. The full design-system
34
+ * (logo, full primitives, ds-* utility CSS) is the output of the
35
+ * `slowcook brand` agent (Phase 4 of sc#82); it runs once per project
36
+ * and overwrites these seed files.
37
+ */
38
+ export interface MockViteInitArgs {
39
+ cwd: string;
40
+ force: boolean;
41
+ dryRun: boolean;
42
+ /** Pinned version of @slowcook-ai/mock-runtime to depend on. */
43
+ runtimeVersion: string;
44
+ }
45
+ interface FileToWrite {
46
+ path: string;
47
+ contents: string;
48
+ skipIfExists?: boolean;
49
+ }
50
+ export declare function planMockViteFiles(args: MockViteInitArgs): FileToWrite[];
51
+ export declare function applyMockViteFiles(args: MockViteInitArgs, files: FileToWrite[]): void;
52
+ export declare function initMockVite(argv: string[], cliVersion: string): Promise<void>;
53
+ export {};
54
+ //# sourceMappingURL=mock-vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-vite.d.ts","sourceRoot":"","sources":["../../../src/commands/init/mock-vite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAiBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,WAAW,EAAE,CAmBvE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAerF;AAggBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BpF"}