@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
|
@@ -12,6 +12,9 @@ import { parseActivityLog, pairEntries, startedBackedRows } from '../activity-lo
|
|
|
12
12
|
import { readRun, type OrchestrationRun } from '../orchestration.ts';
|
|
13
13
|
import type { DelegationReceipt } from '../delegation-receipts.ts';
|
|
14
14
|
import { statusCard, type DisplayMessage } from '../../server/display.ts';
|
|
15
|
+
import { invalidationBlocks, parseInvalidationDocument } from '../invalidation.ts';
|
|
16
|
+
import { parseReworkIntentDocument } from '../rework-intent.ts';
|
|
17
|
+
import { buildLifecycleFacts, recommendNext } from '../capabilities.ts';
|
|
15
18
|
|
|
16
19
|
const USAGE = `Usage: ai task status [--task <ref> | -t <ref>]
|
|
17
20
|
|
|
@@ -381,6 +384,8 @@ type StatusModel = {
|
|
|
381
384
|
workflow: WorkflowInfo;
|
|
382
385
|
runtime: RuntimeInfo;
|
|
383
386
|
orchestration: OrchestrationInfo;
|
|
387
|
+
invalidation?: { status: string; processed: number; total: number; pendingIntents: number };
|
|
388
|
+
recommendation?: string;
|
|
384
389
|
git: GitInfo;
|
|
385
390
|
};
|
|
386
391
|
|
|
@@ -429,6 +434,18 @@ function renderStatus(model: StatusModel): string[] {
|
|
|
429
434
|
lines.push(...renderPairs(model.artifacts.groups.map((group) => [group.stage, group.files.join(', ')])));
|
|
430
435
|
}
|
|
431
436
|
|
|
437
|
+
lines.push(
|
|
438
|
+
'',
|
|
439
|
+
'Invalidation',
|
|
440
|
+
...renderPairs([
|
|
441
|
+
['status', model.invalidation?.status ?? 'unknown'],
|
|
442
|
+
['processed', `${model.invalidation?.processed ?? 0}/${model.invalidation?.total ?? 0}`],
|
|
443
|
+
['pending_intents', String(model.invalidation?.pendingIntents ?? 0)]
|
|
444
|
+
])
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
lines.push('', 'Recommendation', ...renderPairs([['action', model.recommendation ?? DASH]]));
|
|
448
|
+
|
|
432
449
|
lines.push(
|
|
433
450
|
'',
|
|
434
451
|
'Orchestration',
|
|
@@ -494,6 +511,8 @@ function renderStatus(model: StatusModel): string[] {
|
|
|
494
511
|
}
|
|
495
512
|
|
|
496
513
|
function modelTone(model: StatusModel): 'info' | 'success' | 'warning' | 'danger' | 'running' {
|
|
514
|
+
if (model.invalidation?.status === 'invalid') return 'danger';
|
|
515
|
+
if (model.invalidation?.status === 'pending' || model.invalidation?.status === 'in-progress') return 'warning';
|
|
497
516
|
if (model.orchestration.status === 'paused') return 'warning';
|
|
498
517
|
if (model.orchestration.status === 'running') return 'running';
|
|
499
518
|
if (model.orchestration.status === 'completed') return 'success';
|
|
@@ -511,6 +530,23 @@ function buildFromResolved(input: BuildStatusModelInput): StatusModel {
|
|
|
511
530
|
const run = input.run ?? makeRunner(input.repoRoot);
|
|
512
531
|
const artifacts = enumerateArtifacts(input.taskDir);
|
|
513
532
|
const workflow = collectWorkflow(content, input.now);
|
|
533
|
+
const invalidation = parseInvalidationDocument(content);
|
|
534
|
+
const rework = parseReworkIntentDocument(content);
|
|
535
|
+
const pendingIntents = rework.ok ? rework.intents.filter((intent) => intent.status === 'pending').length : 0;
|
|
536
|
+
const invalidationInfo = !invalidation.ok
|
|
537
|
+
? { status: 'invalid', processed: 0, total: 0, pendingIntents }
|
|
538
|
+
: {
|
|
539
|
+
status: invalidation.present
|
|
540
|
+
? invalidationBlocks(invalidation.document)
|
|
541
|
+
? invalidation.document.operations.some((operation) => operation.status === 'in-progress') ? 'in-progress' : 'pending'
|
|
542
|
+
: 'completed'
|
|
543
|
+
: 'none',
|
|
544
|
+
processed: invalidation.document.operations.reduce((sum, operation) => sum + operation.processed, 0),
|
|
545
|
+
total: invalidation.document.operations.reduce((sum, operation) => sum + operation.total, 0),
|
|
546
|
+
pendingIntents
|
|
547
|
+
};
|
|
548
|
+
const facts = buildLifecycleFacts(input.taskDir, content, fm.status ?? 'active');
|
|
549
|
+
const recommendation = facts.ok ? (recommendNext(facts.facts).action ?? DASH) : DASH;
|
|
514
550
|
|
|
515
551
|
return {
|
|
516
552
|
taskId: input.taskId,
|
|
@@ -522,6 +558,8 @@ function buildFromResolved(input: BuildStatusModelInput): StatusModel {
|
|
|
522
558
|
workflow,
|
|
523
559
|
runtime: collectRuntime(input.taskDir, workflow, run),
|
|
524
560
|
orchestration: collectOrchestration(input.taskDir),
|
|
561
|
+
invalidation: invalidationInfo,
|
|
562
|
+
recommendation,
|
|
525
563
|
git: collectGit(fm.branch ?? '', run)
|
|
526
564
|
};
|
|
527
565
|
}
|
|
@@ -210,7 +210,18 @@ function syncTaskCommit(
|
|
|
210
210
|
);
|
|
211
211
|
const metadata = captureTaskWriteMetadata();
|
|
212
212
|
const commitNote = gitText(task.repoRoot, ['show', '-s', '--format=%h %s', committedHead]);
|
|
213
|
-
|
|
213
|
+
let matchingCommitIndex = -1;
|
|
214
|
+
for (let index = activity.entries.length - 1; index >= 0; index -= 1) {
|
|
215
|
+
const entry = activity.entries[index]!;
|
|
216
|
+
if (entry.step === 'Commit' && entry.note === commitNote) {
|
|
217
|
+
matchingCommitIndex = index;
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const reviewedAfterCommit = matchingCommitIndex >= 0 && activity.entries
|
|
222
|
+
.slice(matchingCommitIndex + 1)
|
|
223
|
+
.some((entry) => /^Review Code \(Round \d+\)$/.test(entry.step));
|
|
224
|
+
const alreadyLogged = matchingCommitIndex >= 0 && !reviewedAfterCommit;
|
|
214
225
|
const mutations: TaskMutation[] = [];
|
|
215
226
|
if (!alreadyLogged) mutations.push({
|
|
216
227
|
kind: 'section',
|
|
@@ -20,7 +20,11 @@ import {
|
|
|
20
20
|
sealOrchestrationDelegation,
|
|
21
21
|
statusOrchestration
|
|
22
22
|
} from './orchestration.ts';
|
|
23
|
-
import type {
|
|
23
|
+
import type {
|
|
24
|
+
OrchestrationDiagnosticLogger,
|
|
25
|
+
OrchestrationOptions,
|
|
26
|
+
OrchestrationResult
|
|
27
|
+
} from './orchestration.ts';
|
|
24
28
|
import { prepareCodexOrchestrationDelegation } from './codex-orchestration.ts';
|
|
25
29
|
import {
|
|
26
30
|
applyTaskFinalization,
|
|
@@ -60,6 +64,7 @@ export type TaskControlExecutionContext =
|
|
|
60
64
|
generation: string;
|
|
61
65
|
manifestPath: string;
|
|
62
66
|
requestId: string;
|
|
67
|
+
diagnosticLog?: OrchestrationDiagnosticLogger;
|
|
63
68
|
controllerBinding?: TaskControlControllerBinding | null;
|
|
64
69
|
}>;
|
|
65
70
|
|
|
@@ -134,6 +139,7 @@ export function createSandboxExecutorExecutionContext(params: Readonly<{
|
|
|
134
139
|
generation: string;
|
|
135
140
|
manifestPath: string;
|
|
136
141
|
requestId: string;
|
|
142
|
+
diagnosticLog?: OrchestrationDiagnosticLogger;
|
|
137
143
|
controllerBinding?: TaskControlControllerBinding | null;
|
|
138
144
|
}>): TaskControlExecutionContext {
|
|
139
145
|
if (!/^TASK-\d{8}-\d{6}$/u.test(params.taskId) || !params.generation || !params.requestId) {
|
|
@@ -153,6 +159,7 @@ export function createSandboxExecutorExecutionContext(params: Readonly<{
|
|
|
153
159
|
generation: params.generation,
|
|
154
160
|
manifestPath: absolute('manifestPath', params.manifestPath),
|
|
155
161
|
requestId: params.requestId,
|
|
162
|
+
...(params.diagnosticLog === undefined ? {} : { diagnosticLog: params.diagnosticLog }),
|
|
156
163
|
...(params.controllerBinding === undefined ? {} : { controllerBinding: binding(params.controllerBinding) })
|
|
157
164
|
};
|
|
158
165
|
}
|
|
@@ -192,6 +199,9 @@ function domainOptions(
|
|
|
192
199
|
return {
|
|
193
200
|
...options,
|
|
194
201
|
repoRoot: context.repoRoot,
|
|
202
|
+
...(context.source === 'sandbox-executor' && context.diagnosticLog !== undefined
|
|
203
|
+
? { diagnosticLog: context.diagnosticLog }
|
|
204
|
+
: {}),
|
|
195
205
|
...(context.source === 'sandbox-executor' ? { gitWorktreeRoot: context.worktreeRoot } : {})
|
|
196
206
|
};
|
|
197
207
|
}
|
|
@@ -206,15 +216,15 @@ function lifecycleTaskId(request: TaskLifecycleControlRequest, repoRoot: string)
|
|
|
206
216
|
}
|
|
207
217
|
}
|
|
208
218
|
|
|
209
|
-
function applyLifecycleWithAuthority(
|
|
219
|
+
async function applyLifecycleWithAuthority(
|
|
210
220
|
context: TaskControlExecutionContext,
|
|
211
221
|
request: TaskLifecycleControlRequest
|
|
212
|
-
): TaskLifecycleResult & { humanOverride?: unknown } {
|
|
222
|
+
): Promise<TaskLifecycleResult & { humanOverride?: unknown }> {
|
|
213
223
|
const conflict = overrideDryRunConflict(request as unknown as Record<string, unknown>);
|
|
214
224
|
if (conflict) {
|
|
215
225
|
return taskLifecycleFailure(request, { code: 'LIFECYCLE_PAYLOAD_INVALID', message: conflict.message });
|
|
216
226
|
}
|
|
217
|
-
const execute = (): TaskLifecycleResult & { humanOverride?: unknown } => {
|
|
227
|
+
const execute = async (): Promise<TaskLifecycleResult & { humanOverride?: unknown }> => {
|
|
218
228
|
const lifecycleResult = applyTaskLifecycle(request, { repoRoot: context.repoRoot });
|
|
219
229
|
if (lifecycleResult.status !== 'failed' || !request.overrideTicket) return lifecycleResult;
|
|
220
230
|
if (!request.overrideTarget || !request.overrideScope) {
|
|
@@ -223,7 +233,7 @@ function applyLifecycleWithAuthority(
|
|
|
223
233
|
error: { code: 'OVERRIDE_PAYLOAD_INVALID', message: 'override ticket requires --override-target and --override-scope' }
|
|
224
234
|
};
|
|
225
235
|
}
|
|
226
|
-
const override = consumeHumanOverride({
|
|
236
|
+
const override = await consumeHumanOverride({
|
|
227
237
|
taskRef: request.taskRef,
|
|
228
238
|
ticketId: request.overrideTicket,
|
|
229
239
|
failureId: failureId('lifecycle.apply', lifecycleResult.error?.code ?? 'LIFECYCLE_FAILED'),
|
|
@@ -238,9 +248,9 @@ function applyLifecycleWithAuthority(
|
|
|
238
248
|
return { ...lifecycleResult, ...override, humanOverride: override, error: null };
|
|
239
249
|
};
|
|
240
250
|
const taskId = lifecycleTaskId(request, context.repoRoot);
|
|
241
|
-
if (!taskId) return execute();
|
|
251
|
+
if (!taskId) return await execute();
|
|
242
252
|
try {
|
|
243
|
-
return withTaskExecutionLock(
|
|
253
|
+
return await withTaskExecutionLock(
|
|
244
254
|
context.repoRoot,
|
|
245
255
|
taskId,
|
|
246
256
|
`task-lifecycle.${request.intent}`,
|
|
@@ -322,11 +332,11 @@ function orchestrationFailure(error: unknown): OrchestrationResult {
|
|
|
322
332
|
export function dispatchTaskControlOperation(
|
|
323
333
|
context: TaskControlExecutionContext,
|
|
324
334
|
operation: Extract<TaskControlOperation, { family: 'task-lifecycle' }>
|
|
325
|
-
): TaskLifecycleResult
|
|
335
|
+
): Promise<TaskLifecycleResult & { humanOverride?: unknown }>;
|
|
326
336
|
export function dispatchTaskControlOperation(
|
|
327
337
|
context: TaskControlExecutionContext,
|
|
328
338
|
operation: Extract<TaskControlOperation, { family: 'task-finalization' }>
|
|
329
|
-
): TaskFinalizationResult
|
|
339
|
+
): Promise<TaskFinalizationResult>;
|
|
330
340
|
export function dispatchTaskControlOperation(
|
|
331
341
|
context: TaskControlExecutionContext,
|
|
332
342
|
operation: Extract<TaskControlOperation, { family: 'task-orchestration' }>
|
|
@@ -345,6 +355,9 @@ export function dispatchTaskControlOperation(
|
|
|
345
355
|
operationTaskId(context, operation.request.taskRef);
|
|
346
356
|
return applyTaskFinalization(operation.request, {
|
|
347
357
|
repoRoot: context.repoRoot,
|
|
358
|
+
...(context.source === 'sandbox-executor' ? {
|
|
359
|
+
controlBinding: { generation: context.generation, requestId: context.requestId }
|
|
360
|
+
} : {}),
|
|
348
361
|
preflight: (request, options) => verifyTaskEvent(
|
|
349
362
|
{ ...request, event: 'complete-task.hard-preflight' }, options
|
|
350
363
|
)
|
|
@@ -12,6 +12,13 @@ import { verifyTaskEvent } from './verification.ts';
|
|
|
12
12
|
type TaskCreateStatus = 'applied' | 'no-op' | 'degraded' | 'failed' | 'blocked';
|
|
13
13
|
type TaskCreateOperation = { name: string; status: string; reasonCode: string | null };
|
|
14
14
|
type TaskCreateWarning = { code: string; severity: string; action: string };
|
|
15
|
+
type TaskCreateRecovery = 'none' | 'same-request-id' | 'new-request-id' | 'inspect-domain-state';
|
|
16
|
+
type TaskCreateControl = Readonly<{
|
|
17
|
+
requestId: string | null;
|
|
18
|
+
accepted: boolean;
|
|
19
|
+
recovery: TaskCreateRecovery;
|
|
20
|
+
}>;
|
|
21
|
+
type TaskCreateError = { code: string; message: string; retryable: boolean };
|
|
15
22
|
type TaskCreateResult = Readonly<{
|
|
16
23
|
status: TaskCreateStatus;
|
|
17
24
|
changed: boolean;
|
|
@@ -19,7 +26,8 @@ type TaskCreateResult = Readonly<{
|
|
|
19
26
|
issue: { number: number; url: string } | null;
|
|
20
27
|
operations: readonly TaskCreateOperation[];
|
|
21
28
|
warnings: readonly TaskCreateWarning[];
|
|
22
|
-
error:
|
|
29
|
+
error: TaskCreateError | null;
|
|
30
|
+
control?: TaskCreateControl;
|
|
23
31
|
}>;
|
|
24
32
|
|
|
25
33
|
type CreateTaskOptions = Readonly<{
|
|
@@ -42,8 +50,118 @@ const DEFAULT_DEPENDENCIES: TaskCreateDependencies = {
|
|
|
42
50
|
addWarning: applyWorkflowWarningIntent
|
|
43
51
|
};
|
|
44
52
|
|
|
45
|
-
function
|
|
46
|
-
|
|
53
|
+
function invalidTaskCreateResult(): never {
|
|
54
|
+
throw new Error('TASK_CREATE_RESULT_INVALID');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function exactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {
|
|
58
|
+
return Object.keys(value).sort().join(',') === [...expected].sort().join(',');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function validTaskReference(value: unknown): boolean {
|
|
62
|
+
return value === null || (typeof value === 'string' && value.length > 0);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function validTaskCreateError(value: unknown): value is TaskCreateError {
|
|
66
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
|
|
67
|
+
const error = value as Record<string, unknown>;
|
|
68
|
+
return exactKeys(error, ['code', 'message', 'retryable'])
|
|
69
|
+
&& typeof error.code === 'string' && /^[A-Z][A-Z0-9_]+$/u.test(error.code)
|
|
70
|
+
&& typeof error.message === 'string'
|
|
71
|
+
&& typeof error.retryable === 'boolean';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function validTaskCreateControl(value: unknown): value is TaskCreateControl {
|
|
75
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
|
|
76
|
+
const control = value as Record<string, unknown>;
|
|
77
|
+
return exactKeys(control, ['accepted', 'recovery', 'requestId'])
|
|
78
|
+
&& validTaskReference(control.requestId)
|
|
79
|
+
&& typeof control.accepted === 'boolean'
|
|
80
|
+
&& ['none', 'same-request-id', 'new-request-id', 'inspect-domain-state'].includes(control.recovery as string);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function parseTaskCreateResult(value: unknown): TaskCreateResult {
|
|
84
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return invalidTaskCreateResult();
|
|
85
|
+
const result = value as Record<string, unknown>;
|
|
86
|
+
if (!exactKeys(result, ['changed', 'control', 'error', 'issue', 'operations', 'status', 'task', 'warnings'])
|
|
87
|
+
&& !exactKeys(result, ['changed', 'error', 'issue', 'operations', 'status', 'task', 'warnings'])) {
|
|
88
|
+
return invalidTaskCreateResult();
|
|
89
|
+
}
|
|
90
|
+
if (!['applied', 'no-op', 'degraded', 'failed', 'blocked'].includes(result.status as string)
|
|
91
|
+
|| typeof result.changed !== 'boolean'
|
|
92
|
+
|| !result.task || typeof result.task !== 'object' || Array.isArray(result.task)
|
|
93
|
+
|| !exactKeys(result.task as Record<string, unknown>, ['id', 'shortId'])
|
|
94
|
+
|| !validTaskReference((result.task as { id?: unknown }).id)
|
|
95
|
+
|| !validTaskReference((result.task as { shortId?: unknown }).shortId)
|
|
96
|
+
|| !Array.isArray(result.operations)
|
|
97
|
+
|| !result.operations.every((operation) => {
|
|
98
|
+
if (!operation || typeof operation !== 'object' || Array.isArray(operation)) return false;
|
|
99
|
+
const value = operation as Record<string, unknown>;
|
|
100
|
+
return exactKeys(value, ['name', 'reasonCode', 'status'])
|
|
101
|
+
&& typeof value.name === 'string' && typeof value.status === 'string'
|
|
102
|
+
&& (value.reasonCode === null || typeof value.reasonCode === 'string');
|
|
103
|
+
})
|
|
104
|
+
|| !Array.isArray(result.warnings)
|
|
105
|
+
|| !result.warnings.every((warning) => {
|
|
106
|
+
if (!warning || typeof warning !== 'object' || Array.isArray(warning)) return false;
|
|
107
|
+
const value = warning as Record<string, unknown>;
|
|
108
|
+
return exactKeys(value, ['action', 'code', 'severity'])
|
|
109
|
+
&& typeof value.action === 'string' && typeof value.code === 'string' && typeof value.severity === 'string';
|
|
110
|
+
})
|
|
111
|
+
|| (result.issue !== null && (
|
|
112
|
+
!result.issue || typeof result.issue !== 'object' || Array.isArray(result.issue)
|
|
113
|
+
|| !exactKeys(result.issue as Record<string, unknown>, ['number', 'url'])
|
|
114
|
+
|| !Number.isSafeInteger((result.issue as { number?: unknown }).number)
|
|
115
|
+
|| ((result.issue as { number: number }).number) <= 0
|
|
116
|
+
|| typeof (result.issue as { url?: unknown }).url !== 'string'
|
|
117
|
+
))
|
|
118
|
+
|| (result.error !== null && !validTaskCreateError(result.error))
|
|
119
|
+
|| ('control' in result && !validTaskCreateControl(result.control))) {
|
|
120
|
+
return invalidTaskCreateResult();
|
|
121
|
+
}
|
|
122
|
+
if (result.status === 'blocked' && !(result.error as TaskCreateError | null)?.retryable) return invalidTaskCreateResult();
|
|
123
|
+
if (result.status === 'failed' && !(result.error as TaskCreateError | null)) return invalidTaskCreateResult();
|
|
124
|
+
return result as unknown as TaskCreateResult;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function projectTaskCreateResult(result: TaskCreateResult, control: TaskCreateControl): TaskCreateResult {
|
|
128
|
+
return { ...result, control };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function taskCreateExitCode(result: Pick<TaskCreateResult, 'status'>): number {
|
|
132
|
+
return result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function taskCreateFailure(
|
|
136
|
+
error: TaskCreateError,
|
|
137
|
+
control?: TaskCreateControl
|
|
138
|
+
): TaskCreateResult {
|
|
139
|
+
return {
|
|
140
|
+
status: error.retryable ? 'blocked' : 'failed',
|
|
141
|
+
changed: false,
|
|
142
|
+
task: { id: null, shortId: null },
|
|
143
|
+
issue: null,
|
|
144
|
+
operations: [],
|
|
145
|
+
warnings: [],
|
|
146
|
+
error,
|
|
147
|
+
...(control ? { control } : {})
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function taskCreateOutputUnavailableResult(requestId: string): TaskCreateResult {
|
|
152
|
+
return taskCreateFailure({
|
|
153
|
+
code: 'SANDBOX_CONTROL_OUTPUT_UNAVAILABLE',
|
|
154
|
+
message: 'SANDBOX_CONTROL_OUTPUT_UNAVAILABLE: task-create result output was not retained; inspect domain state before retrying',
|
|
155
|
+
retryable: false
|
|
156
|
+
}, {
|
|
157
|
+
requestId,
|
|
158
|
+
accepted: true,
|
|
159
|
+
recovery: 'inspect-domain-state'
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function verifyCreatedTask(repoRoot: string, taskId: string): Promise<{ operation: TaskCreateOperation; error: TaskCreateResult['error'] }> {
|
|
164
|
+
const verification = await verifyTaskEvent(
|
|
47
165
|
{ taskRef: taskId, event: 'create-task.completed' },
|
|
48
166
|
{ repoRoot }
|
|
49
167
|
);
|
|
@@ -78,7 +196,7 @@ function issueFromTask(repoRoot: string, taskId: string): { number: number; url:
|
|
|
78
196
|
return match ? { number: Number(match[1]), url: '' } : null;
|
|
79
197
|
}
|
|
80
198
|
|
|
81
|
-
function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResult {
|
|
199
|
+
async function createTask(value: unknown, options: CreateTaskOptions): Promise<TaskCreateResult> {
|
|
82
200
|
const dependencies = { ...DEFAULT_DEPENDENCIES, ...options.dependencies };
|
|
83
201
|
let candidate: TaskCreateCandidateV1;
|
|
84
202
|
let local;
|
|
@@ -91,23 +209,20 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
|
|
|
91
209
|
} catch (error) {
|
|
92
210
|
const message = error instanceof Error ? error.message : String(error);
|
|
93
211
|
const code = /^([A-Z][A-Z0-9_]+)/.exec(message)?.[1] ?? 'TASK_CREATE_FAILED';
|
|
94
|
-
return {
|
|
95
|
-
status: 'failed', changed: false, task: { id: null, shortId: null }, issue: null,
|
|
96
|
-
operations: [], warnings: [], error: { code, message, retryable: code === 'TASK_CREATE_LOCK_TIMEOUT' }
|
|
97
|
-
};
|
|
212
|
+
return taskCreateFailure({ code, message, retryable: code === 'TASK_CREATE_LOCK_TIMEOUT' });
|
|
98
213
|
}
|
|
99
214
|
|
|
100
215
|
const operations: TaskCreateOperation[] = [{
|
|
101
216
|
name: 'task:local', status: local.status, reasonCode: null
|
|
102
217
|
}];
|
|
103
218
|
let issue = issueFromTask(options.repoRoot, local.task.id);
|
|
104
|
-
const created = dependencies.createIssue(local.task.id, { cwd: options.repoRoot, agent: candidate.agent });
|
|
219
|
+
const created = await dependencies.createIssue(local.task.id, { cwd: options.repoRoot, agent: candidate.agent });
|
|
105
220
|
operations.push(...platformOperations('platform-create', created.operations));
|
|
106
221
|
if (created.issue) issue = { number: created.issue.number, url: created.issue.url };
|
|
107
222
|
|
|
108
223
|
let platformFailure: PlatformResult | null = created.status === 'failed' || created.status === 'blocked' ? created : null;
|
|
109
224
|
if (!platformFailure && (created.task.issueNumber || issue)) {
|
|
110
|
-
const synced = dependencies.syncIssue(local.task.id, {
|
|
225
|
+
const synced = await dependencies.syncIssue(local.task.id, {
|
|
111
226
|
cwd: options.repoRoot,
|
|
112
227
|
agent: candidate.agent,
|
|
113
228
|
status: 'waiting-for-triage',
|
|
@@ -120,7 +235,7 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
|
|
|
120
235
|
if (synced.issue) issue = { number: synced.issue.number, url: synced.issue.url };
|
|
121
236
|
if (synced.status === 'failed' || synced.status === 'blocked') platformFailure = synced;
|
|
122
237
|
if (!platformFailure) {
|
|
123
|
-
const commented = dependencies.syncComment(local.task.id, { cwd: options.repoRoot, kind: 'task', agent: candidate.agent });
|
|
238
|
+
const commented = await dependencies.syncComment(local.task.id, { cwd: options.repoRoot, kind: 'task', agent: candidate.agent });
|
|
124
239
|
operations.push(...platformOperations('platform-comment', commented.operations));
|
|
125
240
|
if (commented.status === 'failed' || commented.status === 'blocked') platformFailure = commented;
|
|
126
241
|
}
|
|
@@ -133,7 +248,7 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
|
|
|
133
248
|
code: 'ISSUE_CREATE_FAILED', target: 'issue', message: `${error.code}: ${error.message}`,
|
|
134
249
|
action: 'Fix platform authentication or connectivity, then retry Issue creation for this task.'
|
|
135
250
|
}, { repoRoot: options.repoRoot });
|
|
136
|
-
const verified = verifyCreatedTask(options.repoRoot, local.task.id);
|
|
251
|
+
const verified = await verifyCreatedTask(options.repoRoot, local.task.id);
|
|
137
252
|
operations.push(verified.operation);
|
|
138
253
|
if (verified.error) return {
|
|
139
254
|
status: verified.error.retryable ? 'blocked' : 'failed', changed: local.changed,
|
|
@@ -150,7 +265,7 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
|
|
|
150
265
|
};
|
|
151
266
|
}
|
|
152
267
|
|
|
153
|
-
const verified = verifyCreatedTask(options.repoRoot, local.task.id);
|
|
268
|
+
const verified = await verifyCreatedTask(options.repoRoot, local.task.id);
|
|
154
269
|
operations.push(verified.operation);
|
|
155
270
|
if (verified.error) return {
|
|
156
271
|
status: verified.error.retryable ? 'blocked' : 'failed', changed: local.changed,
|
|
@@ -168,4 +283,14 @@ function createTask(value: unknown, options: CreateTaskOptions): TaskCreateResul
|
|
|
168
283
|
}
|
|
169
284
|
|
|
170
285
|
export { createTask };
|
|
171
|
-
export type {
|
|
286
|
+
export type {
|
|
287
|
+
CreateTaskOptions,
|
|
288
|
+
TaskCreateControl,
|
|
289
|
+
TaskCreateDependencies,
|
|
290
|
+
TaskCreateError,
|
|
291
|
+
TaskCreateOperation,
|
|
292
|
+
TaskCreateRecovery,
|
|
293
|
+
TaskCreateResult,
|
|
294
|
+
TaskCreateStatus,
|
|
295
|
+
TaskCreateWarning
|
|
296
|
+
};
|
package/lib/task/create.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { loadShortIdByTaskId, mutateShortIdRegistry } from './short-id.ts';
|
|
|
7
7
|
import { TaskExecutionLockError, withTaskExecutionLock } from './task-execution-lock.ts';
|
|
8
8
|
import { readDeliveryDefaults, validateBaseRef, validateRemote } from './delivery-target.ts';
|
|
9
9
|
import { buildUnboundFact, encodePrDeliveryFact } from './pr-delivery-fact.ts';
|
|
10
|
+
import { CANDIDATE_COLUMNS, CONSTRAINT_COLUMNS } from './qualification-audit.ts';
|
|
10
11
|
|
|
11
12
|
const AGENTS = ['claude', 'codex', 'antigravity', 'opencode', 'cursor'] as const;
|
|
12
13
|
const TYPES = ['feature', 'bugfix', 'refactor', 'docs', 'chore'] as const;
|
|
@@ -178,6 +179,25 @@ function renderList(items: readonly string[]): string {
|
|
|
178
179
|
return items.map((item) => `- ${item}`).join('\n');
|
|
179
180
|
}
|
|
180
181
|
|
|
182
|
+
function tableCell(value: string): string {
|
|
183
|
+
return value.replace(/\\/g, '\\\\').replace(/\|/g, '\\|').replace(/[\r\n]/g, ' ');
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function renderTable(columns: readonly string[], rows: readonly (readonly string[])[]): string {
|
|
187
|
+
return [
|
|
188
|
+
`| ${columns.join(' | ')} |`,
|
|
189
|
+
`| ${columns.map(() => '---').join(' | ')} |`,
|
|
190
|
+
...rows.map((row) => `| ${row.map(tableCell).join(' | ')} |`)
|
|
191
|
+
].join('\n');
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function appendCanonicalRows(content: string, columns: readonly string[], rows: readonly (readonly string[])[]): string {
|
|
195
|
+
if (rows.length === 0) return content;
|
|
196
|
+
const table = renderTable(columns, rows);
|
|
197
|
+
const separator = `| ${columns.map(() => '---').join(' | ')} |`;
|
|
198
|
+
return content.replace(separator, `${separator}\n${table.split('\n').slice(2).join('\n')}`);
|
|
199
|
+
}
|
|
200
|
+
|
|
181
201
|
function replaceEmptySubsection(content: string, heading: string, items: readonly string[]): string {
|
|
182
202
|
if (items.length === 0) return content;
|
|
183
203
|
return content.replace(`${heading}\n`, `${heading}\n\n${renderList(items)}\n`);
|
|
@@ -231,6 +251,13 @@ function renderTask(params: Readonly<{
|
|
|
231
251
|
['### 验收标准', 'acceptanceCriteria'], ['### 未决事项', 'openQuestions']
|
|
232
252
|
];
|
|
233
253
|
for (const [heading, key] of sections) content = replaceEmptySubsection(content, heading, candidate.taskInput[key]);
|
|
254
|
+
const constraintIds = candidate.taskInput.constraints.map((_, index) => `C-${index + 1}`);
|
|
255
|
+
content = appendCanonicalRows(content, CONSTRAINT_COLUMNS, candidate.taskInput.constraints.map((statement, index) => [
|
|
256
|
+
constraintIds[index]!, statement, 'assumption', 'create-task', 'taskInput', 'create-task input', '', ''
|
|
257
|
+
]));
|
|
258
|
+
content = appendCanonicalRows(content, CANDIDATE_COLUMNS, candidate.taskInput.alternatives.map((statement, index) => [
|
|
259
|
+
String.fromCharCode(65 + index), statement, 'pending', constraintIds.join(','), 'requires qualification', 'create-task input'
|
|
260
|
+
]));
|
|
234
261
|
content = content.replace('- **关联 Issue**:#XXX', '- **关联 Issue**:N/A');
|
|
235
262
|
content = content.replace('- **关联 PR**:#XXX', '- **关联 PR**:N/A');
|
|
236
263
|
content = content.replace('- **分支**:`feature/xxx`', `- **分支**:\`${branch}\``);
|
|
@@ -2,6 +2,8 @@ import { isValidAgentInfraVersion } from '../version.ts';
|
|
|
2
2
|
import { parseTypedTaskFrontmatter } from './frontmatter.ts';
|
|
3
3
|
import { LEDGER_SECTION_MISSING_CODE, LEDGER_SECTION_MISSING_MESSAGE, parseLedgerDocument, validateLedgerRows } from './ledger.ts';
|
|
4
4
|
import type { LedgerDocument } from './ledger.ts';
|
|
5
|
+
import { parseInvalidationDocument } from './invalidation.ts';
|
|
6
|
+
import type { InvalidationDocument } from './invalidation.ts';
|
|
5
7
|
|
|
6
8
|
type CurrentTaskContractErrorCode = 'TASK_DOCUMENT_INVALID' | 'TASK_CURRENT_CONTRACT_INVALID';
|
|
7
9
|
type CurrentTaskContractResult =
|
|
@@ -9,6 +11,7 @@ type CurrentTaskContractResult =
|
|
|
9
11
|
ok: true;
|
|
10
12
|
metadata: ReturnType<typeof parseTypedTaskFrontmatter>;
|
|
11
13
|
ledger: LedgerDocument;
|
|
14
|
+
invalidation: InvalidationDocument;
|
|
12
15
|
}
|
|
13
16
|
| {
|
|
14
17
|
ok: false;
|
|
@@ -42,7 +45,9 @@ function validateCurrentTaskContract(content: string): CurrentTaskContractResult
|
|
|
42
45
|
}
|
|
43
46
|
const invalid = validateLedgerRows(ledger.rows);
|
|
44
47
|
if (invalid) return { ok: false, code: 'TASK_CURRENT_CONTRACT_INVALID', message: `${invalid.code}: ${invalid.message}` };
|
|
45
|
-
|
|
48
|
+
const invalidation = parseInvalidationDocument(content);
|
|
49
|
+
if (!invalidation.ok) return { ok: false, code: 'TASK_CURRENT_CONTRACT_INVALID', message: `${invalidation.code}: ${invalidation.message}` };
|
|
50
|
+
return { ok: true, metadata, ledger, invalidation: invalidation.document };
|
|
46
51
|
}
|
|
47
52
|
|
|
48
53
|
export { validateCurrentTaskContract };
|
|
@@ -270,11 +270,15 @@ export {
|
|
|
270
270
|
normalizeDecisionDetailForDisplay,
|
|
271
271
|
parseDecisionDetailBlocks,
|
|
272
272
|
parseDecisionEvidence,
|
|
273
|
-
resolveDecisionDetail
|
|
273
|
+
resolveDecisionDetail,
|
|
274
|
+
scanVisibleMarkdown
|
|
274
275
|
};
|
|
275
276
|
export type {
|
|
276
277
|
DecisionDetailBlock,
|
|
277
278
|
DecisionDetailDuplicate,
|
|
278
279
|
DecisionDetailInspection,
|
|
279
|
-
DecisionDetailResolution
|
|
280
|
+
DecisionDetailResolution,
|
|
281
|
+
SourceLine,
|
|
282
|
+
VisibleHeading,
|
|
283
|
+
VisibleMarkdown
|
|
280
284
|
};
|