@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
package/dist/index.js CHANGED
@@ -1,12 +1,17 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env -S node --no-warnings=ExperimentalWarning
2
+ /**
3
+ * CLI entry point for agents-cli.
4
+ *
5
+ * Registers all commands, handles update checks, auto-corrects typos,
6
+ * and launches the first-run interactive init when appropriate.
7
+ */
2
8
  import { Command } from 'commander';
3
9
  import chalk from 'chalk';
4
10
  import ora from 'ora';
5
11
  import * as fs from 'fs';
6
- import * as os from 'os';
7
12
  import * as path from 'path';
8
13
  import { fileURLToPath } from 'url';
9
- import { select } from '@inquirer/prompts';
14
+ import { confirm, select } from '@inquirer/prompts';
10
15
  // Force exit on Ctrl+C when no interactive prompt is handling it.
11
16
  process.on('SIGINT', () => process.exit(130));
12
17
  // Ignore SIGPIPE — prevents exit code 13 crashes in piped environments
@@ -19,8 +24,7 @@ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
19
24
  const VERSION = packageJson.version;
20
25
  // Import command registrations
21
26
  import { registerPullCommand } from './commands/pull.js';
22
- import { registerPushCommand } from './commands/push.js';
23
- import { registerForkCommand } from './commands/fork.js';
27
+ import { registerRepoCommands } from './commands/repo.js';
24
28
  import { registerInitCommand, runInit } from './commands/init.js';
25
29
  import { registerStatusCommand } from './commands/status.js';
26
30
  import { registerViewCommand } from './commands/view.js';
@@ -36,16 +40,26 @@ import { registerDaemonCommands } from './commands/daemon.js';
36
40
  import { registerRoutinesCommands } from './commands/routines.js';
37
41
  import { registerRunCommand } from './commands/exec.js';
38
42
  import { registerModelsCommand } from './commands/models.js';
43
+ import { registerPruneCommand } from './commands/prune.js';
44
+ import { registerDoctorCommand } from './commands/doctor.js';
39
45
  import { registerSubagentsCommands } from './commands/subagents.js';
40
46
  import { registerPluginsCommands } from './commands/plugins.js';
41
47
  import { registerSyncCommand } from './commands/sync.js';
42
48
  import { registerRefreshMemoryCommand } from './commands/refresh-memory.js';
43
- import { registerSessionsCommands } from './commands/sessions.js';
44
49
  import { registerDriveCommands } from './commands/drive.js';
45
50
  import { registerPtyCommands } from './commands/pty.js';
46
- import { registerTeamsCommands } from './commands/teams.js';
51
+ import { registerProfilesCommands } from './commands/profiles.js';
52
+ import { registerSecretsCommands } from './commands/secrets.js';
53
+ import { registerFactoryCommands } from './commands/factory.js';
54
+ import { registerUsageCommand } from './commands/usage.js';
55
+ import { registerAliasCommand } from './commands/alias.js';
56
+ import { registerBetaCommands } from './commands/beta.js';
47
57
  import { applyGlobalHelpConventions } from './lib/help.js';
48
58
  import { isPromptCancelled } from './commands/utils.js';
59
+ import { getAgentsDir } from './lib/state.js';
60
+ import { AGENTS } from './lib/agents.js';
61
+ import { getGlobalDefault } from './lib/versions.js';
62
+ import { addShimsToPath, ensureShimCurrent, getPathShadowingExecutable, getPathSetupInstructions, hasAliasShadowingShim, isShimsInPath, listAgentsWithInstalledVersions, } from './lib/shims.js';
49
63
  const program = new Command();
50
64
  program
51
65
  .name('agents')
@@ -59,19 +73,20 @@ program.helpInformation = function () {
59
73
  if (this.name() === 'agents' && !this.parent) {
60
74
  return `Usage: agents [command] [options]
61
75
 
62
- Install, configure, and sync AI coding agents from one place.
63
- Works with Claude, Codex, Gemini, Cursor, OpenCode, and OpenClaw.
76
+ Install, configure, run, and dispatch AI coding agents from one place.
77
+ Works with Claude, Codex, Gemini, Cursor, OpenCode, OpenClaw, and Droid.
64
78
 
65
79
  Quick start:
66
80
  agents init First-time setup (interactive)
67
81
  agents view See what's installed
68
- agents run <agent> "prompt" Run an agent non-interactively
82
+ agents run <agent> ["prompt"] Run an agent (interactive without prompt, headless with)
69
83
  agents sessions Browse past sessions across all agents
70
84
 
71
85
  Agent versions:
72
86
  add <agent>[@version] Install an agent CLI (e.g. agents add codex)
73
87
  remove <agent>[@version] Uninstall a version
74
88
  use <agent>@<version> Set the default version
89
+ prune [target] Remove orphan resources (commands/skills/hooks) and/or older duplicate version installs
75
90
  view [agent[@version]] List versions, or inspect one in detail
76
91
 
77
92
  Agent configuration (synced across versions):
@@ -89,14 +104,17 @@ Packages:
89
104
  install <pkg> Install from registry (mcp:name, skill:user/repo)
90
105
 
91
106
  Run agents:
92
- run <agent> <prompt> One-shot run (non-interactive)
107
+ run <agent|profile> [prompt] Run an agent. Omit prompt for interactive mode.
93
108
  teams Coordinate multiple agents on shared work
109
+ routines Run agents on a cron schedule (scheduler auto-starts)
94
110
  sessions Browse and replay past runs
95
111
 
96
- Schedule:
97
- routines Run agents on a cron schedule (scheduler auto-starts)
112
+ Credentials:
113
+ profiles Bundles of (host CLI, endpoint, model, auth)
114
+ secrets Keychain-backed env bundles injected at spawn
98
115
 
99
116
  Helpers:
117
+ beta Enable preview features like drive and factory
100
118
  pty Drive interactive terminal programs (REPLs, TUIs)
101
119
 
102
120
  Automation tips:
@@ -107,19 +125,20 @@ Automation tips:
107
125
  Non-TTY shells apply defaults Omitted required selections fail with a plain hint
108
126
 
109
127
  Config sync (portable setup via git):
110
- pull [gh:user/repo] Clone or pull a shared .agents config repo
111
- push Commit and push your local config
112
- fork Fork the default config repo to your GitHub
128
+ pull Clone or pull the system repo at ~/.agents-system/
129
+ repo init --path <dir> Scaffold your own editable repo from a template
130
+ repo add <path|gh:user/repo> Merge an extra repo after the system repo
113
131
 
114
132
  Options:
115
133
  -V, --version Show version number
116
134
  -h, --help Show help
117
135
 
118
- Config lives in ~/.agents/. Run 'agents <command> --help' for details.
136
+ System config lives in ~/.agents-system/. Run 'agents <command> --help' for details.
119
137
  `;
120
138
  }
121
139
  return originalHelpInformation();
122
140
  };
141
+ /** Compare two semver version strings. Returns 1 if a > b, -1 if a < b, 0 if equal. */
123
142
  function compareVersions(a, b) {
124
143
  const partsA = a.split('.').map(Number);
125
144
  const partsB = b.split('.').map(Number);
@@ -131,6 +150,7 @@ function compareVersions(a, b) {
131
150
  }
132
151
  return 0;
133
152
  }
153
+ /** Fetch and display changelog entries between two versions from unpkg. */
134
154
  async function showWhatsNew(fromVersion, toVersion) {
135
155
  try {
136
156
  const response = await fetch(`https://unpkg.com/@phnx-labs/agents-cli@${toVersion}/CHANGELOG.md`);
@@ -176,7 +196,8 @@ async function showWhatsNew(fromVersion, toVersion) {
176
196
  }
177
197
  }
178
198
  const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
179
- const UPDATE_CHECK_FILE = path.join(os.homedir(), '.agents', '.update-check');
199
+ const UPDATE_CHECK_FILE = path.join(getAgentsDir(), '.update-check');
200
+ /** Read the cached update-check state from disk. Returns null if the file is missing or corrupt. */
180
201
  function readUpdateCache() {
181
202
  try {
182
203
  return JSON.parse(fs.readFileSync(UPDATE_CHECK_FILE, 'utf-8'));
@@ -186,11 +207,13 @@ function readUpdateCache() {
186
207
  return null;
187
208
  }
188
209
  }
210
+ /** Determine whether enough time has elapsed since the last registry fetch. */
189
211
  function shouldFetchLatest(cache) {
190
212
  if (!cache)
191
213
  return true;
192
214
  return Date.now() - cache.lastCheck > UPDATE_CHECK_INTERVAL_MS;
193
215
  }
216
+ /** Persist the latest known version and current timestamp to the update-check cache. */
194
217
  function saveUpdateCheck(latestVersion) {
195
218
  try {
196
219
  const dir = path.dirname(UPDATE_CHECK_FILE);
@@ -202,6 +225,7 @@ function saveUpdateCheck(latestVersion) {
202
225
  /* best-effort cache update */
203
226
  }
204
227
  }
228
+ /** Present an interactive upgrade prompt (TTY) or a one-line hint (non-TTY). */
205
229
  async function promptUpgrade(latestVersion) {
206
230
  if (!process.stdout.isTTY) {
207
231
  console.error(chalk.yellow(`Update available: ${VERSION} -> ${latestVersion}. Run: npm install -g @phnx-labs/agents-cli@latest`));
@@ -212,22 +236,39 @@ async function promptUpgrade(latestVersion) {
212
236
  choices: [
213
237
  { value: 'now', name: 'Upgrade now' },
214
238
  { value: 'later', name: 'Later' },
239
+ { value: 'dismiss', name: `Skip ${latestVersion}` },
215
240
  ],
216
241
  });
242
+ if (answer === 'dismiss') {
243
+ try {
244
+ const dir = path.dirname(UPDATE_CHECK_FILE);
245
+ if (!fs.existsSync(dir))
246
+ fs.mkdirSync(dir, { recursive: true });
247
+ const existing = readUpdateCache();
248
+ fs.writeFileSync(UPDATE_CHECK_FILE, JSON.stringify({
249
+ ...existing,
250
+ lastCheck: existing?.lastCheck ?? Date.now(),
251
+ latestVersion,
252
+ dismissed: latestVersion,
253
+ }));
254
+ }
255
+ catch { /* best-effort */ }
256
+ return;
257
+ }
217
258
  if (answer === 'now') {
218
- const { exec, spawnSync } = await import('child_process');
259
+ const { execFile, spawnSync } = await import('child_process');
219
260
  const { promisify } = await import('util');
220
- const execAsync = promisify(exec);
261
+ const execFileAsync = promisify(execFile);
221
262
  const spinner = ora('Upgrading...').start();
222
263
  try {
223
- await execAsync('npm install -g @phnx-labs/agents-cli@latest');
264
+ await execFileAsync('npm', ['install', '-g', '@phnx-labs/agents-cli@latest']);
224
265
  spinner.succeed(`Upgraded to ${latestVersion}`);
225
266
  await showWhatsNew(VERSION, latestVersion);
226
267
  console.log();
227
268
  // Re-exec with new version and exit
228
269
  const result = spawnSync('agents', process.argv.slice(2), {
229
270
  stdio: 'inherit',
230
- shell: true,
271
+ shell: false,
231
272
  });
232
273
  process.exit(result.status ?? 0);
233
274
  }
@@ -253,15 +294,17 @@ function refreshUpdateCacheInBackground() {
253
294
  /* network error, try again next invocation */
254
295
  });
255
296
  }
256
- /** Synchronous cache read prompt if cached latestVersion is newer. Triggers background refresh if cache is stale. */
297
+ /** Check for available updates using the local cache. Triggers a background refresh if stale. */
257
298
  async function checkForUpdates() {
258
299
  const cache = readUpdateCache();
259
300
  // Kick off network refresh in background if stale. Does not block.
260
301
  if (shouldFetchLatest(cache)) {
261
302
  refreshUpdateCacheInBackground();
262
303
  }
263
- // Prompt based on current cache (may be from a previous run's background refresh)
264
- if (cache?.latestVersion && cache.latestVersion !== VERSION && compareVersions(cache.latestVersion, VERSION) > 0) {
304
+ // Prompt based on current cache (may be from a previous run's background refresh).
305
+ // Skip if the user dismissed this exact version they'll be prompted again when
306
+ // a newer version appears.
307
+ if (cache?.latestVersion && cache.latestVersion !== VERSION && compareVersions(cache.latestVersion, VERSION) > 0 && cache.latestVersion !== cache.dismissed) {
265
308
  try {
266
309
  await promptUpgrade(cache.latestVersion);
267
310
  }
@@ -272,6 +315,75 @@ async function checkForUpdates() {
272
315
  }
273
316
  }
274
317
  }
318
+ async function maybeBootstrapShimIntegration(requestedCommand) {
319
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
320
+ return;
321
+ }
322
+ if (requestedCommand === 'sync' || requestedCommand === 'refresh-memory') {
323
+ return;
324
+ }
325
+ const installedAgents = listAgentsWithInstalledVersions();
326
+ if (installedAgents.length === 0) {
327
+ return;
328
+ }
329
+ const createdOrUpdated = [];
330
+ for (const agent of installedAgents) {
331
+ const status = ensureShimCurrent(agent);
332
+ if (status !== 'current') {
333
+ createdOrUpdated.push(`${status === 'created' ? 'Created' : 'Updated'} ${AGENTS[agent].cliCommand} shim`);
334
+ }
335
+ }
336
+ for (const notice of createdOrUpdated) {
337
+ console.log(chalk.green(notice));
338
+ }
339
+ const defaultAgents = installedAgents.filter((agent) => getGlobalDefault(agent));
340
+ const shadowed = defaultAgents
341
+ .map((agent) => ({ agent, shadowedBy: getPathShadowingExecutable(agent) }))
342
+ .filter((item) => Boolean(item.shadowedBy));
343
+ // Also check for shell aliases that shadow the shim
344
+ const aliased = defaultAgents.filter((agent) => hasAliasShadowingShim(agent));
345
+ // If shims are in PATH and nothing is binary-shadowing, we're done.
346
+ // Shell aliases that call the same command with extra flags are intentional
347
+ // customization and don't break shim integration.
348
+ if (shadowed.length === 0 && isShimsInPath()) {
349
+ return;
350
+ }
351
+ const affected = [];
352
+ for (const { agent, shadowedBy } of shadowed) {
353
+ affected.push(`${AGENTS[agent].cliCommand} -> ${shadowedBy}`);
354
+ }
355
+ for (const agent of aliased) {
356
+ if (!shadowed.some((s) => s.agent === agent)) {
357
+ affected.push(`${AGENTS[agent].cliCommand} (alias)`);
358
+ }
359
+ }
360
+ if (affected.length === 0) {
361
+ // PATH issue - show all installed agents
362
+ affected.push(...installedAgents.map((agent) => AGENTS[agent].cliCommand));
363
+ }
364
+ const shouldRepair = await confirm({
365
+ message: `Repair shim integration now? ${affected.join(', ')}`,
366
+ default: true,
367
+ });
368
+ if (!shouldRepair) {
369
+ console.log(chalk.yellow('Shim integration still needs attention.'));
370
+ console.log(chalk.gray(getPathSetupInstructions()));
371
+ return;
372
+ }
373
+ const pathResult = addShimsToPath();
374
+ if (!pathResult.success) {
375
+ console.log(chalk.yellow('Could not repair shim PATH setup automatically.'));
376
+ console.log(chalk.gray(pathResult.error || getPathSetupInstructions()));
377
+ return;
378
+ }
379
+ if (pathResult.alreadyPresent) {
380
+ console.log(chalk.yellow('Shim PATH entry is already in your shell config, but this shell has not reloaded it yet.'));
381
+ }
382
+ else {
383
+ console.log(chalk.green(`Repaired shim PATH setup in ~/${pathResult.rcFile}`));
384
+ }
385
+ console.log(chalk.gray(getPathSetupInstructions()));
386
+ }
275
387
  // Register all commands
276
388
  registerViewCommand(program);
277
389
  registerStatusCommand(program);
@@ -311,6 +423,8 @@ registerDaemonCommands(program);
311
423
  registerRoutinesCommands(program);
312
424
  registerRunCommand(program);
313
425
  registerModelsCommand(program);
426
+ registerPruneCommand(program);
427
+ registerDoctorCommand(program);
314
428
  // Deprecated 'exec' alias for 'run'
315
429
  program
316
430
  .command('exec', { hidden: true })
@@ -322,11 +436,15 @@ program
322
436
  args[0] = 'run';
323
437
  await program.parseAsync(['node', 'agents', ...args]);
324
438
  });
325
- registerTeamsCommands(program);
326
- registerSessionsCommands(program);
439
+ registerProfilesCommands(program);
440
+ registerSecretsCommands(program);
441
+ registerBetaCommands(program);
327
442
  registerSyncCommand(program);
328
443
  registerRefreshMemoryCommand(program);
329
444
  registerDriveCommands(program);
445
+ registerFactoryCommands(program);
446
+ registerUsageCommand(program);
447
+ registerAliasCommand(program);
330
448
  registerPtyCommands(program);
331
449
  // Deprecated 'jobs' and 'cron' aliases for 'routines'
332
450
  for (const alias of ['jobs', 'cron']) {
@@ -365,10 +483,10 @@ program
365
483
  return;
366
484
  }
367
485
  spinner.text = `Upgrading ${VERSION} -> ${latestVersion}...`;
368
- const { exec: execCb } = await import('child_process');
486
+ const { execFile } = await import('child_process');
369
487
  const { promisify } = await import('util');
370
- const execAsync = promisify(execCb);
371
- await execAsync('npm install -g @phnx-labs/agents-cli@latest');
488
+ const execFileAsync = promisify(execFile);
489
+ await execFileAsync('npm', ['install', '-g', '@phnx-labs/agents-cli@latest']);
372
490
  spinner.succeed(`Upgraded to ${latestVersion}`);
373
491
  await showWhatsNew(VERSION, latestVersion);
374
492
  }
@@ -378,13 +496,10 @@ program
378
496
  }
379
497
  });
380
498
  registerPullCommand(program);
381
- registerPushCommand(program);
382
- registerForkCommand(program);
499
+ registerRepoCommands(program);
383
500
  registerInitCommand(program);
384
501
  applyGlobalHelpConventions(program);
385
- /**
386
- * Calculate Levenshtein edit distance between two strings.
387
- */
502
+ /** Calculate the Levenshtein edit distance between two strings. */
388
503
  function levenshtein(a, b) {
389
504
  const m = a.length;
390
505
  const n = b.length;
@@ -432,10 +547,44 @@ program.on('command:*', (operands) => {
432
547
  });
433
548
  // Run update check on EVERY invocation before parsing
434
549
  await checkForUpdates();
550
+ // Surface any "behind upstream" notices from the previous detached sync, then
551
+ // fire-and-forget the next background sync. System repo gets a real fast-forward
552
+ // pull (read-only locally, safe). User repo and extras get fetch-only + a
553
+ // status marker that we'll print on the *next* invocation.
554
+ const { spawnDetachedSync } = await import('./lib/auto-pull.js');
555
+ spawnDetachedSync();
435
556
  // First-run experience: no args + no config yet + TTY -> launch interactive init.
436
557
  // Skipped when stdin/stdout isn't a terminal (CI, pipes) or when user passes any args.
437
558
  const passedArgs = process.argv.slice(2);
438
- const metaFilePath = path.join(os.homedir(), '.agents', 'agents.yaml');
559
+ const requestedCommand = passedArgs.find((arg) => !arg.startsWith('-'));
560
+ /**
561
+ * Lazily register command trees that pull in the SQLite-backed session/cloud
562
+ * stack. This keeps lightweight commands like `agents view` from loading the
563
+ * DB layer during CLI startup.
564
+ */
565
+ async function registerLazyCommands() {
566
+ switch (requestedCommand) {
567
+ case 'sessions': {
568
+ const { registerSessionsCommands } = await import('./commands/sessions.js');
569
+ registerSessionsCommands(program);
570
+ break;
571
+ }
572
+ case 'teams': {
573
+ const { registerTeamsCommands } = await import('./commands/teams.js');
574
+ registerTeamsCommands(program);
575
+ break;
576
+ }
577
+ case 'cloud': {
578
+ const { registerCloudCommands } = await import('./commands/cloud.js');
579
+ registerCloudCommands(program);
580
+ break;
581
+ }
582
+ default:
583
+ break;
584
+ }
585
+ }
586
+ await registerLazyCommands();
587
+ const metaFilePath = path.join(getAgentsDir(), 'agents.yaml');
439
588
  const firstRun = passedArgs.length === 0 &&
440
589
  !fs.existsSync(metaFilePath) &&
441
590
  process.stdin.isTTY &&
@@ -451,5 +600,23 @@ if (firstRun) {
451
600
  }
452
601
  process.exit(0);
453
602
  }
454
- await program.parseAsync();
455
- //# sourceMappingURL=index.js.map
603
+ // Commands that require the system repo to be cloned first.
604
+ const SYSTEM_REPO_COMMANDS = new Set([
605
+ 'view', 'status', 'skills', 'rules', 'commands', 'hooks',
606
+ 'mcp', 'permissions', 'versions', 'packages', 'sync',
607
+ 'subagents', 'repo', 'plugins', 'doctor',
608
+ ]);
609
+ if (!firstRun && requestedCommand && SYSTEM_REPO_COMMANDS.has(requestedCommand)) {
610
+ const { ensureInitialized } = await import('./commands/init.js');
611
+ await ensureInitialized(program);
612
+ }
613
+ try {
614
+ await maybeBootstrapShimIntegration(requestedCommand);
615
+ await program.parseAsync();
616
+ }
617
+ catch (err) {
618
+ if (err instanceof Error && err.name === 'ExitPromptError') {
619
+ process.exit(130);
620
+ }
621
+ throw err;
622
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Agent Client Protocol (ACP) client wrapper for agents-cli.
3
+ *
4
+ * Spawns an ACP-capable agent CLI as a stdio subprocess and drives it through
5
+ * initialize -> newSession -> prompt, streaming `session/update` notifications
6
+ * back to the caller as async iterables.
7
+ *
8
+ * Also implements the Client interface (fs read/write, terminal exec) so the
9
+ * agent can request filesystem and shell operations through us. `--mode plan`
10
+ * rejects all write/terminal requests; `edit`/`full` allow them.
11
+ */
12
+ import { type SessionNotification } from '@zed-industries/agent-client-protocol';
13
+ import type { AgentId } from '../types.js';
14
+ import type { ExecMode } from '../exec.js';
15
+ export interface AcpRunOptions {
16
+ agent: AgentId;
17
+ prompt: string;
18
+ cwd: string;
19
+ mode: ExecMode;
20
+ /** Optional: callback invoked for every session/update notification. */
21
+ onUpdate?: (n: SessionNotification) => void;
22
+ }
23
+ export interface AcpRunResult {
24
+ stopReason: string;
25
+ sessionId: string;
26
+ }
27
+ /**
28
+ * Runs a single prompt turn against an ACP-capable agent and streams updates
29
+ * to `onUpdate`. Resolves when the turn completes (StopReason is returned).
30
+ */
31
+ export declare function runAcp(opts: AcpRunOptions): Promise<AcpRunResult>;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Agent Client Protocol (ACP) client wrapper for agents-cli.
3
+ *
4
+ * Spawns an ACP-capable agent CLI as a stdio subprocess and drives it through
5
+ * initialize -> newSession -> prompt, streaming `session/update` notifications
6
+ * back to the caller as async iterables.
7
+ *
8
+ * Also implements the Client interface (fs read/write, terminal exec) so the
9
+ * agent can request filesystem and shell operations through us. `--mode plan`
10
+ * rejects all write/terminal requests; `edit`/`full` allow them.
11
+ */
12
+ import { spawn } from 'child_process';
13
+ import { Readable, Writable } from 'stream';
14
+ import { promises as fs } from 'fs';
15
+ import * as path from 'path';
16
+ import { ClientSideConnection, ndJsonStream, } from '@zed-industries/agent-client-protocol';
17
+ import { getAcpSpec, supportsAcp } from './harnesses.js';
18
+ const PROTOCOL_VERSION = 1;
19
+ /**
20
+ * Runs a single prompt turn against an ACP-capable agent and streams updates
21
+ * to `onUpdate`. Resolves when the turn completes (StopReason is returned).
22
+ */
23
+ export async function runAcp(opts) {
24
+ if (!supportsAcp(opts.agent)) {
25
+ throw new Error(`Agent '${opts.agent}' does not support ACP. Use direct exec instead.`);
26
+ }
27
+ const spec = getAcpSpec(opts.agent);
28
+ const child = spawn(spec.command, spec.args, {
29
+ cwd: opts.cwd,
30
+ stdio: ['pipe', 'pipe', 'inherit'],
31
+ env: process.env,
32
+ });
33
+ const stream = ndJsonStream(Writable.toWeb(child.stdin), Readable.toWeb(child.stdout));
34
+ const client = buildClient(opts);
35
+ const connection = new ClientSideConnection(() => client, stream);
36
+ const initResp = await connection.initialize({
37
+ protocolVersion: PROTOCOL_VERSION,
38
+ clientCapabilities: {
39
+ fs: { readTextFile: true, writeTextFile: true },
40
+ terminal: true,
41
+ },
42
+ });
43
+ if (initResp.protocolVersion < PROTOCOL_VERSION) {
44
+ throw new Error(`Agent '${opts.agent}' speaks ACP protocol v${initResp.protocolVersion}, need v${PROTOCOL_VERSION}.`);
45
+ }
46
+ const session = await connection.newSession({
47
+ cwd: opts.cwd,
48
+ mcpServers: [],
49
+ });
50
+ try {
51
+ const resp = await connection.prompt({
52
+ sessionId: session.sessionId,
53
+ prompt: [{ type: 'text', text: opts.prompt }],
54
+ });
55
+ return { stopReason: resp.stopReason, sessionId: session.sessionId };
56
+ }
57
+ finally {
58
+ child.kill('SIGTERM');
59
+ }
60
+ }
61
+ function buildClient(opts) {
62
+ const { mode, onUpdate, cwd } = opts;
63
+ const canWrite = mode !== 'plan';
64
+ return {
65
+ async sessionUpdate(params) {
66
+ if (onUpdate)
67
+ onUpdate(params);
68
+ },
69
+ async readTextFile(params) {
70
+ const abs = resolveInCwd(cwd, params.path);
71
+ const content = await fs.readFile(abs, 'utf8');
72
+ const sliced = sliceByLines(content, params.line, params.limit);
73
+ return { content: sliced };
74
+ },
75
+ async writeTextFile(params) {
76
+ if (!canWrite) {
77
+ throw new Error(`File writes are denied in plan mode: ${params.path}`);
78
+ }
79
+ const abs = resolveInCwd(cwd, params.path);
80
+ await fs.mkdir(path.dirname(abs), { recursive: true });
81
+ await fs.writeFile(abs, params.content, 'utf8');
82
+ return {};
83
+ },
84
+ async requestPermission(params) {
85
+ const optionId = mode === 'full'
86
+ ? (params.options.find(o => o.kind === 'allow_always')?.optionId
87
+ ?? params.options[0]?.optionId)
88
+ : params.options.find(o => o.kind === 'allow_once')?.optionId;
89
+ if (!optionId) {
90
+ return { outcome: { outcome: 'cancelled' } };
91
+ }
92
+ return { outcome: { outcome: 'selected', optionId } };
93
+ },
94
+ async createTerminal(params) {
95
+ if (!canWrite) {
96
+ throw new Error(`Terminal commands are denied in plan mode: ${params.command}`);
97
+ }
98
+ throw new Error('Terminal support not yet implemented in agents-cli ACP client.');
99
+ },
100
+ };
101
+ }
102
+ function resolveInCwd(cwd, target) {
103
+ const abs = path.resolve(cwd, target);
104
+ const rel = path.relative(cwd, abs);
105
+ if (rel.startsWith('..')) {
106
+ throw new Error(`Path '${target}' escapes session cwd '${cwd}'`);
107
+ }
108
+ return abs;
109
+ }
110
+ function sliceByLines(content, startLine, limit) {
111
+ if (startLine == null && limit == null)
112
+ return content;
113
+ const lines = content.split('\n');
114
+ const from = Math.max(0, (startLine ?? 1) - 1);
115
+ const to = limit != null ? from + limit : lines.length;
116
+ return lines.slice(from, to).join('\n');
117
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Per-harness spawn configuration for Agent Client Protocol (ACP) mode.
3
+ *
4
+ * Each entry describes how to launch a coding agent CLI as an ACP server
5
+ * (stdio JSON-RPC). Unsupported harnesses (amp, roo, goose-stdio) are omitted;
6
+ * callers should fall back to the legacy direct-exec path for those.
7
+ *
8
+ * Sources: https://agentclientprotocol.com/get-started/agents + vendor docs.
9
+ */
10
+ import type { AgentId } from '../types.js';
11
+ export interface AcpHarnessSpec {
12
+ /** Command + args to spawn the agent in ACP server mode. */
13
+ command: string;
14
+ args: string[];
15
+ /** Human-hint for `teams doctor` when the spawn fails. */
16
+ installHint: string;
17
+ /** Confidence: "verified" = tested in this repo, "documented" = per vendor docs. */
18
+ confidence: 'verified' | 'documented';
19
+ /** Source URL for the invocation. */
20
+ source: string;
21
+ }
22
+ export declare const ACP_HARNESSES: Partial<Record<AgentId, AcpHarnessSpec>>;
23
+ /** Returns the ACP spawn spec for an agent, or undefined if the harness does not speak ACP. */
24
+ export declare function getAcpSpec(agent: AgentId): AcpHarnessSpec | undefined;
25
+ /** True if the harness is known to support ACP (directly or via adapter). */
26
+ export declare function supportsAcp(agent: AgentId): boolean;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Per-harness spawn configuration for Agent Client Protocol (ACP) mode.
3
+ *
4
+ * Each entry describes how to launch a coding agent CLI as an ACP server
5
+ * (stdio JSON-RPC). Unsupported harnesses (amp, roo, goose-stdio) are omitted;
6
+ * callers should fall back to the legacy direct-exec path for those.
7
+ *
8
+ * Sources: https://agentclientprotocol.com/get-started/agents + vendor docs.
9
+ */
10
+ export const ACP_HARNESSES = {
11
+ gemini: {
12
+ command: 'gemini',
13
+ args: ['--experimental-acp'],
14
+ installHint: 'npm i -g @google/gemini-cli',
15
+ confidence: 'documented',
16
+ source: 'https://agentclientprotocol.com/get-started/agents',
17
+ },
18
+ claude: {
19
+ command: 'npx',
20
+ args: ['-y', '@zed-industries/claude-agent-acp'],
21
+ installHint: 'npm i -g @zed-industries/claude-agent-acp',
22
+ confidence: 'documented',
23
+ source: 'https://www.npmjs.com/package/@zed-industries/claude-agent-acp',
24
+ },
25
+ codex: {
26
+ command: 'npx',
27
+ args: ['-y', '@zed-industries/codex-acp'],
28
+ installHint: 'npm i -g @zed-industries/codex-acp',
29
+ confidence: 'documented',
30
+ source: 'https://www.npmjs.com/package/@zed-industries/codex-acp',
31
+ },
32
+ cursor: {
33
+ command: 'cursor-agent',
34
+ args: ['acp'],
35
+ installHint: 'curl https://cursor.com/install -fsS | bash',
36
+ confidence: 'documented',
37
+ source: 'https://cursor.com/docs/cli/acp',
38
+ },
39
+ opencode: {
40
+ command: 'opencode',
41
+ args: ['acp'],
42
+ installHint: 'npm i -g opencode-ai',
43
+ confidence: 'documented',
44
+ source: 'https://opencode.ai/docs/acp/',
45
+ },
46
+ openclaw: {
47
+ command: 'openclaw',
48
+ args: ['acp'],
49
+ installHint: 'see https://docs.openclaw.ai',
50
+ confidence: 'documented',
51
+ source: 'https://docs.openclaw.ai/tools/acp-agents',
52
+ },
53
+ // goose: ACP over HTTP via `goosed`, not a clean stdio subcommand.
54
+ // copilot, kiro: excluded for now (not installed in the reference environment,
55
+ // no local verification possible).
56
+ // amp, roo: not on the ACP agents list.
57
+ };
58
+ /** Returns the ACP spawn spec for an agent, or undefined if the harness does not speak ACP. */
59
+ export function getAcpSpec(agent) {
60
+ return ACP_HARNESSES[agent];
61
+ }
62
+ /** True if the harness is known to support ACP (directly or via adapter). */
63
+ export function supportsAcp(agent) {
64
+ return ACP_HARNESSES[agent] !== undefined;
65
+ }