@fitlab-ai/agent-infra 0.9.1 → 0.9.3

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 (476) hide show
  1. package/README.md +24 -11
  2. package/README.zh-CN.md +24 -11
  3. package/bin/cli.ts +12 -0
  4. package/dist/bin/cli.js +14 -0
  5. package/dist/bin/internal-cli.js +30 -0
  6. package/dist/lib/agent-client.js +163 -0
  7. package/dist/lib/agent-clients/adapter.js +337 -0
  8. package/dist/lib/agent-clients/adapters/antigravity-cli.js +64 -0
  9. package/dist/lib/agent-clients/adapters/claude-code.js +71 -0
  10. package/dist/lib/agent-clients/adapters/codex-sandbox.js +210 -0
  11. package/dist/lib/agent-clients/adapters/codex.js +63 -0
  12. package/dist/lib/agent-clients/adapters/index.js +20 -0
  13. package/dist/lib/agent-clients/adapters/opencode.js +73 -0
  14. package/dist/lib/agent-clients/config.js +215 -0
  15. package/dist/lib/agent-clients/custom-tuis.js +99 -0
  16. package/dist/lib/agent-clients/invocation.js +9 -0
  17. package/dist/lib/agent-clients/next-steps.js +47 -0
  18. package/dist/lib/agent-clients/project-assets.js +45 -0
  19. package/dist/lib/agent-clients/reconcile.js +236 -0
  20. package/dist/lib/agent-clients/registry.js +78 -0
  21. package/dist/lib/agent-clients/schema.js +75 -0
  22. package/dist/lib/agent-clients/tokens.js +49 -0
  23. package/dist/lib/agent-clients/types.js +29 -0
  24. package/dist/lib/builtin-tuis.js +9 -14
  25. package/dist/lib/defaults.json +85 -73
  26. package/dist/lib/git/review-snapshot.js +25 -10
  27. package/dist/lib/git/reviewed-commit-equivalence.js +110 -0
  28. package/dist/lib/git/workflow.js +54 -1
  29. package/dist/lib/init.js +47 -91
  30. package/dist/lib/internal/agent-client.js +174 -0
  31. package/dist/lib/internal/git-workflow.js +7 -2
  32. package/dist/lib/internal/platform-checks.js +3 -3
  33. package/dist/lib/internal/platform-comment.js +29 -2
  34. package/dist/lib/internal/platform-issue.js +7 -0
  35. package/dist/lib/internal/platform-pr-review.js +132 -0
  36. package/dist/lib/internal/platform-pr.js +20 -2
  37. package/dist/lib/internal/platform-release-notes.js +52 -16
  38. package/dist/lib/internal/pr-review-grade.js +140 -0
  39. package/dist/lib/internal/release-workflow.js +82 -20
  40. package/dist/lib/internal/task-activity.js +73 -0
  41. package/dist/lib/internal/task-event.js +17 -1
  42. package/dist/lib/internal/task-lifecycle.js +7 -0
  43. package/dist/lib/internal/task-orchestration.js +196 -0
  44. package/dist/lib/internal/task-review.js +70 -0
  45. package/dist/lib/merge.js +2 -1
  46. package/dist/lib/platform/adapters.js +45 -1
  47. package/dist/lib/platform/change-request-git-evidence.js +113 -0
  48. package/dist/lib/platform/completion-backfill.js +122 -0
  49. package/dist/lib/platform/issue-comments.js +3 -2
  50. package/dist/lib/platform/merged-pr-equivalence.js +156 -16
  51. package/dist/lib/platform/pr-checks.js +101 -50
  52. package/dist/lib/platform/pr-review.js +166 -0
  53. package/dist/lib/platform/pull-requests.js +432 -7
  54. package/dist/lib/platform/release-notes.js +85 -3
  55. package/dist/lib/platform/releases.js +1 -1
  56. package/dist/lib/platform/verification-required.js +8 -10
  57. package/dist/lib/pr-review/evidence-grading.js +229 -0
  58. package/dist/lib/prompt.js +15 -3
  59. package/dist/lib/release/channels.js +4 -1
  60. package/dist/lib/release/workflow.js +4 -2
  61. package/dist/lib/remove-dir.js +25 -0
  62. package/dist/lib/run/tui.js +11 -7
  63. package/dist/lib/sandbox/agent-client-reconciler.js +234 -0
  64. package/dist/lib/sandbox/clipboard/linux.js +2 -1
  65. package/dist/lib/sandbox/commands/create.js +76 -200
  66. package/dist/lib/sandbox/commands/enter.js +17 -1
  67. package/dist/lib/sandbox/commands/prune.js +2 -2
  68. package/dist/lib/sandbox/commands/rm.js +3 -2
  69. package/dist/lib/sandbox/commands/show.js +1 -1
  70. package/dist/lib/sandbox/config.js +21 -4
  71. package/dist/lib/sandbox/constants.js +3 -0
  72. package/dist/lib/sandbox/dockerfile.js +2 -1
  73. package/dist/lib/sandbox/managed-fs.js +10 -5
  74. package/dist/lib/sandbox/recovery.js +52 -36
  75. package/dist/lib/sandbox/shell.js +1 -1
  76. package/dist/lib/sandbox/tool-types.js +8 -0
  77. package/dist/lib/sandbox/tools.js +2 -126
  78. package/dist/lib/task/activity-intent.js +101 -0
  79. package/dist/lib/task/artifact-lifecycle.js +3 -50
  80. package/dist/lib/task/commands/decisions.js +50 -20
  81. package/dist/lib/task/commands/log.js +15 -14
  82. package/dist/lib/task/delegation-receipts.js +128 -0
  83. package/dist/lib/task/events.js +146 -8
  84. package/dist/lib/task/finalization-artifacts.js +35 -0
  85. package/dist/lib/task/lifecycle-execution.js +46 -0
  86. package/dist/lib/task/orchestration.js +784 -0
  87. package/dist/lib/task/review-artifacts.js +143 -59
  88. package/dist/lib/task/review-finalization.js +186 -0
  89. package/dist/lib/task/review-fingerprint.js +4 -0
  90. package/dist/lib/task/task-execution-lock.js +231 -0
  91. package/dist/lib/task/verification-checks.js +2 -1
  92. package/dist/lib/task/verification-engine.js +372 -28
  93. package/dist/lib/task/verification-review.js +1 -1
  94. package/dist/lib/task/verification.js +5 -2
  95. package/dist/lib/task/workspace-snapshot.js +46 -0
  96. package/dist/lib/update.js +42 -161
  97. package/lib/agent-client.ts +214 -0
  98. package/lib/agent-clients/adapter.ts +534 -0
  99. package/lib/agent-clients/adapters/antigravity-cli.ts +65 -0
  100. package/lib/agent-clients/adapters/claude-code.ts +79 -0
  101. package/lib/agent-clients/adapters/codex-sandbox.ts +245 -0
  102. package/lib/agent-clients/adapters/codex.ts +67 -0
  103. package/lib/agent-clients/adapters/index.ts +27 -0
  104. package/lib/agent-clients/adapters/opencode.ts +75 -0
  105. package/lib/agent-clients/config.ts +323 -0
  106. package/lib/agent-clients/custom-tuis.ts +149 -0
  107. package/lib/agent-clients/invocation.ts +19 -0
  108. package/lib/agent-clients/next-steps.ts +85 -0
  109. package/lib/agent-clients/project-assets.ts +96 -0
  110. package/lib/agent-clients/reconcile.ts +325 -0
  111. package/lib/agent-clients/registry.ts +154 -0
  112. package/lib/agent-clients/schema.ts +80 -0
  113. package/lib/agent-clients/tokens.ts +53 -0
  114. package/lib/agent-clients/types.ts +92 -0
  115. package/lib/benchmark/schemas/v1.0.0/case-manifest.schema.json +120 -0
  116. package/lib/benchmark/schemas/v1.0.0/common.schema.json +109 -0
  117. package/lib/benchmark/schemas/v1.0.0/grader-result.schema.json +160 -0
  118. package/lib/benchmark/schemas/v1.0.0/run-manifest.schema.json +122 -0
  119. package/lib/benchmark/schemas/v1.0.0/subject.schema.json +227 -0
  120. package/lib/builtin-tuis.ts +16 -15
  121. package/lib/defaults.json +24 -12
  122. package/lib/git/review-snapshot.ts +39 -9
  123. package/lib/git/reviewed-commit-equivalence.ts +135 -0
  124. package/lib/git/workflow.ts +66 -2
  125. package/lib/init.ts +53 -121
  126. package/lib/internal/agent-client.ts +186 -0
  127. package/lib/internal/git-workflow.ts +6 -2
  128. package/lib/internal/platform-checks.ts +4 -4
  129. package/lib/internal/platform-comment.ts +17 -2
  130. package/lib/internal/platform-issue.ts +4 -0
  131. package/lib/internal/platform-pr-review.ts +104 -0
  132. package/lib/internal/platform-pr.ts +14 -1
  133. package/lib/internal/platform-release-notes.ts +59 -16
  134. package/lib/internal/pr-review-grade.ts +130 -0
  135. package/lib/internal/release-workflow.ts +79 -20
  136. package/lib/internal/task-activity.ts +55 -0
  137. package/lib/internal/task-event.ts +9 -1
  138. package/lib/internal/task-lifecycle.ts +4 -0
  139. package/lib/internal/task-orchestration.ts +171 -0
  140. package/lib/internal/task-review.ts +70 -0
  141. package/lib/merge.ts +2 -1
  142. package/lib/platform/adapters.ts +169 -3
  143. package/lib/platform/change-request-git-evidence.ts +159 -0
  144. package/lib/platform/completion-backfill.ts +134 -0
  145. package/lib/platform/issue-comments.ts +3 -2
  146. package/lib/platform/merged-pr-equivalence.ts +178 -19
  147. package/lib/platform/pr-checks.ts +121 -66
  148. package/lib/platform/pr-review.ts +201 -0
  149. package/lib/platform/pull-requests.ts +529 -27
  150. package/lib/platform/release-notes.ts +100 -4
  151. package/lib/platform/releases.ts +1 -1
  152. package/lib/platform/verification-required.ts +12 -10
  153. package/lib/pr-review/evidence-grading.ts +318 -0
  154. package/lib/prompt.ts +16 -3
  155. package/lib/release/channels.ts +4 -1
  156. package/lib/release/workflow.ts +4 -3
  157. package/lib/remove-dir.ts +28 -0
  158. package/lib/run/tui.ts +12 -5
  159. package/lib/sandbox/agent-client-reconciler.ts +378 -0
  160. package/lib/sandbox/clipboard/linux.ts +2 -1
  161. package/lib/sandbox/commands/create.ts +111 -212
  162. package/lib/sandbox/commands/enter.ts +23 -1
  163. package/lib/sandbox/commands/prune.ts +2 -2
  164. package/lib/sandbox/commands/rm.ts +3 -2
  165. package/lib/sandbox/commands/show.ts +1 -1
  166. package/lib/sandbox/config.ts +31 -4
  167. package/lib/sandbox/constants.ts +6 -0
  168. package/lib/sandbox/dockerfile.ts +2 -1
  169. package/lib/sandbox/managed-fs.ts +18 -5
  170. package/lib/sandbox/recovery.ts +98 -67
  171. package/lib/sandbox/shell.ts +1 -1
  172. package/lib/sandbox/tool-types.ts +143 -0
  173. package/lib/sandbox/tools.ts +5 -157
  174. package/lib/server/server.schema.json +2 -2
  175. package/lib/task/activity-intent.ts +128 -0
  176. package/lib/task/artifact-lifecycle.ts +3 -39
  177. package/lib/task/commands/decisions.ts +53 -20
  178. package/lib/task/commands/log.ts +15 -14
  179. package/lib/task/delegation-receipts.ts +199 -0
  180. package/lib/task/events.ts +164 -11
  181. package/lib/task/finalization-artifacts.ts +58 -0
  182. package/lib/task/lifecycle-execution.ts +106 -0
  183. package/lib/task/orchestration.ts +1022 -0
  184. package/lib/task/review-artifacts.ts +201 -69
  185. package/lib/task/review-finalization.ts +306 -0
  186. package/lib/task/review-fingerprint.ts +5 -0
  187. package/lib/task/task-execution-lock.ts +296 -0
  188. package/lib/task/verification-checks.ts +2 -1
  189. package/lib/task/verification-engine.ts +424 -28
  190. package/lib/task/verification-review.ts +1 -0
  191. package/lib/task/verification.ts +8 -3
  192. package/lib/task/workspace-snapshot.ts +57 -0
  193. package/lib/update.ts +48 -184
  194. package/package.json +4 -4
  195. package/templates/.agents/QUICKSTART.en.md +25 -8
  196. package/templates/.agents/QUICKSTART.zh-CN.md +25 -8
  197. package/templates/.agents/README.en.md +29 -25
  198. package/templates/.agents/README.zh-CN.md +29 -25
  199. package/templates/.agents/hooks/lifecycle-delegation.js +75 -0
  200. package/templates/.agents/rules/README.en.md +2 -0
  201. package/templates/.agents/rules/README.zh-CN.md +2 -0
  202. package/templates/.agents/rules/commit-and-pr.en.md +1 -0
  203. package/templates/.agents/rules/commit-and-pr.zh-CN.md +1 -0
  204. package/templates/.agents/rules/create-issue.github.en.md +4 -2
  205. package/templates/.agents/rules/create-issue.github.zh-CN.md +4 -2
  206. package/templates/.agents/rules/human-decision-context.en.md +14 -12
  207. package/templates/.agents/rules/human-decision-context.zh-CN.md +14 -12
  208. package/templates/.agents/rules/issue-fields.github.en.md +3 -1
  209. package/templates/.agents/rules/issue-fields.github.zh-CN.md +3 -1
  210. package/templates/.agents/rules/issue-pr-commands.en.md +5 -3
  211. package/templates/.agents/rules/issue-pr-commands.github.en.md +5 -3
  212. package/templates/.agents/rules/issue-pr-commands.github.zh-CN.md +5 -3
  213. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +5 -3
  214. package/templates/.agents/rules/issue-sync.github.en.md +7 -3
  215. package/templates/.agents/rules/issue-sync.github.zh-CN.md +8 -4
  216. package/templates/.agents/rules/lifecycle-orchestration.en.md +24 -0
  217. package/templates/.agents/rules/lifecycle-orchestration.zh-CN.md +24 -0
  218. package/templates/.agents/rules/milestone-inference.github.en.md +4 -2
  219. package/templates/.agents/rules/milestone-inference.github.zh-CN.md +4 -2
  220. package/templates/.agents/rules/next-step-output.en.md +18 -0
  221. package/templates/.agents/rules/next-step-output.zh-CN.md +18 -0
  222. package/templates/.agents/rules/no-mid-flow-questions.en.md +19 -0
  223. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +19 -0
  224. package/templates/.agents/rules/pr-checks-commands.en.md +3 -3
  225. package/templates/.agents/rules/pr-checks-commands.github.en.md +2 -2
  226. package/templates/.agents/rules/pr-checks-commands.github.zh-CN.md +2 -2
  227. package/templates/.agents/rules/pr-checks-commands.zh-CN.md +3 -3
  228. package/templates/.agents/rules/pr-sync.en.md +3 -1
  229. package/templates/.agents/rules/pr-sync.github.en.md +11 -1
  230. package/templates/.agents/rules/pr-sync.github.zh-CN.md +11 -1
  231. package/templates/.agents/rules/pr-sync.zh-CN.md +3 -1
  232. package/templates/.agents/rules/release-commands.en.md +1 -1
  233. package/templates/.agents/rules/release-commands.github.en.md +21 -5
  234. package/templates/.agents/rules/release-commands.github.zh-CN.md +21 -5
  235. package/templates/.agents/rules/release-commands.zh-CN.md +1 -1
  236. package/templates/.agents/rules/review-handshake.en.md +4 -4
  237. package/templates/.agents/rules/review-handshake.zh-CN.md +4 -4
  238. package/templates/.agents/rules/review-method.en.md +113 -0
  239. package/templates/.agents/rules/review-method.zh-CN.md +98 -0
  240. package/templates/.agents/rules/task-management.en.md +11 -0
  241. package/templates/.agents/rules/task-management.zh-CN.md +11 -0
  242. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -12
  243. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +15 -12
  244. package/templates/.agents/skills/block-task/SKILL.en.md +11 -9
  245. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +11 -9
  246. package/templates/.agents/skills/cancel-task/SKILL.en.md +10 -8
  247. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +11 -9
  248. package/templates/.agents/skills/check-task/SKILL.en.md +16 -16
  249. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -16
  250. package/templates/.agents/skills/close-codescan/SKILL.en.md +7 -5
  251. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +7 -5
  252. package/templates/.agents/skills/close-dependabot/SKILL.en.md +7 -5
  253. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +7 -5
  254. package/templates/.agents/skills/code-task/SKILL.en.md +10 -7
  255. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +13 -10
  256. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +14 -16
  257. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +14 -16
  258. package/templates/.agents/skills/code-task/reference/output-template.en.md +3 -3
  259. package/templates/.agents/skills/code-task/reference/output-template.zh-CN.md +3 -3
  260. package/templates/.agents/skills/commit/SKILL.en.md +13 -1
  261. package/templates/.agents/skills/commit/SKILL.zh-CN.md +13 -1
  262. package/templates/.agents/skills/commit/reference/commit-message.en.md +1 -1
  263. package/templates/.agents/skills/commit/reference/commit-message.zh-CN.md +1 -1
  264. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +1 -1
  265. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +1 -1
  266. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +1 -1
  267. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +1 -1
  268. package/templates/.agents/skills/commit/reference/task-status-update.en.md +24 -28
  269. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +24 -28
  270. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +6 -4
  271. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +6 -4
  272. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +1 -1
  273. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +1 -1
  274. package/templates/.agents/skills/complete-task/SKILL.en.md +23 -8
  275. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +23 -8
  276. package/templates/.agents/skills/complete-task/config/verify.en.json +1 -0
  277. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +1 -0
  278. package/templates/.agents/skills/complete-task/reference/external-delivery.en.md +17 -0
  279. package/templates/.agents/skills/complete-task/reference/external-delivery.zh-CN.md +17 -0
  280. package/templates/.agents/skills/create-pr/SKILL.en.md +13 -11
  281. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +13 -11
  282. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +1 -1
  283. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +1 -1
  284. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +3 -3
  285. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +3 -3
  286. package/templates/.agents/skills/create-release-note/SKILL.en.md +17 -16
  287. package/templates/.agents/skills/create-release-note/SKILL.zh-CN.md +17 -16
  288. package/templates/.agents/skills/create-task/SKILL.en.md +16 -14
  289. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +16 -14
  290. package/templates/.agents/skills/import-codescan/SKILL.en.md +5 -5
  291. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +5 -5
  292. package/templates/.agents/skills/import-dependabot/SKILL.en.md +5 -5
  293. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +5 -5
  294. package/templates/.agents/skills/import-issue/SKILL.en.md +10 -8
  295. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +10 -8
  296. package/templates/.agents/skills/init-labels/SKILL.en.md +4 -4
  297. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +4 -4
  298. package/templates/.agents/skills/init-milestones/SKILL.en.md +4 -4
  299. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +4 -4
  300. package/templates/.agents/skills/plan-task/SKILL.en.md +13 -10
  301. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +13 -10
  302. package/templates/.agents/skills/post-release/SKILL.en.md +2 -0
  303. package/templates/.agents/skills/post-release/SKILL.zh-CN.md +2 -0
  304. package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
  305. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
  306. package/templates/.agents/skills/release/SKILL.en.md +16 -10
  307. package/templates/.agents/skills/release/SKILL.zh-CN.md +16 -10
  308. package/templates/.agents/skills/restore-task/SKILL.en.md +4 -1
  309. package/templates/.agents/skills/restore-task/SKILL.zh-CN.md +4 -1
  310. package/templates/.agents/skills/review-analysis/SKILL.en.md +18 -4
  311. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +19 -5
  312. package/templates/.agents/skills/review-analysis/config/verify.en.json +6 -0
  313. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +6 -0
  314. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +13 -15
  315. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +13 -15
  316. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +51 -5
  317. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +52 -6
  318. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +25 -22
  319. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +25 -22
  320. package/templates/.agents/skills/review-code/SKILL.en.md +35 -12
  321. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +35 -12
  322. package/templates/.agents/skills/review-code/config/verify.en.json +7 -0
  323. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +7 -0
  324. package/templates/.agents/skills/review-code/reference/concurrency-risks.en.md +25 -0
  325. package/templates/.agents/skills/review-code/reference/concurrency-risks.zh-CN.md +25 -0
  326. package/templates/.agents/skills/review-code/reference/cross-platform-risks.en.md +27 -0
  327. package/templates/.agents/skills/review-code/reference/cross-platform-risks.zh-CN.md +27 -0
  328. package/templates/.agents/skills/review-code/reference/documentation-antipatterns.en.md +13 -0
  329. package/templates/.agents/skills/review-code/reference/documentation-antipatterns.zh-CN.md +13 -0
  330. package/templates/.agents/skills/review-code/reference/migration-risks.en.md +25 -0
  331. package/templates/.agents/skills/review-code/reference/migration-risks.zh-CN.md +25 -0
  332. package/templates/.agents/skills/review-code/reference/output-templates.en.md +22 -24
  333. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +22 -24
  334. package/templates/.agents/skills/review-code/reference/report-template.en.md +54 -7
  335. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +54 -7
  336. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +29 -24
  337. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +29 -24
  338. package/templates/.agents/skills/review-code/reference/security-risks.en.md +25 -0
  339. package/templates/.agents/skills/review-code/reference/security-risks.zh-CN.md +25 -0
  340. package/templates/.agents/skills/review-plan/SKILL.en.md +18 -4
  341. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +19 -5
  342. package/templates/.agents/skills/review-plan/config/verify.en.json +6 -0
  343. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +6 -0
  344. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +13 -15
  345. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +13 -15
  346. package/templates/.agents/skills/review-plan/reference/report-template.en.md +61 -5
  347. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +61 -5
  348. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +21 -24
  349. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +21 -24
  350. package/templates/.agents/skills/review-pr/SKILL.en.md +158 -0
  351. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +158 -0
  352. package/templates/.agents/skills/review-pr/config/verify.en.json +37 -0
  353. package/templates/.agents/skills/review-pr/config/verify.zh-CN.json +37 -0
  354. package/templates/.agents/skills/review-pr/reference/evidence-grading.en.md +65 -0
  355. package/templates/.agents/skills/review-pr/reference/evidence-grading.zh-CN.md +65 -0
  356. package/templates/.agents/skills/review-pr/reference/output-guidance.en.md +18 -0
  357. package/templates/.agents/skills/review-pr/reference/output-guidance.zh-CN.md +18 -0
  358. package/templates/.agents/skills/review-pr/reference/report-template.en.md +85 -0
  359. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +85 -0
  360. package/templates/.agents/skills/run-task/SKILL.en.md +22 -0
  361. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +22 -0
  362. package/templates/.agents/skills/run-task/config/verify.en.json +10 -0
  363. package/templates/.agents/skills/run-task/config/verify.zh-CN.json +10 -0
  364. package/templates/.agents/skills/run-task/reference/host-validation.en.md +20 -0
  365. package/templates/.agents/skills/run-task/reference/host-validation.zh-CN.md +20 -0
  366. package/templates/.agents/skills/test/SKILL.en.md +4 -4
  367. package/templates/.agents/skills/test/SKILL.zh-CN.md +4 -4
  368. package/templates/.agents/skills/test-integration/SKILL.en.md +4 -4
  369. package/templates/.agents/skills/test-integration/SKILL.zh-CN.md +4 -4
  370. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +5 -5
  371. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +5 -5
  372. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +664 -246
  373. package/templates/.agents/skills/upgrade-dependency/SKILL.en.md +4 -4
  374. package/templates/.agents/skills/upgrade-dependency/SKILL.zh-CN.md +4 -4
  375. package/templates/.agents/skills/watch-pr/SKILL.en.md +21 -21
  376. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +21 -21
  377. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +27 -6
  378. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +26 -5
  379. package/templates/.agents/templates/task.en.md +1 -1
  380. package/templates/.agents/templates/task.zh-CN.md +1 -1
  381. package/templates/.agents/workflows/bug-fix.en.yaml +3 -3
  382. package/templates/.agents/workflows/bug-fix.zh-CN.yaml +3 -3
  383. package/templates/.agents/workflows/code-review.en.yaml +1 -1
  384. package/templates/.agents/workflows/code-review.zh-CN.yaml +1 -1
  385. package/templates/.agents/workflows/feature-development.en.yaml +4 -4
  386. package/templates/.agents/workflows/feature-development.zh-CN.yaml +4 -4
  387. package/templates/.agents/workflows/refactoring.en.yaml +3 -3
  388. package/templates/.agents/workflows/refactoring.zh-CN.yaml +3 -3
  389. package/templates/.claude/agents/agent-infra-lifecycle-executor.en.md +6 -0
  390. package/templates/.claude/agents/agent-infra-lifecycle-executor.zh-CN.md +6 -0
  391. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.en.md +6 -0
  392. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.zh-CN.md +6 -0
  393. package/templates/.claude/commands/post-release.en.md +1 -0
  394. package/templates/.claude/commands/post-release.zh-CN.md +1 -0
  395. package/templates/.claude/commands/review-pr.en.md +8 -0
  396. package/templates/.claude/commands/review-pr.zh-CN.md +8 -0
  397. package/templates/.claude/commands/run-task.en.md +8 -0
  398. package/templates/.claude/commands/run-task.zh-CN.md +8 -0
  399. package/templates/.claude/settings.json +24 -0
  400. package/templates/.codex/agents/agent-infra-lifecycle-executor.en.toml +3 -0
  401. package/templates/.codex/agents/agent-infra-lifecycle-executor.zh-CN.toml +3 -0
  402. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.en.toml +3 -0
  403. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.zh-CN.toml +3 -0
  404. package/templates/.gemini/commands/_project_/review-pr.en.toml +10 -0
  405. package/templates/.gemini/commands/_project_/review-pr.zh-CN.toml +10 -0
  406. package/templates/.opencode/commands/post-release.en.md +2 -0
  407. package/templates/.opencode/commands/post-release.zh-CN.md +2 -0
  408. package/templates/.opencode/commands/review-pr.en.md +11 -0
  409. package/templates/.opencode/commands/review-pr.zh-CN.md +11 -0
  410. package/templates/.opencode/commands/run-task.en.md +11 -0
  411. package/templates/.opencode/commands/run-task.zh-CN.md +11 -0
  412. package/templates/.gemini/commands/_project_/analyze-task.en.toml +0 -10
  413. package/templates/.gemini/commands/_project_/analyze-task.zh-CN.toml +0 -10
  414. package/templates/.gemini/commands/_project_/archive-tasks.en.toml +0 -10
  415. package/templates/.gemini/commands/_project_/archive-tasks.zh-CN.toml +0 -10
  416. package/templates/.gemini/commands/_project_/block-task.en.toml +0 -10
  417. package/templates/.gemini/commands/_project_/block-task.zh-CN.toml +0 -10
  418. package/templates/.gemini/commands/_project_/cancel-task.en.toml +0 -10
  419. package/templates/.gemini/commands/_project_/cancel-task.zh-CN.toml +0 -10
  420. package/templates/.gemini/commands/_project_/check-task.en.toml +0 -10
  421. package/templates/.gemini/commands/_project_/check-task.zh-CN.toml +0 -10
  422. package/templates/.gemini/commands/_project_/close-codescan.en.toml +0 -8
  423. package/templates/.gemini/commands/_project_/close-codescan.zh-CN.toml +0 -8
  424. package/templates/.gemini/commands/_project_/close-dependabot.en.toml +0 -8
  425. package/templates/.gemini/commands/_project_/close-dependabot.zh-CN.toml +0 -8
  426. package/templates/.gemini/commands/_project_/code-task.en.toml +0 -10
  427. package/templates/.gemini/commands/_project_/code-task.zh-CN.toml +0 -10
  428. package/templates/.gemini/commands/_project_/commit.en.toml +0 -10
  429. package/templates/.gemini/commands/_project_/commit.zh-CN.toml +0 -10
  430. package/templates/.gemini/commands/_project_/complete-manual-validation.en.toml +0 -10
  431. package/templates/.gemini/commands/_project_/complete-manual-validation.zh-CN.toml +0 -10
  432. package/templates/.gemini/commands/_project_/complete-task.en.toml +0 -10
  433. package/templates/.gemini/commands/_project_/complete-task.zh-CN.toml +0 -10
  434. package/templates/.gemini/commands/_project_/create-pr.en.toml +0 -10
  435. package/templates/.gemini/commands/_project_/create-pr.zh-CN.toml +0 -10
  436. package/templates/.gemini/commands/_project_/create-release-note.en.toml +0 -8
  437. package/templates/.gemini/commands/_project_/create-release-note.zh-CN.toml +0 -8
  438. package/templates/.gemini/commands/_project_/create-task.en.toml +0 -8
  439. package/templates/.gemini/commands/_project_/create-task.zh-CN.toml +0 -8
  440. package/templates/.gemini/commands/_project_/import-codescan.en.toml +0 -8
  441. package/templates/.gemini/commands/_project_/import-codescan.zh-CN.toml +0 -8
  442. package/templates/.gemini/commands/_project_/import-dependabot.en.toml +0 -8
  443. package/templates/.gemini/commands/_project_/import-dependabot.zh-CN.toml +0 -8
  444. package/templates/.gemini/commands/_project_/import-issue.en.toml +0 -8
  445. package/templates/.gemini/commands/_project_/import-issue.zh-CN.toml +0 -8
  446. package/templates/.gemini/commands/_project_/init-labels.en.toml +0 -8
  447. package/templates/.gemini/commands/_project_/init-labels.zh-CN.toml +0 -8
  448. package/templates/.gemini/commands/_project_/init-milestones.en.toml +0 -10
  449. package/templates/.gemini/commands/_project_/init-milestones.zh-CN.toml +0 -10
  450. package/templates/.gemini/commands/_project_/plan-task.en.toml +0 -10
  451. package/templates/.gemini/commands/_project_/plan-task.zh-CN.toml +0 -10
  452. package/templates/.gemini/commands/_project_/post-release.en.toml +0 -6
  453. package/templates/.gemini/commands/_project_/post-release.zh-CN.toml +0 -6
  454. package/templates/.gemini/commands/_project_/refine-title.en.toml +0 -8
  455. package/templates/.gemini/commands/_project_/refine-title.zh-CN.toml +0 -8
  456. package/templates/.gemini/commands/_project_/release.en.toml +0 -8
  457. package/templates/.gemini/commands/_project_/release.zh-CN.toml +0 -8
  458. package/templates/.gemini/commands/_project_/restore-task.en.toml +0 -8
  459. package/templates/.gemini/commands/_project_/restore-task.zh-CN.toml +0 -8
  460. package/templates/.gemini/commands/_project_/review-analysis.en.toml +0 -10
  461. package/templates/.gemini/commands/_project_/review-analysis.zh-CN.toml +0 -10
  462. package/templates/.gemini/commands/_project_/review-code.en.toml +0 -10
  463. package/templates/.gemini/commands/_project_/review-code.zh-CN.toml +0 -10
  464. package/templates/.gemini/commands/_project_/review-plan.en.toml +0 -10
  465. package/templates/.gemini/commands/_project_/review-plan.zh-CN.toml +0 -10
  466. package/templates/.gemini/commands/_project_/test-integration.en.toml +0 -6
  467. package/templates/.gemini/commands/_project_/test-integration.zh-CN.toml +0 -6
  468. package/templates/.gemini/commands/_project_/test.en.toml +0 -6
  469. package/templates/.gemini/commands/_project_/test.zh-CN.toml +0 -6
  470. package/templates/.gemini/commands/_project_/update-agent-infra.en.toml +0 -6
  471. package/templates/.gemini/commands/_project_/update-agent-infra.zh-CN.toml +0 -6
  472. package/templates/.gemini/commands/_project_/upgrade-dependency.en.toml +0 -8
  473. package/templates/.gemini/commands/_project_/upgrade-dependency.zh-CN.toml +0 -8
  474. package/templates/.gemini/commands/_project_/watch-pr.en.toml +0 -10
  475. package/templates/.gemini/commands/_project_/watch-pr.zh-CN.toml +0 -10
  476. package/templates/.gemini/settings.json +0 -3
@@ -0,0 +1,325 @@
1
+ import crypto from 'node:crypto';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+
5
+ import defaults from '../defaults.json' with { type: 'json' };
6
+ import { normalizeAgentClients, serializeAgentClients } from './config.ts';
7
+ import { normalizeCustomTUIs } from './custom-tuis.ts';
8
+ import { renderNextStepCommands } from './next-steps.ts';
9
+ import { planAgentClientProjectAssets } from './project-assets.ts';
10
+ import {
11
+ listAgentClientAdapters,
12
+ listEnabledAgentClientAdapters
13
+ } from './registry.ts';
14
+ import type { AgentClientProjectAssetPlan, ProjectFileRegistry } from './project-assets.ts';
15
+ import type { NextStepCommand } from './next-steps.ts';
16
+ import type { AgentClientDiagnostic } from './config.ts';
17
+ import type { AgentClientId, AgentClientState } from './types.ts';
18
+
19
+ type AgentClientWorkflowMutation =
20
+ | Readonly<{ type: 'none' }>
21
+ | Readonly<{ type: 'set-enabled'; id: AgentClientId; value: boolean }>
22
+ | Readonly<{ type: 'replace-state'; state: AgentClientState }>;
23
+
24
+ type AgentClientSeedOperation = Readonly<{
25
+ kind: 'write' | 'remove' | 'protect' | 'unchanged';
26
+ clientId: AgentClientId;
27
+ target: string;
28
+ content?: string;
29
+ reason?: 'user-modified' | 'unknown-origin';
30
+ }>;
31
+
32
+ type WorkflowDiagnostic = AgentClientDiagnostic | Readonly<{ code: string; path: string }>;
33
+
34
+ type AgentClientWorkflowPlan = Readonly<{
35
+ source: 'canonical' | 'legacy';
36
+ before: AgentClientState;
37
+ desired: AgentClientState;
38
+ nextConfig: Record<string, unknown>;
39
+ projectAssets: AgentClientProjectAssetPlan;
40
+ seedOperations: readonly AgentClientSeedOperation[];
41
+ nextSteps: readonly NextStepCommand[];
42
+ diagnostics: readonly WorkflowDiagnostic[];
43
+ changed: boolean;
44
+ projectRoot: string;
45
+ configPath: string;
46
+ }>;
47
+
48
+ type AgentClientReconcileDependencies = Readonly<{
49
+ mkdirSync?: typeof fs.mkdirSync;
50
+ writeFileSync?: typeof fs.writeFileSync;
51
+ renameSync?: typeof fs.renameSync;
52
+ unlinkSync?: typeof fs.unlinkSync;
53
+ }>;
54
+
55
+ type AgentClientReconcileResult = Readonly<{
56
+ status: 'applied' | 'unchanged';
57
+ configUpdated: boolean;
58
+ applied: readonly string[];
59
+ protected: readonly string[];
60
+ unchanged: readonly string[];
61
+ }>;
62
+
63
+ function isRecord(value: unknown): value is Record<string, unknown> {
64
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
65
+ }
66
+
67
+ function hash(content: string | Buffer): string {
68
+ return `sha256:${crypto.createHash('sha256').update(content).digest('hex')}`;
69
+ }
70
+
71
+ function trustedBaseline(value: unknown): string | null {
72
+ return typeof value === 'string' && /^sha256:[a-f0-9]{64}$/.test(value)
73
+ ? value
74
+ : null;
75
+ }
76
+
77
+ function cloneState(state: AgentClientState): AgentClientState {
78
+ return Object.fromEntries(
79
+ Object.entries(state).map(([id, value]) => [id, { ...value }])
80
+ ) as AgentClientState;
81
+ }
82
+
83
+ function applyMutation(
84
+ state: AgentClientState,
85
+ mutation: AgentClientWorkflowMutation
86
+ ): AgentClientState {
87
+ if (mutation.type === 'none') return cloneState(state);
88
+ if (mutation.type === 'replace-state') return cloneState(mutation.state);
89
+ return Object.fromEntries(
90
+ Object.entries(state).map(([id, value]) => [
91
+ id,
92
+ id === mutation.id ? { ...value, enabled: mutation.value } : { ...value }
93
+ ])
94
+ ) as AgentClientState;
95
+ }
96
+
97
+ function registryFrom(value: unknown): ProjectFileRegistry {
98
+ const files = isRecord(value) ? value : {};
99
+ const strings = (candidate: unknown): string[] => Array.isArray(candidate)
100
+ ? candidate.filter((entry): entry is string => typeof entry === 'string')
101
+ : [];
102
+ return {
103
+ managed: strings(files.managed),
104
+ merged: strings(files.merged),
105
+ ejected: strings(files.ejected)
106
+ };
107
+ }
108
+
109
+ function isPathOwnedByOtherPlatform(relativePath: string, platformType: string): boolean {
110
+ const top = relativePath.replace(/\\/g, '/').replace(/^\.\//, '').split('/')[0] ?? '';
111
+ return top.startsWith('.')
112
+ && ['github', 'none'].includes(top.slice(1))
113
+ && top.slice(1) !== platformType;
114
+ }
115
+
116
+ function renderSeed(content: string, config: Record<string, unknown>): string {
117
+ return content
118
+ .replaceAll('{{project}}', String(config.project ?? ''))
119
+ .replaceAll('{{org}}', String(config.org ?? ''));
120
+ }
121
+
122
+ function planAgentClientReconciliation(input: Readonly<{
123
+ config: Record<string, unknown>;
124
+ mutation: AgentClientWorkflowMutation;
125
+ projectRoot: string;
126
+ templateRoot: string;
127
+ platformType: string;
128
+ language: string;
129
+ }>): AgentClientWorkflowPlan {
130
+ const normalized = normalizeAgentClients(input.config);
131
+ const desired = applyMutation(normalized.state, input.mutation);
132
+ const adapters = listAgentClientAdapters();
133
+ const current = registryFrom(input.config.files);
134
+ const sharedDefaults = {
135
+ managed: defaults.files.managed.filter((entry) =>
136
+ !isPathOwnedByOtherPlatform(entry, input.platformType)
137
+ ),
138
+ merged: defaults.files.merged.filter((entry) =>
139
+ !isPathOwnedByOtherPlatform(entry, input.platformType)
140
+ ),
141
+ ejected: defaults.files.ejected
142
+ };
143
+ const projectAssets = planAgentClientProjectAssets({
144
+ current,
145
+ sharedDefaults,
146
+ enabledAdapters: listEnabledAgentClientAdapters(desired),
147
+ allAdapters: adapters
148
+ });
149
+
150
+ const nextConfig = structuredClone(input.config);
151
+ nextConfig.agentClients = serializeAgentClients(desired);
152
+ delete nextConfig.tuis;
153
+ if (normalized.remainingSandboxTools !== undefined) {
154
+ const sandbox = isRecord(nextConfig.sandbox) ? { ...nextConfig.sandbox } : {};
155
+ sandbox.tools = [
156
+ 'agent-infra',
157
+ ...normalized.remainingSandboxTools.filter((tool) => tool !== 'agent-infra')
158
+ ];
159
+ nextConfig.sandbox = sandbox;
160
+ }
161
+ const existingFiles = isRecord(nextConfig.files) ? nextConfig.files : {};
162
+ const existingBaselines = isRecord(existingFiles.managedBaselines)
163
+ ? existingFiles.managedBaselines
164
+ : {};
165
+ const baselines: Record<string, unknown> = { ...existingBaselines };
166
+ nextConfig.files = {
167
+ ...existingFiles,
168
+ managed: [...projectAssets.registry.managed],
169
+ merged: [...projectAssets.registry.merged],
170
+ ejected: [...projectAssets.registry.ejected],
171
+ managedBaselines: baselines
172
+ };
173
+
174
+ const projectName = String(input.config.project ?? '');
175
+ const language = input.language === 'zh-CN' ? 'zh-CN' : 'en';
176
+ const seedOperations: AgentClientSeedOperation[] = [];
177
+ for (const adapter of adapters) {
178
+ for (const seed of adapter.project.seedCommands) {
179
+ const relativeTarget = seed.target.replaceAll('${projectName}', projectName);
180
+ const target = path.join(input.projectRoot, relativeTarget);
181
+ const templatePath = path.join(input.templateRoot, seed.templates[language]);
182
+ const content = renderSeed(fs.readFileSync(templatePath, 'utf8'), input.config);
183
+ const templateHash = hash(content);
184
+ const exists = fs.existsSync(target);
185
+ const localHash = exists ? hash(fs.readFileSync(target)) : null;
186
+ const baseline = trustedBaseline(baselines[relativeTarget]);
187
+ const enabled = desired[adapter.id].enabled;
188
+
189
+ if (enabled) {
190
+ if (!exists || (baseline !== null && localHash === baseline)) {
191
+ baselines[relativeTarget] = templateHash;
192
+ seedOperations.push({
193
+ kind: localHash === templateHash ? 'unchanged' : 'write',
194
+ clientId: adapter.id,
195
+ target: relativeTarget,
196
+ ...(localHash === templateHash ? {} : { content })
197
+ });
198
+ } else if (localHash === templateHash) {
199
+ baselines[relativeTarget] = templateHash;
200
+ seedOperations.push({ kind: 'unchanged', clientId: adapter.id, target: relativeTarget });
201
+ } else {
202
+ seedOperations.push({
203
+ kind: 'protect',
204
+ clientId: adapter.id,
205
+ target: relativeTarget,
206
+ reason: baseline ? 'user-modified' : 'unknown-origin'
207
+ });
208
+ }
209
+ } else if (!exists) {
210
+ delete baselines[relativeTarget];
211
+ seedOperations.push({ kind: 'unchanged', clientId: adapter.id, target: relativeTarget });
212
+ } else if ((baseline !== null && localHash === baseline) || localHash === templateHash) {
213
+ delete baselines[relativeTarget];
214
+ seedOperations.push({ kind: 'remove', clientId: adapter.id, target: relativeTarget });
215
+ } else {
216
+ seedOperations.push({
217
+ kind: 'protect',
218
+ clientId: adapter.id,
219
+ target: relativeTarget,
220
+ reason: baseline ? 'user-modified' : 'unknown-origin'
221
+ });
222
+ }
223
+ }
224
+ }
225
+ if (Object.keys(baselines).length === 0) {
226
+ delete (nextConfig.files as Record<string, unknown>).managedBaselines;
227
+ }
228
+
229
+ const custom = normalizeCustomTUIs(input.projectRoot, input.config.customTUIs ?? []);
230
+ const nextSteps = renderNextStepCommands({
231
+ projectName,
232
+ state: desired,
233
+ customTUIs: custom.items,
234
+ skillName: 'update-agent-infra'
235
+ });
236
+ const actionableSeed = seedOperations.some((operation) =>
237
+ operation.kind === 'write' || operation.kind === 'remove'
238
+ );
239
+ const changed = JSON.stringify(nextConfig) !== JSON.stringify(input.config)
240
+ || actionableSeed;
241
+
242
+ return Object.freeze({
243
+ source: normalized.source,
244
+ before: normalized.state,
245
+ desired,
246
+ nextConfig,
247
+ projectAssets,
248
+ seedOperations: Object.freeze(seedOperations),
249
+ nextSteps,
250
+ diagnostics: Object.freeze([...normalized.diagnostics, ...custom.diagnostics]),
251
+ changed,
252
+ projectRoot: input.projectRoot,
253
+ configPath: path.join(input.projectRoot, '.agents', '.airc.json')
254
+ });
255
+ }
256
+
257
+ function applyAgentClientReconciliation(
258
+ plan: AgentClientWorkflowPlan,
259
+ dependencies: AgentClientReconcileDependencies = {}
260
+ ): AgentClientReconcileResult {
261
+ const mkdirSync = dependencies.mkdirSync ?? fs.mkdirSync;
262
+ const writeFileSync = dependencies.writeFileSync ?? fs.writeFileSync;
263
+ const renameSync = dependencies.renameSync ?? fs.renameSync;
264
+ const unlinkSync = dependencies.unlinkSync ?? fs.unlinkSync;
265
+ const applied: string[] = [];
266
+ const protectedTargets: string[] = [];
267
+ const unchanged: string[] = [];
268
+
269
+ for (const operation of plan.seedOperations) {
270
+ const target = path.join(plan.projectRoot, operation.target);
271
+ if (operation.kind === 'write') {
272
+ mkdirSync(path.dirname(target), { recursive: true });
273
+ writeFileSync(target, operation.content!, 'utf8');
274
+ applied.push(operation.target);
275
+ } else if (operation.kind === 'remove') {
276
+ if (fs.existsSync(target)) unlinkSync(target);
277
+ applied.push(operation.target);
278
+ } else if (operation.kind === 'protect') {
279
+ protectedTargets.push(operation.target);
280
+ } else {
281
+ unchanged.push(operation.target);
282
+ }
283
+ }
284
+
285
+ const serialized = `${JSON.stringify(plan.nextConfig, null, 2)}\n`;
286
+ const previous = fs.existsSync(plan.configPath)
287
+ ? fs.readFileSync(plan.configPath, 'utf8')
288
+ : null;
289
+ const configUpdated = previous !== serialized;
290
+ if (configUpdated) {
291
+ mkdirSync(path.dirname(plan.configPath), { recursive: true });
292
+ const temporary = `${plan.configPath}.tmp-${process.pid}-${Date.now()}`;
293
+ try {
294
+ writeFileSync(temporary, serialized, 'utf8');
295
+ renameSync(temporary, plan.configPath);
296
+ } catch (error) {
297
+ try {
298
+ if (fs.existsSync(temporary)) unlinkSync(temporary);
299
+ } catch {
300
+ // Preserve the original error; a later idempotent rerun can clean stale state.
301
+ }
302
+ throw error;
303
+ }
304
+ }
305
+
306
+ return Object.freeze({
307
+ status: configUpdated || applied.length > 0 ? 'applied' : 'unchanged',
308
+ configUpdated,
309
+ applied: Object.freeze(applied),
310
+ protected: Object.freeze(protectedTargets),
311
+ unchanged: Object.freeze(unchanged)
312
+ });
313
+ }
314
+
315
+ export {
316
+ applyAgentClientReconciliation,
317
+ planAgentClientReconciliation
318
+ };
319
+ export type {
320
+ AgentClientReconcileDependencies,
321
+ AgentClientReconcileResult,
322
+ AgentClientSeedOperation,
323
+ AgentClientWorkflowMutation,
324
+ AgentClientWorkflowPlan
325
+ };
@@ -0,0 +1,154 @@
1
+ import { BUILTIN_AGENT_CLIENT_ADAPTERS } from './adapters/index.ts';
2
+ import { AGENT_CLIENT_IDS, isAgentClientId } from './types.ts';
3
+ import type {
4
+ AgentClientAdapter,
5
+ AgentClientManifestEntry,
6
+ AgentClientRegistry
7
+ } from './adapter.ts';
8
+ import type {
9
+ AgentClientCapabilityId,
10
+ AgentClientCapabilitySupport,
11
+ AgentClientState,
12
+ AgentClientSupportLevel
13
+ } from './types.ts';
14
+
15
+ function buildRegistry(): Readonly<{
16
+ registry: AgentClientRegistry;
17
+ adapters: readonly AgentClientAdapter[];
18
+ }> {
19
+ if (BUILTIN_AGENT_CLIENT_ADAPTERS.length !== AGENT_CLIENT_IDS.length) {
20
+ throw new Error('Agent Client Registry is incomplete');
21
+ }
22
+
23
+ const byId = new Map(
24
+ BUILTIN_AGENT_CLIENT_ADAPTERS.map((adapter) => [adapter.id, adapter])
25
+ );
26
+ if (byId.size !== BUILTIN_AGENT_CLIENT_ADAPTERS.length) {
27
+ throw new Error('Agent Client Registry contains duplicate IDs');
28
+ }
29
+
30
+ const adapters = Object.freeze(
31
+ AGENT_CLIENT_IDS.map((id) => {
32
+ const adapter = byId.get(id);
33
+ if (!adapter || adapter.id !== id) {
34
+ throw new Error(`Agent Client Registry is missing '${id}'`);
35
+ }
36
+ return adapter;
37
+ })
38
+ );
39
+
40
+ const ownedPaths = adapters.flatMap((adapter) =>
41
+ adapter.project.ownedPathPrefixes.map((prefix) => ({
42
+ id: adapter.id,
43
+ prefix
44
+ }))
45
+ );
46
+ for (const [index, current] of ownedPaths.entries()) {
47
+ for (const other of ownedPaths.slice(index + 1)) {
48
+ if (
49
+ current.id !== other.id
50
+ && (
51
+ current.prefix.startsWith(other.prefix)
52
+ || other.prefix.startsWith(current.prefix)
53
+ )
54
+ ) {
55
+ throw new Error(
56
+ `Agent Client owned paths overlap: '${current.prefix}' and '${other.prefix}'`
57
+ );
58
+ }
59
+ }
60
+ }
61
+
62
+ const registry = Object.freeze(
63
+ Object.fromEntries(adapters.map((adapter) => [adapter.id, adapter]))
64
+ ) as AgentClientRegistry;
65
+
66
+ return Object.freeze({ registry, adapters });
67
+ }
68
+
69
+ const built = buildRegistry();
70
+ const AGENT_CLIENT_REGISTRY = built.registry;
71
+ const AGENT_CLIENT_ADAPTERS = built.adapters;
72
+
73
+ function listAgentClientAdapters(): readonly AgentClientAdapter[] {
74
+ return AGENT_CLIENT_ADAPTERS;
75
+ }
76
+
77
+ function getAgentClientAdapter(id: unknown): AgentClientAdapter {
78
+ if (!isAgentClientId(id)) {
79
+ throw new Error(`No Agent Client adapter registered for '${String(id)}'`);
80
+ }
81
+ return AGENT_CLIENT_REGISTRY[id];
82
+ }
83
+
84
+ function listEnabledAgentClientAdapters(
85
+ state: AgentClientState
86
+ ): readonly AgentClientAdapter[] {
87
+ return Object.freeze(
88
+ AGENT_CLIENT_ADAPTERS.filter((adapter) => state[adapter.id].enabled)
89
+ );
90
+ }
91
+
92
+ function listInstalledAgentClientAdapters(
93
+ state: AgentClientState
94
+ ): readonly AgentClientAdapter[] {
95
+ return Object.freeze(
96
+ AGENT_CLIENT_ADAPTERS.filter((adapter) => state[adapter.id].installInSandbox)
97
+ );
98
+ }
99
+
100
+ function getAgentClientCapability(
101
+ id: unknown,
102
+ capability: AgentClientCapabilityId
103
+ ): AgentClientCapabilitySupport {
104
+ return getAgentClientAdapter(id).capabilities[capability];
105
+ }
106
+
107
+ function getAgentClientModelSelection(id: unknown) {
108
+ return getAgentClientAdapter(id).modelSelection;
109
+ }
110
+
111
+ function getAgentClientDelegationEvidence(id: unknown) {
112
+ return getAgentClientAdapter(id).delegationEvidence;
113
+ }
114
+
115
+ function listEnabledAgentClientAdaptersByCapability(
116
+ state: AgentClientState,
117
+ capability: AgentClientCapabilityId,
118
+ acceptedLevels: readonly AgentClientSupportLevel[]
119
+ ): readonly AgentClientAdapter[] {
120
+ const accepted = new Set(acceptedLevels);
121
+ return Object.freeze(
122
+ AGENT_CLIENT_ADAPTERS.filter((adapter) =>
123
+ state[adapter.id].enabled
124
+ && accepted.has(adapter.capabilities[capability].level)
125
+ )
126
+ );
127
+ }
128
+
129
+ function createAgentClientManifest(): readonly AgentClientManifestEntry[] {
130
+ return Object.freeze(
131
+ AGENT_CLIENT_ADAPTERS.map((adapter) => Object.freeze({
132
+ id: adapter.id,
133
+ displayName: adapter.displayName,
134
+ invocation: adapter.invocation,
135
+ ownedPathPrefixes: Object.freeze([...adapter.project.ownedPathPrefixes]),
136
+ managed: Object.freeze([...adapter.project.managed]),
137
+ merged: Object.freeze([...adapter.project.merged]),
138
+ ejected: Object.freeze([...adapter.project.ejected])
139
+ }))
140
+ );
141
+ }
142
+
143
+ export {
144
+ AGENT_CLIENT_REGISTRY,
145
+ createAgentClientManifest,
146
+ getAgentClientAdapter,
147
+ getAgentClientCapability,
148
+ getAgentClientDelegationEvidence,
149
+ getAgentClientModelSelection,
150
+ listAgentClientAdapters,
151
+ listEnabledAgentClientAdapters,
152
+ listEnabledAgentClientAdaptersByCapability,
153
+ listInstalledAgentClientAdapters
154
+ };
@@ -0,0 +1,80 @@
1
+ import {
2
+ AGENT_CLIENT_CAPABILITY_IDS,
3
+ AGENT_CLIENT_IDS,
4
+ AGENT_CLIENT_SUPPORT_LEVELS
5
+ } from './types.ts';
6
+
7
+ const AGENT_CLIENTS_SCHEMA = {
8
+ $schema: 'http://json-schema.org/draft-07/schema#',
9
+ type: 'object',
10
+ required: ['agentClients'],
11
+ properties: {
12
+ agentClients: {
13
+ type: 'array',
14
+ minItems: AGENT_CLIENT_IDS.length,
15
+ maxItems: AGENT_CLIENT_IDS.length,
16
+ uniqueItems: true,
17
+ description: 'Canonical Agent Client configuration. Object ID completeness and uniqueness are enforced by the runtime normalizer.',
18
+ items: {
19
+ type: 'object',
20
+ additionalProperties: false,
21
+ required: ['id', 'enabled', 'installInSandbox'],
22
+ properties: {
23
+ id: {
24
+ type: 'string',
25
+ enum: [...AGENT_CLIENT_IDS]
26
+ },
27
+ enabled: {
28
+ type: 'boolean'
29
+ },
30
+ installInSandbox: {
31
+ type: 'boolean'
32
+ },
33
+ orchestration: {
34
+ type: 'object',
35
+ additionalProperties: false,
36
+ required: ['executor', 'reviewer'],
37
+ properties: {
38
+ executor: { $ref: '#/definitions/orchestrationRolePolicy' },
39
+ reviewer: { $ref: '#/definitions/orchestrationRolePolicy' }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ },
45
+ customTUIs: {
46
+ type: 'array',
47
+ items: {
48
+ type: 'object',
49
+ additionalProperties: true,
50
+ required: ['name', 'dir', 'invoke'],
51
+ properties: {
52
+ name: { type: 'string' },
53
+ dir: { type: 'string' },
54
+ invoke: { type: 'string' }
55
+ }
56
+ }
57
+ }
58
+ },
59
+ definitions: {
60
+ orchestrationRolePolicy: {
61
+ type: 'object',
62
+ additionalProperties: false,
63
+ required: ['model', 'reasoningEffort'],
64
+ properties: {
65
+ model: { type: 'string', minLength: 1 },
66
+ reasoningEffort: { type: 'string', minLength: 1 }
67
+ }
68
+ },
69
+ agentClientCapabilityId: {
70
+ type: 'string',
71
+ enum: [...AGENT_CLIENT_CAPABILITY_IDS]
72
+ },
73
+ agentClientSupportLevel: {
74
+ type: 'string',
75
+ enum: [...AGENT_CLIENT_SUPPORT_LEVELS]
76
+ }
77
+ }
78
+ } as const;
79
+
80
+ export { AGENT_CLIENTS_SCHEMA };
@@ -0,0 +1,53 @@
1
+ // Active AI collaborator short tokens — the write-side whitelist for the
2
+ // activity log. Migrated from lib/task/commands/log.ts so that the write-side
3
+ // internal commands and the rendering side share one definition. Historical
4
+ // Gemini tokens remain read-only and are handled by classifyAgent below.
5
+ export const KNOWN_AI_AGENTS: ReadonlySet<string> =
6
+ new Set(['claude', 'codex', 'antigravity', 'opencode', 'cursor']);
7
+
8
+ // Long name -> short name mapping (HD-4, decision A): `claude-code` reuses the
9
+ // existing orchestration precedent, and `antigravity-cli` is the active
10
+ // client. `gemini-cli` is intentionally not writable.
11
+ export const AGENT_LONG_NAMES: Readonly<Record<string, string>> = {
12
+ 'claude-code': 'claude',
13
+ 'antigravity-cli': 'antigravity'
14
+ };
15
+
16
+ export const AGENT_USAGE_HINT =
17
+ "agent must be a short token (claude/codex/antigravity/opencode/cursor), " +
18
+ "a long name (claude-code -> claude, antigravity-cli -> antigravity), or 'human'";
19
+
20
+ // Read-side historical compatibility for activity-log rendering: `gemini` and
21
+ // `gemini-cli` stay recognizable when displaying old logs, but are never
22
+ // accepted by normalizeAgentToken (write side).
23
+ const READ_KNOWN_AI_AGENTS: ReadonlySet<string> =
24
+ new Set([...KNOWN_AI_AGENTS, 'gemini']);
25
+
26
+ const READ_AGENT_LONG_NAMES: Readonly<Record<string, string>> = {
27
+ ...AGENT_LONG_NAMES,
28
+ 'gemini-cli': 'gemini'
29
+ };
30
+
31
+ // Strict write-side validation: the value must be exactly a short token, a
32
+ // long name, or 'human'; returns the normalized short token, or null when
33
+ // the value is not a recognized agent.
34
+ export function normalizeAgentToken(value: string): string | null {
35
+ const trimmed = value.trim();
36
+ if (trimmed === 'human') return 'human';
37
+ if (KNOWN_AI_AGENTS.has(trimmed)) return trimmed;
38
+ const short = AGENT_LONG_NAMES[trimmed];
39
+ return short ?? null;
40
+ }
41
+
42
+ // Loose rendering-side classification: tolerates historical parenthetical
43
+ // annotations; unknown tokens keep the `human` grouping but get a visible
44
+ // signal. The "known AI token" test is `classifyAgent(value).status === 'ai'`.
45
+ export function classifyAgent(raw: string):
46
+ { status: 'ai' | 'human' | 'unknown'; display: string } {
47
+ const token = raw.trim().split(/\s+/)[0]?.replace(/\(.*$/, '') ?? '';
48
+ if (token === '') return { status: 'unknown', display: 'human' };
49
+ if (token === 'human') return { status: 'human', display: 'human' };
50
+ if (READ_KNOWN_AI_AGENTS.has(token)) return { status: 'ai', display: token };
51
+ const short = READ_AGENT_LONG_NAMES[token];
52
+ return short ? { status: 'ai', display: short } : { status: 'unknown', display: 'human' };
53
+ }
@@ -0,0 +1,92 @@
1
+ const AGENT_CLIENT_IDS = [
2
+ 'claude-code',
3
+ 'codex',
4
+ 'antigravity-cli',
5
+ 'opencode'
6
+ ] as const;
7
+
8
+ type AgentClientId = (typeof AGENT_CLIENT_IDS)[number];
9
+
10
+ type OrchestrationRolePolicy = Readonly<{
11
+ model: string;
12
+ reasoningEffort: string;
13
+ }>;
14
+
15
+ type OrchestrationModelPolicy = Readonly<{
16
+ executor: OrchestrationRolePolicy;
17
+ reviewer: OrchestrationRolePolicy;
18
+ }>;
19
+
20
+ type AgentClientConfig = Readonly<{
21
+ id: AgentClientId;
22
+ enabled: boolean;
23
+ installInSandbox: boolean;
24
+ orchestration?: OrchestrationModelPolicy;
25
+ }>;
26
+
27
+ type AgentClientsConfig = readonly AgentClientConfig[];
28
+
29
+ type AgentClientState = Readonly<
30
+ Record<
31
+ AgentClientId,
32
+ Readonly<{
33
+ enabled: boolean;
34
+ installInSandbox: boolean;
35
+ orchestration?: OrchestrationModelPolicy;
36
+ }>
37
+ >
38
+ >;
39
+
40
+ const AGENT_CLIENT_CAPABILITY_IDS = [
41
+ 'instructions',
42
+ 'skills',
43
+ 'commands',
44
+ 'hooks',
45
+ 'subagents',
46
+ 'orchestration',
47
+ 'sandbox',
48
+ 'verification'
49
+ ] as const;
50
+
51
+ const AGENT_CLIENT_SUPPORT_LEVELS = [
52
+ 'compatible',
53
+ 'integrated',
54
+ 'verified',
55
+ 'experimental',
56
+ 'unsupported'
57
+ ] as const;
58
+
59
+ type AgentClientCapabilityId = (typeof AGENT_CLIENT_CAPABILITY_IDS)[number];
60
+ type AgentClientSupportLevel = (typeof AGENT_CLIENT_SUPPORT_LEVELS)[number];
61
+
62
+ type AgentClientCapabilitySupport = Readonly<{
63
+ level: AgentClientSupportLevel;
64
+ }>;
65
+
66
+ type AgentClientCapabilityMap = Readonly<
67
+ Record<AgentClientCapabilityId, AgentClientCapabilitySupport>
68
+ >;
69
+
70
+ function isAgentClientId(value: unknown): value is AgentClientId {
71
+ return typeof value === 'string'
72
+ && (AGENT_CLIENT_IDS as readonly string[]).includes(value);
73
+ }
74
+
75
+ export {
76
+ AGENT_CLIENT_IDS,
77
+ AGENT_CLIENT_CAPABILITY_IDS,
78
+ AGENT_CLIENT_SUPPORT_LEVELS,
79
+ isAgentClientId
80
+ };
81
+ export type {
82
+ AgentClientId,
83
+ OrchestrationRolePolicy,
84
+ OrchestrationModelPolicy,
85
+ AgentClientConfig,
86
+ AgentClientsConfig,
87
+ AgentClientState,
88
+ AgentClientCapabilityId,
89
+ AgentClientSupportLevel,
90
+ AgentClientCapabilitySupport,
91
+ AgentClientCapabilityMap
92
+ };