@fitlab-ai/agent-infra 0.9.13 → 0.9.15
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 +10 -0
- package/README.zh-CN.md +10 -0
- package/bin/cli.ts +26 -9
- package/bin/internal-cli.sh +45 -0
- package/dist/bin/cli.js +173 -157
- package/dist/bin/internal-cli.js +126 -42
- package/dist/lib/agent-client.js +5 -0
- package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
- package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
- package/dist/lib/defaults.json +103 -103
- package/dist/lib/fs/durable-write.js +37 -0
- package/dist/lib/fs/file-lock.js +111 -0
- package/dist/lib/host-control/audit.js +19 -0
- package/dist/lib/host-control/client.js +142 -0
- package/dist/lib/host-control/command.js +49 -0
- package/dist/lib/host-control/path.js +160 -0
- package/dist/lib/host-control/secure-fs.js +140 -0
- package/dist/lib/host-control/server.js +159 -0
- package/dist/lib/host-control/service.js +112 -0
- package/dist/lib/init.js +11 -2
- package/dist/lib/internal/agent-client.js +5 -2
- package/dist/lib/internal/cli-route-inventory.js +154 -0
- package/dist/lib/internal/codex-lifecycle.js +15 -12
- package/dist/lib/internal/codex-sandbox-controller.js +8 -2
- package/dist/lib/internal/demo-promotion.js +322 -0
- package/dist/lib/internal/demo-transcript.js +454 -0
- package/dist/lib/internal/git-workflow.js +10 -6
- package/dist/lib/internal/host-control.js +28 -0
- package/dist/lib/internal/manual-validation.js +322 -0
- package/dist/lib/internal/platform-checks.js +16 -4
- package/dist/lib/internal/platform-comment.js +16 -4
- package/dist/lib/internal/platform-context.js +4 -1
- package/dist/lib/internal/platform-issue.js +12 -4
- package/dist/lib/internal/platform-metadata.js +88 -0
- package/dist/lib/internal/platform-pr-review.js +16 -3
- package/dist/lib/internal/platform-pr.js +42 -14
- package/dist/lib/internal/platform-release-notes.js +6 -3
- package/dist/lib/internal/platform-security.js +93 -0
- package/dist/lib/internal/pr-review-grade.js +14 -3
- package/dist/lib/internal/release-workflow.js +82 -89
- package/dist/lib/internal/sandbox-control.js +171 -7
- package/dist/lib/internal/task-activity.js +13 -4
- package/dist/lib/internal/task-artifact.js +19 -107
- package/dist/lib/internal/task-context.js +4 -1
- package/dist/lib/internal/task-create.js +48 -14
- package/dist/lib/internal/task-delivery.js +4 -1
- package/dist/lib/internal/task-event.js +38 -35
- package/dist/lib/internal/task-finalization.js +4 -1
- package/dist/lib/internal/task-invalidation.js +4 -1
- package/dist/lib/internal/task-ledger.js +12 -1
- package/dist/lib/internal/task-lifecycle.js +4 -1
- package/dist/lib/internal/task-operation-registry.js +519 -0
- package/dist/lib/internal/task-orchestration.js +12 -0
- package/dist/lib/internal/task-override.js +10 -3
- package/dist/lib/internal/task-qualification.js +90 -0
- package/dist/lib/internal/task-review.js +10 -52
- 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 +37 -12
- package/dist/lib/internal/task-verify.js +5 -1
- package/dist/lib/internal/task-warning.js +8 -1
- package/dist/lib/owned-path.js +33 -0
- package/dist/lib/platform/check-status.js +11 -0
- package/dist/lib/platform/comment-safety.js +229 -0
- package/dist/lib/platform/completion-backfill.js +1 -1
- package/dist/lib/platform/github-data.js +241 -0
- package/dist/lib/platform/github-provider.js +248 -26
- package/dist/lib/platform/issue-comments.js +146 -34
- package/dist/lib/platform/issues.js +1 -179
- package/dist/lib/platform/pr-change-report.js +6 -12
- package/dist/lib/platform/pr-checks.js +12 -65
- package/dist/lib/platform/pr-summary.js +83 -10
- package/dist/lib/platform/provider-contract.d.ts +67 -1
- package/dist/lib/platform/provider-contract.js +6 -2
- package/dist/lib/platform/provider-validation.js +76 -3
- package/dist/lib/platform/pull-requests.js +117 -275
- package/dist/lib/platform/repository-metadata.js +377 -0
- package/dist/lib/platform/security-alerts.js +155 -0
- package/dist/lib/platform/snapshots.js +2 -0
- package/dist/lib/platform/verification-sync.js +154 -162
- package/dist/lib/process-data/index.js +7 -0
- package/dist/lib/release/workflow.js +1 -1
- package/dist/lib/run/index.js +5 -0
- package/dist/lib/sandbox/commands/control-status.js +22 -0
- package/dist/lib/sandbox/commands/create.js +39 -8
- package/dist/lib/sandbox/commands/ls.js +5 -0
- package/dist/lib/sandbox/commands/rm.js +3 -807
- package/dist/lib/sandbox/commands/show.js +16 -0
- package/dist/lib/sandbox/control/audit.js +203 -0
- package/dist/lib/sandbox/control/client.js +125 -12
- 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 +233 -34
- package/dist/lib/sandbox/control/finalization-response.js +27 -0
- package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
- package/dist/lib/sandbox/control/lifecycle.js +656 -128
- package/dist/lib/sandbox/control/native-file-lock.js +85 -0
- package/dist/lib/sandbox/control/protocol.js +55 -4
- package/dist/lib/sandbox/control/server.js +720 -79
- package/dist/lib/sandbox/control/state.js +63 -3
- package/dist/lib/sandbox/control/task-view.js +183 -0
- package/dist/lib/sandbox/control/task-workflow.js +74 -0
- package/dist/lib/sandbox/control/workflow-executor.js +99 -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 +7 -2
- package/dist/lib/sandbox/recovery.js +49 -5
- package/dist/lib/sandbox/removal.js +1717 -0
- package/dist/lib/sandbox/task-cleanup.js +217 -0
- package/dist/lib/sandbox/workspace-view.js +15 -15
- package/dist/lib/sandbox/worktree-safety.js +4 -1
- package/dist/lib/server/index.js +8 -0
- package/dist/lib/task/activity-intent.js +2 -1
- package/dist/lib/task/activity-log.js +30 -24
- package/dist/lib/task/artifact-command.js +101 -0
- package/dist/lib/task/artifact-lifecycle.js +71 -40
- package/dist/lib/task/artifact-name.js +36 -0
- package/dist/lib/task/artifact-operations.js +474 -0
- package/dist/lib/task/artifact-receipts.js +3 -15
- package/dist/lib/task/artifact-repair-intent.js +130 -0
- package/dist/lib/task/artifact-schema.js +127 -0
- package/dist/lib/task/capabilities.js +83 -19
- package/dist/lib/task/codex-orchestration.js +71 -25
- package/dist/lib/task/commit-identity.js +28 -0
- package/dist/lib/task/commit-operation.js +2 -16
- package/dist/lib/task/control-authority.js +375 -5
- package/dist/lib/task/control-recovery.js +128 -0
- package/dist/lib/task/create-service.js +103 -4
- package/dist/lib/task/create.js +80 -2
- package/dist/lib/task/decision-details.js +2 -46
- package/dist/lib/task/events.js +306 -76
- package/dist/lib/task/finalization-state.js +9 -0
- package/dist/lib/task/human-override.js +3 -6
- package/dist/lib/task/implementation-inputs.js +3 -3
- package/dist/lib/task/index.js +11 -3
- package/dist/lib/task/intermediate-cleanup.js +383 -0
- package/dist/lib/task/invalidation.js +18 -65
- package/dist/lib/task/ledger-intents.js +7 -22
- package/dist/lib/task/ledger.js +1 -3
- package/dist/lib/task/lifecycle.js +19 -1
- package/dist/lib/task/local-artifact-finalization.js +190 -290
- package/dist/lib/task/manual-validation-completion.js +26 -0
- package/dist/lib/task/manual-validation-evidence.js +130 -0
- package/dist/lib/task/manual-validation-receipt.js +101 -0
- package/dist/lib/task/manual-validation-shared.js +40 -0
- package/dist/lib/task/manual-validation-transaction.js +243 -0
- package/dist/lib/task/markdown.js +47 -0
- package/dist/lib/task/orchestration.js +206 -69
- package/dist/lib/task/qualification-audit.js +476 -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 +23 -40
- package/dist/lib/task/review-command.js +25 -0
- package/dist/lib/task/review-finalization.js +146 -97
- package/dist/lib/task/review-fingerprint.js +2 -2
- package/dist/lib/task/sections.js +34 -54
- package/dist/lib/task/verification-config.js +11 -0
- package/dist/lib/task/verification-engine.js +170 -327
- package/dist/lib/task/verification.js +1 -1
- package/dist/lib/task/workflow-command.js +17 -0
- package/dist/lib/task/workflow-warning-intents.js +0 -16
- package/dist/lib/task/workflow-warnings.js +28 -2
- package/dist/lib/update.js +2 -0
- package/dist/lifecycle-build-manifest.json +3 -3
- package/lib/agent-client.ts +9 -0
- package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
- package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
- package/lib/fs/durable-write.ts +29 -0
- package/lib/fs/file-lock.ts +113 -0
- package/lib/host-control/audit.ts +22 -0
- package/lib/host-control/client.ts +172 -0
- package/lib/host-control/command.ts +60 -0
- package/lib/host-control/path.ts +167 -0
- package/lib/host-control/secure-fs.ts +135 -0
- package/lib/host-control/server.ts +180 -0
- package/lib/host-control/service.ts +133 -0
- package/lib/init.ts +15 -2
- package/lib/internal/agent-client.ts +4 -2
- package/lib/internal/cli-route-inventory.ts +142 -0
- package/lib/internal/codex-lifecycle.ts +14 -12
- package/lib/internal/codex-sandbox-controller.ts +7 -2
- package/lib/internal/demo-promotion.ts +354 -0
- package/lib/internal/demo-transcript.ts +419 -0
- package/lib/internal/git-workflow.ts +9 -6
- package/lib/internal/host-control.ts +28 -0
- package/lib/internal/manual-validation.ts +306 -0
- package/lib/internal/platform-checks.ts +12 -4
- package/lib/internal/platform-comment.ts +12 -4
- package/lib/internal/platform-context.ts +3 -1
- package/lib/internal/platform-issue.ts +11 -4
- package/lib/internal/platform-metadata.ts +70 -0
- package/lib/internal/platform-pr-review.ts +14 -3
- package/lib/internal/platform-pr.ts +38 -14
- package/lib/internal/platform-release-notes.ts +5 -3
- package/lib/internal/platform-security.ts +83 -0
- package/lib/internal/pr-review-grade.ts +10 -3
- package/lib/internal/release-workflow.ts +91 -87
- package/lib/internal/sandbox-control.ts +181 -6
- package/lib/internal/task-activity.ts +12 -4
- package/lib/internal/task-artifact.ts +15 -79
- package/lib/internal/task-context.ts +3 -1
- package/lib/internal/task-create.ts +76 -15
- package/lib/internal/task-delivery.ts +3 -1
- package/lib/internal/task-event.ts +21 -10
- package/lib/internal/task-finalization.ts +3 -1
- package/lib/internal/task-invalidation.ts +3 -1
- package/lib/internal/task-ledger.ts +11 -1
- package/lib/internal/task-lifecycle.ts +3 -1
- package/lib/internal/task-operation-registry.ts +590 -0
- package/lib/internal/task-orchestration.ts +12 -0
- package/lib/internal/task-override.ts +9 -3
- package/lib/internal/task-qualification.ts +61 -0
- package/lib/internal/task-review.ts +7 -50
- package/lib/internal/task-short-id.ts +10 -1
- package/lib/internal/task-snapshot.ts +3 -1
- package/lib/internal/task-validate.ts +32 -12
- package/lib/internal/task-verify.ts +4 -1
- package/lib/internal/task-warning.ts +7 -1
- package/lib/owned-path.ts +26 -0
- package/lib/platform/check-status.ts +9 -0
- package/lib/platform/comment-safety.ts +255 -0
- package/lib/platform/completion-backfill.ts +1 -1
- package/lib/platform/github-data.ts +322 -0
- package/lib/platform/github-provider.ts +244 -27
- package/lib/platform/issue-comments.ts +159 -35
- package/lib/platform/issues.ts +4 -245
- package/lib/platform/pr-change-report.ts +6 -12
- package/lib/platform/pr-checks.ts +13 -77
- package/lib/platform/pr-summary.ts +88 -11
- package/lib/platform/provider-contract.ts +78 -3
- package/lib/platform/provider-validation.ts +85 -3
- package/lib/platform/pull-requests.ts +129 -348
- package/lib/platform/repository-metadata.ts +453 -0
- package/lib/platform/security-alerts.ts +191 -0
- package/lib/platform/snapshots.ts +53 -0
- package/lib/platform/verification-sync.ts +171 -177
- package/lib/process-data/index.ts +7 -0
- package/lib/release/workflow.ts +3 -3
- package/lib/run/index.ts +5 -0
- package/lib/sandbox/commands/control-status.ts +26 -0
- package/lib/sandbox/commands/create.ts +53 -12
- package/lib/sandbox/commands/ls.ts +7 -0
- package/lib/sandbox/commands/rm.ts +3 -996
- package/lib/sandbox/commands/show.ts +16 -0
- package/lib/sandbox/control/audit.ts +253 -0
- package/lib/sandbox/control/client.ts +150 -13
- package/lib/sandbox/control/completed-reentry.ts +98 -0
- package/lib/sandbox/control/container-identity.ts +27 -43
- package/lib/sandbox/control/executor.ts +262 -37
- package/lib/sandbox/control/finalization-response.ts +29 -0
- package/lib/sandbox/control/identity-sentinel.ts +137 -0
- package/lib/sandbox/control/lifecycle.ts +672 -18
- package/lib/sandbox/control/native-file-lock.ts +108 -0
- package/lib/sandbox/control/protocol.ts +80 -8
- package/lib/sandbox/control/server.ts +779 -82
- package/lib/sandbox/control/state.ts +84 -3
- package/lib/sandbox/control/task-view.ts +240 -0
- package/lib/sandbox/control/task-workflow.ts +95 -0
- package/lib/sandbox/control/workflow-executor.ts +102 -0
- package/lib/sandbox/engines/authority.ts +365 -0
- package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
- package/lib/sandbox/index.ts +9 -2
- package/lib/sandbox/recovery.ts +49 -6
- package/lib/sandbox/removal.ts +2144 -0
- package/lib/sandbox/task-cleanup.ts +209 -0
- package/lib/sandbox/workspace-view.ts +26 -18
- package/lib/sandbox/worktree-safety.ts +4 -1
- package/lib/server/index.ts +10 -0
- package/lib/task/activity-intent.ts +2 -2
- package/lib/task/activity-log.ts +27 -19
- package/lib/task/artifact-command.ts +104 -0
- package/lib/task/artifact-lifecycle.ts +66 -39
- package/lib/task/artifact-name.ts +55 -0
- package/lib/task/artifact-operations.ts +580 -0
- package/lib/task/artifact-receipts.ts +3 -14
- package/lib/task/artifact-repair-intent.ts +152 -0
- package/lib/task/artifact-schema.ts +163 -0
- package/lib/task/capabilities.ts +82 -22
- package/lib/task/codex-orchestration.ts +85 -24
- package/lib/task/commit-identity.ts +31 -0
- package/lib/task/commit-operation.ts +2 -16
- package/lib/task/control-authority.ts +513 -6
- package/lib/task/control-recovery.ts +174 -0
- package/lib/task/create-service.ts +131 -6
- package/lib/task/create.ts +83 -1
- package/lib/task/decision-details.ts +3 -71
- package/lib/task/events.ts +292 -75
- package/lib/task/finalization-state.ts +11 -0
- package/lib/task/human-override.ts +3 -8
- package/lib/task/implementation-inputs.ts +3 -3
- package/lib/task/index.ts +16 -3
- package/lib/task/intermediate-cleanup.ts +455 -0
- package/lib/task/invalidation.ts +18 -62
- package/lib/task/ledger-intents.ts +7 -24
- package/lib/task/ledger.ts +1 -3
- package/lib/task/lifecycle.ts +17 -1
- package/lib/task/local-artifact-finalization.ts +223 -388
- package/lib/task/manual-validation-completion.ts +40 -0
- package/lib/task/manual-validation-evidence.ts +209 -0
- package/lib/task/manual-validation-receipt.ts +152 -0
- package/lib/task/manual-validation-shared.ts +50 -0
- package/lib/task/manual-validation-transaction.ts +304 -0
- package/lib/task/markdown.ts +70 -0
- package/lib/task/orchestration.ts +191 -68
- package/lib/task/qualification-audit.ts +588 -0
- package/lib/task/qualification-confirmation.ts +117 -0
- package/lib/task/qualification-intents.ts +150 -0
- package/lib/task/review-artifacts.ts +21 -41
- package/lib/task/review-command.ts +23 -0
- package/lib/task/review-finalization.ts +154 -153
- package/lib/task/review-fingerprint.ts +2 -2
- package/lib/task/sections.ts +33 -52
- package/lib/task/verification-config.ts +12 -0
- package/lib/task/verification-engine.ts +165 -370
- package/lib/task/verification-types.ts +17 -0
- package/lib/task/verification.ts +1 -1
- package/lib/task/workflow-command.ts +18 -0
- package/lib/task/workflow-warning-intents.ts +0 -13
- package/lib/task/workflow-warnings.ts +21 -2
- package/lib/update.ts +6 -0
- package/package.json +7 -2
- package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
- package/templates/.agents/rules/README.en.md +2 -0
- package/templates/.agents/rules/README.zh-CN.md +2 -0
- 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/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 +5 -1
- package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
- 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/testing-discipline.en.md +2 -0
- package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
- package/templates/.agents/scripts/package.json +3 -0
- package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
- 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/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 +14 -1
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -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/complete-manual-validation/SKILL.en.md +37 -21
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -21
- package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +4 -0
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -0
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
- package/templates/.agents/skills/complete-task/SKILL.en.md +10 -23
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
- 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 +14 -1
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
- 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/release/SKILL.en.md +7 -3
- package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
- package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
- 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 +14 -1
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
- 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 +14 -1
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
- 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 +25 -4
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
- package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
- package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +5 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
- package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
- package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/test/SKILL.en.md +29 -7
- package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
- package/templates/.agents/templates/task.en.md +6 -0
- package/templates/.agents/templates/task.zh-CN.md +6 -0
- package/templates/.claude/commands/run-manual-validation.en.md +1 -1
- package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
- package/dist/lib/platform/adapters.js +0 -56
- package/lib/platform/adapters.ts +0 -197
- 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
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { parseArtifactName } from './artifact-name.js';
|
|
2
|
+
const LOCAL_SECTIONS = {
|
|
3
|
+
analysis: [
|
|
4
|
+
['source', '需求来源', 'Requirements Source'],
|
|
5
|
+
['understanding', '需求理解', 'Requirements Understanding'],
|
|
6
|
+
['files', '相关文件', 'Related Files'],
|
|
7
|
+
['impact', '影响评估', 'Impact Assessment'],
|
|
8
|
+
['risks', '技术风险', 'Technical Risks'],
|
|
9
|
+
['effort', '工作量和复杂度评估', 'Effort and Complexity Assessment'],
|
|
10
|
+
['state-check', '状态核对', 'State Check']
|
|
11
|
+
],
|
|
12
|
+
plan: [
|
|
13
|
+
['understanding', '问题理解', 'Problem Understanding'],
|
|
14
|
+
['constraints', '约束条件', 'Constraints'],
|
|
15
|
+
['options', '方案对比', 'Options Comparison'],
|
|
16
|
+
['approach', '技术方法', 'Technical Approach'],
|
|
17
|
+
['steps', '实施步骤', 'Implementation Steps'],
|
|
18
|
+
['files', '文件清单', 'File List'],
|
|
19
|
+
['verification', '验证策略', 'Verification Strategy'],
|
|
20
|
+
['state-check', '状态核对', 'State Check']
|
|
21
|
+
],
|
|
22
|
+
code: [
|
|
23
|
+
['input', '实现输入', 'Implementation Input'],
|
|
24
|
+
['files', '变更文件', 'Changed Files'],
|
|
25
|
+
['key-code', '关键代码说明', 'Key Code Notes'],
|
|
26
|
+
['tests', '测试结果', 'Test Results'],
|
|
27
|
+
['deviations', '与方案的差异', 'Differences from Plan'],
|
|
28
|
+
['review-focus', '供审查关注的内容', 'Review Focus'],
|
|
29
|
+
['state-check', '状态核对', 'State Check'],
|
|
30
|
+
['evidence', '证据原文', 'Raw Evidence']
|
|
31
|
+
],
|
|
32
|
+
'review-analysis': [
|
|
33
|
+
['summary', '审查摘要', 'Review Summary'],
|
|
34
|
+
['coverage', '检视覆盖声明', 'Inspection Coverage'],
|
|
35
|
+
['specialized-coverage', '需求分析专项覆盖', 'Requirements Analysis Coverage'],
|
|
36
|
+
['traceability', '追踪矩阵', 'Traceability Matrix'],
|
|
37
|
+
['issues', '问题清单', 'Findings'],
|
|
38
|
+
['non-blocking', '非阻塞建议', 'Non-blocking Suggestions'],
|
|
39
|
+
['manual-validation', '人工校验项', 'Manual Validation Items'],
|
|
40
|
+
['conclusion', '结论与建议', 'Conclusion and Recommendation'],
|
|
41
|
+
['state-check', '状态核对', 'State Check'],
|
|
42
|
+
['evidence', '证据原文', 'Raw Evidence'],
|
|
43
|
+
['self-critique', '自我质疑', 'Self-critique'],
|
|
44
|
+
['ledger-writeback', '审查分歧账本回写', 'Review Disagreement Ledger Write-back']
|
|
45
|
+
],
|
|
46
|
+
'review-plan': [
|
|
47
|
+
['summary', '审查摘要', 'Review Summary'],
|
|
48
|
+
['coverage', '检视覆盖声明', 'Inspection Coverage'],
|
|
49
|
+
['specialized-coverage', '技术方案架构覆盖', 'Technical Plan Architecture Coverage'],
|
|
50
|
+
['traceability', '追踪矩阵', 'Traceability Matrix'],
|
|
51
|
+
['issues', '问题清单', 'Findings'],
|
|
52
|
+
['non-blocking', '非阻塞建议', 'Non-blocking Suggestions'],
|
|
53
|
+
['manual-validation', '人工校验项', 'Manual Validation Items'],
|
|
54
|
+
['conclusion', '结论与建议', 'Conclusion and Recommendation'],
|
|
55
|
+
['state-check', '状态核对', 'State Check'],
|
|
56
|
+
['evidence', '证据原文', 'Raw Evidence'],
|
|
57
|
+
['self-critique', '自我质疑', 'Self-critique'],
|
|
58
|
+
['ledger-writeback', '审查分歧账本回写', 'Review Disagreement Ledger Write-back']
|
|
59
|
+
],
|
|
60
|
+
'review-code': [
|
|
61
|
+
['summary', '审查摘要', 'Review Summary'],
|
|
62
|
+
['coverage', '检视覆盖声明', 'Inspection Coverage'],
|
|
63
|
+
['specialized-coverage', '代码实现专项覆盖', 'Code Implementation Coverage'],
|
|
64
|
+
['traceability', '追踪矩阵', 'Traceability Matrix'],
|
|
65
|
+
['issues', '问题清单', 'Findings'],
|
|
66
|
+
['non-blocking', '非阻塞建议', 'Non-blocking Suggestions'],
|
|
67
|
+
['manual-validation', '人工校验项', 'Manual Validation Items'],
|
|
68
|
+
['conclusion', '结论与建议', 'Conclusion and Recommendation'],
|
|
69
|
+
['state-check', '状态核对', 'State Check'],
|
|
70
|
+
['evidence', '证据原文', 'Raw Evidence'],
|
|
71
|
+
['self-critique', '自我质疑', 'Self-critique'],
|
|
72
|
+
['ledger-writeback', '审查分歧账本回写', 'Review Disagreement Ledger Write-back']
|
|
73
|
+
]
|
|
74
|
+
};
|
|
75
|
+
function buildSections(family) {
|
|
76
|
+
return LOCAL_SECTIONS[family].map(([id, zh, en], index) => ({
|
|
77
|
+
id,
|
|
78
|
+
order: index + 1,
|
|
79
|
+
headings: { zh, en },
|
|
80
|
+
marker: `artifact-section:${family}:${id}`
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
const ARTIFACT_SCHEMAS = [
|
|
84
|
+
{ family: 'analysis', title: { zh: '需求分析报告', en: 'Requirements Analysis' }, sections: buildSections('analysis'), requiredPatterns: ['^\\$ '] },
|
|
85
|
+
{ family: 'review-analysis', title: { zh: '需求分析审查报告', en: 'Analysis Review Report' }, sections: buildSections('review-analysis'), requiredPatterns: ['^### (?:审查决定|Approval Decision)$', '^\\$ '] },
|
|
86
|
+
{ family: 'plan', title: { zh: '技术方案', en: 'Technical Plan' }, sections: buildSections('plan'), requiredPatterns: ['^\\$ '] },
|
|
87
|
+
{ family: 'review-plan', title: { zh: '技术方案审查报告', en: 'Plan Review Report' }, sections: buildSections('review-plan'), requiredPatterns: ['^### (?:审查决定|Approval Decision)$', '^\\$ '] },
|
|
88
|
+
{ family: 'code', title: { zh: '实现报告', en: 'Implementation Report' }, sections: buildSections('code'), requiredPatterns: ['^\\$ '] },
|
|
89
|
+
{ family: 'review-code', title: { zh: '代码审查报告', en: 'Code Review Report' }, sections: buildSections('review-code'), requiredPatterns: [
|
|
90
|
+
'^### (?:审查决定|Approval Decision)$',
|
|
91
|
+
'^\\$ ',
|
|
92
|
+
'^- \\*\\*(?:总体结论|Overall Verdict)\\*\\*[::]\\s*(?:通过|需要修改|拒绝|Approved|Changes Requested|Rejected)\\s*$',
|
|
93
|
+
'^- \\*\\*(?:审查基线提交|Review Baseline Commit)\\*\\*[::]\\s*\\S',
|
|
94
|
+
'^- \\*\\*(?:审查差异基线|Reviewed Diff Base)\\*\\*[::]\\s*[0-9a-f]{40,64}\\s*$',
|
|
95
|
+
'^- \\*\\*(?:审查差异指纹|Reviewed Diff Fingerprint)\\*\\*[::]\\s*sha256:[0-9a-f]{64}\\s*$',
|
|
96
|
+
'^- \\*\\*(?:审查快照树|Reviewed Snapshot Tree)\\*\\*[::]\\s*[0-9a-f]{40,64}\\s*$'
|
|
97
|
+
] }
|
|
98
|
+
];
|
|
99
|
+
function getArtifactSchema(family) {
|
|
100
|
+
return ARTIFACT_SCHEMAS.find((schema) => schema.family === family) ?? null;
|
|
101
|
+
}
|
|
102
|
+
function renderArtifactSkeleton(input) {
|
|
103
|
+
const schema = getArtifactSchema(input.family);
|
|
104
|
+
if (!schema)
|
|
105
|
+
throw new Error(`unknown artifact schema family '${input.family}'`);
|
|
106
|
+
const locale = input.locale ?? 'zh-CN';
|
|
107
|
+
const identity = parseArtifactName(input.artifact);
|
|
108
|
+
if (identity?.family !== input.family)
|
|
109
|
+
throw new Error(`invalid artifact identity '${input.artifact}' for '${input.family}'`);
|
|
110
|
+
const round = identity.round;
|
|
111
|
+
const title = schema.title[locale === 'en' ? 'en' : 'zh'];
|
|
112
|
+
const headings = locale === 'en' ? 'en' : 'zh';
|
|
113
|
+
const lines = [
|
|
114
|
+
`<!-- artifact-context:${input.taskId}:${input.family}:${round} -->`,
|
|
115
|
+
`# ${title}`,
|
|
116
|
+
''
|
|
117
|
+
];
|
|
118
|
+
for (const section of schema.sections) {
|
|
119
|
+
lines.push(`## ${section.headings[headings]}`);
|
|
120
|
+
lines.push(`<!-- ${section.marker} -->`);
|
|
121
|
+
lines.push('<!-- artifact-slot:empty -->');
|
|
122
|
+
lines.push('');
|
|
123
|
+
}
|
|
124
|
+
return `${lines.join('\n').trimEnd()}\n`;
|
|
125
|
+
}
|
|
126
|
+
export { ARTIFACT_SCHEMAS, getArtifactSchema, renderArtifactSkeleton };
|
|
127
|
+
//# sourceMappingURL=artifact-schema.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { parseArtifactName } from './artifact-name.js';
|
|
3
4
|
import { invalidationBlocks, isArtifactInvalidated, parseInvalidationDocument } from './invalidation.js';
|
|
4
5
|
import { receiptForOutput } from './artifact-receipts.js';
|
|
5
6
|
import { parseTypedTaskFrontmatter } from './frontmatter.js';
|
|
@@ -8,6 +9,8 @@ import { parseReviewSummary, resolveCanonicalVerdict } from './review-artifacts.
|
|
|
8
9
|
import { parseReworkIntentDocument } from './rework-intent.js';
|
|
9
10
|
import { sha256File } from './artifact-receipts.js';
|
|
10
11
|
import { hasOpenLifecycleExecution } from './activity-log.js';
|
|
12
|
+
import { parseQualificationAudit, parseTaskQualification } from './qualification-audit.js';
|
|
13
|
+
const ARTIFACT_AUDIT_FAMILIES = new Set(['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code']);
|
|
11
14
|
const REASONS = new Set([
|
|
12
15
|
'user-request', 'new-requirement', 'upstream-fact-doubt', 'review-finding', 'retry', 'validation-rerun'
|
|
13
16
|
]);
|
|
@@ -42,6 +45,9 @@ function canStart(action, facts, trigger) {
|
|
|
42
45
|
return deny('TASK_NOT_ACTIVE', `state=${facts.taskState}`);
|
|
43
46
|
if (invalidationBlocks(facts.invalidation))
|
|
44
47
|
return deny('INVALIDATION_INCOMPLETE');
|
|
48
|
+
if (facts.qualificationStale && facts.recommendedAction !== action) {
|
|
49
|
+
return deny('QUALIFICATION_STALE', ...(facts.qualificationStaleArtifacts ?? ['qualification audit is stale']));
|
|
50
|
+
}
|
|
45
51
|
if (facts.executionBusy)
|
|
46
52
|
return deny('EXECUTION_BUSY');
|
|
47
53
|
const implicit = trigger.explicitRequest === false;
|
|
@@ -103,12 +109,9 @@ function canStart(action, facts, trigger) {
|
|
|
103
109
|
}
|
|
104
110
|
return deny('CAPABILITY_ACTION_UNKNOWN');
|
|
105
111
|
}
|
|
106
|
-
function artifactRound(name) {
|
|
107
|
-
const match = /-r(\d+)\.md$/.exec(name);
|
|
108
|
-
return match ? Number(match[1]) : 1;
|
|
109
|
-
}
|
|
110
112
|
function latestArtifact(names) {
|
|
111
|
-
return
|
|
113
|
+
return names.map(parseArtifactName).filter((identity) => identity !== null)
|
|
114
|
+
.sort((left, right) => right.round - left.round || left.name.localeCompare(right.name))[0]?.name ?? null;
|
|
112
115
|
}
|
|
113
116
|
function reviewedInputName(content, expectedFamily) {
|
|
114
117
|
const header = content.split(/\r?\n/).findIndex((line) => /\*\*(?:审查输入|Review Input)\*\*[::]/.test(line));
|
|
@@ -122,9 +125,37 @@ function reviewMatchesLatest(facts, source, review) {
|
|
|
122
125
|
const latestSource = latestArtifact(facts.artifacts[source] ?? []);
|
|
123
126
|
return Boolean(latestSource && facts.reviewedInputs?.[review] === latestSource);
|
|
124
127
|
}
|
|
128
|
+
function qualificationCandidateSnapshotMatches(audit, qualification) {
|
|
129
|
+
const current = new Map(qualification.candidates.map((candidate) => [candidate.candidateId, candidate]));
|
|
130
|
+
return audit.candidateQualifications.length === current.size && audit.candidateQualifications.every((row) => {
|
|
131
|
+
const candidate = current.get(row.candidateId);
|
|
132
|
+
return Boolean(candidate && candidate.status === row.status && candidate.impact === row.impact
|
|
133
|
+
&& candidate.evidence === row.evidence && candidate.constraintIds.join(',') === row.constraintIds.join(','));
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const QUALIFICATION_RECOVERY_ORDER = [
|
|
137
|
+
{ action: 'analysis', pattern: /^analysis(?:-r\d+)?\.md$/ },
|
|
138
|
+
{ action: 'review-analysis', pattern: /^review-analysis(?:-r\d+)?\.md$/ },
|
|
139
|
+
{ action: 'plan', pattern: /^plan(?:-r\d+)?\.md$/ },
|
|
140
|
+
{ action: 'review-plan', pattern: /^review-plan(?:-r\d+)?\.md$/ },
|
|
141
|
+
{ action: 'code', pattern: /^code(?:-r\d+)?\.md$/ },
|
|
142
|
+
{ action: 'review-code', pattern: /^review-code(?:-r\d+)?\.md$/ }
|
|
143
|
+
];
|
|
144
|
+
function qualificationRecoveryAction(facts) {
|
|
145
|
+
const stale = facts.qualificationStaleArtifacts ?? [];
|
|
146
|
+
return QUALIFICATION_RECOVERY_ORDER.find(({ pattern }) => stale.some((name) => pattern.test(name)))?.action ?? null;
|
|
147
|
+
}
|
|
125
148
|
function recommendNext(facts) {
|
|
126
149
|
if (invalidationBlocks(facts.invalidation))
|
|
127
150
|
return { action: null, reasonCode: 'INVALIDATION_INCOMPLETE', evidence: ['reconcile task invalidation before routing'] };
|
|
151
|
+
if (facts.qualificationStale) {
|
|
152
|
+
const action = qualificationRecoveryAction(facts);
|
|
153
|
+
return {
|
|
154
|
+
action,
|
|
155
|
+
reasonCode: 'QUALIFICATION_RECOVERY_REQUIRED',
|
|
156
|
+
evidence: facts.qualificationStaleArtifacts ?? ['qualification audit is stale']
|
|
157
|
+
};
|
|
158
|
+
}
|
|
128
159
|
const pendingIntent = (facts.reworkIntents ?? []).find((intent) => intent.status === 'pending');
|
|
129
160
|
if (pendingIntent)
|
|
130
161
|
return { action: pendingIntent.target, reasonCode: 'REWORK_INTENT_PENDING', evidence: [pendingIntent.intentId, pendingIntent.findingId] };
|
|
@@ -175,16 +206,11 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
|
|
|
175
206
|
const stat = fs.lstatSync(path.join(taskDir, name));
|
|
176
207
|
return stat.isFile() && !stat.isSymbolicLink();
|
|
177
208
|
});
|
|
178
|
-
const artifactFamilies =
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
'review-plan': /^review-plan(?:-r\d+)?\.md$/,
|
|
183
|
-
code: /^code(?:-r\d+)?\.md$/,
|
|
184
|
-
'review-code': /^review-code(?:-r\d+)?\.md$/
|
|
209
|
+
const artifactFamilies = ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code'];
|
|
210
|
+
const familyFor = (name) => {
|
|
211
|
+
const family = parseArtifactName(name)?.family;
|
|
212
|
+
return artifactFamilies.find((candidate) => candidate === family) ?? null;
|
|
185
213
|
};
|
|
186
|
-
const familyFor = (name) => Object.keys(artifactFamilies)
|
|
187
|
-
.find((family) => artifactFamilies[family].test(name)) ?? null;
|
|
188
214
|
const activeFiles = files.filter((name) => {
|
|
189
215
|
const family = familyFor(name);
|
|
190
216
|
return !family || !isArtifactInvalidated(invalidation.document, family, name);
|
|
@@ -192,12 +218,46 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
|
|
|
192
218
|
const artifactHashes = {};
|
|
193
219
|
for (const name of activeFiles)
|
|
194
220
|
artifactHashes[name] = sha256File(path.join(taskDir, name));
|
|
195
|
-
const artifacts = Object.fromEntries(
|
|
196
|
-
family, activeFiles.filter((name) =>
|
|
221
|
+
const artifacts = Object.fromEntries(artifactFamilies.map((family) => [
|
|
222
|
+
family, activeFiles.filter((name) => familyFor(name) === family)
|
|
197
223
|
]));
|
|
198
|
-
const staleArtifacts = Object.fromEntries(
|
|
199
|
-
family, files.filter((name) =>
|
|
224
|
+
const staleArtifacts = Object.fromEntries(artifactFamilies.map((family) => [
|
|
225
|
+
family, files.filter((name) => familyFor(name) === family && isArtifactInvalidated(invalidation.document, family, name))
|
|
200
226
|
]));
|
|
227
|
+
const qualification = parseTaskQualification(content);
|
|
228
|
+
if (!qualification.ok)
|
|
229
|
+
return { ok: false, code: 'TASK_CAPABILITY_FACTS_INVALID', message: qualification.message };
|
|
230
|
+
const qualificationStaleArtifacts = [];
|
|
231
|
+
if (qualification.qualification.present) {
|
|
232
|
+
const constraints = new Map(qualification.qualification.constraints.map((row) => [row.constraintId, row.digest]));
|
|
233
|
+
for (const family of artifactFamilies) {
|
|
234
|
+
if (!ARTIFACT_AUDIT_FAMILIES.has(family))
|
|
235
|
+
continue;
|
|
236
|
+
const name = latestArtifact(artifacts[family] ?? []);
|
|
237
|
+
if (!name)
|
|
238
|
+
continue;
|
|
239
|
+
let auditContent;
|
|
240
|
+
try {
|
|
241
|
+
auditContent = fs.readFileSync(path.join(taskDir, name), 'utf8');
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
qualificationStaleArtifacts.push(name);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const audit = parseQualificationAudit(auditContent);
|
|
248
|
+
if (!audit.ok || !audit.audit.present || !audit.audit.snapshot) {
|
|
249
|
+
qualificationStaleArtifacts.push(name);
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
const constraintsChanged = audit.audit.constraintDependencies.some((dependency) => constraints.get(dependency.constraintId) !== dependency.constraintDigest);
|
|
253
|
+
const taskInputChanged = audit.audit.snapshot.taskInputDigest !== qualification.qualification.taskInputDigest;
|
|
254
|
+
if (audit.audit.snapshot.nonConstraintInputDigest !== qualification.qualification.nonConstraintInputDigest
|
|
255
|
+
|| constraintsChanged
|
|
256
|
+
|| (taskInputChanged && !constraintsChanged)
|
|
257
|
+
|| (taskInputChanged && !qualificationCandidateSnapshotMatches(audit.audit, qualification.qualification)))
|
|
258
|
+
qualificationStaleArtifacts.push(name);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
201
261
|
const reviews = {};
|
|
202
262
|
const reviewedInputs = {};
|
|
203
263
|
for (const family of ['review-analysis', 'review-plan', 'review-code']) {
|
|
@@ -226,7 +286,11 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
|
|
|
226
286
|
taskState, currentStep: String(metadata.current_step ?? ''), artifacts, reviews,
|
|
227
287
|
staleArtifacts, reviewedInputs, artifactHashes,
|
|
228
288
|
invalidation: invalidation.document, reworkIntents: rework.intents,
|
|
229
|
-
unresolvedLedger,
|
|
289
|
+
unresolvedLedger,
|
|
290
|
+
executionBusy: executionBusy || hasOpenLifecycleExecution(content),
|
|
291
|
+
recommendedAction: null,
|
|
292
|
+
qualificationStale: qualificationStaleArtifacts.length > 0,
|
|
293
|
+
qualificationStaleArtifacts
|
|
230
294
|
};
|
|
231
295
|
facts.recommendedAction = recommendNext(facts).action;
|
|
232
296
|
return { ok: true, facts };
|
|
@@ -5,7 +5,12 @@ import { computeLifecycleBuildIdentity, verifyLifecycleBuildIdentity } from '../
|
|
|
5
5
|
import { verifyCodexSandboxControllerContextWithWarnings as verifySandboxControllerWithWarnings } from '../agent-clients/adapters/codex-lifecycle/sandbox-controller.js';
|
|
6
6
|
import { verifyCodexSandboxControllerContextWithWarnings as verifyControllerContextFileWithWarnings } from '../agent-clients/adapters/codex-lifecycle/controller-context.js';
|
|
7
7
|
import { resolveTaskRef } from './resolve-ref.js';
|
|
8
|
-
import { activateMatchingOrchestrationDelegation, hasActivatableOrchestrationDelegation, hasSealableOrchestrationDelegation, OrchestrationStateError, pauseMatchingOrchestrationDelegation, prepareOrchestrationDelegation, reconcileMatchingOrchestrationDelegation, sealMatchingOrchestrationDelegationWithHostEvidence } from './orchestration.js';
|
|
8
|
+
import { activateMatchingOrchestrationDelegation, hasActivatableOrchestrationDelegation, hasSealableOrchestrationDelegation, OrchestrationStateError, pauseMatchingOrchestrationDelegation, prepareOrchestrationDelegation, routeOrchestration, reconcileMatchingOrchestrationDelegation, sealMatchingOrchestrationDelegationWithHostEvidence } from './orchestration.js';
|
|
9
|
+
import { randomUUID, createHash } from 'node:crypto';
|
|
10
|
+
import { consumeLifecycleRecoveryAttestation, issueLifecycleRecoveryAttestation, validateLifecycleRecoveryAttestation } from './control-authority.js';
|
|
11
|
+
function buildIdentityDigest(value) {
|
|
12
|
+
return createHash('sha256').update(JSON.stringify(value), 'utf8').digest('hex');
|
|
13
|
+
}
|
|
9
14
|
function coreOptions(options) {
|
|
10
15
|
return { ...options.orchestrationOptions, repoRoot: options.repoRoot ?? options.orchestrationOptions?.repoRoot };
|
|
11
16
|
}
|
|
@@ -73,8 +78,9 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
|
|
|
73
78
|
if (!resolved.ok)
|
|
74
79
|
return bridgeFailure(resolved.code, resolved.message);
|
|
75
80
|
const preflight = await (options.preflight ?? preflightCodexLifecycleEvidence)(repoRoot);
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
const capabilityRef = input.capabilityRef;
|
|
82
|
+
if (!capabilityRef) {
|
|
83
|
+
return bridgeFailure('ORCHESTRATION_CODEX_CAPABILITY_REQUIRED', 'Codex prepare requires a current-session capability reference');
|
|
78
84
|
}
|
|
79
85
|
const buildIdentity = options.buildIdentity ?? computeLifecycleBuildIdentity(repoRoot);
|
|
80
86
|
const brokerController = options.controllerBinding ?? brokerControllerBinding();
|
|
@@ -99,7 +105,7 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
|
|
|
99
105
|
controlGeneration: localController.controlGeneration
|
|
100
106
|
} : null);
|
|
101
107
|
const capabilityStore = options.capabilityStore ?? createCodexCapabilityStore();
|
|
102
|
-
const attested = capabilityStore.
|
|
108
|
+
const attested = capabilityStore.inspectReference(capabilityRef);
|
|
103
109
|
const capabilityIdentity = verifyLifecycleBuildIdentity(attested.buildIdentity, buildIdentity);
|
|
104
110
|
if (!capabilityIdentity.ok) {
|
|
105
111
|
return bridgeFailure(capabilityIdentity.code, capabilityIdentity.message);
|
|
@@ -124,14 +130,57 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
|
|
|
124
130
|
controlGeneration: controller.controlGeneration
|
|
125
131
|
} } : {})
|
|
126
132
|
};
|
|
133
|
+
if (input.lifecycleRecoveryAttestation) {
|
|
134
|
+
try {
|
|
135
|
+
validateLifecycleRecoveryAttestation(input.lifecycleRecoveryAttestation);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
return bridgeFailure('LIFECYCLE_AUTHORITY_ATTESTATION_INVALID', error instanceof Error ? error.message : String(error));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
let lifecycleRecoveryAttestation = input.lifecycleRecoveryAttestation ?? null;
|
|
142
|
+
const routed = input.capabilityRef && !lifecycleRecoveryAttestation
|
|
143
|
+
? routeOrchestration(taskRef, coreOptions(options))
|
|
144
|
+
: null;
|
|
145
|
+
if (routed && !routed.next)
|
|
146
|
+
return routed;
|
|
147
|
+
if (routed?.next && ['analysis', 'plan', 'code'].includes(routed.next.stage)) {
|
|
148
|
+
const recoveryRequest = {
|
|
149
|
+
version: 1,
|
|
150
|
+
requestId: randomUUID(),
|
|
151
|
+
operationId: randomUUID(),
|
|
152
|
+
phase: 'orchestration.prepare',
|
|
153
|
+
taskId: resolved.taskId,
|
|
154
|
+
family: routed.next.stage === 'analysis' ? 'analysis'
|
|
155
|
+
: routed.next.stage === 'plan' ? 'plan' : 'code',
|
|
156
|
+
artifact: routed.next.artifact,
|
|
157
|
+
round: routed.next.round,
|
|
158
|
+
lifecycleRequestId: randomUUID(),
|
|
159
|
+
authorityRef: capabilityRef,
|
|
160
|
+
expectedControlGeneration: controller?.controlGeneration ?? '',
|
|
161
|
+
expectedControllerInstanceDigest: controller?.instanceDigest ?? '0'.repeat(64),
|
|
162
|
+
expectedBuildIdentityDigest: buildIdentityDigest(buildIdentity),
|
|
163
|
+
expectedHookDefinitionHash: preflight.hookDefinitionHash
|
|
164
|
+
};
|
|
165
|
+
const authority = issueLifecycleRecoveryAttestation(recoveryRequest, {
|
|
166
|
+
capabilityStore,
|
|
167
|
+
...(controller ? { controllerBinding: controller } : {}),
|
|
168
|
+
buildIdentity
|
|
169
|
+
});
|
|
170
|
+
if (authority.status === 'rejected' || !authority.attestation) {
|
|
171
|
+
return bridgeFailure(authority.error?.code ?? 'LIFECYCLE_AUTHORITY_REJECTED', authority.error?.message ?? 'lifecycle authority was rejected');
|
|
172
|
+
}
|
|
173
|
+
lifecycleRecoveryAttestation = authority.attestation;
|
|
174
|
+
}
|
|
127
175
|
const prepared = prepareOrchestrationDelegation(taskRef, {
|
|
128
176
|
...input,
|
|
129
|
-
lifecycleProvenance
|
|
177
|
+
lifecycleProvenance,
|
|
178
|
+
lifecycleRecoveryAttestation
|
|
130
179
|
}, {
|
|
131
180
|
...coreOptions(options),
|
|
132
181
|
validateLifecycleCapability: () => {
|
|
133
182
|
try {
|
|
134
|
-
const validated = capabilityStore.
|
|
183
|
+
const validated = capabilityStore.validateReference(capabilityRef, capabilityExpected);
|
|
135
184
|
if (validated.sessionId !== attested.sessionId
|
|
136
185
|
|| validated.turnId !== attested.turnId
|
|
137
186
|
|| validated.toolUseId !== attested.toolUseId) {
|
|
@@ -146,24 +195,16 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
|
|
|
146
195
|
return capabilityFailure(error);
|
|
147
196
|
}
|
|
148
197
|
},
|
|
149
|
-
consumeLifecycleCapability: () =>
|
|
150
|
-
try {
|
|
151
|
-
const consumed = capabilityStore.consume(input.capabilityToken, capabilityExpected);
|
|
152
|
-
if (consumed.sessionId !== attested.sessionId
|
|
153
|
-
|| consumed.turnId !== attested.turnId
|
|
154
|
-
|| consumed.toolUseId !== attested.toolUseId) {
|
|
155
|
-
return {
|
|
156
|
-
code: 'CODEX_CAPABILITY_IDENTITY_CHANGED',
|
|
157
|
-
message: 'capability identity changed during consumption'
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
return capabilityFailure(error);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
198
|
+
consumeLifecycleCapability: () => null
|
|
166
199
|
});
|
|
200
|
+
if (lifecycleRecoveryAttestation && !options.deferLifecycleRecoveryConsumption && prepared.status !== 'failed') {
|
|
201
|
+
try {
|
|
202
|
+
consumeLifecycleRecoveryAttestation(lifecycleRecoveryAttestation);
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
return bridgeFailure(error instanceof Error ? error.name : 'LIFECYCLE_AUTHORITY_CONSUME_FAILED', error instanceof Error ? error.message : String(error));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
167
208
|
return identityWarnings.length > 0 && prepared.status !== 'failed'
|
|
168
209
|
? { ...prepared, warnings: Object.freeze(identityWarnings) }
|
|
169
210
|
: prepared;
|
|
@@ -211,7 +252,12 @@ async function activateCodexOrchestrationDelegation(childThreadId, options = {})
|
|
|
211
252
|
const contextVerification = contextPath
|
|
212
253
|
? verifySandboxControllerWithWarnings(contextPath, { repoRoot })
|
|
213
254
|
: null;
|
|
214
|
-
const controller =
|
|
255
|
+
const controller = options.controllerBinding
|
|
256
|
+
?? brokerControllerBinding()
|
|
257
|
+
?? (contextVerification?.context ? {
|
|
258
|
+
instanceDigest: contextVerification.context.controllerInstanceDigest,
|
|
259
|
+
controlGeneration: contextVerification.context.controlGeneration
|
|
260
|
+
} : null);
|
|
215
261
|
const activated = activateMatchingOrchestrationDelegation('codex', {
|
|
216
262
|
nativeAgent: evidence.nativeAgent,
|
|
217
263
|
childId: evidence.childThreadId,
|
|
@@ -233,7 +279,7 @@ async function activateCodexOrchestrationDelegation(childThreadId, options = {})
|
|
|
233
279
|
capabilityTurnId: evidence.parentTurnId,
|
|
234
280
|
spawnToolUseId: evidence.spawnToolUseId,
|
|
235
281
|
spawnObservedAt: record.spawnObservedAt ?? undefined,
|
|
236
|
-
controllerInstanceDigest: controller?.
|
|
282
|
+
controllerInstanceDigest: controller?.instanceDigest ?? null,
|
|
237
283
|
controlGeneration: controller?.controlGeneration ?? null
|
|
238
284
|
}
|
|
239
285
|
}, coreOptions(options));
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
function gitText(repoRoot, args) {
|
|
3
|
+
return execFileSync('git', [...args], {
|
|
4
|
+
cwd: repoRoot,
|
|
5
|
+
encoding: 'utf8',
|
|
6
|
+
stdio: ['ignore', 'pipe', 'pipe']
|
|
7
|
+
}).trim();
|
|
8
|
+
}
|
|
9
|
+
function checkpointCommitMatches(repoRoot, intent, head) {
|
|
10
|
+
try {
|
|
11
|
+
const parent = gitText(repoRoot, ['rev-parse', `${head}^`]);
|
|
12
|
+
const tree = gitText(repoRoot, ['rev-parse', `${head}^{tree}`]);
|
|
13
|
+
const message = gitText(repoRoot, ['show', '-s', '--format=%s', head]);
|
|
14
|
+
const changed = gitText(repoRoot, ['diff-tree', '--no-commit-id', '--name-only', '-r', head])
|
|
15
|
+
.split('\n')
|
|
16
|
+
.filter(Boolean)
|
|
17
|
+
.sort();
|
|
18
|
+
return parent === intent.expectedHead
|
|
19
|
+
&& tree === intent.expectedTree
|
|
20
|
+
&& message === intent.message
|
|
21
|
+
&& JSON.stringify(changed) === JSON.stringify([...intent.paths].sort());
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export { checkpointCommitMatches };
|
|
28
|
+
//# sourceMappingURL=commit-identity.js.map
|
|
@@ -2,6 +2,7 @@ import fs from 'node:fs';
|
|
|
2
2
|
import { execFileSync } from 'node:child_process';
|
|
3
3
|
import { commitExplicitPaths, inspectGitWorkflow, pushGitRefs } from '../git/workflow.js';
|
|
4
4
|
import { parseTaskFrontmatter } from './frontmatter.js';
|
|
5
|
+
import { checkpointCommitMatches } from './commit-identity.js';
|
|
5
6
|
import { resolveTaskContext, resolveTaskRef } from './resolve-ref.js';
|
|
6
7
|
import { commitPushDecision } from './commit-policy.js';
|
|
7
8
|
import { mergeOperationWarnings } from './operation-outcome.js';
|
|
@@ -163,21 +164,6 @@ function syncTaskCommit(input, task, committedHead) {
|
|
|
163
164
|
return warning('TASK_STATUS_SYNC_FAILED', error instanceof Error ? error.message : String(error), true, 'task', task.taskId, 'ACTION_REQUIRED');
|
|
164
165
|
}
|
|
165
166
|
}
|
|
166
|
-
function checkpointChildMatches(task, intent, head) {
|
|
167
|
-
try {
|
|
168
|
-
const parent = gitText(task.repoRoot, ['rev-parse', `${head}^`]);
|
|
169
|
-
const tree = gitText(task.repoRoot, ['rev-parse', `${head}^{tree}`]);
|
|
170
|
-
const message = gitText(task.repoRoot, ['show', '-s', '--format=%s', head]);
|
|
171
|
-
const changed = gitText(task.repoRoot, ['diff-tree', '--no-commit-id', '--name-only', '-r', head]).split('\n').filter(Boolean).sort();
|
|
172
|
-
return parent === intent.expectedHead
|
|
173
|
-
&& tree === intent.expectedTree
|
|
174
|
-
&& message === intent.message
|
|
175
|
-
&& JSON.stringify(changed) === JSON.stringify([...intent.paths].sort());
|
|
176
|
-
}
|
|
177
|
-
catch {
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
167
|
function checkpointIdentity(input, task, delivery) {
|
|
182
168
|
if (delivery.mode !== 'local')
|
|
183
169
|
throw new Error('checkpoint identity requires local delivery');
|
|
@@ -256,7 +242,7 @@ function executeUnlocked(input, task, mode) {
|
|
|
256
242
|
operations: [{ name: 'commit', status: 'no-op' }], error: null
|
|
257
243
|
};
|
|
258
244
|
}
|
|
259
|
-
if (inspected.snapshot.head !== identity.expectedHead && !
|
|
245
|
+
if (inspected.snapshot.head !== identity.expectedHead && !checkpointCommitMatches(task.repoRoot, pendingIntent, inspected.snapshot.head))
|
|
260
246
|
return {
|
|
261
247
|
status: 'failed', changed: false, snapshot: inspected.snapshot, operations: [],
|
|
262
248
|
error: { code: 'COMMIT_INTENT_HEAD_CONFLICT', message: 'Current HEAD does not match the pending checkpoint intent' }
|