@slowcook-ai/cli 0.21.2 → 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.
- package/AGENTS.md +5 -0
- package/README.md +8 -4
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/brand/index.d.ts.map +1 -1
- package/dist/commands/brand/index.js +18 -8
- package/dist/commands/brand/index.js.map +1 -1
- package/dist/commands/eye/index.d.ts.map +1 -1
- package/dist/commands/eye/index.js +16 -6
- package/dist/commands/eye/index.js.map +1 -1
- package/dist/commands/eye/plan.d.ts +41 -6
- package/dist/commands/eye/plan.d.ts.map +1 -1
- package/dist/commands/eye/plan.js +52 -9
- package/dist/commands/eye/plan.js.map +1 -1
- package/dist/commands/eye/run.d.ts +17 -1
- package/dist/commands/eye/run.d.ts.map +1 -1
- package/dist/commands/eye/run.js +38 -6
- package/dist/commands/eye/run.js.map +1 -1
- package/dist/commands/greenfield/index.d.ts.map +1 -1
- package/dist/commands/greenfield/index.js +33 -3
- package/dist/commands/greenfield/index.js.map +1 -1
- package/dist/commands/greenfield/status.d.ts +26 -5
- package/dist/commands/greenfield/status.d.ts.map +1 -1
- package/dist/commands/greenfield/status.js +28 -9
- package/dist/commands/greenfield/status.js.map +1 -1
- package/dist/commands/menu/assemble.d.ts.map +1 -1
- package/dist/commands/menu/assemble.js +6 -0
- package/dist/commands/menu/assemble.js.map +1 -1
- package/dist/commands/menu/index.d.ts.map +1 -1
- package/dist/commands/menu/index.js +42 -14
- package/dist/commands/menu/index.js.map +1 -1
- package/dist/commands/reconcile/index.d.ts +2 -0
- package/dist/commands/reconcile/index.d.ts.map +1 -0
- package/dist/commands/reconcile/index.js +171 -0
- package/dist/commands/reconcile/index.js.map +1 -0
- package/dist/commands/refine/spec-yaml.d.ts +26 -0
- package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
- package/dist/commands/refine/spec-yaml.js +64 -3
- package/dist/commands/refine/spec-yaml.js.map +1 -1
- package/dist/commands/trace/check.d.ts +72 -0
- package/dist/commands/trace/check.d.ts.map +1 -1
- package/dist/commands/trace/check.js +93 -0
- package/dist/commands/trace/check.js.map +1 -1
- package/dist/commands/trace/index.d.ts +5 -0
- package/dist/commands/trace/index.d.ts.map +1 -1
- package/dist/commands/trace/index.js +183 -7
- package/dist/commands/trace/index.js.map +1 -1
- package/dist/commands/upsert-agent-docs.d.ts.map +1 -1
- package/dist/commands/upsert-agent-docs.js +11 -0
- package/dist/commands/upsert-agent-docs.js.map +1 -1
- package/dist/commands/vibe/app-gen.d.ts +43 -0
- package/dist/commands/vibe/app-gen.d.ts.map +1 -0
- package/dist/commands/vibe/app-gen.js +512 -0
- package/dist/commands/vibe/app-gen.js.map +1 -0
- package/dist/commands/vibe/index.d.ts.map +1 -1
- package/dist/commands/vibe/index.js +287 -2
- package/dist/commands/vibe/index.js.map +1 -1
- package/dist/commands/vibe/lcr-plan.d.ts +125 -0
- package/dist/commands/vibe/lcr-plan.d.ts.map +1 -0
- package/dist/commands/vibe/lcr-plan.js +155 -0
- package/dist/commands/vibe/lcr-plan.js.map +1 -0
- package/dist/commands/vibe/schema-gen.d.ts +52 -0
- package/dist/commands/vibe/schema-gen.d.ts.map +1 -0
- package/dist/commands/vibe/schema-gen.js +205 -0
- package/dist/commands/vibe/schema-gen.js.map +1 -0
- package/dist/commands.manifest.d.ts.map +1 -1
- package/dist/commands.manifest.js +10 -4
- package/dist/commands.manifest.js.map +1 -1
- package/package.json +7 -7
|
@@ -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><Async></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;
|
|
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"}
|