@fitlab-ai/agent-infra 0.8.4 → 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 (443) 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 +9 -0
  6. package/dist/lib/git/review-snapshot.js +79 -0
  7. package/dist/lib/git/workflow.js +101 -0
  8. package/dist/lib/init.js +5 -0
  9. package/dist/lib/internal/git-workflow.js +42 -0
  10. package/dist/lib/internal/platform-checks.js +119 -0
  11. package/dist/lib/internal/platform-comment.js +129 -0
  12. package/dist/lib/internal/platform-context.js +46 -0
  13. package/dist/lib/internal/platform-issue.js +142 -0
  14. package/dist/lib/internal/platform-pr.js +146 -0
  15. package/dist/lib/internal/release-workflow.js +217 -0
  16. package/dist/lib/internal/task-artifact.js +67 -0
  17. package/dist/lib/internal/task-context.js +43 -0
  18. package/dist/lib/internal/task-event.js +70 -0
  19. package/dist/lib/internal/task-ledger.js +114 -0
  20. package/dist/lib/internal/task-lifecycle.js +58 -0
  21. package/dist/lib/internal/task-short-id.js +83 -0
  22. package/dist/lib/internal/task-snapshot.js +47 -0
  23. package/dist/lib/internal/task-verify.js +50 -0
  24. package/dist/lib/internal/task-warning.js +74 -0
  25. package/dist/lib/platform/adapters.js +14 -0
  26. package/dist/lib/platform/context.js +146 -0
  27. package/dist/lib/platform/github-client.js +124 -0
  28. package/dist/lib/platform/issue-comments.js +409 -0
  29. package/dist/lib/platform/issue-metadata.js +183 -0
  30. package/dist/lib/platform/issues.js +617 -0
  31. package/dist/lib/platform/metadata-labels.js +28 -0
  32. package/dist/lib/platform/pr-checks.js +216 -0
  33. package/dist/lib/platform/pr-summary.js +88 -0
  34. package/dist/lib/platform/pull-request-metadata.js +38 -0
  35. package/dist/lib/platform/pull-requests.js +338 -0
  36. package/dist/lib/platform/releases.js +82 -0
  37. package/dist/lib/platform/types.js +22 -0
  38. package/dist/lib/platform/verification-required.js +78 -0
  39. package/dist/lib/platform/verification-sync.js +1014 -0
  40. package/dist/lib/platform/verification.js +6 -0
  41. package/dist/lib/release/channels.js +31 -0
  42. package/dist/lib/release/workflow.js +32 -0
  43. package/dist/lib/render.js +3 -2
  44. package/dist/lib/run/index.js +24 -7
  45. package/dist/lib/sandbox/capture.js +25 -3
  46. package/dist/lib/sandbox/commands/create.js +66 -26
  47. package/dist/lib/sandbox/commands/enter.js +34 -11
  48. package/dist/lib/sandbox/commands/list-running.js +10 -8
  49. package/dist/lib/sandbox/commands/show.js +2 -2
  50. package/dist/lib/sandbox/commands/start.js +53 -15
  51. package/dist/lib/sandbox/engine.js +33 -3
  52. package/dist/lib/sandbox/engines/colima.js +2 -2
  53. package/dist/lib/sandbox/index.js +6 -6
  54. package/dist/lib/sandbox/mounts.js +36 -0
  55. package/dist/lib/sandbox/recovery.js +562 -0
  56. package/dist/lib/sandbox/runtimes/base.dockerfile +4 -0
  57. package/dist/lib/sandbox/task-resolver.js +5 -1
  58. package/dist/lib/sandbox/tools.js +19 -0
  59. package/dist/lib/server/daemon.js +9 -0
  60. package/dist/lib/server/process-control.js +66 -73
  61. package/dist/lib/server/process-state.js +168 -0
  62. package/dist/lib/server/protocol.js +5 -5
  63. package/dist/lib/task/activity-log.js +61 -0
  64. package/dist/lib/task/artifact-lifecycle.js +427 -0
  65. package/dist/lib/task/command-options.js +30 -0
  66. package/dist/lib/task/commands/cat.js +36 -6
  67. package/dist/lib/task/commands/decisions.js +80 -46
  68. package/dist/lib/task/commands/files.js +21 -7
  69. package/dist/lib/task/commands/grep.js +55 -7
  70. package/dist/lib/task/commands/issue-body.js +23 -14
  71. package/dist/lib/task/commands/log.js +27 -70
  72. package/dist/lib/task/commands/show.js +20 -7
  73. package/dist/lib/task/commands/status.js +18 -8
  74. package/dist/lib/task/decision-intents.js +154 -0
  75. package/dist/lib/task/decision-items.js +53 -0
  76. package/dist/lib/task/events.js +318 -0
  77. package/dist/lib/task/frontmatter.js +159 -1
  78. package/dist/lib/task/implementation-inputs.js +117 -0
  79. package/dist/lib/task/index.js +12 -9
  80. package/dist/lib/task/issue-form.js +19 -6
  81. package/dist/lib/task/ledger-intents.js +185 -0
  82. package/dist/lib/task/ledger.js +65 -35
  83. package/dist/lib/task/lifecycle.js +484 -0
  84. package/dist/lib/task/resolve-ref.js +152 -32
  85. package/dist/lib/task/review-artifacts.js +101 -0
  86. package/dist/lib/task/review-fingerprint.js +46 -0
  87. package/dist/lib/task/sections.js +358 -4
  88. package/dist/lib/task/short-id.js +292 -7
  89. package/dist/lib/task/snapshot.js +95 -0
  90. package/dist/lib/task/verification-checks.js +8 -0
  91. package/dist/lib/task/verification-config.js +14 -0
  92. package/dist/lib/task/verification-engine.js +906 -0
  93. package/dist/lib/task/verification-review.js +3 -0
  94. package/dist/lib/task/verification-types.js +2 -0
  95. package/dist/lib/task/verification.js +113 -0
  96. package/dist/lib/task/workflow-warning-intents.js +131 -0
  97. package/dist/lib/task/workflow-warnings.js +10 -78
  98. package/dist/lib/task/write.js +241 -0
  99. package/dist/lib/update.js +2 -0
  100. package/lib/decide.ts +57 -97
  101. package/lib/defaults.json +9 -0
  102. package/lib/git/review-snapshot.ts +73 -0
  103. package/lib/git/workflow.ts +101 -0
  104. package/lib/init.ts +9 -0
  105. package/lib/internal/git-workflow.ts +37 -0
  106. package/lib/internal/platform-checks.ts +101 -0
  107. package/lib/internal/platform-comment.ts +99 -0
  108. package/lib/internal/platform-context.ts +33 -0
  109. package/lib/internal/platform-issue.ts +116 -0
  110. package/lib/internal/platform-pr.ts +119 -0
  111. package/lib/internal/release-workflow.ts +186 -0
  112. package/lib/internal/task-artifact.ts +47 -0
  113. package/lib/internal/task-context.ts +35 -0
  114. package/lib/internal/task-event.ts +51 -0
  115. package/lib/internal/task-ledger.ts +86 -0
  116. package/lib/internal/task-lifecycle.ts +41 -0
  117. package/lib/internal/task-short-id.ts +55 -0
  118. package/lib/internal/task-snapshot.ts +32 -0
  119. package/lib/internal/task-verify.ts +33 -0
  120. package/lib/internal/task-warning.ts +50 -0
  121. package/lib/platform/adapters.ts +30 -0
  122. package/lib/platform/context.ts +164 -0
  123. package/lib/platform/github-client.ts +146 -0
  124. package/lib/platform/issue-comments.ts +479 -0
  125. package/lib/platform/issue-metadata.ts +250 -0
  126. package/lib/platform/issues.ts +691 -0
  127. package/lib/platform/metadata-labels.ts +33 -0
  128. package/lib/platform/pr-checks.ts +246 -0
  129. package/lib/platform/pr-summary.ts +90 -0
  130. package/lib/platform/pull-request-metadata.ts +69 -0
  131. package/lib/platform/pull-requests.ts +380 -0
  132. package/lib/platform/releases.ts +71 -0
  133. package/lib/platform/types.ts +74 -0
  134. package/lib/platform/verification-required.ts +83 -0
  135. package/{templates/.agents/scripts/platform-adapters/platform-sync.github.js → lib/platform/verification-sync.ts} +221 -363
  136. package/lib/platform/verification.ts +11 -0
  137. package/lib/release/channels.ts +30 -0
  138. package/lib/release/workflow.ts +31 -0
  139. package/lib/render.ts +3 -2
  140. package/lib/run/index.ts +25 -7
  141. package/lib/sandbox/capture.ts +29 -3
  142. package/lib/sandbox/commands/create.ts +75 -28
  143. package/lib/sandbox/commands/enter.ts +38 -11
  144. package/lib/sandbox/commands/list-running.ts +10 -8
  145. package/lib/sandbox/commands/show.ts +2 -2
  146. package/lib/sandbox/commands/start.ts +50 -16
  147. package/lib/sandbox/engine.ts +37 -3
  148. package/lib/sandbox/engines/colima.ts +2 -2
  149. package/lib/sandbox/index.ts +6 -6
  150. package/lib/sandbox/mounts.ts +55 -0
  151. package/lib/sandbox/recovery.ts +828 -0
  152. package/lib/sandbox/runtimes/base.dockerfile +4 -0
  153. package/lib/sandbox/task-resolver.ts +5 -1
  154. package/lib/sandbox/tools.ts +31 -0
  155. package/lib/server/daemon.ts +9 -0
  156. package/lib/server/process-control.ts +70 -71
  157. package/lib/server/process-state.ts +183 -0
  158. package/lib/server/protocol.ts +5 -5
  159. package/lib/task/activity-log.ts +62 -0
  160. package/lib/task/artifact-lifecycle.ts +484 -0
  161. package/lib/task/command-options.ts +32 -0
  162. package/lib/task/commands/cat.ts +22 -9
  163. package/lib/task/commands/decisions.ts +49 -47
  164. package/lib/task/commands/files.ts +14 -6
  165. package/lib/task/commands/grep.ts +34 -7
  166. package/lib/task/commands/issue-body.ts +16 -16
  167. package/lib/task/commands/log.ts +17 -70
  168. package/lib/task/commands/show.ts +14 -6
  169. package/lib/task/commands/status.ts +17 -7
  170. package/lib/task/decision-intents.ts +163 -0
  171. package/lib/task/decision-items.ts +64 -0
  172. package/lib/task/events.ts +320 -0
  173. package/lib/task/frontmatter.ts +202 -2
  174. package/lib/task/implementation-inputs.ts +137 -0
  175. package/lib/task/index.ts +12 -9
  176. package/lib/task/issue-form.ts +20 -6
  177. package/lib/task/ledger-intents.ts +201 -0
  178. package/lib/task/ledger.ts +77 -31
  179. package/lib/task/lifecycle.ts +458 -0
  180. package/lib/task/resolve-ref.ts +197 -36
  181. package/{templates/.agents/scripts/lib/review-artifacts.js → lib/task/review-artifacts.ts} +11 -12
  182. package/{templates/.agents/scripts/lib/post-review-commit.js → lib/task/review-fingerprint.ts} +20 -10
  183. package/lib/task/sections.ts +486 -4
  184. package/lib/task/short-id.ts +403 -9
  185. package/lib/task/snapshot.ts +143 -0
  186. package/lib/task/verification-checks.ts +9 -0
  187. package/lib/task/verification-config.ts +20 -0
  188. package/{templates/.agents/scripts/validate-artifact.js → lib/task/verification-engine.ts} +257 -451
  189. package/lib/task/verification-review.ts +9 -0
  190. package/lib/task/verification-types.ts +29 -0
  191. package/lib/task/verification.ts +156 -0
  192. package/lib/task/workflow-warning-intents.ts +142 -0
  193. package/lib/task/workflow-warnings.ts +10 -78
  194. package/lib/task/write.ts +468 -0
  195. package/lib/update.ts +6 -0
  196. package/package.json +5 -2
  197. package/templates/.agents/README.en.md +6 -3
  198. package/templates/.agents/README.zh-CN.md +6 -3
  199. package/templates/.agents/rules/README.en.md +6 -5
  200. package/templates/.agents/rules/README.zh-CN.md +6 -5
  201. package/templates/.agents/rules/create-issue.en.md +1 -1
  202. package/templates/.agents/rules/create-issue.github.en.md +5 -184
  203. package/templates/.agents/rules/create-issue.github.zh-CN.md +12 -178
  204. package/templates/.agents/rules/create-issue.zh-CN.md +1 -1
  205. package/templates/.agents/rules/human-decision-context.en.md +36 -0
  206. package/templates/.agents/rules/human-decision-context.zh-CN.md +36 -0
  207. package/templates/.agents/rules/issue-fields.github.en.md +4 -148
  208. package/templates/.agents/rules/issue-fields.github.zh-CN.md +9 -144
  209. package/templates/.agents/rules/issue-pr-commands.en.md +43 -3
  210. package/templates/.agents/rules/issue-pr-commands.github.en.md +15 -220
  211. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +23 -213
  212. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +45 -3
  213. package/templates/.agents/rules/issue-sync.en.md +1 -1
  214. package/templates/.agents/rules/issue-sync.github.en.md +14 -301
  215. package/templates/.agents/rules/issue-sync.github.zh-CN.md +36 -287
  216. package/templates/.agents/rules/issue-sync.zh-CN.md +1 -1
  217. package/templates/.agents/rules/milestone-inference.en.md +1 -1
  218. package/templates/.agents/rules/milestone-inference.github.en.md +7 -119
  219. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +8 -108
  220. package/templates/.agents/rules/milestone-inference.zh-CN.md +1 -1
  221. package/templates/.agents/rules/next-step-output.en.md +12 -11
  222. package/templates/.agents/rules/next-step-output.zh-CN.md +12 -11
  223. package/templates/.agents/rules/no-mid-flow-questions.en.md +3 -3
  224. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +3 -3
  225. package/templates/.agents/rules/pr-checks-commands.en.md +16 -3
  226. package/templates/.agents/rules/pr-checks-commands.github.en.md +10 -54
  227. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +19 -47
  228. package/templates/.agents/rules/pr-checks-commands.zh-CN.md +30 -3
  229. package/templates/.agents/rules/pr-sync.en.md +30 -3
  230. package/templates/.agents/rules/pr-sync.github.en.md +12 -115
  231. package/templates/.agents/rules/pr-sync.github.zh-CN.md +26 -104
  232. package/templates/.agents/rules/pr-sync.zh-CN.md +43 -3
  233. package/templates/.agents/rules/review-handshake.en.md +13 -9
  234. package/templates/.agents/rules/review-handshake.zh-CN.md +13 -9
  235. package/templates/.agents/rules/task-management.en.md +11 -2
  236. package/templates/.agents/rules/task-management.zh-CN.md +11 -3
  237. package/templates/.agents/rules/task-short-id.en.md +25 -29
  238. package/templates/.agents/rules/task-short-id.zh-CN.md +20 -23
  239. package/templates/.agents/scripts/lib/agent-infra-package.js +141 -0
  240. package/templates/.agents/scripts/task-short-id.js +71 -533
  241. package/templates/.agents/skills/analyze-task/SKILL.en.md +22 -55
  242. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +26 -59
  243. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -3
  244. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -3
  245. package/templates/.agents/skills/block-task/SKILL.en.md +21 -47
  246. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +23 -47
  247. package/templates/.agents/skills/block-task/config/verify.json +1 -2
  248. package/templates/.agents/skills/cancel-task/SKILL.en.md +16 -45
  249. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +16 -45
  250. package/templates/.agents/skills/cancel-task/config/verify.json +1 -2
  251. package/templates/.agents/skills/check-task/SKILL.en.md +6 -3
  252. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +6 -3
  253. package/templates/.agents/skills/close-codescan/SKILL.en.md +6 -24
  254. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +6 -24
  255. package/templates/.agents/skills/close-dependabot/SKILL.en.md +6 -24
  256. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +6 -24
  257. package/templates/.agents/skills/code-task/SKILL.en.md +22 -35
  258. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +28 -44
  259. package/templates/.agents/skills/code-task/config/verify.en.json +3 -3
  260. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +3 -3
  261. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +13 -9
  262. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +13 -9
  263. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +1 -1
  264. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +1 -1
  265. package/templates/.agents/skills/code-task/reference/report-template.en.md +11 -1
  266. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +11 -1
  267. package/templates/.agents/skills/commit/SKILL.en.md +18 -14
  268. package/templates/.agents/skills/commit/SKILL.zh-CN.md +18 -14
  269. package/templates/.agents/skills/commit/config/verify.json +1 -2
  270. package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -11
  271. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -11
  272. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +4 -8
  273. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +4 -8
  274. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +6 -18
  275. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +5 -17
  276. package/templates/.agents/skills/commit/reference/task-status-update.en.md +42 -2
  277. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +42 -2
  278. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +13 -36
  279. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +13 -36
  280. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -3
  281. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -3
  282. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +10 -54
  283. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +10 -79
  284. package/templates/.agents/skills/complete-task/SKILL.en.md +59 -63
  285. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +59 -63
  286. package/templates/.agents/skills/complete-task/config/verify.en.json +11 -6
  287. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +11 -6
  288. package/templates/.agents/skills/create-pr/SKILL.en.md +19 -44
  289. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +19 -43
  290. package/templates/.agents/skills/create-pr/config/verify.json +1 -2
  291. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +8 -12
  292. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +7 -11
  293. package/templates/.agents/skills/create-task/SKILL.en.md +12 -13
  294. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +12 -13
  295. package/templates/.agents/skills/create-task/config/verify.json +1 -2
  296. package/templates/.agents/skills/import-codescan/SKILL.en.md +2 -2
  297. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +2 -2
  298. package/templates/.agents/skills/import-codescan/config/verify.json +1 -2
  299. package/templates/.agents/skills/import-dependabot/SKILL.en.md +2 -2
  300. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +2 -2
  301. package/templates/.agents/skills/import-dependabot/config/verify.json +1 -2
  302. package/templates/.agents/skills/import-issue/SKILL.en.md +9 -13
  303. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -14
  304. package/templates/.agents/skills/import-issue/config/verify.json +1 -2
  305. package/templates/.agents/skills/init-milestones/SKILL.en.md +2 -2
  306. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +2 -2
  307. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +5 -4
  308. package/templates/.agents/skills/plan-task/SKILL.en.md +17 -42
  309. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +22 -49
  310. package/templates/.agents/skills/plan-task/config/verify.en.json +1 -3
  311. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +1 -3
  312. package/templates/.agents/skills/post-release/SKILL.en.md +11 -81
  313. package/templates/.agents/skills/post-release/SKILL.zh-CN.md +8 -78
  314. package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
  315. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
  316. package/templates/.agents/skills/release/SKILL.en.md +16 -163
  317. package/templates/.agents/skills/release/SKILL.zh-CN.md +15 -162
  318. package/templates/.agents/skills/restore-task/SKILL.en.md +11 -29
  319. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +11 -29
  320. package/templates/.agents/skills/restore-task/config/verify.json +1 -2
  321. package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -25
  322. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +13 -33
  323. package/templates/.agents/skills/review-analysis/config/verify.en.json +3 -4
  324. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +3 -4
  325. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +9 -12
  326. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +9 -12
  327. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +9 -2
  328. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +9 -2
  329. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +7 -0
  330. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +7 -0
  331. package/templates/.agents/skills/review-code/SKILL.en.md +22 -36
  332. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +23 -41
  333. package/templates/.agents/skills/review-code/config/verify.en.json +5 -5
  334. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +5 -5
  335. package/templates/.agents/skills/review-code/reference/output-templates.en.md +56 -18
  336. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +56 -18
  337. package/templates/.agents/skills/review-code/reference/report-template.en.md +12 -4
  338. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +12 -4
  339. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +7 -0
  340. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +7 -0
  341. package/templates/.agents/skills/review-plan/SKILL.en.md +13 -25
  342. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +13 -33
  343. package/templates/.agents/skills/review-plan/config/verify.en.json +3 -4
  344. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +3 -4
  345. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +9 -12
  346. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +9 -12
  347. package/templates/.agents/skills/review-plan/reference/report-template.en.md +9 -2
  348. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +9 -2
  349. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +7 -0
  350. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +7 -0
  351. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +6 -3
  352. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +6 -3
  353. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +177 -151
  354. package/templates/.agents/skills/watch-pr/SKILL.en.md +24 -14
  355. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +25 -15
  356. package/templates/.agents/skills/watch-pr/config/verify.json +1 -2
  357. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +2 -2
  358. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +2 -2
  359. package/templates/.agents/templates/task.en.md +6 -1
  360. package/templates/.agents/templates/task.zh-CN.md +6 -1
  361. package/templates/.claude/commands/analyze-task.en.md +1 -1
  362. package/templates/.claude/commands/analyze-task.zh-CN.md +1 -1
  363. package/templates/.claude/commands/block-task.en.md +1 -1
  364. package/templates/.claude/commands/block-task.zh-CN.md +1 -1
  365. package/templates/.claude/commands/cancel-task.en.md +1 -1
  366. package/templates/.claude/commands/cancel-task.zh-CN.md +1 -1
  367. package/templates/.claude/commands/check-task.en.md +1 -1
  368. package/templates/.claude/commands/check-task.zh-CN.md +1 -1
  369. package/templates/.claude/commands/code-task.en.md +1 -1
  370. package/templates/.claude/commands/code-task.zh-CN.md +1 -1
  371. package/templates/.claude/commands/commit.en.md +1 -0
  372. package/templates/.claude/commands/commit.zh-CN.md +1 -0
  373. package/templates/.claude/commands/complete-manual-validation.en.md +1 -1
  374. package/templates/.claude/commands/complete-manual-validation.zh-CN.md +1 -1
  375. package/templates/.claude/commands/complete-task.en.md +1 -1
  376. package/templates/.claude/commands/complete-task.zh-CN.md +1 -1
  377. package/templates/.claude/commands/create-pr.en.md +1 -1
  378. package/templates/.claude/commands/create-pr.zh-CN.md +1 -1
  379. package/templates/.claude/commands/plan-task.en.md +1 -1
  380. package/templates/.claude/commands/plan-task.zh-CN.md +1 -1
  381. package/templates/.claude/commands/review-analysis.en.md +1 -1
  382. package/templates/.claude/commands/review-analysis.zh-CN.md +1 -1
  383. package/templates/.claude/commands/review-code.en.md +1 -1
  384. package/templates/.claude/commands/review-code.zh-CN.md +1 -1
  385. package/templates/.claude/commands/review-plan.en.md +1 -1
  386. package/templates/.claude/commands/review-plan.zh-CN.md +1 -1
  387. package/templates/.claude/commands/watch-pr.en.md +1 -1
  388. package/templates/.claude/commands/watch-pr.zh-CN.md +1 -1
  389. package/templates/.gemini/commands/_project_/analyze-task.en.toml +2 -0
  390. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +2 -0
  391. package/templates/.gemini/commands/_project_/block-task.en.toml +2 -0
  392. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +2 -0
  393. package/templates/.gemini/commands/_project_/cancel-task.en.toml +2 -0
  394. package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +2 -0
  395. package/templates/.gemini/commands/_project_/check-task.en.toml +2 -0
  396. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +2 -0
  397. package/templates/.gemini/commands/_project_/code-task.en.toml +2 -0
  398. package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +2 -0
  399. package/templates/.gemini/commands/_project_/commit.en.toml +4 -0
  400. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +4 -0
  401. package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +2 -0
  402. package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +2 -0
  403. package/templates/.gemini/commands/_project_/complete-task.en.toml +2 -0
  404. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +2 -0
  405. package/templates/.gemini/commands/_project_/create-pr.en.toml +2 -0
  406. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +2 -0
  407. package/templates/.gemini/commands/_project_/plan-task.en.toml +2 -0
  408. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +2 -0
  409. package/templates/.gemini/commands/_project_/review-analysis.en.toml +2 -0
  410. package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +2 -0
  411. package/templates/.gemini/commands/_project_/review-code.en.toml +2 -0
  412. package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +2 -0
  413. package/templates/.gemini/commands/_project_/review-plan.en.toml +2 -0
  414. package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +2 -0
  415. package/templates/.gemini/commands/_project_/watch-pr.en.toml +2 -0
  416. package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +2 -0
  417. package/templates/.git-hooks/check-large-files.cjs +92 -0
  418. package/templates/.git-hooks/check-version-format.sh +5 -1
  419. package/templates/.git-hooks/pre-commit +1 -0
  420. package/templates/.opencode/commands/analyze-task.en.md +1 -1
  421. package/templates/.opencode/commands/analyze-task.zh-CN.md +1 -1
  422. package/templates/.opencode/commands/check-task.en.md +1 -1
  423. package/templates/.opencode/commands/check-task.zh-CN.md +1 -1
  424. package/templates/.opencode/commands/code-task.en.md +1 -1
  425. package/templates/.opencode/commands/code-task.zh-CN.md +1 -1
  426. package/templates/.opencode/commands/commit.en.md +2 -0
  427. package/templates/.opencode/commands/commit.zh-CN.md +2 -0
  428. package/templates/.opencode/commands/complete-task.en.md +1 -1
  429. package/templates/.opencode/commands/complete-task.zh-CN.md +1 -1
  430. package/templates/.opencode/commands/plan-task.en.md +1 -1
  431. package/templates/.opencode/commands/plan-task.zh-CN.md +1 -1
  432. package/templates/.opencode/commands/review-analysis.en.md +1 -1
  433. package/templates/.opencode/commands/review-analysis.zh-CN.md +1 -1
  434. package/templates/.opencode/commands/review-code.en.md +1 -1
  435. package/templates/.opencode/commands/review-code.zh-CN.md +1 -1
  436. package/templates/.opencode/commands/review-plan.en.md +1 -1
  437. package/templates/.opencode/commands/review-plan.zh-CN.md +1 -1
  438. package/templates/.agents/scripts/platform-adapters/platform-sync.js +0 -13
  439. package/templates/.agents/scripts/review-diff-fingerprint.js +0 -99
  440. package/templates/.agents/scripts/workflow-warnings.js +0 -290
  441. package/templates/.agents/skills/code-task/scripts/detect-mode.js +0 -257
  442. package/templates/.agents/skills/release/scripts/manage-milestones.github.sh +0 -80
  443. 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/lib/update.ts CHANGED
@@ -194,6 +194,12 @@ async function cmdUpdate(): Promise<void> {
194
194
  platformType
195
195
  );
196
196
  ok('Updated .agents/skills/update-agent-infra/');
197
+ renderFile(
198
+ path.join(templateDir, '.agents', 'scripts', 'lib', 'agent-infra-package.js'),
199
+ path.join('.agents', 'scripts', 'lib', 'agent-infra-package.js'),
200
+ replacements
201
+ );
202
+ ok('Updated .agents/scripts/lib/agent-infra-package.js');
197
203
  try {
198
204
  fs.unlinkSync(path.join('.agents', 'skills', 'update-agent-infra', 'scripts', 'sync-templates.cjs'));
199
205
  } catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fitlab-ai/agent-infra",
3
- "version": "0.8.4",
3
+ "version": "0.9.0",
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,13 +19,15 @@
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/",
26
27
  "!dist/**/*.map",
27
28
  "bin/cli.ts",
28
29
  "lib/",
30
+ "runtime/",
29
31
  "templates/"
30
32
  ],
31
33
  "engines": {
@@ -58,6 +60,7 @@
58
60
  "typecheck": "tsc -p tsconfig.test.json --noEmit && tsc -p tsconfig.jschecks.json --noEmit",
59
61
  "test:smoke": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/unit/**/*.test.ts\"",
60
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\"",
61
64
  "check": "npm run typecheck && npm test",
62
65
  "test": "npm run build && node --experimental-strip-types --no-warnings --test \"tests/**/*.test.ts\"",
63
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\"",
@@ -209,6 +209,8 @@ The `files` field in `.agents/.airc.json` groups project files into three catego
209
209
  | `merged` | Merge semantically by AI or humans | Do not write from the template | Keep the local project copy |
210
210
  | `ejected` | May be created from the template first; skip overwrite once it exists | Do not write from the template | Keep the local project copy |
211
211
 
212
+ Ordinary `managed` files keep their overwrite semantics. A small set of platform lifecycle workflows can be registered as guarded managed files. The synchronizer stores each rendered source SHA-256 in `files.managedBaselines` and uses a three-way comparison: accept template-only upgrades, preserve user-only changes, and report a conflict without overwriting when both sides changed or the origin is unknown. This mapping is tool-maintained and should not be edited manually.
213
+
212
214
  `ejected` has two common uses:
213
215
 
214
216
  1. **Taking over a built-in file**: the project needs full control over a rule, command, or config file that originally came from the template.
@@ -398,14 +400,15 @@ When writing or updating `.agents/skills/*/SKILL.md` files and their templates,
398
400
  For skills that produce structured artifacts or mutate task state, run the verification gate before claiming completion:
399
401
 
400
402
  ```bash
401
- 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
402
404
  ```
403
405
 
404
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
405
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`
406
409
  - If a skill also prints next-step guidance, run the gate first and only show those instructions after the gate passes
407
- - For user-facing final validation, prefer `--format text` so the reply contains a readable summary instead of raw JSON
408
- - 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
409
412
  - Keep the gate output in the reply as fresh evidence; without output from the current run, do not claim completion
410
413
 
411
414
  ## FAQ
@@ -209,6 +209,8 @@ disable-model-invocation: true # 可选;由支持该能力的 TUI 适配器
209
209
  | `merged` | 由 AI 或人工语义合并 | 不从模板写入 | 保留项目本地副本 |
210
210
  | `ejected` | 首次可从模板创建,已存在时跳过覆盖 | 不从模板写入 | 保留项目本地副本 |
211
211
 
212
+ 普通 `managed` 文件仍采用覆盖语义。少数平台生命周期 workflow 可登记为 guarded managed:同步器在 `files.managedBaselines` 保存渲染后来源的 SHA-256,并用三方比较自动接收官方单边升级、保留用户单边修改,在双方都变化或来源未知时报告冲突而不覆盖。该映射由工具维护,不建议手工编辑。
213
+
212
214
  `ejected` 有两种常见用法:
213
215
 
214
216
  1. **接管内置文件**:项目需要完全控制原本来自模板的规则、命令或配置文件,避免后续同步覆盖本地内容。
@@ -398,14 +400,15 @@ disable-model-invocation: true # 可选;由支持该能力的 TUI 适配器
398
400
  对会产生结构化产物或任务状态变更的 skill,统一在结束前运行完成校验:
399
401
 
400
402
  ```bash
401
- 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
402
404
  ```
403
405
 
404
406
  - 每个 skill 在自己的 `config/verify.json` 中声明需要检查的事项
407
+ - typed verification catalog 将业务事件映射到 skill、workspace、artifact 和 gate/check 顺序;调用方不得自行拼接这些机械参数
405
408
  - 对语言相关的产物标题或锚点,`config/verify.en.json` 和 `config/verify.zh-CN.json` 之间只应让 `required_sections` 与语言相关的 `required_patterns` 不同
406
409
  - 如果 skill 还会展示“下一步”提示,必须先通过完成校验,再输出这些指引
407
- - 面向用户展示最终校验结果时,优先使用 `--format text` 输出可读摘要,而不是原始 JSON
408
- - 共享逻辑集中在 `.agents/scripts/validate-artifact.js`,不要把详细校验规则重新塞回 SKILL.md
410
+ - 面向用户展示最终校验结果时使用 `--format text` 输出可读摘要
411
+ - `task-verify` 在进程内按 typed catalog/check registry 执行;SKILL 不得复制校验算法或传机械 check 序列
409
412
  - 在回复中保留当次校验输出作为当次验证输出;没有当次校验输出,不得声明完成
410
413
 
411
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.