@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,13 +1,16 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import { formatTable } from '../../table.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
3
|
+
import { parseTaskScope } from '../command-options.js';
|
|
4
|
+
import { resolveTaskContext } from '../resolve-ref.js';
|
|
5
|
+
import { isReviewStage, parseLedger } from '../ledger.js';
|
|
6
|
+
import { parseActivityLog, pairEntries } from '../activity-log.js';
|
|
7
|
+
const USAGE = `Usage: ai task log [<N | TASK-id> | --task <ref> | -t <ref>]
|
|
6
8
|
|
|
7
9
|
Renders a task's activity log as a per-step status table. A step's start and
|
|
8
10
|
completion are paired onto one row: STARTED holds the start time, DONE the
|
|
9
11
|
completion time (or '(in progress)' while still running).
|
|
10
|
-
<ref>
|
|
12
|
+
Omit <ref> Resolve the unique active task for the current branch.
|
|
13
|
+
<ref> Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
|
|
11
14
|
|
|
12
15
|
Columns: # (row) / STEP / AGENT / STARTED / DONE / NOTE
|
|
13
16
|
A human-executed step shows AGENT as 'human' and, when it has no start marker,
|
|
@@ -17,17 +20,16 @@ Columns: # (row) / STEP / AGENT / STARTED / DONE / NOTE
|
|
|
17
20
|
`;
|
|
18
21
|
const TABLE_HEADERS = ['#', 'STEP', 'AGENT', 'STARTED', 'DONE', 'NOTE'];
|
|
19
22
|
// The activity-log H2 heading is language-dependent (zh template / en template).
|
|
20
|
-
const HEADING_RE = /^##\s+(活动日志|Activity Log)\s*$/;
|
|
21
|
-
const NEXT_H2_RE = /^##\s/;
|
|
22
23
|
// `- {time} — **{step}** by {agent} — {note}` ; the separator is an em-dash
|
|
23
24
|
// (U+2014). STEP/AGENT are non-greedy so a note that itself contains ' — ' or
|
|
24
25
|
// '→' is not mis-split; NOTE greedily takes the rest of the line.
|
|
25
|
-
|
|
26
|
+
// One rendered row = one step instance. `started`/`done` are timestamps; an empty
|
|
27
|
+
// `done` with a non-empty `started` means the step is still in flight, while an
|
|
28
|
+
// empty `started` is a historical done-only entry (no start marker was written).
|
|
26
29
|
// A start marker reuses the normal entry grammar and only suffixes its action
|
|
27
30
|
// with ` [started]`; the matching done entry carries the identical base action
|
|
28
31
|
// without the suffix. Pairing therefore keys on the base action (including any
|
|
29
32
|
// `(Round N)`), so every round and every repeated execution pairs on its own.
|
|
30
|
-
const STARTED_SUFFIX_RE = /\s*\[started\]\s*$/;
|
|
31
33
|
// Short agent tokens that actually appear in activity logs for AI executors
|
|
32
34
|
// (workflow recommended_agents claude/codex/gemini/cursor + enabled TUI opencode;
|
|
33
35
|
// note these differ from the `.airc.json` long names claude-code/gemini-cli).
|
|
@@ -38,65 +40,11 @@ const REVIEW_STAGE_PREFIXES = [
|
|
|
38
40
|
{ prefix: 'Review Plan', stage: 'plan' },
|
|
39
41
|
{ prefix: 'Review Code', stage: 'code' }
|
|
40
42
|
];
|
|
41
|
-
function parseActivityLog(content) {
|
|
42
|
-
const lines = content.split('\n');
|
|
43
|
-
let i = 0;
|
|
44
|
-
while (i < lines.length && !HEADING_RE.test(lines[i]))
|
|
45
|
-
i += 1;
|
|
46
|
-
if (i >= lines.length)
|
|
47
|
-
return { sectionFound: false, entries: [] };
|
|
48
|
-
const parsed = [];
|
|
49
|
-
for (let j = i + 1; j < lines.length; j += 1) {
|
|
50
|
-
if (NEXT_H2_RE.test(lines[j]))
|
|
51
|
-
break;
|
|
52
|
-
const m = ENTRY_RE.exec(lines[j]);
|
|
53
|
-
if (!m)
|
|
54
|
-
continue; // skip blank / non-entry / malformed lines
|
|
55
|
-
parsed.push({
|
|
56
|
-
entry: { time: m[1], step: m[2], agent: m[3], note: m[4] },
|
|
57
|
-
epoch: Date.parse(m[1].replace(' ', 'T')),
|
|
58
|
-
order: parsed.length
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
// Ascending by time; stable tie-break on original order for equal timestamps.
|
|
62
|
-
parsed.sort((a, b) => a.epoch - b.epoch || a.order - b.order);
|
|
63
|
-
return { sectionFound: true, entries: parsed.map((p) => p.entry) };
|
|
64
|
-
}
|
|
65
43
|
// Collapse a chronological entry list into per-step rows: a `[started]` marker
|
|
66
44
|
// opens a row, the next matching done entry fills it in place (FIFO per base
|
|
67
45
|
// action). Started-only rows stay in flight; done-only entries (legacy logs with
|
|
68
46
|
// no start marker) render as standalone rows. Result order = first-seen order,
|
|
69
47
|
// which is already ascending because `entries` is sorted ascending.
|
|
70
|
-
function pairEntries(entries) {
|
|
71
|
-
const rows = [];
|
|
72
|
-
const open = new Map();
|
|
73
|
-
for (const e of entries) {
|
|
74
|
-
const isStarted = STARTED_SUFFIX_RE.test(e.step);
|
|
75
|
-
const base = e.step.replace(STARTED_SUFFIX_RE, '');
|
|
76
|
-
if (isStarted) {
|
|
77
|
-
const row = { step: base, agent: e.agent, started: e.time, done: '', note: e.note };
|
|
78
|
-
rows.push(row);
|
|
79
|
-
const queue = open.get(base);
|
|
80
|
-
if (queue)
|
|
81
|
-
queue.push(row);
|
|
82
|
-
else
|
|
83
|
-
open.set(base, [row]);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
const pending = open.get(base)?.shift();
|
|
87
|
-
if (pending) {
|
|
88
|
-
// Done fills the open row; the done entry carries the meaningful note.
|
|
89
|
-
pending.done = e.time;
|
|
90
|
-
pending.agent = e.agent;
|
|
91
|
-
pending.note = e.note;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
rows.push({ step: base, agent: e.agent, started: '', done: e.time, note: e.note });
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return rows;
|
|
99
|
-
}
|
|
100
48
|
function countHumanDecisionsByStage(rows) {
|
|
101
49
|
const counts = new Map();
|
|
102
50
|
for (const row of rows) {
|
|
@@ -106,9 +54,6 @@ function countHumanDecisionsByStage(rows) {
|
|
|
106
54
|
}
|
|
107
55
|
return counts;
|
|
108
56
|
}
|
|
109
|
-
function isReviewStage(stage) {
|
|
110
|
-
return stage === 'analysis' || stage === 'plan' || stage === 'code';
|
|
111
|
-
}
|
|
112
57
|
function reviewStageForStep(step) {
|
|
113
58
|
return REVIEW_STAGE_PREFIXES.find(({ prefix }) => step.startsWith(prefix))?.stage;
|
|
114
59
|
}
|
|
@@ -160,13 +105,25 @@ function foldHumanCounts(note, decisions, manualValidation) {
|
|
|
160
105
|
return `${[...fields, group].join(', ')}${suffix}`;
|
|
161
106
|
}
|
|
162
107
|
function log(args = []) {
|
|
163
|
-
if (args
|
|
108
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
164
109
|
process.stdout.write(USAGE);
|
|
165
|
-
if (args.length === 0)
|
|
166
|
-
process.exitCode = 1;
|
|
167
110
|
return;
|
|
168
111
|
}
|
|
169
|
-
|
|
112
|
+
let scope;
|
|
113
|
+
try {
|
|
114
|
+
scope = parseTaskScope(args);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
process.stderr.write(`ai task log: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
|
|
122
|
+
process.stderr.write('ai task log: task ref must be provided once\n');
|
|
123
|
+
process.exitCode = 1;
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
|
|
170
127
|
if (!resolved.ok) {
|
|
171
128
|
process.stderr.write(`ai task log: ${resolved.message}\n`);
|
|
172
129
|
process.exitCode = 1;
|
|
@@ -201,5 +158,5 @@ function log(args = []) {
|
|
|
201
158
|
}
|
|
202
159
|
process.stdout.write(`Total: ${steps.length} steps\n`);
|
|
203
160
|
}
|
|
204
|
-
export { log,
|
|
161
|
+
export { log, isHumanAgent };
|
|
205
162
|
//# sourceMappingURL=log.js.map
|
|
@@ -1,20 +1,33 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { parseTaskScope } from '../command-options.js';
|
|
3
|
+
import { resolveTaskContext } from '../resolve-ref.js';
|
|
4
|
+
const USAGE = `Usage: ai task show [<N | TASK-id> | --task <ref> | -t <ref>]
|
|
4
5
|
|
|
5
6
|
Prints the task.md content for the matching task.
|
|
7
|
+
Omit the ref Resolve the unique active task for the current branch.
|
|
6
8
|
N (bare numeric) Recommended; resolves the active short id via the registry.
|
|
7
|
-
'#N' Compatibility form for old commands.
|
|
8
9
|
TASK-YYYYMMDD-HHMMSS Locates a task in active / blocked / completed / archive.
|
|
9
10
|
`;
|
|
10
11
|
function show(args = []) {
|
|
11
|
-
if (args
|
|
12
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
12
13
|
process.stdout.write(USAGE);
|
|
13
|
-
if (args.length === 0)
|
|
14
|
-
process.exitCode = 1;
|
|
15
14
|
return;
|
|
16
15
|
}
|
|
17
|
-
|
|
16
|
+
let scope;
|
|
17
|
+
try {
|
|
18
|
+
scope = parseTaskScope(args);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
process.stderr.write(`ai task show: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
|
|
26
|
+
process.stderr.write('ai task show: task ref must be provided once\n');
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
|
|
18
31
|
if (!resolved.ok) {
|
|
19
32
|
process.stderr.write(`ai task show: ${resolved.message}\n`);
|
|
20
33
|
process.exitCode = 1;
|
|
@@ -2,18 +2,20 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { execFileSync } from 'node:child_process';
|
|
4
4
|
import { commandForEngine } from '../../sandbox/shell.js';
|
|
5
|
-
import {
|
|
5
|
+
import { parseTaskScope } from '../command-options.js';
|
|
6
|
+
import { resolveTaskContext, resolveTaskRef } from '../resolve-ref.js';
|
|
6
7
|
import { enumerateArtifacts } from '../artifacts.js';
|
|
7
8
|
import { parseTaskFrontmatter, extractTitle } from '../frontmatter.js';
|
|
8
9
|
import { loadShortIdByTaskId } from '../short-id.js';
|
|
9
10
|
import { getOpenWorkflowWarnings, formatWorkflowWarningSummary } from '../workflow-warnings.js';
|
|
10
|
-
import { parseActivityLog, pairEntries } from '
|
|
11
|
+
import { parseActivityLog, pairEntries } from '../activity-log.js';
|
|
11
12
|
import { statusCard } from '../../server/display.js';
|
|
12
|
-
const USAGE = `Usage: ai task status <N |
|
|
13
|
+
const USAGE = `Usage: ai task status [<N | TASK-id> | --task <ref> | -t <ref>]
|
|
13
14
|
|
|
14
15
|
Prints an aggregated "health check" view for a task: header, metadata,
|
|
15
16
|
artifacts, workflow/runtime execution state, and git branch state.
|
|
16
|
-
<ref>
|
|
17
|
+
Omit <ref> Resolve the unique active task for the current branch.
|
|
18
|
+
<ref> Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
|
|
17
19
|
|
|
18
20
|
Git rows are best-effort: a failed git call degrades that row to '-' without
|
|
19
21
|
failing the command.
|
|
@@ -361,15 +363,23 @@ function statusModelToDisplay(model) {
|
|
|
361
363
|
], renderStatus(model).join('\n'));
|
|
362
364
|
}
|
|
363
365
|
function status(args = []) {
|
|
364
|
-
if (args
|
|
366
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
365
367
|
process.stdout.write(USAGE);
|
|
366
|
-
if (args.length === 0)
|
|
367
|
-
process.exitCode = 1;
|
|
368
368
|
return;
|
|
369
369
|
}
|
|
370
370
|
let model;
|
|
371
371
|
try {
|
|
372
|
-
|
|
372
|
+
const scope = parseTaskScope(args);
|
|
373
|
+
if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
|
|
374
|
+
throw new Error('task ref must be provided once');
|
|
375
|
+
}
|
|
376
|
+
const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
|
|
377
|
+
if (!resolved.ok)
|
|
378
|
+
throw new Error(resolved.message);
|
|
379
|
+
model = buildFromResolved({
|
|
380
|
+
taskId: resolved.taskId, taskDir: resolved.taskDir, taskMdPath: resolved.taskMdPath,
|
|
381
|
+
repoRoot: resolved.repoRoot
|
|
382
|
+
});
|
|
373
383
|
}
|
|
374
384
|
catch (error) {
|
|
375
385
|
process.stderr.write(`ai task status: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { appendActivityEntry, locateActivityLog } from './activity-log.js';
|
|
3
|
+
import { isDecisionItem, listDecisionItems, selectDecisionItem } from './decision-items.js';
|
|
4
|
+
import { createImplementationInput, IMPLEMENTATION_INPUT_ALIASES, parseImplementationInputs, renderImplementationInputs } from './implementation-inputs.js';
|
|
5
|
+
import { LEDGER_COLUMNS, LEDGER_HEADINGS, parseLedger } from './ledger.js';
|
|
6
|
+
import { resolveTaskContext } from './resolve-ref.js';
|
|
7
|
+
import { extractSection, extractSubSection, findSectionHeading } from './sections.js';
|
|
8
|
+
import { captureTaskWriteMetadata, writeTask } from './write.js';
|
|
9
|
+
const DECISION_ALIASES = ['人工裁决', 'Human Rulings', 'Human Decisions', 'Human Decision'];
|
|
10
|
+
const ACTIVITY_ALIASES = ['活动日志', 'Activity Log'];
|
|
11
|
+
function failed(code, message, taskId = null, ledgerId = null) {
|
|
12
|
+
return { status: 'failed', changed: false, taskId, ledgerId, recordId: null, implementationInputId: null, operations: [], error: { code, message } };
|
|
13
|
+
}
|
|
14
|
+
function nextRecordId(content) {
|
|
15
|
+
let max = 0;
|
|
16
|
+
for (const match of content.matchAll(/^###\s+HDR-(\d+)\s*$/gm))
|
|
17
|
+
max = Math.max(max, Number(match[1]));
|
|
18
|
+
return `HDR-${max + 1}`;
|
|
19
|
+
}
|
|
20
|
+
function classifyMissing(rows, selector) {
|
|
21
|
+
const matches = rows.filter((row) => row.id.toUpperCase() === selector.toUpperCase());
|
|
22
|
+
const valid = matches.filter(isDecisionItem);
|
|
23
|
+
if (valid.some((row) => row.status === 'human-decided'))
|
|
24
|
+
return `${selector} is already decided`;
|
|
25
|
+
if (valid.length > 0)
|
|
26
|
+
return `${selector} is not a pending review decision`;
|
|
27
|
+
if (matches.length > 0 || !/^(AN|PL|CD|HD)-\d+$/i.test(selector))
|
|
28
|
+
return `${selector} is an invalid decision item`;
|
|
29
|
+
return `${selector} not found in review ledger`;
|
|
30
|
+
}
|
|
31
|
+
function prependBlock(body, block) {
|
|
32
|
+
return body ? `${block}\n\n${body}` : block;
|
|
33
|
+
}
|
|
34
|
+
function existingDecision(content, row, decision, needsImplementation) {
|
|
35
|
+
const match = /^task\.md#(HDR-[1-9]\d*)$/.exec(row.evidence);
|
|
36
|
+
if (!match)
|
|
37
|
+
return { conflict: `decided row '${row.id}' has invalid decision evidence` };
|
|
38
|
+
const recordId = match[1];
|
|
39
|
+
const block = extractSubSection(content, recordId);
|
|
40
|
+
if (!block || !block.includes(`**原账本 ID**:${row.id}`) || !block.includes(`**裁决结果**:${decision}`)) {
|
|
41
|
+
return { conflict: `decision for '${row.id}' conflicts with ${recordId}` };
|
|
42
|
+
}
|
|
43
|
+
if (row.stage !== 'code')
|
|
44
|
+
return needsImplementation === undefined
|
|
45
|
+
? { recordId, implementationInputId: null }
|
|
46
|
+
: { conflict: '--needs-implementation is only valid for code-stage decisions' };
|
|
47
|
+
const inputs = parseImplementationInputs(content).rows.filter((input) => input.ledgerId === row.id && input.decisionEvidence === row.evidence);
|
|
48
|
+
if (inputs.length !== 1 || inputs[0].needsImplementation !== needsImplementation) {
|
|
49
|
+
return { conflict: `implementation intent for '${row.id}' conflicts with the existing decision` };
|
|
50
|
+
}
|
|
51
|
+
return { recordId, implementationInputId: inputs[0].id };
|
|
52
|
+
}
|
|
53
|
+
function applyHumanDecision(request, options = {}) {
|
|
54
|
+
if (!request.selector || !request.decision.trim())
|
|
55
|
+
return failed('DECISION_PAYLOAD_INVALID', 'selector and decision are required');
|
|
56
|
+
const resolved = resolveTaskContext(request.taskRef, { repoRoot: options.repoRoot });
|
|
57
|
+
if (!resolved.ok)
|
|
58
|
+
return failed(resolved.code, resolved.message, resolved.taskId);
|
|
59
|
+
if (resolved.state !== 'active')
|
|
60
|
+
return failed('TASK_STATE_MISMATCH', `task ${resolved.taskId} is ${resolved.state}, expected active`, resolved.taskId);
|
|
61
|
+
let content;
|
|
62
|
+
let rows;
|
|
63
|
+
try {
|
|
64
|
+
content = fs.readFileSync(resolved.taskMdPath, 'utf8');
|
|
65
|
+
rows = parseLedger(content);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return failed('DECISION_DOCUMENT_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
|
|
69
|
+
}
|
|
70
|
+
const direct = rows.filter((row) => row.id.toUpperCase() === request.selector.toUpperCase());
|
|
71
|
+
if (!/^-?\d+$/.test(request.selector) && direct.length === 1 && direct[0].status === 'human-decided' && isDecisionItem(direct[0])) {
|
|
72
|
+
try {
|
|
73
|
+
const replay = existingDecision(content, direct[0], request.decision.trim(), request.needsImplementation);
|
|
74
|
+
if ('conflict' in replay)
|
|
75
|
+
return failed('DECISION_CONFLICT', replay.conflict, resolved.taskId, direct[0].id);
|
|
76
|
+
return { status: 'no-op', changed: false, taskId: resolved.taskId, ledgerId: direct[0].id, recordId: replay.recordId, implementationInputId: replay.implementationInputId, operations: [], error: null };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return failed('DECISION_DOCUMENT_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId, direct[0].id);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const candidates = listDecisionItems(rows);
|
|
83
|
+
const selected = selectDecisionItem(candidates, request.selector);
|
|
84
|
+
if (!selected.ok) {
|
|
85
|
+
const message = selected.code === 'not-found' && !/^-?\d+$/.test(request.selector)
|
|
86
|
+
? classifyMissing(rows, request.selector) : selected.message;
|
|
87
|
+
return failed('DECISION_TARGET_INVALID', message, resolved.taskId);
|
|
88
|
+
}
|
|
89
|
+
const row = selected.row;
|
|
90
|
+
if (row.stage === 'code' && request.needsImplementation === undefined)
|
|
91
|
+
return failed('DECISION_PAYLOAD_INVALID', 'code-stage decisions require --needs-implementation true|false', resolved.taskId, row.id);
|
|
92
|
+
if (row.stage !== 'code' && request.needsImplementation !== undefined)
|
|
93
|
+
return failed('DECISION_PAYLOAD_INVALID', '--needs-implementation is only valid for code-stage decisions', resolved.taskId, row.id);
|
|
94
|
+
let metadata;
|
|
95
|
+
try {
|
|
96
|
+
metadata = (options.metadataProvider ?? captureTaskWriteMetadata)();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return failed('METADATA_CAPTURE_FAILED', error instanceof Error ? error.message : String(error), resolved.taskId, row.id);
|
|
100
|
+
}
|
|
101
|
+
const recordId = nextRecordId(content);
|
|
102
|
+
const evidence = `task.md#${recordId}`;
|
|
103
|
+
const decision = request.decision.trim();
|
|
104
|
+
const record = `### ${recordId}\n\n- **原账本 ID**:${row.id}\n- **裁决时间**:${metadata.timestamp}\n- **裁决结果**:${decision}`;
|
|
105
|
+
const activity = locateActivityLog(content);
|
|
106
|
+
if (!activity)
|
|
107
|
+
return failed('DECISION_ACTIVITY_MISSING', 'activity log section is missing or ambiguous', resolved.taskId, row.id);
|
|
108
|
+
const mutations = [
|
|
109
|
+
{
|
|
110
|
+
kind: 'table-row', action: 'upsert', sectionAliases: LEDGER_HEADINGS, columns: LEDGER_COLUMNS,
|
|
111
|
+
keyColumn: 'id', key: row.id,
|
|
112
|
+
values: { stage: row.stage, round: row.round, severity: row.severity, status: 'human-decided', evidence }
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
kind: 'section', aliases: DECISION_ALIASES,
|
|
116
|
+
heading: findSectionHeading(content, [...DECISION_ALIASES]),
|
|
117
|
+
body: prependBlock(extractSection(content, [...DECISION_ALIASES]), record)
|
|
118
|
+
}
|
|
119
|
+
];
|
|
120
|
+
let implementationInputId = null;
|
|
121
|
+
if (row.stage === 'code') {
|
|
122
|
+
let parsed;
|
|
123
|
+
try {
|
|
124
|
+
parsed = parseImplementationInputs(content);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return failed('DECISION_DOCUMENT_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId, row.id);
|
|
128
|
+
}
|
|
129
|
+
const input = createImplementationInput(parsed.rows, {
|
|
130
|
+
ledgerId: row.id, decisionEvidence: evidence,
|
|
131
|
+
needsImplementation: request.needsImplementation, decidedAt: metadata.timestamp
|
|
132
|
+
});
|
|
133
|
+
implementationInputId = input.id;
|
|
134
|
+
mutations.push({
|
|
135
|
+
kind: 'section', aliases: IMPLEMENTATION_INPUT_ALIASES,
|
|
136
|
+
heading: findSectionHeading(content, [...IMPLEMENTATION_INPUT_ALIASES]),
|
|
137
|
+
body: renderImplementationInputs([...parsed.rows, input])
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
mutations.push({
|
|
141
|
+
kind: 'section', aliases: ACTIVITY_ALIASES, heading: activity.heading,
|
|
142
|
+
body: appendActivityEntry(activity, { time: metadata.timestamp, step: 'Human Decision', agent: 'human', note: `${row.id} decided → ${recordId}` })
|
|
143
|
+
});
|
|
144
|
+
const writeResult = writeTask({ taskRef: resolved.taskId, expectedState: 'active', mutations, dryRun: request.dryRun }, {
|
|
145
|
+
...options,
|
|
146
|
+
taskLocation: { repoRoot: resolved.repoRoot, taskId: resolved.taskId, taskMdPath: resolved.taskMdPath, state: resolved.state },
|
|
147
|
+
metadataProvider: () => metadata
|
|
148
|
+
});
|
|
149
|
+
if (writeResult.status === 'failed')
|
|
150
|
+
return failed(writeResult.error.code, writeResult.error.message, writeResult.taskId, row.id);
|
|
151
|
+
return { status: writeResult.status, changed: writeResult.changed, taskId: writeResult.taskId, ledgerId: row.id, recordId, implementationInputId, operations: writeResult.operations, error: null };
|
|
152
|
+
}
|
|
153
|
+
export { applyHumanDecision };
|
|
154
|
+
//# sourceMappingURL=decision-intents.js.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { isReviewStage } from './ledger.js';
|
|
2
|
+
function isDecisionItem(row) {
|
|
3
|
+
if (!isReviewStage(row.stage))
|
|
4
|
+
return false;
|
|
5
|
+
if (/^HD-\d+$/i.test(row.id))
|
|
6
|
+
return true;
|
|
7
|
+
if (row.stage === 'analysis')
|
|
8
|
+
return /^AN-\d+$/i.test(row.id);
|
|
9
|
+
if (row.stage === 'plan')
|
|
10
|
+
return /^PL-\d+$/i.test(row.id);
|
|
11
|
+
return /^CD-\d+$/i.test(row.id);
|
|
12
|
+
}
|
|
13
|
+
function listDecisionItems(rows, options = {}) {
|
|
14
|
+
return rows.filter((row) => {
|
|
15
|
+
if (!isDecisionItem(row))
|
|
16
|
+
return false;
|
|
17
|
+
if (options.stage !== undefined && row.stage !== options.stage)
|
|
18
|
+
return false;
|
|
19
|
+
return options.includeDecided
|
|
20
|
+
? row.status === 'needs-human-decision' || row.status === 'human-decided'
|
|
21
|
+
: row.status === 'needs-human-decision';
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function selectDecisionItem(rows, selector) {
|
|
25
|
+
if (/^-?\d+$/.test(selector)) {
|
|
26
|
+
const ordinal = Number.parseInt(selector, 10);
|
|
27
|
+
if (ordinal < 1 || ordinal > rows.length) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
code: 'ordinal-out-of-range',
|
|
31
|
+
message: `ordinal '${selector}' out of range (1..${rows.length})`
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return { ok: true, row: rows[ordinal - 1] };
|
|
35
|
+
}
|
|
36
|
+
if (!/^[A-Za-z]+-\d+$/.test(selector)) {
|
|
37
|
+
return { ok: false, code: 'invalid-selector', message: `invalid selector '${selector}'` };
|
|
38
|
+
}
|
|
39
|
+
const matches = rows.filter((row) => row.id.toUpperCase() === selector.toUpperCase());
|
|
40
|
+
if (matches.length === 0) {
|
|
41
|
+
return { ok: false, code: 'not-found', message: `no decision item matches '${selector}'` };
|
|
42
|
+
}
|
|
43
|
+
if (matches.length > 1) {
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
code: 'ambiguous',
|
|
47
|
+
message: `duplicate id '${selector}' in ledger; select by ordinal instead`
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return { ok: true, row: matches[0] };
|
|
51
|
+
}
|
|
52
|
+
export { isDecisionItem, listDecisionItems, selectDecisionItem };
|
|
53
|
+
//# sourceMappingURL=decision-items.js.map
|