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