@fitlab-ai/agent-infra 0.8.5 → 0.9.1

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 (467) hide show
  1. package/README.md +6 -1
  2. package/README.zh-CN.md +5 -1
  3. package/bin/cli.ts +2 -2
  4. package/dist/bin/cli.js +2 -2
  5. package/dist/bin/internal-cli.js +103 -0
  6. package/dist/lib/decide.js +81 -90
  7. package/dist/lib/defaults.json +1 -0
  8. package/dist/lib/git/review-snapshot.js +79 -0
  9. package/dist/lib/git/workflow.js +101 -0
  10. package/dist/lib/internal/git-workflow.js +42 -0
  11. package/dist/lib/internal/platform-checks.js +119 -0
  12. package/dist/lib/internal/platform-comment.js +129 -0
  13. package/dist/lib/internal/platform-context.js +46 -0
  14. package/dist/lib/internal/platform-issue.js +142 -0
  15. package/dist/lib/internal/platform-pr.js +146 -0
  16. package/dist/lib/internal/platform-release-notes.js +53 -0
  17. package/dist/lib/internal/release-workflow.js +320 -0
  18. package/dist/lib/internal/task-artifact.js +67 -0
  19. package/dist/lib/internal/task-context.js +43 -0
  20. package/dist/lib/internal/task-event.js +70 -0
  21. package/dist/lib/internal/task-ledger.js +114 -0
  22. package/dist/lib/internal/task-lifecycle.js +58 -0
  23. package/dist/lib/internal/task-short-id.js +83 -0
  24. package/dist/lib/internal/task-snapshot.js +47 -0
  25. package/dist/lib/internal/task-verify.js +50 -0
  26. package/dist/lib/internal/task-warning.js +74 -0
  27. package/dist/lib/platform/adapters.js +14 -0
  28. package/dist/lib/platform/context.js +146 -0
  29. package/dist/lib/platform/github-client.js +124 -0
  30. package/dist/lib/platform/github-release-notes.js +96 -0
  31. package/dist/lib/platform/issue-comments.js +409 -0
  32. package/dist/lib/platform/issue-metadata.js +183 -0
  33. package/dist/lib/platform/issues.js +619 -0
  34. package/dist/lib/platform/merged-pr-equivalence.js +54 -0
  35. package/dist/lib/platform/metadata-labels.js +28 -0
  36. package/dist/lib/platform/pr-checks.js +216 -0
  37. package/dist/lib/platform/pr-summary.js +88 -0
  38. package/dist/lib/platform/pull-request-metadata.js +38 -0
  39. package/dist/lib/platform/pull-requests.js +340 -0
  40. package/dist/lib/platform/release-notes.js +143 -0
  41. package/dist/lib/platform/releases.js +82 -0
  42. package/dist/lib/platform/types.js +22 -0
  43. package/dist/lib/platform/verification-required.js +102 -0
  44. package/dist/lib/platform/verification-sync.js +1014 -0
  45. package/dist/lib/platform/verification.js +6 -0
  46. package/dist/lib/release/channels.js +31 -0
  47. package/dist/lib/release/workflow.js +32 -0
  48. package/dist/lib/render.js +3 -2
  49. package/dist/lib/run/index.js +24 -7
  50. package/dist/lib/sandbox/build-proxy.js +63 -0
  51. package/dist/lib/sandbox/capture.js +25 -3
  52. package/dist/lib/sandbox/commands/create.js +93 -31
  53. package/dist/lib/sandbox/commands/enter.js +34 -11
  54. package/dist/lib/sandbox/commands/list-running.js +10 -8
  55. package/dist/lib/sandbox/commands/rebuild.js +24 -7
  56. package/dist/lib/sandbox/commands/show.js +2 -2
  57. package/dist/lib/sandbox/commands/start.js +53 -15
  58. package/dist/lib/sandbox/image-build.js +2 -1
  59. package/dist/lib/sandbox/index.js +6 -6
  60. package/dist/lib/sandbox/mounts.js +36 -0
  61. package/dist/lib/sandbox/recovery.js +562 -0
  62. package/dist/lib/sandbox/runtimes/ai-tools.dockerfile +24 -3
  63. package/dist/lib/sandbox/runtimes/base.dockerfile +8 -1
  64. package/dist/lib/sandbox/runtimes/java17.dockerfile +8 -1
  65. package/dist/lib/sandbox/runtimes/java21.dockerfile +8 -1
  66. package/dist/lib/sandbox/runtimes/node20.dockerfile +8 -1
  67. package/dist/lib/sandbox/runtimes/node22.dockerfile +8 -1
  68. package/dist/lib/sandbox/runtimes/python3.dockerfile +8 -1
  69. package/dist/lib/sandbox/shell.js +2 -1
  70. package/dist/lib/sandbox/task-resolver.js +5 -1
  71. package/dist/lib/sandbox/tools.js +19 -0
  72. package/dist/lib/server/protocol.js +5 -5
  73. package/dist/lib/task/activity-log.js +61 -0
  74. package/dist/lib/task/artifact-lifecycle.js +427 -0
  75. package/dist/lib/task/command-options.js +30 -0
  76. package/dist/lib/task/commands/cat.js +36 -6
  77. package/dist/lib/task/commands/decisions.js +80 -46
  78. package/dist/lib/task/commands/files.js +21 -7
  79. package/dist/lib/task/commands/grep.js +55 -7
  80. package/dist/lib/task/commands/issue-body.js +33 -19
  81. package/dist/lib/task/commands/log.js +27 -70
  82. package/dist/lib/task/commands/show.js +20 -7
  83. package/dist/lib/task/commands/status.js +18 -8
  84. package/dist/lib/task/decision-intents.js +154 -0
  85. package/dist/lib/task/decision-items.js +53 -0
  86. package/dist/lib/task/events.js +318 -0
  87. package/dist/lib/task/frontmatter.js +159 -1
  88. package/dist/lib/task/implementation-inputs.js +117 -0
  89. package/dist/lib/task/index.js +12 -9
  90. package/dist/lib/task/issue-form.js +21 -6
  91. package/dist/lib/task/ledger-intents.js +185 -0
  92. package/dist/lib/task/ledger.js +65 -35
  93. package/dist/lib/task/lifecycle.js +484 -0
  94. package/dist/lib/task/resolve-ref.js +152 -32
  95. package/dist/lib/task/review-artifacts.js +101 -0
  96. package/dist/lib/task/review-fingerprint.js +55 -0
  97. package/dist/lib/task/sections.js +358 -4
  98. package/dist/lib/task/short-id.js +292 -7
  99. package/dist/lib/task/snapshot.js +95 -0
  100. package/dist/lib/task/verification-checks.js +8 -0
  101. package/dist/lib/task/verification-config.js +14 -0
  102. package/dist/lib/task/verification-engine.js +923 -0
  103. package/dist/lib/task/verification-review.js +3 -0
  104. package/dist/lib/task/verification-types.js +2 -0
  105. package/dist/lib/task/verification.js +113 -0
  106. package/dist/lib/task/workflow-warning-intents.js +131 -0
  107. package/dist/lib/task/workflow-warnings.js +10 -78
  108. package/dist/lib/task/write.js +241 -0
  109. package/lib/decide.ts +57 -97
  110. package/lib/defaults.json +1 -0
  111. package/lib/git/review-snapshot.ts +73 -0
  112. package/lib/git/workflow.ts +101 -0
  113. package/lib/internal/git-workflow.ts +37 -0
  114. package/lib/internal/platform-checks.ts +101 -0
  115. package/lib/internal/platform-comment.ts +99 -0
  116. package/lib/internal/platform-context.ts +33 -0
  117. package/lib/internal/platform-issue.ts +116 -0
  118. package/lib/internal/platform-pr.ts +119 -0
  119. package/lib/internal/platform-release-notes.ts +55 -0
  120. package/lib/internal/release-workflow.ts +288 -0
  121. package/lib/internal/task-artifact.ts +47 -0
  122. package/lib/internal/task-context.ts +35 -0
  123. package/lib/internal/task-event.ts +51 -0
  124. package/lib/internal/task-ledger.ts +86 -0
  125. package/lib/internal/task-lifecycle.ts +41 -0
  126. package/lib/internal/task-short-id.ts +55 -0
  127. package/lib/internal/task-snapshot.ts +32 -0
  128. package/lib/internal/task-verify.ts +33 -0
  129. package/lib/internal/task-warning.ts +50 -0
  130. package/lib/platform/adapters.ts +30 -0
  131. package/lib/platform/context.ts +164 -0
  132. package/lib/platform/github-client.ts +146 -0
  133. package/lib/platform/github-release-notes.ts +132 -0
  134. package/lib/platform/issue-comments.ts +479 -0
  135. package/lib/platform/issue-metadata.ts +250 -0
  136. package/lib/platform/issues.ts +693 -0
  137. package/lib/platform/merged-pr-equivalence.ts +70 -0
  138. package/lib/platform/metadata-labels.ts +33 -0
  139. package/lib/platform/pr-checks.ts +247 -0
  140. package/lib/platform/pr-summary.ts +90 -0
  141. package/lib/platform/pull-request-metadata.ts +69 -0
  142. package/lib/platform/pull-requests.ts +386 -0
  143. package/lib/platform/release-notes.ts +167 -0
  144. package/lib/platform/releases.ts +71 -0
  145. package/lib/platform/types.ts +74 -0
  146. package/lib/platform/verification-required.ts +109 -0
  147. package/{runtime/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +198 -367
  148. package/lib/platform/verification.ts +11 -0
  149. package/lib/release/channels.ts +30 -0
  150. package/lib/release/workflow.ts +31 -0
  151. package/lib/render.ts +3 -2
  152. package/lib/run/index.ts +25 -7
  153. package/lib/sandbox/build-proxy.ts +94 -0
  154. package/lib/sandbox/capture.ts +29 -3
  155. package/lib/sandbox/commands/create.ts +120 -36
  156. package/lib/sandbox/commands/enter.ts +38 -11
  157. package/lib/sandbox/commands/list-running.ts +10 -8
  158. package/lib/sandbox/commands/rebuild.ts +29 -7
  159. package/lib/sandbox/commands/show.ts +2 -2
  160. package/lib/sandbox/commands/start.ts +50 -16
  161. package/lib/sandbox/image-build.ts +4 -1
  162. package/lib/sandbox/index.ts +6 -6
  163. package/lib/sandbox/mounts.ts +55 -0
  164. package/lib/sandbox/recovery.ts +828 -0
  165. package/lib/sandbox/runtimes/ai-tools.dockerfile +24 -3
  166. package/lib/sandbox/runtimes/base.dockerfile +8 -1
  167. package/lib/sandbox/runtimes/java17.dockerfile +8 -1
  168. package/lib/sandbox/runtimes/java21.dockerfile +8 -1
  169. package/lib/sandbox/runtimes/node20.dockerfile +8 -1
  170. package/lib/sandbox/runtimes/node22.dockerfile +8 -1
  171. package/lib/sandbox/runtimes/python3.dockerfile +8 -1
  172. package/lib/sandbox/shell.ts +3 -1
  173. package/lib/sandbox/task-resolver.ts +5 -1
  174. package/lib/sandbox/tools.ts +31 -0
  175. package/lib/server/protocol.ts +5 -5
  176. package/lib/task/activity-log.ts +62 -0
  177. package/lib/task/artifact-lifecycle.ts +484 -0
  178. package/lib/task/command-options.ts +32 -0
  179. package/lib/task/commands/cat.ts +22 -9
  180. package/lib/task/commands/decisions.ts +49 -47
  181. package/lib/task/commands/files.ts +14 -6
  182. package/lib/task/commands/grep.ts +34 -7
  183. package/lib/task/commands/issue-body.ts +26 -21
  184. package/lib/task/commands/log.ts +17 -70
  185. package/lib/task/commands/show.ts +14 -6
  186. package/lib/task/commands/status.ts +17 -7
  187. package/lib/task/decision-intents.ts +163 -0
  188. package/lib/task/decision-items.ts +64 -0
  189. package/lib/task/events.ts +320 -0
  190. package/lib/task/frontmatter.ts +202 -2
  191. package/lib/task/implementation-inputs.ts +137 -0
  192. package/lib/task/index.ts +12 -9
  193. package/lib/task/issue-form.ts +24 -6
  194. package/lib/task/ledger-intents.ts +201 -0
  195. package/lib/task/ledger.ts +77 -31
  196. package/lib/task/lifecycle.ts +458 -0
  197. package/lib/task/resolve-ref.ts +197 -36
  198. package/{templates/.agents/scripts/lib/review-artifacts.js → lib/task/review-artifacts.ts} +11 -12
  199. package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts} +26 -12
  200. package/lib/task/sections.ts +486 -4
  201. package/lib/task/short-id.ts +403 -9
  202. package/lib/task/snapshot.ts +143 -0
  203. package/lib/task/verification-checks.ts +9 -0
  204. package/lib/task/verification-config.ts +20 -0
  205. package/{templates/.agents/scripts/validate-artifact.js → lib/task/verification-engine.ts} +230 -421
  206. package/lib/task/verification-review.ts +10 -0
  207. package/lib/task/verification-types.ts +29 -0
  208. package/lib/task/verification.ts +156 -0
  209. package/lib/task/workflow-warning-intents.ts +142 -0
  210. package/lib/task/workflow-warnings.ts +10 -78
  211. package/lib/task/write.ts +468 -0
  212. package/package.json +4 -2
  213. package/templates/.agents/README.en.md +4 -3
  214. package/templates/.agents/README.zh-CN.md +4 -3
  215. package/templates/.agents/rules/README.en.md +6 -5
  216. package/templates/.agents/rules/README.zh-CN.md +6 -5
  217. package/templates/.agents/rules/create-issue.en.md +1 -1
  218. package/templates/.agents/rules/create-issue.github.en.md +5 -184
  219. package/templates/.agents/rules/create-issue.github.zh-CN.md +12 -178
  220. package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
  221. package/templates/.agents/rules/human-decision-context.en.md +36 -0
  222. package/templates/.agents/rules/human-decision-context.zh-CN.md +36 -0
  223. package/templates/.agents/rules/issue-fields.github.en.md +4 -148
  224. package/templates/.agents/rules/issue-fields.github.zh-CN.md +9 -144
  225. package/templates/.agents/rules/issue-pr-commands.en.md +43 -3
  226. package/templates/.agents/rules/issue-pr-commands.github.en.md +15 -220
  227. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +23 -213
  228. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +45 -3
  229. package/templates/.agents/rules/issue-sync.en.md +1 -1
  230. package/templates/.agents/rules/issue-sync.github.en.md +14 -301
  231. package/templates/.agents/rules/issue-sync.github.zh-CN.md +36 -287
  232. package/templates/.agents/rules/issue-sync.zh-CN.md +1 -1
  233. package/templates/.agents/rules/milestone-inference.en.md +1 -1
  234. package/templates/.agents/rules/milestone-inference.github.en.md +7 -119
  235. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +8 -108
  236. package/templates/.agents/rules/milestone-inference.zh-CN.md +1 -1
  237. package/templates/.agents/rules/next-step-output.en.md +12 -11
  238. package/templates/.agents/rules/next-step-output.zh-CN.md +12 -11
  239. package/templates/.agents/rules/no-mid-flow-questions.en.md +3 -3
  240. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +3 -3
  241. package/templates/.agents/rules/pr-checks-commands.en.md +16 -3
  242. package/templates/.agents/rules/pr-checks-commands.github.en.md +10 -54
  243. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +19 -47
  244. package/templates/.agents/rules/pr-checks-commands.zh-CN.md +30 -3
  245. package/templates/.agents/rules/pr-sync.en.md +30 -3
  246. package/templates/.agents/rules/pr-sync.github.en.md +12 -115
  247. package/templates/.agents/rules/pr-sync.github.zh-CN.md +26 -104
  248. package/templates/.agents/rules/pr-sync.zh-CN.md +43 -3
  249. package/templates/.agents/rules/release-commands.en.md +2 -2
  250. package/templates/.agents/rules/release-commands.github.en.md +10 -40
  251. package/templates/.agents/rules/release-commands.github.zh-CN.md +9 -39
  252. package/templates/.agents/rules/release-commands.zh-CN.md +2 -2
  253. package/templates/.agents/rules/review-handshake.en.md +10 -6
  254. package/templates/.agents/rules/review-handshake.zh-CN.md +10 -6
  255. package/templates/.agents/rules/task-management.en.md +11 -2
  256. package/templates/.agents/rules/task-management.zh-CN.md +11 -3
  257. package/templates/.agents/rules/task-short-id.en.md +25 -29
  258. package/templates/.agents/rules/task-short-id.zh-CN.md +20 -23
  259. package/templates/.agents/rules/testing-discipline.en.md +20 -2
  260. package/templates/.agents/rules/testing-discipline.zh-CN.md +20 -2
  261. package/templates/.agents/scripts/lib/agent-infra-package.js +1 -9
  262. package/templates/.agents/scripts/task-short-id.js +71 -533
  263. package/templates/.agents/skills/analyze-task/SKILL.en.md +26 -56
  264. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +30 -60
  265. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -3
  266. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -3
  267. package/templates/.agents/skills/block-task/SKILL.en.md +21 -47
  268. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +23 -47
  269. package/templates/.agents/skills/block-task/config/verify.json +1 -2
  270. package/templates/.agents/skills/cancel-task/SKILL.en.md +16 -45
  271. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +16 -45
  272. package/templates/.agents/skills/cancel-task/config/verify.json +1 -2
  273. package/templates/.agents/skills/check-task/SKILL.en.md +6 -3
  274. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +6 -3
  275. package/templates/.agents/skills/close-codescan/SKILL.en.md +6 -24
  276. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +6 -24
  277. package/templates/.agents/skills/close-dependabot/SKILL.en.md +6 -24
  278. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +6 -24
  279. package/templates/.agents/skills/code-task/SKILL.en.md +22 -35
  280. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +28 -44
  281. package/templates/.agents/skills/code-task/config/verify.en.json +3 -3
  282. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +3 -3
  283. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +13 -9
  284. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +13 -9
  285. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +1 -1
  286. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +1 -1
  287. package/templates/.agents/skills/code-task/reference/report-template.en.md +11 -1
  288. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +11 -1
  289. package/templates/.agents/skills/commit/SKILL.en.md +13 -11
  290. package/templates/.agents/skills/commit/SKILL.zh-CN.md +13 -11
  291. package/templates/.agents/skills/commit/config/verify.json +1 -2
  292. package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -11
  293. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -11
  294. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +4 -8
  295. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +4 -8
  296. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +6 -18
  297. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +5 -17
  298. package/templates/.agents/skills/commit/reference/task-status-update.en.md +13 -0
  299. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +13 -0
  300. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +13 -36
  301. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +13 -36
  302. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -3
  303. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -3
  304. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +10 -54
  305. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +10 -79
  306. package/templates/.agents/skills/complete-task/SKILL.en.md +59 -63
  307. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +59 -63
  308. package/templates/.agents/skills/complete-task/config/verify.en.json +10 -7
  309. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +10 -7
  310. package/templates/.agents/skills/create-pr/SKILL.en.md +19 -44
  311. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +19 -43
  312. package/templates/.agents/skills/create-pr/config/verify.json +1 -2
  313. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +8 -12
  314. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +7 -11
  315. package/templates/.agents/skills/create-release-note/SKILL.en.md +17 -38
  316. package/templates/.agents/skills/create-release-note/SKILL.zh-CN.md +16 -37
  317. package/templates/.agents/skills/create-task/SKILL.en.md +16 -13
  318. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +16 -13
  319. package/templates/.agents/skills/create-task/config/verify.json +1 -2
  320. package/templates/.agents/skills/create-task/reference/context-capture.en.md +29 -0
  321. package/templates/.agents/skills/create-task/reference/context-capture.zh-CN.md +29 -0
  322. package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
  323. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
  324. package/templates/.agents/skills/import-codescan/config/verify.json +1 -2
  325. package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
  326. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
  327. package/templates/.agents/skills/import-dependabot/config/verify.json +1 -2
  328. package/templates/.agents/skills/import-issue/SKILL.en.md +9 -13
  329. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -14
  330. package/templates/.agents/skills/import-issue/config/verify.json +1 -2
  331. package/templates/.agents/skills/plan-task/SKILL.en.md +17 -42
  332. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +22 -49
  333. package/templates/.agents/skills/plan-task/config/verify.en.json +1 -3
  334. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -3
  335. package/templates/.agents/skills/post-release/SKILL.en.md +11 -81
  336. package/templates/.agents/skills/post-release/SKILL.zh-CN.md +8 -78
  337. package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
  338. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
  339. package/templates/.agents/skills/release/SKILL.en.md +16 -163
  340. package/templates/.agents/skills/release/SKILL.zh-CN.md +15 -162
  341. package/templates/.agents/skills/restore-task/SKILL.en.md +11 -29
  342. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +11 -29
  343. package/templates/.agents/skills/restore-task/config/verify.json +1 -2
  344. package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -25
  345. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +13 -33
  346. package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -4
  347. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -4
  348. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +9 -12
  349. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +9 -12
  350. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +9 -2
  351. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +9 -2
  352. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +7 -0
  353. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +7 -0
  354. package/templates/.agents/skills/review-code/SKILL.en.md +22 -36
  355. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +23 -41
  356. package/templates/.agents/skills/review-code/config/verify.en.json +3 -4
  357. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +3 -4
  358. package/templates/.agents/skills/review-code/reference/output-templates.en.md +56 -18
  359. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +56 -18
  360. package/templates/.agents/skills/review-code/reference/report-template.en.md +11 -4
  361. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +11 -4
  362. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +7 -0
  363. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +7 -0
  364. package/templates/.agents/skills/review-plan/SKILL.en.md +13 -25
  365. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +13 -33
  366. package/templates/.agents/skills/review-plan/config/verify.en.json +3 -4
  367. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -4
  368. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +9 -12
  369. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +9 -12
  370. package/templates/.agents/skills/review-plan/reference/report-template.en.md +9 -2
  371. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +9 -2
  372. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +7 -0
  373. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +7 -0
  374. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +1 -2
  375. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +1 -2
  376. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -15
  377. package/templates/.agents/skills/watch-pr/SKILL.en.md +24 -14
  378. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +25 -15
  379. package/templates/.agents/skills/watch-pr/config/verify.json +1 -2
  380. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +2 -2
  381. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +2 -2
  382. package/templates/.agents/templates/task.en.md +24 -1
  383. package/templates/.agents/templates/task.zh-CN.md +24 -1
  384. package/templates/.claude/commands/analyze-task.en.md +1 -1
  385. package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
  386. package/templates/.claude/commands/block-task.en.md +1 -1
  387. package/templates/.claude/commands/block-task.zh-CN.md +1 -1
  388. package/templates/.claude/commands/cancel-task.en.md +1 -1
  389. package/templates/.claude/commands/cancel-task.zh-CN.md +1 -1
  390. package/templates/.claude/commands/check-task.en.md +1 -1
  391. package/templates/.claude/commands/check-task.zh-CN.md +1 -1
  392. package/templates/.claude/commands/code-task.en.md +1 -1
  393. package/templates/.claude/commands/code-task.zh-CN.md +1 -1
  394. package/templates/.claude/commands/commit.en.md +1 -0
  395. package/templates/.claude/commands/commit.zh-CN.md +1 -0
  396. package/templates/.claude/commands/complete-manual-validation.en.md +1 -1
  397. package/templates/.claude/commands/complete-manual-validation.zh-CN.md +1 -1
  398. package/templates/.claude/commands/complete-task.en.md +1 -1
  399. package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
  400. package/templates/.claude/commands/create-pr.en.md +1 -1
  401. package/templates/.claude/commands/create-pr.zh-CN.md +1 -1
  402. package/templates/.claude/commands/plan-task.en.md +1 -1
  403. package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
  404. package/templates/.claude/commands/review-analysis.en.md +1 -1
  405. package/templates/.claude/commands/review-analysis.zh-CN.md +1 -1
  406. package/templates/.claude/commands/review-code.en.md +1 -1
  407. package/templates/.claude/commands/review-code.zh-CN.md +1 -1
  408. package/templates/.claude/commands/review-plan.en.md +1 -1
  409. package/templates/.claude/commands/review-plan.zh-CN.md +1 -1
  410. package/templates/.claude/commands/watch-pr.en.md +1 -1
  411. package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
  412. package/templates/.gemini/commands/_project_/analyze-task.en.toml +2 -0
  413. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +2 -0
  414. package/templates/.gemini/commands/_project_/block-task.en.toml +2 -0
  415. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +2 -0
  416. package/templates/.gemini/commands/_project_/cancel-task.en.toml +2 -0
  417. package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +2 -0
  418. package/templates/.gemini/commands/_project_/check-task.en.toml +2 -0
  419. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +2 -0
  420. package/templates/.gemini/commands/_project_/code-task.en.toml +2 -0
  421. package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +2 -0
  422. package/templates/.gemini/commands/_project_/commit.en.toml +4 -0
  423. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +4 -0
  424. package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +2 -0
  425. package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +2 -0
  426. package/templates/.gemini/commands/_project_/complete-task.en.toml +2 -0
  427. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +2 -0
  428. package/templates/.gemini/commands/_project_/create-pr.en.toml +2 -0
  429. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +2 -0
  430. package/templates/.gemini/commands/_project_/plan-task.en.toml +2 -0
  431. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +2 -0
  432. package/templates/.gemini/commands/_project_/review-analysis.en.toml +2 -0
  433. package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +2 -0
  434. package/templates/.gemini/commands/_project_/review-code.en.toml +2 -0
  435. package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +2 -0
  436. package/templates/.gemini/commands/_project_/review-plan.en.toml +2 -0
  437. package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +2 -0
  438. package/templates/.gemini/commands/_project_/watch-pr.en.toml +2 -0
  439. package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +2 -0
  440. package/templates/.git-hooks/check-large-files.cjs +92 -0
  441. package/templates/.git-hooks/check-version-format.sh +5 -1
  442. package/templates/.git-hooks/pre-commit +1 -0
  443. package/templates/.opencode/commands/analyze-task.en.md +1 -1
  444. package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
  445. package/templates/.opencode/commands/check-task.en.md +1 -1
  446. package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
  447. package/templates/.opencode/commands/code-task.en.md +1 -1
  448. package/templates/.opencode/commands/code-task.zh-CN.md +1 -1
  449. package/templates/.opencode/commands/commit.en.md +2 -0
  450. package/templates/.opencode/commands/commit.zh-CN.md +2 -0
  451. package/templates/.opencode/commands/complete-task.en.md +1 -1
  452. package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
  453. package/templates/.opencode/commands/plan-task.en.md +1 -1
  454. package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
  455. package/templates/.opencode/commands/review-analysis.en.md +1 -1
  456. package/templates/.opencode/commands/review-analysis.zh-CN.md +1 -1
  457. package/templates/.opencode/commands/review-code.en.md +1 -1
  458. package/templates/.opencode/commands/review-code.zh-CN.md +1 -1
  459. package/templates/.opencode/commands/review-plan.en.md +1 -1
  460. package/templates/.opencode/commands/review-plan.zh-CN.md +1 -1
  461. package/templates/.agents/scripts/platform-adapters/platform-sync.github.js +0 -40
  462. package/templates/.agents/scripts/platform-adapters/platform-sync.js +0 -13
  463. package/templates/.agents/scripts/review-diff-fingerprint.js +0 -170
  464. package/templates/.agents/scripts/workflow-warnings.js +0 -290
  465. package/templates/.agents/skills/code-task/scripts/detect-mode.js +0 -257
  466. package/templates/.agents/skills/release/scripts/manage-milestones.github.sh +0 -80
  467. package/templates/.agents/skills/release/scripts/manage-milestones.sh +0 -6
@@ -0,0 +1,468 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ import { VERSION } from '../version.ts';
5
+ import {
6
+ parseTypedTaskFrontmatter,
7
+ updateTaskFrontmatter
8
+ } from './frontmatter.ts';
9
+ import type { FrontmatterScalar } from './frontmatter.ts';
10
+ import { resolveTaskRef } from './resolve-ref.ts';
11
+ import type {
12
+ ResolveTaskRefErrorCode,
13
+ TaskWorkspaceState
14
+ } from './resolve-ref.ts';
15
+ import { mutateTableRow, upsertSection } from './sections.ts';
16
+ import type {
17
+ TableRowDeleteMutation,
18
+ TableRowUpsertMutation
19
+ } from './sections.ts';
20
+
21
+ type FrontmatterMutation = {
22
+ kind: 'frontmatter';
23
+ set: Readonly<Record<string, FrontmatterScalar>>;
24
+ remove?: readonly string[];
25
+ };
26
+
27
+ type SectionMutation = {
28
+ kind: 'section';
29
+ aliases: readonly string[];
30
+ heading: string;
31
+ body: string;
32
+ };
33
+
34
+ type TaskMutation =
35
+ | FrontmatterMutation
36
+ | SectionMutation
37
+ | TableRowUpsertMutation
38
+ | TableRowDeleteMutation;
39
+
40
+ type TaskWriteRequest = {
41
+ taskRef: string;
42
+ expectedState: TaskWorkspaceState;
43
+ mutations: readonly TaskMutation[];
44
+ dryRun?: boolean;
45
+ };
46
+
47
+ type TaskOperationSummary =
48
+ | {
49
+ index: number;
50
+ kind: 'frontmatter';
51
+ fields: readonly string[];
52
+ wouldChange: boolean;
53
+ }
54
+ | {
55
+ index: number;
56
+ kind: 'section';
57
+ heading: string;
58
+ operation: 'create' | 'update';
59
+ wouldChange: boolean;
60
+ }
61
+ | {
62
+ index: number;
63
+ kind: 'table-row';
64
+ section: string;
65
+ keyColumn: string;
66
+ key: string;
67
+ operation: 'insert' | 'update' | 'delete';
68
+ wouldChange: boolean;
69
+ }
70
+ | {
71
+ index: -1;
72
+ kind: 'metadata';
73
+ fields: readonly ['updated_at', 'agent_infra_version'];
74
+ wouldChange: boolean;
75
+ };
76
+
77
+ type TaskWriteMetadata = {
78
+ timestamp: string;
79
+ agentInfraVersion: string;
80
+ };
81
+
82
+ type TaskWriteErrorCode =
83
+ | ResolveTaskRefErrorCode
84
+ | 'TASK_STATE_MISMATCH'
85
+ | 'TASK_READ_FAILED'
86
+ | 'TASK_DOCUMENT_INVALID'
87
+ | 'MUTATION_INVALID'
88
+ | 'TABLE_NOT_FOUND'
89
+ | 'TABLE_AMBIGUOUS'
90
+ | 'TABLE_DUPLICATE_KEY'
91
+ | 'TABLE_UNKNOWN_COLUMN'
92
+ | 'TABLE_KEY_COLUMN_IN_VALUES'
93
+ | 'TABLE_KEY_CONFLICT'
94
+ | 'TABLE_MISSING_COLUMN'
95
+ | 'TABLE_DELETE_VALUES_FORBIDDEN'
96
+ | 'TABLE_CELL_INVALID'
97
+ | 'METADATA_CAPTURE_FAILED'
98
+ | 'TEMP_WRITE_FAILED'
99
+ | 'RENAME_FAILED'
100
+ | 'TEMP_CLEANUP_FAILED';
101
+
102
+ type TaskWriteError = { code: TaskWriteErrorCode; message: string };
103
+
104
+ type TaskWriteSuccessBase = {
105
+ requestRef: string;
106
+ expectedState: TaskWorkspaceState;
107
+ taskId: string;
108
+ taskMdPath: string;
109
+ actualState: TaskWorkspaceState;
110
+ operations: readonly TaskOperationSummary[];
111
+ timestamp: string;
112
+ agentInfraVersion: string;
113
+ error: null;
114
+ };
115
+
116
+ type TaskWritePlanned = TaskWriteSuccessBase & { status: 'planned'; changed: true };
117
+ type TaskWriteApplied = TaskWriteSuccessBase & { status: 'applied'; changed: true };
118
+ type TaskWriteNoOp = TaskWriteSuccessBase & { status: 'no-op'; changed: false };
119
+
120
+ type TaskWriteFailed = {
121
+ status: 'failed';
122
+ requestRef: string;
123
+ expectedState: TaskWorkspaceState;
124
+ taskId: string | null;
125
+ taskMdPath: string | null;
126
+ actualState: TaskWorkspaceState | null;
127
+ changed: false;
128
+ operations: readonly TaskOperationSummary[];
129
+ timestamp: string | null;
130
+ agentInfraVersion: string | null;
131
+ error: TaskWriteError;
132
+ };
133
+
134
+ type TaskWriteResult =
135
+ | TaskWritePlanned
136
+ | TaskWriteApplied
137
+ | TaskWriteNoOp
138
+ | TaskWriteFailed;
139
+
140
+ type TaskFileSystem = {
141
+ readFileSync: (file: string) => string;
142
+ statModeSync: (file: string) => number;
143
+ writeFileSync: (file: string, content: string, mode: number) => void;
144
+ renameSync: (from: string, to: string) => void;
145
+ unlinkSync: (file: string) => void;
146
+ };
147
+
148
+ type TaskWriteOptions = {
149
+ repoRoot?: string;
150
+ taskLocation?: {
151
+ repoRoot: string;
152
+ taskId: string;
153
+ taskMdPath: string;
154
+ state: TaskWorkspaceState;
155
+ };
156
+ metadataProvider?: () => TaskWriteMetadata;
157
+ randomSuffix?: () => string;
158
+ fileSystem?: Partial<TaskFileSystem>;
159
+ };
160
+
161
+ const DEFAULT_FILE_SYSTEM: TaskFileSystem = {
162
+ readFileSync: (file) => fs.readFileSync(file, 'utf8'),
163
+ statModeSync: (file) => fs.statSync(file).mode,
164
+ writeFileSync: (file, content, mode) => {
165
+ fs.writeFileSync(file, content, { encoding: 'utf8', flag: 'wx', mode });
166
+ },
167
+ renameSync: (from, to) => fs.renameSync(from, to),
168
+ unlinkSync: (file) => fs.unlinkSync(file)
169
+ };
170
+
171
+ function canonicalTimestamp(): string {
172
+ const now = new Date();
173
+ const pad = (value: number) => String(value).padStart(2, '0');
174
+ const offsetMinutes = -now.getTimezoneOffset();
175
+ const offsetSign = offsetMinutes >= 0 ? '+' : '-';
176
+ const offset = Math.abs(offsetMinutes);
177
+ return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}${offsetSign}${pad(Math.floor(offset / 60))}:${pad(offset % 60)}`;
178
+ }
179
+
180
+ function captureTaskWriteMetadata(): TaskWriteMetadata {
181
+ return { timestamp: canonicalTimestamp(), agentInfraVersion: VERSION };
182
+ }
183
+
184
+ function failure(
185
+ request: TaskWriteRequest,
186
+ identity: { taskId: string | null; taskMdPath: string | null; actualState: TaskWorkspaceState | null },
187
+ code: TaskWriteErrorCode,
188
+ message: string,
189
+ operations: readonly TaskOperationSummary[] = [],
190
+ metadata: TaskWriteMetadata | null = null
191
+ ): TaskWriteFailed {
192
+ return {
193
+ status: 'failed',
194
+ requestRef: request.taskRef,
195
+ expectedState: request.expectedState,
196
+ taskId: identity.taskId,
197
+ taskMdPath: identity.taskMdPath,
198
+ actualState: identity.actualState,
199
+ changed: false,
200
+ operations,
201
+ timestamp: metadata?.timestamp ?? null,
202
+ agentInfraVersion: metadata?.agentInfraVersion ?? null,
203
+ error: { code, message }
204
+ };
205
+ }
206
+
207
+ function errorDetails(error: unknown, fallback: TaskWriteErrorCode): TaskWriteError {
208
+ if (error && typeof error === 'object' && 'code' in error && typeof error.code === 'string') {
209
+ return {
210
+ code: error.code as TaskWriteErrorCode,
211
+ message: error instanceof Error ? error.message : String(error)
212
+ };
213
+ }
214
+ return {
215
+ code: fallback,
216
+ message: error instanceof Error ? error.message : String(error)
217
+ };
218
+ }
219
+
220
+ function writeTask(request: TaskWriteRequest, options: TaskWriteOptions = {}): TaskWriteResult {
221
+ const resolved = options.taskLocation
222
+ ? {
223
+ ok: true as const,
224
+ repoRoot: options.taskLocation.repoRoot,
225
+ taskId: options.taskLocation.taskId,
226
+ taskDir: path.dirname(options.taskLocation.taskMdPath),
227
+ taskMdPath: options.taskLocation.taskMdPath,
228
+ state: options.taskLocation.state
229
+ }
230
+ : resolveTaskRef(request.taskRef, { repoRoot: options.repoRoot });
231
+ if (!resolved.ok) {
232
+ return failure(
233
+ request,
234
+ { taskId: resolved.taskId, taskMdPath: null, actualState: null },
235
+ resolved.code,
236
+ resolved.message
237
+ );
238
+ }
239
+ const identity = {
240
+ taskId: resolved.taskId,
241
+ taskMdPath: resolved.taskMdPath,
242
+ actualState: resolved.state
243
+ };
244
+ if (resolved.state !== request.expectedState) {
245
+ return failure(
246
+ request,
247
+ identity,
248
+ 'TASK_STATE_MISMATCH',
249
+ `task ${resolved.taskId} is ${resolved.state}, expected ${request.expectedState}`
250
+ );
251
+ }
252
+
253
+ const io: TaskFileSystem = { ...DEFAULT_FILE_SYSTEM, ...options.fileSystem };
254
+ let original: string;
255
+ let mode: number;
256
+ try {
257
+ original = io.readFileSync(resolved.taskMdPath);
258
+ mode = io.statModeSync(resolved.taskMdPath);
259
+ } catch (error) {
260
+ return failure(
261
+ request,
262
+ identity,
263
+ 'TASK_READ_FAILED',
264
+ error instanceof Error ? error.message : String(error)
265
+ );
266
+ }
267
+
268
+ let candidate = original;
269
+ const operations: TaskOperationSummary[] = [];
270
+ try {
271
+ parseTypedTaskFrontmatter(original);
272
+ if (!Array.isArray(request.mutations)) {
273
+ throw Object.assign(new Error('mutations must be an array'), { code: 'MUTATION_INVALID' });
274
+ }
275
+ for (const [index, mutation] of request.mutations.entries()) {
276
+ if (!mutation || typeof mutation !== 'object' || !('kind' in mutation)) {
277
+ throw Object.assign(new Error(`mutation ${index} is invalid`), { code: 'MUTATION_INVALID' });
278
+ }
279
+ const before = candidate;
280
+ if (mutation.kind === 'frontmatter') {
281
+ candidate = updateTaskFrontmatter(candidate, mutation.set, mutation.remove);
282
+ operations.push({
283
+ index,
284
+ kind: 'frontmatter',
285
+ fields: [...Object.keys(mutation.set), ...(mutation.remove ?? [])],
286
+ wouldChange: candidate !== before
287
+ });
288
+ } else if (mutation.kind === 'section') {
289
+ const result = upsertSection(candidate, mutation);
290
+ candidate = result.content;
291
+ operations.push({
292
+ index,
293
+ kind: 'section',
294
+ heading: result.heading,
295
+ operation: result.operation,
296
+ wouldChange: candidate !== before
297
+ });
298
+ } else if (mutation.kind === 'table-row') {
299
+ const result = mutateTableRow(candidate, mutation);
300
+ candidate = result.content;
301
+ operations.push({
302
+ index,
303
+ kind: 'table-row',
304
+ section: result.section,
305
+ keyColumn: mutation.keyColumn,
306
+ key: mutation.key.trim(),
307
+ operation: result.operation,
308
+ wouldChange: candidate !== before
309
+ });
310
+ } else {
311
+ throw Object.assign(new Error(`mutation ${index} has an unknown kind`), {
312
+ code: 'MUTATION_INVALID'
313
+ });
314
+ }
315
+ }
316
+ } catch (error) {
317
+ const details = errorDetails(error, 'MUTATION_INVALID');
318
+ return failure(request, identity, details.code, details.message);
319
+ }
320
+
321
+ let metadata: TaskWriteMetadata;
322
+ try {
323
+ metadata = (options.metadataProvider ?? captureTaskWriteMetadata)();
324
+ if (
325
+ !metadata ||
326
+ typeof metadata.timestamp !== 'string' ||
327
+ !metadata.timestamp ||
328
+ typeof metadata.agentInfraVersion !== 'string' ||
329
+ !metadata.agentInfraVersion
330
+ ) {
331
+ throw new Error('metadata provider returned invalid metadata');
332
+ }
333
+ } catch (error) {
334
+ return failure(
335
+ request,
336
+ identity,
337
+ 'METADATA_CAPTURE_FAILED',
338
+ error instanceof Error ? error.message : String(error),
339
+ operations
340
+ );
341
+ }
342
+
343
+ if (candidate === original) {
344
+ return {
345
+ status: 'no-op',
346
+ requestRef: request.taskRef,
347
+ expectedState: request.expectedState,
348
+ taskId: resolved.taskId,
349
+ taskMdPath: resolved.taskMdPath,
350
+ actualState: resolved.state,
351
+ changed: false,
352
+ operations,
353
+ timestamp: metadata.timestamp,
354
+ agentInfraVersion: metadata.agentInfraVersion,
355
+ error: null
356
+ };
357
+ }
358
+
359
+ try {
360
+ const beforeMetadata = candidate;
361
+ candidate = updateTaskFrontmatter(candidate, {
362
+ updated_at: metadata.timestamp,
363
+ agent_infra_version: metadata.agentInfraVersion
364
+ });
365
+ operations.push({
366
+ index: -1,
367
+ kind: 'metadata',
368
+ fields: ['updated_at', 'agent_infra_version'],
369
+ wouldChange: candidate !== beforeMetadata
370
+ });
371
+ } catch (error) {
372
+ const details = errorDetails(error, 'TASK_DOCUMENT_INVALID');
373
+ return failure(request, identity, details.code, details.message, operations, metadata);
374
+ }
375
+
376
+ const successBase: TaskWriteSuccessBase = {
377
+ requestRef: request.taskRef,
378
+ expectedState: request.expectedState,
379
+ taskId: resolved.taskId,
380
+ taskMdPath: resolved.taskMdPath,
381
+ actualState: resolved.state,
382
+ operations,
383
+ timestamp: metadata.timestamp,
384
+ agentInfraVersion: metadata.agentInfraVersion,
385
+ error: null
386
+ };
387
+ if (request.dryRun) {
388
+ return { ...successBase, status: 'planned', changed: true };
389
+ }
390
+
391
+ const suffix = (options.randomSuffix ?? (() => Math.random().toString(36).slice(2)))();
392
+ const tempPath = path.join(
393
+ path.dirname(resolved.taskMdPath),
394
+ `.task.md.${process.pid}.${suffix}.tmp`
395
+ );
396
+ let primary: TaskWriteError | null = null;
397
+ let shouldCleanupTemp = false;
398
+ try {
399
+ io.writeFileSync(tempPath, candidate, mode);
400
+ shouldCleanupTemp = true;
401
+ } catch (error) {
402
+ shouldCleanupTemp = (error as NodeJS.ErrnoException).code !== 'EEXIST';
403
+ primary = errorDetails(error, 'TEMP_WRITE_FAILED');
404
+ primary.code = 'TEMP_WRITE_FAILED';
405
+ }
406
+ if (!primary) {
407
+ try {
408
+ io.renameSync(tempPath, resolved.taskMdPath);
409
+ } catch (error) {
410
+ primary = errorDetails(error, 'RENAME_FAILED');
411
+ primary.code = 'RENAME_FAILED';
412
+ }
413
+ }
414
+ if (primary && shouldCleanupTemp) {
415
+ try {
416
+ io.unlinkSync(tempPath);
417
+ } catch (cleanupError) {
418
+ const nodeError = cleanupError as NodeJS.ErrnoException;
419
+ if (nodeError.code !== 'ENOENT') {
420
+ return failure(
421
+ request,
422
+ identity,
423
+ 'TEMP_CLEANUP_FAILED',
424
+ `${primary.code}: ${primary.message}; failed to clean ${tempPath}: ${nodeError.message}`,
425
+ operations,
426
+ metadata
427
+ );
428
+ }
429
+ }
430
+ }
431
+ if (primary) {
432
+ return failure(
433
+ request,
434
+ identity,
435
+ primary.code,
436
+ primary.message,
437
+ operations,
438
+ metadata
439
+ );
440
+ }
441
+ return { ...successBase, status: 'applied', changed: true };
442
+ }
443
+
444
+ export { writeTask, captureTaskWriteMetadata, canonicalTimestamp };
445
+ export type {
446
+ FrontmatterMutation,
447
+ SectionMutation,
448
+ TaskMutation,
449
+ TaskWriteRequest,
450
+ TaskOperationSummary,
451
+ TaskWriteMetadata,
452
+ TaskWriteErrorCode,
453
+ TaskWriteError,
454
+ TaskWritePlanned,
455
+ TaskWriteApplied,
456
+ TaskWriteNoOp,
457
+ TaskWriteFailed,
458
+ TaskWriteResult,
459
+ TaskFileSystem,
460
+ TaskWriteOptions
461
+ };
462
+ export type { FrontmatterScalar } from './frontmatter.ts';
463
+ export type { ResolveTaskRefErrorCode, TaskWorkspaceState } from './resolve-ref.ts';
464
+ export type {
465
+ TableRowBase,
466
+ TableRowUpsertMutation,
467
+ TableRowDeleteMutation
468
+ } from './sections.ts';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fitlab-ai/agent-infra",
3
- "version": "0.8.5",
3
+ "version": "0.9.1",
4
4
  "description": "Bootstrap tool for AI multi-tool collaboration infrastructure — works with Claude Code, Codex, Gemini CLI, and OpenCode",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -19,7 +19,8 @@
19
19
  },
20
20
  "bin": {
21
21
  "agent-infra": "./dist/bin/cli.js",
22
- "ai": "./dist/bin/cli.js"
22
+ "ai": "./dist/bin/cli.js",
23
+ "agent-infra-internal": "./dist/bin/internal-cli.js"
23
24
  },
24
25
  "files": [
25
26
  "dist/",
@@ -59,6 +60,7 @@
59
60
  "typecheck": "tsc -p tsconfig.test.json --noEmit && tsc -p tsconfig.jschecks.json --noEmit",
60
61
  "test:smoke": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/unit/**/*.test.ts\"",
61
62
  "test:core": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/unit/**/*.test.ts\" \"tests/integration/**/*.test.ts\"",
63
+ "test:integration": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/integration/**/*.test.ts\" \"tests/e2e/**/*.test.ts\"",
62
64
  "check": "npm run typecheck && npm test",
63
65
  "test": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/**/*.test.ts\"",
64
66
  "test:coverage": "npm run build && node --experimental-strip-types --no-warnings --test --experimental-test-coverage \"--test-coverage-exclude=tests/**\" --test-reporter=spec --test-reporter-destination=stdout --test-reporter=lcov --test-reporter-destination=coverage.lcov \"tests/**/*.test.ts\"",
@@ -400,14 +400,15 @@ When writing or updating `.agents/skills/*/SKILL.md` files and their templates,
400
400
  For skills that produce structured artifacts or mutate task state, run the verification gate before claiming completion:
401
401
 
402
402
  ```bash
403
- node .agents/scripts/validate-artifact.js gate <skill-name> <task-dir> [artifact-file] [--format json|text]
403
+ agent-infra-internal task-verify {task-id} <verification-event> [--artifact <artifact>] --format text
404
404
  ```
405
405
 
406
406
  - Each skill declares its own checks in `config/verify.json`; keep the file focused on what that skill must validate
407
+ - The typed verification catalog maps business events to skill, workspace, artifact, and gate/check order; callers must not assemble those mechanical parameters
407
408
  - For language-specific artifact headings or anchors, keep only `required_sections` and language-specific `required_patterns` different between `config/verify.en.json` and `config/verify.zh-CN.json`
408
409
  - If a skill also prints next-step guidance, run the gate first and only show those instructions after the gate passes
409
- - For user-facing final validation, prefer `--format text` so the reply contains a readable summary instead of raw JSON
410
- - Shared validation logic belongs in `.agents/scripts/validate-artifact.js`; do not move detailed rules back into SKILL.md
410
+ - Use `--format text` for readable user-facing final validation
411
+ - `task-verify` executes the typed catalog/check registry in-process; skills must not duplicate validation algorithms or pass mechanical check sequences
411
412
  - Keep the gate output in the reply as fresh evidence; without output from the current run, do not claim completion
412
413
 
413
414
  ## FAQ
@@ -400,14 +400,15 @@ disable-model-invocation: true # 可选;由支持该能力的 TUI 适配器
400
400
  对会产生结构化产物或任务状态变更的 skill,统一在结束前运行完成校验:
401
401
 
402
402
  ```bash
403
- node .agents/scripts/validate-artifact.js gate <skill-name> <task-dir> [artifact-file] [--format json|text]
403
+ agent-infra-internal task-verify {task-id} <verification-event> [--artifact <artifact>] --format text
404
404
  ```
405
405
 
406
406
  - 每个 skill 在自己的 `config/verify.json` 中声明需要检查的事项
407
+ - typed verification catalog 将业务事件映射到 skill、workspace、artifact 和 gate/check 顺序;调用方不得自行拼接这些机械参数
407
408
  - 对语言相关的产物标题或锚点,`config/verify.en.json` 和 `config/verify.zh-CN.json` 之间只应让 `required_sections` 与语言相关的 `required_patterns` 不同
408
409
  - 如果 skill 还会展示“下一步”提示,必须先通过完成校验,再输出这些指引
409
- - 面向用户展示最终校验结果时,优先使用 `--format text` 输出可读摘要,而不是原始 JSON
410
- - 共享逻辑集中在 `.agents/scripts/validate-artifact.js`,不要把详细校验规则重新塞回 SKILL.md
410
+ - 面向用户展示最终校验结果时使用 `--format text` 输出可读摘要
411
+ - `task-verify` 在进程内按 typed catalog/check registry 执行;SKILL 不得复制校验算法或传机械 check 序列
411
412
  - 在回复中保留当次校验输出作为当次验证输出;没有当次校验输出,不得声明完成
412
413
 
413
414
  ## 常见问题
@@ -15,18 +15,19 @@ so you can quickly find "which ones to read" without opening each file.
15
15
 
16
16
  ## Issue / PR
17
17
 
18
- - [`issue-pr-commands.md`](issue-pr-commands.md) — GitHub commands to verify auth and read/write Issues / PRs.
18
+ - [`issue-pr-commands.md`](issue-pr-commands.md) — PR commands and Issue intent entry points.
19
19
  - [`pr-checks-commands.md`](pr-checks-commands.md) — Commands to watch PR required checks and pull failure logs (`watch-pr`).
20
- - [`create-issue.md`](create-issue.md) — Cascading Issue creation after `create-task` writes `task.md`.
21
- - [`issue-sync.md`](issue-sync.md) — Sync markers and flow for task artifacts ↔ Issue comments / labels / fields.
22
- - [`issue-fields.md`](issue-fields.md) — Read/write flow for Issue Type pinned fields (Priority/Effort/dates).
20
+ - [`create-issue.md`](create-issue.md) — Declarative Issue creation after `create-task` writes `task.md`.
21
+ - [`issue-sync.md`](issue-sync.md) — Issue comment markers and declarative metadata intent contract.
22
+ - [`issue-fields.md`](issue-fields.md) — Dynamic Issue Type pinned-field mapping boundary.
23
23
  - [`pr-sync.md`](pr-sync.md) — Sync rule for the single reviewer-facing PR summary comment.
24
24
 
25
25
  ## Task Workflow
26
26
 
27
27
  - [`task-management.md`](task-management.md) — Task intent detection and workflow-command mapping.
28
28
  - [`review-handshake.md`](review-handshake.md) — Three-stage bidirectional review handshake: four-state disposition, symmetric evidence, disagreement ledger, convergence and post-review commit gate.
29
- - [`task-short-id.md`](task-short-id.md) — Resolution, allocation and lifecycle of `#NN` / bare-number short ids.
29
+ - [`human-decision-context.md`](human-decision-context.md) — Self-contained context and canonical structure for new human-decision details.
30
+ - [`task-short-id.md`](task-short-id.md) — Resolution, allocation and lifecycle of bare-number short ids.
30
31
  - [`milestone-inference.md`](milestone-inference.md) — Milestone inference for create-task / code-task / create-pr.
31
32
  - [`label-milestone-setup.md`](label-milestone-setup.md) — Platform commands to initialize labels / milestones.
32
33
  - [`security-alerts.md`](security-alerts.md) — Commands to import / close Dependabot and Code Scanning alerts.
@@ -14,18 +14,19 @@
14
14
 
15
15
  ## Issue / PR
16
16
 
17
- - [`issue-pr-commands.md`](issue-pr-commands.md) — 验证平台认证、读写 Issue / PR 的 GitHub 命令集。
17
+ - [`issue-pr-commands.md`](issue-pr-commands.md) — PR 命令集与 Issue intent 入口说明。
18
18
  - [`pr-checks-commands.md`](pr-checks-commands.md) — 监控 PR required checks、拉取失败日志的命令集(`watch-pr`)。
19
- - [`create-issue.md`](create-issue.md) — `create-task` 落盘后级联创建 Issue 的规则。
20
- - [`issue-sync.md`](issue-sync.md) — task 产物与 Issue 评论 / 标签 / 字段的同步标记与流程。
21
- - [`issue-fields.md`](issue-fields.md) — Issue Type pinned 字段(Priority/Effort/日期)的读写流程。
19
+ - [`create-issue.md`](create-issue.md) — `create-task` 落盘后的声明式 Issue 创建 intent。
20
+ - [`issue-sync.md`](issue-sync.md) — Issue 评论 marker 与声明式元数据 intent 契约。
21
+ - [`issue-fields.md`](issue-fields.md) — 动态 Issue Type pinned 字段映射边界。
22
22
  - [`pr-sync.md`](pr-sync.md) — 面向 reviewer 的唯一 PR 摘要评论的同步规则。
23
23
 
24
24
  ## 任务工作流
25
25
 
26
26
  - [`task-management.md`](task-management.md) — 任务语义识别与工作流命令映射。
27
27
  - [`review-handshake.md`](review-handshake.md) — 三阶段双向审查握手协议:四态处置、对称证据、分歧账本、收敛与 post-review commit 门禁。
28
- - [`task-short-id.md`](task-short-id.md) — 任务短号 `#NN` / 裸数字的解析、分配与生命周期。
28
+ - [`human-decision-context.md`](human-decision-context.md) — 新建人工裁决详情的自足上下文与规范结构。
29
+ - [`task-short-id.md`](task-short-id.md) — 裸数字任务短号的解析、分配与生命周期。
29
30
  - [`milestone-inference.md`](milestone-inference.md) — create-task / code-task / create-pr 的 milestone 推断。
30
31
  - [`label-milestone-setup.md`](label-milestone-setup.md) — 初始化 label / milestone 的平台命令集。
31
32
  - [`security-alerts.md`](security-alerts.md) — 导入 / 关闭 Dependabot 与 Code Scanning 告警的命令集。
@@ -1,5 +1,5 @@
1
1
  # Issue Creation
2
2
 
3
- This code platform does not provide an Issue creation rule.
3
+ This code platform does not provide an Issue adapter. `platform-issue create` returns a structured no-op/degraded result.
4
4
 
5
5
  `create-task` skips the cascade Issue creation step on this platform; the local `task.md` remains a valid artifact. If you later want to bind the task to an Issue, manually write `issue_number` into `task.md` and the subsequent skills (`commit` / `code-task` / `complete-task`, etc.) will pick up Issue metadata syncing through the existing cascade rules.