@phnx-labs/agents-cli 1.12.0 → 1.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +293 -300
  3. package/dist/commands/alias.d.ts +11 -0
  4. package/dist/commands/alias.js +117 -0
  5. package/dist/commands/beta.d.ts +2 -0
  6. package/dist/commands/beta.js +53 -0
  7. package/dist/commands/cloud.d.ts +10 -0
  8. package/dist/commands/cloud.js +408 -0
  9. package/dist/commands/commands.d.ts +9 -1
  10. package/dist/commands/commands.js +24 -172
  11. package/dist/commands/daemon.d.ts +8 -1
  12. package/dist/commands/daemon.js +13 -5
  13. package/dist/commands/doctor.d.ts +15 -0
  14. package/dist/commands/doctor.js +132 -0
  15. package/dist/commands/drive.d.ts +8 -1
  16. package/dist/commands/drive.js +20 -3
  17. package/dist/commands/exec.d.ts +8 -1
  18. package/dist/commands/exec.js +207 -20
  19. package/dist/commands/factory.d.ts +19 -0
  20. package/dist/commands/factory.js +71 -0
  21. package/dist/commands/fork.d.ts +8 -1
  22. package/dist/commands/fork.js +11 -4
  23. package/dist/commands/hooks.d.ts +9 -1
  24. package/dist/commands/hooks.js +30 -182
  25. package/dist/commands/init.d.ts +15 -1
  26. package/dist/commands/init.js +168 -74
  27. package/dist/commands/mcp.d.ts +9 -1
  28. package/dist/commands/mcp.js +11 -7
  29. package/dist/commands/models.d.ts +8 -1
  30. package/dist/commands/models.js +45 -6
  31. package/dist/commands/packages.d.ts +8 -1
  32. package/dist/commands/packages.js +13 -7
  33. package/dist/commands/permissions.d.ts +9 -1
  34. package/dist/commands/permissions.js +3 -3
  35. package/dist/commands/plugins.d.ts +8 -1
  36. package/dist/commands/plugins.js +13 -2
  37. package/dist/commands/profiles.d.ts +11 -0
  38. package/dist/commands/profiles.js +291 -0
  39. package/dist/commands/prune.d.ts +22 -0
  40. package/dist/commands/prune.js +191 -0
  41. package/dist/commands/pty.d.ts +1 -1
  42. package/dist/commands/pty.js +2 -1
  43. package/dist/commands/pull.d.ts +8 -1
  44. package/dist/commands/pull.js +93 -129
  45. package/dist/commands/refresh-memory.d.ts +7 -1
  46. package/dist/commands/refresh-memory.js +7 -1
  47. package/dist/commands/repo.d.ts +15 -0
  48. package/dist/commands/repo.js +570 -0
  49. package/dist/commands/resource-view.d.ts +10 -3
  50. package/dist/commands/resource-view.js +18 -5
  51. package/dist/commands/routines.d.ts +8 -1
  52. package/dist/commands/routines.js +17 -4
  53. package/dist/commands/rules.d.ts +9 -1
  54. package/dist/commands/rules.js +16 -11
  55. package/dist/commands/secrets.d.ts +10 -0
  56. package/dist/commands/secrets.js +511 -0
  57. package/dist/commands/sessions-picker.d.ts +2 -1
  58. package/dist/commands/sessions-picker.js +88 -11
  59. package/dist/commands/sessions-tail.d.ts +19 -0
  60. package/dist/commands/sessions-tail.js +235 -0
  61. package/dist/commands/sessions.d.ts +2 -1
  62. package/dist/commands/sessions.js +288 -7
  63. package/dist/commands/skills.d.ts +9 -1
  64. package/dist/commands/skills.js +28 -178
  65. package/dist/commands/status.d.ts +7 -1
  66. package/dist/commands/status.js +7 -1
  67. package/dist/commands/subagents.d.ts +8 -1
  68. package/dist/commands/subagents.js +11 -1
  69. package/dist/commands/sync.d.ts +8 -1
  70. package/dist/commands/sync.js +8 -1
  71. package/dist/commands/teams-picker.d.ts +4 -1
  72. package/dist/commands/teams-picker.js +55 -3
  73. package/dist/commands/teams.d.ts +15 -1
  74. package/dist/commands/teams.js +323 -69
  75. package/dist/commands/usage.d.ts +11 -0
  76. package/dist/commands/usage.js +60 -0
  77. package/dist/commands/utils.d.ts +6 -1
  78. package/dist/commands/utils.js +6 -1
  79. package/dist/commands/versions.d.ts +8 -1
  80. package/dist/commands/versions.js +4 -3
  81. package/dist/commands/view.d.ts +47 -2
  82. package/dist/commands/view.js +353 -20
  83. package/dist/index.d.ts +7 -2
  84. package/dist/index.js +205 -38
  85. package/dist/lib/acp/client.d.ts +31 -0
  86. package/dist/lib/acp/client.js +117 -0
  87. package/dist/lib/acp/harnesses.d.ts +26 -0
  88. package/dist/lib/acp/harnesses.js +65 -0
  89. package/dist/lib/acp/run.d.ts +18 -0
  90. package/dist/lib/acp/run.js +39 -0
  91. package/dist/lib/agents.d.ts +74 -2
  92. package/dist/lib/agents.js +207 -23
  93. package/dist/lib/artifact-actions.d.ts +8 -4
  94. package/dist/lib/artifact-actions.js +8 -6
  95. package/dist/lib/auto-pull-worker.d.ts +11 -0
  96. package/dist/lib/auto-pull-worker.js +121 -0
  97. package/dist/lib/auto-pull.d.ts +31 -0
  98. package/dist/lib/auto-pull.js +97 -0
  99. package/dist/lib/beta.d.ts +23 -0
  100. package/dist/lib/beta.js +90 -0
  101. package/dist/lib/capabilities.d.ts +29 -0
  102. package/dist/lib/capabilities.js +74 -0
  103. package/dist/lib/cloud/codex.d.ts +25 -0
  104. package/dist/lib/cloud/codex.js +250 -0
  105. package/dist/lib/cloud/factory.d.ts +31 -0
  106. package/dist/lib/cloud/factory.js +53 -0
  107. package/dist/lib/cloud/registry.d.ts +15 -0
  108. package/dist/lib/cloud/registry.js +67 -0
  109. package/dist/lib/cloud/rush.d.ts +75 -0
  110. package/dist/lib/cloud/rush.js +438 -0
  111. package/dist/lib/cloud/store.d.ts +22 -0
  112. package/dist/lib/cloud/store.js +115 -0
  113. package/dist/lib/cloud/stream.d.ts +23 -0
  114. package/dist/lib/cloud/stream.js +194 -0
  115. package/dist/lib/cloud/types.d.ts +205 -0
  116. package/dist/lib/cloud/types.js +34 -0
  117. package/dist/lib/command-skills.d.ts +20 -0
  118. package/dist/lib/command-skills.js +142 -0
  119. package/dist/lib/commands.d.ts +22 -2
  120. package/dist/lib/commands.js +51 -11
  121. package/dist/lib/convert.d.ts +10 -1
  122. package/dist/lib/convert.js +9 -1
  123. package/dist/lib/daemon.d.ts +21 -1
  124. package/dist/lib/daemon.js +97 -4
  125. package/dist/lib/drive-sync.d.ts +18 -1
  126. package/dist/lib/drive-sync.js +57 -15
  127. package/dist/lib/exec.d.ts +25 -5
  128. package/dist/lib/exec.js +72 -27
  129. package/dist/lib/fs-walk.d.ts +2 -0
  130. package/dist/lib/fs-walk.js +40 -0
  131. package/dist/lib/fuzzy.d.ts +53 -0
  132. package/dist/lib/fuzzy.js +72 -0
  133. package/dist/lib/gemini-settings.d.ts +4 -0
  134. package/dist/lib/gemini-settings.js +33 -0
  135. package/dist/lib/git.d.ts +12 -2
  136. package/dist/lib/git.js +17 -6
  137. package/dist/lib/help.d.ts +20 -1
  138. package/dist/lib/help.js +45 -6
  139. package/dist/lib/hooks/match.d.ts +32 -0
  140. package/dist/lib/hooks/match.js +120 -0
  141. package/dist/lib/hooks.d.ts +17 -4
  142. package/dist/lib/hooks.js +191 -21
  143. package/dist/lib/manifest.d.ts +6 -1
  144. package/dist/lib/manifest.js +15 -4
  145. package/dist/lib/markdown.d.ts +0 -1
  146. package/dist/lib/markdown.js +6 -1
  147. package/dist/lib/mcp.d.ts +0 -1
  148. package/dist/lib/mcp.js +29 -33
  149. package/dist/lib/memory-compile.d.ts +13 -3
  150. package/dist/lib/memory-compile.js +31 -9
  151. package/dist/lib/memory.d.ts +14 -7
  152. package/dist/lib/memory.js +67 -38
  153. package/dist/lib/migrate.d.ts +8 -0
  154. package/dist/lib/migrate.js +85 -0
  155. package/dist/lib/models.d.ts +25 -11
  156. package/dist/lib/models.js +405 -16
  157. package/dist/lib/onepassword.d.ts +63 -0
  158. package/dist/lib/onepassword.js +186 -0
  159. package/dist/lib/paths.d.ts +8 -0
  160. package/dist/lib/paths.js +20 -0
  161. package/dist/lib/permissions.d.ts +24 -2
  162. package/dist/lib/permissions.js +117 -48
  163. package/dist/lib/picker.d.ts +10 -1
  164. package/dist/lib/picker.js +15 -1
  165. package/dist/lib/plugins.d.ts +7 -1
  166. package/dist/lib/plugins.js +10 -1
  167. package/dist/lib/profiles-presets.d.ts +24 -0
  168. package/dist/lib/profiles-presets.js +103 -0
  169. package/dist/lib/profiles.d.ts +69 -0
  170. package/dist/lib/profiles.js +144 -0
  171. package/dist/lib/pty-client.d.ts +1 -1
  172. package/dist/lib/pty-client.js +0 -1
  173. package/dist/lib/pty-server.d.ts +16 -2
  174. package/dist/lib/pty-server.js +92 -3
  175. package/dist/lib/registry.d.ts +23 -3
  176. package/dist/lib/registry.js +153 -8
  177. package/dist/lib/resources.d.ts +28 -1
  178. package/dist/lib/resources.js +79 -1
  179. package/dist/lib/rotate.d.ts +79 -0
  180. package/dist/lib/rotate.js +285 -0
  181. package/dist/lib/routines.d.ts +29 -1
  182. package/dist/lib/routines.js +32 -5
  183. package/dist/lib/runner.d.ts +14 -1
  184. package/dist/lib/runner.js +22 -3
  185. package/dist/lib/sandbox.d.ts +16 -1
  186. package/dist/lib/sandbox.js +39 -16
  187. package/dist/lib/scheduler.d.ts +8 -1
  188. package/dist/lib/scheduler.js +8 -1
  189. package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
  190. package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
  191. package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
  192. package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
  193. package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
  194. package/dist/lib/secrets/bundles.d.ts +39 -0
  195. package/dist/lib/secrets/bundles.js +189 -0
  196. package/dist/lib/secrets/index.d.ts +55 -0
  197. package/dist/lib/secrets/index.js +211 -0
  198. package/dist/lib/secrets/profiles.d.ts +10 -0
  199. package/dist/lib/secrets/profiles.js +13 -0
  200. package/dist/lib/session/active.d.ts +43 -0
  201. package/dist/lib/session/active.js +392 -0
  202. package/dist/lib/session/artifacts.d.ts +16 -0
  203. package/dist/lib/session/artifacts.js +95 -0
  204. package/dist/lib/session/cloud.d.ts +30 -0
  205. package/dist/lib/session/cloud.js +121 -0
  206. package/dist/lib/session/db.d.ts +23 -2
  207. package/dist/lib/session/db.js +76 -12
  208. package/dist/lib/session/discover.d.ts +19 -4
  209. package/dist/lib/session/discover.js +344 -48
  210. package/dist/lib/session/parse.d.ts +28 -1
  211. package/dist/lib/session/parse.js +267 -9
  212. package/dist/lib/session/prompt.d.ts +9 -1
  213. package/dist/lib/session/prompt.js +17 -3
  214. package/dist/lib/session/render.d.ts +13 -1
  215. package/dist/lib/session/render.js +20 -1
  216. package/dist/lib/session/team-filter.d.ts +9 -1
  217. package/dist/lib/session/team-filter.js +11 -2
  218. package/dist/lib/session/types.d.ts +24 -2
  219. package/dist/lib/session/types.js +10 -2
  220. package/dist/lib/shims.d.ts +93 -5
  221. package/dist/lib/shims.js +380 -67
  222. package/dist/lib/skills.d.ts +27 -2
  223. package/dist/lib/skills.js +127 -65
  224. package/dist/lib/sqlite.d.ts +43 -0
  225. package/dist/lib/sqlite.js +94 -0
  226. package/dist/lib/state.d.ts +114 -22
  227. package/dist/lib/state.js +323 -138
  228. package/dist/lib/subagents.d.ts +9 -1
  229. package/dist/lib/subagents.js +70 -63
  230. package/dist/lib/sync-manifest.d.ts +81 -0
  231. package/dist/lib/sync-manifest.js +450 -0
  232. package/dist/lib/teams/agents.d.ts +103 -5
  233. package/dist/lib/teams/agents.js +414 -91
  234. package/dist/lib/teams/api.d.ts +26 -3
  235. package/dist/lib/teams/api.js +63 -3
  236. package/dist/lib/teams/debug.d.ts +6 -1
  237. package/dist/lib/teams/debug.js +6 -1
  238. package/dist/lib/teams/file_ops.d.ts +7 -1
  239. package/dist/lib/teams/file_ops.js +7 -1
  240. package/dist/lib/teams/index.d.ts +15 -0
  241. package/dist/lib/teams/index.js +14 -0
  242. package/dist/lib/teams/parsers.d.ts +4 -1
  243. package/dist/lib/teams/parsers.js +11 -1
  244. package/dist/lib/teams/persistence.d.ts +15 -1
  245. package/dist/lib/teams/persistence.js +102 -20
  246. package/dist/lib/teams/registry.d.ts +12 -1
  247. package/dist/lib/teams/registry.js +116 -33
  248. package/dist/lib/teams/summarizer.d.ts +15 -1
  249. package/dist/lib/teams/summarizer.js +14 -1
  250. package/dist/lib/teams/supervisor.d.ts +48 -0
  251. package/dist/lib/teams/supervisor.js +73 -0
  252. package/dist/lib/template.d.ts +8 -6
  253. package/dist/lib/template.js +8 -6
  254. package/dist/lib/types.d.ts +147 -8
  255. package/dist/lib/types.js +26 -3
  256. package/dist/lib/usage.d.ts +48 -1
  257. package/dist/lib/usage.js +97 -16
  258. package/dist/lib/version-duplicates.d.ts +21 -0
  259. package/dist/lib/version-duplicates.js +90 -0
  260. package/dist/lib/versions.d.ts +39 -4
  261. package/dist/lib/versions.js +401 -111
  262. package/package.json +33 -18
  263. package/scripts/postinstall.js +126 -30
  264. package/dist/commands/__tests__/sessions.test.d.ts +0 -2
  265. package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
  266. package/dist/commands/__tests__/sessions.test.js +0 -636
  267. package/dist/commands/__tests__/sessions.test.js.map +0 -1
  268. package/dist/commands/commands.d.ts.map +0 -1
  269. package/dist/commands/commands.js.map +0 -1
  270. package/dist/commands/daemon.d.ts.map +0 -1
  271. package/dist/commands/daemon.js.map +0 -1
  272. package/dist/commands/drive.d.ts.map +0 -1
  273. package/dist/commands/drive.js.map +0 -1
  274. package/dist/commands/exec.d.ts.map +0 -1
  275. package/dist/commands/exec.js.map +0 -1
  276. package/dist/commands/fork.d.ts.map +0 -1
  277. package/dist/commands/fork.js.map +0 -1
  278. package/dist/commands/hooks.d.ts.map +0 -1
  279. package/dist/commands/hooks.js.map +0 -1
  280. package/dist/commands/init.d.ts.map +0 -1
  281. package/dist/commands/init.js.map +0 -1
  282. package/dist/commands/mcp.d.ts.map +0 -1
  283. package/dist/commands/mcp.js.map +0 -1
  284. package/dist/commands/models.d.ts.map +0 -1
  285. package/dist/commands/models.js.map +0 -1
  286. package/dist/commands/packages.d.ts.map +0 -1
  287. package/dist/commands/packages.js.map +0 -1
  288. package/dist/commands/permissions.d.ts.map +0 -1
  289. package/dist/commands/permissions.js.map +0 -1
  290. package/dist/commands/plugins.d.ts.map +0 -1
  291. package/dist/commands/plugins.js.map +0 -1
  292. package/dist/commands/pty.d.ts.map +0 -1
  293. package/dist/commands/pty.js.map +0 -1
  294. package/dist/commands/pull.d.ts.map +0 -1
  295. package/dist/commands/pull.js.map +0 -1
  296. package/dist/commands/push.d.ts +0 -3
  297. package/dist/commands/push.d.ts.map +0 -1
  298. package/dist/commands/push.js +0 -180
  299. package/dist/commands/push.js.map +0 -1
  300. package/dist/commands/refresh-memory.d.ts.map +0 -1
  301. package/dist/commands/refresh-memory.js.map +0 -1
  302. package/dist/commands/resource-view.d.ts.map +0 -1
  303. package/dist/commands/resource-view.js.map +0 -1
  304. package/dist/commands/routines.d.ts.map +0 -1
  305. package/dist/commands/routines.js.map +0 -1
  306. package/dist/commands/rules.d.ts.map +0 -1
  307. package/dist/commands/rules.js.map +0 -1
  308. package/dist/commands/sessions-picker.d.ts.map +0 -1
  309. package/dist/commands/sessions-picker.js.map +0 -1
  310. package/dist/commands/sessions.d.ts.map +0 -1
  311. package/dist/commands/sessions.js.map +0 -1
  312. package/dist/commands/skills.d.ts.map +0 -1
  313. package/dist/commands/skills.js.map +0 -1
  314. package/dist/commands/status.d.ts.map +0 -1
  315. package/dist/commands/status.js.map +0 -1
  316. package/dist/commands/subagents.d.ts.map +0 -1
  317. package/dist/commands/subagents.js.map +0 -1
  318. package/dist/commands/sync.d.ts.map +0 -1
  319. package/dist/commands/sync.js.map +0 -1
  320. package/dist/commands/teams-picker.d.ts.map +0 -1
  321. package/dist/commands/teams-picker.js.map +0 -1
  322. package/dist/commands/teams.d.ts.map +0 -1
  323. package/dist/commands/teams.js.map +0 -1
  324. package/dist/commands/utils.d.ts.map +0 -1
  325. package/dist/commands/utils.js.map +0 -1
  326. package/dist/commands/versions.d.ts.map +0 -1
  327. package/dist/commands/versions.js.map +0 -1
  328. package/dist/commands/view.d.ts.map +0 -1
  329. package/dist/commands/view.js.map +0 -1
  330. package/dist/index.d.ts.map +0 -1
  331. package/dist/index.js.map +0 -1
  332. package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
  333. package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
  334. package/dist/lib/__tests__/bugfixes.test.js +0 -192
  335. package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
  336. package/dist/lib/__tests__/exec.test.d.ts +0 -2
  337. package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
  338. package/dist/lib/__tests__/exec.test.js +0 -446
  339. package/dist/lib/__tests__/exec.test.js.map +0 -1
  340. package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
  341. package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
  342. package/dist/lib/__tests__/git-sync.test.js +0 -138
  343. package/dist/lib/__tests__/git-sync.test.js.map +0 -1
  344. package/dist/lib/__tests__/hooks.test.d.ts +0 -2
  345. package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
  346. package/dist/lib/__tests__/hooks.test.js +0 -203
  347. package/dist/lib/__tests__/hooks.test.js.map +0 -1
  348. package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
  349. package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
  350. package/dist/lib/__tests__/memory-compile.test.js +0 -95
  351. package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
  352. package/dist/lib/__tests__/models.test.d.ts +0 -2
  353. package/dist/lib/__tests__/models.test.d.ts.map +0 -1
  354. package/dist/lib/__tests__/models.test.js +0 -184
  355. package/dist/lib/__tests__/models.test.js.map +0 -1
  356. package/dist/lib/__tests__/usage.test.d.ts +0 -2
  357. package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
  358. package/dist/lib/__tests__/usage.test.js +0 -218
  359. package/dist/lib/__tests__/usage.test.js.map +0 -1
  360. package/dist/lib/agents.d.ts.map +0 -1
  361. package/dist/lib/agents.js.map +0 -1
  362. package/dist/lib/artifact-actions.d.ts.map +0 -1
  363. package/dist/lib/artifact-actions.js.map +0 -1
  364. package/dist/lib/commands.d.ts.map +0 -1
  365. package/dist/lib/commands.js.map +0 -1
  366. package/dist/lib/convert.d.ts.map +0 -1
  367. package/dist/lib/convert.js.map +0 -1
  368. package/dist/lib/daemon.d.ts.map +0 -1
  369. package/dist/lib/daemon.js.map +0 -1
  370. package/dist/lib/drive-sync.d.ts.map +0 -1
  371. package/dist/lib/drive-sync.js.map +0 -1
  372. package/dist/lib/exec.d.ts.map +0 -1
  373. package/dist/lib/exec.js.map +0 -1
  374. package/dist/lib/factory.d.ts +0 -57
  375. package/dist/lib/factory.d.ts.map +0 -1
  376. package/dist/lib/factory.js +0 -110
  377. package/dist/lib/factory.js.map +0 -1
  378. package/dist/lib/git.d.ts.map +0 -1
  379. package/dist/lib/git.js.map +0 -1
  380. package/dist/lib/help.d.ts.map +0 -1
  381. package/dist/lib/help.js.map +0 -1
  382. package/dist/lib/hooks.d.ts.map +0 -1
  383. package/dist/lib/hooks.js.map +0 -1
  384. package/dist/lib/manifest.d.ts.map +0 -1
  385. package/dist/lib/manifest.js.map +0 -1
  386. package/dist/lib/markdown.d.ts.map +0 -1
  387. package/dist/lib/markdown.js.map +0 -1
  388. package/dist/lib/mcp.d.ts.map +0 -1
  389. package/dist/lib/mcp.js.map +0 -1
  390. package/dist/lib/memory-compile.d.ts.map +0 -1
  391. package/dist/lib/memory-compile.js.map +0 -1
  392. package/dist/lib/memory.d.ts.map +0 -1
  393. package/dist/lib/memory.js.map +0 -1
  394. package/dist/lib/models.d.ts.map +0 -1
  395. package/dist/lib/models.js.map +0 -1
  396. package/dist/lib/permissions.d.ts.map +0 -1
  397. package/dist/lib/permissions.js.map +0 -1
  398. package/dist/lib/picker.d.ts.map +0 -1
  399. package/dist/lib/picker.js.map +0 -1
  400. package/dist/lib/plugins.d.ts.map +0 -1
  401. package/dist/lib/plugins.js.map +0 -1
  402. package/dist/lib/pty-client.d.ts.map +0 -1
  403. package/dist/lib/pty-client.js.map +0 -1
  404. package/dist/lib/pty-server.d.ts.map +0 -1
  405. package/dist/lib/pty-server.js.map +0 -1
  406. package/dist/lib/registry.d.ts.map +0 -1
  407. package/dist/lib/registry.js.map +0 -1
  408. package/dist/lib/resources.d.ts.map +0 -1
  409. package/dist/lib/resources.js.map +0 -1
  410. package/dist/lib/routines.d.ts.map +0 -1
  411. package/dist/lib/routines.js.map +0 -1
  412. package/dist/lib/runner.d.ts.map +0 -1
  413. package/dist/lib/runner.js.map +0 -1
  414. package/dist/lib/sandbox.d.ts.map +0 -1
  415. package/dist/lib/sandbox.js.map +0 -1
  416. package/dist/lib/scheduler.d.ts.map +0 -1
  417. package/dist/lib/scheduler.js.map +0 -1
  418. package/dist/lib/session/__tests__/db.test.d.ts +0 -2
  419. package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
  420. package/dist/lib/session/__tests__/db.test.js +0 -54
  421. package/dist/lib/session/__tests__/db.test.js.map +0 -1
  422. package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
  423. package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
  424. package/dist/lib/session/__tests__/discover.test.js +0 -63
  425. package/dist/lib/session/__tests__/discover.test.js.map +0 -1
  426. package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
  427. package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
  428. package/dist/lib/session/__tests__/prompt.test.js +0 -44
  429. package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
  430. package/dist/lib/session/__tests__/render.test.d.ts +0 -2
  431. package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
  432. package/dist/lib/session/__tests__/render.test.js +0 -602
  433. package/dist/lib/session/__tests__/render.test.js.map +0 -1
  434. package/dist/lib/session/db.d.ts.map +0 -1
  435. package/dist/lib/session/db.js.map +0 -1
  436. package/dist/lib/session/discover.d.ts.map +0 -1
  437. package/dist/lib/session/discover.js.map +0 -1
  438. package/dist/lib/session/parse.d.ts.map +0 -1
  439. package/dist/lib/session/parse.js.map +0 -1
  440. package/dist/lib/session/prompt.d.ts.map +0 -1
  441. package/dist/lib/session/prompt.js.map +0 -1
  442. package/dist/lib/session/prompt.test.d.ts +0 -2
  443. package/dist/lib/session/prompt.test.d.ts.map +0 -1
  444. package/dist/lib/session/prompt.test.js +0 -57
  445. package/dist/lib/session/prompt.test.js.map +0 -1
  446. package/dist/lib/session/render.d.ts.map +0 -1
  447. package/dist/lib/session/render.js.map +0 -1
  448. package/dist/lib/session/team-filter.d.ts.map +0 -1
  449. package/dist/lib/session/team-filter.js.map +0 -1
  450. package/dist/lib/session/team-filter.test.d.ts +0 -2
  451. package/dist/lib/session/team-filter.test.d.ts.map +0 -1
  452. package/dist/lib/session/team-filter.test.js +0 -157
  453. package/dist/lib/session/team-filter.test.js.map +0 -1
  454. package/dist/lib/session/types.d.ts.map +0 -1
  455. package/dist/lib/session/types.js.map +0 -1
  456. package/dist/lib/shims.d.ts.map +0 -1
  457. package/dist/lib/shims.js.map +0 -1
  458. package/dist/lib/skills.d.ts.map +0 -1
  459. package/dist/lib/skills.js.map +0 -1
  460. package/dist/lib/state.d.ts.map +0 -1
  461. package/dist/lib/state.js.map +0 -1
  462. package/dist/lib/subagents.d.ts.map +0 -1
  463. package/dist/lib/subagents.js.map +0 -1
  464. package/dist/lib/teams/agents.d.ts.map +0 -1
  465. package/dist/lib/teams/agents.js.map +0 -1
  466. package/dist/lib/teams/api.d.ts.map +0 -1
  467. package/dist/lib/teams/api.js.map +0 -1
  468. package/dist/lib/teams/cloud.d.ts +0 -11
  469. package/dist/lib/teams/cloud.d.ts.map +0 -1
  470. package/dist/lib/teams/cloud.js +0 -169
  471. package/dist/lib/teams/cloud.js.map +0 -1
  472. package/dist/lib/teams/debug.d.ts.map +0 -1
  473. package/dist/lib/teams/debug.js.map +0 -1
  474. package/dist/lib/teams/file_ops.d.ts.map +0 -1
  475. package/dist/lib/teams/file_ops.js.map +0 -1
  476. package/dist/lib/teams/parsers.d.ts.map +0 -1
  477. package/dist/lib/teams/parsers.js.map +0 -1
  478. package/dist/lib/teams/persistence.d.ts.map +0 -1
  479. package/dist/lib/teams/persistence.js.map +0 -1
  480. package/dist/lib/teams/ralph.d.ts +0 -8
  481. package/dist/lib/teams/ralph.d.ts.map +0 -1
  482. package/dist/lib/teams/ralph.js +0 -59
  483. package/dist/lib/teams/ralph.js.map +0 -1
  484. package/dist/lib/teams/registry.d.ts.map +0 -1
  485. package/dist/lib/teams/registry.js.map +0 -1
  486. package/dist/lib/teams/summarizer.d.ts.map +0 -1
  487. package/dist/lib/teams/summarizer.js.map +0 -1
  488. package/dist/lib/template.d.ts.map +0 -1
  489. package/dist/lib/template.js.map +0 -1
  490. package/dist/lib/types.d.ts.map +0 -1
  491. package/dist/lib/types.js.map +0 -1
  492. package/dist/lib/usage.d.ts.map +0 -1
  493. package/dist/lib/usage.js.map +0 -1
  494. package/dist/lib/versions.d.ts.map +0 -1
  495. package/dist/lib/versions.js.map +0 -1
  496. package/scripts/rebuild-sqlite.sh +0 -46
@@ -1,3 +1,22 @@
1
+ /**
2
+ * Custom help formatting for the CLI.
3
+ *
4
+ * Overrides commander's default help layout to show Commands before Options,
5
+ * and applies consistent conventions (short -h flag, no implicit help subcommand).
6
+ */
1
7
  import type { Command } from 'commander';
8
+ /** Description of a named command group rendered as its own section in help output. */
9
+ export interface CommandGroup {
10
+ /** Section heading, e.g. 'Bundle commands'. */
11
+ title: string;
12
+ /** Subcommand names (in desired display order) that belong to this group. */
13
+ names: readonly string[];
14
+ }
15
+ /**
16
+ * Register named groups for a parent command so its help output splits the
17
+ * Commands section into multiple labeled sections. Subcommands not listed in
18
+ * any group fall back to a plain "Commands:" section below the groups.
19
+ */
20
+ export declare function registerCommandGroups(parent: Command, groups: readonly CommandGroup[]): void;
21
+ /** Apply standardized help formatting to the root command and all subcommands. */
2
22
  export declare function applyGlobalHelpConventions(root: Command): void;
3
- //# sourceMappingURL=help.d.ts.map
package/dist/lib/help.js CHANGED
@@ -1,3 +1,13 @@
1
+ const commandGroupRegistry = new WeakMap();
2
+ /**
3
+ * Register named groups for a parent command so its help output splits the
4
+ * Commands section into multiple labeled sections. Subcommands not listed in
5
+ * any group fall back to a plain "Commands:" section below the groups.
6
+ */
7
+ export function registerCommandGroups(parent, groups) {
8
+ commandGroupRegistry.set(parent, groups);
9
+ }
10
+ /** Format help output with Commands listed before Options for better discoverability. */
1
11
  function formatHelpCommandsFirst(cmd, helper) {
2
12
  const termWidth = helper.padWidth(cmd, helper);
3
13
  const helpWidth = helper.helpWidth || 80;
@@ -24,11 +34,39 @@ function formatHelpCommandsFirst(cmd, helper) {
24
34
  if (argumentList.length > 0) {
25
35
  output = output.concat(['Arguments:', formatList(argumentList), '']);
26
36
  }
27
- const commandList = helper.visibleCommands(cmd).map((subcommand) => {
28
- return formatItem(helper.subcommandTerm(subcommand), helper.subcommandDescription(subcommand));
29
- });
30
- if (commandList.length > 0) {
31
- output = output.concat(['Commands:', formatList(commandList), '']);
37
+ const visibleCommands = helper.visibleCommands(cmd);
38
+ const subcommandTermNoAlias = (sub) => {
39
+ // Mirror commander's default subcommandTerm but drop the |alias suffix.
40
+ const argList = sub.registeredArguments ?? [];
41
+ const args = argList
42
+ .map((a) => {
43
+ const n = a.name() + (a.variadic ? '...' : '');
44
+ return a.required ? `<${n}>` : `[${n}]`;
45
+ })
46
+ .join(' ');
47
+ return sub.name() + (sub.options.length > 0 ? ' [options]' : '') + (args ? ` ${args}` : '');
48
+ };
49
+ const renderCommand = (sub) => formatItem(subcommandTermNoAlias(sub), helper.subcommandDescription(sub));
50
+ const groups = commandGroupRegistry.get(cmd);
51
+ if (groups && groups.length > 0) {
52
+ const byName = new Map(visibleCommands.map((s) => [s.name(), s]));
53
+ const placed = new Set();
54
+ for (const { title, names } of groups) {
55
+ const subs = names
56
+ .map((n) => byName.get(n))
57
+ .filter((s) => s !== undefined);
58
+ if (subs.length === 0)
59
+ continue;
60
+ subs.forEach((s) => placed.add(s.name()));
61
+ output = output.concat([`${title}:`, formatList(subs.map(renderCommand)), '']);
62
+ }
63
+ const remaining = visibleCommands.filter((s) => !placed.has(s.name()));
64
+ if (remaining.length > 0) {
65
+ output = output.concat(['Commands:', formatList(remaining.map(renderCommand)), '']);
66
+ }
67
+ }
68
+ else if (visibleCommands.length > 0) {
69
+ output = output.concat(['Commands:', formatList(visibleCommands.map(renderCommand)), '']);
32
70
  }
33
71
  const optionList = helper.visibleOptions(cmd).map((option) => {
34
72
  return formatItem(helper.optionTerm(option), helper.optionDescription(option));
@@ -46,6 +84,7 @@ function formatHelpCommandsFirst(cmd, helper) {
46
84
  }
47
85
  return output.join('\n');
48
86
  }
87
+ /** Recursively apply help conventions (-h flag, no help subcommand, custom formatter). */
49
88
  function applyHelpConventionsRecursive(cmd) {
50
89
  cmd
51
90
  .helpOption('-h, --help', 'Show help')
@@ -57,7 +96,7 @@ function applyHelpConventionsRecursive(cmd) {
57
96
  applyHelpConventionsRecursive(subcommand);
58
97
  }
59
98
  }
99
+ /** Apply standardized help formatting to the root command and all subcommands. */
60
100
  export function applyGlobalHelpConventions(root) {
61
101
  applyHelpConventionsRecursive(root);
62
102
  }
63
- //# sourceMappingURL=help.js.map
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Hook predicate evaluator.
3
+ *
4
+ * Evaluates the optional `matches:` block on a hook manifest entry against
5
+ * the runtime input passed by the agent CLI on a hook event. All declared
6
+ * predicates AND together — the hook fires only if every one passes.
7
+ *
8
+ * Empty/missing matches => always passes (backward compat with hooks
9
+ * authored before predicate support).
10
+ *
11
+ * Used at hook-fire time by either:
12
+ * (a) generated hook wrappers we install alongside the script, or
13
+ * (b) the script itself, by calling shouldFire() with parsed JSON input.
14
+ */
15
+ import type { HookMatches } from '../types.js';
16
+ /** Runtime context passed to a hook by the agent CLI. */
17
+ export interface HookInput {
18
+ hook_event_name?: string;
19
+ prompt?: string;
20
+ tool_name?: string;
21
+ tool_args?: unknown;
22
+ cwd?: string;
23
+ }
24
+ /**
25
+ * Decide whether a hook with the given match config should fire on this input.
26
+ * Pure function — no side effects, no IO except git/cwd checks for predicates
27
+ * that explicitly require them.
28
+ *
29
+ * Returns true if the hook should fire (all declared predicates pass), false
30
+ * if it should be skipped.
31
+ */
32
+ export declare function shouldFire(matches: HookMatches | undefined, input: HookInput): boolean;
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Hook predicate evaluator.
3
+ *
4
+ * Evaluates the optional `matches:` block on a hook manifest entry against
5
+ * the runtime input passed by the agent CLI on a hook event. All declared
6
+ * predicates AND together — the hook fires only if every one passes.
7
+ *
8
+ * Empty/missing matches => always passes (backward compat with hooks
9
+ * authored before predicate support).
10
+ *
11
+ * Used at hook-fire time by either:
12
+ * (a) generated hook wrappers we install alongside the script, or
13
+ * (b) the script itself, by calling shouldFire() with parsed JSON input.
14
+ */
15
+ import * as fs from 'fs';
16
+ import * as path from 'path';
17
+ import { execSync } from 'child_process';
18
+ function arrayOf(v) {
19
+ if (v === undefined)
20
+ return [];
21
+ return Array.isArray(v) ? v : [v];
22
+ }
23
+ function isGitDirty(cwd) {
24
+ try {
25
+ const out = execSync('git status --porcelain', {
26
+ cwd,
27
+ stdio: ['ignore', 'pipe', 'ignore'],
28
+ encoding: 'utf-8',
29
+ });
30
+ return out.trim().length > 0;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ function findProjectRoot(start) {
37
+ let dir = path.resolve(start);
38
+ while (true) {
39
+ if (fs.existsSync(path.join(dir, '.git')))
40
+ return dir;
41
+ const parent = path.dirname(dir);
42
+ if (parent === dir)
43
+ return null;
44
+ dir = parent;
45
+ }
46
+ }
47
+ /**
48
+ * Decide whether a hook with the given match config should fire on this input.
49
+ * Pure function — no side effects, no IO except git/cwd checks for predicates
50
+ * that explicitly require them.
51
+ *
52
+ * Returns true if the hook should fire (all declared predicates pass), false
53
+ * if it should be skipped.
54
+ */
55
+ export function shouldFire(matches, input) {
56
+ if (!matches)
57
+ return true;
58
+ const cwd = input.cwd || process.cwd();
59
+ if (matches.prompt_contains !== undefined) {
60
+ const prompt = input.prompt ?? '';
61
+ if (!prompt.includes(matches.prompt_contains))
62
+ return false;
63
+ }
64
+ if (matches.prompt_matches !== undefined) {
65
+ const prompt = input.prompt ?? '';
66
+ let re;
67
+ try {
68
+ re = new RegExp(matches.prompt_matches);
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ if (!re.test(prompt))
74
+ return false;
75
+ }
76
+ if (matches.tool_name !== undefined) {
77
+ const allowed = arrayOf(matches.tool_name);
78
+ if (allowed.length > 0) {
79
+ if (!input.tool_name)
80
+ return false;
81
+ if (!allowed.includes(input.tool_name))
82
+ return false;
83
+ }
84
+ }
85
+ if (matches.tool_args_match !== undefined) {
86
+ const serialized = typeof input.tool_args === 'string'
87
+ ? input.tool_args
88
+ : JSON.stringify(input.tool_args ?? '');
89
+ let re;
90
+ try {
91
+ re = new RegExp(matches.tool_args_match);
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ if (!re.test(serialized))
97
+ return false;
98
+ }
99
+ if (matches.cwd_includes !== undefined) {
100
+ const needles = arrayOf(matches.cwd_includes);
101
+ if (needles.length > 0) {
102
+ const hit = needles.some((n) => cwd.includes(n));
103
+ if (!hit)
104
+ return false;
105
+ }
106
+ }
107
+ if (matches.project_has !== undefined) {
108
+ const root = findProjectRoot(cwd);
109
+ if (!root)
110
+ return false;
111
+ if (!fs.existsSync(path.join(root, matches.project_has)))
112
+ return false;
113
+ }
114
+ if (matches.git_dirty !== undefined) {
115
+ const dirty = isGitDirty(cwd);
116
+ if (matches.git_dirty !== dirty)
117
+ return false;
118
+ }
119
+ return true;
120
+ }
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Hook management -- discovery, registration, and syncing of event hooks.
3
+ *
4
+ * Hooks are shell scripts in ~/.agents/hooks/ that fire on agent events
5
+ * (tool calls, session start, etc.). Each hook directory contains a manifest
6
+ * (agents.yaml) declaring events, matchers, and timeout. This module handles
7
+ * parsing those manifests, registering hooks into agent-native settings files,
8
+ * and syncing them across version switches.
9
+ */
1
10
  import type { AgentId, InstalledHook, ManifestHook } from './types.js';
2
11
  export type HookEntry = {
3
12
  name: string;
@@ -93,12 +102,17 @@ export declare function installHooksCentrally(source: string): Promise<{
93
102
  errors: string[];
94
103
  }>;
95
104
  /**
96
- * List hooks from central ~/.agents/hooks/ directory.
105
+ * List hooks from user (~/.agents/hooks/) and system (~/.agents-system/hooks/) dirs.
106
+ * User dir takes priority; deduplication preserves first occurrence.
97
107
  */
98
108
  export declare function listCentralHooks(): HookEntry[];
99
109
  /**
100
- * Parse ~/.agents/hooks.yaml manifest.
101
- * Returns hook definitions with lifecycle event metadata.
110
+ * Parse hooks.yaml manifests. Reads BOTH system (~/.agents-system/hooks.yaml)
111
+ * and user (~/.agents/hooks.yaml), merging with user-wins-on-key-collision
112
+ * precedence. A user entry with `enabled: false` disables the system-shipped
113
+ * hook of the same name without forking the system file.
114
+ *
115
+ * Hooks marked `enabled: false` are dropped from the returned map.
102
116
  */
103
117
  export declare function parseHookManifest(): Record<string, ManifestHook>;
104
118
  /**
@@ -113,4 +127,3 @@ export declare function registerHooksToSettings(agentId: AgentId, versionHome: s
113
127
  registered: string[];
114
128
  errors: string[];
115
129
  };
116
- //# sourceMappingURL=hooks.d.ts.map
package/dist/lib/hooks.js CHANGED
@@ -1,9 +1,21 @@
1
+ /**
2
+ * Hook management -- discovery, registration, and syncing of event hooks.
3
+ *
4
+ * Hooks are shell scripts in ~/.agents/hooks/ that fire on agent events
5
+ * (tool calls, session start, etc.). Each hook directory contains a manifest
6
+ * (agents.yaml) declaring events, matchers, and timeout. This module handles
7
+ * parsing those manifests, registering hooks into agent-native settings files,
8
+ * and syncing them across version switches.
9
+ */
1
10
  import * as fs from 'fs';
2
11
  import * as path from 'path';
3
12
  import * as yaml from 'yaml';
4
13
  import * as TOML from 'smol-toml';
5
14
  import { AGENTS, HOOKS_CAPABLE_AGENTS } from './agents.js';
6
- import { getAgentsDir, getHooksDir as getCentralHooksDir, getProjectAgentsDir } from './state.js';
15
+ import { supports, explainSkip } from './capabilities.js';
16
+ import { setGeminiAutoUpdateDisabled, updateGeminiSettings } from './gemini-settings.js';
17
+ import { getAgentsDir, getHooksDir as getSystemHooksDir, getUserHooksDir, getUserAgentsDir, getProjectAgentsDir } from './state.js';
18
+ function getCentralHooksDir() { return getUserHooksDir(); }
7
19
  import { getEffectiveHome, getVersionHomePath, listInstalledVersions } from './versions.js';
8
20
  const SCRIPT_EXTENSIONS = new Set([
9
21
  '.sh',
@@ -329,6 +341,10 @@ export function diffVersionHooks(agent, version) {
329
341
  * Install a single hook from central into a specific version home.
330
342
  */
331
343
  export function installHookToVersion(agent, version, hookName) {
344
+ const gate = supports(agent, 'hooks', version);
345
+ if (!gate.ok) {
346
+ return { success: false, error: explainSkip(agent, 'hooks', gate, version) };
347
+ }
332
348
  const central = listHookEntriesFromDir(getCentralHooksDir()).find((e) => e.name === hookName);
333
349
  if (!central) {
334
350
  return { success: false, error: `Hook '${hookName}' not found in central` };
@@ -464,28 +480,56 @@ export async function installHooksCentrally(source) {
464
480
  return { installed, errors };
465
481
  }
466
482
  /**
467
- * List hooks from central ~/.agents/hooks/ directory.
483
+ * List hooks from user (~/.agents/hooks/) and system (~/.agents-system/hooks/) dirs.
484
+ * User dir takes priority; deduplication preserves first occurrence.
468
485
  */
469
486
  export function listCentralHooks() {
470
- return listHookEntriesFromDir(getCentralHooksDir());
487
+ const seen = new Set();
488
+ const results = [];
489
+ for (const dir of [getUserHooksDir(), getSystemHooksDir()]) {
490
+ for (const entry of listHookEntriesFromDir(dir)) {
491
+ if (!seen.has(entry.name)) {
492
+ seen.add(entry.name);
493
+ results.push(entry);
494
+ }
495
+ }
496
+ }
497
+ return results;
471
498
  }
472
499
  /**
473
- * Parse ~/.agents/hooks.yaml manifest.
474
- * Returns hook definitions with lifecycle event metadata.
500
+ * Parse hooks.yaml manifests. Reads BOTH system (~/.agents-system/hooks.yaml)
501
+ * and user (~/.agents/hooks.yaml), merging with user-wins-on-key-collision
502
+ * precedence. A user entry with `enabled: false` disables the system-shipped
503
+ * hook of the same name without forking the system file.
504
+ *
505
+ * Hooks marked `enabled: false` are dropped from the returned map.
475
506
  */
476
507
  export function parseHookManifest() {
477
- const manifestPath = path.join(getAgentsDir(), 'hooks.yaml');
478
- if (!fs.existsSync(manifestPath)) {
479
- return {};
480
- }
481
- try {
482
- const content = fs.readFileSync(manifestPath, 'utf-8');
483
- const parsed = yaml.parse(content);
484
- return parsed || {};
508
+ const merged = {};
509
+ // System first (lower precedence), user second (overrides).
510
+ for (const dir of [getAgentsDir(), getUserAgentsDir()]) {
511
+ const manifestPath = path.join(dir, 'hooks.yaml');
512
+ if (!fs.existsSync(manifestPath))
513
+ continue;
514
+ try {
515
+ const content = fs.readFileSync(manifestPath, 'utf-8');
516
+ const parsed = yaml.parse(content);
517
+ if (!parsed)
518
+ continue;
519
+ for (const [name, def] of Object.entries(parsed)) {
520
+ merged[name] = def;
521
+ }
522
+ }
523
+ catch {
524
+ /* skip unreadable manifest, keep going */
525
+ }
485
526
  }
486
- catch {
487
- return {};
527
+ // Strip disabled hooks so they never reach the registrar.
528
+ for (const [name, def] of Object.entries(merged)) {
529
+ if (def.enabled === false)
530
+ delete merged[name];
488
531
  }
532
+ return merged;
489
533
  }
490
534
  // Codex events that support a matcher field (matches tool name or session type).
491
535
  // UserPromptSubmit and Stop never include a matcher.
@@ -510,8 +554,21 @@ export function registerHooksToSettings(agentId, versionHome, hookManifest, agen
510
554
  if (agentId === 'codex') {
511
555
  return registerHooksForCodex(versionHome, manifest, agentsDir);
512
556
  }
557
+ if (agentId === 'gemini') {
558
+ return registerHooksForGemini(versionHome, manifest, agentsDir);
559
+ }
513
560
  return { registered: [], errors: [] };
514
561
  }
562
+ /**
563
+ * Gemini has no native UserPromptSubmit event — map it to BeforeAgent,
564
+ * the closest lifecycle phase that fires before the model sees the prompt.
565
+ * Note: gemini's BeforeAgent can only APPEND via additionalContext — it
566
+ * cannot replace the prompt. The hook script branches on caller to emit
567
+ * the correct protocol.
568
+ */
569
+ const GEMINI_EVENT_MAP = {
570
+ UserPromptSubmit: 'BeforeAgent',
571
+ };
515
572
  function registerHooksForClaude(versionHome, manifest, agentsDir) {
516
573
  const registered = [];
517
574
  const errors = [];
@@ -531,9 +588,33 @@ function registerHooksForClaude(versionHome, manifest, agentsDir) {
531
588
  config.hooks = {};
532
589
  }
533
590
  const hooks = config.hooks;
534
- for (const [name, hookDef] of Object.entries(manifest)) {
535
- if (hookDef.agents && !hookDef.agents.includes('claude'))
591
+ // Build set of all command paths the current manifest will register.
592
+ // Used to garbage-collect stale entries left behind after hook renames.
593
+ const managedHooksPrefix = path.join(agentsDir, 'hooks') + path.sep;
594
+ const currentManifestPaths = new Set();
595
+ for (const hookDef of Object.values(manifest)) {
596
+ if (!hookDef.events || hookDef.events.length === 0)
536
597
  continue;
598
+ currentManifestPaths.add(path.join(agentsDir, 'hooks', hookDef.script));
599
+ }
600
+ // Remove stale entries: any hook command under ~/.agents/hooks/ that isn't
601
+ // in the current manifest is a leftover from a renamed/deleted hook script.
602
+ for (const eventEntries of Object.values(hooks)) {
603
+ if (!Array.isArray(eventEntries))
604
+ continue;
605
+ for (const group of eventEntries) {
606
+ if (!group.hooks)
607
+ continue;
608
+ group.hooks = group.hooks.filter((h) => !h.command.startsWith(managedHooksPrefix) || currentManifestPaths.has(h.command));
609
+ }
610
+ }
611
+ // Remove empty matcher groups left after cleanup
612
+ for (const [event, eventEntries] of Object.entries(hooks)) {
613
+ if (!Array.isArray(eventEntries))
614
+ continue;
615
+ hooks[event] = eventEntries.filter((g) => g.hooks && g.hooks.length > 0);
616
+ }
617
+ for (const [name, hookDef] of Object.entries(manifest)) {
537
618
  if (!hookDef.events || hookDef.events.length === 0)
538
619
  continue;
539
620
  const commandPath = path.join(agentsDir, 'hooks', hookDef.script);
@@ -600,9 +681,26 @@ function registerHooksForCodex(versionHome, manifest, agentsDir) {
600
681
  return { registered, errors };
601
682
  }
602
683
  }
603
- for (const [name, hookDef] of Object.entries(manifest)) {
604
- if (hookDef.agents && !hookDef.agents.includes('codex'))
684
+ // Build set of current manifest command paths for codex to GC stale entries
685
+ const managedHooksPrefix = path.join(agentsDir, 'hooks') + path.sep;
686
+ const currentManifestPaths = new Set();
687
+ for (const hookDef of Object.values(manifest)) {
688
+ if (!hookDef.events || hookDef.events.length === 0)
605
689
  continue;
690
+ currentManifestPaths.add(path.join(agentsDir, 'hooks', hookDef.script));
691
+ }
692
+ // Remove stale entries from all event groups
693
+ for (const eventGroups of Object.values(hooksFile.hooks)) {
694
+ for (const group of eventGroups) {
695
+ if (!group.hooks)
696
+ continue;
697
+ group.hooks = group.hooks.filter((h) => !h.command.startsWith(managedHooksPrefix) || currentManifestPaths.has(h.command));
698
+ }
699
+ }
700
+ for (const [event, eventGroups] of Object.entries(hooksFile.hooks)) {
701
+ hooksFile.hooks[event] = eventGroups.filter((g) => g.hooks && g.hooks.length > 0);
702
+ }
703
+ for (const [name, hookDef] of Object.entries(manifest)) {
606
704
  if (!hookDef.events || hookDef.events.length === 0)
607
705
  continue;
608
706
  const commandPath = path.join(agentsDir, 'hooks', hookDef.script);
@@ -639,7 +737,6 @@ function registerHooksForCodex(versionHome, manifest, agentsDir) {
639
737
  if (!group.hooks) {
640
738
  group.hooks = [];
641
739
  }
642
- // Add or update by exact command path — never removes other entries
643
740
  const existingIdx = group.hooks.findIndex((h) => h.command === commandPath);
644
741
  const hookEntry = { type: 'command', command: commandPath, timeout };
645
742
  if (existingIdx >= 0) {
@@ -682,4 +779,77 @@ function registerHooksForCodex(versionHome, manifest, agentsDir) {
682
779
  }
683
780
  return { registered, errors };
684
781
  }
685
- //# sourceMappingURL=hooks.js.map
782
+ function registerHooksForGemini(versionHome, manifest, agentsDir) {
783
+ const registered = [];
784
+ const errors = [];
785
+ const settingsPath = path.join(versionHome, '.gemini', 'settings.json');
786
+ try {
787
+ updateGeminiSettings(settingsPath, (config) => {
788
+ setGeminiAutoUpdateDisabled(config);
789
+ if (!config.hooks || typeof config.hooks !== 'object') {
790
+ config.hooks = {};
791
+ }
792
+ const hooks = config.hooks;
793
+ const managedHooksPrefix = path.join(agentsDir, 'hooks') + path.sep;
794
+ const currentManifestPaths = new Set();
795
+ for (const hookDef of Object.values(manifest)) {
796
+ if (!hookDef.events || hookDef.events.length === 0)
797
+ continue;
798
+ currentManifestPaths.add(path.join(agentsDir, 'hooks', hookDef.script));
799
+ }
800
+ for (const eventEntries of Object.values(hooks)) {
801
+ if (!Array.isArray(eventEntries))
802
+ continue;
803
+ for (const group of eventEntries) {
804
+ if (!group.hooks)
805
+ continue;
806
+ group.hooks = group.hooks.filter((h) => !h.command.startsWith(managedHooksPrefix) || currentManifestPaths.has(h.command));
807
+ }
808
+ }
809
+ for (const [event, eventEntries] of Object.entries(hooks)) {
810
+ if (!Array.isArray(eventEntries))
811
+ continue;
812
+ hooks[event] = eventEntries.filter((g) => g.hooks && g.hooks.length > 0);
813
+ }
814
+ for (const [name, hookDef] of Object.entries(manifest)) {
815
+ if (!hookDef.events || hookDef.events.length === 0)
816
+ continue;
817
+ const commandPath = path.join(agentsDir, 'hooks', hookDef.script);
818
+ if (!fs.existsSync(commandPath)) {
819
+ errors.push(`${name}: script not found at ${commandPath}`);
820
+ continue;
821
+ }
822
+ const timeoutMs = (hookDef.timeout || 600) * 1000;
823
+ for (const event of hookDef.events) {
824
+ const geminiEvent = GEMINI_EVENT_MAP[event] ?? event;
825
+ if (!hooks[geminiEvent]) {
826
+ hooks[geminiEvent] = [];
827
+ }
828
+ const eventEntries = hooks[geminiEvent];
829
+ const matcher = hookDef.matcher || '';
830
+ let matcherGroup = eventEntries.find((e) => (e.matcher || '') === matcher);
831
+ if (!matcherGroup) {
832
+ matcherGroup = { matcher, hooks: [] };
833
+ eventEntries.push(matcherGroup);
834
+ }
835
+ if (!matcherGroup.hooks) {
836
+ matcherGroup.hooks = [];
837
+ }
838
+ const existingIdx = matcherGroup.hooks.findIndex((h) => h.command === commandPath);
839
+ const hookEntry = { name, type: 'command', command: commandPath, timeout: timeoutMs };
840
+ if (existingIdx >= 0) {
841
+ matcherGroup.hooks[existingIdx] = hookEntry;
842
+ }
843
+ else {
844
+ matcherGroup.hooks.push(hookEntry);
845
+ }
846
+ registered.push(`${name} -> ${geminiEvent}`);
847
+ }
848
+ }
849
+ });
850
+ }
851
+ catch (err) {
852
+ errors.push(`Failed to write gemini settings.json: ${err.message}`);
853
+ }
854
+ return { registered, errors };
855
+ }
@@ -1,8 +1,13 @@
1
1
  import type { Manifest } from './types.js';
2
+ /** Canonical filename for the manifest in any agents repo or project root. */
2
3
  export declare const MANIFEST_FILENAME = "agents.yaml";
4
+ /** Parse a YAML string into a typed Manifest object. */
3
5
  export declare function parseManifest(content: string): Manifest;
6
+ /** Serialize a Manifest object to a YAML string with 2-space indentation. */
4
7
  export declare function serializeManifest(manifest: Manifest): string;
8
+ /** Read and parse agents.yaml from a directory. Returns null if the file does not exist. */
5
9
  export declare function readManifest(repoPath: string): Manifest | null;
10
+ /** Write a Manifest object to agents.yaml in the given directory. */
6
11
  export declare function writeManifest(repoPath: string, manifest: Manifest): void;
12
+ /** Create a Manifest with sensible defaults for a fresh agents repo. */
7
13
  export declare function createDefaultManifest(): Manifest;
8
- //# sourceMappingURL=manifest.d.ts.map
@@ -1,26 +1,38 @@
1
+ /**
2
+ * agents.yaml manifest reading, writing, and serialization.
3
+ *
4
+ * The manifest file (agents.yaml) is the central configuration for version defaults,
5
+ * repository overrides, dependencies, and MCP server declarations.
6
+ */
1
7
  import * as fs from 'fs';
2
- import * as path from 'path';
3
8
  import * as yaml from 'yaml';
9
+ import { safeJoin } from './paths.js';
10
+ /** Canonical filename for the manifest in any agents repo or project root. */
4
11
  export const MANIFEST_FILENAME = 'agents.yaml';
12
+ /** Parse a YAML string into a typed Manifest object. */
5
13
  export function parseManifest(content) {
6
14
  return yaml.parse(content);
7
15
  }
16
+ /** Serialize a Manifest object to a YAML string with 2-space indentation. */
8
17
  export function serializeManifest(manifest) {
9
18
  return yaml.stringify(manifest, { indent: 2 });
10
19
  }
20
+ /** Read and parse agents.yaml from a directory. Returns null if the file does not exist. */
11
21
  export function readManifest(repoPath) {
12
- const manifestPath = path.join(repoPath, MANIFEST_FILENAME);
22
+ const manifestPath = safeJoin(repoPath, MANIFEST_FILENAME);
13
23
  if (!fs.existsSync(manifestPath)) {
14
24
  return null;
15
25
  }
16
26
  const content = fs.readFileSync(manifestPath, 'utf-8');
17
27
  return parseManifest(content);
18
28
  }
29
+ /** Write a Manifest object to agents.yaml in the given directory. */
19
30
  export function writeManifest(repoPath, manifest) {
20
- const manifestPath = path.join(repoPath, MANIFEST_FILENAME);
31
+ const manifestPath = safeJoin(repoPath, MANIFEST_FILENAME);
21
32
  const content = serializeManifest(manifest);
22
33
  fs.writeFileSync(manifestPath, content, 'utf-8');
23
34
  }
35
+ /** Create a Manifest with sensible defaults for a fresh agents repo. */
24
36
  export function createDefaultManifest() {
25
37
  return {
26
38
  agents: {},
@@ -33,4 +45,3 @@ export function createDefaultManifest() {
33
45
  },
34
46
  };
35
47
  }
36
- //# sourceMappingURL=manifest.js.map
@@ -2,4 +2,3 @@
2
2
  * Render markdown content for terminal display.
3
3
  */
4
4
  export declare function renderMarkdown(content: string): string;
5
- //# sourceMappingURL=markdown.d.ts.map
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Terminal-aware Markdown rendering using marked and marked-terminal.
3
+ *
4
+ * Provides a single function for converting Markdown content into
5
+ * ANSI-formatted text suitable for terminal output.
6
+ */
1
7
  import { marked } from 'marked';
2
8
  import { markedTerminal } from 'marked-terminal';
3
9
  // @ts-expect-error - marked-terminal types don't match marked's MarkedExtension
@@ -8,4 +14,3 @@ marked.use(markedTerminal());
8
14
  export function renderMarkdown(content) {
9
15
  return marked.parse(content);
10
16
  }
11
- //# sourceMappingURL=markdown.js.map
package/dist/lib/mcp.d.ts CHANGED
@@ -61,4 +61,3 @@ export declare function writeMcpServerConfig(config: McpYamlConfig): string;
61
61
  * Remove an MCP server config from ~/.agents/mcp/.
62
62
  */
63
63
  export declare function removeMcpServerConfig(name: string): boolean;
64
- //# sourceMappingURL=mcp.d.ts.map