@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.
- package/README.md +15 -3
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/brand/index.d.ts.map +1 -1
- package/dist/commands/brand/index.js +6 -0
- package/dist/commands/brand/index.js.map +1 -1
- package/dist/commands/brand/logo-cmd.d.ts +2 -0
- package/dist/commands/brand/logo-cmd.d.ts.map +1 -0
- package/dist/commands/brand/logo-cmd.js +90 -0
- package/dist/commands/brand/logo-cmd.js.map +1 -0
- package/dist/commands/brand/logo.d.ts +23 -0
- package/dist/commands/brand/logo.d.ts.map +1 -0
- package/dist/commands/brand/logo.js +60 -0
- package/dist/commands/brand/logo.js.map +1 -0
- package/dist/commands/eye/index.d.ts.map +1 -1
- package/dist/commands/eye/index.js +21 -2
- package/dist/commands/eye/index.js.map +1 -1
- package/dist/commands/eye/plan.d.ts +8 -0
- package/dist/commands/eye/plan.d.ts.map +1 -1
- package/dist/commands/eye/plan.js +6 -0
- package/dist/commands/eye/plan.js.map +1 -1
- package/dist/commands/eye/run.d.ts +23 -0
- package/dist/commands/eye/run.d.ts.map +1 -1
- package/dist/commands/eye/run.js +69 -0
- package/dist/commands/eye/run.js.map +1 -1
- package/dist/commands/greenfield/index.d.ts +2 -0
- package/dist/commands/greenfield/index.d.ts.map +1 -0
- package/dist/commands/greenfield/index.js +80 -0
- package/dist/commands/greenfield/index.js.map +1 -0
- package/dist/commands/greenfield/status.d.ts +38 -0
- package/dist/commands/greenfield/status.d.ts.map +1 -0
- package/dist/commands/greenfield/status.js +52 -0
- package/dist/commands/greenfield/status.js.map +1 -0
- package/dist/commands/menu/assemble.d.ts +31 -0
- package/dist/commands/menu/assemble.d.ts.map +1 -0
- package/dist/commands/menu/assemble.js +37 -0
- package/dist/commands/menu/assemble.js.map +1 -0
- package/dist/commands/menu/index.d.ts +5 -0
- package/dist/commands/menu/index.d.ts.map +1 -0
- package/dist/commands/menu/index.js +111 -0
- package/dist/commands/menu/index.js.map +1 -0
- package/dist/commands/menu/prd.d.ts +33 -0
- package/dist/commands/menu/prd.d.ts.map +1 -0
- package/dist/commands/menu/prd.js +68 -0
- package/dist/commands/menu/prd.js.map +1 -0
- package/dist/commands/plate/index.d.ts.map +1 -1
- package/dist/commands/plate/index.js +5 -1
- package/dist/commands/plate/index.js.map +1 -1
- package/dist/commands/plate/route-hint.d.ts +18 -0
- package/dist/commands/plate/route-hint.d.ts.map +1 -0
- package/dist/commands/plate/route-hint.js +21 -0
- package/dist/commands/plate/route-hint.js.map +1 -0
- package/dist/commands/refine/spec-yaml.d.ts +23 -0
- package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
- package/dist/commands/refine/spec-yaml.js +25 -0
- package/dist/commands/refine/spec-yaml.js.map +1 -1
- package/dist/commands/run-mock/index.d.ts.map +1 -1
- package/dist/commands/run-mock/index.js +69 -16
- package/dist/commands/run-mock/index.js.map +1 -1
- package/dist/commands/run-mock/reviewer-auth-server.d.ts +40 -0
- package/dist/commands/run-mock/reviewer-auth-server.d.ts.map +1 -0
- package/dist/commands/run-mock/reviewer-auth-server.js +124 -0
- package/dist/commands/run-mock/reviewer-auth-server.js.map +1 -0
- package/dist/commands/trace/check.d.ts +67 -0
- package/dist/commands/trace/check.d.ts.map +1 -0
- package/dist/commands/trace/check.js +82 -0
- package/dist/commands/trace/check.js.map +1 -0
- package/dist/commands/trace/index.d.ts +2 -0
- package/dist/commands/trace/index.d.ts.map +1 -0
- package/dist/commands/trace/index.js +86 -0
- package/dist/commands/trace/index.js.map +1 -0
- package/dist/commands.manifest.d.ts.map +1 -1
- package/dist/commands.manifest.js +21 -3
- package/dist/commands.manifest.js.map +1 -1
- package/dist/lib/mock-shape.d.ts +6 -0
- package/dist/lib/mock-shape.d.ts.map +1 -1
- package/dist/lib/mock-shape.js +26 -0
- package/dist/lib/mock-shape.js.map +1 -1
- 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 @@
|
|
|
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,
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AA6BH,MAAM,CAAC,MAAM,QAAQ,GAAgC;IACnD,mBAAmB;IACnB;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,wFAAwF;QAC/F,WAAW,EAAE,iGAAiG;QAC9G,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,0GAA0G;QACjH,WAAW,EAAE,0GAA0G;QACvH,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,qFAAqF;QAC5F,WAAW,EAAE,uFAAuF;QACpG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,4CAA4C;QACnD,WAAW,EAAE,+EAA+E;QAC5F,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,mEAAmE;QAC1E,WAAW,EAAE,qFAAqF;QAClG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,qEAAqE;QAC5E,WAAW,EAAE,4FAA4F;QACzG,KAAK,EAAE,UAAU;KAClB;IAED,mBAAmB;IACnB;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,uEAAuE;QAC9E,WAAW,EAAE,yFAAyF;QACtG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,0EAA0E;QACjF,WAAW,EAAE,4FAA4F;QACzG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,uDAAuD;QAC9D,WAAW,EAAE,+EAA+E;QAC5F,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,yFAAyF;QAChG,WAAW,EAAE,0DAA0D;QACvE,KAAK,EAAE,WAAW;KACnB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,2EAA2E;QAClF,WAAW,EAAE,2FAA2F;QACxG,KAAK,EAAE,WAAW;KACnB;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,mFAAmF;QAC1F,WAAW,EAAE,+GAA+G;QAC5H,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,OAAO;KAChB;IAED,iBAAiB;IACjB;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,yEAAyE;QAChF,WAAW,EAAE,iEAAiE;QAC9E,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,8FAA8F;QACrG,WAAW,EAAE,uFAAuF;QACpG,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,+DAA+D;QACtE,WAAW,EAAE,6IAA6I;QAC1J,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,8FAA8F;QACrG,WAAW,EAAE,8GAA8G;QAC3H,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,
|
|
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,wFAAwF;QAC/F,WAAW,EAAE,iGAAiG;QAC9G,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,0GAA0G;QACjH,WAAW,EAAE,0GAA0G;QACvH,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,qFAAqF;QAC5F,WAAW,EAAE,uFAAuF;QACpG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,4CAA4C;QACnD,WAAW,EAAE,+EAA+E;QAC5F,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,mEAAmE;QAC1E,WAAW,EAAE,qFAAqF;QAClG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,qEAAqE;QAC5E,WAAW,EAAE,4FAA4F;QACzG,KAAK,EAAE,UAAU;KAClB;IAED,mBAAmB;IACnB;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,uEAAuE;QAC9E,WAAW,EAAE,yFAAyF;QACtG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,0EAA0E;QACjF,WAAW,EAAE,4FAA4F;QACzG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,uDAAuD;QAC9D,WAAW,EAAE,+EAA+E;QAC5F,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,yFAAyF;QAChG,WAAW,EAAE,0DAA0D;QACvE,KAAK,EAAE,WAAW;KACnB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,2EAA2E;QAClF,WAAW,EAAE,2FAA2F;QACxG,KAAK,EAAE,WAAW;KACnB;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,mFAAmF;QAC1F,WAAW,EAAE,+GAA+G;QAC5H,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,OAAO;KAChB;IAED,iBAAiB;IACjB;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,yEAAyE;QAChF,WAAW,EAAE,iEAAiE;QAC9E,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,8FAA8F;QACrG,WAAW,EAAE,uFAAuF;QACpG,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,+DAA+D;QACtE,WAAW,EAAE,6IAA6I;QAC1J,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,8FAA8F;QACrG,WAAW,EAAE,8GAA8G;QAC3H,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,mDAAmD;QAC1D,WAAW,EAAE,0MAA0M;QACvN,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,4NAA4N;QACnO,WAAW,EAAE,6IAA6I;QAC1J,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,gFAAgF;QACvF,WAAW,EAAE,yJAAyJ;QACtK,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,2EAA2E;QAClF,WAAW,EAAE,oFAAoF;QACjG,KAAK,EAAE,QAAQ;KAChB;IAED,cAAc;IACd;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,kIAAkI;QACzI,WAAW,EAAE,yLAAyL;QACtM,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,OAAO;KAChB;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,+EAA+E;QACtF,WAAW,EAAE,qHAAqH;QAClI,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,YAAY;KACrB;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,oFAAoF;QAC3F,WAAW,EAAE,sGAAsG;QACnH,KAAK,EAAE,KAAK;KACb;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,gFAAgF;QACvF,WAAW,EAAE,6FAA6F;QAC1G,KAAK,EAAE,KAAK;KACb;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,sCAAsC;QAC7C,WAAW,EAAE,gFAAgF;QAC7F,KAAK,EAAE,KAAK;KACb;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,iEAAiE;QACxE,WAAW,EAAE,4GAA4G;QACzH,KAAK,EAAE,KAAK;KACb;IAED,2EAA2E;IAC3E;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,sDAAsD;QAC7D,WAAW,EAAE,mFAAmF;QAChG,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,uDAAuD;QAC9D,WAAW,EAAE,mDAAmD;QAChE,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,sDAAsD;QAC7D,WAAW,EAAE,wGAAwG;QACrH,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,0DAA0D;QACjE,WAAW,EAAE,sEAAsE;QACnF,KAAK,EAAE,UAAU;KAClB;IAED,mBAAmB;IACnB;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,sDAAsD;QAC7D,WAAW,EAAE,4DAA4D;QACzE,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,OAAO;KAChB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,mDAAmD;QAC1D,WAAW,EAAE,2EAA2E;QACxF,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,OAAO;KAChB;IAED,8BAA8B;IAC9B;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,uDAAuD;QAC9D,WAAW,EAAE,oGAAoG;QACjH,KAAK,EAAE,WAAW;KACnB;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,6CAA6C;QACpD,WAAW,EAAE,oEAAoE;QACjF,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,mDAAmD;QAC1D,WAAW,EAAE,gFAAgF;QAC7F,KAAK,EAAE,cAAc;KACtB;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,iCAAiC;QACxC,WAAW,EAAE,sGAAsG;QACnH,KAAK,EAAE,cAAc;KACtB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,qGAAqG;QAC5G,WAAW,EAAE,uDAAuD;QACpE,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,oKAAoK;QAC3K,WAAW,EAAE,wNAAwN;QACrO,KAAK,EAAE,UAAU;KAClB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,6DAA6D;QACpE,WAAW,EAAE,qDAAqD;QAClE,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,yEAAyE;QAChF,WAAW,EAAE,sDAAsD;QACnE,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,8BAA8B;QACrC,WAAW,EAAE,yBAAyB;QACtC,KAAK,EAAE,UAAU;KAClB;IAED,2BAA2B;IAC3B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,wBAAwB,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;IACtH,EAAE,IAAI,EAAE,MAAM,EAAK,KAAK,EAAE,2BAA2B,EAAE,WAAW,EAAE,wCAAwC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;CAChJ,CAAC;AAEF,MAAM,mBAAmB,GAA8B,CAAC,GAAG,EAAE;IAC3D,MAAM,CAAC,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE;YAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,OAAO,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC"}
|
package/dist/lib/mock-shape.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/lib/mock-shape.js
CHANGED
|
@@ -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;
|
|
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.
|
|
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.
|
|
44
|
+
"@slowcook-ai/core": "^0.15.0",
|
|
45
45
|
"@slowcook-ai/stack-ts": "^0.9.9",
|
|
46
|
-
"@slowcook-ai/forge-github": "^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.
|
|
50
|
+
"@slowcook-ai/review-overlay": "^0.6.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/node": "^25.9.1"
|