@slowcook-ai/cli 0.21.1 → 0.22.0

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 (69) hide show
  1. package/AGENTS.md +5 -0
  2. package/README.md +8 -4
  3. package/dist/cli.js +7 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/brand/index.d.ts.map +1 -1
  6. package/dist/commands/brand/index.js +18 -8
  7. package/dist/commands/brand/index.js.map +1 -1
  8. package/dist/commands/eye/index.d.ts.map +1 -1
  9. package/dist/commands/eye/index.js +16 -6
  10. package/dist/commands/eye/index.js.map +1 -1
  11. package/dist/commands/eye/plan.d.ts +41 -6
  12. package/dist/commands/eye/plan.d.ts.map +1 -1
  13. package/dist/commands/eye/plan.js +52 -9
  14. package/dist/commands/eye/plan.js.map +1 -1
  15. package/dist/commands/eye/run.d.ts +17 -1
  16. package/dist/commands/eye/run.d.ts.map +1 -1
  17. package/dist/commands/eye/run.js +38 -6
  18. package/dist/commands/eye/run.js.map +1 -1
  19. package/dist/commands/greenfield/index.d.ts.map +1 -1
  20. package/dist/commands/greenfield/index.js +33 -3
  21. package/dist/commands/greenfield/index.js.map +1 -1
  22. package/dist/commands/greenfield/status.d.ts +26 -5
  23. package/dist/commands/greenfield/status.d.ts.map +1 -1
  24. package/dist/commands/greenfield/status.js +28 -9
  25. package/dist/commands/greenfield/status.js.map +1 -1
  26. package/dist/commands/menu/assemble.d.ts.map +1 -1
  27. package/dist/commands/menu/assemble.js +6 -0
  28. package/dist/commands/menu/assemble.js.map +1 -1
  29. package/dist/commands/menu/index.d.ts.map +1 -1
  30. package/dist/commands/menu/index.js +42 -14
  31. package/dist/commands/menu/index.js.map +1 -1
  32. package/dist/commands/reconcile/index.d.ts +2 -0
  33. package/dist/commands/reconcile/index.d.ts.map +1 -0
  34. package/dist/commands/reconcile/index.js +171 -0
  35. package/dist/commands/reconcile/index.js.map +1 -0
  36. package/dist/commands/refine/spec-yaml.d.ts +26 -0
  37. package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
  38. package/dist/commands/refine/spec-yaml.js +64 -3
  39. package/dist/commands/refine/spec-yaml.js.map +1 -1
  40. package/dist/commands/trace/check.d.ts +116 -0
  41. package/dist/commands/trace/check.d.ts.map +1 -1
  42. package/dist/commands/trace/check.js +135 -0
  43. package/dist/commands/trace/check.js.map +1 -1
  44. package/dist/commands/trace/index.d.ts +5 -0
  45. package/dist/commands/trace/index.d.ts.map +1 -1
  46. package/dist/commands/trace/index.js +273 -12
  47. package/dist/commands/trace/index.js.map +1 -1
  48. package/dist/commands/upsert-agent-docs.d.ts.map +1 -1
  49. package/dist/commands/upsert-agent-docs.js +11 -0
  50. package/dist/commands/upsert-agent-docs.js.map +1 -1
  51. package/dist/commands/vibe/app-gen.d.ts +43 -0
  52. package/dist/commands/vibe/app-gen.d.ts.map +1 -0
  53. package/dist/commands/vibe/app-gen.js +512 -0
  54. package/dist/commands/vibe/app-gen.js.map +1 -0
  55. package/dist/commands/vibe/index.d.ts.map +1 -1
  56. package/dist/commands/vibe/index.js +287 -2
  57. package/dist/commands/vibe/index.js.map +1 -1
  58. package/dist/commands/vibe/lcr-plan.d.ts +125 -0
  59. package/dist/commands/vibe/lcr-plan.d.ts.map +1 -0
  60. package/dist/commands/vibe/lcr-plan.js +155 -0
  61. package/dist/commands/vibe/lcr-plan.js.map +1 -0
  62. package/dist/commands/vibe/schema-gen.d.ts +52 -0
  63. package/dist/commands/vibe/schema-gen.d.ts.map +1 -0
  64. package/dist/commands/vibe/schema-gen.js +205 -0
  65. package/dist/commands/vibe/schema-gen.js.map +1 -0
  66. package/dist/commands.manifest.d.ts.map +1 -1
  67. package/dist/commands.manifest.js +10 -4
  68. package/dist/commands.manifest.js.map +1 -1
  69. package/package.json +8 -8
@@ -0,0 +1,43 @@
1
+ /**
2
+ * GUCDI — deterministic LCR app generator (pure). The final scaffolding pass of
3
+ * the whole-app `vibe`: turns the LCR plan (routes + personas) into a RUNNABLE,
4
+ * NAVIGABLE Vite/React app — the scaffold (package.json, vite, tailwind v4) + the
5
+ * router (every declared surface a route, no auth walls) + a stub page per route
6
+ * (sets the `@story` marker) — with the **slowcook review-overlay** mounted to
7
+ * provide all REVIEW affordances (persona switch + EPSS epic·persona·scenario·state
8
+ * router + comment capture). Personas live in the overlay's EPSS manifest, NOT in
9
+ * the mock's chrome. No LLM: the skeleton is deterministic; the LLM `vibe surfaces`
10
+ * pass later fills each stub's body. See docs/plans/vibe-whole-mock-lcr.md.
11
+ * The EPSS manifest model (epic·persona·scenario·state, Foundations home for the
12
+ * universal UI-Stack states) is defined in docs/EPSS.md — read it before changing
13
+ * `epssManifestJson`.
14
+ */
15
+ import type { LcrPlan } from "./lcr-plan.js";
16
+ export interface GenFile {
17
+ /** path relative to the mock root (e.g. "src/App.tsx"). */
18
+ path: string;
19
+ content: string;
20
+ }
21
+ /** route → React component name: "/admin/workers" → "AdminWorkersPage", "/" → "HomePage". */
22
+ export declare function routeToName(route: string): string;
23
+ /** The EPSS testing-surfaces.json manifest. Each acceptance_scenario is a test
24
+ * CASE: it starts at `route` in a precondition State (the Gherkin "Given") and
25
+ * walks a Scenario (the "When") to an expected outcome (the "Then"). Grouped
26
+ * epic ▸ context(persona) ▸ scenario(When) ▸ state(Given). The route is just
27
+ * where the test starts — NOT the scenario's identity (one route can back many
28
+ * scenarios). The universal UI-Stack states (loading/empty/error) are NOT
29
+ * repeated per page; they get ONE "Foundations" home that demos the shared
30
+ * <Async> primitive. The overlay renders this as the EPSS router and writes the
31
+ * selection to localStorage for the data adaptor. URL = base + route, so base is
32
+ * "" (scenarios carry absolute routes). */
33
+ export declare function epssManifestJson(plan: LcrPlan, projectName: string): string;
34
+ /** The `.brewing/mock.yaml` content — declares the LCR shape so run-mock + the
35
+ * overlay behave whole-app (device-flow auth, overlay on every route). */
36
+ export declare function mockYaml(): string;
37
+ /** Build the full deterministic LCR app file set from the plan. */
38
+ export declare function generateLcrApp(plan: LcrPlan, opts: {
39
+ projectName: string;
40
+ owner?: string;
41
+ repo?: string;
42
+ }): GenFile[];
43
+ //# sourceMappingURL=app-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-gen.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/app-gen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,OAAO;IACtB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBjD;AAuVD;;;;;;;;;4CAS4C;AAC5C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAmD3E;AAoFD;2EAC2E;AAC3E,wBAAgB,QAAQ,IAAI,MAAM,CAUjC;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,EAAE,CAwBrH"}
@@ -0,0 +1,512 @@
1
+ /** route → React component name: "/admin/workers" → "AdminWorkersPage", "/" → "HomePage". */
2
+ export function routeToName(route) {
3
+ const pascal = (raw) => raw
4
+ .replace(/[^a-zA-Z0-9]+/g, " ")
5
+ .trim()
6
+ .split(/\s+/)
7
+ .map((w) => (w ? w[0].toUpperCase() + w.slice(1) : ""))
8
+ .join("");
9
+ // Keep param segments as `By<Param>` so `/projects/:projectId` →
10
+ // `ProjectsByProjectIdPage`, not a meaningless `Projects2Page` collision.
11
+ const name = route
12
+ .split("/")
13
+ .filter(Boolean)
14
+ .map((s) => (s.startsWith(":") ? "By" + pascal(s.slice(1)) : pascal(s)))
15
+ .join("");
16
+ return (name || "Home") + "Page";
17
+ }
18
+ /** Group surfaces by unique route + assign collision-free component names. */
19
+ function routeEntries(plan) {
20
+ const byRoute = new Map();
21
+ for (const s of plan.surfaces) {
22
+ let e = byRoute.get(s.route);
23
+ if (!e) {
24
+ e = { route: s.route, component: "", personas: [], stories: [], states: [], home: false };
25
+ byRoute.set(s.route, e);
26
+ }
27
+ if (!e.personas.includes(s.persona))
28
+ e.personas.push(s.persona);
29
+ if (!e.stories.includes(s.storyId))
30
+ e.stories.push(s.storyId);
31
+ for (const st of s.states)
32
+ if (!e.states.includes(st))
33
+ e.states.push(st);
34
+ if (s.home)
35
+ e.home = true;
36
+ }
37
+ const used = new Set();
38
+ for (const e of byRoute.values()) {
39
+ let name = routeToName(e.route);
40
+ if (used.has(name)) {
41
+ let i = 2;
42
+ while (used.has(`${name.replace(/Page$/, "")}${i}Page`))
43
+ i++;
44
+ name = `${name.replace(/Page$/, "")}${i}Page`;
45
+ }
46
+ used.add(name);
47
+ e.component = name;
48
+ }
49
+ return [...byRoute.values()];
50
+ }
51
+ const j = JSON.stringify;
52
+ /** Slug arbitrary text into a stable id segment for the EPSS manifest. */
53
+ function textSlug(s) {
54
+ return s.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 48) || "x";
55
+ }
56
+ /** The Foundations showcase route — the ONE home for the universal UI-Stack states. */
57
+ const FOUNDATIONS_ROUTE = "/_foundations";
58
+ function packageJson(name) {
59
+ return (j({
60
+ name: `${name}-lcr-mock`,
61
+ private: true,
62
+ type: "module",
63
+ scripts: { dev: "vite", build: "tsc -b && vite build", preview: "vite preview" },
64
+ dependencies: {
65
+ "@slowcook-ai/review-overlay": "^0.9.0",
66
+ react: "^19.0.0",
67
+ "react-dom": "^19.0.0",
68
+ "react-router-dom": "^7.0.0",
69
+ "drizzle-orm": "^0.36.0",
70
+ "sql.js": "^1.10.3",
71
+ },
72
+ devDependencies: {
73
+ "@tailwindcss/vite": "^4.0.0",
74
+ "@vitejs/plugin-react": "^4.3.0",
75
+ "@types/react": "^19.0.0",
76
+ "@types/react-dom": "^19.0.0",
77
+ "@types/sql.js": "^1.4.9",
78
+ tailwindcss: "^4.0.0",
79
+ typescript: "^5.6.0",
80
+ vite: "^6.0.0",
81
+ },
82
+ }, null, 2) + "\n");
83
+ }
84
+ function viteConfig() {
85
+ return `import { defineConfig } from "vite";
86
+ import react from "@vitejs/plugin-react";
87
+ import tailwindcss from "@tailwindcss/vite";
88
+
89
+ // LCR mock — generated by \`slowcook vibe app\`. sql.js is CJS, so it MUST be
90
+ // pre-bundled (\`include\`) or \`import initSqlJs from "sql.js"\` throws
91
+ // "does not provide an export" in \`vite dev\` (the HMR review deploy) — even though
92
+ // \`vite build\` works. The .wasm is imported separately via \`?url\` (a vite asset,
93
+ // unaffected). BrowserRouter needs SPA fallback — vite dev provides it by default.
94
+ export default defineConfig({
95
+ plugins: [react(), tailwindcss()],
96
+ optimizeDeps: { include: ["sql.js"] },
97
+ });
98
+ `;
99
+ }
100
+ function indexHtml(name) {
101
+ return `<!doctype html>
102
+ <html lang="en" data-theme="dark">
103
+ <head>
104
+ <meta charset="UTF-8" />
105
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
106
+ <title>${name} — LCR</title>
107
+ </head>
108
+ <body>
109
+ <div id="root"></div>
110
+ <script type="module" src="/src/main.tsx"></script>
111
+ </body>
112
+ </html>
113
+ `;
114
+ }
115
+ function tsconfig() {
116
+ return (j({
117
+ compilerOptions: {
118
+ target: "ES2022",
119
+ lib: ["ES2022", "DOM", "DOM.Iterable"],
120
+ module: "ESNext",
121
+ moduleResolution: "bundler",
122
+ jsx: "react-jsx",
123
+ strict: true,
124
+ skipLibCheck: true,
125
+ noEmit: true,
126
+ types: ["vite/client"],
127
+ },
128
+ include: ["src"],
129
+ }, null, 2) + "\n");
130
+ }
131
+ function mainTsx() {
132
+ return `import { StrictMode } from "react";
133
+ import { createRoot } from "react-dom/client";
134
+ import "./index.css";
135
+ import { App } from "./App";
136
+
137
+ createRoot(document.getElementById("root")!).render(
138
+ <StrictMode>
139
+ <App />
140
+ </StrictMode>
141
+ );
142
+ `;
143
+ }
144
+ function indexCss() {
145
+ return `@import "./design-system/theme.css";
146
+
147
+ html, body, #root { height: 100%; }
148
+ body { margin: 0; background: var(--color-bg); color: var(--color-text); font-family: var(--font-sans, system-ui, sans-serif); }
149
+ `;
150
+ }
151
+ function viteEnvDts() {
152
+ return `/// <reference types="vite/client" />
153
+ declare module "*?url" { const url: string; export default url; }
154
+ `;
155
+ }
156
+ function useStoryMarker() {
157
+ return `import { useEffect } from "react";
158
+
159
+ /** Sets document.documentElement.dataset.slowcookStory so the review overlay can
160
+ * attribute LCR comments to the right story (the runtime @story marker). */
161
+ export function useStoryMarker(storyId: string): void {
162
+ useEffect(() => {
163
+ const prev = document.documentElement.dataset.slowcookStory;
164
+ document.documentElement.dataset.slowcookStory = storyId;
165
+ return () => {
166
+ if (prev) document.documentElement.dataset.slowcookStory = prev;
167
+ else delete document.documentElement.dataset.slowcookStory;
168
+ };
169
+ }, [storyId]);
170
+ }
171
+ `;
172
+ }
173
+ /** lib/use-async.ts — the async producer hook feeding the shared <Async>. */
174
+ function useAsyncTs() {
175
+ return `import { useEffect, useState } from "react";
176
+
177
+ export type Async<T> =
178
+ | { loading: true }
179
+ | { loading: false; error: Error }
180
+ | { loading: false; data: T };
181
+
182
+ /** Run an async producer on mount + when deps change; expose loading / error /
183
+ * data as a discriminated union consumed by <Async>. */
184
+ export function useAsync<T>(fn: () => Promise<T>, deps: unknown[]): Async<T> {
185
+ const [state, setState] = useState<Async<T>>({ loading: true });
186
+ useEffect(() => {
187
+ let live = true;
188
+ setState({ loading: true });
189
+ fn().then(
190
+ (data) => { if (live) setState({ loading: false, data }); },
191
+ (e) => { if (live) setState({ loading: false, error: e instanceof Error ? e : new Error(String(e)) }); }
192
+ );
193
+ return () => { live = false; };
194
+ // eslint-disable-next-line react-hooks/exhaustive-deps
195
+ }, deps);
196
+ return state;
197
+ }
198
+ `;
199
+ }
200
+ /** shell/async.tsx — the ONE-OFF loading/error presentation (the UI-Stack universal
201
+ * states). Every data page wraps its body in <Async>; the spinner, error styling +
202
+ * animations live in exactly one place. Pages write only the success UI + their
203
+ * MEANINGFUL data/business states. Showcased once via the Foundations EPSS entry. */
204
+ function asyncTsx() {
205
+ return `import type { ReactNode } from "react";
206
+ import type { Async as AsyncResult } from "../lib/use-async";
207
+
208
+ const KEYFRAMES = "@keyframes sc-spin{to{transform:rotate(360deg)}}@keyframes sc-fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}";
209
+
210
+ export function Spinner({ label = "Loading…" }: { label?: string }) {
211
+ return (
212
+ <div style={{ display: "flex", alignItems: "center", gap: 10, padding: 28, color: "var(--color-text-dim)", fontSize: 13.5 }}>
213
+ <style>{KEYFRAMES}</style>
214
+ <span style={{ width: 18, height: 18, borderRadius: 999, border: "2px solid var(--color-border)", borderTopColor: "var(--color-brand)", animation: "sc-spin .7s linear infinite", display: "inline-block" }} />
215
+ {label}
216
+ </div>
217
+ );
218
+ }
219
+
220
+ export function ErrorState({ message }: { message: string }) {
221
+ return (
222
+ <div style={{ animation: "sc-fade .2s ease", border: "1px solid var(--color-danger)", borderRadius: "var(--radius-card)", padding: 18, color: "var(--color-danger)", fontSize: 13.5, background: "color-mix(in srgb, var(--color-danger) 8%, transparent)" }}>
223
+ <style>{KEYFRAMES}</style>
224
+ <b>Something went wrong.</b> {message}
225
+ </div>
226
+ );
227
+ }
228
+
229
+ /** Wrap an async result: shared Spinner while loading, shared ErrorState on
230
+ * failure, render children with the data on success. */
231
+ export function Async<T>({ value, children }: { value: AsyncResult<T>; children: (data: T) => ReactNode }) {
232
+ if (value.loading) return <Spinner />;
233
+ if ("error" in value) return <ErrorState message={value.error.message} />;
234
+ return <>{children(value.data)}</>;
235
+ }
236
+ `;
237
+ }
238
+ /** lib/surface.ts — EPSS state binding. The review-overlay writes the selected
239
+ * epic/persona/scenario/STATE to localStorage; a page reads the active state to
240
+ * vary its data. (OSS gap: the overlay should export this hook directly.) */
241
+ function surfaceTs() {
242
+ return `// EPSS state binding — the review-overlay writes the selected state to
243
+ // localStorage; a page reads it to vary its data (empty / low-balance / …). This is
244
+ // the seam that makes the EPSS state-switcher actually drive the mock.
245
+ import { useSyncExternalStore } from "react";
246
+
247
+ const KEY = "slowcook_test_surface";
248
+ const EVENT = "slowcook-test-surface-change";
249
+
250
+ function read(): string | null {
251
+ try {
252
+ const raw = localStorage.getItem(KEY);
253
+ if (!raw) return null;
254
+ return (JSON.parse(raw) as { stateId?: string }).stateId ?? null;
255
+ } catch {
256
+ return null;
257
+ }
258
+ }
259
+
260
+ function subscribe(cb: () => void): () => void {
261
+ window.addEventListener(EVENT, cb);
262
+ window.addEventListener("storage", cb);
263
+ return () => {
264
+ window.removeEventListener(EVENT, cb);
265
+ window.removeEventListener("storage", cb);
266
+ };
267
+ }
268
+
269
+ /** The EPSS-selected state for the current surface, or \`fallback\` when none is
270
+ * picked yet. */
271
+ export function useSurfaceState(fallback = "populated"): string {
272
+ return useSyncExternalStore(subscribe, read, () => null) ?? fallback;
273
+ }
274
+ `;
275
+ }
276
+ /** pages/FoundationsPage.tsx — the ONE home for the universal UI-Stack states. The
277
+ * Foundations EPSS entry points here; picking loading/empty/error in the palette
278
+ * previews the shared presentation, so it's reviewable once, never per page. */
279
+ function foundationsPageTsx() {
280
+ return `import { useStoryMarker } from "../shell/useStoryMarker";
281
+ import { useSurfaceState } from "../lib/surface";
282
+ import { Spinner, ErrorState } from "../shell/async";
283
+
284
+ // @story foundations — universal UI-Stack states, shown once.
285
+ export function FoundationsPage() {
286
+ useStoryMarker("foundations");
287
+ const state = useSurfaceState("loading");
288
+ return (
289
+ <section>
290
+ <h1 style={{ marginTop: 0 }}>Presentation primitives</h1>
291
+ <p style={{ opacity: 0.7, maxWidth: 560 }}>
292
+ The universal UI-Stack states — <b>loading</b>, <b>empty</b>, <b>error</b> — rendered
293
+ once by the shared <code>&lt;Async&gt;</code> primitive. Every data page reuses these
294
+ instead of redeclaring them. Pick a state in the EPSS palette to preview it.
295
+ </p>
296
+ <div style={{ marginTop: 16, padding: 16, border: "1px solid var(--color-border)", borderRadius: 8 }}>
297
+ {state === "error" ? (
298
+ <ErrorState message="The data source could not be reached." />
299
+ ) : state === "empty" ? (
300
+ <div style={{ padding: 28, textAlign: "center", opacity: 0.7, fontSize: 13.5 }}>Nothing here yet.</div>
301
+ ) : (
302
+ <Spinner />
303
+ )}
304
+ </div>
305
+ </section>
306
+ );
307
+ }
308
+ `;
309
+ }
310
+ /** The `surfaces` prop for the overlay's "Viewing as" persona switcher — named
311
+ * entry points the reviewer hops between (one per persona → its home route). */
312
+ function reviewSurfacesTs(plan) {
313
+ const surfaces = plan.personas.map((p) => {
314
+ const ps = plan.surfaces.filter((s) => s.persona === p.id);
315
+ const home = ps.find((s) => s.home)?.route ?? ps[0]?.route ?? "/";
316
+ return { label: p.id, home };
317
+ });
318
+ return `// Review surfaces — the overlay's "Viewing as" persona switcher (review
319
+ // affordance; lives in the overlay, NOT the mock chrome). One per persona.
320
+ export const REVIEW_SURFACES = ${j(surfaces, null, 2)};
321
+ `;
322
+ }
323
+ /** The EPSS testing-surfaces.json manifest. Each acceptance_scenario is a test
324
+ * CASE: it starts at `route` in a precondition State (the Gherkin "Given") and
325
+ * walks a Scenario (the "When") to an expected outcome (the "Then"). Grouped
326
+ * epic ▸ context(persona) ▸ scenario(When) ▸ state(Given). The route is just
327
+ * where the test starts — NOT the scenario's identity (one route can back many
328
+ * scenarios). The universal UI-Stack states (loading/empty/error) are NOT
329
+ * repeated per page; they get ONE "Foundations" home that demos the shared
330
+ * <Async> primitive. The overlay renders this as the EPSS router and writes the
331
+ * selection to localStorage for the data adaptor. URL = base + route, so base is
332
+ * "" (scenarios carry absolute routes). */
333
+ export function epssManifestJson(plan, projectName) {
334
+ // epic -> persona -> scenario(When) -> states(Given), preserving first-seen order.
335
+ const epics = new Map();
336
+ const epicOrder = [];
337
+ for (const t of plan.epss ?? []) {
338
+ if (!epics.has(t.epic)) {
339
+ epics.set(t.epic, new Map());
340
+ epicOrder.push(t.epic);
341
+ }
342
+ const personas = epics.get(t.epic);
343
+ if (!personas.has(t.persona))
344
+ personas.set(t.persona, new Map());
345
+ const scenarios = personas.get(t.persona);
346
+ let sc = scenarios.get(t.scenario);
347
+ if (!sc) {
348
+ sc = { id: textSlug(t.scenario), label: t.scenario, route: t.route, states: [] };
349
+ scenarios.set(t.scenario, sc);
350
+ }
351
+ const stId = textSlug(t.state);
352
+ if (!sc.states.some((s) => s.id === stId))
353
+ sc.states.push({ id: stId, label: t.state, ...(t.then ? { expect: t.then } : {}) });
354
+ }
355
+ const epicArr = epicOrder.map((epic) => ({
356
+ id: textSlug(epic),
357
+ label: epic,
358
+ contexts: [...epics.get(epic).entries()].map(([persona, scenarios]) => ({
359
+ id: textSlug(persona),
360
+ label: persona,
361
+ base: "",
362
+ scenarios: [...scenarios.values()].map((sc) => ({
363
+ ...sc,
364
+ states: sc.states.length ? sc.states : [{ id: "default", label: "default" }],
365
+ })),
366
+ })),
367
+ }));
368
+ // Foundations — the universal UI-Stack states get ONE reviewable home (the shared
369
+ // <Async> primitive showcase) instead of being repeated as a state on every page.
370
+ epicArr.push({
371
+ id: "foundations",
372
+ label: "Foundations",
373
+ contexts: [{
374
+ id: "presentation",
375
+ label: "Presentation",
376
+ base: "",
377
+ scenarios: [{
378
+ id: "async-states",
379
+ label: "Loading, empty & error presentation",
380
+ route: FOUNDATIONS_ROUTE,
381
+ states: [
382
+ { id: "loading", label: "Loading" },
383
+ { id: "empty", label: "Empty" },
384
+ { id: "error", label: "Error" },
385
+ ],
386
+ }],
387
+ }],
388
+ });
389
+ void projectName; // epics carry their own labels now; project name unused
390
+ const manifest = { activeEpicDefault: epicArr[0]?.id ?? "foundations", epics: epicArr };
391
+ return j(manifest, null, 2) + "\n";
392
+ }
393
+ function shellTsx() {
394
+ // Minimal layout. ALL review navigation (persona switch + EPSS surface/state
395
+ // router) is provided by the overlay, not the mock chrome.
396
+ return `import { Outlet } from "react-router-dom";
397
+
398
+ export function Shell() {
399
+ return (
400
+ <main style={{ minHeight: "100vh", maxWidth: 1100, margin: "0 auto", padding: 24 }}>
401
+ <Outlet />
402
+ </main>
403
+ );
404
+ }
405
+ `;
406
+ }
407
+ function pageStub(e) {
408
+ const story = e.stories[0] ?? "";
409
+ return `import { useStoryMarker } from "../shell/useStoryMarker";
410
+
411
+ // @story ${e.stories.map((s) => `story-${s}`).join(", ")}
412
+ // STUB — generated by \`slowcook vibe app\`. The page body is a placeholder;
413
+ // \`slowcook vibe surfaces\` replaces it with the designed UI rendering via
414
+ // ../lib/queries. The route, the @story marker, and the overlay are real.
415
+ export function ${e.component}() {
416
+ useStoryMarker(${j(story)});
417
+ return (
418
+ <section>
419
+ <h1 style={{ marginTop: 0 }}>${e.route}</h1>
420
+ <p style={{ opacity: 0.7 }}>
421
+ persona: ${e.personas.join(", ")} · story: ${e.stories.map((s) => `story-${s}`).join(", ")}${e.home ? " · home" : ""}
422
+ </p>
423
+ <p style={{ opacity: 0.7 }}>states to cover: ${e.states.length ? e.states.join(", ") : "(none declared)"}</p>
424
+ <div style={{ marginTop: 16, padding: 16, border: "1px dashed var(--color-border)", borderRadius: 8 }}>
425
+ ▢ page body — run <code>slowcook vibe surfaces</code> to generate the UI (renders via the SQLite data adaptor in <code>../lib/queries</code>). Use the review pill (bottom) to switch persona / EPSS surface.
426
+ </div>
427
+ </section>
428
+ );
429
+ }
430
+ `;
431
+ }
432
+ function appTsx(entries, owner, repo) {
433
+ const imports = entries.map((e) => `import { ${e.component} } from "./pages/${e.component}";`).join("\n");
434
+ const routes = entries.map((e) => ` <Route path=${j(e.route)} element={<${e.component} />} />`).join("\n");
435
+ const homeRoute = entries.find((e) => e.home)?.route ?? entries[0]?.route ?? "/";
436
+ return `import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
437
+ import { SlowcookReviewOverlay } from "@slowcook-ai/review-overlay/react";
438
+ import { Shell } from "./shell/Shell";
439
+ import { REVIEW_SURFACES } from "./review-surfaces";
440
+ import { FoundationsPage } from "./pages/FoundationsPage";
441
+ ${imports}
442
+
443
+ // LCR app — generated by \`slowcook vibe app\`. Every declared surface is a route;
444
+ // no auth guards (barrier-free review). The slowcook review-overlay provides ALL
445
+ // review affordances — the "Viewing as" persona switcher (REVIEW_SURFACES) and the
446
+ // EPSS epic·persona·scenario·state router (/testing-surfaces.json) — so personas
447
+ // live in the overlay, not the mock chrome. BrowserRouter so the overlay's
448
+ // pushState navigation resolves to real routes.
449
+ export function App() {
450
+ return (
451
+ <BrowserRouter>
452
+ <Routes>
453
+ <Route element={<Shell />}>
454
+ ${routes}
455
+ <Route path=${j(FOUNDATIONS_ROUTE)} element={<FoundationsPage />} />
456
+ <Route path="/" element={<Navigate to=${j(homeRoute)} replace />} />
457
+ </Route>
458
+ </Routes>
459
+ <SlowcookReviewOverlay
460
+ enabled
461
+ reviewMode="lcr"
462
+ owner=${j(owner)}
463
+ repo=${j(repo)}
464
+ surfaces={REVIEW_SURFACES}
465
+ testingSurfacesUrl="/testing-surfaces.json"
466
+ />
467
+ </BrowserRouter>
468
+ );
469
+ }
470
+ `;
471
+ }
472
+ /** The `.brewing/mock.yaml` content — declares the LCR shape so run-mock + the
473
+ * overlay behave whole-app (device-flow auth, overlay on every route). */
474
+ export function mockYaml() {
475
+ return `# Generated by \`slowcook vibe app\`. Whole-app LCR mock.
476
+ schema_version: 1
477
+ shape: vite
478
+ review_mode: lcr
479
+ mock_root: mock
480
+ design_system_dir: mock/src/design-system
481
+ screens_root: mock/src/pages
482
+ router_file: mock/src/App.tsx
483
+ `;
484
+ }
485
+ /** Build the full deterministic LCR app file set from the plan. */
486
+ export function generateLcrApp(plan, opts) {
487
+ const entries = routeEntries(plan);
488
+ const owner = opts.owner ?? "";
489
+ const repo = opts.repo ?? "";
490
+ const files = [
491
+ { path: "package.json", content: packageJson(opts.projectName) },
492
+ { path: "vite.config.ts", content: viteConfig() },
493
+ { path: "index.html", content: indexHtml(opts.projectName) },
494
+ { path: "tsconfig.json", content: tsconfig() },
495
+ { path: "src/main.tsx", content: mainTsx() },
496
+ { path: "src/index.css", content: indexCss() },
497
+ { path: "src/vite-env.d.ts", content: viteEnvDts() },
498
+ { path: "src/review-surfaces.ts", content: reviewSurfacesTs(plan) },
499
+ { path: "src/shell/useStoryMarker.ts", content: useStoryMarker() },
500
+ { path: "src/shell/Shell.tsx", content: shellTsx() },
501
+ { path: "src/shell/async.tsx", content: asyncTsx() },
502
+ { path: "src/lib/use-async.ts", content: useAsyncTs() },
503
+ { path: "src/lib/surface.ts", content: surfaceTs() },
504
+ { path: "src/pages/FoundationsPage.tsx", content: foundationsPageTsx() },
505
+ { path: "src/App.tsx", content: appTsx(entries, owner, repo) },
506
+ { path: "public/testing-surfaces.json", content: epssManifestJson(plan, opts.projectName) },
507
+ ];
508
+ for (const e of entries)
509
+ files.push({ path: `src/pages/${e.component}.tsx`, content: pageStub(e) });
510
+ return files;
511
+ }
512
+ //# sourceMappingURL=app-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-gen.js","sourceRoot":"","sources":["../../../src/commands/vibe/app-gen.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuRH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuI5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA8RH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuJ5E"}