@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,7 +1,8 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { execFileSync, spawnSync } from 'node:child_process';
4
- import { normalizeShortIdInput } from './short-id.ts';
3
+ import { execFileSync } from 'node:child_process';
4
+ import { normalizeShortIdInput, resolveShortIdReadOnly } from './short-id.ts';
5
+ import { parseTaskFrontmatter } from './frontmatter.ts';
5
6
 
6
7
  const TASK_ID_RE = /^TASK-\d{8}-\d{6}$/;
7
8
  // Flat-structured workspace dirs that hold tasks under `{dir}/{taskId}/task.md`.
@@ -15,8 +16,37 @@ type ResolveRefResult =
15
16
  taskId: string;
16
17
  taskDir: string;
17
18
  taskMdPath: string;
19
+ state: TaskWorkspaceState;
18
20
  }
19
- | { ok: false; message: string };
21
+ | {
22
+ ok: false;
23
+ code: ResolveTaskRefErrorCode;
24
+ message: string;
25
+ repoRoot: string | null;
26
+ taskId: string | null;
27
+ };
28
+
29
+ type TaskWorkspaceState = 'active' | 'blocked' | 'completed' | 'archive';
30
+
31
+ type ResolveTaskRefErrorCode =
32
+ | 'REPO_ROOT_NOT_FOUND'
33
+ | 'INVALID_TASK_REF'
34
+ | 'SHORT_ID_RESERVED'
35
+ | 'SHORT_ID_CAPACITY_EXCEEDED'
36
+ | 'SHORT_ID_REGISTRY_NOT_FOUND'
37
+ | 'SHORT_ID_REGISTRY_READ_FAILED'
38
+ | 'SHORT_ID_REGISTRY_INVALID_JSON'
39
+ | 'SHORT_ID_REGISTRY_INVALID_SCHEMA'
40
+ | 'SHORT_ID_REGISTRY_DUPLICATE_TASK'
41
+ | 'SHORT_ID_NOT_FOUND'
42
+ | 'SHORT_ID_STALE'
43
+ | 'TASK_NOT_FOUND'
44
+ | 'TASK_CONTEXT_DETACHED_HEAD'
45
+ | 'TASK_CONTEXT_NOT_FOUND'
46
+ | 'TASK_CONTEXT_AMBIGUOUS'
47
+ | 'TASK_CONTEXT_UNREADABLE';
48
+
49
+ type ResolveTaskRefOptions = { repoRoot?: string };
20
50
 
21
51
  function detectRepoRoot(): string {
22
52
  try {
@@ -40,21 +70,6 @@ function readShortIdLength(repoRoot: string): number {
40
70
  return 2;
41
71
  }
42
72
 
43
- function resolveShortIdToTaskId(arg: string, repoRoot: string): string {
44
- const scriptPath = path.join(repoRoot, '.agents', 'scripts', 'task-short-id.js');
45
- if (!fs.existsSync(scriptPath)) {
46
- throw new Error(`task-short-id.js not found at ${scriptPath}`);
47
- }
48
- const result = spawnSync('node', [scriptPath, 'resolve', arg], {
49
- encoding: 'utf8',
50
- cwd: repoRoot
51
- });
52
- if (result.status !== 0) {
53
- throw new Error((result.stderr || '').trim() || `failed to resolve '${arg}'`);
54
- }
55
- return result.stdout.trim();
56
- }
57
-
58
73
  function listSortedNumeric(dir: string, width: number): string[] {
59
74
  if (!fs.existsSync(dir)) return [];
60
75
  const pattern = new RegExp(`^\\d{${width}}$`);
@@ -84,12 +99,16 @@ function findInArchive(repoRoot: string, taskId: string): string | null {
84
99
  return null;
85
100
  }
86
101
 
87
- function findTaskMd(repoRoot: string, taskId: string): string | null {
102
+ function findTaskMd(
103
+ repoRoot: string,
104
+ taskId: string
105
+ ): { taskMdPath: string; state: TaskWorkspaceState } | null {
88
106
  for (const sub of FLAT_WORKSPACE_DIRS) {
89
107
  const candidate = path.join(repoRoot, '.agents', 'workspace', sub, taskId, 'task.md');
90
- if (fs.existsSync(candidate)) return candidate;
108
+ if (fs.existsSync(candidate)) return { taskMdPath: candidate, state: sub };
91
109
  }
92
- return findInArchive(repoRoot, taskId);
110
+ const archived = findInArchive(repoRoot, taskId);
111
+ return archived ? { taskMdPath: archived, state: 'archive' } : null;
93
112
  }
94
113
 
95
114
  /**
@@ -113,16 +132,38 @@ function enumerateTaskDirs(repoRoot: string): { taskId: string; taskDir: string
113
132
  return out;
114
133
  }
115
134
 
135
+ function locateHotTaskDirs(
136
+ repoRoot: string,
137
+ taskId: string
138
+ ): { taskId: string; taskDir: string; taskMdPath: string; state: Exclude<TaskWorkspaceState, 'archive'> }[] {
139
+ return FLAT_WORKSPACE_DIRS.flatMap((state) => {
140
+ const taskDir = path.join(repoRoot, '.agents', 'workspace', state, taskId);
141
+ const taskMdPath = path.join(taskDir, 'task.md');
142
+ return fs.existsSync(taskMdPath) ? [{ taskId, taskDir, taskMdPath, state }] : [];
143
+ });
144
+ }
145
+
116
146
  /**
117
- * Resolve a task ref (bare short id, `#N`, or `TASK-YYYYMMDD-HHMMSS`) to its
147
+ * Resolve a task ref (bare short id or `TASK-YYYYMMDD-HHMMSS`) to its
118
148
  * task directory across active / blocked / completed / archive.
119
149
  *
120
150
  * The returned `message` on failure is command-agnostic (no `ai task <cmd>:`
121
151
  * prefix); callers prepend their own prefix so each command keeps its existing
122
152
  * stderr wording byte-for-byte.
123
153
  */
124
- function resolveTaskRef(arg: string): ResolveRefResult {
125
- const repoRoot = detectRepoRoot();
154
+ function resolveTaskRef(arg: string, options: ResolveTaskRefOptions = {}): ResolveRefResult {
155
+ let repoRoot: string;
156
+ try {
157
+ repoRoot = options.repoRoot ? path.resolve(options.repoRoot) : detectRepoRoot();
158
+ } catch (error) {
159
+ return {
160
+ ok: false,
161
+ code: 'REPO_ROOT_NOT_FOUND',
162
+ message: error instanceof Error ? error.message : String(error),
163
+ repoRoot: null,
164
+ taskId: null
165
+ };
166
+ }
126
167
  let taskId: string;
127
168
  if (TASK_ID_RE.test(arg)) {
128
169
  taskId = arg;
@@ -130,31 +171,151 @@ function resolveTaskRef(arg: string): ResolveRefResult {
130
171
  const shortIdLength = readShortIdLength(repoRoot);
131
172
  const normalized = normalizeShortIdInput(arg, { shortIdLength });
132
173
  if (normalized.kind === 'error') {
133
- return { ok: false, message: normalized.message };
174
+ return {
175
+ ok: false,
176
+ code: normalized.code,
177
+ message: normalized.message,
178
+ repoRoot,
179
+ taskId: null
180
+ };
134
181
  }
135
182
  if (normalized.kind === 'pass') {
136
183
  return {
137
184
  ok: false,
185
+ code: 'INVALID_TASK_REF',
138
186
  message:
139
187
  `'${arg}' is not a valid short id or TASK-id; ` +
140
- `expected bare digits, '#N', or 'TASK-YYYYMMDD-HHMMSS'`
188
+ `expected bare digits or 'TASK-YYYYMMDD-HHMMSS'`,
189
+ repoRoot,
190
+ taskId: null
141
191
  };
142
192
  }
143
- try {
144
- taskId = resolveShortIdToTaskId(normalized.value, repoRoot);
145
- } catch (e) {
146
- return { ok: false, message: (e as Error).message };
193
+ const shortResult = resolveShortIdReadOnly(normalized.value, repoRoot, { shortIdLength });
194
+ if (!shortResult.ok) {
195
+ return {
196
+ ok: false,
197
+ code: shortResult.code,
198
+ message: shortResult.message,
199
+ repoRoot,
200
+ taskId: shortResult.taskId
201
+ };
202
+ }
203
+ taskId = shortResult.taskId;
204
+ }
205
+ const located = findTaskMd(repoRoot, taskId);
206
+ if (!located) {
207
+ return {
208
+ ok: false,
209
+ code: 'TASK_NOT_FOUND',
210
+ message: `task ${taskId} not found in active / blocked / completed / archive`,
211
+ repoRoot,
212
+ taskId
213
+ };
214
+ }
215
+ return {
216
+ ok: true,
217
+ repoRoot,
218
+ taskId,
219
+ taskDir: path.dirname(located.taskMdPath),
220
+ taskMdPath: located.taskMdPath,
221
+ state: located.state
222
+ };
223
+ }
224
+
225
+ function resolveTaskContext(
226
+ taskRef?: string,
227
+ options: ResolveTaskRefOptions = {}
228
+ ): ResolveRefResult {
229
+ if (taskRef !== undefined) return resolveTaskRef(taskRef, options);
230
+
231
+ let repoRoot: string;
232
+ try {
233
+ repoRoot = options.repoRoot ? path.resolve(options.repoRoot) : detectRepoRoot();
234
+ } catch (error) {
235
+ return {
236
+ ok: false,
237
+ code: 'REPO_ROOT_NOT_FOUND',
238
+ message: error instanceof Error ? error.message : String(error),
239
+ repoRoot: null,
240
+ taskId: null
241
+ };
242
+ }
243
+
244
+ let branch: string;
245
+ try {
246
+ branch = execFileSync('git', ['symbolic-ref', '--quiet', '--short', 'HEAD'], {
247
+ cwd: repoRoot,
248
+ encoding: 'utf8',
249
+ stdio: ['pipe', 'pipe', 'pipe']
250
+ }).trim();
251
+ } catch {
252
+ return {
253
+ ok: false,
254
+ code: 'TASK_CONTEXT_DETACHED_HEAD',
255
+ message: 'cannot infer the current task from detached HEAD',
256
+ repoRoot,
257
+ taskId: null
258
+ };
259
+ }
260
+
261
+ const activeDir = path.join(repoRoot, '.agents', 'workspace', 'active');
262
+ const matches: { taskId: string; taskDir: string; taskMdPath: string }[] = [];
263
+ if (fs.existsSync(activeDir)) {
264
+ for (const entry of fs.readdirSync(activeDir).sort()) {
265
+ if (!TASK_ID_RE.test(entry)) continue;
266
+ const taskDir = path.join(activeDir, entry);
267
+ const taskMdPath = path.join(taskDir, 'task.md');
268
+ if (!fs.existsSync(taskMdPath)) continue;
269
+ try {
270
+ const frontmatter = parseTaskFrontmatter(fs.readFileSync(taskMdPath, 'utf8'));
271
+ if (!frontmatter.id || !frontmatter.branch) {
272
+ return {
273
+ ok: false,
274
+ code: 'TASK_CONTEXT_UNREADABLE',
275
+ message: `cannot prove current task context because ${entry}/task.md has invalid frontmatter`,
276
+ repoRoot,
277
+ taskId: null
278
+ };
279
+ }
280
+ if (frontmatter.branch === branch) matches.push({ taskId: entry, taskDir, taskMdPath });
281
+ } catch (error) {
282
+ return {
283
+ ok: false,
284
+ code: 'TASK_CONTEXT_UNREADABLE',
285
+ message: `cannot read active task candidate ${entry}: ${error instanceof Error ? error.message : String(error)}`,
286
+ repoRoot,
287
+ taskId: null
288
+ };
289
+ }
147
290
  }
148
291
  }
149
- const taskMdPath = findTaskMd(repoRoot, taskId);
150
- if (!taskMdPath) {
292
+
293
+ if (matches.length === 0) {
294
+ return {
295
+ ok: false,
296
+ code: 'TASK_CONTEXT_NOT_FOUND',
297
+ message: `no active task matches current branch '${branch}'; use --task <ref>`,
298
+ repoRoot,
299
+ taskId: null
300
+ };
301
+ }
302
+ if (matches.length > 1) {
151
303
  return {
152
304
  ok: false,
153
- message: `task ${taskId} not found in active / blocked / completed / archive`
305
+ code: 'TASK_CONTEXT_AMBIGUOUS',
306
+ message: `multiple active tasks match current branch '${branch}'; use --task <ref>`,
307
+ repoRoot,
308
+ taskId: null
154
309
  };
155
310
  }
156
- return { ok: true, repoRoot, taskId, taskDir: path.dirname(taskMdPath), taskMdPath };
311
+ const match = matches[0]!;
312
+ return { ok: true, repoRoot, ...match, state: 'active' };
157
313
  }
158
314
 
159
- export { resolveTaskRef, detectRepoRoot, enumerateTaskDirs, TASK_ID_RE };
160
- export type { ResolveRefResult };
315
+ export { resolveTaskRef, resolveTaskContext, detectRepoRoot, enumerateTaskDirs, locateHotTaskDirs, TASK_ID_RE };
316
+ export type {
317
+ ResolveRefResult,
318
+ ResolveTaskRefErrorCode,
319
+ ResolveTaskRefOptions,
320
+ TaskWorkspaceState
321
+ };
@@ -1,16 +1,15 @@
1
1
  // Shared helpers for review-artifact parsing.
2
- // Imported by both .agents/skills/code-task/scripts/detect-mode.js and
3
- // .agents/scripts/validate-artifact.js so the round/verdict vocabulary stays
2
+ // Imported by typed artifact lifecycle and verification so the round/verdict vocabulary stays
4
3
  // in a single source of truth (prevents the cross-file drift this lifecycle
5
4
  // is designed to eliminate).
6
5
  import fs from "node:fs";
7
6
  import path from "node:path";
8
7
 
9
- export function escapeRegExp(value) {
8
+ export function escapeRegExp(value: string): string {
10
9
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
11
10
  }
12
11
 
13
- export function maxRound(entries, stem) {
12
+ export function maxRound(entries: string[], stem: string): number {
14
13
  let max = 0;
15
14
  for (const entry of entries) {
16
15
  if (entry === `${stem}.md`) {
@@ -26,11 +25,11 @@ export function maxRound(entries, stem) {
26
25
  return max;
27
26
  }
28
27
 
29
- export function artifactName(stem, round) {
28
+ export function artifactName(stem: string, round: number): string {
30
29
  return round === 1 ? `${stem}.md` : `${stem}-r${round}.md`;
31
30
  }
32
31
 
33
- export function normalizeVerdict(raw) {
32
+ export function normalizeVerdict(raw: unknown): "Approved" | "Changes Requested" | "Rejected" | "" {
34
33
  const value = String(raw).trim().toLowerCase();
35
34
  if (value === "通过" || value === "approved") {
36
35
  return "Approved";
@@ -44,12 +43,12 @@ export function normalizeVerdict(raw) {
44
43
  return "";
45
44
  }
46
45
 
47
- export function extractSection(content, names) {
46
+ export function extractSection(content: string, names: string[]): string {
48
47
  const lines = content.split(/\r?\n/);
49
48
  const nameSet = new Set(names);
50
49
  const start = lines.findIndex((line) => {
51
50
  const match = line.trim().match(/^##\s+(.+?)\s*$/);
52
- return match ? nameSet.has(match[1]) : false;
51
+ return match ? nameSet.has(match[1]!) : false;
53
52
  });
54
53
 
55
54
  if (start === -1) {
@@ -58,7 +57,7 @@ export function extractSection(content, names) {
58
57
 
59
58
  const sectionLines = [];
60
59
  for (let index = start + 1; index < lines.length; index += 1) {
61
- if (/^##\s+/.test(lines[index])) {
60
+ if (/^##\s+/.test(lines[index]!)) {
62
61
  break;
63
62
  }
64
63
  sectionLines.push(lines[index]);
@@ -69,7 +68,7 @@ export function extractSection(content, names) {
69
68
  // Parse the canonical verdict out of a review-* artifact.
70
69
  // Returns { ok, verdict, message }. Verdict collapses Approved into
71
70
  // "Approved-with-issues" when the findings counts are non-zero.
72
- export function parseVerdict(reviewPath) {
71
+ export function parseVerdict(reviewPath: string) {
73
72
  if (!fs.existsSync(reviewPath)) {
74
73
  return { ok: false, verdict: null, message: `Review artifact not found: ${path.basename(reviewPath)}` };
75
74
  }
@@ -91,7 +90,7 @@ export function parseVerdict(reviewPath) {
91
90
  return {
92
91
  ok: false,
93
92
  verdict: null,
94
- message: `unrecognized verdict '${verdictMatch[1].trim()}' in ${fileName}`
93
+ message: `unrecognized verdict '${verdictMatch[1]!.trim()}' in ${fileName}`
95
94
  };
96
95
  }
97
96
 
@@ -104,7 +103,7 @@ export function parseVerdict(reviewPath) {
104
103
  return { ok: false, verdict, message: `cannot parse findings count in ${fileName}` };
105
104
  }
106
105
 
107
- const counts = findingsMatch[1].match(/(\d+)\s*(?:阻塞项|blockers?).*?(\d+)\s*(?:主要|majors?).*?(\d+)\s*(?:次要|minors?)/i);
106
+ const counts = findingsMatch[1]!.match(/(\d+)\s*(?:阻塞项|blockers?).*?(\d+)\s*(?:主要|majors?).*?(\d+)\s*(?:次要|minors?)/i);
108
107
  if (!counts) {
109
108
  return { ok: false, verdict, message: `cannot parse findings count in ${fileName}` };
110
109
  }
@@ -1,18 +1,23 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
 
4
- import { artifactName, maxRound } from "./review-artifacts.js";
4
+ import { artifactName, maxRound } from "./review-artifacts.ts";
5
5
 
6
6
  // Paths excluded from the post-review coverage gate. Fail-closed: the gate
7
7
  // covers ALL tracked changes by default. This default denylist is EMPTY —
8
8
  // projects opt into exclusions explicitly via review.post_review_exclude_globs.
9
- export const DEFAULT_POST_REVIEW_EXCLUDES = [];
9
+ export const DEFAULT_POST_REVIEW_EXCLUDES: string[] = [];
10
10
 
11
11
  // Returns git pathspecs selecting "all tracked changes except project excludes".
12
12
  // The leading ":/" makes coverage fail-closed (everything from the repo root);
13
13
  // each exclude becomes a top-level negative pathspec. Projects extend the
14
14
  // denylist via review.post_review_exclude_globs (union, deduped).
15
- export function resolvePostReviewGlobs(config = {}, reviewConfig = {}) {
15
+ type ReviewGlobConfig = { post_review_exclude_globs?: unknown };
16
+
17
+ export function resolvePostReviewGlobs(
18
+ config: ReviewGlobConfig = {},
19
+ reviewConfig: ReviewGlobConfig = {}
20
+ ): string[] {
16
21
  const projectExcludes = [
17
22
  ...(Array.isArray(reviewConfig.post_review_exclude_globs) ? reviewConfig.post_review_exclude_globs : []),
18
23
  ...(Array.isArray(config.post_review_exclude_globs) ? config.post_review_exclude_globs : [])
@@ -21,7 +26,7 @@ export function resolvePostReviewGlobs(config = {}, reviewConfig = {}) {
21
26
  return [":/", ...excludes.map((p) => `:(top,exclude)${p}`)];
22
27
  }
23
28
 
24
- export function findAuthoritativeReviewCodeArtifact(taskDir) {
29
+ export function findAuthoritativeReviewCodeArtifact(taskDir: string) {
25
30
  const entries = fs.existsSync(taskDir) ? fs.readdirSync(taskDir) : [];
26
31
  const round = maxRound(entries, "review-code");
27
32
  if (round === 0) {
@@ -37,22 +42,22 @@ export function findAuthoritativeReviewCodeArtifact(taskDir) {
37
42
  };
38
43
  }
39
44
 
40
- export function extractReviewBaseline(content) {
45
+ export function extractReviewBaseline(content: string): string {
41
46
  const match = String(content).match(/^[-*]?\s*\*\*(?:审查基线提交|Review Baseline Commit)\*\*[::]\s*(.*?)\s*$/m);
42
- return match ? match[1].trim().replace(/`/g, "") : "";
47
+ return match ? match[1]!.trim().replace(/`/g, "") : "";
43
48
  }
44
49
 
45
- export function extractReviewDiffFingerprint(content) {
50
+ export function extractReviewDiffFingerprint(content: string): string {
46
51
  const match = String(content).match(/^[-*]?\s*\*\*(?:审查差异指纹|Reviewed Diff Fingerprint)\*\*[::]\s*(.*?)\s*$/m);
47
- return match ? match[1].trim().replace(/`/g, "") : "";
52
+ return match ? match[1]!.trim().replace(/`/g, "") : "";
48
53
  }
49
54
 
50
- export function extractReviewedSnapshotTree(content) {
55
+ export function extractReviewedSnapshotTree(content: string): string {
51
56
  const match = String(content).match(/^[-*]?\s*\*\*(?:审查快照树|Reviewed Snapshot Tree)\*\*[::]\s*(.*?)\s*$/m);
52
- return match ? match[1].trim().replace(/`/g, "") : "";
57
+ return match ? match[1]!.trim().replace(/`/g, "") : "";
53
58
  }
54
59
 
55
- export function parseReviewVerdict(content) {
60
+ export function parseReviewVerdict(content: string): string {
56
61
  const match = String(content).match(/^[-*]?\s*\*\*(?:总体结论|Overall Verdict)\*\*[::]\s*(.*?)\s*$/m);
57
- return match ? match[1].trim() : "";
62
+ return match ? match[1]!.trim() : "";
58
63
  }