@fitlab-ai/agent-infra 0.8.4 → 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 +9 -0
- package/dist/lib/git/review-snapshot.js +79 -0
- package/dist/lib/git/workflow.js +101 -0
- package/dist/lib/init.js +5 -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 +66 -26
- 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/engine.js +33 -3
- package/dist/lib/sandbox/engines/colima.js +2 -2
- 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/base.dockerfile +4 -0
- package/dist/lib/sandbox/task-resolver.js +5 -1
- package/dist/lib/sandbox/tools.js +19 -0
- package/dist/lib/server/daemon.js +9 -0
- package/dist/lib/server/process-control.js +66 -73
- package/dist/lib/server/process-state.js +168 -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/dist/lib/update.js +2 -0
- package/lib/decide.ts +57 -97
- package/lib/defaults.json +9 -0
- package/lib/git/review-snapshot.ts +73 -0
- package/lib/git/workflow.ts +101 -0
- package/lib/init.ts +9 -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/{templates/.agents/scripts/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +221 -363
- 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 +75 -28
- 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/engine.ts +37 -3
- package/lib/sandbox/engines/colima.ts +2 -2
- 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/base.dockerfile +4 -0
- package/lib/sandbox/task-resolver.ts +5 -1
- package/lib/sandbox/tools.ts +31 -0
- package/lib/server/daemon.ts +9 -0
- package/lib/server/process-control.ts +70 -71
- package/lib/server/process-state.ts +183 -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} +20 -10
- 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} +257 -451
- 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/lib/update.ts +6 -0
- package/package.json +5 -2
- package/templates/.agents/README.en.md +6 -3
- package/templates/.agents/README.zh-CN.md +6 -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 +13 -9
- package/templates/.agents/rules/review-handshake.zh-CN.md +13 -9
- 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 +141 -0
- 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 +18 -14
- package/templates/.agents/skills/commit/SKILL.zh-CN.md +18 -14
- 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 +42 -2
- package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +42 -2
- 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 -6
- package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +11 -6
- 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/init-milestones/SKILL.en.md +2 -2
- package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +5 -4
- 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 +5 -5
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +5 -5
- 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 +12 -4
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +12 -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 +6 -3
- package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +6 -3
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +177 -151
- 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.js +0 -13
- package/templates/.agents/scripts/review-diff-fingerprint.js +0 -99
- 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/lib/update.ts
CHANGED
|
@@ -194,6 +194,12 @@ async function cmdUpdate(): Promise<void> {
|
|
|
194
194
|
platformType
|
|
195
195
|
);
|
|
196
196
|
ok('Updated .agents/skills/update-agent-infra/');
|
|
197
|
+
renderFile(
|
|
198
|
+
path.join(templateDir, '.agents', 'scripts', 'lib', 'agent-infra-package.js'),
|
|
199
|
+
path.join('.agents', 'scripts', 'lib', 'agent-infra-package.js'),
|
|
200
|
+
replacements
|
|
201
|
+
);
|
|
202
|
+
ok('Updated .agents/scripts/lib/agent-infra-package.js');
|
|
197
203
|
try {
|
|
198
204
|
fs.unlinkSync(path.join('.agents', 'skills', 'update-agent-infra', 'scripts', 'sync-templates.cjs'));
|
|
199
205
|
} catch {
|
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,13 +19,15 @@
|
|
|
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/",
|
|
26
27
|
"!dist/**/*.map",
|
|
27
28
|
"bin/cli.ts",
|
|
28
29
|
"lib/",
|
|
30
|
+
"runtime/",
|
|
29
31
|
"templates/"
|
|
30
32
|
],
|
|
31
33
|
"engines": {
|
|
@@ -58,6 +60,7 @@
|
|
|
58
60
|
"typecheck": "tsc -p tsconfig.test.json --noEmit && tsc -p tsconfig.jschecks.json --noEmit",
|
|
59
61
|
"test:smoke": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/unit/**/*.test.ts\"",
|
|
60
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\"",
|
|
61
64
|
"check": "npm run typecheck && npm test",
|
|
62
65
|
"test": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/**/*.test.ts\"",
|
|
63
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\"",
|
|
@@ -209,6 +209,8 @@ The `files` field in `.agents/.airc.json` groups project files into three catego
|
|
|
209
209
|
| `merged` | Merge semantically by AI or humans | Do not write from the template | Keep the local project copy |
|
|
210
210
|
| `ejected` | May be created from the template first; skip overwrite once it exists | Do not write from the template | Keep the local project copy |
|
|
211
211
|
|
|
212
|
+
Ordinary `managed` files keep their overwrite semantics. A small set of platform lifecycle workflows can be registered as guarded managed files. The synchronizer stores each rendered source SHA-256 in `files.managedBaselines` and uses a three-way comparison: accept template-only upgrades, preserve user-only changes, and report a conflict without overwriting when both sides changed or the origin is unknown. This mapping is tool-maintained and should not be edited manually.
|
|
213
|
+
|
|
212
214
|
`ejected` has two common uses:
|
|
213
215
|
|
|
214
216
|
1. **Taking over a built-in file**: the project needs full control over a rule, command, or config file that originally came from the template.
|
|
@@ -398,14 +400,15 @@ When writing or updating `.agents/skills/*/SKILL.md` files and their templates,
|
|
|
398
400
|
For skills that produce structured artifacts or mutate task state, run the verification gate before claiming completion:
|
|
399
401
|
|
|
400
402
|
```bash
|
|
401
|
-
|
|
403
|
+
agent-infra-internal task-verify {task-id} <verification-event> [--artifact <artifact>] --format text
|
|
402
404
|
```
|
|
403
405
|
|
|
404
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
|
|
405
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`
|
|
406
409
|
- If a skill also prints next-step guidance, run the gate first and only show those instructions after the gate passes
|
|
407
|
-
-
|
|
408
|
-
-
|
|
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
|
|
409
412
|
- Keep the gate output in the reply as fresh evidence; without output from the current run, do not claim completion
|
|
410
413
|
|
|
411
414
|
## FAQ
|
|
@@ -209,6 +209,8 @@ disable-model-invocation: true # 可选;由支持该能力的 TUI 适配器
|
|
|
209
209
|
| `merged` | 由 AI 或人工语义合并 | 不从模板写入 | 保留项目本地副本 |
|
|
210
210
|
| `ejected` | 首次可从模板创建,已存在时跳过覆盖 | 不从模板写入 | 保留项目本地副本 |
|
|
211
211
|
|
|
212
|
+
普通 `managed` 文件仍采用覆盖语义。少数平台生命周期 workflow 可登记为 guarded managed:同步器在 `files.managedBaselines` 保存渲染后来源的 SHA-256,并用三方比较自动接收官方单边升级、保留用户单边修改,在双方都变化或来源未知时报告冲突而不覆盖。该映射由工具维护,不建议手工编辑。
|
|
213
|
+
|
|
212
214
|
`ejected` 有两种常见用法:
|
|
213
215
|
|
|
214
216
|
1. **接管内置文件**:项目需要完全控制原本来自模板的规则、命令或配置文件,避免后续同步覆盖本地内容。
|
|
@@ -398,14 +400,15 @@ disable-model-invocation: true # 可选;由支持该能力的 TUI 适配器
|
|
|
398
400
|
对会产生结构化产物或任务状态变更的 skill,统一在结束前运行完成校验:
|
|
399
401
|
|
|
400
402
|
```bash
|
|
401
|
-
|
|
403
|
+
agent-infra-internal task-verify {task-id} <verification-event> [--artifact <artifact>] --format text
|
|
402
404
|
```
|
|
403
405
|
|
|
404
406
|
- 每个 skill 在自己的 `config/verify.json` 中声明需要检查的事项
|
|
407
|
+
- typed verification catalog 将业务事件映射到 skill、workspace、artifact 和 gate/check 顺序;调用方不得自行拼接这些机械参数
|
|
405
408
|
- 对语言相关的产物标题或锚点,`config/verify.en.json` 和 `config/verify.zh-CN.json` 之间只应让 `required_sections` 与语言相关的 `required_patterns` 不同
|
|
406
409
|
- 如果 skill 还会展示“下一步”提示,必须先通过完成校验,再输出这些指引
|
|
407
|
-
-
|
|
408
|
-
-
|
|
410
|
+
- 面向用户展示最终校验结果时使用 `--format text` 输出可读摘要
|
|
411
|
+
- `task-verify` 在进程内按 typed catalog/check registry 执行;SKILL 不得复制校验算法或传机械 check 序列
|
|
409
412
|
- 在回复中保留当次校验输出作为当次验证输出;没有当次校验输出,不得声明完成
|
|
410
413
|
|
|
411
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.
|