@slowcook-ai/cli 0.13.0-alpha.3 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/cli.js +16 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/chef/classify.d.ts +65 -0
  4. package/dist/commands/chef/classify.d.ts.map +1 -0
  5. package/dist/commands/chef/classify.js +102 -0
  6. package/dist/commands/chef/classify.js.map +1 -0
  7. package/dist/commands/chef/index.d.ts +22 -0
  8. package/dist/commands/chef/index.d.ts.map +1 -0
  9. package/dist/commands/chef/index.js +287 -0
  10. package/dist/commands/chef/index.js.map +1 -0
  11. package/dist/commands/investigate/agent.d.ts.map +1 -1
  12. package/dist/commands/investigate/agent.js +39 -1
  13. package/dist/commands/investigate/agent.js.map +1 -1
  14. package/dist/commands/investigate/index.d.ts.map +1 -1
  15. package/dist/commands/investigate/index.js +126 -9
  16. package/dist/commands/investigate/index.js.map +1 -1
  17. package/dist/commands/investigate/prompts.d.ts +1 -1
  18. package/dist/commands/investigate/prompts.d.ts.map +1 -1
  19. package/dist/commands/investigate/prompts.js +48 -1
  20. package/dist/commands/investigate/prompts.js.map +1 -1
  21. package/dist/commands/recipe-regression/agent.d.ts +94 -0
  22. package/dist/commands/recipe-regression/agent.d.ts.map +1 -0
  23. package/dist/commands/recipe-regression/agent.js +442 -0
  24. package/dist/commands/recipe-regression/agent.js.map +1 -0
  25. package/dist/commands/recipe-regression/index.d.ts +12 -1
  26. package/dist/commands/recipe-regression/index.d.ts.map +1 -1
  27. package/dist/commands/recipe-regression/index.js +45 -8
  28. package/dist/commands/recipe-regression/index.js.map +1 -1
  29. package/dist/commands/sift/agent.d.ts +52 -0
  30. package/dist/commands/sift/agent.d.ts.map +1 -0
  31. package/dist/commands/sift/agent.js +392 -0
  32. package/dist/commands/sift/agent.js.map +1 -0
  33. package/dist/commands/sift/index.d.ts +23 -0
  34. package/dist/commands/sift/index.d.ts.map +1 -0
  35. package/dist/commands/sift/index.js +314 -0
  36. package/dist/commands/sift/index.js.map +1 -0
  37. package/dist/commands/sift/prompts.d.ts +114 -0
  38. package/dist/commands/sift/prompts.d.ts.map +1 -0
  39. package/dist/commands/sift/prompts.js +193 -0
  40. package/dist/commands/sift/prompts.js.map +1 -0
  41. package/package.json +2 -2
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Sift agent loop. Narrow red→green ratchet for bug fixes.
3
+ *
4
+ * Mirrors brew's iter loop in shape but smaller in every dimension:
5
+ * - max 3 iterations (vs brew's 10)
6
+ * - $0.50 budget cap (vs brew's $10)
7
+ * - allowed_paths restricted to bug-profile.fix_scope
8
+ * - test-runner is scoped to the regression test only
9
+ * - no story manifest; the contract is just the regression test
10
+ *
11
+ * **Status: alpha.4a**. Single-iteration loop with no ratchet/revert.
12
+ * Iteration loop + multi-turn ratchet ships in alpha.4b alongside
13
+ * a brew/sift shared-engine refactor.
14
+ */
15
+ import { type StackConfig, type RunResult } from "@slowcook-ai/stack-ts";
16
+ import { type BugProfile } from "../investigate/schema.js";
17
+ export interface SiftContext {
18
+ repoRoot: string;
19
+ anthropicApiKey: string;
20
+ model: string;
21
+ bugProfile: BugProfile;
22
+ /** Repo-relative path to the regression test file. */
23
+ regressionTestPath: string;
24
+ /** Read once at construction; passed through prompts. */
25
+ regressionTestSrc: string;
26
+ stackConfig: StackConfig;
27
+ /** Hard cap (seconds spend); default 3. */
28
+ maxIterations: number;
29
+ /** USD spend cap; default 0.5. */
30
+ budgetUsd: number;
31
+ now?: () => Date;
32
+ }
33
+ export interface SiftResult {
34
+ /** True when the regression test ended green. */
35
+ green: boolean;
36
+ /** Total iterations the agent took. */
37
+ iterations: number;
38
+ /** Total spend in USD. */
39
+ spendUsd: number;
40
+ /** Files written across the run. */
41
+ filesTouched: string[];
42
+ /** When green=false, why the run ended (`budget`, `iters`, `halt:<reason>`, etc.). */
43
+ haltReason?: string;
44
+ /** Last test result for diagnostics. */
45
+ lastTestResult: RunResult | null;
46
+ }
47
+ export declare function runSift(ctx: SiftContext): Promise<SiftResult>;
48
+ export declare function isInFixScope(path: string, fixScope: ReadonlyArray<string>): boolean;
49
+ export declare function regressionStatus(result: RunResult, regressionPath: string): "red" | "green";
50
+ export declare function regressionFailureMessage(result: RunResult, regressionPath: string): string | undefined;
51
+ export declare function parseHalt(text: string): string | null;
52
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/sift/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,SAAS,EACf,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAK3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;IACvB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,KAAK,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,cAAc,EAAE,SAAS,GAAG,IAAI,CAAC;CAClC;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAqInE;AAwJD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAC9B,OAAO,CAWT;AAMD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,MAAM,GACrB,KAAK,GAAG,OAAO,CAWjB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,MAAM,GACrB,MAAM,GAAG,SAAS,CAKpB;AAMD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrD"}
@@ -0,0 +1,392 @@
1
+ /**
2
+ * Sift agent loop. Narrow red→green ratchet for bug fixes.
3
+ *
4
+ * Mirrors brew's iter loop in shape but smaller in every dimension:
5
+ * - max 3 iterations (vs brew's 10)
6
+ * - $0.50 budget cap (vs brew's $10)
7
+ * - allowed_paths restricted to bug-profile.fix_scope
8
+ * - test-runner is scoped to the regression test only
9
+ * - no story manifest; the contract is just the regression test
10
+ *
11
+ * **Status: alpha.4a**. Single-iteration loop with no ratchet/revert.
12
+ * Iteration loop + multi-turn ratchet ships in alpha.4b alongside
13
+ * a brew/sift shared-engine refactor.
14
+ */
15
+ import { existsSync, readFileSync, readdirSync, statSync, writeFileSync, mkdirSync, } from "node:fs";
16
+ import { dirname, resolve, isAbsolute } from "node:path";
17
+ import { execSync } from "node:child_process";
18
+ import Anthropic from "@anthropic-ai/sdk";
19
+ import { validateStackConfig, runTests, } from "@slowcook-ai/stack-ts";
20
+ import { outlineFile } from "../brew/agent.js";
21
+ import { findReferences, findDefinition, renderReferences, } from "../brew/retrieval.js";
22
+ import { SIFT_SYSTEM, SIFT_TOOLS, buildSiftTurnPrompt } from "./prompts.js";
23
+ const MAX_ROUNDS_PER_ITER = 8;
24
+ const MAX_FILE_READ_BYTES = 20000;
25
+ export async function runSift(ctx) {
26
+ const anthropic = new Anthropic({ apiKey: ctx.anthropicApiKey });
27
+ const filesTouched = new Set();
28
+ let spendUsd = 0;
29
+ let lastTestResult = null;
30
+ const priorEdits = [];
31
+ for (let iter = 1; iter <= ctx.maxIterations; iter++) {
32
+ if (spendUsd >= ctx.budgetUsd) {
33
+ return {
34
+ green: false,
35
+ iterations: iter - 1,
36
+ spendUsd,
37
+ filesTouched: [...filesTouched],
38
+ haltReason: `budget (spent $${spendUsd.toFixed(4)} of $${ctx.budgetUsd})`,
39
+ lastTestResult,
40
+ };
41
+ }
42
+ const turnPrompt = buildSiftTurnPrompt({
43
+ iteration: iter,
44
+ maxIterations: ctx.maxIterations,
45
+ bugProfileYaml: bugProfileToYamlSummary(ctx.bugProfile),
46
+ regressionTestPath: ctx.regressionTestPath,
47
+ regressionTestSrc: ctx.regressionTestSrc,
48
+ testResult: lastTestResult
49
+ ? {
50
+ status: regressionStatus(lastTestResult, ctx.regressionTestPath),
51
+ failureMessage: regressionFailureMessage(lastTestResult, ctx.regressionTestPath),
52
+ }
53
+ : undefined,
54
+ priorEdits,
55
+ });
56
+ const messages = [
57
+ { role: "user", content: turnPrompt },
58
+ ];
59
+ let haltReason = null;
60
+ let editsThisTurn = 0;
61
+ for (let round = 0; round < MAX_ROUNDS_PER_ITER; round++) {
62
+ const response = await anthropic.messages.create({
63
+ model: ctx.model,
64
+ max_tokens: 4096,
65
+ system: SIFT_SYSTEM,
66
+ tools: SIFT_TOOLS,
67
+ messages,
68
+ });
69
+ spendUsd += costUsd(response, ctx.model);
70
+ // Look for <halt> in any text block.
71
+ for (const block of response.content) {
72
+ if (block.type === "text") {
73
+ const halt = parseHalt(block.text);
74
+ if (halt !== null)
75
+ haltReason = halt;
76
+ }
77
+ }
78
+ if (haltReason !== null)
79
+ break;
80
+ const toolUses = response.content.filter((b) => b.type === "tool_use");
81
+ if (response.stop_reason !== "tool_use" || toolUses.length === 0)
82
+ break;
83
+ const toolResults = toolUses.map((t) => {
84
+ const result = executeTool(ctx, t);
85
+ if (result.touched) {
86
+ filesTouched.add(result.touched);
87
+ editsThisTurn += 1;
88
+ }
89
+ return {
90
+ type: "tool_result",
91
+ tool_use_id: t.id,
92
+ content: result.content,
93
+ is_error: result.is_error,
94
+ };
95
+ });
96
+ messages.push({ role: "assistant", content: response.content });
97
+ messages.push({ role: "user", content: toolResults });
98
+ }
99
+ if (haltReason !== null) {
100
+ return {
101
+ green: haltReason.toLowerCase().includes("regression green"),
102
+ iterations: iter,
103
+ spendUsd,
104
+ filesTouched: [...filesTouched],
105
+ haltReason: `halt:${haltReason}`,
106
+ lastTestResult,
107
+ };
108
+ }
109
+ if (editsThisTurn === 0) {
110
+ return {
111
+ green: false,
112
+ iterations: iter,
113
+ spendUsd,
114
+ filesTouched: [...filesTouched],
115
+ haltReason: "agent made no edits this iteration",
116
+ lastTestResult,
117
+ };
118
+ }
119
+ priorEdits.push(...[...filesTouched].slice(priorEdits.length));
120
+ // Run the regression test scoped to the bug's test file.
121
+ lastTestResult = runTests(ctx.stackConfig, {
122
+ cwd: ctx.repoRoot,
123
+ scopeFiles: [ctx.regressionTestPath],
124
+ });
125
+ const status = regressionStatus(lastTestResult, ctx.regressionTestPath);
126
+ if (status === "green") {
127
+ return {
128
+ green: true,
129
+ iterations: iter,
130
+ spendUsd,
131
+ filesTouched: [...filesTouched],
132
+ lastTestResult,
133
+ };
134
+ }
135
+ }
136
+ return {
137
+ green: false,
138
+ iterations: ctx.maxIterations,
139
+ spendUsd,
140
+ filesTouched: [...filesTouched],
141
+ haltReason: `iters (${ctx.maxIterations} reached without green)`,
142
+ lastTestResult,
143
+ };
144
+ }
145
+ function executeTool(ctx, tool) {
146
+ const input = tool.input;
147
+ try {
148
+ switch (tool.name) {
149
+ case "read_file":
150
+ return readFile(ctx.repoRoot, String(input["path"] ?? ""));
151
+ case "outline_file":
152
+ return outlineCmd(ctx.repoRoot, String(input["path"] ?? ""));
153
+ case "list_directory":
154
+ return listDir(ctx.repoRoot, String(input["path"] ?? ""));
155
+ case "find_references": {
156
+ const symbol = String(input["symbol"] ?? "").trim();
157
+ if (!symbol)
158
+ return { content: "symbol is required", is_error: true };
159
+ const refs = findReferences(ctx.repoRoot, symbol, { excludeDefinitions: false });
160
+ return { content: renderReferences(refs), is_error: false };
161
+ }
162
+ case "find_definition": {
163
+ const symbol = String(input["symbol"] ?? "").trim();
164
+ if (!symbol)
165
+ return { content: "symbol is required", is_error: true };
166
+ const def = findDefinition(ctx.repoRoot, symbol);
167
+ if (!def)
168
+ return { content: `(no declaration found for ${symbol})`, is_error: false };
169
+ return {
170
+ content: `${def.kind} | ${def.file}:${def.line}:${def.column} | ${def.context}`,
171
+ is_error: false,
172
+ };
173
+ }
174
+ case "grep":
175
+ return runGrep(ctx.repoRoot, String(input["pattern"] ?? ""), input["glob"] ? String(input["glob"]) : undefined);
176
+ case "write_file":
177
+ return writeFile(ctx, String(input["path"] ?? ""), String(input["contents"] ?? ""));
178
+ default:
179
+ return { content: `Unknown tool: ${tool.name}`, is_error: true };
180
+ }
181
+ }
182
+ catch (e) {
183
+ return { content: `Tool error: ${e.message}`, is_error: true };
184
+ }
185
+ }
186
+ function readFile(repoRoot, p) {
187
+ if (!isPathSafe(repoRoot, p))
188
+ return { content: `Path escape forbidden: ${p}`, is_error: true };
189
+ const full = resolve(repoRoot, p);
190
+ if (!existsSync(full))
191
+ return { content: `File not found: ${p}`, is_error: true };
192
+ if (!statSync(full).isFile())
193
+ return { content: `Not a file: ${p}`, is_error: true };
194
+ const txt = readFileSync(full, "utf8");
195
+ return {
196
+ content: txt.length > MAX_FILE_READ_BYTES
197
+ ? txt.slice(0, MAX_FILE_READ_BYTES) + "\n…(truncated)"
198
+ : txt,
199
+ is_error: false,
200
+ };
201
+ }
202
+ function outlineCmd(repoRoot, p) {
203
+ if (!isPathSafe(repoRoot, p))
204
+ return { content: `Path escape forbidden: ${p}`, is_error: true };
205
+ const full = resolve(repoRoot, p);
206
+ if (!existsSync(full))
207
+ return { content: `File not found: ${p}`, is_error: true };
208
+ if (!statSync(full).isFile())
209
+ return { content: `Not a file: ${p}`, is_error: true };
210
+ const txt = readFileSync(full, "utf8");
211
+ return { content: outlineFile(p, txt), is_error: false };
212
+ }
213
+ function listDir(repoRoot, p) {
214
+ if (!isPathSafe(repoRoot, p))
215
+ return { content: `Path escape forbidden: ${p}`, is_error: true };
216
+ const full = resolve(repoRoot, p);
217
+ if (!existsSync(full))
218
+ return { content: `Not found: ${p}`, is_error: true };
219
+ if (!statSync(full).isDirectory())
220
+ return { content: `Not a directory: ${p}`, is_error: true };
221
+ const entries = readdirSync(full, { withFileTypes: true })
222
+ .map((e) => `${e.name}${e.isDirectory() ? "/" : ""}`)
223
+ .sort()
224
+ .join("\n");
225
+ return { content: entries, is_error: false };
226
+ }
227
+ function writeFile(ctx, p, contents) {
228
+ if (!isPathSafe(ctx.repoRoot, p)) {
229
+ return { content: `Path escape forbidden: ${p}`, is_error: true };
230
+ }
231
+ if (!isInFixScope(p, ctx.bugProfile.fix_scope)) {
232
+ return {
233
+ content: `${p} is outside the bug profile's fix_scope (${ctx.bugProfile.fix_scope.join(", ")}). Halt voluntarily and ask the operator to widen scope.`,
234
+ is_error: true,
235
+ };
236
+ }
237
+ const full = resolve(ctx.repoRoot, p);
238
+ mkdirSync(dirname(full), { recursive: true });
239
+ writeFileSync(full, contents, "utf8");
240
+ return {
241
+ content: `Wrote ${contents.split("\n").length} lines to ${p}`,
242
+ is_error: false,
243
+ touched: p,
244
+ };
245
+ }
246
+ function runGrep(repoRoot, pattern, glob) {
247
+ if (!pattern)
248
+ return { content: "pattern is required", is_error: true };
249
+ const safePattern = pattern.replace(/'/g, "'\\''");
250
+ const cmd = glob
251
+ ? `rg --line-number --max-count=50 -e '${safePattern}' --glob '${glob.replace(/'/g, "'\\''")}'`
252
+ : `rg --line-number --max-count=50 -e '${safePattern}'`;
253
+ try {
254
+ const out = execSync(cmd, {
255
+ cwd: repoRoot,
256
+ stdio: ["ignore", "pipe", "pipe"],
257
+ maxBuffer: 1024 * 256,
258
+ encoding: "utf8",
259
+ });
260
+ if (!out.trim())
261
+ return { content: "(no matches)", is_error: false };
262
+ return {
263
+ content: out.length > MAX_FILE_READ_BYTES
264
+ ? out.slice(0, MAX_FILE_READ_BYTES) + "\n…(truncated)"
265
+ : out,
266
+ is_error: false,
267
+ };
268
+ }
269
+ catch (e) {
270
+ const exit = e.status;
271
+ if (exit === 1)
272
+ return { content: "(no matches)", is_error: false };
273
+ return { content: `grep error: ${e.message}`, is_error: true };
274
+ }
275
+ }
276
+ function isPathSafe(repoRoot, relPath) {
277
+ if (isAbsolute(relPath))
278
+ return false;
279
+ const resolved = resolve(repoRoot, relPath);
280
+ return resolved.startsWith(resolve(repoRoot));
281
+ }
282
+ export function isInFixScope(path, fixScope) {
283
+ if (fixScope.length === 0)
284
+ return false;
285
+ const norm = path.replace(/^\.\/+/, "");
286
+ for (const scope of fixScope) {
287
+ const s = scope.replace(/^\.\/+/, "");
288
+ if (norm === s)
289
+ return true;
290
+ // Directory prefix match (with or without trailing slash).
291
+ const sDir = s.endsWith("/") ? s : `${s}/`;
292
+ if (norm.startsWith(sDir))
293
+ return true;
294
+ }
295
+ return false;
296
+ }
297
+ // -------------------------------------------------------------------------
298
+ // Test-result helpers
299
+ // -------------------------------------------------------------------------
300
+ export function regressionStatus(result, regressionPath) {
301
+ // Sift owns the regression test file; consider its tests only. If
302
+ // any are red OR errored, status is red.
303
+ const ours = result.tests.filter((t) => t.file.endsWith(regressionPath));
304
+ if (ours.length === 0) {
305
+ // Vitest may have crashed before reporting; treat as red.
306
+ return "red";
307
+ }
308
+ return ours.every((t) => t.status === "passed" || t.status === "skipped")
309
+ ? "green"
310
+ : "red";
311
+ }
312
+ export function regressionFailureMessage(result, regressionPath) {
313
+ const ours = result.tests.filter((t) => t.file.endsWith(regressionPath) && t.status !== "passed");
314
+ return ours[0]?.failure_message;
315
+ }
316
+ // -------------------------------------------------------------------------
317
+ // Halt block parsing
318
+ // -------------------------------------------------------------------------
319
+ export function parseHalt(text) {
320
+ const m = text.match(/<halt>[\s\S]*?<reason>([\s\S]*?)<\/reason>[\s\S]*?<\/halt>/);
321
+ if (m && m[1])
322
+ return m[1].trim();
323
+ // Fallback: simple <halt>reason</halt>.
324
+ const fallback = text.match(/<halt>([\s\S]*?)<\/halt>/);
325
+ return fallback ? (fallback[1] ?? "").trim() : null;
326
+ }
327
+ // -------------------------------------------------------------------------
328
+ // Cost accounting (mirrors investigate's; same pricing table)
329
+ // -------------------------------------------------------------------------
330
+ const PRICING_PER_M_TOKENS = {
331
+ "claude-opus-4-7": { input: 15, output: 75 },
332
+ "claude-sonnet-4-6": { input: 3, output: 15 },
333
+ "claude-sonnet-4-5": { input: 3, output: 15 },
334
+ "claude-haiku-4-5": { input: 1, output: 5 },
335
+ };
336
+ function costUsd(response, model) {
337
+ const pricing = PRICING_PER_M_TOKENS[model] ??
338
+ Object.entries(PRICING_PER_M_TOKENS).find(([k]) => model.startsWith(k))?.[1];
339
+ if (!pricing)
340
+ return 0;
341
+ const usage = response.usage;
342
+ const input = usage?.input_tokens ?? 0;
343
+ const output = usage?.output_tokens ?? 0;
344
+ const cacheRead = usage?.cache_read_input_tokens ?? 0;
345
+ const cacheCreate = usage?.cache_creation_input_tokens ?? 0;
346
+ const effectiveInput = input + cacheRead * 0.1 + cacheCreate * 1.25;
347
+ return (effectiveInput / 1_000_000) * pricing.input + (output / 1_000_000) * pricing.output;
348
+ }
349
+ // -------------------------------------------------------------------------
350
+ // Bug profile rendering (compact YAML for prompt — full schema in
351
+ // .brewing/bug-profiles/B-N.yaml; we only need the fields sift cares
352
+ // about, kept compact to save tokens).
353
+ // -------------------------------------------------------------------------
354
+ function bugProfileToYamlSummary(p) {
355
+ const lines = [];
356
+ lines.push(`bug_id: ${p.bug_id}`);
357
+ lines.push(`title: ${JSON.stringify(p.title)}`);
358
+ lines.push(`source_issue: "${p.source_issue}"`);
359
+ if (p.symptom.length > 0) {
360
+ lines.push(`symptom:`);
361
+ for (const s of p.symptom)
362
+ lines.push(` - ${JSON.stringify(s)}`);
363
+ }
364
+ if (p.expected.length > 0) {
365
+ lines.push(`expected:`);
366
+ for (const s of p.expected)
367
+ lines.push(` - ${JSON.stringify(s)}`);
368
+ }
369
+ lines.push(`failure_locus:`);
370
+ lines.push(` file: ${JSON.stringify(p.failure_locus.file)}`);
371
+ if (p.failure_locus.line !== undefined)
372
+ lines.push(` line: ${p.failure_locus.line}`);
373
+ if (p.failure_locus.function !== undefined) {
374
+ lines.push(` function: ${JSON.stringify(p.failure_locus.function)}`);
375
+ }
376
+ lines.push(` diagnosis: |`);
377
+ for (const l of p.failure_locus.diagnosis.split("\n"))
378
+ lines.push(` ${l}`);
379
+ if (p.regression_assertion.length > 0) {
380
+ lines.push(`regression_assertion:`);
381
+ for (const s of p.regression_assertion)
382
+ lines.push(` - ${JSON.stringify(s)}`);
383
+ }
384
+ if (p.fix_scope.length > 0) {
385
+ lines.push(`fix_scope:`);
386
+ for (const s of p.fix_scope)
387
+ lines.push(` - ${JSON.stringify(s)}`);
388
+ }
389
+ return lines.join("\n");
390
+ }
391
+ void validateStackConfig;
392
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/commands/sift/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `slowcook sift --bug B-N` — bug-flow brew analogue.
3
+ *
4
+ * Reads a bug-profile + the regression test, runs an LLM ratchet to
5
+ * make the regression go green, halts when:
6
+ * - regression test passes (green = success)
7
+ * - budget cap hit
8
+ * - max iterations hit
9
+ * - agent halts voluntarily
10
+ *
11
+ * Usage:
12
+ * slowcook sift --bug B-1 [--cwd <path>] [--model <id>]
13
+ * [--max-iterations <n>] [--budget-usd <n>]
14
+ * [--dry-run]
15
+ */
16
+ export declare function sift(argv: string[], cliVersion: string): Promise<void>;
17
+ /**
18
+ * Find the regression test file for a bug. Looks for
19
+ * `tests/regression/B-N-<slug>.test.ts` (matching what
20
+ * recipe --regression emits).
21
+ */
22
+ export declare function findRegressionTestForBug(repoRoot: string, bugId: string): string | null;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/sift/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA2GH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6H5E;AAgHD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CAUf"}