@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
|
@@ -160,6 +160,25 @@ function withTaskExecutionLock(repoRoot, taskId, ownerName, callback, options =
|
|
|
160
160
|
};
|
|
161
161
|
const serialized = `${JSON.stringify(owner)}\n`;
|
|
162
162
|
let ownsFixed = false;
|
|
163
|
+
let deferRelease = false;
|
|
164
|
+
const release = () => {
|
|
165
|
+
try {
|
|
166
|
+
unlinkIfPresent(candidate);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Candidate cleanup is best-effort and must not replace the primary result.
|
|
170
|
+
}
|
|
171
|
+
if (ownsFixed) {
|
|
172
|
+
try {
|
|
173
|
+
const current = parseOwner(fs.readFileSync(fixed, 'utf8'), key);
|
|
174
|
+
if (current.token === token)
|
|
175
|
+
unlinkIfPresent(fixed);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// A missing or replaced fixed lock is not owned by this invocation.
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
};
|
|
163
182
|
try {
|
|
164
183
|
fs.mkdirSync(lockRoot, { recursive: true });
|
|
165
184
|
cleanStaleCandidates(lockRoot, key, options.identityMatches ?? processIdentityMatches);
|
|
@@ -202,7 +221,12 @@ function withTaskExecutionLock(repoRoot, taskId, ownerName, callback, options =
|
|
|
202
221
|
throw new TaskExecutionLockError('ORCHESTRATION_LOCK_BUSY', 'lifecycle task lock could not be acquired after stale recovery', { operation: 'acquire', errno: 'EEXIST', key });
|
|
203
222
|
}
|
|
204
223
|
unlinkIfPresent(candidate);
|
|
205
|
-
|
|
224
|
+
const value = callback();
|
|
225
|
+
if (value && typeof value.then === 'function') {
|
|
226
|
+
deferRelease = true;
|
|
227
|
+
return value.finally(release);
|
|
228
|
+
}
|
|
229
|
+
return value;
|
|
206
230
|
}
|
|
207
231
|
catch (error) {
|
|
208
232
|
if (error instanceof TaskExecutionLockError)
|
|
@@ -212,22 +236,8 @@ function withTaskExecutionLock(repoRoot, taskId, ownerName, callback, options =
|
|
|
212
236
|
throw new TaskExecutionLockError('ORCHESTRATION_LOCK_FAILED', 'lifecycle task lock operation failed', { operation: ownsFixed ? 'callback' : 'acquire', errno: errno(error), key });
|
|
213
237
|
}
|
|
214
238
|
finally {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
catch {
|
|
219
|
-
// Candidate cleanup is best-effort and must not replace the primary result.
|
|
220
|
-
}
|
|
221
|
-
if (ownsFixed) {
|
|
222
|
-
try {
|
|
223
|
-
const current = parseOwner(fs.readFileSync(fixed, 'utf8'), key);
|
|
224
|
-
if (current.token === token)
|
|
225
|
-
unlinkIfPresent(fixed);
|
|
226
|
-
}
|
|
227
|
-
catch {
|
|
228
|
-
// A missing or replaced fixed lock is not owned by this invocation.
|
|
229
|
-
}
|
|
230
|
-
}
|
|
239
|
+
if (!deferRelease)
|
|
240
|
+
release();
|
|
231
241
|
}
|
|
232
242
|
}
|
|
233
243
|
function withRepositoryMutationLock(repoRoot, callback, options = {}) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { getArtifactSchema } from './artifact-schema.js';
|
|
3
4
|
function loadVerificationConfig(repositoryRoot, skillName) {
|
|
4
5
|
const verifyPath = path.join(repositoryRoot, '.agents', 'skills', skillName, 'config', 'verify.json');
|
|
5
6
|
if (!fs.existsSync(verifyPath))
|
|
@@ -8,6 +9,16 @@ function loadVerificationConfig(repositoryRoot, skillName) {
|
|
|
8
9
|
if (!parsed.checks || typeof parsed.checks !== 'object' || Array.isArray(parsed.checks)) {
|
|
9
10
|
throw new Error(`config/verify.json has invalid checks for skill '${skillName}'`);
|
|
10
11
|
}
|
|
12
|
+
const artifact = parsed.checks.artifact;
|
|
13
|
+
if (artifact && typeof artifact === 'object' && !Array.isArray(artifact)) {
|
|
14
|
+
const schema = artifact.schema;
|
|
15
|
+
if (schema !== undefined && (typeof schema !== 'string' || !getArtifactSchema(schema))) {
|
|
16
|
+
throw new Error(`config/verify.json has unknown artifact schema '${String(schema)}' for skill '${skillName}'`);
|
|
17
|
+
}
|
|
18
|
+
if (schema !== undefined && 'required_patterns' in artifact) {
|
|
19
|
+
throw new Error(`config/verify.json must not duplicate required_patterns for schema '${String(schema)}' in skill '${skillName}'`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
11
22
|
return { ...(parsed.skill ? { skill: parsed.skill } : {}), checks: parsed.checks };
|
|
12
23
|
}
|
|
13
24
|
export { loadVerificationConfig };
|
|
@@ -21,6 +21,10 @@ import { snapshotReview } from "../git/review-snapshot.js";
|
|
|
21
21
|
import { OrchestrationStateError, readRun } from "./orchestration.js";
|
|
22
22
|
import { resolveDeliveryTarget } from "./delivery-target.js";
|
|
23
23
|
import { readPrDeliveryFact } from "./pr-delivery-fact.js";
|
|
24
|
+
import { validateLocalArtifact } from "./local-artifact-finalization.js";
|
|
25
|
+
import { validateQualificationAudit } from "./qualification-audit.js";
|
|
26
|
+
import { getArtifactSchema } from "./artifact-schema.js";
|
|
27
|
+
import { inspectArtifactContract } from "./artifact-operations.js";
|
|
24
28
|
const TASK_ENUMS = {
|
|
25
29
|
type: ["feature", "bugfix", "refactor", "docs", "chore"],
|
|
26
30
|
workflow: ["feature-development", "bug-fix", "refactoring"],
|
|
@@ -69,7 +73,7 @@ const scriptPath = fileURLToPath(import.meta.url);
|
|
|
69
73
|
let repoRoot = path.resolve(path.dirname(scriptPath), "..", "..");
|
|
70
74
|
const PLATFORM_ADAPTERS = {
|
|
71
75
|
"platform-sync": checkPlatformSync,
|
|
72
|
-
"platform-sync-preflight": (context, shared) => ({ ...checkPlatformSync(context, shared), type: "platform-sync-preflight" }),
|
|
76
|
+
"platform-sync-preflight": async (context, shared) => ({ ...await checkPlatformSync(context, shared), type: "platform-sync-preflight" }),
|
|
73
77
|
"required-checks": checkRequiredChecks
|
|
74
78
|
};
|
|
75
79
|
const OPTIONAL_PLATFORM_CHECKS = new Set(["platform-sync"]);
|
|
@@ -86,7 +90,7 @@ const sharedUtils = {
|
|
|
86
90
|
parseIssueNumber,
|
|
87
91
|
parsePrNumber
|
|
88
92
|
};
|
|
89
|
-
function runCheck(type, context, shared) {
|
|
93
|
+
async function runCheck(type, context, shared) {
|
|
90
94
|
switch (type) {
|
|
91
95
|
case "task-meta":
|
|
92
96
|
return checkTaskMeta(context);
|
|
@@ -124,7 +128,7 @@ function runCheck(type, context, shared) {
|
|
|
124
128
|
}
|
|
125
129
|
return failResult(type, `Unsupported check type '${type}'.`);
|
|
126
130
|
}
|
|
127
|
-
return adapter(context, shared);
|
|
131
|
+
return await adapter(context, shared);
|
|
128
132
|
}
|
|
129
133
|
}
|
|
130
134
|
}
|
|
@@ -419,7 +423,7 @@ function checkTaskMeta({ taskDir, config }) {
|
|
|
419
423
|
const warningSuffix = warnings.length > 0 ? `; warnings: ${warnings.join("; ")}` : "";
|
|
420
424
|
return passResult("task-meta", `Task metadata valid (${requiredFields.length} required fields checked${warningSuffix})`, warnings);
|
|
421
425
|
}
|
|
422
|
-
function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
|
|
426
|
+
async function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
|
|
423
427
|
const task = loadTask(taskDir);
|
|
424
428
|
if (!task.ok)
|
|
425
429
|
return failResult('required-pr-delivery', task.message);
|
|
@@ -438,10 +442,11 @@ function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
|
|
|
438
442
|
return failResult('required-pr-delivery', factRead.error.message);
|
|
439
443
|
const fact = factRead.status === 'valid' ? factRead.fact : null;
|
|
440
444
|
const status = fact?.state || 'unbound';
|
|
441
|
-
const
|
|
445
|
+
const prIdentity = fact?.state === 'bound' ? fact.identity.resource : null;
|
|
446
|
+
const prNumber = prIdentity?.kind === 'number' ? prIdentity.value : null;
|
|
442
447
|
if (flow === 'disabled')
|
|
443
448
|
return passResult('required-pr-delivery', 'Pull request delivery is disabled by project policy');
|
|
444
|
-
if (flow === 'required' && (status !== 'bound' ||
|
|
449
|
+
if (flow === 'required' && (status !== 'bound' || !prIdentity)) {
|
|
445
450
|
return failResult('required-pr-delivery', 'Project policy requires a bound pull request before completion');
|
|
446
451
|
}
|
|
447
452
|
if (flow !== 'required' && status === 'unbound') {
|
|
@@ -451,7 +456,7 @@ function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
|
|
|
451
456
|
if (mode === 'gate') {
|
|
452
457
|
return passResult('required-pr-delivery', 'Bound pull request shape is valid; merged-state inspection is reserved for hard preflight');
|
|
453
458
|
}
|
|
454
|
-
const inspected = inspectPlatformPullRequest(task.metadata.id, { cwd: repositoryRoot });
|
|
459
|
+
const inspected = await inspectPlatformPullRequest(task.metadata.id, { cwd: repositoryRoot });
|
|
455
460
|
if (inspected.status === 'blocked') {
|
|
456
461
|
return blockedResult('required-pr-delivery', inspected.error?.message || 'Unable to inspect the required pull request', inspected.error?.code || 'PR_INSPECTION_BLOCKED');
|
|
457
462
|
}
|
|
@@ -459,7 +464,7 @@ function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
|
|
|
459
464
|
const repository = inspected.platform.repository?.toLowerCase() || '';
|
|
460
465
|
const taskBranch = String(task.metadata.branch || '').trim();
|
|
461
466
|
const deliveryBaseRef = String(task.metadata.delivery_base_ref || projectConfig.delivery?.baseRef || '').trim();
|
|
462
|
-
if (inspected.status !== 'no-op' || !pullRequest
|
|
467
|
+
if (inspected.status !== 'no-op' || !pullRequest) {
|
|
463
468
|
return failResult('required-pr-delivery', 'Bound pull request identity could not be verified');
|
|
464
469
|
}
|
|
465
470
|
if (!repository
|
|
@@ -472,7 +477,7 @@ function checkRequiredPrDelivery({ taskDir, repositoryRoot, mode }) {
|
|
|
472
477
|
if (pullRequest.state !== 'closed' || !pullRequest.mergedAt || !pullRequest.mergeCommitSha) {
|
|
473
478
|
return failResult('required-pr-delivery', 'Project policy requires the bound pull request to be merged');
|
|
474
479
|
}
|
|
475
|
-
return passResult('required-pr-delivery', `Pull request delivery policy satisfied (merged PR
|
|
480
|
+
return passResult('required-pr-delivery', `Pull request delivery policy satisfied (merged PR ${prNumber === null ? 'identity' : `#${prNumber}`})`);
|
|
476
481
|
}
|
|
477
482
|
return passResult('required-pr-delivery', `Pull request delivery policy satisfied (${status})`);
|
|
478
483
|
}
|
|
@@ -504,7 +509,7 @@ function loadProjectName() {
|
|
|
504
509
|
return "";
|
|
505
510
|
}
|
|
506
511
|
}
|
|
507
|
-
function checkArtifact({ taskDir, config, artifactFile }) {
|
|
512
|
+
function checkArtifact({ taskDir, config, artifactFile, skillName }) {
|
|
508
513
|
const resolvedArtifact = resolveArtifactPath(taskDir, config.file_pattern, artifactFile);
|
|
509
514
|
if (!resolvedArtifact.ok) {
|
|
510
515
|
return failResult("artifact", resolvedArtifact.message);
|
|
@@ -518,6 +523,56 @@ function checkArtifact({ taskDir, config, artifactFile }) {
|
|
|
518
523
|
return failResult("artifact", `Artifact is empty: ${path.basename(artifactPath)}`);
|
|
519
524
|
}
|
|
520
525
|
const content = fs.readFileSync(artifactPath, "utf8");
|
|
526
|
+
let taskContent = "";
|
|
527
|
+
const taskPath = path.join(taskDir, "task.md");
|
|
528
|
+
if (fs.existsSync(taskPath)) {
|
|
529
|
+
try {
|
|
530
|
+
taskContent = fs.readFileSync(taskPath, "utf8");
|
|
531
|
+
}
|
|
532
|
+
catch (error) {
|
|
533
|
+
return failResult("artifact", `Cannot read task qualification contract: ${error instanceof Error ? error.message : String(error)}`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
if (taskContent && /^review-(?:analysis|plan|code)$/.test(skillName)) {
|
|
537
|
+
const qualification = validateQualificationAudit(taskContent, content, { artifact: path.basename(artifactPath) });
|
|
538
|
+
if (!qualification.ok)
|
|
539
|
+
return failResult("artifact", `${path.basename(artifactPath)} has qualification audit errors: ${qualification.code}: ${qualification.message}`);
|
|
540
|
+
}
|
|
541
|
+
const schemaFamily = skillName === "analyze-task"
|
|
542
|
+
? "analysis"
|
|
543
|
+
: skillName === "review-analysis"
|
|
544
|
+
? "review-analysis"
|
|
545
|
+
: skillName === "plan-task"
|
|
546
|
+
? "plan"
|
|
547
|
+
: skillName === "review-plan"
|
|
548
|
+
? "review-plan"
|
|
549
|
+
: skillName === "code-task"
|
|
550
|
+
? "code"
|
|
551
|
+
: skillName === "review-code" ? "review-code" : null;
|
|
552
|
+
const schema = schemaFamily ? getArtifactSchema(schemaFamily) : null;
|
|
553
|
+
const localFamily = skillName === "analyze-task"
|
|
554
|
+
? "analysis"
|
|
555
|
+
: skillName === "plan-task" ? "plan" : skillName === "code-task" ? "code" : null;
|
|
556
|
+
if (schema) {
|
|
557
|
+
const structure = inspectArtifactContract(content, schema);
|
|
558
|
+
if (!structure.ok && !localFamily) {
|
|
559
|
+
return failResult("artifact", `${path.basename(artifactPath)} has shared structural errors: ${structure.diagnostics.map((item) => `${item.code}: ${item.message}`).join('; ')}`);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
if (localFamily) {
|
|
563
|
+
const local = validateLocalArtifact(content, {
|
|
564
|
+
family: localFamily,
|
|
565
|
+
...(taskContent ? { taskContent } : {}),
|
|
566
|
+
artifact: path.basename(artifactPath)
|
|
567
|
+
});
|
|
568
|
+
if (!local.ok) {
|
|
569
|
+
return failResult("artifact", `${path.basename(artifactPath)} has local structural errors: ${local.diagnostics.map((item) => `${item.code}: ${item.message}`).join('; ')}`);
|
|
570
|
+
}
|
|
571
|
+
return passResult("artifact", `${path.basename(artifactPath)} passed (${schema?.sections.length ?? 0} sections)`);
|
|
572
|
+
}
|
|
573
|
+
if (schema) {
|
|
574
|
+
return passResult("artifact", `${path.basename(artifactPath)} passed (${schema.sections.length} sections)`);
|
|
575
|
+
}
|
|
521
576
|
const requiredSections = config.required_sections || [];
|
|
522
577
|
const missingSections = requiredSections.filter((section) => !new RegExp(`^##\\s+${escapeRegExp(section)}\\s*$`, "m").test(content));
|
|
523
578
|
if (missingSections.length > 0) {
|
|
@@ -670,6 +725,7 @@ function checkActivityLog({ taskDir, config }) {
|
|
|
670
725
|
let previousTimestamp = "";
|
|
671
726
|
let latestAction = "";
|
|
672
727
|
let latestTimestamp = "";
|
|
728
|
+
const doneActions = [];
|
|
673
729
|
for (const entry of entries) {
|
|
674
730
|
const match = entry.match(ACTIVITY_LOG_PATTERN);
|
|
675
731
|
if (!match) {
|
|
@@ -686,6 +742,16 @@ function checkActivityLog({ taskDir, config }) {
|
|
|
686
742
|
if (!ACTIVITY_LOG_STARTED_RE.test(action)) {
|
|
687
743
|
latestTimestamp = timestamp;
|
|
688
744
|
latestAction = action;
|
|
745
|
+
doneActions.push(action);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
if (config.expected_action_pattern && !new RegExp(config.expected_action_pattern).test(latestAction)) {
|
|
749
|
+
const expected = new RegExp(config.expected_action_pattern);
|
|
750
|
+
let index = doneActions.length - 1;
|
|
751
|
+
while (index >= 0 && doneActions[index] === 'Commit' && !expected.test(doneActions[index]))
|
|
752
|
+
index -= 1;
|
|
753
|
+
if (index >= 0 && expected.test(doneActions[index])) {
|
|
754
|
+
latestAction = doneActions[index];
|
|
689
755
|
}
|
|
690
756
|
}
|
|
691
757
|
if (config.expected_action_pattern && !new RegExp(config.expected_action_pattern).test(latestAction)) {
|
|
@@ -902,6 +968,8 @@ function checkManualValidation({ taskDir }) {
|
|
|
902
968
|
// 1. Latest review-code artifact; none -> pass (no review, check not applicable).
|
|
903
969
|
const review = findAuthoritativeReviewCodeArtifact(taskDir);
|
|
904
970
|
if (!review.ok) {
|
|
971
|
+
if (review.error)
|
|
972
|
+
return failResult("manual-validation", `Review-code artifact is unavailable: ${review.error}`);
|
|
905
973
|
return passResult("manual-validation", "No review-code artifact; manual validation not applicable");
|
|
906
974
|
}
|
|
907
975
|
// 2. Parse the numeric manual-validation count; unparseable/null -> fail closed
|
|
@@ -953,9 +1021,11 @@ function checkManualValidation({ taskDir }) {
|
|
|
953
1021
|
}
|
|
954
1022
|
return passResult("manual-validation", `Manual validation completed → ${artifactName}`);
|
|
955
1023
|
}
|
|
956
|
-
function checkPostReviewCommit({ taskDir, config }) {
|
|
1024
|
+
async function checkPostReviewCommit({ taskDir, config }) {
|
|
957
1025
|
const reviewArtifact = findAuthoritativeReviewCodeArtifact(taskDir);
|
|
958
1026
|
if (!reviewArtifact.ok) {
|
|
1027
|
+
if (reviewArtifact.error)
|
|
1028
|
+
return failResult("post-review-commit", `Review-code artifact is unavailable: ${reviewArtifact.error}`);
|
|
959
1029
|
return passResult("post-review-commit", "No review-code artifact; check inactive");
|
|
960
1030
|
}
|
|
961
1031
|
let gitRoot;
|
|
@@ -977,7 +1047,7 @@ function checkPostReviewCommit({ taskDir, config }) {
|
|
|
977
1047
|
const hasPullRequest = fact?.state === 'bound';
|
|
978
1048
|
let inspected = null;
|
|
979
1049
|
if (hasPullRequest) {
|
|
980
|
-
inspected = inspectPlatformPullRequest(task.metadata.id, { cwd: gitRoot });
|
|
1050
|
+
inspected = await inspectPlatformPullRequest(task.metadata.id, { cwd: gitRoot });
|
|
981
1051
|
if (!inspected.pullRequest) {
|
|
982
1052
|
const message = inspected.error?.message || "PR merge snapshot is unavailable";
|
|
983
1053
|
const code = inspected.error?.code || "PR_INSPECTION_INVALID";
|
|
@@ -988,7 +1058,7 @@ function checkPostReviewCommit({ taskDir, config }) {
|
|
|
988
1058
|
if (inspected.pullRequest.state === "closed" &&
|
|
989
1059
|
inspected.pullRequest.mergedAt &&
|
|
990
1060
|
inspected.pullRequest.mergeCommitSha) {
|
|
991
|
-
const relation = resolveMaterializedReviewedHeadRelation({
|
|
1061
|
+
const relation = await resolveMaterializedReviewedHeadRelation({
|
|
992
1062
|
cwd: gitRoot,
|
|
993
1063
|
platformType: inspected.platform.type,
|
|
994
1064
|
lastReviewedCommit,
|
|
@@ -1124,6 +1194,13 @@ function checkReviewFact({ taskDir, artifactFile }) {
|
|
|
1124
1194
|
if (!resolvedArtifact.ok) {
|
|
1125
1195
|
return failResult("review-fact", resolvedArtifact.message);
|
|
1126
1196
|
}
|
|
1197
|
+
const authoritative = findAuthoritativeReviewCodeArtifact(taskDir);
|
|
1198
|
+
if (!authoritative.ok) {
|
|
1199
|
+
return failResult("review-fact", authoritative.error ?? "No active review-code artifact is available");
|
|
1200
|
+
}
|
|
1201
|
+
if (path.basename(resolvedArtifact.path) !== authoritative.fileName) {
|
|
1202
|
+
return failResult("review-fact", `review-code artifact ${path.basename(resolvedArtifact.path)} is not the current active artifact ${authoritative.fileName}; re-run review-code`);
|
|
1203
|
+
}
|
|
1127
1204
|
const task = loadTask(taskDir);
|
|
1128
1205
|
if (!task.ok) {
|
|
1129
1206
|
return failResult("review-fact", task.message);
|
|
@@ -1401,7 +1478,7 @@ function escapeRegExp(value) {
|
|
|
1401
1478
|
function isBlank(value) {
|
|
1402
1479
|
return value === undefined || value === null || String(value).trim() === "";
|
|
1403
1480
|
}
|
|
1404
|
-
function verifyInProcess({ mode, skillName, taskDir, artifactFile, checks: requestedChecks, repositoryRoot }) {
|
|
1481
|
+
async function verifyInProcess({ mode, skillName, taskDir, artifactFile, checks: requestedChecks, repositoryRoot }) {
|
|
1405
1482
|
if (repositoryRoot)
|
|
1406
1483
|
repoRoot = path.resolve(repositoryRoot);
|
|
1407
1484
|
else {
|
|
@@ -1418,7 +1495,7 @@ function verifyInProcess({ mode, skillName, taskDir, artifactFile, checks: reque
|
|
|
1418
1495
|
for (const [type, checkConfig] of Object.entries(verifyConfig.checks || {})) {
|
|
1419
1496
|
if (checkConfig === null)
|
|
1420
1497
|
continue;
|
|
1421
|
-
const result = runCheck(type, {
|
|
1498
|
+
const result = await runCheck(type, {
|
|
1422
1499
|
mode,
|
|
1423
1500
|
skillName,
|
|
1424
1501
|
taskDir: path.resolve(taskDir),
|
|
@@ -1441,7 +1518,7 @@ function verifyInProcess({ mode, skillName, taskDir, artifactFile, checks: reque
|
|
|
1441
1518
|
return { skill: skillName, ...passResult(type, `Check '${type}' is disabled for skill '${skillName}'.`) };
|
|
1442
1519
|
return {
|
|
1443
1520
|
skill: skillName,
|
|
1444
|
-
...runCheck(type, {
|
|
1521
|
+
...await runCheck(type, {
|
|
1445
1522
|
skillName,
|
|
1446
1523
|
taskDir: path.resolve(taskDir),
|
|
1447
1524
|
artifactFile,
|
|
@@ -41,7 +41,7 @@ function failure(request, code, message, extra = {}) {
|
|
|
41
41
|
artifact: request.artifact ?? null, invocations: [], error: { code, message }, ...extra
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
-
function verifyTaskEvent(request, options = {}) {
|
|
44
|
+
async function verifyTaskEvent(request, options = {}) {
|
|
45
45
|
const spec = VERIFICATION_CATALOG[request.event];
|
|
46
46
|
if (!spec)
|
|
47
47
|
return failure(request, 'VERIFY_EVENT_UNKNOWN', `unknown verification event '${request.event}'`);
|
|
@@ -66,7 +66,7 @@ function verifyTaskEvent(request, options = {}) {
|
|
|
66
66
|
const invocations = [];
|
|
67
67
|
const engine = options.engine ?? verifyInProcess;
|
|
68
68
|
if (spec.mode === 'gate') {
|
|
69
|
-
const payload = engine({ mode: 'gate', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [], repositoryRoot: resolved.repoRoot });
|
|
69
|
+
const payload = await engine({ mode: 'gate', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [], repositoryRoot: resolved.repoRoot });
|
|
70
70
|
const status = payload.gate;
|
|
71
71
|
if (status !== 'pass' && allowsManualOverride(options.manualOverride, 'verification-engine', status === 'blocked' ? 'CHECK_BLOCKED' : 'CHECK_FAILED')) {
|
|
72
72
|
invocations.push({ status: 'pass', exitCode: 0, payload: { ...payload, gate: 'pass', humanOverride: 'human-approved', originalGate: status } });
|
|
@@ -79,7 +79,7 @@ function verifyTaskEvent(request, options = {}) {
|
|
|
79
79
|
}
|
|
80
80
|
else {
|
|
81
81
|
for (const check of spec.checks ?? []) {
|
|
82
|
-
const payload = engine({ mode: 'checks', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [check], repositoryRoot: resolved.repoRoot });
|
|
82
|
+
const payload = await engine({ mode: 'checks', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [check], repositoryRoot: resolved.repoRoot });
|
|
83
83
|
const status = payload.status;
|
|
84
84
|
if (status !== 'pass' && allowsManualOverride(options.manualOverride, 'verification-engine', status === 'blocked' ? 'CHECK_BLOCKED' : 'CHECK_FAILED')) {
|
|
85
85
|
invocations.push({ status: 'pass', exitCode: 0, payload: { ...payload, status: 'pass', humanOverride: 'human-approved', originalStatus: status } });
|
|
@@ -38,7 +38,7 @@ function sectionMutation(content) {
|
|
|
38
38
|
const english = /^##\s+Activity Log\s*$/m.test(content);
|
|
39
39
|
return [{
|
|
40
40
|
kind: 'section', aliases: WORKFLOW_WARNING_HEADINGS, heading: english ? 'Workflow Warnings' : '工作流告警',
|
|
41
|
-
body: `| ${WORKFLOW_WARNING_COLUMNS.join(' | ')} |\n
|
|
41
|
+
body: `| ${WORKFLOW_WARNING_COLUMNS.join(' | ')} |\n|----|------|------|----------|------|--------|---------|--------|-------------|------------|------------|`
|
|
42
42
|
}];
|
|
43
43
|
}
|
|
44
44
|
function rowMutation(row) {
|
package/dist/lib/task/write.js
CHANGED
|
@@ -6,6 +6,7 @@ import { resolveTaskRef } from './resolve-ref.js';
|
|
|
6
6
|
import { allowsManualOverride } from './guard-override.js';
|
|
7
7
|
import { mutateTableRow, upsertSection } from './sections.js';
|
|
8
8
|
import { validateCurrentTaskContract } from './current-contract.js';
|
|
9
|
+
import { invalidationBlocks, parseInvalidationDocument } from './invalidation.js';
|
|
9
10
|
const DEFAULT_FILE_SYSTEM = {
|
|
10
11
|
readFileSync: (file) => fs.readFileSync(file, 'utf8'),
|
|
11
12
|
statModeSync: (file) => fs.statSync(file).mode,
|
|
@@ -90,6 +91,16 @@ function writeTask(request, options = {}) {
|
|
|
90
91
|
if (!contract.ok) {
|
|
91
92
|
return failure(request, identity, contract.code, contract.message);
|
|
92
93
|
}
|
|
94
|
+
if (invalidationBlocks(contract.invalidation)
|
|
95
|
+
&& options.invalidationContext !== 'source-completion'
|
|
96
|
+
&& options.invalidationContext !== 'reconcile') {
|
|
97
|
+
return failure(request, identity, 'TASK_INVALIDATION_BLOCKED', 'task has an incomplete artifact invalidation operation; reconcile it before writing downstream state');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const invalidation = parseInvalidationDocument(original);
|
|
102
|
+
if (!invalidation.ok)
|
|
103
|
+
return failure(request, identity, 'TASK_INVALIDATION_INVALID', invalidation.message);
|
|
93
104
|
}
|
|
94
105
|
let candidate = original;
|
|
95
106
|
const operations = [];
|
package/dist/lib/version.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import semver from 'semver';
|
|
2
3
|
const packageJsonUrl = [
|
|
3
4
|
new URL('../package.json', import.meta.url),
|
|
4
5
|
new URL('../../package.json', import.meta.url),
|
|
@@ -9,8 +10,17 @@ if (!packageJsonUrl) {
|
|
|
9
10
|
const { version } = JSON.parse(readFileSync(packageJsonUrl, 'utf8'));
|
|
10
11
|
const VERSION = `v${version}`;
|
|
11
12
|
const AGENT_INFRA_VERSION_PATTERN = /^v\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
13
|
+
const LEGACY_COMPATIBILITY_CUTOFF_VERSION = '1.0.0';
|
|
12
14
|
function isValidAgentInfraVersion(value) {
|
|
13
15
|
return typeof value === 'string' && AGENT_INFRA_VERSION_PATTERN.test(value);
|
|
14
16
|
}
|
|
15
|
-
|
|
17
|
+
function isLegacyCompatibilityEnabled(runtimeVersion = VERSION) {
|
|
18
|
+
const normalized = runtimeVersion.startsWith('v') ? runtimeVersion.slice(1) : runtimeVersion;
|
|
19
|
+
const parsed = semver.valid(normalized);
|
|
20
|
+
return parsed !== null && semver.lt(parsed, LEGACY_COMPATIBILITY_CUTOFF_VERSION);
|
|
21
|
+
}
|
|
22
|
+
function legacyCompatibilityError(resource, runtimeVersion = VERSION) {
|
|
23
|
+
return Object.assign(new Error(`PLATFORM_IDENTITY_LEGACY_UNSUPPORTED: ${resource} requires migration to the current schema before v${LEGACY_COMPATIBILITY_CUTOFF_VERSION} runtime ${runtimeVersion}`), { code: 'PLATFORM_IDENTITY_LEGACY_UNSUPPORTED' });
|
|
24
|
+
}
|
|
25
|
+
export { LEGACY_COMPATIBILITY_CUTOFF_VERSION, VERSION, isLegacyCompatibilityEnabled, isValidAgentInfraVersion, legacyCompatibilityError };
|
|
16
26
|
//# sourceMappingURL=version.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"protocolVersion": 3,
|
|
3
|
-
"packageVersion": "0.9.
|
|
4
|
-
"sourceInputHash": "
|
|
5
|
-
"internalExecutableBuildHash": "
|
|
3
|
+
"packageVersion": "0.9.14",
|
|
4
|
+
"sourceInputHash": "a3cf306ad6576904e6ef7d962e51245c6684540bd41358beaebf8209c00f3cfc",
|
|
5
|
+
"internalExecutableBuildHash": "14773c26aea5022af695f2e3ca4a39bed3c87c1eab04347aeded028745d8ded1"
|
|
6
6
|
}
|
package/lib/agent-client.ts
CHANGED
|
@@ -11,6 +11,9 @@ import { AGENT_CLIENT_IDS, isAgentClientId } from './agent-clients/types.ts';
|
|
|
11
11
|
import type { AgentClientState } from './agent-clients/types.ts';
|
|
12
12
|
import { closePrompt, multiSelect } from './prompt.ts';
|
|
13
13
|
import { resolveTemplateDir } from './paths.ts';
|
|
14
|
+
import { PUBLIC_CLI_ROUTE_SELECTORS } from './internal/cli-route-inventory.ts';
|
|
15
|
+
|
|
16
|
+
const AGENT_CLIENT_OPERATIONS = PUBLIC_CLI_ROUTE_SELECTORS['agent-client'];
|
|
14
17
|
|
|
15
18
|
const USAGE = `Usage: ai agent-client <operation>
|
|
16
19
|
|
|
@@ -107,6 +110,12 @@ async function cmdAgentClient(args: string[]): Promise<number> {
|
|
|
107
110
|
process.stdout.write(USAGE);
|
|
108
111
|
return 0;
|
|
109
112
|
}
|
|
113
|
+
if (!AGENT_CLIENT_OPERATIONS.includes(operation as typeof AGENT_CLIENT_OPERATIONS[number])) {
|
|
114
|
+
throw new AgentClientCommandError(
|
|
115
|
+
'AGENT_CLIENT_OPERATION_INVALID',
|
|
116
|
+
`Unknown operation '${operation}'`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
110
119
|
|
|
111
120
|
if (operation === 'list') {
|
|
112
121
|
if (args.length !== 1) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { listEnabledAgentClientAdapters } from './registry.ts';
|
|
2
2
|
import { renderAgentClientInvocation } from './invocation.ts';
|
|
3
3
|
import semver from 'semver';
|
|
4
|
+
import { isTaskScopeSkill } from '../task/skill-scope.ts';
|
|
4
5
|
import type { CustomTUI } from './custom-tuis.ts';
|
|
5
6
|
import type { AgentClientId, AgentClientState } from './types.ts';
|
|
6
7
|
|
|
@@ -45,7 +46,11 @@ function renderNextStepCommands(
|
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
const args = [
|
|
48
|
-
...(input.taskRef === undefined
|
|
49
|
+
...(input.taskRef === undefined
|
|
50
|
+
? []
|
|
51
|
+
: isTaskScopeSkill(input.skillName)
|
|
52
|
+
? ['--task', input.taskRef]
|
|
53
|
+
: [input.taskRef]),
|
|
49
54
|
...(input.version === undefined ? [] : [input.version])
|
|
50
55
|
];
|
|
51
56
|
|
package/lib/decide.ts
CHANGED
|
@@ -79,11 +79,11 @@ export async function decide(args: string[], options: DecideOptions = {}): Promi
|
|
|
79
79
|
metadataProvider: () => ({ timestamp: now, agentInfraVersion: options.version ?? VERSION })
|
|
80
80
|
};
|
|
81
81
|
let result;
|
|
82
|
-
const execute = () => {
|
|
82
|
+
const execute = async () => {
|
|
83
83
|
let current = applyHumanDecision(request, writeOptions);
|
|
84
84
|
if (current.status !== 'failed' || !parsedDecision.overrideTicket) return current;
|
|
85
85
|
if (!parsedDecision.overrideTarget || !parsedDecision.overrideScope) throw new Error('override ticket requires --override-target and --override-scope');
|
|
86
|
-
const consumed = consumeHumanOverride({
|
|
86
|
+
const consumed = await consumeHumanOverride({
|
|
87
87
|
taskRef: resolved.taskId,
|
|
88
88
|
ticketId: parsedDecision.overrideTicket,
|
|
89
89
|
failureId: failureId('decision-intent', current.error?.code ?? 'TASK_STATE_MISMATCH'),
|
|
@@ -102,7 +102,7 @@ export async function decide(args: string[], options: DecideOptions = {}): Promi
|
|
|
102
102
|
if (consumed.status === 'failed') throw new Error(consumed.error.message);
|
|
103
103
|
return current;
|
|
104
104
|
};
|
|
105
|
-
result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-decision', execute);
|
|
105
|
+
result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-decision', execute);
|
|
106
106
|
if (result.error) throw new Error(result.error.message);
|
|
107
107
|
return 0;
|
|
108
108
|
} catch (error) {
|
package/lib/init.ts
CHANGED
|
@@ -40,7 +40,7 @@ type AgentConfig = {
|
|
|
40
40
|
project: string;
|
|
41
41
|
org: string;
|
|
42
42
|
language: string;
|
|
43
|
-
platform: { type: string };
|
|
43
|
+
platform: { type: string; providers?: Record<string, unknown> };
|
|
44
44
|
templateVersion: string;
|
|
45
45
|
sandbox: Record<string, unknown>;
|
|
46
46
|
task: { shortIdLength: number };
|
|
@@ -9,6 +9,7 @@ import { normalizeCustomTUIs } from '../agent-clients/custom-tuis.ts';
|
|
|
9
9
|
import { renderNextStepCommands } from '../agent-clients/next-steps.ts';
|
|
10
10
|
import { getAgentClientModelSelection } from '../agent-clients/registry.ts';
|
|
11
11
|
import { isAgentClientId } from '../agent-clients/types.ts';
|
|
12
|
+
import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.ts';
|
|
12
13
|
|
|
13
14
|
const USAGE = 'Usage: agent-infra-internal agent-client <next-steps|model-selection> [options]\n';
|
|
14
15
|
|
|
@@ -35,7 +36,7 @@ function parseArgs(args: string[]): ParsedArgs | null {
|
|
|
35
36
|
process.stdout.write(USAGE);
|
|
36
37
|
return null;
|
|
37
38
|
}
|
|
38
|
-
if (args[0]
|
|
39
|
+
if (!internalHandlerRoute('agent-client', 'next-steps', args[0] ?? '')) {
|
|
39
40
|
failure('AGENT_CLIENT_PAYLOAD_INVALID', "operation must be 'next-steps'");
|
|
40
41
|
return null;
|
|
41
42
|
}
|
|
@@ -84,7 +85,8 @@ function parseArgs(args: string[]): ParsedArgs | null {
|
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
function agentClient(args: string[] = []): void {
|
|
87
|
-
if (
|
|
88
|
+
if (!ensureInternalHandlerRoute('agent-client', args)) return;
|
|
89
|
+
if (internalHandlerRoute('agent-client', 'model-selection', args[0] ?? '')) {
|
|
88
90
|
const values: Record<string, string> = {};
|
|
89
91
|
const seen = new Set<string>();
|
|
90
92
|
for (let index = 1; index < args.length; index += 1) {
|