@slowcook-ai/cli 0.19.0-alpha.8 → 0.19.1
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 +240 -0
- package/REPORTING.md +193 -0
- package/dist/cli.js +78 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/brand/index.d.ts +26 -0
- package/dist/commands/brand/index.d.ts.map +1 -0
- package/dist/commands/brand/index.js +257 -0
- package/dist/commands/brand/index.js.map +1 -0
- package/dist/commands/brew/agent.d.ts +7 -2
- package/dist/commands/brew/agent.d.ts.map +1 -1
- package/dist/commands/brew/agent.js +9 -0
- package/dist/commands/brew/agent.js.map +1 -1
- package/dist/commands/brew/halt.d.ts +26 -0
- package/dist/commands/brew/halt.d.ts.map +1 -1
- package/dist/commands/brew/halt.js.map +1 -1
- package/dist/commands/brew/index.d.ts.map +1 -1
- package/dist/commands/brew/index.js +142 -18
- package/dist/commands/brew/index.js.map +1 -1
- package/dist/commands/brew/pair-navigator.d.ts +119 -0
- package/dist/commands/brew/pair-navigator.d.ts.map +1 -0
- package/dist/commands/brew/pair-navigator.js +187 -0
- package/dist/commands/brew/pair-navigator.js.map +1 -0
- package/dist/commands/budget/index.d.ts +2 -0
- package/dist/commands/budget/index.d.ts.map +1 -0
- package/dist/commands/budget/index.js +252 -0
- package/dist/commands/budget/index.js.map +1 -0
- package/dist/commands/chef/drift-fix.d.ts +33 -4
- package/dist/commands/chef/drift-fix.d.ts.map +1 -1
- package/dist/commands/chef/drift-fix.js +417 -29
- package/dist/commands/chef/drift-fix.js.map +1 -1
- package/dist/commands/chef/index.js +13 -3
- package/dist/commands/chef/index.js.map +1 -1
- package/dist/commands/chef/orchestrate.d.ts +1 -1
- package/dist/commands/chef/orchestrate.d.ts.map +1 -1
- package/dist/commands/chef/orchestrate.js +32 -9
- package/dist/commands/chef/orchestrate.js.map +1 -1
- package/dist/commands/dev-env/config.d.ts +57 -0
- package/dist/commands/dev-env/config.d.ts.map +1 -0
- package/dist/commands/dev-env/config.js +96 -0
- package/dist/commands/dev-env/config.js.map +1 -0
- package/dist/commands/dev-env/index.d.ts +27 -0
- package/dist/commands/dev-env/index.d.ts.map +1 -0
- package/dist/commands/dev-env/index.js +226 -0
- package/dist/commands/dev-env/index.js.map +1 -0
- package/dist/commands/dev-env/init.d.ts +28 -0
- package/dist/commands/dev-env/init.d.ts.map +1 -0
- package/dist/commands/dev-env/init.js +135 -0
- package/dist/commands/dev-env/init.js.map +1 -0
- package/dist/commands/docs/index.d.ts +16 -0
- package/dist/commands/docs/index.d.ts.map +1 -0
- package/dist/commands/docs/index.js +127 -0
- package/dist/commands/docs/index.js.map +1 -0
- package/dist/commands/eval/index.d.ts +54 -0
- package/dist/commands/eval/index.d.ts.map +1 -0
- package/dist/commands/eval/index.js +294 -0
- package/dist/commands/eval/index.js.map +1 -0
- package/dist/commands/extract/index.d.ts.map +1 -1
- package/dist/commands/extract/index.js +23 -1
- package/dist/commands/extract/index.js.map +1 -1
- package/dist/commands/garnish/index.d.ts +56 -0
- package/dist/commands/garnish/index.d.ts.map +1 -0
- package/dist/commands/garnish/index.js +281 -0
- package/dist/commands/garnish/index.js.map +1 -0
- package/dist/commands/garnish/trailer.d.ts +79 -0
- package/dist/commands/garnish/trailer.d.ts.map +1 -0
- package/dist/commands/garnish/trailer.js +118 -0
- package/dist/commands/garnish/trailer.js.map +1 -0
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +33 -0
- package/dist/commands/init/index.js.map +1 -1
- package/dist/commands/init/mock-vite.d.ts +54 -0
- package/dist/commands/init/mock-vite.d.ts.map +1 -0
- package/dist/commands/init/mock-vite.js +613 -0
- package/dist/commands/init/mock-vite.js.map +1 -0
- package/dist/commands/init/mock.d.ts +6 -0
- package/dist/commands/init/mock.d.ts.map +1 -1
- package/dist/commands/init/mock.js +20 -4
- package/dist/commands/init/mock.js.map +1 -1
- package/dist/commands/init/plan.d.ts +26 -1
- package/dist/commands/init/plan.d.ts.map +1 -1
- package/dist/commands/init/plan.js +41 -3
- package/dist/commands/init/plan.js.map +1 -1
- package/dist/commands/init/templates.d.ts.map +1 -1
- package/dist/commands/init/templates.js +12 -4
- package/dist/commands/init/templates.js.map +1 -1
- package/dist/commands/knowledge-add.d.ts +52 -0
- package/dist/commands/knowledge-add.d.ts.map +1 -0
- package/dist/commands/knowledge-add.js +232 -0
- package/dist/commands/knowledge-add.js.map +1 -0
- package/dist/commands/map/emit-typeorm.d.ts +117 -0
- package/dist/commands/map/emit-typeorm.d.ts.map +1 -0
- package/dist/commands/map/emit-typeorm.js +341 -0
- package/dist/commands/map/emit-typeorm.js.map +1 -0
- package/dist/commands/map/index.d.ts +18 -0
- package/dist/commands/map/index.d.ts.map +1 -1
- package/dist/commands/map/index.js +28 -0
- package/dist/commands/map/index.js.map +1 -1
- package/dist/commands/plate/agent.d.ts +7 -0
- package/dist/commands/plate/agent.d.ts.map +1 -1
- package/dist/commands/plate/agent.js +1 -1
- package/dist/commands/plate/agent.js.map +1 -1
- package/dist/commands/plate/index.d.ts.map +1 -1
- package/dist/commands/plate/index.js +6 -0
- package/dist/commands/plate/index.js.map +1 -1
- package/dist/commands/recon/index.d.ts +16 -3
- package/dist/commands/recon/index.d.ts.map +1 -1
- package/dist/commands/recon/index.js +267 -16
- package/dist/commands/recon/index.js.map +1 -1
- package/dist/commands/recon/migration-gate.d.ts +59 -0
- package/dist/commands/recon/migration-gate.d.ts.map +1 -0
- package/dist/commands/recon/migration-gate.js +131 -0
- package/dist/commands/recon/migration-gate.js.map +1 -0
- package/dist/commands/recon/reuse.d.ts +32 -0
- package/dist/commands/recon/reuse.d.ts.map +1 -1
- package/dist/commands/recon/reuse.js +66 -0
- package/dist/commands/recon/reuse.js.map +1 -1
- package/dist/commands/recon/stale-stubs.d.ts +65 -0
- package/dist/commands/recon/stale-stubs.d.ts.map +1 -0
- package/dist/commands/recon/stale-stubs.js +84 -0
- package/dist/commands/recon/stale-stubs.js.map +1 -0
- package/dist/commands/refine/agent.d.ts +23 -0
- package/dist/commands/refine/agent.d.ts.map +1 -1
- package/dist/commands/refine/agent.js +245 -15
- package/dist/commands/refine/agent.js.map +1 -1
- package/dist/commands/refine/brownfield-answer.d.ts +81 -0
- package/dist/commands/refine/brownfield-answer.d.ts.map +1 -0
- package/dist/commands/refine/brownfield-answer.js +231 -0
- package/dist/commands/refine/brownfield-answer.js.map +1 -0
- package/dist/commands/refine/context.d.ts +27 -1
- package/dist/commands/refine/context.d.ts.map +1 -1
- package/dist/commands/refine/context.js +438 -6
- package/dist/commands/refine/context.js.map +1 -1
- package/dist/commands/refine/git-attention.d.ts +123 -0
- package/dist/commands/refine/git-attention.d.ts.map +1 -0
- package/dist/commands/refine/git-attention.js +378 -0
- package/dist/commands/refine/git-attention.js.map +1 -0
- package/dist/commands/refine/history-index.d.ts +66 -0
- package/dist/commands/refine/history-index.d.ts.map +1 -1
- package/dist/commands/refine/history-index.js +195 -8
- package/dist/commands/refine/history-index.js.map +1 -1
- package/dist/commands/refine/index.d.ts.map +1 -1
- package/dist/commands/refine/index.js +105 -18
- package/dist/commands/refine/index.js.map +1 -1
- package/dist/commands/refine/multifurcate.d.ts +129 -0
- package/dist/commands/refine/multifurcate.d.ts.map +1 -0
- package/dist/commands/refine/multifurcate.js +247 -0
- package/dist/commands/refine/multifurcate.js.map +1 -0
- package/dist/commands/refine/proposals-synth.d.ts +50 -1
- package/dist/commands/refine/proposals-synth.d.ts.map +1 -1
- package/dist/commands/refine/proposals-synth.js +199 -35
- package/dist/commands/refine/proposals-synth.js.map +1 -1
- package/dist/commands/refine/spec-yaml.d.ts +214 -1210
- package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
- package/dist/commands/refine/spec-yaml.js +10 -0
- package/dist/commands/refine/spec-yaml.js.map +1 -1
- package/dist/commands/refresh-knowledge.d.ts +139 -0
- package/dist/commands/refresh-knowledge.d.ts.map +1 -0
- package/dist/commands/refresh-knowledge.js +1029 -0
- package/dist/commands/refresh-knowledge.js.map +1 -0
- package/dist/commands/run-mock/index.d.ts.map +1 -1
- package/dist/commands/run-mock/index.js +135 -22
- package/dist/commands/run-mock/index.js.map +1 -1
- package/dist/commands/testgen/agent.d.ts +13 -0
- package/dist/commands/testgen/agent.d.ts.map +1 -1
- package/dist/commands/testgen/agent.js +137 -11
- package/dist/commands/testgen/agent.js.map +1 -1
- package/dist/commands/upsert-agent-docs.d.ts +48 -0
- package/dist/commands/upsert-agent-docs.d.ts.map +1 -0
- package/dist/commands/upsert-agent-docs.js +298 -0
- package/dist/commands/upsert-agent-docs.js.map +1 -0
- package/dist/commands/vibe/agent.d.ts +7 -0
- package/dist/commands/vibe/agent.d.ts.map +1 -1
- package/dist/commands/vibe/agent.js +2 -2
- package/dist/commands/vibe/agent.js.map +1 -1
- package/dist/commands/vibe/index.d.ts.map +1 -1
- package/dist/commands/vibe/index.js +7 -1
- package/dist/commands/vibe/index.js.map +1 -1
- package/dist/cost-store.d.ts +52 -0
- package/dist/cost-store.d.ts.map +1 -0
- package/dist/cost-store.js +108 -0
- package/dist/cost-store.js.map +1 -0
- package/dist/lib/budget.d.ts +73 -0
- package/dist/lib/budget.d.ts.map +1 -0
- package/dist/lib/budget.js +225 -0
- package/dist/lib/budget.js.map +1 -0
- package/dist/lib/mock-shape.d.ts +29 -0
- package/dist/lib/mock-shape.d.ts.map +1 -0
- package/dist/lib/mock-shape.js +77 -0
- package/dist/lib/mock-shape.js.map +1 -0
- package/dist/lib/read-only.d.ts +22 -0
- package/dist/lib/read-only.d.ts.map +1 -0
- package/dist/lib/read-only.js +34 -0
- package/dist/lib/read-only.js.map +1 -0
- package/package.json +17 -12
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `slowcook eval` — 0.19.0-α.17 (closes #19, partial).
|
|
3
|
+
*
|
|
4
|
+
* No-regression gate for prompt-changing PRs. Loads frozen fixtures
|
|
5
|
+
* from `packages/cli/eval/fixtures/<id>/fixture.json`, calls the
|
|
6
|
+
* relevant `build*Prompt(args)` function from `@slowcook-ai/llm-anthropic`,
|
|
7
|
+
* and asserts the resulting prompt string contains all of the
|
|
8
|
+
* fixture's `expected_prompt_includes` substrings and none of its
|
|
9
|
+
* `expected_prompt_excludes` substrings.
|
|
10
|
+
*
|
|
11
|
+
* Why prompt-shape assertions instead of running the LLM against the
|
|
12
|
+
* fixture: the regression class #19 names ("subtle prompt drift that
|
|
13
|
+
* drops critical context") is structural. Asserting on construction
|
|
14
|
+
* shape catches it deterministically without burning Anthropic credit
|
|
15
|
+
* or introducing nondeterminism into CI. A future fixture-class can
|
|
16
|
+
* layer LLM-output assertions on top once we have a recorded-replay
|
|
17
|
+
* shape; today this gate is the cheap, fast, contract-grade floor.
|
|
18
|
+
*
|
|
19
|
+
* Discovery model: walks `packages/cli/eval/fixtures/<id>/` directly
|
|
20
|
+
* by listing subdirectories with a `fixture.json` inside. No central
|
|
21
|
+
* registry — each fixture is self-describing.
|
|
22
|
+
*/
|
|
23
|
+
import { readFileSync, readdirSync, existsSync, statSync } from "node:fs";
|
|
24
|
+
import { dirname, join } from "node:path";
|
|
25
|
+
import { fileURLToPath } from "node:url";
|
|
26
|
+
import { buildChefPrompt, buildChefOrchestratePrompt, buildInvestigateUserPrompt, buildNavigatorPrompt, buildPlateAmendmentPrompt, buildSiftTurnPrompt, buildVibeUserPrompt, REFINEMENT_ANALYST_SYSTEM, BROWNFIELD_ANSWER_SYSTEM, MULTIFURCATION_SYSTEM, CHEF_SYSTEM, } from "@slowcook-ai/llm-anthropic";
|
|
27
|
+
/**
|
|
28
|
+
* Map from `fixture.agent` → prompt-builder function. Each builder is
|
|
29
|
+
* the canonical entrypoint that consumer agents call at runtime — so
|
|
30
|
+
* a prompt regression that drops context will show up here.
|
|
31
|
+
*
|
|
32
|
+
* Plate's builder returns Array<...> rather than string; we render its
|
|
33
|
+
* concatenated text for the substring check.
|
|
34
|
+
*/
|
|
35
|
+
const BUILDERS = {
|
|
36
|
+
// Chef eval asserts on the FULL prompt (system + user) — most chef
|
|
37
|
+
// rules (no-allowed-paths-hallucination, search_replace-only, PM
|
|
38
|
+
// question template, etc.) live in CHEF_SYSTEM. Concatenating with a
|
|
39
|
+
// separator gives substring matchers a single body to grep.
|
|
40
|
+
chef: (args) => CHEF_SYSTEM + "\n\n---\n\n" + buildChefPrompt(args),
|
|
41
|
+
"chef-orchestrate": (args) => buildChefOrchestratePrompt(args),
|
|
42
|
+
investigate: (args) => buildInvestigateUserPrompt(args),
|
|
43
|
+
navigator: (args) => buildNavigatorPrompt(args),
|
|
44
|
+
plate: (args) => {
|
|
45
|
+
const blocks = buildPlateAmendmentPrompt(args);
|
|
46
|
+
return blocks
|
|
47
|
+
.map((b) => {
|
|
48
|
+
if (typeof b === "string")
|
|
49
|
+
return b;
|
|
50
|
+
if (b && typeof b === "object" && "text" in b)
|
|
51
|
+
return String(b.text);
|
|
52
|
+
return JSON.stringify(b);
|
|
53
|
+
})
|
|
54
|
+
.join("\n\n");
|
|
55
|
+
},
|
|
56
|
+
sift: (args) => buildSiftTurnPrompt(args),
|
|
57
|
+
vibe: (args) => buildVibeUserPrompt(args),
|
|
58
|
+
refine: (args) => {
|
|
59
|
+
// REFINEMENT_ANALYST_SYSTEM is the system prompt — the surface
|
|
60
|
+
// where the PM-facing question-shape + decide-first rules live.
|
|
61
|
+
// Eval fixtures assert on the system prompt's contents.
|
|
62
|
+
const a = args;
|
|
63
|
+
return REFINEMENT_ANALYST_SYSTEM(a.checklist ?? "", a.projectContext ?? "");
|
|
64
|
+
},
|
|
65
|
+
"refine-brownfield-answer": () => {
|
|
66
|
+
// 0.19.0-α.36 — Pass B reflexive brownfield-answer prompt. Static,
|
|
67
|
+
// no inputs woven in; the prompt is consumed as-is. Eval fixtures
|
|
68
|
+
// assert on its required-rules surface (verbatim copy, source
|
|
69
|
+
// citation, conservative-ambiguous, JSON output, etc.).
|
|
70
|
+
return BROWNFIELD_ANSWER_SYSTEM;
|
|
71
|
+
},
|
|
72
|
+
multifurcation: () => {
|
|
73
|
+
// 0.19.0-α.44–α.46 — multifurcation pre-step. Static system prompt.
|
|
74
|
+
// Eval fixtures assert on the granularity-floor rule (3-6 scenario
|
|
75
|
+
// anchor + Actor+Verb+Object no-conjunctions check + recursion-
|
|
76
|
+
// aware "lean toward one when input has `Split from #N` footer").
|
|
77
|
+
return MULTIFURCATION_SYSTEM;
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
function parseArgs(argv) {
|
|
81
|
+
const args = { all: false, list: false };
|
|
82
|
+
for (let i = 0; i < argv.length; i++) {
|
|
83
|
+
const a = argv[i];
|
|
84
|
+
const next = argv[i + 1];
|
|
85
|
+
if (a === "--fixture" && next) {
|
|
86
|
+
args.fixtureId = next;
|
|
87
|
+
i++;
|
|
88
|
+
}
|
|
89
|
+
else if (a === "--all") {
|
|
90
|
+
args.all = true;
|
|
91
|
+
}
|
|
92
|
+
else if (a === "--list") {
|
|
93
|
+
args.list = true;
|
|
94
|
+
}
|
|
95
|
+
else if (a === "--fixtures-dir" && next) {
|
|
96
|
+
args.fixturesDir = next;
|
|
97
|
+
i++;
|
|
98
|
+
}
|
|
99
|
+
else if (a === "--help" || a === "-h") {
|
|
100
|
+
printHelp();
|
|
101
|
+
process.exit(0);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return args;
|
|
105
|
+
}
|
|
106
|
+
function printHelp() {
|
|
107
|
+
console.log(`
|
|
108
|
+
slowcook eval — prompt-regression gate
|
|
109
|
+
|
|
110
|
+
Loads frozen fixtures from packages/cli/eval/fixtures/<id>/fixture.json
|
|
111
|
+
and asserts the agent's prompt-builder output contains all expected
|
|
112
|
+
substrings (and none of the excluded ones).
|
|
113
|
+
|
|
114
|
+
Usage:
|
|
115
|
+
slowcook eval --fixture <id> Run one fixture by id.
|
|
116
|
+
slowcook eval --all Run every discovered fixture.
|
|
117
|
+
slowcook eval --list List fixture ids + descriptions.
|
|
118
|
+
|
|
119
|
+
Options:
|
|
120
|
+
--fixtures-dir <path> Override the default fixtures location
|
|
121
|
+
(mostly for tests / local experiments).
|
|
122
|
+
|
|
123
|
+
Exit code:
|
|
124
|
+
0 all targeted fixtures passed
|
|
125
|
+
1 at least one fixture failed or errored
|
|
126
|
+
64 usage error
|
|
127
|
+
`);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Resolve the default fixtures directory. Walks up from the CLI's
|
|
131
|
+
* compiled location to find the `packages/cli/eval/fixtures/` tree.
|
|
132
|
+
* In tests + local dev the caller passes `--fixtures-dir` directly.
|
|
133
|
+
*/
|
|
134
|
+
export function defaultFixturesDir() {
|
|
135
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
136
|
+
// here is .../packages/cli/dist/commands/eval — climb out to packages/cli/.
|
|
137
|
+
return join(here, "..", "..", "..", "eval", "fixtures");
|
|
138
|
+
}
|
|
139
|
+
export function listFixtureIds(fixturesDir) {
|
|
140
|
+
if (!existsSync(fixturesDir))
|
|
141
|
+
return [];
|
|
142
|
+
return readdirSync(fixturesDir)
|
|
143
|
+
.filter((name) => {
|
|
144
|
+
const path = join(fixturesDir, name);
|
|
145
|
+
if (!statSync(path).isDirectory())
|
|
146
|
+
return false;
|
|
147
|
+
return existsSync(join(path, "fixture.json"));
|
|
148
|
+
})
|
|
149
|
+
.sort();
|
|
150
|
+
}
|
|
151
|
+
export function loadFixture(fixturesDir, id) {
|
|
152
|
+
const path = join(fixturesDir, id, "fixture.json");
|
|
153
|
+
if (!existsSync(path)) {
|
|
154
|
+
throw new Error(`Fixture not found: ${id} (expected ${path})`);
|
|
155
|
+
}
|
|
156
|
+
const raw = readFileSync(path, "utf8");
|
|
157
|
+
let parsed;
|
|
158
|
+
try {
|
|
159
|
+
parsed = JSON.parse(raw);
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
throw new Error(`Fixture ${id} is not valid JSON: ${e.message}`);
|
|
163
|
+
}
|
|
164
|
+
validateFixture(parsed, id);
|
|
165
|
+
return parsed;
|
|
166
|
+
}
|
|
167
|
+
function validateFixture(f, idHint) {
|
|
168
|
+
if (!f.id)
|
|
169
|
+
throw new Error(`Fixture ${idHint}: missing 'id'`);
|
|
170
|
+
if (!f.agent)
|
|
171
|
+
throw new Error(`Fixture ${f.id}: missing 'agent'`);
|
|
172
|
+
if (!(f.agent in BUILDERS)) {
|
|
173
|
+
throw new Error(`Fixture ${f.id}: unknown agent '${f.agent}'. Known: ${Object.keys(BUILDERS).sort().join(", ")}`);
|
|
174
|
+
}
|
|
175
|
+
if (!f.input || typeof f.input !== "object") {
|
|
176
|
+
throw new Error(`Fixture ${f.id}: missing 'input' object`);
|
|
177
|
+
}
|
|
178
|
+
if (!Array.isArray(f.expected_prompt_includes)) {
|
|
179
|
+
throw new Error(`Fixture ${f.id}: 'expected_prompt_includes' must be an array of strings`);
|
|
180
|
+
}
|
|
181
|
+
if (f.expected_prompt_includes.length === 0) {
|
|
182
|
+
throw new Error(`Fixture ${f.id}: 'expected_prompt_includes' is empty — a fixture must assert at least one substring`);
|
|
183
|
+
}
|
|
184
|
+
if (f.expected_prompt_excludes && !Array.isArray(f.expected_prompt_excludes)) {
|
|
185
|
+
throw new Error(`Fixture ${f.id}: 'expected_prompt_excludes' must be an array of strings if present`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
export function runFixture(f) {
|
|
189
|
+
const builder = BUILDERS[f.agent];
|
|
190
|
+
if (!builder) {
|
|
191
|
+
return {
|
|
192
|
+
id: f.id,
|
|
193
|
+
agent: f.agent,
|
|
194
|
+
status: "error",
|
|
195
|
+
missingIncludes: [],
|
|
196
|
+
unexpectedExcludes: [],
|
|
197
|
+
errorMessage: `No builder registered for agent '${f.agent}'`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
let prompt;
|
|
201
|
+
try {
|
|
202
|
+
prompt = builder(f.input);
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
return {
|
|
206
|
+
id: f.id,
|
|
207
|
+
agent: f.agent,
|
|
208
|
+
status: "error",
|
|
209
|
+
missingIncludes: [],
|
|
210
|
+
unexpectedExcludes: [],
|
|
211
|
+
errorMessage: `Prompt builder threw: ${e.message}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const missing = f.expected_prompt_includes.filter((s) => !prompt.includes(s));
|
|
215
|
+
const unexpected = (f.expected_prompt_excludes ?? []).filter((s) => prompt.includes(s));
|
|
216
|
+
return {
|
|
217
|
+
id: f.id,
|
|
218
|
+
agent: f.agent,
|
|
219
|
+
status: missing.length === 0 && unexpected.length === 0 ? "pass" : "fail",
|
|
220
|
+
missingIncludes: missing,
|
|
221
|
+
unexpectedExcludes: unexpected,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function reportResult(r) {
|
|
225
|
+
const icon = r.status === "pass" ? "✓" : r.status === "fail" ? "✗" : "!";
|
|
226
|
+
console.log(`${icon} [${r.agent}] ${r.id}`);
|
|
227
|
+
if (r.status === "fail") {
|
|
228
|
+
if (r.missingIncludes.length > 0) {
|
|
229
|
+
console.log(" Missing required substrings:");
|
|
230
|
+
for (const s of r.missingIncludes)
|
|
231
|
+
console.log(` - ${JSON.stringify(s)}`);
|
|
232
|
+
}
|
|
233
|
+
if (r.unexpectedExcludes.length > 0) {
|
|
234
|
+
console.log(" Found forbidden substrings:");
|
|
235
|
+
for (const s of r.unexpectedExcludes)
|
|
236
|
+
console.log(` - ${JSON.stringify(s)}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else if (r.status === "error") {
|
|
240
|
+
console.log(` ${r.errorMessage}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
export async function evalCmd(argv) {
|
|
244
|
+
const args = parseArgs(argv);
|
|
245
|
+
const fixturesDir = args.fixturesDir ?? defaultFixturesDir();
|
|
246
|
+
if (!args.all && !args.fixtureId && !args.list) {
|
|
247
|
+
console.error("slowcook eval: one of --all / --fixture / --list is required");
|
|
248
|
+
printHelp();
|
|
249
|
+
process.exit(64);
|
|
250
|
+
}
|
|
251
|
+
const allIds = listFixtureIds(fixturesDir);
|
|
252
|
+
if (allIds.length === 0) {
|
|
253
|
+
console.error(`No fixtures found under ${fixturesDir}`);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
if (args.list) {
|
|
257
|
+
console.log(`Fixtures in ${fixturesDir}:`);
|
|
258
|
+
for (const id of allIds) {
|
|
259
|
+
const f = loadFixture(fixturesDir, id);
|
|
260
|
+
console.log(` ${id} [${f.agent}] ${f.description}`);
|
|
261
|
+
}
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const targets = args.all ? allIds : [args.fixtureId];
|
|
265
|
+
const results = [];
|
|
266
|
+
for (const id of targets) {
|
|
267
|
+
let f;
|
|
268
|
+
try {
|
|
269
|
+
f = loadFixture(fixturesDir, id);
|
|
270
|
+
}
|
|
271
|
+
catch (e) {
|
|
272
|
+
results.push({
|
|
273
|
+
id,
|
|
274
|
+
agent: "?",
|
|
275
|
+
status: "error",
|
|
276
|
+
missingIncludes: [],
|
|
277
|
+
unexpectedExcludes: [],
|
|
278
|
+
errorMessage: e.message,
|
|
279
|
+
});
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
results.push(runFixture(f));
|
|
283
|
+
}
|
|
284
|
+
for (const r of results)
|
|
285
|
+
reportResult(r);
|
|
286
|
+
const passed = results.filter((r) => r.status === "pass").length;
|
|
287
|
+
const failed = results.filter((r) => r.status === "fail").length;
|
|
288
|
+
const errored = results.filter((r) => r.status === "error").length;
|
|
289
|
+
console.log("");
|
|
290
|
+
console.log(`Eval summary: ${passed} passed, ${failed} failed, ${errored} errored.`);
|
|
291
|
+
if (failed > 0 || errored > 0)
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/eval/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/extract/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/extract/index.ts"],"names":[],"mappings":"AA4GA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmChF"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { emitSchemaDiagram, emitTokensCatalog } from "../map/index.js";
|
|
1
|
+
import { emitSchemaDiagram, emitTokensCatalog, emitEntitiesDiagram, } from "../map/index.js";
|
|
2
2
|
function parseArgs(argv) {
|
|
3
3
|
const args = {
|
|
4
4
|
repoRoot: process.cwd(),
|
|
5
5
|
schema: false,
|
|
6
6
|
tokens: false,
|
|
7
|
+
entities: false,
|
|
7
8
|
};
|
|
8
9
|
let any = false;
|
|
9
10
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -21,6 +22,10 @@ function parseArgs(argv) {
|
|
|
21
22
|
args.tokens = true;
|
|
22
23
|
any = true;
|
|
23
24
|
}
|
|
25
|
+
else if (a === "--entities") {
|
|
26
|
+
args.entities = true;
|
|
27
|
+
any = true;
|
|
28
|
+
}
|
|
24
29
|
else if (a === "--help" || a === "-h") {
|
|
25
30
|
printHelp();
|
|
26
31
|
process.exit(0);
|
|
@@ -35,6 +40,7 @@ function parseArgs(argv) {
|
|
|
35
40
|
if (!any) {
|
|
36
41
|
args.schema = true;
|
|
37
42
|
args.tokens = true;
|
|
43
|
+
args.entities = true;
|
|
38
44
|
}
|
|
39
45
|
return args;
|
|
40
46
|
}
|
|
@@ -61,6 +67,13 @@ Targets:
|
|
|
61
67
|
Design-token catalog from :root + @theme blocks in
|
|
62
68
|
**/*.css (skipping node_modules / .next / build dirs).
|
|
63
69
|
Skipped silently when no .css files / no tokens are found.
|
|
70
|
+
--entities .brewing/diagrams/entities.md (0.19.0+ / slowcook#36)
|
|
71
|
+
Mermaid ERD + per-entity table from TypeORM
|
|
72
|
+
**/*.entity.ts files containing @Entity decorators.
|
|
73
|
+
Skipped silently when no entity files are found (e.g.
|
|
74
|
+
Prisma / Drizzle / Supabase consumers). Tracked in git
|
|
75
|
+
by default; the init gitignore template carves out an
|
|
76
|
+
exception for this file.
|
|
64
77
|
|
|
65
78
|
This command does NOT run the ts-morph code-map scan; for that,
|
|
66
79
|
use \`slowcook map generate\`.
|
|
@@ -86,5 +99,14 @@ export async function extract(argv, _cliVersion) {
|
|
|
86
99
|
console.log(`Skipped tokens extract: ${r.skippedReason}`);
|
|
87
100
|
}
|
|
88
101
|
}
|
|
102
|
+
if (args.entities) {
|
|
103
|
+
const r = emitEntitiesDiagram(args.repoRoot);
|
|
104
|
+
if (r.written) {
|
|
105
|
+
console.log(`Wrote .brewing/diagrams/entities.md (${r.entityCount} entities, ${r.relationCount} relations, ${r.fileCount} *.entity.ts file(s) scanned).`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
console.log(`Skipped entities extract: ${r.skippedReason}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
89
111
|
}
|
|
90
112
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/extract/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/extract/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AA2BzB,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAgB;QACxB,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE;QACvB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK;KAChB,CAAC;IACF,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,KAAK,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACpC,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,gEAAgE;IAChE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc,EAAE,WAAmB;IAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CACT,uCAAuC,CAAC,CAAC,WAAW,cAAc,CAAC,CAAC,eAAe,sBAAsB,CAC1G,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CACT,sCAAsC,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,UAAU,YAAY,CAAC,CAAC,YAAY,wBAAwB,CACjJ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CACT,wCAAwC,CAAC,CAAC,WAAW,cAAc,CAAC,CAAC,aAAa,eAAe,CAAC,CAAC,SAAS,gCAAgC,CAC7I,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `slowcook garnish` — 0.19.0-α.15.
|
|
3
|
+
*
|
|
4
|
+
* Local commit-gate for human (or other-agent) tweaks layered on top
|
|
5
|
+
* of an agent's work. The PM (or engineer) edits files in the working
|
|
6
|
+
* tree — by hand, via DevTools Workspaces, via any editor — then runs
|
|
7
|
+
* `slowcook garnish`. The cli:
|
|
8
|
+
*
|
|
9
|
+
* 1. Detects uncommitted changes in the working tree.
|
|
10
|
+
* 2. For each changed file, identifies the agent (if any) whose last
|
|
11
|
+
* commit touched the file. Files last touched by humans get no
|
|
12
|
+
* trailer entry (no learning signal for an agent).
|
|
13
|
+
* 3. Runs the relevant tests scoped to the changed files (or the
|
|
14
|
+
* caller-provided test glob via --scope).
|
|
15
|
+
* 4. If tests pass: commits the staged changes with a subject naming
|
|
16
|
+
* the touched files + `Tweaks-output-of:` trailer lines marking
|
|
17
|
+
* each agent-authored file the tweak touched. Optionally pushes.
|
|
18
|
+
* 5. If tests fail: prints the failure summary + exits non-zero
|
|
19
|
+
* without committing.
|
|
20
|
+
*
|
|
21
|
+
* The trailer lines are the load-bearing piece — a future `slowcook
|
|
22
|
+
* reflect` command mines them to surface learning signal for the
|
|
23
|
+
* upstream agent (eval-set fixtures, prompt-amendment candidates).
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* 0.19.0-α.16 — runGarnish, the reusable core. Other commands
|
|
27
|
+
* (run-mock --garnish, for one) call this in-process on debounced
|
|
28
|
+
* file-save batches; doing it as a subprocess invocation would
|
|
29
|
+
* re-pay node startup every time.
|
|
30
|
+
*
|
|
31
|
+
* Returns a structured result; never calls process.exit. Caller
|
|
32
|
+
* decides what to do on each kind.
|
|
33
|
+
*/
|
|
34
|
+
export interface RunGarnishOptions {
|
|
35
|
+
repoRoot: string;
|
|
36
|
+
scope?: string | null;
|
|
37
|
+
message?: string | null;
|
|
38
|
+
push?: boolean;
|
|
39
|
+
silent?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export type RunGarnishResult = {
|
|
42
|
+
kind: "no-changes";
|
|
43
|
+
} | {
|
|
44
|
+
kind: "tests-failed";
|
|
45
|
+
touchedFiles: string[];
|
|
46
|
+
outputTail: string;
|
|
47
|
+
} | {
|
|
48
|
+
kind: "committed";
|
|
49
|
+
sha: string;
|
|
50
|
+
touchedFiles: string[];
|
|
51
|
+
agentRefCount: number;
|
|
52
|
+
pushed: boolean;
|
|
53
|
+
};
|
|
54
|
+
export declare function runGarnish(opts: RunGarnishOptions): Promise<RunGarnishResult>;
|
|
55
|
+
export declare function garnish(argv: string[], _cliVersion: string): Promise<void>;
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/garnish/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAsJH;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpE;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEN,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmEnF;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDhF"}
|