@slowcook-ai/cli 0.19.0-alpha.8 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +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 +126 -0
- package/dist/commands/refresh-knowledge.d.ts.map +1 -0
- package/dist/commands/refresh-knowledge.js +1010 -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
|
@@ -14,6 +14,8 @@ function parseArgs(argv) {
|
|
|
14
14
|
model: "claude-sonnet-4-6",
|
|
15
15
|
baseBranch: "main",
|
|
16
16
|
mode: "auto",
|
|
17
|
+
withNavigator: undefined,
|
|
18
|
+
navigatorModel: "claude-sonnet-4-5-20250929",
|
|
17
19
|
};
|
|
18
20
|
for (let i = 0; i < argv.length; i++) {
|
|
19
21
|
const arg = argv[i];
|
|
@@ -55,13 +57,30 @@ function parseArgs(argv) {
|
|
|
55
57
|
i++;
|
|
56
58
|
}
|
|
57
59
|
else if (arg === "--mode" && next) {
|
|
58
|
-
if (next
|
|
59
|
-
|
|
60
|
+
if (next === "legacy") {
|
|
61
|
+
// cli α.52 — hard error, no silent alias. The old name was
|
|
62
|
+
// misleading on a young tool. Point operators at the new name.
|
|
63
|
+
console.error(`--mode legacy was renamed to --mode freehand in cli α.52. ` +
|
|
64
|
+
`Re-dispatch with --mode freehand.`);
|
|
65
|
+
process.exit(64);
|
|
66
|
+
}
|
|
67
|
+
if (next !== "auto" && next !== "plate" && next !== "freehand") {
|
|
68
|
+
console.error(`--mode must be one of: auto, plate, freehand. Got: ${next}`);
|
|
60
69
|
process.exit(64);
|
|
61
70
|
}
|
|
62
71
|
args.mode = next;
|
|
63
72
|
i++;
|
|
64
73
|
}
|
|
74
|
+
else if (arg === "--with-navigator") {
|
|
75
|
+
args.withNavigator = true;
|
|
76
|
+
}
|
|
77
|
+
else if (arg === "--without-navigator") {
|
|
78
|
+
args.withNavigator = false;
|
|
79
|
+
}
|
|
80
|
+
else if (arg === "--navigator-model" && next) {
|
|
81
|
+
args.navigatorModel = next;
|
|
82
|
+
i++;
|
|
83
|
+
}
|
|
65
84
|
else if (arg === "--help" || arg === "-h") {
|
|
66
85
|
printHelp();
|
|
67
86
|
process.exit(0);
|
|
@@ -96,6 +115,17 @@ Options:
|
|
|
96
115
|
--wall-clock-minutes <n> Wall-clock cap in minutes (default: 60)
|
|
97
116
|
--model <id> LLM model (default: claude-sonnet-4-6; override with --model claude-opus-4-7 for harder stories)
|
|
98
117
|
--base <branch> Base branch for PRs (default: main)
|
|
118
|
+
--with-navigator Force pair-brew on (overrides mode-aware default).
|
|
119
|
+
--without-navigator Force pair-brew off (overrides mode-aware default).
|
|
120
|
+
Default behavior (cli α.52): navigator ON when resolved mode is
|
|
121
|
+
freehand (wide-scope edits — drift risk justifies the navigator
|
|
122
|
+
cost), OFF when plate (plate's hardcoded allowed_paths is itself
|
|
123
|
+
a guardrail; navigator opt-in if needed).
|
|
124
|
+
Pair-brew: each iteration's would-be checkpoint passes through a
|
|
125
|
+
navigator review (design fidelity / responsive / cross-story risk
|
|
126
|
+
/ etc.). On block, iter reverts + concerns fold into next iter's
|
|
127
|
+
prompt. Adds ~$0.01-0.05 per iter on top of driver spend.
|
|
128
|
+
--navigator-model <id> Navigator LLM model id. Default: claude-sonnet-4-5-20250929.
|
|
99
129
|
--help, -h Show this help
|
|
100
130
|
|
|
101
131
|
Environment:
|
|
@@ -111,13 +141,13 @@ Exit codes:
|
|
|
111
141
|
/**
|
|
112
142
|
* 0.15.0-α.4 — resolve brew's execution mode.
|
|
113
143
|
*
|
|
114
|
-
* `requested === "plate"` or `"
|
|
144
|
+
* `requested === "plate"` or `"freehand"` → return as-is.
|
|
115
145
|
*
|
|
116
146
|
* `requested === "auto"` → detect from spec + GitHub state:
|
|
117
147
|
* plate-mode requires BOTH (a) the spec has at least one populated
|
|
118
148
|
* `proposals.fixtures.by_domain.<domain>` entry (UI surface), AND (b)
|
|
119
149
|
* a slowcook-mockup PR for this story has been merged on the repo.
|
|
120
|
-
* If either condition is unmet →
|
|
150
|
+
* If either condition is unmet → freehand.
|
|
121
151
|
*
|
|
122
152
|
* GitHub check uses `gh pr list` to look for closed PRs whose head
|
|
123
153
|
* branch matches `slowcook/mockup/story-<id>`. Cheaper than fetching
|
|
@@ -126,8 +156,8 @@ Exit codes:
|
|
|
126
156
|
async function resolveBrewMode(args) {
|
|
127
157
|
if (args.requested === "plate")
|
|
128
158
|
return "plate";
|
|
129
|
-
if (args.requested === "
|
|
130
|
-
return "
|
|
159
|
+
if (args.requested === "freehand")
|
|
160
|
+
return "freehand";
|
|
131
161
|
// auto path
|
|
132
162
|
const specPath = join(args.repoRoot, "specs", `story-${args.storyId}.yaml`);
|
|
133
163
|
let specYaml = "";
|
|
@@ -135,29 +165,29 @@ async function resolveBrewMode(args) {
|
|
|
135
165
|
specYaml = require("node:fs").readFileSync(specPath, "utf8");
|
|
136
166
|
}
|
|
137
167
|
catch {
|
|
138
|
-
return "
|
|
168
|
+
return "freehand";
|
|
139
169
|
}
|
|
140
170
|
// Same hasUiSurface heuristic as the vibe command.
|
|
141
171
|
const proposalsIdx = specYaml.search(/^proposals\s*:\s*$/m);
|
|
142
172
|
if (proposalsIdx < 0)
|
|
143
|
-
return "
|
|
173
|
+
return "freehand";
|
|
144
174
|
const tail = specYaml.slice(proposalsIdx);
|
|
145
175
|
const fixturesMatch = tail.match(/^(\s+)fixtures\s*:\s*$/m);
|
|
146
176
|
if (!fixturesMatch)
|
|
147
|
-
return "
|
|
177
|
+
return "freehand";
|
|
148
178
|
const fixturesBlockStart = tail.indexOf(fixturesMatch[0]) + fixturesMatch[0].length;
|
|
149
179
|
const byDomainMatch = tail
|
|
150
180
|
.slice(fixturesBlockStart)
|
|
151
181
|
.match(/^(\s+)by_domain\s*:\s*$/m);
|
|
152
182
|
if (!byDomainMatch)
|
|
153
|
-
return "
|
|
183
|
+
return "freehand";
|
|
154
184
|
const byDomainIndentLen = byDomainMatch[1].length;
|
|
155
185
|
const after = tail.slice(fixturesBlockStart +
|
|
156
186
|
tail.slice(fixturesBlockStart).indexOf(byDomainMatch[0]) +
|
|
157
187
|
byDomainMatch[0].length);
|
|
158
188
|
const entryRe = new RegExp(`^( {${byDomainIndentLen + 1},}|\\t+)([a-z][a-z0-9_-]*)\\s*:\\s*$`, "m");
|
|
159
189
|
if (!entryRe.test(after))
|
|
160
|
-
return "
|
|
190
|
+
return "freehand";
|
|
161
191
|
// Check for a merged slowcook-mockup PR.
|
|
162
192
|
try {
|
|
163
193
|
const branch = `slowcook/mockup/story-${args.storyId}`;
|
|
@@ -169,14 +199,14 @@ async function resolveBrewMode(args) {
|
|
|
169
199
|
}).trim();
|
|
170
200
|
const arr = JSON.parse(out);
|
|
171
201
|
if (arr.length === 0) {
|
|
172
|
-
console.log(`(brew auto-detect: spec has fixtures but no merged slowcook-mockup PR for story-${args.storyId} found →
|
|
173
|
-
return "
|
|
202
|
+
console.log(`(brew auto-detect: spec has fixtures but no merged slowcook-mockup PR for story-${args.storyId} found → freehand mode)`);
|
|
203
|
+
return "freehand";
|
|
174
204
|
}
|
|
175
205
|
return "plate";
|
|
176
206
|
}
|
|
177
207
|
catch (e) {
|
|
178
|
-
console.warn(`(brew auto-detect: gh pr list failed — ${e.message}; defaulting to
|
|
179
|
-
return "
|
|
208
|
+
console.warn(`(brew auto-detect: gh pr list failed — ${e.message}; defaulting to freehand)`);
|
|
209
|
+
return "freehand";
|
|
180
210
|
}
|
|
181
211
|
}
|
|
182
212
|
function detectOwnerRepo(cwd) {
|
|
@@ -219,8 +249,8 @@ export async function brew(argv, cliVersion) {
|
|
|
219
249
|
const frozenPaths = readFrozenPaths(args.repoRoot);
|
|
220
250
|
// 0.15.0-α.4 — mode resolution. `auto` checks: does the spec have
|
|
221
251
|
// `proposals.fixtures.by_domain.*` populated AND has a slowcook-mockup
|
|
222
|
-
// PR for this story merged? If both yes → plate. Otherwise →
|
|
223
|
-
// Force-modes (plate /
|
|
252
|
+
// PR for this story merged? If both yes → plate. Otherwise → freehand.
|
|
253
|
+
// Force-modes (plate / freehand) skip the check.
|
|
224
254
|
const resolvedMode = await resolveBrewMode({
|
|
225
255
|
requested: args.mode,
|
|
226
256
|
repoRoot: args.repoRoot,
|
|
@@ -236,7 +266,7 @@ export async function brew(argv, cliVersion) {
|
|
|
236
266
|
// We don't re-fetch here; the caller workflow pulls origin/main.
|
|
237
267
|
// Allowed paths. In plate-mode, restrict to data-layer + API + migrations
|
|
238
268
|
// + tests. Frozen-paths guard then physically rejects any UI edit.
|
|
239
|
-
// In
|
|
269
|
+
// In freehand mode, fall through to today's "wide allowed_paths" behavior.
|
|
240
270
|
const allowedPaths = resolvedMode === "plate"
|
|
241
271
|
? [
|
|
242
272
|
"src/lib/data/**", // brew rewrites .ts stub; .mock.ts protected by extension check
|
|
@@ -260,6 +290,99 @@ export async function brew(argv, cliVersion) {
|
|
|
260
290
|
console.log(` budget: $${args.budgetUsd.toFixed(2)} · iterations: ${args.maxIterations} · model: ${args.model}`);
|
|
261
291
|
console.log(` branch: ${branchName}`);
|
|
262
292
|
console.log(` run log: ${runLogPath}\n`);
|
|
293
|
+
// Pair-brew NavigatorHook injection.
|
|
294
|
+
//
|
|
295
|
+
// cli α.52 — mode-aware default: navigator ON when resolved mode is
|
|
296
|
+
// `freehand`, OFF when `plate`. Wide-scope freehand edits carry more
|
|
297
|
+
// drift risk; plate's hardcoded allowed_paths is itself a guardrail.
|
|
298
|
+
// Explicit `--with-navigator` / `--without-navigator` overrides.
|
|
299
|
+
const effectiveWithNavigator = args.withNavigator !== undefined
|
|
300
|
+
? args.withNavigator
|
|
301
|
+
: resolvedMode === "freehand";
|
|
302
|
+
let navigatorHook = undefined;
|
|
303
|
+
if (effectiveWithNavigator) {
|
|
304
|
+
const { createPairNavigatorHook } = await import("./pair-navigator.js");
|
|
305
|
+
const { PRICING_PER_M_TOKENS } = await import("@slowcook-ai/llm-anthropic");
|
|
306
|
+
const navPricing = PRICING_PER_M_TOKENS[args.navigatorModel] ?? { input: 3, output: 15 };
|
|
307
|
+
navigatorHook = createPairNavigatorHook({
|
|
308
|
+
anthropic,
|
|
309
|
+
model: args.navigatorModel,
|
|
310
|
+
pricingPerMTokens: navPricing,
|
|
311
|
+
// Lean loader: fills in only what's cheap to derive from the
|
|
312
|
+
// brew context. Spec yaml + cross-story file list are pulled
|
|
313
|
+
// from disk; mock files are scoped to the story dir; storyTestIds
|
|
314
|
+
// come from the spec's tier-1 entries when available.
|
|
315
|
+
loadPromptContext: async () => {
|
|
316
|
+
const { readFileSync, existsSync, readdirSync, statSync } = await import("node:fs");
|
|
317
|
+
const { join } = await import("node:path");
|
|
318
|
+
const mockFiles = [];
|
|
319
|
+
const mockDir = join(args.repoRoot, "mock/src/components");
|
|
320
|
+
const walk = (dir) => {
|
|
321
|
+
if (!existsSync(dir))
|
|
322
|
+
return;
|
|
323
|
+
for (const name of readdirSync(dir)) {
|
|
324
|
+
const abs = join(dir, name);
|
|
325
|
+
const st = statSync(abs);
|
|
326
|
+
if (st.isDirectory())
|
|
327
|
+
walk(abs);
|
|
328
|
+
else if (/\.tsx?$/.test(name)) {
|
|
329
|
+
mockFiles.push({
|
|
330
|
+
path: abs.replace(args.repoRoot + "/", ""),
|
|
331
|
+
content: readFileSync(abs, "utf8").slice(0, 4000),
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
walk(mockDir);
|
|
337
|
+
const codeMapPath = join(args.repoRoot, ".brewing/code-map.md");
|
|
338
|
+
const codeMapDigest = existsSync(codeMapPath)
|
|
339
|
+
? readFileSync(codeMapPath, "utf8").slice(0, 8000)
|
|
340
|
+
: "";
|
|
341
|
+
const specYamlPath = join(args.repoRoot, `specs/story-${args.storyId}.yaml`);
|
|
342
|
+
const specYaml = existsSync(specYamlPath) ? readFileSync(specYamlPath, "utf8") : undefined;
|
|
343
|
+
const apiContract = spec
|
|
344
|
+
.api_contract;
|
|
345
|
+
// α.55 — give navigator a bounded list of source files that
|
|
346
|
+
// exist right now so it can presence-check claims about absence
|
|
347
|
+
// instead of hallucinating. Bounded to src/ + mock/src/ tsx/ts
|
|
348
|
+
// files to keep the prompt reasonable.
|
|
349
|
+
const knownSourceFiles = [];
|
|
350
|
+
const collectKnown = (dir, rel) => {
|
|
351
|
+
if (!existsSync(dir))
|
|
352
|
+
return;
|
|
353
|
+
for (const name of readdirSync(dir)) {
|
|
354
|
+
const abs = join(dir, name);
|
|
355
|
+
const r = rel ? `${rel}/${name}` : name;
|
|
356
|
+
const st = statSync(abs);
|
|
357
|
+
if (st.isDirectory()) {
|
|
358
|
+
if (name === "node_modules" || name.startsWith("."))
|
|
359
|
+
continue;
|
|
360
|
+
collectKnown(abs, r);
|
|
361
|
+
}
|
|
362
|
+
else if (/\.(tsx?|jsx?)$/.test(name)) {
|
|
363
|
+
knownSourceFiles.push(r);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
collectKnown(join(args.repoRoot, "src"), "src");
|
|
368
|
+
collectKnown(join(args.repoRoot, "mock/src"), "mock/src");
|
|
369
|
+
return {
|
|
370
|
+
mockFiles,
|
|
371
|
+
codeMapDigest,
|
|
372
|
+
storyTestIds: [],
|
|
373
|
+
apiContract,
|
|
374
|
+
specYaml,
|
|
375
|
+
knownSourceFiles,
|
|
376
|
+
};
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
const navReason = args.withNavigator === undefined
|
|
380
|
+
? `mode=${resolvedMode} default`
|
|
381
|
+
: args.withNavigator === true
|
|
382
|
+
? "explicit --with-navigator"
|
|
383
|
+
: "explicit --without-navigator (this branch shouldn't reach here)";
|
|
384
|
+
console.log(` navigator: enabled (${navReason}, model=${args.navigatorModel})`);
|
|
385
|
+
}
|
|
263
386
|
const ctx = {
|
|
264
387
|
repoRoot: args.repoRoot,
|
|
265
388
|
storyId: args.storyId,
|
|
@@ -279,6 +402,7 @@ export async function brew(argv, cliVersion) {
|
|
|
279
402
|
runLogPath,
|
|
280
403
|
cliVersion,
|
|
281
404
|
mode: resolvedMode,
|
|
405
|
+
navigatorHook,
|
|
282
406
|
};
|
|
283
407
|
try {
|
|
284
408
|
const outcome = await runBrew(ctx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/brew/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/brew/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0.19.0-alpha.9 — default Anthropic-backed pair-brew NavigatorHook.
|
|
3
|
+
*
|
|
4
|
+
* α.4 wired the structural NavigatorHook slot into brew/agent.ts.
|
|
5
|
+
* α.5 added the proposedTest hard-signal field. α.9 ships the
|
|
6
|
+
* default implementation: calls Anthropic with NAVIGATOR_SYSTEM +
|
|
7
|
+
* buildNavigatorPrompt, parses the NavigatorVerdict, adapts it to
|
|
8
|
+
* NavigatorHookVerdict (the brew-loop interface).
|
|
9
|
+
*
|
|
10
|
+
* Wiring path (cli α.10 will add the --with-navigator flag):
|
|
11
|
+
* ctx.navigatorHook = createPairNavigatorHook({ anthropic, model, ... });
|
|
12
|
+
*
|
|
13
|
+
* Persistent-block escalation (#77 / α.5): when `priorBlockCount >= 2`
|
|
14
|
+
* for the same root concern, the hook MAY include a proposedTest in
|
|
15
|
+
* the verdict — written to tests/navigator/ + folded into next iter's
|
|
16
|
+
* red-set as a HARD signal. Logic is in the prompt; mechanics in
|
|
17
|
+
* brew/agent.ts.
|
|
18
|
+
*/
|
|
19
|
+
import type Anthropic from "@anthropic-ai/sdk";
|
|
20
|
+
import { type NavigatorVerdict, type NavigatorPromptArgs } from "@slowcook-ai/llm-anthropic";
|
|
21
|
+
import type { NavigatorHook, NavigatorHookInput, NavigatorHookVerdict } from "./agent.js";
|
|
22
|
+
/**
|
|
23
|
+
* Adapt NavigatorVerdict (the prompt-side shape: axes + overall +
|
|
24
|
+
* rationale) → NavigatorHookVerdict (the brew-loop shape: overall +
|
|
25
|
+
* concerns + costUsd + proposedTest).
|
|
26
|
+
*
|
|
27
|
+
* Mapping rules:
|
|
28
|
+
* - overall "approve" → "approve"
|
|
29
|
+
* - overall "warn" → "approve" (warn is informational; brew
|
|
30
|
+
* only reverts on block)
|
|
31
|
+
* - overall "block" → "block"
|
|
32
|
+
* - concerns: each blocking axis becomes one entry "<axis>: <summary>".
|
|
33
|
+
* Warn-severity axes are surfaced too (lower priority).
|
|
34
|
+
* - costUsd: passed through unchanged.
|
|
35
|
+
*
|
|
36
|
+
* Pure: no IO. Tested in isolation.
|
|
37
|
+
*/
|
|
38
|
+
export declare function navigatorVerdictToHookVerdict(verdict: NavigatorVerdict, costUsd: number): NavigatorHookVerdict;
|
|
39
|
+
export interface PairNavigatorOptions {
|
|
40
|
+
/** Anthropic SDK client to call. */
|
|
41
|
+
anthropic: Anthropic;
|
|
42
|
+
/** Model id (e.g., "claude-sonnet-4-5-20250929"). */
|
|
43
|
+
model: string;
|
|
44
|
+
/** Per-iter token cap for the navigator response. */
|
|
45
|
+
maxTokens?: number;
|
|
46
|
+
/** Per-iter cost ceiling — when the LLM call would exceed this,
|
|
47
|
+
* the hook abstains (returns null) instead of blocking the iter. */
|
|
48
|
+
perIterBudgetUsd?: number;
|
|
49
|
+
/** Pricing per million tokens for cost computation. Required so
|
|
50
|
+
* the hook can report costUsd accurately to the budget tracker. */
|
|
51
|
+
pricingPerMTokens: {
|
|
52
|
+
input: number;
|
|
53
|
+
output: number;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Loader for the per-call prompt context. Brew/agent.ts doesn't
|
|
57
|
+
* carry mockFiles / codeMapDigest / storyTestIds / specYaml in
|
|
58
|
+
* `NavigatorHookInput` — the caller injects a loader that supplies
|
|
59
|
+
* those from the brew context's filesystem + spec.
|
|
60
|
+
*
|
|
61
|
+
* Returning null OR an empty mockFiles array does NOT abort —
|
|
62
|
+
* the prompt will still be built; navigator just sees less context.
|
|
63
|
+
*/
|
|
64
|
+
loadPromptContext: (input: NavigatorHookInput) => Promise<{
|
|
65
|
+
mockFiles: NavigatorPromptArgs["mockFiles"];
|
|
66
|
+
codeMapDigest: string;
|
|
67
|
+
storyTestIds: string[];
|
|
68
|
+
apiContract?: NavigatorPromptArgs["apiContract"];
|
|
69
|
+
crossStoryFiles?: string[];
|
|
70
|
+
specYaml?: string;
|
|
71
|
+
/**
|
|
72
|
+
* α.55 — list of source-file paths present in the repo at the
|
|
73
|
+
* time of this iteration. Navigator uses this to ground absence
|
|
74
|
+
* claims (must NOT assert a path is absent unless it's missing
|
|
75
|
+
* from this list AND the diff doesn't create it).
|
|
76
|
+
*/
|
|
77
|
+
knownSourceFiles?: string[];
|
|
78
|
+
priorVerdicts?: NavigatorPromptArgs["priorVerdicts"];
|
|
79
|
+
} | null>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build a NavigatorHook backed by an Anthropic LLM call. Pure
|
|
83
|
+
* factory; the returned hook is ready to inject into BrewContext.
|
|
84
|
+
*
|
|
85
|
+
* Per-call flow:
|
|
86
|
+
* 1. Caller-provided loader fills in mockFiles + codeMapDigest +
|
|
87
|
+
* storyTestIds + spec yaml + cross-story files + prior verdicts.
|
|
88
|
+
* 2. buildNavigatorPrompt produces the prompt; client.messages.create
|
|
89
|
+
* runs it with NAVIGATOR_SYSTEM.
|
|
90
|
+
* 3. Response text is parsed as NavigatorVerdict (JSON; fences
|
|
91
|
+
* tolerated).
|
|
92
|
+
* 4. navigatorVerdictToHookVerdict adapts to the brew-loop shape.
|
|
93
|
+
* 5. Cost is tallied from input/output tokens × pricing.
|
|
94
|
+
*
|
|
95
|
+
* On any failure (load error, JSON parse, API error), the hook
|
|
96
|
+
* returns null — brew treats null as "navigator abstained" + the
|
|
97
|
+
* iteration proceeds to checkpoint without navigator review.
|
|
98
|
+
*/
|
|
99
|
+
export declare function createPairNavigatorHook(options: PairNavigatorOptions): NavigatorHook;
|
|
100
|
+
/**
|
|
101
|
+
* Pull the text out of an Anthropic Messages API response. Returns
|
|
102
|
+
* empty string if the response shape is unexpected (defensive).
|
|
103
|
+
* Pure: no IO.
|
|
104
|
+
*/
|
|
105
|
+
export declare function extractTextFromResponse(response: {
|
|
106
|
+
content: Array<{
|
|
107
|
+
type: string;
|
|
108
|
+
text?: string;
|
|
109
|
+
}>;
|
|
110
|
+
}): string;
|
|
111
|
+
/**
|
|
112
|
+
* Parse a NavigatorVerdict from raw LLM text. Tolerates ```json
|
|
113
|
+
* fences + leading/trailing prose. Throws on malformed JSON or
|
|
114
|
+
* shape mismatch — caller should catch + treat as abstain.
|
|
115
|
+
*
|
|
116
|
+
* Pure: validates shape; doesn't normalize/repair.
|
|
117
|
+
*/
|
|
118
|
+
export declare function parseNavigatorVerdict(text: string): NavigatorVerdict;
|
|
119
|
+
//# sourceMappingURL=pair-navigator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair-navigator.d.ts","sourceRoot":"","sources":["../../../src/commands/brew/pair-navigator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAGL,KAAK,gBAAgB,EAErB,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE1F;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,MAAM,GACd,oBAAoB,CAoBtB;AAED,MAAM,WAAW,oBAAoB;IACnC,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;yEACqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;wEACoE;IACpE,iBAAiB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD;;;;;;;;OAQG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC;QACxD,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC5C,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,WAAW,CAAC,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACjD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB;;;;;WAKG;QACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;KACtD,GAAG,IAAI,CAAC,CAAC;CACX;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA+EpF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,MAAM,CAS7G;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAkBpE"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0.19.0-alpha.9 — default Anthropic-backed pair-brew NavigatorHook.
|
|
3
|
+
*
|
|
4
|
+
* α.4 wired the structural NavigatorHook slot into brew/agent.ts.
|
|
5
|
+
* α.5 added the proposedTest hard-signal field. α.9 ships the
|
|
6
|
+
* default implementation: calls Anthropic with NAVIGATOR_SYSTEM +
|
|
7
|
+
* buildNavigatorPrompt, parses the NavigatorVerdict, adapts it to
|
|
8
|
+
* NavigatorHookVerdict (the brew-loop interface).
|
|
9
|
+
*
|
|
10
|
+
* Wiring path (cli α.10 will add the --with-navigator flag):
|
|
11
|
+
* ctx.navigatorHook = createPairNavigatorHook({ anthropic, model, ... });
|
|
12
|
+
*
|
|
13
|
+
* Persistent-block escalation (#77 / α.5): when `priorBlockCount >= 2`
|
|
14
|
+
* for the same root concern, the hook MAY include a proposedTest in
|
|
15
|
+
* the verdict — written to tests/navigator/ + folded into next iter's
|
|
16
|
+
* red-set as a HARD signal. Logic is in the prompt; mechanics in
|
|
17
|
+
* brew/agent.ts.
|
|
18
|
+
*/
|
|
19
|
+
import { NAVIGATOR_SYSTEM, buildNavigatorPrompt, } from "@slowcook-ai/llm-anthropic";
|
|
20
|
+
/**
|
|
21
|
+
* Adapt NavigatorVerdict (the prompt-side shape: axes + overall +
|
|
22
|
+
* rationale) → NavigatorHookVerdict (the brew-loop shape: overall +
|
|
23
|
+
* concerns + costUsd + proposedTest).
|
|
24
|
+
*
|
|
25
|
+
* Mapping rules:
|
|
26
|
+
* - overall "approve" → "approve"
|
|
27
|
+
* - overall "warn" → "approve" (warn is informational; brew
|
|
28
|
+
* only reverts on block)
|
|
29
|
+
* - overall "block" → "block"
|
|
30
|
+
* - concerns: each blocking axis becomes one entry "<axis>: <summary>".
|
|
31
|
+
* Warn-severity axes are surfaced too (lower priority).
|
|
32
|
+
* - costUsd: passed through unchanged.
|
|
33
|
+
*
|
|
34
|
+
* Pure: no IO. Tested in isolation.
|
|
35
|
+
*/
|
|
36
|
+
export function navigatorVerdictToHookVerdict(verdict, costUsd) {
|
|
37
|
+
const overall = verdict.overall === "block" ? "block" : "approve";
|
|
38
|
+
const concerns = verdict.axes
|
|
39
|
+
// Sort blocking before warn so the most important concerns surface first.
|
|
40
|
+
.slice()
|
|
41
|
+
.sort((a, b) => {
|
|
42
|
+
if (a.severity === b.severity)
|
|
43
|
+
return 0;
|
|
44
|
+
return a.severity === "blocking" ? -1 : 1;
|
|
45
|
+
})
|
|
46
|
+
.map((a) => `${a.axis}: ${a.summary}`);
|
|
47
|
+
const result = { overall, concerns };
|
|
48
|
+
if (costUsd > 0) {
|
|
49
|
+
result.costUsd = costUsd;
|
|
50
|
+
}
|
|
51
|
+
// proposedTest is intentionally NOT extracted from NavigatorVerdict's
|
|
52
|
+
// axes — the prompt-side shape doesn't carry one today. The hook
|
|
53
|
+
// factory below allows callers to pass an `extractProposedTest`
|
|
54
|
+
// function that decides whether to attach a hard-signal test based
|
|
55
|
+
// on its own escalation policy (e.g., persistent-block detector).
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a NavigatorHook backed by an Anthropic LLM call. Pure
|
|
60
|
+
* factory; the returned hook is ready to inject into BrewContext.
|
|
61
|
+
*
|
|
62
|
+
* Per-call flow:
|
|
63
|
+
* 1. Caller-provided loader fills in mockFiles + codeMapDigest +
|
|
64
|
+
* storyTestIds + spec yaml + cross-story files + prior verdicts.
|
|
65
|
+
* 2. buildNavigatorPrompt produces the prompt; client.messages.create
|
|
66
|
+
* runs it with NAVIGATOR_SYSTEM.
|
|
67
|
+
* 3. Response text is parsed as NavigatorVerdict (JSON; fences
|
|
68
|
+
* tolerated).
|
|
69
|
+
* 4. navigatorVerdictToHookVerdict adapts to the brew-loop shape.
|
|
70
|
+
* 5. Cost is tallied from input/output tokens × pricing.
|
|
71
|
+
*
|
|
72
|
+
* On any failure (load error, JSON parse, API error), the hook
|
|
73
|
+
* returns null — brew treats null as "navigator abstained" + the
|
|
74
|
+
* iteration proceeds to checkpoint without navigator review.
|
|
75
|
+
*/
|
|
76
|
+
export function createPairNavigatorHook(options) {
|
|
77
|
+
const { anthropic, model, maxTokens = 1024, perIterBudgetUsd = 0.10, pricingPerMTokens, loadPromptContext, } = options;
|
|
78
|
+
return {
|
|
79
|
+
async review(input) {
|
|
80
|
+
let context;
|
|
81
|
+
try {
|
|
82
|
+
context = await loadPromptContext(input);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
if (!context)
|
|
88
|
+
return null;
|
|
89
|
+
// Build a compact diff string from filesTouched + line counts.
|
|
90
|
+
// The full git diff isn't always available at call time; this
|
|
91
|
+
// summary is enough for navigator to reason about scope without
|
|
92
|
+
// overflowing the prompt.
|
|
93
|
+
const diff = `Files touched: ${input.filesTouched.join(", ")}\nLines: +${input.linesAdded} / -${input.linesRemoved}`;
|
|
94
|
+
const promptArgs = {
|
|
95
|
+
storyId: input.storyId,
|
|
96
|
+
driverRationale: input.rationale,
|
|
97
|
+
diff,
|
|
98
|
+
mockFiles: context.mockFiles ?? [],
|
|
99
|
+
codeMapDigest: context.codeMapDigest ?? "",
|
|
100
|
+
storyTestIds: context.storyTestIds ?? [],
|
|
101
|
+
// α.55 — scope concerns to the current iteration's target.
|
|
102
|
+
targetTestId: input.targetTestId,
|
|
103
|
+
apiContract: context.apiContract,
|
|
104
|
+
crossStoryFiles: context.crossStoryFiles,
|
|
105
|
+
specYaml: context.specYaml,
|
|
106
|
+
// α.55 — let navigator presence-check files it might claim absent.
|
|
107
|
+
knownSourceFiles: context.knownSourceFiles,
|
|
108
|
+
priorVerdicts: context.priorVerdicts,
|
|
109
|
+
};
|
|
110
|
+
const prompt = buildNavigatorPrompt(promptArgs);
|
|
111
|
+
let response;
|
|
112
|
+
try {
|
|
113
|
+
response = await anthropic.messages.create({
|
|
114
|
+
model,
|
|
115
|
+
system: NAVIGATOR_SYSTEM,
|
|
116
|
+
max_tokens: maxTokens,
|
|
117
|
+
messages: [{ role: "user", content: prompt }],
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const usage = response.usage ?? { input_tokens: 0, output_tokens: 0 };
|
|
124
|
+
const costUsd = (usage.input_tokens * pricingPerMTokens.input) / 1_000_000 +
|
|
125
|
+
(usage.output_tokens * pricingPerMTokens.output) / 1_000_000;
|
|
126
|
+
if (costUsd > perIterBudgetUsd) {
|
|
127
|
+
// Over-budget — surface as abstain so brew doesn't pay the
|
|
128
|
+
// full ticket on a runaway response.
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const text = extractTextFromResponse(response);
|
|
132
|
+
if (!text)
|
|
133
|
+
return null;
|
|
134
|
+
let verdict;
|
|
135
|
+
try {
|
|
136
|
+
verdict = parseNavigatorVerdict(text);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return navigatorVerdictToHookVerdict(verdict, costUsd);
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Pull the text out of an Anthropic Messages API response. Returns
|
|
147
|
+
* empty string if the response shape is unexpected (defensive).
|
|
148
|
+
* Pure: no IO.
|
|
149
|
+
*/
|
|
150
|
+
export function extractTextFromResponse(response) {
|
|
151
|
+
if (!Array.isArray(response.content))
|
|
152
|
+
return "";
|
|
153
|
+
const parts = [];
|
|
154
|
+
for (const block of response.content) {
|
|
155
|
+
if (block.type === "text" && typeof block.text === "string") {
|
|
156
|
+
parts.push(block.text);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return parts.join("\n");
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Parse a NavigatorVerdict from raw LLM text. Tolerates ```json
|
|
163
|
+
* fences + leading/trailing prose. Throws on malformed JSON or
|
|
164
|
+
* shape mismatch — caller should catch + treat as abstain.
|
|
165
|
+
*
|
|
166
|
+
* Pure: validates shape; doesn't normalize/repair.
|
|
167
|
+
*/
|
|
168
|
+
export function parseNavigatorVerdict(text) {
|
|
169
|
+
const trimmed = text.trim();
|
|
170
|
+
const fence = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
171
|
+
const raw = fence ? fence[1].trim() : trimmed;
|
|
172
|
+
const parsed = JSON.parse(raw);
|
|
173
|
+
if (!parsed || typeof parsed !== "object") {
|
|
174
|
+
throw new Error("verdict is not an object");
|
|
175
|
+
}
|
|
176
|
+
if (!Array.isArray(parsed.axes)) {
|
|
177
|
+
throw new Error("verdict.axes must be an array");
|
|
178
|
+
}
|
|
179
|
+
if (parsed.overall !== "approve" && parsed.overall !== "warn" && parsed.overall !== "block") {
|
|
180
|
+
throw new Error(`verdict.overall must be approve|warn|block (got ${parsed.overall})`);
|
|
181
|
+
}
|
|
182
|
+
if (typeof parsed.rationale !== "string") {
|
|
183
|
+
throw new Error("verdict.rationale must be a string");
|
|
184
|
+
}
|
|
185
|
+
return parsed;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=pair-navigator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair-navigator.js","sourceRoot":"","sources":["../../../src/commands/brew/pair-navigator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/budget/index.ts"],"names":[],"mappings":"AA2HA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkK1D"}
|