@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
|
@@ -13,12 +13,17 @@
|
|
|
13
13
|
* Output: JSON report to stdout.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import
|
|
16
|
+
import crypto from 'node:crypto';
|
|
17
17
|
import fs from 'node:fs';
|
|
18
18
|
import os from 'node:os';
|
|
19
19
|
import path from 'node:path';
|
|
20
20
|
import { fileURLToPath } from 'node:url';
|
|
21
21
|
|
|
22
|
+
import {
|
|
23
|
+
formatAgentInfraPackageError,
|
|
24
|
+
resolveAgentInfraPackage
|
|
25
|
+
} from '../../../scripts/lib/agent-infra-package.js';
|
|
26
|
+
|
|
22
27
|
const DEFAULTS = {
|
|
23
28
|
"platform": {
|
|
24
29
|
"type": "github"
|
|
@@ -63,10 +68,19 @@ const DEFAULTS = {
|
|
|
63
68
|
".claude/commands/",
|
|
64
69
|
".codex/hooks.json",
|
|
65
70
|
".gemini/commands/",
|
|
71
|
+
".git-hooks/check-large-files.cjs",
|
|
66
72
|
".git-hooks/check-version-format.sh",
|
|
67
73
|
".github/scripts/",
|
|
74
|
+
".github/workflows/metadata-sync.yml",
|
|
75
|
+
".github/workflows/pr-label.yml",
|
|
76
|
+
".github/workflows/status-label.yml",
|
|
68
77
|
".opencode/commands/"
|
|
69
78
|
],
|
|
79
|
+
"guardedManaged": [
|
|
80
|
+
".github/workflows/metadata-sync.yml",
|
|
81
|
+
".github/workflows/pr-label.yml",
|
|
82
|
+
".github/workflows/status-label.yml"
|
|
83
|
+
],
|
|
70
84
|
"merged": [
|
|
71
85
|
"**/post-release.*",
|
|
72
86
|
"**/release.*",
|
|
@@ -88,12 +102,11 @@ const DEFAULTS = {
|
|
|
88
102
|
}
|
|
89
103
|
};
|
|
90
104
|
|
|
91
|
-
const PACKAGE_NAME = '@fitlab-ai/agent-infra';
|
|
92
105
|
const AGENT_INFRA_SANDBOX_TOOL = 'agent-infra';
|
|
93
106
|
const LEGACY_DEFAULT_SANDBOX_TOOLS = ['claude-code', 'codex', 'gemini-cli', 'opencode'];
|
|
94
107
|
const DEFAULT_SANDBOX_TOOLS = [AGENT_INFRA_SANDBOX_TOOL, ...LEGACY_DEFAULT_SANDBOX_TOOLS];
|
|
95
108
|
// Add a new identifier here only after shipping matching .{platform}. template variants.
|
|
96
|
-
const KNOWN_PLATFORMS = new Set(['github']);
|
|
109
|
+
const KNOWN_PLATFORMS = new Set(['github', 'none']);
|
|
97
110
|
const KNOWN_LANGUAGES = new Set(['en', 'zh-CN']);
|
|
98
111
|
|
|
99
112
|
// Single source of truth for built-in TUI ids and owned path prefixes.
|
|
@@ -151,6 +164,14 @@ function migrateSandboxTools(cfg) {
|
|
|
151
164
|
|
|
152
165
|
function norm(p) { return p.replace(/\\/g, '/'); }
|
|
153
166
|
|
|
167
|
+
function sha256(content) {
|
|
168
|
+
return `sha256:${crypto.createHash('sha256').update(content).digest('hex')}`;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function trustedBaseline(value) {
|
|
172
|
+
return typeof value === 'string' && /^sha256:[a-f0-9]{64}$/.test(value) ? value : null;
|
|
173
|
+
}
|
|
174
|
+
|
|
154
175
|
function normDir(p) {
|
|
155
176
|
return norm(p).replace(/^\.\//, '').replace(/\/+$/, '');
|
|
156
177
|
}
|
|
@@ -839,117 +860,6 @@ function stripLangVariant(relativePath) {
|
|
|
839
860
|
return relativePath;
|
|
840
861
|
}
|
|
841
862
|
|
|
842
|
-
function isTemplateDir(dir) {
|
|
843
|
-
try {
|
|
844
|
-
return fs.statSync(dir).isDirectory();
|
|
845
|
-
} catch {
|
|
846
|
-
return false;
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
function verifyPackageDir(dir) {
|
|
851
|
-
const pkgPath = path.join(dir, 'package.json');
|
|
852
|
-
if (!fs.existsSync(pkgPath)) {
|
|
853
|
-
return { templateRoot: null, reason: `package.json not found at ${pkgPath}` };
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
let pkg;
|
|
857
|
-
try {
|
|
858
|
-
pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
859
|
-
} catch {
|
|
860
|
-
return { templateRoot: null, reason: `invalid package.json at ${pkgPath}` };
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
if (pkg.name !== PACKAGE_NAME) {
|
|
864
|
-
const packageName = typeof pkg.name === 'string' && pkg.name ? pkg.name : 'an unknown package';
|
|
865
|
-
return { templateRoot: null, reason: `${pkgPath} belongs to ${packageName}` };
|
|
866
|
-
}
|
|
867
|
-
|
|
868
|
-
const templateRoot = path.join(dir, 'templates');
|
|
869
|
-
if (!isTemplateDir(templateRoot)) {
|
|
870
|
-
return { templateRoot: null, reason: `templates/ not found at ${templateRoot}` };
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
return { templateRoot, reason: null };
|
|
874
|
-
}
|
|
875
|
-
|
|
876
|
-
function resolveUnixTemplateRoot(name) {
|
|
877
|
-
let linkPath;
|
|
878
|
-
try {
|
|
879
|
-
linkPath = childProcess.execSync(`command -v ${name}`, {
|
|
880
|
-
encoding: 'utf8',
|
|
881
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
882
|
-
}).trim();
|
|
883
|
-
} catch {
|
|
884
|
-
return { templateRoot: null, reason: 'not found in PATH' };
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
if (!linkPath) {
|
|
888
|
-
return { templateRoot: null, reason: 'not found in PATH' };
|
|
889
|
-
}
|
|
890
|
-
|
|
891
|
-
let realPath;
|
|
892
|
-
try {
|
|
893
|
-
realPath = fs.realpathSync(linkPath);
|
|
894
|
-
} catch {
|
|
895
|
-
return { templateRoot: null, reason: `cannot resolve symlink target for ${linkPath}` };
|
|
896
|
-
}
|
|
897
|
-
|
|
898
|
-
let dir = path.dirname(realPath);
|
|
899
|
-
while (true) {
|
|
900
|
-
const pkgPath = path.join(dir, 'package.json');
|
|
901
|
-
if (fs.existsSync(pkgPath)) {
|
|
902
|
-
return verifyPackageDir(dir);
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
const parentDir = path.dirname(dir);
|
|
906
|
-
if (parentDir === dir) {
|
|
907
|
-
break;
|
|
908
|
-
}
|
|
909
|
-
dir = parentDir;
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
return { templateRoot: null, reason: `no package.json found above ${realPath}` };
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
function resolveWindowsTemplateRoot(name) {
|
|
916
|
-
let output;
|
|
917
|
-
try {
|
|
918
|
-
output = childProcess.execSync(`where ${name}`, {
|
|
919
|
-
encoding: 'utf8',
|
|
920
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
921
|
-
}).trim();
|
|
922
|
-
} catch {
|
|
923
|
-
return { templateRoot: null, reason: 'not found in PATH' };
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
const wrapperPaths = output.split(/\r?\n/).map(line => line.trim()).filter(Boolean);
|
|
927
|
-
if (wrapperPaths.length === 0) {
|
|
928
|
-
return { templateRoot: null, reason: 'not found in PATH' };
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
const wrapperPath = wrapperPaths.find(line => /\.cmd$/i.test(line)) || wrapperPaths[0];
|
|
932
|
-
const packageDir = path.join(path.dirname(wrapperPath), 'node_modules', '@fitlab-ai', 'agent-infra');
|
|
933
|
-
return verifyPackageDir(packageDir);
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
function resolveTemplateRoot() {
|
|
937
|
-
const resolver = process.platform === 'win32'
|
|
938
|
-
? resolveWindowsTemplateRoot
|
|
939
|
-
: resolveUnixTemplateRoot;
|
|
940
|
-
const errors = [];
|
|
941
|
-
|
|
942
|
-
for (const name of ['ai', 'agent-infra']) {
|
|
943
|
-
const result = resolver(name);
|
|
944
|
-
if (result.templateRoot) {
|
|
945
|
-
return result.templateRoot;
|
|
946
|
-
}
|
|
947
|
-
errors.push({ name, reason: result.reason });
|
|
948
|
-
}
|
|
949
|
-
|
|
950
|
-
return { templateRoot: null, errors };
|
|
951
|
-
}
|
|
952
|
-
|
|
953
863
|
function isBinary(fp) {
|
|
954
864
|
const fd = fs.openSync(fp, 'r');
|
|
955
865
|
const buf = Buffer.alloc(8192);
|
|
@@ -960,14 +870,6 @@ function isBinary(fp) {
|
|
|
960
870
|
return false;
|
|
961
871
|
}
|
|
962
872
|
|
|
963
|
-
function gitUrl(dir) {
|
|
964
|
-
try {
|
|
965
|
-
return childProcess.execSync('git remote get-url origin', {
|
|
966
|
-
cwd: dir, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe']
|
|
967
|
-
}).trim();
|
|
968
|
-
} catch { return null; }
|
|
969
|
-
}
|
|
970
|
-
|
|
971
873
|
function langSelect(rels, lang, allSet, project) {
|
|
972
874
|
const sel = new Map();
|
|
973
875
|
|
|
@@ -1037,25 +939,14 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1037
939
|
const configPathRel = norm(path.relative(projectRoot, cfgPath));
|
|
1038
940
|
let templateRoot = templateRootOverride;
|
|
1039
941
|
if (!templateRoot) {
|
|
1040
|
-
const
|
|
1041
|
-
|
|
1042
|
-
|
|
942
|
+
const packageResolution = resolveAgentInfraPackage({
|
|
943
|
+
startPath: path.join(projectRoot, '.agents', 'scripts', 'lib', 'agent-infra-package.js')
|
|
944
|
+
});
|
|
945
|
+
if (packageResolution.templateRoot && fs.existsSync(packageResolution.templateRoot)) {
|
|
946
|
+
templateRoot = packageResolution.templateRoot;
|
|
1043
947
|
} else {
|
|
1044
|
-
const details = resolvedTemplateRoot.errors
|
|
1045
|
-
.map(({ name, reason }) => ` - ${name}: ${reason}`)
|
|
1046
|
-
.join('\n');
|
|
1047
948
|
return {
|
|
1048
|
-
error:
|
|
1049
|
-
'Template source not found.',
|
|
1050
|
-
'',
|
|
1051
|
-
'Attempted binary lookups:',
|
|
1052
|
-
details,
|
|
1053
|
-
'',
|
|
1054
|
-
'Please ensure agent-infra is installed and available on PATH.',
|
|
1055
|
-
'If already installed, upgrade to the latest version or reinstall:',
|
|
1056
|
-
' npm install -g @fitlab-ai/agent-infra',
|
|
1057
|
-
' brew upgrade fitlab-ai/agent-infra/agent-infra || brew install fitlab-ai/agent-infra/agent-infra'
|
|
1058
|
-
].join('\n')
|
|
949
|
+
error: formatAgentInfraPackageError(packageResolution)
|
|
1059
950
|
};
|
|
1060
951
|
}
|
|
1061
952
|
}
|
|
@@ -1073,6 +964,19 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1073
964
|
const managed = [...(cfg.files.managed || [])];
|
|
1074
965
|
const merged = [...(cfg.files.merged || [])];
|
|
1075
966
|
const ejected = [...(cfg.files.ejected || [])];
|
|
967
|
+
const guardedManaged = new Set((DEFAULTS.files.guardedManaged || []).map(norm));
|
|
968
|
+
const managedBaselines = cfg.files.managedBaselines && typeof cfg.files.managedBaselines === 'object'
|
|
969
|
+
&& !Array.isArray(cfg.files.managedBaselines)
|
|
970
|
+
? { ...cfg.files.managedBaselines }
|
|
971
|
+
: {};
|
|
972
|
+
let baselinesChanged = false;
|
|
973
|
+
|
|
974
|
+
for (const target of Object.keys(managedBaselines)) {
|
|
975
|
+
if (!guardedManaged.has(norm(target))) {
|
|
976
|
+
delete managedBaselines[target];
|
|
977
|
+
baselinesChanged = true;
|
|
978
|
+
}
|
|
979
|
+
}
|
|
1076
980
|
|
|
1077
981
|
const report = {
|
|
1078
982
|
templateVersion: version,
|
|
@@ -1085,7 +989,17 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1085
989
|
errors: [],
|
|
1086
990
|
conflicts: []
|
|
1087
991
|
},
|
|
1088
|
-
managed: {
|
|
992
|
+
managed: {
|
|
993
|
+
written: [],
|
|
994
|
+
created: [],
|
|
995
|
+
unchanged: [],
|
|
996
|
+
protected: [],
|
|
997
|
+
conflicts: [],
|
|
998
|
+
skippedMerged: [],
|
|
999
|
+
skippedPlatform: [],
|
|
1000
|
+
skippedTUI: [],
|
|
1001
|
+
removed: []
|
|
1002
|
+
},
|
|
1089
1003
|
custom: {
|
|
1090
1004
|
detected: [],
|
|
1091
1005
|
generated: [],
|
|
@@ -1098,8 +1012,7 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1098
1012
|
},
|
|
1099
1013
|
ejected: { created: [], skipped: [] },
|
|
1100
1014
|
merged: { pending: [] },
|
|
1101
|
-
configUpdated: false
|
|
1102
|
-
selfUpdate: false
|
|
1015
|
+
configUpdated: false
|
|
1103
1016
|
};
|
|
1104
1017
|
const customTUIs = validateCustomTUIs(projectRoot, customTUIsConfig, report);
|
|
1105
1018
|
const customTUICommandTargets = buildCustomTUICommandTargets(
|
|
@@ -1127,6 +1040,22 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1127
1040
|
const allRels = mergedRels;
|
|
1128
1041
|
const allSet = new Set(allRels);
|
|
1129
1042
|
|
|
1043
|
+
function renderedTemplate(entry) {
|
|
1044
|
+
const target = norm(renderPathname(entry, project));
|
|
1045
|
+
const selected = platformSelect(
|
|
1046
|
+
langSelect(entryVariantRels(entry, allSet, platformType), lang, allSet, project),
|
|
1047
|
+
platformType,
|
|
1048
|
+
project
|
|
1049
|
+
);
|
|
1050
|
+
const src = selected.get(target);
|
|
1051
|
+
if (!src) return null;
|
|
1052
|
+
const srcRoot = sourceMap.get(src) || templateRoot;
|
|
1053
|
+
const srcFull = path.join(srcRoot, src);
|
|
1054
|
+
return isBinary(srcFull)
|
|
1055
|
+
? fs.readFileSync(srcFull)
|
|
1056
|
+
: renderContent(fs.readFileSync(srcFull, 'utf8'), vars);
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1130
1059
|
for (const entry of [...managed, ...merged, ...ejected]) {
|
|
1131
1060
|
if (!isPathOwnedByOtherPlatform(entry, platformType)) continue;
|
|
1132
1061
|
|
|
@@ -1135,17 +1064,49 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1135
1064
|
if (!fs.existsSync(dir)) continue;
|
|
1136
1065
|
|
|
1137
1066
|
for (const filePath of walkDir(dir)) {
|
|
1067
|
+
const relativeFile = norm(path.relative(projectRoot, filePath));
|
|
1068
|
+
if (guardedManaged.has(relativeFile)) continue;
|
|
1138
1069
|
fs.unlinkSync(filePath);
|
|
1139
|
-
report.managed.removed.push(
|
|
1070
|
+
report.managed.removed.push(relativeFile);
|
|
1140
1071
|
}
|
|
1141
1072
|
removeEmptyDirs(dir);
|
|
1142
1073
|
continue;
|
|
1143
1074
|
}
|
|
1144
1075
|
|
|
1145
|
-
const
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1076
|
+
const renderedTarget = norm(renderPathname(entry, project));
|
|
1077
|
+
const target = path.join(projectRoot, renderedTarget);
|
|
1078
|
+
if (!guardedManaged.has(renderedTarget)) {
|
|
1079
|
+
if (!fs.existsSync(target)) continue;
|
|
1080
|
+
fs.unlinkSync(target);
|
|
1081
|
+
report.managed.removed.push(renderedTarget);
|
|
1082
|
+
continue;
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
const baseline = trustedBaseline(managedBaselines[renderedTarget]);
|
|
1086
|
+
const templateContent = renderedTemplate(entry);
|
|
1087
|
+
const templateHash = templateContent === null ? null : sha256(templateContent);
|
|
1088
|
+
const localHash = fs.existsSync(target) ? sha256(fs.readFileSync(target)) : null;
|
|
1089
|
+
const safeToRemove = localHash !== null && (localHash === baseline || (!baseline && localHash === templateHash));
|
|
1090
|
+
|
|
1091
|
+
if (safeToRemove) {
|
|
1092
|
+
fs.unlinkSync(target);
|
|
1093
|
+
report.managed.removed.push(renderedTarget);
|
|
1094
|
+
if (Object.prototype.hasOwnProperty.call(managedBaselines, renderedTarget)) {
|
|
1095
|
+
delete managedBaselines[renderedTarget];
|
|
1096
|
+
baselinesChanged = true;
|
|
1097
|
+
}
|
|
1098
|
+
continue;
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
if (localHash !== null || baseline !== null) {
|
|
1102
|
+
report.managed.conflicts.push({
|
|
1103
|
+
target: renderedTarget,
|
|
1104
|
+
reason: localHash === null ? 'platform-switch-deleted' : 'platform-switch-modified',
|
|
1105
|
+
baseline,
|
|
1106
|
+
local: localHash,
|
|
1107
|
+
template: templateHash
|
|
1108
|
+
});
|
|
1109
|
+
}
|
|
1149
1110
|
}
|
|
1150
1111
|
|
|
1151
1112
|
// Cleanup files owned by disabled built-in TUIs. Iterates managed + merged
|
|
@@ -1230,6 +1191,68 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1230
1191
|
: renderContent(fs.readFileSync(srcFull, 'utf8'), vars);
|
|
1231
1192
|
|
|
1232
1193
|
const exists = fs.existsSync(dstFull);
|
|
1194
|
+
if (guardedManaged.has(tgt)) {
|
|
1195
|
+
const rawBaseline = managedBaselines[tgt];
|
|
1196
|
+
const baseline = trustedBaseline(rawBaseline);
|
|
1197
|
+
const templateHash = sha256(content);
|
|
1198
|
+
const localHash = exists ? sha256(fs.readFileSync(dstFull)) : null;
|
|
1199
|
+
|
|
1200
|
+
if (rawBaseline !== undefined && baseline === null) {
|
|
1201
|
+
delete managedBaselines[tgt];
|
|
1202
|
+
baselinesChanged = true;
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
if (baseline === null && localHash !== null && localHash !== templateHash) {
|
|
1206
|
+
report.managed.conflicts.push({
|
|
1207
|
+
target: tgt,
|
|
1208
|
+
reason: 'unknown-origin',
|
|
1209
|
+
baseline: null,
|
|
1210
|
+
local: localHash,
|
|
1211
|
+
template: templateHash
|
|
1212
|
+
});
|
|
1213
|
+
continue;
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
if (baseline !== null && templateHash === baseline && localHash !== baseline) {
|
|
1217
|
+
report.managed.protected.push({
|
|
1218
|
+
target: tgt,
|
|
1219
|
+
reason: localHash === null ? 'user-deleted' : 'user-modified',
|
|
1220
|
+
baseline,
|
|
1221
|
+
local: localHash,
|
|
1222
|
+
template: templateHash
|
|
1223
|
+
});
|
|
1224
|
+
continue;
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
if (baseline !== null && localHash !== baseline && templateHash !== baseline && localHash !== templateHash) {
|
|
1228
|
+
report.managed.conflicts.push({
|
|
1229
|
+
target: tgt,
|
|
1230
|
+
reason: 'both-modified',
|
|
1231
|
+
baseline,
|
|
1232
|
+
local: localHash,
|
|
1233
|
+
template: templateHash
|
|
1234
|
+
});
|
|
1235
|
+
continue;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
if (localHash === templateHash) {
|
|
1239
|
+
report.managed.unchanged.push(tgt);
|
|
1240
|
+
if (managedBaselines[tgt] !== templateHash) {
|
|
1241
|
+
managedBaselines[tgt] = templateHash;
|
|
1242
|
+
baselinesChanged = true;
|
|
1243
|
+
}
|
|
1244
|
+
continue;
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
const dir = path.dirname(dstFull);
|
|
1248
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
1249
|
+
fs.writeFileSync(dstFull, content);
|
|
1250
|
+
managedBaselines[tgt] = templateHash;
|
|
1251
|
+
baselinesChanged = true;
|
|
1252
|
+
(exists ? report.managed.written : report.managed.created).push(tgt);
|
|
1253
|
+
continue;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1233
1256
|
if (exists) {
|
|
1234
1257
|
const cur = bin ? fs.readFileSync(dstFull) : fs.readFileSync(dstFull, 'utf8');
|
|
1235
1258
|
if (bin ? content.equals(cur) : content === cur) {
|
|
@@ -1333,9 +1356,6 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1333
1356
|
([target, template]) => ({ target, template })
|
|
1334
1357
|
);
|
|
1335
1358
|
|
|
1336
|
-
const projUrl = gitUrl(projectRoot);
|
|
1337
|
-
report.selfUpdate = !!(projUrl && /fitlab-ai\/agent-infra/.test(projUrl));
|
|
1338
|
-
|
|
1339
1359
|
const hasChanges = (
|
|
1340
1360
|
report.managed.written.length +
|
|
1341
1361
|
report.managed.created.length +
|
|
@@ -1355,10 +1375,16 @@ function syncTemplates(projectRoot, templateRootOverride) {
|
|
|
1355
1375
|
cfg.files.managed = managed;
|
|
1356
1376
|
cfg.files.merged = merged;
|
|
1357
1377
|
cfg.files.ejected = ejected;
|
|
1378
|
+
if (Object.keys(managedBaselines).length > 0) {
|
|
1379
|
+
cfg.files.managedBaselines = managedBaselines;
|
|
1380
|
+
} else {
|
|
1381
|
+
if (Object.prototype.hasOwnProperty.call(cfg.files, 'managedBaselines')) baselinesChanged = true;
|
|
1382
|
+
delete cfg.files.managedBaselines;
|
|
1383
|
+
}
|
|
1358
1384
|
cfg.templateVersion = version;
|
|
1359
1385
|
delete cfg.templateSource;
|
|
1360
1386
|
|
|
1361
|
-
report.configUpdated = hasChanges || prevVersion !== version || hadTemplateSource || sandboxToolsMigrated;
|
|
1387
|
+
report.configUpdated = hasChanges || baselinesChanged || prevVersion !== version || hadTemplateSource || sandboxToolsMigrated;
|
|
1362
1388
|
|
|
1363
1389
|
fs.writeFileSync(cfgPath, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
|
|
1364
1390
|
|
|
@@ -12,16 +12,16 @@ After `create-pr`, continuously watch the PR's required CI checks: when everythi
|
|
|
12
12
|
## Behavior Boundaries / Key Rules
|
|
13
13
|
|
|
14
14
|
- Only watch + self-heal the current PR's required checks; make no changes unrelated to the failing check.
|
|
15
|
-
- Self-heal
|
|
15
|
+
- Self-heal publishes through Git workflow intents, but **affected tests must pass first**; the attempt cap and code-layer authorization remain unchanged.
|
|
16
16
|
- The help exit is "produce-then-stop": end this round, output the blocker explanation, and wait for the user to trigger the next step — **never** ask mid-flow.
|
|
17
|
-
- Bare numbers /
|
|
17
|
+
- Bare numbers / `NN` / `TASK-id` arguments are always resolved as task short ids (see `.agents/rules/task-short-id.md`); a PR number is passed only via `--pr <number>` / a PR URL / omission (current branch), never reusing the bare-number syntax.
|
|
18
18
|
- After running this skill (task-anchored path), you must update task.md.
|
|
19
19
|
|
|
20
20
|
Version stamp rule: before creating or updating `task.md` frontmatter, read `.agents/rules/version-stamp.md` and write or refresh `agent_infra_version`.
|
|
21
21
|
|
|
22
|
-
## Task
|
|
22
|
+
## Task Context Resolution
|
|
23
23
|
|
|
24
|
-
>
|
|
24
|
+
> Keep `--pr <number>` and PR URLs on the existing PR-anchored path. Otherwise, the task path may omit the task ref and also accepts a legacy positional ref or `--task <ref>` / `-t <ref>`. Separate task scope from the full arguments, then call `agent-infra-internal task-context resolve {task-scope}` and bind `{task-id}` to the returned full `taskId`. A PR anchor and task scope are mutually exclusive.
|
|
25
25
|
|
|
26
26
|
## Step Start: Write the started Marker
|
|
27
27
|
|
|
@@ -39,22 +39,22 @@ After prerequisites pass and before this round's first artifact action, append a
|
|
|
39
39
|
|
|
40
40
|
Resolve the target PR number `{pr#}` and an optional `{task-id}` via these deterministic branches:
|
|
41
41
|
|
|
42
|
-
- Scenario A (argument omitted):
|
|
43
|
-
- Scenario B (
|
|
42
|
+
- Scenario A (argument omitted): reverse-lookup the active task from the current branch, then read its `pr_number`.
|
|
43
|
+
- Scenario B (omitted task ref, positional task ref, or `--task/-t`, **task-anchored primary path**): resolve the full `{task-id}` via "Task Context Resolution" and read `.agents/workspace/active/{task-id}/task.md` for `pr_number` as `{pr#}`; if `pr_number` is empty, follow "Error Handling" to prompt running `create-pr` first, then stop.
|
|
44
44
|
- Scenario C (`--pr <number>` or a PR URL): use that PR number directly as `{pr#}`; then determine `{task-id}` via "Reverse-lookup task".
|
|
45
|
-
- Reverse-lookup task (scenarios A / C):
|
|
45
|
+
- Reverse-lookup task (scenarios A / C): use task context/query capabilities to find the unique active task bound to `{pr#}`. If none exists, stop and request binding first; the typed checks intent does not create a second taskless state machine.
|
|
46
46
|
|
|
47
47
|
### 2. Watch Required Checks
|
|
48
48
|
|
|
49
49
|
Before running this step, read `reference/monitor-and-heal.md` and `.agents/rules/pr-checks-commands.md`.
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
Initialize the in-memory list `repairCommits=[]` for this run. Run `agent-infra-internal platform-checks watch {task-id} --interval-seconds 30 --deadline-seconds 1800`, then route its structured `checks.state` to the all-green, failure, or pending path.
|
|
52
52
|
|
|
53
53
|
### 3. Failure Self-Heal Loop
|
|
54
54
|
|
|
55
55
|
Before running this step, read the "Self-Heal Decision Tree" of `reference/monitor-and-heal.md` and "Resolve a Failing Run id and Pull Logs" of `.agents/rules/pr-checks-commands.md`.
|
|
56
56
|
|
|
57
|
-
For a
|
|
57
|
+
For a locatable code-layer failure, make the minimum fix and run relevant tests. Then call `git-workflow commit` and `git-workflow push`; append only a remotely verified SHA to `repairCommits`.
|
|
58
58
|
|
|
59
59
|
### 4. Help Exit (Produce-Then-Stop)
|
|
60
60
|
|
|
@@ -77,7 +77,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
77
77
|
- **Do not change** `pr_status` (keep `created`) or `current_step`
|
|
78
78
|
- **Append** to `## Activity Log` (do not overwrite prior entries; `{N}` = number of existing Watch PR entries for this task + 1):
|
|
79
79
|
```
|
|
80
|
-
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Watch PR (Round {N})** by {agent} — {green: all required checks green / blocked: blocked: {summary}}
|
|
80
|
+
- {YYYY-MM-DD HH:mm:ss±HH:MM} — **Watch PR (Round {N})** by {agent} — {green: all required checks green, repair commits: {k} [{SHA summary}] / blocked: blocked: {summary}}
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
### 6. Verification Gate
|
|
@@ -87,7 +87,7 @@ Update `.agents/workspace/active/{task-id}/task.md`:
|
|
|
87
87
|
Run the verification gate:
|
|
88
88
|
|
|
89
89
|
```bash
|
|
90
|
-
|
|
90
|
+
agent-infra-internal task-verify {task-id} watch-pr.completed --format text
|
|
91
91
|
```
|
|
92
92
|
|
|
93
93
|
Handle the result:
|
|
@@ -101,10 +101,12 @@ Keep the gate output in your reply as the verification evidence. Without current
|
|
|
101
101
|
|
|
102
102
|
> On the task-anchored path, execute this step only after the gate passes.
|
|
103
103
|
|
|
104
|
-
> **IMPORTANT**: All TUI command formats listed below must be output in full. Do not show only the format for the current AI agent. If `.agents/.airc.json` configures custom TUIs (via `customTUIs`), read each tool's `name` and `invoke`, then add the matching command line in the same format (`${skillName}` becomes the skill name and `${projectName}` becomes the project name). Before rendering the final output, read `.agents/rules/next-step-output.md` and apply both of its rules: (1) render `{task-ref}` in the "Next steps" commands as the short id
|
|
104
|
+
> **IMPORTANT**: All TUI command formats listed below must be output in full. Do not show only the format for the current AI agent. If `.agents/.airc.json` configures custom TUIs (via `customTUIs`), read each tool's `name` and `invoke`, then add the matching command line in the same format (`${skillName}` becomes the skill name and `${projectName}` becomes the project name). Before rendering the final output, read `.agents/rules/next-step-output.md` and apply both of its rules: (1) render `{task-ref}` in the "Next steps" commands as the short id `NN` (falling back to the full TASK-id when unallocated or released); (2) append the `Completed at` line as the very last line of the user-facing output (this applies to every user-facing output — success, error, and early-return paths alike, not only the success path).
|
|
105
105
|
|
|
106
106
|
Output per scenario:
|
|
107
|
-
- "All green" + task-anchored: state that all required checks passed
|
|
107
|
+
- "All green" + task-anchored: state that all required checks passed, then render exactly one exit based on whether this run created repair commits (`{task-ref}` becomes the short id):
|
|
108
|
+
|
|
109
|
+
`repairCommits.length == 0`:
|
|
108
110
|
|
|
109
111
|
```
|
|
110
112
|
Next step - Complete and archive the task:
|
|
@@ -113,7 +115,15 @@ Output per scenario:
|
|
|
113
115
|
- Codex CLI: $complete-task {task-ref}
|
|
114
116
|
```
|
|
115
117
|
|
|
116
|
-
|
|
118
|
+
`repairCommits.length > 0`:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
Next step - Re-run code review:
|
|
122
|
+
- Claude Code / OpenCode: /review-code {task-ref}
|
|
123
|
+
- Gemini CLI: /{{project}}:review-code {task-ref}
|
|
124
|
+
- Codex CLI: $review-code {task-ref}
|
|
125
|
+
```
|
|
126
|
+
|
|
117
127
|
- "Blocked": output only the step 4 blocker explanation; do not recommend a next-step command.
|
|
118
128
|
|
|
119
129
|
## Completion Checklist
|