@open-agent-toolkit/cli 0.2.25 → 0.2.27
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/assets/NOTICES.md +156 -0
- package/assets/docs/cli-utilities/configuration.md +42 -11
- package/assets/docs/contributing/explainer-kit-verification.md +125 -0
- package/assets/docs/contributing/index.md +1 -0
- package/assets/docs/reference/troubleshooting.md +47 -0
- package/assets/docs/workflows/projects/artifacts.md +24 -6
- package/assets/docs/workflows/projects/dispatch-ceiling.md +67 -16
- package/assets/docs/workflows/skills/explainer-kit-providers.md +144 -0
- package/assets/docs/workflows/skills/explainer-kit.md +121 -69
- package/assets/docs/workflows/skills/index.md +1 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/explainer-kit/SKILL.md +18 -3
- package/assets/skills/explainer-kit/recipes/project-recap.json +43 -16
- package/assets/skills/explainer-kit/references/contracts.md +167 -20
- package/assets/skills/explainer-kit/references/golden-conformance.md +80 -0
- package/assets/skills/explainer-kit/references/visual-authoring.md +92 -0
- package/assets/skills/explainer-kit/references/visual-review.md +57 -0
- package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +172 -1
- package/assets/skills/explainer-kit/schemas/build-record.schema.json +7 -1
- package/assets/skills/explainer-kit/schemas/fact-base.schema.json +38 -2
- package/assets/skills/explainer-kit/schemas/manifest.schema.json +25 -1
- package/assets/skills/explainer-kit/schemas/run-request.schema.json +4 -0
- package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +149 -0
- package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +117 -0
- package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +80 -0
- package/assets/skills/explainer-kit/scripts/lib/browser-runtime.mjs +148 -4
- package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +243 -0
- package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +586 -8
- package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +285 -8
- package/assets/skills/explainer-kit/scripts/lib/durability.mjs +35 -0
- package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +144 -8
- package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +379 -0
- package/assets/skills/explainer-kit/scripts/lib/png.mjs +287 -0
- package/assets/skills/explainer-kit/scripts/lib/qa.mjs +280 -8
- package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +132 -3
- package/assets/skills/explainer-kit/scripts/lib/records.mjs +513 -21
- package/assets/skills/explainer-kit/scripts/lib/render.mjs +67 -3
- package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +43 -1
- package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +208 -0
- package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +218 -0
- package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +380 -0
- package/assets/skills/explainer-kit/scripts/render-qa.mjs +48 -10
- package/assets/skills/explainer-kit/scripts/run.mjs +859 -134
- package/assets/skills/oat-explainer-kit/SKILL.md +40 -12
- package/assets/skills/oat-explainer-kit/references/author-callback.md +12 -10
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +40 -2
- package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +72 -0
- package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +167 -5
- package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +92 -5
- package/assets/skills/oat-explainer-kit/scripts/run.mjs +324 -2
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-implement/SKILL.md +9 -11
- package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +18 -9
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-implement/references/phase-execution.md +13 -4
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +27 -3
- package/dist/commands/project/archive/archive-utils.d.ts +1 -0
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +109 -42
- package/dist/commands/project/archive/explainer-package-coverage.d.ts +14 -0
- package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -0
- package/dist/commands/project/archive/explainer-package-coverage.js +27 -0
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts +18 -0
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +1 -0
- package/dist/commands/project/archive/explainer-source-backlinks.js +27 -0
- package/dist/commands/project/archive/push-runner.d.ts +2 -1
- package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
- package/dist/commands/project/archive/push-runner.js +5 -1
- package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
- package/dist/commands/project/dispatch-ceiling/index.js +90 -0
- package/dist/config/dispatch-notices.d.ts +8 -0
- package/dist/config/dispatch-notices.d.ts.map +1 -0
- package/dist/config/dispatch-notices.js +79 -0
- package/dist/config/dispatch-policy-options.d.ts +2 -0
- package/dist/config/dispatch-policy-options.d.ts.map +1 -1
- package/dist/config/dispatch-policy-options.js +14 -2
- package/dist/providers/identity/dispatch-report.d.ts +17 -0
- package/dist/providers/identity/dispatch-report.d.ts.map +1 -1
- package/dist/providers/identity/dispatch-report.js +30 -0
- package/dist/release/public-package-contract.d.ts +6 -0
- package/dist/release/public-package-contract.d.ts.map +1 -1
- package/dist/release/public-package-contract.js +75 -0
- package/package.json +2 -2
|
@@ -233,7 +233,7 @@ remains immutable baseline evidence for the original p01-t01 verification.
|
|
|
233
233
|
| `oat-project-design/references/selective-review-pass.md` | `d4956192b82e -> DES-06`; `7d6e1f926ecb -> DES-06`; `04f918a5fcac -> DES-07` |
|
|
234
234
|
| `oat-project-plan/SKILL.md` | `5eb3949f32e1 -> NG`; `64a08153bb9e -> NG`; `655d61df0a8f -> NG`; `56b37486f09d -> PLAN-01`; `cf317c17c586 -> PLAN-02`; `781643b0f2c3 -> NG`; `01fd7cca8253 -> PLAN-04`; `7bc7fa3f2cbb -> NG`; `da28ce0a5f2e -> NG`; `e334f94c4d35 -> NG`; `1fa55762c038 -> NG`; `c0935b5484a2 -> NG`; `6008163054f8 -> PLAN-05`; `571271f4d71b -> PLAN-06`; `746b760289e4 -> PLAN-06`; `de195590ff83 -> NG`; `49640510829a -> PLAN-07`; `4bef7afa7a71 -> PLAN-08`; `e5886632533e -> PLAN-08`; `4cfe1df14372 -> NG`; `d116c97a500c -> PLAN-10`; `aa62facff547 -> PLAN-10`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> PLAN-11`; `1734b2c85c5d -> NG`; `b4af2220eb91 -> PLAN-11` |
|
|
235
235
|
| `oat-project-import-plan/SKILL.md` | `f7ca8635452f -> NG`; `c2e5fa410069 -> NG`; `655d61df0a8f -> NG`; `dceff5cc04b5 -> NG`; `1af4957a1af2 -> IMPORT-01`; `45b699c1c0b5 -> IMPORT-01`; `ba6d120791c1 -> IMPORT-01`; `070ebc5259af -> IMPORT-03`; `c11552696e2e -> IMPORT-03`; `cfe661966baf -> IMPORT-04`; `baa91c0a0bf8 -> NG`; `e364e84b2702 -> NG`; `39031985a945 -> IMPORT-06`; `f106aa29a217 -> IMPORT-07`; `65038450aee3 -> IMPORT-07`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> IMPORT-09` |
|
|
236
|
-
| `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `
|
|
236
|
+
| `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `e0355c7a05e9 -> IMPLEMENT-11+IMPLEMENT-13+IMPLEMENT-16`; `6296f41ae11c -> NG`; `a167d03559fa -> NG`; `cf317c17c586 -> IMPLEMENT-01`; `8ce8a09feca4 -> NG`; `bd0cb4988188 -> NG`; `28af4ee0055d -> NG` |
|
|
237
237
|
| `oat-project-implement/references/completion-and-closeout.md` | `f7dab9c1f96c -> IMPLEMENT-12`; `c69c17a069a8 -> IMPLEMENT-14`; `a97fa5634a68 -> IMPLEMENT-14`; `3af58881811c -> IMPLEMENT-14`; `4203e1f49d0f -> IMPLEMENT-14`; `c3bd2458a3d3 -> IMPLEMENT-13`; `95b5eafc070d -> IMPLEMENT-13`; `25ecbe9c998b -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f6f24fd71da4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f18283bc1cf9 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `2c1ffc4a82dd -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `3454a07aa843 -> IMPLEMENT-16`; `0d86e2098cfb -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d5fe597d266f -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `55a152e944c1 -> IMPLEMENT-16`; `effac7cbd573 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d2a34d8b148 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d27462aaed26 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d52ecb17268 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `5b91aabe3757 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `fd0ad919f702 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `63bf28df1474 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a4ed471dbc78 -> IMPLEMENT-16`; `6b7a64cec6e5 -> IMPLEMENT-16`; `0a4fdba0ebc0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a5033c2aada5 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `e77609eddba0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `351156e8dde4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `51d45bd2bbd1 -> IMPLEMENT-16`; `f7796ffcc804 -> IMPLEMENT-16`; `990d730cb494 -> IMPLEMENT-16`; `6ed28bb7d384 -> IMPLEMENT-16`; `8b7d4b5bcf1b -> IMPLEMENT-16`; `88aad500e6e9 -> IMPLEMENT-16`; `877e3e3f9eda -> IMPLEMENT-16`; `fc03c97f834e -> IMPLEMENT-16`; `12939a3da5e0 -> IMPLEMENT-16`; `bdb418335a88 -> IMPLEMENT-16`; `fba97e596ebd -> IMPLEMENT-16`; `3d0b5e2f14f0 -> IMPLEMENT-17`; `87f1424a8692 -> NG`; `6b1ec05182f0 -> IMPLEMENT-11`; `e6d696a27c91 -> NG`; `c77f8ccb52ad -> NG`; `48de2614c0ba -> IMPLEMENT-11`; `32d53f5212e5 -> IMPLEMENT-11`; `7cdb4a9c57b7 -> IMPLEMENT-11`; `16ffc0aa099b -> IMPLEMENT-11`; `d6868ea10b3f -> IMPLEMENT-11`; `4f05ff5567be -> IMPLEMENT-11`; `c70b47ae7a6d -> IMPLEMENT-11`; `5fafd093b58e -> NG`; `567d43ab0c2e -> NG`; `21ceaf7e658a -> NG`; `249427a9f475 -> NG`; `8a7ec13a9b7c -> NG`; `9aeb7fce2012 -> IMPLEMENT-18`; `f11a7cdda220 -> IMPLEMENT-18`; `4523ac029152 -> NG`; `6e87b08c4046 -> NG`; `baa6052c7f0a -> IMPLEMENT-18`; `27d3fad116b1 -> IMPLEMENT-18`; `2cfbeb4388a5 -> IMPLEMENT-18`; `c56ea56a56db -> NG`; `43e2e3c1380d -> IMPLEMENT-17`; `b49690277fb5 -> NG`; `df12304d6a36 -> NG`; `52eacac11fef -> IMPLEMENT-17`; `60092df6b17b -> IMPLEMENT-17`; `361872c6b00e -> IMPLEMENT-17`; `d2bc711a75fb -> IMPLEMENT-17` |
|
|
238
238
|
| `oat-project-implement/references/dispatch-and-dry-run.md` | `21b85f5e4daa -> IMPLEMENT-08`; `74c92b32bb2a -> IMPLEMENT-08`; `8efd2d0517ab -> IMPLEMENT-09`; `461ed9b3e495 -> IMPLEMENT-09`; `b5ad64fd744d -> NG`; `14ce436cfffa -> NG`; `043ca36da3e2 -> NG`; `a23e45c1dc8d -> NG`; `498143bb41a7 -> NG`; `4fe3eb179023 -> NG`; `7f75485e5a33 -> NG`; `8ec3a96df029 -> NG`; `16c3f96e758d -> NG`; `5915c41fe058 -> NG`; `f51e43eeac56 -> NG`; `fd41c25623cb -> NG`; `58a932ed6453 -> NG`; `4718bd3ce12d -> NG`; `58c444a2126b -> NG`; `2df3adae4120 -> NG`; `e75df892b55c -> NG`; `8ba5dbd2a0d8 -> NG` |
|
|
239
239
|
| `oat-project-implement/references/docs/autonomy-contract.md` | `* -> NG` |
|
|
@@ -20,13 +20,18 @@ responsible for file boundaries, verification, and task commits.
|
|
|
20
20
|
Before each phase:
|
|
21
21
|
|
|
22
22
|
1. Resolve the project dispatch policy and optional narrower phase maximum from
|
|
23
|
-
the plan's `## Dispatch Profile`.
|
|
23
|
+
the plan's `## Dispatch Profile`. Classify the complete phase scope and
|
|
24
|
+
record the classification source and rationale. For Codex, also classify
|
|
25
|
+
the preferred task effort.
|
|
24
26
|
2. Resolve one exact phase implementer target with
|
|
25
|
-
`--role implementer --ceiling-tier <project-or-phase-named-tier> --report-scope <pNN> --report-action implementation`.
|
|
27
|
+
`--role implementer --ceiling-tier <project-or-phase-named-tier> --task-class <task-class> [--task-effort <codex-preferred-effort>] --report-scope <pNN> --report-action implementation`.
|
|
26
28
|
Use the phase scope, not each task ID. Omit `--ceiling-tier` only for
|
|
27
29
|
uncapped or inherit/default policy.
|
|
28
|
-
3.
|
|
29
|
-
|
|
30
|
+
3. Require the completed Dispatch Report, surface its structured notices, and
|
|
31
|
+
render the report before launch. Build the provider invocation before
|
|
32
|
+
recording target, model/effort axes, selection reason, candidates, and
|
|
33
|
+
formal dispatch stamp. Runtime disclosure comes from the effective resolved
|
|
34
|
+
target, never `recommendationVersion`.
|
|
30
35
|
4. Record `PHASE_BASE_HEAD=$(git rev-parse HEAD)` and require a clean worktree.
|
|
31
36
|
5. Send one self-contained Phase Scope:
|
|
32
37
|
|
|
@@ -54,6 +59,10 @@ Before each phase:
|
|
|
54
59
|
dispatch_args: {complete provider invocation payload}
|
|
55
60
|
model_axis: {resolver value}
|
|
56
61
|
effort_axis: {resolver value}
|
|
62
|
+
task_class: {mechanical-recon|intelligent-recon|default-implementation|hard-reasoning|consequential}
|
|
63
|
+
preferred_effort: {codex low|medium|high|xhigh|max; null for other providers}
|
|
64
|
+
classification_source: {plan dispatch profile|phase scope analysis|other explicit source}
|
|
65
|
+
classification_rationale: {short rationale grounded in the complete phase scope}
|
|
57
66
|
selection_reason: {stable shared reason}
|
|
58
67
|
candidates_considered: {ordered exact candidates}
|
|
59
68
|
dispatch_stamp: {formal Dispatch: line}
|
|
@@ -233,7 +233,7 @@ remains immutable baseline evidence for the original p01-t01 verification.
|
|
|
233
233
|
| `oat-project-design/references/selective-review-pass.md` | `d4956192b82e -> DES-06`; `7d6e1f926ecb -> DES-06`; `04f918a5fcac -> DES-07` |
|
|
234
234
|
| `oat-project-plan/SKILL.md` | `5eb3949f32e1 -> NG`; `64a08153bb9e -> NG`; `655d61df0a8f -> NG`; `56b37486f09d -> PLAN-01`; `cf317c17c586 -> PLAN-02`; `781643b0f2c3 -> NG`; `01fd7cca8253 -> PLAN-04`; `7bc7fa3f2cbb -> NG`; `da28ce0a5f2e -> NG`; `e334f94c4d35 -> NG`; `1fa55762c038 -> NG`; `c0935b5484a2 -> NG`; `6008163054f8 -> PLAN-05`; `571271f4d71b -> PLAN-06`; `746b760289e4 -> PLAN-06`; `de195590ff83 -> NG`; `49640510829a -> PLAN-07`; `4bef7afa7a71 -> PLAN-08`; `e5886632533e -> PLAN-08`; `4cfe1df14372 -> NG`; `d116c97a500c -> PLAN-10`; `aa62facff547 -> PLAN-10`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> PLAN-11`; `1734b2c85c5d -> NG`; `b4af2220eb91 -> PLAN-11` |
|
|
235
235
|
| `oat-project-import-plan/SKILL.md` | `f7ca8635452f -> NG`; `c2e5fa410069 -> NG`; `655d61df0a8f -> NG`; `dceff5cc04b5 -> NG`; `1af4957a1af2 -> IMPORT-01`; `45b699c1c0b5 -> IMPORT-01`; `ba6d120791c1 -> IMPORT-01`; `070ebc5259af -> IMPORT-03`; `c11552696e2e -> IMPORT-03`; `cfe661966baf -> IMPORT-04`; `baa91c0a0bf8 -> NG`; `e364e84b2702 -> NG`; `39031985a945 -> IMPORT-06`; `f106aa29a217 -> IMPORT-07`; `65038450aee3 -> IMPORT-07`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> IMPORT-09` |
|
|
236
|
-
| `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `
|
|
236
|
+
| `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `e0355c7a05e9 -> IMPLEMENT-11+IMPLEMENT-13+IMPLEMENT-16`; `6296f41ae11c -> NG`; `a167d03559fa -> NG`; `cf317c17c586 -> IMPLEMENT-01`; `8ce8a09feca4 -> NG`; `bd0cb4988188 -> NG`; `28af4ee0055d -> NG` |
|
|
237
237
|
| `oat-project-implement/references/completion-and-closeout.md` | `f7dab9c1f96c -> IMPLEMENT-12`; `c69c17a069a8 -> IMPLEMENT-14`; `a97fa5634a68 -> IMPLEMENT-14`; `3af58881811c -> IMPLEMENT-14`; `4203e1f49d0f -> IMPLEMENT-14`; `c3bd2458a3d3 -> IMPLEMENT-13`; `95b5eafc070d -> IMPLEMENT-13`; `25ecbe9c998b -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f6f24fd71da4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f18283bc1cf9 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `2c1ffc4a82dd -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `3454a07aa843 -> IMPLEMENT-16`; `0d86e2098cfb -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d5fe597d266f -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `55a152e944c1 -> IMPLEMENT-16`; `effac7cbd573 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d2a34d8b148 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d27462aaed26 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d52ecb17268 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `5b91aabe3757 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `fd0ad919f702 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `63bf28df1474 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a4ed471dbc78 -> IMPLEMENT-16`; `6b7a64cec6e5 -> IMPLEMENT-16`; `0a4fdba0ebc0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a5033c2aada5 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `e77609eddba0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `351156e8dde4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `51d45bd2bbd1 -> IMPLEMENT-16`; `f7796ffcc804 -> IMPLEMENT-16`; `990d730cb494 -> IMPLEMENT-16`; `6ed28bb7d384 -> IMPLEMENT-16`; `8b7d4b5bcf1b -> IMPLEMENT-16`; `88aad500e6e9 -> IMPLEMENT-16`; `877e3e3f9eda -> IMPLEMENT-16`; `fc03c97f834e -> IMPLEMENT-16`; `12939a3da5e0 -> IMPLEMENT-16`; `bdb418335a88 -> IMPLEMENT-16`; `fba97e596ebd -> IMPLEMENT-16`; `3d0b5e2f14f0 -> IMPLEMENT-17`; `87f1424a8692 -> NG`; `6b1ec05182f0 -> IMPLEMENT-11`; `e6d696a27c91 -> NG`; `c77f8ccb52ad -> NG`; `48de2614c0ba -> IMPLEMENT-11`; `32d53f5212e5 -> IMPLEMENT-11`; `7cdb4a9c57b7 -> IMPLEMENT-11`; `16ffc0aa099b -> IMPLEMENT-11`; `d6868ea10b3f -> IMPLEMENT-11`; `4f05ff5567be -> IMPLEMENT-11`; `c70b47ae7a6d -> IMPLEMENT-11`; `5fafd093b58e -> NG`; `567d43ab0c2e -> NG`; `21ceaf7e658a -> NG`; `249427a9f475 -> NG`; `8a7ec13a9b7c -> NG`; `9aeb7fce2012 -> IMPLEMENT-18`; `f11a7cdda220 -> IMPLEMENT-18`; `4523ac029152 -> NG`; `6e87b08c4046 -> NG`; `baa6052c7f0a -> IMPLEMENT-18`; `27d3fad116b1 -> IMPLEMENT-18`; `2cfbeb4388a5 -> IMPLEMENT-18`; `c56ea56a56db -> NG`; `43e2e3c1380d -> IMPLEMENT-17`; `b49690277fb5 -> NG`; `df12304d6a36 -> NG`; `52eacac11fef -> IMPLEMENT-17`; `60092df6b17b -> IMPLEMENT-17`; `361872c6b00e -> IMPLEMENT-17`; `d2bc711a75fb -> IMPLEMENT-17` |
|
|
238
238
|
| `oat-project-implement/references/dispatch-and-dry-run.md` | `21b85f5e4daa -> IMPLEMENT-08`; `74c92b32bb2a -> IMPLEMENT-08`; `8efd2d0517ab -> IMPLEMENT-09`; `461ed9b3e495 -> IMPLEMENT-09`; `b5ad64fd744d -> NG`; `14ce436cfffa -> NG`; `043ca36da3e2 -> NG`; `a23e45c1dc8d -> NG`; `498143bb41a7 -> NG`; `4fe3eb179023 -> NG`; `7f75485e5a33 -> NG`; `8ec3a96df029 -> NG`; `16c3f96e758d -> NG`; `5915c41fe058 -> NG`; `f51e43eeac56 -> NG`; `fd41c25623cb -> NG`; `58a932ed6453 -> NG`; `4718bd3ce12d -> NG`; `58c444a2126b -> NG`; `2df3adae4120 -> NG`; `e75df892b55c -> NG`; `8ba5dbd2a0d8 -> NG` |
|
|
239
239
|
| `oat-project-implement/references/docs/autonomy-contract.md` | `* -> NG` |
|
|
@@ -233,7 +233,7 @@ remains immutable baseline evidence for the original p01-t01 verification.
|
|
|
233
233
|
| `oat-project-design/references/selective-review-pass.md` | `d4956192b82e -> DES-06`; `7d6e1f926ecb -> DES-06`; `04f918a5fcac -> DES-07` |
|
|
234
234
|
| `oat-project-plan/SKILL.md` | `5eb3949f32e1 -> NG`; `64a08153bb9e -> NG`; `655d61df0a8f -> NG`; `56b37486f09d -> PLAN-01`; `cf317c17c586 -> PLAN-02`; `781643b0f2c3 -> NG`; `01fd7cca8253 -> PLAN-04`; `7bc7fa3f2cbb -> NG`; `da28ce0a5f2e -> NG`; `e334f94c4d35 -> NG`; `1fa55762c038 -> NG`; `c0935b5484a2 -> NG`; `6008163054f8 -> PLAN-05`; `571271f4d71b -> PLAN-06`; `746b760289e4 -> PLAN-06`; `de195590ff83 -> NG`; `49640510829a -> PLAN-07`; `4bef7afa7a71 -> PLAN-08`; `e5886632533e -> PLAN-08`; `4cfe1df14372 -> NG`; `d116c97a500c -> PLAN-10`; `aa62facff547 -> PLAN-10`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> PLAN-11`; `1734b2c85c5d -> NG`; `b4af2220eb91 -> PLAN-11` |
|
|
235
235
|
| `oat-project-import-plan/SKILL.md` | `f7ca8635452f -> NG`; `c2e5fa410069 -> NG`; `655d61df0a8f -> NG`; `dceff5cc04b5 -> NG`; `1af4957a1af2 -> IMPORT-01`; `45b699c1c0b5 -> IMPORT-01`; `ba6d120791c1 -> IMPORT-01`; `070ebc5259af -> IMPORT-03`; `c11552696e2e -> IMPORT-03`; `cfe661966baf -> IMPORT-04`; `baa91c0a0bf8 -> NG`; `e364e84b2702 -> NG`; `39031985a945 -> IMPORT-06`; `f106aa29a217 -> IMPORT-07`; `65038450aee3 -> IMPORT-07`; `bee4c4aa34c6 -> NG`; `3f0b53056edd -> IMPORT-09` |
|
|
236
|
-
| `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `
|
|
236
|
+
| `oat-project-implement/SKILL.md` | `18980f6bc1a6 -> NG`; `e0355c7a05e9 -> IMPLEMENT-11+IMPLEMENT-13+IMPLEMENT-16`; `6296f41ae11c -> NG`; `a167d03559fa -> NG`; `cf317c17c586 -> IMPLEMENT-01`; `8ce8a09feca4 -> NG`; `bd0cb4988188 -> NG`; `28af4ee0055d -> NG` |
|
|
237
237
|
| `oat-project-implement/references/completion-and-closeout.md` | `f7dab9c1f96c -> IMPLEMENT-12`; `c69c17a069a8 -> IMPLEMENT-14`; `a97fa5634a68 -> IMPLEMENT-14`; `3af58881811c -> IMPLEMENT-14`; `4203e1f49d0f -> IMPLEMENT-14`; `c3bd2458a3d3 -> IMPLEMENT-13`; `95b5eafc070d -> IMPLEMENT-13`; `25ecbe9c998b -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f6f24fd71da4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `f18283bc1cf9 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `2c1ffc4a82dd -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `3454a07aa843 -> IMPLEMENT-16`; `0d86e2098cfb -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d5fe597d266f -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `55a152e944c1 -> IMPLEMENT-16`; `effac7cbd573 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d2a34d8b148 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `d27462aaed26 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `9d52ecb17268 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `5b91aabe3757 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `fd0ad919f702 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `63bf28df1474 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a4ed471dbc78 -> IMPLEMENT-16`; `6b7a64cec6e5 -> IMPLEMENT-16`; `0a4fdba0ebc0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `a5033c2aada5 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `e77609eddba0 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `351156e8dde4 -> IMPLEMENT-13+IMPLEMENT-14+IMPLEMENT-15+IMPLEMENT-16`; `51d45bd2bbd1 -> IMPLEMENT-16`; `f7796ffcc804 -> IMPLEMENT-16`; `990d730cb494 -> IMPLEMENT-16`; `6ed28bb7d384 -> IMPLEMENT-16`; `8b7d4b5bcf1b -> IMPLEMENT-16`; `88aad500e6e9 -> IMPLEMENT-16`; `877e3e3f9eda -> IMPLEMENT-16`; `fc03c97f834e -> IMPLEMENT-16`; `12939a3da5e0 -> IMPLEMENT-16`; `bdb418335a88 -> IMPLEMENT-16`; `fba97e596ebd -> IMPLEMENT-16`; `3d0b5e2f14f0 -> IMPLEMENT-17`; `87f1424a8692 -> NG`; `6b1ec05182f0 -> IMPLEMENT-11`; `e6d696a27c91 -> NG`; `c77f8ccb52ad -> NG`; `48de2614c0ba -> IMPLEMENT-11`; `32d53f5212e5 -> IMPLEMENT-11`; `7cdb4a9c57b7 -> IMPLEMENT-11`; `16ffc0aa099b -> IMPLEMENT-11`; `d6868ea10b3f -> IMPLEMENT-11`; `4f05ff5567be -> IMPLEMENT-11`; `c70b47ae7a6d -> IMPLEMENT-11`; `5fafd093b58e -> NG`; `567d43ab0c2e -> NG`; `21ceaf7e658a -> NG`; `249427a9f475 -> NG`; `8a7ec13a9b7c -> NG`; `9aeb7fce2012 -> IMPLEMENT-18`; `f11a7cdda220 -> IMPLEMENT-18`; `4523ac029152 -> NG`; `6e87b08c4046 -> NG`; `baa6052c7f0a -> IMPLEMENT-18`; `27d3fad116b1 -> IMPLEMENT-18`; `2cfbeb4388a5 -> IMPLEMENT-18`; `c56ea56a56db -> NG`; `43e2e3c1380d -> IMPLEMENT-17`; `b49690277fb5 -> NG`; `df12304d6a36 -> NG`; `52eacac11fef -> IMPLEMENT-17`; `60092df6b17b -> IMPLEMENT-17`; `361872c6b00e -> IMPLEMENT-17`; `d2bc711a75fb -> IMPLEMENT-17` |
|
|
238
238
|
| `oat-project-implement/references/dispatch-and-dry-run.md` | `21b85f5e4daa -> IMPLEMENT-08`; `74c92b32bb2a -> IMPLEMENT-08`; `8efd2d0517ab -> IMPLEMENT-09`; `461ed9b3e495 -> IMPLEMENT-09`; `b5ad64fd744d -> NG`; `14ce436cfffa -> NG`; `043ca36da3e2 -> NG`; `a23e45c1dc8d -> NG`; `498143bb41a7 -> NG`; `4fe3eb179023 -> NG`; `7f75485e5a33 -> NG`; `8ec3a96df029 -> NG`; `16c3f96e758d -> NG`; `5915c41fe058 -> NG`; `f51e43eeac56 -> NG`; `fd41c25623cb -> NG`; `58a932ed6453 -> NG`; `4718bd3ce12d -> NG`; `58c444a2126b -> NG`; `2df3adae4120 -> NG`; `e75df892b55c -> NG`; `8ba5dbd2a0d8 -> NG` |
|
|
239
239
|
| `oat-project-implement/references/docs/autonomy-contract.md` | `* -> NG` |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAmBzC,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAehB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoGpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,mCAAmC,EAAE,OAAO,mCAAmC,CAAC;IAChF,0BAA0B,EAAE,OAAO,0BAA0B,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AA46ED,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAsKT"}
|
|
@@ -6,6 +6,7 @@ import { confirmAction, } from '../shared/shared.prompts.js';
|
|
|
6
6
|
import { readGlobalOptions } from '../shared/shared.utils.js';
|
|
7
7
|
import { compileDispatchCeilingPreset } from '../../config/dispatch-ceiling-preset.js';
|
|
8
8
|
import { normalizeDispatchMatrix, validateDispatchRouteTarget, walkDispatchMatrix, } from '../../config/dispatch-matrix.js';
|
|
9
|
+
import { formatDispatchNotices, terminalReviewerNoticesForMatrix, } from '../../config/dispatch-notices.js';
|
|
9
10
|
import { dispatchPolicyModeDescription, dispatchPolicyPolicyDescription, managedDispatchPolicyValueList, } from '../../config/dispatch-policy-options.js';
|
|
10
11
|
import { VALID_DISPATCH_POLICY_MODES, VALID_MANAGED_DISPATCH_POLICIES, MAX_GATE_TIMEOUT_MS, MIN_GATE_TIMEOUT_MS, isValidGateTimeoutMs, normalizeWorkflowPostImplementSequence, readOatConfig, readOatLocalConfig, readUserConfig, writeOatConfig, writeOatLocalConfig, writeUserConfig, } from '../../config/oat-config.js';
|
|
11
12
|
import { resolveEffectiveConfig, } from '../../config/resolve.js';
|
|
@@ -1698,45 +1699,65 @@ function applyDispatchMatrixRecommendation(workflow, recommendation) {
|
|
|
1698
1699
|
},
|
|
1699
1700
|
};
|
|
1700
1701
|
}
|
|
1702
|
+
async function effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies) {
|
|
1703
|
+
const resolved = await dependencies.resolveEffectiveConfig(repoRoot, userConfigDir, dependencies.processEnv);
|
|
1704
|
+
const effectiveProviders = {};
|
|
1705
|
+
for (const config of [resolved.user, resolved.shared, resolved.local]) {
|
|
1706
|
+
for (const [provider, value] of Object.entries(config.workflow?.dispatchCeiling?.providers ?? {})) {
|
|
1707
|
+
const existing = effectiveProviders[provider];
|
|
1708
|
+
effectiveProviders[provider] =
|
|
1709
|
+
isRecord(existing) && isRecord(value)
|
|
1710
|
+
? { ...existing, ...value }
|
|
1711
|
+
: value;
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
return terminalReviewerNoticesForMatrix(effectiveProviders);
|
|
1715
|
+
}
|
|
1701
1716
|
async function adoptDispatchMatrixRecommendation(repoRoot, userConfigDir, options, context, dependencies) {
|
|
1702
1717
|
const source = options.surface === 'auto' ? 'local' : options.surface;
|
|
1703
1718
|
const recommendation = await loadDispatchMatrixRecommendation(dependencies);
|
|
1704
1719
|
if (source === 'user') {
|
|
1705
1720
|
const userConfig = await dependencies.readUserConfig(userConfigDir);
|
|
1706
1721
|
await validateRecommendationCells(repoRoot, recommendation, dependencies, context.logger.warn);
|
|
1722
|
+
const workflow = applyDispatchMatrixRecommendation(userConfig.workflow, recommendation);
|
|
1707
1723
|
await dependencies.writeUserConfig(userConfigDir, {
|
|
1708
1724
|
...userConfig,
|
|
1709
|
-
workflow
|
|
1725
|
+
workflow,
|
|
1710
1726
|
});
|
|
1711
1727
|
return {
|
|
1712
1728
|
key: 'workflow.dispatchCeiling.providers',
|
|
1713
1729
|
value: recommendation.version,
|
|
1714
1730
|
source,
|
|
1731
|
+
notices: await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
|
|
1715
1732
|
};
|
|
1716
1733
|
}
|
|
1717
1734
|
if (source === 'local') {
|
|
1718
1735
|
const localConfig = await dependencies.readOatLocalConfig(repoRoot);
|
|
1719
1736
|
await validateRecommendationCells(repoRoot, recommendation, dependencies, context.logger.warn);
|
|
1737
|
+
const workflow = applyDispatchMatrixRecommendation(localConfig.workflow, recommendation);
|
|
1720
1738
|
await dependencies.writeOatLocalConfig(repoRoot, {
|
|
1721
1739
|
...localConfig,
|
|
1722
|
-
workflow
|
|
1740
|
+
workflow,
|
|
1723
1741
|
});
|
|
1724
1742
|
return {
|
|
1725
1743
|
key: 'workflow.dispatchCeiling.providers',
|
|
1726
1744
|
value: recommendation.version,
|
|
1727
1745
|
source,
|
|
1746
|
+
notices: await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
|
|
1728
1747
|
};
|
|
1729
1748
|
}
|
|
1730
1749
|
const sharedConfig = await dependencies.readOatConfig(repoRoot);
|
|
1731
1750
|
await validateRecommendationCells(repoRoot, recommendation, dependencies, context.logger.warn);
|
|
1751
|
+
const workflow = applyDispatchMatrixRecommendation(sharedConfig.workflow, recommendation);
|
|
1732
1752
|
await dependencies.writeOatConfig(repoRoot, {
|
|
1733
1753
|
...sharedConfig,
|
|
1734
|
-
workflow
|
|
1754
|
+
workflow,
|
|
1735
1755
|
});
|
|
1736
1756
|
return {
|
|
1737
1757
|
key: 'workflow.dispatchCeiling.providers',
|
|
1738
1758
|
value: recommendation.version,
|
|
1739
1759
|
source,
|
|
1760
|
+
notices: await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
|
|
1740
1761
|
};
|
|
1741
1762
|
}
|
|
1742
1763
|
function formatList(values) {
|
|
@@ -1870,6 +1891,9 @@ async function runAdopt(templateArg, options, context, dependencies) {
|
|
|
1870
1891
|
}
|
|
1871
1892
|
else {
|
|
1872
1893
|
context.logger.info(`Adopted dispatch matrix recommendation ${result.value} to ${result.source} config.`);
|
|
1894
|
+
if (result.notices.length > 0) {
|
|
1895
|
+
context.logger.info(formatDispatchNotices(result.notices));
|
|
1896
|
+
}
|
|
1873
1897
|
}
|
|
1874
1898
|
process.exitCode = 0;
|
|
1875
1899
|
}
|
|
@@ -151,6 +151,7 @@ export declare function resolveLocalArchiveProjectPath(projectsRoot: string, pro
|
|
|
151
151
|
export declare function resolvePrimaryRepoRoot(repoRoot: string, dependencies?: ResolvePrimaryRepoRootDependencies): Promise<string>;
|
|
152
152
|
export declare function resolveArchiveProjectTarget(options: ResolveArchiveProjectTargetOptions, dependencies?: ResolveArchiveProjectTargetDependencies): Promise<ArchiveProjectTarget>;
|
|
153
153
|
export declare function assertDurableArchiveProjectTarget(target: ArchiveProjectTarget): void;
|
|
154
|
+
export declare function verifySelectedProjectRecapForArchive(projectPath: string, projectRecapRun: string): Promise<void>;
|
|
154
155
|
export declare function archiveProjectOnCompletion(options: ArchiveProjectOnCompletionOptions, dependencies?: ArchiveProjectOnCompletionDependencies): Promise<ArchiveProjectOnCompletionResult>;
|
|
155
156
|
export declare function ensureS3ArchiveAccess(options: EnsureS3ArchiveAccessOptions, dependencies?: EnsureS3ArchiveAccessDependencies): Promise<EnsureS3ArchiveAccessResult>;
|
|
156
157
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-utils.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/archive-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,MAAM,EAGP,MAAM,kBAAkB,CAAC;AAc1B,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACX,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"archive-utils.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/archive-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ import { basename, dirname, isAbsolute, join, posix as path, relative, resolve,
|
|
|
5
5
|
import { promisify } from 'node:util';
|
|
6
6
|
import { CliError } from '../../../errors/cli-error.js';
|
|
7
7
|
import { copyDirectory, copySingleFile, dirExists, ensureDir, fileExists, } from '../../../fs/io.js';
|
|
8
|
+
import { loadExplainerPackageCoverage } from './explainer-package-coverage.js';
|
|
9
|
+
import { loadExplainerSourceBacklinks, } from './explainer-source-backlinks.js';
|
|
8
10
|
const execFileAsync = promisify(execFileCallback);
|
|
9
11
|
export const ARCHIVE_SNAPSHOT_METADATA_FILENAME = '.oat-archive-source.json';
|
|
10
12
|
/**
|
|
@@ -281,7 +283,7 @@ async function exportProjectSummary(archivePath, snapshotName, summaryExportPath
|
|
|
281
283
|
await copySummary(summarySource, summaryTarget);
|
|
282
284
|
return summaryTarget;
|
|
283
285
|
}
|
|
284
|
-
function parseProjectRecapManifest(contents) {
|
|
286
|
+
async function parseProjectRecapManifest(contents) {
|
|
285
287
|
let value;
|
|
286
288
|
try {
|
|
287
289
|
value = JSON.parse(contents);
|
|
@@ -289,43 +291,13 @@ function parseProjectRecapManifest(contents) {
|
|
|
289
291
|
catch {
|
|
290
292
|
throw new CliError('Selected project recap has an invalid manifest.json.');
|
|
291
293
|
}
|
|
292
|
-
|
|
294
|
+
const sourceBacklinks = await loadExplainerSourceBacklinks();
|
|
295
|
+
if (!isProjectRecapManifestV1(value, sourceBacklinks)) {
|
|
293
296
|
throw new CliError('Selected project recap manifest does not match the explainer-kit manifest contract.');
|
|
294
297
|
}
|
|
295
|
-
const requiredProvenancePaths = [
|
|
296
|
-
'run-request.json',
|
|
297
|
-
'source/content-approval.json',
|
|
298
|
-
];
|
|
299
|
-
const recordedImmutablePaths = Object.keys(value.immutableHashes);
|
|
300
|
-
const missingLegacyPaths = requiredProvenancePaths.filter((relativePath) => !(relativePath in value.immutableHashes));
|
|
301
|
-
if (missingLegacyPaths.length > 0) {
|
|
302
|
-
throw new CliError(`Selected project recap uses a legacy manifest missing immutable coverage for ${missingLegacyPaths.join(', ')}; regenerate the recap package before archival.`);
|
|
303
|
-
}
|
|
304
|
-
const expectedImmutablePaths = new Set([
|
|
305
|
-
...requiredProvenancePaths,
|
|
306
|
-
value.source.factBasePath,
|
|
307
|
-
'source/fact-base.md',
|
|
308
|
-
...(value.source.authorResultPaths ?? []),
|
|
309
|
-
value.theme.path,
|
|
310
|
-
...value.artifacts.flatMap((artifact) => [
|
|
311
|
-
artifact.contentPath,
|
|
312
|
-
...(artifact.status === 'built' &&
|
|
313
|
-
typeof artifact.renderedPath === 'string'
|
|
314
|
-
? [artifact.renderedPath]
|
|
315
|
-
: []),
|
|
316
|
-
]),
|
|
317
|
-
]);
|
|
318
|
-
if (expectedImmutablePaths.size === 0 ||
|
|
319
|
-
expectedImmutablePaths.size !== recordedImmutablePaths.length ||
|
|
320
|
-
[...expectedImmutablePaths].some((relativePath) => !(relativePath in value.immutableHashes)) ||
|
|
321
|
-
value.artifacts.some((artifact) => artifact.status === 'built' &&
|
|
322
|
-
typeof artifact.renderedPath === 'string' &&
|
|
323
|
-
artifact.hash !== value.immutableHashes[artifact.renderedPath])) {
|
|
324
|
-
throw new CliError('Selected project recap manifest immutable hashes do not cover the complete v1 package.');
|
|
325
|
-
}
|
|
326
298
|
return value;
|
|
327
299
|
}
|
|
328
|
-
function isProjectRecapManifestV1(value) {
|
|
300
|
+
function isProjectRecapManifestV1(value, sourceBacklinks) {
|
|
329
301
|
if (!isRecord(value) ||
|
|
330
302
|
!hasExactKeys(value, [
|
|
331
303
|
'schemaVersion',
|
|
@@ -351,12 +323,14 @@ function isProjectRecapManifestV1(value) {
|
|
|
351
323
|
!isNonEmptyString(value.recipe.id) ||
|
|
352
324
|
!isNonEmptyString(value.recipe.version) ||
|
|
353
325
|
!isRecord(value.source) ||
|
|
354
|
-
!hasExactKeys(value.source, ['factBasePath', 'factBaseHash', 'inputHashes'], ['sourceRevision', 'authorResultPaths']) ||
|
|
326
|
+
!hasExactKeys(value.source, ['factBasePath', 'factBaseHash', 'inputHashes'], ['sourceRevision', 'authorResultPaths', 'backlinks']) ||
|
|
355
327
|
!isSafeRelativePath(value.source.factBasePath) ||
|
|
356
328
|
!isSha256(value.source.factBaseHash) ||
|
|
357
329
|
!isHashMap(value.source.inputHashes) ||
|
|
358
330
|
(value.source.authorResultPaths !== undefined &&
|
|
359
331
|
!isUniqueSafePathArray(value.source.authorResultPaths)) ||
|
|
332
|
+
(value.source.backlinks !== undefined &&
|
|
333
|
+
!isCanonicalSourceBacklinks(value.source.backlinks, sourceBacklinks)) ||
|
|
360
334
|
(value.source.sourceRevision !== undefined &&
|
|
361
335
|
!isNonEmptyString(value.source.sourceRevision)) ||
|
|
362
336
|
!isRecord(value.theme) ||
|
|
@@ -369,7 +343,13 @@ function isProjectRecapManifestV1(value) {
|
|
|
369
343
|
new Set(value.artifacts.map((artifact) => JSON.stringify(artifact)))
|
|
370
344
|
.size !== value.artifacts.length ||
|
|
371
345
|
!isHashMap(value.immutableHashes) ||
|
|
372
|
-
![
|
|
346
|
+
![
|
|
347
|
+
'built-durable',
|
|
348
|
+
'built-not-durable',
|
|
349
|
+
'built-needs-review',
|
|
350
|
+
'failed',
|
|
351
|
+
'incomplete',
|
|
352
|
+
].includes(String(value.outcome)) ||
|
|
373
353
|
!isPathHashRecord(value.buildRecord, 'build-record.json') ||
|
|
374
354
|
(value.publishReceipt !== undefined &&
|
|
375
355
|
!isPathHashRecord(value.publishReceipt, 'publish-receipt.json')) ||
|
|
@@ -451,6 +431,32 @@ function isHashMap(value) {
|
|
|
451
431
|
return (isRecord(value) &&
|
|
452
432
|
Object.entries(value).every(([relativePath, hash]) => isSafeRelativePath(relativePath) && isSha256(hash)));
|
|
453
433
|
}
|
|
434
|
+
function isCanonicalSourceBacklinks(value, sourceBacklinks) {
|
|
435
|
+
if (!Array.isArray(value)) {
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
438
|
+
const identities = new Set();
|
|
439
|
+
for (const backlink of value) {
|
|
440
|
+
if (!isRecord(backlink) ||
|
|
441
|
+
!hasExactKeys(backlink, ['sourceId', 'url']) ||
|
|
442
|
+
!isNonEmptyString(backlink.sourceId) ||
|
|
443
|
+
typeof backlink.url !== 'string') {
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
try {
|
|
447
|
+
sourceBacklinks.parseCanonicalGithubBlobUrl(backlink.url);
|
|
448
|
+
}
|
|
449
|
+
catch {
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
const identity = `${backlink.sourceId}\0${backlink.url}`;
|
|
453
|
+
if (identities.has(identity)) {
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
456
|
+
identities.add(identity);
|
|
457
|
+
}
|
|
458
|
+
return true;
|
|
459
|
+
}
|
|
454
460
|
function isUniqueSafePathArray(value) {
|
|
455
461
|
return (Array.isArray(value) &&
|
|
456
462
|
value.length > 0 &&
|
|
@@ -544,17 +550,78 @@ async function verifyProjectRecapImmutableHashes(stagedRoot, manifest) {
|
|
|
544
550
|
}
|
|
545
551
|
return entries.length;
|
|
546
552
|
}
|
|
553
|
+
async function readVerifiedRunMode(runRoot) {
|
|
554
|
+
let request;
|
|
555
|
+
try {
|
|
556
|
+
request = JSON.parse(await readFile(join(runRoot, 'run-request.json'), 'utf8'));
|
|
557
|
+
}
|
|
558
|
+
catch {
|
|
559
|
+
throw new CliError('Hash-verified project recap run-request.json must contain valid JSON.');
|
|
560
|
+
}
|
|
561
|
+
if (!isRecord(request) ||
|
|
562
|
+
(request.mode !== 'interactive' && request.mode !== 'unattended')) {
|
|
563
|
+
throw new CliError('Hash-verified project recap run-request.json must declare interactive or unattended mode.');
|
|
564
|
+
}
|
|
565
|
+
return request.mode;
|
|
566
|
+
}
|
|
567
|
+
async function loadVerifiedProjectRecap(projectPath, projectRecapRun) {
|
|
568
|
+
const sourceRunRoot = await resolveSelectedProjectRecapRun(projectPath, projectRecapRun);
|
|
569
|
+
const manifestContents = await readFile(join(sourceRunRoot, 'manifest.json'), 'utf8');
|
|
570
|
+
const manifest = await parseProjectRecapManifest(manifestContents);
|
|
571
|
+
if (manifest.recipe.id !== 'project-recap') {
|
|
572
|
+
throw new CliError('Selected project recap manifest recipe must be exactly `project-recap`.');
|
|
573
|
+
}
|
|
574
|
+
if (manifest.outcome === 'built-needs-review') {
|
|
575
|
+
throw new CliError('Selected project recap is built-needs-review and requires a passing visual review before archival.');
|
|
576
|
+
}
|
|
577
|
+
const verifiedArtifactCount = await verifyProjectRecapImmutableHashes(sourceRunRoot, manifest);
|
|
578
|
+
const runMode = await readVerifiedRunMode(sourceRunRoot);
|
|
579
|
+
const packageCoverage = await loadExplainerPackageCoverage();
|
|
580
|
+
const missingCoverage = packageCoverage
|
|
581
|
+
.requiredImmutablePackagePaths(manifest, { runMode })
|
|
582
|
+
.filter((relativePath) => !(relativePath in manifest.immutableHashes));
|
|
583
|
+
const missingLegacyCoverage = missingCoverage.filter((relativePath) => ['run-request.json', 'source/content-approval.json'].includes(relativePath));
|
|
584
|
+
if (missingLegacyCoverage.length > 0) {
|
|
585
|
+
throw new CliError(`Selected project recap uses a legacy manifest missing immutable coverage for ${missingLegacyCoverage.join(', ')}; regenerate the recap package before archival.`);
|
|
586
|
+
}
|
|
587
|
+
if (missingCoverage.some((relativePath) => relativePath.startsWith('qa/browser/') ||
|
|
588
|
+
relativePath.startsWith('qa/visual-review/'))) {
|
|
589
|
+
throw new CliError('Selected project recap manifest has an incomplete visual-review evidence chain.');
|
|
590
|
+
}
|
|
591
|
+
if (missingCoverage.length > 0) {
|
|
592
|
+
throw new CliError(`Selected project recap manifest immutable hashes do not cover the complete v2 package: ${missingCoverage.join(', ')}.`);
|
|
593
|
+
}
|
|
594
|
+
try {
|
|
595
|
+
await packageCoverage.validateImmutablePackageEvidence(manifest, {
|
|
596
|
+
runMode,
|
|
597
|
+
read: (relativePath) => readFile(join(sourceRunRoot, relativePath)),
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
catch (error) {
|
|
601
|
+
throw new CliError(`Selected project recap browser evidence contract is invalid: ${error instanceof Error ? error.message : String(error)}`);
|
|
602
|
+
}
|
|
603
|
+
if (manifest.artifacts.some((artifact) => artifact.status === 'built' &&
|
|
604
|
+
typeof artifact.renderedPath === 'string' &&
|
|
605
|
+
artifact.hash !== manifest.immutableHashes[artifact.renderedPath])) {
|
|
606
|
+
throw new CliError('Selected project recap artifact hashes do not match the immutable package.');
|
|
607
|
+
}
|
|
608
|
+
return {
|
|
609
|
+
sourceRunRoot,
|
|
610
|
+
manifestContents,
|
|
611
|
+
manifest,
|
|
612
|
+
verifiedArtifactCount,
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
export async function verifySelectedProjectRecapForArchive(projectPath, projectRecapRun) {
|
|
616
|
+
await loadVerifiedProjectRecap(projectPath, projectRecapRun);
|
|
617
|
+
}
|
|
547
618
|
async function exportSelectedProjectRecap(options, snapshotName, dependencies) {
|
|
548
619
|
const selectedRun = options.projectRecapRun?.trim();
|
|
549
620
|
if (!selectedRun) {
|
|
550
621
|
return null;
|
|
551
622
|
}
|
|
552
|
-
const
|
|
553
|
-
const
|
|
554
|
-
const sourceManifest = parseProjectRecapManifest(sourceManifestContents);
|
|
555
|
-
if (sourceManifest.recipe.id !== 'project-recap') {
|
|
556
|
-
throw new CliError('Selected project recap manifest recipe must be exactly `project-recap`.');
|
|
557
|
-
}
|
|
623
|
+
const verified = await loadVerifiedProjectRecap(options.projectPath, selectedRun);
|
|
624
|
+
const { sourceRunRoot, manifestContents: sourceManifestContents, manifest: sourceManifest, } = verified;
|
|
558
625
|
const exportRoot = join(options.repoRoot, '.oat', 'repo', 'reference', 'project-recaps', snapshotName);
|
|
559
626
|
if (await pathExists(exportRoot)) {
|
|
560
627
|
throw new CliError(`Project recap export destination \`${exportRoot}\` already exists; refusing to overwrite it.`);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
declare const PACKAGE_COVERAGE_VERSION = "explainer-kit.package-coverage/v2";
|
|
2
|
+
export interface ExplainerPackageCoverage {
|
|
3
|
+
PACKAGE_COVERAGE_VERSION: typeof PACKAGE_COVERAGE_VERSION;
|
|
4
|
+
requiredImmutablePackagePaths: (manifest: unknown, options?: {
|
|
5
|
+
runMode?: 'interactive' | 'unattended';
|
|
6
|
+
}) => string[];
|
|
7
|
+
validateImmutablePackageEvidence: (manifest: unknown, options: {
|
|
8
|
+
runMode?: 'interactive' | 'unattended';
|
|
9
|
+
read: (path: string) => Promise<Buffer | string>;
|
|
10
|
+
}) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadExplainerPackageCoverage(): Promise<ExplainerPackageCoverage>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=explainer-package-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainer-package-coverage.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/archive/explainer-package-coverage.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,wBAAwB,sCAAsC,CAAC;AAErE,MAAM,WAAW,wBAAwB;IACvC,wBAAwB,EAAE,OAAO,wBAAwB,CAAC;IAC1D,6BAA6B,EAAE,CAC7B,QAAQ,EAAE,OAAO,EACjB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAA;KAAE,KACjD,MAAM,EAAE,CAAC;IACd,gCAAgC,EAAE,CAChC,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;QACvC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;KAClD,KACE,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAID,wBAAgB,4BAA4B,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAGhF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import { CliError } from '../../../errors/cli-error.js';
|
|
4
|
+
import { resolveAssetsRoot } from '../../../fs/assets.js';
|
|
5
|
+
const PACKAGE_COVERAGE_VERSION = 'explainer-kit.package-coverage/v2';
|
|
6
|
+
let cachedCoverage;
|
|
7
|
+
export function loadExplainerPackageCoverage() {
|
|
8
|
+
cachedCoverage ??= loadGeneratedCoverage();
|
|
9
|
+
return cachedCoverage;
|
|
10
|
+
}
|
|
11
|
+
async function loadGeneratedCoverage() {
|
|
12
|
+
const assetsRoot = await resolveAssetsRoot();
|
|
13
|
+
const modulePath = join(assetsRoot, 'skills', 'explainer-kit', 'scripts', 'lib', 'package-coverage.mjs');
|
|
14
|
+
let loaded;
|
|
15
|
+
try {
|
|
16
|
+
loaded = (await import(pathToFileURL(modulePath).href));
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
throw new CliError(`Bundled explainer package coverage could not be loaded: ${error instanceof Error ? error.message : String(error)}`, 2);
|
|
20
|
+
}
|
|
21
|
+
if (loaded.PACKAGE_COVERAGE_VERSION !== PACKAGE_COVERAGE_VERSION ||
|
|
22
|
+
typeof loaded.requiredImmutablePackagePaths !== 'function' ||
|
|
23
|
+
typeof loaded.validateImmutablePackageEvidence !== 'function') {
|
|
24
|
+
throw new CliError(`Bundled assets must provide ${PACKAGE_COVERAGE_VERSION} package coverage.`, 2);
|
|
25
|
+
}
|
|
26
|
+
return loaded;
|
|
27
|
+
}
|