@on-par/factory-cli 0.9.18-next.3 → 0.9.18-next.5
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/cli/awaiting-ci-recheck.d.ts +31 -0
- package/dist/cli/awaiting-ci-recheck.d.ts.map +1 -0
- package/dist/cli/awaiting-ci-recheck.js +61 -0
- package/dist/cli/awaiting-ci-recheck.js.map +1 -0
- package/dist/cli/awaiting-ci-wiring.d.ts +6 -0
- package/dist/cli/awaiting-ci-wiring.d.ts.map +1 -0
- package/dist/cli/awaiting-ci-wiring.js +45 -0
- package/dist/cli/awaiting-ci-wiring.js.map +1 -0
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/land-pr.d.ts +11 -0
- package/dist/cli/land-pr.d.ts.map +1 -1
- package/dist/cli/land-pr.js +27 -1
- package/dist/cli/land-pr.js.map +1 -1
- package/dist/cli/land.d.ts.map +1 -1
- package/dist/cli/land.js +3 -3
- package/dist/cli/land.js.map +1 -1
- package/dist/cli/run-lane-deps.d.ts +7 -1
- package/dist/cli/run-lane-deps.d.ts.map +1 -1
- package/dist/cli/run-lane.d.ts.map +1 -1
- package/dist/cli/run-lane.js +31 -3
- package/dist/cli/run-lane.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +4 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/ship-steps.d.ts.map +1 -1
- package/dist/cli/ship-steps.js +1 -0
- package/dist/cli/ship-steps.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { EventKind } from '@on-par/factory-core';
|
|
2
|
+
import { type AwaitingCiRecord, type RequiredChecksState } from '@on-par/factory-core/internal';
|
|
3
|
+
export type AwaitingCiParkReason = 'ci-failed' | 'ci-never-started';
|
|
4
|
+
/** The lane's own park path and event sink, handed to the re-check so it parks exactly like a lane park. */
|
|
5
|
+
export interface AwaitingCiLaneOps {
|
|
6
|
+
park(rec: AwaitingCiRecord, reason: AwaitingCiParkReason, message: string): Promise<void>;
|
|
7
|
+
emit(kind: EventKind, issue: number, message: string): void;
|
|
8
|
+
}
|
|
9
|
+
export interface AwaitingCiRecheckDeps extends AwaitingCiLaneOps {
|
|
10
|
+
file: string;
|
|
11
|
+
now(): number;
|
|
12
|
+
capMs: number;
|
|
13
|
+
getPr(prNumber: number): Promise<{
|
|
14
|
+
state: 'open' | 'closed';
|
|
15
|
+
merged: boolean;
|
|
16
|
+
headSha: string;
|
|
17
|
+
baseRef: string;
|
|
18
|
+
}>;
|
|
19
|
+
/** The verdict on the PR's current head; `total` is the number of check runs on it. */
|
|
20
|
+
verdict(args: {
|
|
21
|
+
headSha: string;
|
|
22
|
+
baseRef: string;
|
|
23
|
+
}): Promise<RequiredChecksState & {
|
|
24
|
+
total: number;
|
|
25
|
+
}>;
|
|
26
|
+
/** Squash-merges pinned to `sha`, the head the verdict was computed on. */
|
|
27
|
+
merge(rec: AwaitingCiRecord, sha: string): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/** Handles every awaiting-ci record that is due: merge on green, park on failure or past the cap, else reschedule. */
|
|
30
|
+
export declare function recheckDueAwaitingCi(deps: AwaitingCiRecheckDeps): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=awaiting-ci-recheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awaiting-ci-recheck.d.ts","sourceRoot":"","sources":["../../src/cli/awaiting-ci-recheck.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,kBAAkB,CAAC;AAEpE,4GAA4G;AAC5G,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,IAAI,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClH,uFAAuF;IACvF,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtG,2EAA2E;IAC3E,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAKD,sHAAsH;AACtH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgErF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// packages/cli/src/cli/awaiting-ci-recheck.ts — re-checks PRs left open because their CI never started (#3208)
|
|
2
|
+
import { clearAwaitingCi, nextRecheckAt, readAwaitingCi, upsertAwaitingCi, } from '@on-par/factory-core/internal';
|
|
3
|
+
const HOUR_MS = 3_600_000;
|
|
4
|
+
const hoursSince = (from, to) => Math.round(((to - from) / HOUR_MS) * 10) / 10;
|
|
5
|
+
/** Handles every awaiting-ci record that is due: merge on green, park on failure or past the cap, else reschedule. */
|
|
6
|
+
export async function recheckDueAwaitingCi(deps) {
|
|
7
|
+
const { file, now, capMs, getPr, verdict, merge, park, emit } = deps;
|
|
8
|
+
const due = (await readAwaitingCi(file)).filter((rec) => rec.nextRecheckAt <= now());
|
|
9
|
+
for (const rec of due) {
|
|
10
|
+
const label = `PR #${rec.prNumber}`;
|
|
11
|
+
const reschedule = async (headSha) => {
|
|
12
|
+
const attempts = rec.attempts + 1;
|
|
13
|
+
const next = nextRecheckAt(rec.firstSeenAt, attempts);
|
|
14
|
+
await upsertAwaitingCi(file, { ...rec, headSha, attempts, nextRecheckAt: next });
|
|
15
|
+
emit('awaiting-ci', rec.issue, `${label} still awaiting CI on ${headSha}; next re-check at ${new Date(next).toISOString()}`);
|
|
16
|
+
};
|
|
17
|
+
try {
|
|
18
|
+
const pr = await getPr(rec.prNumber);
|
|
19
|
+
if (pr.state === 'closed' || pr.merged) {
|
|
20
|
+
await clearAwaitingCi(file, rec.issue);
|
|
21
|
+
emit('awaiting-ci', rec.issue, `${label} is ${pr.merged ? 'merged' : 'closed'}; no longer awaiting CI`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const sha = pr.headSha;
|
|
25
|
+
const v = await verdict({ headSha: sha, baseRef: pr.baseRef });
|
|
26
|
+
if (v.state === 'green') {
|
|
27
|
+
try {
|
|
28
|
+
await merge(rec, sha);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
emit('warn', rec.issue, `${label} merge pinned to ${sha} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
32
|
+
await reschedule(sha);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
await clearAwaitingCi(file, rec.issue);
|
|
36
|
+
emit('ship', rec.issue, `${label} CI went green on ${sha}; squash-merged pinned to that commit`);
|
|
37
|
+
}
|
|
38
|
+
else if (v.state === 'failed') {
|
|
39
|
+
await park(rec, 'ci-failed', `CI failed for ${label} on ${sha}: ${v.failed.join(', ')} — refusing to merge`);
|
|
40
|
+
await clearAwaitingCi(file, rec.issue);
|
|
41
|
+
}
|
|
42
|
+
else if (now() - rec.firstSeenAt >= capMs) {
|
|
43
|
+
const hours = hoursSince(rec.firstSeenAt, now());
|
|
44
|
+
if (v.total === 0) {
|
|
45
|
+
await park(rec, 'ci-never-started', `${label} head ${sha}: no CI run ever registered after ${hours} h — a CI or config problem, not a failing build`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
await park(rec, 'ci-failed', `CI still pending after ${hours} h for ${label} on ${sha} — refusing to merge`);
|
|
49
|
+
}
|
|
50
|
+
await clearAwaitingCi(file, rec.issue);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
await reschedule(sha);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
emit('warn', rec.issue, `awaiting-ci re-check of ${label} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=awaiting-ci-recheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awaiting-ci-recheck.js","sourceRoot":"","sources":["../../src/cli/awaiting-ci-recheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FactoryConfig, getFactoryPaths } from '@on-par/factory-core';
|
|
2
|
+
import type { Octokit } from '@octokit/rest';
|
|
3
|
+
import type { RunLaneDeps } from './run-lane-deps.js';
|
|
4
|
+
/** Binds the awaiting-ci store, cap and GitHub lookups into the two RunLaneDeps that use them. */
|
|
5
|
+
export declare function awaitingCiLaneDeps(getOctokit: () => Octokit, ghRepo: string, paths: ReturnType<typeof getFactoryPaths>, config: FactoryConfig): Pick<RunLaneDeps, 'recordAwaitingCi' | 'recheckAwaitingCi'>;
|
|
6
|
+
//# sourceMappingURL=awaiting-ci-wiring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awaiting-ci-wiring.d.ts","sourceRoot":"","sources":["../../src/cli/awaiting-ci-wiring.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAW3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,kGAAkG;AAClG,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,OAAO,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EACzC,MAAM,EAAE,aAAa,GACpB,IAAI,CAAC,WAAW,EAAE,kBAAkB,GAAG,mBAAmB,CAAC,CAsC7D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// packages/cli/src/cli/awaiting-ci-wiring.ts — production RunLaneDeps for the awaiting-ci record and re-check (#3208)
|
|
2
|
+
import { resolveMergePolicy } from '@on-par/factory-core';
|
|
3
|
+
import { awaitingCiFile, classifyHeadChecks, fetchRequiredContexts, listAllCheckRuns, resolveAwaitingCiCapMs, upsertAwaitingCi, warnNoBranchProtectionOnce, } from '@on-par/factory-core/internal';
|
|
4
|
+
import { recheckDueAwaitingCi } from './awaiting-ci-recheck.js';
|
|
5
|
+
import { squashMergeAndDelete } from './land-pr.js';
|
|
6
|
+
/** Binds the awaiting-ci store, cap and GitHub lookups into the two RunLaneDeps that use them. */
|
|
7
|
+
export function awaitingCiLaneDeps(getOctokit, ghRepo, paths, config) {
|
|
8
|
+
const file = awaitingCiFile(paths);
|
|
9
|
+
const [owner, repo] = ghRepo.split('/');
|
|
10
|
+
return {
|
|
11
|
+
recordAwaitingCi: (rec) => upsertAwaitingCi(file, rec),
|
|
12
|
+
recheckAwaitingCi: (ops) => {
|
|
13
|
+
const octokit = getOctokit();
|
|
14
|
+
return recheckDueAwaitingCi({
|
|
15
|
+
...ops,
|
|
16
|
+
file,
|
|
17
|
+
now: () => Date.now(),
|
|
18
|
+
capMs: resolveAwaitingCiCapMs(config),
|
|
19
|
+
getPr: async (prNumber) => {
|
|
20
|
+
const { data } = await octokit.rest.pulls.get({ owner, repo, pull_number: prNumber });
|
|
21
|
+
return { state: data.state, merged: data.merged, headSha: data.head.sha, baseRef: data.base.ref };
|
|
22
|
+
},
|
|
23
|
+
verdict: async ({ headSha, baseRef }) => {
|
|
24
|
+
const required = await fetchRequiredContexts(octokit, { owner, repo, branch: baseRef });
|
|
25
|
+
const all = await listAllCheckRuns(octokit, owner, repo, headSha, 100, 10);
|
|
26
|
+
const runs = all.map((r) => ({
|
|
27
|
+
name: r.name ?? '',
|
|
28
|
+
status: r.status ?? null,
|
|
29
|
+
conclusion: r.conclusion ?? null,
|
|
30
|
+
}));
|
|
31
|
+
const v = classifyHeadChecks(required, runs);
|
|
32
|
+
if (v.basis === 'all-on-head') {
|
|
33
|
+
warnNoBranchProtectionOnce(ghRepo, baseRef, (m) => ops.emit('warn', 0, m));
|
|
34
|
+
}
|
|
35
|
+
return v;
|
|
36
|
+
},
|
|
37
|
+
merge: (rec, sha) => squashMergeAndDelete(octokit, owner, repo, rec.branch, rec.prNumber, {
|
|
38
|
+
admin: resolveMergePolicy(config).admin,
|
|
39
|
+
sha,
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=awaiting-ci-wiring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awaiting-ci-wiring.js","sourceRoot":"","sources":["../../src/cli/awaiting-ci-wiring.ts"],"names":[],"mappings":"AAAA,sHAAsH;AAGtH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,oBAAoB,EAA0B,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,kGAAkG;AAClG,MAAM,UAAU,kBAAkB,CAChC,UAAyB,EACzB,MAAc,EACd,KAAyC,EACzC,MAAqB;IAErB,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO;QACL,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC;QACtD,iBAAiB,EAAE,CAAC,GAAsB,EAAE,EAAE;YAC5C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,OAAO,oBAAoB,CAAC;gBAC1B,GAAG,GAAG;gBACN,IAAI;gBACJ,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBACrB,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC;gBACrC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oBACxB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACtF,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACpG,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;oBACtC,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;oBACxF,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC3E,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;wBAClB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;wBACxB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;qBACjC,CAAC,CAAC,CAAC;oBACJ,MAAM,CAAC,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAC7C,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;wBAC9B,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC7E,CAAC;oBACD,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAClB,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnE,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,KAAK;oBACvC,GAAG;iBACJ,CAAC;aACL,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -25,7 +25,7 @@ import { buildSteerabilityReport } from './steerability-report.js';
|
|
|
25
25
|
import { runHarnessCheckCommand } from './harness-check.js';
|
|
26
26
|
import { landIssue } from './land.js';
|
|
27
27
|
import { STOP_SET_MESSAGE } from './stop-sentinel.js';
|
|
28
|
-
import { AwaitingReviewError, CiFailedError,
|
|
28
|
+
import { AwaitingReviewError, CiFailedError, isCiNotGreen, LandConflictError, LandFailureError, MergeGatedError, } from './land-pr.js';
|
|
29
29
|
import { setLandRuntime } from './land-runtime.js';
|
|
30
30
|
import { cmdRun } from './run.js';
|
|
31
31
|
import { shipIssue } from './ship.js';
|
|
@@ -2006,7 +2006,7 @@ export async function cmdLand(issueNum, opts = {}, deps = {}) {
|
|
|
2006
2006
|
console.log(styleText('yellow', `⏸ PR #${err.prNumber} for issue #${issueNum} awaiting human review — left open`));
|
|
2007
2007
|
return;
|
|
2008
2008
|
}
|
|
2009
|
-
if (err
|
|
2009
|
+
if (isCiNotGreen(err)) {
|
|
2010
2010
|
console.log(styleText('yellow', `⏸ PR #${err.prNumber} for issue #${issueNum} — CI never reached a green verdict — left open, not merged`));
|
|
2011
2011
|
return;
|
|
2012
2012
|
}
|