@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
package/dist/cli.js CHANGED
@@ -12,6 +12,8 @@ import { onBrewMerged } from "./commands/on-brew-merged/index.js";
12
12
  import { testgen } from "./commands/testgen/index.js";
13
13
  import { investigate } from "./commands/investigate/index.js";
14
14
  import { recipeRegression } from "./commands/recipe-regression/index.js";
15
+ import { sift } from "./commands/sift/index.js";
16
+ import { chef } from "./commands/chef/index.js";
15
17
  import { catchup } from "./commands/catchup/index.js";
16
18
  import { brew } from "./commands/brew/index.js";
17
19
  import { map } from "./commands/map/index.js";
@@ -64,6 +66,8 @@ Commands available in ${VERSION}:
64
66
  on-brew-merged Post final "shipped" audit-trail comment after a brew PR merges.
65
67
  recipe Generate Vitest tests from merged specs (a "recipe" — the test contract brew follows). Aliases: testgen.
66
68
  investigate (alpha.2a, scaffold) Diagnose a bug from a GitHub issue and emit a bug-profile.
69
+ sift (alpha.4) Narrow red→green ratchet for a bug fix; bounded by bug-profile fix_scope.
70
+ chef (alpha.5c) Pipeline orchestrator — classify PR failure, dispatch retry / escalate.
67
71
  catchup Detect + run pipeline steps that should have triggered but didn't.
68
72
  brew Ratcheted implementation loop: flip red tests to green for one story.
69
73
  map Generate / check the repo-wide code map (APIs, pages, components, helpers, types).
@@ -122,6 +126,18 @@ async function main() {
122
126
  // real LLM agent in alpha.2b. See docs/plans/0.13-bug-flow-and-chef.md.
123
127
  await investigate(args.slice(1), VERSION);
124
128
  return;
129
+ case "sift":
130
+ // 0.13.0-alpha.4 — bug-flow analogue of brew. Narrow red→green
131
+ // ratchet bounded by the bug-profile's fix_scope. Default budget
132
+ // $0.50 / 3 iterations; Sonnet model.
133
+ await sift(args.slice(1), VERSION);
134
+ return;
135
+ case "chef":
136
+ // 0.13.0-alpha.5c — pipeline orchestrator. Watches a single
137
+ // slowcook-bot PR, classifies its failure mode, and acts (rebase
138
+ // / dispatch retry / external-comment / escalate).
139
+ await chef(args.slice(1), VERSION);
140
+ return;
125
141
  case "catchup":
126
142
  await catchup(args.slice(1), VERSION);
127
143
  return;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Chef's failure classifier. Pure function: given the PR head's
3
+ * check status + the merge base's check status, decide what kind of
4
+ * failure this is. Chef's action depends on the class.
5
+ *
6
+ * Four classes (matches `docs/plans/0.13-bug-flow-and-chef.md`):
7
+ *
8
+ * • self-conflict — head doesn't fast-forward against base; needs
9
+ * rebase. (Chef rebases + auto-resolves
10
+ * append-only files; halts on substantive conflicts.)
11
+ * • self-fail — failure is on PR head but absent from base.
12
+ * Caused by the PR's own diff. Chef dispatches a
13
+ * retry of the originating agent.
14
+ * • external-fail — same failure exists on base. Pre-existing red
15
+ * that's not the PR's responsibility. Chef posts
16
+ * a diagnostic comment + escalates to operator.
17
+ * • infra-fail — workflow/runner error, npm registry hiccup,
18
+ * OOM. Chef re-runs the workflow once; if still
19
+ * failing, escalate.
20
+ */
21
+ export interface CheckStatus {
22
+ /** Stable identifier for the check (workflow + job name). */
23
+ name: string;
24
+ /** "success" | "failure" | "cancelled" | "skipped" | "neutral" | other. */
25
+ conclusion: string;
26
+ /** Optional payload for infra detection (rare workflow errors). */
27
+ message?: string;
28
+ }
29
+ export type FailureClass = {
30
+ kind: "self-conflict";
31
+ reason: "branch-not-up-to-date" | "merge-conflict";
32
+ } | {
33
+ kind: "self-fail";
34
+ failingChecks: string[];
35
+ } | {
36
+ kind: "external-fail";
37
+ failingChecks: string[];
38
+ } | {
39
+ kind: "infra-fail";
40
+ failingChecks: string[];
41
+ } | {
42
+ kind: "no-failure";
43
+ };
44
+ export interface ClassifyInput {
45
+ /** All checks on the PR head's most recent commit. */
46
+ headChecks: CheckStatus[];
47
+ /** All checks on the merge-base commit. Empty array if unavailable. */
48
+ baseChecks: CheckStatus[];
49
+ /** Whether GitHub reports the PR as out-of-date with main. */
50
+ outOfDate: boolean;
51
+ }
52
+ /**
53
+ * Classify a PR's failure mode. Pure: no I/O, no network. The caller
54
+ * shells out to gh / git to gather inputs and to act on the verdict.
55
+ */
56
+ export declare function classifyPrFailure(input: ClassifyInput): FailureClass;
57
+ /**
58
+ * Map a failing PR (head ref starts with `slowcook/X/...`) to the
59
+ * agent that owns retries. Used by chef when classifying as self-fail
60
+ * to know which workflow to dispatch. Returns null when the head ref
61
+ * doesn't match a known slowcook agent.
62
+ */
63
+ export declare function originatingAgent(headRef: string): SlowcookAgent | null;
64
+ export type SlowcookAgent = "refine" | "recipe" | "brew" | "sift" | "investigate";
65
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/commands/chef/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,uBAAuB,GAAG,gBAAgB,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3B,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,uEAAuE;IACvE,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,YAAY,CA6CpE;AAwBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQtE;AAED,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,MAAM,GACN,aAAa,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Chef's failure classifier. Pure function: given the PR head's
3
+ * check status + the merge base's check status, decide what kind of
4
+ * failure this is. Chef's action depends on the class.
5
+ *
6
+ * Four classes (matches `docs/plans/0.13-bug-flow-and-chef.md`):
7
+ *
8
+ * • self-conflict — head doesn't fast-forward against base; needs
9
+ * rebase. (Chef rebases + auto-resolves
10
+ * append-only files; halts on substantive conflicts.)
11
+ * • self-fail — failure is on PR head but absent from base.
12
+ * Caused by the PR's own diff. Chef dispatches a
13
+ * retry of the originating agent.
14
+ * • external-fail — same failure exists on base. Pre-existing red
15
+ * that's not the PR's responsibility. Chef posts
16
+ * a diagnostic comment + escalates to operator.
17
+ * • infra-fail — workflow/runner error, npm registry hiccup,
18
+ * OOM. Chef re-runs the workflow once; if still
19
+ * failing, escalate.
20
+ */
21
+ /**
22
+ * Classify a PR's failure mode. Pure: no I/O, no network. The caller
23
+ * shells out to gh / git to gather inputs and to act on the verdict.
24
+ */
25
+ export function classifyPrFailure(input) {
26
+ // out-of-date branch → conflict candidate. Rebase before anything
27
+ // else; the rebase itself surfaces actual content conflicts (handled
28
+ // by the caller, not classify).
29
+ if (input.outOfDate) {
30
+ return { kind: "self-conflict", reason: "branch-not-up-to-date" };
31
+ }
32
+ const headFailing = input.headChecks.filter((c) => isFailureConclusion(c.conclusion));
33
+ if (headFailing.length === 0) {
34
+ return { kind: "no-failure" };
35
+ }
36
+ // Infra errors first — they're separate from self/external because
37
+ // re-running the same job sometimes fixes them.
38
+ const infra = headFailing.filter(isInfraFailure);
39
+ if (infra.length > 0 && infra.length === headFailing.length) {
40
+ return {
41
+ kind: "infra-fail",
42
+ failingChecks: headFailing.map((c) => c.name),
43
+ };
44
+ }
45
+ // Self vs external: a check is "external" if the same-named check
46
+ // also fails on the merge base. If ALL failing checks are external,
47
+ // the PR didn't introduce any of them.
48
+ const baseFailingNames = new Set(input.baseChecks
49
+ .filter((c) => isFailureConclusion(c.conclusion))
50
+ .map((c) => c.name));
51
+ const newFailures = headFailing.filter((c) => !baseFailingNames.has(c.name));
52
+ if (newFailures.length === 0) {
53
+ return {
54
+ kind: "external-fail",
55
+ failingChecks: headFailing.map((c) => c.name),
56
+ };
57
+ }
58
+ return {
59
+ kind: "self-fail",
60
+ failingChecks: newFailures.map((c) => c.name),
61
+ };
62
+ }
63
+ function isFailureConclusion(c) {
64
+ // GitHub's check conclusions: success, failure, neutral, cancelled,
65
+ // timed_out, action_required, skipped, stale.
66
+ // Failure = needs chef attention.
67
+ return c === "failure" || c === "timed_out" || c === "action_required";
68
+ }
69
+ function isInfraFailure(c) {
70
+ if (c.conclusion === "timed_out")
71
+ return true;
72
+ if (!c.message)
73
+ return false;
74
+ // Heuristics — runner crashes, npm registry hiccups, network errors.
75
+ const m = c.message.toLowerCase();
76
+ return (m.includes("the runner has received a shutdown signal") ||
77
+ m.includes("network is unreachable") ||
78
+ m.includes("eai_again") ||
79
+ m.includes("connect etimedout") ||
80
+ m.includes("out of memory") ||
81
+ m.includes("oomkill"));
82
+ }
83
+ /**
84
+ * Map a failing PR (head ref starts with `slowcook/X/...`) to the
85
+ * agent that owns retries. Used by chef when classifying as self-fail
86
+ * to know which workflow to dispatch. Returns null when the head ref
87
+ * doesn't match a known slowcook agent.
88
+ */
89
+ export function originatingAgent(headRef) {
90
+ if (headRef.startsWith("slowcook/spec/"))
91
+ return "refine";
92
+ if (headRef.startsWith("slowcook/tests/") || headRef.startsWith("slowcook/recipe/"))
93
+ return "recipe";
94
+ if (headRef.startsWith("slowcook/brew/"))
95
+ return "brew";
96
+ if (headRef.startsWith("slowcook/sift/"))
97
+ return "sift";
98
+ if (headRef.startsWith("slowcook/bug-profile/"))
99
+ return "investigate";
100
+ return null;
101
+ }
102
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/commands/chef/classify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `slowcook chef --pr <num>` — pipeline orchestrator.
3
+ *
4
+ * Watches a single slowcook-bot PR. Classifies its failure (or
5
+ * non-failure) and acts on the verdict:
6
+ *
7
+ * self-conflict → rebase against main (fast-forward / structural-only)
8
+ * self-fail → workflow_dispatch the originating agent's retry workflow
9
+ * external-fail → post a diagnostic comment, add `chef:escalate` label
10
+ * infra-fail → re-run the workflow once; escalate if still failing
11
+ * no-failure → no-op
12
+ *
13
+ * Loop protection: chef counts its own prior comments on the PR.
14
+ * After 3, refuses to act regardless of class — escalates instead.
15
+ *
16
+ * **Status: alpha.5c**. Dispatch logic implemented; the rebase
17
+ * substep + auto-resolve of structural conflicts (specs/_index.yaml
18
+ * etc.) is alpha.5c.1. For now self-conflict prints the rebase
19
+ * command + escalates rather than running it.
20
+ */
21
+ export declare function chef(argv: string[], cliVersion: string): Promise<void>;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/chef/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAqFH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4G5E"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * `slowcook chef --pr <num>` — pipeline orchestrator.
3
+ *
4
+ * Watches a single slowcook-bot PR. Classifies its failure (or
5
+ * non-failure) and acts on the verdict:
6
+ *
7
+ * self-conflict → rebase against main (fast-forward / structural-only)
8
+ * self-fail → workflow_dispatch the originating agent's retry workflow
9
+ * external-fail → post a diagnostic comment, add `chef:escalate` label
10
+ * infra-fail → re-run the workflow once; escalate if still failing
11
+ * no-failure → no-op
12
+ *
13
+ * Loop protection: chef counts its own prior comments on the PR.
14
+ * After 3, refuses to act regardless of class — escalates instead.
15
+ *
16
+ * **Status: alpha.5c**. Dispatch logic implemented; the rebase
17
+ * substep + auto-resolve of structural conflicts (specs/_index.yaml
18
+ * etc.) is alpha.5c.1. For now self-conflict prints the rebase
19
+ * command + escalates rather than running it.
20
+ */
21
+ import { execSync } from "node:child_process";
22
+ import { GitHubAdapter } from "@slowcook-ai/forge-github";
23
+ import { classifyPrFailure, originatingAgent, } from "./classify.js";
24
+ function parseArgs(argv) {
25
+ const args = {
26
+ prNumber: 0,
27
+ repoRoot: process.cwd(),
28
+ dryRun: false,
29
+ retryCap: 3,
30
+ };
31
+ for (let i = 0; i < argv.length; i++) {
32
+ const arg = argv[i];
33
+ const next = argv[i + 1];
34
+ if (arg === "--pr" && next) {
35
+ args.prNumber = parseInt(next, 10);
36
+ i++;
37
+ }
38
+ else if (arg === "--cwd" && next) {
39
+ args.repoRoot = next;
40
+ i++;
41
+ }
42
+ else if (arg === "--owner" && next) {
43
+ args.owner = next;
44
+ i++;
45
+ }
46
+ else if (arg === "--repo" && next) {
47
+ args.repo = next;
48
+ i++;
49
+ }
50
+ else if (arg === "--dry-run") {
51
+ args.dryRun = true;
52
+ }
53
+ else if (arg === "--retry-cap" && next) {
54
+ args.retryCap = parseInt(next, 10);
55
+ i++;
56
+ }
57
+ else if (arg === "--help" || arg === "-h") {
58
+ printHelp();
59
+ process.exit(0);
60
+ }
61
+ }
62
+ return args;
63
+ }
64
+ function printHelp() {
65
+ console.log(`
66
+ slowcook chef — pipeline orchestrator (PR-failure handler)
67
+
68
+ Watches a single slowcook-bot PR and acts on the verdict:
69
+ self-conflict → rebase
70
+ self-fail → dispatch retry to originating agent's workflow
71
+ external-fail → diagnostic comment + chef:escalate label
72
+ infra-fail → re-run workflow once; escalate if still failing
73
+ no-failure → no-op
74
+
75
+ Usage:
76
+ slowcook chef --pr <number> [options]
77
+
78
+ Options:
79
+ --pr <n> PR number to process (required).
80
+ --cwd <path> Repo root (default: cwd).
81
+ --owner <login> Override git-remote auto-detect.
82
+ --repo <name> Override git-remote auto-detect.
83
+ --dry-run Print classification + plan; don't act.
84
+ --retry-cap <n> Max prior chef-bot comments before escalating
85
+ instead of acting (default: 3).
86
+
87
+ Environment:
88
+ GITHUB_TOKEN (required) — write access for comments + dispatches.
89
+ `);
90
+ }
91
+ export async function chef(argv, cliVersion) {
92
+ const args = parseArgs(argv);
93
+ if (!args.prNumber) {
94
+ console.error("slowcook chef: --pr <number> is required");
95
+ printHelp();
96
+ process.exit(64);
97
+ }
98
+ const githubToken = process.env["GITHUB_TOKEN"];
99
+ if (!githubToken) {
100
+ console.error("slowcook chef: GITHUB_TOKEN is required");
101
+ process.exit(78);
102
+ }
103
+ const detected = detectOwnerRepo(args.repoRoot);
104
+ const owner = args.owner ?? detected?.owner;
105
+ const repo = args.repo ?? detected?.repo;
106
+ if (!owner || !repo) {
107
+ console.error("slowcook chef: could not detect owner/repo from git remote");
108
+ process.exit(2);
109
+ }
110
+ const forge = new GitHubAdapter({ owner, repo, token: githubToken });
111
+ // Fetch PR metadata via gh (cheaper than the full forge adapter
112
+ // path; the few fields chef needs aren't all on PullRequestSummary).
113
+ const prMeta = await fetchPrMeta(args.repoRoot, args.prNumber);
114
+ if (!prMeta) {
115
+ console.error(`slowcook chef: PR #${args.prNumber} not found`);
116
+ process.exit(2);
117
+ }
118
+ // Only act on slowcook-bot PRs (head ref starts with `slowcook/`).
119
+ // External PRs (human-authored) aren't our problem.
120
+ if (!prMeta.headRef.startsWith("slowcook/")) {
121
+ console.error(`slowcook chef: PR #${args.prNumber} head ref '${prMeta.headRef}' isn't a slowcook-bot branch — skipping.`);
122
+ process.exit(0);
123
+ }
124
+ // Loop protection — count chef-bot's own prior comments.
125
+ const priorChefComments = await countChefComments(args.repoRoot, args.prNumber);
126
+ if (priorChefComments >= args.retryCap) {
127
+ console.error(`slowcook chef: retry cap reached (${priorChefComments} prior chef comments ≥ ${args.retryCap}). Escalating.`);
128
+ if (!args.dryRun) {
129
+ await postEscalation(forge, args.prNumber, cliVersion, priorChefComments);
130
+ }
131
+ process.exit(0);
132
+ }
133
+ // Gather classification inputs.
134
+ const headChecks = await fetchChecks(args.repoRoot, args.prNumber, "head");
135
+ const baseChecks = await fetchChecks(args.repoRoot, args.prNumber, "base");
136
+ const verdict = classifyPrFailure({
137
+ headChecks,
138
+ baseChecks,
139
+ outOfDate: prMeta.outOfDate,
140
+ });
141
+ console.error(`chef · PR #${args.prNumber} (${prMeta.headRef}) → ${describeVerdict(verdict)}`);
142
+ if (args.dryRun) {
143
+ console.error("(dry-run: not acting)");
144
+ process.exit(0);
145
+ }
146
+ // Act on the verdict.
147
+ switch (verdict.kind) {
148
+ case "no-failure":
149
+ console.error("Nothing to do.");
150
+ return;
151
+ case "self-conflict":
152
+ // alpha.5c: print the rebase suggestion + escalate.
153
+ // Auto-rebase + structural-conflict resolver lands in alpha.5c.1.
154
+ await postEscalation(forge, args.prNumber, cliVersion, priorChefComments, `Branch is out of date with main (rebase needed). Auto-rebase isn't enabled in this chef build (alpha.5c) — rebase manually:\n\n\`\`\`\ngit fetch origin\ngit checkout ${prMeta.headRef}\ngit rebase origin/main\ngit push --force-with-lease\n\`\`\``);
155
+ return;
156
+ case "self-fail":
157
+ await dispatchRetry(forge, args.prNumber, prMeta.headRef, verdict.failingChecks, cliVersion);
158
+ return;
159
+ case "external-fail":
160
+ await postExternalDiagnostic(forge, args.prNumber, cliVersion, verdict.failingChecks, priorChefComments);
161
+ return;
162
+ case "infra-fail":
163
+ await postEscalation(forge, args.prNumber, cliVersion, priorChefComments, `Workflow infra failure (${verdict.failingChecks.join(", ")}). Re-run via the GitHub Actions UI or 'gh run rerun'. Auto-rerun isn't enabled in this chef build.`);
164
+ return;
165
+ }
166
+ }
167
+ function describeVerdict(v) {
168
+ switch (v.kind) {
169
+ case "no-failure":
170
+ return "no failure";
171
+ case "self-conflict":
172
+ return `self-conflict (${v.reason})`;
173
+ case "self-fail":
174
+ return `self-fail (${v.failingChecks.join(", ")})`;
175
+ case "external-fail":
176
+ return `external-fail (${v.failingChecks.join(", ")} — also red on base)`;
177
+ case "infra-fail":
178
+ return `infra-fail (${v.failingChecks.join(", ")})`;
179
+ }
180
+ }
181
+ async function fetchPrMeta(repoRoot, prNumber) {
182
+ try {
183
+ const out = execSync(`gh pr view ${prNumber} --json headRefName,mergeStateStatus`, { cwd: repoRoot, encoding: "utf8" });
184
+ const obj = JSON.parse(out);
185
+ return {
186
+ headRef: obj.headRefName,
187
+ // gh's mergeStateStatus = BEHIND when the PR head is older than
188
+ // its base; that's our "needs rebase" signal. DIRTY = merge
189
+ // conflict. Both should trigger the self-conflict path.
190
+ outOfDate: obj.mergeStateStatus === "BEHIND" || obj.mergeStateStatus === "DIRTY",
191
+ };
192
+ }
193
+ catch {
194
+ return null;
195
+ }
196
+ }
197
+ async function fetchChecks(repoRoot, prNumber, ref) {
198
+ // gh's pr view returns statusCheckRollup for HEAD only. For base
199
+ // we need to find the merge-base SHA + query its check-runs.
200
+ if (ref === "head") {
201
+ try {
202
+ const out = execSync(`gh pr view ${prNumber} --json statusCheckRollup --jq '.statusCheckRollup'`, { cwd: repoRoot, encoding: "utf8", maxBuffer: 1024 * 256 });
203
+ const arr = JSON.parse(out || "[]");
204
+ return arr
205
+ .filter((c) => c.name && c.conclusion !== undefined)
206
+ .map((c) => ({
207
+ name: c.name ?? "",
208
+ conclusion: (c.conclusion ?? "").toLowerCase(),
209
+ }));
210
+ }
211
+ catch {
212
+ return [];
213
+ }
214
+ }
215
+ // base: get the PR's base ref + grab its latest check-run rollup.
216
+ try {
217
+ const baseRef = execSync(`gh pr view ${prNumber} --json baseRefName --jq '.baseRefName'`, { cwd: repoRoot, encoding: "utf8" }).trim();
218
+ const sha = execSync(`git rev-parse origin/${baseRef}`, {
219
+ cwd: repoRoot,
220
+ encoding: "utf8",
221
+ }).trim();
222
+ const out = execSync(`gh api "repos/{owner}/{repo}/commits/${sha}/check-runs" --jq '.check_runs'`, { cwd: repoRoot, encoding: "utf8" });
223
+ const arr = JSON.parse(out || "[]");
224
+ return arr
225
+ .filter((c) => c.name && c.conclusion)
226
+ .map((c) => ({
227
+ name: c.name ?? "",
228
+ conclusion: (c.conclusion ?? "").toLowerCase(),
229
+ }));
230
+ }
231
+ catch {
232
+ return [];
233
+ }
234
+ }
235
+ async function countChefComments(repoRoot, prNumber) {
236
+ try {
237
+ const out = execSync(`gh pr view ${prNumber} --json comments --jq '.comments'`, { cwd: repoRoot, encoding: "utf8", maxBuffer: 1024 * 1024 });
238
+ const arr = JSON.parse(out || "[]");
239
+ return arr.filter((c) => (c.body ?? "").startsWith("### slowcook · chef")).length;
240
+ }
241
+ catch {
242
+ return 0;
243
+ }
244
+ }
245
+ async function postEscalation(forge, prNumber, cliVersion, priorComments, detail = "Multiple retries didn't resolve the failure. Operator action needed.") {
246
+ const body = `### slowcook · chef ⚠️ escalate\n\n${detail}\n\n` +
247
+ `<sub>chef ${cliVersion} · prior chef-comments on this PR: ${priorComments}</sub>`;
248
+ await forge.createIssueComment(prNumber, body);
249
+ }
250
+ async function postExternalDiagnostic(forge, prNumber, cliVersion, failingChecks, priorComments) {
251
+ const body = `### slowcook · chef · external-failure\n\n` +
252
+ `The following check(s) are failing on this PR but are also failing on the merge base:\n\n` +
253
+ failingChecks.map((c) => `- \`${c}\``).join("\n") +
254
+ `\n\nThe PR's diff didn't introduce these — they're pre-existing. Chef won't iterate. Operator: admin-merge if appropriate, or fix the underlying on a separate PR.\n\n` +
255
+ `<sub>chef ${cliVersion} · prior chef-comments: ${priorComments}</sub>`;
256
+ await forge.createIssueComment(prNumber, body);
257
+ }
258
+ async function dispatchRetry(forge, prNumber, headRef, failingChecks, cliVersion) {
259
+ const agent = originatingAgent(headRef);
260
+ if (!agent) {
261
+ await postEscalation(forge, prNumber, cliVersion, 0, `Self-fail detected but originating agent is unknown for head ref '${headRef}'. No retry dispatched.`);
262
+ return;
263
+ }
264
+ const body = `### slowcook · chef · self-failure (dispatch pending)\n\n` +
265
+ `Failing checks introduced by this PR:\n\n` +
266
+ failingChecks.map((c) => `- \`${c}\``).join("\n") +
267
+ `\n\nWould dispatch retry to the **${agent}** workflow. Auto-dispatch isn't wired up in chef alpha.5c — operator: rerun the failing job(s) manually via the GitHub Actions UI or 'gh run rerun'.\n\n` +
268
+ `<sub>chef ${cliVersion} · alpha.5c</sub>`;
269
+ await forge.createIssueComment(prNumber, body);
270
+ }
271
+ function detectOwnerRepo(repoRoot) {
272
+ try {
273
+ const url = execSync("git remote get-url origin", {
274
+ cwd: repoRoot,
275
+ encoding: "utf8",
276
+ stdio: ["ignore", "pipe", "ignore"],
277
+ }).trim();
278
+ const m = url.match(/github\.com[:/]([^/]+)\/([^/.]+)(?:\.git)?$/);
279
+ if (m && m[1] && m[2])
280
+ return { owner: m[1], repo: m[2] };
281
+ }
282
+ catch {
283
+ /* not a git repo */
284
+ }
285
+ return null;
286
+ }
287
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/chef/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/investigate/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAsBH,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,kEAAkE;QAClE,aAAa,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC;IACpB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAkF5B;AAuID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,kBAAkB,GACtB,UAAU,CA6BZ;AA4BD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4GpE"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/investigate/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAsBH,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,kEAAkE;QAClE,aAAa,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC;IACpB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;IAChB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CA+G5B;AAuID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,kBAAkB,GACtB,UAAU,CAoCZ;AAgCD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4GpE"}
@@ -76,6 +76,34 @@ export async function runInvestigation(ctx) {
76
76
  // Otherwise we're done — parse the final text for `<bug_profile>` or `<halt>`.
77
77
  break;
78
78
  }
79
+ // 0.13.0-alpha.2c — format-compliance retry. If the agent stopped
80
+ // without emitting either tag, the model produced free-form prose.
81
+ // Send one explicit nudge to wrap the output, then accept whatever
82
+ // tag form lands in the second response. Reduces the "Opus
83
+ // forgets to wrap" failure mode observed on the first live run
84
+ // (rewo issue #135 validation, 2026-04-25).
85
+ if (!hasBugProfileBlock(finalText) && !parseHaltBlock(finalText)) {
86
+ rounds += 1;
87
+ messages.push({ role: "assistant", content: finalText });
88
+ messages.push({
89
+ role: "user",
90
+ content: "Your previous reply was free-form prose. Slowcook's parser greps for `<bug_profile>...</bug_profile>` (or `<halt>...</halt>`) literally. Re-emit your conclusion now using one of those two wrappers — nothing else will parse. Pick one:\n\n" +
91
+ "- `<bug_profile>` block with the schema fields if you have a concrete failure locus.\n" +
92
+ "- `<halt>` block with a one-line description of what you couldn't disambiguate.\n",
93
+ });
94
+ const retry = await anthropic.messages.create({
95
+ model: ctx.model,
96
+ max_tokens: 4096,
97
+ system: INVESTIGATE_SYSTEM,
98
+ tools: INVESTIGATE_TOOLS,
99
+ messages,
100
+ });
101
+ spendUsd += costUsd(retry, ctx.model);
102
+ for (const block of retry.content) {
103
+ if (block.type === "text")
104
+ finalText = block.text;
105
+ }
106
+ }
79
107
  const halted = parseHaltBlock(finalText);
80
108
  if (halted) {
81
109
  return {
@@ -250,7 +278,14 @@ export function parseBugProfileBlock(finalText, ctx) {
250
278
  profile["schema_version"] = BUG_PROFILE_SCHEMA_VERSION;
251
279
  const validation = validateBugProfile(profile);
252
280
  if (!validation.ok) {
253
- throw new Error(`investigate: agent emitted an invalid bug-profile:\n ${validation.errors.join("\n ")}`);
281
+ // Include the raw YAML + parsed object so the operator can see
282
+ // exactly what the agent emitted vs what the schema expected.
283
+ // 0.13.0-alpha.3.2 — debug-friendly error shape.
284
+ throw new Error(`investigate: agent emitted an invalid bug-profile:\n` +
285
+ ` ${validation.errors.join("\n ")}\n\n` +
286
+ `Raw YAML the agent emitted:\n` +
287
+ `------------\n${yaml}\n------------\n\n` +
288
+ `Parsed object: ${JSON.stringify(profile, null, 2)}`);
254
289
  }
255
290
  return validation.profile;
256
291
  }
@@ -258,6 +293,9 @@ function parseHaltBlock(text) {
258
293
  const m = text.match(/<halt>([\s\S]*?)<\/halt>/);
259
294
  return m ? (m[1] ?? "").trim() : null;
260
295
  }
296
+ function hasBugProfileBlock(text) {
297
+ return /<bug_profile>[\s\S]*?<\/bug_profile>/.test(text);
298
+ }
261
299
  function stubHaltProfile(ctx, reason) {
262
300
  return {
263
301
  schema_version: BUG_PROFILE_SCHEMA_VERSION,