@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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export const PUBLIC_CLI_COMMAND_ALIASES = Object.freeze({
|
|
2
|
+
'': 'help',
|
|
3
|
+
s: 'sandbox',
|
|
4
|
+
t: 'task',
|
|
5
|
+
'--version': 'version',
|
|
6
|
+
'-v': 'version'
|
|
7
|
+
} as const);
|
|
8
|
+
|
|
9
|
+
export const PUBLIC_CLI_SELECTOR_ALIASES = Object.freeze({
|
|
10
|
+
task: Object.freeze({ d: 'decisions' })
|
|
11
|
+
} as const);
|
|
12
|
+
|
|
13
|
+
export const PUBLIC_CLI_ROUTE_SELECTORS = Object.freeze({
|
|
14
|
+
'agent-client': ['list', 'status', 'enable', 'disable', 'configure'],
|
|
15
|
+
cp: ['cp'],
|
|
16
|
+
data: ['capture', 'verify', 'audit', 'repair', 'export'],
|
|
17
|
+
decide: ['decide'],
|
|
18
|
+
help: ['help'],
|
|
19
|
+
init: ['init'],
|
|
20
|
+
merge: ['merge'],
|
|
21
|
+
run: ['create-task', 'task-skill', 'recreate'],
|
|
22
|
+
sandbox: ['create', 'exec', 'ls', 'show', 'prune', 'rebuild', 'refresh', 'rm', 'start', 'vm'],
|
|
23
|
+
server: ['start', 'stop', 'status', 'logs', '__daemon'],
|
|
24
|
+
task: ['cat', 'decisions', 'files', 'grep', 'issue-body', 'log', 'ls', 'show', 'status'],
|
|
25
|
+
sync: ['sync'],
|
|
26
|
+
update: ['update'],
|
|
27
|
+
version: ['version']
|
|
28
|
+
} as const);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The selector definitions consumed by every internal handler. Keep this
|
|
32
|
+
* module free of handler imports so the pre-import task-view guard remains
|
|
33
|
+
* effective.
|
|
34
|
+
*/
|
|
35
|
+
export const INTERNAL_HANDLER_ROUTE_SELECTORS = Object.freeze({
|
|
36
|
+
'task-create': ['input'],
|
|
37
|
+
'task-qualification': ['proposal', 'confirm', 'supersede', 'revoke'],
|
|
38
|
+
'sandbox-control': ['serve', 'execute', 'recover', 'client'],
|
|
39
|
+
'agent-client': ['next-steps', 'model-selection'],
|
|
40
|
+
'codex-lifecycle': ['preflight', 'capability-arm', 'hook-event', 'resolve-start', 'resolve-stop', 'consume'],
|
|
41
|
+
'codex-sandbox-controller': ['verify-context', 'run'],
|
|
42
|
+
'git-workflow': ['inspect', 'preview-tree', 'snapshot', 'compare-trees', 'commit', 'push-rebased'],
|
|
43
|
+
'task-delivery': ['deliver'],
|
|
44
|
+
'release-workflow': ['inspect', 'prepare', 'publish', 'post-prepare', 'post-publish'],
|
|
45
|
+
'platform-release-notes': ['context', 'stage', 'publish'],
|
|
46
|
+
'platform-security': ['read', 'dismiss'],
|
|
47
|
+
'platform-metadata': ['init-labels', 'init-milestones'],
|
|
48
|
+
'platform-context': ['resolve'],
|
|
49
|
+
'platform-comment': ['list', 'owner', 'backfill', 'sync'],
|
|
50
|
+
'platform-issue': ['inspect', 'create', 'bind', 'sync'],
|
|
51
|
+
'platform-pr': ['inspect', 'summary-context', 'resolve-external', 'create', 'bind', 'skip', 'sync', 'change-report', 'summary-sync', 'sync-in-labels'],
|
|
52
|
+
'platform-pr-review': ['inspect', 'list', 'publish-pr', 'publish-task'],
|
|
53
|
+
'pr-review-grade': ['decide', 'resolve-host', 'verify-artifact'],
|
|
54
|
+
'platform-checks': ['inspect', 'watch', 'resolve-run', 'logs'],
|
|
55
|
+
'task-context': ['resolve'],
|
|
56
|
+
'task-ledger': ['decision-next-id', 'stage-status', 'finding-upsert', 'finding-respond', 'finding-review', 'decision-upsert', 'rework-intent-upsert'],
|
|
57
|
+
'task-warning': ['list', 'add', 'set-status'],
|
|
58
|
+
'task-activity': ['pr-review-inspect', 'pr-review-start', 'pr-review-complete', 'pr-review-terminate'],
|
|
59
|
+
'task-artifact': ['inspect', 'init', 'repair', 'finalize-local'],
|
|
60
|
+
'task-orchestration': ['status', 'progress'],
|
|
61
|
+
'task-review': ['finalize-summary'],
|
|
62
|
+
'task-event': ['event'],
|
|
63
|
+
'task-invalidation': ['reconcile'],
|
|
64
|
+
'task-override': ['diagnose', 'issue', 'consume'],
|
|
65
|
+
'task-lifecycle': ['intent'],
|
|
66
|
+
'task-finalization': ['complete'],
|
|
67
|
+
'task-short-id': ['list', 'list-verify', 'alloc', 'release', 'resolve'],
|
|
68
|
+
'task-snapshot': ['snapshot'],
|
|
69
|
+
'task-verify': ['event'],
|
|
70
|
+
'task-validate': ['snapshot', 'inplace']
|
|
71
|
+
} as const);
|
|
72
|
+
|
|
73
|
+
export const INTERNAL_CLI_ROUTE_SELECTORS = INTERNAL_HANDLER_ROUTE_SELECTORS;
|
|
74
|
+
|
|
75
|
+
function first(args: readonly string[]): string {
|
|
76
|
+
return args[0] ?? '';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function optionValue(args: readonly string[], name: string): string | undefined {
|
|
80
|
+
const index = args.indexOf(name);
|
|
81
|
+
if (index >= 0) return args[index + 1];
|
|
82
|
+
const prefix = `${name}=`;
|
|
83
|
+
return args.find((arg) => arg.startsWith(prefix))?.slice(prefix.length);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function internalRouteSelector(command: string, args: readonly string[]): string {
|
|
87
|
+
if (command === 'sandbox-control') return first(args);
|
|
88
|
+
if (command === 'task-create') return 'input';
|
|
89
|
+
if (command === 'task-qualification') return args[1] ?? '';
|
|
90
|
+
if (command === 'task-lifecycle') return args[1] ? 'intent' : '';
|
|
91
|
+
if (command === 'task-finalization') return args[1] === 'complete' ? 'complete' : '';
|
|
92
|
+
if (command === 'task-event') return args[1] ? 'event' : '';
|
|
93
|
+
if (command === 'task-verify') return args[0] && args[1] ? 'event' : '';
|
|
94
|
+
if (command === 'task-snapshot') return 'snapshot';
|
|
95
|
+
if (command === 'task-validate') return optionValue(args, '--scope') ?? 'snapshot';
|
|
96
|
+
if (command === 'task-short-id') return first(args) === 'list' && args.includes('--verify') ? 'list-verify' : first(args);
|
|
97
|
+
if (command === 'task-orchestration') return args[1] === 'status' ? 'status' : args[1] ? 'progress' : '';
|
|
98
|
+
if (command === 'task-review') return args[1] ?? '';
|
|
99
|
+
if (command === 'task-invalidation') return args[1] ?? '';
|
|
100
|
+
if (command === 'task-override') return args[1] ?? '';
|
|
101
|
+
if (command === 'task-artifact') return args[1] ?? '';
|
|
102
|
+
if (command === 'platform-pr-review' && first(args) === 'publish') {
|
|
103
|
+
const scope = optionValue(args, '--scope') ?? '';
|
|
104
|
+
return /^TASK-\d{8}-\d{6}$/u.test(scope) ? 'publish-task' : /^pr\d+$/u.test(scope) ? 'publish-pr' : '';
|
|
105
|
+
}
|
|
106
|
+
if (['task-ledger', 'task-warning', 'task-activity'].includes(command)) return args[1] ?? '';
|
|
107
|
+
if (command === 'task-delivery') return args[1] ?? '';
|
|
108
|
+
if (command === 'task-context') return first(args);
|
|
109
|
+
return first(args);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function isInternalHandlerRoute(command: string, args: readonly string[]): boolean {
|
|
113
|
+
if (args[0] === '--help' || args[0] === '-h') return true;
|
|
114
|
+
const selector = internalRouteSelector(command, args);
|
|
115
|
+
const selectors = INTERNAL_HANDLER_ROUTE_SELECTORS[command as keyof typeof INTERNAL_HANDLER_ROUTE_SELECTORS];
|
|
116
|
+
return Boolean(selector && selectors?.some((candidate) => candidate === selector));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Marks a selector at the handler's actual dispatch branch.
|
|
121
|
+
*
|
|
122
|
+
* The call is intentionally side-effect free so the top-level task-view guard
|
|
123
|
+
* can still run before a handler module is imported. Route coverage tests read
|
|
124
|
+
* these branch markers independently from the pre-import inventory.
|
|
125
|
+
*/
|
|
126
|
+
export function internalHandlerRoute(command: string, selector: string, actualSelector: string): boolean {
|
|
127
|
+
return command.length > 0 && selector === actualSelector;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function ensureInternalHandlerRoute(command: string, args: readonly string[]): boolean {
|
|
131
|
+
if (isInternalHandlerRoute(command, args)) return true;
|
|
132
|
+
const selector = internalRouteSelector(command, args);
|
|
133
|
+
process.stdout.write(`${JSON.stringify({
|
|
134
|
+
status: 'failed',
|
|
135
|
+
changed: false,
|
|
136
|
+
error: { code: 'INTERNAL_ROUTE_UNREGISTERED', message: `operation '${command} ${selector || first(args)}' is not registered` }
|
|
137
|
+
})}\n`);
|
|
138
|
+
process.exitCode = 1;
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
sealCodexOrchestrationDelegation,
|
|
23
23
|
sealCodexParentDelegation
|
|
24
24
|
} from '../task/codex-orchestration.ts';
|
|
25
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
25
26
|
|
|
26
27
|
const USAGE = 'Usage: agent-infra-internal codex-lifecycle <capability-arm|hook-event|resolve-start|resolve-stop|preflight|consume> [options]\n';
|
|
27
28
|
const MANAGED_AGENT = /^agent-infra-lifecycle-(executor|reviewer)$/;
|
|
@@ -162,10 +163,11 @@ function payloadText(payload: unknown, key: string): string {
|
|
|
162
163
|
}
|
|
163
164
|
|
|
164
165
|
async function codexLifecycle(args: string[] = []): Promise<void> {
|
|
166
|
+
if (!ensureInternalHandlerRoute('codex-lifecycle', args)) return;
|
|
165
167
|
const parsed = parse(args);
|
|
166
168
|
if (!parsed || process.exitCode) return;
|
|
167
169
|
try {
|
|
168
|
-
if (
|
|
170
|
+
if (internalHandlerRoute('codex-lifecycle', 'preflight', parsed.operation)) {
|
|
169
171
|
const format = parsed.values['--format'] ?? 'json';
|
|
170
172
|
if (!['text', 'json'].includes(format)) throw new Error("format must be 'text' or 'json'");
|
|
171
173
|
const runtimeFields = [
|
|
@@ -188,7 +190,7 @@ async function codexLifecycle(args: string[] = []): Promise<void> {
|
|
|
188
190
|
return;
|
|
189
191
|
}
|
|
190
192
|
|
|
191
|
-
if (
|
|
193
|
+
if (internalHandlerRoute('codex-lifecycle', 'capability-arm', parsed.operation)) {
|
|
192
194
|
const taskId = parsed.values['--task-id'];
|
|
193
195
|
if (!taskId) throw new Error('capability-arm requires --task-id');
|
|
194
196
|
const resolved = resolveTaskRef(taskId, { repoRoot: process.cwd() });
|
|
@@ -211,7 +213,7 @@ async function codexLifecycle(args: string[] = []): Promise<void> {
|
|
|
211
213
|
}
|
|
212
214
|
|
|
213
215
|
const store = createCodexLifecycleStore({ cliVersion: cliVersion() });
|
|
214
|
-
if (
|
|
216
|
+
if (internalHandlerRoute('codex-lifecycle', 'hook-event', parsed.operation)) {
|
|
215
217
|
const phase = parsed.values['--event'];
|
|
216
218
|
if (!phase || !['pre-tool', 'subagent-start', 'post-tool', 'subagent-stop'].includes(phase)) {
|
|
217
219
|
throw new Error('hook-event requires a known --event');
|
|
@@ -348,7 +350,7 @@ async function codexLifecycle(args: string[] = []): Promise<void> {
|
|
|
348
350
|
|
|
349
351
|
const childThreadId = parsed.values['--child-id'];
|
|
350
352
|
if (!childThreadId) throw new Error(`operation '${parsed.operation}' requires --child-id`);
|
|
351
|
-
if (
|
|
353
|
+
if (internalHandlerRoute('codex-lifecycle', 'resolve-start', parsed.operation)) {
|
|
352
354
|
if (store.read(childThreadId).state.spawn?.hookDefinitionHash !== hookDefinitionHash()) {
|
|
353
355
|
throw new Error('Codex lifecycle hook definition hash is stale');
|
|
354
356
|
}
|
|
@@ -360,7 +362,7 @@ async function codexLifecycle(args: string[] = []): Promise<void> {
|
|
|
360
362
|
if (latest.state.status !== 'start-ready') process.exitCode = 1;
|
|
361
363
|
return;
|
|
362
364
|
}
|
|
363
|
-
if (
|
|
365
|
+
if (internalHandlerRoute('codex-lifecycle', 'resolve-stop', parsed.operation)) {
|
|
364
366
|
const stopTurnId = store.read(childThreadId).state.stop?.turnId;
|
|
365
367
|
if (!stopTurnId) throw new Error('Codex lifecycle stop hook is not available');
|
|
366
368
|
const terminal = await resolveCodexTerminal(childThreadId, stopTurnId);
|
|
@@ -371,7 +373,7 @@ async function codexLifecycle(args: string[] = []): Promise<void> {
|
|
|
371
373
|
output({ status: latest.state.status, changed: true, evidence: latest.state.stopEvidence, diagnostics: [], error: latest.state.error });
|
|
372
374
|
return;
|
|
373
375
|
}
|
|
374
|
-
if (
|
|
376
|
+
if (internalHandlerRoute('codex-lifecycle', 'consume', parsed.operation)) {
|
|
375
377
|
const consumer = parsed.values['--consumer'];
|
|
376
378
|
if (!consumer) throw new Error('consume requires --consumer');
|
|
377
379
|
const consumed = store.consume(childThreadId, consumer, hookDefinitionHash());
|
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
runCodexSandboxController,
|
|
3
3
|
verifyCodexSandboxControllerContextWithWarnings
|
|
4
4
|
} from '../agent-clients/adapters/codex-lifecycle/sandbox-controller.ts';
|
|
5
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
5
6
|
|
|
6
7
|
const USAGE = 'Usage: agent-infra-internal codex-sandbox-controller <run|verify-context> [options]\n';
|
|
7
8
|
|
|
@@ -20,7 +21,10 @@ function parse(args: string[]): Readonly<{ operation: string; values: Readonly<R
|
|
|
20
21
|
return null;
|
|
21
22
|
}
|
|
22
23
|
const operation = args[0];
|
|
23
|
-
if (!operation || ![
|
|
24
|
+
if (!operation || ![
|
|
25
|
+
internalHandlerRoute('codex-sandbox-controller', 'run', operation),
|
|
26
|
+
internalHandlerRoute('codex-sandbox-controller', 'verify-context', operation)
|
|
27
|
+
].some(Boolean)) {
|
|
24
28
|
process.stderr.write(USAGE);
|
|
25
29
|
fail('CODEX_SANDBOX_CONTROLLER_PAYLOAD_INVALID', 'operation must be run or verify-context', 2);
|
|
26
30
|
return null;
|
|
@@ -51,10 +55,11 @@ function parse(args: string[]): Readonly<{ operation: string; values: Readonly<R
|
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
async function codexSandboxController(args: string[] = []): Promise<void> {
|
|
58
|
+
if (!ensureInternalHandlerRoute('codex-sandbox-controller', args)) return;
|
|
54
59
|
const parsed = parse(args);
|
|
55
60
|
if (!parsed || process.exitCode) return;
|
|
56
61
|
try {
|
|
57
|
-
if (
|
|
62
|
+
if (internalHandlerRoute('codex-sandbox-controller', 'verify-context', parsed.operation)) {
|
|
58
63
|
const contextPath = parsed.values['--context']
|
|
59
64
|
?? process.env.AGENT_INFRA_CODEX_CONTROLLER_CONTEXT;
|
|
60
65
|
if (!contextPath) throw new Error('CODEX_SANDBOX_CONTROLLER_CONTEXT_MISSING');
|
|
@@ -3,40 +3,43 @@ import { inspectGitWorkflow, previewCommitTree, pushRebasedBranch } from '../git
|
|
|
3
3
|
import { compareReviewTrees, snapshotReview } from '../git/review-snapshot.ts';
|
|
4
4
|
import { resolvePostReviewGlobs } from '../task/review-fingerprint.ts';
|
|
5
5
|
import { executeCommitOperation } from '../task/commit-operation.ts';
|
|
6
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
6
7
|
|
|
7
8
|
function output(value: unknown): void { process.stdout.write(`${JSON.stringify(value)}\n`); }
|
|
8
9
|
|
|
9
10
|
function gitWorkflow(args: string[] = []): void {
|
|
11
|
+
if (!ensureInternalHandlerRoute('git-workflow', args)) return;
|
|
10
12
|
const [action, ...rest] = args;
|
|
11
13
|
const cwdIndex = rest.indexOf('--cwd');
|
|
12
14
|
const cwd = cwdIndex >= 0 ? rest[cwdIndex + 1] : process.cwd();
|
|
13
15
|
let result;
|
|
14
|
-
if (action
|
|
16
|
+
if (internalHandlerRoute('git-workflow', 'inspect', action ?? '')) {
|
|
15
17
|
const inputIndex = rest.indexOf('--input');
|
|
16
18
|
const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1]!, 'utf8')) as { remote?: string; refs?: string[] } : null;
|
|
17
19
|
result = inspectGitWorkflow(cwd ?? process.cwd(), undefined, input?.remote && input.refs ? { remote: input.remote, refs: input.refs } : undefined);
|
|
18
20
|
}
|
|
19
|
-
else if (action
|
|
21
|
+
else if (internalHandlerRoute('git-workflow', 'commit', action ?? '')) {
|
|
20
22
|
const inputIndex = rest.indexOf('--input');
|
|
21
23
|
const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1]!, 'utf8')) : null;
|
|
22
24
|
result = input
|
|
23
25
|
? executeCommitOperation({ cwd: cwd ?? process.cwd(), ...input })
|
|
24
26
|
: { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
|
|
25
|
-
} else if (
|
|
27
|
+
} else if (internalHandlerRoute('git-workflow', 'push-rebased', action ?? '')) {
|
|
26
28
|
const inputIndex = rest.indexOf('--input');
|
|
27
29
|
const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1]!, 'utf8')) : null;
|
|
28
30
|
result = input ? pushRebasedBranch({ cwd: cwd ?? process.cwd(), ...input }) : { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
|
|
29
|
-
} else if (
|
|
31
|
+
} else if (internalHandlerRoute('git-workflow', 'preview-tree', action ?? '')) {
|
|
30
32
|
const inputIndex = rest.indexOf('--input');
|
|
31
33
|
const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1]!, 'utf8')) : null;
|
|
32
34
|
result = input
|
|
33
35
|
? previewCommitTree({ cwd: cwd ?? process.cwd(), paths: input.paths, expectedHead: input.expectedHead })
|
|
34
36
|
: { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
|
|
35
|
-
} else if (
|
|
37
|
+
} else if (internalHandlerRoute('git-workflow', 'snapshot', action ?? '')
|
|
38
|
+
|| internalHandlerRoute('git-workflow', 'compare-trees', action ?? '')) {
|
|
36
39
|
const inputIndex = rest.indexOf('--input');
|
|
37
40
|
const input = inputIndex >= 0 && rest[inputIndex + 1] ? JSON.parse(fs.readFileSync(rest[inputIndex + 1]!, 'utf8')) : null;
|
|
38
41
|
if (!input) result = { status: 'failed', changed: false, error: { code: 'GIT_INPUT_REQUIRED', message: '--input JSON file is required' } };
|
|
39
|
-
else if (action
|
|
42
|
+
else if (internalHandlerRoute('git-workflow', 'snapshot', action ?? '')) result = { status: 'no-op', changed: false, snapshot: snapshotReview({ cwd: cwd ?? process.cwd(), mode: input.mode, baseline: input.baseline, diffBase: input.diffBase, globs: input.globs ?? resolvePostReviewGlobs({}, {}) }), error: null };
|
|
40
43
|
else result = { status: 'no-op', changed: false, comparison: compareReviewTrees({ cwd: cwd ?? process.cwd(), expected: input.expected, actual: input.actual }), error: null };
|
|
41
44
|
} else result = { status: 'failed', changed: false, error: { code: 'GIT_ACTION_INVALID', message: `Unknown git-workflow action '${action ?? ''}'` } };
|
|
42
45
|
output(result);
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
watchPullRequestReadiness
|
|
8
8
|
} from '../platform/pr-checks.ts';
|
|
9
9
|
import type { ChecksResult } from '../platform/pr-checks.ts';
|
|
10
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
10
11
|
|
|
11
12
|
const USAGE = `Usage: agent-infra-internal platform-checks inspect <task-ref> [--cwd <path>]
|
|
12
13
|
agent-infra-internal platform-checks watch <task-ref> --interval-seconds <N> --deadline-seconds <N> [--cwd <path>]
|
|
@@ -53,9 +54,15 @@ function positive(value: string | undefined): number | null {
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
async function platformChecks(args: string[] = []): Promise<void> {
|
|
57
|
+
if (!ensureInternalHandlerRoute('platform-checks', args)) return;
|
|
56
58
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
57
59
|
const operation = args[0];
|
|
58
|
-
if (!operation || ![
|
|
60
|
+
if (!operation || ![
|
|
61
|
+
internalHandlerRoute('platform-checks', 'inspect', operation),
|
|
62
|
+
internalHandlerRoute('platform-checks', 'watch', operation),
|
|
63
|
+
internalHandlerRoute('platform-checks', 'resolve-run', operation),
|
|
64
|
+
internalHandlerRoute('platform-checks', 'logs', operation)
|
|
65
|
+
].some(Boolean)) { fail('a valid operation is required'); return; }
|
|
59
66
|
const taskRef = args[1];
|
|
60
67
|
if (!taskRef || taskRef.startsWith('--')) { fail(`${operation} requires a task ref`); return; }
|
|
61
68
|
const parsed = parse(args, 2);
|
|
@@ -70,19 +77,20 @@ async function platformChecks(args: string[] = []): Promise<void> {
|
|
|
70
77
|
};
|
|
71
78
|
const unexpected = Object.keys(values).find((name) => !allowed[operation]!.includes(name));
|
|
72
79
|
if (unexpected) { fail(`${operation} does not accept --${unexpected}`); return; }
|
|
73
|
-
if (
|
|
74
|
-
if (
|
|
80
|
+
if (internalHandlerRoute('platform-checks', 'inspect', operation)) { finish(await inspectPullRequestReadiness(taskRef, { cwd })); return; }
|
|
81
|
+
if (internalHandlerRoute('platform-checks', 'resolve-run', operation)) {
|
|
75
82
|
if (!values.checkName) { fail('resolve-run requires --check-name'); return; }
|
|
76
|
-
finish(resolvePlatformCheckRun(taskRef, { cwd, checkName: values.checkName, detailsUrl: values.detailsUrl }));
|
|
83
|
+
finish(await resolvePlatformCheckRun(taskRef, { cwd, checkName: values.checkName, detailsUrl: values.detailsUrl }));
|
|
77
84
|
return;
|
|
78
85
|
}
|
|
79
|
-
if (
|
|
86
|
+
if (internalHandlerRoute('platform-checks', 'logs', operation)) {
|
|
80
87
|
const run = positive(values.run);
|
|
81
88
|
const job = values.job === undefined ? undefined : positive(values.job);
|
|
82
89
|
if (!run || values.job !== undefined && !job) { fail('logs requires a positive --run and optional positive --job'); return; }
|
|
83
|
-
finish(fetchPlatformCheckLogs(taskRef, { cwd, run, job: job || undefined }));
|
|
90
|
+
finish(await fetchPlatformCheckLogs(taskRef, { cwd, run, job: job || undefined }));
|
|
84
91
|
return;
|
|
85
92
|
}
|
|
93
|
+
if (!internalHandlerRoute('platform-checks', 'watch', operation)) { fail('operation is not registered'); return; }
|
|
86
94
|
const intervalSeconds = positive(values.intervalSeconds);
|
|
87
95
|
const deadlineSeconds = positive(values.deadlineSeconds);
|
|
88
96
|
if (!intervalSeconds || !deadlineSeconds) { fail('watch requires positive --interval-seconds and --deadline-seconds'); return; }
|
|
@@ -10,8 +10,9 @@ import {
|
|
|
10
10
|
import type { CommentKind } from '../platform/issue-comments.ts';
|
|
11
11
|
import type { PlatformResult } from '../platform/types.ts';
|
|
12
12
|
import { backfillCompletionComments } from '../platform/completion-backfill.ts';
|
|
13
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
13
14
|
|
|
14
|
-
const USAGE = `Usage: agent-infra-internal platform-comment list --issue <
|
|
15
|
+
const USAGE = `Usage: agent-infra-internal platform-comment list --issue <token> [--cwd <path>]
|
|
15
16
|
agent-infra-internal platform-comment owner <task-ref> [--cwd <path>]
|
|
16
17
|
agent-infra-internal platform-comment backfill <task-ref> --agent <agent> [--cwd <path>]
|
|
17
18
|
agent-infra-internal platform-comment sync <task-ref> --kind <kind> --agent <agent> [--artifact <file>] [--body-file <path|->] [--status-label <label>] [--backfill] [--cwd <path>]
|
|
@@ -52,40 +53,47 @@ function readBodyFile(value: string, cwd: string): string {
|
|
|
52
53
|
return fs.readFileSync(path.resolve(cwd, value), 'utf8');
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
function platformComment(args: string[] = []): void {
|
|
56
|
+
async function platformComment(args: string[] = []): Promise<void> {
|
|
57
|
+
if (!ensureInternalHandlerRoute('platform-comment', args)) return;
|
|
56
58
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
57
59
|
const operation = args[0];
|
|
58
|
-
if (!operation || ![
|
|
60
|
+
if (!operation || ![
|
|
61
|
+
internalHandlerRoute('platform-comment', 'list', operation),
|
|
62
|
+
internalHandlerRoute('platform-comment', 'owner', operation),
|
|
63
|
+
internalHandlerRoute('platform-comment', 'backfill', operation),
|
|
64
|
+
internalHandlerRoute('platform-comment', 'sync', operation)
|
|
65
|
+
].some(Boolean)) { fail('a valid operation is required'); return; }
|
|
59
66
|
const hasTaskRef = operation !== 'list';
|
|
60
67
|
const taskRef = hasTaskRef ? args[1] : undefined;
|
|
61
68
|
if (hasTaskRef && (!taskRef || taskRef.startsWith('--'))) { fail(`${operation} requires a task ref`); return; }
|
|
62
69
|
const parsed = parseFlags(args, hasTaskRef ? 2 : 1);
|
|
63
70
|
if (parsed.error) { fail(parsed.error); return; }
|
|
64
71
|
const cwd = path.resolve(typeof parsed.values.cwd === 'string' ? parsed.values.cwd : process.cwd());
|
|
65
|
-
if (
|
|
66
|
-
const issue =
|
|
67
|
-
if (
|
|
72
|
+
if (internalHandlerRoute('platform-comment', 'list', operation)) {
|
|
73
|
+
const issue = parsed.values.issue;
|
|
74
|
+
if (typeof issue !== 'string' || !issue) { fail('list requires --issue <token>'); return; }
|
|
68
75
|
const unexpected = Object.keys(parsed.values).find((key) => !['issue', 'cwd'].includes(key));
|
|
69
76
|
if (unexpected) { fail(`list does not accept '--${unexpected}'`); return; }
|
|
70
|
-
finish(listPlatformComments(issue, cwd));
|
|
77
|
+
finish(await listPlatformComments(issue, cwd));
|
|
71
78
|
return;
|
|
72
79
|
}
|
|
73
|
-
if (
|
|
80
|
+
if (internalHandlerRoute('platform-comment', 'owner', operation)) {
|
|
74
81
|
const unexpected = Object.keys(parsed.values).find((key) => key !== 'cwd');
|
|
75
82
|
if (unexpected) { fail(`owner does not accept '--${unexpected}'`); return; }
|
|
76
|
-
finish(checkPlatformCommentOwner(taskRef!, { cwd }));
|
|
83
|
+
finish(await checkPlatformCommentOwner(taskRef!, { cwd }));
|
|
77
84
|
return;
|
|
78
85
|
}
|
|
79
|
-
if (
|
|
86
|
+
if (internalHandlerRoute('platform-comment', 'backfill', operation)) {
|
|
80
87
|
const unexpected = Object.keys(parsed.values).find((key) => !['cwd', 'agent'].includes(key));
|
|
81
88
|
if (unexpected) { fail(`backfill does not accept '--${unexpected}'`); return; }
|
|
82
89
|
const agent = parsed.values.agent;
|
|
83
90
|
if (typeof agent !== 'string' || !agent) { fail('backfill requires --agent'); return; }
|
|
84
91
|
const normalizedAgent = normalizeAgentToken(agent);
|
|
85
92
|
if (!normalizedAgent) { fail(`invalid --agent '${agent}': ${AGENT_USAGE_HINT}`); return; }
|
|
86
|
-
finish(backfillCompletionComments(taskRef!, { cwd, agent: normalizedAgent }));
|
|
93
|
+
finish(await backfillCompletionComments(taskRef!, { cwd, agent: normalizedAgent }));
|
|
87
94
|
return;
|
|
88
95
|
}
|
|
96
|
+
if (!internalHandlerRoute('platform-comment', 'sync', operation)) { fail('operation is not registered'); return; }
|
|
89
97
|
const kind = parsed.values.kind;
|
|
90
98
|
const agent = parsed.values.agent;
|
|
91
99
|
if (!['task', 'artifact', 'summary', 'cancel'].includes(String(kind))) { fail('sync requires a valid --kind'); return; }
|
|
@@ -101,7 +109,7 @@ function platformComment(args: string[] = []): void {
|
|
|
101
109
|
fail(`unable to read body file: ${error instanceof Error ? error.message : String(error)}`);
|
|
102
110
|
return;
|
|
103
111
|
}
|
|
104
|
-
finish(syncPlatformComment(taskRef!, {
|
|
112
|
+
finish(await syncPlatformComment(taskRef!, {
|
|
105
113
|
kind: kind as CommentKind,
|
|
106
114
|
agent: normalizedAgent,
|
|
107
115
|
artifact: typeof parsed.values.artifact === 'string' ? parsed.values.artifact : undefined,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
|
|
3
3
|
import { resolvePlatformContext } from '../platform/context.ts';
|
|
4
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
4
5
|
|
|
5
6
|
const USAGE = 'Usage: agent-infra-internal platform-context resolve [--cwd <path>]\n';
|
|
6
7
|
|
|
@@ -10,9 +11,10 @@ function fail(message: string): void {
|
|
|
10
11
|
process.exitCode = 1;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
function platformContext(args: string[] = []): void {
|
|
14
|
+
async function platformContext(args: string[] = []): Promise<void> {
|
|
15
|
+
if (!ensureInternalHandlerRoute('platform-context', args)) return;
|
|
14
16
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
15
|
-
if (args[0]
|
|
17
|
+
if (!internalHandlerRoute('platform-context', 'resolve', args[0] ?? '')) { fail("operation must be 'resolve'"); return; }
|
|
16
18
|
let cwd = process.cwd();
|
|
17
19
|
const seen = new Set<string>();
|
|
18
20
|
for (let index = 1; index < args.length; index += 1) {
|
|
@@ -24,7 +26,7 @@ function platformContext(args: string[] = []): void {
|
|
|
24
26
|
seen.add(flag);
|
|
25
27
|
cwd = path.resolve(value);
|
|
26
28
|
}
|
|
27
|
-
const result = resolvePlatformContext({ cwd });
|
|
29
|
+
const result = await resolvePlatformContext({ cwd });
|
|
28
30
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
29
31
|
if (result.status === 'failed') process.exitCode = 1;
|
|
30
32
|
if (result.status === 'blocked') process.exitCode = 2;
|
|
@@ -8,10 +8,11 @@ import {
|
|
|
8
8
|
syncPlatformIssue
|
|
9
9
|
} from '../platform/issues.ts';
|
|
10
10
|
import type { IssueResult } from '../platform/issues.ts';
|
|
11
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
11
12
|
|
|
12
13
|
const USAGE = `Usage: agent-infra-internal platform-issue inspect <task-ref> [--cwd <path>]
|
|
13
14
|
agent-infra-internal platform-issue create <task-ref> --agent <agent> [--dry-run] [--cwd <path>]
|
|
14
|
-
agent-infra-internal platform-issue bind <task-ref> --issue <
|
|
15
|
+
agent-infra-internal platform-issue bind <task-ref> --issue <token> --agent <agent> [--dry-run] [--cwd <path>]
|
|
15
16
|
agent-infra-internal platform-issue sync <task-ref> --agent <agent> [--status <suffix|none>] [--assignees current|none] [--milestone initial|specific|none] [--issue-type] [--fields] [--requirements] [--in-labels from-diff|none] [--base <branch>] [--state open|closed] [--close-reason completed|not_planned] [--dry-run] [--cwd <path>]
|
|
16
17
|
`;
|
|
17
18
|
|
|
@@ -59,10 +60,16 @@ function oneOf(values: Record<string, string | boolean>, name: string, allowed:
|
|
|
59
60
|
return value;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
function platformIssue(args: string[] = []): void {
|
|
63
|
+
async function platformIssue(args: string[] = []): Promise<void> {
|
|
64
|
+
if (!ensureInternalHandlerRoute('platform-issue', args)) return;
|
|
63
65
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
64
66
|
const operation = args[0];
|
|
65
|
-
if (!operation || ![
|
|
67
|
+
if (!operation || ![
|
|
68
|
+
internalHandlerRoute('platform-issue', 'inspect', operation),
|
|
69
|
+
internalHandlerRoute('platform-issue', 'create', operation),
|
|
70
|
+
internalHandlerRoute('platform-issue', 'bind', operation),
|
|
71
|
+
internalHandlerRoute('platform-issue', 'sync', operation)
|
|
72
|
+
].some(Boolean)) { fail('a valid operation is required'); return; }
|
|
66
73
|
const taskRef = args[1];
|
|
67
74
|
if (!taskRef || taskRef.startsWith('--')) { fail(`${operation} requires a task ref`); return; }
|
|
68
75
|
const parsed = parse(args, 2);
|
|
@@ -75,18 +82,17 @@ function platformIssue(args: string[] = []): void {
|
|
|
75
82
|
};
|
|
76
83
|
const unexpected = Object.keys(values).find((name) => !allowed[operation]!.includes(name));
|
|
77
84
|
if (unexpected) { fail(`${operation} does not accept --${unexpected}`); return; }
|
|
78
|
-
if (
|
|
85
|
+
if (internalHandlerRoute('platform-issue', 'inspect', operation)) { finish(await inspectPlatformIssue(taskRef, { cwd })); return; }
|
|
79
86
|
if (typeof values.agent !== 'string' || !values.agent) { fail(`${operation} requires --agent`); return; }
|
|
80
87
|
const agent = normalizeAgentToken(values.agent);
|
|
81
88
|
if (!agent) { fail(`invalid --agent '${values.agent}': ${AGENT_USAGE_HINT}`); return; }
|
|
82
89
|
values.agent = agent;
|
|
83
|
-
if (
|
|
84
|
-
finish(createPlatformIssue(taskRef, { cwd, agent: values.agent, dryRun: values.dryRun === true })); return;
|
|
90
|
+
if (internalHandlerRoute('platform-issue', 'create', operation)) {
|
|
91
|
+
finish(await createPlatformIssue(taskRef, { cwd, agent: values.agent, dryRun: values.dryRun === true })); return;
|
|
85
92
|
}
|
|
86
|
-
if (
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
finish(bindPlatformIssue(taskRef, { cwd, agent: values.agent, issue, dryRun: values.dryRun === true })); return;
|
|
93
|
+
if (internalHandlerRoute('platform-issue', 'bind', operation)) {
|
|
94
|
+
if (typeof values.issue !== 'string' || !values.issue) { fail('bind requires --issue <token>'); return; }
|
|
95
|
+
finish(await bindPlatformIssue(taskRef, { cwd, agent: values.agent, issue: values.issue, dryRun: values.dryRun === true })); return;
|
|
90
96
|
}
|
|
91
97
|
try {
|
|
92
98
|
const assignees = oneOf(values, 'assignees', ['current', 'none']);
|
|
@@ -99,7 +105,7 @@ function platformIssue(args: string[] = []): void {
|
|
|
99
105
|
if (closeReason && state !== 'closed') throw new Error('--close-reason requires --state closed');
|
|
100
106
|
const desiredKeys = ['status', 'assignees', 'milestone', 'issueType', 'fields', 'requirements', 'inLabels', 'state'];
|
|
101
107
|
if (!desiredKeys.some((name) => values[name] !== undefined)) throw new Error('sync requires at least one desired-state option');
|
|
102
|
-
finish(syncPlatformIssue(taskRef, {
|
|
108
|
+
finish(await syncPlatformIssue(taskRef, {
|
|
103
109
|
cwd, agent: values.agent, dryRun: values.dryRun === true,
|
|
104
110
|
status: typeof values.status === 'string' ? values.status : undefined,
|
|
105
111
|
assignees: assignees as 'current' | 'none' | undefined,
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
|
|
3
|
+
import { initializeLabels, initializeMilestones } from '../platform/repository-metadata.ts';
|
|
4
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
5
|
+
|
|
6
|
+
const USAGE = `Usage: agent-infra-internal platform-metadata init-labels [--cleanup-stale-in] [--cwd <path>]
|
|
7
|
+
agent-infra-internal platform-metadata init-milestones [--history] [--cwd <path>]
|
|
8
|
+
`;
|
|
9
|
+
|
|
10
|
+
function fail(message: string): void {
|
|
11
|
+
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'METADATA_INPUT_INVALID', message, retryable: false } })}\n`);
|
|
12
|
+
process.stderr.write(USAGE);
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function finish(result: { status: string; [key: string]: unknown }, preserveMilestoneFallback = false): void {
|
|
17
|
+
if (preserveMilestoneFallback && result.error && typeof result.error === 'object'
|
|
18
|
+
&& (result.error as { code?: string }).code === 'PLATFORM_CAPABILITY_UNSUPPORTED') {
|
|
19
|
+
process.stderr.write('Milestone initialization skipped for unsupported platform.\n');
|
|
20
|
+
process.exitCode = 0;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
24
|
+
process.exitCode = result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function parseOptions(args: string[]): { cwd: string; cleanup: boolean; history: boolean } | null {
|
|
28
|
+
let cwd = process.cwd();
|
|
29
|
+
let cleanup = false;
|
|
30
|
+
let history = false;
|
|
31
|
+
const seen = new Set<string>();
|
|
32
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
33
|
+
const flag = args[index]!;
|
|
34
|
+
if (seen.has(flag)) return null;
|
|
35
|
+
seen.add(flag);
|
|
36
|
+
if (flag === '--cleanup-stale-in') { cleanup = true; continue; }
|
|
37
|
+
if (flag === '--history') { history = true; continue; }
|
|
38
|
+
if (flag === '--cwd') {
|
|
39
|
+
const value = args[++index];
|
|
40
|
+
if (!value || value.startsWith('--')) return null;
|
|
41
|
+
cwd = path.resolve(value);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return { cwd: path.resolve(cwd), cleanup, history };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function platformMetadata(args: string[] = []): Promise<void> {
|
|
50
|
+
if (!ensureInternalHandlerRoute('platform-metadata', args)) return;
|
|
51
|
+
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
52
|
+
const action = args[0];
|
|
53
|
+
if (!internalHandlerRoute('platform-metadata', 'init-labels', action ?? '')
|
|
54
|
+
&& !internalHandlerRoute('platform-metadata', 'init-milestones', action ?? '')) {
|
|
55
|
+
fail('a valid operation is required');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (action !== 'init-labels' && action !== 'init-milestones') { fail('a valid operation is required'); return; }
|
|
59
|
+
const parsed = parseOptions(args.slice(1));
|
|
60
|
+
if (!parsed) { fail('invalid metadata options'); return; }
|
|
61
|
+
if (action === 'init-labels' && parsed.history) { fail('init-labels does not accept --history'); return; }
|
|
62
|
+
if (action === 'init-milestones' && parsed.cleanup) { fail('init-milestones does not accept --cleanup-stale-in'); return; }
|
|
63
|
+
if (action === 'init-labels') {
|
|
64
|
+
finish(await initializeLabels({ cleanupStaleIn: parsed.cleanup }, { cwd: parsed.cwd }));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
finish(await initializeMilestones({ history: parsed.history }, { cwd: parsed.cwd }), true);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { platformMetadata };
|