@fitlab-ai/agent-infra 0.8.5 → 0.9.1
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 +6 -1
- package/README.zh-CN.md +5 -1
- package/bin/cli.ts +2 -2
- package/dist/bin/cli.js +2 -2
- package/dist/bin/internal-cli.js +103 -0
- package/dist/lib/decide.js +81 -90
- package/dist/lib/defaults.json +1 -0
- package/dist/lib/git/review-snapshot.js +79 -0
- package/dist/lib/git/workflow.js +101 -0
- package/dist/lib/internal/git-workflow.js +42 -0
- package/dist/lib/internal/platform-checks.js +119 -0
- package/dist/lib/internal/platform-comment.js +129 -0
- package/dist/lib/internal/platform-context.js +46 -0
- package/dist/lib/internal/platform-issue.js +142 -0
- package/dist/lib/internal/platform-pr.js +146 -0
- package/dist/lib/internal/platform-release-notes.js +53 -0
- package/dist/lib/internal/release-workflow.js +320 -0
- package/dist/lib/internal/task-artifact.js +67 -0
- package/dist/lib/internal/task-context.js +43 -0
- package/dist/lib/internal/task-event.js +70 -0
- package/dist/lib/internal/task-ledger.js +114 -0
- package/dist/lib/internal/task-lifecycle.js +58 -0
- package/dist/lib/internal/task-short-id.js +83 -0
- package/dist/lib/internal/task-snapshot.js +47 -0
- package/dist/lib/internal/task-verify.js +50 -0
- package/dist/lib/internal/task-warning.js +74 -0
- package/dist/lib/platform/adapters.js +14 -0
- package/dist/lib/platform/context.js +146 -0
- package/dist/lib/platform/github-client.js +124 -0
- package/dist/lib/platform/github-release-notes.js +96 -0
- package/dist/lib/platform/issue-comments.js +409 -0
- package/dist/lib/platform/issue-metadata.js +183 -0
- package/dist/lib/platform/issues.js +619 -0
- package/dist/lib/platform/merged-pr-equivalence.js +54 -0
- package/dist/lib/platform/metadata-labels.js +28 -0
- package/dist/lib/platform/pr-checks.js +216 -0
- package/dist/lib/platform/pr-summary.js +88 -0
- package/dist/lib/platform/pull-request-metadata.js +38 -0
- package/dist/lib/platform/pull-requests.js +340 -0
- package/dist/lib/platform/release-notes.js +143 -0
- package/dist/lib/platform/releases.js +82 -0
- package/dist/lib/platform/types.js +22 -0
- package/dist/lib/platform/verification-required.js +102 -0
- package/dist/lib/platform/verification-sync.js +1014 -0
- package/dist/lib/platform/verification.js +6 -0
- package/dist/lib/release/channels.js +31 -0
- package/dist/lib/release/workflow.js +32 -0
- package/dist/lib/render.js +3 -2
- package/dist/lib/run/index.js +24 -7
- package/dist/lib/sandbox/build-proxy.js +63 -0
- package/dist/lib/sandbox/capture.js +25 -3
- package/dist/lib/sandbox/commands/create.js +93 -31
- package/dist/lib/sandbox/commands/enter.js +34 -11
- package/dist/lib/sandbox/commands/list-running.js +10 -8
- package/dist/lib/sandbox/commands/rebuild.js +24 -7
- package/dist/lib/sandbox/commands/show.js +2 -2
- package/dist/lib/sandbox/commands/start.js +53 -15
- package/dist/lib/sandbox/image-build.js +2 -1
- package/dist/lib/sandbox/index.js +6 -6
- package/dist/lib/sandbox/mounts.js +36 -0
- package/dist/lib/sandbox/recovery.js +562 -0
- package/dist/lib/sandbox/runtimes/ai-tools.dockerfile +24 -3
- package/dist/lib/sandbox/runtimes/base.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/java17.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/java21.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/node20.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/node22.dockerfile +8 -1
- package/dist/lib/sandbox/runtimes/python3.dockerfile +8 -1
- package/dist/lib/sandbox/shell.js +2 -1
- package/dist/lib/sandbox/task-resolver.js +5 -1
- package/dist/lib/sandbox/tools.js +19 -0
- package/dist/lib/server/protocol.js +5 -5
- package/dist/lib/task/activity-log.js +61 -0
- package/dist/lib/task/artifact-lifecycle.js +427 -0
- package/dist/lib/task/command-options.js +30 -0
- package/dist/lib/task/commands/cat.js +36 -6
- package/dist/lib/task/commands/decisions.js +80 -46
- package/dist/lib/task/commands/files.js +21 -7
- package/dist/lib/task/commands/grep.js +55 -7
- package/dist/lib/task/commands/issue-body.js +33 -19
- package/dist/lib/task/commands/log.js +27 -70
- package/dist/lib/task/commands/show.js +20 -7
- package/dist/lib/task/commands/status.js +18 -8
- package/dist/lib/task/decision-intents.js +154 -0
- package/dist/lib/task/decision-items.js +53 -0
- package/dist/lib/task/events.js +318 -0
- package/dist/lib/task/frontmatter.js +159 -1
- package/dist/lib/task/implementation-inputs.js +117 -0
- package/dist/lib/task/index.js +12 -9
- package/dist/lib/task/issue-form.js +21 -6
- package/dist/lib/task/ledger-intents.js +185 -0
- package/dist/lib/task/ledger.js +65 -35
- package/dist/lib/task/lifecycle.js +484 -0
- package/dist/lib/task/resolve-ref.js +152 -32
- package/dist/lib/task/review-artifacts.js +101 -0
- package/dist/lib/task/review-fingerprint.js +55 -0
- package/dist/lib/task/sections.js +358 -4
- package/dist/lib/task/short-id.js +292 -7
- package/dist/lib/task/snapshot.js +95 -0
- package/dist/lib/task/verification-checks.js +8 -0
- package/dist/lib/task/verification-config.js +14 -0
- package/dist/lib/task/verification-engine.js +923 -0
- package/dist/lib/task/verification-review.js +3 -0
- package/dist/lib/task/verification-types.js +2 -0
- package/dist/lib/task/verification.js +113 -0
- package/dist/lib/task/workflow-warning-intents.js +131 -0
- package/dist/lib/task/workflow-warnings.js +10 -78
- package/dist/lib/task/write.js +241 -0
- package/lib/decide.ts +57 -97
- package/lib/defaults.json +1 -0
- package/lib/git/review-snapshot.ts +73 -0
- package/lib/git/workflow.ts +101 -0
- package/lib/internal/git-workflow.ts +37 -0
- package/lib/internal/platform-checks.ts +101 -0
- package/lib/internal/platform-comment.ts +99 -0
- package/lib/internal/platform-context.ts +33 -0
- package/lib/internal/platform-issue.ts +116 -0
- package/lib/internal/platform-pr.ts +119 -0
- package/lib/internal/platform-release-notes.ts +55 -0
- package/lib/internal/release-workflow.ts +288 -0
- package/lib/internal/task-artifact.ts +47 -0
- package/lib/internal/task-context.ts +35 -0
- package/lib/internal/task-event.ts +51 -0
- package/lib/internal/task-ledger.ts +86 -0
- package/lib/internal/task-lifecycle.ts +41 -0
- package/lib/internal/task-short-id.ts +55 -0
- package/lib/internal/task-snapshot.ts +32 -0
- package/lib/internal/task-verify.ts +33 -0
- package/lib/internal/task-warning.ts +50 -0
- package/lib/platform/adapters.ts +30 -0
- package/lib/platform/context.ts +164 -0
- package/lib/platform/github-client.ts +146 -0
- package/lib/platform/github-release-notes.ts +132 -0
- package/lib/platform/issue-comments.ts +479 -0
- package/lib/platform/issue-metadata.ts +250 -0
- package/lib/platform/issues.ts +693 -0
- package/lib/platform/merged-pr-equivalence.ts +70 -0
- package/lib/platform/metadata-labels.ts +33 -0
- package/lib/platform/pr-checks.ts +247 -0
- package/lib/platform/pr-summary.ts +90 -0
- package/lib/platform/pull-request-metadata.ts +69 -0
- package/lib/platform/pull-requests.ts +386 -0
- package/lib/platform/release-notes.ts +167 -0
- package/lib/platform/releases.ts +71 -0
- package/lib/platform/types.ts +74 -0
- package/lib/platform/verification-required.ts +109 -0
- package/{runtime/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +198 -367
- package/lib/platform/verification.ts +11 -0
- package/lib/release/channels.ts +30 -0
- package/lib/release/workflow.ts +31 -0
- package/lib/render.ts +3 -2
- package/lib/run/index.ts +25 -7
- package/lib/sandbox/build-proxy.ts +94 -0
- package/lib/sandbox/capture.ts +29 -3
- package/lib/sandbox/commands/create.ts +120 -36
- package/lib/sandbox/commands/enter.ts +38 -11
- package/lib/sandbox/commands/list-running.ts +10 -8
- package/lib/sandbox/commands/rebuild.ts +29 -7
- package/lib/sandbox/commands/show.ts +2 -2
- package/lib/sandbox/commands/start.ts +50 -16
- package/lib/sandbox/image-build.ts +4 -1
- package/lib/sandbox/index.ts +6 -6
- package/lib/sandbox/mounts.ts +55 -0
- package/lib/sandbox/recovery.ts +828 -0
- package/lib/sandbox/runtimes/ai-tools.dockerfile +24 -3
- package/lib/sandbox/runtimes/base.dockerfile +8 -1
- package/lib/sandbox/runtimes/java17.dockerfile +8 -1
- package/lib/sandbox/runtimes/java21.dockerfile +8 -1
- package/lib/sandbox/runtimes/node20.dockerfile +8 -1
- package/lib/sandbox/runtimes/node22.dockerfile +8 -1
- package/lib/sandbox/runtimes/python3.dockerfile +8 -1
- package/lib/sandbox/shell.ts +3 -1
- package/lib/sandbox/task-resolver.ts +5 -1
- package/lib/sandbox/tools.ts +31 -0
- package/lib/server/protocol.ts +5 -5
- package/lib/task/activity-log.ts +62 -0
- package/lib/task/artifact-lifecycle.ts +484 -0
- package/lib/task/command-options.ts +32 -0
- package/lib/task/commands/cat.ts +22 -9
- package/lib/task/commands/decisions.ts +49 -47
- package/lib/task/commands/files.ts +14 -6
- package/lib/task/commands/grep.ts +34 -7
- package/lib/task/commands/issue-body.ts +26 -21
- package/lib/task/commands/log.ts +17 -70
- package/lib/task/commands/show.ts +14 -6
- package/lib/task/commands/status.ts +17 -7
- package/lib/task/decision-intents.ts +163 -0
- package/lib/task/decision-items.ts +64 -0
- package/lib/task/events.ts +320 -0
- package/lib/task/frontmatter.ts +202 -2
- package/lib/task/implementation-inputs.ts +137 -0
- package/lib/task/index.ts +12 -9
- package/lib/task/issue-form.ts +24 -6
- package/lib/task/ledger-intents.ts +201 -0
- package/lib/task/ledger.ts +77 -31
- package/lib/task/lifecycle.ts +458 -0
- package/lib/task/resolve-ref.ts +197 -36
- package/{templates/.agents/scripts/lib/review-artifacts.js → lib/task/review-artifacts.ts} +11 -12
- package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts} +26 -12
- package/lib/task/sections.ts +486 -4
- package/lib/task/short-id.ts +403 -9
- package/lib/task/snapshot.ts +143 -0
- package/lib/task/verification-checks.ts +9 -0
- package/lib/task/verification-config.ts +20 -0
- package/{templates/.agents/scripts/validate-artifact.js → lib/task/verification-engine.ts} +230 -421
- package/lib/task/verification-review.ts +10 -0
- package/lib/task/verification-types.ts +29 -0
- package/lib/task/verification.ts +156 -0
- package/lib/task/workflow-warning-intents.ts +142 -0
- package/lib/task/workflow-warnings.ts +10 -78
- package/lib/task/write.ts +468 -0
- package/package.json +4 -2
- package/templates/.agents/README.en.md +4 -3
- package/templates/.agents/README.zh-CN.md +4 -3
- package/templates/.agents/rules/README.en.md +6 -5
- package/templates/.agents/rules/README.zh-CN.md +6 -5
- package/templates/.agents/rules/create-issue.en.md +1 -1
- package/templates/.agents/rules/create-issue.github.en.md +5 -184
- package/templates/.agents/rules/create-issue.github.zh-CN.md +12 -178
- package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
- package/templates/.agents/rules/human-decision-context.en.md +36 -0
- package/templates/.agents/rules/human-decision-context.zh-CN.md +36 -0
- package/templates/.agents/rules/issue-fields.github.en.md +4 -148
- package/templates/.agents/rules/issue-fields.github.zh-CN.md +9 -144
- package/templates/.agents/rules/issue-pr-commands.en.md +43 -3
- package/templates/.agents/rules/issue-pr-commands.github.en.md +15 -220
- package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +23 -213
- package/templates/.agents/rules/issue-pr-commands.zh-CN.md +45 -3
- package/templates/.agents/rules/issue-sync.en.md +1 -1
- package/templates/.agents/rules/issue-sync.github.en.md +14 -301
- package/templates/.agents/rules/issue-sync.github.zh-CN.md +36 -287
- package/templates/.agents/rules/issue-sync.zh-CN.md +1 -1
- package/templates/.agents/rules/milestone-inference.en.md +1 -1
- package/templates/.agents/rules/milestone-inference.github.en.md +7 -119
- package/templates/.agents/rules/milestone-inference.github.zh-CN.md +8 -108
- package/templates/.agents/rules/milestone-inference.zh-CN.md +1 -1
- package/templates/.agents/rules/next-step-output.en.md +12 -11
- package/templates/.agents/rules/next-step-output.zh-CN.md +12 -11
- package/templates/.agents/rules/no-mid-flow-questions.en.md +3 -3
- package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +3 -3
- package/templates/.agents/rules/pr-checks-commands.en.md +16 -3
- package/templates/.agents/rules/pr-checks-commands.github.en.md +10 -54
- package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +19 -47
- package/templates/.agents/rules/pr-checks-commands.zh-CN.md +30 -3
- package/templates/.agents/rules/pr-sync.en.md +30 -3
- package/templates/.agents/rules/pr-sync.github.en.md +12 -115
- package/templates/.agents/rules/pr-sync.github.zh-CN.md +26 -104
- package/templates/.agents/rules/pr-sync.zh-CN.md +43 -3
- package/templates/.agents/rules/release-commands.en.md +2 -2
- package/templates/.agents/rules/release-commands.github.en.md +10 -40
- package/templates/.agents/rules/release-commands.github.zh-CN.md +9 -39
- package/templates/.agents/rules/release-commands.zh-CN.md +2 -2
- package/templates/.agents/rules/review-handshake.en.md +10 -6
- package/templates/.agents/rules/review-handshake.zh-CN.md +10 -6
- package/templates/.agents/rules/task-management.en.md +11 -2
- package/templates/.agents/rules/task-management.zh-CN.md +11 -3
- package/templates/.agents/rules/task-short-id.en.md +25 -29
- package/templates/.agents/rules/task-short-id.zh-CN.md +20 -23
- package/templates/.agents/rules/testing-discipline.en.md +20 -2
- package/templates/.agents/rules/testing-discipline.zh-CN.md +20 -2
- package/templates/.agents/scripts/lib/agent-infra-package.js +1 -9
- package/templates/.agents/scripts/task-short-id.js +71 -533
- package/templates/.agents/skills/analyze-task/SKILL.en.md +26 -56
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +30 -60
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -3
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/block-task/SKILL.en.md +21 -47
- package/templates/.agents/skills/block-task/SKILL.zh-CN.md +23 -47
- package/templates/.agents/skills/block-task/config/verify.json +1 -2
- package/templates/.agents/skills/cancel-task/SKILL.en.md +16 -45
- package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +16 -45
- package/templates/.agents/skills/cancel-task/config/verify.json +1 -2
- package/templates/.agents/skills/check-task/SKILL.en.md +6 -3
- package/templates/.agents/skills/check-task/SKILL.zh-CN.md +6 -3
- package/templates/.agents/skills/close-codescan/SKILL.en.md +6 -24
- package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +6 -24
- package/templates/.agents/skills/close-dependabot/SKILL.en.md +6 -24
- package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +6 -24
- package/templates/.agents/skills/code-task/SKILL.en.md +22 -35
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +28 -44
- package/templates/.agents/skills/code-task/config/verify.en.json +3 -3
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +3 -3
- package/templates/.agents/skills/code-task/reference/dual-mode.en.md +13 -9
- package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +13 -9
- package/templates/.agents/skills/code-task/reference/fix-mode.en.md +1 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +1 -1
- package/templates/.agents/skills/code-task/reference/report-template.en.md +11 -1
- package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +11 -1
- package/templates/.agents/skills/commit/SKILL.en.md +13 -11
- package/templates/.agents/skills/commit/SKILL.zh-CN.md +13 -11
- package/templates/.agents/skills/commit/config/verify.json +1 -2
- package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -11
- package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -11
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +4 -8
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +4 -8
- package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +6 -18
- package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +5 -17
- package/templates/.agents/skills/commit/reference/task-status-update.en.md +13 -0
- package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +13 -0
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +13 -36
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +13 -36
- package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -3
- package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +10 -54
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +10 -79
- package/templates/.agents/skills/complete-task/SKILL.en.md +59 -63
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +59 -63
- package/templates/.agents/skills/complete-task/config/verify.en.json +10 -7
- package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +10 -7
- package/templates/.agents/skills/create-pr/SKILL.en.md +19 -44
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +19 -43
- package/templates/.agents/skills/create-pr/config/verify.json +1 -2
- package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +8 -12
- package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +7 -11
- package/templates/.agents/skills/create-release-note/SKILL.en.md +17 -38
- package/templates/.agents/skills/create-release-note/SKILL.zh-CN.md +16 -37
- package/templates/.agents/skills/create-task/SKILL.en.md +16 -13
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +16 -13
- package/templates/.agents/skills/create-task/config/verify.json +1 -2
- package/templates/.agents/skills/create-task/reference/context-capture.en.md +29 -0
- package/templates/.agents/skills/create-task/reference/context-capture.zh-CN.md +29 -0
- package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-codescan/config/verify.json +1 -2
- package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-dependabot/config/verify.json +1 -2
- package/templates/.agents/skills/import-issue/SKILL.en.md +9 -13
- package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -14
- package/templates/.agents/skills/import-issue/config/verify.json +1 -2
- package/templates/.agents/skills/plan-task/SKILL.en.md +17 -42
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +22 -49
- package/templates/.agents/skills/plan-task/config/verify.en.json +1 -3
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/post-release/SKILL.en.md +11 -81
- package/templates/.agents/skills/post-release/SKILL.zh-CN.md +8 -78
- package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
- package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/release/SKILL.en.md +16 -163
- package/templates/.agents/skills/release/SKILL.zh-CN.md +15 -162
- package/templates/.agents/skills/restore-task/SKILL.en.md +11 -29
- package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +11 -29
- package/templates/.agents/skills/restore-task/config/verify.json +1 -2
- package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -25
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +13 -33
- package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +9 -12
- package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +9 -12
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +9 -2
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +9 -2
- package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/review-code/SKILL.en.md +22 -36
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +23 -41
- package/templates/.agents/skills/review-code/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-code/reference/output-templates.en.md +56 -18
- package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +56 -18
- package/templates/.agents/skills/review-code/reference/report-template.en.md +11 -4
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +11 -4
- package/templates/.agents/skills/review-code/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/review-plan/SKILL.en.md +13 -25
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +13 -33
- package/templates/.agents/skills/review-plan/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-plan/reference/output-templates.en.md +9 -12
- package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +9 -12
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +9 -2
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +9 -2
- package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/update-agent-infra/SKILL.en.md +1 -2
- package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +1 -2
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -15
- package/templates/.agents/skills/watch-pr/SKILL.en.md +24 -14
- package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +25 -15
- package/templates/.agents/skills/watch-pr/config/verify.json +1 -2
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +2 -2
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +2 -2
- package/templates/.agents/templates/task.en.md +24 -1
- package/templates/.agents/templates/task.zh-CN.md +24 -1
- package/templates/.claude/commands/analyze-task.en.md +1 -1
- package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
- package/templates/.claude/commands/block-task.en.md +1 -1
- package/templates/.claude/commands/block-task.zh-CN.md +1 -1
- package/templates/.claude/commands/cancel-task.en.md +1 -1
- package/templates/.claude/commands/cancel-task.zh-CN.md +1 -1
- package/templates/.claude/commands/check-task.en.md +1 -1
- package/templates/.claude/commands/check-task.zh-CN.md +1 -1
- package/templates/.claude/commands/code-task.en.md +1 -1
- package/templates/.claude/commands/code-task.zh-CN.md +1 -1
- package/templates/.claude/commands/commit.en.md +1 -0
- package/templates/.claude/commands/commit.zh-CN.md +1 -0
- package/templates/.claude/commands/complete-manual-validation.en.md +1 -1
- package/templates/.claude/commands/complete-manual-validation.zh-CN.md +1 -1
- package/templates/.claude/commands/complete-task.en.md +1 -1
- package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
- package/templates/.claude/commands/create-pr.en.md +1 -1
- package/templates/.claude/commands/create-pr.zh-CN.md +1 -1
- package/templates/.claude/commands/plan-task.en.md +1 -1
- package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
- package/templates/.claude/commands/review-analysis.en.md +1 -1
- package/templates/.claude/commands/review-analysis.zh-CN.md +1 -1
- package/templates/.claude/commands/review-code.en.md +1 -1
- package/templates/.claude/commands/review-code.zh-CN.md +1 -1
- package/templates/.claude/commands/review-plan.en.md +1 -1
- package/templates/.claude/commands/review-plan.zh-CN.md +1 -1
- package/templates/.claude/commands/watch-pr.en.md +1 -1
- package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
- package/templates/.gemini/commands/_project_/analyze-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/block-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/cancel-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/check-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/code-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/commit.en.toml +4 -0
- package/templates/.gemini/commands/_project_/commit.zh-CN.toml +4 -0
- package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/create-pr.en.toml +2 -0
- package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/plan-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-analysis.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-code.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-plan.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/watch-pr.en.toml +2 -0
- package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +2 -0
- package/templates/.git-hooks/check-large-files.cjs +92 -0
- package/templates/.git-hooks/check-version-format.sh +5 -1
- package/templates/.git-hooks/pre-commit +1 -0
- package/templates/.opencode/commands/analyze-task.en.md +1 -1
- package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/check-task.en.md +1 -1
- package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/code-task.en.md +1 -1
- package/templates/.opencode/commands/code-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/commit.en.md +2 -0
- package/templates/.opencode/commands/commit.zh-CN.md +2 -0
- package/templates/.opencode/commands/complete-task.en.md +1 -1
- package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/plan-task.en.md +1 -1
- package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-analysis.en.md +1 -1
- package/templates/.opencode/commands/review-analysis.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-code.en.md +1 -1
- package/templates/.opencode/commands/review-code.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-plan.en.md +1 -1
- package/templates/.opencode/commands/review-plan.zh-CN.md +1 -1
- package/templates/.agents/scripts/platform-adapters/platform-sync.github.js +0 -40
- package/templates/.agents/scripts/platform-adapters/platform-sync.js +0 -13
- package/templates/.agents/scripts/review-diff-fingerprint.js +0 -170
- package/templates/.agents/scripts/workflow-warnings.js +0 -290
- package/templates/.agents/skills/code-task/scripts/detect-mode.js +0 -257
- package/templates/.agents/skills/release/scripts/manage-milestones.github.sh +0 -80
- package/templates/.agents/skills/release/scripts/manage-milestones.sh +0 -6
package/lib/task/resolve-ref.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { execFileSync
|
|
4
|
-
import { normalizeShortIdInput } from './short-id.ts';
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import { normalizeShortIdInput, resolveShortIdReadOnly } from './short-id.ts';
|
|
5
|
+
import { parseTaskFrontmatter } from './frontmatter.ts';
|
|
5
6
|
|
|
6
7
|
const TASK_ID_RE = /^TASK-\d{8}-\d{6}$/;
|
|
7
8
|
// Flat-structured workspace dirs that hold tasks under `{dir}/{taskId}/task.md`.
|
|
@@ -15,8 +16,37 @@ type ResolveRefResult =
|
|
|
15
16
|
taskId: string;
|
|
16
17
|
taskDir: string;
|
|
17
18
|
taskMdPath: string;
|
|
19
|
+
state: TaskWorkspaceState;
|
|
18
20
|
}
|
|
19
|
-
| {
|
|
21
|
+
| {
|
|
22
|
+
ok: false;
|
|
23
|
+
code: ResolveTaskRefErrorCode;
|
|
24
|
+
message: string;
|
|
25
|
+
repoRoot: string | null;
|
|
26
|
+
taskId: string | null;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
type TaskWorkspaceState = 'active' | 'blocked' | 'completed' | 'archive';
|
|
30
|
+
|
|
31
|
+
type ResolveTaskRefErrorCode =
|
|
32
|
+
| 'REPO_ROOT_NOT_FOUND'
|
|
33
|
+
| 'INVALID_TASK_REF'
|
|
34
|
+
| 'SHORT_ID_RESERVED'
|
|
35
|
+
| 'SHORT_ID_CAPACITY_EXCEEDED'
|
|
36
|
+
| 'SHORT_ID_REGISTRY_NOT_FOUND'
|
|
37
|
+
| 'SHORT_ID_REGISTRY_READ_FAILED'
|
|
38
|
+
| 'SHORT_ID_REGISTRY_INVALID_JSON'
|
|
39
|
+
| 'SHORT_ID_REGISTRY_INVALID_SCHEMA'
|
|
40
|
+
| 'SHORT_ID_REGISTRY_DUPLICATE_TASK'
|
|
41
|
+
| 'SHORT_ID_NOT_FOUND'
|
|
42
|
+
| 'SHORT_ID_STALE'
|
|
43
|
+
| 'TASK_NOT_FOUND'
|
|
44
|
+
| 'TASK_CONTEXT_DETACHED_HEAD'
|
|
45
|
+
| 'TASK_CONTEXT_NOT_FOUND'
|
|
46
|
+
| 'TASK_CONTEXT_AMBIGUOUS'
|
|
47
|
+
| 'TASK_CONTEXT_UNREADABLE';
|
|
48
|
+
|
|
49
|
+
type ResolveTaskRefOptions = { repoRoot?: string };
|
|
20
50
|
|
|
21
51
|
function detectRepoRoot(): string {
|
|
22
52
|
try {
|
|
@@ -40,21 +70,6 @@ function readShortIdLength(repoRoot: string): number {
|
|
|
40
70
|
return 2;
|
|
41
71
|
}
|
|
42
72
|
|
|
43
|
-
function resolveShortIdToTaskId(arg: string, repoRoot: string): string {
|
|
44
|
-
const scriptPath = path.join(repoRoot, '.agents', 'scripts', 'task-short-id.js');
|
|
45
|
-
if (!fs.existsSync(scriptPath)) {
|
|
46
|
-
throw new Error(`task-short-id.js not found at ${scriptPath}`);
|
|
47
|
-
}
|
|
48
|
-
const result = spawnSync('node', [scriptPath, 'resolve', arg], {
|
|
49
|
-
encoding: 'utf8',
|
|
50
|
-
cwd: repoRoot
|
|
51
|
-
});
|
|
52
|
-
if (result.status !== 0) {
|
|
53
|
-
throw new Error((result.stderr || '').trim() || `failed to resolve '${arg}'`);
|
|
54
|
-
}
|
|
55
|
-
return result.stdout.trim();
|
|
56
|
-
}
|
|
57
|
-
|
|
58
73
|
function listSortedNumeric(dir: string, width: number): string[] {
|
|
59
74
|
if (!fs.existsSync(dir)) return [];
|
|
60
75
|
const pattern = new RegExp(`^\\d{${width}}$`);
|
|
@@ -84,12 +99,16 @@ function findInArchive(repoRoot: string, taskId: string): string | null {
|
|
|
84
99
|
return null;
|
|
85
100
|
}
|
|
86
101
|
|
|
87
|
-
function findTaskMd(
|
|
102
|
+
function findTaskMd(
|
|
103
|
+
repoRoot: string,
|
|
104
|
+
taskId: string
|
|
105
|
+
): { taskMdPath: string; state: TaskWorkspaceState } | null {
|
|
88
106
|
for (const sub of FLAT_WORKSPACE_DIRS) {
|
|
89
107
|
const candidate = path.join(repoRoot, '.agents', 'workspace', sub, taskId, 'task.md');
|
|
90
|
-
if (fs.existsSync(candidate)) return candidate;
|
|
108
|
+
if (fs.existsSync(candidate)) return { taskMdPath: candidate, state: sub };
|
|
91
109
|
}
|
|
92
|
-
|
|
110
|
+
const archived = findInArchive(repoRoot, taskId);
|
|
111
|
+
return archived ? { taskMdPath: archived, state: 'archive' } : null;
|
|
93
112
|
}
|
|
94
113
|
|
|
95
114
|
/**
|
|
@@ -113,16 +132,38 @@ function enumerateTaskDirs(repoRoot: string): { taskId: string; taskDir: string
|
|
|
113
132
|
return out;
|
|
114
133
|
}
|
|
115
134
|
|
|
135
|
+
function locateHotTaskDirs(
|
|
136
|
+
repoRoot: string,
|
|
137
|
+
taskId: string
|
|
138
|
+
): { taskId: string; taskDir: string; taskMdPath: string; state: Exclude<TaskWorkspaceState, 'archive'> }[] {
|
|
139
|
+
return FLAT_WORKSPACE_DIRS.flatMap((state) => {
|
|
140
|
+
const taskDir = path.join(repoRoot, '.agents', 'workspace', state, taskId);
|
|
141
|
+
const taskMdPath = path.join(taskDir, 'task.md');
|
|
142
|
+
return fs.existsSync(taskMdPath) ? [{ taskId, taskDir, taskMdPath, state }] : [];
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
116
146
|
/**
|
|
117
|
-
* Resolve a task ref (bare short id
|
|
147
|
+
* Resolve a task ref (bare short id or `TASK-YYYYMMDD-HHMMSS`) to its
|
|
118
148
|
* task directory across active / blocked / completed / archive.
|
|
119
149
|
*
|
|
120
150
|
* The returned `message` on failure is command-agnostic (no `ai task <cmd>:`
|
|
121
151
|
* prefix); callers prepend their own prefix so each command keeps its existing
|
|
122
152
|
* stderr wording byte-for-byte.
|
|
123
153
|
*/
|
|
124
|
-
function resolveTaskRef(arg: string): ResolveRefResult {
|
|
125
|
-
|
|
154
|
+
function resolveTaskRef(arg: string, options: ResolveTaskRefOptions = {}): ResolveRefResult {
|
|
155
|
+
let repoRoot: string;
|
|
156
|
+
try {
|
|
157
|
+
repoRoot = options.repoRoot ? path.resolve(options.repoRoot) : detectRepoRoot();
|
|
158
|
+
} catch (error) {
|
|
159
|
+
return {
|
|
160
|
+
ok: false,
|
|
161
|
+
code: 'REPO_ROOT_NOT_FOUND',
|
|
162
|
+
message: error instanceof Error ? error.message : String(error),
|
|
163
|
+
repoRoot: null,
|
|
164
|
+
taskId: null
|
|
165
|
+
};
|
|
166
|
+
}
|
|
126
167
|
let taskId: string;
|
|
127
168
|
if (TASK_ID_RE.test(arg)) {
|
|
128
169
|
taskId = arg;
|
|
@@ -130,31 +171,151 @@ function resolveTaskRef(arg: string): ResolveRefResult {
|
|
|
130
171
|
const shortIdLength = readShortIdLength(repoRoot);
|
|
131
172
|
const normalized = normalizeShortIdInput(arg, { shortIdLength });
|
|
132
173
|
if (normalized.kind === 'error') {
|
|
133
|
-
return {
|
|
174
|
+
return {
|
|
175
|
+
ok: false,
|
|
176
|
+
code: normalized.code,
|
|
177
|
+
message: normalized.message,
|
|
178
|
+
repoRoot,
|
|
179
|
+
taskId: null
|
|
180
|
+
};
|
|
134
181
|
}
|
|
135
182
|
if (normalized.kind === 'pass') {
|
|
136
183
|
return {
|
|
137
184
|
ok: false,
|
|
185
|
+
code: 'INVALID_TASK_REF',
|
|
138
186
|
message:
|
|
139
187
|
`'${arg}' is not a valid short id or TASK-id; ` +
|
|
140
|
-
`expected bare digits
|
|
188
|
+
`expected bare digits or 'TASK-YYYYMMDD-HHMMSS'`,
|
|
189
|
+
repoRoot,
|
|
190
|
+
taskId: null
|
|
141
191
|
};
|
|
142
192
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
193
|
+
const shortResult = resolveShortIdReadOnly(normalized.value, repoRoot, { shortIdLength });
|
|
194
|
+
if (!shortResult.ok) {
|
|
195
|
+
return {
|
|
196
|
+
ok: false,
|
|
197
|
+
code: shortResult.code,
|
|
198
|
+
message: shortResult.message,
|
|
199
|
+
repoRoot,
|
|
200
|
+
taskId: shortResult.taskId
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
taskId = shortResult.taskId;
|
|
204
|
+
}
|
|
205
|
+
const located = findTaskMd(repoRoot, taskId);
|
|
206
|
+
if (!located) {
|
|
207
|
+
return {
|
|
208
|
+
ok: false,
|
|
209
|
+
code: 'TASK_NOT_FOUND',
|
|
210
|
+
message: `task ${taskId} not found in active / blocked / completed / archive`,
|
|
211
|
+
repoRoot,
|
|
212
|
+
taskId
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
ok: true,
|
|
217
|
+
repoRoot,
|
|
218
|
+
taskId,
|
|
219
|
+
taskDir: path.dirname(located.taskMdPath),
|
|
220
|
+
taskMdPath: located.taskMdPath,
|
|
221
|
+
state: located.state
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function resolveTaskContext(
|
|
226
|
+
taskRef?: string,
|
|
227
|
+
options: ResolveTaskRefOptions = {}
|
|
228
|
+
): ResolveRefResult {
|
|
229
|
+
if (taskRef !== undefined) return resolveTaskRef(taskRef, options);
|
|
230
|
+
|
|
231
|
+
let repoRoot: string;
|
|
232
|
+
try {
|
|
233
|
+
repoRoot = options.repoRoot ? path.resolve(options.repoRoot) : detectRepoRoot();
|
|
234
|
+
} catch (error) {
|
|
235
|
+
return {
|
|
236
|
+
ok: false,
|
|
237
|
+
code: 'REPO_ROOT_NOT_FOUND',
|
|
238
|
+
message: error instanceof Error ? error.message : String(error),
|
|
239
|
+
repoRoot: null,
|
|
240
|
+
taskId: null
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
let branch: string;
|
|
245
|
+
try {
|
|
246
|
+
branch = execFileSync('git', ['symbolic-ref', '--quiet', '--short', 'HEAD'], {
|
|
247
|
+
cwd: repoRoot,
|
|
248
|
+
encoding: 'utf8',
|
|
249
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
250
|
+
}).trim();
|
|
251
|
+
} catch {
|
|
252
|
+
return {
|
|
253
|
+
ok: false,
|
|
254
|
+
code: 'TASK_CONTEXT_DETACHED_HEAD',
|
|
255
|
+
message: 'cannot infer the current task from detached HEAD',
|
|
256
|
+
repoRoot,
|
|
257
|
+
taskId: null
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const activeDir = path.join(repoRoot, '.agents', 'workspace', 'active');
|
|
262
|
+
const matches: { taskId: string; taskDir: string; taskMdPath: string }[] = [];
|
|
263
|
+
if (fs.existsSync(activeDir)) {
|
|
264
|
+
for (const entry of fs.readdirSync(activeDir).sort()) {
|
|
265
|
+
if (!TASK_ID_RE.test(entry)) continue;
|
|
266
|
+
const taskDir = path.join(activeDir, entry);
|
|
267
|
+
const taskMdPath = path.join(taskDir, 'task.md');
|
|
268
|
+
if (!fs.existsSync(taskMdPath)) continue;
|
|
269
|
+
try {
|
|
270
|
+
const frontmatter = parseTaskFrontmatter(fs.readFileSync(taskMdPath, 'utf8'));
|
|
271
|
+
if (!frontmatter.id || !frontmatter.branch) {
|
|
272
|
+
return {
|
|
273
|
+
ok: false,
|
|
274
|
+
code: 'TASK_CONTEXT_UNREADABLE',
|
|
275
|
+
message: `cannot prove current task context because ${entry}/task.md has invalid frontmatter`,
|
|
276
|
+
repoRoot,
|
|
277
|
+
taskId: null
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
if (frontmatter.branch === branch) matches.push({ taskId: entry, taskDir, taskMdPath });
|
|
281
|
+
} catch (error) {
|
|
282
|
+
return {
|
|
283
|
+
ok: false,
|
|
284
|
+
code: 'TASK_CONTEXT_UNREADABLE',
|
|
285
|
+
message: `cannot read active task candidate ${entry}: ${error instanceof Error ? error.message : String(error)}`,
|
|
286
|
+
repoRoot,
|
|
287
|
+
taskId: null
|
|
288
|
+
};
|
|
289
|
+
}
|
|
147
290
|
}
|
|
148
291
|
}
|
|
149
|
-
|
|
150
|
-
if (
|
|
292
|
+
|
|
293
|
+
if (matches.length === 0) {
|
|
294
|
+
return {
|
|
295
|
+
ok: false,
|
|
296
|
+
code: 'TASK_CONTEXT_NOT_FOUND',
|
|
297
|
+
message: `no active task matches current branch '${branch}'; use --task <ref>`,
|
|
298
|
+
repoRoot,
|
|
299
|
+
taskId: null
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
if (matches.length > 1) {
|
|
151
303
|
return {
|
|
152
304
|
ok: false,
|
|
153
|
-
|
|
305
|
+
code: 'TASK_CONTEXT_AMBIGUOUS',
|
|
306
|
+
message: `multiple active tasks match current branch '${branch}'; use --task <ref>`,
|
|
307
|
+
repoRoot,
|
|
308
|
+
taskId: null
|
|
154
309
|
};
|
|
155
310
|
}
|
|
156
|
-
|
|
311
|
+
const match = matches[0]!;
|
|
312
|
+
return { ok: true, repoRoot, ...match, state: 'active' };
|
|
157
313
|
}
|
|
158
314
|
|
|
159
|
-
export { resolveTaskRef, detectRepoRoot, enumerateTaskDirs, TASK_ID_RE };
|
|
160
|
-
export type {
|
|
315
|
+
export { resolveTaskRef, resolveTaskContext, detectRepoRoot, enumerateTaskDirs, locateHotTaskDirs, TASK_ID_RE };
|
|
316
|
+
export type {
|
|
317
|
+
ResolveRefResult,
|
|
318
|
+
ResolveTaskRefErrorCode,
|
|
319
|
+
ResolveTaskRefOptions,
|
|
320
|
+
TaskWorkspaceState
|
|
321
|
+
};
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
// Shared helpers for review-artifact parsing.
|
|
2
|
-
// Imported by
|
|
3
|
-
// .agents/scripts/validate-artifact.js so the round/verdict vocabulary stays
|
|
2
|
+
// Imported by typed artifact lifecycle and verification so the round/verdict vocabulary stays
|
|
4
3
|
// in a single source of truth (prevents the cross-file drift this lifecycle
|
|
5
4
|
// is designed to eliminate).
|
|
6
5
|
import fs from "node:fs";
|
|
7
6
|
import path from "node:path";
|
|
8
7
|
|
|
9
|
-
export function escapeRegExp(value) {
|
|
8
|
+
export function escapeRegExp(value: string): string {
|
|
10
9
|
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
11
10
|
}
|
|
12
11
|
|
|
13
|
-
export function maxRound(entries, stem) {
|
|
12
|
+
export function maxRound(entries: string[], stem: string): number {
|
|
14
13
|
let max = 0;
|
|
15
14
|
for (const entry of entries) {
|
|
16
15
|
if (entry === `${stem}.md`) {
|
|
@@ -26,11 +25,11 @@ export function maxRound(entries, stem) {
|
|
|
26
25
|
return max;
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
export function artifactName(stem, round) {
|
|
28
|
+
export function artifactName(stem: string, round: number): string {
|
|
30
29
|
return round === 1 ? `${stem}.md` : `${stem}-r${round}.md`;
|
|
31
30
|
}
|
|
32
31
|
|
|
33
|
-
export function normalizeVerdict(raw) {
|
|
32
|
+
export function normalizeVerdict(raw: unknown): "Approved" | "Changes Requested" | "Rejected" | "" {
|
|
34
33
|
const value = String(raw).trim().toLowerCase();
|
|
35
34
|
if (value === "通过" || value === "approved") {
|
|
36
35
|
return "Approved";
|
|
@@ -44,12 +43,12 @@ export function normalizeVerdict(raw) {
|
|
|
44
43
|
return "";
|
|
45
44
|
}
|
|
46
45
|
|
|
47
|
-
export function extractSection(content, names) {
|
|
46
|
+
export function extractSection(content: string, names: string[]): string {
|
|
48
47
|
const lines = content.split(/\r?\n/);
|
|
49
48
|
const nameSet = new Set(names);
|
|
50
49
|
const start = lines.findIndex((line) => {
|
|
51
50
|
const match = line.trim().match(/^##\s+(.+?)\s*$/);
|
|
52
|
-
return match ? nameSet.has(match[1]) : false;
|
|
51
|
+
return match ? nameSet.has(match[1]!) : false;
|
|
53
52
|
});
|
|
54
53
|
|
|
55
54
|
if (start === -1) {
|
|
@@ -58,7 +57,7 @@ export function extractSection(content, names) {
|
|
|
58
57
|
|
|
59
58
|
const sectionLines = [];
|
|
60
59
|
for (let index = start + 1; index < lines.length; index += 1) {
|
|
61
|
-
if (/^##\s+/.test(lines[index])) {
|
|
60
|
+
if (/^##\s+/.test(lines[index]!)) {
|
|
62
61
|
break;
|
|
63
62
|
}
|
|
64
63
|
sectionLines.push(lines[index]);
|
|
@@ -69,7 +68,7 @@ export function extractSection(content, names) {
|
|
|
69
68
|
// Parse the canonical verdict out of a review-* artifact.
|
|
70
69
|
// Returns { ok, verdict, message }. Verdict collapses Approved into
|
|
71
70
|
// "Approved-with-issues" when the findings counts are non-zero.
|
|
72
|
-
export function parseVerdict(reviewPath) {
|
|
71
|
+
export function parseVerdict(reviewPath: string) {
|
|
73
72
|
if (!fs.existsSync(reviewPath)) {
|
|
74
73
|
return { ok: false, verdict: null, message: `Review artifact not found: ${path.basename(reviewPath)}` };
|
|
75
74
|
}
|
|
@@ -91,7 +90,7 @@ export function parseVerdict(reviewPath) {
|
|
|
91
90
|
return {
|
|
92
91
|
ok: false,
|
|
93
92
|
verdict: null,
|
|
94
|
-
message: `unrecognized verdict '${verdictMatch[1]
|
|
93
|
+
message: `unrecognized verdict '${verdictMatch[1]!.trim()}' in ${fileName}`
|
|
95
94
|
};
|
|
96
95
|
}
|
|
97
96
|
|
|
@@ -104,7 +103,7 @@ export function parseVerdict(reviewPath) {
|
|
|
104
103
|
return { ok: false, verdict, message: `cannot parse findings count in ${fileName}` };
|
|
105
104
|
}
|
|
106
105
|
|
|
107
|
-
const counts = findingsMatch[1]
|
|
106
|
+
const counts = findingsMatch[1]!.match(/(\d+)\s*(?:阻塞项|blockers?).*?(\d+)\s*(?:主要|majors?).*?(\d+)\s*(?:次要|minors?)/i);
|
|
108
107
|
if (!counts) {
|
|
109
108
|
return { ok: false, verdict, message: `cannot parse findings count in ${fileName}` };
|
|
110
109
|
}
|
package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts}
RENAMED
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
|
|
4
|
-
import { artifactName, maxRound } from "./review-artifacts.
|
|
4
|
+
import { artifactName, maxRound } from "./review-artifacts.ts";
|
|
5
5
|
|
|
6
6
|
// Paths excluded from the post-review coverage gate. Fail-closed: the gate
|
|
7
7
|
// covers ALL tracked changes by default. This default denylist is EMPTY —
|
|
8
8
|
// projects opt into exclusions explicitly via review.post_review_exclude_globs.
|
|
9
|
-
export const DEFAULT_POST_REVIEW_EXCLUDES = [];
|
|
9
|
+
export const DEFAULT_POST_REVIEW_EXCLUDES: string[] = [];
|
|
10
10
|
|
|
11
11
|
// Returns git pathspecs selecting "all tracked changes except project excludes".
|
|
12
12
|
// The leading ":/" makes coverage fail-closed (everything from the repo root);
|
|
13
13
|
// each exclude becomes a top-level negative pathspec. Projects extend the
|
|
14
14
|
// denylist via review.post_review_exclude_globs (union, deduped).
|
|
15
|
-
|
|
15
|
+
type ReviewGlobConfig = Record<string, unknown> & { post_review_exclude_globs?: unknown };
|
|
16
|
+
|
|
17
|
+
export function loadPostReviewConfig(repoRoot: string): ReviewGlobConfig {
|
|
18
|
+
try {
|
|
19
|
+
const config = JSON.parse(fs.readFileSync(path.join(repoRoot, ".agents", ".airc.json"), "utf8"));
|
|
20
|
+
return config.review && typeof config.review === "object" ? config.review : {};
|
|
21
|
+
} catch {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function resolvePostReviewGlobs(
|
|
27
|
+
config: ReviewGlobConfig = {},
|
|
28
|
+
reviewConfig: ReviewGlobConfig = {}
|
|
29
|
+
): string[] {
|
|
16
30
|
const projectExcludes = [
|
|
17
31
|
...(Array.isArray(reviewConfig.post_review_exclude_globs) ? reviewConfig.post_review_exclude_globs : []),
|
|
18
32
|
...(Array.isArray(config.post_review_exclude_globs) ? config.post_review_exclude_globs : [])
|
|
@@ -21,7 +35,7 @@ export function resolvePostReviewGlobs(config = {}, reviewConfig = {}) {
|
|
|
21
35
|
return [":/", ...excludes.map((p) => `:(top,exclude)${p}`)];
|
|
22
36
|
}
|
|
23
37
|
|
|
24
|
-
export function findAuthoritativeReviewCodeArtifact(taskDir) {
|
|
38
|
+
export function findAuthoritativeReviewCodeArtifact(taskDir: string) {
|
|
25
39
|
const entries = fs.existsSync(taskDir) ? fs.readdirSync(taskDir) : [];
|
|
26
40
|
const round = maxRound(entries, "review-code");
|
|
27
41
|
if (round === 0) {
|
|
@@ -37,22 +51,22 @@ export function findAuthoritativeReviewCodeArtifact(taskDir) {
|
|
|
37
51
|
};
|
|
38
52
|
}
|
|
39
53
|
|
|
40
|
-
export function extractReviewBaseline(content) {
|
|
54
|
+
export function extractReviewBaseline(content: string): string {
|
|
41
55
|
const match = String(content).match(/^[-*]?\s*\*\*(?:审查基线提交|Review Baseline Commit)\*\*[::]\s*(.*?)\s*$/m);
|
|
42
|
-
return match ? match[1]
|
|
56
|
+
return match ? match[1]!.trim().replace(/`/g, "") : "";
|
|
43
57
|
}
|
|
44
58
|
|
|
45
|
-
export function extractReviewDiffFingerprint(content) {
|
|
59
|
+
export function extractReviewDiffFingerprint(content: string): string {
|
|
46
60
|
const match = String(content).match(/^[-*]?\s*\*\*(?:审查差异指纹|Reviewed Diff Fingerprint)\*\*[::]\s*(.*?)\s*$/m);
|
|
47
|
-
return match ? match[1]
|
|
61
|
+
return match ? match[1]!.trim().replace(/`/g, "") : "";
|
|
48
62
|
}
|
|
49
63
|
|
|
50
|
-
export function extractReviewedSnapshotTree(content) {
|
|
64
|
+
export function extractReviewedSnapshotTree(content: string): string {
|
|
51
65
|
const match = String(content).match(/^[-*]?\s*\*\*(?:审查快照树|Reviewed Snapshot Tree)\*\*[::]\s*(.*?)\s*$/m);
|
|
52
|
-
return match ? match[1]
|
|
66
|
+
return match ? match[1]!.trim().replace(/`/g, "") : "";
|
|
53
67
|
}
|
|
54
68
|
|
|
55
|
-
export function parseReviewVerdict(content) {
|
|
69
|
+
export function parseReviewVerdict(content: string): string {
|
|
56
70
|
const match = String(content).match(/^[-*]?\s*\*\*(?:总体结论|Overall Verdict)\*\*[::]\s*(.*?)\s*$/m);
|
|
57
|
-
return match ? match[1]
|
|
71
|
+
return match ? match[1]!.trim() : "";
|
|
58
72
|
}
|