@davidahmann/mill 0.1.5 → 0.2.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/README.md +141 -32
- package/dist/audit/repository.d.ts.map +1 -1
- package/dist/audit/repository.js +2 -0
- package/dist/audit/repository.js.map +1 -1
- package/dist/cli-program.d.ts.map +1 -1
- package/dist/cli-program.js +189 -0
- package/dist/cli-program.js.map +1 -1
- package/dist/contracts/schemas.d.ts +467 -2
- package/dist/contracts/schemas.d.ts.map +1 -1
- package/dist/contracts/schemas.js +211 -1
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/planning/closure.d.ts +24 -0
- package/dist/planning/closure.d.ts.map +1 -0
- package/dist/planning/closure.js +68 -0
- package/dist/planning/closure.js.map +1 -0
- package/dist/planning/outcomes.d.ts +6 -0
- package/dist/planning/outcomes.d.ts.map +1 -0
- package/dist/planning/outcomes.js +36 -0
- package/dist/planning/outcomes.js.map +1 -0
- package/dist/planning/tasks.d.ts +32 -0
- package/dist/planning/tasks.d.ts.map +1 -0
- package/dist/planning/tasks.js +305 -0
- package/dist/planning/tasks.js.map +1 -0
- package/dist/repository/intelligence.d.ts +78 -0
- package/dist/repository/intelligence.d.ts.map +1 -0
- package/dist/repository/intelligence.js +537 -0
- package/dist/repository/intelligence.js.map +1 -0
- package/dist/repository/native-adoption.d.ts +36 -0
- package/dist/repository/native-adoption.d.ts.map +1 -0
- package/dist/repository/native-adoption.js +146 -0
- package/dist/repository/native-adoption.js.map +1 -0
- package/dist/repository/scan.d.ts.map +1 -1
- package/dist/repository/scan.js +4 -0
- package/dist/repository/scan.js.map +1 -1
- package/dist/runtime/authority-plans.d.ts +43 -0
- package/dist/runtime/authority-plans.d.ts.map +1 -0
- package/dist/runtime/authority-plans.js +173 -0
- package/dist/runtime/authority-plans.js.map +1 -0
- package/dist/runtime/codex.d.ts.map +1 -1
- package/dist/runtime/codex.js +24 -5
- package/dist/runtime/codex.js.map +1 -1
- package/dist/runtime/context.d.ts.map +1 -1
- package/dist/runtime/context.js +36 -0
- package/dist/runtime/context.js.map +1 -1
- package/dist/runtime/delivery.d.ts +8 -1
- package/dist/runtime/delivery.d.ts.map +1 -1
- package/dist/runtime/delivery.js +187 -74
- package/dist/runtime/delivery.js.map +1 -1
- package/dist/runtime/effect-boundary.d.ts +38 -0
- package/dist/runtime/effect-boundary.d.ts.map +1 -0
- package/dist/runtime/effect-boundary.js +59 -0
- package/dist/runtime/effect-boundary.js.map +1 -0
- package/dist/runtime/github.d.ts +24 -0
- package/dist/runtime/github.d.ts.map +1 -1
- package/dist/runtime/github.js +117 -2
- package/dist/runtime/github.js.map +1 -1
- package/dist/runtime/inputs.js.map +1 -1
- package/dist/runtime/lifecycle.d.ts +5 -0
- package/dist/runtime/lifecycle.d.ts.map +1 -1
- package/dist/runtime/lifecycle.js +60 -16
- package/dist/runtime/lifecycle.js.map +1 -1
- package/dist/runtime/merge.d.ts +73 -0
- package/dist/runtime/merge.d.ts.map +1 -0
- package/dist/runtime/merge.js +299 -0
- package/dist/runtime/merge.js.map +1 -0
- package/dist/runtime/public-metadata.d.ts +3 -0
- package/dist/runtime/public-metadata.d.ts.map +1 -0
- package/dist/runtime/public-metadata.js +15 -0
- package/dist/runtime/public-metadata.js.map +1 -0
- package/dist/runtime/repair.d.ts +12 -0
- package/dist/runtime/repair.d.ts.map +1 -0
- package/dist/runtime/repair.js +34 -0
- package/dist/runtime/repair.js.map +1 -0
- package/dist/runtime/repository.d.ts +18 -0
- package/dist/runtime/repository.d.ts.map +1 -1
- package/dist/runtime/repository.js +114 -2
- package/dist/runtime/repository.js.map +1 -1
- package/dist/runtime/state.d.ts +42 -1
- package/dist/runtime/state.d.ts.map +1 -1
- package/dist/runtime/state.js +324 -11
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/usage.d.ts +12 -0
- package/dist/runtime/usage.d.ts.map +1 -0
- package/dist/runtime/usage.js +45 -0
- package/dist/runtime/usage.js.map +1 -0
- package/dist/runtime/verifier.d.ts.map +1 -1
- package/dist/runtime/verifier.js +12 -0
- package/dist/runtime/verifier.js.map +1 -1
- package/dist/runtime/worker.d.ts +1 -0
- package/dist/runtime/worker.d.ts.map +1 -1
- package/dist/runtime/worker.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workflows/founder.d.ts.map +1 -1
- package/dist/workflows/founder.js +5 -0
- package/dist/workflows/founder.js.map +1 -1
- package/node_modules/typescript/LICENSE.txt +55 -0
- package/node_modules/typescript/README.md +50 -0
- package/node_modules/typescript/SECURITY.md +39 -0
- package/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
- package/node_modules/typescript/bin/tsc +2 -0
- package/node_modules/typescript/bin/tsserver +2 -0
- package/node_modules/typescript/lib/_tsc.js +134465 -0
- package/node_modules/typescript/lib/_tsserver.js +659 -0
- package/node_modules/typescript/lib/_typingsInstaller.js +222 -0
- package/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2125 -0
- package/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2125 -0
- package/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/lib.d.ts +20 -0
- package/node_modules/typescript/lib/lib.decorators.d.ts +382 -0
- package/node_modules/typescript/lib/lib.decorators.legacy.d.ts +20 -0
- package/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +18 -0
- package/node_modules/typescript/lib/lib.dom.d.ts +45125 -0
- package/node_modules/typescript/lib/lib.dom.iterable.d.ts +18 -0
- package/node_modules/typescript/lib/lib.es2015.collection.d.ts +150 -0
- package/node_modules/typescript/lib/lib.es2015.core.d.ts +595 -0
- package/node_modules/typescript/lib/lib.es2015.d.ts +26 -0
- package/node_modules/typescript/lib/lib.es2015.generator.d.ts +75 -0
- package/node_modules/typescript/lib/lib.es2015.iterable.d.ts +603 -0
- package/node_modules/typescript/lib/lib.es2015.promise.d.ts +79 -0
- package/node_modules/typescript/lib/lib.es2015.proxy.d.ts +126 -0
- package/node_modules/typescript/lib/lib.es2015.reflect.d.ts +142 -0
- package/node_modules/typescript/lib/lib.es2015.symbol.d.ts +44 -0
- package/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +324 -0
- package/node_modules/typescript/lib/lib.es2016.array.include.d.ts +114 -0
- package/node_modules/typescript/lib/lib.es2016.d.ts +19 -0
- package/node_modules/typescript/lib/lib.es2016.full.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2016.intl.d.ts +29 -0
- package/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +19 -0
- package/node_modules/typescript/lib/lib.es2017.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2017.date.d.ts +29 -0
- package/node_modules/typescript/lib/lib.es2017.full.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2017.intl.d.ts +42 -0
- package/node_modules/typescript/lib/lib.es2017.object.d.ts +47 -0
- package/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +133 -0
- package/node_modules/typescript/lib/lib.es2017.string.d.ts +43 -0
- package/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +51 -0
- package/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +75 -0
- package/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +51 -0
- package/node_modules/typescript/lib/lib.es2018.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2018.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2018.intl.d.ts +81 -0
- package/node_modules/typescript/lib/lib.es2018.promise.d.ts +28 -0
- package/node_modules/typescript/lib/lib.es2018.regexp.d.ts +35 -0
- package/node_modules/typescript/lib/lib.es2019.array.d.ts +77 -0
- package/node_modules/typescript/lib/lib.es2019.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2019.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2019.intl.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2019.object.d.ts +31 -0
- package/node_modules/typescript/lib/lib.es2019.string.d.ts +35 -0
- package/node_modules/typescript/lib/lib.es2019.symbol.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2020.bigint.d.ts +763 -0
- package/node_modules/typescript/lib/lib.es2020.d.ts +25 -0
- package/node_modules/typescript/lib/lib.es2020.date.d.ts +40 -0
- package/node_modules/typescript/lib/lib.es2020.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2020.intl.d.ts +472 -0
- package/node_modules/typescript/lib/lib.es2020.number.d.ts +26 -0
- package/node_modules/typescript/lib/lib.es2020.promise.d.ts +45 -0
- package/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +97 -0
- package/node_modules/typescript/lib/lib.es2020.string.d.ts +42 -0
- package/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +39 -0
- package/node_modules/typescript/lib/lib.es2021.d.ts +21 -0
- package/node_modules/typescript/lib/lib.es2021.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2021.intl.d.ts +164 -0
- package/node_modules/typescript/lib/lib.es2021.promise.d.ts +46 -0
- package/node_modules/typescript/lib/lib.es2021.string.d.ts +31 -0
- package/node_modules/typescript/lib/lib.es2021.weakref.d.ts +76 -0
- package/node_modules/typescript/lib/lib.es2022.array.d.ts +119 -0
- package/node_modules/typescript/lib/lib.es2022.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2022.error.d.ts +73 -0
- package/node_modules/typescript/lib/lib.es2022.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2022.intl.d.ts +143 -0
- package/node_modules/typescript/lib/lib.es2022.object.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2022.regexp.d.ts +37 -0
- package/node_modules/typescript/lib/lib.es2022.string.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2023.array.d.ts +922 -0
- package/node_modules/typescript/lib/lib.es2023.collection.d.ts +19 -0
- package/node_modules/typescript/lib/lib.es2023.d.ts +20 -0
- package/node_modules/typescript/lib/lib.es2023.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2023.intl.d.ts +62 -0
- package/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +63 -0
- package/node_modules/typescript/lib/lib.es2024.collection.d.ts +27 -0
- package/node_modules/typescript/lib/lib.es2024.d.ts +24 -0
- package/node_modules/typescript/lib/lib.es2024.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2024.object.d.ts +27 -0
- package/node_modules/typescript/lib/lib.es2024.promise.d.ts +33 -0
- package/node_modules/typescript/lib/lib.es2024.regexp.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +66 -0
- package/node_modules/typescript/lib/lib.es2024.string.d.ts +27 -0
- package/node_modules/typescript/lib/lib.es2025.collection.d.ts +94 -0
- package/node_modules/typescript/lib/lib.es2025.d.ts +23 -0
- package/node_modules/typescript/lib/lib.es2025.float16.d.ts +443 -0
- package/node_modules/typescript/lib/lib.es2025.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.es2025.intl.d.ts +200 -0
- package/node_modules/typescript/lib/lib.es2025.iterator.d.ts +146 -0
- package/node_modules/typescript/lib/lib.es2025.promise.d.ts +32 -0
- package/node_modules/typescript/lib/lib.es2025.regexp.d.ts +30 -0
- package/node_modules/typescript/lib/lib.es5.d.ts +4599 -0
- package/node_modules/typescript/lib/lib.es6.d.ts +21 -0
- package/node_modules/typescript/lib/lib.esnext.array.d.ts +33 -0
- package/node_modules/typescript/lib/lib.esnext.collection.d.ts +47 -0
- package/node_modules/typescript/lib/lib.esnext.d.ts +27 -0
- package/node_modules/typescript/lib/lib.esnext.date.d.ts +21 -0
- package/node_modules/typescript/lib/lib.esnext.decorators.d.ts +26 -0
- package/node_modules/typescript/lib/lib.esnext.disposable.d.ts +191 -0
- package/node_modules/typescript/lib/lib.esnext.error.d.ts +22 -0
- package/node_modules/typescript/lib/lib.esnext.full.d.ts +22 -0
- package/node_modules/typescript/lib/lib.esnext.intl.d.ts +107 -0
- package/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +23 -0
- package/node_modules/typescript/lib/lib.esnext.temporal.d.ts +485 -0
- package/node_modules/typescript/lib/lib.esnext.typedarrays.d.ts +90 -0
- package/node_modules/typescript/lib/lib.scripthost.d.ts +320 -0
- package/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +18 -0
- package/node_modules/typescript/lib/lib.webworker.d.ts +15606 -0
- package/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +21 -0
- package/node_modules/typescript/lib/lib.webworker.iterable.d.ts +18 -0
- package/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2125 -0
- package/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/tsc.js +8 -0
- package/node_modules/typescript/lib/tsserver.js +8 -0
- package/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
- package/node_modules/typescript/lib/tsserverlibrary.js +21 -0
- package/node_modules/typescript/lib/typesMap.json +497 -0
- package/node_modules/typescript/lib/typescript.d.ts +11448 -0
- package/node_modules/typescript/lib/typescript.js +201039 -0
- package/node_modules/typescript/lib/typingsInstaller.js +8 -0
- package/node_modules/typescript/lib/watchGuard.js +53 -0
- package/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2129 -0
- package/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2125 -0
- package/node_modules/typescript/package.json +118 -0
- package/package.json +7 -4
- package/schemas/audit-report.schema.json +1 -0
- package/schemas/change-request.schema.json +189 -0
- package/schemas/context-manifest.schema.json +50 -0
- package/schemas/delivery-record.schema.json +109 -0
- package/schemas/mill-config.schema.json +50 -2
- package/schemas/repository-intelligence.schema.json +200 -0
- package/schemas/review-result.schema.json +21 -0
- package/schemas/task-packet.schema.json +12 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type GitHubAdapter } from "./github.js";
|
|
2
|
+
interface MergeInput {
|
|
3
|
+
root: string;
|
|
4
|
+
taskPath: string;
|
|
5
|
+
runId: string;
|
|
6
|
+
adapter?: GitHubAdapter;
|
|
7
|
+
}
|
|
8
|
+
export declare function planMerge(input: MergeInput & {
|
|
9
|
+
method: "merge" | "squash";
|
|
10
|
+
}): Promise<{
|
|
11
|
+
plan: {
|
|
12
|
+
schemaVersion: "1";
|
|
13
|
+
repositoryNodeId: string;
|
|
14
|
+
pullRequestNumber: number;
|
|
15
|
+
pullRequestNodeId: string;
|
|
16
|
+
headCommit: string;
|
|
17
|
+
baseCommit: string;
|
|
18
|
+
candidateTree: string;
|
|
19
|
+
actorLogin: string;
|
|
20
|
+
actorId: number;
|
|
21
|
+
policyDigest: string;
|
|
22
|
+
method: "merge" | "squash";
|
|
23
|
+
markReady: boolean;
|
|
24
|
+
expiresAt: string;
|
|
25
|
+
};
|
|
26
|
+
digest: string;
|
|
27
|
+
state: "planned";
|
|
28
|
+
}>;
|
|
29
|
+
export declare function applyMerge(input: MergeInput & {
|
|
30
|
+
approvalDigest: string;
|
|
31
|
+
attended: boolean;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
plan: {
|
|
34
|
+
schemaVersion: "1";
|
|
35
|
+
repositoryNodeId: string;
|
|
36
|
+
pullRequestNumber: number;
|
|
37
|
+
pullRequestNodeId: string;
|
|
38
|
+
headCommit: string;
|
|
39
|
+
baseCommit: string;
|
|
40
|
+
candidateTree: string;
|
|
41
|
+
actorLogin: string;
|
|
42
|
+
actorId: number;
|
|
43
|
+
policyDigest: string;
|
|
44
|
+
method: "merge" | "squash";
|
|
45
|
+
markReady: boolean;
|
|
46
|
+
expiresAt: string;
|
|
47
|
+
};
|
|
48
|
+
digest: string;
|
|
49
|
+
state: "effect_unknown" | "planned" | "merged" | "ready_started" | "ready_verified" | "merge_started";
|
|
50
|
+
approvalSource?: "attended_operator" | undefined;
|
|
51
|
+
}>;
|
|
52
|
+
export declare function reconcileMerge(input: MergeInput): Promise<{
|
|
53
|
+
plan: {
|
|
54
|
+
schemaVersion: "1";
|
|
55
|
+
repositoryNodeId: string;
|
|
56
|
+
pullRequestNumber: number;
|
|
57
|
+
pullRequestNodeId: string;
|
|
58
|
+
headCommit: string;
|
|
59
|
+
baseCommit: string;
|
|
60
|
+
candidateTree: string;
|
|
61
|
+
actorLogin: string;
|
|
62
|
+
actorId: number;
|
|
63
|
+
policyDigest: string;
|
|
64
|
+
method: "merge" | "squash";
|
|
65
|
+
markReady: boolean;
|
|
66
|
+
expiresAt: string;
|
|
67
|
+
};
|
|
68
|
+
digest: string;
|
|
69
|
+
state: "effect_unknown" | "planned" | "merged" | "ready_started" | "ready_verified" | "merge_started";
|
|
70
|
+
approvalSource?: "attended_operator" | undefined;
|
|
71
|
+
}>;
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/runtime/merge.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEL,KAAK,aAAa,EAGnB,MAAM,aAAa,CAAC;AAYrB,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AA4PD,wBAAsB,SAAS,CAC7B,KAAK,EAAE,UAAU,GAAG;IAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE;;;;;;;;;;;;;;;;;;GAqDnD;AAaD,wBAAsB,UAAU,CAC9B,KAAK,EAAE,UAAU,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE;;;;;;;;;;;;;;;;;;;GAmJlE;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU;;;;;;;;;;;;;;;;;;;GAoCrD"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { canonicalDigest } from "../contracts/canonical.js";
|
|
2
|
+
import { assessImpactManifest } from "../planning/impact.js";
|
|
3
|
+
import { deliveryRecordSchema, mergeApprovalPlanSchema, reviewResultSchema, validationEvidenceSchema, } from "../contracts/schemas.js";
|
|
4
|
+
import { ExitCode, MillError } from "../errors.js";
|
|
5
|
+
import { actionableFeedback, checkDecision, reviewsPassed, } from "./delivery.js";
|
|
6
|
+
import { createGitHubAdapter, } from "./github.js";
|
|
7
|
+
import { loadRuntimeInputs } from "./inputs.js";
|
|
8
|
+
import { assertRunBindings } from "./lifecycle.js";
|
|
9
|
+
import { captureReviewScope, commonGitDirectory, repositoryRemoteUrl, } from "./repository.js";
|
|
10
|
+
import { acquireWriterLease, StateStore } from "./state.js";
|
|
11
|
+
function authorityDeadline(inputs) {
|
|
12
|
+
return Math.min(Infinity, ...(inputs.continuity?.impact.exceptions ?? []).map((item) => Date.parse(item.expiresAt)), ...(inputs.task.schemaVersion === "2" ? inputs.task.attestations : []).map((item) => Date.parse(item.expiresAt)));
|
|
13
|
+
}
|
|
14
|
+
function assertCurrentAuthority(inputs) {
|
|
15
|
+
const continuity = inputs.continuity;
|
|
16
|
+
if (Date.now() >= authorityDeadline(inputs) ||
|
|
17
|
+
(continuity !== undefined &&
|
|
18
|
+
!assessImpactManifest({
|
|
19
|
+
manifest: continuity.impact,
|
|
20
|
+
product: continuity.product,
|
|
21
|
+
scenarios: continuity.scenarios,
|
|
22
|
+
authorityMode: "authorize",
|
|
23
|
+
}).approved))
|
|
24
|
+
throw new MillError("MERGE_AUTHORITY_EXPIRED", "Current task and impact authority must remain valid before each merge effect.", ExitCode.configuration);
|
|
25
|
+
}
|
|
26
|
+
async function withMergeContext(input, readback, action) {
|
|
27
|
+
const inputs = await loadRuntimeInputs(input.root, input.taskPath, readback ? "readback" : "authorize");
|
|
28
|
+
const store = await StateStore.open(inputs.config.repositoryId, await commonGitDirectory(input.root));
|
|
29
|
+
let lease;
|
|
30
|
+
try {
|
|
31
|
+
lease = await acquireWriterLease(store);
|
|
32
|
+
const run = store.getRun(input.runId);
|
|
33
|
+
if (run.deliveryJson === undefined)
|
|
34
|
+
throw new MillError("DELIVERY_PLAN_MISSING", "Merge requires an existing reviewed delivery.", ExitCode.configuration);
|
|
35
|
+
const delivery = deliveryRecordSchema.parse(JSON.parse(run.deliveryJson));
|
|
36
|
+
const config = inputs.config.propose;
|
|
37
|
+
if (config !== undefined &&
|
|
38
|
+
(config.owner !== delivery.target.owner ||
|
|
39
|
+
config.repository !== delivery.target.repository ||
|
|
40
|
+
config.repositoryNodeId !== delivery.target.repositoryNodeId ||
|
|
41
|
+
config.remoteName !== delivery.target.remoteName ||
|
|
42
|
+
config.baseBranch !== delivery.target.baseBranch ||
|
|
43
|
+
run.taskDigest !== inputs.taskDigest))
|
|
44
|
+
throw new MillError("MERGE_IDENTITY_MISMATCH", "Readback must use the original delivery repository and task identity.", ExitCode.configuration);
|
|
45
|
+
if (inputs.config.trustCeiling !== "propose" ||
|
|
46
|
+
config === undefined ||
|
|
47
|
+
(!readback && config.attendedMerge !== true))
|
|
48
|
+
throw new MillError("ATTENDED_MERGE_DISABLED", "The repository has not explicitly enabled attended merge.", ExitCode.configuration);
|
|
49
|
+
if (!readback &&
|
|
50
|
+
(run.status !== "awaiting_human" ||
|
|
51
|
+
run.cancelRequested ||
|
|
52
|
+
run.configDigest !== inputs.configDigest ||
|
|
53
|
+
run.taskDigest !== inputs.taskDigest))
|
|
54
|
+
throw new MillError("MERGE_NOT_READY", "Merge requires unchanged approved policy and an uncancelled human-ready run.", ExitCode.configuration);
|
|
55
|
+
return await action({
|
|
56
|
+
store,
|
|
57
|
+
delivery,
|
|
58
|
+
inputs,
|
|
59
|
+
config,
|
|
60
|
+
adapter: input.adapter ?? createGitHubAdapter(input.root),
|
|
61
|
+
save(value) {
|
|
62
|
+
delivery.mergeApproval = value;
|
|
63
|
+
delivery.updatedAt = new Date().toISOString();
|
|
64
|
+
store.setDelivery(run.id, JSON.stringify(deliveryRecordSchema.parse(delivery)), `merge.${value.state}`, { approvalDigest: value.digest });
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
try {
|
|
70
|
+
await lease?.release();
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
store.close();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function preflight(input, context, limit) {
|
|
78
|
+
const { inputs, config, delivery, adapter, store } = context;
|
|
79
|
+
assertCurrentAuthority(inputs);
|
|
80
|
+
const deadlineMs = Math.min(Date.now() + config.pollTimeoutSeconds * 1000, limit ?? Infinity, authorityDeadline(inputs));
|
|
81
|
+
const binding = await adapter.inspect({ config, deadlineMs });
|
|
82
|
+
const remote = await repositoryRemoteUrl(input.root, config.remoteName);
|
|
83
|
+
if (binding.repositoryNodeId !== delivery.target.repositoryNodeId ||
|
|
84
|
+
binding.actorLogin !== delivery.target.actorLogin ||
|
|
85
|
+
binding.actorId !== delivery.target.actorId ||
|
|
86
|
+
binding.fullName !== `${config.owner}/${config.repository}` ||
|
|
87
|
+
binding.fork ||
|
|
88
|
+
binding.defaultBranch !== config.baseBranch ||
|
|
89
|
+
!config.allowedActors.includes(binding.actorLogin) ||
|
|
90
|
+
!config.allowedMergerLogins.includes(binding.actorLogin) ||
|
|
91
|
+
![
|
|
92
|
+
binding.cloneUrl,
|
|
93
|
+
`git@${config.host}:${config.owner}/${config.repository}.git`,
|
|
94
|
+
`ssh://git@${config.host}/${config.owner}/${config.repository}.git`,
|
|
95
|
+
].includes(remote))
|
|
96
|
+
throw new MillError("MERGE_IDENTITY_MISMATCH", "Repository, operator or merge authority no longer matches the delivery.", ExitCode.configuration);
|
|
97
|
+
if (config.requiredChecks.length === 0 ||
|
|
98
|
+
config.requiredChecks.some((name) => config.checkProducers?.[name] === undefined) ||
|
|
99
|
+
(await adapter.strictChecks?.({ config, deadlineMs })) !== true)
|
|
100
|
+
throw new MillError("MERGE_PROTECTION_REQUIRED", "Attended merge requires producer-bound checks and strict up-to-date branch protection. Mill never bypasses protection.", ExitCode.configuration);
|
|
101
|
+
const run = store.getRun(input.runId);
|
|
102
|
+
const candidate = await assertRunBindings(input.root, run, inputs);
|
|
103
|
+
const validation = validationEvidenceSchema.parse(JSON.parse(run.validationJson ?? "null"));
|
|
104
|
+
const review = reviewResultSchema.parse(JSON.parse(run.reviewJson ?? "null"));
|
|
105
|
+
if (!validation.passed ||
|
|
106
|
+
validation.candidateCommit !== candidate.commit ||
|
|
107
|
+
review.candidateCommit !== candidate.commit ||
|
|
108
|
+
review.findings.length !== 0 ||
|
|
109
|
+
candidate.commit !== delivery.candidateCommit ||
|
|
110
|
+
candidate.tree !== delivery.candidateTree)
|
|
111
|
+
throw new MillError("MERGE_EVIDENCE_STALE", "Merge requires exact validation and complete-diff review of the delivered candidate.", ExitCode.configuration);
|
|
112
|
+
if (delivery.pullRequest === null)
|
|
113
|
+
throw new MillError("PULL_REQUEST_MISSING", "No pull request is bound to the delivery.", ExitCode.configuration);
|
|
114
|
+
const observation = await adapter.observe({
|
|
115
|
+
config,
|
|
116
|
+
pullRequestNumber: delivery.pullRequest.number,
|
|
117
|
+
deadlineMs,
|
|
118
|
+
});
|
|
119
|
+
const pull = observation.pullRequest;
|
|
120
|
+
const scope = await captureReviewScope(candidate.worktree, observation.defaultBranchHead, candidate.commit);
|
|
121
|
+
if (review.scope?.digest !== scope.digest)
|
|
122
|
+
throw new MillError("MERGE_EVIDENCE_STALE", "The reviewed diff differs from GitHub's authoritative merge base.", ExitCode.configuration);
|
|
123
|
+
if (pull.nodeId !== delivery.pullRequest.nodeId ||
|
|
124
|
+
pull.number !== delivery.pullRequest.number ||
|
|
125
|
+
pull.headSha !== candidate.commit ||
|
|
126
|
+
observation.branchSha !== candidate.commit ||
|
|
127
|
+
pull.headRef !== delivery.branchName ||
|
|
128
|
+
pull.baseRef !== config.baseBranch ||
|
|
129
|
+
pull.state !== "open" ||
|
|
130
|
+
pull.merged)
|
|
131
|
+
throw new MillError("MERGE_IDENTITY_MISMATCH", "The open PR identity or head changed.", ExitCode.configuration);
|
|
132
|
+
if (checkDecision(config.requiredChecks, observation.checks, config.checkProducers, "pull_request", candidate.commit).status !== "passed" ||
|
|
133
|
+
!reviewsPassed(observation, config.reviewPolicy, candidate.commit) ||
|
|
134
|
+
actionableFeedback(observation, config.reviewPolicy, candidate.commit)
|
|
135
|
+
.length !== 0)
|
|
136
|
+
throw new MillError("MERGE_CHECKS_NOT_GREEN", "Current producer-bound checks and review must pass before any merge effect.", ExitCode.configuration);
|
|
137
|
+
return { config, binding, candidate, observation, deadlineMs };
|
|
138
|
+
}
|
|
139
|
+
export async function planMerge(input) {
|
|
140
|
+
return withMergeContext(input, false, async (context) => {
|
|
141
|
+
const prior = context.delivery.mergeApproval;
|
|
142
|
+
if (prior !== undefined &&
|
|
143
|
+
prior.state !== "planned" &&
|
|
144
|
+
prior.state !== "ready_verified")
|
|
145
|
+
throw new MillError("MERGE_RECONCILIATION_REQUIRED", "An attempted merge plan must be reconciled, not overwritten.", ExitCode.configuration);
|
|
146
|
+
const current = await preflight(input, context);
|
|
147
|
+
if (!current.config.allowedMergeMethods.includes(input.method === "squash" ? "linear_tree_preserving" : "merge"))
|
|
148
|
+
throw new MillError("MERGE_METHOD_FORBIDDEN", "The selected merge method is outside repository policy.", ExitCode.configuration);
|
|
149
|
+
const plan = mergeApprovalPlanSchema.parse({
|
|
150
|
+
schemaVersion: "1",
|
|
151
|
+
repositoryNodeId: current.binding.repositoryNodeId,
|
|
152
|
+
pullRequestNumber: current.observation.pullRequest.number,
|
|
153
|
+
pullRequestNodeId: current.observation.pullRequest.nodeId,
|
|
154
|
+
headCommit: current.candidate.commit,
|
|
155
|
+
baseCommit: current.observation.defaultBranchHead,
|
|
156
|
+
candidateTree: current.candidate.tree,
|
|
157
|
+
actorLogin: current.binding.actorLogin,
|
|
158
|
+
actorId: current.binding.actorId,
|
|
159
|
+
policyDigest: context.inputs.configDigest,
|
|
160
|
+
method: input.method,
|
|
161
|
+
markReady: current.observation.pullRequest.draft,
|
|
162
|
+
expiresAt: new Date(Math.min(Date.now() + current.config.approvalTtlSeconds * 1000, authorityDeadline(context.inputs))).toISOString(),
|
|
163
|
+
});
|
|
164
|
+
const approval = {
|
|
165
|
+
plan,
|
|
166
|
+
digest: canonicalDigest(plan),
|
|
167
|
+
state: "planned",
|
|
168
|
+
};
|
|
169
|
+
context.save(approval);
|
|
170
|
+
return approval;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function readbackMatches(observation, plan) {
|
|
174
|
+
return (observation.pullRequest.nodeId === plan.pullRequestNodeId &&
|
|
175
|
+
observation.pullRequest.number === plan.pullRequestNumber &&
|
|
176
|
+
observation.pullRequest.headSha === plan.headCommit);
|
|
177
|
+
}
|
|
178
|
+
export async function applyMerge(input) {
|
|
179
|
+
if (!input.attended)
|
|
180
|
+
throw new MillError("ATTENDANCE_REQUIRED", "Merge approval must be submitted at the trusted attended operator boundary.", ExitCode.configuration);
|
|
181
|
+
return withMergeContext(input, false, async (context) => {
|
|
182
|
+
let approval = context.delivery.mergeApproval;
|
|
183
|
+
if (approval?.state !== "planned" ||
|
|
184
|
+
approval.digest !== input.approvalDigest ||
|
|
185
|
+
canonicalDigest(approval.plan) !== input.approvalDigest ||
|
|
186
|
+
Date.parse(approval.plan.expiresAt) <= Date.now())
|
|
187
|
+
throw new MillError("MERGE_APPROVAL_INVALID", "Approval must match the unexpired, unattempted exact merge plan.", ExitCode.configuration);
|
|
188
|
+
const plan = approval.plan;
|
|
189
|
+
const effectDeadline = Math.min(Date.now() + context.config.pollTimeoutSeconds * 1000, Date.parse(plan.expiresAt), authorityDeadline(context.inputs));
|
|
190
|
+
const current = await preflight(input, context, effectDeadline);
|
|
191
|
+
if (!readbackMatches(current.observation, plan) ||
|
|
192
|
+
current.observation.defaultBranchHead !== plan.baseCommit ||
|
|
193
|
+
current.candidate.tree !== plan.candidateTree ||
|
|
194
|
+
current.binding.actorId !== plan.actorId ||
|
|
195
|
+
current.binding.actorLogin !== plan.actorLogin ||
|
|
196
|
+
context.inputs.configDigest !== plan.policyDigest ||
|
|
197
|
+
current.observation.pullRequest.draft !== plan.markReady)
|
|
198
|
+
throw new MillError("MERGE_PLAN_STALE", "The displayed merge plan changed; no effect was attempted.", ExitCode.configuration);
|
|
199
|
+
if (context.adapter.mergeExact === undefined ||
|
|
200
|
+
(plan.markReady && context.adapter.markReady === undefined))
|
|
201
|
+
throw new MillError("MERGE_ADAPTER_UNAVAILABLE", "The configured adapter does not implement attended merge.", ExitCode.unavailable);
|
|
202
|
+
const cancellationRequested = () => context.store.getRun(input.runId).cancelRequested;
|
|
203
|
+
const save = (state) => {
|
|
204
|
+
approval = {
|
|
205
|
+
plan,
|
|
206
|
+
digest: input.approvalDigest,
|
|
207
|
+
state,
|
|
208
|
+
approvalSource: "attended_operator",
|
|
209
|
+
};
|
|
210
|
+
context.save(approval);
|
|
211
|
+
};
|
|
212
|
+
const observe = () => context.adapter.observe({
|
|
213
|
+
config: current.config,
|
|
214
|
+
pullRequestNumber: plan.pullRequestNumber,
|
|
215
|
+
deadlineMs: current.deadlineMs,
|
|
216
|
+
});
|
|
217
|
+
try {
|
|
218
|
+
assertCurrentAuthority(context.inputs);
|
|
219
|
+
if (Date.now() >= effectDeadline)
|
|
220
|
+
throw new MillError("MERGE_APPROVAL_INVALID", "The merge approval expired during preflight.", ExitCode.configuration);
|
|
221
|
+
if (cancellationRequested())
|
|
222
|
+
throw new MillError("OPERATOR_CANCELLED", "Merge was cancelled before execution.", ExitCode.temporary);
|
|
223
|
+
if (plan.markReady) {
|
|
224
|
+
if (context.adapter.markReady === undefined)
|
|
225
|
+
throw new MillError("MERGE_ADAPTER_UNAVAILABLE", "The adapter cannot mark the PR ready.", ExitCode.unavailable);
|
|
226
|
+
save("ready_started");
|
|
227
|
+
await context.adapter.markReady({
|
|
228
|
+
config: current.config,
|
|
229
|
+
pullRequestNodeId: plan.pullRequestNodeId,
|
|
230
|
+
deadlineMs: current.deadlineMs,
|
|
231
|
+
cancellationRequested,
|
|
232
|
+
});
|
|
233
|
+
const ready = await observe();
|
|
234
|
+
if (!readbackMatches(ready, plan) || ready.pullRequest.draft)
|
|
235
|
+
throw new MillError("READY_READBACK_MISMATCH", "Readiness was not confirmed on the exact PR.", ExitCode.temporary);
|
|
236
|
+
save("ready_verified");
|
|
237
|
+
}
|
|
238
|
+
const fresh = await preflight(input, context, effectDeadline);
|
|
239
|
+
if (fresh.observation.defaultBranchHead !== plan.baseCommit ||
|
|
240
|
+
Date.now() >= effectDeadline ||
|
|
241
|
+
cancellationRequested())
|
|
242
|
+
throw new MillError("MERGE_PLAN_STALE", "Base changed or cancellation was requested before merge.", ExitCode.configuration);
|
|
243
|
+
assertCurrentAuthority(context.inputs);
|
|
244
|
+
save("merge_started");
|
|
245
|
+
await context.adapter.mergeExact({
|
|
246
|
+
config: current.config,
|
|
247
|
+
pullRequestNumber: plan.pullRequestNumber,
|
|
248
|
+
headSha: plan.headCommit,
|
|
249
|
+
method: plan.method,
|
|
250
|
+
deadlineMs: current.deadlineMs,
|
|
251
|
+
cancellationRequested,
|
|
252
|
+
});
|
|
253
|
+
const merged = await observe();
|
|
254
|
+
if (!readbackMatches(merged, plan) ||
|
|
255
|
+
!merged.pullRequest.merged ||
|
|
256
|
+
merged.pullRequest.mergedByLogin !== plan.actorLogin ||
|
|
257
|
+
!merged.mergeIsOnDefaultBranch ||
|
|
258
|
+
merged.mergeCommit?.tree !== plan.candidateTree)
|
|
259
|
+
throw new MillError("MERGE_READBACK_MISMATCH", "Merge requires provider-authoritative identity and exact-tree readback.", ExitCode.temporary);
|
|
260
|
+
save("merged");
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
if (context.delivery.mergeApproval?.state === "merge_started")
|
|
264
|
+
save("effect_unknown");
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
return approval;
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
export async function reconcileMerge(input) {
|
|
271
|
+
return withMergeContext(input, true, async (context) => {
|
|
272
|
+
const approval = context.delivery.mergeApproval;
|
|
273
|
+
if (approval === undefined)
|
|
274
|
+
throw new MillError("MERGE_PLAN_MISSING", "No merge plan has been recorded.", ExitCode.configuration);
|
|
275
|
+
const observed = await context.adapter.observe({
|
|
276
|
+
config: context.config,
|
|
277
|
+
pullRequestNumber: approval.plan.pullRequestNumber,
|
|
278
|
+
deadlineMs: Date.now() + context.config.pollTimeoutSeconds * 1000,
|
|
279
|
+
});
|
|
280
|
+
if (approval.state === "ready_started" &&
|
|
281
|
+
readbackMatches(observed, approval.plan) &&
|
|
282
|
+
!observed.pullRequest.merged &&
|
|
283
|
+
observed.pullRequest.state === "open" &&
|
|
284
|
+
!observed.pullRequest.draft) {
|
|
285
|
+
context.save({ ...approval, state: "ready_verified" });
|
|
286
|
+
return { ...approval, state: "ready_verified" };
|
|
287
|
+
}
|
|
288
|
+
if (readbackMatches(observed, approval.plan) &&
|
|
289
|
+
observed.pullRequest.merged &&
|
|
290
|
+
observed.pullRequest.mergedByLogin === approval.plan.actorLogin &&
|
|
291
|
+
observed.mergeIsOnDefaultBranch &&
|
|
292
|
+
observed.mergeCommit?.tree === approval.plan.candidateTree) {
|
|
293
|
+
context.save({ ...approval, state: "merged" });
|
|
294
|
+
return { ...approval, state: "merged" };
|
|
295
|
+
}
|
|
296
|
+
return approval;
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/runtime/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-metadata.d.ts","sourceRoot":"","sources":["../../src/runtime/public-metadata.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsB9D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ExitCode, MillError } from "../errors.js";
|
|
2
|
+
/** Public summaries are not a transport for commit bodies or author identity. */
|
|
3
|
+
export function publicPullRequestTitle(message) {
|
|
4
|
+
const subject = (message.split(/\r?\n/u, 1)[0] ?? "").split(/\b(?:Signed-off-by|Co-authored-by|Reviewed-by):/iu, 1)[0] ?? "";
|
|
5
|
+
const title = subject
|
|
6
|
+
.replaceAll(/[A-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[A-Z0-9.-]+\.[A-Z]{2,}/giu, "[email redacted]")
|
|
7
|
+
.replaceAll(/\p{C}/gu, " ")
|
|
8
|
+
.trim()
|
|
9
|
+
.slice(0, 240);
|
|
10
|
+
if (title.length === 0) {
|
|
11
|
+
throw new MillError("PUBLIC_TITLE_EMPTY", "The commit must have a nonempty public subject without trailers.", ExitCode.configuration);
|
|
12
|
+
}
|
|
13
|
+
return title;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=public-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-metadata.js","sourceRoot":"","sources":["../../src/runtime/public-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEnD,iFAAiF;AACjF,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,OAAO,GACX,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CACzC,mDAAmD,EACnD,CAAC,CACF,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACb,MAAM,KAAK,GAAG,OAAO;SAClB,UAAU,CACT,yDAAyD,EACzD,kBAAkB,CACnB;SACA,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC;SAC1B,IAAI,EAAE;SACN,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CACjB,oBAAoB,EACpB,kEAAkE,EAClE,QAAQ,CAAC,aAAa,CACvB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RunRecord } from "./state.js";
|
|
2
|
+
/** Only a completed native failure is actionable; missing infrastructure is not. */
|
|
3
|
+
export declare function validationRepairFindings(run: RunRecord): {
|
|
4
|
+
id: string;
|
|
5
|
+
severity: "P1";
|
|
6
|
+
class: "correctness";
|
|
7
|
+
title: string;
|
|
8
|
+
body: string;
|
|
9
|
+
file: null;
|
|
10
|
+
line: null;
|
|
11
|
+
}[] | undefined;
|
|
12
|
+
//# sourceMappingURL=repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/runtime/repair.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,oFAAoF;AACpF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,SAAS;;;;;;;;gBAyCtD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { validationEvidenceSchema } from "../contracts/schemas.js";
|
|
2
|
+
import { ExitCode, MillError } from "../errors.js";
|
|
3
|
+
/** Only a completed native failure is actionable; missing infrastructure is not. */
|
|
4
|
+
export function validationRepairFindings(run) {
|
|
5
|
+
if (run.blockCode !== "VALIDATION_FAILED" || run.validationJson === undefined)
|
|
6
|
+
return undefined;
|
|
7
|
+
let raw;
|
|
8
|
+
try {
|
|
9
|
+
raw = JSON.parse(run.validationJson);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
raw = null;
|
|
13
|
+
}
|
|
14
|
+
const parsed = validationEvidenceSchema.safeParse(raw);
|
|
15
|
+
if (!parsed.success ||
|
|
16
|
+
parsed.data.candidateCommit !== run.candidateCommit ||
|
|
17
|
+
parsed.data.passed) {
|
|
18
|
+
throw new MillError("VALIDATION_EVIDENCE_INVALID", "Repair requires failed native evidence bound to this exact candidate.", ExitCode.configuration);
|
|
19
|
+
}
|
|
20
|
+
const failed = parsed.data.commands.filter((command) => command.required && command.status !== "passed");
|
|
21
|
+
if (failed.length === 0 ||
|
|
22
|
+
failed.some((command) => command.status !== "failed" || command.reason !== "NONZERO_EXIT"))
|
|
23
|
+
return undefined;
|
|
24
|
+
return failed.map((command) => ({
|
|
25
|
+
id: `validation-${command.commandId}`,
|
|
26
|
+
severity: "P1",
|
|
27
|
+
class: "correctness",
|
|
28
|
+
title: `Native command failed: ${command.commandId}`,
|
|
29
|
+
body: `Repair the candidate within its original allowed paths. Do not change tests, command controls, or authority. Command ${command.commandId} exited ${command.exitCode}; preserved output digest ${command.outputDigest}. Rerun the declared command to diagnose.`,
|
|
30
|
+
file: null,
|
|
31
|
+
line: null,
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/runtime/repair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGnD,oFAAoF;AACpF,MAAM,UAAU,wBAAwB,CAAC,GAAc;IACrD,IAAI,GAAG,CAAC,SAAS,KAAK,mBAAmB,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS;QAC3E,OAAO,SAAS,CAAC;IACnB,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACvD,IACE,CAAC,MAAM,CAAC,OAAO;QACf,MAAM,CAAC,IAAI,CAAC,eAAe,KAAK,GAAG,CAAC,eAAe;QACnD,MAAM,CAAC,IAAI,CAAC,MAAM,EAClB,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,6BAA6B,EAC7B,uEAAuE,EACvE,QAAQ,CAAC,aAAa,CACvB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CACxC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,CAC7D,CAAC;IACF,IACE,MAAM,CAAC,MAAM,KAAK,CAAC;QACnB,MAAM,CAAC,IAAI,CACT,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc,CACnE;QAED,OAAO,SAAS,CAAC;IACnB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9B,EAAE,EAAE,cAAc,OAAO,CAAC,SAAS,EAAE;QACrC,QAAQ,EAAE,IAAa;QACvB,KAAK,EAAE,aAAsB;QAC7B,KAAK,EAAE,0BAA0B,OAAO,CAAC,SAAS,EAAE;QACpD,IAAI,EAAE,wHAAwH,OAAO,CAAC,SAAS,WAAW,OAAO,CAAC,QAAQ,6BAA6B,OAAO,CAAC,YAAY,2CAA2C;QACtQ,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;KACX,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -16,6 +16,21 @@ export declare function assertGitControlState(worktree: string, expected: GitCon
|
|
|
16
16
|
export declare function commonGitDirectory(root: string): Promise<string>;
|
|
17
17
|
export declare function resolveCommit(root: string, reference: string): Promise<string>;
|
|
18
18
|
export declare function readCandidateIdentity(root: string, reference?: string): Promise<CandidateIdentity>;
|
|
19
|
+
/** Review the complete merge-base diff, including commits prepared before a task. */
|
|
20
|
+
export declare function captureReviewScope(root: string, baseRef: string, candidateCommit: string): Promise<{
|
|
21
|
+
digest: string;
|
|
22
|
+
baseCommit: string;
|
|
23
|
+
candidateCommit: string;
|
|
24
|
+
candidateTree: string;
|
|
25
|
+
changedPaths: string[];
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Reads one bounded, regular-file blob from an exact committed tree. Callers
|
|
29
|
+
* must still interpret the returned bytes through their own schema; this
|
|
30
|
+
* helper only keeps the Git read free of worktree, filter, and replacement
|
|
31
|
+
* ambiguity.
|
|
32
|
+
*/
|
|
33
|
+
export declare function readCommittedFile(root: string, commit: string, file: string, maxOutputBytes?: number): Promise<string>;
|
|
19
34
|
export declare function assertRepositoryWorktreeClean(root: string): Promise<void>;
|
|
20
35
|
export declare function repositoryRemoteUrl(root: string, remoteName: string): Promise<string>;
|
|
21
36
|
export declare function qualifyRepositoryForBuild(root: string, baseRef: string, sensitivePatterns?: readonly string[]): Promise<{
|
|
@@ -26,6 +41,9 @@ export declare function createCandidateWorktree(root: string, destination: strin
|
|
|
26
41
|
export declare function deleteCandidateBranch(root: string, branch: string, expectedCommit: string): Promise<void>;
|
|
27
42
|
export declare function createDetachedWorktree(root: string, destination: string, baseCommit: string): Promise<void>;
|
|
28
43
|
export declare function removeCandidateWorktree(root: string, destination: string): Promise<void>;
|
|
44
|
+
/** Only for a journal-bound authority purge whose original clean commit is retained. */
|
|
45
|
+
export declare function verifyPartiallyRemovedWorktree(root: string, destination: string, commit: string, commonDirectory: string): Promise<void>;
|
|
46
|
+
export declare function removeVerifiedAuthorityWorktree(root: string, destination: string): Promise<void>;
|
|
29
47
|
export declare function resetCandidateWorktree(worktree: string, commit: string): Promise<void>;
|
|
30
48
|
export declare function assertVisibleIndexState(worktree: string): Promise<void>;
|
|
31
49
|
export declare function validateAllowedPatterns(patterns: readonly string[]): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/runtime/repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/runtime/repository.ts"],"names":[],"mappings":"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"}
|