@slowcook-ai/cli 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +15 -3
  2. package/dist/cli.js +18 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/brand/index.d.ts.map +1 -1
  5. package/dist/commands/brand/index.js +6 -0
  6. package/dist/commands/brand/index.js.map +1 -1
  7. package/dist/commands/brand/logo-cmd.d.ts +2 -0
  8. package/dist/commands/brand/logo-cmd.d.ts.map +1 -0
  9. package/dist/commands/brand/logo-cmd.js +90 -0
  10. package/dist/commands/brand/logo-cmd.js.map +1 -0
  11. package/dist/commands/brand/logo.d.ts +23 -0
  12. package/dist/commands/brand/logo.d.ts.map +1 -0
  13. package/dist/commands/brand/logo.js +60 -0
  14. package/dist/commands/brand/logo.js.map +1 -0
  15. package/dist/commands/eye/index.d.ts.map +1 -1
  16. package/dist/commands/eye/index.js +21 -2
  17. package/dist/commands/eye/index.js.map +1 -1
  18. package/dist/commands/eye/plan.d.ts +8 -0
  19. package/dist/commands/eye/plan.d.ts.map +1 -1
  20. package/dist/commands/eye/plan.js +6 -0
  21. package/dist/commands/eye/plan.js.map +1 -1
  22. package/dist/commands/eye/run.d.ts +23 -0
  23. package/dist/commands/eye/run.d.ts.map +1 -1
  24. package/dist/commands/eye/run.js +69 -0
  25. package/dist/commands/eye/run.js.map +1 -1
  26. package/dist/commands/greenfield/index.d.ts +2 -0
  27. package/dist/commands/greenfield/index.d.ts.map +1 -0
  28. package/dist/commands/greenfield/index.js +80 -0
  29. package/dist/commands/greenfield/index.js.map +1 -0
  30. package/dist/commands/greenfield/status.d.ts +38 -0
  31. package/dist/commands/greenfield/status.d.ts.map +1 -0
  32. package/dist/commands/greenfield/status.js +52 -0
  33. package/dist/commands/greenfield/status.js.map +1 -0
  34. package/dist/commands/menu/assemble.d.ts +31 -0
  35. package/dist/commands/menu/assemble.d.ts.map +1 -0
  36. package/dist/commands/menu/assemble.js +37 -0
  37. package/dist/commands/menu/assemble.js.map +1 -0
  38. package/dist/commands/menu/index.d.ts +5 -0
  39. package/dist/commands/menu/index.d.ts.map +1 -0
  40. package/dist/commands/menu/index.js +111 -0
  41. package/dist/commands/menu/index.js.map +1 -0
  42. package/dist/commands/menu/prd.d.ts +33 -0
  43. package/dist/commands/menu/prd.d.ts.map +1 -0
  44. package/dist/commands/menu/prd.js +68 -0
  45. package/dist/commands/menu/prd.js.map +1 -0
  46. package/dist/commands/plate/index.d.ts.map +1 -1
  47. package/dist/commands/plate/index.js +5 -1
  48. package/dist/commands/plate/index.js.map +1 -1
  49. package/dist/commands/plate/route-hint.d.ts +18 -0
  50. package/dist/commands/plate/route-hint.d.ts.map +1 -0
  51. package/dist/commands/plate/route-hint.js +21 -0
  52. package/dist/commands/plate/route-hint.js.map +1 -0
  53. package/dist/commands/refine/spec-yaml.d.ts +23 -0
  54. package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
  55. package/dist/commands/refine/spec-yaml.js +25 -0
  56. package/dist/commands/refine/spec-yaml.js.map +1 -1
  57. package/dist/commands/run-mock/index.d.ts.map +1 -1
  58. package/dist/commands/run-mock/index.js +69 -16
  59. package/dist/commands/run-mock/index.js.map +1 -1
  60. package/dist/commands/run-mock/reviewer-auth-server.d.ts +40 -0
  61. package/dist/commands/run-mock/reviewer-auth-server.d.ts.map +1 -0
  62. package/dist/commands/run-mock/reviewer-auth-server.js +124 -0
  63. package/dist/commands/run-mock/reviewer-auth-server.js.map +1 -0
  64. package/dist/commands/trace/check.d.ts +67 -0
  65. package/dist/commands/trace/check.d.ts.map +1 -0
  66. package/dist/commands/trace/check.js +82 -0
  67. package/dist/commands/trace/check.js.map +1 -0
  68. package/dist/commands/trace/index.d.ts +2 -0
  69. package/dist/commands/trace/index.d.ts.map +1 -0
  70. package/dist/commands/trace/index.js +86 -0
  71. package/dist/commands/trace/index.js.map +1 -0
  72. package/dist/commands.manifest.d.ts.map +1 -1
  73. package/dist/commands.manifest.js +21 -3
  74. package/dist/commands.manifest.js.map +1 -1
  75. package/dist/lib/mock-shape.d.ts +6 -0
  76. package/dist/lib/mock-shape.d.ts.map +1 -1
  77. package/dist/lib/mock-shape.js +26 -0
  78. package/dist/lib/mock-shape.js.map +1 -1
  79. package/package.json +4 -4
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Reviewer auth-helper server (0.6.0) — multi-person LCR review.
3
+ *
4
+ * GitHub's device-flow token endpoints (github.com/login/device/code +
5
+ * /login/oauth/access_token) are NOT CORS-accessible from a browser, so the
6
+ * overlay can't run the device dance itself. This tiny server (started by
7
+ * run-mock in `review_mode: lcr`) does the two server-side hops on the
8
+ * overlay's behalf and nothing else.
9
+ *
10
+ * Crucially it is SAFE TO EXPOSE off-host (unlike gh-proxy, which injects the
11
+ * host's own token): it only forwards the PUBLIC client-id + a per-session
12
+ * device code to GitHub's public device endpoints. The reviewer's resulting
13
+ * access token is returned to whoever completed the GitHub consent — the host
14
+ * never sees a privileged secret. So for the remote-box case it binds 0.0.0.0;
15
+ * for local use, 127.0.0.1.
16
+ *
17
+ * Endpoints (all JSON, permissive CORS):
18
+ * POST /__slowcook/auth/device → { userCode, verificationUri, deviceCode, intervalSeconds, expiresInSeconds }
19
+ * POST /__slowcook/auth/poll { deviceCode } → PollResult
20
+ * GET /__slowcook/auth/health → { ok: true, clientIdSuffix }
21
+ */
22
+ import { createServer } from "node:http";
23
+ const DEVICE_PATH = "/__slowcook/auth/device";
24
+ const POLL_PATH = "/__slowcook/auth/poll";
25
+ const HEALTH_PATH = "/__slowcook/auth/health";
26
+ function cors(res, origin) {
27
+ res.setHeader("Access-Control-Allow-Origin", origin ?? "*");
28
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
29
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
30
+ }
31
+ function sendJson(res, status, body) {
32
+ res.writeHead(status, { "Content-Type": "application/json" });
33
+ res.end(JSON.stringify(body));
34
+ }
35
+ async function readJson(req) {
36
+ const chunks = [];
37
+ for await (const c of req)
38
+ chunks.push(c);
39
+ const raw = Buffer.concat(chunks).toString("utf8").trim();
40
+ if (!raw)
41
+ return {};
42
+ try {
43
+ return JSON.parse(raw);
44
+ }
45
+ catch {
46
+ return {};
47
+ }
48
+ }
49
+ /** Build the request handler (exported so it can be unit-tested without a socket). */
50
+ export function makeAuthHandler(auth, clientIdSuffix) {
51
+ return (req, res) => {
52
+ const origin = req.headers["origin"];
53
+ cors(res, origin);
54
+ if (req.method === "OPTIONS") {
55
+ res.writeHead(204);
56
+ res.end();
57
+ return;
58
+ }
59
+ const path = (req.url ?? "").split("?")[0];
60
+ void (async () => {
61
+ try {
62
+ if (req.method === "GET" && path === HEALTH_PATH) {
63
+ sendJson(res, 200, { ok: true, clientIdSuffix });
64
+ return;
65
+ }
66
+ if (req.method === "POST" && path === DEVICE_PATH) {
67
+ const grant = await auth.requestDeviceCode();
68
+ sendJson(res, 200, grant);
69
+ return;
70
+ }
71
+ if (req.method === "POST" && path === POLL_PATH) {
72
+ const body = await readJson(req);
73
+ const deviceCode = typeof body["deviceCode"] === "string" ? body["deviceCode"] : "";
74
+ if (!deviceCode) {
75
+ sendJson(res, 400, { error: "deviceCode required" });
76
+ return;
77
+ }
78
+ const result = await auth.pollAccessToken(deviceCode);
79
+ sendJson(res, 200, result);
80
+ return;
81
+ }
82
+ sendJson(res, 404, { error: "not found" });
83
+ }
84
+ catch (e) {
85
+ sendJson(res, 502, { error: e instanceof Error ? e.message : String(e) });
86
+ }
87
+ })();
88
+ };
89
+ }
90
+ /**
91
+ * Start the auth helper. `host` defaults to 127.0.0.1; pass "0.0.0.0" for the
92
+ * remote-box case so a co-worker's browser can reach it.
93
+ */
94
+ export async function startReviewerAuthServer(auth, opts) {
95
+ const suffix = opts.clientId.slice(-4);
96
+ const server = createServer(makeAuthHandler(auth, suffix));
97
+ const host = opts.host ?? "127.0.0.1";
98
+ const preferredPort = opts.preferredPort ?? 4200;
99
+ return await new Promise((resolve, reject) => {
100
+ const tryListen = (port, attemptsLeft) => {
101
+ const onError = (err) => {
102
+ server.removeListener("error", onError);
103
+ if (err.code === "EADDRINUSE" && attemptsLeft > 0)
104
+ tryListen(port + 1, attemptsLeft - 1);
105
+ else
106
+ reject(err);
107
+ };
108
+ server.once("error", onError);
109
+ server.listen(port, host, () => {
110
+ server.removeListener("error", onError);
111
+ resolve({
112
+ url: `http://localhost:${port}`,
113
+ port,
114
+ close: () => { try {
115
+ server.close();
116
+ }
117
+ catch { /* ignore */ } },
118
+ });
119
+ });
120
+ };
121
+ tryListen(preferredPort, 20);
122
+ });
123
+ }
124
+ //# sourceMappingURL=reviewer-auth-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-auth-server.js","sourceRoot":"","sources":["../../../src/commands/run-mock/reviewer-auth-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * GUCDI — `trace check` core (pure). The keystone lint that keeps the living,
3
+ * bidirectional requirements spine coherent. It checks PROVENANCE-COMPLETENESS,
4
+ * not requirement-coverage: every node must have an honest "why", from one of
5
+ * - requirement — a PRD initiative (`prd_ref`) or a GitHub issue (`source_issue`)
6
+ * - convention — a project-global standing doc (`conventions.md`)
7
+ * - craft — a genuinely novel inline-tagged decision
8
+ * A node with NONE of these is a true orphan → error. A craft-tagged node PASSES
9
+ * (honest provenance) and is reported for PM ratification. This neither blocks
10
+ * legitimate craft nor forces faking a requirement (the "block-or-lie" trap).
11
+ *
12
+ * It NEVER demands a PRD — brownfield specs trace via `source_issue`. Pure +
13
+ * unit-tested; the IO (reading specs / PRD / scanning the LCR) is in ./index.ts.
14
+ *
15
+ * See docs/plans/gucdi-greenfield.md.
16
+ */
17
+ export type LcrProvenance = {
18
+ kind: "story";
19
+ id: string;
20
+ } | {
21
+ kind: "convention";
22
+ ref: string;
23
+ } | {
24
+ kind: "craft";
25
+ rationale: string;
26
+ };
27
+ /** A spec, reduced to its requirement-provenance facts. */
28
+ export interface SpecNode {
29
+ storyId: string;
30
+ prdAnchor?: string;
31
+ sourceIssue?: string;
32
+ }
33
+ /** An LCR file (mock component/page) + the provenance it declares in comments. */
34
+ export interface LcrNode {
35
+ file: string;
36
+ provenance: LcrProvenance[];
37
+ }
38
+ export type TraceCode = "dangling-prd-ref" | "orphan-spec" | "orphan-lcr" | "dangling-lcr-story";
39
+ export interface TraceViolation {
40
+ code: TraceCode;
41
+ subject: string;
42
+ detail: string;
43
+ }
44
+ export interface TraceResult {
45
+ violations: TraceViolation[];
46
+ /** Craft decisions (not in any requirement) — the PM-ratification report. */
47
+ craft: {
48
+ file: string;
49
+ rationale: string;
50
+ }[];
51
+ ok: boolean;
52
+ }
53
+ /**
54
+ * Parse provenance comments from a source file. Recognised forms (case-insensitive
55
+ * tag, anywhere in a comment):
56
+ * // @story story-007 (or // story-007)
57
+ * // @convention <ref>
58
+ * // @craft <rationale> (or // craft: <rationale>)
59
+ */
60
+ export declare function parseLcrProvenance(source: string): LcrProvenance[];
61
+ export declare function checkTrace(input: {
62
+ specs: SpecNode[];
63
+ /** PRD initiative anchors. Empty = no PRD (brownfield) → prd-ref checks skipped. */
64
+ prdAnchors: string[];
65
+ lcrNodes: LcrNode[];
66
+ }): TraceResult;
67
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/commands/trace/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,2DAA2D;AAC3D,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,kFAAkF;AAClF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,aAAa,GACb,YAAY,GACZ,oBAAoB,CAAC;AAEzB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7C,EAAE,EAAE,OAAO,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAYlE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,oFAAoF;IACpF,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,GAAG,WAAW,CAiDd"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * GUCDI — `trace check` core (pure). The keystone lint that keeps the living,
3
+ * bidirectional requirements spine coherent. It checks PROVENANCE-COMPLETENESS,
4
+ * not requirement-coverage: every node must have an honest "why", from one of
5
+ * - requirement — a PRD initiative (`prd_ref`) or a GitHub issue (`source_issue`)
6
+ * - convention — a project-global standing doc (`conventions.md`)
7
+ * - craft — a genuinely novel inline-tagged decision
8
+ * A node with NONE of these is a true orphan → error. A craft-tagged node PASSES
9
+ * (honest provenance) and is reported for PM ratification. This neither blocks
10
+ * legitimate craft nor forces faking a requirement (the "block-or-lie" trap).
11
+ *
12
+ * It NEVER demands a PRD — brownfield specs trace via `source_issue`. Pure +
13
+ * unit-tested; the IO (reading specs / PRD / scanning the LCR) is in ./index.ts.
14
+ *
15
+ * See docs/plans/gucdi-greenfield.md.
16
+ */
17
+ /**
18
+ * Parse provenance comments from a source file. Recognised forms (case-insensitive
19
+ * tag, anywhere in a comment):
20
+ * // @story story-007 (or // story-007)
21
+ * // @convention <ref>
22
+ * // @craft <rationale> (or // craft: <rationale>)
23
+ */
24
+ export function parseLcrProvenance(source) {
25
+ const out = [];
26
+ for (const m of source.matchAll(/@?story[-\s]+(story-)?(\d+)/gi)) {
27
+ out.push({ kind: "story", id: `story-${m[2]}` });
28
+ }
29
+ for (const m of source.matchAll(/@?convention[:\s]+([^\n*]+?)\s*(?:\*\/|$|\n)/gi)) {
30
+ out.push({ kind: "convention", ref: m[1].trim() });
31
+ }
32
+ for (const m of source.matchAll(/@?craft[:\s]+([^\n*]+?)\s*(?:\*\/|$|\n)/gi)) {
33
+ out.push({ kind: "craft", rationale: m[1].trim() });
34
+ }
35
+ return out;
36
+ }
37
+ export function checkTrace(input) {
38
+ const violations = [];
39
+ const anchors = new Set(input.prdAnchors);
40
+ const storyIds = new Set(input.specs.map((s) => `story-${s.storyId}`));
41
+ for (const s of input.specs) {
42
+ if (s.prdAnchor) {
43
+ // Only enforce when a PRD exists; a stray prd_ref with no PRD is its own (later) concern.
44
+ if (anchors.size > 0 && !anchors.has(s.prdAnchor)) {
45
+ violations.push({
46
+ code: "dangling-prd-ref",
47
+ subject: `story-${s.storyId}`,
48
+ detail: `prd_ref anchor '${s.prdAnchor}' is not a PRD initiative`,
49
+ });
50
+ }
51
+ }
52
+ else if (!s.sourceIssue) {
53
+ violations.push({
54
+ code: "orphan-spec",
55
+ subject: `story-${s.storyId}`,
56
+ detail: "no requirement provenance (neither prd_ref nor source_issue)",
57
+ });
58
+ }
59
+ }
60
+ for (const n of input.lcrNodes) {
61
+ if (n.provenance.length === 0) {
62
+ violations.push({
63
+ code: "orphan-lcr",
64
+ subject: n.file,
65
+ detail: "no provenance comment (@story / @convention / @craft)",
66
+ });
67
+ continue;
68
+ }
69
+ for (const p of n.provenance) {
70
+ if (p.kind === "story" && storyIds.size > 0 && !storyIds.has(p.id)) {
71
+ violations.push({
72
+ code: "dangling-lcr-story",
73
+ subject: n.file,
74
+ detail: `cites ${p.id}, which has no spec`,
75
+ });
76
+ }
77
+ }
78
+ }
79
+ const craft = input.lcrNodes.flatMap((n) => n.provenance.filter((p) => p.kind === "craft").map((p) => ({ file: n.file, rationale: p.rationale })));
80
+ return { violations, craft, ok: violations.length === 0 };
81
+ }
82
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/commands/trace/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function trace(argv: string[], _cliVersion: string): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/trace/index.ts"],"names":[],"mappings":"AAqCA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD9E"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * GUCDI — `slowcook trace check`. Runs the provenance-completeness lint over the
3
+ * spine: specs (requirement provenance via prd_ref/source_issue), the PRD
4
+ * (anchor resolution), and the LCR mock files (story/convention/craft comments).
5
+ * Exits 1 on any orphan/dangling violation; prints the craft-decisions report
6
+ * for PM ratification. Never demands a PRD — brownfield-safe.
7
+ *
8
+ * slowcook trace check [--prd <path>] [--cwd <dir>]
9
+ *
10
+ * Pure lint in ./check.ts; this is the IO shell.
11
+ */
12
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
13
+ import { join, relative, resolve } from "node:path";
14
+ import { listActiveSpecs } from "../refine/spec-yaml.js";
15
+ import { loadMockShapeConfig } from "../../lib/mock-shape.js";
16
+ import { parsePrdInitiatives } from "../menu/prd.js";
17
+ import { checkTrace, parseLcrProvenance } from "./check.js";
18
+ function val(args, flag) {
19
+ const i = args.indexOf(flag);
20
+ return i >= 0 ? args[i + 1] : undefined;
21
+ }
22
+ /** Recursively collect .tsx files under `dir`, skipping any path in `exclude`. */
23
+ function walkTsx(dir, exclude) {
24
+ if (!existsSync(dir))
25
+ return [];
26
+ const out = [];
27
+ for (const name of readdirSync(dir)) {
28
+ const p = join(dir, name);
29
+ if (exclude.has(p) || name === "node_modules")
30
+ continue;
31
+ const st = statSync(p);
32
+ if (st.isDirectory())
33
+ out.push(...walkTsx(p, exclude));
34
+ else if (name.endsWith(".tsx"))
35
+ out.push(p);
36
+ }
37
+ return out;
38
+ }
39
+ export async function trace(argv, _cliVersion) {
40
+ if (argv[0] !== "check") {
41
+ console.error("usage: slowcook trace check [--prd <path>] [--cwd <dir>]");
42
+ process.exit(64);
43
+ }
44
+ const rest = argv.slice(1);
45
+ const cwd = resolve(val(rest, "--cwd") ?? ".");
46
+ // 1. Specs → requirement-provenance facts.
47
+ const specNodes = listActiveSpecs(cwd).map((s) => ({
48
+ storyId: s.story_id,
49
+ prdAnchor: s.prd_ref?.anchor,
50
+ sourceIssue: s.source_issue,
51
+ }));
52
+ // 2. PRD anchors (optional — absent = brownfield).
53
+ const prdRel = val(rest, "--prd") ?? "docs/PRD.md";
54
+ const prdAbs = resolve(cwd, prdRel);
55
+ const prdAnchors = existsSync(prdAbs) ? parsePrdInitiatives(readFileSync(prdAbs, "utf8")).map((i) => i.anchor) : [];
56
+ // 3. LCR nodes — mock screens + components (excluding the design system, which
57
+ // is convention/brand provenance, not story-specific).
58
+ const mock = loadMockShapeConfig(cwd);
59
+ const designDir = resolve(cwd, mock.design_system_dir);
60
+ const lcrRoots = [resolve(cwd, mock.screens_root), resolve(cwd, mock.mock_root, "src/components")];
61
+ const files = [...new Set(lcrRoots.flatMap((r) => walkTsx(r, new Set([designDir]))))];
62
+ const lcrNodes = files.map((f) => ({
63
+ file: relative(cwd, f).replace(/\\/g, "/"),
64
+ provenance: parseLcrProvenance(readFileSync(f, "utf8")),
65
+ }));
66
+ if (specNodes.length === 0 && prdAnchors.length === 0 && lcrNodes.length === 0) {
67
+ console.log("trace check: nothing GUCDI-shaped to trace (no specs, no PRD, no LCR) — ok.");
68
+ return;
69
+ }
70
+ const result = checkTrace({ specs: specNodes, prdAnchors, lcrNodes });
71
+ console.log(`trace check: ${specNodes.length} specs · ${prdAnchors.length} PRD initiatives · ${lcrNodes.length} LCR files`);
72
+ if (result.craft.length) {
73
+ console.log(`\n ${result.craft.length} craft decision(s) — not in any requirement (ratify or note):`);
74
+ for (const c of result.craft)
75
+ console.log(` · ${c.file}: ${c.rationale}`);
76
+ }
77
+ if (result.ok) {
78
+ console.log("\ntrace check: PASS ✓ — every node has honest provenance.");
79
+ return;
80
+ }
81
+ console.error(`\ntrace check: FAIL ✗ — ${result.violations.length} provenance violation(s):`);
82
+ for (const v of result.violations)
83
+ console.error(` [${v.code}] ${v.subject}: ${v.detail}`);
84
+ process.exit(1);
85
+ }
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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":"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,CAoRhD,CAAC;AAWF,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEzE;AAED,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAEhD"}
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,CAsShD,CAAC;AAWF,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEzE;AAED,wBAAgB,eAAe,IAAI,YAAY,EAAE,CAEhD"}
@@ -15,6 +15,18 @@
15
15
  */
16
16
  export const COMMANDS = [
17
17
  // --- Pipeline ---
18
+ {
19
+ name: "menu",
20
+ usage: "slowcook menu [--prd <path>] [--cwd <dir>] [--model <id>] [--dry-run]",
21
+ description: "GUCDI greenfield entry: decompose a PRD into a comprehensive, anchored, data-contracted story set under specs/.",
22
+ group: "pipeline",
23
+ },
24
+ {
25
+ name: "greenfield",
26
+ usage: "slowcook greenfield status [--prd <path>] [--cwd <dir>]",
27
+ description: "GUCDI scope-completeness dashboard: where the project is in PRD → stories → brand → LCR → trace, and the single next action.",
28
+ group: "pipeline",
29
+ },
18
30
  {
19
31
  name: "refine",
20
32
  usage: "slowcook refine --issue <number> [--cwd <path>] [--owner <login>] [--repo <name>]",
@@ -127,9 +139,15 @@ export const COMMANDS = [
127
139
  description: "Pre-brew structural divergence check. Surfaces missing components / testid gaps / brownfield rename hazards.",
128
140
  group: "checks",
129
141
  },
142
+ {
143
+ name: "trace",
144
+ usage: "slowcook trace check [--prd <path>] [--cwd <dir>]",
145
+ description: "GUCDI provenance-completeness lint over the spine: every spec/LCR node has a why (requirement/convention/craft); orphans + dangling refs fail; craft is reported. Brownfield-safe (never demands a PRD).",
146
+ group: "checks",
147
+ },
130
148
  {
131
149
  name: "eye",
132
- usage: "slowcook eye --reference <url> --candidate <url> [--out <dir>] [--viewport <m>] [--scheme <s>] [--max-violations <n>] [--fail-on <axes>]",
150
+ usage: "slowcook eye --reference <url> --candidate <url> [--story <id>] [--out <dir>] [--viewport <m>] [--scheme <s>] [--max-violations <n>] [--fail-on <axes>] [--watch [--interval <ms>] [--until-converged] [--max-passes <n>]]",
133
151
  description: "Fidelity eye (design #8). Renders mock + brewed URLs across the viewport×scheme matrix, grades visual drift, screenshots, exits 1 on drift.",
134
152
  group: "checks",
135
153
  },
@@ -257,8 +275,8 @@ export const COMMANDS = [
257
275
  },
258
276
  {
259
277
  name: "brand",
260
- usage: "slowcook brand [--brief <prose>] [--refresh] [--dry-run] [--model <id>] [--cwd <path>]",
261
- description: "Design-system foundation agent. Emits mock/src/design-system/{tokens.ts, css.ts} from a brand brief.",
278
+ usage: "slowcook brand [--brief <prose>] [--refresh] [--dry-run] [--model <id>] [--cwd <path>] · slowcook brand logo --in <svg|png> [--out <dir>] [--map #hex=token,...]",
279
+ description: "Design-system foundation agent. Emits mock/src/design-system/{tokens.ts, css.ts} from a brand brief. `brand logo` tokenizes a supplied SVG / deterministically traces a PNG (vtracer/potrace — no LLM path-authoring).",
262
280
  group: "pipeline",
263
281
  },
264
282
  {
@@ -1 +1 @@
1
- {"version":3,"file":"commands.manifest.js","sourceRoot":"","sources":["../src/commands.manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.manifest.js","sourceRoot":"","sources":["../src/commands.manifest.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,12 @@ declare const MockShapeConfigSchema: z.ZodObject<{
11
11
  router_file: z.ZodOptional<z.ZodString>;
12
12
  scenarios_dir: z.ZodDefault<z.ZodString>;
13
13
  scenario_registry_file: z.ZodDefault<z.ZodString>;
14
+ review_mode: z.ZodDefault<z.ZodEnum<{
15
+ scenarios: "scenarios";
16
+ lcr: "lcr";
17
+ }>>;
18
+ review_oauth_client_id: z.ZodOptional<z.ZodString>;
19
+ review_oauth_scope: z.ZodDefault<z.ZodString>;
14
20
  }, z.core.$strip>;
15
21
  export type MockShapeConfig = z.infer<typeof MockShapeConfigSchema>;
16
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mock-shape.d.ts","sourceRoot":"","sources":["../../src/lib/mock-shape.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,qBAAqB;;;;;;;;;;;;iBASzB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAuBpE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAkBrE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD"}
1
+ {"version":3,"file":"mock-shape.d.ts","sourceRoot":"","sources":["../../src/lib/mock-shape.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;iBA+BzB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AA2BpE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAkBrE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD"}
@@ -23,6 +23,28 @@ const MockShapeConfigSchema = z.object({
23
23
  router_file: z.string().optional(),
24
24
  scenarios_dir: z.string().default("mock/scenarios"),
25
25
  scenario_registry_file: z.string().default("mock/src/lib/scenario-registry.ts"),
26
+ /**
27
+ * 0.6.0 — review surface shape for the overlay (run-mock passes it to
28
+ * the overlay via NEXT_PUBLIC_SLOWCOOK_REVIEW_MODE).
29
+ *
30
+ * - `"scenarios"` (default): a scenario-picker mock; the overlay hides
31
+ * on `/` and comments key by story_id.
32
+ * - `"lcr"`: a full navigable Living Coded Requirement; the overlay
33
+ * shows on every route and each comment captures its route so plate
34
+ * amends per-page. GUCDI mocks set this.
35
+ */
36
+ review_mode: z.enum(["scenarios", "lcr"]).default("scenarios"),
37
+ /**
38
+ * 0.6.0 — override the OAuth App Client ID reviewers sign in with (LCR
39
+ * multi-person review). Optional: defaults to the shared slowcook reviewer
40
+ * app. Set this only if a project wants its own consent-screen branding.
41
+ */
42
+ review_oauth_client_id: z.string().optional(),
43
+ /**
44
+ * 0.6.0 — OAuth scope reviewers grant. `public_repo` (default) for public
45
+ * repos; `repo` when the consumer repo is private.
46
+ */
47
+ review_oauth_scope: z.string().default("public_repo"),
26
48
  });
27
49
  const NEXTJS_DEFAULT = {
28
50
  schema_version: 1,
@@ -32,6 +54,8 @@ const NEXTJS_DEFAULT = {
32
54
  design_system_dir: "mock/src/design-system",
33
55
  scenarios_dir: "mock/scenarios",
34
56
  scenario_registry_file: "mock/src/lib/scenario-registry.ts",
57
+ review_mode: "scenarios",
58
+ review_oauth_scope: "public_repo",
35
59
  };
36
60
  const VITE_DEFAULT = {
37
61
  schema_version: 1,
@@ -42,6 +66,8 @@ const VITE_DEFAULT = {
42
66
  router_file: "mock/src/App.tsx",
43
67
  scenarios_dir: "mock/scenarios",
44
68
  scenario_registry_file: "mock/src/lib/scenario-registry.ts",
69
+ review_mode: "scenarios",
70
+ review_oauth_scope: "public_repo",
45
71
  };
46
72
  /**
47
73
  * Load `.brewing/mock.yaml`. Returns a default config when the file is
@@ -1 +1 @@
1
- {"version":3,"file":"mock-shape.js","sourceRoot":"","sources":["../../src/lib/mock-shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACrC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC;IACjD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC;IAC/D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACnD,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;CAChF,CAAC,CAAC;AAIH,MAAM,cAAc,GAAoB;IACtC,cAAc,EAAE,CAAC;IACjB,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,MAAM;IACjB,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,wBAAwB;IAC3C,aAAa,EAAE,gBAAgB;IAC/B,sBAAsB,EAAE,mCAAmC;CAC5D,CAAC;AAEF,MAAM,YAAY,GAAoB;IACpC,cAAc,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,MAAM;IACjB,YAAY,EAAE,eAAe;IAC7B,iBAAiB,EAAE,wBAAwB;IAC3C,WAAW,EAAE,kBAAkB;IAC/B,aAAa,EAAE,gBAAgB;IAC/B,sBAAsB,EAAE,mCAAmC;CAC5D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,oEAAoE;QACpE,iEAAiE;QACjE,qDAAqD;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC7D,IAAI,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,YAAY,CAAC;QACjD,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"mock-shape.js","sourceRoot":"","sources":["../../src/lib/mock-shape.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.20.0",
3
+ "version": "0.21.0",
4
4
  "description": "CLI for the slowcook brewing harness",
5
5
  "license": "MIT",
6
6
  "author": "aminazar",
@@ -41,13 +41,13 @@
41
41
  "ts-morph": "^28.0.0",
42
42
  "yaml": "^2.9.0",
43
43
  "zod": "^4.4.3",
44
- "@slowcook-ai/core": "^0.14.0",
44
+ "@slowcook-ai/core": "^0.15.0",
45
45
  "@slowcook-ai/stack-ts": "^0.9.9",
46
- "@slowcook-ai/forge-github": "^0.13.0",
46
+ "@slowcook-ai/forge-github": "^0.14.0",
47
47
  "@slowcook-ai/llm-anthropic": "^0.17.0",
48
48
  "@slowcook-ai/recorder": "^0.9.1",
49
49
  "@slowcook-ai/gates": "^0.11.0",
50
- "@slowcook-ai/review-overlay": "^0.5.5"
50
+ "@slowcook-ai/review-overlay": "^0.6.0"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/node": "^25.9.1"