@fitlab-ai/agent-infra 0.8.5 → 0.9.0
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/bin/cli.ts +2 -2
- package/dist/bin/cli.js +2 -2
- package/dist/bin/internal-cli.js +98 -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/release-workflow.js +217 -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/issue-comments.js +409 -0
- package/dist/lib/platform/issue-metadata.js +183 -0
- package/dist/lib/platform/issues.js +617 -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 +338 -0
- package/dist/lib/platform/releases.js +82 -0
- package/dist/lib/platform/types.js +22 -0
- package/dist/lib/platform/verification-required.js +78 -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/capture.js +25 -3
- package/dist/lib/sandbox/commands/create.js +36 -22
- package/dist/lib/sandbox/commands/enter.js +34 -11
- package/dist/lib/sandbox/commands/list-running.js +10 -8
- package/dist/lib/sandbox/commands/show.js +2 -2
- package/dist/lib/sandbox/commands/start.js +53 -15
- 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/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 +23 -14
- 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 +19 -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 +46 -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 +906 -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/release-workflow.ts +186 -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/issue-comments.ts +479 -0
- package/lib/platform/issue-metadata.ts +250 -0
- package/lib/platform/issues.ts +691 -0
- package/lib/platform/metadata-labels.ts +33 -0
- package/lib/platform/pr-checks.ts +246 -0
- package/lib/platform/pr-summary.ts +90 -0
- package/lib/platform/pull-request-metadata.ts +69 -0
- package/lib/platform/pull-requests.ts +380 -0
- package/lib/platform/releases.ts +71 -0
- package/lib/platform/types.ts +74 -0
- package/lib/platform/verification-required.ts +83 -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/capture.ts +29 -3
- package/lib/sandbox/commands/create.ts +43 -25
- package/lib/sandbox/commands/enter.ts +38 -11
- package/lib/sandbox/commands/list-running.ts +10 -8
- package/lib/sandbox/commands/show.ts +2 -2
- package/lib/sandbox/commands/start.ts +50 -16
- package/lib/sandbox/index.ts +6 -6
- package/lib/sandbox/mounts.ts +55 -0
- package/lib/sandbox/recovery.ts +828 -0
- 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 +16 -16
- 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 +20 -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} +17 -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} +199 -406
- package/lib/task/verification-review.ts +9 -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/review-handshake.en.md +8 -5
- package/templates/.agents/rules/review-handshake.zh-CN.md +8 -5
- 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/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 +22 -55
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +26 -59
- 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 +11 -7
- package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +11 -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-task/SKILL.en.md +12 -13
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +12 -13
- package/templates/.agents/skills/create-task/config/verify.json +1 -2
- 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 +6 -1
- package/templates/.agents/templates/task.zh-CN.md +6 -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
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { VERSION } from '../version.ts';
|
|
5
|
+
import {
|
|
6
|
+
parseTypedTaskFrontmatter,
|
|
7
|
+
updateTaskFrontmatter
|
|
8
|
+
} from './frontmatter.ts';
|
|
9
|
+
import type { FrontmatterScalar } from './frontmatter.ts';
|
|
10
|
+
import { resolveTaskRef } from './resolve-ref.ts';
|
|
11
|
+
import type {
|
|
12
|
+
ResolveTaskRefErrorCode,
|
|
13
|
+
TaskWorkspaceState
|
|
14
|
+
} from './resolve-ref.ts';
|
|
15
|
+
import { mutateTableRow, upsertSection } from './sections.ts';
|
|
16
|
+
import type {
|
|
17
|
+
TableRowDeleteMutation,
|
|
18
|
+
TableRowUpsertMutation
|
|
19
|
+
} from './sections.ts';
|
|
20
|
+
|
|
21
|
+
type FrontmatterMutation = {
|
|
22
|
+
kind: 'frontmatter';
|
|
23
|
+
set: Readonly<Record<string, FrontmatterScalar>>;
|
|
24
|
+
remove?: readonly string[];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
type SectionMutation = {
|
|
28
|
+
kind: 'section';
|
|
29
|
+
aliases: readonly string[];
|
|
30
|
+
heading: string;
|
|
31
|
+
body: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
type TaskMutation =
|
|
35
|
+
| FrontmatterMutation
|
|
36
|
+
| SectionMutation
|
|
37
|
+
| TableRowUpsertMutation
|
|
38
|
+
| TableRowDeleteMutation;
|
|
39
|
+
|
|
40
|
+
type TaskWriteRequest = {
|
|
41
|
+
taskRef: string;
|
|
42
|
+
expectedState: TaskWorkspaceState;
|
|
43
|
+
mutations: readonly TaskMutation[];
|
|
44
|
+
dryRun?: boolean;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
type TaskOperationSummary =
|
|
48
|
+
| {
|
|
49
|
+
index: number;
|
|
50
|
+
kind: 'frontmatter';
|
|
51
|
+
fields: readonly string[];
|
|
52
|
+
wouldChange: boolean;
|
|
53
|
+
}
|
|
54
|
+
| {
|
|
55
|
+
index: number;
|
|
56
|
+
kind: 'section';
|
|
57
|
+
heading: string;
|
|
58
|
+
operation: 'create' | 'update';
|
|
59
|
+
wouldChange: boolean;
|
|
60
|
+
}
|
|
61
|
+
| {
|
|
62
|
+
index: number;
|
|
63
|
+
kind: 'table-row';
|
|
64
|
+
section: string;
|
|
65
|
+
keyColumn: string;
|
|
66
|
+
key: string;
|
|
67
|
+
operation: 'insert' | 'update' | 'delete';
|
|
68
|
+
wouldChange: boolean;
|
|
69
|
+
}
|
|
70
|
+
| {
|
|
71
|
+
index: -1;
|
|
72
|
+
kind: 'metadata';
|
|
73
|
+
fields: readonly ['updated_at', 'agent_infra_version'];
|
|
74
|
+
wouldChange: boolean;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
type TaskWriteMetadata = {
|
|
78
|
+
timestamp: string;
|
|
79
|
+
agentInfraVersion: string;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
type TaskWriteErrorCode =
|
|
83
|
+
| ResolveTaskRefErrorCode
|
|
84
|
+
| 'TASK_STATE_MISMATCH'
|
|
85
|
+
| 'TASK_READ_FAILED'
|
|
86
|
+
| 'TASK_DOCUMENT_INVALID'
|
|
87
|
+
| 'MUTATION_INVALID'
|
|
88
|
+
| 'TABLE_NOT_FOUND'
|
|
89
|
+
| 'TABLE_AMBIGUOUS'
|
|
90
|
+
| 'TABLE_DUPLICATE_KEY'
|
|
91
|
+
| 'TABLE_UNKNOWN_COLUMN'
|
|
92
|
+
| 'TABLE_KEY_COLUMN_IN_VALUES'
|
|
93
|
+
| 'TABLE_KEY_CONFLICT'
|
|
94
|
+
| 'TABLE_MISSING_COLUMN'
|
|
95
|
+
| 'TABLE_DELETE_VALUES_FORBIDDEN'
|
|
96
|
+
| 'TABLE_CELL_INVALID'
|
|
97
|
+
| 'METADATA_CAPTURE_FAILED'
|
|
98
|
+
| 'TEMP_WRITE_FAILED'
|
|
99
|
+
| 'RENAME_FAILED'
|
|
100
|
+
| 'TEMP_CLEANUP_FAILED';
|
|
101
|
+
|
|
102
|
+
type TaskWriteError = { code: TaskWriteErrorCode; message: string };
|
|
103
|
+
|
|
104
|
+
type TaskWriteSuccessBase = {
|
|
105
|
+
requestRef: string;
|
|
106
|
+
expectedState: TaskWorkspaceState;
|
|
107
|
+
taskId: string;
|
|
108
|
+
taskMdPath: string;
|
|
109
|
+
actualState: TaskWorkspaceState;
|
|
110
|
+
operations: readonly TaskOperationSummary[];
|
|
111
|
+
timestamp: string;
|
|
112
|
+
agentInfraVersion: string;
|
|
113
|
+
error: null;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
type TaskWritePlanned = TaskWriteSuccessBase & { status: 'planned'; changed: true };
|
|
117
|
+
type TaskWriteApplied = TaskWriteSuccessBase & { status: 'applied'; changed: true };
|
|
118
|
+
type TaskWriteNoOp = TaskWriteSuccessBase & { status: 'no-op'; changed: false };
|
|
119
|
+
|
|
120
|
+
type TaskWriteFailed = {
|
|
121
|
+
status: 'failed';
|
|
122
|
+
requestRef: string;
|
|
123
|
+
expectedState: TaskWorkspaceState;
|
|
124
|
+
taskId: string | null;
|
|
125
|
+
taskMdPath: string | null;
|
|
126
|
+
actualState: TaskWorkspaceState | null;
|
|
127
|
+
changed: false;
|
|
128
|
+
operations: readonly TaskOperationSummary[];
|
|
129
|
+
timestamp: string | null;
|
|
130
|
+
agentInfraVersion: string | null;
|
|
131
|
+
error: TaskWriteError;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
type TaskWriteResult =
|
|
135
|
+
| TaskWritePlanned
|
|
136
|
+
| TaskWriteApplied
|
|
137
|
+
| TaskWriteNoOp
|
|
138
|
+
| TaskWriteFailed;
|
|
139
|
+
|
|
140
|
+
type TaskFileSystem = {
|
|
141
|
+
readFileSync: (file: string) => string;
|
|
142
|
+
statModeSync: (file: string) => number;
|
|
143
|
+
writeFileSync: (file: string, content: string, mode: number) => void;
|
|
144
|
+
renameSync: (from: string, to: string) => void;
|
|
145
|
+
unlinkSync: (file: string) => void;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
type TaskWriteOptions = {
|
|
149
|
+
repoRoot?: string;
|
|
150
|
+
taskLocation?: {
|
|
151
|
+
repoRoot: string;
|
|
152
|
+
taskId: string;
|
|
153
|
+
taskMdPath: string;
|
|
154
|
+
state: TaskWorkspaceState;
|
|
155
|
+
};
|
|
156
|
+
metadataProvider?: () => TaskWriteMetadata;
|
|
157
|
+
randomSuffix?: () => string;
|
|
158
|
+
fileSystem?: Partial<TaskFileSystem>;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const DEFAULT_FILE_SYSTEM: TaskFileSystem = {
|
|
162
|
+
readFileSync: (file) => fs.readFileSync(file, 'utf8'),
|
|
163
|
+
statModeSync: (file) => fs.statSync(file).mode,
|
|
164
|
+
writeFileSync: (file, content, mode) => {
|
|
165
|
+
fs.writeFileSync(file, content, { encoding: 'utf8', flag: 'wx', mode });
|
|
166
|
+
},
|
|
167
|
+
renameSync: (from, to) => fs.renameSync(from, to),
|
|
168
|
+
unlinkSync: (file) => fs.unlinkSync(file)
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
function canonicalTimestamp(): string {
|
|
172
|
+
const now = new Date();
|
|
173
|
+
const pad = (value: number) => String(value).padStart(2, '0');
|
|
174
|
+
const offsetMinutes = -now.getTimezoneOffset();
|
|
175
|
+
const offsetSign = offsetMinutes >= 0 ? '+' : '-';
|
|
176
|
+
const offset = Math.abs(offsetMinutes);
|
|
177
|
+
return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}${offsetSign}${pad(Math.floor(offset / 60))}:${pad(offset % 60)}`;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function captureTaskWriteMetadata(): TaskWriteMetadata {
|
|
181
|
+
return { timestamp: canonicalTimestamp(), agentInfraVersion: VERSION };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function failure(
|
|
185
|
+
request: TaskWriteRequest,
|
|
186
|
+
identity: { taskId: string | null; taskMdPath: string | null; actualState: TaskWorkspaceState | null },
|
|
187
|
+
code: TaskWriteErrorCode,
|
|
188
|
+
message: string,
|
|
189
|
+
operations: readonly TaskOperationSummary[] = [],
|
|
190
|
+
metadata: TaskWriteMetadata | null = null
|
|
191
|
+
): TaskWriteFailed {
|
|
192
|
+
return {
|
|
193
|
+
status: 'failed',
|
|
194
|
+
requestRef: request.taskRef,
|
|
195
|
+
expectedState: request.expectedState,
|
|
196
|
+
taskId: identity.taskId,
|
|
197
|
+
taskMdPath: identity.taskMdPath,
|
|
198
|
+
actualState: identity.actualState,
|
|
199
|
+
changed: false,
|
|
200
|
+
operations,
|
|
201
|
+
timestamp: metadata?.timestamp ?? null,
|
|
202
|
+
agentInfraVersion: metadata?.agentInfraVersion ?? null,
|
|
203
|
+
error: { code, message }
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function errorDetails(error: unknown, fallback: TaskWriteErrorCode): TaskWriteError {
|
|
208
|
+
if (error && typeof error === 'object' && 'code' in error && typeof error.code === 'string') {
|
|
209
|
+
return {
|
|
210
|
+
code: error.code as TaskWriteErrorCode,
|
|
211
|
+
message: error instanceof Error ? error.message : String(error)
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
code: fallback,
|
|
216
|
+
message: error instanceof Error ? error.message : String(error)
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function writeTask(request: TaskWriteRequest, options: TaskWriteOptions = {}): TaskWriteResult {
|
|
221
|
+
const resolved = options.taskLocation
|
|
222
|
+
? {
|
|
223
|
+
ok: true as const,
|
|
224
|
+
repoRoot: options.taskLocation.repoRoot,
|
|
225
|
+
taskId: options.taskLocation.taskId,
|
|
226
|
+
taskDir: path.dirname(options.taskLocation.taskMdPath),
|
|
227
|
+
taskMdPath: options.taskLocation.taskMdPath,
|
|
228
|
+
state: options.taskLocation.state
|
|
229
|
+
}
|
|
230
|
+
: resolveTaskRef(request.taskRef, { repoRoot: options.repoRoot });
|
|
231
|
+
if (!resolved.ok) {
|
|
232
|
+
return failure(
|
|
233
|
+
request,
|
|
234
|
+
{ taskId: resolved.taskId, taskMdPath: null, actualState: null },
|
|
235
|
+
resolved.code,
|
|
236
|
+
resolved.message
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
const identity = {
|
|
240
|
+
taskId: resolved.taskId,
|
|
241
|
+
taskMdPath: resolved.taskMdPath,
|
|
242
|
+
actualState: resolved.state
|
|
243
|
+
};
|
|
244
|
+
if (resolved.state !== request.expectedState) {
|
|
245
|
+
return failure(
|
|
246
|
+
request,
|
|
247
|
+
identity,
|
|
248
|
+
'TASK_STATE_MISMATCH',
|
|
249
|
+
`task ${resolved.taskId} is ${resolved.state}, expected ${request.expectedState}`
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const io: TaskFileSystem = { ...DEFAULT_FILE_SYSTEM, ...options.fileSystem };
|
|
254
|
+
let original: string;
|
|
255
|
+
let mode: number;
|
|
256
|
+
try {
|
|
257
|
+
original = io.readFileSync(resolved.taskMdPath);
|
|
258
|
+
mode = io.statModeSync(resolved.taskMdPath);
|
|
259
|
+
} catch (error) {
|
|
260
|
+
return failure(
|
|
261
|
+
request,
|
|
262
|
+
identity,
|
|
263
|
+
'TASK_READ_FAILED',
|
|
264
|
+
error instanceof Error ? error.message : String(error)
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
let candidate = original;
|
|
269
|
+
const operations: TaskOperationSummary[] = [];
|
|
270
|
+
try {
|
|
271
|
+
parseTypedTaskFrontmatter(original);
|
|
272
|
+
if (!Array.isArray(request.mutations)) {
|
|
273
|
+
throw Object.assign(new Error('mutations must be an array'), { code: 'MUTATION_INVALID' });
|
|
274
|
+
}
|
|
275
|
+
for (const [index, mutation] of request.mutations.entries()) {
|
|
276
|
+
if (!mutation || typeof mutation !== 'object' || !('kind' in mutation)) {
|
|
277
|
+
throw Object.assign(new Error(`mutation ${index} is invalid`), { code: 'MUTATION_INVALID' });
|
|
278
|
+
}
|
|
279
|
+
const before = candidate;
|
|
280
|
+
if (mutation.kind === 'frontmatter') {
|
|
281
|
+
candidate = updateTaskFrontmatter(candidate, mutation.set, mutation.remove);
|
|
282
|
+
operations.push({
|
|
283
|
+
index,
|
|
284
|
+
kind: 'frontmatter',
|
|
285
|
+
fields: [...Object.keys(mutation.set), ...(mutation.remove ?? [])],
|
|
286
|
+
wouldChange: candidate !== before
|
|
287
|
+
});
|
|
288
|
+
} else if (mutation.kind === 'section') {
|
|
289
|
+
const result = upsertSection(candidate, mutation);
|
|
290
|
+
candidate = result.content;
|
|
291
|
+
operations.push({
|
|
292
|
+
index,
|
|
293
|
+
kind: 'section',
|
|
294
|
+
heading: result.heading,
|
|
295
|
+
operation: result.operation,
|
|
296
|
+
wouldChange: candidate !== before
|
|
297
|
+
});
|
|
298
|
+
} else if (mutation.kind === 'table-row') {
|
|
299
|
+
const result = mutateTableRow(candidate, mutation);
|
|
300
|
+
candidate = result.content;
|
|
301
|
+
operations.push({
|
|
302
|
+
index,
|
|
303
|
+
kind: 'table-row',
|
|
304
|
+
section: result.section,
|
|
305
|
+
keyColumn: mutation.keyColumn,
|
|
306
|
+
key: mutation.key.trim(),
|
|
307
|
+
operation: result.operation,
|
|
308
|
+
wouldChange: candidate !== before
|
|
309
|
+
});
|
|
310
|
+
} else {
|
|
311
|
+
throw Object.assign(new Error(`mutation ${index} has an unknown kind`), {
|
|
312
|
+
code: 'MUTATION_INVALID'
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
} catch (error) {
|
|
317
|
+
const details = errorDetails(error, 'MUTATION_INVALID');
|
|
318
|
+
return failure(request, identity, details.code, details.message);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
let metadata: TaskWriteMetadata;
|
|
322
|
+
try {
|
|
323
|
+
metadata = (options.metadataProvider ?? captureTaskWriteMetadata)();
|
|
324
|
+
if (
|
|
325
|
+
!metadata ||
|
|
326
|
+
typeof metadata.timestamp !== 'string' ||
|
|
327
|
+
!metadata.timestamp ||
|
|
328
|
+
typeof metadata.agentInfraVersion !== 'string' ||
|
|
329
|
+
!metadata.agentInfraVersion
|
|
330
|
+
) {
|
|
331
|
+
throw new Error('metadata provider returned invalid metadata');
|
|
332
|
+
}
|
|
333
|
+
} catch (error) {
|
|
334
|
+
return failure(
|
|
335
|
+
request,
|
|
336
|
+
identity,
|
|
337
|
+
'METADATA_CAPTURE_FAILED',
|
|
338
|
+
error instanceof Error ? error.message : String(error),
|
|
339
|
+
operations
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (candidate === original) {
|
|
344
|
+
return {
|
|
345
|
+
status: 'no-op',
|
|
346
|
+
requestRef: request.taskRef,
|
|
347
|
+
expectedState: request.expectedState,
|
|
348
|
+
taskId: resolved.taskId,
|
|
349
|
+
taskMdPath: resolved.taskMdPath,
|
|
350
|
+
actualState: resolved.state,
|
|
351
|
+
changed: false,
|
|
352
|
+
operations,
|
|
353
|
+
timestamp: metadata.timestamp,
|
|
354
|
+
agentInfraVersion: metadata.agentInfraVersion,
|
|
355
|
+
error: null
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
try {
|
|
360
|
+
const beforeMetadata = candidate;
|
|
361
|
+
candidate = updateTaskFrontmatter(candidate, {
|
|
362
|
+
updated_at: metadata.timestamp,
|
|
363
|
+
agent_infra_version: metadata.agentInfraVersion
|
|
364
|
+
});
|
|
365
|
+
operations.push({
|
|
366
|
+
index: -1,
|
|
367
|
+
kind: 'metadata',
|
|
368
|
+
fields: ['updated_at', 'agent_infra_version'],
|
|
369
|
+
wouldChange: candidate !== beforeMetadata
|
|
370
|
+
});
|
|
371
|
+
} catch (error) {
|
|
372
|
+
const details = errorDetails(error, 'TASK_DOCUMENT_INVALID');
|
|
373
|
+
return failure(request, identity, details.code, details.message, operations, metadata);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const successBase: TaskWriteSuccessBase = {
|
|
377
|
+
requestRef: request.taskRef,
|
|
378
|
+
expectedState: request.expectedState,
|
|
379
|
+
taskId: resolved.taskId,
|
|
380
|
+
taskMdPath: resolved.taskMdPath,
|
|
381
|
+
actualState: resolved.state,
|
|
382
|
+
operations,
|
|
383
|
+
timestamp: metadata.timestamp,
|
|
384
|
+
agentInfraVersion: metadata.agentInfraVersion,
|
|
385
|
+
error: null
|
|
386
|
+
};
|
|
387
|
+
if (request.dryRun) {
|
|
388
|
+
return { ...successBase, status: 'planned', changed: true };
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const suffix = (options.randomSuffix ?? (() => Math.random().toString(36).slice(2)))();
|
|
392
|
+
const tempPath = path.join(
|
|
393
|
+
path.dirname(resolved.taskMdPath),
|
|
394
|
+
`.task.md.${process.pid}.${suffix}.tmp`
|
|
395
|
+
);
|
|
396
|
+
let primary: TaskWriteError | null = null;
|
|
397
|
+
let shouldCleanupTemp = false;
|
|
398
|
+
try {
|
|
399
|
+
io.writeFileSync(tempPath, candidate, mode);
|
|
400
|
+
shouldCleanupTemp = true;
|
|
401
|
+
} catch (error) {
|
|
402
|
+
shouldCleanupTemp = (error as NodeJS.ErrnoException).code !== 'EEXIST';
|
|
403
|
+
primary = errorDetails(error, 'TEMP_WRITE_FAILED');
|
|
404
|
+
primary.code = 'TEMP_WRITE_FAILED';
|
|
405
|
+
}
|
|
406
|
+
if (!primary) {
|
|
407
|
+
try {
|
|
408
|
+
io.renameSync(tempPath, resolved.taskMdPath);
|
|
409
|
+
} catch (error) {
|
|
410
|
+
primary = errorDetails(error, 'RENAME_FAILED');
|
|
411
|
+
primary.code = 'RENAME_FAILED';
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (primary && shouldCleanupTemp) {
|
|
415
|
+
try {
|
|
416
|
+
io.unlinkSync(tempPath);
|
|
417
|
+
} catch (cleanupError) {
|
|
418
|
+
const nodeError = cleanupError as NodeJS.ErrnoException;
|
|
419
|
+
if (nodeError.code !== 'ENOENT') {
|
|
420
|
+
return failure(
|
|
421
|
+
request,
|
|
422
|
+
identity,
|
|
423
|
+
'TEMP_CLEANUP_FAILED',
|
|
424
|
+
`${primary.code}: ${primary.message}; failed to clean ${tempPath}: ${nodeError.message}`,
|
|
425
|
+
operations,
|
|
426
|
+
metadata
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
if (primary) {
|
|
432
|
+
return failure(
|
|
433
|
+
request,
|
|
434
|
+
identity,
|
|
435
|
+
primary.code,
|
|
436
|
+
primary.message,
|
|
437
|
+
operations,
|
|
438
|
+
metadata
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
return { ...successBase, status: 'applied', changed: true };
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
export { writeTask, captureTaskWriteMetadata, canonicalTimestamp };
|
|
445
|
+
export type {
|
|
446
|
+
FrontmatterMutation,
|
|
447
|
+
SectionMutation,
|
|
448
|
+
TaskMutation,
|
|
449
|
+
TaskWriteRequest,
|
|
450
|
+
TaskOperationSummary,
|
|
451
|
+
TaskWriteMetadata,
|
|
452
|
+
TaskWriteErrorCode,
|
|
453
|
+
TaskWriteError,
|
|
454
|
+
TaskWritePlanned,
|
|
455
|
+
TaskWriteApplied,
|
|
456
|
+
TaskWriteNoOp,
|
|
457
|
+
TaskWriteFailed,
|
|
458
|
+
TaskWriteResult,
|
|
459
|
+
TaskFileSystem,
|
|
460
|
+
TaskWriteOptions
|
|
461
|
+
};
|
|
462
|
+
export type { FrontmatterScalar } from './frontmatter.ts';
|
|
463
|
+
export type { ResolveTaskRefErrorCode, TaskWorkspaceState } from './resolve-ref.ts';
|
|
464
|
+
export type {
|
|
465
|
+
TableRowBase,
|
|
466
|
+
TableRowUpsertMutation,
|
|
467
|
+
TableRowDeleteMutation
|
|
468
|
+
} from './sections.ts';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fitlab-ai/agent-infra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Bootstrap tool for AI multi-tool collaboration infrastructure — works with Claude Code, Codex, Gemini CLI, and OpenCode",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
},
|
|
20
20
|
"bin": {
|
|
21
21
|
"agent-infra": "./dist/bin/cli.js",
|
|
22
|
-
"ai": "./dist/bin/cli.js"
|
|
22
|
+
"ai": "./dist/bin/cli.js",
|
|
23
|
+
"agent-infra-internal": "./dist/bin/internal-cli.js"
|
|
23
24
|
},
|
|
24
25
|
"files": [
|
|
25
26
|
"dist/",
|
|
@@ -59,6 +60,7 @@
|
|
|
59
60
|
"typecheck": "tsc -p tsconfig.test.json --noEmit && tsc -p tsconfig.jschecks.json --noEmit",
|
|
60
61
|
"test:smoke": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/unit/**/*.test.ts\"",
|
|
61
62
|
"test:core": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/unit/**/*.test.ts\" \"tests/integration/**/*.test.ts\"",
|
|
63
|
+
"test:integration": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/integration/**/*.test.ts\" \"tests/e2e/**/*.test.ts\"",
|
|
62
64
|
"check": "npm run typecheck && npm test",
|
|
63
65
|
"test": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/**/*.test.ts\"",
|
|
64
66
|
"test:coverage": "npm run build && node --experimental-strip-types --no-warnings --test --experimental-test-coverage \"--test-coverage-exclude=tests/**\" --test-reporter=spec --test-reporter-destination=stdout --test-reporter=lcov --test-reporter-destination=coverage.lcov \"tests/**/*.test.ts\"",
|
|
@@ -400,14 +400,15 @@ When writing or updating `.agents/skills/*/SKILL.md` files and their templates,
|
|
|
400
400
|
For skills that produce structured artifacts or mutate task state, run the verification gate before claiming completion:
|
|
401
401
|
|
|
402
402
|
```bash
|
|
403
|
-
|
|
403
|
+
agent-infra-internal task-verify {task-id} <verification-event> [--artifact <artifact>] --format text
|
|
404
404
|
```
|
|
405
405
|
|
|
406
406
|
- Each skill declares its own checks in `config/verify.json`; keep the file focused on what that skill must validate
|
|
407
|
+
- The typed verification catalog maps business events to skill, workspace, artifact, and gate/check order; callers must not assemble those mechanical parameters
|
|
407
408
|
- For language-specific artifact headings or anchors, keep only `required_sections` and language-specific `required_patterns` different between `config/verify.en.json` and `config/verify.zh-CN.json`
|
|
408
409
|
- If a skill also prints next-step guidance, run the gate first and only show those instructions after the gate passes
|
|
409
|
-
-
|
|
410
|
-
-
|
|
410
|
+
- Use `--format text` for readable user-facing final validation
|
|
411
|
+
- `task-verify` executes the typed catalog/check registry in-process; skills must not duplicate validation algorithms or pass mechanical check sequences
|
|
411
412
|
- Keep the gate output in the reply as fresh evidence; without output from the current run, do not claim completion
|
|
412
413
|
|
|
413
414
|
## FAQ
|
|
@@ -400,14 +400,15 @@ disable-model-invocation: true # 可选;由支持该能力的 TUI 适配器
|
|
|
400
400
|
对会产生结构化产物或任务状态变更的 skill,统一在结束前运行完成校验:
|
|
401
401
|
|
|
402
402
|
```bash
|
|
403
|
-
|
|
403
|
+
agent-infra-internal task-verify {task-id} <verification-event> [--artifact <artifact>] --format text
|
|
404
404
|
```
|
|
405
405
|
|
|
406
406
|
- 每个 skill 在自己的 `config/verify.json` 中声明需要检查的事项
|
|
407
|
+
- typed verification catalog 将业务事件映射到 skill、workspace、artifact 和 gate/check 顺序;调用方不得自行拼接这些机械参数
|
|
407
408
|
- 对语言相关的产物标题或锚点,`config/verify.en.json` 和 `config/verify.zh-CN.json` 之间只应让 `required_sections` 与语言相关的 `required_patterns` 不同
|
|
408
409
|
- 如果 skill 还会展示“下一步”提示,必须先通过完成校验,再输出这些指引
|
|
409
|
-
-
|
|
410
|
-
-
|
|
410
|
+
- 面向用户展示最终校验结果时使用 `--format text` 输出可读摘要
|
|
411
|
+
- `task-verify` 在进程内按 typed catalog/check registry 执行;SKILL 不得复制校验算法或传机械 check 序列
|
|
411
412
|
- 在回复中保留当次校验输出作为当次验证输出;没有当次校验输出,不得声明完成
|
|
412
413
|
|
|
413
414
|
## 常见问题
|
|
@@ -15,18 +15,19 @@ so you can quickly find "which ones to read" without opening each file.
|
|
|
15
15
|
|
|
16
16
|
## Issue / PR
|
|
17
17
|
|
|
18
|
-
- [`issue-pr-commands.md`](issue-pr-commands.md) —
|
|
18
|
+
- [`issue-pr-commands.md`](issue-pr-commands.md) — PR commands and Issue intent entry points.
|
|
19
19
|
- [`pr-checks-commands.md`](pr-checks-commands.md) — Commands to watch PR required checks and pull failure logs (`watch-pr`).
|
|
20
|
-
- [`create-issue.md`](create-issue.md) —
|
|
21
|
-
- [`issue-sync.md`](issue-sync.md) —
|
|
22
|
-
- [`issue-fields.md`](issue-fields.md) —
|
|
20
|
+
- [`create-issue.md`](create-issue.md) — Declarative Issue creation after `create-task` writes `task.md`.
|
|
21
|
+
- [`issue-sync.md`](issue-sync.md) — Issue comment markers and declarative metadata intent contract.
|
|
22
|
+
- [`issue-fields.md`](issue-fields.md) — Dynamic Issue Type pinned-field mapping boundary.
|
|
23
23
|
- [`pr-sync.md`](pr-sync.md) — Sync rule for the single reviewer-facing PR summary comment.
|
|
24
24
|
|
|
25
25
|
## Task Workflow
|
|
26
26
|
|
|
27
27
|
- [`task-management.md`](task-management.md) — Task intent detection and workflow-command mapping.
|
|
28
28
|
- [`review-handshake.md`](review-handshake.md) — Three-stage bidirectional review handshake: four-state disposition, symmetric evidence, disagreement ledger, convergence and post-review commit gate.
|
|
29
|
-
- [`
|
|
29
|
+
- [`human-decision-context.md`](human-decision-context.md) — Self-contained context and canonical structure for new human-decision details.
|
|
30
|
+
- [`task-short-id.md`](task-short-id.md) — Resolution, allocation and lifecycle of bare-number short ids.
|
|
30
31
|
- [`milestone-inference.md`](milestone-inference.md) — Milestone inference for create-task / code-task / create-pr.
|
|
31
32
|
- [`label-milestone-setup.md`](label-milestone-setup.md) — Platform commands to initialize labels / milestones.
|
|
32
33
|
- [`security-alerts.md`](security-alerts.md) — Commands to import / close Dependabot and Code Scanning alerts.
|
|
@@ -14,18 +14,19 @@
|
|
|
14
14
|
|
|
15
15
|
## Issue / PR
|
|
16
16
|
|
|
17
|
-
- [`issue-pr-commands.md`](issue-pr-commands.md) —
|
|
17
|
+
- [`issue-pr-commands.md`](issue-pr-commands.md) — PR 命令集与 Issue intent 入口说明。
|
|
18
18
|
- [`pr-checks-commands.md`](pr-checks-commands.md) — 监控 PR required checks、拉取失败日志的命令集(`watch-pr`)。
|
|
19
|
-
- [`create-issue.md`](create-issue.md) — `create-task`
|
|
20
|
-
- [`issue-sync.md`](issue-sync.md) —
|
|
21
|
-
- [`issue-fields.md`](issue-fields.md) — Issue Type pinned
|
|
19
|
+
- [`create-issue.md`](create-issue.md) — `create-task` 落盘后的声明式 Issue 创建 intent。
|
|
20
|
+
- [`issue-sync.md`](issue-sync.md) — Issue 评论 marker 与声明式元数据 intent 契约。
|
|
21
|
+
- [`issue-fields.md`](issue-fields.md) — 动态 Issue Type pinned 字段映射边界。
|
|
22
22
|
- [`pr-sync.md`](pr-sync.md) — 面向 reviewer 的唯一 PR 摘要评论的同步规则。
|
|
23
23
|
|
|
24
24
|
## 任务工作流
|
|
25
25
|
|
|
26
26
|
- [`task-management.md`](task-management.md) — 任务语义识别与工作流命令映射。
|
|
27
27
|
- [`review-handshake.md`](review-handshake.md) — 三阶段双向审查握手协议:四态处置、对称证据、分歧账本、收敛与 post-review commit 门禁。
|
|
28
|
-
- [`
|
|
28
|
+
- [`human-decision-context.md`](human-decision-context.md) — 新建人工裁决详情的自足上下文与规范结构。
|
|
29
|
+
- [`task-short-id.md`](task-short-id.md) — 裸数字任务短号的解析、分配与生命周期。
|
|
29
30
|
- [`milestone-inference.md`](milestone-inference.md) — create-task / code-task / create-pr 的 milestone 推断。
|
|
30
31
|
- [`label-milestone-setup.md`](label-milestone-setup.md) — 初始化 label / milestone 的平台命令集。
|
|
31
32
|
- [`security-alerts.md`](security-alerts.md) — 导入 / 关闭 Dependabot 与 Code Scanning 告警的命令集。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Issue Creation
|
|
2
2
|
|
|
3
|
-
This code platform does not provide an Issue
|
|
3
|
+
This code platform does not provide an Issue adapter. `platform-issue create` returns a structured no-op/degraded result.
|
|
4
4
|
|
|
5
5
|
`create-task` skips the cascade Issue creation step on this platform; the local `task.md` remains a valid artifact. If you later want to bind the task to an Issue, manually write `issue_number` into `task.md` and the subsequent skills (`commit` / `code-task` / `complete-task`, etc.) will pick up Issue metadata syncing through the existing cascade rules.
|