@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,6 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { publishReleaseNotes, releaseNoteContext, stageReleaseNotes } from '../platform/release-notes.js';
|
|
4
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
4
5
|
function parseOptions(args, valueFlags, switchFlags = []) {
|
|
5
6
|
const values = new Map();
|
|
6
7
|
const switches = new Set();
|
|
@@ -28,15 +29,17 @@ function finish(result) {
|
|
|
28
29
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
29
30
|
process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
|
|
30
31
|
}
|
|
31
|
-
function platformReleaseNotes(args = []) {
|
|
32
|
+
async function platformReleaseNotes(args = []) {
|
|
33
|
+
if (!ensureInternalHandlerRoute('platform-release-notes', args))
|
|
34
|
+
return;
|
|
32
35
|
const [action, ...rest] = args;
|
|
33
|
-
if (action
|
|
36
|
+
if (internalHandlerRoute('platform-release-notes', 'context', action ?? '')) {
|
|
34
37
|
const parsed = parseOptions(rest, ['--cwd', '--history-limit', '--from-tag', '--to-tag', '--branch']);
|
|
35
38
|
if (!parsed)
|
|
36
39
|
return finish(invalidInput('invalid context options'));
|
|
37
40
|
const cwd = path.resolve(parsed.values.get('--cwd') || process.cwd());
|
|
38
41
|
const historyRaw = parsed.values.get('--history-limit') ?? null;
|
|
39
|
-
finish(releaseNoteContext({
|
|
42
|
+
finish(await releaseNoteContext({
|
|
40
43
|
fromTag: parsed.values.get('--from-tag') || '',
|
|
41
44
|
toTag: parsed.values.get('--to-tag') || '',
|
|
42
45
|
branch: parsed.values.get('--branch') || '',
|
|
@@ -44,7 +47,7 @@ function platformReleaseNotes(args = []) {
|
|
|
44
47
|
}, { cwd }));
|
|
45
48
|
return;
|
|
46
49
|
}
|
|
47
|
-
if (action
|
|
50
|
+
if (internalHandlerRoute('platform-release-notes', 'stage', action ?? '')) {
|
|
48
51
|
const parsed = parseOptions(rest, ['--cwd', '--notes-file']);
|
|
49
52
|
if (!parsed)
|
|
50
53
|
return finish(invalidInput('invalid stage options'));
|
|
@@ -54,7 +57,7 @@ function platformReleaseNotes(args = []) {
|
|
|
54
57
|
finish(stageReleaseNotes({ notesFile }, { cwd: path.resolve(parsed.values.get('--cwd') || process.cwd()) }));
|
|
55
58
|
return;
|
|
56
59
|
}
|
|
57
|
-
if (action
|
|
60
|
+
if (internalHandlerRoute('platform-release-notes', 'publish', action ?? '')) {
|
|
58
61
|
const parsed = parseOptions(rest, ['--cwd', '--notes-file', '--tag', '--title', '--expected-sha256'], ['--dry-run']);
|
|
59
62
|
if (!parsed)
|
|
60
63
|
return finish(invalidInput('invalid publish options'));
|
|
@@ -69,7 +72,7 @@ function platformReleaseNotes(args = []) {
|
|
|
69
72
|
fs.writeFileSync(resolvedNotesPath, fs.readFileSync(0));
|
|
70
73
|
}
|
|
71
74
|
try {
|
|
72
|
-
finish(publishReleaseNotes({
|
|
75
|
+
finish(await publishReleaseNotes({
|
|
73
76
|
tag: parsed.values.get('--tag') || '',
|
|
74
77
|
title: parsed.values.get('--title') || parsed.values.get('--tag') || '',
|
|
75
78
|
notesFile: resolvedNotesPath,
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { dismissSecurityAlert, readCommentFile, readSecurityAlert } from '../platform/security-alerts.js';
|
|
3
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
4
|
+
const USAGE = `Usage: agent-infra-internal platform-security read --kind <dependabot|code-scanning> --number <number> [--cwd <path>]
|
|
5
|
+
agent-infra-internal platform-security dismiss --kind <dependabot|code-scanning> --number <number> --reason <reason> --comment-file <path> [--cwd <path>]
|
|
6
|
+
`;
|
|
7
|
+
function fail(message) {
|
|
8
|
+
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'SECURITY_INPUT_INVALID', message, retryable: false } })}\n`);
|
|
9
|
+
process.stderr.write(USAGE);
|
|
10
|
+
process.exitCode = 1;
|
|
11
|
+
}
|
|
12
|
+
function finish(result) {
|
|
13
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
14
|
+
process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
|
|
15
|
+
}
|
|
16
|
+
function parseOptions(args) {
|
|
17
|
+
const values = new Map();
|
|
18
|
+
const switches = new Set();
|
|
19
|
+
const valueFlags = new Set(['--cwd', '--kind', '--number', '--reason', '--comment-file']);
|
|
20
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
21
|
+
const flag = args[index];
|
|
22
|
+
if (flag === '--help' || flag === '-h')
|
|
23
|
+
return null;
|
|
24
|
+
if (!valueFlags.has(flag) || values.has(flag) || switches.has(flag))
|
|
25
|
+
return null;
|
|
26
|
+
const value = args[++index];
|
|
27
|
+
if (!value || value.startsWith('--'))
|
|
28
|
+
return null;
|
|
29
|
+
values.set(flag, value);
|
|
30
|
+
}
|
|
31
|
+
return { values, switches };
|
|
32
|
+
}
|
|
33
|
+
function required(values, flag) {
|
|
34
|
+
const value = values.get(flag);
|
|
35
|
+
return value && !value.startsWith('--') ? value : null;
|
|
36
|
+
}
|
|
37
|
+
async function platformSecurity(args = []) {
|
|
38
|
+
if (!ensureInternalHandlerRoute('platform-security', args))
|
|
39
|
+
return;
|
|
40
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
41
|
+
process.stdout.write(USAGE);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const action = args[0];
|
|
45
|
+
if (!internalHandlerRoute('platform-security', 'read', action ?? '')
|
|
46
|
+
&& !internalHandlerRoute('platform-security', 'dismiss', action ?? '')) {
|
|
47
|
+
fail('a valid operation is required');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (action !== 'read' && action !== 'dismiss') {
|
|
51
|
+
fail('a valid operation is required');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const parsed = parseOptions(args.slice(1));
|
|
55
|
+
if (!parsed) {
|
|
56
|
+
fail('invalid security alert options');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const kind = required(parsed.values, '--kind');
|
|
60
|
+
const numberRaw = required(parsed.values, '--number');
|
|
61
|
+
const cwd = path.resolve(required(parsed.values, '--cwd') || process.cwd());
|
|
62
|
+
if (!kind || !numberRaw) {
|
|
63
|
+
fail(`${action} requires --kind and --number`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const number = Number(numberRaw);
|
|
67
|
+
if (!Number.isSafeInteger(number) || number <= 0) {
|
|
68
|
+
fail('--number must be a positive integer');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (action === 'read') {
|
|
72
|
+
if ([...parsed.values.keys()].some((flag) => !['--kind', '--number', '--cwd'].includes(flag))) {
|
|
73
|
+
fail('read does not accept dismissal options');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
finish(await readSecurityAlert({ kind: kind, number }, { cwd }));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const reason = required(parsed.values, '--reason');
|
|
80
|
+
const commentFile = required(parsed.values, '--comment-file');
|
|
81
|
+
if (!reason || !commentFile) {
|
|
82
|
+
fail('dismiss requires --reason and --comment-file');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const comment = readCommentFile(commentFile, cwd);
|
|
86
|
+
if (!comment.ok) {
|
|
87
|
+
finish({ status: 'failed', changed: false, error: comment.error });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
finish(await dismissSecurityAlert({ kind: kind, number, reason, comment: comment.value }, { cwd }));
|
|
91
|
+
}
|
|
92
|
+
export { platformSecurity };
|
|
93
|
+
//# sourceMappingURL=platform-security.js.map
|
|
@@ -3,8 +3,9 @@ import path from 'node:path';
|
|
|
3
3
|
import { collectHostCandidates, decide, deriveTaskIssueMatches, extractClosingIssueNumbers, resolveHostFromCandidates } from '../pr-review/evidence-grading.js';
|
|
4
4
|
import { inspectPlatformPullRequestByNumber } from '../platform/pull-requests.js';
|
|
5
5
|
import { verifyInProcess } from '../task/verification-engine.js';
|
|
6
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
6
7
|
const USAGE = `Usage: agent-infra-internal pr-review-grade decide --input-file <path|-> [--cwd <path>]
|
|
7
|
-
agent-infra-internal pr-review-grade resolve-host --pr <
|
|
8
|
+
agent-infra-internal pr-review-grade resolve-host --pr <token> [--cwd <path>]
|
|
8
9
|
agent-infra-internal pr-review-grade verify-artifact --artifact-file <path> [--cwd <path>]
|
|
9
10
|
`;
|
|
10
11
|
function fail(message) {
|
|
@@ -38,13 +39,19 @@ function parseFlags(args, start) {
|
|
|
38
39
|
function readInput(value, cwd) {
|
|
39
40
|
return value === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(cwd, value), 'utf8');
|
|
40
41
|
}
|
|
41
|
-
function prReviewGrade(args = []) {
|
|
42
|
+
async function prReviewGrade(args = []) {
|
|
43
|
+
if (!ensureInternalHandlerRoute('pr-review-grade', args))
|
|
44
|
+
return;
|
|
42
45
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
43
46
|
process.stdout.write(USAGE);
|
|
44
47
|
return;
|
|
45
48
|
}
|
|
46
49
|
const operation = args[0];
|
|
47
|
-
if (!operation || ![
|
|
50
|
+
if (!operation || ![
|
|
51
|
+
internalHandlerRoute('pr-review-grade', 'decide', operation),
|
|
52
|
+
internalHandlerRoute('pr-review-grade', 'resolve-host', operation),
|
|
53
|
+
internalHandlerRoute('pr-review-grade', 'verify-artifact', operation)
|
|
54
|
+
].some(Boolean)) {
|
|
48
55
|
fail('a valid operation is required');
|
|
49
56
|
return;
|
|
50
57
|
}
|
|
@@ -65,7 +72,7 @@ function prReviewGrade(args = []) {
|
|
|
65
72
|
fail(`${operation} does not accept '--${unexpected}'`);
|
|
66
73
|
return;
|
|
67
74
|
}
|
|
68
|
-
if (
|
|
75
|
+
if (internalHandlerRoute('pr-review-grade', 'decide', operation)) {
|
|
69
76
|
if (typeof values.inputFile !== 'string') {
|
|
70
77
|
fail('decide requires --input-file');
|
|
71
78
|
return;
|
|
@@ -88,13 +95,13 @@ function prReviewGrade(args = []) {
|
|
|
88
95
|
}
|
|
89
96
|
return;
|
|
90
97
|
}
|
|
91
|
-
if (
|
|
92
|
-
const pr =
|
|
93
|
-
if (!
|
|
94
|
-
fail('resolve-host requires
|
|
98
|
+
if (internalHandlerRoute('pr-review-grade', 'resolve-host', operation)) {
|
|
99
|
+
const pr = typeof values.pr === 'string' ? values.pr : '';
|
|
100
|
+
if (!pr) {
|
|
101
|
+
fail('resolve-host requires --pr <token>');
|
|
95
102
|
return;
|
|
96
103
|
}
|
|
97
|
-
const inspected = inspectPlatformPullRequestByNumber(pr, { cwd });
|
|
104
|
+
const inspected = await inspectPlatformPullRequestByNumber(pr, { cwd });
|
|
98
105
|
if (!inspected.pullRequest) {
|
|
99
106
|
finish({
|
|
100
107
|
status: 'failed', changed: false, host: null, candidates: [], closingIssues: [],
|
|
@@ -102,17 +109,23 @@ function prReviewGrade(args = []) {
|
|
|
102
109
|
}, inspected.status === 'blocked' ? 2 : 1);
|
|
103
110
|
return;
|
|
104
111
|
}
|
|
112
|
+
const prNumber = inspected.pullRequest.number;
|
|
113
|
+
const prIdentity = inspected.pullRequest.identity || { kind: 'number', value: prNumber };
|
|
105
114
|
const closingIssues = extractClosingIssueNumbers(inspected.pullRequest.body);
|
|
106
|
-
const candidates = collectHostCandidates({ prNumber
|
|
115
|
+
const candidates = collectHostCandidates({ prNumber, prIdentity, closingIssues, workspaceRoot: cwd });
|
|
107
116
|
const host = resolveHostFromCandidates(candidates);
|
|
108
117
|
finish({
|
|
109
118
|
status: 'ok', changed: false,
|
|
110
|
-
pr: { number:
|
|
119
|
+
pr: { number: prNumber, identity: prIdentity, baseSha: inspected.pullRequest.base.sha, headSha: inspected.pullRequest.head.sha, state: inspected.pullRequest.state },
|
|
111
120
|
closingIssues, candidates, host,
|
|
112
121
|
taskIssueMatches: deriveTaskIssueMatches(host, closingIssues), error: null
|
|
113
122
|
});
|
|
114
123
|
return;
|
|
115
124
|
}
|
|
125
|
+
if (!internalHandlerRoute('pr-review-grade', 'verify-artifact', operation)) {
|
|
126
|
+
fail('operation is not registered');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
116
129
|
if (typeof values.artifactFile !== 'string') {
|
|
117
130
|
fail('verify-artifact requires --artifact-file');
|
|
118
131
|
return;
|
|
@@ -120,7 +133,7 @@ function prReviewGrade(args = []) {
|
|
|
120
133
|
const artifactPath = path.resolve(cwd, values.artifactFile);
|
|
121
134
|
let result;
|
|
122
135
|
try {
|
|
123
|
-
result = verifyInProcess({
|
|
136
|
+
result = await verifyInProcess({
|
|
124
137
|
mode: 'checks',
|
|
125
138
|
skillName: 'review-pr',
|
|
126
139
|
taskDir: path.dirname(artifactPath),
|
|
@@ -7,6 +7,7 @@ import { commitExplicitPaths, inspectGitWorkflow, pushGitRefs } from '../git/wor
|
|
|
7
7
|
import { inspectPlatformRelease, reconcileReleaseMilestones } from '../platform/releases.js';
|
|
8
8
|
import { inspectHomebrewChannel, inspectNpmChannel } from '../release/channels.js';
|
|
9
9
|
import { releaseSnapshot } from '../release/workflow.js';
|
|
10
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
10
11
|
function command(cwd, executable, args) {
|
|
11
12
|
return spawnSync(executable, args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
12
13
|
}
|
|
@@ -236,7 +237,7 @@ async function inspectFacts(cwd, version) {
|
|
|
236
237
|
const local = inspectLocalReleaseFacts(cwd, version);
|
|
237
238
|
const remoteBranch = branch ? git(cwd, ['ls-remote', '--heads', 'origin', branch]) : null;
|
|
238
239
|
const remoteTag = git(cwd, ['ls-remote', '--tags', 'origin', `refs/tags/${tag}`]);
|
|
239
|
-
const platform = inspectPlatformRelease(tag, { cwd });
|
|
240
|
+
const platform = await inspectPlatformRelease(tag, { cwd });
|
|
240
241
|
const npm = await inspectNpmChannel(pkg.name, version);
|
|
241
242
|
const formulaUrl = `https://raw.githubusercontent.com/${config.org}/homebrew-tap/main/Formula/${config.project}.rb`;
|
|
242
243
|
const homebrew = await inspectHomebrewChannel(formulaUrl, version);
|
|
@@ -247,7 +248,7 @@ async function inspectFacts(cwd, version) {
|
|
|
247
248
|
localTagAncestor: local.localTagAncestor,
|
|
248
249
|
localTagConflict: local.localTagConflict,
|
|
249
250
|
remoteBranch: Boolean(remoteBranch && remoteBranch.split(/\s+/)[0] === head), remoteTag: Boolean(remoteTag),
|
|
250
|
-
githubRelease: platform.
|
|
251
|
+
githubRelease: platform.error?.code === 'PLATFORM_CAPABILITY_UNSUPPORTED'
|
|
251
252
|
? true
|
|
252
253
|
: platform.status === 'blocked' ? null : Boolean(platform.release?.published),
|
|
253
254
|
npm: npm.published, homebrew: homebrew.published, smoke,
|
|
@@ -295,13 +296,21 @@ async function releaseWorkflow(args = []) {
|
|
|
295
296
|
const version = String(rawVersion || '').replace(/^v/, '');
|
|
296
297
|
const cwdIndex = rest.indexOf('--cwd');
|
|
297
298
|
const cwd = path.resolve(cwdIndex >= 0 && rest[cwdIndex + 1] ? rest[cwdIndex + 1] : process.cwd());
|
|
298
|
-
if (![
|
|
299
|
+
if (![
|
|
300
|
+
internalHandlerRoute('release-workflow', 'inspect', action || ''),
|
|
301
|
+
internalHandlerRoute('release-workflow', 'prepare', action || ''),
|
|
302
|
+
internalHandlerRoute('release-workflow', 'publish', action || ''),
|
|
303
|
+
internalHandlerRoute('release-workflow', 'post-prepare', action || ''),
|
|
304
|
+
internalHandlerRoute('release-workflow', 'post-publish', action || '')
|
|
305
|
+
].some(Boolean) || !semver.valid(version)) {
|
|
299
306
|
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'RELEASE_INPUT_INVALID', message: 'Usage: release-workflow inspect|prepare|publish|post-prepare|post-publish <version>' } })}\n`);
|
|
300
307
|
process.exitCode = 1;
|
|
301
308
|
return;
|
|
302
309
|
}
|
|
310
|
+
if (!ensureInternalHandlerRoute('release-workflow', args))
|
|
311
|
+
return;
|
|
303
312
|
const before = releaseSnapshot(version, await inspectFacts(cwd, version));
|
|
304
|
-
if (action
|
|
313
|
+
if (internalHandlerRoute('release-workflow', 'inspect', action || '')) {
|
|
305
314
|
process.stdout.write(`${JSON.stringify({ status: 'no-op', changed: false, snapshot: before, error: null })}\n`);
|
|
306
315
|
return;
|
|
307
316
|
}
|
|
@@ -310,9 +319,9 @@ async function releaseWorkflow(args = []) {
|
|
|
310
319
|
process.exitCode = 1;
|
|
311
320
|
return;
|
|
312
321
|
}
|
|
313
|
-
if (action
|
|
322
|
+
if (internalHandlerRoute('release-workflow', 'prepare', action || '')) {
|
|
314
323
|
if (before.phase !== 'unprepared') {
|
|
315
|
-
const milestones = reconcileReleaseMilestones(version, { cwd });
|
|
324
|
+
const milestones = await reconcileReleaseMilestones(version, { cwd });
|
|
316
325
|
process.stdout.write(`${JSON.stringify({ ...milestones, snapshot: before })}\n`);
|
|
317
326
|
process.exitCode = milestones.status === 'failed' ? 1 : milestones.status === 'blocked' ? 2 : 0;
|
|
318
327
|
return;
|
|
@@ -354,7 +363,7 @@ async function releaseWorkflow(args = []) {
|
|
|
354
363
|
return;
|
|
355
364
|
}
|
|
356
365
|
const tagged = command(cwd, 'git', ['tag', '-a', `v${version}`, '-m', `Release v${version}`]);
|
|
357
|
-
const milestones = tagged.status === 0 ? reconcileReleaseMilestones(version, { cwd }) : null;
|
|
366
|
+
const milestones = tagged.status === 0 ? await reconcileReleaseMilestones(version, { cwd }) : null;
|
|
358
367
|
const snapshot = releaseSnapshot(version, await inspectFacts(cwd, version));
|
|
359
368
|
const failed = tagged.status !== 0 || milestones?.status === 'failed';
|
|
360
369
|
const blocked = milestones?.status === 'blocked';
|
|
@@ -363,7 +372,7 @@ async function releaseWorkflow(args = []) {
|
|
|
363
372
|
process.exitCode = failed ? 1 : blocked ? 2 : 0;
|
|
364
373
|
return;
|
|
365
374
|
}
|
|
366
|
-
if (action
|
|
375
|
+
if (internalHandlerRoute('release-workflow', 'publish', action || '')) {
|
|
367
376
|
if (!before.facts.localTag || !['prepared', 'partially-published'].includes(before.phase)) {
|
|
368
377
|
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, snapshot: before, error: { code: 'RELEASE_PHASE_INVALID', message: `Cannot publish from ${before.phase}` } })}\n`);
|
|
369
378
|
process.exitCode = 1;
|
|
@@ -376,7 +385,7 @@ async function releaseWorkflow(args = []) {
|
|
|
376
385
|
process.exitCode = result.status === 'failed' ? 1 : result.status === 'degraded' ? 2 : 0;
|
|
377
386
|
return;
|
|
378
387
|
}
|
|
379
|
-
if (
|
|
388
|
+
if (internalHandlerRoute('release-workflow', 'post-publish', action || '')) {
|
|
380
389
|
const expectedValues = optionValues(rest, '--expected-sha256');
|
|
381
390
|
if (expectedValues.length !== 1 || !/^sha256:[0-9a-f]{64}$/.test(expectedValues[0])) {
|
|
382
391
|
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, snapshot: before, error: { code: 'RELEASE_INPUT_INVALID', message: 'post-publish requires one --expected-sha256 sha256:<64 hex>' } })}\n`);
|
|
@@ -415,6 +424,11 @@ async function releaseWorkflow(args = []) {
|
|
|
415
424
|
process.exitCode = blocked ? 2 : 1;
|
|
416
425
|
return;
|
|
417
426
|
}
|
|
427
|
+
if (!internalHandlerRoute('release-workflow', 'post-prepare', action || '')) {
|
|
428
|
+
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, snapshot: before, error: { code: 'RELEASE_INPUT_INVALID', message: 'release-workflow action is not registered' } })}\n`);
|
|
429
|
+
process.exitCode = 1;
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
418
432
|
if (before.phase === 'complete') {
|
|
419
433
|
process.stdout.write(`${JSON.stringify({ status: 'no-op', changed: false, snapshot: before, error: null })}\n`);
|
|
420
434
|
return;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { requestSandboxControl, requestSandboxTaskFinalization, requestSandboxTaskControl, SandboxControlClientError } from '../sandbox/control/client.js';
|
|
1
|
+
import { recoverSandboxControl, requestSandboxControl, requestSandboxTaskFinalization, requestSandboxTaskControl, SandboxControlClientError } from '../sandbox/control/client.js';
|
|
2
2
|
import { normalizeAgentToken, AGENT_USAGE_HINT } from '../agent-clients/tokens.js';
|
|
3
3
|
import { serveSandboxControl } from '../sandbox/control/server.js';
|
|
4
4
|
import { runSandboxControlExecutor } from '../sandbox/control/executor.js';
|
|
5
5
|
import { controllerProofFromContext, verifyCodexSandboxControllerContextWithWarnings } from '../agent-clients/adapters/codex-lifecycle/sandbox-controller.js';
|
|
6
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
7
|
+
import { parseTaskCreateResult, taskCreateExitCode } from '../task/create-service.js';
|
|
6
8
|
function isCanonicalCodexPrepare(args) {
|
|
7
9
|
if (args[1] !== 'prepare')
|
|
8
10
|
return false;
|
|
@@ -23,6 +25,24 @@ function finalizationErrorStatus(error) {
|
|
|
23
25
|
return 'unknown';
|
|
24
26
|
return error.retryable ? 'blocked' : 'failed';
|
|
25
27
|
}
|
|
28
|
+
function writeClientError(error) {
|
|
29
|
+
process.stderr.write(`${error.detail.message}\n`);
|
|
30
|
+
if (error.requestId)
|
|
31
|
+
process.stderr.write(`SANDBOX_CONTROL_REQUEST_ID: ${error.requestId}\n`);
|
|
32
|
+
}
|
|
33
|
+
function recoveredExitCode(response) {
|
|
34
|
+
if (response.phase !== 'completed')
|
|
35
|
+
return response.exitCode ?? 1;
|
|
36
|
+
try {
|
|
37
|
+
const result = parseTaskCreateResult(JSON.parse(response.stdout));
|
|
38
|
+
if (result.control?.requestId === response.id)
|
|
39
|
+
return taskCreateExitCode(result);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Other control families use their own result envelopes.
|
|
43
|
+
}
|
|
44
|
+
return response.exitCode ?? 1;
|
|
45
|
+
}
|
|
26
46
|
function sandboxFinalizationClient(args) {
|
|
27
47
|
if (args.length !== 4 || !args[0] || args[1] !== 'complete' || args[2] !== '--agent' || !args[3]) {
|
|
28
48
|
const error = { code: 'TASK_FINALIZATION_PAYLOAD_INVALID', message: 'task ref, complete intent, and --agent are required', retryable: false };
|
|
@@ -46,7 +66,7 @@ function sandboxFinalizationClient(args) {
|
|
|
46
66
|
if (!(error instanceof SandboxControlClientError))
|
|
47
67
|
throw error;
|
|
48
68
|
writeFinalizationEnvelope(finalizationErrorStatus(error.detail), error.accepted, error.detail);
|
|
49
|
-
|
|
69
|
+
writeClientError(error);
|
|
50
70
|
process.exitCode = error.detail.code === 'SANDBOX_CONTROL_RESULT_UNKNOWN' ? 1 : error.detail.retryable ? 2 : 1;
|
|
51
71
|
return;
|
|
52
72
|
}
|
|
@@ -66,8 +86,10 @@ function sandboxFinalizationClient(args) {
|
|
|
66
86
|
process.exitCode = response.exitCode ?? 1;
|
|
67
87
|
}
|
|
68
88
|
async function sandboxControl(args) {
|
|
89
|
+
if (!ensureInternalHandlerRoute('sandbox-control', args))
|
|
90
|
+
return;
|
|
69
91
|
const [operation, ...rest] = args;
|
|
70
|
-
if (operation
|
|
92
|
+
if (internalHandlerRoute('sandbox-control', 'serve', operation ?? '')) {
|
|
71
93
|
const manifestIndex = rest.indexOf('--manifest');
|
|
72
94
|
const manifest = manifestIndex >= 0 ? rest[manifestIndex + 1] : undefined;
|
|
73
95
|
if (!manifest)
|
|
@@ -85,7 +107,7 @@ async function sandboxControl(args) {
|
|
|
85
107
|
}
|
|
86
108
|
return;
|
|
87
109
|
}
|
|
88
|
-
if (operation
|
|
110
|
+
if (internalHandlerRoute('sandbox-control', 'execute', operation ?? '')) {
|
|
89
111
|
const requestIndex = rest.indexOf('--request');
|
|
90
112
|
const nonceIndex = rest.indexOf('--nonce');
|
|
91
113
|
const request = requestIndex >= 0 ? rest[requestIndex + 1] : undefined;
|
|
@@ -95,7 +117,28 @@ async function sandboxControl(args) {
|
|
|
95
117
|
await runSandboxControlExecutor(request, nonce);
|
|
96
118
|
return;
|
|
97
119
|
}
|
|
98
|
-
if (operation
|
|
120
|
+
if (internalHandlerRoute('sandbox-control', 'recover', operation ?? '')) {
|
|
121
|
+
if (rest.length !== 1 || !rest[0])
|
|
122
|
+
throw new Error('sandbox-control recover requires <request-id>');
|
|
123
|
+
let response;
|
|
124
|
+
try {
|
|
125
|
+
response = recoverSandboxControl(rest[0]);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (!(error instanceof SandboxControlClientError))
|
|
129
|
+
throw error;
|
|
130
|
+
writeClientError(error);
|
|
131
|
+
process.exitCode = error.detail.code === 'SANDBOX_CONTROL_RESULT_UNKNOWN' ? 1 : error.detail.retryable ? 75 : 1;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
process.stdout.write(response.stdout);
|
|
135
|
+
process.stderr.write(response.stderr);
|
|
136
|
+
process.exitCode = response.phase === 'rejected'
|
|
137
|
+
? response.error?.retryable ? 75 : 1
|
|
138
|
+
: recoveredExitCode(response);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (internalHandlerRoute('sandbox-control', 'client', operation ?? '')) {
|
|
99
142
|
const [family = '', ...commandArgs] = rest;
|
|
100
143
|
if (family === 'task-finalization') {
|
|
101
144
|
sandboxFinalizationClient(commandArgs);
|
|
@@ -117,7 +160,7 @@ async function sandboxControl(args) {
|
|
|
117
160
|
catch (error) {
|
|
118
161
|
if (!(error instanceof SandboxControlClientError))
|
|
119
162
|
throw error;
|
|
120
|
-
|
|
163
|
+
writeClientError(error);
|
|
121
164
|
process.exitCode = error.detail.retryable ? 75 : 1;
|
|
122
165
|
return;
|
|
123
166
|
}
|
|
@@ -132,7 +175,7 @@ async function sandboxControl(args) {
|
|
|
132
175
|
}
|
|
133
176
|
return;
|
|
134
177
|
}
|
|
135
|
-
throw new Error('Usage: agent-infra-internal sandbox-control serve --manifest <path> | execute --request <path> --nonce <nonce> | client <family> [args...]');
|
|
178
|
+
throw new Error('Usage: agent-infra-internal sandbox-control serve --manifest <path> | execute --request <path> --nonce <nonce> | client <family> [args...] | recover <request-id>');
|
|
136
179
|
}
|
|
137
180
|
export { sandboxControl };
|
|
138
181
|
//# sourceMappingURL=sandbox-control.js.map
|
|
@@ -2,6 +2,7 @@ import { applyPrReviewActivityIntent, inspectPrReviewActivity } from '../task/ac
|
|
|
2
2
|
import { consumeHumanOverride, failureId, overrideDryRunConflict } from '../task/human-override.js';
|
|
3
3
|
import { resolveTaskRef } from '../task/resolve-ref.js';
|
|
4
4
|
import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
|
|
5
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
|
|
5
6
|
const USAGE = `Usage: agent-infra-internal task-activity <task-ref> pr-review-inspect
|
|
6
7
|
agent-infra-internal task-activity <task-ref> pr-review-start --agent <agent> --artifact <canonical.md> --head <40hex> [--dry-run]
|
|
7
8
|
agent-infra-internal task-activity <task-ref> pr-review-complete --agent <agent> --artifact <canonical.md> --head <40hex> --verdict <approved|changes-requested|commented> --blockers <N> --major <N> --minor <N> [--dry-run]
|
|
@@ -32,13 +33,21 @@ function usageFailure(message) {
|
|
|
32
33
|
process.stderr.write(USAGE);
|
|
33
34
|
process.exitCode = 1;
|
|
34
35
|
}
|
|
35
|
-
function taskActivity(args = []) {
|
|
36
|
+
async function taskActivity(args = []) {
|
|
37
|
+
if (!ensureInternalHandlerRoute('task-activity', args))
|
|
38
|
+
return;
|
|
36
39
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
37
40
|
process.stdout.write(USAGE);
|
|
38
41
|
return;
|
|
39
42
|
}
|
|
40
43
|
const [taskRef, kind] = args;
|
|
41
|
-
if (!taskRef || taskRef.startsWith('--') || !kind || !OPERATIONS.has(kind)
|
|
44
|
+
if (!taskRef || taskRef.startsWith('--') || !kind || !OPERATIONS.has(kind)
|
|
45
|
+
|| ![
|
|
46
|
+
internalHandlerRoute('task-activity', 'pr-review-inspect', kind),
|
|
47
|
+
internalHandlerRoute('task-activity', 'pr-review-start', kind),
|
|
48
|
+
internalHandlerRoute('task-activity', 'pr-review-complete', kind),
|
|
49
|
+
internalHandlerRoute('task-activity', 'pr-review-terminate', kind)
|
|
50
|
+
].some(Boolean)) {
|
|
42
51
|
usageFailure('task ref and a supported PR review intent are required');
|
|
43
52
|
return;
|
|
44
53
|
}
|
|
@@ -78,7 +87,7 @@ function taskActivity(args = []) {
|
|
|
78
87
|
usageFailure(`${kind} does not accept '${unexpected}'`);
|
|
79
88
|
return;
|
|
80
89
|
}
|
|
81
|
-
if (
|
|
90
|
+
if (internalHandlerRoute('task-activity', 'pr-review-inspect', kind)) {
|
|
82
91
|
const result = inspectPrReviewActivity(values);
|
|
83
92
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
84
93
|
if (result.status === 'failed')
|
|
@@ -91,9 +100,9 @@ function taskActivity(args = []) {
|
|
|
91
100
|
return;
|
|
92
101
|
}
|
|
93
102
|
}
|
|
94
|
-
const operationRequired =
|
|
103
|
+
const operationRequired = internalHandlerRoute('task-activity', 'pr-review-complete', kind)
|
|
95
104
|
? ['verdict', 'blockers', 'major', 'minor']
|
|
96
|
-
:
|
|
105
|
+
: internalHandlerRoute('task-activity', 'pr-review-terminate', kind) ? ['outcome', 'reason'] : [];
|
|
97
106
|
for (const key of operationRequired) {
|
|
98
107
|
if (values[key] === undefined) {
|
|
99
108
|
usageFailure(`${kind} requires '${key}'`);
|
|
@@ -113,7 +122,7 @@ function taskActivity(args = []) {
|
|
|
113
122
|
let result;
|
|
114
123
|
let humanOverride = null;
|
|
115
124
|
try {
|
|
116
|
-
result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-activity.${kind}`, () => {
|
|
125
|
+
result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-activity.${kind}`, async () => {
|
|
117
126
|
let current = applyPrReviewActivityIntent(values, { lockAlreadyHeld: true });
|
|
118
127
|
if (current.status !== 'failed' || !values.overrideTicket)
|
|
119
128
|
return current;
|
|
@@ -121,7 +130,7 @@ function taskActivity(args = []) {
|
|
|
121
130
|
usageFailure('override ticket requires target and scope');
|
|
122
131
|
return current;
|
|
123
132
|
}
|
|
124
|
-
const consumed = consumeHumanOverride({
|
|
133
|
+
const consumed = await consumeHumanOverride({
|
|
125
134
|
taskRef, ticketId: String(values.overrideTicket),
|
|
126
135
|
failureId: failureId('activity-intent', current.error?.code ?? 'TASK_STATE_MISMATCH'),
|
|
127
136
|
target: String(values.overrideTarget), scope: String(values.overrideScope)
|