@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.
- 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 +116 -0
- package/dist/commands/trace/check.d.ts.map +1 -1
- package/dist/commands/trace/check.js +135 -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 +273 -12
- 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 +8 -8
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GUCDI — LCR plan compiler (pure). The deterministic spine of the whole-app
|
|
3
|
+
* `vibe` redesign: instead of generating one mock per story, vibe first compiles
|
|
4
|
+
* ALL specs into a single coherent plan for one clickable LCR app —
|
|
5
|
+
* - the unified DATA MODEL (every story's `data_contract.entities` merged into
|
|
6
|
+
* one schema, with cross-story field conflicts surfaced) → the data adaptor's
|
|
7
|
+
* spine (a Drizzle/SQLite schema is generated from this);
|
|
8
|
+
* - the ROUTE / PERSONA map (from each story's `persona` + `surfaces`) → the
|
|
9
|
+
* app's navigation, every surface reachable;
|
|
10
|
+
* - per-story COVERAGE (which stories contribute a surface vs are backend-only).
|
|
11
|
+
*
|
|
12
|
+
* No LLM: this is aggregation over the specs. The schema/seed/surface GENERATION
|
|
13
|
+
* passes (LLM) hang off this plan. See docs/plans/vibe-whole-mock-lcr.md.
|
|
14
|
+
*/
|
|
15
|
+
function pushUnique(arr, v) {
|
|
16
|
+
if (!arr.includes(v))
|
|
17
|
+
arr.push(v);
|
|
18
|
+
}
|
|
19
|
+
/** Merge every spec's data_contract.entities into one data model, unioning
|
|
20
|
+
* fields by name and tracking which stories contributed each entity/field.
|
|
21
|
+
* Divergent field types across stories become `conflicts`. */
|
|
22
|
+
function compileEntities(specs) {
|
|
23
|
+
const byName = new Map();
|
|
24
|
+
// entity → field → type → stories (for conflict detection)
|
|
25
|
+
const typeWitness = new Map();
|
|
26
|
+
for (const spec of specs) {
|
|
27
|
+
for (const e of spec.entities) {
|
|
28
|
+
let ent = byName.get(e.name);
|
|
29
|
+
if (!ent) {
|
|
30
|
+
ent = { name: e.name, fields: [], relations: [], fromStories: [] };
|
|
31
|
+
byName.set(e.name, ent);
|
|
32
|
+
typeWitness.set(e.name, new Map());
|
|
33
|
+
}
|
|
34
|
+
pushUnique(ent.fromStories, spec.storyId);
|
|
35
|
+
for (const r of e.relations ?? [])
|
|
36
|
+
pushUnique(ent.relations, r);
|
|
37
|
+
const fieldWitness = typeWitness.get(e.name);
|
|
38
|
+
for (const f of e.fields) {
|
|
39
|
+
let field = ent.fields.find((x) => x.name === f.name);
|
|
40
|
+
if (!field) {
|
|
41
|
+
field = { name: f.name, type: f.type, fromStories: [] };
|
|
42
|
+
ent.fields.push(field);
|
|
43
|
+
}
|
|
44
|
+
pushUnique(field.fromStories, spec.storyId);
|
|
45
|
+
if (!fieldWitness.has(f.name))
|
|
46
|
+
fieldWitness.set(f.name, new Map());
|
|
47
|
+
const types = fieldWitness.get(f.name);
|
|
48
|
+
if (!types.has(f.type))
|
|
49
|
+
types.set(f.type, []);
|
|
50
|
+
pushUnique(types.get(f.type), spec.storyId);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const conflicts = [];
|
|
55
|
+
for (const [entity, fields] of typeWitness) {
|
|
56
|
+
for (const [field, types] of fields) {
|
|
57
|
+
if (types.size > 1) {
|
|
58
|
+
conflicts.push({
|
|
59
|
+
entity,
|
|
60
|
+
field,
|
|
61
|
+
types: [...types.entries()].map(([type, stories]) => ({ type, stories })),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { entities: [...byName.values()], conflicts };
|
|
67
|
+
}
|
|
68
|
+
/** Compile the whole-app plan from the spec set. Deterministic. */
|
|
69
|
+
export function compileLcrPlan(specs) {
|
|
70
|
+
const { entities, conflicts } = compileEntities(specs);
|
|
71
|
+
const personaById = new Map();
|
|
72
|
+
const surfaces = [];
|
|
73
|
+
const stories = [];
|
|
74
|
+
const uncoveredStories = [];
|
|
75
|
+
for (const spec of specs) {
|
|
76
|
+
// Personas: prefer the explicit `persona` block; fall back to `actors` names
|
|
77
|
+
// so the list is non-empty on specs that predate menu-emits-surfaces.
|
|
78
|
+
const personaIds = [];
|
|
79
|
+
if (spec.persona?.id) {
|
|
80
|
+
personaIds.push(spec.persona.id);
|
|
81
|
+
const p = personaById.get(spec.persona.id) ?? { id: spec.persona.id, chrome: spec.persona.chrome, fromStories: [] };
|
|
82
|
+
if (spec.persona.chrome && !p.chrome)
|
|
83
|
+
p.chrome = spec.persona.chrome;
|
|
84
|
+
pushUnique(p.fromStories, spec.storyId);
|
|
85
|
+
personaById.set(p.id, p);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
for (const a of spec.actors ?? []) {
|
|
89
|
+
personaIds.push(a.name);
|
|
90
|
+
const p = personaById.get(a.name) ?? { id: a.name, fromStories: [] };
|
|
91
|
+
pushUnique(p.fromStories, spec.storyId);
|
|
92
|
+
personaById.set(p.id, p);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const routes = [];
|
|
96
|
+
for (const s of spec.surfaces ?? []) {
|
|
97
|
+
const persona = s.persona ?? spec.persona?.id ?? "—";
|
|
98
|
+
surfaces.push({
|
|
99
|
+
route: s.route,
|
|
100
|
+
persona,
|
|
101
|
+
storyId: spec.storyId,
|
|
102
|
+
home: s.home === true,
|
|
103
|
+
states: s.states ?? [],
|
|
104
|
+
});
|
|
105
|
+
pushUnique(routes, s.route);
|
|
106
|
+
}
|
|
107
|
+
const hasSurface = (spec.surfaces?.length ?? 0) > 0;
|
|
108
|
+
if (!hasSurface)
|
|
109
|
+
uncoveredStories.push(spec.storyId);
|
|
110
|
+
stories.push({
|
|
111
|
+
storyId: spec.storyId,
|
|
112
|
+
entities: spec.entities.map((e) => e.name),
|
|
113
|
+
personas: personaIds,
|
|
114
|
+
routes,
|
|
115
|
+
hasSurface,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// EPSS test matrix — each acceptance_scenario is a test CASE: it starts at a
|
|
119
|
+
// route in a precondition State (the "Given") and walks a Scenario (the "When")
|
|
120
|
+
// to an expected outcome (the "Then"). The route is where it starts, not its id.
|
|
121
|
+
const epss = [];
|
|
122
|
+
for (const spec of specs) {
|
|
123
|
+
const persona = spec.persona?.id ?? spec.actors?.[0]?.name ?? "—";
|
|
124
|
+
const startRoute = spec.surfaces?.find((s) => s.home)?.route ?? spec.surfaces?.[0]?.route ?? "";
|
|
125
|
+
if (!startRoute)
|
|
126
|
+
continue; // backend-only / no UI surface → no EPSS test
|
|
127
|
+
const epic = spec.epic ?? "General";
|
|
128
|
+
for (const a of spec.acceptanceScenarios ?? []) {
|
|
129
|
+
const g = parseGwt(a);
|
|
130
|
+
epss.push(g
|
|
131
|
+
? { epic, persona, scenario: g.when, state: g.given, then: g.then, route: startRoute, storyId: spec.storyId }
|
|
132
|
+
: { epic, persona, scenario: a, state: "default", then: "", route: startRoute, storyId: spec.storyId });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
entities,
|
|
137
|
+
conflicts,
|
|
138
|
+
personas: [...personaById.values()],
|
|
139
|
+
surfaces,
|
|
140
|
+
stories,
|
|
141
|
+
uncoveredStories,
|
|
142
|
+
epss,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/** Parse a "Given … When … Then …" acceptance scenario into its three clauses.
|
|
146
|
+
* Given = the precondition (EPSS State), When = the action (Scenario), Then =
|
|
147
|
+
* the expected outcome. Returns null if it isn't Gherkin-shaped. */
|
|
148
|
+
export function parseGwt(s) {
|
|
149
|
+
const m = /^\s*Given\s+(.+?)\s+When\s+(.+?)\s+Then\s+(.+?)\s*$/is.exec(s);
|
|
150
|
+
if (!m)
|
|
151
|
+
return null;
|
|
152
|
+
const clean = (x) => x.trim().replace(/[,;.]+$/, "");
|
|
153
|
+
return { given: clean(m[1]), when: clean(m[2]), then: clean(m[3]) };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=lcr-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lcr-plan.js","sourceRoot":"","sources":["../../../src/commands/vibe/lcr-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GUCDI — deterministic Drizzle schema generator (pure). The first GENERATION
|
|
3
|
+
* pass of the whole-app LCR vibe. Because the LCR plan's data model is already
|
|
4
|
+
* well-typed (menu emits structured `data_contract` field types + relations),
|
|
5
|
+
* the SQLite/Drizzle schema falls out mechanically — no LLM, no drift, testable.
|
|
6
|
+
*
|
|
7
|
+
* Structure → deterministic; content/judgment (seed data, surfaces) → LLM. This
|
|
8
|
+
* is that boundary. Output mirrors the rewo LCR precedent: one `@story`-annotated
|
|
9
|
+
* table per entity + inferred row types, SQLite-portable (brew swaps SQLite →
|
|
10
|
+
* Postgres, inheriting the models). See docs/plans/vibe-whole-mock-lcr.md.
|
|
11
|
+
*/
|
|
12
|
+
import type { PlanEntity } from "./lcr-plan.js";
|
|
13
|
+
/** Table variable name: lower-first-letter of the entity (OperatorAuditLog →
|
|
14
|
+
* operatorAuditLog, Wallet → wallet). */
|
|
15
|
+
export declare function tableVar(name: string): string;
|
|
16
|
+
/** SQL table/column name: snake_case. */
|
|
17
|
+
export declare function snake(name: string): string;
|
|
18
|
+
interface Mapped {
|
|
19
|
+
/** the drizzle column expression sans chaining, e.g. `text("status", { enum: [...] })` */
|
|
20
|
+
expr: string;
|
|
21
|
+
/** which top-level drizzle builders this used (for the import line) */
|
|
22
|
+
builder: "text" | "integer" | "real";
|
|
23
|
+
}
|
|
24
|
+
/** Map a data_contract field type → a Drizzle SQLite column builder. Robust to
|
|
25
|
+
* the `|null` nullability suffix (stripped by the caller) and unknown types
|
|
26
|
+
* (default to text). */
|
|
27
|
+
export declare function mapType(rawType: string, sqlName: string): Mapped;
|
|
28
|
+
/** Parse a relation declaration into (sourceField → targetEntity.targetField).
|
|
29
|
+
* Accepts `Entity.field → Target.tcol`, `field → Target.tcol`, with `→` or `->`. */
|
|
30
|
+
export declare function parseRelation(rel: string): {
|
|
31
|
+
field: string;
|
|
32
|
+
targetEntity: string;
|
|
33
|
+
targetField: string;
|
|
34
|
+
} | null;
|
|
35
|
+
/** Generate the full `schema.ts` content from the plan's entity model. */
|
|
36
|
+
export declare function compileDrizzleSchema(entities: PlanEntity[]): string;
|
|
37
|
+
/** SQLite storage affinity for a data_contract type. The mock runs a real
|
|
38
|
+
* in-browser SQLite (sql.js) seeded at boot; these are the CREATE TABLE types. */
|
|
39
|
+
export declare function sqliteType(rawType: string): "TEXT" | "INTEGER" | "REAL";
|
|
40
|
+
/** Generate CREATE TABLE DDL from the plan's entity model — run by the mock's
|
|
41
|
+
* sql.js bootstrap to materialise the schema in the in-browser DB. Deterministic
|
|
42
|
+
* twin of compileDrizzleSchema; enum fields get a CHECK constraint, `id` is the
|
|
43
|
+
* PK, relations become inline REFERENCES (skipped on the PK / unknown targets). */
|
|
44
|
+
export declare function compileSqliteDdl(entities: PlanEntity[]): string;
|
|
45
|
+
/** Deterministic db-bootstrap module (db.ts): a real in-browser SQLite (sql.js)
|
|
46
|
+
* created + DDL-materialised + seeded once at boot, exposed as a Drizzle db so
|
|
47
|
+
* the mock's query layer runs real SQL — the mock→prod swap is then a
|
|
48
|
+
* data-source change, not a rewrite. Pure template (no entity-specific content);
|
|
49
|
+
* the seed (seed.ts) + query adaptor (queries.ts) are the LLM pass. */
|
|
50
|
+
export declare function dbBootstrapTs(): string;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=schema-gen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-gen.d.ts","sourceRoot":"","sources":["../../../src/commands/vibe/schema-gen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;0CAC0C;AAC1C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,yCAAyC;AACzC,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK1C;AAED,UAAU,MAAM;IACd,0FAA0F;IAC1F,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;CACtC;AAED;;yBAEyB;AACzB,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBhE;AAED;qFACqF;AACrF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW9G;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAyDnE;AAED;mFACmF;AACnF,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAOvE;AAED;;;oFAGoF;AACpF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CA8B/D;AAED;;;;wEAIwE;AACxE,wBAAgB,aAAa,IAAI,MAAM,CA+BtC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/** Table variable name: lower-first-letter of the entity (OperatorAuditLog →
|
|
2
|
+
* operatorAuditLog, Wallet → wallet). */
|
|
3
|
+
export function tableVar(name) {
|
|
4
|
+
return name.charAt(0).toLowerCase() + name.slice(1);
|
|
5
|
+
}
|
|
6
|
+
/** SQL table/column name: snake_case. */
|
|
7
|
+
export function snake(name) {
|
|
8
|
+
return name
|
|
9
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1_$2")
|
|
10
|
+
.replace(/[\s-]+/g, "_")
|
|
11
|
+
.toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
/** Map a data_contract field type → a Drizzle SQLite column builder. Robust to
|
|
14
|
+
* the `|null` nullability suffix (stripped by the caller) and unknown types
|
|
15
|
+
* (default to text). */
|
|
16
|
+
export function mapType(rawType, sqlName) {
|
|
17
|
+
const t = rawType.trim().toLowerCase();
|
|
18
|
+
const col = JSON.stringify(sqlName);
|
|
19
|
+
const enumMatch = /^enum\s*\((.*)\)$/.exec(t);
|
|
20
|
+
if (enumMatch) {
|
|
21
|
+
const values = enumMatch[1]
|
|
22
|
+
.split(/[|,]/)
|
|
23
|
+
.map((v) => v.trim())
|
|
24
|
+
.filter(Boolean);
|
|
25
|
+
return { expr: `text(${col}, { enum: [${values.map((v) => JSON.stringify(v)).join(", ")}] })`, builder: "text" };
|
|
26
|
+
}
|
|
27
|
+
if (/^(uuid|string|text|varchar|char)/.test(t))
|
|
28
|
+
return { expr: `text(${col})`, builder: "text" };
|
|
29
|
+
if (/^(timestamp|datetime|date|time)/.test(t))
|
|
30
|
+
return { expr: `integer(${col}, { mode: "timestamp" })`, builder: "integer" };
|
|
31
|
+
if (/^(bool|boolean)/.test(t))
|
|
32
|
+
return { expr: `integer(${col}, { mode: "boolean" })`, builder: "integer" };
|
|
33
|
+
if (/^(int|integer|bigint|serial|number)/.test(t))
|
|
34
|
+
return { expr: `integer(${col})`, builder: "integer" };
|
|
35
|
+
if (/^(float|real|double|decimal|numeric|money)/.test(t))
|
|
36
|
+
return { expr: `real(${col})`, builder: "real" };
|
|
37
|
+
if (/^(json|jsonb)/.test(t))
|
|
38
|
+
return { expr: `text(${col}, { mode: "json" })`, builder: "text" };
|
|
39
|
+
return { expr: `text(${col})`, builder: "text" }; // safe default
|
|
40
|
+
}
|
|
41
|
+
/** Parse a relation declaration into (sourceField → targetEntity.targetField).
|
|
42
|
+
* Accepts `Entity.field → Target.tcol`, `field → Target.tcol`, with `→` or `->`. */
|
|
43
|
+
export function parseRelation(rel) {
|
|
44
|
+
const parts = rel.split(/→|->/).map((s) => s.trim());
|
|
45
|
+
if (parts.length !== 2)
|
|
46
|
+
return null;
|
|
47
|
+
const [left, right] = parts;
|
|
48
|
+
const field = left.includes(".") ? left.split(".").pop().trim() : left.trim();
|
|
49
|
+
const rdot = right.split(".");
|
|
50
|
+
if (rdot.length < 2)
|
|
51
|
+
return null;
|
|
52
|
+
const targetEntity = rdot[0].trim();
|
|
53
|
+
const targetField = rdot[1].trim();
|
|
54
|
+
if (!field || !targetEntity || !targetField)
|
|
55
|
+
return null;
|
|
56
|
+
return { field, targetEntity, targetField };
|
|
57
|
+
}
|
|
58
|
+
/** Generate the full `schema.ts` content from the plan's entity model. */
|
|
59
|
+
export function compileDrizzleSchema(entities) {
|
|
60
|
+
const usedBuilders = new Set(["sqliteTable"]);
|
|
61
|
+
const knownEntities = new Set(entities.map((e) => e.name));
|
|
62
|
+
const blocks = [];
|
|
63
|
+
let usedReferences = false;
|
|
64
|
+
for (const e of entities) {
|
|
65
|
+
// field → reference (only when the target entity is in the model).
|
|
66
|
+
const refByField = new Map();
|
|
67
|
+
for (const rel of e.relations) {
|
|
68
|
+
const parsed = parseRelation(rel);
|
|
69
|
+
if (parsed && knownEntities.has(parsed.targetEntity)) {
|
|
70
|
+
refByField.set(parsed.field, { targetEntity: parsed.targetEntity, targetField: parsed.targetField });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const cols = [];
|
|
74
|
+
for (const f of e.fields) {
|
|
75
|
+
const nullable = /\|\s*null\s*$/.test(f.type);
|
|
76
|
+
const baseType = f.type.replace(/\|\s*null\s*$/, "");
|
|
77
|
+
const sqlName = snake(f.name);
|
|
78
|
+
const m = mapType(baseType, sqlName);
|
|
79
|
+
usedBuilders.add(m.builder);
|
|
80
|
+
const isPk = f.name === "id";
|
|
81
|
+
let chain = m.expr;
|
|
82
|
+
if (isPk)
|
|
83
|
+
chain += ".primaryKey()";
|
|
84
|
+
// A foreign key lives on the *referencing* column, never on the PK. A
|
|
85
|
+
// relation that names this entity's `id` as the source is the inverse
|
|
86
|
+
// (has-one/has-many) of a real FK that lives on the child table — skip it
|
|
87
|
+
// here; the child emits the actual `.references()`.
|
|
88
|
+
const ref = isPk ? undefined : refByField.get(f.name);
|
|
89
|
+
// Annotate the callback return as AnySQLiteColumn so circular / mutual FKs
|
|
90
|
+
// (gate↔epic etc.) don't trip TS7022/7024 "implicit any in its own
|
|
91
|
+
// initializer" — the documented Drizzle fix for self/circular references.
|
|
92
|
+
if (ref) {
|
|
93
|
+
chain += `.references((): AnySQLiteColumn => ${tableVar(ref.targetEntity)}.${ref.targetField})`;
|
|
94
|
+
usedReferences = true;
|
|
95
|
+
}
|
|
96
|
+
if (!nullable && !isPk)
|
|
97
|
+
chain += ".notNull()";
|
|
98
|
+
cols.push(` ${f.name}: ${chain},`);
|
|
99
|
+
}
|
|
100
|
+
const provenance = `// @story ${e.fromStories.map((s) => `story-${s}`).join(", ")}`;
|
|
101
|
+
blocks.push(`${provenance}\nexport const ${tableVar(e.name)} = sqliteTable(${JSON.stringify(snake(e.name))}, {\n${cols.join("\n")}\n});\n` +
|
|
102
|
+
`export type ${e.name} = typeof ${tableVar(e.name)}.$inferSelect;\n` +
|
|
103
|
+
`export type New${e.name} = typeof ${tableVar(e.name)}.$inferInsert;`);
|
|
104
|
+
}
|
|
105
|
+
const importParts = [...usedBuilders].sort();
|
|
106
|
+
if (usedReferences)
|
|
107
|
+
importParts.push("type AnySQLiteColumn");
|
|
108
|
+
const importLine = `import { ${importParts.join(", ")} } from "drizzle-orm/sqlite-core";`;
|
|
109
|
+
const header = `// @convention LCR data adaptor — generated by \`slowcook vibe schema\` from the\n` +
|
|
110
|
+
`// LCR plan's data model (specs' data_contract). Deterministic; do not hand-edit —\n` +
|
|
111
|
+
`// change a spec's data_contract and regenerate. SQLite-portable (brew swaps to\n` +
|
|
112
|
+
`// Postgres, inheriting these models). ${entities.length} entities.`;
|
|
113
|
+
return `${header}\n${importLine}\n\n${blocks.join("\n\n")}\n`;
|
|
114
|
+
}
|
|
115
|
+
/** SQLite storage affinity for a data_contract type. The mock runs a real
|
|
116
|
+
* in-browser SQLite (sql.js) seeded at boot; these are the CREATE TABLE types. */
|
|
117
|
+
export function sqliteType(rawType) {
|
|
118
|
+
const t = rawType.trim().toLowerCase();
|
|
119
|
+
if (/^enum\s*\(/.test(t))
|
|
120
|
+
return "TEXT";
|
|
121
|
+
if (/^(uuid|string|text|varchar|char|json|jsonb)/.test(t))
|
|
122
|
+
return "TEXT";
|
|
123
|
+
if (/^(float|real|double|decimal|numeric|money)/.test(t))
|
|
124
|
+
return "REAL";
|
|
125
|
+
if (/^(timestamp|datetime|date|time|bool|boolean|int|integer|bigint|serial|number)/.test(t))
|
|
126
|
+
return "INTEGER";
|
|
127
|
+
return "TEXT";
|
|
128
|
+
}
|
|
129
|
+
/** Generate CREATE TABLE DDL from the plan's entity model — run by the mock's
|
|
130
|
+
* sql.js bootstrap to materialise the schema in the in-browser DB. Deterministic
|
|
131
|
+
* twin of compileDrizzleSchema; enum fields get a CHECK constraint, `id` is the
|
|
132
|
+
* PK, relations become inline REFERENCES (skipped on the PK / unknown targets). */
|
|
133
|
+
export function compileSqliteDdl(entities) {
|
|
134
|
+
const known = new Set(entities.map((e) => e.name));
|
|
135
|
+
const stmts = [];
|
|
136
|
+
for (const e of entities) {
|
|
137
|
+
const refByField = new Map();
|
|
138
|
+
for (const rel of e.relations) {
|
|
139
|
+
const parsed = parseRelation(rel);
|
|
140
|
+
if (parsed && known.has(parsed.targetEntity))
|
|
141
|
+
refByField.set(parsed.field, { targetEntity: parsed.targetEntity, targetField: parsed.targetField });
|
|
142
|
+
}
|
|
143
|
+
const cols = [];
|
|
144
|
+
for (const f of e.fields) {
|
|
145
|
+
const nullable = /\|\s*null\s*$/.test(f.type);
|
|
146
|
+
const base = f.type.replace(/\|\s*null\s*$/, "");
|
|
147
|
+
const name = snake(f.name);
|
|
148
|
+
const isPk = f.name === "id";
|
|
149
|
+
let c = ` ${name} ${sqliteType(base)}`;
|
|
150
|
+
if (isPk)
|
|
151
|
+
c += " PRIMARY KEY";
|
|
152
|
+
else if (!nullable)
|
|
153
|
+
c += " NOT NULL";
|
|
154
|
+
const em = /^enum\s*\((.*)\)$/.exec(base.trim().toLowerCase());
|
|
155
|
+
if (em) {
|
|
156
|
+
const vals = em[1].split(/[|,]/).map((v) => v.trim()).filter(Boolean);
|
|
157
|
+
c += ` CHECK (${name} IN (${vals.map((v) => `'${v}'`).join(", ")}))`;
|
|
158
|
+
}
|
|
159
|
+
const ref = isPk ? undefined : refByField.get(f.name);
|
|
160
|
+
if (ref)
|
|
161
|
+
c += ` REFERENCES ${snake(ref.targetEntity)}(${snake(ref.targetField)})`;
|
|
162
|
+
cols.push(c);
|
|
163
|
+
}
|
|
164
|
+
stmts.push(`CREATE TABLE ${snake(e.name)} (\n${cols.join(",\n")}\n);`);
|
|
165
|
+
}
|
|
166
|
+
return stmts.join("\n\n") + "\n";
|
|
167
|
+
}
|
|
168
|
+
/** Deterministic db-bootstrap module (db.ts): a real in-browser SQLite (sql.js)
|
|
169
|
+
* created + DDL-materialised + seeded once at boot, exposed as a Drizzle db so
|
|
170
|
+
* the mock's query layer runs real SQL — the mock→prod swap is then a
|
|
171
|
+
* data-source change, not a rewrite. Pure template (no entity-specific content);
|
|
172
|
+
* the seed (seed.ts) + query adaptor (queries.ts) are the LLM pass. */
|
|
173
|
+
export function dbBootstrapTs() {
|
|
174
|
+
return `// @convention LCR data adaptor runtime — generated by \`slowcook vibe seed\`.
|
|
175
|
+
// A real in-browser SQLite (sql.js) seeded once at boot; the query layer
|
|
176
|
+
// (queries.ts) runs Drizzle/SQL, so mock→prod is a data-source swap, not a
|
|
177
|
+
// rewrite. Requires deps: drizzle-orm, sql.js. Do not hand-edit.
|
|
178
|
+
import initSqlJs from "sql.js";
|
|
179
|
+
import wasmUrl from "sql.js/dist/sql-wasm.wasm?url";
|
|
180
|
+
import { drizzle, type SQLJsDatabase } from "drizzle-orm/sql-js";
|
|
181
|
+
import * as schema from "./schema";
|
|
182
|
+
import { DDL } from "./ddl";
|
|
183
|
+
import { seed } from "./seed";
|
|
184
|
+
|
|
185
|
+
export type DB = SQLJsDatabase<typeof schema>;
|
|
186
|
+
|
|
187
|
+
let _dbPromise: Promise<DB> | null = null;
|
|
188
|
+
|
|
189
|
+
/** Lazily boot the in-memory SQLite, materialise the schema, seed it once. */
|
|
190
|
+
export function getDb(): Promise<DB> {
|
|
191
|
+
if (!_dbPromise) {
|
|
192
|
+
_dbPromise = (async () => {
|
|
193
|
+
const SQL = await initSqlJs({ locateFile: () => wasmUrl });
|
|
194
|
+
const sqlite = new SQL.Database();
|
|
195
|
+
sqlite.run(DDL);
|
|
196
|
+
const db = drizzle(sqlite, { schema });
|
|
197
|
+
await seed(db);
|
|
198
|
+
return db;
|
|
199
|
+
})();
|
|
200
|
+
}
|
|
201
|
+
return _dbPromise;
|
|
202
|
+
}
|
|
203
|
+
`;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=schema-gen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-gen.js","sourceRoot":"","sources":["../../../src/commands/vibe/schema-gen.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.manifest.d.ts","sourceRoot":"","sources":["../src/commands.manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,cAAc,GAAG,YAAY,CAAC;AAE/E,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,UAAU,GACV,QAAQ,GACR,WAAW,GACX,KAAK,GACL,cAAc,CAAC;AAEnB,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,YAAY,CAAC;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,QAAQ,EAAE,aAAa,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"commands.manifest.d.ts","sourceRoot":"","sources":["../src/commands.manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,cAAc,GAAG,YAAY,CAAC;AAE/E,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,UAAU,GACV,QAAQ,GACR,WAAW,GACX,KAAK,GACL,cAAc,CAAC;AAEnB,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,YAAY,CAAC;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,QAAQ,EAAE,aAAa,CAAC,YAAY,CA4ShD,CAAC;AAWF,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEzE;AAED,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAEhD"}
|
|
@@ -42,8 +42,8 @@ export const COMMANDS = [
|
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
name: "vibe",
|
|
45
|
-
usage: "slowcook vibe --
|
|
46
|
-
description: "Design-first
|
|
45
|
+
usage: "slowcook vibe (plan | schema [--stdout] | seed [--dry-run] | app [--force] | --spec <id> [--owner <login>] [--dry-run]) [--cwd <path>]",
|
|
46
|
+
description: "Design-first mock generator. `vibe plan`/`schema`/`seed` build the whole-app LCR data adaptor (deterministic data model + Drizzle schema + real sql.js SQLite + LLM seed/queries). `vibe app` (deterministic) scaffolds the runnable, navigable LCR: Vite app + router (every surface reachable, BrowserRouter) + the slowcook review-overlay (persona switch + EPSS epic/persona/scenario/state router, from a generated testing-surfaces.json) + a stub page per route; sets review_mode: lcr. `vibe --spec <id>` (legacy per-story) emits a React mockup PR.",
|
|
47
47
|
group: "pipeline",
|
|
48
48
|
},
|
|
49
49
|
{
|
|
@@ -141,8 +141,14 @@ export const COMMANDS = [
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
name: "trace",
|
|
144
|
-
usage: "slowcook trace check [--prd <path>] [--cwd <dir>]",
|
|
145
|
-
description: "GUCDI
|
|
144
|
+
usage: "slowcook trace <check|stamp|impact> [--prd <path>] [--cwd <dir>] [--coverage] [--strict] [--since <ref>] [--anchors a,b]",
|
|
145
|
+
description: "GUCDI traceability lint over the spine. check: provenance (forward — every spec/LCR node has a why; orphans/dangling fail), coverage (inverse — stories with no LCR surface; --coverage to fail), persona surfaces (declared routes resolve), and freshness (specs whose PRD section changed since stamping; --strict to fail). stamp: baseline each spec's PRD-anchor fingerprint (prd_ref.sha). impact: which stories a PRD change touches (--since <ref> diffs the PRD; or --anchors a,b). Brownfield-safe (never demands a PRD).",
|
|
146
|
+
group: "checks",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: "reconcile",
|
|
150
|
+
usage: "slowcook reconcile --story <id> [--prd <path>] [--cwd <dir>] [--apply] [--dry-run] [--model <id>]",
|
|
151
|
+
description: "PRD↔spec interdependency (LLM). When a PRD section a spec anchors to has changed (see `trace impact`/`trace check`), propose a minimum-diff corrected spec: enumerate which invariants/scenarios/actors/api now contradict the PRD, and report one-hop cross-impact as notes. Propose-not-apply by default (writes specs/story-<id>.reconcile.yaml); --apply accepts it (schema-validated) and re-stamps freshness.",
|
|
146
152
|
group: "checks",
|
|
147
153
|
},
|
|
148
154
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.manifest.js","sourceRoot":"","sources":["../src/commands.manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA6BH,MAAM,CAAC,MAAM,QAAQ,GAAgC;IACnD,mBAAmB;IACnB;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,uEAAuE;QAC9E,WAAW,EAAE,iHAAiH;QAC9H,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,yDAAyD;QAChE,WAAW,EAAE,8HAA8H;QAC3I,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,mFAAmF;QAC1F,WAAW,EAAE,4FAA4F;QACzG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,sDAAsD;QAC7D,WAAW,EAAE,2EAA2E;QACxF,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,CAAC,SAAS,CAAC;KACrB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"commands.manifest.js","sourceRoot":"","sources":["../src/commands.manifest.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.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "CLI for the slowcook brewing harness",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "aminazar",
|
|
@@ -35,19 +35,19 @@
|
|
|
35
35
|
"AGENTS.md"
|
|
36
36
|
],
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@anthropic-ai/sdk": "^0.
|
|
38
|
+
"@anthropic-ai/sdk": "^0.104.1",
|
|
39
39
|
"@octokit/rest": "^22.0.1",
|
|
40
|
-
"@playwright/test": "^1.
|
|
40
|
+
"@playwright/test": "^1.61.0",
|
|
41
41
|
"ts-morph": "^28.0.0",
|
|
42
42
|
"yaml": "^2.9.0",
|
|
43
43
|
"zod": "^4.4.3",
|
|
44
|
-
"@slowcook-ai/core": "^0.
|
|
45
|
-
"@slowcook-ai/forge-github": "^0.14.0",
|
|
44
|
+
"@slowcook-ai/core": "^0.16.0",
|
|
46
45
|
"@slowcook-ai/stack-ts": "^0.9.9",
|
|
47
|
-
"@slowcook-ai/
|
|
48
|
-
"@slowcook-ai/
|
|
46
|
+
"@slowcook-ai/forge-github": "^0.14.0",
|
|
47
|
+
"@slowcook-ai/review-overlay": "^0.9.7",
|
|
48
|
+
"@slowcook-ai/llm-anthropic": "^0.19.0",
|
|
49
49
|
"@slowcook-ai/gates": "^0.11.0",
|
|
50
|
-
"@slowcook-ai/
|
|
50
|
+
"@slowcook-ai/recorder": "^0.9.1"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/node": "^25.9.1"
|