@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
|
@@ -7,7 +7,7 @@ import { parseArtifactName, validateCompletedArtifact } from './artifact-lifecyc
|
|
|
7
7
|
import { LEDGER_SECTION_MISSING_CODE, LEDGER_SECTION_MISSING_MESSAGE, parseLedgerDocument, summarizeLedgerStage, validateLedgerRows } from './ledger.ts';
|
|
8
8
|
import type { LedgerStageStatus, ReviewStage } from './ledger.ts';
|
|
9
9
|
import { finalizeReviewSummaryContent } from './review-artifacts.ts';
|
|
10
|
-
import { inspectDecisionDetailDuplicates
|
|
10
|
+
import { inspectDecisionDetailDuplicates } from './decision-details.ts';
|
|
11
11
|
import { resolveTaskRef } from './resolve-ref.ts';
|
|
12
12
|
import { validateLifecycleExecution } from './lifecycle-execution.ts';
|
|
13
13
|
import { TaskExecutionLockError, withTaskExecutionLock } from './task-execution-lock.ts';
|
|
@@ -214,17 +214,7 @@ function finalizeReviewSummaryUnlocked(
|
|
|
214
214
|
);
|
|
215
215
|
}
|
|
216
216
|
const stageStatus = summarizeLedgerStage(rows, stage);
|
|
217
|
-
const
|
|
218
|
-
if (!repaired.ok) {
|
|
219
|
-
return failed(
|
|
220
|
-
request,
|
|
221
|
-
'REVIEW_DECISION_DETAIL_INVALID',
|
|
222
|
-
`${repaired.code}: ${repaired.message}`,
|
|
223
|
-
resolved.taskId,
|
|
224
|
-
stageStatus
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
const detailInspection = inspectDecisionDetailDuplicates(repaired.content);
|
|
217
|
+
const detailInspection = inspectDecisionDetailDuplicates(artifactContent);
|
|
228
218
|
if (!detailInspection.ok) {
|
|
229
219
|
return failed(
|
|
230
220
|
request,
|
|
@@ -235,13 +225,13 @@ function finalizeReviewSummaryUnlocked(
|
|
|
235
225
|
);
|
|
236
226
|
}
|
|
237
227
|
const transformed = finalizeReviewSummaryContent(
|
|
238
|
-
|
|
228
|
+
artifactContent,
|
|
239
229
|
stageStatus.unresolvedFindingCounts
|
|
240
230
|
);
|
|
241
231
|
if (!transformed.ok) {
|
|
242
232
|
return failed(request, transformed.code, transformed.message, resolved.taskId, stageStatus);
|
|
243
233
|
}
|
|
244
|
-
if (!
|
|
234
|
+
if (!transformed.changed) {
|
|
245
235
|
return {
|
|
246
236
|
...failed(request, 'REVIEW_ARTIFACT_CONFLICT', '', resolved.taskId, stageStatus),
|
|
247
237
|
status: 'no-op',
|
|
@@ -2,6 +2,7 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
|
|
4
4
|
import { artifactName, maxRound } from "./review-artifacts.ts";
|
|
5
|
+
import { invalidationBlocks, isArtifactInvalidated, parseInvalidationDocument } from "./invalidation.ts";
|
|
5
6
|
|
|
6
7
|
type ReviewedGitTree = string & { readonly __reviewedGitTree: unique symbol };
|
|
7
8
|
const REVIEWED_TREE_RE = /^[a-f0-9]{40,64}$/;
|
|
@@ -46,15 +47,35 @@ export function findAuthoritativeReviewCodeArtifact(taskDir: string) {
|
|
|
46
47
|
const entries = fs.existsSync(taskDir) ? fs.readdirSync(taskDir) : [];
|
|
47
48
|
const round = maxRound(entries, "review-code");
|
|
48
49
|
if (round === 0) {
|
|
49
|
-
return { ok: false, round: 0, fileName: null, path: null };
|
|
50
|
+
return { ok: false, round: 0, fileName: null, path: null, error: null };
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
const fileName = artifactName("review-code", round);
|
|
54
|
+
let taskContent: string;
|
|
55
|
+
try {
|
|
56
|
+
taskContent = fs.readFileSync(path.join(taskDir, "task.md"), "utf8");
|
|
57
|
+
} catch (error) {
|
|
58
|
+
return {
|
|
59
|
+
ok: false, round, fileName, path: null,
|
|
60
|
+
error: error instanceof Error ? error.message : String(error)
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const invalidation = parseInvalidationDocument(taskContent);
|
|
64
|
+
if (!invalidation.ok) {
|
|
65
|
+
return { ok: false, round, fileName, path: null, error: invalidation.message };
|
|
66
|
+
}
|
|
67
|
+
if (invalidationBlocks(invalidation.document)) {
|
|
68
|
+
return { ok: false, round, fileName, path: null, error: "artifact invalidation is incomplete; reconcile task.md before using review-code" };
|
|
69
|
+
}
|
|
70
|
+
if (isArtifactInvalidated(invalidation.document, "review-code", fileName)) {
|
|
71
|
+
return { ok: false, round, fileName, path: null, error: `${fileName} is invalidated; re-run review-code` };
|
|
72
|
+
}
|
|
53
73
|
return {
|
|
54
74
|
ok: true,
|
|
55
75
|
round,
|
|
56
76
|
fileName,
|
|
57
|
-
path: path.join(taskDir, fileName)
|
|
77
|
+
path: path.join(taskDir, fileName),
|
|
78
|
+
error: null
|
|
58
79
|
};
|
|
59
80
|
}
|
|
60
81
|
|
|
@@ -63,6 +84,16 @@ export function extractReviewBaseline(content: string): string {
|
|
|
63
84
|
return match ? match[1]!.trim().replace(/`/g, "") : "";
|
|
64
85
|
}
|
|
65
86
|
|
|
87
|
+
export function extractReviewTargetHead(content: string): string {
|
|
88
|
+
const match = String(content).match(/^[-*]?\s*\*\*(?:审查目标提交|审查目标 HEAD|Review Target Commit|Review Target Head)\*\*[::]\s*(.*?)\s*$/m);
|
|
89
|
+
return match ? match[1]!.trim().replace(/`/g, "") : "";
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function extractReviewedHead(content: string): string {
|
|
93
|
+
const match = String(content).match(/^[-*]?\s*\*\*(?:审查已检视提交|已检视提交|Reviewed Head Commit|Reviewed Head)\*\*[::]\s*(.*?)\s*$/m);
|
|
94
|
+
return match ? match[1]!.trim().replace(/`/g, "") : "";
|
|
95
|
+
}
|
|
96
|
+
|
|
66
97
|
export function extractReviewDiffBase(content: string): string {
|
|
67
98
|
const match = String(content).match(/^[-*]?\s*\*\*(?:审查差异基线|Reviewed Diff Base)\*\*[::]\s*(.*?)\s*$/m);
|
|
68
99
|
return match ? match[1]!.trim().replace(/`/g, "") : "";
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
const REWORK_INTENT_HEADINGS = ['返工意图', 'Rework Intent'] as const;
|
|
2
|
+
const REWORK_INTENT_COLUMNS = [
|
|
3
|
+
'intent_id', 'finding_id', 'source_artifact', 'source_sha256', 'target',
|
|
4
|
+
'status', 'declared_at', 'consumed_at'
|
|
5
|
+
] as const;
|
|
6
|
+
type ReworkTarget = 'analysis' | 'plan' | 'code';
|
|
7
|
+
type ReworkIntentStatus = 'pending' | 'consumed' | 'superseded';
|
|
8
|
+
type ReworkIntent = {
|
|
9
|
+
intentId: string;
|
|
10
|
+
findingId: string;
|
|
11
|
+
sourceArtifact: string;
|
|
12
|
+
sourceSha256: string;
|
|
13
|
+
target: ReworkTarget;
|
|
14
|
+
status: ReworkIntentStatus;
|
|
15
|
+
declaredAt: string;
|
|
16
|
+
consumedAt: string;
|
|
17
|
+
};
|
|
18
|
+
type ReworkIntentParseResult =
|
|
19
|
+
| { ok: true; present: boolean; intents: readonly ReworkIntent[] }
|
|
20
|
+
| { ok: false; code: 'TASK_REWORK_INTENT_INVALID'; message: string };
|
|
21
|
+
|
|
22
|
+
function cells(line: string): string[] | null {
|
|
23
|
+
const first = line.indexOf('|');
|
|
24
|
+
const last = line.lastIndexOf('|');
|
|
25
|
+
if (first < 0 || first === last || line.slice(0, first).trim() || line.slice(last + 1).trim()) return null;
|
|
26
|
+
const inner = line.slice(first + 1, last);
|
|
27
|
+
const result: string[] = [];
|
|
28
|
+
let start = 0;
|
|
29
|
+
let escaped = false;
|
|
30
|
+
for (let index = 0; index < inner.length; index += 1) {
|
|
31
|
+
const char = inner[index]!;
|
|
32
|
+
if (char === '|' && !escaped) {
|
|
33
|
+
result.push(inner.slice(start, index));
|
|
34
|
+
start = index + 1;
|
|
35
|
+
}
|
|
36
|
+
escaped = char === '\\' && !escaped;
|
|
37
|
+
if (char !== '\\') escaped = false;
|
|
38
|
+
}
|
|
39
|
+
result.push(inner.slice(start));
|
|
40
|
+
return result.map((cell) => cell.replace(/\\([\\|])/g, '$1').trim());
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function sectionBody(content: string): string | null {
|
|
44
|
+
const heading = REWORK_INTENT_HEADINGS.map((value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
|
|
45
|
+
const match = new RegExp(`^##\\s+(${heading})\\s*$`, 'm').exec(content);
|
|
46
|
+
if (!match) return null;
|
|
47
|
+
const start = (match.index ?? 0) + match[0].length;
|
|
48
|
+
const rest = content.slice(start);
|
|
49
|
+
const end = rest.search(/^##\s+/m);
|
|
50
|
+
return rest.slice(0, end < 0 ? rest.length : end);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function parseReworkIntentDocument(content: string): ReworkIntentParseResult {
|
|
54
|
+
const body = sectionBody(content);
|
|
55
|
+
if (body === null) return { ok: true, present: false, intents: [] };
|
|
56
|
+
const lines = body.split(/\r?\n/).filter((line) => line.trim());
|
|
57
|
+
const header = lines[0] ? cells(lines[0]) : null;
|
|
58
|
+
const separator = lines[1] ? cells(lines[1]) : null;
|
|
59
|
+
if (!header || !separator || header.length !== REWORK_INTENT_COLUMNS.length || !header.every((value, index) => value === REWORK_INTENT_COLUMNS[index]) || !separator.every((value) => /^:?-{3,}:?$/.test(value))) {
|
|
60
|
+
return { ok: false, code: 'TASK_REWORK_INTENT_INVALID', message: 'rework intent section must contain its canonical table' };
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const intents = lines.slice(2).map((line) => {
|
|
64
|
+
const values = cells(line);
|
|
65
|
+
if (!values || values.length !== REWORK_INTENT_COLUMNS.length) throw new Error('rework intent row has the wrong column count');
|
|
66
|
+
const row = Object.fromEntries(REWORK_INTENT_COLUMNS.map((column, index) => [column, values[index]!])) as Record<string, string>;
|
|
67
|
+
if (!/^RI-[1-9]\d*$/.test(row.intent_id!)) throw new Error(`invalid intent id '${row.intent_id}'`);
|
|
68
|
+
if (!/^(AN|PL|CD)-[1-9]\d*$/.test(row.finding_id!)) throw new Error(`invalid finding id '${row.finding_id}'`);
|
|
69
|
+
if (!['analysis', 'plan', 'code'].includes(row.target!)) throw new Error(`invalid rework target '${row.target}'`);
|
|
70
|
+
if (!['pending', 'consumed', 'superseded'].includes(row.status!)) throw new Error(`invalid rework status '${row.status}'`);
|
|
71
|
+
if (!/^[a-f0-9]{64}$/.test(row.source_sha256!)) throw new Error(`invalid source hash for '${row.intent_id}'`);
|
|
72
|
+
if (!row.source_artifact || !row.declared_at) throw new Error(`rework intent '${row.intent_id}' has invalid required fields`);
|
|
73
|
+
const terminal = row.status === 'consumed' || row.status === 'superseded';
|
|
74
|
+
if (terminal !== Boolean(row.consumed_at)) throw new Error(`rework intent '${row.intent_id}' has invalid consumed_at`);
|
|
75
|
+
return {
|
|
76
|
+
intentId: row.intent_id!, findingId: row.finding_id!, sourceArtifact: row.source_artifact!,
|
|
77
|
+
sourceSha256: row.source_sha256!, target: row.target as ReworkTarget,
|
|
78
|
+
status: row.status as ReworkIntentStatus, declaredAt: row.declared_at!, consumedAt: row.consumed_at!
|
|
79
|
+
} satisfies ReworkIntent;
|
|
80
|
+
});
|
|
81
|
+
const ids = new Set<string>();
|
|
82
|
+
for (const intent of intents) {
|
|
83
|
+
if (ids.has(intent.intentId)) throw new Error(`duplicate intent '${intent.intentId}'`);
|
|
84
|
+
ids.add(intent.intentId);
|
|
85
|
+
}
|
|
86
|
+
return { ok: true, present: true, intents };
|
|
87
|
+
} catch (error) {
|
|
88
|
+
return { ok: false, code: 'TASK_REWORK_INTENT_INVALID', message: error instanceof Error ? error.message : String(error) };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function renderReworkIntents(intents: readonly ReworkIntent[]): string {
|
|
93
|
+
const escape = (value: string) => value.replace(/\\/g, '\\\\').replace(/\|/g, '\\|').replace(/[\r\n]/g, ' ');
|
|
94
|
+
return [
|
|
95
|
+
`| ${REWORK_INTENT_COLUMNS.join(' | ')} |`,
|
|
96
|
+
`| ${REWORK_INTENT_COLUMNS.map(() => '---').join(' | ')} |`,
|
|
97
|
+
...intents.map((intent) => `| ${[
|
|
98
|
+
intent.intentId, intent.findingId, intent.sourceArtifact, intent.sourceSha256,
|
|
99
|
+
intent.target, intent.status, intent.declaredAt, intent.consumedAt
|
|
100
|
+
].map(escape).join(' | ')} |`)
|
|
101
|
+
].join('\n');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function upsertReworkIntent(intents: readonly ReworkIntent[], intent: ReworkIntent): { changed: boolean; intents: readonly ReworkIntent[] } {
|
|
105
|
+
const existing = intents.find((candidate) => candidate.intentId === intent.intentId);
|
|
106
|
+
if (!existing) return { changed: true, intents: [...intents, intent] };
|
|
107
|
+
const identity = (value: ReworkIntent) => [value.intentId, value.findingId, value.sourceArtifact, value.sourceSha256, value.target];
|
|
108
|
+
if (JSON.stringify(identity(existing)) !== JSON.stringify(identity(intent))) throw new Error(`intent '${intent.intentId}' identity conflicts with existing state`);
|
|
109
|
+
return { changed: false, intents };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function consumeReworkIntents(
|
|
113
|
+
intents: readonly ReworkIntent[],
|
|
114
|
+
target: ReworkTarget,
|
|
115
|
+
sourceHashes: Readonly<Record<string, string>>,
|
|
116
|
+
consumedAt: string
|
|
117
|
+
): { changed: boolean; intents: readonly ReworkIntent[] } {
|
|
118
|
+
let changed = false;
|
|
119
|
+
const next = intents.map((intent) => {
|
|
120
|
+
if (
|
|
121
|
+
intent.status !== 'pending'
|
|
122
|
+
|| intent.target !== target
|
|
123
|
+
|| sourceHashes[intent.sourceArtifact] !== intent.sourceSha256
|
|
124
|
+
) return intent;
|
|
125
|
+
changed = true;
|
|
126
|
+
return { ...intent, status: 'consumed' as const, consumedAt };
|
|
127
|
+
});
|
|
128
|
+
return { changed, intents: next };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function supersedeReworkIntents(
|
|
132
|
+
intents: readonly ReworkIntent[],
|
|
133
|
+
sourceArtifact: string,
|
|
134
|
+
sourceSha256: string,
|
|
135
|
+
supersededAt: string
|
|
136
|
+
): { changed: boolean; intents: readonly ReworkIntent[] } {
|
|
137
|
+
let changed = false;
|
|
138
|
+
const next = intents.map((intent) => {
|
|
139
|
+
if (intent.status !== 'pending' || intent.sourceArtifact !== sourceArtifact || intent.sourceSha256 === sourceSha256) return intent;
|
|
140
|
+
changed = true;
|
|
141
|
+
return { ...intent, status: 'superseded' as const, consumedAt: supersededAt };
|
|
142
|
+
});
|
|
143
|
+
return { changed, intents: next };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function reworkIntentMutation(content: string, intents: readonly ReworkIntent[]) {
|
|
147
|
+
return {
|
|
148
|
+
kind: 'section' as const,
|
|
149
|
+
aliases: REWORK_INTENT_HEADINGS,
|
|
150
|
+
heading: /^##\s+Rework Intent\s*$/m.test(content) ? REWORK_INTENT_HEADINGS[1] : REWORK_INTENT_HEADINGS[0],
|
|
151
|
+
body: renderReworkIntents(intents)
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export {
|
|
156
|
+
REWORK_INTENT_COLUMNS,
|
|
157
|
+
REWORK_INTENT_HEADINGS,
|
|
158
|
+
parseReworkIntentDocument,
|
|
159
|
+
renderReworkIntents,
|
|
160
|
+
reworkIntentMutation,
|
|
161
|
+
consumeReworkIntents,
|
|
162
|
+
supersedeReworkIntents,
|
|
163
|
+
upsertReworkIntent
|
|
164
|
+
};
|
|
165
|
+
export type { ReworkIntent, ReworkIntentParseResult, ReworkIntentStatus, ReworkTarget };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const TASK_SCOPE_SKILLS: ReadonlySet<string> = new Set([
|
|
2
|
+
'analyze-task',
|
|
3
|
+
'block-task',
|
|
4
|
+
'cancel-task',
|
|
5
|
+
'check-task',
|
|
6
|
+
'code-task',
|
|
7
|
+
'commit',
|
|
8
|
+
'complete-manual-validation',
|
|
9
|
+
'complete-task',
|
|
10
|
+
'create-pr',
|
|
11
|
+
'plan-task',
|
|
12
|
+
'review-analysis',
|
|
13
|
+
'review-code',
|
|
14
|
+
'review-plan',
|
|
15
|
+
'run-manual-validation',
|
|
16
|
+
'run-task',
|
|
17
|
+
'watch-pr'
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
function isTaskScopeSkill(skillName: string): boolean {
|
|
21
|
+
return TASK_SCOPE_SKILLS.has(skillName);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { TASK_SCOPE_SKILLS, isTaskScopeSkill };
|
|
@@ -224,6 +224,22 @@ function withTaskExecutionLock<T>(
|
|
|
224
224
|
};
|
|
225
225
|
const serialized = `${JSON.stringify(owner)}\n`;
|
|
226
226
|
let ownsFixed = false;
|
|
227
|
+
let deferRelease = false;
|
|
228
|
+
const release = (): void => {
|
|
229
|
+
try {
|
|
230
|
+
unlinkIfPresent(candidate);
|
|
231
|
+
} catch {
|
|
232
|
+
// Candidate cleanup is best-effort and must not replace the primary result.
|
|
233
|
+
}
|
|
234
|
+
if (ownsFixed) {
|
|
235
|
+
try {
|
|
236
|
+
const current = parseOwner(fs.readFileSync(fixed, 'utf8'), key);
|
|
237
|
+
if (current.token === token) unlinkIfPresent(fixed);
|
|
238
|
+
} catch {
|
|
239
|
+
// A missing or replaced fixed lock is not owned by this invocation.
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
};
|
|
227
243
|
try {
|
|
228
244
|
fs.mkdirSync(lockRoot, { recursive: true });
|
|
229
245
|
cleanStaleCandidates(lockRoot, key, options.identityMatches ?? processIdentityMatches);
|
|
@@ -269,7 +285,12 @@ function withTaskExecutionLock<T>(
|
|
|
269
285
|
);
|
|
270
286
|
}
|
|
271
287
|
unlinkIfPresent(candidate);
|
|
272
|
-
|
|
288
|
+
const value = callback();
|
|
289
|
+
if (value && typeof (value as { then?: unknown }).then === 'function') {
|
|
290
|
+
deferRelease = true;
|
|
291
|
+
return (value as unknown as Promise<unknown>).finally(release) as T;
|
|
292
|
+
}
|
|
293
|
+
return value;
|
|
273
294
|
} catch (error) {
|
|
274
295
|
if (error instanceof TaskExecutionLockError) throw error;
|
|
275
296
|
if (error instanceof Error && error.name === 'OrchestrationStateError') throw error;
|
|
@@ -279,19 +300,7 @@ function withTaskExecutionLock<T>(
|
|
|
279
300
|
{ operation: ownsFixed ? 'callback' : 'acquire', errno: errno(error), key }
|
|
280
301
|
);
|
|
281
302
|
} finally {
|
|
282
|
-
|
|
283
|
-
unlinkIfPresent(candidate);
|
|
284
|
-
} catch {
|
|
285
|
-
// Candidate cleanup is best-effort and must not replace the primary result.
|
|
286
|
-
}
|
|
287
|
-
if (ownsFixed) {
|
|
288
|
-
try {
|
|
289
|
-
const current = parseOwner(fs.readFileSync(fixed, 'utf8'), key);
|
|
290
|
-
if (current.token === token) unlinkIfPresent(fixed);
|
|
291
|
-
} catch {
|
|
292
|
-
// A missing or replaced fixed lock is not owned by this invocation.
|
|
293
|
-
}
|
|
294
|
-
}
|
|
303
|
+
if (!deferRelease) release();
|
|
295
304
|
}
|
|
296
305
|
}
|
|
297
306
|
|