@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.
Files changed (425) hide show
  1. package/bin/cli.ts +2 -2
  2. package/dist/bin/cli.js +2 -2
  3. package/dist/bin/internal-cli.js +98 -0
  4. package/dist/lib/decide.js +81 -90
  5. package/dist/lib/defaults.json +1 -0
  6. package/dist/lib/git/review-snapshot.js +79 -0
  7. package/dist/lib/git/workflow.js +101 -0
  8. package/dist/lib/internal/git-workflow.js +42 -0
  9. package/dist/lib/internal/platform-checks.js +119 -0
  10. package/dist/lib/internal/platform-comment.js +129 -0
  11. package/dist/lib/internal/platform-context.js +46 -0
  12. package/dist/lib/internal/platform-issue.js +142 -0
  13. package/dist/lib/internal/platform-pr.js +146 -0
  14. package/dist/lib/internal/release-workflow.js +217 -0
  15. package/dist/lib/internal/task-artifact.js +67 -0
  16. package/dist/lib/internal/task-context.js +43 -0
  17. package/dist/lib/internal/task-event.js +70 -0
  18. package/dist/lib/internal/task-ledger.js +114 -0
  19. package/dist/lib/internal/task-lifecycle.js +58 -0
  20. package/dist/lib/internal/task-short-id.js +83 -0
  21. package/dist/lib/internal/task-snapshot.js +47 -0
  22. package/dist/lib/internal/task-verify.js +50 -0
  23. package/dist/lib/internal/task-warning.js +74 -0
  24. package/dist/lib/platform/adapters.js +14 -0
  25. package/dist/lib/platform/context.js +146 -0
  26. package/dist/lib/platform/github-client.js +124 -0
  27. package/dist/lib/platform/issue-comments.js +409 -0
  28. package/dist/lib/platform/issue-metadata.js +183 -0
  29. package/dist/lib/platform/issues.js +617 -0
  30. package/dist/lib/platform/metadata-labels.js +28 -0
  31. package/dist/lib/platform/pr-checks.js +216 -0
  32. package/dist/lib/platform/pr-summary.js +88 -0
  33. package/dist/lib/platform/pull-request-metadata.js +38 -0
  34. package/dist/lib/platform/pull-requests.js +338 -0
  35. package/dist/lib/platform/releases.js +82 -0
  36. package/dist/lib/platform/types.js +22 -0
  37. package/dist/lib/platform/verification-required.js +78 -0
  38. package/dist/lib/platform/verification-sync.js +1014 -0
  39. package/dist/lib/platform/verification.js +6 -0
  40. package/dist/lib/release/channels.js +31 -0
  41. package/dist/lib/release/workflow.js +32 -0
  42. package/dist/lib/render.js +3 -2
  43. package/dist/lib/run/index.js +24 -7
  44. package/dist/lib/sandbox/capture.js +25 -3
  45. package/dist/lib/sandbox/commands/create.js +36 -22
  46. package/dist/lib/sandbox/commands/enter.js +34 -11
  47. package/dist/lib/sandbox/commands/list-running.js +10 -8
  48. package/dist/lib/sandbox/commands/show.js +2 -2
  49. package/dist/lib/sandbox/commands/start.js +53 -15
  50. package/dist/lib/sandbox/index.js +6 -6
  51. package/dist/lib/sandbox/mounts.js +36 -0
  52. package/dist/lib/sandbox/recovery.js +562 -0
  53. package/dist/lib/sandbox/task-resolver.js +5 -1
  54. package/dist/lib/sandbox/tools.js +19 -0
  55. package/dist/lib/server/protocol.js +5 -5
  56. package/dist/lib/task/activity-log.js +61 -0
  57. package/dist/lib/task/artifact-lifecycle.js +427 -0
  58. package/dist/lib/task/command-options.js +30 -0
  59. package/dist/lib/task/commands/cat.js +36 -6
  60. package/dist/lib/task/commands/decisions.js +80 -46
  61. package/dist/lib/task/commands/files.js +21 -7
  62. package/dist/lib/task/commands/grep.js +55 -7
  63. package/dist/lib/task/commands/issue-body.js +23 -14
  64. package/dist/lib/task/commands/log.js +27 -70
  65. package/dist/lib/task/commands/show.js +20 -7
  66. package/dist/lib/task/commands/status.js +18 -8
  67. package/dist/lib/task/decision-intents.js +154 -0
  68. package/dist/lib/task/decision-items.js +53 -0
  69. package/dist/lib/task/events.js +318 -0
  70. package/dist/lib/task/frontmatter.js +159 -1
  71. package/dist/lib/task/implementation-inputs.js +117 -0
  72. package/dist/lib/task/index.js +12 -9
  73. package/dist/lib/task/issue-form.js +19 -6
  74. package/dist/lib/task/ledger-intents.js +185 -0
  75. package/dist/lib/task/ledger.js +65 -35
  76. package/dist/lib/task/lifecycle.js +484 -0
  77. package/dist/lib/task/resolve-ref.js +152 -32
  78. package/dist/lib/task/review-artifacts.js +101 -0
  79. package/dist/lib/task/review-fingerprint.js +46 -0
  80. package/dist/lib/task/sections.js +358 -4
  81. package/dist/lib/task/short-id.js +292 -7
  82. package/dist/lib/task/snapshot.js +95 -0
  83. package/dist/lib/task/verification-checks.js +8 -0
  84. package/dist/lib/task/verification-config.js +14 -0
  85. package/dist/lib/task/verification-engine.js +906 -0
  86. package/dist/lib/task/verification-review.js +3 -0
  87. package/dist/lib/task/verification-types.js +2 -0
  88. package/dist/lib/task/verification.js +113 -0
  89. package/dist/lib/task/workflow-warning-intents.js +131 -0
  90. package/dist/lib/task/workflow-warnings.js +10 -78
  91. package/dist/lib/task/write.js +241 -0
  92. package/lib/decide.ts +57 -97
  93. package/lib/defaults.json +1 -0
  94. package/lib/git/review-snapshot.ts +73 -0
  95. package/lib/git/workflow.ts +101 -0
  96. package/lib/internal/git-workflow.ts +37 -0
  97. package/lib/internal/platform-checks.ts +101 -0
  98. package/lib/internal/platform-comment.ts +99 -0
  99. package/lib/internal/platform-context.ts +33 -0
  100. package/lib/internal/platform-issue.ts +116 -0
  101. package/lib/internal/platform-pr.ts +119 -0
  102. package/lib/internal/release-workflow.ts +186 -0
  103. package/lib/internal/task-artifact.ts +47 -0
  104. package/lib/internal/task-context.ts +35 -0
  105. package/lib/internal/task-event.ts +51 -0
  106. package/lib/internal/task-ledger.ts +86 -0
  107. package/lib/internal/task-lifecycle.ts +41 -0
  108. package/lib/internal/task-short-id.ts +55 -0
  109. package/lib/internal/task-snapshot.ts +32 -0
  110. package/lib/internal/task-verify.ts +33 -0
  111. package/lib/internal/task-warning.ts +50 -0
  112. package/lib/platform/adapters.ts +30 -0
  113. package/lib/platform/context.ts +164 -0
  114. package/lib/platform/github-client.ts +146 -0
  115. package/lib/platform/issue-comments.ts +479 -0
  116. package/lib/platform/issue-metadata.ts +250 -0
  117. package/lib/platform/issues.ts +691 -0
  118. package/lib/platform/metadata-labels.ts +33 -0
  119. package/lib/platform/pr-checks.ts +246 -0
  120. package/lib/platform/pr-summary.ts +90 -0
  121. package/lib/platform/pull-request-metadata.ts +69 -0
  122. package/lib/platform/pull-requests.ts +380 -0
  123. package/lib/platform/releases.ts +71 -0
  124. package/lib/platform/types.ts +74 -0
  125. package/lib/platform/verification-required.ts +83 -0
  126. package/{runtime/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +198 -367
  127. package/lib/platform/verification.ts +11 -0
  128. package/lib/release/channels.ts +30 -0
  129. package/lib/release/workflow.ts +31 -0
  130. package/lib/render.ts +3 -2
  131. package/lib/run/index.ts +25 -7
  132. package/lib/sandbox/capture.ts +29 -3
  133. package/lib/sandbox/commands/create.ts +43 -25
  134. package/lib/sandbox/commands/enter.ts +38 -11
  135. package/lib/sandbox/commands/list-running.ts +10 -8
  136. package/lib/sandbox/commands/show.ts +2 -2
  137. package/lib/sandbox/commands/start.ts +50 -16
  138. package/lib/sandbox/index.ts +6 -6
  139. package/lib/sandbox/mounts.ts +55 -0
  140. package/lib/sandbox/recovery.ts +828 -0
  141. package/lib/sandbox/task-resolver.ts +5 -1
  142. package/lib/sandbox/tools.ts +31 -0
  143. package/lib/server/protocol.ts +5 -5
  144. package/lib/task/activity-log.ts +62 -0
  145. package/lib/task/artifact-lifecycle.ts +484 -0
  146. package/lib/task/command-options.ts +32 -0
  147. package/lib/task/commands/cat.ts +22 -9
  148. package/lib/task/commands/decisions.ts +49 -47
  149. package/lib/task/commands/files.ts +14 -6
  150. package/lib/task/commands/grep.ts +34 -7
  151. package/lib/task/commands/issue-body.ts +16 -16
  152. package/lib/task/commands/log.ts +17 -70
  153. package/lib/task/commands/show.ts +14 -6
  154. package/lib/task/commands/status.ts +17 -7
  155. package/lib/task/decision-intents.ts +163 -0
  156. package/lib/task/decision-items.ts +64 -0
  157. package/lib/task/events.ts +320 -0
  158. package/lib/task/frontmatter.ts +202 -2
  159. package/lib/task/implementation-inputs.ts +137 -0
  160. package/lib/task/index.ts +12 -9
  161. package/lib/task/issue-form.ts +20 -6
  162. package/lib/task/ledger-intents.ts +201 -0
  163. package/lib/task/ledger.ts +77 -31
  164. package/lib/task/lifecycle.ts +458 -0
  165. package/lib/task/resolve-ref.ts +197 -36
  166. package/{templates/.agents/scripts/lib/review-artifacts.js → lib/task/review-artifacts.ts} +11 -12
  167. package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts} +17 -12
  168. package/lib/task/sections.ts +486 -4
  169. package/lib/task/short-id.ts +403 -9
  170. package/lib/task/snapshot.ts +143 -0
  171. package/lib/task/verification-checks.ts +9 -0
  172. package/lib/task/verification-config.ts +20 -0
  173. package/{templates/.agents/scripts/validate-artifact.js → lib/task/verification-engine.ts} +199 -406
  174. package/lib/task/verification-review.ts +9 -0
  175. package/lib/task/verification-types.ts +29 -0
  176. package/lib/task/verification.ts +156 -0
  177. package/lib/task/workflow-warning-intents.ts +142 -0
  178. package/lib/task/workflow-warnings.ts +10 -78
  179. package/lib/task/write.ts +468 -0
  180. package/package.json +4 -2
  181. package/templates/.agents/README.en.md +4 -3
  182. package/templates/.agents/README.zh-CN.md +4 -3
  183. package/templates/.agents/rules/README.en.md +6 -5
  184. package/templates/.agents/rules/README.zh-CN.md +6 -5
  185. package/templates/.agents/rules/create-issue.en.md +1 -1
  186. package/templates/.agents/rules/create-issue.github.en.md +5 -184
  187. package/templates/.agents/rules/create-issue.github.zh-CN.md +12 -178
  188. package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
  189. package/templates/.agents/rules/human-decision-context.en.md +36 -0
  190. package/templates/.agents/rules/human-decision-context.zh-CN.md +36 -0
  191. package/templates/.agents/rules/issue-fields.github.en.md +4 -148
  192. package/templates/.agents/rules/issue-fields.github.zh-CN.md +9 -144
  193. package/templates/.agents/rules/issue-pr-commands.en.md +43 -3
  194. package/templates/.agents/rules/issue-pr-commands.github.en.md +15 -220
  195. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +23 -213
  196. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +45 -3
  197. package/templates/.agents/rules/issue-sync.en.md +1 -1
  198. package/templates/.agents/rules/issue-sync.github.en.md +14 -301
  199. package/templates/.agents/rules/issue-sync.github.zh-CN.md +36 -287
  200. package/templates/.agents/rules/issue-sync.zh-CN.md +1 -1
  201. package/templates/.agents/rules/milestone-inference.en.md +1 -1
  202. package/templates/.agents/rules/milestone-inference.github.en.md +7 -119
  203. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +8 -108
  204. package/templates/.agents/rules/milestone-inference.zh-CN.md +1 -1
  205. package/templates/.agents/rules/next-step-output.en.md +12 -11
  206. package/templates/.agents/rules/next-step-output.zh-CN.md +12 -11
  207. package/templates/.agents/rules/no-mid-flow-questions.en.md +3 -3
  208. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +3 -3
  209. package/templates/.agents/rules/pr-checks-commands.en.md +16 -3
  210. package/templates/.agents/rules/pr-checks-commands.github.en.md +10 -54
  211. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +19 -47
  212. package/templates/.agents/rules/pr-checks-commands.zh-CN.md +30 -3
  213. package/templates/.agents/rules/pr-sync.en.md +30 -3
  214. package/templates/.agents/rules/pr-sync.github.en.md +12 -115
  215. package/templates/.agents/rules/pr-sync.github.zh-CN.md +26 -104
  216. package/templates/.agents/rules/pr-sync.zh-CN.md +43 -3
  217. package/templates/.agents/rules/review-handshake.en.md +8 -5
  218. package/templates/.agents/rules/review-handshake.zh-CN.md +8 -5
  219. package/templates/.agents/rules/task-management.en.md +11 -2
  220. package/templates/.agents/rules/task-management.zh-CN.md +11 -3
  221. package/templates/.agents/rules/task-short-id.en.md +25 -29
  222. package/templates/.agents/rules/task-short-id.zh-CN.md +20 -23
  223. package/templates/.agents/scripts/lib/agent-infra-package.js +1 -9
  224. package/templates/.agents/scripts/task-short-id.js +71 -533
  225. package/templates/.agents/skills/analyze-task/SKILL.en.md +22 -55
  226. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +26 -59
  227. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -3
  228. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -3
  229. package/templates/.agents/skills/block-task/SKILL.en.md +21 -47
  230. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +23 -47
  231. package/templates/.agents/skills/block-task/config/verify.json +1 -2
  232. package/templates/.agents/skills/cancel-task/SKILL.en.md +16 -45
  233. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +16 -45
  234. package/templates/.agents/skills/cancel-task/config/verify.json +1 -2
  235. package/templates/.agents/skills/check-task/SKILL.en.md +6 -3
  236. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +6 -3
  237. package/templates/.agents/skills/close-codescan/SKILL.en.md +6 -24
  238. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +6 -24
  239. package/templates/.agents/skills/close-dependabot/SKILL.en.md +6 -24
  240. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +6 -24
  241. package/templates/.agents/skills/code-task/SKILL.en.md +22 -35
  242. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +28 -44
  243. package/templates/.agents/skills/code-task/config/verify.en.json +3 -3
  244. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +3 -3
  245. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +13 -9
  246. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +13 -9
  247. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +1 -1
  248. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +1 -1
  249. package/templates/.agents/skills/code-task/reference/report-template.en.md +11 -1
  250. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +11 -1
  251. package/templates/.agents/skills/commit/SKILL.en.md +13 -11
  252. package/templates/.agents/skills/commit/SKILL.zh-CN.md +13 -11
  253. package/templates/.agents/skills/commit/config/verify.json +1 -2
  254. package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -11
  255. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -11
  256. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +4 -8
  257. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +4 -8
  258. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +6 -18
  259. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +5 -17
  260. package/templates/.agents/skills/commit/reference/task-status-update.en.md +13 -0
  261. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +13 -0
  262. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +13 -36
  263. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +13 -36
  264. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -3
  265. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -3
  266. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +10 -54
  267. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +10 -79
  268. package/templates/.agents/skills/complete-task/SKILL.en.md +59 -63
  269. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +59 -63
  270. package/templates/.agents/skills/complete-task/config/verify.en.json +11 -7
  271. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +11 -7
  272. package/templates/.agents/skills/create-pr/SKILL.en.md +19 -44
  273. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +19 -43
  274. package/templates/.agents/skills/create-pr/config/verify.json +1 -2
  275. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +8 -12
  276. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +7 -11
  277. package/templates/.agents/skills/create-task/SKILL.en.md +12 -13
  278. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +12 -13
  279. package/templates/.agents/skills/create-task/config/verify.json +1 -2
  280. package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
  281. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
  282. package/templates/.agents/skills/import-codescan/config/verify.json +1 -2
  283. package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
  284. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
  285. package/templates/.agents/skills/import-dependabot/config/verify.json +1 -2
  286. package/templates/.agents/skills/import-issue/SKILL.en.md +9 -13
  287. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -14
  288. package/templates/.agents/skills/import-issue/config/verify.json +1 -2
  289. package/templates/.agents/skills/plan-task/SKILL.en.md +17 -42
  290. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +22 -49
  291. package/templates/.agents/skills/plan-task/config/verify.en.json +1 -3
  292. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -3
  293. package/templates/.agents/skills/post-release/SKILL.en.md +11 -81
  294. package/templates/.agents/skills/post-release/SKILL.zh-CN.md +8 -78
  295. package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
  296. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
  297. package/templates/.agents/skills/release/SKILL.en.md +16 -163
  298. package/templates/.agents/skills/release/SKILL.zh-CN.md +15 -162
  299. package/templates/.agents/skills/restore-task/SKILL.en.md +11 -29
  300. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +11 -29
  301. package/templates/.agents/skills/restore-task/config/verify.json +1 -2
  302. package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -25
  303. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +13 -33
  304. package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -4
  305. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -4
  306. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +9 -12
  307. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +9 -12
  308. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +9 -2
  309. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +9 -2
  310. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +7 -0
  311. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +7 -0
  312. package/templates/.agents/skills/review-code/SKILL.en.md +22 -36
  313. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +23 -41
  314. package/templates/.agents/skills/review-code/config/verify.en.json +3 -4
  315. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +3 -4
  316. package/templates/.agents/skills/review-code/reference/output-templates.en.md +56 -18
  317. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +56 -18
  318. package/templates/.agents/skills/review-code/reference/report-template.en.md +11 -4
  319. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +11 -4
  320. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +7 -0
  321. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +7 -0
  322. package/templates/.agents/skills/review-plan/SKILL.en.md +13 -25
  323. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +13 -33
  324. package/templates/.agents/skills/review-plan/config/verify.en.json +3 -4
  325. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -4
  326. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +9 -12
  327. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +9 -12
  328. package/templates/.agents/skills/review-plan/reference/report-template.en.md +9 -2
  329. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +9 -2
  330. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +7 -0
  331. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +7 -0
  332. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +1 -2
  333. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +1 -2
  334. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -15
  335. package/templates/.agents/skills/watch-pr/SKILL.en.md +24 -14
  336. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +25 -15
  337. package/templates/.agents/skills/watch-pr/config/verify.json +1 -2
  338. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +2 -2
  339. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +2 -2
  340. package/templates/.agents/templates/task.en.md +6 -1
  341. package/templates/.agents/templates/task.zh-CN.md +6 -1
  342. package/templates/.claude/commands/analyze-task.en.md +1 -1
  343. package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
  344. package/templates/.claude/commands/block-task.en.md +1 -1
  345. package/templates/.claude/commands/block-task.zh-CN.md +1 -1
  346. package/templates/.claude/commands/cancel-task.en.md +1 -1
  347. package/templates/.claude/commands/cancel-task.zh-CN.md +1 -1
  348. package/templates/.claude/commands/check-task.en.md +1 -1
  349. package/templates/.claude/commands/check-task.zh-CN.md +1 -1
  350. package/templates/.claude/commands/code-task.en.md +1 -1
  351. package/templates/.claude/commands/code-task.zh-CN.md +1 -1
  352. package/templates/.claude/commands/commit.en.md +1 -0
  353. package/templates/.claude/commands/commit.zh-CN.md +1 -0
  354. package/templates/.claude/commands/complete-manual-validation.en.md +1 -1
  355. package/templates/.claude/commands/complete-manual-validation.zh-CN.md +1 -1
  356. package/templates/.claude/commands/complete-task.en.md +1 -1
  357. package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
  358. package/templates/.claude/commands/create-pr.en.md +1 -1
  359. package/templates/.claude/commands/create-pr.zh-CN.md +1 -1
  360. package/templates/.claude/commands/plan-task.en.md +1 -1
  361. package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
  362. package/templates/.claude/commands/review-analysis.en.md +1 -1
  363. package/templates/.claude/commands/review-analysis.zh-CN.md +1 -1
  364. package/templates/.claude/commands/review-code.en.md +1 -1
  365. package/templates/.claude/commands/review-code.zh-CN.md +1 -1
  366. package/templates/.claude/commands/review-plan.en.md +1 -1
  367. package/templates/.claude/commands/review-plan.zh-CN.md +1 -1
  368. package/templates/.claude/commands/watch-pr.en.md +1 -1
  369. package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
  370. package/templates/.gemini/commands/_project_/analyze-task.en.toml +2 -0
  371. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +2 -0
  372. package/templates/.gemini/commands/_project_/block-task.en.toml +2 -0
  373. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +2 -0
  374. package/templates/.gemini/commands/_project_/cancel-task.en.toml +2 -0
  375. package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +2 -0
  376. package/templates/.gemini/commands/_project_/check-task.en.toml +2 -0
  377. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +2 -0
  378. package/templates/.gemini/commands/_project_/code-task.en.toml +2 -0
  379. package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +2 -0
  380. package/templates/.gemini/commands/_project_/commit.en.toml +4 -0
  381. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +4 -0
  382. package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +2 -0
  383. package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +2 -0
  384. package/templates/.gemini/commands/_project_/complete-task.en.toml +2 -0
  385. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +2 -0
  386. package/templates/.gemini/commands/_project_/create-pr.en.toml +2 -0
  387. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +2 -0
  388. package/templates/.gemini/commands/_project_/plan-task.en.toml +2 -0
  389. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +2 -0
  390. package/templates/.gemini/commands/_project_/review-analysis.en.toml +2 -0
  391. package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +2 -0
  392. package/templates/.gemini/commands/_project_/review-code.en.toml +2 -0
  393. package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +2 -0
  394. package/templates/.gemini/commands/_project_/review-plan.en.toml +2 -0
  395. package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +2 -0
  396. package/templates/.gemini/commands/_project_/watch-pr.en.toml +2 -0
  397. package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +2 -0
  398. package/templates/.git-hooks/check-large-files.cjs +92 -0
  399. package/templates/.git-hooks/check-version-format.sh +5 -1
  400. package/templates/.git-hooks/pre-commit +1 -0
  401. package/templates/.opencode/commands/analyze-task.en.md +1 -1
  402. package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
  403. package/templates/.opencode/commands/check-task.en.md +1 -1
  404. package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
  405. package/templates/.opencode/commands/code-task.en.md +1 -1
  406. package/templates/.opencode/commands/code-task.zh-CN.md +1 -1
  407. package/templates/.opencode/commands/commit.en.md +2 -0
  408. package/templates/.opencode/commands/commit.zh-CN.md +2 -0
  409. package/templates/.opencode/commands/complete-task.en.md +1 -1
  410. package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
  411. package/templates/.opencode/commands/plan-task.en.md +1 -1
  412. package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
  413. package/templates/.opencode/commands/review-analysis.en.md +1 -1
  414. package/templates/.opencode/commands/review-analysis.zh-CN.md +1 -1
  415. package/templates/.opencode/commands/review-code.en.md +1 -1
  416. package/templates/.opencode/commands/review-code.zh-CN.md +1 -1
  417. package/templates/.opencode/commands/review-plan.en.md +1 -1
  418. package/templates/.opencode/commands/review-plan.zh-CN.md +1 -1
  419. package/templates/.agents/scripts/platform-adapters/platform-sync.github.js +0 -40
  420. package/templates/.agents/scripts/platform-adapters/platform-sync.js +0 -13
  421. package/templates/.agents/scripts/review-diff-fingerprint.js +0 -170
  422. package/templates/.agents/scripts/workflow-warnings.js +0 -290
  423. package/templates/.agents/skills/code-task/scripts/detect-mode.js +0 -257
  424. package/templates/.agents/skills/release/scripts/manage-milestones.github.sh +0 -80
  425. package/templates/.agents/skills/release/scripts/manage-milestones.sh +0 -6
@@ -1,18 +1,23 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { formatTable } from '../../table.js';
4
- import { resolveTaskRef } from '../resolve-ref.js';
5
- import { parseLedger, HUMAN_DECISION_STATUSES } from '../ledger.js';
4
+ import { parseTaskScope } from '../command-options.js';
5
+ import { resolveTaskContext } from '../resolve-ref.js';
6
+ import { isReviewStage, parseLedger } from '../ledger.js';
7
+ import { listDecisionItems, selectDecisionItem } from '../decision-items.js';
6
8
  import { extractSubSection } from '../sections.js';
7
- const USAGE = `Usage: ai task decisions <N | #N | TASK-id> [selector] [options]
9
+ const USAGE = `Usage: ai task decisions [--task <ref> | -t <ref>] [--item <selector> | -i <selector>] [options]
10
+ ai task decisions <ref> [selector] [options]
8
11
 
9
- Lists the human-decision (HD-) items recorded in a task's review disagreement
12
+ Lists decision items recorded in a task's review disagreement
10
13
  ledger, or prints the full detail block for a single item. Read-only.
11
14
 
12
- <ref> Bare numeric / '#N' short id, or a full TASK-YYYYMMDD-HHMMSS id.
13
- [selector] Ordinal (1-based) or HD id (e.g. 'HD-3') to show one item's detail.
15
+ Omit <ref> Resolve the unique active task for the current branch.
16
+ <ref> Legacy positional task ref.
17
+ [selector] Ordinal (1-based) or ledger id (e.g. 'PL-3') to show one item's detail.
14
18
 
15
19
  Options:
20
+ -i, --item <s> Select an item when task scope is implicit or flag-based.
16
21
  --all Include already-decided (human-decided) items, not just pending.
17
22
  --stage <s> Filter to one stage: analysis | plan | code.
18
23
  --format <fmt> Output format: text (default) | markdown.
@@ -20,9 +25,7 @@ Options:
20
25
 
21
26
  Aliased as 'ai task d'.
22
27
  `;
23
- const STAGES = new Set(['analysis', 'plan', 'code']);
24
28
  const FORMATS = new Set(['text', 'markdown']);
25
- const HD_ID_RE = /^HD-\d+$/;
26
29
  function fail(message) {
27
30
  process.stderr.write(`ai task decisions: ${message}\n`);
28
31
  process.exitCode = 1;
@@ -35,6 +38,30 @@ function parseArgs(args) {
35
38
  if (a === '--all') {
36
39
  out.all = true;
37
40
  }
41
+ else if (a === '--item' || a === '-i') {
42
+ const v = args[i + 1];
43
+ if (v === undefined) {
44
+ fail(`${a} requires a value`);
45
+ return null;
46
+ }
47
+ if (out.item !== undefined) {
48
+ fail("duplicate option '--item'");
49
+ return null;
50
+ }
51
+ out.item = v;
52
+ i += 1;
53
+ }
54
+ else if (a.startsWith('--item=')) {
55
+ if (out.item !== undefined) {
56
+ fail("duplicate option '--item'");
57
+ return null;
58
+ }
59
+ out.item = a.slice('--item='.length);
60
+ if (out.item === '') {
61
+ fail('--item requires a value');
62
+ return null;
63
+ }
64
+ }
38
65
  else if (a === '--stage') {
39
66
  const v = args[i + 1];
40
67
  if (v === undefined) {
@@ -78,7 +105,7 @@ function roundOf(file) {
78
105
  const m = /-r(\d+)\.md$/.exec(file);
79
106
  return m ? Number.parseInt(m[1], 10) : 1;
80
107
  }
81
- // Locate the `### HD-N` detail block for a row. Prefer the artifact named by the
108
+ // Locate the `### {ledger-id}` detail block for a row. Prefer the artifact named by the
82
109
  // row's evidence anchor; otherwise scan analysis/plan/code artifacts and return
83
110
  // the block from the highest-round file that contains it. Returns '' when none
84
111
  // is found (caller degrades gracefully — plan B3).
@@ -112,12 +139,12 @@ function findDetailBlock(row, taskDir) {
112
139
  }
113
140
  return best;
114
141
  }
115
- // Pull the `## 人工裁决` record lines that mention this HD id, so a decided item
142
+ // Pull the `## 人工裁决` record lines that mention this ledger id, so a decided item
116
143
  // shows the human's recorded ruling alongside its detail block.
117
144
  function findDecisionRecord(id, content) {
118
145
  const lines = content.split('\n');
119
146
  let i = 0;
120
- while (i < lines.length && !/^##\s+(人工裁决|Human Decisions?)\s*$/.test(lines[i]))
147
+ while (i < lines.length && !/^##\s+(人工裁决|Human Rulings|Human Decisions?)\s*$/.test(lines[i]))
121
148
  i += 1;
122
149
  if (i >= lines.length)
123
150
  return [];
@@ -170,29 +197,12 @@ function renderList(rows, format, taskDir) {
170
197
  process.stdout.write(`${formatTable(headers, data).join('\n')}\n`);
171
198
  }
172
199
  function renderDetail(rows, selector, format, taskDir, content) {
173
- let row;
174
- if (/^\d+$/.test(selector)) {
175
- const idx = Number.parseInt(selector, 10) - 1;
176
- if (idx < 0 || idx >= rows.length) {
177
- fail(`ordinal '${selector}' out of range (1..${rows.length})`);
178
- return;
179
- }
180
- row = rows[idx];
181
- }
182
- else {
183
- const want = selector.toUpperCase();
184
- const matches = rows.filter((r) => r.id.toUpperCase() === want);
185
- if (matches.length === 0) {
186
- fail(`no decision item matches '${selector}'`);
187
- return;
188
- }
189
- if (matches.length > 1) {
190
- fail(`duplicate id '${selector}' in ledger; select by ordinal instead`);
191
- return;
192
- }
193
- row = matches[0];
200
+ const selected = selectDecisionItem(rows, selector);
201
+ if (!selected.ok) {
202
+ fail(selected.message);
203
+ return;
194
204
  }
195
- const r = row;
205
+ const r = selected.row;
196
206
  const block = findDetailBlock(r, taskDir);
197
207
  const lines = [];
198
208
  if (format === 'markdown') {
@@ -220,15 +230,18 @@ function decisions(args = []) {
220
230
  process.stdout.write(USAGE);
221
231
  return;
222
232
  }
223
- const parsed = parseArgs(args);
224
- if (!parsed)
225
- return;
226
- if (parsed.positionals.length === 0) {
227
- process.stdout.write(USAGE);
228
- process.exitCode = 1;
233
+ let scope;
234
+ try {
235
+ scope = parseTaskScope(args);
236
+ }
237
+ catch (error) {
238
+ fail(error instanceof Error ? error.message : String(error));
229
239
  return;
230
240
  }
231
- if (parsed.stage !== undefined && !STAGES.has(parsed.stage)) {
241
+ const parsed = parseArgs(scope.positionals);
242
+ if (!parsed)
243
+ return;
244
+ if (parsed.stage !== undefined && !isReviewStage(parsed.stage)) {
232
245
  fail(`invalid --stage '${parsed.stage}' (expected analysis|plan|code)`);
233
246
  return;
234
247
  }
@@ -236,17 +249,38 @@ function decisions(args = []) {
236
249
  fail(`invalid --format '${parsed.format}' (expected text|markdown)`);
237
250
  return;
238
251
  }
239
- const resolved = resolveTaskRef(parsed.positionals[0]);
252
+ let taskRef = scope.taskRef;
253
+ let selector = parsed.item;
254
+ if (parsed.item !== undefined) {
255
+ if (parsed.positionals.length > 0) {
256
+ fail('positional task ref/selector cannot be combined with --item');
257
+ return;
258
+ }
259
+ }
260
+ else if (scope.explicit) {
261
+ if (parsed.positionals.length > 0) {
262
+ fail('positional task ref/selector cannot be combined with --task');
263
+ return;
264
+ }
265
+ }
266
+ else {
267
+ if (parsed.positionals.length > 2) {
268
+ fail('too many positional arguments');
269
+ return;
270
+ }
271
+ taskRef = parsed.positionals[0];
272
+ selector = parsed.positionals[1];
273
+ }
274
+ const resolved = resolveTaskContext(taskRef);
240
275
  if (!resolved.ok) {
241
276
  fail(resolved.message);
242
277
  return;
243
278
  }
244
279
  const content = fs.readFileSync(resolved.taskMdPath, 'utf8');
245
- let rows = parseLedger(content).filter((r) => HD_ID_RE.test(r.id));
246
- rows = rows.filter((r) => parsed.all ? HUMAN_DECISION_STATUSES.has(r.status) : r.status === 'needs-human-decision');
247
- if (parsed.stage !== undefined)
248
- rows = rows.filter((r) => r.stage === parsed.stage);
249
- const selector = parsed.positionals[1];
280
+ const rows = listDecisionItems(parseLedger(content), {
281
+ includeDecided: parsed.all,
282
+ stage: parsed.stage
283
+ });
250
284
  if (selector === undefined) {
251
285
  renderList(rows, parsed.format, resolved.taskDir);
252
286
  }
@@ -1,10 +1,12 @@
1
1
  import { formatTable } from '../../table.js';
2
- import { resolveTaskRef } from '../resolve-ref.js';
2
+ import { parseTaskScope } from '../command-options.js';
3
+ import { resolveTaskContext } from '../resolve-ref.js';
3
4
  import { enumerateArtifacts } from '../artifacts.js';
4
- const USAGE = `Usage: ai task files <N | #N | TASK-id>
5
+ const USAGE = `Usage: ai task files [<N | TASK-id> | --task <ref> | -t <ref>]
5
6
 
6
7
  Lists the artifacts in a task directory with stable numbers.
7
- <ref> Bare numeric / '#N' short id, or a full TASK-YYYYMMDD-HHMMSS id.
8
+ Omit <ref> Resolve the unique active task for the current branch.
9
+ <ref> Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
8
10
 
9
11
  Columns: # (artifact number, usable with 'ai task cat') / NAME / SIZE (bytes) / MTIME
10
12
  `;
@@ -18,13 +20,25 @@ function formatMtime(mtimeMs) {
18
20
  `${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`);
19
21
  }
20
22
  function files(args = []) {
21
- if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
23
+ if (args[0] === '--help' || args[0] === '-h') {
22
24
  process.stdout.write(USAGE);
23
- if (args.length === 0)
24
- process.exitCode = 1;
25
25
  return;
26
26
  }
27
- const resolved = resolveTaskRef(args[0]);
27
+ let scope;
28
+ try {
29
+ scope = parseTaskScope(args);
30
+ }
31
+ catch (error) {
32
+ process.stderr.write(`ai task files: ${error instanceof Error ? error.message : String(error)}\n`);
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
37
+ process.stderr.write('ai task files: task ref must be provided once\n');
38
+ process.exitCode = 1;
39
+ return;
40
+ }
41
+ const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
28
42
  if (!resolved.ok) {
29
43
  process.stderr.write(`ai task files: ${resolved.message}\n`);
30
44
  process.exitCode = 1;
@@ -1,13 +1,14 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { resolveTaskRef, detectRepoRoot, enumerateTaskDirs } from '../resolve-ref.js';
3
+ import { resolveTaskContext, resolveTaskRef, detectRepoRoot, enumerateTaskDirs } from '../resolve-ref.js';
4
4
  import { enumerateArtifacts, resolveArtifact } from '../artifacts.js';
5
5
  import { loadShortIdByTaskId } from '../short-id.js';
6
6
  const USAGE = `Usage: ai task grep <pattern> [ref] [artifact | N]
7
+ ai task grep <pattern> (--current | --task <ref> | -t <ref>) [artifact | N]
7
8
 
8
9
  Literal (non-regex) line search across task artifacts.
9
10
  <pattern> Literal substring to match (NOT a regex). Case-sensitive by default.
10
- [ref] Bare numeric / '#N' short id, or a full TASK-YYYYMMDD-HHMMSS id.
11
+ [ref] Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
11
12
  Omit to scan every task under active / blocked / completed
12
13
  (archive is skipped). With a ref, narrows to that single task
13
14
  (a TASK-id ref can also resolve an archived task).
@@ -16,6 +17,8 @@ Literal (non-regex) line search across task artifacts.
16
17
 
17
18
  Options:
18
19
  -i, --ignore-case Case-insensitive matching.
20
+ --current Limit search to the current task context.
21
+ -t, --task <ref> Limit search to an explicit task.
19
22
  -- Treat the rest as positional (use for patterns starting with '-').
20
23
 
21
24
  Output: '{taskId} [#short] {fileStem}:{line}: {matched-line}' (short id only for active tasks).
@@ -52,8 +55,11 @@ function scanArtifact(taskId, shortToken, artifactPath, matcher, emit) {
52
55
  function grep(args = []) {
53
56
  const positional = [];
54
57
  let ignoreCase = false;
58
+ let current = false;
59
+ let taskRef;
55
60
  let optsEnded = false;
56
- for (const a of args) {
61
+ for (let index = 0; index < args.length; index += 1) {
62
+ const a = args[index];
57
63
  if (!optsEnded && a === '--') {
58
64
  optsEnded = true;
59
65
  continue;
@@ -66,6 +72,39 @@ function grep(args = []) {
66
72
  ignoreCase = true;
67
73
  continue;
68
74
  }
75
+ if (!optsEnded && a === '--current') {
76
+ current = true;
77
+ continue;
78
+ }
79
+ if (!optsEnded && (a === '--task' || a === '-t')) {
80
+ if (taskRef !== undefined) {
81
+ process.stderr.write("ai task grep: duplicate option '--task'\n");
82
+ process.exitCode = 1;
83
+ return;
84
+ }
85
+ const value = args[++index];
86
+ if (!value || value.startsWith('-')) {
87
+ process.stderr.write(`ai task grep: ${a} requires a value\n`);
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ taskRef = value;
92
+ continue;
93
+ }
94
+ if (!optsEnded && a.startsWith('--task=')) {
95
+ if (taskRef !== undefined) {
96
+ process.stderr.write("ai task grep: duplicate option '--task'\n");
97
+ process.exitCode = 1;
98
+ return;
99
+ }
100
+ taskRef = a.slice('--task='.length);
101
+ if (taskRef === '') {
102
+ process.stderr.write('ai task grep: --task requires a value\n');
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ continue;
107
+ }
69
108
  if (!optsEnded && a.startsWith('-') && a !== '-') {
70
109
  process.stderr.write(`ai task grep: unknown flag: ${a}\n`);
71
110
  process.exitCode = 1;
@@ -78,17 +117,26 @@ function grep(args = []) {
78
117
  process.exitCode = 1;
79
118
  return;
80
119
  }
81
- if (positional.length > 3) {
120
+ if (current && taskRef !== undefined) {
121
+ process.stderr.write('ai task grep: --current and --task are mutually exclusive\n');
122
+ process.exitCode = 1;
123
+ return;
124
+ }
125
+ if (positional.length > 3 || ((current || taskRef !== undefined) && positional.length > 2)) {
82
126
  process.stderr.write('ai task grep: too many arguments\n');
83
127
  process.exitCode = 1;
84
128
  return;
85
129
  }
86
- const [pattern, ref, artifactOrN] = positional;
130
+ let [pattern, ref, artifactOrN] = positional;
131
+ if (current || taskRef !== undefined) {
132
+ artifactOrN = ref;
133
+ ref = taskRef;
134
+ }
87
135
  const matcher = makeMatcher(pattern, ignoreCase);
88
136
  const chunks = [];
89
137
  const emit = (line) => chunks.push(line);
90
138
  let total = 0;
91
- if (ref === undefined) {
139
+ if (ref === undefined && !current) {
92
140
  // No ref: full scan across active / blocked / completed (no archive).
93
141
  let repoRoot;
94
142
  try {
@@ -108,7 +156,7 @@ function grep(args = []) {
108
156
  }
109
157
  }
110
158
  else {
111
- const resolved = resolveTaskRef(ref);
159
+ const resolved = current ? resolveTaskContext() : resolveTaskRef(ref);
112
160
  if (!resolved.ok) {
113
161
  process.stderr.write(`ai task grep: ${resolved.message}\n`);
114
162
  process.exitCode = 1;
@@ -1,12 +1,14 @@
1
1
  import fs from 'node:fs';
2
- import { resolveTaskRef } from '../resolve-ref.js';
2
+ import { parseTaskScope } from '../command-options.js';
3
+ import { resolveTaskContext } from '../resolve-ref.js';
3
4
  import { extractTitle } from '../frontmatter.js';
4
5
  import { extractSection, findSectionHeading } from '../sections.js';
5
6
  import { renderTemplateBody, PLACEHOLDER } from '../issue-form.js';
6
- const USAGE = `Usage: ai task issue-body <N | #N | TASK-id> [--template <path>]
7
+ const USAGE = `Usage: ai task issue-body [<ref> | --task <ref> | -t <ref>] [--template <path>]
7
8
 
8
9
  Print a deterministic Issue body extracted from a task's task.md.
9
- <ref> Bare numeric / '#N' short id, or a full TASK-YYYYMMDD-HHMMSS id.
10
+ Omit <ref> Resolve the unique active task for the current branch.
11
+ <ref> Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
10
12
  --template <path> Render the final body for the given GitHub Issue Form (scenario A);
11
13
  without it, print the default '描述 + 需求' body (scenario B).
12
14
 
@@ -34,35 +36,42 @@ function readTaskFields(content) {
34
36
  };
35
37
  }
36
38
  function issueBody(args = []) {
37
- if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
39
+ if (args[0] === '--help' || args[0] === '-h') {
38
40
  process.stdout.write(USAGE);
39
- if (args.length === 0)
40
- process.exitCode = 1;
41
41
  return;
42
42
  }
43
- let ref;
44
43
  let templatePath;
44
+ const scopeArgs = [];
45
45
  for (let i = 0; i < args.length; i += 1) {
46
46
  const arg = args[i];
47
47
  if (arg === '--template') {
48
48
  templatePath = args[i + 1];
49
49
  i += 1;
50
50
  }
51
- else if (ref === undefined) {
52
- ref = arg;
51
+ else {
52
+ scopeArgs.push(arg);
53
53
  }
54
54
  }
55
- if (!ref) {
56
- process.stderr.write('ai task issue-body: missing task ref\n');
55
+ if (templatePath === undefined && args.includes('--template')) {
56
+ process.stderr.write('ai task issue-body: --template requires a path\n');
57
57
  process.exitCode = 1;
58
58
  return;
59
59
  }
60
- if (templatePath === undefined && args.includes('--template')) {
61
- process.stderr.write('ai task issue-body: --template requires a path\n');
60
+ let scope;
61
+ try {
62
+ scope = parseTaskScope(scopeArgs);
63
+ }
64
+ catch (error) {
65
+ process.stderr.write(`ai task issue-body: ${error instanceof Error ? error.message : String(error)}\n`);
66
+ process.exitCode = 1;
67
+ return;
68
+ }
69
+ if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
70
+ process.stderr.write('ai task issue-body: task ref must be provided once\n');
62
71
  process.exitCode = 1;
63
72
  return;
64
73
  }
65
- const resolved = resolveTaskRef(ref);
74
+ const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
66
75
  if (!resolved.ok) {
67
76
  process.stderr.write(`ai task issue-body: ${resolved.message}\n`);
68
77
  process.exitCode = 1;
@@ -1,13 +1,16 @@
1
1
  import fs from 'node:fs';
2
2
  import { formatTable } from '../../table.js';
3
- import { resolveTaskRef } from '../resolve-ref.js';
4
- import { parseLedger } from '../ledger.js';
5
- const USAGE = `Usage: ai task log <N | #N | TASK-id>
3
+ import { parseTaskScope } from '../command-options.js';
4
+ import { resolveTaskContext } from '../resolve-ref.js';
5
+ import { isReviewStage, parseLedger } from '../ledger.js';
6
+ import { parseActivityLog, pairEntries } from '../activity-log.js';
7
+ const USAGE = `Usage: ai task log [<N | TASK-id> | --task <ref> | -t <ref>]
6
8
 
7
9
  Renders a task's activity log as a per-step status table. A step's start and
8
10
  completion are paired onto one row: STARTED holds the start time, DONE the
9
11
  completion time (or '(in progress)' while still running).
10
- <ref> Bare numeric / '#N' short id, or a full TASK-YYYYMMDD-HHMMSS id.
12
+ Omit <ref> Resolve the unique active task for the current branch.
13
+ <ref> Bare numeric short id, or a full TASK-YYYYMMDD-HHMMSS id.
11
14
 
12
15
  Columns: # (row) / STEP / AGENT / STARTED / DONE / NOTE
13
16
  A human-executed step shows AGENT as 'human' and, when it has no start marker,
@@ -17,17 +20,16 @@ Columns: # (row) / STEP / AGENT / STARTED / DONE / NOTE
17
20
  `;
18
21
  const TABLE_HEADERS = ['#', 'STEP', 'AGENT', 'STARTED', 'DONE', 'NOTE'];
19
22
  // The activity-log H2 heading is language-dependent (zh template / en template).
20
- const HEADING_RE = /^##\s+(活动日志|Activity Log)\s*$/;
21
- const NEXT_H2_RE = /^##\s/;
22
23
  // `- {time} — **{step}** by {agent} — {note}` ; the separator is an em-dash
23
24
  // (U+2014). STEP/AGENT are non-greedy so a note that itself contains ' — ' or
24
25
  // '→' is not mis-split; NOTE greedily takes the rest of the line.
25
- const ENTRY_RE = /^- (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}) — \*\*(.+?)\*\* by (.+?) — (.*)$/;
26
+ // One rendered row = one step instance. `started`/`done` are timestamps; an empty
27
+ // `done` with a non-empty `started` means the step is still in flight, while an
28
+ // empty `started` is a historical done-only entry (no start marker was written).
26
29
  // A start marker reuses the normal entry grammar and only suffixes its action
27
30
  // with ` [started]`; the matching done entry carries the identical base action
28
31
  // without the suffix. Pairing therefore keys on the base action (including any
29
32
  // `(Round N)`), so every round and every repeated execution pairs on its own.
30
- const STARTED_SUFFIX_RE = /\s*\[started\]\s*$/;
31
33
  // Short agent tokens that actually appear in activity logs for AI executors
32
34
  // (workflow recommended_agents claude/codex/gemini/cursor + enabled TUI opencode;
33
35
  // note these differ from the `.airc.json` long names claude-code/gemini-cli).
@@ -38,65 +40,11 @@ const REVIEW_STAGE_PREFIXES = [
38
40
  { prefix: 'Review Plan', stage: 'plan' },
39
41
  { prefix: 'Review Code', stage: 'code' }
40
42
  ];
41
- function parseActivityLog(content) {
42
- const lines = content.split('\n');
43
- let i = 0;
44
- while (i < lines.length && !HEADING_RE.test(lines[i]))
45
- i += 1;
46
- if (i >= lines.length)
47
- return { sectionFound: false, entries: [] };
48
- const parsed = [];
49
- for (let j = i + 1; j < lines.length; j += 1) {
50
- if (NEXT_H2_RE.test(lines[j]))
51
- break;
52
- const m = ENTRY_RE.exec(lines[j]);
53
- if (!m)
54
- continue; // skip blank / non-entry / malformed lines
55
- parsed.push({
56
- entry: { time: m[1], step: m[2], agent: m[3], note: m[4] },
57
- epoch: Date.parse(m[1].replace(' ', 'T')),
58
- order: parsed.length
59
- });
60
- }
61
- // Ascending by time; stable tie-break on original order for equal timestamps.
62
- parsed.sort((a, b) => a.epoch - b.epoch || a.order - b.order);
63
- return { sectionFound: true, entries: parsed.map((p) => p.entry) };
64
- }
65
43
  // Collapse a chronological entry list into per-step rows: a `[started]` marker
66
44
  // opens a row, the next matching done entry fills it in place (FIFO per base
67
45
  // action). Started-only rows stay in flight; done-only entries (legacy logs with
68
46
  // no start marker) render as standalone rows. Result order = first-seen order,
69
47
  // which is already ascending because `entries` is sorted ascending.
70
- function pairEntries(entries) {
71
- const rows = [];
72
- const open = new Map();
73
- for (const e of entries) {
74
- const isStarted = STARTED_SUFFIX_RE.test(e.step);
75
- const base = e.step.replace(STARTED_SUFFIX_RE, '');
76
- if (isStarted) {
77
- const row = { step: base, agent: e.agent, started: e.time, done: '', note: e.note };
78
- rows.push(row);
79
- const queue = open.get(base);
80
- if (queue)
81
- queue.push(row);
82
- else
83
- open.set(base, [row]);
84
- }
85
- else {
86
- const pending = open.get(base)?.shift();
87
- if (pending) {
88
- // Done fills the open row; the done entry carries the meaningful note.
89
- pending.done = e.time;
90
- pending.agent = e.agent;
91
- pending.note = e.note;
92
- }
93
- else {
94
- rows.push({ step: base, agent: e.agent, started: '', done: e.time, note: e.note });
95
- }
96
- }
97
- }
98
- return rows;
99
- }
100
48
  function countHumanDecisionsByStage(rows) {
101
49
  const counts = new Map();
102
50
  for (const row of rows) {
@@ -106,9 +54,6 @@ function countHumanDecisionsByStage(rows) {
106
54
  }
107
55
  return counts;
108
56
  }
109
- function isReviewStage(stage) {
110
- return stage === 'analysis' || stage === 'plan' || stage === 'code';
111
- }
112
57
  function reviewStageForStep(step) {
113
58
  return REVIEW_STAGE_PREFIXES.find(({ prefix }) => step.startsWith(prefix))?.stage;
114
59
  }
@@ -160,13 +105,25 @@ function foldHumanCounts(note, decisions, manualValidation) {
160
105
  return `${[...fields, group].join(', ')}${suffix}`;
161
106
  }
162
107
  function log(args = []) {
163
- if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
108
+ if (args[0] === '--help' || args[0] === '-h') {
164
109
  process.stdout.write(USAGE);
165
- if (args.length === 0)
166
- process.exitCode = 1;
167
110
  return;
168
111
  }
169
- const resolved = resolveTaskRef(args[0]);
112
+ let scope;
113
+ try {
114
+ scope = parseTaskScope(args);
115
+ }
116
+ catch (error) {
117
+ process.stderr.write(`ai task log: ${error instanceof Error ? error.message : String(error)}\n`);
118
+ process.exitCode = 1;
119
+ return;
120
+ }
121
+ if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
122
+ process.stderr.write('ai task log: task ref must be provided once\n');
123
+ process.exitCode = 1;
124
+ return;
125
+ }
126
+ const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
170
127
  if (!resolved.ok) {
171
128
  process.stderr.write(`ai task log: ${resolved.message}\n`);
172
129
  process.exitCode = 1;
@@ -201,5 +158,5 @@ function log(args = []) {
201
158
  }
202
159
  process.stdout.write(`Total: ${steps.length} steps\n`);
203
160
  }
204
- export { log, parseActivityLog, pairEntries, isHumanAgent };
161
+ export { log, isHumanAgent };
205
162
  //# sourceMappingURL=log.js.map
@@ -1,20 +1,33 @@
1
1
  import fs from 'node:fs';
2
- import { resolveTaskRef } from '../resolve-ref.js';
3
- const USAGE = `Usage: ai task show <N | #N | TASK-id>
2
+ import { parseTaskScope } from '../command-options.js';
3
+ import { resolveTaskContext } from '../resolve-ref.js';
4
+ const USAGE = `Usage: ai task show [<N | TASK-id> | --task <ref> | -t <ref>]
4
5
 
5
6
  Prints the task.md content for the matching task.
7
+ Omit the ref Resolve the unique active task for the current branch.
6
8
  N (bare numeric) Recommended; resolves the active short id via the registry.
7
- '#N' Compatibility form for old commands.
8
9
  TASK-YYYYMMDD-HHMMSS Locates a task in active / blocked / completed / archive.
9
10
  `;
10
11
  function show(args = []) {
11
- if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
12
+ if (args[0] === '--help' || args[0] === '-h') {
12
13
  process.stdout.write(USAGE);
13
- if (args.length === 0)
14
- process.exitCode = 1;
15
14
  return;
16
15
  }
17
- const resolved = resolveTaskRef(args[0]);
16
+ let scope;
17
+ try {
18
+ scope = parseTaskScope(args);
19
+ }
20
+ catch (error) {
21
+ process.stderr.write(`ai task show: ${error instanceof Error ? error.message : String(error)}\n`);
22
+ process.exitCode = 1;
23
+ return;
24
+ }
25
+ if (scope.positionals.length > 1 || (scope.explicit && scope.positionals.length > 0)) {
26
+ process.stderr.write('ai task show: task ref must be provided once\n');
27
+ process.exitCode = 1;
28
+ return;
29
+ }
30
+ const resolved = resolveTaskContext(scope.taskRef ?? scope.positionals[0]);
18
31
  if (!resolved.ok) {
19
32
  process.stderr.write(`ai task show: ${resolved.message}\n`);
20
33
  process.exitCode = 1;