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

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 (83) hide show
  1. package/dist/cli.js +25 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/brew/prompts.d.ts +3 -290
  4. package/dist/commands/brew/prompts.d.ts.map +1 -1
  5. package/dist/commands/brew/prompts.js +3 -462
  6. package/dist/commands/brew/prompts.js.map +1 -1
  7. package/dist/commands/chef/classify.d.ts +65 -0
  8. package/dist/commands/chef/classify.d.ts.map +1 -0
  9. package/dist/commands/chef/classify.js +102 -0
  10. package/dist/commands/chef/classify.js.map +1 -0
  11. package/dist/commands/chef/index.d.ts +22 -0
  12. package/dist/commands/chef/index.d.ts.map +1 -0
  13. package/dist/commands/chef/index.js +287 -0
  14. package/dist/commands/chef/index.js.map +1 -0
  15. package/dist/commands/extract/index.d.ts +2 -0
  16. package/dist/commands/extract/index.d.ts.map +1 -0
  17. package/dist/commands/extract/index.js +90 -0
  18. package/dist/commands/extract/index.js.map +1 -0
  19. package/dist/commands/init/templates.d.ts.map +1 -1
  20. package/dist/commands/init/templates.js +4 -0
  21. package/dist/commands/init/templates.js.map +1 -1
  22. package/dist/commands/investigate/agent.d.ts.map +1 -1
  23. package/dist/commands/investigate/agent.js +39 -1
  24. package/dist/commands/investigate/agent.js.map +1 -1
  25. package/dist/commands/investigate/index.d.ts.map +1 -1
  26. package/dist/commands/investigate/index.js +126 -9
  27. package/dist/commands/investigate/index.js.map +1 -1
  28. package/dist/commands/investigate/prompts.d.ts +7 -87
  29. package/dist/commands/investigate/prompts.d.ts.map +1 -1
  30. package/dist/commands/investigate/prompts.js +7 -187
  31. package/dist/commands/investigate/prompts.js.map +1 -1
  32. package/dist/commands/map/emit-tokens.d.ts +53 -0
  33. package/dist/commands/map/emit-tokens.d.ts.map +1 -0
  34. package/dist/commands/map/emit-tokens.js +316 -0
  35. package/dist/commands/map/emit-tokens.js.map +1 -0
  36. package/dist/commands/map/index.d.ts +17 -0
  37. package/dist/commands/map/index.d.ts.map +1 -1
  38. package/dist/commands/map/index.js +72 -5
  39. package/dist/commands/map/index.js.map +1 -1
  40. package/dist/commands/recipe-regression/agent.d.ts +94 -0
  41. package/dist/commands/recipe-regression/agent.d.ts.map +1 -0
  42. package/dist/commands/recipe-regression/agent.js +442 -0
  43. package/dist/commands/recipe-regression/agent.js.map +1 -0
  44. package/dist/commands/recipe-regression/index.d.ts +12 -1
  45. package/dist/commands/recipe-regression/index.d.ts.map +1 -1
  46. package/dist/commands/recipe-regression/index.js +45 -8
  47. package/dist/commands/recipe-regression/index.js.map +1 -1
  48. package/dist/commands/refine/agent.d.ts.map +1 -1
  49. package/dist/commands/refine/agent.js +21 -0
  50. package/dist/commands/refine/agent.js.map +1 -1
  51. package/dist/commands/refine/context.d.ts +11 -0
  52. package/dist/commands/refine/context.d.ts.map +1 -1
  53. package/dist/commands/refine/context.js +45 -0
  54. package/dist/commands/refine/context.js.map +1 -1
  55. package/dist/commands/refine/mock-fixtures.d.ts +39 -0
  56. package/dist/commands/refine/mock-fixtures.d.ts.map +1 -0
  57. package/dist/commands/refine/mock-fixtures.js +86 -0
  58. package/dist/commands/refine/mock-fixtures.js.map +1 -0
  59. package/dist/commands/refine/prompts.d.ts +10 -21
  60. package/dist/commands/refine/prompts.d.ts.map +1 -1
  61. package/dist/commands/refine/prompts.js +10 -376
  62. package/dist/commands/refine/prompts.js.map +1 -1
  63. package/dist/commands/refine/spec-yaml.d.ts +306 -128
  64. package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
  65. package/dist/commands/refine/spec-yaml.js +33 -0
  66. package/dist/commands/refine/spec-yaml.js.map +1 -1
  67. package/dist/commands/sift/agent.d.ts +52 -0
  68. package/dist/commands/sift/agent.d.ts.map +1 -0
  69. package/dist/commands/sift/agent.js +392 -0
  70. package/dist/commands/sift/agent.js.map +1 -0
  71. package/dist/commands/sift/index.d.ts +23 -0
  72. package/dist/commands/sift/index.d.ts.map +1 -0
  73. package/dist/commands/sift/index.js +314 -0
  74. package/dist/commands/sift/index.js.map +1 -0
  75. package/dist/commands/sift/prompts.d.ts +6 -0
  76. package/dist/commands/sift/prompts.d.ts.map +1 -0
  77. package/dist/commands/sift/prompts.js +6 -0
  78. package/dist/commands/sift/prompts.js.map +1 -0
  79. package/dist/commands/testgen/prompts.d.ts +3 -13
  80. package/dist/commands/testgen/prompts.d.ts.map +1 -1
  81. package/dist/commands/testgen/prompts.js +3 -384
  82. package/dist/commands/testgen/prompts.js.map +1 -1
  83. package/package.json +5 -5
@@ -0,0 +1,314 @@
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
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { execSync } from "node:child_process";
19
+ import { GitHubAdapter } from "@slowcook-ai/forge-github";
20
+ import { runSift } from "./agent.js";
21
+ import { loadBugProfile } from "../recipe-regression/index.js";
22
+ import { validateStackConfig } from "@slowcook-ai/stack-ts";
23
+ function parseArgs(argv) {
24
+ const args = {
25
+ bugId: "",
26
+ repoRoot: process.cwd(),
27
+ model: "claude-sonnet-4-6", // Sift defaults to Sonnet — narrow fixes shouldn't need Opus.
28
+ maxIterations: 3,
29
+ budgetUsd: 0.5,
30
+ dryRun: false,
31
+ noPr: false,
32
+ };
33
+ for (let i = 0; i < argv.length; i++) {
34
+ const arg = argv[i];
35
+ const next = argv[i + 1];
36
+ if (arg === "--bug" && next) {
37
+ args.bugId = normaliseBugId(next);
38
+ i++;
39
+ }
40
+ else if (arg === "--cwd" && next) {
41
+ args.repoRoot = next;
42
+ i++;
43
+ }
44
+ else if (arg === "--model" && next) {
45
+ args.model = next;
46
+ i++;
47
+ }
48
+ else if ((arg === "--max-iterations" || arg === "--iters") && next) {
49
+ args.maxIterations = parseInt(next, 10);
50
+ i++;
51
+ }
52
+ else if (arg === "--budget-usd" && next) {
53
+ args.budgetUsd = parseFloat(next);
54
+ i++;
55
+ }
56
+ else if (arg === "--dry-run") {
57
+ args.dryRun = true;
58
+ }
59
+ else if (arg === "--no-pr") {
60
+ args.noPr = true;
61
+ }
62
+ else if (arg === "--owner" && next) {
63
+ args.owner = next;
64
+ i++;
65
+ }
66
+ else if (arg === "--repo" && next) {
67
+ args.repo = next;
68
+ i++;
69
+ }
70
+ else if (arg === "--help" || arg === "-h") {
71
+ printHelp();
72
+ process.exit(0);
73
+ }
74
+ }
75
+ return args;
76
+ }
77
+ function normaliseBugId(raw) {
78
+ const m = raw.trim().match(/^B?-?(\d+)$/i);
79
+ if (!m || !m[1])
80
+ return raw;
81
+ return `B-${m[1]}`;
82
+ }
83
+ function printHelp() {
84
+ console.log(`
85
+ slowcook sift — narrow red→green ratchet for a bug fix
86
+
87
+ Reads .brewing/bug-profiles/B-N.yaml + the matching regression test
88
+ under tests/regression/B-N-*.test.ts, runs an LLM agent in a tight
89
+ loop to flip the regression to green with minimum-diff edits scoped
90
+ to the bug profile's fix_scope.
91
+
92
+ Usage:
93
+ slowcook sift --bug B-1 [options]
94
+
95
+ Options:
96
+ --bug <id> Bug id (B-N or just N).
97
+ --cwd <path> Repo root (default: cwd).
98
+ --model <id> LLM model (default: claude-sonnet-4-6).
99
+ --max-iterations <n> Max iterations (default: 3).
100
+ --budget-usd <n> Spend cap in USD (default: 0.5).
101
+ --dry-run Print plan + exit; don't make LLM calls.
102
+
103
+ Environment:
104
+ ANTHROPIC_API_KEY (required unless --dry-run)
105
+ GITHUB_TOKEN (optional; not used by sift directly today)
106
+
107
+ Exit codes:
108
+ 0 regression went green
109
+ 1 halted (budget / iters / voluntary halt / no-progress)
110
+ 2 setup error (missing profile / regression test / stack config)
111
+ `);
112
+ }
113
+ export async function sift(argv, cliVersion) {
114
+ const args = parseArgs(argv);
115
+ if (!args.bugId) {
116
+ console.error("slowcook sift: --bug <id> is required");
117
+ printHelp();
118
+ process.exit(64);
119
+ }
120
+ // Load bug profile + regression test + stack config.
121
+ let bugProfile;
122
+ try {
123
+ bugProfile = loadBugProfile(args.repoRoot, args.bugId);
124
+ }
125
+ catch (e) {
126
+ console.error(`slowcook sift: ${e.message}`);
127
+ process.exit(2);
128
+ }
129
+ const regressionTestPath = findRegressionTestForBug(args.repoRoot, args.bugId);
130
+ if (!regressionTestPath) {
131
+ console.error(`slowcook sift: no regression test found at tests/regression/${args.bugId}-*.test.ts. ` +
132
+ `Run 'slowcook recipe --regression --bug ${args.bugId}' first.`);
133
+ process.exit(2);
134
+ }
135
+ const regressionTestSrc = readFileSync(join(args.repoRoot, regressionTestPath), "utf8");
136
+ let stackConfig;
137
+ try {
138
+ const raw = JSON.parse(readFileSync(join(args.repoRoot, ".brewing/stack.json"), "utf8"));
139
+ stackConfig = validateStackConfig(raw);
140
+ }
141
+ catch (e) {
142
+ console.error(`slowcook sift: stack.json missing or invalid: ${e.message}`);
143
+ process.exit(2);
144
+ }
145
+ console.error(`slowcook sift (${cliVersion}) — ${args.bugId}, model ${args.model}, max ${args.maxIterations} iter, budget $${args.budgetUsd.toFixed(2)}.`);
146
+ console.error(` bug profile : .brewing/bug-profiles/${args.bugId}.yaml`);
147
+ console.error(` regression : ${regressionTestPath}`);
148
+ console.error(` fix_scope : ${bugProfile.fix_scope.join(", ")}`);
149
+ if (args.dryRun) {
150
+ console.error("\n(dry-run: would invoke runSift; not making LLM calls)");
151
+ process.exit(0);
152
+ }
153
+ const apiKey = process.env["ANTHROPIC_API_KEY"];
154
+ if (!apiKey) {
155
+ console.error("slowcook sift: ANTHROPIC_API_KEY is required");
156
+ process.exit(78);
157
+ }
158
+ const ctx = {
159
+ repoRoot: args.repoRoot,
160
+ anthropicApiKey: apiKey,
161
+ model: args.model,
162
+ bugProfile,
163
+ regressionTestPath,
164
+ regressionTestSrc,
165
+ stackConfig,
166
+ maxIterations: args.maxIterations,
167
+ budgetUsd: args.budgetUsd,
168
+ };
169
+ const branchName = `slowcook/sift/${args.bugId}-${Date.now()}`;
170
+ // Create the branch BEFORE the agent edits so the diff lands on
171
+ // the sift branch, not on whatever branch was checked out.
172
+ try {
173
+ execSync(`git -C "${args.repoRoot}" checkout -b ${branchName}`, {
174
+ stdio: ["ignore", "pipe", "pipe"],
175
+ });
176
+ }
177
+ catch (e) {
178
+ console.error(`slowcook sift: could not create branch ${branchName}: ${e.message}`);
179
+ process.exit(2);
180
+ }
181
+ const result = await runSift(ctx);
182
+ console.error("");
183
+ if (result.green) {
184
+ console.error(`✓ Sift succeeded — regression green after ${result.iterations} iter(s), $${result.spendUsd.toFixed(4)} spent.`);
185
+ console.error(` Files touched: ${result.filesTouched.join(", ") || "(none)"}`);
186
+ }
187
+ else {
188
+ console.error(`✗ Sift halted: ${result.haltReason}. ${result.iterations} iter(s), $${result.spendUsd.toFixed(4)} spent.`);
189
+ if (result.filesTouched.length > 0) {
190
+ console.error(` Files touched: ${result.filesTouched.join(", ")}`);
191
+ }
192
+ }
193
+ // Commit + push + open PR even on halt — the operator wants to see
194
+ // partial progress when sift halts mid-fix. Skipped only on
195
+ // --no-pr or when no files were edited.
196
+ if (args.noPr) {
197
+ console.error(`(--no-pr: branch ${branchName} kept locally; commit/push/PR skipped.)`);
198
+ process.exit(result.green ? 0 : 1);
199
+ }
200
+ if (result.filesTouched.length === 0) {
201
+ console.error(`(no files edited; nothing to push.)`);
202
+ process.exit(result.green ? 0 : 1);
203
+ }
204
+ await openSiftPr({
205
+ repoRoot: args.repoRoot,
206
+ bugId: args.bugId,
207
+ branchName,
208
+ profile: bugProfile,
209
+ result,
210
+ owner: args.owner,
211
+ repo: args.repo,
212
+ cliVersion,
213
+ });
214
+ process.exit(result.green ? 0 : 1);
215
+ }
216
+ async function openSiftPr(args) {
217
+ const githubToken = process.env["GITHUB_TOKEN"];
218
+ if (!githubToken) {
219
+ console.error(`GITHUB_TOKEN not set — branch ${args.branchName} kept locally with edits but PR not opened.`);
220
+ return;
221
+ }
222
+ const detected = detectOwnerRepo(args.repoRoot);
223
+ const owner = args.owner ?? detected?.owner;
224
+ const repo = args.repo ?? detected?.repo;
225
+ if (!owner || !repo) {
226
+ console.error("Could not detect owner/repo from git remote — pass --owner + --repo to open the PR.");
227
+ return;
228
+ }
229
+ const forge = new GitHubAdapter({ owner, repo, token: githubToken });
230
+ try {
231
+ // Stage all touched files + commit + push.
232
+ for (const f of args.result.filesTouched) {
233
+ await forge.git.stage(f);
234
+ }
235
+ await forge.git.commit(`slowcook sift ${args.result.green ? "✓" : "(partial)"} ${args.bugId}: ${args.result.iterations} iter(s) · $${args.result.spendUsd.toFixed(2)}`);
236
+ await forge.git.push(args.branchName);
237
+ }
238
+ catch (e) {
239
+ console.error(`Push failed: ${e.message}. Branch is local; commit/push manually.`);
240
+ return;
241
+ }
242
+ try {
243
+ const titlePrefix = args.result.green ? "sift ✓" : "sift (partial)";
244
+ const pr = await forge.createPullRequest({
245
+ title: `${titlePrefix} ${args.bugId}: ${args.profile.title}`,
246
+ body: buildSiftPrBody(args),
247
+ base: "main",
248
+ head: args.branchName,
249
+ draft: !args.result.green,
250
+ labels: ["slowcook-sift", "bug"],
251
+ });
252
+ console.error(`Opened PR ${pr.url}.`);
253
+ }
254
+ catch (e) {
255
+ console.error(`Pushed branch ${args.branchName} but PR open failed: ${e.message}\n Open manually at https://github.com/${owner}/${repo}/pull/new/${args.branchName}`);
256
+ }
257
+ }
258
+ function detectOwnerRepo(repoRoot) {
259
+ try {
260
+ const url = execSync("git remote get-url origin", {
261
+ cwd: repoRoot,
262
+ encoding: "utf8",
263
+ stdio: ["ignore", "pipe", "ignore"],
264
+ }).trim();
265
+ const m = url.match(/github\.com[:/]([^/]+)\/([^/.]+)(?:\.git)?$/);
266
+ if (m && m[1] && m[2])
267
+ return { owner: m[1], repo: m[2] };
268
+ }
269
+ catch {
270
+ /* not a git repo */
271
+ }
272
+ return null;
273
+ }
274
+ function buildSiftPrBody(args) {
275
+ const lines = [];
276
+ lines.push(`Auto-emitted by \`slowcook sift\` (${args.cliVersion}) for bug profile \`${args.bugId}\`.`);
277
+ lines.push("");
278
+ lines.push(`Closes related: ${args.profile.source_issue}`);
279
+ lines.push("");
280
+ lines.push("## Result");
281
+ lines.push(`- **${args.result.green ? "Regression GREEN" : "Halted: " + (args.result.haltReason ?? "(unknown)")}**`);
282
+ lines.push(`- Iterations: ${args.result.iterations}`);
283
+ lines.push(`- Spend: $${args.result.spendUsd.toFixed(4)}`);
284
+ lines.push(`- Files: ${args.result.filesTouched.map((f) => "`" + f + "`").join(", ") || "(none)"}`);
285
+ lines.push("");
286
+ lines.push("## Bug profile (summary)");
287
+ lines.push(`**Symptom:** ${args.profile.symptom.join(" / ")}`);
288
+ lines.push("");
289
+ lines.push(`**Failure locus:** \`${args.profile.failure_locus.file}\`${args.profile.failure_locus.line ? `:${args.profile.failure_locus.line}` : ""}`);
290
+ lines.push(`> ${args.profile.failure_locus.diagnosis.split("\n").join("\n> ")}`);
291
+ lines.push("");
292
+ lines.push("## Verification");
293
+ lines.push(`Sift's ratchet ran the regression test (\`tests/regression/${args.bugId}-*.test.ts\`) after each iteration; ` +
294
+ `it ${args.result.green ? "passed on iteration " + args.result.iterations : "remained red — see haltReason"}.`);
295
+ return lines.join("\n");
296
+ }
297
+ /**
298
+ * Find the regression test file for a bug. Looks for
299
+ * `tests/regression/B-N-<slug>.test.ts` (matching what
300
+ * recipe --regression emits).
301
+ */
302
+ export function findRegressionTestForBug(repoRoot, bugId) {
303
+ const dir = join(repoRoot, "tests/regression");
304
+ if (!existsSync(dir))
305
+ return null;
306
+ const prefix = `${bugId}-`;
307
+ for (const entry of readdirSync(dir)) {
308
+ if (entry.startsWith(prefix) && entry.endsWith(".test.ts")) {
309
+ return `tests/regression/${entry}`;
310
+ }
311
+ }
312
+ return null;
313
+ }
314
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/sift/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Re-export shim — see investigate/prompts.ts for the rationale.
3
+ * Source of truth: `@slowcook-ai/llm-anthropic/prompts/sift`.
4
+ */
5
+ export { SIFT_SYSTEM, SIFT_TOOLS, buildSiftTurnPrompt, type SiftTurnPromptArgs, } from "@slowcook-ai/llm-anthropic";
6
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/sift/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Re-export shim — see investigate/prompts.ts for the rationale.
3
+ * Source of truth: `@slowcook-ai/llm-anthropic/prompts/sift`.
4
+ */
5
+ export { SIFT_SYSTEM, SIFT_TOOLS, buildSiftTurnPrompt, } from "@slowcook-ai/llm-anthropic";
6
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/sift/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,UAAU,EACV,mBAAmB,GAEpB,MAAM,4BAA4B,CAAC"}
@@ -1,16 +1,6 @@
1
1
  /**
2
- * System prompt for the test-gen agent (Phase B2, as of 0.7.0).
3
- *
4
- * Turns a frozen spec YAML into a **bundle**: one tier-1 integration test
5
- * file plus any missing route stubs (so vitest can collect the tests) and
6
- * any missing mock helpers (so the tests have intent-level fakes to call).
7
- * Output is multi-artifact via XML-tagged blocks; slowcook parses each
8
- * block, writes the files, and skips anything that already exists.
9
- *
10
- * Before B2, consumers had to hand-author stubs + helpers (the story-005
11
- * manual intervention on rewo). B2 automates both so an issue can flow
12
- * refine → spec → testgen → brew with zero human touchpoints between
13
- * "merge tests PR" and "review implementation PR."
2
+ * Re-export shim see investigate/prompts.ts for the rationale.
3
+ * Source of truth: `@slowcook-ai/llm-anthropic/prompts/testgen`.
14
4
  */
15
- export declare const TESTGEN_SYSTEM: (projectContext: string) => string;
5
+ export { TESTGEN_SYSTEM } from "@slowcook-ai/llm-anthropic";
16
6
  //# sourceMappingURL=prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/testgen/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,cAAc,GAAI,gBAAgB,MAAM,WAmXuM,CAAC"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/testgen/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}