@fitlab-ai/agent-infra 0.9.12 → 0.9.14
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 +11 -11
- package/README.zh-CN.md +11 -11
- package/bin/cli.ts +26 -9
- package/dist/bin/cli.js +173 -157
- package/dist/bin/internal-cli.js +66 -40
- package/dist/lib/agent-client.js +5 -0
- package/dist/lib/agent-clients/next-steps.js +6 -1
- package/dist/lib/decide.js +3 -3
- package/dist/lib/internal/agent-client.js +5 -2
- package/dist/lib/internal/cli-route-inventory.js +152 -0
- package/dist/lib/internal/codex-lifecycle.js +9 -6
- package/dist/lib/internal/codex-sandbox-controller.js +8 -2
- package/dist/lib/internal/git-workflow.js +10 -6
- package/dist/lib/internal/platform-checks.js +19 -7
- package/dist/lib/internal/platform-comment.js +25 -13
- package/dist/lib/internal/platform-context.js +6 -3
- package/dist/lib/internal/platform-issue.js +20 -13
- package/dist/lib/internal/platform-metadata.js +88 -0
- package/dist/lib/internal/platform-pr-review.js +26 -13
- package/dist/lib/internal/platform-pr.js +84 -31
- package/dist/lib/internal/platform-release-notes.js +9 -6
- package/dist/lib/internal/platform-security.js +93 -0
- package/dist/lib/internal/pr-review-grade.js +25 -12
- package/dist/lib/internal/release-workflow.js +23 -9
- package/dist/lib/internal/sandbox-control.js +50 -7
- package/dist/lib/internal/task-activity.js +16 -7
- package/dist/lib/internal/task-artifact.js +235 -24
- package/dist/lib/internal/task-context.js +4 -1
- package/dist/lib/internal/task-create.js +50 -17
- package/dist/lib/internal/task-delivery.js +4 -1
- package/dist/lib/internal/task-event.js +10 -4
- package/dist/lib/internal/task-finalization.js +6 -3
- package/dist/lib/internal/task-invalidation.js +63 -0
- package/dist/lib/internal/task-ledger.js +20 -6
- package/dist/lib/internal/task-lifecycle.js +6 -3
- package/dist/lib/internal/task-operation-registry.js +421 -0
- package/dist/lib/internal/task-orchestration.js +12 -0
- package/dist/lib/internal/task-override.js +14 -7
- package/dist/lib/internal/task-qualification.js +90 -0
- package/dist/lib/internal/task-review.js +7 -4
- package/dist/lib/internal/task-short-id.js +11 -1
- package/dist/lib/internal/task-snapshot.js +4 -1
- package/dist/lib/internal/task-validate.js +7 -2
- package/dist/lib/internal/task-verify.js +11 -7
- package/dist/lib/internal/task-warning.js +11 -4
- package/dist/lib/platform/adapters.js +1 -3
- package/dist/lib/platform/change-request-git-evidence.js +27 -7
- package/dist/lib/platform/comment-safety.js +226 -0
- package/dist/lib/platform/completion-backfill.js +6 -5
- package/dist/lib/platform/context.js +70 -130
- package/dist/lib/platform/github-client.js +1 -1
- package/dist/lib/platform/github-provider.js +1130 -0
- package/dist/lib/platform/in-label-sync.js +143 -0
- package/dist/lib/platform/issue-comments.js +237 -72
- package/dist/lib/platform/issues.js +335 -189
- package/dist/lib/platform/metadata-labels.js +6 -2
- package/dist/lib/platform/none-provider.js +28 -0
- package/dist/lib/platform/pr-change-report.js +545 -0
- package/dist/lib/platform/pr-checks.js +119 -104
- package/dist/lib/platform/pr-review.js +88 -72
- package/dist/lib/platform/pr-summary.js +541 -50
- package/dist/lib/platform/provider-bridge.js +45 -0
- package/dist/lib/platform/provider-contract.d.ts +553 -0
- package/dist/lib/platform/provider-contract.js +99 -0
- package/dist/lib/platform/provider-loader.js +251 -0
- package/dist/lib/platform/provider-validation.js +577 -0
- package/dist/lib/platform/pull-request-metadata.js +8 -6
- package/dist/lib/platform/pull-requests.js +734 -543
- package/dist/lib/platform/release-notes.js +78 -55
- package/dist/lib/platform/releases.js +79 -50
- package/dist/lib/platform/repository-metadata.js +377 -0
- package/dist/lib/platform/resource-identity.d.ts +26 -0
- package/dist/lib/platform/resource-identity.js +92 -0
- package/dist/lib/platform/security-alerts.js +155 -0
- package/dist/lib/platform/task-identities.js +31 -0
- package/dist/lib/platform/verification-required.js +11 -12
- package/dist/lib/platform/verification-sync.js +129 -248
- package/dist/lib/pr-review/evidence-grading.js +19 -6
- package/dist/lib/process-data/index.js +7 -0
- package/dist/lib/run/index.js +68 -23
- package/dist/lib/sandbox/commands/control-status.js +22 -0
- package/dist/lib/sandbox/commands/create.js +32 -6
- package/dist/lib/sandbox/commands/ls.js +5 -0
- package/dist/lib/sandbox/commands/rm.js +827 -120
- package/dist/lib/sandbox/commands/show.js +16 -0
- package/dist/lib/sandbox/control/client.js +174 -19
- package/dist/lib/sandbox/control/completed-reentry.js +85 -0
- package/dist/lib/sandbox/control/container-identity.js +28 -31
- package/dist/lib/sandbox/control/executor.js +151 -16
- package/dist/lib/sandbox/control/lifecycle.js +621 -127
- package/dist/lib/sandbox/control/native-file-lock.js +177 -0
- package/dist/lib/sandbox/control/protocol.js +77 -0
- package/dist/lib/sandbox/control/server.js +677 -34
- package/dist/lib/sandbox/control/state.js +209 -4
- package/dist/lib/sandbox/control/task-view.js +183 -0
- package/dist/lib/sandbox/engines/authority.js +289 -0
- package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
- package/dist/lib/sandbox/index.js +5 -0
- package/dist/lib/sandbox/recovery.js +21 -1
- package/dist/lib/sandbox/workspace-view.js +2 -1
- package/dist/lib/sandbox/worktree-safety.js +4 -1
- package/dist/lib/server/index.js +8 -0
- package/dist/lib/server/protocol.js +38 -1
- package/dist/lib/task/activity-log.js +8 -1
- package/dist/lib/task/artifact-lifecycle.js +75 -18
- package/dist/lib/task/artifact-operations.js +520 -0
- package/dist/lib/task/artifact-repair-intent.js +59 -0
- package/dist/lib/task/artifact-schema.js +135 -0
- package/dist/lib/task/capabilities.js +310 -0
- package/dist/lib/task/commands/status.js +32 -0
- package/dist/lib/task/commit-operation.js +12 -1
- package/dist/lib/task/control-authority.js +12 -5
- package/dist/lib/task/create-service.js +111 -12
- package/dist/lib/task/create.js +25 -0
- package/dist/lib/task/current-contract.js +5 -1
- package/dist/lib/task/decision-details.js +1 -1
- package/dist/lib/task/events.js +416 -17
- package/dist/lib/task/finalization.js +37 -13
- package/dist/lib/task/human-override.js +58 -36
- package/dist/lib/task/index.js +11 -3
- package/dist/lib/task/invalidation-command.js +86 -0
- package/dist/lib/task/invalidation.js +260 -0
- package/dist/lib/task/ledger-intents.js +37 -0
- package/dist/lib/task/local-artifact-finalization.js +299 -0
- package/dist/lib/task/orchestration.js +240 -144
- package/dist/lib/task/pr-delivery-fact.js +102 -101
- package/dist/lib/task/qualification-audit.js +490 -0
- package/dist/lib/task/qualification-confirmation.js +109 -0
- package/dist/lib/task/qualification-intents.js +148 -0
- package/dist/lib/task/review-artifacts.js +22 -23
- package/dist/lib/task/review-finalization.js +121 -4
- package/dist/lib/task/review-fingerprint.js +24 -2
- package/dist/lib/task/rework-intent.js +138 -0
- package/dist/lib/task/sections.js +6 -4
- package/dist/lib/task/skill-scope.js +23 -0
- package/dist/lib/task/task-execution-lock.js +27 -17
- package/dist/lib/task/verification-config.js +11 -0
- package/dist/lib/task/verification-engine.js +93 -16
- package/dist/lib/task/verification.js +3 -3
- package/dist/lib/task/workflow-warning-intents.js +1 -1
- package/dist/lib/task/write.js +11 -0
- package/dist/lib/version.js +11 -1
- package/dist/lifecycle-build-manifest.json +3 -3
- package/lib/agent-client.ts +9 -0
- package/lib/agent-clients/next-steps.ts +6 -1
- package/lib/decide.ts +3 -3
- package/lib/init.ts +1 -1
- package/lib/internal/agent-client.ts +4 -2
- package/lib/internal/cli-route-inventory.ts +140 -0
- package/lib/internal/codex-lifecycle.ts +8 -6
- package/lib/internal/codex-sandbox-controller.ts +7 -2
- package/lib/internal/git-workflow.ts +9 -6
- package/lib/internal/platform-checks.ts +14 -6
- package/lib/internal/platform-comment.ts +20 -12
- package/lib/internal/platform-context.ts +5 -3
- package/lib/internal/platform-issue.ts +17 -11
- package/lib/internal/platform-metadata.ts +70 -0
- package/lib/internal/platform-pr-review.ts +23 -12
- package/lib/internal/platform-pr.ts +65 -27
- package/lib/internal/platform-release-notes.ts +8 -6
- package/lib/internal/platform-security.ts +83 -0
- package/lib/internal/pr-review-grade.ts +20 -11
- package/lib/internal/release-workflow.ts +21 -9
- package/lib/internal/sandbox-control.ts +44 -6
- package/lib/internal/task-activity.ts +15 -7
- package/lib/internal/task-artifact.ts +204 -22
- package/lib/internal/task-context.ts +3 -1
- package/lib/internal/task-create.ts +78 -17
- package/lib/internal/task-delivery.ts +3 -1
- package/lib/internal/task-event.ts +9 -4
- package/lib/internal/task-finalization.ts +6 -4
- package/lib/internal/task-invalidation.ts +41 -0
- package/lib/internal/task-ledger.ts +21 -8
- package/lib/internal/task-lifecycle.ts +5 -3
- package/lib/internal/task-operation-registry.ts +482 -0
- package/lib/internal/task-orchestration.ts +12 -0
- package/lib/internal/task-override.ts +15 -9
- package/lib/internal/task-qualification.ts +61 -0
- package/lib/internal/task-review.ts +6 -4
- package/lib/internal/task-short-id.ts +10 -1
- package/lib/internal/task-snapshot.ts +3 -1
- package/lib/internal/task-validate.ts +6 -2
- package/lib/internal/task-verify.ts +10 -7
- package/lib/internal/task-warning.ts +10 -4
- package/lib/platform/adapters.ts +3 -2
- package/lib/platform/change-request-git-evidence.ts +36 -9
- package/lib/platform/comment-safety.ts +250 -0
- package/lib/platform/completion-backfill.ts +9 -8
- package/lib/platform/context.ts +97 -134
- package/lib/platform/github-client.ts +2 -2
- package/lib/platform/github-provider.ts +1132 -0
- package/lib/platform/in-label-sync.ts +208 -0
- package/lib/platform/issue-comments.ts +255 -80
- package/lib/platform/issues.ts +344 -174
- package/lib/platform/metadata-labels.ts +5 -2
- package/lib/platform/none-provider.ts +35 -0
- package/lib/platform/pr-change-report.ts +639 -0
- package/lib/platform/pr-checks.ts +126 -106
- package/lib/platform/pr-review.ts +88 -85
- package/lib/platform/pr-summary.ts +581 -53
- package/lib/platform/provider-bridge.ts +82 -0
- package/lib/platform/provider-contract.ts +611 -0
- package/lib/platform/provider-loader.ts +307 -0
- package/lib/platform/provider-validation.ts +611 -0
- package/lib/platform/pull-request-metadata.ts +10 -7
- package/lib/platform/pull-requests.ts +781 -550
- package/lib/platform/release-notes.ts +76 -59
- package/lib/platform/releases.ts +77 -43
- package/lib/platform/repository-metadata.ts +453 -0
- package/lib/platform/resource-identity.ts +121 -0
- package/lib/platform/security-alerts.ts +191 -0
- package/lib/platform/task-identities.ts +40 -0
- package/lib/platform/types.ts +4 -2
- package/lib/platform/verification-required.ts +11 -13
- package/lib/platform/verification-sync.ts +128 -304
- package/lib/pr-review/evidence-grading.ts +25 -8
- package/lib/process-data/index.ts +7 -0
- package/lib/run/index.ts +62 -22
- package/lib/sandbox/commands/control-status.ts +26 -0
- package/lib/sandbox/commands/create.ts +46 -6
- package/lib/sandbox/commands/ls.ts +7 -0
- package/lib/sandbox/commands/rm.ts +1000 -87
- package/lib/sandbox/commands/show.ts +16 -0
- package/lib/sandbox/control/client.ts +203 -19
- package/lib/sandbox/control/completed-reentry.ts +98 -0
- package/lib/sandbox/control/container-identity.ts +27 -43
- package/lib/sandbox/control/executor.ts +180 -15
- package/lib/sandbox/control/lifecycle.ts +629 -17
- package/lib/sandbox/control/native-file-lock.ts +209 -0
- package/lib/sandbox/control/protocol.ts +118 -2
- package/lib/sandbox/control/server.ts +724 -34
- package/lib/sandbox/control/state.ts +257 -4
- package/lib/sandbox/control/task-view.ts +240 -0
- package/lib/sandbox/engines/authority.ts +365 -0
- package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
- package/lib/sandbox/index.ts +7 -0
- package/lib/sandbox/recovery.ts +21 -1
- package/lib/sandbox/workspace-view.ts +9 -3
- package/lib/sandbox/worktree-safety.ts +4 -1
- package/lib/server/index.ts +10 -0
- package/lib/server/protocol.ts +36 -1
- package/lib/task/activity-log.ts +8 -0
- package/lib/task/artifact-lifecycle.ts +70 -22
- package/lib/task/artifact-operations.ts +626 -0
- package/lib/task/artifact-repair-intent.ts +71 -0
- package/lib/task/artifact-schema.ts +192 -0
- package/lib/task/capabilities.ts +331 -0
- package/lib/task/commands/status.ts +38 -0
- package/lib/task/commit-operation.ts +12 -1
- package/lib/task/control-authority.ts +22 -9
- package/lib/task/create-service.ts +139 -14
- package/lib/task/create.ts +27 -0
- package/lib/task/current-contract.ts +6 -1
- package/lib/task/decision-details.ts +6 -2
- package/lib/task/events.ts +392 -16
- package/lib/task/finalization.ts +50 -14
- package/lib/task/human-override.ts +70 -46
- package/lib/task/index.ts +16 -3
- package/lib/task/invalidation-command.ts +86 -0
- package/lib/task/invalidation.ts +332 -0
- package/lib/task/ledger-intents.ts +35 -1
- package/lib/task/local-artifact-finalization.ts +432 -0
- package/lib/task/orchestration.ts +223 -133
- package/lib/task/pr-delivery-fact.ts +131 -148
- package/lib/task/qualification-audit.ts +599 -0
- package/lib/task/qualification-confirmation.ts +117 -0
- package/lib/task/qualification-intents.ts +150 -0
- package/lib/task/review-artifacts.ts +21 -22
- package/lib/task/review-finalization.ts +133 -4
- package/lib/task/review-fingerprint.ts +23 -2
- package/lib/task/rework-intent.ts +165 -0
- package/lib/task/sections.ts +6 -4
- package/lib/task/skill-scope.ts +24 -0
- package/lib/task/task-execution-lock.ts +23 -14
- package/lib/task/verification-config.ts +12 -0
- package/lib/task/verification-engine.ts +103 -17
- package/lib/task/verification.ts +4 -4
- package/lib/task/workflow-warning-intents.ts +1 -1
- package/lib/task/write.ts +19 -0
- package/lib/update.ts +1 -1
- package/lib/version.ts +15 -1
- package/package.json +12 -1
- package/templates/.agents/rules/README.en.md +3 -1
- package/templates/.agents/rules/README.zh-CN.md +3 -1
- package/templates/.agents/rules/decision-qualification.en.md +22 -0
- package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
- package/templates/.agents/rules/evidence-reporting.en.md +28 -0
- package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
- package/templates/.agents/rules/issue-pr-commands.en.md +1 -1
- package/templates/.agents/rules/issue-pr-commands.zh-CN.md +1 -1
- package/templates/.agents/rules/issue-sync.en.md +2 -0
- package/templates/.agents/rules/issue-sync.zh-CN.md +2 -0
- package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
- package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
- package/templates/.agents/rules/local-artifact-repair.en.md +13 -2
- package/templates/.agents/rules/local-artifact-repair.zh-CN.md +13 -2
- package/templates/.agents/rules/pr-sync.en.md +10 -4
- package/templates/.agents/rules/pr-sync.zh-CN.md +17 -4
- package/templates/.agents/rules/security-alerts.en.md +8 -8
- package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
- package/templates/.agents/rules/task-short-id.en.md +1 -4
- package/templates/.agents/rules/task-short-id.zh-CN.md +1 -3
- package/templates/.agents/skills/analyze-task/SKILL.en.md +28 -5
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +29 -5
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
- package/templates/.agents/skills/check-task/SKILL.en.md +16 -37
- package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -37
- package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/code-task/SKILL.en.md +41 -9
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +43 -11
- package/templates/.agents/skills/code-task/config/verify.en.json +6 -14
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +6 -14
- package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
- package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
- package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
- package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
- package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
- package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +2 -0
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +2 -0
- package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +3 -3
- package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +3 -3
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +10 -4
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +10 -4
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +4 -3
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +4 -3
- package/templates/.agents/skills/complete-task/SKILL.en.md +26 -21
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +25 -21
- package/templates/.agents/skills/create-pr/SKILL.en.md +7 -6
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +7 -7
- package/templates/.agents/skills/create-pr/config/verify.json +1 -0
- package/templates/.agents/skills/create-pr/reference/change-report.en.md +16 -4
- package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +16 -4
- package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +5 -3
- package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +5 -3
- package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +1 -1
- package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +1 -1
- package/templates/.agents/skills/create-pr/scripts/change-report.mjs +3 -0
- package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
- package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
- package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
- package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
- package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
- package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
- package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
- package/templates/.agents/skills/plan-task/SKILL.en.md +27 -4
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +26 -4
- package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
- package/templates/.agents/skills/review-analysis/SKILL.en.md +17 -4
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +17 -4
- package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-code/SKILL.en.md +18 -5
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +18 -5
- package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
- package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-plan/SKILL.en.md +17 -4
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +17 -4
- package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
- package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
- package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
- package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.en.md +9 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +9 -3
- package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
- package/templates/.agents/skills/test/SKILL.en.md +13 -2
- package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
- package/templates/.agents/skills/watch-pr/SKILL.en.md +2 -2
- package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +6 -0
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +6 -0
- package/templates/.agents/templates/task.en.md +24 -1
- package/templates/.agents/templates/task.zh-CN.md +24 -1
- package/templates/.github/workflows/pr-label.yml +7 -26
- package/templates/.agents/scripts/security-alerts.github.sh +0 -151
- package/templates/.agents/scripts/security-alerts.sh +0 -31
- package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
- package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
- package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
- package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
4
4
|
import { parseTypedTaskFrontmatter } from './frontmatter.js';
|
|
5
5
|
import { validateCurrentTaskContract } from './current-contract.js';
|
|
6
|
-
import { parseReviewSummary
|
|
7
|
-
import { inspectArtifactDirectory } from './artifact-lifecycle.js';
|
|
6
|
+
import { parseReviewSummary } from './review-artifacts.js';
|
|
8
7
|
import { LEDGER_SECTION_MISSING_CODE, LEDGER_SECTION_MISSING_MESSAGE, parseLedgerDocument, summarizeLedgerStage, validateLedgerRows } from './ledger.js';
|
|
9
8
|
import { resolveTaskRef } from './resolve-ref.js';
|
|
10
9
|
import { activateDelegation, abortPreparedDelegation, completeDelegationStage, consumeDelegation, dispatchDelegation, foldBlankToNull, isDelegationReceipt, managedDelegationRole, prepareDelegation, sealDelegation } from './delegation-receipts.js';
|
|
@@ -18,6 +17,9 @@ import { TaskExecutionLockError, withTaskExecutionLock } from './task-execution-
|
|
|
18
17
|
import { hasActiveCodexLifecycleEvidence } from '../agent-clients/adapters/codex-lifecycle/store.js';
|
|
19
18
|
import { extractReviewBaseline, extractReviewDiffBase, extractReviewTargetHead, extractReviewedHead } from './review-fingerprint.js';
|
|
20
19
|
import { resolveDeliveryTarget, resolveDiffBase, resolveTargetHead } from './delivery-target.js';
|
|
20
|
+
import { buildLifecycleFacts, canStart, recommendNext } from './capabilities.js';
|
|
21
|
+
import { hasOpenLifecycleExecution } from './activity-log.js';
|
|
22
|
+
import { invalidationBlocks } from './invalidation.js';
|
|
21
23
|
function supportsLifecycleDelegation(client) {
|
|
22
24
|
return getAgentClientCapability(client, 'subagents').level !== 'unsupported'
|
|
23
25
|
&& getAgentClientCapability(client, 'orchestration').level !== 'unsupported'
|
|
@@ -31,10 +33,12 @@ const ORCHESTRATION_STATE_INVALID_MESSAGE = 'orchestration.json does not match t
|
|
|
31
33
|
class OrchestrationStateError extends Error {
|
|
32
34
|
code = 'ORCHESTRATION_STATE_INVALID';
|
|
33
35
|
taskId;
|
|
34
|
-
|
|
36
|
+
reasonCodes;
|
|
37
|
+
constructor(taskId = null, reasonCodes = []) {
|
|
35
38
|
super(ORCHESTRATION_STATE_INVALID_MESSAGE);
|
|
36
39
|
this.name = 'OrchestrationStateError';
|
|
37
40
|
this.taskId = taskId;
|
|
41
|
+
this.reasonCodes = Object.freeze([...reasonCodes]);
|
|
38
42
|
}
|
|
39
43
|
}
|
|
40
44
|
function isRecord(value) {
|
|
@@ -115,48 +119,151 @@ const ORCHESTRATION_RUN_KEYS = [
|
|
|
115
119
|
'modelPolicySource', 'recoveryHistory', 'baseline', 'pendingDelegation', 'receipts',
|
|
116
120
|
'pause', 'commitAuthorization', 'completionEvidence', 'createdAt', 'updatedAt'
|
|
117
121
|
];
|
|
118
|
-
function
|
|
119
|
-
if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
122
|
+
function orchestrationStateReasonCodes(value, expectedTaskId) {
|
|
123
|
+
if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS))
|
|
124
|
+
return ['top-level-keys'];
|
|
125
|
+
const record = value;
|
|
126
|
+
const reasons = [];
|
|
127
|
+
if (!exactText(record.taskId))
|
|
128
|
+
reasons.push('taskId');
|
|
129
|
+
else if (expectedTaskId !== undefined && record.taskId !== expectedTaskId)
|
|
130
|
+
reasons.push('taskId-mismatch');
|
|
131
|
+
if (!exactText(record.runId))
|
|
132
|
+
reasons.push('runId');
|
|
133
|
+
if (!['running', 'paused', 'completed'].includes(record.status))
|
|
134
|
+
reasons.push('status');
|
|
135
|
+
if (!(record.nextStage === null || ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code', 'commit'].includes(record.nextStage))) {
|
|
136
|
+
reasons.push('nextStage');
|
|
137
|
+
}
|
|
138
|
+
if (!Number.isSafeInteger(record.stepCount) || record.stepCount < 0)
|
|
139
|
+
reasons.push('stepCount');
|
|
140
|
+
if (!Number.isSafeInteger(record.maxSteps) || record.maxSteps < 1)
|
|
141
|
+
reasons.push('maxSteps');
|
|
142
|
+
if (!isModelPolicy(record.modelPolicy))
|
|
143
|
+
reasons.push('modelPolicy');
|
|
144
|
+
if (!isModelPolicySource(record.modelPolicySource))
|
|
145
|
+
reasons.push('modelPolicySource');
|
|
146
|
+
if (!Array.isArray(record.recoveryHistory) || !record.recoveryHistory.every(isRecovery))
|
|
147
|
+
reasons.push('recoveryHistory');
|
|
148
|
+
if (typeof record.baseline !== 'string')
|
|
149
|
+
reasons.push('baseline');
|
|
150
|
+
if (!(record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation)))
|
|
151
|
+
reasons.push('pendingDelegation');
|
|
152
|
+
if (!Array.isArray(record.receipts) || !record.receipts.every(isDelegationReceipt))
|
|
153
|
+
reasons.push('receipts');
|
|
154
|
+
if (!(record.pause === null || isPause(record.pause)))
|
|
155
|
+
reasons.push('pause');
|
|
156
|
+
if (!hasExactKeys(record.commitAuthorization, ['issuedAt', 'consumedAt'])) {
|
|
157
|
+
reasons.push('commitAuthorization');
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
if (!nullableText(record.commitAuthorization.issuedAt))
|
|
161
|
+
reasons.push('commitAuthorization.issuedAt');
|
|
162
|
+
if (!nullableText(record.commitAuthorization.consumedAt))
|
|
163
|
+
reasons.push('commitAuthorization.consumedAt');
|
|
164
|
+
}
|
|
165
|
+
if (!(record.completionEvidence === null || isCompletionEvidence(record.completionEvidence)))
|
|
166
|
+
reasons.push('completionEvidence');
|
|
167
|
+
if (!exactText(record.createdAt))
|
|
168
|
+
reasons.push('createdAt');
|
|
169
|
+
if (!exactText(record.updatedAt))
|
|
170
|
+
reasons.push('updatedAt');
|
|
171
|
+
if (Array.isArray(record.receipts) && record.receipts.every(isDelegationReceipt)
|
|
172
|
+
&& (record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation))) {
|
|
173
|
+
const receipts = [...record.receipts, ...(record.pendingDelegation ? [record.pendingDelegation] : [])];
|
|
174
|
+
if (receipts.some((receipt) => receipt.taskId !== record.taskId || receipt.runId !== record.runId)) {
|
|
175
|
+
reasons.push('receipt-identity');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return reasons;
|
|
179
|
+
}
|
|
180
|
+
function emitDiagnostic(options, event, fields) {
|
|
181
|
+
try {
|
|
182
|
+
options?.diagnosticLog?.(event, fields);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Diagnostics must never change lifecycle behavior.
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function fileObservation(file) {
|
|
189
|
+
try {
|
|
190
|
+
const stat = fs.lstatSync(file);
|
|
191
|
+
let realpath = null;
|
|
192
|
+
try {
|
|
193
|
+
realpath = fs.realpathSync.native(file);
|
|
194
|
+
}
|
|
195
|
+
catch { /* retain the lstat observation */ }
|
|
196
|
+
return {
|
|
197
|
+
file,
|
|
198
|
+
exists: true,
|
|
199
|
+
fileType: stat.isFile() ? 'file' : stat.isDirectory() ? 'directory' : 'other',
|
|
200
|
+
symbolicLink: stat.isSymbolicLink(),
|
|
201
|
+
bytes: stat.isFile() ? stat.size : null,
|
|
202
|
+
mtimeMs: stat.mtimeMs,
|
|
203
|
+
device: stat.dev,
|
|
204
|
+
inode: stat.ino,
|
|
205
|
+
realpath
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
return {
|
|
210
|
+
file,
|
|
211
|
+
exists: false,
|
|
212
|
+
fileType: null,
|
|
213
|
+
symbolicLink: null,
|
|
214
|
+
bytes: null,
|
|
215
|
+
mtimeMs: null,
|
|
216
|
+
device: null,
|
|
217
|
+
inode: null,
|
|
218
|
+
realpath: null,
|
|
219
|
+
fsError: error instanceof Error && 'code' in error ? String(error.code) : null
|
|
220
|
+
};
|
|
145
221
|
}
|
|
222
|
+
}
|
|
223
|
+
function parseOrchestrationRun(value, expectedTaskId) {
|
|
224
|
+
const reasonCodes = orchestrationStateReasonCodes(value, expectedTaskId);
|
|
225
|
+
if (reasonCodes.length > 0)
|
|
226
|
+
throw new OrchestrationStateError(expectedTaskId ?? null, reasonCodes);
|
|
146
227
|
return value;
|
|
147
228
|
}
|
|
148
|
-
function readRun(taskDir) {
|
|
229
|
+
function readRun(taskDir, options = {}) {
|
|
149
230
|
const file = orchestrationPath(taskDir);
|
|
150
|
-
if (!fs.existsSync(file))
|
|
151
|
-
return null;
|
|
152
231
|
const taskId = path.basename(taskDir);
|
|
232
|
+
const observed = options.diagnosticLog ? fileObservation(file) : {};
|
|
233
|
+
if (!fs.existsSync(file)) {
|
|
234
|
+
emitDiagnostic(options, 'orchestration-state-missing', { taskId, taskDir, ...observed });
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
emitDiagnostic(options, 'orchestration-state-read-start', { taskId, taskDir, ...observed });
|
|
238
|
+
let rawBytes = null;
|
|
239
|
+
let rawSha256 = null;
|
|
153
240
|
try {
|
|
154
|
-
|
|
241
|
+
const raw = fs.readFileSync(file, 'utf8');
|
|
242
|
+
if (options.diagnosticLog) {
|
|
243
|
+
rawBytes = Buffer.byteLength(raw, 'utf8');
|
|
244
|
+
rawSha256 = createHash('sha256').update(raw, 'utf8').digest('hex');
|
|
245
|
+
}
|
|
246
|
+
const run = parseOrchestrationRun(JSON.parse(raw), taskId);
|
|
247
|
+
emitDiagnostic(options, 'orchestration-state-read-ok', {
|
|
248
|
+
taskId, taskDir, file, rawBytes, rawSha256, status: run.status, runId: run.runId,
|
|
249
|
+
stepCount: run.stepCount, pendingDelegation: run.pendingDelegation !== null
|
|
250
|
+
});
|
|
251
|
+
return run;
|
|
155
252
|
}
|
|
156
253
|
catch (error) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
254
|
+
const reasonCodes = error instanceof OrchestrationStateError && error.reasonCodes.length > 0
|
|
255
|
+
? error.reasonCodes
|
|
256
|
+
: [error instanceof SyntaxError ? 'json-parse' : 'file-read'];
|
|
257
|
+
emitDiagnostic(options, 'orchestration-state-read-failed', {
|
|
258
|
+
taskId,
|
|
259
|
+
taskDir,
|
|
260
|
+
...observed,
|
|
261
|
+
rawBytes,
|
|
262
|
+
rawSha256,
|
|
263
|
+
reasonCodes: reasonCodes.join(','),
|
|
264
|
+
errorType: error instanceof Error ? error.name : typeof error,
|
|
265
|
+
});
|
|
266
|
+
throw new OrchestrationStateError(taskId, reasonCodes);
|
|
160
267
|
}
|
|
161
268
|
}
|
|
162
269
|
function atomicWrite(file, value) {
|
|
@@ -230,7 +337,7 @@ function beginOrResumeOrchestration(taskRef, options = {}) {
|
|
|
230
337
|
}
|
|
231
338
|
let existing;
|
|
232
339
|
try {
|
|
233
|
-
existing = readRun(resolved.taskDir);
|
|
340
|
+
existing = readRun(resolved.taskDir, options);
|
|
234
341
|
}
|
|
235
342
|
catch (error) {
|
|
236
343
|
return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
|
|
@@ -377,86 +484,21 @@ function validateSavedCurrentDiffBase(repoRoot, metadata, taskDir, reviewedHead)
|
|
|
377
484
|
}
|
|
378
485
|
return null;
|
|
379
486
|
}
|
|
380
|
-
function
|
|
381
|
-
const
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
}
|
|
396
|
-
catch (error) {
|
|
397
|
-
return { approved: false, error: String(error) };
|
|
398
|
-
}
|
|
399
|
-
const parsed = parseReviewSummary(content);
|
|
400
|
-
if (!parsed.ok)
|
|
401
|
-
return { approved: false, error: `${parsed.code}: ${parsed.message}` };
|
|
402
|
-
const verdict = resolveCanonicalVerdict(parsed.summary);
|
|
403
|
-
if (!verdict.ok)
|
|
404
|
-
return { approved: false, error: `${verdict.code}: ${verdict.message}` };
|
|
405
|
-
return { approved: verdict.verdict === 'Approved', error: null };
|
|
406
|
-
}
|
|
407
|
-
function routeFromFacts(taskDir) {
|
|
408
|
-
const analysisRound = highestRound(taskDir, 'analysis');
|
|
409
|
-
const analysisReviewRound = highestRound(taskDir, 'review-analysis');
|
|
410
|
-
const planRound = highestRound(taskDir, 'plan');
|
|
411
|
-
const planReviewRound = highestRound(taskDir, 'review-plan');
|
|
412
|
-
const codeRound = highestRound(taskDir, 'code');
|
|
413
|
-
const codeReviewRound = highestRound(taskDir, 'review-code');
|
|
414
|
-
if (analysisRound === 0) {
|
|
415
|
-
const round = analysisRound + 1;
|
|
416
|
-
return { action: 'analyze-task', role: 'executor', stage: 'analysis', round, artifact: artifactName('analysis', round) };
|
|
417
|
-
}
|
|
418
|
-
if (!hasReviewAfterArtifact(taskDir, 'analysis', 'review-analysis')) {
|
|
419
|
-
const round = analysisReviewRound + 1;
|
|
420
|
-
return { action: 'review-analysis', role: 'reviewer', stage: 'review-analysis', round, artifact: artifactName('review-analysis', round) };
|
|
421
|
-
}
|
|
422
|
-
const analysisVerdict = latestReviewApproved(taskDir, 'review-analysis');
|
|
423
|
-
if (analysisVerdict.error)
|
|
424
|
-
return { error: analysisVerdict.error };
|
|
425
|
-
if (!analysisVerdict.approved) {
|
|
426
|
-
const round = analysisRound + 1;
|
|
427
|
-
return { action: 'analyze-task', role: 'executor', stage: 'analysis', round, artifact: artifactName('analysis', round) };
|
|
428
|
-
}
|
|
429
|
-
if (planRound === 0) {
|
|
430
|
-
const round = planRound + 1;
|
|
431
|
-
return { action: 'plan-task', role: 'executor', stage: 'plan', round, artifact: artifactName('plan', round) };
|
|
432
|
-
}
|
|
433
|
-
if (!hasReviewAfterArtifact(taskDir, 'plan', 'review-plan')) {
|
|
434
|
-
const round = planReviewRound + 1;
|
|
435
|
-
return { action: 'review-plan', role: 'reviewer', stage: 'review-plan', round, artifact: artifactName('review-plan', round) };
|
|
436
|
-
}
|
|
437
|
-
const planVerdict = latestReviewApproved(taskDir, 'review-plan');
|
|
438
|
-
if (planVerdict.error)
|
|
439
|
-
return { error: planVerdict.error };
|
|
440
|
-
if (!planVerdict.approved) {
|
|
441
|
-
const round = planRound + 1;
|
|
442
|
-
return { action: 'plan-task', role: 'executor', stage: 'plan', round, artifact: artifactName('plan', round) };
|
|
443
|
-
}
|
|
444
|
-
if (codeRound === 0) {
|
|
445
|
-
const round = codeRound + 1;
|
|
446
|
-
return { action: 'code-task', role: 'executor', stage: 'code', round, artifact: artifactName('code', round) };
|
|
447
|
-
}
|
|
448
|
-
if (!hasReviewAfterArtifact(taskDir, 'code', 'review-code')) {
|
|
449
|
-
const round = codeReviewRound + 1;
|
|
450
|
-
return { action: 'review-code', role: 'reviewer', stage: 'review-code', round, artifact: artifactName('review-code', round) };
|
|
451
|
-
}
|
|
452
|
-
const codeVerdict = latestReviewApproved(taskDir, 'review-code');
|
|
453
|
-
if (codeVerdict.error)
|
|
454
|
-
return { error: codeVerdict.error };
|
|
455
|
-
if (!codeVerdict.approved) {
|
|
456
|
-
const round = codeRound + 1;
|
|
457
|
-
return { action: 'code-task', role: 'executor', stage: 'code', round, artifact: artifactName('code', round) };
|
|
458
|
-
}
|
|
459
|
-
return { action: 'commit', role: 'executor', stage: 'commit', round: 1, artifact: 'commit' };
|
|
487
|
+
function routeFromFacts(facts) {
|
|
488
|
+
const recommendation = recommendNext(facts);
|
|
489
|
+
if (!recommendation.action)
|
|
490
|
+
return { completion: true };
|
|
491
|
+
const action = recommendation.action;
|
|
492
|
+
if (action === 'manual-validation' || action === 'validation-run')
|
|
493
|
+
return null;
|
|
494
|
+
const family = action === 'analysis' ? 'analysis' : action;
|
|
495
|
+
const round = Math.max(0, ...[...(facts.artifacts[family] ?? []), ...(facts.staleArtifacts?.[family] ?? [])].map((name) => {
|
|
496
|
+
const match = /-r(\d+)\.md$/.exec(name);
|
|
497
|
+
return match ? Number(match[1]) : 1;
|
|
498
|
+
})) + 1;
|
|
499
|
+
const command = action === 'analysis' ? 'analyze-task' : action === 'plan' ? 'plan-task' : action === 'code' ? 'code-task' : action;
|
|
500
|
+
const role = action.startsWith('review-') ? 'reviewer' : 'executor';
|
|
501
|
+
return { action: command, role, stage: action, round, artifact: artifactName(family, round) };
|
|
460
502
|
}
|
|
461
503
|
function routeOrchestration(taskRef, options = {}) {
|
|
462
504
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
@@ -478,12 +520,14 @@ function routeOrchestration(taskRef, options = {}) {
|
|
|
478
520
|
}
|
|
479
521
|
let metadata;
|
|
480
522
|
let currentLedger = null;
|
|
523
|
+
let currentInvalidation = { operations: [], targets: [] };
|
|
481
524
|
if (resolved.state === 'active') {
|
|
482
525
|
const contract = validateCurrentTaskContract(content);
|
|
483
526
|
if (!contract.ok)
|
|
484
527
|
return failed('ORCHESTRATION_CURRENT_CONTRACT_INVALID', contract.message, resolved.taskId);
|
|
485
528
|
metadata = contract.metadata;
|
|
486
529
|
currentLedger = contract.ledger;
|
|
530
|
+
currentInvalidation = contract.invalidation;
|
|
487
531
|
}
|
|
488
532
|
else {
|
|
489
533
|
try {
|
|
@@ -493,19 +537,23 @@ function routeOrchestration(taskRef, options = {}) {
|
|
|
493
537
|
return failed('ORCHESTRATION_TASK_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
|
|
494
538
|
}
|
|
495
539
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
540
|
+
if (invalidationBlocks(currentInvalidation)) {
|
|
541
|
+
return failed('ORCHESTRATION_INVALIDATION_INCOMPLETE', 'artifact invalidation is incomplete; reconcile task.md before routing downstream work', resolved.taskId);
|
|
542
|
+
}
|
|
543
|
+
let run;
|
|
544
|
+
try {
|
|
545
|
+
run = readRun(resolved.taskDir, options);
|
|
546
|
+
}
|
|
547
|
+
catch (error) {
|
|
548
|
+
return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
|
|
549
|
+
}
|
|
550
|
+
const facts = buildLifecycleFacts(resolved.taskDir, content, resolved.state, hasOpenLifecycleExecution(content) || Boolean(run?.pendingDelegation));
|
|
551
|
+
if (!facts.ok)
|
|
552
|
+
return failed('ORCHESTRATION_CAPABILITY_FACTS_INVALID', facts.message, resolved.taskId);
|
|
553
|
+
const routed = routeFromFacts(facts.facts);
|
|
499
554
|
if (!routed)
|
|
500
555
|
return failed('ORCHESTRATION_ROUTE_UNKNOWN', 'cannot determine a unique lifecycle action', resolved.taskId);
|
|
501
|
-
|
|
502
|
-
const policy = run ? rolePolicy(run, routed.role) : null;
|
|
503
|
-
const next = {
|
|
504
|
-
...routed,
|
|
505
|
-
requestedModel: policy?.model ?? null,
|
|
506
|
-
requestedReasoningEffort: policy?.reasoningEffort ?? null
|
|
507
|
-
};
|
|
508
|
-
if (next.stage === 'commit') {
|
|
556
|
+
if ('completion' in routed) {
|
|
509
557
|
const reviewRound = highestRound(resolved.taskDir, 'review-code');
|
|
510
558
|
const review = parseReviewSummary(fs.readFileSync(path.join(resolved.taskDir, artifactName('review-code', reviewRound)), 'utf8'));
|
|
511
559
|
if (!review.ok || review.summary.manualValidation === null) {
|
|
@@ -581,13 +629,26 @@ function routeOrchestration(taskRef, options = {}) {
|
|
|
581
629
|
saveRun(resolved.taskDir, completed);
|
|
582
630
|
return { status: 'completed', changed: true, taskId: resolved.taskId, run: completed, next: null, error: null };
|
|
583
631
|
}
|
|
632
|
+
const action = routed.stage;
|
|
633
|
+
const capability = canStart(action, facts.facts, {
|
|
634
|
+
initiator: 'orchestrator', requestId: `orchestration:${resolved.taskId}:${routed.stage}:${routed.round}`,
|
|
635
|
+
requestedAction: action, reasonCode: 'user-request', explicitRequest: true
|
|
636
|
+
});
|
|
637
|
+
if (!capability.allowed)
|
|
638
|
+
return failed('ORCHESTRATION_CAPABILITY_DENIED', `${capability.reasonCode}: ${capability.evidence.join(', ')}`, resolved.taskId);
|
|
639
|
+
const policy = run ? rolePolicy(run, routed.role) : null;
|
|
640
|
+
const next = {
|
|
641
|
+
...routed,
|
|
642
|
+
requestedModel: policy?.model ?? null,
|
|
643
|
+
requestedReasoningEffort: policy?.reasoningEffort ?? null
|
|
644
|
+
};
|
|
584
645
|
return { status: 'running', changed: false, taskId: resolved.taskId, run, next, error: null };
|
|
585
646
|
}
|
|
586
647
|
function statusOrchestration(taskRef, options = {}) {
|
|
587
648
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
588
649
|
if (!resolved.ok)
|
|
589
650
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
590
|
-
const run = readRun(resolved.taskDir);
|
|
651
|
+
const run = readRun(resolved.taskDir, options);
|
|
591
652
|
if (!run)
|
|
592
653
|
return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
|
|
593
654
|
return { status: run.status, changed: false, taskId: resolved.taskId, run, next: null, error: null };
|
|
@@ -599,7 +660,15 @@ function prepareOrchestrationDelegationUnlocked(taskRef, input, options = {}) {
|
|
|
599
660
|
if (!(options.supportsLifecycleDelegation ?? supportsLifecycleDelegation)(input.client)) {
|
|
600
661
|
return failed('ORCHESTRATION_CLIENT_UNSUPPORTED', `client '${input.client}' does not support lifecycle orchestration`, resolved.taskId);
|
|
601
662
|
}
|
|
602
|
-
|
|
663
|
+
emitDiagnostic(options, 'orchestration-prepare-start', {
|
|
664
|
+
taskId: resolved.taskId,
|
|
665
|
+
taskDir: resolved.taskDir,
|
|
666
|
+
repoRoot: resolved.repoRoot,
|
|
667
|
+
client: input.client,
|
|
668
|
+
requestedModel: input.requestedModel ?? null,
|
|
669
|
+
requestedReasoningEffort: input.requestedReasoningEffort ?? null
|
|
670
|
+
});
|
|
671
|
+
const run = readRun(resolved.taskDir, options);
|
|
603
672
|
if (!run || run.status !== 'running')
|
|
604
673
|
return failed('ORCHESTRATION_RUN_NOT_RUNNING', 'a running orchestration is required', resolved.taskId);
|
|
605
674
|
if (run.pendingDelegation)
|
|
@@ -687,7 +756,7 @@ function dispatchOrchestrationDelegationUnlocked(taskRef, options = {}) {
|
|
|
687
756
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
688
757
|
if (!resolved.ok)
|
|
689
758
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
690
|
-
const run = readRun(resolved.taskDir);
|
|
759
|
+
const run = readRun(resolved.taskDir, options);
|
|
691
760
|
if (!run?.pendingDelegation)
|
|
692
761
|
return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
693
762
|
if (run.status !== 'running') {
|
|
@@ -721,17 +790,44 @@ function matchingDelegations(predicate, options) {
|
|
|
721
790
|
const activeRoot = path.join(repoRoot, '.agents', 'workspace', 'active');
|
|
722
791
|
if (!fs.existsSync(activeRoot))
|
|
723
792
|
return [];
|
|
724
|
-
|
|
793
|
+
emitDiagnostic(options, 'orchestration-active-scan-start', {
|
|
794
|
+
activeRoot
|
|
795
|
+
});
|
|
796
|
+
const matches = fs.readdirSync(activeRoot, { withFileTypes: true })
|
|
725
797
|
.filter((entry) => entry.isDirectory())
|
|
726
798
|
.flatMap((entry) => {
|
|
727
|
-
const
|
|
799
|
+
const candidateTaskId = entry.name;
|
|
800
|
+
const candidateTaskDir = path.join(activeRoot, candidateTaskId);
|
|
801
|
+
emitDiagnostic(options, 'orchestration-active-scan-candidate', {
|
|
802
|
+
candidateTaskId,
|
|
803
|
+
candidateTaskDir,
|
|
804
|
+
orchestrationPath: orchestrationPath(candidateTaskDir)
|
|
805
|
+
});
|
|
806
|
+
let run;
|
|
807
|
+
try {
|
|
808
|
+
run = readRun(candidateTaskDir, options);
|
|
809
|
+
}
|
|
810
|
+
catch (error) {
|
|
811
|
+
emitDiagnostic(options, 'orchestration-active-scan-candidate-failed', {
|
|
812
|
+
candidateTaskId,
|
|
813
|
+
candidateTaskDir,
|
|
814
|
+
errorType: error instanceof Error ? error.name : typeof error,
|
|
815
|
+
reasonCodes: error instanceof OrchestrationStateError ? error.reasonCodes.join(',') : null
|
|
816
|
+
});
|
|
817
|
+
throw error;
|
|
818
|
+
}
|
|
728
819
|
if (!run || run.status !== 'running' || !run.pendingDelegation)
|
|
729
820
|
return [];
|
|
730
821
|
const receipt = run.pendingDelegation;
|
|
731
822
|
return predicate(receipt)
|
|
732
|
-
? [{ taskId:
|
|
823
|
+
? [{ taskId: candidateTaskId, run }]
|
|
733
824
|
: [];
|
|
734
825
|
});
|
|
826
|
+
emitDiagnostic(options, 'orchestration-active-scan-finished', {
|
|
827
|
+
activeRoot,
|
|
828
|
+
matchingDelegations: matches.length
|
|
829
|
+
});
|
|
830
|
+
return matches;
|
|
735
831
|
}
|
|
736
832
|
function uniqueMatchingDelegation(client, predicate, options) {
|
|
737
833
|
const matches = matchingDelegations((receipt) => receipt.client === client && predicate(receipt), options);
|
|
@@ -882,7 +978,7 @@ function activateOrchestrationDelegation(taskRef, event, options = {}) {
|
|
|
882
978
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
883
979
|
if (!resolved.ok)
|
|
884
980
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
885
|
-
const run = readRun(resolved.taskDir);
|
|
981
|
+
const run = readRun(resolved.taskDir, options);
|
|
886
982
|
if (!run?.pendingDelegation)
|
|
887
983
|
return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
888
984
|
if (run.status !== 'running') {
|
|
@@ -908,7 +1004,7 @@ async function awaitOrchestrationDelegationActivation(taskRef, event, options =
|
|
|
908
1004
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
909
1005
|
if (!resolved.ok)
|
|
910
1006
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
911
|
-
const run = readRun(resolved.taskDir);
|
|
1007
|
+
const run = readRun(resolved.taskDir, options);
|
|
912
1008
|
if (!run?.pendingDelegation) {
|
|
913
1009
|
return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
914
1010
|
}
|
|
@@ -945,7 +1041,7 @@ function recoverPreparedOrchestrationDelegation(taskRef, options = {}) {
|
|
|
945
1041
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
946
1042
|
try {
|
|
947
1043
|
return withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-orchestration.recover-prepared', () => {
|
|
948
|
-
const run = readRun(resolved.taskDir);
|
|
1044
|
+
const run = readRun(resolved.taskDir, options);
|
|
949
1045
|
const receipt = run?.pendingDelegation;
|
|
950
1046
|
if (!run || !receipt) {
|
|
951
1047
|
return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
@@ -1001,7 +1097,7 @@ function completeOrchestrationStage(taskRef, event, options = {}) {
|
|
|
1001
1097
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1002
1098
|
if (!resolved.ok)
|
|
1003
1099
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1004
|
-
const run = readRun(resolved.taskDir);
|
|
1100
|
+
const run = readRun(resolved.taskDir, options);
|
|
1005
1101
|
if (!run)
|
|
1006
1102
|
return { status: 'running', changed: false, taskId: resolved.taskId, run: null, next: null, error: null };
|
|
1007
1103
|
if (!run.pendingDelegation)
|
|
@@ -1019,7 +1115,7 @@ function inspectOrchestrationStage(taskRef, event, options = {}) {
|
|
|
1019
1115
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1020
1116
|
let run;
|
|
1021
1117
|
try {
|
|
1022
|
-
run = readRun(resolved.taskDir);
|
|
1118
|
+
run = readRun(resolved.taskDir, options);
|
|
1023
1119
|
}
|
|
1024
1120
|
catch (error) {
|
|
1025
1121
|
return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
|
|
@@ -1067,7 +1163,7 @@ function sealOrchestrationDelegation(taskRef, event, options = {}) {
|
|
|
1067
1163
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1068
1164
|
if (!resolved.ok)
|
|
1069
1165
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1070
|
-
const run = readRun(resolved.taskDir);
|
|
1166
|
+
const run = readRun(resolved.taskDir, options);
|
|
1071
1167
|
if (!run?.pendingDelegation)
|
|
1072
1168
|
return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
1073
1169
|
const result = sealDelegation(run.pendingDelegation, event, { now: options.now });
|
|
@@ -1081,7 +1177,7 @@ function advanceOrchestration(taskRef, options = {}) {
|
|
|
1081
1177
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1082
1178
|
if (!resolved.ok)
|
|
1083
1179
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1084
|
-
const run = readRun(resolved.taskDir);
|
|
1180
|
+
const run = readRun(resolved.taskDir, options);
|
|
1085
1181
|
if (!run?.pendingDelegation)
|
|
1086
1182
|
return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
|
|
1087
1183
|
const result = consumeDelegation(run.pendingDelegation, { now: options.now });
|
|
@@ -1104,7 +1200,7 @@ function pauseOrchestration(taskRef, code, message, recoverable, options = {}) {
|
|
|
1104
1200
|
const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
|
|
1105
1201
|
if (!resolved.ok)
|
|
1106
1202
|
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
1107
|
-
const run = readRun(resolved.taskDir);
|
|
1203
|
+
const run = readRun(resolved.taskDir, options);
|
|
1108
1204
|
if (!run)
|
|
1109
1205
|
return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
|
|
1110
1206
|
const updated = withUpdatedRun(run, { status: 'paused', pause: { code, message, recoverable } });
|