@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
|
@@ -34,6 +34,141 @@ export function parseLcrProvenance(source) {
|
|
|
34
34
|
}
|
|
35
35
|
return out;
|
|
36
36
|
}
|
|
37
|
+
export function checkCoverage(input) {
|
|
38
|
+
const referenced = new Set();
|
|
39
|
+
for (const n of input.lcrNodes) {
|
|
40
|
+
for (const p of n.provenance) {
|
|
41
|
+
if (p.kind === "story")
|
|
42
|
+
referenced.add(p.id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const uncovered = [];
|
|
46
|
+
for (const s of input.specs) {
|
|
47
|
+
const id = `story-${s.storyId}`;
|
|
48
|
+
if (!referenced.has(id))
|
|
49
|
+
uncovered.push(id);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
uncovered,
|
|
53
|
+
coveredCount: input.specs.length - uncovered.length,
|
|
54
|
+
totalStories: input.specs.length,
|
|
55
|
+
ok: uncovered.length === 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** A concrete surface route is satisfied by a router path when every segment
|
|
59
|
+
* matches — a param segment (`:slug`) matches anything. e.g. `/u/:handle`
|
|
60
|
+
* satisfies `/u/you`. */
|
|
61
|
+
export function routeSatisfies(routerPath, surfaceRoute) {
|
|
62
|
+
const a = routerPath.split("/").filter(Boolean);
|
|
63
|
+
const b = surfaceRoute.split("/").filter(Boolean);
|
|
64
|
+
if (a.length !== b.length)
|
|
65
|
+
return false;
|
|
66
|
+
return a.every((seg, i) => seg.startsWith(":") || seg === b[i]);
|
|
67
|
+
}
|
|
68
|
+
export function checkSurfaces(input) {
|
|
69
|
+
const resolves = (route) => input.routes.some((r) => routeSatisfies(r, route));
|
|
70
|
+
const dangling = input.surfaces.filter((s) => !resolves(s.route));
|
|
71
|
+
const homeByPersona = new Map();
|
|
72
|
+
for (const s of input.surfaces) {
|
|
73
|
+
if (s.home)
|
|
74
|
+
homeByPersona.set(s.persona, resolves(s.route) || homeByPersona.get(s.persona) === true);
|
|
75
|
+
}
|
|
76
|
+
const unreachablePersonas = [...homeByPersona.entries()].filter(([, ok]) => !ok).map(([p]) => p);
|
|
77
|
+
return { dangling, unreachablePersonas, surfaceCount: input.surfaces.length, ok: dangling.length === 0 && unreachablePersonas.length === 0 };
|
|
78
|
+
}
|
|
79
|
+
// ── PRD↔spec interdependency (0.21.x) — the deterministic floor under the
|
|
80
|
+
// conversational PRD/stories review. Every spec already anchors to a PRD
|
|
81
|
+
// section (`prd_ref.anchor`); we fingerprint that section's body so a PRD
|
|
82
|
+
// edit becomes *detectable* (staleness) and *attributable* (impact). No LLM:
|
|
83
|
+
// this tells you WHICH stories a PRD change touches; reconcile narrows to HOW.
|
|
84
|
+
// See docs/plans/prd-stories-interdependency.md. ────────────────────────────
|
|
85
|
+
/** Normalise an anchor body so cosmetic reflow (trailing ws, blank-line runs)
|
|
86
|
+
* doesn't churn the fingerprint — only semantic edits move it. */
|
|
87
|
+
export function normalizeAnchorBody(body) {
|
|
88
|
+
return body
|
|
89
|
+
.split(/\r?\n/)
|
|
90
|
+
.map((l) => l.replace(/\s+$/, ""))
|
|
91
|
+
.join("\n")
|
|
92
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
93
|
+
.trim();
|
|
94
|
+
}
|
|
95
|
+
/** Dependency-free FNV-1a (64-bit) content hash → 16-hex. Not cryptographic;
|
|
96
|
+
* it only needs to answer "did this PRD section change?". Pure + deterministic
|
|
97
|
+
* across environments (no node:crypto, keeping this module IO-free). */
|
|
98
|
+
export function contentHash(s) {
|
|
99
|
+
let h = 0xcbf29ce484222325n;
|
|
100
|
+
const prime = 0x100000001b3n;
|
|
101
|
+
const mask = 0xffffffffffffffffn;
|
|
102
|
+
for (let i = 0; i < s.length; i++) {
|
|
103
|
+
h ^= BigInt(s.charCodeAt(i));
|
|
104
|
+
h = (h * prime) & mask;
|
|
105
|
+
}
|
|
106
|
+
return h.toString(16).padStart(16, "0");
|
|
107
|
+
}
|
|
108
|
+
/** Fingerprint of a PRD anchor's body (normalised). */
|
|
109
|
+
export function anchorHash(body) {
|
|
110
|
+
return contentHash(normalizeAnchorBody(body));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* FRESHNESS — does each spec's recorded fingerprint still match its PRD anchor?
|
|
114
|
+
* `stale` = the anchor body changed since the spec was stamped (the rot we want
|
|
115
|
+
* to catch). Specs with no `prdAnchor` are skipped (orphans are `checkTrace`'s
|
|
116
|
+
* job); anchors that no longer exist are skipped here (dangling-prd-ref already
|
|
117
|
+
* flags those). Deterministic; advisory by default (cosmetic edits can move a
|
|
118
|
+
* section hash, so the caller decides whether to fail).
|
|
119
|
+
*/
|
|
120
|
+
export function checkFreshness(input) {
|
|
121
|
+
const byAnchor = new Map(input.anchors.map((a) => [a.anchor, a.hash]));
|
|
122
|
+
const stale = [];
|
|
123
|
+
const unstamped = [];
|
|
124
|
+
let freshCount = 0;
|
|
125
|
+
for (const s of input.specs) {
|
|
126
|
+
if (!s.prdAnchor)
|
|
127
|
+
continue;
|
|
128
|
+
const current = byAnchor.get(s.prdAnchor);
|
|
129
|
+
if (current === undefined)
|
|
130
|
+
continue; // dangling anchor — checkTrace handles it
|
|
131
|
+
if (!s.prdSha) {
|
|
132
|
+
unstamped.push({ storyId: s.storyId, anchor: s.prdAnchor });
|
|
133
|
+
}
|
|
134
|
+
else if (s.prdSha !== current) {
|
|
135
|
+
stale.push({ storyId: s.storyId, anchor: s.prdAnchor, recorded: s.prdSha, current });
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
freshCount++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return { stale, unstamped, freshCount };
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* IMPACT — given the set of PRD anchors whose content changed (e.g. from a git
|
|
145
|
+
* diff between two PRD revisions), which stories link them? Forward direction
|
|
146
|
+
* (PRD→stories). The reverse (story→PRD) is the same link read backward: a
|
|
147
|
+
* changed story's `prdAnchor` is the PRD section to review.
|
|
148
|
+
*/
|
|
149
|
+
export function computeImpact(input) {
|
|
150
|
+
const changed = new Set(input.changedAnchors);
|
|
151
|
+
const affected = input.specs
|
|
152
|
+
.filter((s) => s.prdAnchor && changed.has(s.prdAnchor))
|
|
153
|
+
.map((s) => ({ storyId: s.storyId, anchor: s.prdAnchor }));
|
|
154
|
+
return { affected };
|
|
155
|
+
}
|
|
156
|
+
/** Diff two PRD states (anchor→hash) → anchors that changed, were added, or
|
|
157
|
+
* removed. `changed` is what impact analysis keys on. */
|
|
158
|
+
export function diffPrdStates(before, after) {
|
|
159
|
+
const a = new Map(before.map((x) => [x.anchor, x.hash]));
|
|
160
|
+
const b = new Map(after.map((x) => [x.anchor, x.hash]));
|
|
161
|
+
const changed = [];
|
|
162
|
+
const added = [];
|
|
163
|
+
for (const [anchor, hash] of b) {
|
|
164
|
+
if (!a.has(anchor))
|
|
165
|
+
added.push(anchor);
|
|
166
|
+
else if (a.get(anchor) !== hash)
|
|
167
|
+
changed.push(anchor);
|
|
168
|
+
}
|
|
169
|
+
const removed = [...a.keys()].filter((anchor) => !b.has(anchor));
|
|
170
|
+
return { changed, added, removed };
|
|
171
|
+
}
|
|
37
172
|
export function checkTrace(input) {
|
|
38
173
|
const violations = [];
|
|
39
174
|
const anchors = new Set(input.prdAnchors);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/commands/trace/check.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/commands/trace/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
/** Insert/replace `sha:` inside a spec's `prd_ref:` block, preserving the file's
|
|
2
|
+
* formatting (targeted line edit, not a YAML round-trip that would reflow the
|
|
3
|
+
* hand-tweaked spec). Returns the new text, or the original if there's no
|
|
4
|
+
* prd_ref/anchor to stamp. */
|
|
5
|
+
export declare function setPrdSha(text: string, hash: string): string;
|
|
1
6
|
export declare function trace(argv: string[], _cliVersion: string): Promise<void>;
|
|
2
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/trace/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/trace/index.ts"],"names":[],"mappings":"AAgDA;;;+BAG+B;AAC/B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAqB5D;AAgDD,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuI9E"}
|
|
@@ -9,16 +9,99 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Pure lint in ./check.ts; this is the IO shell.
|
|
11
11
|
*/
|
|
12
|
-
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
12
|
+
import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
13
|
+
import { execFileSync } from "node:child_process";
|
|
13
14
|
import { join, relative, resolve } from "node:path";
|
|
14
|
-
import
|
|
15
|
+
import YAML from "yaml";
|
|
16
|
+
import { listActiveSpecs, SPECS_DIR } from "../refine/spec-yaml.js";
|
|
15
17
|
import { loadMockShapeConfig } from "../../lib/mock-shape.js";
|
|
16
18
|
import { parsePrdInitiatives } from "../menu/prd.js";
|
|
17
|
-
import { checkTrace, parseLcrProvenance } from "./check.js";
|
|
19
|
+
import { checkTrace, checkCoverage, checkSurfaces, checkFreshness, computeImpact, diffPrdStates, anchorHash, parseLcrProvenance, } from "./check.js";
|
|
20
|
+
/** Specs → their PRD link facts (anchor + recorded fingerprint). */
|
|
21
|
+
function loadSpecLinks(cwd) {
|
|
22
|
+
return listActiveSpecs(cwd).map((s) => ({
|
|
23
|
+
storyId: s.story_id,
|
|
24
|
+
prdAnchor: s.prd_ref?.anchor,
|
|
25
|
+
prdSha: s.prd_ref?.sha,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
/** Parse a PRD markdown string → current anchor fingerprints. */
|
|
29
|
+
function prdAnchorStates(md) {
|
|
30
|
+
return parsePrdInitiatives(md).map((i) => ({ anchor: i.anchor, hash: anchorHash(i.body) }));
|
|
31
|
+
}
|
|
32
|
+
/** Insert/replace `sha:` inside a spec's `prd_ref:` block, preserving the file's
|
|
33
|
+
* formatting (targeted line edit, not a YAML round-trip that would reflow the
|
|
34
|
+
* hand-tweaked spec). Returns the new text, or the original if there's no
|
|
35
|
+
* prd_ref/anchor to stamp. */
|
|
36
|
+
export function setPrdSha(text, hash) {
|
|
37
|
+
const lines = text.split(/\r?\n/);
|
|
38
|
+
const i = lines.findIndex((l) => /^\s*prd_ref:\s*$/.test(l));
|
|
39
|
+
if (i < 0)
|
|
40
|
+
return text;
|
|
41
|
+
const baseIndent = lines[i].match(/^\s*/)[0].length;
|
|
42
|
+
let anchorIdx = -1;
|
|
43
|
+
let shaIdx = -1;
|
|
44
|
+
let childIndent = " ";
|
|
45
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
46
|
+
const l = lines[j];
|
|
47
|
+
if (l.trim() === "")
|
|
48
|
+
continue;
|
|
49
|
+
const indent = l.match(/^\s*/)[0].length;
|
|
50
|
+
if (indent <= baseIndent)
|
|
51
|
+
break; // left the prd_ref block
|
|
52
|
+
childIndent = l.match(/^\s*/)[0];
|
|
53
|
+
if (/^\s*anchor:/.test(l))
|
|
54
|
+
anchorIdx = j;
|
|
55
|
+
if (/^\s*sha:/.test(l))
|
|
56
|
+
shaIdx = j;
|
|
57
|
+
}
|
|
58
|
+
if (shaIdx >= 0)
|
|
59
|
+
lines[shaIdx] = `${childIndent}sha: ${hash}`;
|
|
60
|
+
else if (anchorIdx >= 0)
|
|
61
|
+
lines.splice(anchorIdx + 1, 0, `${childIndent}sha: ${hash}`);
|
|
62
|
+
else
|
|
63
|
+
return text;
|
|
64
|
+
return lines.join("\n");
|
|
65
|
+
}
|
|
66
|
+
/** Read persona-surface declarations from the spec YAMLs (the `persona` +
|
|
67
|
+
* `surfaces` blocks the generator compiles into the mock). */
|
|
68
|
+
function readSpecSurfaces(cwd) {
|
|
69
|
+
const dir = resolve(cwd, SPECS_DIR);
|
|
70
|
+
if (!existsSync(dir))
|
|
71
|
+
return [];
|
|
72
|
+
const out = [];
|
|
73
|
+
for (const name of readdirSync(dir)) {
|
|
74
|
+
if (!/^story-.*\.yaml$/.test(name))
|
|
75
|
+
continue;
|
|
76
|
+
let doc;
|
|
77
|
+
try {
|
|
78
|
+
doc = YAML.parse(readFileSync(join(dir, name), "utf8")) ?? {};
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const persona = doc.persona?.id;
|
|
84
|
+
if (!persona || !Array.isArray(doc.surfaces))
|
|
85
|
+
continue;
|
|
86
|
+
for (const s of doc.surfaces) {
|
|
87
|
+
if (s?.route)
|
|
88
|
+
out.push({ storyId: `story-${doc.story_id}`, persona, route: s.route, home: s.home === true });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
/** Extract concrete route paths from a react-router file (path="..."). */
|
|
94
|
+
function readRouterPaths(file) {
|
|
95
|
+
if (!existsSync(file))
|
|
96
|
+
return [];
|
|
97
|
+
const src = readFileSync(file, "utf8");
|
|
98
|
+
return [...src.matchAll(/path\s*=\s*["'`]([^"'`]+)["'`]/g)].map((m) => m[1]).filter((p) => p && p !== "*");
|
|
99
|
+
}
|
|
18
100
|
function val(args, flag) {
|
|
19
101
|
const i = args.indexOf(flag);
|
|
20
102
|
return i >= 0 ? args[i + 1] : undefined;
|
|
21
103
|
}
|
|
104
|
+
const has = (args, flag) => args.includes(flag);
|
|
22
105
|
/** Recursively collect .tsx files under `dir`, skipping any path in `exclude`. */
|
|
23
106
|
function walkTsx(dir, exclude) {
|
|
24
107
|
if (!existsSync(dir))
|
|
@@ -37,22 +120,35 @@ function walkTsx(dir, exclude) {
|
|
|
37
120
|
return out;
|
|
38
121
|
}
|
|
39
122
|
export async function trace(argv, _cliVersion) {
|
|
40
|
-
|
|
41
|
-
|
|
123
|
+
const sub = argv[0];
|
|
124
|
+
if (sub === "stamp")
|
|
125
|
+
return runStamp(argv.slice(1));
|
|
126
|
+
if (sub === "impact")
|
|
127
|
+
return runImpact(argv.slice(1));
|
|
128
|
+
if (sub !== "check") {
|
|
129
|
+
console.error("usage: slowcook trace <check|stamp|impact> [--prd <path>] [--cwd <dir>]");
|
|
130
|
+
console.error(" check provenance + coverage + surface + freshness lints [--coverage] [--strict]");
|
|
131
|
+
console.error(" stamp record each spec's PRD-anchor fingerprint (prd_ref.sha)");
|
|
132
|
+
console.error(" impact which stories a PRD change touches [--since <gitref>] [--anchors a,b]");
|
|
42
133
|
process.exit(64);
|
|
43
134
|
}
|
|
44
135
|
const rest = argv.slice(1);
|
|
45
136
|
const cwd = resolve(val(rest, "--cwd") ?? ".");
|
|
137
|
+
const enforceCoverage = has(rest, "--coverage"); // make uncovered stories a hard failure
|
|
138
|
+
const strict = has(rest, "--strict"); // make stale specs a hard failure too
|
|
46
139
|
// 1. Specs → requirement-provenance facts.
|
|
47
140
|
const specNodes = listActiveSpecs(cwd).map((s) => ({
|
|
48
141
|
storyId: s.story_id,
|
|
49
142
|
prdAnchor: s.prd_ref?.anchor,
|
|
50
143
|
sourceIssue: s.source_issue,
|
|
51
144
|
}));
|
|
52
|
-
// 2. PRD anchors (optional — absent = brownfield).
|
|
145
|
+
// 2. PRD anchors + fingerprints (optional — absent = brownfield).
|
|
53
146
|
const prdRel = val(rest, "--prd") ?? "docs/PRD.md";
|
|
54
147
|
const prdAbs = resolve(cwd, prdRel);
|
|
55
|
-
const
|
|
148
|
+
const prdStates = existsSync(prdAbs) ? prdAnchorStates(readFileSync(prdAbs, "utf8")) : [];
|
|
149
|
+
const prdAnchors = prdStates.map((s) => s.anchor);
|
|
150
|
+
// 2b. Freshness — has any spec's PRD anchor moved since it was stamped?
|
|
151
|
+
const freshness = checkFreshness({ specs: loadSpecLinks(cwd), anchors: prdStates });
|
|
56
152
|
// 3. LCR nodes — mock screens + components (excluding the design system, which
|
|
57
153
|
// is convention/brand provenance, not story-specific).
|
|
58
154
|
const mock = loadMockShapeConfig(cwd);
|
|
@@ -68,19 +164,184 @@ export async function trace(argv, _cliVersion) {
|
|
|
68
164
|
return;
|
|
69
165
|
}
|
|
70
166
|
const result = checkTrace({ specs: specNodes, prdAnchors, lcrNodes });
|
|
167
|
+
const coverage = checkCoverage({ specs: specNodes, lcrNodes });
|
|
168
|
+
// Persona/surface trace: the same forward+inverse rules on the persona surfaces
|
|
169
|
+
// declared in specs vs the routes the mock router actually exposes.
|
|
170
|
+
const specSurfaces = readSpecSurfaces(cwd);
|
|
171
|
+
const routerFile = mock.router_file ? resolve(cwd, mock.router_file) : "";
|
|
172
|
+
const routes = routerFile ? readRouterPaths(routerFile) : [];
|
|
173
|
+
const surfaceRes = checkSurfaces({ surfaces: specSurfaces, routes });
|
|
71
174
|
console.log(`trace check: ${specNodes.length} specs · ${prdAnchors.length} PRD initiatives · ${lcrNodes.length} LCR files`);
|
|
72
175
|
if (result.craft.length) {
|
|
73
176
|
console.log(`\n ${result.craft.length} craft decision(s) — not in any requirement (ratify or note):`);
|
|
74
177
|
for (const c of result.craft)
|
|
75
178
|
console.log(` · ${c.file}: ${c.rationale}`);
|
|
76
179
|
}
|
|
77
|
-
|
|
78
|
-
|
|
180
|
+
// Coverage (inverse): which stories have no surface in the mock. Informational
|
|
181
|
+
// by default (backend/infra stories legitimately have none); --coverage makes
|
|
182
|
+
// it a hard failure so a UI milestone can require every story to have a home.
|
|
183
|
+
if (specNodes.length > 0) {
|
|
184
|
+
if (coverage.ok) {
|
|
185
|
+
console.log(`\n coverage: every story has ≥1 LCR surface (${coverage.coveredCount}/${coverage.totalStories}).`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const stream = enforceCoverage ? console.error : console.log;
|
|
189
|
+
stream(`\n coverage: ${coverage.uncovered.length}/${coverage.totalStories} stories have NO LCR surface${enforceCoverage ? " (FAIL — --coverage)" : " (review — backend stories may be fine)"}:`);
|
|
190
|
+
for (const id of coverage.uncovered)
|
|
191
|
+
stream(` ✗ ${id}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Persona/surface trace report (same rules as provenance, applied to surfaces).
|
|
195
|
+
if (specSurfaces.length > 0) {
|
|
196
|
+
if (surfaceRes.ok) {
|
|
197
|
+
console.log(`\n surfaces: ${surfaceRes.surfaceCount} persona surface(s), every declared route resolves to a real mock route.`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
if (surfaceRes.dangling.length) {
|
|
201
|
+
console.error(`\n surfaces: ${surfaceRes.dangling.length} declared surface(s) with NO matching mock route (dangling):`);
|
|
202
|
+
for (const s of surfaceRes.dangling)
|
|
203
|
+
console.error(` ✗ ${s.persona} → ${s.route} (${s.storyId})`);
|
|
204
|
+
}
|
|
205
|
+
if (surfaceRes.unreachablePersonas.length) {
|
|
206
|
+
console.error(` surfaces: persona(s) whose home route is unreachable: ${surfaceRes.unreachablePersonas.join(", ")}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Freshness (PRD↔spec): which specs were refined against a PRD section that has
|
|
211
|
+
// since changed. Advisory by default (a section hash also moves on cosmetic
|
|
212
|
+
// reflow); --strict makes it a hard failure. Unstamped specs are reported as a
|
|
213
|
+
// hint to run `trace stamp`, never as stale.
|
|
214
|
+
if (prdStates.length > 0) {
|
|
215
|
+
if (freshness.stale.length === 0 && freshness.unstamped.length === 0) {
|
|
216
|
+
console.log(`\n freshness: ${freshness.freshCount} spec(s) match their PRD anchor — none stale.`);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
if (freshness.stale.length) {
|
|
220
|
+
const stream = strict ? console.error : console.log;
|
|
221
|
+
stream(`\n freshness: ${freshness.stale.length} spec(s) STALE — their PRD section changed since stamping${strict ? " (FAIL — --strict)" : " (review / run reconcile)"}:`);
|
|
222
|
+
for (const s of freshness.stale)
|
|
223
|
+
stream(` ⚠ story-${s.storyId} ← §${s.anchor} (PRD moved)`);
|
|
224
|
+
}
|
|
225
|
+
if (freshness.unstamped.length) {
|
|
226
|
+
console.log(`\n freshness: ${freshness.unstamped.length} spec(s) unstamped — run \`slowcook trace stamp\` to baseline:`);
|
|
227
|
+
for (const s of freshness.unstamped)
|
|
228
|
+
console.log(` · story-${s.storyId} ← §${s.anchor}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const provenanceOk = result.ok;
|
|
233
|
+
const coverageOk = !enforceCoverage || coverage.ok;
|
|
234
|
+
const surfacesOk = surfaceRes.ok;
|
|
235
|
+
const freshnessOk = !strict || freshness.stale.length === 0;
|
|
236
|
+
if (provenanceOk && coverageOk && surfacesOk && freshnessOk) {
|
|
237
|
+
console.log("\ntrace check: PASS ✓ — every node has honest provenance" + (enforceCoverage ? ", every story has a surface," : "") + " and every persona surface resolves.");
|
|
79
238
|
return;
|
|
80
239
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
240
|
+
if (!provenanceOk) {
|
|
241
|
+
console.error(`\ntrace check: FAIL ✗ — ${result.violations.length} provenance violation(s):`);
|
|
242
|
+
for (const v of result.violations)
|
|
243
|
+
console.error(` [${v.code}] ${v.subject}: ${v.detail}`);
|
|
244
|
+
}
|
|
245
|
+
if (!surfacesOk) {
|
|
246
|
+
console.error(`\ntrace check: FAIL ✗ — ${surfaceRes.dangling.length + surfaceRes.unreachablePersonas.length} persona-surface violation(s) (a spec promises a surface the mock doesn't expose).`);
|
|
247
|
+
}
|
|
248
|
+
if (enforceCoverage && !coverage.ok) {
|
|
249
|
+
console.error(`\ntrace check: FAIL ✗ — ${coverage.uncovered.length} story(ies) with no surface (--coverage).`);
|
|
250
|
+
}
|
|
251
|
+
if (strict && freshness.stale.length) {
|
|
252
|
+
console.error(`\ntrace check: FAIL ✗ — ${freshness.stale.length} stale spec(s) vs the PRD (--strict).`);
|
|
253
|
+
}
|
|
84
254
|
process.exit(1);
|
|
85
255
|
}
|
|
256
|
+
/** `slowcook trace stamp` — record each spec's PRD-anchor fingerprint into
|
|
257
|
+
* `prd_ref.sha`, baselining freshness. Run after a PRD↔spec set is agreed. */
|
|
258
|
+
async function runStamp(rest) {
|
|
259
|
+
const cwd = resolve(val(rest, "--cwd") ?? ".");
|
|
260
|
+
const prdRel = val(rest, "--prd") ?? "docs/PRD.md";
|
|
261
|
+
const prdAbs = resolve(cwd, prdRel);
|
|
262
|
+
if (!existsSync(prdAbs)) {
|
|
263
|
+
console.error(`trace stamp: no PRD at ${prdRel} — nothing to fingerprint.`);
|
|
264
|
+
process.exit(64);
|
|
265
|
+
}
|
|
266
|
+
const byAnchor = new Map(prdAnchorStates(readFileSync(prdAbs, "utf8")).map((s) => [s.anchor, s.hash]));
|
|
267
|
+
const specsDir = resolve(cwd, SPECS_DIR);
|
|
268
|
+
let stamped = 0;
|
|
269
|
+
let skipped = 0;
|
|
270
|
+
for (const spec of listActiveSpecs(cwd)) {
|
|
271
|
+
const anchor = spec.prd_ref?.anchor;
|
|
272
|
+
if (!anchor) {
|
|
273
|
+
skipped++;
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const hash = byAnchor.get(anchor);
|
|
277
|
+
if (hash === undefined) {
|
|
278
|
+
console.log(` · story-${spec.story_id}: anchor §${anchor} not in PRD — skipped`);
|
|
279
|
+
skipped++;
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
const file = join(specsDir, `story-${spec.story_id}.yaml`);
|
|
283
|
+
const before = readFileSync(file, "utf8");
|
|
284
|
+
const after = setPrdSha(before, hash);
|
|
285
|
+
if (after !== before) {
|
|
286
|
+
writeFileSync(file, after);
|
|
287
|
+
stamped++;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
console.log(`trace stamp: ${stamped} spec(s) stamped${skipped ? `, ${skipped} skipped (no prd_ref / unknown anchor)` : ""}.`);
|
|
291
|
+
}
|
|
292
|
+
/** `slowcook trace impact` — which stories does a PRD change touch? Changed
|
|
293
|
+
* anchors come from `--anchors a,b` or `--since <gitref>` (diff the PRD between
|
|
294
|
+
* that revision and the working tree). Read-only. */
|
|
295
|
+
async function runImpact(rest) {
|
|
296
|
+
const cwd = resolve(val(rest, "--cwd") ?? ".");
|
|
297
|
+
const prdRel = val(rest, "--prd") ?? "docs/PRD.md";
|
|
298
|
+
const prdAbs = resolve(cwd, prdRel);
|
|
299
|
+
const specs = loadSpecLinks(cwd);
|
|
300
|
+
let changedAnchors;
|
|
301
|
+
const explicit = val(rest, "--anchors");
|
|
302
|
+
const since = val(rest, "--since");
|
|
303
|
+
if (explicit) {
|
|
304
|
+
changedAnchors = explicit.split(",").map((a) => a.trim()).filter(Boolean);
|
|
305
|
+
}
|
|
306
|
+
else if (since) {
|
|
307
|
+
if (!existsSync(prdAbs)) {
|
|
308
|
+
console.error(`trace impact: no PRD at ${prdRel}.`);
|
|
309
|
+
process.exit(64);
|
|
310
|
+
}
|
|
311
|
+
let beforeMd;
|
|
312
|
+
try {
|
|
313
|
+
beforeMd = execFileSync("git", ["show", `${since}:${prdRel}`], { cwd, encoding: "utf8" });
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
console.error(`trace impact: couldn't read ${prdRel} at '${since}' (bad ref or path?).`);
|
|
317
|
+
process.exit(1);
|
|
318
|
+
}
|
|
319
|
+
const afterMd = readFileSync(prdAbs, "utf8");
|
|
320
|
+
const d = diffPrdStates(prdAnchorStates(beforeMd), prdAnchorStates(afterMd));
|
|
321
|
+
changedAnchors = d.changed;
|
|
322
|
+
const extra = [...d.added.map((a) => `+§${a}`), ...d.removed.map((a) => `-§${a}`)];
|
|
323
|
+
console.log(`trace impact: PRD diff ${since}..worktree — ${d.changed.length} changed${extra.length ? `, ${extra.join(" ")}` : ""}.`);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
console.error("trace impact: pass --since <gitref> or --anchors a,b");
|
|
327
|
+
process.exit(64);
|
|
328
|
+
}
|
|
329
|
+
const { affected } = computeImpact({ specs, changedAnchors });
|
|
330
|
+
if (changedAnchors.length === 0) {
|
|
331
|
+
console.log(" no PRD anchors changed — no stories impacted.");
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
console.log(` changed anchors: ${changedAnchors.map((a) => `§${a}`).join(", ")}`);
|
|
335
|
+
if (affected.length === 0) {
|
|
336
|
+
console.log(" no stories link the changed anchors.");
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const byAnchor = new Map();
|
|
340
|
+
for (const a of affected)
|
|
341
|
+
(byAnchor.get(a.anchor) ?? byAnchor.set(a.anchor, []).get(a.anchor)).push(`story-${a.storyId}`);
|
|
342
|
+
console.log(`\n ${affected.length} story(ies) impacted:`);
|
|
343
|
+
for (const [anchor, stories] of byAnchor)
|
|
344
|
+
console.log(` §${anchor} → ${stories.join(", ")}`);
|
|
345
|
+
console.log(`\n next: \`slowcook reconcile --story <id>\` proposes the per-story edits (one hop, review before apply).`);
|
|
346
|
+
}
|
|
86
347
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/trace/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/trace/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert-agent-docs.d.ts","sourceRoot":"","sources":["../../src/commands/upsert-agent-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAmBH,wBAAgB,iBAAiB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"upsert-agent-docs.d.ts","sourceRoot":"","sources":["../../src/commands/upsert-agent-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAmBH,wBAAgB,iBAAiB,IAAI,MAAM,CAqL1C;AAmGD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,CAAA;KAAE,CAAC,CAAC;IACtF,MAAM,EAAE,OAAO,GAAG,iBAAiB,GAAG,WAAW,CAAC;IAClD,SAAS,EAAE,OAAO,GAAG,iBAAiB,GAAG,cAAc,CAAC;CACzD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,qBAAqB,CAsB5G;AAID,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUnE"}
|
|
@@ -149,6 +149,17 @@ This is a HARD halt, and the integrity of it depends on you NOT bypassing it:
|
|
|
149
149
|
|
|
150
150
|
The bot pipeline enforces the same gate via \`.github/workflows/slowcook-gate.yml\`; the local pipeline enforces it by your honouring this section.
|
|
151
151
|
|
|
152
|
+
### Eye behind auth — dev-only preview (always available, design #192)
|
|
153
|
+
|
|
154
|
+
Most real surfaces sit behind auth, so \`eye\` (headless) and PM preview links can only reach public pages **unless the consumer ships a dev-only preview seam**. Every consumer should stand one up so eye converges EVERY route deterministically — gated so it can NEVER work in prod:
|
|
155
|
+
|
|
156
|
+
- **Two independent gates, both required.** Active only when a build-time flag is set (e.g. \`VITE_EYE_PREVIEW=1\` / \`EYE_PREVIEW=1\`) — never set in prod builds, so the branch is dead-stripped — AND the URL carries \`?__preview\`. If a backend is consulted it independently refuses the preview header unless \`NODE_ENV !== 'production'\` and the request origin is on a dev allowlist.
|
|
157
|
+
- **No real session, no PII.** In preview the app short-circuits auth to a fake "Preview User" and resolves data through the fixture seam (\`useScenarioFixture\` / a fixture-returning API stub) to committed mock fixtures — so screenshots are reproducible.
|
|
158
|
+
- **How eye uses it.** Pass the candidate as \`…/<route>?__preview[&scenario=<name>]\`. The mock *reference* needs the same bypass so BOTH sides render the authed route (else you compare login-vs-page).
|
|
159
|
+
- **Safety.** The prod build asserts the flag is unset (guard/CI); any token is dev-secret-signed, short-lived, and render-only (mints no real identity).
|
|
160
|
+
|
|
161
|
+
Stand this up once per consumer; thereafter eye is a real drift-guard on authed surfaces, not just public ones. See slowcook#192.
|
|
162
|
+
|
|
152
163
|
### Working alongside other agents (multi-agent choreography)
|
|
153
164
|
|
|
154
165
|
When your work depends on another agent's still-open PR — common when one agent owns the app shell + another owns a feature inside it — follow this:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert-agent-docs.js","sourceRoot":"","sources":["../../src/commands/upsert-agent-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAe,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,YAAY,GAAG,8EAA8E,CAAC;AACpG,MAAM,UAAU,GAAG,qDAAqD,CAAC;AAEzE;uEACuE;AACvE,MAAM,mBAAmB,GAAG;IAC1B,WAAW;IACX,WAAW;IACX,cAAc;IACd,gBAAgB;IAChB,WAAW;IACX,iCAAiC;CAClC,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,OAAO
|
|
1
|
+
{"version":3,"file":"upsert-agent-docs.js","sourceRoot":"","sources":["../../src/commands/upsert-agent-docs.ts"],"names":[],"mappings":"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"}
|