@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/lib/shims.js CHANGED
@@ -1,3 +1,13 @@
1
+ /**
2
+ * Shim generation and config symlink management for agent version switching.
3
+ *
4
+ * Shims are small shell scripts placed in ~/.agents/shims/ that resolve the
5
+ * active agent version (project-level or user-default), then exec the real
6
+ * binary. Config isolation is achieved by symlinking ~/.{agent} into the
7
+ * per-version home directory. This module also handles versioned aliases
8
+ * (e.g., claude@2.0.65), PATH setup, conflict detection during migration,
9
+ * and resource diffing between versions.
10
+ */
1
11
  import * as fs from 'fs';
2
12
  import * as path from 'path';
3
13
  import * as os from 'os';
@@ -130,7 +140,7 @@ export async function promptConflictStrategy(conflictInfos) {
130
140
  * Generate the shim script content for an agent.
131
141
  *
132
142
  * The shim resolves the version in order:
133
- * 1. .agents-version in cwd (walk up to root)
143
+ * 1. agents.yaml in project root (walk up from $PWD, skip ~/.agents/agents.yaml)
134
144
  * 2. ~/.agents/agents.yaml default
135
145
  *
136
146
  * If version is specified but not installed, auto-installs it.
@@ -150,9 +160,21 @@ export async function promptConflictStrategy(conflictInfos) {
150
160
  * shim hook for non-@-capable agents.
151
161
  * v3 — sync/refresh-memory flag renamed `--version` → `--agent-version`
152
162
  * so it no longer collides with commander's top-level `--version`.
163
+ * v4 — project version marker changed from `.agents-version` to a
164
+ * root-level `agents.yaml`; shim now skips ~/.agents/agents.yaml
165
+ * when walking up for a project marker.
166
+ * v5 — emit CODEX_HOME for codex shims so the versioned config (permissions,
167
+ * sandbox_mode, rules/agents-deny.rules) is actually read by the codex
168
+ * binary instead of $HOME/.codex.
169
+ * v6 — hard-disable Codex startup update checks in the generated shims.
153
170
  */
154
- export const SHIM_SCHEMA_VERSION = 3;
171
+ export const SHIM_SCHEMA_VERSION = 6;
172
+ /** Internal marker string used to embed the schema version in shim scripts. */
155
173
  const SHIM_VERSION_MARKER = 'agents-shim-version:';
174
+ /**
175
+ * Generate the full bash shim script for the given agent. The returned string
176
+ * is written to ~/.agents/shims/{cliCommand} and made executable.
177
+ */
156
178
  export function generateShimScript(agent) {
157
179
  const agentConfig = AGENTS[agent];
158
180
  const cliCommand = agentConfig.cliCommand;
@@ -164,7 +186,14 @@ export function generateShimScript(agent) {
164
186
  # live Claude account.
165
187
  export CLAUDE_CONFIG_DIR="$VERSION_DIR/home/${configDirName}"
166
188
  `
167
- : '';
189
+ : agent === 'codex'
190
+ ? `
191
+ # Codex reads its config (approval_policy, sandbox_mode, MCP servers, rules)
192
+ # from CODEX_HOME. Point it at the versioned home so permissions/rules
193
+ # written by agents-cli actually take effect.
194
+ export CODEX_HOME="$VERSION_DIR/home/${configDirName}"
195
+ `
196
+ : '';
168
197
  // Agents that don't natively resolve @-imports in their memory file need
169
198
  // agents-cli to recompile when the user edits a rule/preset file. The
170
199
  // check is fast (sha256 of ~8 small files) and skips the recompile when
@@ -177,39 +206,31 @@ export CLAUDE_CONFIG_DIR="$VERSION_DIR/home/${configDirName}"
177
206
  agents refresh-memory --agent "$AGENT" --agent-version "$VERSION" --quiet 2>/dev/null || true
178
207
  `
179
208
  : '';
209
+ const launchArgs = agent === 'codex' ? ' -c check_for_update_on_startup=false' : '';
180
210
  return `#!/bin/bash
181
211
  # Auto-generated by agents-cli - do not edit
182
212
  # Shim for ${agentConfig.name}
183
213
  # ${SHIM_VERSION_MARKER} ${SHIM_SCHEMA_VERSION}
184
214
 
185
- AGENTS_DIR="$HOME/.agents"
215
+ AGENTS_SYSTEM_DIR="$HOME/.agents-system"
216
+ AGENTS_USER_DIR="$HOME/.agents"
186
217
  AGENT="${agent}"
187
218
  CLI_COMMAND="${cliCommand}"
188
219
 
189
- # Find .agents-version walking up from cwd
220
+ # Find project agents.yaml walking up from cwd (skip $HOME/.agents-system/agents.yaml)
190
221
  find_project_version() {
191
222
  local dir="$PWD"
223
+ local user_agents_yaml="$AGENTS_SYSTEM_DIR/agents.yaml"
192
224
  while [ "$dir" != "/" ]; do
193
- if [ -f "$dir/.agents-version" ]; then
194
- # Parse YAML - handle both "agent: version" and "agent:\\n - version"
225
+ local candidate="$dir/agents.yaml"
226
+ if [ -f "$candidate" ] && [ "$candidate" != "$user_agents_yaml" ]; then
227
+ # Parse agents: section — same shape as resolve_default_version()
195
228
  local version
196
229
  version=$(awk -v agent="$AGENT" '
197
- $0 ~ "^" agent ":" {
198
- # Check if value is on same line
199
- if (match($0, /:[[:space:]]+[0-9]/)) {
200
- gsub(/.*:[[:space:]]*["'"'"']?|["'"'"']?[[:space:]]*$/, "")
201
- print
202
- exit
203
- }
204
- # Value might be on next line (array format)
205
- getline
206
- if (/^[[:space:]]+-[[:space:]]/) {
207
- gsub(/^[[:space:]]+-[[:space:]]*["'"'"']?|["'"'"']?[[:space:]]*$/, "")
208
- print
209
- exit
210
- }
211
- }
212
- ' "$dir/.agents-version")
230
+ /^agents:/ { in_agents=1; next }
231
+ in_agents && /^[^ ]/ { in_agents=0 }
232
+ in_agents && $0 ~ "^ " agent ":" { gsub(/.*:[[:space:]]*["'"'"']?|["'"'"']?[[:space:]]*$/, ""); print; exit }
233
+ ' "$candidate")
213
234
  if [ -n "$version" ]; then
214
235
  echo "$version"
215
236
  return 0
@@ -222,7 +243,7 @@ find_project_version() {
222
243
 
223
244
  # Resolve version from agents.yaml (user default)
224
245
  resolve_default_version() {
225
- local meta="$AGENTS_DIR/agents.yaml"
246
+ local meta="$AGENTS_USER_DIR/agents.yaml"
226
247
  if [ -f "$meta" ]; then
227
248
  awk -v agent="$AGENT" '
228
249
  /^agents:/ { in_agents=1; next }
@@ -232,7 +253,7 @@ resolve_default_version() {
232
253
  fi
233
254
  }
234
255
 
235
- # Find project-scoped .agents directory (stop at .git or .agents-version)
256
+ # Find project-scoped .agents directory (stop at agents.yaml or .git)
236
257
  find_project_agents_dir() {
237
258
  local dir="$PWD"
238
259
  while [ "$dir" != "/" ]; do
@@ -240,7 +261,7 @@ find_project_agents_dir() {
240
261
  echo "$dir/.agents"
241
262
  return 0
242
263
  fi
243
- if [ -f "$dir/.agents-version" ] || [ -d "$dir/.git" ] || [ -f "$dir/.git" ]; then
264
+ if [ -f "$dir/agents.yaml" ] || [ -d "$dir/.git" ] || [ -f "$dir/.git" ]; then
244
265
  break
245
266
  fi
246
267
  dir=$(dirname "$dir")
@@ -262,13 +283,13 @@ if [ -z "$VERSION" ]; then
262
283
  exit 1
263
284
  fi
264
285
 
265
- VERSION_DIR="$AGENTS_DIR/versions/$AGENT/$VERSION"
286
+ VERSION_DIR="$AGENTS_SYSTEM_DIR/versions/$AGENT/$VERSION"
266
287
  BINARY="$VERSION_DIR/node_modules/.bin/$CLI_COMMAND"
267
288
 
268
289
  # Auto-install if not present
269
290
  if [ ! -x "$BINARY" ]; then
270
291
  if [ "$VERSION_SOURCE" = "project" ]; then
271
- echo "agents: $AGENT@$VERSION required by .agents-version but not installed" >&2
292
+ echo "agents: $AGENT@$VERSION required by agents.yaml but not installed" >&2
272
293
 
273
294
  # Spinner animation
274
295
  spin() {
@@ -309,7 +330,7 @@ if [ -n "$PROJECT_AGENTS_DIR" ]; then
309
330
  fi
310
331
  ${refreshMemoryCall}${managedEnv}
311
332
 
312
- exec "$BINARY" "$@"
333
+ exec "$BINARY"${launchArgs} "$@"
313
334
  `;
314
335
  }
315
336
  /**
@@ -337,25 +358,64 @@ export function removeShim(agent) {
337
358
  }
338
359
  return false;
339
360
  }
361
+ /**
362
+ * Current versioned-alias schema. Bump whenever `generateVersionedAliasScript`
363
+ * changes in a way that requires existing on-disk aliases to be regenerated.
364
+ *
365
+ * History:
366
+ * v1 — implicit (no marker); no CLAUDE_CONFIG_DIR export, so direct
367
+ * `claude@X` invocations leaked into ~/.claude (the default version's
368
+ * symlinked home) and `agents view` never saw the login.
369
+ * v2 — emit CLAUDE_CONFIG_DIR for claude aliases so each version has its
370
+ * own isolated config/OAuth slot; stamp a version marker so stale
371
+ * aliases can be detected and regenerated.
372
+ * v3 — emit CODEX_HOME for codex aliases so direct `codex@X` invocations
373
+ * read the versioned permissions/rules instead of $HOME/.codex.
374
+ * v4 — direct aliases read binaries and config homes from ~/.agents-system.
375
+ * v5 — hard-disable Codex startup update checks in versioned aliases.
376
+ */
377
+ export const VERSIONED_ALIAS_SCHEMA_VERSION = 5;
378
+ /** Internal marker string used to embed the schema version in versioned alias scripts. */
379
+ const VERSIONED_ALIAS_VERSION_MARKER = 'agents-versioned-alias-version:';
380
+ // The version string is interpolated into a generated bash script and into
381
+ // a filename. parseAgentSpec / parseVersion already validates this upstream,
382
+ // but generators are also called from internal code paths (e.g., re-emit on
383
+ // schema bump), so re-check here. Mirrors VERSION_RE in versions.ts.
384
+ const ALIAS_VERSION_RE = /^[A-Za-z0-9._+-]{1,64}$/;
385
+ function assertSafeVersion(version) {
386
+ if (!ALIAS_VERSION_RE.test(version)) {
387
+ throw new Error(`Refusing to generate shim for unsafe version: ${JSON.stringify(version)}`);
388
+ }
389
+ }
340
390
  /**
341
391
  * Generate a versioned alias script that directly execs a specific version.
342
392
  * e.g., claude@2.0.65 -> directly runs that version's binary
343
393
  */
344
394
  export function generateVersionedAliasScript(agent, version) {
395
+ assertSafeVersion(version);
345
396
  const agentConfig = AGENTS[agent];
346
397
  const configDirName = `.${agent}`;
347
398
  const managedEnv = agent === 'claude'
348
399
  ? `
349
400
  # Claude stores OAuth credentials in the macOS keychain. Scope them to this
350
401
  # version's config directory so direct aliases also switch the live account.
351
- export CLAUDE_CONFIG_DIR="$HOME/.agents/versions/${agent}/${version}/home/${configDirName}"
402
+ export CLAUDE_CONFIG_DIR="$HOME/.agents-system/versions/${agent}/${version}/home/${configDirName}"
352
403
  `
353
- : '';
404
+ : agent === 'codex'
405
+ ? `
406
+ # Codex reads its config (approval_policy, sandbox_mode, MCP servers, rules)
407
+ # from CODEX_HOME. Point direct aliases at the versioned home so permissions
408
+ # and rules written by agents-cli actually take effect.
409
+ export CODEX_HOME="$HOME/.agents-system/versions/${agent}/${version}/home/${configDirName}"
410
+ `
411
+ : '';
412
+ const launchArgs = agent === 'codex' ? ' -c check_for_update_on_startup=false' : '';
354
413
  return `#!/bin/bash
355
414
  # Auto-generated by agents-cli - do not edit
415
+ # ${VERSIONED_ALIAS_VERSION_MARKER} ${VERSIONED_ALIAS_SCHEMA_VERSION}
356
416
  # Direct alias for ${agentConfig.name}@${version}
357
417
 
358
- BINARY="$HOME/.agents/versions/${agent}/${version}/node_modules/.bin/${agentConfig.cliCommand}"
418
+ BINARY="$HOME/.agents-system/versions/${agent}/${version}/node_modules/.bin/${agentConfig.cliCommand}"
359
419
 
360
420
  if [ ! -x "$BINARY" ]; then
361
421
  echo "agents: ${agent}@${version} not installed" >&2
@@ -363,14 +423,64 @@ if [ ! -x "$BINARY" ]; then
363
423
  fi
364
424
  ${managedEnv}
365
425
 
366
- exec "$BINARY" "$@"
426
+ exec "$BINARY"${launchArgs} "$@"
367
427
  `;
368
428
  }
429
+ /**
430
+ * Read the schema version of an on-disk versioned alias. Returns null if the
431
+ * alias doesn't exist or is a pre-v2 alias (no marker — treated as stale).
432
+ */
433
+ export function readVersionedAliasSchemaVersion(agent, version) {
434
+ const aliasPath = getVersionedAliasPath(agent, version);
435
+ if (!fs.existsSync(aliasPath))
436
+ return null;
437
+ try {
438
+ const content = fs.readFileSync(aliasPath, 'utf8');
439
+ const header = content.split('\n', 10).join('\n');
440
+ const match = header.match(new RegExp(VERSIONED_ALIAS_VERSION_MARKER + '\\s*(\\d+)'));
441
+ if (!match)
442
+ return null;
443
+ return Number(match[1]);
444
+ }
445
+ catch {
446
+ return null;
447
+ }
448
+ }
449
+ /**
450
+ * True if the on-disk versioned alias matches the current schema version.
451
+ */
452
+ export function isVersionedAliasCurrent(agent, version) {
453
+ return readVersionedAliasSchemaVersion(agent, version) === VERSIONED_ALIAS_SCHEMA_VERSION;
454
+ }
455
+ /**
456
+ * Regenerate a versioned alias if missing or stale. Mirrors ensureShimCurrent
457
+ * for the main shim — callers can surface a one-line notice when something
458
+ * was upgraded.
459
+ */
460
+ export function ensureVersionedAliasCurrent(agent, version) {
461
+ const aliasPath = getVersionedAliasPath(agent, version);
462
+ if (!fs.existsSync(aliasPath)) {
463
+ createVersionedAlias(agent, version);
464
+ return 'created';
465
+ }
466
+ if (!isVersionedAliasCurrent(agent, version)) {
467
+ createVersionedAlias(agent, version);
468
+ return 'updated';
469
+ }
470
+ return 'current';
471
+ }
472
+ /**
473
+ * Get the filesystem path for a versioned alias script.
474
+ */
475
+ export function getVersionedAliasPath(agent, version) {
476
+ return path.join(getShimsDir(), `${AGENTS[agent].cliCommand}@${version}`);
477
+ }
369
478
  /**
370
479
  * Create a versioned alias for a specific agent version.
371
480
  * e.g., claude@2.0.65
372
481
  */
373
482
  export function createVersionedAlias(agent, version) {
483
+ assertSafeVersion(version);
374
484
  ensureAgentsDir();
375
485
  const shimsDir = getShimsDir();
376
486
  const agentConfig = AGENTS[agent];
@@ -535,6 +645,15 @@ export function switchHomeFileSymlinks(agent, version) {
535
645
  const versionsDir = getVersionsDir();
536
646
  const switched = [];
537
647
  const errors = [];
648
+ // For Claude, Claude's binary reads CLAUDE_CONFIG_DIR/.claude.json (INSIDE
649
+ // the per-version .claude dir) — not the home-level file this function
650
+ // manages. Reconcile all installed Claude versions so INSIDE is a symlink
651
+ // to OUTSIDE, making OUTSIDE the single source of truth.
652
+ if (agent === 'claude') {
653
+ const reconcile = ensureAllClaudeInsideSymlinks();
654
+ for (const e of reconcile.errors)
655
+ errors.push(e);
656
+ }
538
657
  for (const fileName of homeFiles) {
539
658
  const globalPath = path.join(home, fileName);
540
659
  const versionFilePath = path.join(versionsDir, agent, version, 'home', fileName);
@@ -578,7 +697,14 @@ export function switchHomeFileSymlinks(agent, version) {
578
697
  else if (stat.isFile()) {
579
698
  // Real file — first-time migration
580
699
  // Read the global file content
581
- const globalContent = JSON.parse(fs.readFileSync(globalPath, 'utf-8'));
700
+ let globalContent;
701
+ try {
702
+ globalContent = JSON.parse(fs.readFileSync(globalPath, 'utf-8'));
703
+ }
704
+ catch (err) {
705
+ errors.push(`${fileName}: Could not parse ${globalPath}: ${err.message}`);
706
+ continue;
707
+ }
582
708
  // Merge auth into ALL installed version files for this agent
583
709
  const agentVersionsDir = path.join(versionsDir, agent);
584
710
  if (fs.existsSync(agentVersionsDir)) {
@@ -623,6 +749,108 @@ export function switchHomeFileSymlinks(agent, version) {
623
749
  }
624
750
  return { switched, errors };
625
751
  }
752
+ /**
753
+ * Claude reads `.claude.json` at `$CLAUDE_CONFIG_DIR/.claude.json`. Our shim
754
+ * points CLAUDE_CONFIG_DIR at `<ver>/home/.claude`, so Claude's real config
755
+ * file lives at `<ver>/home/.claude/.claude.json` (INSIDE), while
756
+ * `switchHomeFileSymlinks` manages `<ver>/home/.claude.json` (OUTSIDE).
757
+ *
758
+ * To keep both views consistent we make INSIDE a symlink to OUTSIDE. Claude's
759
+ * atomic write (`Uf6`) resolves symlinks before the tmp+rename cycle, so the
760
+ * symlink survives across writes and OUTSIDE remains the single source of
761
+ * truth that agents-cli's home-file machinery already manages.
762
+ *
763
+ * This function idempotently reconciles one version:
764
+ * - INSIDE missing: create symlink -> `../.claude.json` (create OUTSIDE if needed).
765
+ * - INSIDE already symlink to OUTSIDE: no-op.
766
+ * - INSIDE is a real file: it's the authoritative auth state (Claude was
767
+ * writing to it). Move its content to OUTSIDE (merging with OUTSIDE,
768
+ * INSIDE wins for `oauthAccount`), then replace INSIDE with the symlink.
769
+ * - Symlink points elsewhere: replace it.
770
+ */
771
+ export function ensureClaudeInsideSymlink(version) {
772
+ const versionsDir = getVersionsDir();
773
+ const versionHome = path.join(versionsDir, 'claude', version, 'home');
774
+ const outsidePath = path.join(versionHome, '.claude.json');
775
+ const insideDir = path.join(versionHome, '.claude');
776
+ const insidePath = path.join(insideDir, '.claude.json');
777
+ const linkTarget = '../.claude.json'; // relative so version dir can be moved
778
+ if (!fs.existsSync(insideDir)) {
779
+ fs.mkdirSync(insideDir, { recursive: true });
780
+ }
781
+ let insideStat = null;
782
+ try {
783
+ insideStat = fs.lstatSync(insidePath);
784
+ }
785
+ catch {
786
+ /* INSIDE does not exist */
787
+ }
788
+ if (insideStat?.isSymbolicLink()) {
789
+ const currentTarget = fs.readlinkSync(insidePath);
790
+ if (currentTarget === linkTarget)
791
+ return;
792
+ // Wrong target — replace.
793
+ if (!fs.existsSync(outsidePath))
794
+ fs.writeFileSync(outsidePath, '{}');
795
+ fs.unlinkSync(insidePath);
796
+ fs.symlinkSync(linkTarget, insidePath);
797
+ return;
798
+ }
799
+ if (insideStat?.isFile()) {
800
+ // INSIDE is the authoritative file — Claude has been reading/writing it.
801
+ // Merge INSIDE into OUTSIDE, with INSIDE winning on every field, then
802
+ // replace INSIDE with a symlink.
803
+ let insideContent = {};
804
+ try {
805
+ insideContent = JSON.parse(fs.readFileSync(insidePath, 'utf-8'));
806
+ }
807
+ catch {
808
+ /* INSIDE corrupt — treat as empty; OUTSIDE preserved as-is */
809
+ }
810
+ let outsideContent = {};
811
+ if (fs.existsSync(outsidePath)) {
812
+ try {
813
+ outsideContent = JSON.parse(fs.readFileSync(outsidePath, 'utf-8'));
814
+ }
815
+ catch {
816
+ /* OUTSIDE corrupt — drop it */
817
+ }
818
+ }
819
+ const merged = { ...outsideContent, ...insideContent };
820
+ fs.writeFileSync(outsidePath, JSON.stringify(merged, null, 2));
821
+ fs.unlinkSync(insidePath);
822
+ fs.symlinkSync(linkTarget, insidePath);
823
+ return;
824
+ }
825
+ // INSIDE missing — ensure OUTSIDE exists, then create symlink.
826
+ if (!fs.existsSync(outsidePath))
827
+ fs.writeFileSync(outsidePath, '{}');
828
+ fs.symlinkSync(linkTarget, insidePath);
829
+ }
830
+ /**
831
+ * Apply `ensureClaudeInsideSymlink` to every installed Claude version.
832
+ * Safe to call repeatedly; per-version calls are idempotent.
833
+ */
834
+ export function ensureAllClaudeInsideSymlinks() {
835
+ const versionsDir = getVersionsDir();
836
+ const claudeVersionsDir = path.join(versionsDir, 'claude');
837
+ const migrated = [];
838
+ const errors = [];
839
+ if (!fs.existsSync(claudeVersionsDir))
840
+ return { migrated, errors };
841
+ for (const entry of fs.readdirSync(claudeVersionsDir, { withFileTypes: true })) {
842
+ if (!entry.isDirectory())
843
+ continue;
844
+ try {
845
+ ensureClaudeInsideSymlink(entry.name);
846
+ migrated.push(entry.name);
847
+ }
848
+ catch (err) {
849
+ errors.push(`${entry.name}: ${err.message}`);
850
+ }
851
+ }
852
+ return { migrated, errors };
853
+ }
626
854
  /**
627
855
  * Get the current config symlink target version, if any.
628
856
  */
@@ -807,6 +1035,37 @@ export function getPathShadowingExecutable(agent) {
807
1035
  }
808
1036
  return null;
809
1037
  }
1038
+ /**
1039
+ * Check if the agent's CLI command is shadowed by a shell alias.
1040
+ *
1041
+ * Shell aliases live in the user's session and aren't visible from a Node.js
1042
+ * child process. We do a best-effort scan of common RC files for `alias
1043
+ * <command>=` patterns. Returns false when detection is inconclusive.
1044
+ */
1045
+ export function hasAliasShadowingShim(agent) {
1046
+ const cliCommand = AGENTS[agent].cliCommand;
1047
+ const HOME = os.homedir();
1048
+ const rcFiles = [
1049
+ path.join(HOME, '.zshrc'),
1050
+ path.join(HOME, '.bashrc'),
1051
+ path.join(HOME, '.bash_profile'),
1052
+ path.join(HOME, '.profile'),
1053
+ ];
1054
+ const pattern = new RegExp(`^\\s*alias\\s+${cliCommand}\\s*=`, 'm');
1055
+ for (const rcFile of rcFiles) {
1056
+ try {
1057
+ if (!fs.existsSync(rcFile))
1058
+ continue;
1059
+ const content = fs.readFileSync(rcFile, 'utf-8');
1060
+ if (pattern.test(content))
1061
+ return true;
1062
+ }
1063
+ catch {
1064
+ // unreadable rc file — skip
1065
+ }
1066
+ }
1067
+ return false;
1068
+ }
810
1069
  /**
811
1070
  * Check if shims directory is in PATH.
812
1071
  */
@@ -815,11 +1074,56 @@ export function isShimsInPath() {
815
1074
  const pathDirs = (process.env.PATH || '').split(path.delimiter);
816
1075
  return pathDirs.some((dir) => path.resolve(dir) === path.resolve(shimsDir));
817
1076
  }
1077
+ function isShimPathCommandLine(line, shimsDir) {
1078
+ const trimmed = line.trim();
1079
+ if (trimmed.startsWith('#')) {
1080
+ return false;
1081
+ }
1082
+ const normalized = trimmed.replace(/['"]/g, '');
1083
+ const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
1084
+ const exactMarkers = [
1085
+ shimsDir,
1086
+ '$HOME/.agents-system/shims',
1087
+ '${HOME}/.agents-system/shims',
1088
+ '~/.agents-system/shims',
1089
+ '$HOME/.agents/shims',
1090
+ '${HOME}/.agents/shims',
1091
+ '~/.agents/shims',
1092
+ ];
1093
+ const markerRegexes = exactMarkers.map((marker) => new RegExp(`${escapeRegex(marker)}(?=$|[:\\s])`));
1094
+ const suffixRegexes = [
1095
+ /\/\.agents-system\/shims(?=$|[:\s])/,
1096
+ /\/\.agents\/shims(?=$|[:\s])/,
1097
+ ];
1098
+ const touchesShimPath = [...markerRegexes, ...suffixRegexes].some((pattern) => pattern.test(normalized));
1099
+ if (!touchesShimPath) {
1100
+ return false;
1101
+ }
1102
+ return trimmed.startsWith('export PATH=') || trimmed.startsWith('fish_add_path ');
1103
+ }
1104
+ function stripShimPathLines(content, shimsDir) {
1105
+ const lines = content.split('\n');
1106
+ const kept = [];
1107
+ for (let i = 0; i < lines.length; i++) {
1108
+ const line = lines[i];
1109
+ if (line.trim() === '# agents-cli: version-managed agent CLIs' &&
1110
+ i + 1 < lines.length &&
1111
+ isShimPathCommandLine(lines[i + 1], shimsDir)) {
1112
+ i++;
1113
+ continue;
1114
+ }
1115
+ if (isShimPathCommandLine(line, shimsDir)) {
1116
+ continue;
1117
+ }
1118
+ kept.push(line);
1119
+ }
1120
+ return kept.join('\n').replace(/\n{3,}/g, '\n\n');
1121
+ }
818
1122
  /**
819
1123
  * Get the shell rc file path for the current shell.
820
1124
  */
821
- function getShellRcFile() {
822
- const shell = process.env.SHELL || '/bin/bash';
1125
+ function getShellRcFile(overrides) {
1126
+ const shell = overrides?.shell || process.env.SHELL || '/bin/bash';
823
1127
  const shellName = path.basename(shell);
824
1128
  let rcFile;
825
1129
  switch (shellName) {
@@ -836,7 +1140,7 @@ function getShellRcFile() {
836
1140
  }
837
1141
  return {
838
1142
  rcFile,
839
- rcPath: path.join(os.homedir(), rcFile),
1143
+ rcPath: path.join(overrides?.homeDir || os.homedir(), rcFile),
840
1144
  shell: shellName,
841
1145
  };
842
1146
  }
@@ -850,7 +1154,7 @@ export function getPathSetupInstructions() {
850
1154
  return `Add to ~/.config/fish/config.fish:
851
1155
  fish_add_path ${shimsDir}`;
852
1156
  }
853
- return `Add to ~/${rcFile} (BEFORE any nvm/node setup):
1157
+ return `Add to ~/${rcFile} (AFTER any nvm/node setup):
854
1158
  export PATH="${shimsDir}:$PATH"
855
1159
 
856
1160
  IMPORTANT: Shims must come FIRST in PATH to override global installs.
@@ -862,9 +1166,9 @@ Then restart your shell or run:
862
1166
  * Add shims directory to shell PATH configuration.
863
1167
  * Returns true if added, false if already present or failed.
864
1168
  */
865
- export function addShimsToPath() {
866
- const shimsDir = getShimsDir();
867
- const { rcFile, rcPath, shell } = getShellRcFile();
1169
+ export function addShimsToPath(overrides) {
1170
+ const shimsDir = overrides?.shimsDir || getShimsDir();
1171
+ const { rcFile, rcPath, shell } = getShellRcFile(overrides);
868
1172
  // Read current rc file content
869
1173
  let content = '';
870
1174
  try {
@@ -875,21 +1179,17 @@ export function addShimsToPath() {
875
1179
  catch (err) {
876
1180
  return { success: false, error: `Could not read ${rcFile}: ${err.message}` };
877
1181
  }
878
- // Check if shims path already in file
879
- if (content.includes(shimsDir) || content.includes('$HOME/.agents/shims')) {
880
- return { success: true, alreadyPresent: true, rcFile };
881
- }
882
- // Generate the export line
883
- let exportLine;
1182
+ // Generate the canonical PATH block.
1183
+ let exportBlock;
884
1184
  if (shell === 'fish') {
885
- exportLine = `\n# agents-cli: version-managed agent CLIs\nfish_add_path ${shimsDir}\n`;
1185
+ exportBlock = `# agents-cli: version-managed agent CLIs\nfish_add_path ${shimsDir}\n`;
886
1186
  }
887
1187
  else {
888
- exportLine = `\n# agents-cli: version-managed agent CLIs\nexport PATH="${shimsDir}:$PATH"\n`;
1188
+ exportBlock = `# agents-cli: version-managed agent CLIs\nexport PATH="${shimsDir}:$PATH"\n`;
889
1189
  }
890
- // Find insertion point - BEFORE nvm/node setup if possible
891
- // Look for common patterns that should come AFTER our shims
892
- const insertBeforePatterns = [
1190
+ const contentWithoutShimLines = stripShimPathLines(content, shimsDir);
1191
+ // Find insertion point - AFTER node/nvm/fnm setup if present, otherwise append.
1192
+ const insertAfterPatterns = [
893
1193
  /^export NVM_DIR=/m,
894
1194
  /^source.*nvm/m,
895
1195
  /^\[ -s.*nvm/m,
@@ -898,18 +1198,14 @@ export function addShimsToPath() {
898
1198
  /^export PATH.*npm/m,
899
1199
  ];
900
1200
  let insertIndex = -1;
901
- for (const pattern of insertBeforePatterns) {
902
- const match = content.match(pattern);
903
- if (match && match.index !== undefined) {
904
- // Find start of this line
905
- let lineStart = match.index;
906
- while (lineStart > 0 && content[lineStart - 1] !== '\n') {
907
- lineStart--;
908
- }
909
- if (insertIndex === -1 || lineStart < insertIndex) {
910
- insertIndex = lineStart;
911
- }
1201
+ const lines = contentWithoutShimLines.split('\n');
1202
+ let offset = 0;
1203
+ for (const line of lines) {
1204
+ const lineWithNewline = `${line}\n`;
1205
+ if (insertAfterPatterns.some((pattern) => pattern.test(line))) {
1206
+ insertIndex = offset + lineWithNewline.length;
912
1207
  }
1208
+ offset += lineWithNewline.length;
913
1209
  }
914
1210
  // Write the updated content
915
1211
  try {
@@ -920,12 +1216,19 @@ export function addShimsToPath() {
920
1216
  }
921
1217
  let newContent;
922
1218
  if (insertIndex >= 0) {
923
- // Insert before nvm/node setup (handles index 0 correctly)
924
- newContent = content.slice(0, insertIndex) + exportLine + content.slice(insertIndex);
1219
+ // Insert after the last node/nvm/fnm-related line so our prepend wins.
1220
+ const before = contentWithoutShimLines.slice(0, insertIndex);
1221
+ const separator = before.length > 0 && !before.endsWith('\n\n') ? '\n' : '';
1222
+ newContent = before + separator + exportBlock + contentWithoutShimLines.slice(insertIndex);
925
1223
  }
926
1224
  else {
927
1225
  // Append to end
928
- newContent = content + exportLine;
1226
+ const separator = contentWithoutShimLines.length > 0 && !contentWithoutShimLines.endsWith('\n') ? '\n' : '';
1227
+ newContent = contentWithoutShimLines + separator + exportBlock;
1228
+ }
1229
+ newContent = newContent.replace(/\n{2,}$/g, '\n');
1230
+ if (newContent === content) {
1231
+ return { success: true, alreadyPresent: true, rcFile };
929
1232
  }
930
1233
  fs.writeFileSync(rcPath, newContent, 'utf-8');
931
1234
  return { success: true, rcFile };
@@ -934,6 +1237,17 @@ export function addShimsToPath() {
934
1237
  return { success: false, error: `Could not write ${rcFile}: ${err.message}` };
935
1238
  }
936
1239
  }
1240
+ export function listAgentsWithInstalledVersions() {
1241
+ const versionsDir = getVersionsDir();
1242
+ if (!fs.existsSync(versionsDir)) {
1243
+ return [];
1244
+ }
1245
+ const entries = fs.readdirSync(versionsDir, { withFileTypes: true });
1246
+ return entries
1247
+ .filter((entry) => entry.isDirectory() && AGENTS[entry.name])
1248
+ .map((entry) => entry.name)
1249
+ .filter((agent) => fs.readdirSync(path.join(versionsDir, agent), { withFileTypes: true }).some((entry) => entry.isDirectory()));
1250
+ }
937
1251
  /**
938
1252
  * Create shims for all installed agents.
939
1253
  */
@@ -1116,4 +1430,3 @@ export function copyResourcesToVersion(agent, fromVersion, toVersion, diff) {
1116
1430
  }
1117
1431
  }
1118
1432
  }
1119
- //# sourceMappingURL=shims.js.map