@on-par/factory-core 0.9.7-next.9 → 0.9.8-next.1
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/blockers/dependencies.d.ts +19 -0
- package/dist/blockers/dependencies.d.ts.map +1 -0
- package/dist/blockers/dependencies.js +49 -0
- package/dist/blockers/dependencies.js.map +1 -0
- package/dist/blockers/file-blocker.d.ts +44 -0
- package/dist/blockers/file-blocker.d.ts.map +1 -0
- package/dist/blockers/file-blocker.js +203 -0
- package/dist/blockers/file-blocker.js.map +1 -0
- package/dist/blockers/index.d.ts +7 -0
- package/dist/blockers/index.d.ts.map +1 -0
- package/dist/blockers/index.js +5 -0
- package/dist/blockers/index.js.map +1 -0
- package/dist/blockers/poller.d.ts +37 -0
- package/dist/blockers/poller.d.ts.map +1 -0
- package/dist/blockers/poller.js +111 -0
- package/dist/blockers/poller.js.map +1 -0
- 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/example.d.ts.map +1 -1
- package/dist/config/example.js +18 -0
- package/dist/config/example.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/repo-build-pin.d.ts +4 -0
- package/dist/config/repo-build-pin.d.ts.map +1 -0
- package/dist/config/repo-build-pin.js +13 -0
- package/dist/config/repo-build-pin.js.map +1 -0
- package/dist/config/repo-harnesses.d.ts +43 -0
- package/dist/config/repo-harnesses.d.ts.map +1 -0
- package/dist/config/repo-harnesses.js +20 -0
- package/dist/config/repo-harnesses.js.map +1 -0
- package/dist/config/repo.d.ts +44 -11
- package/dist/config/repo.d.ts.map +1 -1
- package/dist/config/repo.js +35 -31
- package/dist/config/repo.js.map +1 -1
- package/dist/daemon/execution-config.d.ts +34 -0
- package/dist/daemon/execution-config.d.ts.map +1 -1
- package/dist/daemon/run-runtime.d.ts +34 -0
- package/dist/daemon/run-runtime.d.ts.map +1 -1
- package/dist/daemon/ship-executor.js +2 -3
- package/dist/daemon/ship-executor.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/eval/score.d.ts.map +1 -1
- package/dist/eval/score.js +2 -1
- package/dist/eval/score.js.map +1 -1
- package/dist/events/kinds.d.ts +1 -1
- package/dist/events/kinds.d.ts.map +1 -1
- package/dist/events/kinds.js +3 -0
- package/dist/events/kinds.js.map +1 -1
- package/dist/harness/catalog.d.ts +2 -0
- package/dist/harness/catalog.d.ts.map +1 -1
- package/dist/harness/catalog.js +5 -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/harness/index.d.ts +1 -1
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +1 -0
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/opencode-version.d.ts +7 -0
- package/dist/harness/opencode-version.d.ts.map +1 -0
- package/dist/harness/opencode-version.js +20 -0
- package/dist/harness/opencode-version.js.map +1 -0
- package/dist/harness/opencode.d.ts +10 -2
- package/dist/harness/opencode.d.ts.map +1 -1
- package/dist/harness/opencode.js +26 -5
- package/dist/harness/opencode.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 +4 -4
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +4 -2
- 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/models/index.d.ts +2 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +7 -1
- package/dist/models/index.js.map +1 -1
- package/dist/phases/build.d.ts +6 -2
- package/dist/phases/build.d.ts.map +1 -1
- package/dist/phases/build.js +43 -12
- package/dist/phases/build.js.map +1 -1
- package/dist/phases/check.d.ts +32 -2
- package/dist/phases/check.d.ts.map +1 -1
- package/dist/phases/check.js +5 -6
- package/dist/phases/check.js.map +1 -1
- package/dist/phases/plan-route.d.ts +16 -0
- package/dist/phases/plan-route.d.ts.map +1 -0
- package/dist/phases/plan-route.js +38 -0
- package/dist/phases/plan-route.js.map +1 -0
- package/dist/phases/plan-routes.d.ts +16 -1
- package/dist/phases/plan-routes.d.ts.map +1 -1
- package/dist/phases/plan-routes.js +40 -1
- package/dist/phases/plan-routes.js.map +1 -1
- package/dist/phases/plan.d.ts +4 -3
- package/dist/phases/plan.d.ts.map +1 -1
- package/dist/phases/plan.js +15 -30
- 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.d.ts +8 -6
- package/dist/phases/ship.d.ts.map +1 -1
- package/dist/phases/ship.js +71 -121
- package/dist/phases/ship.js.map +1 -1
- package/dist/queue/queue-backend.d.ts +6 -1
- package/dist/queue/queue-backend.d.ts.map +1 -1
- package/dist/queue/queue-backend.js +7 -1
- package/dist/queue/queue-backend.js.map +1 -1
- package/dist/queue/unpark.d.ts +28 -0
- package/dist/queue/unpark.d.ts.map +1 -0
- package/dist/queue/unpark.js +69 -0
- package/dist/queue/unpark.js.map +1 -0
- 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/router/index.d.ts.map +1 -1
- package/dist/router/index.js +2 -13
- package/dist/router/index.js.map +1 -1
- package/dist/router/requires.d.ts +4 -0
- package/dist/router/requires.d.ts.map +1 -0
- package/dist/router/requires.js +22 -0
- package/dist/router/requires.js.map +1 -0
- 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/outcome.d.ts +9 -2
- package/dist/run/outcome.d.ts.map +1 -1
- package/dist/run/outcome.js +5 -0
- package/dist/run/outcome.js.map +1 -1
- package/dist/run/park-comment.d.ts +73 -0
- package/dist/run/park-comment.d.ts.map +1 -0
- package/dist/run/park-comment.js +211 -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/resume-context.d.ts +3 -2
- package/dist/run/resume-context.d.ts.map +1 -1
- package/dist/run/resume-context.js.map +1 -1
- package/dist/run/run-issue.d.ts +2 -1
- package/dist/run/run-issue.d.ts.map +1 -1
- package/dist/run/run-issue.js +50 -52
- package/dist/run/run-issue.js.map +1 -1
- package/dist/sandbox/index.js +1 -1
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sim/pipeline.d.ts +2 -1
- package/dist/sim/pipeline.d.ts.map +1 -1
- package/dist/sim/pipeline.js.map +1 -1
- package/dist/spec/index.d.ts +3 -2
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +1 -1
- package/dist/spec/index.js.map +1 -1
- package/dist/steward/detect.d.ts +2 -1
- package/dist/steward/detect.d.ts.map +1 -1
- package/dist/steward/detect.js +3 -2
- package/dist/steward/detect.js.map +1 -1
- package/dist/types/index.d.ts +34 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/usage/index.js +1 -1
- package/dist/usage/index.js.map +1 -1
- package/dist/utils/command-runner.js +2 -2
- package/dist/utils/command-runner.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,19 @@
|
|
|
1
|
+
import type { Octokit } from '@octokit/rest';
|
|
2
|
+
export interface DependencyClientDeps {
|
|
3
|
+
octokit: Octokit;
|
|
4
|
+
repo: string;
|
|
5
|
+
}
|
|
6
|
+
export interface BlockedByItem {
|
|
7
|
+
number: number;
|
|
8
|
+
state: 'open' | 'closed';
|
|
9
|
+
stateReason: string | null;
|
|
10
|
+
repository: string;
|
|
11
|
+
}
|
|
12
|
+
/** Lists the issues that block `issue` (GET .../dependencies/blocked_by). */
|
|
13
|
+
export declare function listBlockedBy(deps: DependencyClientDeps, issue: number): Promise<BlockedByItem[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Marks `issue` as blocked by another issue (POST .../dependencies/blocked_by).
|
|
16
|
+
* `blockerIssueId` is the blocker's database id (`issue.id`), NOT its issue number.
|
|
17
|
+
*/
|
|
18
|
+
export declare function addBlockedBy(deps: DependencyClientDeps, issue: number, blockerIssueId: number): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/blockers/dependencies.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAoBD,6EAA6E;AAC7E,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAqBvG;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnH"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// src/blockers/dependencies.ts — thin client for GitHub's native issue dependencies
|
|
2
|
+
// ("blocked by") REST endpoints (#2316).
|
|
3
|
+
//
|
|
4
|
+
// Only the same-repo list and add operations the blocker filer needs. Errors propagate;
|
|
5
|
+
// a listing that does not parse to an array fails closed (ADR-0018) rather than reading
|
|
6
|
+
// as "no blockers".
|
|
7
|
+
function repositoryOf(item, fallback) {
|
|
8
|
+
if (item.repository?.full_name !== undefined) {
|
|
9
|
+
return item.repository.full_name;
|
|
10
|
+
}
|
|
11
|
+
if (item.repository_url !== undefined) {
|
|
12
|
+
return item.repository_url.split('/').slice(-2).join('/');
|
|
13
|
+
}
|
|
14
|
+
return fallback;
|
|
15
|
+
}
|
|
16
|
+
/** Lists the issues that block `issue` (GET .../dependencies/blocked_by). */
|
|
17
|
+
export async function listBlockedBy(deps, issue) {
|
|
18
|
+
const [owner, repo] = deps.repo.split('/');
|
|
19
|
+
const response = await deps.octokit.request('GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by', {
|
|
20
|
+
owner,
|
|
21
|
+
repo,
|
|
22
|
+
issue_number: issue,
|
|
23
|
+
per_page: 100,
|
|
24
|
+
});
|
|
25
|
+
const data = response.data;
|
|
26
|
+
if (!Array.isArray(data)) {
|
|
27
|
+
throw new Error('blocked_by listing did not return an array');
|
|
28
|
+
}
|
|
29
|
+
return data.map((item) => ({
|
|
30
|
+
number: item.number,
|
|
31
|
+
state: item.state === 'closed' ? 'closed' : 'open',
|
|
32
|
+
stateReason: item.state_reason ?? null,
|
|
33
|
+
repository: repositoryOf(item, deps.repo),
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Marks `issue` as blocked by another issue (POST .../dependencies/blocked_by).
|
|
38
|
+
* `blockerIssueId` is the blocker's database id (`issue.id`), NOT its issue number.
|
|
39
|
+
*/
|
|
40
|
+
export async function addBlockedBy(deps, issue, blockerIssueId) {
|
|
41
|
+
const [owner, repo] = deps.repo.split('/');
|
|
42
|
+
await deps.octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by', {
|
|
43
|
+
owner,
|
|
44
|
+
repo,
|
|
45
|
+
issue_number: issue,
|
|
46
|
+
issue_id: blockerIssueId,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/blockers/dependencies.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,yCAAyC;AACzC,EAAE;AACF,wFAAwF;AACxF,wFAAwF;AACxF,oBAAoB;AAwBpB,SAAS,YAAY,CAAC,IAAsB,EAAE,QAAgB;IAC5D,IAAI,IAAI,CAAC,UAAU,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAA0B,EAAE,KAAa;IAC3E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACzC,yEAAyE,EACzE;QACE,KAAK;QACL,IAAI;QACJ,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,GAAG;KACd,CACF,CAAC;IACF,MAAM,IAAI,GAAY,QAAQ,CAAC,IAAI,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAQ,IAA2B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;QAClD,WAAW,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;QACtC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;KAC1C,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAA0B,EAAE,KAAa,EAAE,cAAsB;IAClG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC/D,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,0EAA0E,EAAE;QACrG,KAAK;QACL,IAAI;QACJ,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,cAAc;KACzB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Octokit } from '@octokit/rest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { FilingPolicy } from '../filing/policy.js';
|
|
4
|
+
export declare const MAX_BLOCKER_CHILDREN = 3;
|
|
5
|
+
export declare const BlockerClaimSchema: z.ZodObject<{
|
|
6
|
+
title: z.ZodString;
|
|
7
|
+
problem: z.ZodString;
|
|
8
|
+
inScope: z.ZodArray<z.ZodString>;
|
|
9
|
+
acceptance: z.ZodArray<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type BlockerClaim = z.infer<typeof BlockerClaimSchema>;
|
|
12
|
+
export type BlockerRefusalReason = 'invalid-claim' | 'parent-is-blocker' | 'max-blockers-reached' | 'daily-cap-reached' | 'listing-unverified' | 'create-failed' | 'link-failed';
|
|
13
|
+
export declare class BlockerFilingError extends Error {
|
|
14
|
+
readonly reason: BlockerRefusalReason;
|
|
15
|
+
readonly childNumber?: number;
|
|
16
|
+
constructor(reason: BlockerRefusalReason, message: string, childNumber?: number);
|
|
17
|
+
}
|
|
18
|
+
export type FileBlockerResult = {
|
|
19
|
+
outcome: 'filed';
|
|
20
|
+
number: number;
|
|
21
|
+
} | {
|
|
22
|
+
outcome: 'existing';
|
|
23
|
+
number: number;
|
|
24
|
+
} | {
|
|
25
|
+
outcome: 'duplicate';
|
|
26
|
+
number: number;
|
|
27
|
+
title: string;
|
|
28
|
+
similarity: number;
|
|
29
|
+
};
|
|
30
|
+
export interface FileBlockerDeps {
|
|
31
|
+
octokit: Octokit;
|
|
32
|
+
repo: string;
|
|
33
|
+
parent: number;
|
|
34
|
+
claim: unknown;
|
|
35
|
+
policy: Pick<FilingPolicy, 'maxPerDay'>;
|
|
36
|
+
now?: () => Date;
|
|
37
|
+
}
|
|
38
|
+
export declare function hashBlockerClaim(claim: BlockerClaim): string;
|
|
39
|
+
/** Matches the marker of any factory-filed blocker, whatever its parent or hash. */
|
|
40
|
+
export declare const BLOCKER_MARKER_RE: RegExp;
|
|
41
|
+
export declare function blockerMarker(parent: number, hash: string): string;
|
|
42
|
+
export declare function renderBlockerBody(claim: BlockerClaim, parent: number, hash: string): string;
|
|
43
|
+
export declare function fileBlocker(deps: FileBlockerDeps): Promise<FileBlockerResult>;
|
|
44
|
+
//# sourceMappingURL=file-blocker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-blocker.d.ts","sourceRoot":"","sources":["../../src/blockers/file-blocker.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAGtC,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAC5B,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,mBAAmB,GACnB,oBAAoB,GACpB,eAAe,GACf,aAAa,CAAC;AAElB,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B,YAAY,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAO9E;CACF;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAYD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAQ5D;AAED,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,QAA6C,CAAC;AAE5E,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA2B3F;AAmGD,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqDnF"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// src/blockers/file-blocker.ts — deterministic filer for one prerequisite ("blocker") child
|
|
2
|
+
// of a parent issue (#2316).
|
|
3
|
+
//
|
|
4
|
+
// Takes one validated claim, files it as a factory-task child, links it as a native
|
|
5
|
+
// sub-issue and adds it to the parent's blocked_by list. Idempotent via a body marker,
|
|
6
|
+
// duplicate-guarded (ADR-0106), bounded (3 children per parent, depth 2, per-day cap) and
|
|
7
|
+
// fail-closed on unverifiable listings (ADR-0018). It does not decide when to file.
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { findDuplicateStory } from '../readiness/duplicate-guard.js';
|
|
11
|
+
import { MAX_ACCEPTANCE_CRITERIA_ITEMS, MAX_IN_SCOPE_ITEMS } from '../readiness/size.js';
|
|
12
|
+
import { addBlockedBy, listBlockedBy } from './dependencies.js';
|
|
13
|
+
export const MAX_BLOCKER_CHILDREN = 3;
|
|
14
|
+
const BLOCKER_MARKER_PREFIX = '<!-- factory-blocker v1 ';
|
|
15
|
+
export const BlockerClaimSchema = z.object({
|
|
16
|
+
title: z.string().trim().min(1).max(256),
|
|
17
|
+
problem: z.string().min(1),
|
|
18
|
+
inScope: z.array(z.string().min(1)).min(1).max(MAX_IN_SCOPE_ITEMS),
|
|
19
|
+
acceptance: z.array(z.string().min(1)).min(1).max(MAX_ACCEPTANCE_CRITERIA_ITEMS),
|
|
20
|
+
});
|
|
21
|
+
export class BlockerFilingError extends Error {
|
|
22
|
+
reason;
|
|
23
|
+
childNumber;
|
|
24
|
+
constructor(reason, message, childNumber) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = 'BlockerFilingError';
|
|
27
|
+
this.reason = reason;
|
|
28
|
+
if (childNumber !== undefined) {
|
|
29
|
+
this.childNumber = childNumber;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const errorDetail = (error) => (error instanceof Error ? error.message : String(error));
|
|
34
|
+
export function hashBlockerClaim(claim) {
|
|
35
|
+
const normalized = JSON.stringify([
|
|
36
|
+
claim.title.trim(),
|
|
37
|
+
claim.problem.trim(),
|
|
38
|
+
claim.inScope.map((item) => item.trim()),
|
|
39
|
+
claim.acceptance.map((item) => item.trim()),
|
|
40
|
+
]);
|
|
41
|
+
return createHash('sha256').update(normalized).digest('hex').slice(0, 12);
|
|
42
|
+
}
|
|
43
|
+
/** Matches the marker of any factory-filed blocker, whatever its parent or hash. */
|
|
44
|
+
export const BLOCKER_MARKER_RE = /<!-- factory-blocker v1 parent:\d+ hash:/;
|
|
45
|
+
export function blockerMarker(parent, hash) {
|
|
46
|
+
return `<!-- factory-blocker v1 parent:${parent} hash:${hash} -->`;
|
|
47
|
+
}
|
|
48
|
+
export function renderBlockerBody(claim, parent, hash) {
|
|
49
|
+
return [
|
|
50
|
+
'## Problem statement',
|
|
51
|
+
'',
|
|
52
|
+
claim.problem,
|
|
53
|
+
'',
|
|
54
|
+
'## In scope',
|
|
55
|
+
'',
|
|
56
|
+
...claim.inScope.map((item) => `- ${item}`),
|
|
57
|
+
'',
|
|
58
|
+
'## Out of scope',
|
|
59
|
+
'',
|
|
60
|
+
'- Anything beyond the in-scope items above.',
|
|
61
|
+
'',
|
|
62
|
+
'## Acceptance criteria',
|
|
63
|
+
'',
|
|
64
|
+
...claim.acceptance.map((item) => `- [ ] ${item}`),
|
|
65
|
+
'',
|
|
66
|
+
'## Verification',
|
|
67
|
+
'',
|
|
68
|
+
'- bash scripts/verify.sh --no-e2e — passes when: it exits 0',
|
|
69
|
+
'',
|
|
70
|
+
'---',
|
|
71
|
+
'',
|
|
72
|
+
`Filed by the factory as a prerequisite blocking #${parent}.`,
|
|
73
|
+
blockerMarker(parent, hash),
|
|
74
|
+
].join('\n');
|
|
75
|
+
}
|
|
76
|
+
function hasBlockerMarker(body) {
|
|
77
|
+
return body?.includes(BLOCKER_MARKER_PREFIX) === true;
|
|
78
|
+
}
|
|
79
|
+
function isBlockerChildOf(body, parent) {
|
|
80
|
+
return new RegExp(`<!-- factory-blocker v1 parent:${parent} hash:[0-9a-f]+ -->`).test(body ?? '');
|
|
81
|
+
}
|
|
82
|
+
function unverified(what, error) {
|
|
83
|
+
return new BlockerFilingError('listing-unverified', `could not verify ${what}: ${errorDetail(error)}`);
|
|
84
|
+
}
|
|
85
|
+
async function readParentGuard(octokit, owner, repo, parent) {
|
|
86
|
+
let body;
|
|
87
|
+
try {
|
|
88
|
+
body = (await octokit.rest.issues.get({ owner, repo, issue_number: parent })).data.body;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw unverified(`parent #${parent}`, error);
|
|
92
|
+
}
|
|
93
|
+
if (hasBlockerMarker(body)) {
|
|
94
|
+
throw new BlockerFilingError('parent-is-blocker', `#${parent} is itself a blocker child (depth limit 2)`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function readSubIssues(octokit, owner, repo, parent) {
|
|
98
|
+
let items;
|
|
99
|
+
try {
|
|
100
|
+
items = await octokit.paginate('GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues', {
|
|
101
|
+
owner,
|
|
102
|
+
repo,
|
|
103
|
+
issue_number: parent,
|
|
104
|
+
per_page: 100,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw unverified(`sub-issues of #${parent}`, error);
|
|
109
|
+
}
|
|
110
|
+
if (!Array.isArray(items)) {
|
|
111
|
+
throw unverified(`sub-issues of #${parent}`, 'payload is not an array');
|
|
112
|
+
}
|
|
113
|
+
return items;
|
|
114
|
+
}
|
|
115
|
+
async function countFiledToday(octokit, owner, repo, start) {
|
|
116
|
+
let items;
|
|
117
|
+
try {
|
|
118
|
+
items = await octokit.paginate('GET /repos/{owner}/{repo}/issues', {
|
|
119
|
+
owner,
|
|
120
|
+
repo,
|
|
121
|
+
state: 'all',
|
|
122
|
+
since: start.toISOString(),
|
|
123
|
+
per_page: 100,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
throw unverified('issues filed today', error);
|
|
128
|
+
}
|
|
129
|
+
if (!Array.isArray(items)) {
|
|
130
|
+
throw unverified('issues filed today', 'payload is not an array');
|
|
131
|
+
}
|
|
132
|
+
return items.filter((item) => item.pull_request === undefined && Date.parse(item.created_at) >= start.getTime() && hasBlockerMarker(item.body)).length;
|
|
133
|
+
}
|
|
134
|
+
async function healExisting(deps, existing) {
|
|
135
|
+
try {
|
|
136
|
+
const blockedBy = await listBlockedBy(deps, deps.parent);
|
|
137
|
+
if (!blockedBy.some((item) => item.number === existing.number)) {
|
|
138
|
+
await addBlockedBy(deps, deps.parent, existing.id);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
throw new BlockerFilingError('link-failed', `could not link existing blocker #${existing.number}: ${errorDetail(error)}`, existing.number);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function linkChild(deps, owner, repo, created) {
|
|
146
|
+
try {
|
|
147
|
+
await deps.octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues', {
|
|
148
|
+
owner,
|
|
149
|
+
repo,
|
|
150
|
+
issue_number: deps.parent,
|
|
151
|
+
sub_issue_id: created.id,
|
|
152
|
+
});
|
|
153
|
+
await addBlockedBy(deps, deps.parent, created.id);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
throw new BlockerFilingError('link-failed', `filed #${created.number} but could not link it to #${deps.parent}: ${errorDetail(error)}`, created.number);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export async function fileBlocker(deps) {
|
|
160
|
+
const { octokit, parent } = deps;
|
|
161
|
+
const [owner, repo] = deps.repo.split('/');
|
|
162
|
+
const now = (deps.now ?? (() => new Date()))();
|
|
163
|
+
const parsed = BlockerClaimSchema.safeParse(deps.claim);
|
|
164
|
+
if (!parsed.success) {
|
|
165
|
+
throw new BlockerFilingError('invalid-claim', parsed.error.issues.map((issue) => issue.message).join('; '));
|
|
166
|
+
}
|
|
167
|
+
const claim = parsed.data;
|
|
168
|
+
const hash = hashBlockerClaim(claim);
|
|
169
|
+
const body = renderBlockerBody(claim, parent, hash);
|
|
170
|
+
await readParentGuard(octokit, owner, repo, parent);
|
|
171
|
+
const subIssues = await readSubIssues(octokit, owner, repo, parent);
|
|
172
|
+
const marker = blockerMarker(parent, hash);
|
|
173
|
+
const existing = subIssues.find((item) => item.body?.includes(marker) === true);
|
|
174
|
+
if (existing !== undefined) {
|
|
175
|
+
await healExisting(deps, existing);
|
|
176
|
+
return { outcome: 'existing', number: existing.number };
|
|
177
|
+
}
|
|
178
|
+
if (subIssues.filter((item) => isBlockerChildOf(item.body, parent)).length >= MAX_BLOCKER_CHILDREN) {
|
|
179
|
+
throw new BlockerFilingError('max-blockers-reached', `#${parent} already has ${MAX_BLOCKER_CHILDREN} blocker children`);
|
|
180
|
+
}
|
|
181
|
+
const openSiblings = subIssues
|
|
182
|
+
.filter((item) => item.state === 'open')
|
|
183
|
+
.map((item) => ({ number: item.number, title: item.title, body: item.body ?? null }));
|
|
184
|
+
const duplicate = findDuplicateStory(`${claim.title} ${body}`, openSiblings);
|
|
185
|
+
if (duplicate !== undefined) {
|
|
186
|
+
return { outcome: 'duplicate', ...duplicate };
|
|
187
|
+
}
|
|
188
|
+
const start = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
|
|
189
|
+
if ((await countFiledToday(octokit, owner, repo, start)) >= deps.policy.maxPerDay) {
|
|
190
|
+
throw new BlockerFilingError('daily-cap-reached', `daily blocker filing cap of ${deps.policy.maxPerDay} reached`);
|
|
191
|
+
}
|
|
192
|
+
let created;
|
|
193
|
+
try {
|
|
194
|
+
const response = await octokit.rest.issues.create({ owner, repo, title: claim.title, body });
|
|
195
|
+
created = { id: response.data.id, number: response.data.number, title: claim.title };
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
throw new BlockerFilingError('create-failed', `could not create blocker issue: ${errorDetail(error)}`);
|
|
199
|
+
}
|
|
200
|
+
await linkChild(deps, owner, repo, created);
|
|
201
|
+
return { outcome: 'filed', number: created.number };
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=file-blocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-blocker.js","sourceRoot":"","sources":["../../src/blockers/file-blocker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { addBlockedBy, listBlockedBy } from './dependencies.js';
|
|
2
|
+
export type { BlockedByItem, DependencyClientDeps } from './dependencies.js';
|
|
3
|
+
export { BLOCKER_MARKER_RE, BlockerClaimSchema, BlockerFilingError, MAX_BLOCKER_CHILDREN, blockerMarker, fileBlocker, hashBlockerClaim, renderBlockerBody, } from './file-blocker.js';
|
|
4
|
+
export type { BlockerClaim, BlockerRefusalReason, FileBlockerDeps, FileBlockerResult } from './file-blocker.js';
|
|
5
|
+
export { MAX_AUTO_UNPARKS, createOctokitBlockedParkStore, pollBlockedParks } from './poller.js';
|
|
6
|
+
export type { BlockedParkOutcome, BlockedParkPollResult, BlockedParkStore, BlockerEvidence, PollBlockedParksOptions, } from './poller.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blockers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChG,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,uBAAuB,GACxB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// src/blockers/index.ts — barrel for the blocker filing API, re-exported from internal.ts (ADR-0004).
|
|
2
|
+
export { addBlockedBy, listBlockedBy } from './dependencies.js';
|
|
3
|
+
export { BLOCKER_MARKER_RE, BlockerClaimSchema, BlockerFilingError, MAX_BLOCKER_CHILDREN, blockerMarker, fileBlocker, hashBlockerClaim, renderBlockerBody, } from './file-blocker.js';
|
|
4
|
+
export { MAX_AUTO_UNPARKS, createOctokitBlockedParkStore, pollBlockedParks } from './poller.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/blockers/index.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Octokit } from '@octokit/rest';
|
|
2
|
+
import { type QueueGitHubClient } from '../queue/github-queue.js';
|
|
3
|
+
import type { ParkStateComment } from '../run/park-comment.js';
|
|
4
|
+
import { type BlockedByItem } from './dependencies.js';
|
|
5
|
+
export declare const MAX_AUTO_UNPARKS = 2;
|
|
6
|
+
export interface BlockerEvidence {
|
|
7
|
+
factoryFiled: boolean;
|
|
8
|
+
mergedClosingPr: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface BlockedParkStore {
|
|
11
|
+
/** The authenticated identity's lowest-id park-state comment on `issue`, or undefined. */
|
|
12
|
+
readParkComment(issue: number): Promise<ParkStateComment | undefined>;
|
|
13
|
+
updateComment(commentId: number, body: string): Promise<void>;
|
|
14
|
+
listBlockedBy(issue: number): Promise<BlockedByItem[]>;
|
|
15
|
+
/** Only asked for same-repo blockers that are closed `completed`. */
|
|
16
|
+
blockerEvidence(blocker: number): Promise<BlockerEvidence>;
|
|
17
|
+
}
|
|
18
|
+
export type BlockedParkOutcome = 'unparked' | 'held' | 'capped' | 'waiting' | 'skipped' | 'raced' | 'error';
|
|
19
|
+
export interface BlockedParkPollResult {
|
|
20
|
+
issue: number;
|
|
21
|
+
outcome: BlockedParkOutcome;
|
|
22
|
+
detail?: string;
|
|
23
|
+
lane?: string;
|
|
24
|
+
order?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface PollBlockedParksOptions {
|
|
27
|
+
client: QueueGitHubClient;
|
|
28
|
+
owner: string;
|
|
29
|
+
repo: string;
|
|
30
|
+
store: BlockedParkStore;
|
|
31
|
+
/** Event sink; the CLI wires it to the events log. Defaults to a no-op. */
|
|
32
|
+
logEvent?: (kind: 'issue_unparked' | 'warn', issue: number, message: string) => void;
|
|
33
|
+
}
|
|
34
|
+
/** One failing parent never stops the poll of the others. */
|
|
35
|
+
export declare function pollBlockedParks(opts: PollBlockedParksOptions): Promise<BlockedParkPollResult[]>;
|
|
36
|
+
export declare function createOctokitBlockedParkStore(octokit: Octokit, repo: string): BlockedParkStore;
|
|
37
|
+
//# sourceMappingURL=poller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../../src/blockers/poller.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,mBAAmB,CAAC;AAGtE,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IACtE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACvD,qEAAqE;IACrE,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5D;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5G,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,gBAAgB,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtF;AAiED,6DAA6D;AAC7D,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAYtG;AAID,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAoB9F"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// src/blockers/poller.ts — auto-unpark parents parked `blocked` once their blockers resolve (#2318, ADR-0018, ADR-0044).
|
|
2
|
+
//
|
|
3
|
+
// Deterministic: reads the trusted park comment plus GitHub `blocked_by`, never an LLM. Unknown or malformed
|
|
4
|
+
// input fails closed (stays parked or goes `held`), never unparks.
|
|
5
|
+
import { PARKED_LABEL } from '../queue/github-queue.js';
|
|
6
|
+
import { runUnpark, UnparkError } from '../queue/unpark.js';
|
|
7
|
+
import { findOwnParkComment, patchParkComment, readParkState } from '../run/park-comment.js';
|
|
8
|
+
import { listBlockedBy } from './dependencies.js';
|
|
9
|
+
import { BLOCKER_MARKER_RE } from './file-blocker.js';
|
|
10
|
+
export const MAX_AUTO_UNPARKS = 2;
|
|
11
|
+
function message(err) {
|
|
12
|
+
return err instanceof Error ? err.message : String(err);
|
|
13
|
+
}
|
|
14
|
+
async function pollOne(opts, n) {
|
|
15
|
+
const { client, owner, repo, store, logEvent = () => { } } = opts;
|
|
16
|
+
const comment = await store.readParkComment(n);
|
|
17
|
+
const state = comment && readParkState([comment], n);
|
|
18
|
+
if (!comment || !state)
|
|
19
|
+
return { issue: n, outcome: 'skipped', detail: 'no park comment' };
|
|
20
|
+
if (state.reason !== 'blocked')
|
|
21
|
+
return { issue: n, outcome: 'skipped', detail: `reason ${state.reason}` };
|
|
22
|
+
const blockers = await store.listBlockedBy(n);
|
|
23
|
+
if (blockers.length === 0)
|
|
24
|
+
return { issue: n, outcome: 'skipped', detail: 'no blockers' };
|
|
25
|
+
let waiting = false;
|
|
26
|
+
let abandoned;
|
|
27
|
+
for (const b of blockers) {
|
|
28
|
+
if (b.state === 'open') {
|
|
29
|
+
waiting = true;
|
|
30
|
+
}
|
|
31
|
+
else if (b.stateReason === 'completed') {
|
|
32
|
+
if (b.repository === `${owner}/${repo}`) {
|
|
33
|
+
const ev = await store.blockerEvidence(b.number);
|
|
34
|
+
if (ev.factoryFiled && !ev.mergedClosingPr)
|
|
35
|
+
waiting = true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
abandoned ??= `blocker #${b.number} closed ${b.stateReason ?? 'without a reason'}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const hold = async (outcome, detail) => {
|
|
43
|
+
const patch = { reason: 'held', status: `held: ${detail}` };
|
|
44
|
+
const body = patchParkComment(comment.body, n, patch);
|
|
45
|
+
if (body !== null)
|
|
46
|
+
await store.updateComment(comment.id, body);
|
|
47
|
+
return { issue: n, outcome, detail };
|
|
48
|
+
};
|
|
49
|
+
if (abandoned !== undefined)
|
|
50
|
+
return hold('held', abandoned);
|
|
51
|
+
if (waiting)
|
|
52
|
+
return { issue: n, outcome: 'waiting' };
|
|
53
|
+
if (state.autoUnparks >= MAX_AUTO_UNPARKS)
|
|
54
|
+
return hold('capped', `auto-unpark cap (${MAX_AUTO_UNPARKS}) reached`);
|
|
55
|
+
let result;
|
|
56
|
+
try {
|
|
57
|
+
result = await runUnpark({ client, owner, repo, issue: n });
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (err instanceof UnparkError && err.code === 'not-parked') {
|
|
61
|
+
return { issue: n, outcome: 'raced', detail: err.message };
|
|
62
|
+
}
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
logEvent('issue_unparked', n, `#${n} auto-unparked → ${result.lane} (order ${result.order}): blockers ${blockers.map((b) => `#${b.number}`).join(', ')} resolved`);
|
|
66
|
+
try {
|
|
67
|
+
const body = patchParkComment(comment.body, n, { status: 'resumed', autoUnparks: state.autoUnparks + 1 });
|
|
68
|
+
if (body !== null)
|
|
69
|
+
await store.updateComment(comment.id, body);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
logEvent('warn', n, `park comment not updated: ${message(err)}`);
|
|
73
|
+
}
|
|
74
|
+
return { issue: n, outcome: 'unparked', lane: result.lane, order: result.order };
|
|
75
|
+
}
|
|
76
|
+
/** One failing parent never stops the poll of the others. */
|
|
77
|
+
export async function pollBlockedParks(opts) {
|
|
78
|
+
const { client, owner, repo } = opts;
|
|
79
|
+
const parked = await client.listOpenIssuesWithLabels({ owner, repo, labels: [PARKED_LABEL] });
|
|
80
|
+
const results = [];
|
|
81
|
+
for (const { number } of parked) {
|
|
82
|
+
try {
|
|
83
|
+
results.push(await pollOne(opts, number));
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
results.push({ issue: number, outcome: 'error', detail: message(err) });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return results;
|
|
90
|
+
}
|
|
91
|
+
const CLOSING_PRS_QUERY = `query($owner:String!,$name:String!,$number:Int!){repository(owner:$owner,name:$name){issue(number:$number){closedByPullRequestsReferences(first:25,includeClosedPrs:true){nodes{merged}}}}}`;
|
|
92
|
+
export function createOctokitBlockedParkStore(octokit, repo) {
|
|
93
|
+
const [owner, name] = repo.split('/');
|
|
94
|
+
return {
|
|
95
|
+
readParkComment: (issue) => findOwnParkComment({ octokit, repo, issue }),
|
|
96
|
+
async updateComment(commentId, body) {
|
|
97
|
+
await octokit.rest.issues.updateComment({ owner, repo: name, comment_id: commentId, body });
|
|
98
|
+
},
|
|
99
|
+
listBlockedBy: (issue) => listBlockedBy({ octokit, repo }, issue),
|
|
100
|
+
async blockerEvidence(blocker) {
|
|
101
|
+
const { data } = await octokit.rest.issues.get({ owner, repo: name, issue_number: blocker });
|
|
102
|
+
const response = await octokit.graphql(CLOSING_PRS_QUERY, { owner, name, number: blocker });
|
|
103
|
+
const nodes = response?.repository?.issue?.closedByPullRequestsReferences?.nodes;
|
|
104
|
+
return {
|
|
105
|
+
factoryFiled: BLOCKER_MARKER_RE.test(data.body ?? ''),
|
|
106
|
+
mergedClosingPr: Array.isArray(nodes) && nodes.some((x) => x?.merged === true),
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=poller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poller.js","sourceRoot":"","sources":["../../src/blockers/poller.ts"],"names":[],"mappings":"AAAA,yHAAyH;AACzH,EAAE;AACF,6GAA6G;AAC7G,mEAAmE;AAInE,OAAO,EAAE,YAAY,EAA0B,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAyB,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEpH,OAAO,EAAsB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAmClC,SAAS,OAAO,CAAC,GAAY;IAC3B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAA6B,EAAE,CAAS;IAC7D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IACjE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,IAAI,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC3F,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;IAE1G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAE1F,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,SAA6B,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;YACzC,IAAI,CAAC,CAAC,UAAU,KAAK,GAAG,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC;gBACxC,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACjD,IAAI,EAAE,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC,eAAe;oBAAE,OAAO,GAAG,IAAI,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,KAAK,YAAY,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;QACrF,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,EAAE,OAA0B,EAAE,MAAc,EAAkC,EAAE;QAChG,MAAM,KAAK,GAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC;QAC9E,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACvC,CAAC,CAAC;IAEF,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACrD,IAAI,KAAK,CAAC,WAAW,IAAI,gBAAgB;QAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,oBAAoB,gBAAgB,WAAW,CAAC,CAAC;IAElH,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC5D,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAC7D,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,QAAQ,CACN,gBAAgB,EAChB,CAAC,EACD,IAAI,CAAC,oBAAoB,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,KAAK,eAAe,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CACpI,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1G,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,6BAA6B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACnF,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA6B;IAClE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC9F,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,iBAAiB,GAAG,6LAA6L,CAAC;AAExN,MAAM,UAAU,6BAA6B,CAAC,OAAgB,EAAE,IAAY;IAC1E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC1D,OAAO;QACL,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACxE,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI;YACjC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC;QACjE,KAAK,CAAC,eAAe,CAAC,OAAO;YAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7F,MAAM,QAAQ,GAAY,MAAM,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACrG,MAAM,KAAK,GACT,QACD,EAAE,UAAU,EAAE,KAAK,EAAE,8BAA8B,EAAE,KAAK,CAAC;YAC5D,OAAO;gBACL,YAAY,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrD,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAiC,EAAE,MAAM,KAAK,IAAI,CAAC;aAChH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/checkers/index.d.ts
CHANGED
|
@@ -77,6 +77,15 @@ export interface TestsCommand {
|
|
|
77
77
|
label: string;
|
|
78
78
|
}
|
|
79
79
|
export declare function resolveTestsCommand(ctx: CheckerContext): Promise<TestsCommand>;
|
|
80
|
+
/** Worktree facts the lint resolver reads — a subset of CheckerContext so BUILD can call it with just `{ worktree }`. */
|
|
81
|
+
export type LintCommandSource = Pick<CheckerContext, 'worktree' | 'packageJson' | 'probe'>;
|
|
82
|
+
/** One lint-family command the `lint` checker runs; label names it in details and the log file. */
|
|
83
|
+
export interface LintCommand {
|
|
84
|
+
label: 'lint' | 'tsc';
|
|
85
|
+
argv: string[];
|
|
86
|
+
}
|
|
87
|
+
/** Lint commands that apply, in run order: `npm run lint` (package.json lint script), then `npx tsc --noEmit` (tsconfig.json). */
|
|
88
|
+
export declare function resolveLintCommands(ctx: LintCommandSource): Promise<LintCommand[]>;
|
|
80
89
|
export declare const testsChecker: CheckerFn;
|
|
81
90
|
export declare const lintChecker: CheckerFn;
|
|
82
91
|
export declare const linksChecker: CheckerFn;
|
|
@@ -104,5 +113,5 @@ export declare function runAllCheckers(ctx: CheckerContext, router: ModelRouter,
|
|
|
104
113
|
/** One markdown bullet per regression finding — the single formatter the check summary and evidence pack share. */
|
|
105
114
|
export declare function renderCheckerFindings(findings: readonly RegressionFinding[]): string[];
|
|
106
115
|
export declare function summarizeCheckerOutputs(results: CheckerOutput[]): CheckSummary;
|
|
107
|
-
export declare function getPackageJson(ctx:
|
|
116
|
+
export declare function getPackageJson(ctx: LintCommandSource): Promise<PackageJson | null>;
|
|
108
117
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkers/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checkers/index.ts"],"names":[],"mappings":"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"}
|