@on-par/factory-cli 0.9.11-next.9 → 0.9.11
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 +1 -1
- package/dist/cli/base-health-ci.d.ts +16 -2
- package/dist/cli/base-health-ci.d.ts.map +1 -1
- package/dist/cli/base-health-ci.js +30 -5
- package/dist/cli/base-health-ci.js.map +1 -1
- package/dist/cli/base-hold.d.ts +2 -0
- package/dist/cli/base-hold.d.ts.map +1 -1
- package/dist/cli/base-hold.js +24 -3
- package/dist/cli/base-hold.js.map +1 -1
- package/dist/cli/cost-json.d.ts +5 -31
- package/dist/cli/cost-json.d.ts.map +1 -1
- package/dist/cli/cost-json.js +13 -2
- package/dist/cli/cost-json.js.map +1 -1
- package/dist/cli/daemon.d.ts +2 -15
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +5 -11
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +3 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/harness-check.d.ts.map +1 -1
- package/dist/cli/harness-check.js +8 -3
- package/dist/cli/harness-check.js.map +1 -1
- package/dist/cli/help-groups.d.ts.map +1 -1
- package/dist/cli/help-groups.js +16 -2
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/index.d.ts +29 -32
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +88 -174
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/json-contract.d.ts +309 -0
- package/dist/cli/json-contract.d.ts.map +1 -0
- package/dist/cli/json-contract.js +211 -0
- package/dist/cli/json-contract.js.map +1 -0
- package/dist/cli/land-pr.d.ts +4 -4
- package/dist/cli/land-pr.d.ts.map +1 -1
- package/dist/cli/land-pr.js +18 -17
- package/dist/cli/land-pr.js.map +1 -1
- package/dist/cli/land-risk.d.ts +29 -0
- package/dist/cli/land-risk.d.ts.map +1 -0
- package/dist/cli/land-risk.js +92 -0
- package/dist/cli/land-risk.js.map +1 -0
- package/dist/cli/land-runtime.d.ts +2 -1
- package/dist/cli/land-runtime.d.ts.map +1 -1
- package/dist/cli/land-runtime.js +3 -0
- package/dist/cli/land-runtime.js.map +1 -1
- package/dist/cli/land.d.ts +2 -0
- package/dist/cli/land.d.ts.map +1 -1
- package/dist/cli/land.js +46 -4
- package/dist/cli/land.js.map +1 -1
- package/dist/cli/lane-environment-pause-error.d.ts +3 -0
- package/dist/cli/lane-environment-pause-error.d.ts.map +1 -1
- package/dist/cli/lane-environment-pause-error.js +4 -0
- package/dist/cli/lane-environment-pause-error.js.map +1 -1
- package/dist/cli/logs.d.ts +4 -0
- package/dist/cli/logs.d.ts.map +1 -1
- package/dist/cli/logs.js +6 -2
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/model-override-messages.d.ts +4 -0
- package/dist/cli/model-override-messages.d.ts.map +1 -0
- package/dist/cli/model-override-messages.js +15 -0
- package/dist/cli/model-override-messages.js.map +1 -0
- package/dist/cli/octokit.d.ts +3 -0
- package/dist/cli/octokit.d.ts.map +1 -1
- package/dist/cli/octokit.js +1 -1
- package/dist/cli/octokit.js.map +1 -1
- package/dist/cli/program-observe.d.ts.map +1 -1
- package/dist/cli/program-observe.js +11 -0
- package/dist/cli/program-observe.js.map +1 -1
- package/dist/cli/program-run-work.d.ts.map +1 -1
- package/dist/cli/program-run-work.js +12 -0
- package/dist/cli/program-run-work.js.map +1 -1
- package/dist/cli/queue-add-json.d.ts +3 -25
- package/dist/cli/queue-add-json.d.ts.map +1 -1
- package/dist/cli/queue-add-json.js.map +1 -1
- package/dist/cli/queue-list.d.ts +6 -24
- package/dist/cli/queue-list.d.ts.map +1 -1
- package/dist/cli/queue-list.js +6 -1
- package/dist/cli/queue-list.js.map +1 -1
- package/dist/cli/queue-preflight.d.ts +52 -0
- package/dist/cli/queue-preflight.d.ts.map +1 -0
- package/dist/cli/queue-preflight.js +358 -0
- package/dist/cli/queue-preflight.js.map +1 -0
- package/dist/cli/risk-policy.d.ts +8 -0
- package/dist/cli/risk-policy.d.ts.map +1 -0
- package/dist/cli/risk-policy.js +39 -0
- package/dist/cli/risk-policy.js.map +1 -0
- package/dist/cli/risk.d.ts +42 -0
- package/dist/cli/risk.d.ts.map +1 -0
- package/dist/cli/risk.js +103 -0
- package/dist/cli/risk.js.map +1 -0
- package/dist/cli/run-branch.d.ts +26 -0
- package/dist/cli/run-branch.d.ts.map +1 -0
- package/dist/cli/run-branch.js +42 -0
- package/dist/cli/run-branch.js.map +1 -0
- package/dist/cli/run-lane.d.ts +6 -1
- package/dist/cli/run-lane.d.ts.map +1 -1
- package/dist/cli/run-lane.js +52 -5
- package/dist/cli/run-lane.js.map +1 -1
- package/dist/cli/run-restack.d.ts +14 -0
- package/dist/cli/run-restack.d.ts.map +1 -0
- package/dist/cli/run-restack.js +21 -0
- package/dist/cli/run-restack.js.map +1 -0
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +19 -2
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs-diffstat.d.ts +6 -25
- package/dist/cli/runs-diffstat.d.ts.map +1 -1
- package/dist/cli/runs-diffstat.js.map +1 -1
- package/dist/cli/runs.d.ts +4 -19
- package/dist/cli/runs.d.ts.map +1 -1
- package/dist/cli/runs.js +1 -1
- package/dist/cli/runs.js.map +1 -1
- package/dist/cli/self-update-stop.d.ts +7 -0
- package/dist/cli/self-update-stop.d.ts.map +1 -0
- package/dist/cli/self-update-stop.js +27 -0
- package/dist/cli/self-update-stop.js.map +1 -0
- package/dist/cli/ship-reports.d.ts +34 -0
- package/dist/cli/ship-reports.d.ts.map +1 -0
- package/dist/cli/ship-reports.js +54 -0
- package/dist/cli/ship-reports.js.map +1 -0
- package/dist/cli/ship-run-state.d.ts +5 -0
- package/dist/cli/ship-run-state.d.ts.map +1 -0
- package/dist/cli/ship-run-state.js +17 -0
- package/dist/cli/ship-run-state.js.map +1 -0
- package/dist/cli/ship-steps.d.ts +4 -47
- package/dist/cli/ship-steps.d.ts.map +1 -1
- package/dist/cli/ship-steps.js +22 -82
- package/dist/cli/ship-steps.js.map +1 -1
- package/dist/cli/ship.d.ts +2 -0
- package/dist/cli/ship.d.ts.map +1 -1
- package/dist/cli/ship.js +64 -67
- package/dist/cli/ship.js.map +1 -1
- package/dist/cli/slice-index.d.ts +16 -0
- package/dist/cli/slice-index.d.ts.map +1 -0
- package/dist/cli/slice-index.js +27 -0
- package/dist/cli/slice-index.js.map +1 -0
- package/dist/cli/status-json.d.ts +7 -28
- package/dist/cli/status-json.d.ts.map +1 -1
- package/dist/cli/status-json.js +3 -1
- package/dist/cli/status-json.js.map +1 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +4 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/steer.d.ts +50 -0
- package/dist/cli/steer.d.ts.map +1 -0
- package/dist/cli/steer.js +145 -0
- package/dist/cli/steer.js.map +1 -0
- package/dist/cli/steerability-report.d.ts +9 -0
- package/dist/cli/steerability-report.d.ts.map +1 -0
- package/dist/cli/steerability-report.js +28 -0
- package/dist/cli/steerability-report.js.map +1 -0
- package/dist/cli/stop-resume-json.d.ts +2 -10
- package/dist/cli/stop-resume-json.d.ts.map +1 -1
- package/dist/cli/stop-resume-json.js +1 -0
- package/dist/cli/stop-resume-json.js.map +1 -1
- package/dist/cli/usage-json.d.ts +4 -13
- package/dist/cli/usage-json.d.ts.map +1 -1
- package/dist/cli/usage-json.js.map +1 -1
- package/dist/cli/worktree-reap.d.ts.map +1 -1
- package/dist/cli/worktree-reap.js +7 -1
- package/dist/cli/worktree-reap.js.map +1 -1
- package/package.json +9 -5
- package/schemas/cost.schema.json +114 -0
- package/schemas/daemon-status.schema.json +44 -0
- package/schemas/logs-line.schema.json +133 -0
- package/schemas/queue-add.schema.json +73 -0
- package/schemas/queue-list.schema.json +77 -0
- package/schemas/resume.schema.json +36 -0
- package/schemas/runs-diffstat.schema.json +81 -0
- package/schemas/runs.schema.json +75 -0
- package/schemas/status.schema.json +200 -0
- package/schemas/stop.schema.json +36 -0
- package/schemas/unpark.schema.json +57 -0
- package/schemas/usage.schema.json +28 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { findDeclaredPrerequisites, findSlicePlanComment, readStackSliceGate, upsertSlicePlanComment, withSliceState, } from '@on-par/factory-core/internal';
|
|
2
|
+
import { errorDetail } from './index.js';
|
|
3
|
+
import { findOpenPRForIssue } from './land.js';
|
|
4
|
+
import { getPullRequestLandState } from './land-pr.js';
|
|
5
|
+
export function makeQueuePreflightOps(octokit, owner, repo, opts) {
|
|
6
|
+
let selfId;
|
|
7
|
+
return {
|
|
8
|
+
autoMergeStack: opts.autoMergeStack ?? false,
|
|
9
|
+
stackMode: opts.stackMode ?? false,
|
|
10
|
+
getPullReviews: async (prNumber) => {
|
|
11
|
+
const { data: pull } = await octokit.rest.pulls.get({ owner, repo, pull_number: prNumber });
|
|
12
|
+
selfId ??= octokit.rest.users.getAuthenticated().then(({ data }) => data.id);
|
|
13
|
+
const id = await selfId;
|
|
14
|
+
const reviews = [];
|
|
15
|
+
for (let page = 1;; page++) {
|
|
16
|
+
const { data } = await octokit.rest.pulls.listReviews({
|
|
17
|
+
owner,
|
|
18
|
+
repo,
|
|
19
|
+
pull_number: prNumber,
|
|
20
|
+
per_page: 100,
|
|
21
|
+
page,
|
|
22
|
+
});
|
|
23
|
+
for (const r of data) {
|
|
24
|
+
reviews.push({ reviewerId: r.user?.id ?? null, state: r.state, commitId: r.commit_id ?? null });
|
|
25
|
+
}
|
|
26
|
+
if (data.length < 100)
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
return { headSha: pull.head.sha, selfId: id, reviews };
|
|
30
|
+
},
|
|
31
|
+
onDeferred: opts.onDeferred,
|
|
32
|
+
getPullRefs: async (prNumber) => {
|
|
33
|
+
const { data } = await octokit.rest.pulls.get({ owner, repo, pull_number: prNumber });
|
|
34
|
+
return { headRef: data.head.ref, baseRef: data.base.ref, headSha: data.head.sha };
|
|
35
|
+
},
|
|
36
|
+
branchContains: async (sha, branch) => {
|
|
37
|
+
try {
|
|
38
|
+
const { data } = await octokit.rest.repos.compareCommitsWithBasehead({
|
|
39
|
+
owner,
|
|
40
|
+
repo,
|
|
41
|
+
basehead: `${sha}...${branch}`,
|
|
42
|
+
});
|
|
43
|
+
return data.status === 'ahead' || data.status === 'identical';
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err.status === 404)
|
|
47
|
+
return false;
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
expectedHeadRepoFullName: `${owner}/${repo}`,
|
|
52
|
+
findOpenPR: (issue) => findOpenPRForIssue(octokit, owner, repo, issue),
|
|
53
|
+
getLandState: (prNumber) => getPullRequestLandState(octokit, owner, repo, prNumber),
|
|
54
|
+
watch: opts.watch,
|
|
55
|
+
findSlicePlan: (issue) => findSlicePlanComment({ octokit, repo: `${owner}/${repo}`, issue }),
|
|
56
|
+
getPullState: async (prNumber) => {
|
|
57
|
+
const { data } = await octokit.rest.pulls.get({ owner, repo, pull_number: prNumber });
|
|
58
|
+
if (data.merged || data.merged_at)
|
|
59
|
+
return 'merged';
|
|
60
|
+
return data.state === 'open' ? 'open' : 'closed';
|
|
61
|
+
},
|
|
62
|
+
saveSlicePlan: async (issue, plan) => {
|
|
63
|
+
await upsertSlicePlanComment({ octokit, repo: `${owner}/${repo}`, issue, plan });
|
|
64
|
+
},
|
|
65
|
+
readIssueBody: async (issue) => {
|
|
66
|
+
const { data } = await octokit.rest.issues.get({ owner, repo, issue_number: issue });
|
|
67
|
+
if (!data ||
|
|
68
|
+
typeof data !== 'object' ||
|
|
69
|
+
data.number !== issue ||
|
|
70
|
+
!(data.body === null || typeof data.body === 'string')) {
|
|
71
|
+
throw new Error(`issue #${issue} body response was malformed`);
|
|
72
|
+
}
|
|
73
|
+
return data.body ?? '';
|
|
74
|
+
},
|
|
75
|
+
getPrerequisiteState: async (issue) => {
|
|
76
|
+
let after = null;
|
|
77
|
+
let mergedClosingPr = false;
|
|
78
|
+
let state;
|
|
79
|
+
do {
|
|
80
|
+
const response = await octokit.graphql(`query QueuePrerequisite($owner: String!, $repo: String!, $number: Int!, $after: String) {
|
|
81
|
+
repository(owner: $owner, name: $repo) {
|
|
82
|
+
issue(number: $number) {
|
|
83
|
+
state
|
|
84
|
+
closedByPullRequestsReferences(first: 100, includeClosedPrs: true, after: $after) {
|
|
85
|
+
nodes { merged }
|
|
86
|
+
pageInfo { hasNextPage endCursor }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}`, { owner, repo, number: issue, after });
|
|
91
|
+
if (!isRecord(response) || !isRecord(response.repository) || !isRecord(response.repository.issue)) {
|
|
92
|
+
throw new Error(`prerequisite #${issue} response was incomplete`);
|
|
93
|
+
}
|
|
94
|
+
const item = response.repository.issue;
|
|
95
|
+
if (item.state !== 'OPEN' && item.state !== 'CLOSED')
|
|
96
|
+
throw new Error(`prerequisite #${issue} state was malformed`);
|
|
97
|
+
const nextState = item.state === 'OPEN' ? 'open' : 'closed';
|
|
98
|
+
if (state !== undefined && state !== nextState)
|
|
99
|
+
throw new Error(`prerequisite #${issue} state changed during pagination`);
|
|
100
|
+
state = nextState;
|
|
101
|
+
if (nextState === 'open')
|
|
102
|
+
return { state: 'open', mergedClosingPr: false };
|
|
103
|
+
if (!isRecord(item.closedByPullRequestsReferences))
|
|
104
|
+
throw new Error(`prerequisite #${issue} closing PR evidence was incomplete`);
|
|
105
|
+
const connection = item.closedByPullRequestsReferences;
|
|
106
|
+
if (!Array.isArray(connection.nodes) ||
|
|
107
|
+
!isRecord(connection.pageInfo) ||
|
|
108
|
+
typeof connection.pageInfo.hasNextPage !== 'boolean') {
|
|
109
|
+
throw new Error(`prerequisite #${issue} closing PR evidence was malformed`);
|
|
110
|
+
}
|
|
111
|
+
for (const node of connection.nodes) {
|
|
112
|
+
if (!isRecord(node) || typeof node.merged !== 'boolean')
|
|
113
|
+
throw new Error(`prerequisite #${issue} closing PR node was malformed`);
|
|
114
|
+
if (node.merged)
|
|
115
|
+
mergedClosingPr = true;
|
|
116
|
+
}
|
|
117
|
+
const hasNextPage = connection.pageInfo.hasNextPage;
|
|
118
|
+
const cursor = connection.pageInfo.endCursor;
|
|
119
|
+
if (hasNextPage && (typeof cursor !== 'string' || cursor.length === 0 || cursor === after)) {
|
|
120
|
+
throw new Error(`prerequisite #${issue} pagination cursor was malformed`);
|
|
121
|
+
}
|
|
122
|
+
after = hasNextPage ? cursor : null;
|
|
123
|
+
} while (after !== null && !mergedClosingPr);
|
|
124
|
+
if (state === undefined)
|
|
125
|
+
throw new Error(`prerequisite #${issue} state was unavailable`);
|
|
126
|
+
return { state, mergedClosingPr };
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function isRecord(value) {
|
|
131
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
132
|
+
}
|
|
133
|
+
/** ADR-0147/ADR-0161: walk every pr-open slice PR bottom-up. Merged layers are recorded, a closed layer parks
|
|
134
|
+
* (naming the layers above it), and the lowest open layer defers, or is adopted when stack auto-merge is on and
|
|
135
|
+
* its base is main with green CI on the rebased head. In stack mode a lowest open layer that would defer instead
|
|
136
|
+
* builds the next pending slice once the top built slice PR is merged or approved (#3366). Returns undefined to fall through to the Closes-PR
|
|
137
|
+
* preflight only when no slice PR is still open. */
|
|
138
|
+
async function preflightSlice(issue, deps) {
|
|
139
|
+
let lookup;
|
|
140
|
+
try {
|
|
141
|
+
lookup = await deps.findSlicePlan(issue);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
return { kind: 'park', reason: `slice plan lookup failed: ${errorDetail(err)}` };
|
|
145
|
+
}
|
|
146
|
+
if (lookup.status === 'invalid') {
|
|
147
|
+
return {
|
|
148
|
+
kind: 'park',
|
|
149
|
+
reason: `slice plan comment ${lookup.commentId} on #${issue} is unreadable (${lookup.error})`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (lookup.status === 'not-found')
|
|
153
|
+
return undefined;
|
|
154
|
+
const { plan } = lookup;
|
|
155
|
+
const n = plan.slices.length;
|
|
156
|
+
const open = plan.slices.filter((s) => s.state === 'pr-open');
|
|
157
|
+
if (open.length === 0)
|
|
158
|
+
return undefined;
|
|
159
|
+
let next = plan;
|
|
160
|
+
let lastMerged;
|
|
161
|
+
const save = async () => {
|
|
162
|
+
if (lastMerged === undefined)
|
|
163
|
+
return undefined;
|
|
164
|
+
try {
|
|
165
|
+
await deps.saveSlicePlan(issue, next);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
return {
|
|
169
|
+
kind: 'park',
|
|
170
|
+
reason: `${lastMerged.label} PR #${lastMerged.pr} merged but updating the slice plan failed: ${errorDetail(err)}`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return undefined;
|
|
174
|
+
};
|
|
175
|
+
const waitOrBuild = async () => {
|
|
176
|
+
if (!deps.stackMode)
|
|
177
|
+
return { kind: 'defer' };
|
|
178
|
+
let gate;
|
|
179
|
+
try {
|
|
180
|
+
gate = await readStackSliceGate(next, {
|
|
181
|
+
getPullState: deps.getPullState,
|
|
182
|
+
getPullReviews: deps.getPullReviews,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
deps.onDeferred?.(issue, `stack approval lookup failed: ${errorDetail(err)}`);
|
|
187
|
+
return { kind: 'defer' };
|
|
188
|
+
}
|
|
189
|
+
if (gate.status === 'none')
|
|
190
|
+
return { kind: 'defer' };
|
|
191
|
+
const above = next.slices.find((s) => s.index === gate.index + 1);
|
|
192
|
+
if (above?.state !== 'pending')
|
|
193
|
+
return { kind: 'defer' };
|
|
194
|
+
if (gate.status === 'approved' || gate.status === 'merged')
|
|
195
|
+
return { kind: 'build' };
|
|
196
|
+
deps.onDeferred?.(issue, gate.status === 'changes-requested'
|
|
197
|
+
? `slice ${gate.index}/${n} PR #${gate.prNumber} has changes requested`
|
|
198
|
+
: `waiting for review approval of slice ${gate.index}/${n} PR #${gate.prNumber}`);
|
|
199
|
+
return { kind: 'defer' };
|
|
200
|
+
};
|
|
201
|
+
for (const [at, slice] of open.entries()) {
|
|
202
|
+
const label = `slice ${slice.index}/${n}`;
|
|
203
|
+
if (slice.prNumber === undefined) {
|
|
204
|
+
return { kind: 'park', reason: `${label} of #${issue} is pr-open but the slice plan records no PR number` };
|
|
205
|
+
}
|
|
206
|
+
const pr = slice.prNumber;
|
|
207
|
+
let state;
|
|
208
|
+
try {
|
|
209
|
+
state = await deps.getPullState(pr);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
return { kind: 'park', reason: `${label} PR #${pr} state lookup failed: ${errorDetail(err)}` };
|
|
213
|
+
}
|
|
214
|
+
if (state === 'merged') {
|
|
215
|
+
next = withSliceState(next, slice.index, 'merged', pr);
|
|
216
|
+
lastMerged = { label, pr };
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (state === 'closed') {
|
|
220
|
+
const above = open.slice(at + 1);
|
|
221
|
+
const suffix = above.length > 0
|
|
222
|
+
? `; layers above it: ${above.map((a) => `slice ${a.index}/${n} (#${a.prNumber})`).join(', ')}`
|
|
223
|
+
: '';
|
|
224
|
+
return { kind: 'park', reason: `${label} PR #${pr} was closed without merging${suffix}` };
|
|
225
|
+
}
|
|
226
|
+
const saved = await save();
|
|
227
|
+
if (saved)
|
|
228
|
+
return saved;
|
|
229
|
+
let refs;
|
|
230
|
+
// #3368: the layer below was squash-merged but this branch still carries its original commits: restack it.
|
|
231
|
+
const below = deps.stackMode ? next.slices.find((s) => s.index === slice.index - 1) : undefined;
|
|
232
|
+
if (below?.state === 'merged' && below.prNumber !== undefined) {
|
|
233
|
+
try {
|
|
234
|
+
const mergedRefs = await deps.getPullRefs(below.prNumber);
|
|
235
|
+
refs = await deps.getPullRefs(pr);
|
|
236
|
+
if (await deps.branchContains(mergedRefs.headSha, refs.headRef)) {
|
|
237
|
+
return { kind: 'restack', mergedIndex: below.index, mergedPrNumber: below.prNumber };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
return { kind: 'park', reason: `${label} PR #${pr} restack check failed: ${errorDetail(err)}` };
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (!deps.autoMergeStack)
|
|
245
|
+
return waitOrBuild();
|
|
246
|
+
if (refs === undefined) {
|
|
247
|
+
try {
|
|
248
|
+
refs = await deps.getPullRefs(pr);
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
return { kind: 'park', reason: `${label} PR #${pr} ref lookup failed: ${errorDetail(err)}` };
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// GitHub has not retargeted the layer to main yet: the lower layer is still unmerged.
|
|
255
|
+
if (refs.baseRef !== 'main')
|
|
256
|
+
return waitOrBuild();
|
|
257
|
+
let outcome;
|
|
258
|
+
try {
|
|
259
|
+
outcome = await deps.watch(refs.headSha);
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
return { kind: 'park', reason: `CI watch for ${label} PR #${pr} failed: ${errorDetail(err)}` };
|
|
263
|
+
}
|
|
264
|
+
if (outcome === 'failure')
|
|
265
|
+
return { kind: 'park', reason: `CI for ${label} PR #${pr} ended failure` };
|
|
266
|
+
if (outcome !== 'success')
|
|
267
|
+
return waitOrBuild();
|
|
268
|
+
return { kind: 'adopt', branch: refs.headRef, stackLayer: { index: slice.index, count: n, prNumber: pr } };
|
|
269
|
+
}
|
|
270
|
+
return (await save()) ?? undefined;
|
|
271
|
+
}
|
|
272
|
+
/** Resolve queued work from GitHub evidence without consuming model or worktree resources. */
|
|
273
|
+
export async function preflightQueuedIssue(issue, deps) {
|
|
274
|
+
if (issue.labels.includes('factory:in-progress'))
|
|
275
|
+
return { kind: 'defer' };
|
|
276
|
+
let body;
|
|
277
|
+
try {
|
|
278
|
+
body = await deps.readIssueBody(issue.number);
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
deps.onDeferred?.(issue.number, `issue body lookup failed: ${errorDetail(err)}`);
|
|
282
|
+
return { kind: 'defer' };
|
|
283
|
+
}
|
|
284
|
+
const prerequisites = findDeclaredPrerequisites(body);
|
|
285
|
+
const open = [];
|
|
286
|
+
const closedUnmerged = [];
|
|
287
|
+
const errors = [];
|
|
288
|
+
for (const prerequisite of prerequisites) {
|
|
289
|
+
try {
|
|
290
|
+
const evidence = await deps.getPrerequisiteState(prerequisite);
|
|
291
|
+
if (evidence.state === 'open')
|
|
292
|
+
open.push(prerequisite);
|
|
293
|
+
else if (evidence.state === 'closed' && !evidence.mergedClosingPr)
|
|
294
|
+
closedUnmerged.push(prerequisite);
|
|
295
|
+
else if (evidence.state !== 'closed')
|
|
296
|
+
errors.push(`#${prerequisite}: unexpected state`);
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
errors.push(`#${prerequisite}: ${errorDetail(err)}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (errors.length > 0) {
|
|
303
|
+
const unresolved = [...open, ...closedUnmerged].map((number) => `#${number}`);
|
|
304
|
+
const message = [
|
|
305
|
+
`prerequisite evidence lookup failed: ${errors.join('; ')}`,
|
|
306
|
+
unresolved.length ? `unresolved: ${unresolved.join(', ')}` : '',
|
|
307
|
+
]
|
|
308
|
+
.filter(Boolean)
|
|
309
|
+
.join('; ');
|
|
310
|
+
deps.onDeferred?.(issue.number, message);
|
|
311
|
+
return { kind: 'defer' };
|
|
312
|
+
}
|
|
313
|
+
if (closedUnmerged.length > 0)
|
|
314
|
+
return { kind: 'park', reason: `prerequisite #${closedUnmerged[0]} closed unmerged` };
|
|
315
|
+
if (open.length > 0) {
|
|
316
|
+
deps.onDeferred?.(issue.number, `waiting for prerequisites: ${open.map((number) => `#${number}`).join(', ')}`);
|
|
317
|
+
return { kind: 'defer' };
|
|
318
|
+
}
|
|
319
|
+
const slice = await preflightSlice(issue.number, deps);
|
|
320
|
+
if (slice)
|
|
321
|
+
return slice;
|
|
322
|
+
let pr;
|
|
323
|
+
try {
|
|
324
|
+
pr = await deps.findOpenPR(issue.number);
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
return { kind: 'park', reason: `PR lookup failed: ${errorDetail(err)}` };
|
|
328
|
+
}
|
|
329
|
+
if (!pr)
|
|
330
|
+
return { kind: 'build' };
|
|
331
|
+
if (pr.headRepoFullName !== deps.expectedHeadRepoFullName) {
|
|
332
|
+
return { kind: 'park', reason: `PR #${pr.number} head is not in ${deps.expectedHeadRepoFullName}` };
|
|
333
|
+
}
|
|
334
|
+
let state;
|
|
335
|
+
try {
|
|
336
|
+
state = await deps.getLandState(pr.number);
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
return { kind: 'park', reason: `PR #${pr.number} merge-state lookup failed: ${errorDetail(err)}` };
|
|
340
|
+
}
|
|
341
|
+
if (state.isDraft !== false) {
|
|
342
|
+
return { kind: 'park', reason: `PR #${pr.number} is draft or its draft state is unavailable` };
|
|
343
|
+
}
|
|
344
|
+
if (!state.mergeStateStatus || state.mergeStateStatus === 'UNKNOWN') {
|
|
345
|
+
return { kind: 'park', reason: `PR #${pr.number} merge state is unavailable` };
|
|
346
|
+
}
|
|
347
|
+
let outcome;
|
|
348
|
+
try {
|
|
349
|
+
outcome = await deps.watch(pr.headSha);
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
return { kind: 'park', reason: `CI watch for PR #${pr.number} failed: ${errorDetail(err)}` };
|
|
353
|
+
}
|
|
354
|
+
if (outcome !== 'success')
|
|
355
|
+
return { kind: 'park', reason: `CI for PR #${pr.number} ended ${outcome}` };
|
|
356
|
+
return { kind: 'adopt', branch: pr.branch };
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=queue-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-preflight.js","sourceRoot":"","sources":["../../src/cli/queue-preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type RiskPolicy } from '@on-par/factory-core/internal';
|
|
2
|
+
import type { DoctorCheck } from './doctor.js';
|
|
3
|
+
export declare function riskPolicyCheck(repoRoot: string, load?: (repoRoot: string) => RiskPolicy): DoctorCheck;
|
|
4
|
+
export declare function riskPolicyLines(repoRoot: string, load?: (repoRoot: string) => RiskPolicy): {
|
|
5
|
+
lines: string[];
|
|
6
|
+
rules?: RiskPolicy['rules'];
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=risk-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-policy.d.ts","sourceRoot":"","sources":["../../src/cli/risk-policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0D,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAExH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa/C,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAA2B,GACtD,WAAW,CAcb;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAA2B,GACtD;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;CAAE,CAQlD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// packages/cli/src/cli/risk-policy.ts — the doctor risk-policy row and the land risk-policy lines (#3387)
|
|
2
|
+
import { formatRiskPolicy, loadRiskPolicy, riskPolicyConfigFile } from '@on-par/factory-core/internal';
|
|
3
|
+
const errorMessage = (err) => (err instanceof Error ? err.message : String(err));
|
|
4
|
+
/** The config file to name in a fix hint; the generic name when the path itself cannot resolve. */
|
|
5
|
+
function configFileForHint(repoRoot) {
|
|
6
|
+
try {
|
|
7
|
+
return riskPolicyConfigFile(repoRoot);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return '.factory/config.yaml';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function riskPolicyCheck(repoRoot, load = loadRiskPolicy) {
|
|
14
|
+
// 'Repo' matches REPO_SECTION in doctor.ts; a runtime import from doctor.ts would create a cycle.
|
|
15
|
+
try {
|
|
16
|
+
return { name: 'risk policy', section: 'Repo', ok: true, detail: formatRiskPolicy(load(repoRoot)).join('; ') };
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return {
|
|
20
|
+
name: 'risk policy',
|
|
21
|
+
section: 'Repo',
|
|
22
|
+
ok: false,
|
|
23
|
+
optional: true,
|
|
24
|
+
detail: errorMessage(err),
|
|
25
|
+
fix: `fix the \`risk\` section of ${configFileForHint(repoRoot)} (schema: packages/config/src/risk.ts) or remove it to use the packaged defaults`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function riskPolicyLines(repoRoot, load = loadRiskPolicy) {
|
|
30
|
+
try {
|
|
31
|
+
const policy = load(repoRoot);
|
|
32
|
+
const [summary, ...rest] = formatRiskPolicy(policy);
|
|
33
|
+
return { lines: [`risk policy: ${summary}`, ...rest.map((l) => ` ${l}`)], rules: policy.rules };
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return { lines: [`risk policy: ${errorMessage(err)}; the risk receipt uses the packaged defaults`] };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=risk-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-policy.js","sourceRoot":"","sources":["../../src/cli/risk-policy.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAE1G,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,oBAAoB,EAAmB,MAAM,+BAA+B,CAAC;AAIxH,MAAM,YAAY,GAAG,CAAC,GAAY,EAAU,EAAE,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAElG,mGAAmG;AACnG,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sBAAsB,CAAC;IAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,IAAI,GAAqC,cAAc;IAEvD,kGAAkG;IAClG,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,MAAM;YACf,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC;YACzB,GAAG,EAAE,+BAA+B,iBAAiB,CAAC,QAAQ,CAAC,kFAAkF;SAClJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,IAAI,GAAqC,cAAc;IAEvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,CAAC,gBAAgB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACnG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,CAAC,gBAAgB,YAAY,CAAC,GAAG,CAAC,+CAA+C,CAAC,EAAE,CAAC;IACvG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type RiskRuleSet } from '@on-par/factory-config';
|
|
2
|
+
import { listPrChangedFiles, type RiskEvaluation, type RiskPolicy } from '@on-par/factory-core/internal';
|
|
3
|
+
import type { CliExitError } from './index.js';
|
|
4
|
+
export declare class RiskCommandError extends Error {
|
|
5
|
+
readonly code: number;
|
|
6
|
+
constructor(message: string, code: number, options?: ErrorOptions);
|
|
7
|
+
}
|
|
8
|
+
export interface RiskCommandDeps {
|
|
9
|
+
/** owner/name of the repo the PR lives in; used in messages. */
|
|
10
|
+
repo: string;
|
|
11
|
+
listFiles: (pr: number) => Promise<string[]>;
|
|
12
|
+
readFile: (path: string) => string;
|
|
13
|
+
fileExists: (path: string) => boolean;
|
|
14
|
+
/** The repo policy (the `risk` section of `.factory/config.yaml`, else the packaged defaults) used when `--policy` is absent (#3387). */
|
|
15
|
+
loadRepoPolicy: () => RiskPolicy;
|
|
16
|
+
log: (line: string) => void;
|
|
17
|
+
}
|
|
18
|
+
/** Parse the <pr> argument (`42` or `#42`) into a positive safe integer; exit 2 otherwise. */
|
|
19
|
+
export declare function parsePrArg(raw: string): number;
|
|
20
|
+
export declare function loadRiskPolicy(path: string | undefined, deps: Pick<RiskCommandDeps, 'readFile' | 'fileExists' | 'loadRepoPolicy'>): {
|
|
21
|
+
rules: RiskRuleSet;
|
|
22
|
+
source: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function formatRiskReport(pr: number, evaluation: RiskEvaluation, policySource: string): string[];
|
|
25
|
+
export declare function runRiskCommand(prArg: string, opts: {
|
|
26
|
+
policy?: string;
|
|
27
|
+
}, deps: RiskCommandDeps): Promise<RiskEvaluation>;
|
|
28
|
+
/** What `factory risk` needs from the CLI entry point; index.ts binds it (#3385). */
|
|
29
|
+
export interface RiskRuntime {
|
|
30
|
+
getRepoRoot: () => Promise<string>;
|
|
31
|
+
getGitHubRepo: () => Promise<string>;
|
|
32
|
+
getOctokit: () => Parameters<typeof listPrChangedFiles>[0];
|
|
33
|
+
CliExitError: typeof CliExitError;
|
|
34
|
+
log: (line: string) => void;
|
|
35
|
+
}
|
|
36
|
+
/** Wire the real filesystem and GitHub reads for `runRiskCommand`. */
|
|
37
|
+
export declare function riskCommandDeps(repoRoot: string, slug: string, rt: Pick<RiskRuntime, 'getOctokit' | 'log'>): RiskCommandDeps;
|
|
38
|
+
/** `factory risk <pr>`: a RiskCommandError becomes a CliExitError carrying its exit code. */
|
|
39
|
+
export declare function cmdRisk(pr: string, opts: {
|
|
40
|
+
policy?: string;
|
|
41
|
+
}, rt: RiskRuntime): Promise<void>;
|
|
42
|
+
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/cli/risk.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAEL,kBAAkB,EAElB,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,YAAY,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAIhE;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,yIAAyI;IACzI,cAAc,EAAE,MAAM,UAAU,CAAC;IACjC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,8FAA8F;AAC9F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,YAAY,GAAG,gBAAgB,CAAC,GACxE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAwBxC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAOvG;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACzB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,CAAC,CAgBzB;AAED,qFAAqF;AACrF,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,KAAK,CAAC,GAC1C,eAAe,CAUjB;AAED,6FAA6F;AAC7F,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CASnG"}
|
package/dist/cli/risk.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// packages/cli/src/cli/risk.ts — `factory risk <pr>`: print a PR's risk tier and matched rules (#3385)
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { parseRiskRules } from '@on-par/factory-config';
|
|
5
|
+
import { evaluateRisk, listPrChangedFiles, loadRiskPolicy as loadRepoRiskPolicy, } from '@on-par/factory-core/internal';
|
|
6
|
+
export class RiskCommandError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
constructor(message, code, options) {
|
|
9
|
+
super(message, options);
|
|
10
|
+
this.name = 'RiskCommandError';
|
|
11
|
+
this.code = code;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Parse the <pr> argument (`42` or `#42`) into a positive safe integer; exit 2 otherwise. */
|
|
15
|
+
export function parsePrArg(raw) {
|
|
16
|
+
const trimmed = raw.trim();
|
|
17
|
+
const digits = trimmed.startsWith('#') ? trimmed.slice(1) : trimmed;
|
|
18
|
+
const n = Number(digits);
|
|
19
|
+
if (!/^\d+$/.test(digits) || !Number.isSafeInteger(n) || n <= 0) {
|
|
20
|
+
throw new RiskCommandError(`factory risk: invalid PR argument '${raw}' — expected a positive PR number`, 2);
|
|
21
|
+
}
|
|
22
|
+
return n;
|
|
23
|
+
}
|
|
24
|
+
export function loadRiskPolicy(path, deps) {
|
|
25
|
+
if (path === undefined) {
|
|
26
|
+
try {
|
|
27
|
+
const policy = deps.loadRepoPolicy();
|
|
28
|
+
return {
|
|
29
|
+
rules: policy.rules,
|
|
30
|
+
source: policy.source === 'repo' ? `${policy.file} \`risk\`` : 'packaged defaults',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
// The loader's message names the config file (and the `risk` key for an invalid section).
|
|
35
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
36
|
+
throw new RiskCommandError(`factory risk: invalid risk policy — ${detail}`, 2, { cause: err });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!deps.fileExists(path)) {
|
|
40
|
+
throw new RiskCommandError(`factory risk: risk policy file not found: ${path}`, 2);
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const rules = parseRiskRules(JSON.parse(deps.readFile(path)));
|
|
44
|
+
return { rules, source: path };
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
48
|
+
throw new RiskCommandError(`factory risk: invalid risk policy ${path} — ${detail}`, 2, { cause: err });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function formatRiskReport(pr, evaluation, policySource) {
|
|
52
|
+
const lines = [`PR #${pr}: tier ${evaluation.tier}`, `Policy: ${policySource}`, 'Matched rules:'];
|
|
53
|
+
for (const rule of evaluation.rules) {
|
|
54
|
+
const paths = rule.paths.length > 0 ? rule.paths.join(', ') : '(no changed files)';
|
|
55
|
+
lines.push(` - ${rule.id} (${rule.tier}): ${paths}`);
|
|
56
|
+
}
|
|
57
|
+
return lines;
|
|
58
|
+
}
|
|
59
|
+
export async function runRiskCommand(prArg, opts, deps) {
|
|
60
|
+
const pr = parsePrArg(prArg);
|
|
61
|
+
const policy = loadRiskPolicy(opts.policy, deps);
|
|
62
|
+
let paths;
|
|
63
|
+
try {
|
|
64
|
+
paths = await deps.listFiles(pr);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err?.status === 404) {
|
|
68
|
+
throw new RiskCommandError(`factory risk: PR #${pr} not found in ${deps.repo}`, 1);
|
|
69
|
+
}
|
|
70
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
71
|
+
throw new RiskCommandError(`factory risk: could not list files for PR #${pr} — ${detail}`, 1);
|
|
72
|
+
}
|
|
73
|
+
const evaluation = evaluateRisk({ paths, rules: policy.rules });
|
|
74
|
+
for (const line of formatRiskReport(pr, evaluation, policy.source))
|
|
75
|
+
deps.log(line);
|
|
76
|
+
return evaluation;
|
|
77
|
+
}
|
|
78
|
+
/** Wire the real filesystem and GitHub reads for `runRiskCommand`. */
|
|
79
|
+
export function riskCommandDeps(repoRoot, slug, rt) {
|
|
80
|
+
const [owner = '', repo = ''] = slug.split('/');
|
|
81
|
+
return {
|
|
82
|
+
repo: slug,
|
|
83
|
+
listFiles: (n) => listPrChangedFiles(rt.getOctokit(), owner, repo, n),
|
|
84
|
+
readFile: (p) => readFileSync(resolve(repoRoot, p), 'utf-8'),
|
|
85
|
+
fileExists: (p) => existsSync(resolve(repoRoot, p)),
|
|
86
|
+
loadRepoPolicy: () => loadRepoRiskPolicy(repoRoot),
|
|
87
|
+
log: rt.log,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** `factory risk <pr>`: a RiskCommandError becomes a CliExitError carrying its exit code. */
|
|
91
|
+
export async function cmdRisk(pr, opts, rt) {
|
|
92
|
+
try {
|
|
93
|
+
parsePrArg(pr); // a bad <pr> exits 2 before any git or GitHub lookup
|
|
94
|
+
const deps = riskCommandDeps(await rt.getRepoRoot(), await rt.getGitHubRepo(), rt);
|
|
95
|
+
await runRiskCommand(pr, opts, deps);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
if (err instanceof RiskCommandError)
|
|
99
|
+
throw new rt.CliExitError(err.message, err.code);
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/cli/risk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Octokit } from '@octokit/rest';
|
|
2
|
+
import { type LocalOnlyPolicy, type SizeGateMode, type WorkRequest } from '@on-par/factory-core';
|
|
3
|
+
import { type CheckResumeRecord } from '@on-par/factory-core/internal';
|
|
4
|
+
/**
|
|
5
|
+
* Picks the lane branch. A plain GitHub-issue claim first looks for the issue's open factory PR so a requeue
|
|
6
|
+
* continues on the stranded draft even after a title or prefix change (#2253); several candidates park as
|
|
7
|
+
* escalate before any worktree exists. resume, local-only, slice and stack runs keep their branch selection.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveRunBranch(opts: {
|
|
10
|
+
issueNum: number;
|
|
11
|
+
issueTitle: string;
|
|
12
|
+
ghRepo: string;
|
|
13
|
+
branchPrefix?: string;
|
|
14
|
+
sizeGateMode: SizeGateMode;
|
|
15
|
+
work: WorkRequest;
|
|
16
|
+
ctx?: {
|
|
17
|
+
localOnly?: LocalOnlyPolicy;
|
|
18
|
+
resumeFrom?: CheckResumeRecord;
|
|
19
|
+
lane?: string;
|
|
20
|
+
};
|
|
21
|
+
/** --no-pr: always a fresh branch, never an adopted open PR's. */
|
|
22
|
+
noPr?: boolean;
|
|
23
|
+
octokit: Octokit;
|
|
24
|
+
eventsFile: string;
|
|
25
|
+
}): Promise<string>;
|
|
26
|
+
//# sourceMappingURL=run-branch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-branch.d.ts","sourceRoot":"","sources":["../../src/cli/run-branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAuB,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtH,OAAO,EAAwC,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAI7G;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,eAAe,CAAC;QAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,kEAAkE;IAClE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoClB"}
|