@fitlab-ai/agent-infra 0.9.11 → 0.9.13
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 +13 -13
- package/README.zh-CN.md +13 -13
- package/dist/bin/internal-cli.js +29 -19
- package/dist/lib/agent-clients/adapters/codex-lifecycle/build-identity.js +71 -10
- package/dist/lib/agent-clients/next-steps.js +6 -1
- package/dist/lib/decide.js +3 -3
- package/dist/lib/defaults.json +4 -0
- package/dist/lib/git/workflow.js +43 -1
- package/dist/lib/init.js +1 -0
- package/dist/lib/internal/git-workflow.js +8 -1
- package/dist/lib/internal/platform-checks.js +3 -3
- package/dist/lib/internal/platform-comment.js +9 -9
- package/dist/lib/internal/platform-context.js +2 -2
- package/dist/lib/internal/platform-issue.js +8 -9
- package/dist/lib/internal/platform-pr-review.js +10 -10
- package/dist/lib/internal/platform-pr.js +68 -23
- package/dist/lib/internal/platform-release-notes.js +3 -3
- package/dist/lib/internal/pr-review-grade.js +11 -9
- package/dist/lib/internal/release-workflow.js +4 -4
- package/dist/lib/internal/sandbox-control.js +30 -4
- package/dist/lib/internal/task-activity.js +3 -3
- package/dist/lib/internal/task-artifact.js +76 -24
- package/dist/lib/internal/task-create.js +2 -2
- package/dist/lib/internal/task-delivery.js +59 -0
- package/dist/lib/internal/task-event.js +6 -3
- package/dist/lib/internal/task-finalization.js +2 -2
- package/dist/lib/internal/task-invalidation.js +60 -0
- package/dist/lib/internal/task-ledger.js +9 -6
- package/dist/lib/internal/task-lifecycle.js +2 -2
- package/dist/lib/internal/task-override.js +4 -4
- package/dist/lib/internal/task-review.js +3 -3
- package/dist/lib/internal/task-verify.js +6 -6
- package/dist/lib/internal/task-warning.js +3 -3
- package/dist/lib/platform/adapters.js +1 -3
- package/dist/lib/platform/change-request-git-evidence.js +27 -7
- package/dist/lib/platform/completion-backfill.js +6 -5
- package/dist/lib/platform/context.js +70 -130
- package/dist/lib/platform/github-client.js +8 -2
- package/dist/lib/platform/github-provider.js +903 -0
- package/dist/lib/platform/in-label-sync.js +143 -0
- package/dist/lib/platform/issue-comments.js +94 -41
- 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 +551 -0
- package/dist/lib/platform/pr-checks.js +124 -106
- package/dist/lib/platform/pr-review.js +88 -72
- package/dist/lib/platform/pr-summary.js +523 -49
- package/dist/lib/platform/provider-bridge.js +45 -0
- package/dist/lib/platform/provider-contract.d.ts +487 -0
- package/dist/lib/platform/provider-contract.js +95 -0
- package/dist/lib/platform/provider-loader.js +251 -0
- package/dist/lib/platform/provider-validation.js +504 -0
- package/dist/lib/platform/pull-request-metadata.js +8 -6
- package/dist/lib/platform/pull-requests.js +1050 -502
- package/dist/lib/platform/release-notes.js +78 -55
- package/dist/lib/platform/releases.js +79 -50
- package/dist/lib/platform/resource-identity.d.ts +26 -0
- package/dist/lib/platform/resource-identity.js +92 -0
- package/dist/lib/platform/task-identities.js +31 -0
- package/dist/lib/platform/verification-required.js +22 -12
- package/dist/lib/platform/verification-sync.js +118 -239
- package/dist/lib/pr-review/evidence-grading.js +30 -9
- package/dist/lib/run/index.js +63 -23
- package/dist/lib/sandbox/config.js +5 -0
- package/dist/lib/sandbox/control/client.js +96 -15
- package/dist/lib/sandbox/control/executor.js +3 -3
- package/dist/lib/sandbox/control/lifecycle.js +29 -7
- package/dist/lib/sandbox/control/protocol.js +77 -0
- package/dist/lib/sandbox/control/server.js +398 -25
- package/dist/lib/sandbox/control/state.js +204 -1
- package/dist/lib/server/process-state.js +2 -2
- package/dist/lib/server/protocol.js +38 -1
- package/dist/lib/task/activity-log.js +8 -1
- package/dist/lib/task/artifact-lifecycle.js +35 -7
- package/dist/lib/task/capabilities.js +239 -0
- package/dist/lib/task/commands/status.js +32 -0
- package/dist/lib/task/commit-intent.js +100 -0
- package/dist/lib/task/commit-operation.js +207 -102
- package/dist/lib/task/control-authority.js +8 -5
- package/dist/lib/task/create-service.js +8 -8
- package/dist/lib/task/create.js +33 -7
- package/dist/lib/task/current-contract.js +5 -1
- package/dist/lib/task/decision-details.js +3 -48
- package/dist/lib/task/delivery-target.js +97 -0
- package/dist/lib/task/delivery.js +153 -0
- package/dist/lib/task/events.js +297 -17
- package/dist/lib/task/finalization.js +37 -13
- package/dist/lib/task/human-override.js +61 -36
- 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/lifecycle.js +106 -9
- package/dist/lib/task/local-artifact-finalization.js +374 -0
- package/dist/lib/task/orchestration.js +100 -151
- package/dist/lib/task/pr-delivery-fact.js +183 -0
- package/dist/lib/task/review-finalization.js +4 -8
- package/dist/lib/task/review-fingerprint.js +32 -2
- package/dist/lib/task/rework-intent.js +138 -0
- package/dist/lib/task/skill-scope.js +23 -0
- package/dist/lib/task/task-execution-lock.js +27 -17
- package/dist/lib/task/verification-engine.js +89 -38
- package/dist/lib/task/verification-review.js +1 -1
- 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/update.js +9 -0
- package/dist/lib/version.js +11 -1
- package/dist/lifecycle-build-manifest.json +3 -3
- package/lib/agent-clients/adapters/codex-lifecycle/build-identity.ts +105 -10
- package/lib/agent-clients/adapters/codex-lifecycle/manifest-files.json +12 -1
- package/lib/agent-clients/next-steps.ts +6 -1
- package/lib/decide.ts +3 -3
- package/lib/defaults.json +4 -0
- package/lib/git/workflow.ts +38 -1
- package/lib/init.ts +4 -1
- package/lib/internal/git-workflow.ts +7 -1
- package/lib/internal/platform-checks.ts +3 -3
- package/lib/internal/platform-comment.ts +8 -8
- package/lib/internal/platform-context.ts +2 -2
- package/lib/internal/platform-issue.ts +7 -8
- package/lib/internal/platform-pr-review.ts +9 -9
- package/lib/internal/platform-pr.ts +53 -21
- package/lib/internal/platform-release-notes.ts +3 -3
- package/lib/internal/pr-review-grade.ts +10 -8
- package/lib/internal/release-workflow.ts +4 -4
- package/lib/internal/sandbox-control.ts +27 -3
- package/lib/internal/task-activity.ts +3 -3
- package/lib/internal/task-artifact.ts +65 -22
- package/lib/internal/task-create.ts +2 -2
- package/lib/internal/task-delivery.ts +53 -0
- package/lib/internal/task-event.ts +6 -3
- package/lib/internal/task-finalization.ts +3 -3
- package/lib/internal/task-invalidation.ts +39 -0
- package/lib/internal/task-ledger.ts +11 -8
- package/lib/internal/task-lifecycle.ts +2 -2
- package/lib/internal/task-override.ts +6 -6
- package/lib/internal/task-review.ts +3 -3
- package/lib/internal/task-verify.ts +6 -6
- package/lib/internal/task-warning.ts +3 -3
- package/lib/platform/adapters.ts +3 -2
- package/lib/platform/change-request-git-evidence.ts +36 -9
- package/lib/platform/completion-backfill.ts +9 -8
- package/lib/platform/context.ts +97 -134
- package/lib/platform/github-client.ts +10 -3
- package/lib/platform/github-provider.ts +910 -0
- package/lib/platform/in-label-sync.ts +208 -0
- package/lib/platform/issue-comments.ts +97 -47
- 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 +645 -0
- package/lib/platform/pr-checks.ts +129 -107
- package/lib/platform/pr-review.ts +88 -85
- package/lib/platform/pr-summary.ts +562 -52
- package/lib/platform/provider-bridge.ts +82 -0
- package/lib/platform/provider-contract.ts +536 -0
- package/lib/platform/provider-loader.ts +307 -0
- package/lib/platform/provider-validation.ts +529 -0
- package/lib/platform/pull-request-metadata.ts +10 -7
- package/lib/platform/pull-requests.ts +1126 -505
- package/lib/platform/release-notes.ts +76 -59
- package/lib/platform/releases.ts +77 -43
- package/lib/platform/resource-identity.ts +121 -0
- package/lib/platform/task-identities.ts +40 -0
- package/lib/platform/types.ts +4 -2
- package/lib/platform/verification-required.ts +21 -13
- package/lib/platform/verification-sync.ts +118 -293
- package/lib/pr-review/evidence-grading.ts +31 -11
- package/lib/run/index.ts +57 -22
- package/lib/sandbox/config.ts +7 -0
- package/lib/sandbox/control/client.ts +105 -15
- package/lib/sandbox/control/executor.ts +4 -4
- package/lib/sandbox/control/lifecycle.ts +30 -8
- package/lib/sandbox/control/protocol.ts +113 -0
- package/lib/sandbox/control/server.ts +431 -23
- package/lib/sandbox/control/state.ts +251 -1
- package/lib/server/process-state.ts +2 -2
- package/lib/server/protocol.ts +36 -1
- package/lib/task/activity-log.ts +8 -0
- package/lib/task/artifact-lifecycle.ts +34 -8
- package/lib/task/capabilities.ts +262 -0
- package/lib/task/commands/status.ts +38 -0
- package/lib/task/commit-intent.ts +137 -0
- package/lib/task/commit-operation.ts +186 -88
- package/lib/task/control-authority.ts +11 -8
- package/lib/task/create-service.ts +8 -8
- package/lib/task/create.ts +34 -9
- package/lib/task/current-contract.ts +6 -1
- package/lib/task/decision-details.ts +8 -64
- package/lib/task/delivery-target.ts +130 -0
- package/lib/task/delivery.ts +160 -0
- package/lib/task/events.ts +296 -16
- package/lib/task/finalization.ts +50 -14
- package/lib/task/human-override.ts +73 -46
- 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/lifecycle.ts +93 -4
- package/lib/task/local-artifact-finalization.ts +563 -0
- package/lib/task/orchestration.ts +110 -146
- package/lib/task/pr-delivery-fact.ts +237 -0
- package/lib/task/review-finalization.ts +4 -14
- package/lib/task/review-fingerprint.ts +33 -2
- package/lib/task/rework-intent.ts +165 -0
- package/lib/task/skill-scope.ts +24 -0
- package/lib/task/task-execution-lock.ts +23 -14
- package/lib/task/verification-engine.ts +95 -43
- package/lib/task/verification-review.ts +2 -0
- 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 +11 -1
- package/lib/version.ts +15 -1
- package/package.json +7 -1
- package/templates/.agents/rules/README.en.md +4 -2
- package/templates/.agents/rules/README.zh-CN.md +4 -2
- package/templates/.agents/rules/create-issue.en.md +11 -2
- package/templates/.agents/rules/create-issue.zh-CN.md +24 -2
- package/templates/.agents/rules/issue-pr-commands.en.md +4 -17
- package/templates/.agents/rules/issue-pr-commands.zh-CN.md +1 -1
- package/templates/.agents/rules/issue-sync.en.md +28 -5
- package/templates/.agents/rules/issue-sync.zh-CN.md +64 -5
- package/templates/.agents/rules/label-milestone-setup.en.md +15 -2
- package/templates/.agents/rules/label-milestone-setup.zh-CN.md +15 -2
- package/templates/.agents/rules/local-artifact-repair.en.md +53 -0
- package/templates/.agents/rules/local-artifact-repair.zh-CN.md +53 -0
- package/templates/.agents/rules/milestone-inference.en.md +12 -2
- package/templates/.agents/rules/milestone-inference.zh-CN.md +25 -3
- package/templates/.agents/rules/pr-sync.en.md +28 -13
- package/templates/.agents/rules/pr-sync.zh-CN.md +39 -5
- package/templates/.agents/rules/release-commands.en.md +42 -3
- package/templates/.agents/rules/release-commands.zh-CN.md +42 -3
- package/templates/.agents/rules/security-alerts.en.md +17 -2
- package/templates/.agents/rules/security-alerts.zh-CN.md +17 -2
- package/templates/.agents/rules/sync-content-generation.en.md +8 -0
- package/templates/.agents/rules/sync-content-generation.zh-CN.md +8 -0
- package/templates/.agents/rules/task-management.en.md +1 -1
- package/templates/.agents/rules/task-management.zh-CN.md +1 -1
- 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/scripts/security-alerts.github.sh +151 -0
- package/templates/.agents/scripts/security-alerts.sh +31 -0
- package/templates/.agents/skills/analyze-task/SKILL.en.md +14 -3
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +11 -3
- 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 +32 -10
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +35 -13
- package/templates/.agents/skills/code-task/config/verify.en.json +1 -0
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +1 -0
- package/templates/.agents/skills/commit/SKILL.en.md +3 -3
- package/templates/.agents/skills/commit/SKILL.zh-CN.md +3 -3
- package/templates/.agents/skills/commit/config/verify.json +1 -1
- package/templates/.agents/skills/commit/reference/commit-orchestration.en.md +3 -3
- package/templates/.agents/skills/commit/reference/commit-orchestration.zh-CN.md +3 -3
- 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 +4 -4
- package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +4 -4
- package/templates/.agents/skills/commit/reference/task-status-update.en.md +2 -2
- package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +2 -2
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +7 -4
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +7 -4
- package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +5 -4
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +5 -4
- package/templates/.agents/skills/complete-task/SKILL.en.md +31 -13
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +30 -13
- package/templates/.agents/skills/complete-task/reference/external-delivery.en.md +2 -2
- package/templates/.agents/skills/complete-task/reference/external-delivery.zh-CN.md +2 -2
- package/templates/.agents/skills/create-pr/SKILL.en.md +11 -10
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +11 -11
- 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 +1 -0
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +1 -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 +9 -10
- package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +9 -10
- package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +57 -1
- package/templates/.agents/skills/init-labels/scripts/init-labels.sh +27 -1
- package/templates/.agents/skills/init-milestones/SKILL.en.md +3 -5
- package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +3 -5
- package/templates/.agents/skills/plan-task/SKILL.en.md +14 -3
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +11 -3
- package/templates/.agents/skills/review-analysis/SKILL.en.md +6 -5
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +6 -5
- package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +18 -0
- package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +18 -0
- package/templates/.agents/skills/review-code/SKILL.en.md +10 -9
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +10 -9
- package/templates/.agents/skills/review-code/reference/output-templates.en.md +19 -1
- package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +19 -1
- package/templates/.agents/skills/review-code/reference/report-template.en.md +4 -2
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +4 -2
- package/templates/.agents/skills/review-plan/SKILL.en.md +6 -5
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +6 -5
- package/templates/.agents/skills/review-plan/reference/output-templates.en.md +18 -0
- package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +18 -0
- package/templates/.agents/skills/review-pr/SKILL.en.md +1 -0
- package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +1 -0
- package/templates/.agents/skills/review-pr/reference/evidence-grading.en.md +2 -2
- package/templates/.agents/skills/review-pr/reference/evidence-grading.zh-CN.md +2 -2
- package/templates/.agents/skills/run-manual-validation/SKILL.en.md +5 -2
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +5 -2
- package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
- package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +4 -0
- package/templates/.agents/skills/watch-pr/SKILL.en.md +6 -6
- package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +6 -6
- 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 +23 -2
- package/templates/.agents/templates/task.zh-CN.md +23 -2
- package/templates/.agents/workflows/bug-fix.en.yaml +9 -8
- package/templates/.agents/workflows/bug-fix.zh-CN.yaml +9 -8
- package/templates/.agents/workflows/feature-development.en.yaml +9 -8
- package/templates/.agents/workflows/feature-development.zh-CN.yaml +9 -8
- package/templates/.agents/workflows/refactoring.en.yaml +9 -8
- package/templates/.agents/workflows/refactoring.zh-CN.yaml +9 -8
- package/templates/.github/workflows/pr-label.yml +7 -26
- package/templates/.agents/rules/create-issue.github.en.md +0 -14
- package/templates/.agents/rules/create-issue.github.zh-CN.md +0 -27
- package/templates/.agents/rules/issue-pr-commands.github.en.md +0 -34
- package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +0 -49
- package/templates/.agents/rules/issue-sync.github.en.md +0 -40
- package/templates/.agents/rules/issue-sync.github.zh-CN.md +0 -76
- package/templates/.agents/rules/label-milestone-setup.github.en.md +0 -60
- package/templates/.agents/rules/label-milestone-setup.github.zh-CN.md +0 -60
- package/templates/.agents/rules/milestone-inference.github.en.md +0 -15
- package/templates/.agents/rules/milestone-inference.github.zh-CN.md +0 -27
- package/templates/.agents/rules/pr-checks-commands.github.en.md +0 -18
- package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +0 -34
- package/templates/.agents/rules/pr-sync.github.en.md +0 -43
- package/templates/.agents/rules/pr-sync.github.zh-CN.md +0 -69
- package/templates/.agents/rules/release-commands.github.en.md +0 -44
- package/templates/.agents/rules/release-commands.github.zh-CN.md +0 -44
- package/templates/.agents/rules/security-alerts.github.en.md +0 -43
- package/templates/.agents/rules/security-alerts.github.zh-CN.md +0 -43
- /package/templates/.agents/rules/{issue-fields.github.en.md → issue-fields.en.md} +0 -0
- /package/templates/.agents/rules/{issue-fields.github.zh-CN.md → issue-fields.zh-CN.md} +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { reconcileTaskInvalidation } from '../task/invalidation-command.ts';
|
|
2
|
+
import { resolveTaskRef } from '../task/resolve-ref.ts';
|
|
3
|
+
import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
|
|
4
|
+
|
|
5
|
+
const USAGE = 'Usage: agent-infra-internal task-invalidation <task-ref> reconcile [--max-targets <n>] [--dry-run]\n';
|
|
6
|
+
|
|
7
|
+
function taskInvalidation(args: string[] = []): void {
|
|
8
|
+
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
9
|
+
const taskRef = args[0];
|
|
10
|
+
if (!taskRef || args[1] !== 'reconcile') {
|
|
11
|
+
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'INVALIDATION_PAYLOAD_INVALID', message: 'task ref and reconcile are required' } })}\n`);
|
|
12
|
+
process.stderr.write(USAGE);
|
|
13
|
+
process.exitCode = 1;
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
let maxTargets: number | undefined;
|
|
17
|
+
let dryRun = false;
|
|
18
|
+
for (let index = 2; index < args.length; index += 1) {
|
|
19
|
+
const flag = args[index]!;
|
|
20
|
+
if (flag === '--dry-run') { if (dryRun) { process.exitCode = 1; return; } dryRun = true; continue; }
|
|
21
|
+
if (flag !== '--max-targets') { process.exitCode = 1; return; }
|
|
22
|
+
const value = Number(args[++index]);
|
|
23
|
+
if (!Number.isInteger(value) || value < 1 || maxTargets !== undefined) { process.exitCode = 1; return; }
|
|
24
|
+
maxTargets = value;
|
|
25
|
+
}
|
|
26
|
+
const resolved = resolveTaskRef(taskRef);
|
|
27
|
+
if (!resolved.ok) { process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: resolved.code, message: resolved.message } })}\n`); process.exitCode = 1; return; }
|
|
28
|
+
try {
|
|
29
|
+
const result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-invalidation.reconcile', () => reconcileTaskInvalidation(taskRef, { ...(maxTargets === undefined ? {} : { maxTargets }), dryRun }));
|
|
30
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
31
|
+
if (result.status === 'failed') process.exitCode = 1;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
if (!(error instanceof TaskExecutionLockError)) throw error;
|
|
34
|
+
process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: error.code, message: error.message } })}\n`);
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { taskInvalidation };
|
|
@@ -7,12 +7,14 @@ import { LEDGER_SECTION_MISSING_CODE, LEDGER_SECTION_MISSING_MESSAGE, isReviewSt
|
|
|
7
7
|
import { resolveTaskRef } from '../task/resolve-ref.ts';
|
|
8
8
|
import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.ts';
|
|
9
9
|
|
|
10
|
-
const USAGE = `Usage: agent-infra-internal task-ledger <task-ref> <intent> [intent flags] [--dry-run]\n\nIntents: finding-upsert, finding-respond, finding-review, decision-next-id, decision-upsert, stage-status\n`;
|
|
10
|
+
const USAGE = `Usage: agent-infra-internal task-ledger <task-ref> <intent> [intent flags] [--dry-run]\n\nIntents: finding-upsert, finding-respond, finding-review, decision-next-id, decision-upsert, rework-intent-upsert, stage-status\n`;
|
|
11
11
|
const FLAGS: Record<string, string> = {
|
|
12
12
|
'--stage': 'stage', '--review-artifact': 'reviewArtifact', '--ordinal': 'ordinal',
|
|
13
13
|
'--severity': 'severity', '--evidence': 'evidence', '--id': 'id', '--round': 'round',
|
|
14
|
-
'--status': 'status', '--artifact': 'artifact', '--needs-implementation': 'needsImplementation'
|
|
15
|
-
|
|
14
|
+
'--status': 'status', '--artifact': 'artifact', '--needs-implementation': 'needsImplementation',
|
|
15
|
+
'--intent-id': 'intentId', '--finding-id': 'findingId', '--source-artifact': 'sourceArtifact',
|
|
16
|
+
'--source-sha256': 'sourceSha256', '--target': 'target',
|
|
17
|
+
'--override-ticket': 'overrideTicket', '--override-target': 'overrideTarget', '--override-scope': 'overrideScope'
|
|
16
18
|
};
|
|
17
19
|
const NUMERIC = new Set(['ordinal', 'round']);
|
|
18
20
|
const BOOLEAN = new Set(['needsImplementation']);
|
|
@@ -23,11 +25,11 @@ function usageFailure(message: string): void {
|
|
|
23
25
|
process.exitCode = 1;
|
|
24
26
|
}
|
|
25
27
|
|
|
26
|
-
function taskLedger(args: string[] = []): void {
|
|
28
|
+
async function taskLedger(args: string[] = []): Promise<void> {
|
|
27
29
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
28
30
|
const [taskRef, kind] = args;
|
|
29
31
|
if (!taskRef || !kind) { usageFailure('task ref and intent are required'); return; }
|
|
30
|
-
if (!['finding-upsert', 'finding-respond', 'finding-review', 'decision-next-id', 'decision-upsert', 'stage-status'].includes(kind)) {
|
|
32
|
+
if (!['finding-upsert', 'finding-respond', 'finding-review', 'decision-next-id', 'decision-upsert', 'rework-intent-upsert', 'stage-status'].includes(kind)) {
|
|
31
33
|
usageFailure(`unknown ledger intent '${kind}'`); return;
|
|
32
34
|
}
|
|
33
35
|
const values: Record<string, unknown> = { kind, taskRef };
|
|
@@ -55,13 +57,14 @@ function taskLedger(args: string[] = []): void {
|
|
|
55
57
|
'finding-review': ['id', 'status', 'evidence'],
|
|
56
58
|
'decision-next-id': [],
|
|
57
59
|
'decision-upsert': ['id', 'stage', 'artifact'],
|
|
60
|
+
'rework-intent-upsert': ['intentId', 'findingId', 'sourceArtifact', 'sourceSha256', 'target'],
|
|
58
61
|
'stage-status': ['stage']
|
|
59
62
|
};
|
|
60
63
|
const optional: Record<string, string[]> = {
|
|
61
64
|
'finding-review': ['needsImplementation'],
|
|
62
65
|
'decision-upsert': ['needsImplementation']
|
|
63
66
|
};
|
|
64
|
-
const overrideFields = kind === 'stage-status' || kind === 'decision-next-id'
|
|
67
|
+
const overrideFields = kind === 'stage-status' || kind === 'decision-next-id' || kind === 'rework-intent-upsert'
|
|
65
68
|
? []
|
|
66
69
|
: ['overrideTicket', 'overrideTarget', 'overrideScope'];
|
|
67
70
|
const allowed = new Set(['kind', 'taskRef', 'dryRun', ...required[kind]!, ...(optional[kind] ?? []), ...overrideFields]);
|
|
@@ -106,11 +109,11 @@ function taskLedger(args: string[] = []): void {
|
|
|
106
109
|
let result;
|
|
107
110
|
let humanOverride: unknown = null;
|
|
108
111
|
try {
|
|
109
|
-
result = withTaskExecutionLock(lockResolved.repoRoot, lockResolved.taskId, `task-ledger.${kind}`, () => {
|
|
112
|
+
result = await withTaskExecutionLock(lockResolved.repoRoot, lockResolved.taskId, `task-ledger.${kind}`, async () => {
|
|
110
113
|
let current = applyLedgerIntent(values as LedgerIntent);
|
|
111
114
|
if (current.status !== 'failed' || !values.overrideTicket) return current;
|
|
112
115
|
if (!values.overrideTarget || !values.overrideScope) { usageFailure('override ticket requires target and scope'); return current; }
|
|
113
|
-
const consumed = consumeHumanOverride({
|
|
116
|
+
const consumed = await consumeHumanOverride({
|
|
114
117
|
taskRef,
|
|
115
118
|
ticketId: String(values.overrideTicket),
|
|
116
119
|
failureId: failureId('ledger-intent', current.error?.code ?? 'TASK_STATE_MISMATCH'),
|
|
@@ -21,7 +21,7 @@ function parseFailure(error: unknown): string {
|
|
|
21
21
|
return message.replace(/^TASK_CONTROL_OPERATION_INVALID: /u, '');
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
function taskLifecycle(args: string[] = []): void {
|
|
24
|
+
async function taskLifecycle(args: string[] = []): Promise<void> {
|
|
25
25
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
26
26
|
|
|
27
27
|
let operation;
|
|
@@ -56,7 +56,7 @@ function taskLifecycle(args: string[] = []): void {
|
|
|
56
56
|
repoRoot = resolved.repoRoot;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
const result = dispatchTaskControlOperation(
|
|
59
|
+
const result = await dispatchTaskControlOperation(
|
|
60
60
|
createDirectHostExecutionContext({ repoRoot }),
|
|
61
61
|
operation
|
|
62
62
|
) as TaskLifecycleResult & { humanOverride?: unknown };
|
|
@@ -37,7 +37,7 @@ function usageFailure(message: string): void {
|
|
|
37
37
|
process.exitCode = 1;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
function taskOverride(args: string[] = []): void {
|
|
40
|
+
async function taskOverride(args: string[] = []): Promise<void> {
|
|
41
41
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
42
42
|
const [taskRef, operation] = args;
|
|
43
43
|
if (!taskRef || !operation || !['diagnose', 'issue', 'consume'].includes(operation)) {
|
|
@@ -76,17 +76,17 @@ function taskOverride(args: string[] = []): void {
|
|
|
76
76
|
let result;
|
|
77
77
|
try {
|
|
78
78
|
if (operation === 'diagnose') {
|
|
79
|
-
result = diagnoseHumanOverrideForTask(
|
|
79
|
+
result = await diagnoseHumanOverrideForTask(
|
|
80
80
|
taskRef,
|
|
81
81
|
values.failureId ? String(values.failureId) : undefined,
|
|
82
82
|
values.target ? String(values.target) : undefined
|
|
83
83
|
);
|
|
84
84
|
} else if (operation === 'issue') {
|
|
85
|
-
result = withTaskExecutionLock(
|
|
85
|
+
result = await withTaskExecutionLock(
|
|
86
86
|
resolved.repoRoot,
|
|
87
87
|
resolved.taskId,
|
|
88
88
|
'task-override.issue',
|
|
89
|
-
() => issueHumanOverride({
|
|
89
|
+
async () => issueHumanOverride({
|
|
90
90
|
taskRef,
|
|
91
91
|
failureId: String(values.failureId),
|
|
92
92
|
target: String(values.target),
|
|
@@ -103,11 +103,11 @@ function taskOverride(args: string[] = []): void {
|
|
|
103
103
|
} satisfies HumanOverrideRequest)
|
|
104
104
|
);
|
|
105
105
|
} else {
|
|
106
|
-
result = withTaskExecutionLock(
|
|
106
|
+
result = await withTaskExecutionLock(
|
|
107
107
|
resolved.repoRoot,
|
|
108
108
|
resolved.taskId,
|
|
109
109
|
'task-override.consume',
|
|
110
|
-
() => consumeHumanOverride({
|
|
110
|
+
async () => consumeHumanOverride({
|
|
111
111
|
taskRef,
|
|
112
112
|
ticketId: String(values.ticketId),
|
|
113
113
|
failureId: String(values.failureId),
|
|
@@ -16,7 +16,7 @@ function failUsage(message: string): void {
|
|
|
16
16
|
process.exitCode = 2;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
function taskReview(args: string[] = []): void {
|
|
19
|
+
async function taskReview(args: string[] = []): Promise<void> {
|
|
20
20
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
21
21
|
process.stdout.write(USAGE);
|
|
22
22
|
return;
|
|
@@ -78,11 +78,11 @@ function taskReview(args: string[] = []): void {
|
|
|
78
78
|
let result;
|
|
79
79
|
let humanOverride: unknown = null;
|
|
80
80
|
try {
|
|
81
|
-
result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-review.finalize-summary', () => {
|
|
81
|
+
result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-review.finalize-summary', async () => {
|
|
82
82
|
let current = finalizeReviewSummary({ taskRef: args[0]!, stage, artifact, orchestrated, dryRun }, { lockAlreadyHeld: true });
|
|
83
83
|
if (current.status !== 'failed' || !overrideTicket) return current;
|
|
84
84
|
if (!overrideTarget || !overrideScope) { failUsage('override ticket requires target and scope'); return current; }
|
|
85
|
-
const consumed = consumeHumanOverride({
|
|
85
|
+
const consumed = await consumeHumanOverride({
|
|
86
86
|
taskRef: args[0]!, ticketId: overrideTicket,
|
|
87
87
|
failureId: failureId('review-finalization', current.error?.code ?? 'TASK_STATE_MISMATCH'),
|
|
88
88
|
target: overrideTarget, scope: overrideScope
|
|
@@ -11,7 +11,7 @@ function fail(message: string): void {
|
|
|
11
11
|
process.exitCode = 1;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
function taskVerify(args: string[] = []): void {
|
|
14
|
+
async function taskVerify(args: string[] = []): Promise<void> {
|
|
15
15
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
16
16
|
if (!args[0] || !args[1] || args[0].startsWith('--') || args[1].startsWith('--')) { fail('task ref and verification event are required'); return; }
|
|
17
17
|
const taskRef = args[0];
|
|
@@ -41,8 +41,8 @@ function taskVerify(args: string[] = []): void {
|
|
|
41
41
|
let result;
|
|
42
42
|
let humanOverride: unknown = null;
|
|
43
43
|
try {
|
|
44
|
-
result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-verify.${event}`, () => {
|
|
45
|
-
let current = verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) });
|
|
44
|
+
result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-verify.${event}`, async () => {
|
|
45
|
+
let current = await verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) });
|
|
46
46
|
if (current.status === 'pass' || !overrideTicket) return current;
|
|
47
47
|
if (!overrideTarget || !overrideScope) { fail('override ticket requires target and scope'); return current; }
|
|
48
48
|
const failureProducer = current.status === 'blocked' || current.status === 'fail'
|
|
@@ -53,13 +53,13 @@ function taskVerify(args: string[] = []): void {
|
|
|
53
53
|
: current.status === 'fail'
|
|
54
54
|
? 'CHECK_FAILED'
|
|
55
55
|
: current.error?.code ?? 'VERIFY_TASK_STATE_MISMATCH';
|
|
56
|
-
const consumed = consumeHumanOverride({
|
|
56
|
+
const consumed = await consumeHumanOverride({
|
|
57
57
|
taskRef, ticketId: overrideTicket,
|
|
58
58
|
failureId: failureId(failureProducer, failureCode),
|
|
59
59
|
target: overrideTarget, scope: overrideScope
|
|
60
60
|
}, {
|
|
61
|
-
effectExecutor: (capability) => {
|
|
62
|
-
const retried = verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) }, { manualOverride: capability });
|
|
61
|
+
effectExecutor: async (capability) => {
|
|
62
|
+
const retried = await verifyTaskEvent({ taskRef, event, ...(artifact ? { artifact } : {}) }, { manualOverride: capability });
|
|
63
63
|
current = retried;
|
|
64
64
|
return retried.status !== 'pass'
|
|
65
65
|
? { code: 'OVERRIDE_EFFECT_FAILED', message: `${retried.error?.code ?? 'VERIFY_FAILED'}: ${retried.error?.message ?? 'manual verification effect failed'}` }
|
|
@@ -17,7 +17,7 @@ function usageFailure(message: string): void {
|
|
|
17
17
|
process.exitCode = 1;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
function taskWarning(args: string[] = []): void {
|
|
20
|
+
async function taskWarning(args: string[] = []): Promise<void> {
|
|
21
21
|
if (args[0] === '--help' || args[0] === '-h') { process.stdout.write(USAGE); return; }
|
|
22
22
|
const [taskRef, kind] = args;
|
|
23
23
|
if (!taskRef || !kind || !['add', 'set-status', 'list'].includes(kind)) { usageFailure('task ref and a valid intent are required'); return; }
|
|
@@ -54,11 +54,11 @@ function taskWarning(args: string[] = []): void {
|
|
|
54
54
|
let result;
|
|
55
55
|
let humanOverride: unknown = null;
|
|
56
56
|
try {
|
|
57
|
-
result = withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-warning.${kind}`, () => {
|
|
57
|
+
result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, `task-warning.${kind}`, async () => {
|
|
58
58
|
let current = applyWorkflowWarningIntent(values as WorkflowWarningIntent);
|
|
59
59
|
if (current.status !== 'failed' || !values.overrideTicket) return current;
|
|
60
60
|
if (!values.overrideTarget || !values.overrideScope) { usageFailure('override ticket requires target and scope'); return current; }
|
|
61
|
-
const consumed = consumeHumanOverride({
|
|
61
|
+
const consumed = await consumeHumanOverride({
|
|
62
62
|
taskRef, ticketId: String(values.overrideTicket),
|
|
63
63
|
failureId: failureId('workflow-warning', current.error?.code ?? 'TASK_STATE_MISMATCH'),
|
|
64
64
|
target: String(values.overrideTarget), scope: String(values.overrideScope)
|
package/lib/platform/adapters.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { PlatformError, PlatformResult } from './types.ts';
|
|
2
|
+
import type { ResourceIdentity } from './resource-identity.ts';
|
|
2
3
|
|
|
3
4
|
type PlatformAdapterContext = {
|
|
4
5
|
cwd: string;
|
|
@@ -28,6 +29,7 @@ type PlatformChangeRequestSnapshot = {
|
|
|
28
29
|
assignees: string[];
|
|
29
30
|
milestone: string | null;
|
|
30
31
|
mergeability?: PlatformMergeability;
|
|
32
|
+
identity?: ResourceIdentity;
|
|
31
33
|
};
|
|
32
34
|
|
|
33
35
|
type PlatformCheckSnapshot = {
|
|
@@ -105,8 +107,7 @@ function registerPlatformCapabilities(
|
|
|
105
107
|
'inspectChangeRequest' | 'inspectIssueClosingChangeRequests' | 'inspectRequiredChecks' | 'resolveChangeRequestGitEvidence'
|
|
106
108
|
>
|
|
107
109
|
): void {
|
|
108
|
-
const adapter = adapters.get(type);
|
|
109
|
-
if (!adapter) throw new Error(`Platform adapter '${type}' must be registered before its capabilities`);
|
|
110
|
+
const adapter = adapters.get(type) ?? { type } as PlatformAdapter;
|
|
110
111
|
adapters.set(type, { ...adapter, ...capabilities });
|
|
111
112
|
}
|
|
112
113
|
|
|
@@ -3,7 +3,13 @@ import os from "node:os";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { execFileSync, spawnSync } from "node:child_process";
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { resolvePlatformProviderContext } from './context.ts';
|
|
7
|
+
import {
|
|
8
|
+
providerError,
|
|
9
|
+
providerOperationContext,
|
|
10
|
+
unsupportedProviderOperation
|
|
11
|
+
} from './provider-bridge.ts';
|
|
12
|
+
import { isResourceIdentity } from './resource-identity.ts';
|
|
7
13
|
import { resolveReviewedHeadRelation } from "./merged-pr-equivalence.ts";
|
|
8
14
|
import type { ReviewedHeadRelation } from "./merged-pr-equivalence.ts";
|
|
9
15
|
import type { PullRequestSnapshot } from "./pull-requests.ts";
|
|
@@ -53,25 +59,46 @@ function validMergeIdentity(lastReviewedCommit: string, pullRequest: PullRequest
|
|
|
53
59
|
return null;
|
|
54
60
|
}
|
|
55
61
|
|
|
56
|
-
function resolveMaterializedReviewedHeadRelation(input: {
|
|
62
|
+
async function resolveMaterializedReviewedHeadRelation(input: {
|
|
57
63
|
cwd: string;
|
|
58
64
|
platformType: string | null;
|
|
59
65
|
lastReviewedCommit: string;
|
|
60
66
|
pullRequest: PullRequestSnapshot;
|
|
61
|
-
}): ReviewedHeadRelation {
|
|
67
|
+
}): Promise<ReviewedHeadRelation> {
|
|
62
68
|
const identityFailure = validMergeIdentity(input.lastReviewedCommit, input.pullRequest);
|
|
63
69
|
if (identityFailure) return identityFailure;
|
|
64
70
|
|
|
65
|
-
const
|
|
71
|
+
const loaded = await resolvePlatformProviderContext({
|
|
66
72
|
cwd: input.cwd,
|
|
67
|
-
|
|
68
|
-
number: input.pullRequest.number,
|
|
69
|
-
pullRequest: input.pullRequest
|
|
73
|
+
platformType: input.platformType || undefined
|
|
70
74
|
});
|
|
75
|
+
if (!loaded.ok) {
|
|
76
|
+
return blocked(
|
|
77
|
+
loaded.context.error?.code || 'PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE',
|
|
78
|
+
loaded.context.error?.message || 'Unable to resolve the configured platform provider'
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
const target = isResourceIdentity(input.pullRequest.identity)
|
|
82
|
+
? input.pullRequest.identity
|
|
83
|
+
: { kind: 'number' as const, value: input.pullRequest.number };
|
|
84
|
+
const operation = loaded.value.provider.changeRequests?.resolveGitEvidence
|
|
85
|
+
? await loaded.value.provider.changeRequests.resolveGitEvidence({
|
|
86
|
+
context: providerOperationContext(loaded.value),
|
|
87
|
+
target,
|
|
88
|
+
expected: {
|
|
89
|
+
baseSha: input.pullRequest.base.sha,
|
|
90
|
+
headSha: input.pullRequest.head.sha,
|
|
91
|
+
targetBranch: input.pullRequest.base.ref
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
: unsupportedProviderOperation(loaded.value.provider, 'changeRequests.resolveGitEvidence');
|
|
95
|
+
const source = operation.ok
|
|
96
|
+
? operation
|
|
97
|
+
: { ok: false as const, error: providerError(operation.error, 'PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE') };
|
|
71
98
|
if (!source.ok || !source.value) {
|
|
72
99
|
return blocked(
|
|
73
|
-
source.error?.code || "PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE",
|
|
74
|
-
source.error?.message || "Unable to resolve authoritative PR Git evidence"
|
|
100
|
+
('error' in source && source.error?.code) || "PR_MERGE_EVIDENCE_SOURCE_UNAVAILABLE",
|
|
101
|
+
('error' in source && source.error?.message) || "Unable to resolve authoritative PR Git evidence"
|
|
75
102
|
);
|
|
76
103
|
}
|
|
77
104
|
if (
|
|
@@ -9,11 +9,12 @@ import { getOpenWorkflowWarnings } from '../task/workflow-warnings.ts';
|
|
|
9
9
|
import { applyWorkflowWarningIntent } from '../task/workflow-warning-intents.ts';
|
|
10
10
|
import { captureTaskWriteMetadata } from '../task/write.ts';
|
|
11
11
|
import { syncPlatformComment } from './issue-comments.ts';
|
|
12
|
-
import type {
|
|
12
|
+
import type { PlatformClient } from './context.ts';
|
|
13
13
|
import { platformResult } from './types.ts';
|
|
14
14
|
import type { PlatformOperation, PlatformResult } from './types.ts';
|
|
15
|
+
import { taskIssueIdentity } from './task-identities.ts';
|
|
15
16
|
|
|
16
|
-
type CompletionBackfillOptions = { agent: string; cwd?: string; client?:
|
|
17
|
+
type CompletionBackfillOptions = { agent: string; cwd?: string; client?: PlatformClient };
|
|
17
18
|
type CompletionBackfillResult = PlatformResult & {
|
|
18
19
|
artifacts: Array<{ artifact: string; status: PlatformResult['status'] }>;
|
|
19
20
|
warnings: Array<{ id: string; status: string }>;
|
|
@@ -42,10 +43,10 @@ function excludedPrReview(taskDir: string, message: string): string | null {
|
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
function backfillCompletionComments(
|
|
46
|
+
async function backfillCompletionComments(
|
|
46
47
|
taskRef: string,
|
|
47
48
|
options: CompletionBackfillOptions
|
|
48
|
-
): CompletionBackfillResult {
|
|
49
|
+
): Promise<CompletionBackfillResult> {
|
|
49
50
|
const resolved = resolveTaskRef(taskRef, options.cwd ? { repoRoot: options.cwd } : {});
|
|
50
51
|
if (!resolved.ok) return result(platformResult('failed', {
|
|
51
52
|
error: { code: resolved.code, message: resolved.message, retryable: false }
|
|
@@ -59,16 +60,16 @@ function backfillCompletionComments(
|
|
|
59
60
|
}
|
|
60
61
|
}), [], []);
|
|
61
62
|
const initialContent = fs.readFileSync(resolved.taskMdPath, 'utf8');
|
|
62
|
-
const
|
|
63
|
-
if (!
|
|
64
|
-
error: { code: 'ISSUE_NOT_LINKED', message: 'Task has no valid
|
|
63
|
+
const issueIdentity = taskIssueIdentity(parseTaskFrontmatter(initialContent));
|
|
64
|
+
if (!issueIdentity) return result(platformResult('no-op', {
|
|
65
|
+
error: { code: 'ISSUE_NOT_LINKED', message: 'Task has no valid platform issue identity', retryable: false }
|
|
65
66
|
}), [], []);
|
|
66
67
|
|
|
67
68
|
const artifacts: CompletionBackfillResult['artifacts'] = [];
|
|
68
69
|
const operations: PlatformOperation[] = [];
|
|
69
70
|
let latest = platformResult('no-op', { error: null });
|
|
70
71
|
for (const artifact of inventory.artifacts) {
|
|
71
|
-
latest = syncPlatformComment(resolved.taskId, {
|
|
72
|
+
latest = await syncPlatformComment(resolved.taskId, {
|
|
72
73
|
kind: 'artifact',
|
|
73
74
|
artifact: artifact.name,
|
|
74
75
|
agent: options.agent,
|