@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
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
-
import {
|
|
2
|
+
import { parseTaskScope } from '../command-options.js';
|
|
3
|
+
import { resolveTaskContext } from '../resolve-ref.js';
|
|
3
4
|
import { resolveArtifact } from '../artifacts.js';
|
|
4
|
-
const USAGE = `Usage: ai task cat <
|
|
5
|
+
const USAGE = `Usage: ai task cat <artifact | N>
|
|
6
|
+
ai task cat (--task <ref> | -t <ref>) <artifact | N>
|
|
7
|
+
ai task cat <ref> <artifact | N>
|
|
5
8
|
|
|
6
9
|
Prints a task artifact's raw content to stdout.
|
|
7
|
-
|
|
10
|
+
One positional Uses current task context and treats the operand as the artifact.
|
|
11
|
+
<ref> Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
|
|
8
12
|
<artifact | N> Artifact filename (with or without '.md'), or the number from 'ai task files'.
|
|
9
13
|
`;
|
|
10
14
|
function cat(args = []) {
|
|
@@ -12,12 +16,38 @@ function cat(args = []) {
|
|
|
12
16
|
process.stdout.write(USAGE);
|
|
13
17
|
return;
|
|
14
18
|
}
|
|
15
|
-
|
|
19
|
+
let scope;
|
|
20
|
+
try {
|
|
21
|
+
scope = parseTaskScope(args);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
process.stderr.write(`ai task cat: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
let taskRef;
|
|
29
|
+
let artifact;
|
|
30
|
+
if (scope.explicit) {
|
|
31
|
+
if (scope.positionals.length !== 1) {
|
|
32
|
+
process.stdout.write(USAGE);
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
taskRef = scope.taskRef;
|
|
37
|
+
artifact = scope.positionals[0];
|
|
38
|
+
}
|
|
39
|
+
else if (scope.positionals.length === 1) {
|
|
40
|
+
artifact = scope.positionals[0];
|
|
41
|
+
}
|
|
42
|
+
else if (scope.positionals.length === 2) {
|
|
43
|
+
[taskRef, artifact] = scope.positionals;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
16
46
|
process.stdout.write(USAGE);
|
|
17
47
|
process.exitCode = 1;
|
|
18
48
|
return;
|
|
19
49
|
}
|
|
20
|
-
const resolved =
|
|
50
|
+
const resolved = resolveTaskContext(taskRef);
|
|
21
51
|
if (!resolved.ok) {
|
|
22
52
|
process.stderr.write(`ai task cat: ${resolved.message}\n`);
|
|
23
53
|
process.exitCode = 1;
|
|
@@ -25,7 +55,7 @@ function cat(args = []) {
|
|
|
25
55
|
}
|
|
26
56
|
let artifactPath;
|
|
27
57
|
try {
|
|
28
|
-
artifactPath = resolveArtifact(resolved.taskDir,
|
|
58
|
+
artifactPath = resolveArtifact(resolved.taskDir, artifact);
|
|
29
59
|
}
|
|
30
60
|
catch (e) {
|
|
31
61
|
process.stderr.write(`ai task cat: ${e.message}\n`);
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { formatTable } from '../../table.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { parseTaskScope } from '../command-options.js';
|
|
5
|
+
import { resolveTaskContext } from '../resolve-ref.js';
|
|
6
|
+
import { isReviewStage, parseLedger } from '../ledger.js';
|
|
7
|
+
import { listDecisionItems, selectDecisionItem } from '../decision-items.js';
|
|
6
8
|
import { extractSubSection } from '../sections.js';
|
|
7
|
-
const USAGE = `Usage: ai task decisions <
|
|
9
|
+
const USAGE = `Usage: ai task decisions [--task <ref> | -t <ref>] [--item <selector> | -i <selector>] [options]
|
|
10
|
+
ai task decisions <ref> [selector] [options]
|
|
8
11
|
|
|
9
|
-
Lists
|
|
12
|
+
Lists decision items recorded in a task's review disagreement
|
|
10
13
|
ledger, or prints the full detail block for a single item. Read-only.
|
|
11
14
|
|
|
12
|
-
<ref>
|
|
13
|
-
|
|
15
|
+
Omit <ref> Resolve the unique active task for the current branch.
|
|
16
|
+
<ref> Legacy positional task ref.
|
|
17
|
+
[selector] Ordinal (1-based) or ledger id (e.g. 'PL-3') to show one item's detail.
|
|
14
18
|
|
|
15
19
|
Options:
|
|
20
|
+
-i, --item <s> Select an item when task scope is implicit or flag-based.
|
|
16
21
|
--all Include already-decided (human-decided) items, not just pending.
|
|
17
22
|
--stage <s> Filter to one stage: analysis | plan | code.
|
|
18
23
|
--format <fmt> Output format: text (default) | markdown.
|
|
@@ -20,9 +25,7 @@ Options:
|
|
|
20
25
|
|
|
21
26
|
Aliased as 'ai task d'.
|
|
22
27
|
`;
|
|
23
|
-
const STAGES = new Set(['analysis', 'plan', 'code']);
|
|
24
28
|
const FORMATS = new Set(['text', 'markdown']);
|
|
25
|
-
const HD_ID_RE = /^HD-\d+$/;
|
|
26
29
|
function fail(message) {
|
|
27
30
|
process.stderr.write(`ai task decisions: ${message}\n`);
|
|
28
31
|
process.exitCode = 1;
|
|
@@ -35,6 +38,30 @@ function parseArgs(args) {
|
|
|
35
38
|
if (a === '--all') {
|
|
36
39
|
out.all = true;
|
|
37
40
|
}
|
|
41
|
+
else if (a === '--item' || a === '-i') {
|
|
42
|
+
const v = args[i + 1];
|
|
43
|
+
if (v === undefined) {
|
|
44
|
+
fail(`${a} requires a value`);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (out.item !== undefined) {
|
|
48
|
+
fail("duplicate option '--item'");
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
out.item = v;
|
|
52
|
+
i += 1;
|
|
53
|
+
}
|
|
54
|
+
else if (a.startsWith('--item=')) {
|
|
55
|
+
if (out.item !== undefined) {
|
|
56
|
+
fail("duplicate option '--item'");
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
out.item = a.slice('--item='.length);
|
|
60
|
+
if (out.item === '') {
|
|
61
|
+
fail('--item requires a value');
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
38
65
|
else if (a === '--stage') {
|
|
39
66
|
const v = args[i + 1];
|
|
40
67
|
if (v === undefined) {
|
|
@@ -78,7 +105,7 @@ function roundOf(file) {
|
|
|
78
105
|
const m = /-r(\d+)\.md$/.exec(file);
|
|
79
106
|
return m ? Number.parseInt(m[1], 10) : 1;
|
|
80
107
|
}
|
|
81
|
-
// Locate the `###
|
|
108
|
+
// Locate the `### {ledger-id}` detail block for a row. Prefer the artifact named by the
|
|
82
109
|
// row's evidence anchor; otherwise scan analysis/plan/code artifacts and return
|
|
83
110
|
// the block from the highest-round file that contains it. Returns '' when none
|
|
84
111
|
// is found (caller degrades gracefully — plan B3).
|
|
@@ -112,12 +139,12 @@ function findDetailBlock(row, taskDir) {
|
|
|
112
139
|
}
|
|
113
140
|
return best;
|
|
114
141
|
}
|
|
115
|
-
// Pull the `## 人工裁决` record lines that mention this
|
|
142
|
+
// Pull the `## 人工裁决` record lines that mention this ledger id, so a decided item
|
|
116
143
|
// shows the human's recorded ruling alongside its detail block.
|
|
117
144
|
function findDecisionRecord(id, content) {
|
|
118
145
|
const lines = content.split('\n');
|
|
119
146
|
let i = 0;
|
|
120
|
-
while (i < lines.length && !/^##\s+(人工裁决|Human Decisions?)\s*$/.test(lines[i]))
|
|
147
|
+
while (i < lines.length && !/^##\s+(人工裁决|Human Rulings|Human Decisions?)\s*$/.test(lines[i]))
|
|
121
148
|
i += 1;
|
|
122
149
|
if (i >= lines.length)
|
|
123
150
|
return [];
|
|
@@ -170,29 +197,12 @@ function renderList(rows, format, taskDir) {
|
|
|
170
197
|
process.stdout.write(`${formatTable(headers, data).join('\n')}\n`);
|
|
171
198
|
}
|
|
172
199
|
function renderDetail(rows, selector, format, taskDir, content) {
|
|
173
|
-
|
|
174
|
-
if (
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
fail(`ordinal '${selector}' out of range (1..${rows.length})`);
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
row = rows[idx];
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
const want = selector.toUpperCase();
|
|
184
|
-
const matches = rows.filter((r) => r.id.toUpperCase() === want);
|
|
185
|
-
if (matches.length === 0) {
|
|
186
|
-
fail(`no decision item matches '${selector}'`);
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
if (matches.length > 1) {
|
|
190
|
-
fail(`duplicate id '${selector}' in ledger; select by ordinal instead`);
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
row = matches[0];
|
|
200
|
+
const selected = selectDecisionItem(rows, selector);
|
|
201
|
+
if (!selected.ok) {
|
|
202
|
+
fail(selected.message);
|
|
203
|
+
return;
|
|
194
204
|
}
|
|
195
|
-
const r = row;
|
|
205
|
+
const r = selected.row;
|
|
196
206
|
const block = findDetailBlock(r, taskDir);
|
|
197
207
|
const lines = [];
|
|
198
208
|
if (format === 'markdown') {
|
|
@@ -220,15 +230,18 @@ function decisions(args = []) {
|
|
|
220
230
|
process.stdout.write(USAGE);
|
|
221
231
|
return;
|
|
222
232
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
233
|
+
let scope;
|
|
234
|
+
try {
|
|
235
|
+
scope = parseTaskScope(args);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
fail(error instanceof Error ? error.message : String(error));
|
|
229
239
|
return;
|
|
230
240
|
}
|
|
231
|
-
|
|
241
|
+
const parsed = parseArgs(scope.positionals);
|
|
242
|
+
if (!parsed)
|
|
243
|
+
return;
|
|
244
|
+
if (parsed.stage !== undefined && !isReviewStage(parsed.stage)) {
|
|
232
245
|
fail(`invalid --stage '${parsed.stage}' (expected analysis|plan|code)`);
|
|
233
246
|
return;
|
|
234
247
|
}
|
|
@@ -236,17 +249,38 @@ function decisions(args = []) {
|
|
|
236
249
|
fail(`invalid --format '${parsed.format}' (expected text|markdown)`);
|
|
237
250
|
return;
|
|
238
251
|
}
|
|
239
|
-
|
|
252
|
+
let taskRef = scope.taskRef;
|
|
253
|
+
let selector = parsed.item;
|
|
254
|
+
if (parsed.item !== undefined) {
|
|
255
|
+
if (parsed.positionals.length > 0) {
|
|
256
|
+
fail('positional task ref/selector cannot be combined with --item');
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else if (scope.explicit) {
|
|
261
|
+
if (parsed.positionals.length > 0) {
|
|
262
|
+
fail('positional task ref/selector cannot be combined with --task');
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
if (parsed.positionals.length > 2) {
|
|
268
|
+
fail('too many positional arguments');
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
taskRef = parsed.positionals[0];
|
|
272
|
+
selector = parsed.positionals[1];
|
|
273
|
+
}
|
|
274
|
+
const resolved = resolveTaskContext(taskRef);
|
|
240
275
|
if (!resolved.ok) {
|
|
241
276
|
fail(resolved.message);
|
|
242
277
|
return;
|
|
243
278
|
}
|
|
244
279
|
const content = fs.readFileSync(resolved.taskMdPath, 'utf8');
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
const selector = parsed.positionals[1];
|
|
280
|
+
const rows = listDecisionItems(parseLedger(content), {
|
|
281
|
+
includeDecided: parsed.all,
|
|
282
|
+
stage: parsed.stage
|
|
283
|
+
});
|
|
250
284
|
if (selector === undefined) {
|
|
251
285
|
renderList(rows, parsed.format, resolved.taskDir);
|
|
252
286
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { formatTable } from '../../table.js';
|
|
2
|
-
import {
|
|
2
|
+
import { parseTaskScope } from '../command-options.js';
|
|
3
|
+
import { resolveTaskContext } from '../resolve-ref.js';
|
|
3
4
|
import { enumerateArtifacts } from '../artifacts.js';
|
|
4
|
-
const USAGE = `Usage: ai task files <N |
|
|
5
|
+
const USAGE = `Usage: ai task files [<N | TASK-id> | --task <ref> | -t <ref>]
|
|
5
6
|
|
|
6
7
|
Lists the artifacts in a task directory with stable numbers.
|
|
7
|
-
<ref>
|
|
8
|
+
Omit <ref> Resolve the unique active task for the current branch.
|
|
9
|
+
<ref> Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
|
|
8
10
|
|
|
9
11
|
Columns: # (artifact number, usable with 'ai task cat') / NAME / SIZE (bytes) / MTIME
|
|
10
12
|
`;
|
|
@@ -18,13 +20,25 @@ function formatMtime(mtimeMs) {
|
|
|
18
20
|
`${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`);
|
|
19
21
|
}
|
|
20
22
|
function files(args = []) {
|
|
21
|
-
if (args
|
|
23
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
22
24
|
process.stdout.write(USAGE);
|
|
23
|
-
if (args.length === 0)
|
|
24
|
-
process.exitCode = 1;
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
-
|
|
27
|
+
let scope;
|
|
28
|
+
try {
|
|
29
|
+
scope = parseTaskScope(args);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
process.stderr.write(`ai task files: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
|
|
37
|
+
process.stderr.write('ai task files: task ref must be provided once\n');
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
|
|
28
42
|
if (!resolved.ok) {
|
|
29
43
|
process.stderr.write(`ai task files: ${resolved.message}\n`);
|
|
30
44
|
process.exitCode = 1;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { resolveTaskRef, detectRepoRoot, enumerateTaskDirs } from '../resolve-ref.js';
|
|
3
|
+
import { resolveTaskContext, resolveTaskRef, detectRepoRoot, enumerateTaskDirs } from '../resolve-ref.js';
|
|
4
4
|
import { enumerateArtifacts, resolveArtifact } from '../artifacts.js';
|
|
5
5
|
import { loadShortIdByTaskId } from '../short-id.js';
|
|
6
6
|
const USAGE = `Usage: ai task grep <pattern> [ref] [artifact | N]
|
|
7
|
+
ai task grep <pattern> (--current | --task <ref> | -t <ref>) [artifact | N]
|
|
7
8
|
|
|
8
9
|
Literal (non-regex) line search across task artifacts.
|
|
9
10
|
<pattern> Literal substring to match (NOT a regex). Case-sensitive by default.
|
|
10
|
-
[ref] Bare numeric
|
|
11
|
+
[ref] Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
|
|
11
12
|
Omit to scan every task under active / blocked / completed
|
|
12
13
|
(archive is skipped). With a ref, narrows to that single task
|
|
13
14
|
(a TASK-id ref can also resolve an archived task).
|
|
@@ -16,6 +17,8 @@ Literal (non-regex) line search across task artifacts.
|
|
|
16
17
|
|
|
17
18
|
Options:
|
|
18
19
|
-i, --ignore-case Case-insensitive matching.
|
|
20
|
+
--current Limit search to the current task context.
|
|
21
|
+
-t, --task <ref> Limit search to an explicit task.
|
|
19
22
|
-- Treat the rest as positional (use for patterns starting with '-').
|
|
20
23
|
|
|
21
24
|
Output: '{taskId} [#short] {fileStem}:{line}: {matched-line}' (short id only for active tasks).
|
|
@@ -52,8 +55,11 @@ function scanArtifact(taskId, shortToken, artifactPath, matcher, emit) {
|
|
|
52
55
|
function grep(args = []) {
|
|
53
56
|
const positional = [];
|
|
54
57
|
let ignoreCase = false;
|
|
58
|
+
let current = false;
|
|
59
|
+
let taskRef;
|
|
55
60
|
let optsEnded = false;
|
|
56
|
-
for (
|
|
61
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
62
|
+
const a = args[index];
|
|
57
63
|
if (!optsEnded && a === '--') {
|
|
58
64
|
optsEnded = true;
|
|
59
65
|
continue;
|
|
@@ -66,6 +72,39 @@ function grep(args = []) {
|
|
|
66
72
|
ignoreCase = true;
|
|
67
73
|
continue;
|
|
68
74
|
}
|
|
75
|
+
if (!optsEnded && a === '--current') {
|
|
76
|
+
current = true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (!optsEnded && (a === '--task' || a === '-t')) {
|
|
80
|
+
if (taskRef !== undefined) {
|
|
81
|
+
process.stderr.write("ai task grep: duplicate option '--task'\n");
|
|
82
|
+
process.exitCode = 1;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const value = args[++index];
|
|
86
|
+
if (!value || value.startsWith('-')) {
|
|
87
|
+
process.stderr.write(`ai task grep: ${a} requires a value\n`);
|
|
88
|
+
process.exitCode = 1;
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
taskRef = value;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (!optsEnded && a.startsWith('--task=')) {
|
|
95
|
+
if (taskRef !== undefined) {
|
|
96
|
+
process.stderr.write("ai task grep: duplicate option '--task'\n");
|
|
97
|
+
process.exitCode = 1;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
taskRef = a.slice('--task='.length);
|
|
101
|
+
if (taskRef === '') {
|
|
102
|
+
process.stderr.write('ai task grep: --task requires a value\n');
|
|
103
|
+
process.exitCode = 1;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
69
108
|
if (!optsEnded && a.startsWith('-') && a !== '-') {
|
|
70
109
|
process.stderr.write(`ai task grep: unknown flag: ${a}\n`);
|
|
71
110
|
process.exitCode = 1;
|
|
@@ -78,17 +117,26 @@ function grep(args = []) {
|
|
|
78
117
|
process.exitCode = 1;
|
|
79
118
|
return;
|
|
80
119
|
}
|
|
81
|
-
if (
|
|
120
|
+
if (current && taskRef !== undefined) {
|
|
121
|
+
process.stderr.write('ai task grep: --current and --task are mutually exclusive\n');
|
|
122
|
+
process.exitCode = 1;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (positional.length > 3 || ((current || taskRef !== undefined) && positional.length > 2)) {
|
|
82
126
|
process.stderr.write('ai task grep: too many arguments\n');
|
|
83
127
|
process.exitCode = 1;
|
|
84
128
|
return;
|
|
85
129
|
}
|
|
86
|
-
|
|
130
|
+
let [pattern, ref, artifactOrN] = positional;
|
|
131
|
+
if (current || taskRef !== undefined) {
|
|
132
|
+
artifactOrN = ref;
|
|
133
|
+
ref = taskRef;
|
|
134
|
+
}
|
|
87
135
|
const matcher = makeMatcher(pattern, ignoreCase);
|
|
88
136
|
const chunks = [];
|
|
89
137
|
const emit = (line) => chunks.push(line);
|
|
90
138
|
let total = 0;
|
|
91
|
-
if (ref === undefined) {
|
|
139
|
+
if (ref === undefined && !current) {
|
|
92
140
|
// No ref: full scan across active / blocked / completed (no archive).
|
|
93
141
|
let repoRoot;
|
|
94
142
|
try {
|
|
@@ -108,7 +156,7 @@ function grep(args = []) {
|
|
|
108
156
|
}
|
|
109
157
|
}
|
|
110
158
|
else {
|
|
111
|
-
const resolved = resolveTaskRef(ref);
|
|
159
|
+
const resolved = current ? resolveTaskContext() : resolveTaskRef(ref);
|
|
112
160
|
if (!resolved.ok) {
|
|
113
161
|
process.stderr.write(`ai task grep: ${resolved.message}\n`);
|
|
114
162
|
process.exitCode = 1;
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
-
import {
|
|
2
|
+
import { parseTaskScope } from '../command-options.js';
|
|
3
|
+
import { resolveTaskContext } from '../resolve-ref.js';
|
|
3
4
|
import { extractTitle } from '../frontmatter.js';
|
|
4
5
|
import { extractSection, findSectionHeading } from '../sections.js';
|
|
5
6
|
import { renderTemplateBody, PLACEHOLDER } from '../issue-form.js';
|
|
6
|
-
const USAGE = `Usage: ai task issue-body <
|
|
7
|
+
const USAGE = `Usage: ai task issue-body [<ref> | --task <ref> | -t <ref>] [--template <path>]
|
|
7
8
|
|
|
8
9
|
Print a deterministic Issue body extracted from a task's task.md.
|
|
9
|
-
<ref>
|
|
10
|
+
Omit <ref> Resolve the unique active task for the current branch.
|
|
11
|
+
<ref> Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
|
|
10
12
|
--template <path> Render the final body for the given GitHub Issue Form (scenario A);
|
|
11
|
-
without it, print the default '描述 + 需求' body (scenario B).
|
|
13
|
+
without it, print the default '任务输入 + 描述 + 需求' body (scenario B).
|
|
12
14
|
|
|
13
|
-
Only the task title, '## 描述' and '## 需求' sections are ever
|
|
14
|
-
task.md
|
|
15
|
+
Only the task title, '## 任务输入', '## 描述' and '## 需求' sections are ever
|
|
16
|
+
emitted; the rest of task.md is never written to the body.
|
|
15
17
|
`;
|
|
18
|
+
const TASK_INPUT_ALIASES = ['任务输入', 'Task Input'];
|
|
16
19
|
const DESCRIPTION_ALIASES = ['描述', 'Description'];
|
|
17
20
|
const REQUIREMENTS_ALIASES = ['需求', 'Requirements'];
|
|
18
21
|
/**
|
|
@@ -20,49 +23,60 @@ const REQUIREMENTS_ALIASES = ['需求', 'Requirements'];
|
|
|
20
23
|
* task.md actually uses, with empty sections falling back to `N/A`.
|
|
21
24
|
*/
|
|
22
25
|
function buildDefaultBody(content) {
|
|
26
|
+
const taskInputHeading = findSectionHeading(content, TASK_INPUT_ALIASES);
|
|
23
27
|
const descHeading = findSectionHeading(content, DESCRIPTION_ALIASES);
|
|
24
28
|
const reqHeading = findSectionHeading(content, REQUIREMENTS_ALIASES);
|
|
29
|
+
const taskInput = extractSection(content, TASK_INPUT_ALIASES) || PLACEHOLDER;
|
|
25
30
|
const description = extractSection(content, DESCRIPTION_ALIASES) || PLACEHOLDER;
|
|
26
31
|
const requirements = extractSection(content, REQUIREMENTS_ALIASES) || PLACEHOLDER;
|
|
27
|
-
return `## ${descHeading}\n\n${description}\n\n## ${reqHeading}\n\n${requirements}\n`;
|
|
32
|
+
return `## ${taskInputHeading}\n\n${taskInput}\n\n## ${descHeading}\n\n${description}\n\n## ${reqHeading}\n\n${requirements}\n`;
|
|
28
33
|
}
|
|
29
34
|
function readTaskFields(content) {
|
|
30
35
|
return {
|
|
31
36
|
title: extractTitle(content),
|
|
32
37
|
description: extractSection(content, DESCRIPTION_ALIASES),
|
|
33
|
-
requirements: extractSection(content, REQUIREMENTS_ALIASES)
|
|
38
|
+
requirements: extractSection(content, REQUIREMENTS_ALIASES),
|
|
39
|
+
taskInput: extractSection(content, TASK_INPUT_ALIASES),
|
|
40
|
+
taskInputHeading: findSectionHeading(content, TASK_INPUT_ALIASES)
|
|
34
41
|
};
|
|
35
42
|
}
|
|
36
43
|
function issueBody(args = []) {
|
|
37
|
-
if (args
|
|
44
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
38
45
|
process.stdout.write(USAGE);
|
|
39
|
-
if (args.length === 0)
|
|
40
|
-
process.exitCode = 1;
|
|
41
46
|
return;
|
|
42
47
|
}
|
|
43
|
-
let ref;
|
|
44
48
|
let templatePath;
|
|
49
|
+
const scopeArgs = [];
|
|
45
50
|
for (let i = 0; i < args.length; i += 1) {
|
|
46
51
|
const arg = args[i];
|
|
47
52
|
if (arg === '--template') {
|
|
48
53
|
templatePath = args[i + 1];
|
|
49
54
|
i += 1;
|
|
50
55
|
}
|
|
51
|
-
else
|
|
52
|
-
|
|
56
|
+
else {
|
|
57
|
+
scopeArgs.push(arg);
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
|
-
if (
|
|
56
|
-
process.stderr.write('ai task issue-body:
|
|
60
|
+
if (templatePath === undefined && args.includes('--template')) {
|
|
61
|
+
process.stderr.write('ai task issue-body: --template requires a path\n');
|
|
57
62
|
process.exitCode = 1;
|
|
58
63
|
return;
|
|
59
64
|
}
|
|
60
|
-
|
|
61
|
-
|
|
65
|
+
let scope;
|
|
66
|
+
try {
|
|
67
|
+
scope = parseTaskScope(scopeArgs);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
process.stderr.write(`ai task issue-body: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
71
|
+
process.exitCode = 1;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
|
|
75
|
+
process.stderr.write('ai task issue-body: task ref must be provided once\n');
|
|
62
76
|
process.exitCode = 1;
|
|
63
77
|
return;
|
|
64
78
|
}
|
|
65
|
-
const resolved =
|
|
79
|
+
const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
|
|
66
80
|
if (!resolved.ok) {
|
|
67
81
|
process.stderr.write(`ai task issue-body: ${resolved.message}\n`);
|
|
68
82
|
process.exitCode = 1;
|