@on-par/factory-core 0.9.7-next.2 → 0.9.7-next.20
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/dist/checkers/index.d.ts +10 -1
- package/dist/checkers/index.d.ts.map +1 -1
- package/dist/checkers/index.js +14 -22
- package/dist/checkers/index.js.map +1 -1
- package/dist/checkers/probe.d.ts.map +1 -1
- package/dist/checkers/probe.js +5 -3
- package/dist/checkers/probe.js.map +1 -1
- package/dist/config/repo.js +1 -1
- package/dist/config/repo.js.map +1 -1
- package/dist/eval/baseline.d.ts.map +1 -1
- package/dist/eval/baseline.js +4 -4
- package/dist/eval/baseline.js.map +1 -1
- package/dist/eval/judge.d.ts.map +1 -1
- package/dist/eval/judge.js +9 -7
- package/dist/eval/judge.js.map +1 -1
- package/dist/eval/regression-report.js +1 -1
- package/dist/eval/regression-report.js.map +1 -1
- package/dist/harness/catalog.js +1 -1
- package/dist/harness/catalog.js.map +1 -1
- package/dist/harness/contract.js +4 -4
- package/dist/harness/contract.js.map +1 -1
- package/dist/hosted/store-contract.js +1 -1
- package/dist/hosted/store-contract.js.map +1 -1
- package/dist/internal.d.ts +2 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -0
- package/dist/internal.js.map +1 -1
- package/dist/kpis/human.d.ts.map +1 -1
- package/dist/kpis/human.js +4 -8
- package/dist/kpis/human.js.map +1 -1
- package/dist/logger/index.d.ts +2 -1
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +1 -0
- package/dist/logger/index.js.map +1 -1
- package/dist/phases/build.d.ts +3 -0
- package/dist/phases/build.d.ts.map +1 -1
- package/dist/phases/build.js +39 -12
- package/dist/phases/build.js.map +1 -1
- package/dist/phases/check.d.ts +29 -0
- package/dist/phases/check.d.ts.map +1 -1
- package/dist/phases/check.js +2 -2
- package/dist/phases/check.js.map +1 -1
- package/dist/phases/plan-design-retry.d.ts +4 -0
- package/dist/phases/plan-design-retry.d.ts.map +1 -1
- package/dist/phases/plan-design-retry.js +8 -0
- package/dist/phases/plan-design-retry.js.map +1 -1
- package/dist/phases/plan.d.ts.map +1 -1
- package/dist/phases/plan.js +2 -2
- package/dist/phases/plan.js.map +1 -1
- package/dist/phases/ship-git.d.ts +52 -0
- package/dist/phases/ship-git.d.ts.map +1 -0
- package/dist/phases/ship-git.js +104 -0
- package/dist/phases/ship-git.js.map +1 -0
- package/dist/phases/ship-spec.d.ts +5 -0
- package/dist/phases/ship-spec.d.ts.map +1 -0
- package/dist/phases/ship-spec.js +26 -0
- package/dist/phases/ship-spec.js.map +1 -0
- package/dist/phases/ship.d.ts +11 -7
- package/dist/phases/ship.d.ts.map +1 -1
- package/dist/phases/ship.js +73 -144
- package/dist/phases/ship.js.map +1 -1
- package/dist/readiness/slice-plan.js +1 -1
- package/dist/readiness/slice-plan.js.map +1 -1
- package/dist/review/backtest.js +2 -2
- package/dist/review/backtest.js.map +1 -1
- package/dist/review/containment.js +1 -1
- package/dist/review/containment.js.map +1 -1
- package/dist/run/ci-rework-loop.d.ts +65 -0
- package/dist/run/ci-rework-loop.d.ts.map +1 -0
- package/dist/run/ci-rework-loop.js +169 -0
- package/dist/run/ci-rework-loop.js.map +1 -0
- package/dist/run/ci-rework.d.ts +25 -0
- package/dist/run/ci-rework.d.ts.map +1 -0
- package/dist/run/ci-rework.js +113 -0
- package/dist/run/ci-rework.js.map +1 -0
- package/dist/run/ci-suppression-guard.d.ts +11 -0
- package/dist/run/ci-suppression-guard.d.ts.map +1 -0
- package/dist/run/ci-suppression-guard.js +143 -0
- package/dist/run/ci-suppression-guard.js.map +1 -0
- package/dist/run/park-comment.d.ts +55 -0
- package/dist/run/park-comment.d.ts.map +1 -0
- package/dist/run/park-comment.js +157 -0
- package/dist/run/park-comment.js.map +1 -0
- package/dist/run/phase-snapshot.js +2 -2
- package/dist/run/phase-snapshot.js.map +1 -1
- package/dist/run/run-issue.d.ts +4 -2
- package/dist/run/run-issue.d.ts.map +1 -1
- package/dist/run/run-issue.js +31 -37
- package/dist/run/run-issue.js.map +1 -1
- package/dist/run/ship-park.d.ts +14 -0
- package/dist/run/ship-park.d.ts.map +1 -0
- package/dist/run/ship-park.js +21 -0
- package/dist/run/ship-park.js.map +1 -0
- package/dist/sandbox/index.js +1 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/steward/detect.d.ts +5 -2
- package/dist/steward/detect.d.ts.map +1 -1
- package/dist/steward/detect.js +6 -3
- package/dist/steward/detect.js.map +1 -1
- package/dist/types/index.d.ts +55 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/ci-evidence.d.ts +21 -0
- package/dist/utils/ci-evidence.d.ts.map +1 -0
- package/dist/utils/ci-evidence.js +66 -0
- package/dist/utils/ci-evidence.js.map +1 -0
- package/dist/utils/ci-watch.d.ts +12 -0
- package/dist/utils/ci-watch.d.ts.map +1 -1
- package/dist/utils/ci-watch.js +1 -1
- package/dist/utils/ci-watch.js.map +1 -1
- package/dist/utils/command-runner.js +2 -2
- package/dist/utils/command-runner.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/worktree-gc.d.ts.map +1 -1
- package/dist/utils/worktree-gc.js +5 -5
- package/dist/utils/worktree-gc.js.map +1 -1
- package/dist/utils/worktree-location.d.ts +2 -2
- package/dist/utils/worktree-location.d.ts.map +1 -1
- package/dist/utils/worktree-location.js +16 -9
- package/dist/utils/worktree-location.js.map +1 -1
- package/dist/utils/worktree-name.d.ts +6 -0
- package/dist/utils/worktree-name.d.ts.map +1 -1
- package/dist/utils/worktree-name.js +16 -1
- package/dist/utils/worktree-name.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// packages/core/src/run/ci-suppression-guard.ts — mechanical suppression guard for SHIP CI rework diffs (#2818)
|
|
2
|
+
import { execGit } from '../utils/git-exec.js';
|
|
3
|
+
export const SUPPRESSION_ATTEMPT = 'suppression-attempt';
|
|
4
|
+
const MAX_MATCH = 200;
|
|
5
|
+
const MAX_LISTED = 5;
|
|
6
|
+
/** True when an eslint-disable directive in `line` is blanket or names a security rule. */
|
|
7
|
+
function eslintDisablesSecurity(line) {
|
|
8
|
+
const m = /eslint-disable(?:-next-line|-line)?(?![\w-])([^\n]*)/.exec(line);
|
|
9
|
+
if (!m)
|
|
10
|
+
return false;
|
|
11
|
+
let list = m[1];
|
|
12
|
+
const dash = list.indexOf('--');
|
|
13
|
+
if (dash >= 0)
|
|
14
|
+
list = list.slice(0, dash);
|
|
15
|
+
const end = list.indexOf('*/');
|
|
16
|
+
if (end >= 0)
|
|
17
|
+
list = list.slice(0, end);
|
|
18
|
+
const rules = list.split(/[,\s]+/).filter(Boolean);
|
|
19
|
+
return rules.length === 0 || rules.some((r) => /security/i.test(r));
|
|
20
|
+
}
|
|
21
|
+
/** Added-line rules; the single owner of the known suppression comment forms. */
|
|
22
|
+
const SUPPRESSION_COMMENT_RULES = [
|
|
23
|
+
{ rule: 'codeql-comment', test: (l) => /\bcodeql\[/i.test(l) },
|
|
24
|
+
{ rule: 'lgtm-comment', test: (l) => /(?:\/\/|#|\/\*|\*|<!--|--).*\blgtm\b/i.test(l) },
|
|
25
|
+
{ rule: 'nosec-comment', test: (l) => /#\s*nosec\b/i.test(l) || /\/\/\s*#?nosec\b/i.test(l) },
|
|
26
|
+
{ rule: 'eslint-disable-security', test: eslintDisablesSecurity },
|
|
27
|
+
];
|
|
28
|
+
function pathRules(path) {
|
|
29
|
+
const segments = path.split('/');
|
|
30
|
+
const base = segments[segments.length - 1];
|
|
31
|
+
const rules = [];
|
|
32
|
+
if (path.startsWith('.github/workflows/'))
|
|
33
|
+
rules.push('workflow-path');
|
|
34
|
+
if (segments.slice(0, -1).some((s) => /^\.?codeql$/i.test(s)) || /codeql.*\.(ya?ml|json)$/i.test(base)) {
|
|
35
|
+
rules.push('codeql-path');
|
|
36
|
+
}
|
|
37
|
+
if (/\.sarif(\.json)?$/i.test(base))
|
|
38
|
+
rules.push('sarif-path');
|
|
39
|
+
return rules;
|
|
40
|
+
}
|
|
41
|
+
/** Scans a unified git diff for suppression comments (added lines) and protected paths (any file header). */
|
|
42
|
+
export function scanReworkDiff(diff) {
|
|
43
|
+
const findings = [];
|
|
44
|
+
const seen = new Set();
|
|
45
|
+
const add = (f) => {
|
|
46
|
+
const key = `${f.kind}|${f.rule}|${f.file}|${f.line ?? ''}|${f.kind === 'path' ? f.match : ''}`;
|
|
47
|
+
if (seen.has(key))
|
|
48
|
+
return;
|
|
49
|
+
seen.add(key);
|
|
50
|
+
findings.push(f);
|
|
51
|
+
};
|
|
52
|
+
const checkPath = (path) => {
|
|
53
|
+
if (!path || path === '/dev/null')
|
|
54
|
+
return;
|
|
55
|
+
for (const rule of pathRules(path))
|
|
56
|
+
add({ kind: 'path', rule, file: path, match: path });
|
|
57
|
+
};
|
|
58
|
+
let file = '(unknown)';
|
|
59
|
+
let line;
|
|
60
|
+
let inHunk = false;
|
|
61
|
+
for (const raw of diff.split('\n')) {
|
|
62
|
+
const header = /^diff --git a\/(.+) b\/(.+)$/.exec(raw);
|
|
63
|
+
if (header) {
|
|
64
|
+
inHunk = false;
|
|
65
|
+
line = undefined;
|
|
66
|
+
file = header[2];
|
|
67
|
+
checkPath(header[1]);
|
|
68
|
+
checkPath(header[2]);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (!inHunk) {
|
|
72
|
+
const rename = /^rename (?:from|to) (.+)$/.exec(raw);
|
|
73
|
+
if (rename) {
|
|
74
|
+
checkPath(rename[1]);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const oldPath = /^--- (?:a\/)?(.+)$/.exec(raw);
|
|
78
|
+
if (oldPath) {
|
|
79
|
+
checkPath(oldPath[1]);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const newPath = /^\+\+\+ (?:b\/)?(.+)$/.exec(raw);
|
|
83
|
+
if (newPath) {
|
|
84
|
+
if (newPath[1] !== '/dev/null')
|
|
85
|
+
file = newPath[1];
|
|
86
|
+
checkPath(newPath[1]);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const hunk = /^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/.exec(raw);
|
|
91
|
+
if (hunk) {
|
|
92
|
+
inHunk = true;
|
|
93
|
+
line = Number(hunk[1]);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (raw.startsWith('+')) {
|
|
97
|
+
const text = raw.slice(1);
|
|
98
|
+
for (const { rule, test } of SUPPRESSION_COMMENT_RULES) {
|
|
99
|
+
if (test(text)) {
|
|
100
|
+
add({
|
|
101
|
+
kind: 'comment',
|
|
102
|
+
rule,
|
|
103
|
+
file,
|
|
104
|
+
...(line !== undefined ? { line } : {}),
|
|
105
|
+
match: text.trim().slice(0, MAX_MATCH),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (line !== undefined)
|
|
110
|
+
line++;
|
|
111
|
+
}
|
|
112
|
+
else if (raw.startsWith(' ') && line !== undefined) {
|
|
113
|
+
line++;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return findings;
|
|
117
|
+
}
|
|
118
|
+
/** Reads the worktree's current HEAD SHA. */
|
|
119
|
+
export async function readWorktreeHead(worktree) {
|
|
120
|
+
const { stdout } = await execGit(['rev-parse', 'HEAD'], { cwd: worktree });
|
|
121
|
+
const sha = stdout.trim();
|
|
122
|
+
if (!sha)
|
|
123
|
+
throw new Error('git rev-parse HEAD returned nothing');
|
|
124
|
+
return sha;
|
|
125
|
+
}
|
|
126
|
+
/** Reads the committed diff from `fromSha` to HEAD (SHIP re-entry pushes HEAD, not the working tree). */
|
|
127
|
+
export async function readReworkDiff(worktree, fromSha) {
|
|
128
|
+
const { stdout } = await execGit(['diff', '--no-color', '--no-ext-diff', '--unified=0', fromSha, 'HEAD'], {
|
|
129
|
+
cwd: worktree,
|
|
130
|
+
});
|
|
131
|
+
return stdout;
|
|
132
|
+
}
|
|
133
|
+
/** One-line summary of guard findings for park messages and logs. */
|
|
134
|
+
export function describeSuppression(findings) {
|
|
135
|
+
const items = findings.slice(0, MAX_LISTED).map((f) => {
|
|
136
|
+
if (f.kind === 'comment')
|
|
137
|
+
return `${f.rule} at ${f.file}${f.line !== undefined ? `:${f.line}` : ''}`;
|
|
138
|
+
return `${f.rule} ${f.match}`;
|
|
139
|
+
});
|
|
140
|
+
const more = findings.length > MAX_LISTED ? `, +${findings.length - MAX_LISTED} more` : '';
|
|
141
|
+
return `${SUPPRESSION_ATTEMPT}: ${findings.length} finding(s): ${items.join(', ')}${more}`;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=ci-suppression-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-suppression-guard.js","sourceRoot":"","sources":["../../src/run/ci-suppression-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Octokit } from '@octokit/rest';
|
|
2
|
+
import type { ParkReason } from './outcome.js';
|
|
3
|
+
export declare const ISSUE_STATE_MARKER_VERSION = "v1";
|
|
4
|
+
export interface ParkCommentInput {
|
|
5
|
+
issue: number;
|
|
6
|
+
reason: ParkReason;
|
|
7
|
+
message: string;
|
|
8
|
+
runId: string;
|
|
9
|
+
branch: string;
|
|
10
|
+
lane?: string;
|
|
11
|
+
parkSha?: string;
|
|
12
|
+
blockers?: readonly number[];
|
|
13
|
+
}
|
|
14
|
+
/** `reason` is a plain string because the parser reads untrusted text. */
|
|
15
|
+
export interface ParkState {
|
|
16
|
+
reason: string;
|
|
17
|
+
lane?: string;
|
|
18
|
+
runId?: string;
|
|
19
|
+
branch?: string;
|
|
20
|
+
parkSha?: string;
|
|
21
|
+
blockers: number[];
|
|
22
|
+
}
|
|
23
|
+
export interface ParkStateComment {
|
|
24
|
+
id: number;
|
|
25
|
+
body: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function issueStateMarker(issue: number): string;
|
|
28
|
+
export declare function parkUnblockHint(reason: ParkReason, issue: number): string;
|
|
29
|
+
export declare function renderParkComment(input: ParkCommentInput): string;
|
|
30
|
+
/** Lowest-id marked comment decides; null when none, or when its state block is unreadable. */
|
|
31
|
+
export declare function readParkState(comments: readonly ParkStateComment[], issue?: number): ParkState | null;
|
|
32
|
+
export declare function upsertParkComment(deps: {
|
|
33
|
+
octokit: Octokit;
|
|
34
|
+
repo: string;
|
|
35
|
+
input: ParkCommentInput;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
commentId: number;
|
|
38
|
+
created: boolean;
|
|
39
|
+
}>;
|
|
40
|
+
/** Never throws: a GitHub or git failure comes back as `{ ok: false, error }`. */
|
|
41
|
+
export declare function publishParkComment(deps: {
|
|
42
|
+
octokit: Octokit;
|
|
43
|
+
repo: string;
|
|
44
|
+
worktree?: string;
|
|
45
|
+
input: Omit<ParkCommentInput, 'parkSha'>;
|
|
46
|
+
readHead?: (worktree: string) => Promise<string>;
|
|
47
|
+
}): Promise<{
|
|
48
|
+
ok: true;
|
|
49
|
+
commentId: number;
|
|
50
|
+
created: boolean;
|
|
51
|
+
} | {
|
|
52
|
+
ok: false;
|
|
53
|
+
error: string;
|
|
54
|
+
}>;
|
|
55
|
+
//# sourceMappingURL=park-comment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"park-comment.d.ts","sourceRoot":"","sources":["../../src/run/park-comment.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,0EAA0E;AAC1E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAaD,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzE;AAQD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAyBjE;AAkCD,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CASrG;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,gBAAgB,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA2BnD;AAED,kFAAkF;AAClF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB5F"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// src/run/park-comment.ts — upsert one issue comment with the park state behind a hidden factory-issue-state marker (#2314, ADR-0130)
|
|
2
|
+
//
|
|
3
|
+
// Every runIssue park edits one comment per issue in place (#728). Anyone can post the marker, so only a
|
|
4
|
+
// marker comment written by the authenticated identity is trusted (same rule as readiness/slice-plan-github.ts).
|
|
5
|
+
import { fenceExcerpt, stripHiddenContent } from '../filing/sanitize.js';
|
|
6
|
+
import { readWorktreeHead } from './ci-suppression-guard.js';
|
|
7
|
+
export const ISSUE_STATE_MARKER_VERSION = 'v1';
|
|
8
|
+
const PAGE_SIZE = 100;
|
|
9
|
+
const STATE_HEADING = '**Park state**';
|
|
10
|
+
const MARKER_RE = new RegExp(`<!-- factory-issue-state ${ISSUE_STATE_MARKER_VERSION} issue:(\\d+) -->`);
|
|
11
|
+
export function issueStateMarker(issue) {
|
|
12
|
+
return `<!-- factory-issue-state ${ISSUE_STATE_MARKER_VERSION} issue:${issue} -->`;
|
|
13
|
+
}
|
|
14
|
+
const PARK_HINTS = {
|
|
15
|
+
fail: 'fix the failing checks on the branch or clarify the issue, then run `factory unpark <n>`.',
|
|
16
|
+
escalate: 'a human decision is needed. Answer it on the issue, then run `factory unpark <n>`.',
|
|
17
|
+
timeout: 'a phase timed out. Check the lane log and retry with `factory unpark <n>`.',
|
|
18
|
+
conflict: 'rebase the branch onto main, then run `factory unpark <n>`.',
|
|
19
|
+
'ci-failed': 'fix CI on the PR, then run `factory unpark <n>`.',
|
|
20
|
+
'ci-infra': 'CI infrastructure failed. Re-run CI, then run `factory unpark <n>`.',
|
|
21
|
+
held: 'the same failure parked a prior run. A human must change the approach before `factory unpark <n>`.',
|
|
22
|
+
config: 'fix the named config file and line, then run `factory unpark <n>`.',
|
|
23
|
+
};
|
|
24
|
+
export function parkUnblockHint(reason, issue) {
|
|
25
|
+
return PARK_HINTS[reason].replaceAll('<n>', String(issue));
|
|
26
|
+
}
|
|
27
|
+
function clean(v) {
|
|
28
|
+
return stripHiddenContent(v)
|
|
29
|
+
.replace(/[\r\n]+/g, ' ')
|
|
30
|
+
.trim();
|
|
31
|
+
}
|
|
32
|
+
export function renderParkComment(input) {
|
|
33
|
+
const blockers = input.blockers ?? [];
|
|
34
|
+
const stateBlock = [
|
|
35
|
+
`reason: ${clean(input.reason)}`,
|
|
36
|
+
`lane: ${(input.lane && clean(input.lane)) || '-'}`,
|
|
37
|
+
`run: ${clean(input.runId)}`,
|
|
38
|
+
`branch: ${clean(input.branch)}`,
|
|
39
|
+
`park-sha: ${(input.parkSha && clean(input.parkSha)) || '-'}`,
|
|
40
|
+
`blockers: ${blockers.length > 0 ? blockers.map((n) => `#${n}`).join(', ') : '-'}`,
|
|
41
|
+
].join('\n');
|
|
42
|
+
return [
|
|
43
|
+
'### Factory park state',
|
|
44
|
+
'',
|
|
45
|
+
STATE_HEADING,
|
|
46
|
+
'',
|
|
47
|
+
fenceExcerpt(stateBlock),
|
|
48
|
+
'',
|
|
49
|
+
'**Why it parked**',
|
|
50
|
+
'',
|
|
51
|
+
fenceExcerpt(stripHiddenContent(input.message)),
|
|
52
|
+
'',
|
|
53
|
+
`**What unblocks this:** ${parkUnblockHint(input.reason, input.issue)}`,
|
|
54
|
+
'',
|
|
55
|
+
issueStateMarker(input.issue),
|
|
56
|
+
].join('\n');
|
|
57
|
+
}
|
|
58
|
+
function parseStateBlock(body) {
|
|
59
|
+
const lines = body.split('\n');
|
|
60
|
+
const heading = lines.indexOf(STATE_HEADING);
|
|
61
|
+
if (heading === -1)
|
|
62
|
+
return null;
|
|
63
|
+
const isFence = (l) => /^`{5,}$/.test(l);
|
|
64
|
+
const open = lines.findIndex((l, i) => i > heading && isFence(l));
|
|
65
|
+
if (open === -1)
|
|
66
|
+
return null;
|
|
67
|
+
const close = lines.indexOf(lines[open], open + 1);
|
|
68
|
+
if (close === -1)
|
|
69
|
+
return null;
|
|
70
|
+
const values = new Map();
|
|
71
|
+
for (const line of lines.slice(open + 1, close)) {
|
|
72
|
+
const sep = line.indexOf(':');
|
|
73
|
+
if (sep === -1)
|
|
74
|
+
continue;
|
|
75
|
+
values.set(line.slice(0, sep).trim(), line.slice(sep + 1).trim());
|
|
76
|
+
}
|
|
77
|
+
const reason = values.get('reason');
|
|
78
|
+
if (!reason)
|
|
79
|
+
return null;
|
|
80
|
+
const optional = (key) => {
|
|
81
|
+
const v = values.get(key);
|
|
82
|
+
return v === undefined || v === '' || v === '-' ? undefined : v;
|
|
83
|
+
};
|
|
84
|
+
const blockers = [...(values.get('blockers') ?? '').matchAll(/#(\d+)/g)].map((m) => Number(m[1]));
|
|
85
|
+
return {
|
|
86
|
+
reason,
|
|
87
|
+
lane: optional('lane'),
|
|
88
|
+
runId: optional('run'),
|
|
89
|
+
branch: optional('branch'),
|
|
90
|
+
parkSha: optional('park-sha'),
|
|
91
|
+
blockers,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** Lowest-id marked comment decides; null when none, or when its state block is unreadable. */
|
|
95
|
+
export function readParkState(comments, issue) {
|
|
96
|
+
const marked = comments
|
|
97
|
+
.filter((c) => {
|
|
98
|
+
const m = MARKER_RE.exec(c.body);
|
|
99
|
+
return m !== null && (issue === undefined || Number(m[1]) === issue);
|
|
100
|
+
})
|
|
101
|
+
.sort((a, b) => a.id - b.id);
|
|
102
|
+
if (marked.length === 0)
|
|
103
|
+
return null;
|
|
104
|
+
return parseStateBlock(marked[0].body);
|
|
105
|
+
}
|
|
106
|
+
export async function upsertParkComment(deps) {
|
|
107
|
+
const { octokit, repo, input } = deps;
|
|
108
|
+
const [owner, name] = repo.split('/');
|
|
109
|
+
const marker = issueStateMarker(input.issue);
|
|
110
|
+
const { data: me } = await octokit.rest.users.getAuthenticated();
|
|
111
|
+
let existing;
|
|
112
|
+
for (let page = 1;; page++) {
|
|
113
|
+
const { data } = await octokit.rest.issues.listComments({
|
|
114
|
+
owner,
|
|
115
|
+
repo: name,
|
|
116
|
+
issue_number: input.issue,
|
|
117
|
+
per_page: PAGE_SIZE,
|
|
118
|
+
page,
|
|
119
|
+
});
|
|
120
|
+
for (const comment of data) {
|
|
121
|
+
if (comment.user?.id !== me.id || !(comment.body ?? '').includes(marker))
|
|
122
|
+
continue;
|
|
123
|
+
if (existing === undefined || comment.id < existing)
|
|
124
|
+
existing = comment.id;
|
|
125
|
+
}
|
|
126
|
+
if (data.length < PAGE_SIZE)
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
const body = renderParkComment(input);
|
|
130
|
+
if (existing !== undefined) {
|
|
131
|
+
await octokit.rest.issues.updateComment({ owner, repo: name, comment_id: existing, body });
|
|
132
|
+
return { commentId: existing, created: false };
|
|
133
|
+
}
|
|
134
|
+
const { data } = await octokit.rest.issues.createComment({ owner, repo: name, issue_number: input.issue, body });
|
|
135
|
+
return { commentId: data.id, created: true };
|
|
136
|
+
}
|
|
137
|
+
/** Never throws: a GitHub or git failure comes back as `{ ok: false, error }`. */
|
|
138
|
+
export async function publishParkComment(deps) {
|
|
139
|
+
const { octokit, repo, worktree, input, readHead = readWorktreeHead } = deps;
|
|
140
|
+
let parkSha;
|
|
141
|
+
if (worktree) {
|
|
142
|
+
try {
|
|
143
|
+
parkSha = (await readHead(worktree)) || undefined;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
parkSha = undefined;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const result = await upsertParkComment({ octokit, repo, input: { ...input, parkSha } });
|
|
151
|
+
return { ok: true, ...result };
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=park-comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"park-comment.js","sourceRoot":"","sources":["../../src/run/park-comment.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export function summarizeEvent(type, msg) {
|
|
|
13
13
|
const summary = trimmed.length > 0 ? `${type}: ${trimmed}` : type;
|
|
14
14
|
return summary.length > LAST_EVENT_MAX_LENGTH ? `${summary.slice(0, LAST_EVENT_MAX_LENGTH - 1)}…` : summary;
|
|
15
15
|
}
|
|
16
|
-
const PHASES = ['plan', 'build', 'check', 'ship'];
|
|
16
|
+
const PHASES = new Set(['plan', 'build', 'check', 'ship']);
|
|
17
17
|
/** Path of one issue's persisted phase snapshot inside `runsDir`
|
|
18
18
|
* (`getFactoryPaths(repoRoot).runs`). */
|
|
19
19
|
export function phaseSnapshotFile(runsDir, issue) {
|
|
@@ -65,7 +65,7 @@ export async function readPhaseSnapshot(file) {
|
|
|
65
65
|
if (typeof record.issue !== 'number' ||
|
|
66
66
|
typeof record.updatedAt !== 'string' ||
|
|
67
67
|
typeof record.lastActivityAt !== 'string' ||
|
|
68
|
-
!PHASES.
|
|
68
|
+
!PHASES.has(record.phase)) {
|
|
69
69
|
return null;
|
|
70
70
|
}
|
|
71
71
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phase-snapshot.js","sourceRoot":"","sources":["../../src/run/phase-snapshot.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,wFAAwF;AACxF,wFAAwF;AACxF,uFAAuF;AACvF,wCAAwC;AAExC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqB7C,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC;mFACmF;AACnF,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,GAAW;IACzD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,OAAO,OAAO,CAAC,MAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9G,CAAC;AAED,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"phase-snapshot.js","sourceRoot":"","sources":["../../src/run/phase-snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/run/run-issue.d.ts
CHANGED
|
@@ -16,13 +16,14 @@ import type { ModelRouter } from '../router/index.js';
|
|
|
16
16
|
import { type ProviderBreaker } from '../router/breaker.js';
|
|
17
17
|
import type { SandboxPolicy } from '../sandbox/index.js';
|
|
18
18
|
import { type ConsumedSteering } from '../steering/index.js';
|
|
19
|
-
import type { CheckFailureInfo, CheckSummary, Constitution, FailoverReason, FailurePhase, ReadinessInfo } from '../types/index.js';
|
|
19
|
+
import type { CheckFailureInfo, CiFailureEvidence, CheckSummary, Constitution, FailoverReason, FailurePhase, ReadinessInfo } from '../types/index.js';
|
|
20
20
|
import type { WorkRequest, WorkRequestSourceKind } from '../work/index.js';
|
|
21
21
|
import type { LaneFileGuard } from './lane-file-guard.js';
|
|
22
22
|
import { type BuildRoute, type RunOutcome } from './outcome.js';
|
|
23
23
|
import type { RunPolicy } from './policy.js';
|
|
24
24
|
import { type CheckResumeStore, type PlanReuseStore } from './resume-context.js';
|
|
25
25
|
import type { Environment, Workspace } from './ports.js';
|
|
26
|
+
import { type CiReworkPorts } from './ci-rework-loop.js';
|
|
26
27
|
/** Everything one run needs decided, as a plain resolved value — the CLI adapter
|
|
27
28
|
* computes this today; no config/file/path resolution happens in here. */
|
|
28
29
|
export interface RunRequest {
|
|
@@ -122,6 +123,7 @@ type LogFn = (type: EventKind, msg: string, extra?: {
|
|
|
122
123
|
readiness?: ReadinessInfo;
|
|
123
124
|
prClassification?: PrClassificationRecord;
|
|
124
125
|
checkFailure?: CheckFailureInfo;
|
|
126
|
+
ciFailure?: CiFailureEvidence;
|
|
125
127
|
stewardTriggered?: StewardTriggeredPayload;
|
|
126
128
|
flakyTests?: FlakyTestsPayload;
|
|
127
129
|
}) => void;
|
|
@@ -143,7 +145,7 @@ interface RunReportInfo {
|
|
|
143
145
|
/** The injected seams runIssue needs. Effectful, path-bound concerns (Octokit, worktree
|
|
144
146
|
* layout, approvals/steering directories, report/artifact destinations) are the caller's
|
|
145
147
|
* responsibility to wire — runIssue only calls the closures it is handed. */
|
|
146
|
-
export interface RunPorts {
|
|
148
|
+
export interface RunPorts extends CiReworkPorts {
|
|
147
149
|
/** Stuck-run steward seams (#2124). Used only when request.stewardEnabled is true and detectStuck fires
|
|
148
150
|
* on the park; absent → only the steward-triggered event is logged (#2086). */
|
|
149
151
|
steward?: RunStewardPorts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-issue.d.ts","sourceRoot":"","sources":["../../src/run/run-issue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-issue.d.ts","sourceRoot":"","sources":["../../src/run/run-issue.ts"],"names":[],"mappings":"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"}
|
package/dist/run/run-issue.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
// (including the non-park `released` exit for an environment-caused CHECK failure, #1928; a config cause parks, #2583).
|
|
10
10
|
// PLAN may be skipped by the planReuse port after an environment release (#2340).
|
|
11
11
|
// CHECK may be resumed on a kept worktree via request.resumeFrom after an environment release (#2564).
|
|
12
|
+
// Every park posts or edits one issue-level park comment behind a hidden marker; a GitHub failure only logs a warning (#2314).
|
|
12
13
|
// A config preflight (#2586) rejects unfilled template tokens before base health and PLAN; any preflight failure parks with the `config` cause (#2587).
|
|
13
14
|
//
|
|
14
15
|
// Path-bound CLI concerns (Octokit, worktree/environment provisioning, the events sink,
|
|
@@ -23,6 +24,7 @@ import { describeConstitutionSource } from '../constitutions/index.js';
|
|
|
23
24
|
import { lintFactoryConfig } from '../config/config-lint.js';
|
|
24
25
|
import { planPhase as planPhaseDefault } from '../phases/plan.js';
|
|
25
26
|
import { shipPhase as shipPhaseDefault } from '../phases/ship.js';
|
|
27
|
+
import { publishParkComment } from './park-comment.js';
|
|
26
28
|
import { upsertSlicePlanComment } from '../readiness/slice-plan-github.js';
|
|
27
29
|
import { withSliceState } from '../readiness/slice-plan.js';
|
|
28
30
|
import { CLASSIFIER_PROMPT_VERSION, classifierPolicyVersion, classifyPrShadow, toClassificationRecord, } from '../review/classifier.js';
|
|
@@ -39,6 +41,8 @@ import { describeSteering } from '../steering/index.js';
|
|
|
39
41
|
import { touchedFilesFrom } from './lane-file-guard.js';
|
|
40
42
|
import { parkReasonFor } from './outcome.js';
|
|
41
43
|
import { configParkMessage, formatPreservedBuildMessage, issueBodyHash, preservedFixTarget, } from './resume-context.js';
|
|
44
|
+
import { shipWithCiRework } from './ci-rework-loop.js';
|
|
45
|
+
import { parkLogExtra } from './ship-park.js';
|
|
42
46
|
function errorMessage(err) {
|
|
43
47
|
return err instanceof Error ? err.message : String(err);
|
|
44
48
|
}
|
|
@@ -192,13 +196,29 @@ export async function runIssue(request, policy, ports) {
|
|
|
192
196
|
await writeReports('escalated', 'escalate', message);
|
|
193
197
|
return { state: 'escalated', reason: message, route, branch: request.branch, reworkRounds };
|
|
194
198
|
};
|
|
195
|
-
const terminalParked = async (reason, message, checkFailure) => {
|
|
196
|
-
log(reason, message, checkFailure
|
|
197
|
-
? { checkFailure: { signature: checkFailure.failureSignature, failingChecks: checkFailure.failingChecks } }
|
|
198
|
-
: undefined);
|
|
199
|
+
const terminalParked = async (reason, message, checkFailure, ciFailure) => {
|
|
200
|
+
log(reason, message, parkLogExtra(checkFailure, ciFailure));
|
|
199
201
|
if (reason === 'timeout') {
|
|
200
202
|
log('stuck', `run exceeded its phase timeout without progressing — ${message}`);
|
|
201
203
|
}
|
|
204
|
+
if (!request.localOnly) {
|
|
205
|
+
const posted = await publishParkComment({
|
|
206
|
+
octokit: ports.octokit,
|
|
207
|
+
repo: request.repo,
|
|
208
|
+
worktree: ports.workspace.path,
|
|
209
|
+
input: {
|
|
210
|
+
issue: request.issue,
|
|
211
|
+
reason,
|
|
212
|
+
message,
|
|
213
|
+
runId,
|
|
214
|
+
branch: request.branch,
|
|
215
|
+
lane: request.lane,
|
|
216
|
+
blockers: [],
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
if (!posted.ok)
|
|
220
|
+
log('environment_warning', `could not post the issue park comment: ${posted.error}`);
|
|
221
|
+
}
|
|
202
222
|
const outcome = {
|
|
203
223
|
state: 'parked',
|
|
204
224
|
reason,
|
|
@@ -553,7 +573,7 @@ export async function runIssue(request, policy, ports) {
|
|
|
553
573
|
// CHECK
|
|
554
574
|
await setPhase('check');
|
|
555
575
|
const priorFailureSignature = await ports.reworkHistory?.priorSignature(request.issue);
|
|
556
|
-
const
|
|
576
|
+
const checkOpts = {
|
|
557
577
|
runId,
|
|
558
578
|
issue: request.issue,
|
|
559
579
|
worktree: ports.workspace.path,
|
|
@@ -580,7 +600,8 @@ export async function runIssue(request, policy, ports) {
|
|
|
580
600
|
onActivity: ports.onActivity,
|
|
581
601
|
logsDir: request.logsDir,
|
|
582
602
|
baselineCachePath: request.baselineCachePath,
|
|
583
|
-
}
|
|
603
|
+
};
|
|
604
|
+
const check = await checkPhase(checkOpts);
|
|
584
605
|
checkSummary = check.summary;
|
|
585
606
|
reworkRounds = check.reworkRounds;
|
|
586
607
|
const flake = check.flakeRerun;
|
|
@@ -814,37 +835,10 @@ export async function runIssue(request, policy, ports) {
|
|
|
814
835
|
}
|
|
815
836
|
// SHIP
|
|
816
837
|
await setPhase('ship');
|
|
817
|
-
const
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
branch: request.branch,
|
|
822
|
-
recordedRemoteSha: ports.workspace.remoteBranch?.sha,
|
|
823
|
-
octokit: ports.octokit,
|
|
824
|
-
watchCI: !request.skipCI,
|
|
825
|
-
log: ports.events('ship'),
|
|
826
|
-
approvalGate: request.options.interactive ? ports.createApprovalGate?.() : undefined,
|
|
827
|
-
checkSummary: check.summary,
|
|
828
|
-
specPath: request.specPath,
|
|
829
|
-
eventsFile: request.eventsFile,
|
|
830
|
-
startedAt: request.startedAt,
|
|
831
|
-
logsDir: request.logsDir,
|
|
832
|
-
reworkRounds: check.reworkRounds,
|
|
833
|
-
work: request.work,
|
|
834
|
-
laneId: request.lane,
|
|
835
|
-
reviewRouting,
|
|
836
|
-
...(pinNote ? { pinNotes: [pinNote] } : {}),
|
|
837
|
-
slice: planSlice ? { index: planSlice.index, count: planSlice.plan.slices.length } : undefined,
|
|
838
|
-
});
|
|
839
|
-
if (!ship.ok) {
|
|
840
|
-
const reason = ship.denied ? 'escalate' : ship.ciOutcome === 'infra-failure' ? 'ci-infra' : 'fail';
|
|
841
|
-
const message = ship.denied
|
|
842
|
-
? `ship denied: ${ship.deniedReason}`
|
|
843
|
-
: ship.reason
|
|
844
|
-
? `ship phase failed: ${ship.reason}`
|
|
845
|
-
: 'ship phase failed';
|
|
846
|
-
return terminalParked(reason, message);
|
|
847
|
-
}
|
|
838
|
+
const shipped = await shipWithCiRework({ request, ports, shipPhase, checkPhase, checkOpts, check, constitution, appPort, appBaseUrl, onPgid, runId }, { builtRoute, builtModel, reviewRouting, pinNote, planSlice });
|
|
839
|
+
const { ship, parked } = shipped;
|
|
840
|
+
if (parked)
|
|
841
|
+
return terminalParked(parked.reason, parked.message, parked.checkFailure, parked.ciFailure);
|
|
848
842
|
if (planSlice) {
|
|
849
843
|
const { index, plan: slicePlan } = planSlice;
|
|
850
844
|
const count = slicePlan.slices.length;
|