@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,3 @@
1
+ export { extractReviewBaseline, extractReviewDiffFingerprint, extractReviewedSnapshotTree, findAuthoritativeReviewCodeArtifact, parseReviewVerdict, resolvePostReviewGlobs } from './review-fingerprint.js';
2
+ export { parseLedger, summarizeLedgerStage, validateLedgerRows } from './ledger.js';
3
+ //# sourceMappingURL=verification-review.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verification-types.js.map
@@ -0,0 +1,113 @@
1
+ import path from 'node:path';
2
+ // Verification runs in-process; configuration, review parsing and platform
3
+ // checks are provided by typed domain modules without a stdout protocol.
4
+ import { verifyInProcess } from './verification-engine.js';
5
+ import { parseArtifactName } from './artifact-lifecycle.js';
6
+ import { resolveTaskRef } from './resolve-ref.js';
7
+ const gate = (skill, expectedState, artifactFamily) => ({
8
+ skill, expectedState, mode: 'gate', ...(artifactFamily ? { artifactFamily } : {})
9
+ });
10
+ const VERIFICATION_CATALOG = {
11
+ 'analyze.awaiting-input': { skill: 'analyze-task', expectedState: 'active', mode: 'checks', checks: ['task-meta'] },
12
+ 'analyze.completed': gate('analyze-task', 'active', 'analysis'),
13
+ 'review-analysis.completed': gate('review-analysis', 'active', 'review-analysis'),
14
+ 'plan.completed': gate('plan-task', 'active', 'plan'),
15
+ 'review-plan.completed': gate('review-plan', 'active', 'review-plan'),
16
+ 'code.completed': gate('code-task', 'active', 'code'),
17
+ 'review-code.completed': gate('review-code', 'active', 'review-code'),
18
+ 'manual-validation.completed': gate('complete-manual-validation', 'active', 'manual-validation'),
19
+ 'block-task.completed': gate('block-task', 'blocked'),
20
+ 'cancel-task.completed': gate('cancel-task', 'completed'),
21
+ 'commit.completed': gate('commit', 'active'),
22
+ 'complete-task.preflight': { skill: 'complete-task', expectedState: 'active', mode: 'checks', checks: ['review-ledger', 'post-review-commit', 'required-checks', 'platform-sync-preflight'] },
23
+ 'complete-task.completed': gate('complete-task', 'completed'),
24
+ 'create-pr.completed': gate('create-pr', 'active'),
25
+ 'create-task.completed': gate('create-task', 'active'),
26
+ 'import-codescan.completed': gate('import-codescan', 'active'),
27
+ 'import-dependabot.completed': gate('import-dependabot', 'active'),
28
+ 'import-issue.completed': gate('import-issue', 'active'),
29
+ 'watch-pr.completed': gate('watch-pr', 'active')
30
+ };
31
+ function failure(request, code, message, extra = {}) {
32
+ return {
33
+ status: 'failed', changed: false, event: request.event, requestRef: request.taskRef,
34
+ taskId: null, taskDir: null, taskState: null, skill: null, mode: null,
35
+ artifact: request.artifact ?? null, invocations: [], error: { code, message }, ...extra
36
+ };
37
+ }
38
+ function verifyTaskEvent(request, options = {}) {
39
+ const spec = VERIFICATION_CATALOG[request.event];
40
+ if (!spec)
41
+ return failure(request, 'VERIFY_EVENT_UNKNOWN', `unknown verification event '${request.event}'`);
42
+ const resolved = resolveTaskRef(request.taskRef, { repoRoot: options.repoRoot });
43
+ if (!resolved.ok)
44
+ return failure(request, resolved.code, resolved.message, { taskId: resolved.taskId, skill: spec.skill, mode: spec.mode });
45
+ const identity = { taskId: resolved.taskId, taskDir: resolved.taskDir, taskState: resolved.state, skill: spec.skill, mode: spec.mode };
46
+ if (resolved.state !== spec.expectedState) {
47
+ return failure(request, 'VERIFY_TASK_STATE_MISMATCH', `event '${request.event}' requires workspace '${spec.expectedState}', received '${resolved.state}'`, identity);
48
+ }
49
+ if (spec.artifactFamily) {
50
+ if (!request.artifact)
51
+ return failure(request, 'VERIFY_ARTIFACT_REQUIRED', `event '${request.event}' requires an artifact`, identity);
52
+ const parsed = parseArtifactName(request.artifact);
53
+ if (path.basename(request.artifact) !== request.artifact || !parsed || parsed.family !== spec.artifactFamily) {
54
+ return failure(request, 'VERIFY_ARTIFACT_INVALID', `artifact '${request.artifact}' is not a canonical ${spec.artifactFamily} artifact`, identity);
55
+ }
56
+ }
57
+ else if (request.artifact) {
58
+ return failure(request, 'VERIFY_ARTIFACT_UNEXPECTED', `event '${request.event}' does not accept an artifact`, identity);
59
+ }
60
+ const invocations = [];
61
+ const engine = options.engine ?? verifyInProcess;
62
+ if (spec.mode === 'gate') {
63
+ const payload = engine({ mode: 'gate', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [], repositoryRoot: resolved.repoRoot });
64
+ const status = payload.gate;
65
+ invocations.push({ status, exitCode: { pass: 0, fail: 1, blocked: 2 }[status], payload });
66
+ }
67
+ else {
68
+ for (const check of spec.checks ?? []) {
69
+ const payload = engine({ mode: 'checks', skillName: spec.skill, taskDir: resolved.taskDir, artifactFile: request.artifact, checks: [check], repositoryRoot: resolved.repoRoot });
70
+ const status = payload.status;
71
+ invocations.push({ status, exitCode: { pass: 0, fail: 1, blocked: 2 }[status], payload });
72
+ if (status !== 'pass')
73
+ break;
74
+ }
75
+ }
76
+ const status = invocations.some((item) => item.status === 'blocked') ? 'blocked'
77
+ : invocations.some((item) => item.status === 'fail') ? 'fail' : 'pass';
78
+ return {
79
+ status, changed: false, event: request.event, requestRef: request.taskRef,
80
+ ...identity, artifact: request.artifact ?? null, invocations, error: null
81
+ };
82
+ }
83
+ function statusLabel(status) {
84
+ return status === 'fail' ? 'FAIL' : status === 'blocked' ? 'BLOCKED' : 'pass';
85
+ }
86
+ function renderPayload(payload) {
87
+ const lines = [];
88
+ if (Array.isArray(payload.checks)) {
89
+ lines.push(`Verification: ${payload.gate} | Skill: ${payload.skill}`, '');
90
+ for (const check of payload.checks) {
91
+ lines.push(` [${statusLabel(check.status)}] ${check.type} - ${check.message}`);
92
+ }
93
+ lines.push('', `Result: ${payload.summary} - ${payload.action}`);
94
+ }
95
+ else {
96
+ lines.push(`Check: ${payload.status} | Skill: ${payload.skill} | Type: ${payload.type}`, '');
97
+ lines.push(` [${statusLabel(payload.status)}] ${payload.type} - ${payload.message}`);
98
+ const summary = payload.status === 'pass' ? '1 passed, 0 failed'
99
+ : payload.status === 'blocked' ? '0 passed, 0 failed, 1 blocked' : '0 passed, 1 failed';
100
+ const action = payload.status === 'pass' ? 'Requested check passed'
101
+ : payload.status === 'blocked' ? `Resolve blocked ${payload.type} check and re-run check`
102
+ : `Fix ${payload.type} issues and re-run check`;
103
+ lines.push('', `Result: ${summary} - ${action}`);
104
+ }
105
+ return `${lines.join('\n')}\n`;
106
+ }
107
+ function renderTaskVerification(result) {
108
+ if (result.status === 'failed')
109
+ return `Verification failed: ${result.error?.code ?? 'VERIFY_FAILED'} - ${result.error?.message ?? 'unknown error'}\n`;
110
+ return result.invocations.map((invocation) => renderPayload(invocation.payload)).join('');
111
+ }
112
+ export { VERIFICATION_CATALOG, renderTaskVerification, verifyTaskEvent };
113
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1,131 @@
1
+ import fs from 'node:fs';
2
+ import { resolveTaskRef } from './resolve-ref.js';
3
+ import { WORKFLOW_WARNING_COLUMNS, WORKFLOW_WARNING_HEADINGS, WORKFLOW_WARNING_SEVERITIES, WORKFLOW_WARNING_STATUSES, parseWorkflowWarnings } from './workflow-warnings.js';
4
+ import { captureTaskWriteMetadata, writeTask } from './write.js';
5
+ function failed(intent, code, message, taskId = null, entityId = null) {
6
+ return { status: 'failed', changed: false, intent: intent.kind, taskId, entityId, before: null, after: null, warnings: [], operations: [], error: { code, message } };
7
+ }
8
+ function oneLine(value) {
9
+ return value.replace(/\s*\r?\n\s*/g, ' ').trim();
10
+ }
11
+ function nextWarningId(rows) {
12
+ let max = 0;
13
+ for (const row of rows) {
14
+ const match = /^WW-(\d+)$/.exec(row.id);
15
+ if (match)
16
+ max = Math.max(max, Number(match[1]));
17
+ }
18
+ return `WW-${max + 1}`;
19
+ }
20
+ function validateRows(rows) {
21
+ const ids = new Set();
22
+ for (const row of rows) {
23
+ if (!/^WW-[1-9]\d*$/.test(row.id))
24
+ return { code: 'WARNING_ID_INVALID', message: `warning id '${row.id}' is invalid` };
25
+ if (ids.has(row.id))
26
+ return { code: 'WARNING_DUPLICATE_ID', message: `duplicate warning id '${row.id}'` };
27
+ ids.add(row.id);
28
+ if (!WORKFLOW_WARNING_SEVERITIES.has(row.severity) || !WORKFLOW_WARNING_STATUSES.has(row.status))
29
+ return { code: 'WARNING_DOCUMENT_INVALID', message: `warning '${row.id}' has invalid severity or status` };
30
+ }
31
+ return null;
32
+ }
33
+ function sectionMutation(content) {
34
+ if (/^##\s+(工作流告警|Workflow Warnings)\s*$/m.test(content))
35
+ return [];
36
+ const english = /^##\s+Activity Log\s*$/m.test(content);
37
+ return [{
38
+ kind: 'section', aliases: WORKFLOW_WARNING_HEADINGS, heading: english ? 'Workflow Warnings' : '工作流告警',
39
+ body: `| ${WORKFLOW_WARNING_COLUMNS.join(' | ')} |\n|----|------|------|----------|------|--------|--------|---------|--------|-------------|------------|`
40
+ }];
41
+ }
42
+ function rowMutation(row) {
43
+ return {
44
+ kind: 'table-row', action: 'upsert', sectionAliases: WORKFLOW_WARNING_HEADINGS,
45
+ columns: WORKFLOW_WARNING_COLUMNS, keyColumn: 'id', key: row.id,
46
+ values: {
47
+ time: row.time, step: row.step, severity: row.severity, code: row.code, status: row.status,
48
+ target: row.target, message: row.message, action: row.action,
49
+ resolved_at: row.resolvedAt, resolution: row.resolution
50
+ }
51
+ };
52
+ }
53
+ function applyWorkflowWarningIntent(intent, options = {}) {
54
+ const resolved = resolveTaskRef(intent.taskRef, { repoRoot: options.repoRoot });
55
+ if (!resolved.ok)
56
+ return failed(intent, resolved.code, resolved.message, resolved.taskId);
57
+ if (resolved.state !== 'active')
58
+ return failed(intent, 'TASK_STATE_MISMATCH', `task ${resolved.taskId} is ${resolved.state}, expected active`, resolved.taskId);
59
+ let content;
60
+ let rows;
61
+ try {
62
+ content = fs.readFileSync(resolved.taskMdPath, 'utf8');
63
+ rows = parseWorkflowWarnings(content);
64
+ }
65
+ catch (error) {
66
+ const code = error && typeof error === 'object' && 'code' in error ? String(error.code) : 'WARNING_DOCUMENT_INVALID';
67
+ return failed(intent, code, error instanceof Error ? error.message : String(error), resolved.taskId);
68
+ }
69
+ const invalid = validateRows(rows);
70
+ if (invalid)
71
+ return failed(intent, invalid.code, invalid.message, resolved.taskId);
72
+ if (intent.kind === 'list') {
73
+ if (intent.status && !WORKFLOW_WARNING_STATUSES.has(intent.status))
74
+ return failed(intent, 'WARNING_PAYLOAD_INVALID', 'warning status is invalid', resolved.taskId);
75
+ const warnings = rows.filter((row) => !intent.status || row.status === intent.status);
76
+ return { status: 'no-op', changed: false, intent: intent.kind, taskId: resolved.taskId, entityId: null, before: null, after: null, warnings, operations: [], error: null };
77
+ }
78
+ let metadata;
79
+ try {
80
+ metadata = (options.metadataProvider ?? captureTaskWriteMetadata)();
81
+ }
82
+ catch (error) {
83
+ return failed(intent, 'METADATA_CAPTURE_FAILED', error instanceof Error ? error.message : String(error), resolved.taskId);
84
+ }
85
+ let before;
86
+ let after;
87
+ if (intent.kind === 'add') {
88
+ const step = oneLine(intent.step);
89
+ const code = oneLine(intent.code);
90
+ const target = oneLine(intent.target);
91
+ const message = oneLine(intent.message);
92
+ const action = oneLine(intent.action);
93
+ if (!step || !code || !target || !message || !action || !WORKFLOW_WARNING_SEVERITIES.has(intent.severity)) {
94
+ return failed(intent, 'WARNING_PAYLOAD_INVALID', 'warning add payload is invalid', resolved.taskId);
95
+ }
96
+ before = rows.find((row) => row.status === 'open' && row.step === step && row.code === code && row.target === target) ?? null;
97
+ after = before
98
+ ? { ...before, severity: intent.severity, message, action }
99
+ : { id: nextWarningId(rows), time: metadata.timestamp, step, severity: intent.severity, code, status: 'open', target, message, action, resolvedAt: '', resolution: '' };
100
+ }
101
+ else {
102
+ if (!/^WW-[1-9]\d*$/.test(intent.id) || !['resolved', 'ignored'].includes(intent.status) || !oneLine(intent.resolution)) {
103
+ return failed(intent, 'WARNING_PAYLOAD_INVALID', 'warning status payload is invalid', resolved.taskId, intent.id);
104
+ }
105
+ before = rows.find((row) => row.id === intent.id) ?? null;
106
+ if (!before)
107
+ return failed(intent, 'WARNING_NOT_FOUND', `warning '${intent.id}' was not found`, resolved.taskId, intent.id);
108
+ const resolution = oneLine(intent.resolution);
109
+ if (before.status === intent.status && before.resolution === resolution)
110
+ after = { ...before };
111
+ else if (before.status !== 'open')
112
+ return failed(intent, 'WARNING_TRANSITION_INVALID', `warning '${intent.id}' cannot transition from ${before.status}`, resolved.taskId, intent.id);
113
+ else
114
+ after = { ...before, status: intent.status, resolvedAt: metadata.timestamp, resolution };
115
+ }
116
+ const writeResult = writeTask({
117
+ taskRef: intent.taskRef, expectedState: 'active', mutations: [...sectionMutation(content), rowMutation(after)], dryRun: intent.dryRun
118
+ }, {
119
+ ...options,
120
+ taskLocation: { repoRoot: resolved.repoRoot, taskId: resolved.taskId, taskMdPath: resolved.taskMdPath, state: resolved.state },
121
+ metadataProvider: () => metadata
122
+ });
123
+ if (writeResult.status === 'failed')
124
+ return failed(intent, writeResult.error.code, writeResult.error.message, writeResult.taskId, after.id);
125
+ return {
126
+ status: writeResult.status, changed: writeResult.changed, intent: intent.kind, taskId: writeResult.taskId,
127
+ entityId: after.id, before, after, warnings: [], operations: writeResult.operations, error: null
128
+ };
129
+ }
130
+ export { applyWorkflowWarningIntent };
131
+ //# sourceMappingURL=workflow-warning-intents.js.map
@@ -1,84 +1,16 @@
1
- import { extractSection } from './sections.js';
1
+ import { parseTable } from './sections.js';
2
2
  const WORKFLOW_WARNING_HEADINGS = ['工作流告警', 'Workflow Warnings'];
3
3
  const WORKFLOW_WARNING_STATUSES = new Set(['open', 'resolved', 'ignored']);
4
4
  const WORKFLOW_WARNING_SEVERITIES = new Set(['IMPORTANT', 'ACTION_REQUIRED']);
5
- function splitTableRow(line) {
6
- let value = line.trim();
7
- if (!value.startsWith('|'))
8
- return [];
9
- value = value.replace(/^\|/, '').replace(/\|$/, '');
10
- const cells = [];
11
- let cell = '';
12
- for (let index = 0; index < value.length; index += 1) {
13
- const char = value[index];
14
- if (char === '|' && !isEscapedAt(value, index)) {
15
- cells.push(unescapeTableCell(cell.trim()));
16
- cell = '';
17
- continue;
18
- }
19
- cell += char;
20
- }
21
- cells.push(unescapeTableCell(cell.trim()));
22
- return cells;
23
- }
24
- function unescapeTableCell(value) {
25
- let output = '';
26
- for (let index = 0; index < value.length; index += 1) {
27
- const char = value[index];
28
- const next = value[index + 1];
29
- if (char === '\\' && (next === '\\' || next === '|')) {
30
- output += next;
31
- index += 1;
32
- continue;
33
- }
34
- output += char;
35
- }
36
- return output;
37
- }
38
- function isEscapedAt(value, index) {
39
- let backslashes = 0;
40
- for (let cursor = index - 1; cursor >= 0 && value[cursor] === '\\'; cursor -= 1) {
41
- backslashes += 1;
42
- }
43
- return backslashes % 2 === 1;
44
- }
45
- function isSeparatorRow(cells) {
46
- return cells.length > 0 && cells.every((cell) => /^:?-{3,}:?$/.test(cell));
47
- }
48
- /**
49
- * Parses well-formed workflow warning rows. Malformed rows are intentionally
50
- * ignored here; validate-artifact is responsible for reporting structure errors.
51
- */
5
+ const WORKFLOW_WARNING_COLUMNS = ['id', 'time', 'step', 'severity', 'code', 'status', 'target', 'message', 'action', 'resolved_at', 'resolution'];
6
+ /** Parses workflow warning rows and fails closed on malformed table structure. */
52
7
  function parseWorkflowWarnings(content) {
53
- const section = extractSection(content, WORKFLOW_WARNING_HEADINGS);
54
- if (!section)
55
- return [];
56
- const rows = [];
57
- for (const rawLine of section.split(/\r?\n/)) {
58
- const cells = splitTableRow(rawLine);
59
- if (cells.length === 0)
60
- continue;
61
- if ((cells[0] ?? '').toLowerCase() === 'id')
62
- continue;
63
- if (isSeparatorRow(cells))
64
- continue;
65
- if (cells.length < 11)
66
- continue;
67
- rows.push({
68
- id: cells[0] ?? '',
69
- time: cells[1] ?? '',
70
- step: cells[2] ?? '',
71
- severity: cells[3] ?? '',
72
- code: cells[4] ?? '',
73
- status: cells[5] ?? '',
74
- target: cells[6] ?? '',
75
- message: cells[7] ?? '',
76
- action: cells[8] ?? '',
77
- resolvedAt: cells[9] ?? '',
78
- resolution: cells[10] ?? ''
79
- });
80
- }
81
- return rows;
8
+ const table = parseTable(content, { sectionAliases: WORKFLOW_WARNING_HEADINGS, columns: WORKFLOW_WARNING_COLUMNS });
9
+ return table?.rows.map(({ values }) => ({
10
+ id: values.id, time: values.time, step: values.step, severity: values.severity,
11
+ code: values.code, status: values.status, target: values.target, message: values.message,
12
+ action: values.action, resolvedAt: values.resolved_at, resolution: values.resolution
13
+ })) ?? [];
82
14
  }
83
15
  function getOpenWorkflowWarnings(content) {
84
16
  return parseWorkflowWarnings(content).filter((warning) => warning.status === 'open');
@@ -90,5 +22,5 @@ function formatWorkflowWarningSummary(warnings) {
90
22
  return `${warning.id} [${warning.severity}] ${warning.code}${target}${action}`;
91
23
  });
92
24
  }
93
- export { WORKFLOW_WARNING_HEADINGS, WORKFLOW_WARNING_STATUSES, WORKFLOW_WARNING_SEVERITIES, parseWorkflowWarnings, getOpenWorkflowWarnings, formatWorkflowWarningSummary };
25
+ export { WORKFLOW_WARNING_HEADINGS, WORKFLOW_WARNING_STATUSES, WORKFLOW_WARNING_SEVERITIES, WORKFLOW_WARNING_COLUMNS, parseWorkflowWarnings, getOpenWorkflowWarnings, formatWorkflowWarningSummary };
94
26
  //# sourceMappingURL=workflow-warnings.js.map
@@ -0,0 +1,241 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { VERSION } from '../version.js';
4
+ import { parseTypedTaskFrontmatter, updateTaskFrontmatter } from './frontmatter.js';
5
+ import { resolveTaskRef } from './resolve-ref.js';
6
+ import { mutateTableRow, upsertSection } from './sections.js';
7
+ const DEFAULT_FILE_SYSTEM = {
8
+ readFileSync: (file) => fs.readFileSync(file, 'utf8'),
9
+ statModeSync: (file) => fs.statSync(file).mode,
10
+ writeFileSync: (file, content, mode) => {
11
+ fs.writeFileSync(file, content, { encoding: 'utf8', flag: 'wx', mode });
12
+ },
13
+ renameSync: (from, to) => fs.renameSync(from, to),
14
+ unlinkSync: (file) => fs.unlinkSync(file)
15
+ };
16
+ function canonicalTimestamp() {
17
+ const now = new Date();
18
+ const pad = (value) => String(value).padStart(2, '0');
19
+ const offsetMinutes = -now.getTimezoneOffset();
20
+ const offsetSign = offsetMinutes >= 0 ? '+' : '-';
21
+ const offset = Math.abs(offsetMinutes);
22
+ 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)}`;
23
+ }
24
+ function captureTaskWriteMetadata() {
25
+ return { timestamp: canonicalTimestamp(), agentInfraVersion: VERSION };
26
+ }
27
+ function failure(request, identity, code, message, operations = [], metadata = null) {
28
+ return {
29
+ status: 'failed',
30
+ requestRef: request.taskRef,
31
+ expectedState: request.expectedState,
32
+ taskId: identity.taskId,
33
+ taskMdPath: identity.taskMdPath,
34
+ actualState: identity.actualState,
35
+ changed: false,
36
+ operations,
37
+ timestamp: metadata?.timestamp ?? null,
38
+ agentInfraVersion: metadata?.agentInfraVersion ?? null,
39
+ error: { code, message }
40
+ };
41
+ }
42
+ function errorDetails(error, fallback) {
43
+ if (error && typeof error === 'object' && 'code' in error && typeof error.code === 'string') {
44
+ return {
45
+ code: error.code,
46
+ message: error instanceof Error ? error.message : String(error)
47
+ };
48
+ }
49
+ return {
50
+ code: fallback,
51
+ message: error instanceof Error ? error.message : String(error)
52
+ };
53
+ }
54
+ function writeTask(request, options = {}) {
55
+ const resolved = options.taskLocation
56
+ ? {
57
+ ok: true,
58
+ repoRoot: options.taskLocation.repoRoot,
59
+ taskId: options.taskLocation.taskId,
60
+ taskDir: path.dirname(options.taskLocation.taskMdPath),
61
+ taskMdPath: options.taskLocation.taskMdPath,
62
+ state: options.taskLocation.state
63
+ }
64
+ : resolveTaskRef(request.taskRef, { repoRoot: options.repoRoot });
65
+ if (!resolved.ok) {
66
+ return failure(request, { taskId: resolved.taskId, taskMdPath: null, actualState: null }, resolved.code, resolved.message);
67
+ }
68
+ const identity = {
69
+ taskId: resolved.taskId,
70
+ taskMdPath: resolved.taskMdPath,
71
+ actualState: resolved.state
72
+ };
73
+ if (resolved.state !== request.expectedState) {
74
+ return failure(request, identity, 'TASK_STATE_MISMATCH', `task ${resolved.taskId} is ${resolved.state}, expected ${request.expectedState}`);
75
+ }
76
+ const io = { ...DEFAULT_FILE_SYSTEM, ...options.fileSystem };
77
+ let original;
78
+ let mode;
79
+ try {
80
+ original = io.readFileSync(resolved.taskMdPath);
81
+ mode = io.statModeSync(resolved.taskMdPath);
82
+ }
83
+ catch (error) {
84
+ return failure(request, identity, 'TASK_READ_FAILED', error instanceof Error ? error.message : String(error));
85
+ }
86
+ let candidate = original;
87
+ const operations = [];
88
+ try {
89
+ parseTypedTaskFrontmatter(original);
90
+ if (!Array.isArray(request.mutations)) {
91
+ throw Object.assign(new Error('mutations must be an array'), { code: 'MUTATION_INVALID' });
92
+ }
93
+ for (const [index, mutation] of request.mutations.entries()) {
94
+ if (!mutation || typeof mutation !== 'object' || !('kind' in mutation)) {
95
+ throw Object.assign(new Error(`mutation ${index} is invalid`), { code: 'MUTATION_INVALID' });
96
+ }
97
+ const before = candidate;
98
+ if (mutation.kind === 'frontmatter') {
99
+ candidate = updateTaskFrontmatter(candidate, mutation.set, mutation.remove);
100
+ operations.push({
101
+ index,
102
+ kind: 'frontmatter',
103
+ fields: [...Object.keys(mutation.set), ...(mutation.remove ?? [])],
104
+ wouldChange: candidate !== before
105
+ });
106
+ }
107
+ else if (mutation.kind === 'section') {
108
+ const result = upsertSection(candidate, mutation);
109
+ candidate = result.content;
110
+ operations.push({
111
+ index,
112
+ kind: 'section',
113
+ heading: result.heading,
114
+ operation: result.operation,
115
+ wouldChange: candidate !== before
116
+ });
117
+ }
118
+ else if (mutation.kind === 'table-row') {
119
+ const result = mutateTableRow(candidate, mutation);
120
+ candidate = result.content;
121
+ operations.push({
122
+ index,
123
+ kind: 'table-row',
124
+ section: result.section,
125
+ keyColumn: mutation.keyColumn,
126
+ key: mutation.key.trim(),
127
+ operation: result.operation,
128
+ wouldChange: candidate !== before
129
+ });
130
+ }
131
+ else {
132
+ throw Object.assign(new Error(`mutation ${index} has an unknown kind`), {
133
+ code: 'MUTATION_INVALID'
134
+ });
135
+ }
136
+ }
137
+ }
138
+ catch (error) {
139
+ const details = errorDetails(error, 'MUTATION_INVALID');
140
+ return failure(request, identity, details.code, details.message);
141
+ }
142
+ let metadata;
143
+ try {
144
+ metadata = (options.metadataProvider ?? captureTaskWriteMetadata)();
145
+ if (!metadata ||
146
+ typeof metadata.timestamp !== 'string' ||
147
+ !metadata.timestamp ||
148
+ typeof metadata.agentInfraVersion !== 'string' ||
149
+ !metadata.agentInfraVersion) {
150
+ throw new Error('metadata provider returned invalid metadata');
151
+ }
152
+ }
153
+ catch (error) {
154
+ return failure(request, identity, 'METADATA_CAPTURE_FAILED', error instanceof Error ? error.message : String(error), operations);
155
+ }
156
+ if (candidate === original) {
157
+ return {
158
+ status: 'no-op',
159
+ requestRef: request.taskRef,
160
+ expectedState: request.expectedState,
161
+ taskId: resolved.taskId,
162
+ taskMdPath: resolved.taskMdPath,
163
+ actualState: resolved.state,
164
+ changed: false,
165
+ operations,
166
+ timestamp: metadata.timestamp,
167
+ agentInfraVersion: metadata.agentInfraVersion,
168
+ error: null
169
+ };
170
+ }
171
+ try {
172
+ const beforeMetadata = candidate;
173
+ candidate = updateTaskFrontmatter(candidate, {
174
+ updated_at: metadata.timestamp,
175
+ agent_infra_version: metadata.agentInfraVersion
176
+ });
177
+ operations.push({
178
+ index: -1,
179
+ kind: 'metadata',
180
+ fields: ['updated_at', 'agent_infra_version'],
181
+ wouldChange: candidate !== beforeMetadata
182
+ });
183
+ }
184
+ catch (error) {
185
+ const details = errorDetails(error, 'TASK_DOCUMENT_INVALID');
186
+ return failure(request, identity, details.code, details.message, operations, metadata);
187
+ }
188
+ const successBase = {
189
+ requestRef: request.taskRef,
190
+ expectedState: request.expectedState,
191
+ taskId: resolved.taskId,
192
+ taskMdPath: resolved.taskMdPath,
193
+ actualState: resolved.state,
194
+ operations,
195
+ timestamp: metadata.timestamp,
196
+ agentInfraVersion: metadata.agentInfraVersion,
197
+ error: null
198
+ };
199
+ if (request.dryRun) {
200
+ return { ...successBase, status: 'planned', changed: true };
201
+ }
202
+ const suffix = (options.randomSuffix ?? (() => Math.random().toString(36).slice(2)))();
203
+ const tempPath = path.join(path.dirname(resolved.taskMdPath), `.task.md.${process.pid}.${suffix}.tmp`);
204
+ let primary = null;
205
+ let shouldCleanupTemp = false;
206
+ try {
207
+ io.writeFileSync(tempPath, candidate, mode);
208
+ shouldCleanupTemp = true;
209
+ }
210
+ catch (error) {
211
+ shouldCleanupTemp = error.code !== 'EEXIST';
212
+ primary = errorDetails(error, 'TEMP_WRITE_FAILED');
213
+ primary.code = 'TEMP_WRITE_FAILED';
214
+ }
215
+ if (!primary) {
216
+ try {
217
+ io.renameSync(tempPath, resolved.taskMdPath);
218
+ }
219
+ catch (error) {
220
+ primary = errorDetails(error, 'RENAME_FAILED');
221
+ primary.code = 'RENAME_FAILED';
222
+ }
223
+ }
224
+ if (primary && shouldCleanupTemp) {
225
+ try {
226
+ io.unlinkSync(tempPath);
227
+ }
228
+ catch (cleanupError) {
229
+ const nodeError = cleanupError;
230
+ if (nodeError.code !== 'ENOENT') {
231
+ return failure(request, identity, 'TEMP_CLEANUP_FAILED', `${primary.code}: ${primary.message}; failed to clean ${tempPath}: ${nodeError.message}`, operations, metadata);
232
+ }
233
+ }
234
+ }
235
+ if (primary) {
236
+ return failure(request, identity, primary.code, primary.message, operations, metadata);
237
+ }
238
+ return { ...successBase, status: 'applied', changed: true };
239
+ }
240
+ export { writeTask, captureTaskWriteMetadata, canonicalTimestamp };
241
+ //# sourceMappingURL=write.js.map
@@ -145,6 +145,8 @@ async function cmdUpdate() {
145
145
  // update skill
146
146
  copySkillDir(path.join(templateDir, '.agents', 'skills', 'update-agent-infra'), path.join('.agents', 'skills', 'update-agent-infra'), replacements, language, platformType);
147
147
  ok('Updated .agents/skills/update-agent-infra/');
148
+ renderFile(path.join(templateDir, '.agents', 'scripts', 'lib', 'agent-infra-package.js'), path.join('.agents', 'scripts', 'lib', 'agent-infra-package.js'), replacements);
149
+ ok('Updated .agents/scripts/lib/agent-infra-package.js');
148
150
  try {
149
151
  fs.unlinkSync(path.join('.agents', 'skills', 'update-agent-infra', 'scripts', 'sync-templates.cjs'));
150
152
  }