@tokenfactory/acc-runner 0.8.1 → 0.11.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/README.md +175 -69
- package/dist/cli.js +42 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +22 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +89 -3
- package/dist/config.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +35 -1
- package/dist/doctor.js.map +1 -1
- package/dist/failure-classifier.d.ts +33 -0
- package/dist/failure-classifier.d.ts.map +1 -0
- package/dist/failure-classifier.js +128 -0
- package/dist/failure-classifier.js.map +1 -0
- package/dist/runtime/conflict-resolver.d.ts +65 -0
- package/dist/runtime/conflict-resolver.d.ts.map +1 -0
- package/dist/runtime/conflict-resolver.js +477 -0
- package/dist/runtime/conflict-resolver.js.map +1 -0
- package/dist/runtime/quarantine.d.ts +16 -0
- package/dist/runtime/quarantine.d.ts.map +1 -0
- package/dist/runtime/quarantine.js +50 -0
- package/dist/runtime/quarantine.js.map +1 -0
- package/dist/runtime/reviewer.d.ts +4 -0
- package/dist/runtime/reviewer.d.ts.map +1 -1
- package/dist/runtime/reviewer.js +102 -30
- package/dist/runtime/reviewer.js.map +1 -1
- package/dist/runtime/worktree.d.ts +11 -0
- package/dist/runtime/worktree.d.ts.map +1 -1
- package/dist/runtime/worktree.js +11 -5
- package/dist/runtime/worktree.js.map +1 -1
- package/dist/task-runner.d.ts +15 -0
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +198 -9
- package/dist/task-runner.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/watch.d.ts +13 -0
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +198 -38
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.48 T-48-5: Autonomous conflict-resolution runner path.
|
|
3
|
+
*
|
|
4
|
+
* Called from task-runner.ts when it detects task.type === 'conflict_resolution'.
|
|
5
|
+
* Resolves conflicts on the real base∩head file set (two compare calls so only
|
|
6
|
+
* files changed on BOTH sides are treated as conflicted — the #412 class fix),
|
|
7
|
+
* pushes the resolution to the PR head branch via `gh api`, and escalates to
|
|
8
|
+
* conflict_unresolvable after ≤3 attempts.
|
|
9
|
+
*
|
|
10
|
+
* Policy gate: org_settings.conflict_policy.enabled === false → skip (detect-and-skip mode).
|
|
11
|
+
* Retry bound: after 3 failed conflict_resolution tasks for the same PR, the runner
|
|
12
|
+
* escalates by setting block_reason='conflict_unresolvable' and transitioning to 'done'.
|
|
13
|
+
*/
|
|
14
|
+
import { execa } from "execa";
|
|
15
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
16
|
+
// Constants
|
|
17
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
18
|
+
export const MAX_CONFLICT_ATTEMPTS = 3;
|
|
19
|
+
// Sentinel that Sweep C embeds in task descriptions so the runner knows
|
|
20
|
+
// which PR to target and which branches to compare.
|
|
21
|
+
const META_RE = /<!--\s*acc-conflict:\s*(\{[^}]*\})\s*-->/;
|
|
22
|
+
const PLANNING_RE = /^planning\/V0_\d+(_[A-Z_]+)?\.md$/;
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
// Metadata parsing
|
|
25
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Extract conflict metadata from the task description.
|
|
28
|
+
* Sweep C embeds: <!-- acc-conflict: {"pr_number":N,"repo":"owner/repo","head_ref":"...","base_ref":"..."} -->
|
|
29
|
+
*
|
|
30
|
+
* Fallback: accept a plain JSON description (used in tests and by early
|
|
31
|
+
* versions of Sweep C that didn't wrap in an HTML comment).
|
|
32
|
+
*/
|
|
33
|
+
export function parseConflictMeta(description, fallback) {
|
|
34
|
+
if (description) {
|
|
35
|
+
const match = META_RE.exec(description);
|
|
36
|
+
if (match) {
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(match[1]);
|
|
39
|
+
if (typeof parsed.pr_number === "number" &&
|
|
40
|
+
typeof parsed.repo === "string" &&
|
|
41
|
+
typeof parsed.head_ref === "string" &&
|
|
42
|
+
typeof parsed.base_ref === "string") {
|
|
43
|
+
return parsed;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// fall through to plain-JSON attempt
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Plain JSON fallback (test convenience + early Sweep C format).
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(description);
|
|
53
|
+
if (typeof parsed.pr_number === "number" &&
|
|
54
|
+
typeof parsed.repo === "string" &&
|
|
55
|
+
typeof parsed.head_ref === "string" &&
|
|
56
|
+
typeof parsed.base_ref === "string") {
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// fall through
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Last resort: reconstruct from task fields when description has no JSON.
|
|
65
|
+
const prNumber = fallback?.pr_number;
|
|
66
|
+
const repo = fallback?.repo;
|
|
67
|
+
if (typeof prNumber === "number" && typeof repo === "string" && repo.includes("/")) {
|
|
68
|
+
return {
|
|
69
|
+
pr_number: prNumber,
|
|
70
|
+
repo,
|
|
71
|
+
// head_ref is not available from the task row alone; caller must provide or
|
|
72
|
+
// we derive it from the PR via the GitHub API at resolution time.
|
|
73
|
+
head_ref: "",
|
|
74
|
+
base_ref: fallback?.integration_branch ?? "acc/integration",
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
80
|
+
// File-class resolution (mirrors api/scheduled/conflict-resolver.ts)
|
|
81
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
82
|
+
export function classifyFile(filename) {
|
|
83
|
+
if (filename === "vercel.json")
|
|
84
|
+
return "vercel.json";
|
|
85
|
+
if (filename === "api/runner/min-version.ts")
|
|
86
|
+
return "min-version";
|
|
87
|
+
if (filename === "packages/acc-runner/package.json")
|
|
88
|
+
return "package-version";
|
|
89
|
+
if (filename.endsWith("CURRENT_CYCLE.md"))
|
|
90
|
+
return "current-cycle";
|
|
91
|
+
return PLANNING_RE.test(filename) ? "planning" : null;
|
|
92
|
+
}
|
|
93
|
+
function cmpSemver(a, b) {
|
|
94
|
+
const parts = (s) => s.split(/[.+-]/).map((x) => Number(x) || 0);
|
|
95
|
+
const [pa, pb] = [parts(a), parts(b)];
|
|
96
|
+
const len = Math.max(pa.length, pb.length);
|
|
97
|
+
for (let i = 0; i < len; i++) {
|
|
98
|
+
if ((pa[i] ?? 0) !== (pb[i] ?? 0))
|
|
99
|
+
return (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
100
|
+
}
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
const CONFLICT_MARKER_RE = /^(<{7}|={7}|>{7})/m;
|
|
104
|
+
export function hasConflictMarkers(...sides) {
|
|
105
|
+
return sides.some((s) => CONFLICT_MARKER_RE.test(s));
|
|
106
|
+
}
|
|
107
|
+
export function mergeVercelCrons(baseStr, headStr) {
|
|
108
|
+
let base, head;
|
|
109
|
+
try {
|
|
110
|
+
base = JSON.parse(baseStr);
|
|
111
|
+
head = JSON.parse(headStr);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
for (const k of new Set([...Object.keys(base), ...Object.keys(head)])) {
|
|
117
|
+
if (k !== "crons" && JSON.stringify(base[k]) !== JSON.stringify(head[k]))
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
121
|
+
const seen = new Set();
|
|
122
|
+
const crons = [...arr(base.crons), ...arr(head.crons)]
|
|
123
|
+
.filter((c) => {
|
|
124
|
+
const p = c?.path;
|
|
125
|
+
return typeof p === "string" && !seen.has(p) && (seen.add(p), true);
|
|
126
|
+
})
|
|
127
|
+
.sort((a, b) => String(a.path ?? "").localeCompare(String(b.path ?? "")));
|
|
128
|
+
return JSON.stringify({ ...head, crons }, null, 2) + "\n";
|
|
129
|
+
}
|
|
130
|
+
export function resolvePlanning(base, head) {
|
|
131
|
+
if (base !== null && head === null)
|
|
132
|
+
return { write: true, content: base };
|
|
133
|
+
if (head !== null && (base === null || base === head))
|
|
134
|
+
return { write: false, content: head };
|
|
135
|
+
if (base !== null && head !== null)
|
|
136
|
+
return { write: true, content: base };
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
export function mergeCurrentCycle(baseStr, headStr) {
|
|
140
|
+
if (hasConflictMarkers(baseStr, headStr))
|
|
141
|
+
return null;
|
|
142
|
+
const headLines = headStr.split("\n");
|
|
143
|
+
const seen = new Set(headLines);
|
|
144
|
+
const additions = baseStr.split("\n").filter((l) => !seen.has(l) && (seen.add(l), true));
|
|
145
|
+
if (additions.length === 0)
|
|
146
|
+
return null;
|
|
147
|
+
return [...headLines, ...additions].join("\n");
|
|
148
|
+
}
|
|
149
|
+
const MIN_VERSION_RE = /(export const MIN_VERSION\s*=\s*")([^"]+)(")/;
|
|
150
|
+
const CURRENT_VERSION_RE = /(export const CURRENT_VERSION\s*=\s*")([^"]+)(")/;
|
|
151
|
+
export function mergeMinVersion(baseStr, headStr) {
|
|
152
|
+
const bMin = MIN_VERSION_RE.exec(baseStr), hMin = MIN_VERSION_RE.exec(headStr);
|
|
153
|
+
const bCur = CURRENT_VERSION_RE.exec(baseStr), hCur = CURRENT_VERSION_RE.exec(headStr);
|
|
154
|
+
if (!bMin || !hMin || !bCur || !hCur)
|
|
155
|
+
return null;
|
|
156
|
+
const setVer = (re, value) => (s) => s.replace(re, (_m, pre, _v, post) => `${pre}${value}${post}`);
|
|
157
|
+
const neutralise = (s) => setVer(CURRENT_VERSION_RE, "@")(setVer(MIN_VERSION_RE, "@")(s));
|
|
158
|
+
if (neutralise(baseStr) !== neutralise(headStr))
|
|
159
|
+
return null;
|
|
160
|
+
const min = cmpSemver(bMin[2], hMin[2]) >= 0 ? bMin[2] : hMin[2];
|
|
161
|
+
const cur = cmpSemver(bCur[2], hCur[2]) >= 0 ? bCur[2] : hCur[2];
|
|
162
|
+
return setVer(CURRENT_VERSION_RE, cur)(setVer(MIN_VERSION_RE, min)(headStr));
|
|
163
|
+
}
|
|
164
|
+
export function mergePackageVersion(baseStr, headStr) {
|
|
165
|
+
let base, head;
|
|
166
|
+
try {
|
|
167
|
+
base = JSON.parse(baseStr);
|
|
168
|
+
head = JSON.parse(headStr);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
const bv = base.version, hv = head.version;
|
|
174
|
+
if (typeof bv !== "string" || typeof hv !== "string")
|
|
175
|
+
return null;
|
|
176
|
+
if (JSON.stringify({ ...base, version: 0 }) !==
|
|
177
|
+
JSON.stringify({ ...head, version: 0 }))
|
|
178
|
+
return null;
|
|
179
|
+
const version = cmpSemver(bv, hv) >= 0 ? bv : hv;
|
|
180
|
+
return JSON.stringify({ ...base, version }, null, 2) + "\n";
|
|
181
|
+
}
|
|
182
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
183
|
+
// GitHub API helpers (gh CLI)
|
|
184
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
185
|
+
async function defaultGhApi(endpoint, opts = {}) {
|
|
186
|
+
const args = ["api", endpoint];
|
|
187
|
+
if (opts.method && opts.method !== "GET") {
|
|
188
|
+
args.push("-X", opts.method);
|
|
189
|
+
}
|
|
190
|
+
if (opts.fields) {
|
|
191
|
+
for (const [k, v] of Object.entries(opts.fields)) {
|
|
192
|
+
args.push("-f", `${k}=${v}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (opts.jq) {
|
|
196
|
+
args.push("--jq", opts.jq);
|
|
197
|
+
}
|
|
198
|
+
const { stdout } = await execa("gh", args, {
|
|
199
|
+
env: process.env,
|
|
200
|
+
reject: false,
|
|
201
|
+
// gh api exits non-zero on 4xx/5xx; capture stdout to parse the error.
|
|
202
|
+
});
|
|
203
|
+
const text = stdout.trim();
|
|
204
|
+
if (!text)
|
|
205
|
+
return null;
|
|
206
|
+
// When --jq returns a simple string, it may not be valid JSON.
|
|
207
|
+
if (opts.jq) {
|
|
208
|
+
try {
|
|
209
|
+
return JSON.parse(text);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return text;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return JSON.parse(text);
|
|
216
|
+
}
|
|
217
|
+
/** Two-call base∩head intersection: files changed on BOTH sides since the merge base. */
|
|
218
|
+
export async function computeConflictSet(repo, baseRef, headRef, ghApi) {
|
|
219
|
+
const [owner, repoName] = repo.split("/");
|
|
220
|
+
const base = `repos/${owner}/${repoName}`;
|
|
221
|
+
// Files changed on head branch since fork (three-dot = relative to merge base)
|
|
222
|
+
const headCompare = await ghApi(`${base}/compare/${encodeURIComponent(baseRef)}...${encodeURIComponent(headRef)}`);
|
|
223
|
+
const headFiles = new Set((headCompare?.files ?? []).map((f) => f.filename));
|
|
224
|
+
// Files changed on base branch since fork
|
|
225
|
+
const baseCompare = await ghApi(`${base}/compare/${encodeURIComponent(headRef)}...${encodeURIComponent(baseRef)}`);
|
|
226
|
+
const baseFiles = (baseCompare?.files ?? []).map((f) => f.filename);
|
|
227
|
+
// Intersection = files both sides changed = truly conflicted
|
|
228
|
+
return baseFiles.filter((f) => headFiles.has(f));
|
|
229
|
+
}
|
|
230
|
+
async function fetchPRDetail(repo, prNumber, ghApi) {
|
|
231
|
+
const [owner, repoName] = repo.split("/");
|
|
232
|
+
const pr = await ghApi(`repos/${owner}/${repoName}/pulls/${prNumber}`);
|
|
233
|
+
return pr;
|
|
234
|
+
}
|
|
235
|
+
async function fetchFileContent(repo, path, ref, ghApi) {
|
|
236
|
+
const [owner, repoName] = repo.split("/");
|
|
237
|
+
try {
|
|
238
|
+
const r = await ghApi(`repos/${owner}/${repoName}/contents/${path}?ref=${encodeURIComponent(ref)}`);
|
|
239
|
+
if (!r || !r.content)
|
|
240
|
+
return null;
|
|
241
|
+
const raw = r.encoding === "base64" || !r.encoding
|
|
242
|
+
? Buffer.from(r.content.replace(/\n/g, ""), "base64").toString("utf8")
|
|
243
|
+
: r.content;
|
|
244
|
+
return { content: raw, sha: r.sha };
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async function putFileContent(repo, path, content, branch, sha, ghApi) {
|
|
251
|
+
const [owner, repoName] = repo.split("/");
|
|
252
|
+
const fields = {
|
|
253
|
+
message: `chore(acc): auto-resolve conflict in ${path} (T-48-5)`,
|
|
254
|
+
content: Buffer.from(content, "utf8").toString("base64"),
|
|
255
|
+
branch,
|
|
256
|
+
};
|
|
257
|
+
if (sha)
|
|
258
|
+
fields.sha = sha;
|
|
259
|
+
await ghApi(`repos/${owner}/${repoName}/contents/${path}`, {
|
|
260
|
+
method: "PUT",
|
|
261
|
+
fields,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
265
|
+
// Policy + retry count helpers
|
|
266
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
267
|
+
async function defaultLoadConflictPolicy(supabase) {
|
|
268
|
+
try {
|
|
269
|
+
// any-allowed: org_settings shape isn't typed in the runner
|
|
270
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
271
|
+
const { data } = await supabase.from("org_settings")
|
|
272
|
+
.select("conflict_policy")
|
|
273
|
+
.limit(1)
|
|
274
|
+
.maybeSingle();
|
|
275
|
+
const row = data;
|
|
276
|
+
// Missing key or null → default to enabled=true (opt-out model).
|
|
277
|
+
if (row?.conflict_policy?.enabled === false)
|
|
278
|
+
return { enabled: false };
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// Network error → assume enabled so the runner still attempts resolution.
|
|
282
|
+
}
|
|
283
|
+
return { enabled: true };
|
|
284
|
+
}
|
|
285
|
+
async function defaultCountPriorAttempts(supabase, prNumber) {
|
|
286
|
+
try {
|
|
287
|
+
// any-allowed: tasks shape isn't fully typed in the runner
|
|
288
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
289
|
+
const { data, error } = await supabase.from("tasks")
|
|
290
|
+
.select("id")
|
|
291
|
+
.eq("type", "conflict_resolution")
|
|
292
|
+
.eq("pr_number", prNumber)
|
|
293
|
+
.eq("status", "failed");
|
|
294
|
+
if (error)
|
|
295
|
+
return 0;
|
|
296
|
+
return (data ?? []).length;
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
return 0;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
303
|
+
// Main resolution entry point
|
|
304
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
305
|
+
/**
|
|
306
|
+
* Attempt to resolve conflicts for the PR referenced in `meta`.
|
|
307
|
+
*
|
|
308
|
+
* Returns a structured outcome that task-runner.ts uses to decide the
|
|
309
|
+
* final task transition (done / failed / escalated).
|
|
310
|
+
*/
|
|
311
|
+
export async function resolveConflict(meta, deps) {
|
|
312
|
+
const ghApi = deps.ghApi ?? defaultGhApi;
|
|
313
|
+
// ── 1. Policy gate ──────────────────────────────────────────────────────────
|
|
314
|
+
const policy = deps.loadConflictPolicy
|
|
315
|
+
? await deps.loadConflictPolicy()
|
|
316
|
+
: await defaultLoadConflictPolicy(deps.supabase);
|
|
317
|
+
if (!policy.enabled) {
|
|
318
|
+
return { action: "policy_disabled", reason: "conflict_policy.enabled=false" };
|
|
319
|
+
}
|
|
320
|
+
// ── 2. Retry bound ──────────────────────────────────────────────────────────
|
|
321
|
+
const priorAttempts = deps.countPriorAttempts
|
|
322
|
+
? await deps.countPriorAttempts(meta.pr_number)
|
|
323
|
+
: await defaultCountPriorAttempts(deps.supabase, meta.pr_number);
|
|
324
|
+
if (priorAttempts >= MAX_CONFLICT_ATTEMPTS) {
|
|
325
|
+
return {
|
|
326
|
+
action: "escalated",
|
|
327
|
+
reason: `max attempts (${MAX_CONFLICT_ATTEMPTS}) reached for PR #${meta.pr_number}`,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
// ── 3. Resolve head_ref from GitHub if not present in meta ──────────────────
|
|
331
|
+
let { head_ref, base_ref } = meta;
|
|
332
|
+
if (!head_ref) {
|
|
333
|
+
try {
|
|
334
|
+
const pr = await fetchPRDetail(meta.repo, meta.pr_number, ghApi);
|
|
335
|
+
head_ref = pr.head.ref;
|
|
336
|
+
base_ref = pr.base.ref;
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
return {
|
|
340
|
+
action: "unresolvable",
|
|
341
|
+
reason: `failed to fetch PR detail: ${err.message?.slice(0, 200)}`,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// ── 4. Compute real conflict set (base∩head) ────────────────────────────────
|
|
346
|
+
let conflictFiles;
|
|
347
|
+
try {
|
|
348
|
+
conflictFiles = await computeConflictSet(meta.repo, base_ref, head_ref, ghApi);
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
return {
|
|
352
|
+
action: "unresolvable",
|
|
353
|
+
reason: `compare API failed: ${err.message?.slice(0, 200)}`,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
if (conflictFiles.length === 0) {
|
|
357
|
+
// PR was already resolved or had no real file overlap — mark as resolved.
|
|
358
|
+
return { action: "resolved", reason: "no conflicted files in base∩head", files_resolved: [] };
|
|
359
|
+
}
|
|
360
|
+
// ── 5. Check every conflicted file is resolvable ────────────────────────────
|
|
361
|
+
const unresolvable = conflictFiles.filter((f) => classifyFile(f) === null);
|
|
362
|
+
if (unresolvable.length > 0) {
|
|
363
|
+
return {
|
|
364
|
+
action: "unresolvable",
|
|
365
|
+
reason: `non-resolvable files in conflict set: ${unresolvable.join(", ")}`,
|
|
366
|
+
files_skipped: unresolvable,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
// ── 6. Fetch content + compute writes ──────────────────────────────────────
|
|
370
|
+
const writes = [];
|
|
371
|
+
const filesResolved = [];
|
|
372
|
+
const filesSkipped = [];
|
|
373
|
+
for (const filePath of conflictFiles) {
|
|
374
|
+
const cls = classifyFile(filePath);
|
|
375
|
+
const baseContent = await fetchFileContent(meta.repo, filePath, base_ref, ghApi);
|
|
376
|
+
const headContent = await fetchFileContent(meta.repo, filePath, head_ref, ghApi);
|
|
377
|
+
let merged = null;
|
|
378
|
+
let shouldWrite = true;
|
|
379
|
+
if (cls === "vercel.json") {
|
|
380
|
+
if (!baseContent || !headContent) {
|
|
381
|
+
filesSkipped.push(filePath);
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
merged = mergeVercelCrons(baseContent.content, headContent.content);
|
|
385
|
+
if (merged === null) {
|
|
386
|
+
filesSkipped.push(filePath);
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
if (merged === headContent.content)
|
|
390
|
+
shouldWrite = false;
|
|
391
|
+
}
|
|
392
|
+
else if (cls === "current-cycle") {
|
|
393
|
+
if (!baseContent || !headContent) {
|
|
394
|
+
filesSkipped.push(filePath);
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
if (hasConflictMarkers(baseContent.content, headContent.content)) {
|
|
398
|
+
filesSkipped.push(filePath);
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
merged = mergeCurrentCycle(baseContent.content, headContent.content);
|
|
402
|
+
if (merged === null) {
|
|
403
|
+
shouldWrite = false;
|
|
404
|
+
merged = headContent.content;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else if (cls === "min-version") {
|
|
408
|
+
if (!baseContent || !headContent) {
|
|
409
|
+
filesSkipped.push(filePath);
|
|
410
|
+
continue;
|
|
411
|
+
}
|
|
412
|
+
merged = mergeMinVersion(baseContent.content, headContent.content);
|
|
413
|
+
if (merged === null) {
|
|
414
|
+
filesSkipped.push(filePath);
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
if (merged === headContent.content)
|
|
418
|
+
shouldWrite = false;
|
|
419
|
+
}
|
|
420
|
+
else if (cls === "package-version") {
|
|
421
|
+
if (!baseContent || !headContent) {
|
|
422
|
+
filesSkipped.push(filePath);
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
merged = mergePackageVersion(baseContent.content, headContent.content);
|
|
426
|
+
if (merged === null) {
|
|
427
|
+
filesSkipped.push(filePath);
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
if (merged === headContent.content)
|
|
431
|
+
shouldWrite = false;
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
// planning
|
|
435
|
+
const r = resolvePlanning(baseContent?.content ?? null, headContent?.content ?? null);
|
|
436
|
+
if (r === null) {
|
|
437
|
+
filesSkipped.push(filePath);
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
merged = r.content;
|
|
441
|
+
shouldWrite = r.write;
|
|
442
|
+
}
|
|
443
|
+
if (shouldWrite && merged !== null) {
|
|
444
|
+
writes.push({ path: filePath, content: merged, sha: headContent?.sha });
|
|
445
|
+
}
|
|
446
|
+
filesResolved.push(filePath);
|
|
447
|
+
}
|
|
448
|
+
if (filesSkipped.length > 0) {
|
|
449
|
+
return {
|
|
450
|
+
action: "unresolvable",
|
|
451
|
+
reason: `could not merge: ${filesSkipped.join(", ")}`,
|
|
452
|
+
files_skipped: filesSkipped,
|
|
453
|
+
files_resolved: filesResolved,
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
// ── 7. Push merged content ─────────────────────────────────────────────────
|
|
457
|
+
for (const w of writes) {
|
|
458
|
+
try {
|
|
459
|
+
await putFileContent(meta.repo, w.path, w.content, head_ref, w.sha, ghApi);
|
|
460
|
+
}
|
|
461
|
+
catch (err) {
|
|
462
|
+
return {
|
|
463
|
+
action: "unresolvable",
|
|
464
|
+
reason: `put content ${w.path} failed: ${err.message?.slice(0, 200)}`,
|
|
465
|
+
files_resolved: filesResolved,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
return {
|
|
470
|
+
action: "resolved",
|
|
471
|
+
files_resolved: filesResolved,
|
|
472
|
+
reason: writes.length > 0
|
|
473
|
+
? `pushed ${writes.length} file(s): ${writes.map((w) => w.path).join(", ")}`
|
|
474
|
+
: "conflict already resolved (no writes needed)",
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=conflict-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolver.js","sourceRoot":"","sources":["../../src/runtime/conflict-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ClaudeExitClass } from "../failure-classifier.js";
|
|
2
|
+
export interface QuarantineState {
|
|
3
|
+
cause: ClaudeExitClass;
|
|
4
|
+
classifiedAt: string;
|
|
5
|
+
taskId: string;
|
|
6
|
+
detail: string;
|
|
7
|
+
}
|
|
8
|
+
/** Path to the quarantine sentinel file. Configurable via ACC_RUNNER_CACHE_DIR for tests. */
|
|
9
|
+
export declare function quarantineFile(): string;
|
|
10
|
+
/** Returns the current quarantine state, or null when not quarantined. */
|
|
11
|
+
export declare function getQuarantine(): Promise<QuarantineState | null>;
|
|
12
|
+
/** Write the quarantine sentinel. Creates parent dirs if needed. */
|
|
13
|
+
export declare function setQuarantine(state: QuarantineState): Promise<void>;
|
|
14
|
+
/** Remove the quarantine sentinel. Safe to call when not quarantined. */
|
|
15
|
+
export declare function clearQuarantine(): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=quarantine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quarantine.d.ts","sourceRoot":"","sources":["../../src/runtime/quarantine.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAED,0EAA0E;AAC1E,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQrE;AAED,oEAAoE;AACpE,wBAAsB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE;AAED,yEAAyE;AACzE,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAMrD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.48: per-runner quarantine state. Written to
|
|
3
|
+
* ~/.cache/acc-runner/quarantine.json by the watch loop when the failure
|
|
4
|
+
* classifier flags a machine-level failure (usage_limit | auth_expired |
|
|
5
|
+
* env_broken). The presence of this file blocks pump() from claiming
|
|
6
|
+
* new tasks so no further work is burned.
|
|
7
|
+
*
|
|
8
|
+
* Clearing the quarantine (after the operator resolves the underlying issue):
|
|
9
|
+
* - Delete the file manually, OR
|
|
10
|
+
* - Run `acc-runner quarantine clear` (wired in cli.ts).
|
|
11
|
+
*
|
|
12
|
+
* `acc-runner doctor` surfaces the quarantine state and its cause.
|
|
13
|
+
*/
|
|
14
|
+
import fs from "node:fs/promises";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
/** Path to the quarantine sentinel file. Configurable via ACC_RUNNER_CACHE_DIR for tests. */
|
|
18
|
+
export function quarantineFile() {
|
|
19
|
+
return path.join(process.env.ACC_RUNNER_CACHE_DIR?.trim() ||
|
|
20
|
+
path.join(os.homedir(), ".cache", "acc-runner"), "quarantine.json");
|
|
21
|
+
}
|
|
22
|
+
/** Returns the current quarantine state, or null when not quarantined. */
|
|
23
|
+
export async function getQuarantine() {
|
|
24
|
+
try {
|
|
25
|
+
const raw = await fs.readFile(quarantineFile(), "utf8");
|
|
26
|
+
return JSON.parse(raw);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (err.code === "ENOENT")
|
|
30
|
+
return null;
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Write the quarantine sentinel. Creates parent dirs if needed. */
|
|
35
|
+
export async function setQuarantine(state) {
|
|
36
|
+
const file = quarantineFile();
|
|
37
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
38
|
+
await fs.writeFile(file, JSON.stringify(state, null, 2), "utf8");
|
|
39
|
+
}
|
|
40
|
+
/** Remove the quarantine sentinel. Safe to call when not quarantined. */
|
|
41
|
+
export async function clearQuarantine() {
|
|
42
|
+
try {
|
|
43
|
+
await fs.unlink(quarantineFile());
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err.code !== "ENOENT")
|
|
47
|
+
throw err;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=quarantine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../../src/runtime/quarantine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,6FAA6F;AAC7F,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CACd,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE;QACtC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,EACjD,iBAAiB,CAClB,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAsB;IACxD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;IAClE,CAAC;AACH,CAAC"}
|
|
@@ -34,6 +34,8 @@ export interface ReviewerOutcome {
|
|
|
34
34
|
session_id: string | null;
|
|
35
35
|
cost_usd: number;
|
|
36
36
|
}
|
|
37
|
+
/** Returns true when a claude stderr string indicates a transient API error that is safe to retry. */
|
|
38
|
+
export declare function isRetriableError(stderr: string): boolean;
|
|
37
39
|
export declare function renderReviewerPrompt(args: {
|
|
38
40
|
task_description: string;
|
|
39
41
|
acceptance_criteria: string[];
|
|
@@ -59,6 +61,8 @@ export interface RunReviewDeps {
|
|
|
59
61
|
spawnClaude?: (modelId: string) => ExecaChildProcess;
|
|
60
62
|
/** Override the policy resolver (defaults to org_settings.automerge_policy.reviewer). */
|
|
61
63
|
loadPolicy?: (orgId: string) => Promise<ReviewerPolicy | null>;
|
|
64
|
+
/** Override for tests. Defaults to real setTimeout-based sleep. */
|
|
65
|
+
sleep?: (ms: number) => Promise<void>;
|
|
62
66
|
}
|
|
63
67
|
/**
|
|
64
68
|
* Drive one review end-to-end: fetch task spec + PR meta + diff →
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/runtime/reviewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAS,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/runtime/reviewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAS,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAOtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAI,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,QAAQ,GACR,mBAAmB,GACnB,gBAAgB,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAI,gBAAgB,CAAC;IAC7B,OAAO,EAAK,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAI,MAAM,CAAC;CACpB;AA0CD,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIxD;AAMD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAeT;AAQD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG;IACrD,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,OAAO,EAAG,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CA8DP;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3F,kEAAkE;IAClE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,wGAAwG;IACxG,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACrD,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/D,mEAAmE;IACnE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAgED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,eAAe,CAAC,CAgC1B"}
|