@fitlab-ai/agent-infra 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.ts +2 -2
- package/dist/bin/cli.js +2 -2
- package/dist/bin/internal-cli.js +98 -0
- package/dist/lib/decide.js +81 -90
- package/dist/lib/defaults.json +1 -0
- package/dist/lib/git/review-snapshot.js +79 -0
- package/dist/lib/git/workflow.js +101 -0
- package/dist/lib/internal/git-workflow.js +42 -0
- package/dist/lib/internal/platform-checks.js +119 -0
- package/dist/lib/internal/platform-comment.js +129 -0
- package/dist/lib/internal/platform-context.js +46 -0
- package/dist/lib/internal/platform-issue.js +142 -0
- package/dist/lib/internal/platform-pr.js +146 -0
- package/dist/lib/internal/release-workflow.js +217 -0
- package/dist/lib/internal/task-artifact.js +67 -0
- package/dist/lib/internal/task-context.js +43 -0
- package/dist/lib/internal/task-event.js +70 -0
- package/dist/lib/internal/task-ledger.js +114 -0
- package/dist/lib/internal/task-lifecycle.js +58 -0
- package/dist/lib/internal/task-short-id.js +83 -0
- package/dist/lib/internal/task-snapshot.js +47 -0
- package/dist/lib/internal/task-verify.js +50 -0
- package/dist/lib/internal/task-warning.js +74 -0
- package/dist/lib/platform/adapters.js +14 -0
- package/dist/lib/platform/context.js +146 -0
- package/dist/lib/platform/github-client.js +124 -0
- package/dist/lib/platform/issue-comments.js +409 -0
- package/dist/lib/platform/issue-metadata.js +183 -0
- package/dist/lib/platform/issues.js +617 -0
- package/dist/lib/platform/metadata-labels.js +28 -0
- package/dist/lib/platform/pr-checks.js +216 -0
- package/dist/lib/platform/pr-summary.js +88 -0
- package/dist/lib/platform/pull-request-metadata.js +38 -0
- package/dist/lib/platform/pull-requests.js +338 -0
- package/dist/lib/platform/releases.js +82 -0
- package/dist/lib/platform/types.js +22 -0
- package/dist/lib/platform/verification-required.js +78 -0
- package/dist/lib/platform/verification-sync.js +1014 -0
- package/dist/lib/platform/verification.js +6 -0
- package/dist/lib/release/channels.js +31 -0
- package/dist/lib/release/workflow.js +32 -0
- package/dist/lib/render.js +3 -2
- package/dist/lib/run/index.js +24 -7
- package/dist/lib/sandbox/capture.js +25 -3
- package/dist/lib/sandbox/commands/create.js +36 -22
- package/dist/lib/sandbox/commands/enter.js +34 -11
- package/dist/lib/sandbox/commands/list-running.js +10 -8
- package/dist/lib/sandbox/commands/show.js +2 -2
- package/dist/lib/sandbox/commands/start.js +53 -15
- package/dist/lib/sandbox/index.js +6 -6
- package/dist/lib/sandbox/mounts.js +36 -0
- package/dist/lib/sandbox/recovery.js +562 -0
- package/dist/lib/sandbox/task-resolver.js +5 -1
- package/dist/lib/sandbox/tools.js +19 -0
- package/dist/lib/server/protocol.js +5 -5
- package/dist/lib/task/activity-log.js +61 -0
- package/dist/lib/task/artifact-lifecycle.js +427 -0
- package/dist/lib/task/command-options.js +30 -0
- package/dist/lib/task/commands/cat.js +36 -6
- package/dist/lib/task/commands/decisions.js +80 -46
- package/dist/lib/task/commands/files.js +21 -7
- package/dist/lib/task/commands/grep.js +55 -7
- package/dist/lib/task/commands/issue-body.js +23 -14
- package/dist/lib/task/commands/log.js +27 -70
- package/dist/lib/task/commands/show.js +20 -7
- package/dist/lib/task/commands/status.js +18 -8
- package/dist/lib/task/decision-intents.js +154 -0
- package/dist/lib/task/decision-items.js +53 -0
- package/dist/lib/task/events.js +318 -0
- package/dist/lib/task/frontmatter.js +159 -1
- package/dist/lib/task/implementation-inputs.js +117 -0
- package/dist/lib/task/index.js +12 -9
- package/dist/lib/task/issue-form.js +19 -6
- package/dist/lib/task/ledger-intents.js +185 -0
- package/dist/lib/task/ledger.js +65 -35
- package/dist/lib/task/lifecycle.js +484 -0
- package/dist/lib/task/resolve-ref.js +152 -32
- package/dist/lib/task/review-artifacts.js +101 -0
- package/dist/lib/task/review-fingerprint.js +46 -0
- package/dist/lib/task/sections.js +358 -4
- package/dist/lib/task/short-id.js +292 -7
- package/dist/lib/task/snapshot.js +95 -0
- package/dist/lib/task/verification-checks.js +8 -0
- package/dist/lib/task/verification-config.js +14 -0
- package/dist/lib/task/verification-engine.js +906 -0
- package/dist/lib/task/verification-review.js +3 -0
- package/dist/lib/task/verification-types.js +2 -0
- package/dist/lib/task/verification.js +113 -0
- package/dist/lib/task/workflow-warning-intents.js +131 -0
- package/dist/lib/task/workflow-warnings.js +10 -78
- package/dist/lib/task/write.js +241 -0
- package/lib/decide.ts +57 -97
- package/lib/defaults.json +1 -0
- package/lib/git/review-snapshot.ts +73 -0
- package/lib/git/workflow.ts +101 -0
- package/lib/internal/git-workflow.ts +37 -0
- package/lib/internal/platform-checks.ts +101 -0
- package/lib/internal/platform-comment.ts +99 -0
- package/lib/internal/platform-context.ts +33 -0
- package/lib/internal/platform-issue.ts +116 -0
- package/lib/internal/platform-pr.ts +119 -0
- package/lib/internal/release-workflow.ts +186 -0
- package/lib/internal/task-artifact.ts +47 -0
- package/lib/internal/task-context.ts +35 -0
- package/lib/internal/task-event.ts +51 -0
- package/lib/internal/task-ledger.ts +86 -0
- package/lib/internal/task-lifecycle.ts +41 -0
- package/lib/internal/task-short-id.ts +55 -0
- package/lib/internal/task-snapshot.ts +32 -0
- package/lib/internal/task-verify.ts +33 -0
- package/lib/internal/task-warning.ts +50 -0
- package/lib/platform/adapters.ts +30 -0
- package/lib/platform/context.ts +164 -0
- package/lib/platform/github-client.ts +146 -0
- package/lib/platform/issue-comments.ts +479 -0
- package/lib/platform/issue-metadata.ts +250 -0
- package/lib/platform/issues.ts +691 -0
- package/lib/platform/metadata-labels.ts +33 -0
- package/lib/platform/pr-checks.ts +246 -0
- package/lib/platform/pr-summary.ts +90 -0
- package/lib/platform/pull-request-metadata.ts +69 -0
- package/lib/platform/pull-requests.ts +380 -0
- package/lib/platform/releases.ts +71 -0
- package/lib/platform/types.ts +74 -0
- package/lib/platform/verification-required.ts +83 -0
- package/{runtime/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +198 -367
- package/lib/platform/verification.ts +11 -0
- package/lib/release/channels.ts +30 -0
- package/lib/release/workflow.ts +31 -0
- package/lib/render.ts +3 -2
- package/lib/run/index.ts +25 -7
- package/lib/sandbox/capture.ts +29 -3
- package/lib/sandbox/commands/create.ts +43 -25
- package/lib/sandbox/commands/enter.ts +38 -11
- package/lib/sandbox/commands/list-running.ts +10 -8
- package/lib/sandbox/commands/show.ts +2 -2
- package/lib/sandbox/commands/start.ts +50 -16
- package/lib/sandbox/index.ts +6 -6
- package/lib/sandbox/mounts.ts +55 -0
- package/lib/sandbox/recovery.ts +828 -0
- package/lib/sandbox/task-resolver.ts +5 -1
- package/lib/sandbox/tools.ts +31 -0
- package/lib/server/protocol.ts +5 -5
- package/lib/task/activity-log.ts +62 -0
- package/lib/task/artifact-lifecycle.ts +484 -0
- package/lib/task/command-options.ts +32 -0
- package/lib/task/commands/cat.ts +22 -9
- package/lib/task/commands/decisions.ts +49 -47
- package/lib/task/commands/files.ts +14 -6
- package/lib/task/commands/grep.ts +34 -7
- package/lib/task/commands/issue-body.ts +16 -16
- package/lib/task/commands/log.ts +17 -70
- package/lib/task/commands/show.ts +14 -6
- package/lib/task/commands/status.ts +17 -7
- package/lib/task/decision-intents.ts +163 -0
- package/lib/task/decision-items.ts +64 -0
- package/lib/task/events.ts +320 -0
- package/lib/task/frontmatter.ts +202 -2
- package/lib/task/implementation-inputs.ts +137 -0
- package/lib/task/index.ts +12 -9
- package/lib/task/issue-form.ts +20 -6
- package/lib/task/ledger-intents.ts +201 -0
- package/lib/task/ledger.ts +77 -31
- package/lib/task/lifecycle.ts +458 -0
- package/lib/task/resolve-ref.ts +197 -36
- package/{templates/.agents/scripts/lib/review-artifacts.js → lib/task/review-artifacts.ts} +11 -12
- package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts} +17 -12
- package/lib/task/sections.ts +486 -4
- package/lib/task/short-id.ts +403 -9
- package/lib/task/snapshot.ts +143 -0
- package/lib/task/verification-checks.ts +9 -0
- package/lib/task/verification-config.ts +20 -0
- package/{templates/.agents/scripts/validate-artifact.js → lib/task/verification-engine.ts} +199 -406
- package/lib/task/verification-review.ts +9 -0
- package/lib/task/verification-types.ts +29 -0
- package/lib/task/verification.ts +156 -0
- package/lib/task/workflow-warning-intents.ts +142 -0
- package/lib/task/workflow-warnings.ts +10 -78
- package/lib/task/write.ts +468 -0
- package/package.json +4 -2
- package/templates/.agents/README.en.md +4 -3
- package/templates/.agents/README.zh-CN.md +4 -3
- package/templates/.agents/rules/README.en.md +6 -5
- package/templates/.agents/rules/README.zh-CN.md +6 -5
- package/templates/.agents/rules/create-issue.en.md +1 -1
- package/templates/.agents/rules/create-issue.github.en.md +5 -184
- package/templates/.agents/rules/create-issue.github.zh-CN.md +12 -178
- package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
- package/templates/.agents/rules/human-decision-context.en.md +36 -0
- package/templates/.agents/rules/human-decision-context.zh-CN.md +36 -0
- package/templates/.agents/rules/issue-fields.github.en.md +4 -148
- package/templates/.agents/rules/issue-fields.github.zh-CN.md +9 -144
- package/templates/.agents/rules/issue-pr-commands.en.md +43 -3
- package/templates/.agents/rules/issue-pr-commands.github.en.md +15 -220
- package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +23 -213
- package/templates/.agents/rules/issue-pr-commands.zh-CN.md +45 -3
- package/templates/.agents/rules/issue-sync.en.md +1 -1
- package/templates/.agents/rules/issue-sync.github.en.md +14 -301
- package/templates/.agents/rules/issue-sync.github.zh-CN.md +36 -287
- package/templates/.agents/rules/issue-sync.zh-CN.md +1 -1
- package/templates/.agents/rules/milestone-inference.en.md +1 -1
- package/templates/.agents/rules/milestone-inference.github.en.md +7 -119
- package/templates/.agents/rules/milestone-inference.github.zh-CN.md +8 -108
- package/templates/.agents/rules/milestone-inference.zh-CN.md +1 -1
- package/templates/.agents/rules/next-step-output.en.md +12 -11
- package/templates/.agents/rules/next-step-output.zh-CN.md +12 -11
- package/templates/.agents/rules/no-mid-flow-questions.en.md +3 -3
- package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +3 -3
- package/templates/.agents/rules/pr-checks-commands.en.md +16 -3
- package/templates/.agents/rules/pr-checks-commands.github.en.md +10 -54
- package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +19 -47
- package/templates/.agents/rules/pr-checks-commands.zh-CN.md +30 -3
- package/templates/.agents/rules/pr-sync.en.md +30 -3
- package/templates/.agents/rules/pr-sync.github.en.md +12 -115
- package/templates/.agents/rules/pr-sync.github.zh-CN.md +26 -104
- package/templates/.agents/rules/pr-sync.zh-CN.md +43 -3
- package/templates/.agents/rules/review-handshake.en.md +8 -5
- package/templates/.agents/rules/review-handshake.zh-CN.md +8 -5
- package/templates/.agents/rules/task-management.en.md +11 -2
- package/templates/.agents/rules/task-management.zh-CN.md +11 -3
- package/templates/.agents/rules/task-short-id.en.md +25 -29
- package/templates/.agents/rules/task-short-id.zh-CN.md +20 -23
- package/templates/.agents/scripts/lib/agent-infra-package.js +1 -9
- package/templates/.agents/scripts/task-short-id.js +71 -533
- package/templates/.agents/skills/analyze-task/SKILL.en.md +22 -55
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +26 -59
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -3
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/block-task/SKILL.en.md +21 -47
- package/templates/.agents/skills/block-task/SKILL.zh-CN.md +23 -47
- package/templates/.agents/skills/block-task/config/verify.json +1 -2
- package/templates/.agents/skills/cancel-task/SKILL.en.md +16 -45
- package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +16 -45
- package/templates/.agents/skills/cancel-task/config/verify.json +1 -2
- package/templates/.agents/skills/check-task/SKILL.en.md +6 -3
- package/templates/.agents/skills/check-task/SKILL.zh-CN.md +6 -3
- package/templates/.agents/skills/close-codescan/SKILL.en.md +6 -24
- package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +6 -24
- package/templates/.agents/skills/close-dependabot/SKILL.en.md +6 -24
- package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +6 -24
- package/templates/.agents/skills/code-task/SKILL.en.md +22 -35
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +28 -44
- package/templates/.agents/skills/code-task/config/verify.en.json +3 -3
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +3 -3
- package/templates/.agents/skills/code-task/reference/dual-mode.en.md +13 -9
- package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +13 -9
- package/templates/.agents/skills/code-task/reference/fix-mode.en.md +1 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +1 -1
- package/templates/.agents/skills/code-task/reference/report-template.en.md +11 -1
- package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +11 -1
- package/templates/.agents/skills/commit/SKILL.en.md +13 -11
- package/templates/.agents/skills/commit/SKILL.zh-CN.md +13 -11
- package/templates/.agents/skills/commit/config/verify.json +1 -2
- package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -11
- package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -11
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +4 -8
- package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +4 -8
- package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +6 -18
- package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +5 -17
- package/templates/.agents/skills/commit/reference/task-status-update.en.md +13 -0
- package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +13 -0
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +13 -36
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +13 -36
- package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -3
- package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +10 -54
- package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +10 -79
- package/templates/.agents/skills/complete-task/SKILL.en.md +59 -63
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +59 -63
- package/templates/.agents/skills/complete-task/config/verify.en.json +11 -7
- package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +11 -7
- package/templates/.agents/skills/create-pr/SKILL.en.md +19 -44
- package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +19 -43
- package/templates/.agents/skills/create-pr/config/verify.json +1 -2
- package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +8 -12
- package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +7 -11
- package/templates/.agents/skills/create-task/SKILL.en.md +12 -13
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +12 -13
- package/templates/.agents/skills/create-task/config/verify.json +1 -2
- package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-codescan/config/verify.json +1 -2
- package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/import-dependabot/config/verify.json +1 -2
- package/templates/.agents/skills/import-issue/SKILL.en.md +9 -13
- package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -14
- package/templates/.agents/skills/import-issue/config/verify.json +1 -2
- package/templates/.agents/skills/plan-task/SKILL.en.md +17 -42
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +22 -49
- package/templates/.agents/skills/plan-task/config/verify.en.json +1 -3
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -3
- package/templates/.agents/skills/post-release/SKILL.en.md +11 -81
- package/templates/.agents/skills/post-release/SKILL.zh-CN.md +8 -78
- package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
- package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/release/SKILL.en.md +16 -163
- package/templates/.agents/skills/release/SKILL.zh-CN.md +15 -162
- package/templates/.agents/skills/restore-task/SKILL.en.md +11 -29
- package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +11 -29
- package/templates/.agents/skills/restore-task/config/verify.json +1 -2
- package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -25
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +13 -33
- package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +9 -12
- package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +9 -12
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +9 -2
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +9 -2
- package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/review-code/SKILL.en.md +22 -36
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +23 -41
- package/templates/.agents/skills/review-code/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-code/reference/output-templates.en.md +56 -18
- package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +56 -18
- package/templates/.agents/skills/review-code/reference/report-template.en.md +11 -4
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +11 -4
- package/templates/.agents/skills/review-code/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/review-plan/SKILL.en.md +13 -25
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +13 -33
- package/templates/.agents/skills/review-plan/config/verify.en.json +3 -4
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -4
- package/templates/.agents/skills/review-plan/reference/output-templates.en.md +9 -12
- package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +9 -12
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +9 -2
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +9 -2
- package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +7 -0
- package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +7 -0
- package/templates/.agents/skills/update-agent-infra/SKILL.en.md +1 -2
- package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +1 -2
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -15
- package/templates/.agents/skills/watch-pr/SKILL.en.md +24 -14
- package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +25 -15
- package/templates/.agents/skills/watch-pr/config/verify.json +1 -2
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +2 -2
- package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +2 -2
- package/templates/.agents/templates/task.en.md +6 -1
- package/templates/.agents/templates/task.zh-CN.md +6 -1
- package/templates/.claude/commands/analyze-task.en.md +1 -1
- package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
- package/templates/.claude/commands/block-task.en.md +1 -1
- package/templates/.claude/commands/block-task.zh-CN.md +1 -1
- package/templates/.claude/commands/cancel-task.en.md +1 -1
- package/templates/.claude/commands/cancel-task.zh-CN.md +1 -1
- package/templates/.claude/commands/check-task.en.md +1 -1
- package/templates/.claude/commands/check-task.zh-CN.md +1 -1
- package/templates/.claude/commands/code-task.en.md +1 -1
- package/templates/.claude/commands/code-task.zh-CN.md +1 -1
- package/templates/.claude/commands/commit.en.md +1 -0
- package/templates/.claude/commands/commit.zh-CN.md +1 -0
- package/templates/.claude/commands/complete-manual-validation.en.md +1 -1
- package/templates/.claude/commands/complete-manual-validation.zh-CN.md +1 -1
- package/templates/.claude/commands/complete-task.en.md +1 -1
- package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
- package/templates/.claude/commands/create-pr.en.md +1 -1
- package/templates/.claude/commands/create-pr.zh-CN.md +1 -1
- package/templates/.claude/commands/plan-task.en.md +1 -1
- package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
- package/templates/.claude/commands/review-analysis.en.md +1 -1
- package/templates/.claude/commands/review-analysis.zh-CN.md +1 -1
- package/templates/.claude/commands/review-code.en.md +1 -1
- package/templates/.claude/commands/review-code.zh-CN.md +1 -1
- package/templates/.claude/commands/review-plan.en.md +1 -1
- package/templates/.claude/commands/review-plan.zh-CN.md +1 -1
- package/templates/.claude/commands/watch-pr.en.md +1 -1
- package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
- package/templates/.gemini/commands/_project_/analyze-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/block-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/cancel-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/check-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/code-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/commit.en.toml +4 -0
- package/templates/.gemini/commands/_project_/commit.zh-CN.toml +4 -0
- package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/create-pr.en.toml +2 -0
- package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/plan-task.en.toml +2 -0
- package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-analysis.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-code.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/review-plan.en.toml +2 -0
- package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +2 -0
- package/templates/.gemini/commands/_project_/watch-pr.en.toml +2 -0
- package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +2 -0
- package/templates/.git-hooks/check-large-files.cjs +92 -0
- package/templates/.git-hooks/check-version-format.sh +5 -1
- package/templates/.git-hooks/pre-commit +1 -0
- package/templates/.opencode/commands/analyze-task.en.md +1 -1
- package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/check-task.en.md +1 -1
- package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/code-task.en.md +1 -1
- package/templates/.opencode/commands/code-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/commit.en.md +2 -0
- package/templates/.opencode/commands/commit.zh-CN.md +2 -0
- package/templates/.opencode/commands/complete-task.en.md +1 -1
- package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/plan-task.en.md +1 -1
- package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-analysis.en.md +1 -1
- package/templates/.opencode/commands/review-analysis.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-code.en.md +1 -1
- package/templates/.opencode/commands/review-code.zh-CN.md +1 -1
- package/templates/.opencode/commands/review-plan.en.md +1 -1
- package/templates/.opencode/commands/review-plan.zh-CN.md +1 -1
- package/templates/.agents/scripts/platform-adapters/platform-sync.github.js +0 -40
- package/templates/.agents/scripts/platform-adapters/platform-sync.js +0 -13
- package/templates/.agents/scripts/review-diff-fingerprint.js +0 -170
- package/templates/.agents/scripts/workflow-warnings.js +0 -290
- package/templates/.agents/skills/code-task/scripts/detect-mode.js +0 -257
- package/templates/.agents/skills/release/scripts/manage-milestones.github.sh +0 -80
- package/templates/.agents/skills/release/scripts/manage-milestones.sh +0 -6
|
@@ -1,237 +1,47 @@
|
|
|
1
|
-
#
|
|
1
|
+
# PR 平台意图命令
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
PR 资源的定位、创建、绑定和元数据同步统一通过 typed internal intent;SKILL 只负责决定分支、标题、正文和调用时机,不直接拼装平台命令。
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
先验证 GitHub CLI 可用且已认证:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
gh auth status
|
|
11
|
-
gh repo view --json nameWithOwner
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
如果任一命令失败,按调用该规则的 skill 约定停止或降级。
|
|
15
|
-
|
|
16
|
-
## Upstream 仓库与权限检测
|
|
17
|
-
|
|
18
|
-
在后续任何 `gh issue` 或 `gh api "repos/..."` 操作之前,先按 `.agents/rules/issue-sync.md` 完成 `upstream_repo`、`has_triage` 和 `has_push` 检测。
|
|
19
|
-
|
|
20
|
-
- 后续所有 `gh issue` 命令统一使用 `-R "$upstream_repo"`
|
|
21
|
-
- 后续所有 repo 级 `gh api` 命令统一使用 `"repos/$upstream_repo/..."`
|
|
22
|
-
- `gh pr *` 命令保持作用于当前仓库,不额外加 `-R`
|
|
23
|
-
- `gh api "orgs/{owner}/..."` 这类 org 级命令保持不变
|
|
24
|
-
|
|
25
|
-
## Issue 模板检测
|
|
26
|
-
|
|
27
|
-
使用以下命令检测 GitHub Issue Forms:
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
rg --files .github/ISSUE_TEMPLATE -g '*.yml' -g '!config.yml'
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
创建 Issue 前先读取匹配的 form 文件。目录不存在或没有匹配 form 时,使用调用方定义的 fallback 正文格式。
|
|
34
|
-
|
|
35
|
-
常见候选模板:
|
|
36
|
-
- `bug_report.yml`:bug 工作
|
|
37
|
-
- `question.yml`:问题或排查工作
|
|
38
|
-
- `feature_request.yml`:功能工作
|
|
39
|
-
- `documentation.yml`:文档工作
|
|
40
|
-
- `other.yml`:通用 fallback
|
|
41
|
-
|
|
42
|
-
对 GitHub Issue Forms,检查匹配 form 的:
|
|
43
|
-
- `name`
|
|
44
|
-
- `type:`
|
|
45
|
-
- `labels:`
|
|
46
|
-
- `body:`
|
|
47
|
-
|
|
48
|
-
字段处理规则:
|
|
49
|
-
- `textarea` 和 `input`:使用 `attributes.label` 作为 markdown 标题,并从 task.md 填充值
|
|
50
|
-
- `markdown`:跳过模板说明文案
|
|
51
|
-
- `dropdown` 和 `checkboxes`:跳过
|
|
52
|
-
- task.md 缺少合适值时,写入 `N/A`
|
|
53
|
-
|
|
54
|
-
建议字段映射:
|
|
55
|
-
|
|
56
|
-
| 模板字段提示 | task.md 来源 |
|
|
57
|
-
|---|---|
|
|
58
|
-
| `summary`, `title` | 任务标题 |
|
|
59
|
-
| `description`, `problem`, `what happened`, `issue-description`, `current-content` | 任务描述 |
|
|
60
|
-
| `solution`, `requirements`, `steps`, `suggested-content`, `impact`, `context`, `alternatives`, `expected` | 需求列表 |
|
|
61
|
-
| 其他 `textarea` / `input` 字段 | 任务描述,否则 `N/A` |
|
|
62
|
-
|
|
63
|
-
## Issue 读取与创建
|
|
64
|
-
|
|
65
|
-
读取 Issue:
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
gh issue view {issue-number} -R "$upstream_repo" --json number,title,body,labels,state,milestone,url
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
创建 Issue:
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
gh issue create -R "$upstream_repo" --title "{title}" --body "{body}" --assignee @me {label-args} {milestone-arg}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
- `{label-args}` 由调用方按有效 label 列表展开为多个 `--label`
|
|
78
|
-
- 仅当 `has_triage=true` 时传入 `{label-args}`;否则整体省略并继续
|
|
79
|
-
- 没有有效 label 时省略全部 `--label`
|
|
80
|
-
- 仅当 `has_triage=true` 时传入 `{milestone-arg}`;否则整体省略并继续
|
|
81
|
-
- `{milestone-arg}` 为空时整体省略
|
|
82
|
-
|
|
83
|
-
设置 Issue Type:
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
owner_type=$(gh api "repos/$upstream_repo" --jq '.owner.type // empty' 2>/dev/null || true)
|
|
87
|
-
if [ "$owner_type" = "Organization" ]; then
|
|
88
|
-
owner=${upstream_repo%%/*}
|
|
89
|
-
gh api "orgs/$owner/issue-types" --jq '.[].name'
|
|
90
|
-
gh api "repos/$upstream_repo/issues/{issue-number}" -X PATCH -f type="{issue-type}" --silent
|
|
91
|
-
fi
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
- 仅当 `has_push=true` 时执行 Issue Type 设置;否则跳过并继续
|
|
95
|
-
- 仅当 owner type 为 `Organization` 时查询和设置 Issue Type;个人仓库或 owner type 探测失败时跳过并继续
|
|
96
|
-
- 变更现有 Issue Type 时,先读取 `.agents/rules/issue-fields.md` 并使用流程 B,确保同名 pinned fields 迁移,且新 type 不包含的字段被清空
|
|
97
|
-
|
|
98
|
-
## Issue 更新
|
|
99
|
-
|
|
100
|
-
更新标题、label、assignee 或 milestone 时使用:
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
gh issue edit {issue-number} -R "$upstream_repo" {edit-args}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
常见参数:
|
|
107
|
-
- `--title "{title}"`
|
|
108
|
-
- `--add-label "{label}"`(仅当 `has_triage=true`)
|
|
109
|
-
- `--remove-label "{label}"`(仅当 `has_triage=true`)
|
|
110
|
-
- `--add-assignee @me`
|
|
111
|
-
- `--milestone "{milestone}"`(仅当 `has_triage=true`)
|
|
112
|
-
|
|
113
|
-
Assignee 同步不做权限预判;如果命令失败,按调用方约定静默跳过。
|
|
114
|
-
|
|
115
|
-
关闭 Issue:
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
gh issue close {issue-number} -R "$upstream_repo" --reason "{reason}"
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## Issue 评论读取
|
|
122
|
-
|
|
123
|
-
读取 Issue 评论或按隐藏标记查找已有评论:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
gh api "repos/$upstream_repo/issues/{issue-number}/comments" --paginate
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## 历史任务评论扫描
|
|
130
|
-
|
|
131
|
-
`find-existing-task.js` 仅消费 stdin,不直接调用 `gh`。由 AI 按宿主 OS 选择下面的 pipeline 命令。
|
|
132
|
-
|
|
133
|
-
POSIX(bash / zsh):
|
|
134
|
-
|
|
135
|
-
```bash
|
|
136
|
-
set -o pipefail
|
|
137
|
-
gh api "repos/$upstream_repo/issues/{issue-number}/comments" \
|
|
138
|
-
--paginate --jq '.[] | @json' \
|
|
139
|
-
| node .agents/scripts/find-existing-task.js
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Windows(PowerShell 7+ / pwsh):
|
|
143
|
-
|
|
144
|
-
```powershell
|
|
145
|
-
$ErrorActionPreference = 'Stop'
|
|
146
|
-
gh api "repos/$upstream_repo/issues/{issue-number}/comments" `
|
|
147
|
-
--paginate --jq '.[] | @json' |
|
|
148
|
-
node .agents/scripts/find-existing-task.js
|
|
149
|
-
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
在 PowerShell 5.1 上需先显式启用 UTF-8 stdio,否则 pipe 可能损坏多字节字符:
|
|
153
|
-
|
|
154
|
-
```powershell
|
|
155
|
-
[Console]::OutputEncoding = $OutputEncoding = [System.Text.UTF8Encoding]::new()
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
## PR 模板与元数据辅助命令
|
|
159
|
-
|
|
160
|
-
存在仓库 PR 模板时读取:
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
cat .github/PULL_REQUEST_TEMPLATE.md
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
参考最近合并的 PR 风格:
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
gh pr list --limit 3 --state merged --json number,title,body
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
PR 元数据同步前验证标准 type labels 是否存在:
|
|
5
|
+
## 定位
|
|
173
6
|
|
|
174
7
|
```bash
|
|
175
|
-
|
|
8
|
+
agent-infra-internal platform-pr inspect {task-id}
|
|
176
9
|
```
|
|
177
10
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
## PR 读取与创建
|
|
11
|
+
返回已绑定 PR 的规范身份;未绑定时返回 `PR_NOT_LINKED`。调用方不得按标题模糊匹配。
|
|
181
12
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
```bash
|
|
185
|
-
gh pr view {pr-number} --json number,title,body,labels,state,milestone,url,files
|
|
186
|
-
```
|
|
13
|
+
## 创建或恢复
|
|
187
14
|
|
|
188
|
-
|
|
15
|
+
调用方把标题和正文分别写入临时文件,然后执行:
|
|
189
16
|
|
|
190
17
|
```bash
|
|
191
|
-
|
|
18
|
+
agent-infra-internal platform-pr create {task-id} \
|
|
19
|
+
--agent {agent} --base {target-branch} --head {current-branch} \
|
|
20
|
+
--title-file {title-file} --body-file {body-file}
|
|
192
21
|
```
|
|
193
22
|
|
|
194
|
-
|
|
23
|
+
core 会先按 upstream、head 和 base 精确定位;唯一既有 PR 会复用并绑定,零个才创建,多个稳定失败。远端结果未知时重新精确定位,不盲重建。`--dry-run` 只返回计划。
|
|
195
24
|
|
|
196
|
-
|
|
197
|
-
gh pr list --head "{branch}" --state open --json number,url --jq '.[0].url // empty'
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
创建 PR:
|
|
25
|
+
## 显式绑定
|
|
201
26
|
|
|
202
27
|
```bash
|
|
203
|
-
|
|
204
|
-
{label-args} {milestone-arg} \
|
|
205
|
-
--body "$(cat <<'EOF'
|
|
206
|
-
{pr-body}
|
|
207
|
-
EOF
|
|
208
|
-
)"
|
|
28
|
+
agent-infra-internal platform-pr bind {task-id} --pr {pr-number} --agent {agent}
|
|
209
29
|
```
|
|
210
30
|
|
|
211
|
-
|
|
212
|
-
- 仅当 `has_triage=true` 时传入 `{label-args}`;否则整体省略并继续
|
|
213
|
-
- 没有有效 label 时省略全部 `--label`
|
|
214
|
-
- `{milestone-arg}` 展开为 `--milestone "{milestone}"`
|
|
215
|
-
- 仅当 `has_triage=true` 时传入 `{milestone-arg}`;否则整体省略并继续
|
|
216
|
-
- `{milestone-arg}` 为空时整体省略
|
|
217
|
-
|
|
218
|
-
## PR 更新
|
|
31
|
+
冲突绑定稳定失败且不修改 `task.md`。
|
|
219
32
|
|
|
220
|
-
|
|
33
|
+
## 元数据同步
|
|
221
34
|
|
|
222
35
|
```bash
|
|
223
|
-
|
|
36
|
+
agent-infra-internal platform-pr sync {task-id} \
|
|
37
|
+
--agent {agent} --metadata --closing-issue
|
|
224
38
|
```
|
|
225
39
|
|
|
226
|
-
|
|
227
|
-
- `--title "{title}"`
|
|
228
|
-
- `--add-label "{label}"`
|
|
229
|
-
- `--remove-label "{label}"`
|
|
230
|
-
- `--milestone "{milestone}"`
|
|
40
|
+
core 从关联 Issue 复制 type / `in:` labels、assignee、具体 milestone,并确保 closing association。权限不足返回逐项 `skipped` 和顶层 `degraded`;不得反向修改 Issue。
|
|
231
41
|
|
|
232
|
-
##
|
|
42
|
+
## 状态语义
|
|
233
43
|
|
|
234
|
-
-
|
|
235
|
-
-
|
|
236
|
-
-
|
|
237
|
-
-
|
|
44
|
+
- `planned|applied|no-op|degraded`:退出码 0。
|
|
45
|
+
- `failed`:退出码 1,确定性输入或远端错误。
|
|
46
|
+
- `blocked`:退出码 2,网络、认证或结果未知,需要人工介入或安全重跑。
|
|
47
|
+
- 创建后摘要或元数据同步失败不得回滚 PR;调用方按所属 SKILL 记录 warning。
|
|
@@ -1,5 +1,47 @@
|
|
|
1
|
-
#
|
|
1
|
+
# PR 平台意图命令
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
PR 资源的定位、创建、绑定和元数据同步统一通过 typed internal intent;SKILL 只负责决定分支、标题、正文和调用时机,不直接拼装平台命令。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 定位
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
agent-infra-internal platform-pr inspect {task-id}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
返回已绑定 PR 的规范身份;未绑定时返回 `PR_NOT_LINKED`。调用方不得按标题模糊匹配。
|
|
12
|
+
|
|
13
|
+
## 创建或恢复
|
|
14
|
+
|
|
15
|
+
调用方把标题和正文分别写入临时文件,然后执行:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
agent-infra-internal platform-pr create {task-id} \
|
|
19
|
+
--agent {agent} --base {target-branch} --head {current-branch} \
|
|
20
|
+
--title-file {title-file} --body-file {body-file}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
core 会先按 upstream、head 和 base 精确定位;唯一既有 PR 会复用并绑定,零个才创建,多个稳定失败。远端结果未知时重新精确定位,不盲重建。`--dry-run` 只返回计划。
|
|
24
|
+
|
|
25
|
+
## 显式绑定
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
agent-infra-internal platform-pr bind {task-id} --pr {pr-number} --agent {agent}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
冲突绑定稳定失败且不修改 `task.md`。
|
|
32
|
+
|
|
33
|
+
## 元数据同步
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
agent-infra-internal platform-pr sync {task-id} \
|
|
37
|
+
--agent {agent} --metadata --closing-issue
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
core 从关联 Issue 复制 type / `in:` labels、assignee、具体 milestone,并确保 closing association。权限不足返回逐项 `skipped` 和顶层 `degraded`;不得反向修改 Issue。
|
|
41
|
+
|
|
42
|
+
## 状态语义
|
|
43
|
+
|
|
44
|
+
- `planned|applied|no-op|degraded`:退出码 0。
|
|
45
|
+
- `failed`:退出码 1,确定性输入或远端错误。
|
|
46
|
+
- `blocked`:退出码 2,网络、认证或结果未知,需要人工介入或安全重跑。
|
|
47
|
+
- 创建后摘要或元数据同步失败不得回滚 PR;调用方按所属 SKILL 记录 warning。
|
|
@@ -14,6 +14,6 @@ These hidden markers are the canonical registry for Issue synchronization:
|
|
|
14
14
|
|
|
15
15
|
Callers should refer to the marker key in skill prose and keep concrete marker strings in this rule or the platform adapter defaults.
|
|
16
16
|
|
|
17
|
-
This code platform does not provide
|
|
17
|
+
This code platform does not provide an Issue adapter. `platform-issue` returns structured no-op/degraded operations.
|
|
18
18
|
|
|
19
19
|
Issue metadata, labels, milestones, assignees, and comments are skipped for custom platforms unless you provide matching `.{platform}.en.md` rule templates and platform adapters. Continue writing local task artifacts normally.
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
# Issue Sync
|
|
1
|
+
# Issue Sync
|
|
2
2
|
|
|
3
3
|
## Marker Registry
|
|
4
4
|
|
|
5
|
-
These hidden markers are the canonical registry for Issue synchronization:
|
|
6
|
-
|
|
7
5
|
| Key | Marker |
|
|
8
6
|
|---|---|
|
|
9
7
|
| `task` | `<!-- sync-issue:{task-id}:task -->` |
|
|
@@ -12,312 +10,27 @@ These hidden markers are the canonical registry for Issue synchronization:
|
|
|
12
10
|
| `summary` | `<!-- sync-issue:{task-id}:summary -->` |
|
|
13
11
|
| `cancel` | `<!-- sync-issue:{task-id}:cancel -->` |
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Read this file before a task skill updates a GitHub Issue.
|
|
18
|
-
|
|
19
|
-
## Upstream Repository Detection
|
|
20
|
-
|
|
21
|
-
When an external contributor runs `gh` inside a fork, the default target is the fork instead of the upstream repository. Detect the upstream repository first and reuse `upstream_repo` for every later `gh issue` and `gh api "repos/..."` operation.
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
upstream_repo=$(gh api "repos/$(gh repo view --json nameWithOwner -q .nameWithOwner)" \
|
|
25
|
-
--jq 'if .fork then .parent.full_name else .full_name end' 2>/dev/null)
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
- non-fork repository: returns the current repository `full_name`
|
|
29
|
-
- fork repository: returns the parent repository `full_name`
|
|
30
|
-
- every later `gh issue` command must use `-R "$upstream_repo"`
|
|
31
|
-
- every later `gh api "repos/..."` command must use `"repos/$upstream_repo/..."`
|
|
32
|
-
|
|
33
|
-
## Permission Detection
|
|
34
|
-
|
|
35
|
-
Run one permission check against the upstream repository before any write operation. When detection fails, treat it as no permission so the workflow degrades safely.
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
repo_perms=$(gh api "repos/$upstream_repo" --jq '.permissions' 2>/dev/null || echo '{}')
|
|
39
|
-
has_triage=$(printf '%s' "$repo_perms" | grep -q '"triage":true' 2>/dev/null && echo true || echo false)
|
|
40
|
-
has_push=$(printf '%s' "$repo_perms" | grep -q '"push":true' 2>/dev/null && echo true || echo false)
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Operation-to-permission mapping:
|
|
44
|
-
|
|
45
|
-
| Operation | Required permission | Notes |
|
|
46
|
-
|------|---------|------|
|
|
47
|
-
| add/remove labels | `has_triage` | triage is the minimum permission |
|
|
48
|
-
| add/remove milestones | `has_triage` | same as above |
|
|
49
|
-
| edit Issue body | `has_triage` | used by requirement checkbox sync |
|
|
50
|
-
| set Issue Type | `has_push` | requires write permission |
|
|
51
|
-
| set Issue fields | `has_push` | pinned custom fields; failures are non-blocking |
|
|
52
|
-
| set assignee | no check | skip directly when it fails |
|
|
53
|
-
| publish/update comments | no check | allowed for authenticated users in public repositories |
|
|
54
|
-
|
|
55
|
-
## Degradation Rules
|
|
56
|
-
|
|
57
|
-
| Level | Operation type | With permission | Without permission |
|
|
58
|
-
|------|---------|--------|--------|
|
|
59
|
-
| silent degradation | label / milestone / Issue Type / Issue fields | run the `gh` command directly and also update the task comment | skip direct `gh` writes, update only the task comment, let the bot backfill |
|
|
60
|
-
| direct skip | assignee | run the `gh` command directly | do nothing else |
|
|
61
|
-
| normal execution | comments | run normally | run normally |
|
|
62
|
-
|
|
63
|
-
Key rules:
|
|
64
|
-
|
|
65
|
-
- task comment sync must continue whether write permission exists or not
|
|
66
|
-
- insufficient permission only affects direct Issue metadata writes and must not stop the skill
|
|
67
|
-
- keep the existing `2>/dev/null || true` error-tolerance pattern
|
|
68
|
-
|
|
69
|
-
When the caller has a `{task-id}` / task directory, permission degradation or critical sync failure must be recorded in `## Workflow Warnings`:
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
node .agents/scripts/workflow-warnings.js add .agents/workspace/active/{task-id} \
|
|
73
|
-
--step issue-sync --severity IMPORTANT --code PERMISSION_DEGRADED \
|
|
74
|
-
--target "{operation}" --message "{reason}" \
|
|
75
|
-
--action "Wait for the bot/maintainer to backfill, or rerun the workflow step after permissions are available"
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Comment create/update failures and exhausted network retries that affect reviewer visibility use `severity=ACTION_REQUIRED` with `code=COMMENT_SYNC_FAILED` or `NETWORK_RETRY_EXHAUSTED`.
|
|
79
|
-
|
|
80
|
-
## External Contributor Locking
|
|
81
|
-
|
|
82
|
-
Maintainers (`has_triage=true`) are never blocked. External contributors (`has_triage=false`) must check whether the current task already has a `task` comment author on the Issue before they start.
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
task_comment_author=$(gh api "repos/$upstream_repo/issues/{issue-number}/comments" \
|
|
86
|
-
--paginate --jq '[.[] | select(.body | test("<!-- sync-issue:{task-id}:task -->")) | .user.login] | first' \
|
|
87
|
-
2>/dev/null || echo "")
|
|
88
|
-
current_user=$(gh api user --jq '.login' 2>/dev/null || echo "")
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Decision rules:
|
|
92
|
-
|
|
93
|
-
- no `task` comment exists: allow execution
|
|
94
|
-
- the `task` comment author is the current user: allow continuation
|
|
95
|
-
- the `task` comment author is another user: stop immediately and ask the contributor to coordinate with a maintainer before taking over
|
|
96
|
-
|
|
97
|
-
## Direct `status:` Label Updates
|
|
98
|
-
|
|
99
|
-
Algorithm note: keep the flow below aligned with `.github/scripts/sync-labels-to-set.sh` (set-diff sync). This is the AI agent-side equivalent implementation for the `target_set = {"{target-status-label}"}` case. If either side changes, update the other one in the same patch to avoid drift between the agent and the bot.
|
|
100
|
-
|
|
101
|
-
If task.md contains a valid `issue_number` (not empty and not `N/A`) and the Issue state is `OPEN`, sync the `status:` labels to the target value with an idempotent set diff:
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
state=$(gh issue view {issue-number} -R "$upstream_repo" --json state --jq '.state' 2>/dev/null)
|
|
105
|
-
if [ "$state" = "OPEN" ]; then
|
|
106
|
-
current_status_labels=$(gh issue view {issue-number} -R "$upstream_repo" \
|
|
107
|
-
--json labels --jq '.labels[].name | select(startswith("status:"))' 2>/dev/null || true)
|
|
108
|
-
printf '%s\n' "$current_status_labels" | while IFS= read -r label; do
|
|
109
|
-
[ -z "$label" ] && continue
|
|
110
|
-
if [ "$label" != "{target-status-label}" ] && [ "$has_triage" = "true" ]; then
|
|
111
|
-
gh issue edit {issue-number} -R "$upstream_repo" --remove-label "$label" 2>/dev/null || true
|
|
112
|
-
fi
|
|
113
|
-
done
|
|
114
|
-
if [ "$has_triage" = "true" ] && ! printf '%s\n' "$current_status_labels" | grep -qxF "{target-status-label}"; then
|
|
115
|
-
gh issue edit {issue-number} -R "$upstream_repo" --add-label "{target-status-label}" 2>/dev/null || true
|
|
116
|
-
fi
|
|
117
|
-
fi
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Use `while IFS= read -r label` so labels like `status: in-progress` are handled line-by-line instead of being split on spaces.
|
|
121
|
-
|
|
122
|
-
If `has_triage=false`, skip direct label changes, update only the task comment, and let the bot backfill from the latest task metadata.
|
|
123
|
-
|
|
124
|
-
If `gh` fails, skip and continue. Do not fail the skill.
|
|
125
|
-
|
|
126
|
-
## Assignee Sync
|
|
127
|
-
|
|
128
|
-
When a skill creates or imports an Issue, automatically add the current executor as assignee:
|
|
129
|
-
|
|
130
|
-
- When the `create-task` platform rule triggers Issue creation: use `--assignee @me` in `gh issue create` and include `-R "$upstream_repo"`
|
|
131
|
-
- `import-issue`: run `gh issue edit {issue-number} -R "$upstream_repo" --add-assignee @me 2>/dev/null || true` after import
|
|
132
|
-
|
|
133
|
-
`@me` is resolved by `gh` CLI to the authenticated user. The operation is idempotent. If the command fails, skip it directly and do not provide a fallback path.
|
|
134
|
-
|
|
135
|
-
## `in:` Label Sync
|
|
136
|
-
|
|
137
|
-
> **Trigger timing**: run `in:` label sync only after code is committed (the `commit` skill). Do not run it during `code-task`. During `create-pr`, only copy the labels from the Issue to the PR without recomputing them.
|
|
138
|
-
|
|
139
|
-
Read the `labels.in` mapping from `.agents/.airc.json`.
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
git diff {base-branch}...HEAD --name-only
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
`{base-branch}` is usually `main`; in PR context, use the PR base branch.
|
|
146
|
-
|
|
147
|
-
### When a mapping exists (precise add/remove)
|
|
148
|
-
|
|
149
|
-
1. Collect the full set of changed files in the branch
|
|
150
|
-
2. Match each file against the directory prefixes in `labels.in` to compute the expected `in:` label set
|
|
151
|
-
3. Query the current `in:` labels on the Issue or PR
|
|
152
|
-
4. Apply the diff:
|
|
153
|
-
- expected but missing: only when `has_triage=true`, run `gh issue edit {issue-number} -R "$upstream_repo" --add-label "in: {module}" 2>/dev/null || true`
|
|
154
|
-
- present but no longer expected: only when `has_triage=true`, run `gh issue edit {issue-number} -R "$upstream_repo" --remove-label "in: {module}" 2>/dev/null || true`
|
|
155
|
-
|
|
156
|
-
### When no mapping exists (add-only fallback)
|
|
157
|
-
|
|
158
|
-
If `.airc.json` has no `labels.in` field or it is empty:
|
|
159
|
-
|
|
160
|
-
1. query existing repository `in:` labels
|
|
161
|
-
2. derive the top-level directory from each changed file
|
|
162
|
-
3. only when `has_triage=true`, add matching labels and never remove existing `in:` labels
|
|
163
|
-
|
|
164
|
-
If `has_triage=false`, skip direct `in:` label edits and keep task comment sync as the source for later automation backfill.
|
|
165
|
-
|
|
166
|
-
## Artifact Comment Publishing
|
|
167
|
-
|
|
168
|
-
The hidden marker must remain compatible:
|
|
169
|
-
|
|
170
|
-
```html
|
|
171
|
-
<!-- sync-issue:{task-id}:{file-stem} -->
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
Check for an existing comment before publishing:
|
|
13
|
+
Comments use `platform-comment`; Issue resources use `platform-issue`:
|
|
175
14
|
|
|
176
15
|
```bash
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
Skip publishing when the marker already exists.
|
|
183
|
-
|
|
184
|
-
Publishing flow:
|
|
185
|
-
|
|
186
|
-
1. Read the local artifact file in full first
|
|
187
|
-
2. Inline the full file contents as `{artifact body}`
|
|
188
|
-
3. Do not summarize, rewrite, or truncate the artifact body
|
|
189
|
-
|
|
190
|
-
Use this format:
|
|
191
|
-
|
|
192
|
-
```markdown
|
|
193
|
-
<!-- sync-issue:{task-id}:{file-stem} -->
|
|
194
|
-
## {artifact-title}
|
|
195
|
-
|
|
196
|
-
> **{agent}** · {task-id}
|
|
197
|
-
|
|
198
|
-
{artifact body}
|
|
199
|
-
|
|
200
|
-
---
|
|
201
|
-
*Generated by {agent} · Internal tracking: {task-id}*
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
`{agent}` is the name of the AI agent currently executing the skill (for example `claude`, `codex`, or `gemini`).
|
|
205
|
-
|
|
206
|
-
`summary` comments need extra handling:
|
|
207
|
-
|
|
208
|
-
- find an existing `<!-- sync-issue:{task-id}:summary -->` comment ID first
|
|
209
|
-
- create the comment when none exists
|
|
210
|
-
- patch the existing comment in place when the body changed by using `gh api "repos/$upstream_repo/issues/comments/{comment-id}" -X PATCH -f body=...`
|
|
211
|
-
|
|
212
|
-
```bash
|
|
213
|
-
summary_comment_id=$(gh api "repos/$upstream_repo/issues/{issue-number}/comments" \
|
|
214
|
-
--paginate --jq '.[] | select(.body | startswith("<!-- sync-issue:{task-id}:summary -->")) | .id' \
|
|
215
|
-
| head -n 1)
|
|
216
|
-
gh api "repos/$upstream_repo/issues/comments/{comment-id}" -X PATCH -f body="$(cat <<'EOF'
|
|
217
|
-
{comment-body}
|
|
218
|
-
EOF
|
|
219
|
-
)"
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
Comment publishing is not gated by `has_triage` or `has_push`.
|
|
223
|
-
|
|
224
|
-
If comment lookup, creation, or update fails and the caller has a task directory, record a Workflow Warning (`step=issue-sync`, `severity=ACTION_REQUIRED`, `code=COMMENT_SYNC_FAILED`, `target={file-stem}`) and surface it in the final Workflow Warnings output block.
|
|
225
|
-
|
|
226
|
-
## task.md Comment Sync
|
|
227
|
-
|
|
228
|
-
Hidden marker:
|
|
229
|
-
|
|
230
|
-
```html
|
|
231
|
-
<!-- sync-issue:{task-id}:task -->
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
Use an idempotent update path for `task.md`:
|
|
235
|
-
|
|
236
|
-
1. Read the full `task.md`
|
|
237
|
-
2. Wrap the YAML frontmatter (content between the `---` delimiters) inside a `<details><summary>Metadata (frontmatter)</summary>` block with a `yaml` code fence, then render the remaining body as normal Markdown
|
|
238
|
-
3. Use `task` as `{file-stem}`
|
|
239
|
-
4. Find an existing comment ID for the marker
|
|
240
|
-
5. Create the comment when none exists
|
|
241
|
-
6. PATCH the comment in place when the body changed
|
|
242
|
-
7. Skip when the body is unchanged
|
|
243
|
-
|
|
244
|
-
task.md comment format:
|
|
245
|
-
|
|
246
|
-
```markdown
|
|
247
|
-
<!-- sync-issue:{task-id}:task -->
|
|
248
|
-
## Task File
|
|
249
|
-
|
|
250
|
-
> **{agent}** · {task-id}
|
|
251
|
-
|
|
252
|
-
<details><summary>Metadata (frontmatter)</summary>
|
|
253
|
-
|
|
254
|
-
```yaml
|
|
255
|
-
---
|
|
256
|
-
{frontmatter fields}
|
|
257
|
-
---
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
</details>
|
|
261
|
-
|
|
262
|
-
{task.md body after frontmatter}
|
|
263
|
-
|
|
264
|
-
---
|
|
265
|
-
*Generated by {agent} · Internal tracking: {task-id}*
|
|
16
|
+
agent-infra-internal platform-issue inspect {task-id}
|
|
17
|
+
agent-infra-internal platform-issue create {task-id} --agent {agent}
|
|
18
|
+
agent-infra-internal platform-issue bind {task-id} --issue {number} --agent {agent}
|
|
19
|
+
agent-infra-internal platform-issue sync {task-id} --agent {agent} {desired-state-flags}
|
|
266
20
|
```
|
|
267
21
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
Title mapping:
|
|
22
|
+
The core owns status/in labels, assignees, milestones, Issue Type, pinned fields, requirements, state, capabilities, dry-run, retries, errors, and idempotency. Omitted flags preserve values; `none` explicitly clears them. Status labels converge to at most one, and ambiguous requirement identity fails closed.
|
|
271
23
|
|
|
272
|
-
- `
|
|
24
|
+
`planned|applied|no-op|degraded` exit 0; `failed` exits 1; `blocked` exits 2.
|
|
273
25
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
## Backfill Rules (run before `/complete-task` archives)
|
|
277
|
-
|
|
278
|
-
- Scan `task.md`, `analysis*.md`, `review-analysis*.md`, `plan*.md`, `review-plan*.md`, `code*.md`, and `review-code*.md` in the task directory
|
|
279
|
-
- Check whether each `{file-stem}` was already published by its hidden marker; publish only missing artifacts
|
|
280
|
-
- Backfill only appends missing comments and never deletes or reorders existing comments
|
|
281
|
-
- Resolve `{agent}` for backfilled comments in this order:
|
|
282
|
-
1. match the artifact filename in Activity Log (for example `→ analysis.md`) and extract the executor from `by {agent}`
|
|
283
|
-
2. if no match is found, fall back to `assigned_to` in task.md frontmatter
|
|
284
|
-
3. if `assigned_to` is also unavailable, use the current backfilling agent
|
|
285
|
-
- Derive the previous and next neighbors from Activity Log order and add this note below the title:
|
|
286
|
-
|
|
287
|
-
```markdown
|
|
288
|
-
> ⚠️ This comment was backfilled. In the timeline it belongs after "{previous-artifact-title}" and before "{next-artifact-title}".
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
- If only one neighbor exists, keep only that side of the note; if neither exists, omit the note
|
|
292
|
-
|
|
293
|
-
Title mapping:
|
|
294
|
-
|
|
295
|
-
- `task` -> `Task File`
|
|
296
|
-
- `analysis` / `analysis-r{N}` -> `Requirements Analysis` / `Requirements Analysis (Round {N})`
|
|
297
|
-
- `review-analysis` / `review-analysis-r{N}` -> `Requirements Analysis Review (Round 1)` / `Requirements Analysis Review (Round {N})`
|
|
298
|
-
- `plan` / `plan-r{N}` -> `Technical Plan` / `Technical Plan (Round {N})`
|
|
299
|
-
- `review-plan` / `review-plan-r{N}` -> `Technical Plan Review (Round 1)` / `Technical Plan Review (Round {N})`
|
|
300
|
-
- `code` / `code-r{N}` -> `Code Report (Round 1)` / `Code Report (Round {N})`
|
|
301
|
-
- `review-code` / `review-code-r{N}` -> `Code Review (Round 1)` / `Code Review (Round {N})`
|
|
302
|
-
- `summary` -> `Delivery Summary`
|
|
303
|
-
|
|
304
|
-
Backfilled comments are also not gated by `has_triage` or `has_push`.
|
|
305
|
-
|
|
306
|
-
## Requirement Checkbox Sync
|
|
307
|
-
|
|
308
|
-
Extract checked `- [x]` items from the `## Requirements` section in task.md. Skip when none exist.
|
|
309
|
-
|
|
310
|
-
Read the current Issue body:
|
|
26
|
+
Map material degraded/failed/blocked results to workflow warnings through the structured intent; callers must not edit warning rows directly:
|
|
311
27
|
|
|
312
28
|
```bash
|
|
313
|
-
|
|
29
|
+
agent-infra-internal task-warning {task-id} add \
|
|
30
|
+
--step issue-sync --severity {severity} --code {code} \
|
|
31
|
+
--target {target} --message {message} --action {action}
|
|
314
32
|
```
|
|
315
33
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
If `has_triage=false`, skip the body PATCH, update only the task comment, and let the bot backfill from the latest task state.
|
|
319
|
-
|
|
320
|
-
## Shell Safety Rules
|
|
34
|
+
## Backfill
|
|
321
35
|
|
|
322
|
-
|
|
323
|
-
2. Do not use `echo` to build content containing `<!-- -->`. Use `cat <<'EOF'` or `printf '%s\n'` instead.
|
|
36
|
+
During completion, artifact comments are replayed with `--kind artifact --artifact <file> --backfill`. If the remote Issue has no matching marker, the core creates a comment with a historical-backfill notice. If a valid base or chunk marker set already exists, the core returns `no-op` and preserves the existing bodies and chunks. Marker conflicts still fail without writes.
|