@swarmify/agents-cli 1.12.0 → 1.13.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 (539) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +21 -0
  3. package/README.md +212 -232
  4. package/dist/commands/__tests__/sessions.test.js +90 -20
  5. package/dist/commands/__tests__/sessions.test.js.map +1 -1
  6. package/dist/commands/cloud.d.ts +11 -0
  7. package/dist/commands/cloud.d.ts.map +1 -0
  8. package/dist/commands/cloud.js +363 -0
  9. package/dist/commands/cloud.js.map +1 -0
  10. package/dist/commands/commands.d.ts +9 -0
  11. package/dist/commands/commands.d.ts.map +1 -1
  12. package/dist/commands/commands.js +330 -139
  13. package/dist/commands/commands.js.map +1 -1
  14. package/dist/commands/daemon.d.ts +8 -0
  15. package/dist/commands/daemon.d.ts.map +1 -1
  16. package/dist/commands/daemon.js +38 -222
  17. package/dist/commands/daemon.js.map +1 -1
  18. package/dist/commands/drive.d.ts +8 -0
  19. package/dist/commands/drive.d.ts.map +1 -1
  20. package/dist/commands/drive.js +70 -7
  21. package/dist/commands/drive.js.map +1 -1
  22. package/dist/commands/exec.d.ts +9 -1
  23. package/dist/commands/exec.d.ts.map +1 -1
  24. package/dist/commands/exec.js +198 -24
  25. package/dist/commands/exec.js.map +1 -1
  26. package/dist/commands/factory.d.ts +11 -0
  27. package/dist/commands/factory.d.ts.map +1 -0
  28. package/dist/commands/factory.js +445 -0
  29. package/dist/commands/factory.js.map +1 -0
  30. package/dist/commands/fork.d.ts +8 -0
  31. package/dist/commands/fork.d.ts.map +1 -1
  32. package/dist/commands/fork.js +38 -4
  33. package/dist/commands/fork.js.map +1 -1
  34. package/dist/commands/hooks.d.ts +9 -0
  35. package/dist/commands/hooks.d.ts.map +1 -1
  36. package/dist/commands/hooks.js +252 -18
  37. package/dist/commands/hooks.js.map +1 -1
  38. package/dist/commands/init.d.ts +15 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +137 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/mcp.d.ts +9 -0
  43. package/dist/commands/mcp.d.ts.map +1 -1
  44. package/dist/commands/mcp.js +250 -169
  45. package/dist/commands/mcp.js.map +1 -1
  46. package/dist/commands/models.d.ts +11 -0
  47. package/dist/commands/models.d.ts.map +1 -0
  48. package/dist/commands/models.js +170 -0
  49. package/dist/commands/models.js.map +1 -0
  50. package/dist/commands/packages.d.ts +8 -0
  51. package/dist/commands/packages.d.ts.map +1 -1
  52. package/dist/commands/packages.js +155 -14
  53. package/dist/commands/packages.js.map +1 -1
  54. package/dist/commands/permissions.d.ts +9 -0
  55. package/dist/commands/permissions.d.ts.map +1 -1
  56. package/dist/commands/permissions.js +72 -13
  57. package/dist/commands/permissions.js.map +1 -1
  58. package/dist/commands/plugins.d.ts +8 -0
  59. package/dist/commands/plugins.d.ts.map +1 -1
  60. package/dist/commands/plugins.js +265 -44
  61. package/dist/commands/plugins.js.map +1 -1
  62. package/dist/commands/profiles.d.ts +12 -0
  63. package/dist/commands/profiles.d.ts.map +1 -0
  64. package/dist/commands/profiles.js +255 -0
  65. package/dist/commands/profiles.js.map +1 -0
  66. package/dist/commands/pty.d.ts +1 -0
  67. package/dist/commands/pty.d.ts.map +1 -1
  68. package/dist/commands/pty.js +133 -22
  69. package/dist/commands/pty.js.map +1 -1
  70. package/dist/commands/pull.d.ts +8 -0
  71. package/dist/commands/pull.d.ts.map +1 -1
  72. package/dist/commands/pull.js +103 -14
  73. package/dist/commands/pull.js.map +1 -1
  74. package/dist/commands/push.d.ts +8 -0
  75. package/dist/commands/push.d.ts.map +1 -1
  76. package/dist/commands/push.js +37 -3
  77. package/dist/commands/push.js.map +1 -1
  78. package/dist/commands/refresh-memory.d.ts +16 -0
  79. package/dist/commands/refresh-memory.d.ts.map +1 -0
  80. package/dist/commands/refresh-memory.js +52 -0
  81. package/dist/commands/refresh-memory.js.map +1 -0
  82. package/dist/commands/resource-view.d.ts +39 -0
  83. package/dist/commands/resource-view.d.ts.map +1 -0
  84. package/dist/commands/resource-view.js +197 -0
  85. package/dist/commands/resource-view.js.map +1 -0
  86. package/dist/commands/routines.d.ts +8 -0
  87. package/dist/commands/routines.d.ts.map +1 -1
  88. package/dist/commands/routines.js +163 -34
  89. package/dist/commands/routines.js.map +1 -1
  90. package/dist/commands/rules.d.ts +9 -0
  91. package/dist/commands/rules.d.ts.map +1 -1
  92. package/dist/commands/rules.js +83 -12
  93. package/dist/commands/rules.js.map +1 -1
  94. package/dist/commands/secrets.d.ts +11 -0
  95. package/dist/commands/secrets.d.ts.map +1 -0
  96. package/dist/commands/secrets.js +352 -0
  97. package/dist/commands/secrets.js.map +1 -0
  98. package/dist/commands/sessions-picker.d.ts +18 -0
  99. package/dist/commands/sessions-picker.d.ts.map +1 -0
  100. package/dist/commands/sessions-picker.js +265 -0
  101. package/dist/commands/sessions-picker.js.map +1 -0
  102. package/dist/commands/sessions.d.ts +15 -0
  103. package/dist/commands/sessions.d.ts.map +1 -1
  104. package/dist/commands/sessions.js +700 -263
  105. package/dist/commands/sessions.js.map +1 -1
  106. package/dist/commands/skills.d.ts +9 -0
  107. package/dist/commands/skills.d.ts.map +1 -1
  108. package/dist/commands/skills.js +355 -233
  109. package/dist/commands/skills.js.map +1 -1
  110. package/dist/commands/status.d.ts +7 -0
  111. package/dist/commands/status.d.ts.map +1 -1
  112. package/dist/commands/status.js +7 -0
  113. package/dist/commands/status.js.map +1 -1
  114. package/dist/commands/subagents.d.ts +8 -0
  115. package/dist/commands/subagents.d.ts.map +1 -1
  116. package/dist/commands/subagents.js +214 -74
  117. package/dist/commands/subagents.js.map +1 -1
  118. package/dist/commands/sync.d.ts +8 -0
  119. package/dist/commands/sync.d.ts.map +1 -1
  120. package/dist/commands/sync.js +15 -7
  121. package/dist/commands/sync.js.map +1 -1
  122. package/dist/commands/teams-picker.d.ts +18 -0
  123. package/dist/commands/teams-picker.d.ts.map +1 -0
  124. package/dist/commands/teams-picker.js +290 -0
  125. package/dist/commands/teams-picker.js.map +1 -0
  126. package/dist/commands/teams.d.ts +18 -0
  127. package/dist/commands/teams.d.ts.map +1 -0
  128. package/dist/commands/teams.js +1098 -0
  129. package/dist/commands/teams.js.map +1 -0
  130. package/dist/commands/utils.d.ts +20 -0
  131. package/dist/commands/utils.d.ts.map +1 -1
  132. package/dist/commands/utils.js +34 -0
  133. package/dist/commands/utils.js.map +1 -1
  134. package/dist/commands/versions.d.ts +8 -0
  135. package/dist/commands/versions.d.ts.map +1 -1
  136. package/dist/commands/versions.js +71 -8
  137. package/dist/commands/versions.js.map +1 -1
  138. package/dist/commands/view.d.ts +36 -1
  139. package/dist/commands/view.d.ts.map +1 -1
  140. package/dist/commands/view.js +375 -15
  141. package/dist/commands/view.js.map +1 -1
  142. package/dist/index.d.ts +6 -0
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +136 -51
  145. package/dist/index.js.map +1 -1
  146. package/dist/lib/__tests__/bugfixes.test.js +3 -3
  147. package/dist/lib/__tests__/bugfixes.test.js.map +1 -1
  148. package/dist/lib/__tests__/exec.test.js +125 -19
  149. package/dist/lib/__tests__/exec.test.js.map +1 -1
  150. package/dist/lib/__tests__/hooks.test.d.ts +2 -0
  151. package/dist/lib/__tests__/hooks.test.d.ts.map +1 -0
  152. package/dist/lib/__tests__/hooks.test.js +203 -0
  153. package/dist/lib/__tests__/hooks.test.js.map +1 -0
  154. package/dist/lib/__tests__/memory-compile.test.d.ts +2 -0
  155. package/dist/lib/__tests__/memory-compile.test.d.ts.map +1 -0
  156. package/dist/lib/__tests__/memory-compile.test.js +95 -0
  157. package/dist/lib/__tests__/memory-compile.test.js.map +1 -0
  158. package/dist/lib/__tests__/models.test.d.ts +2 -0
  159. package/dist/lib/__tests__/models.test.d.ts.map +1 -0
  160. package/dist/lib/__tests__/models.test.js +239 -0
  161. package/dist/lib/__tests__/models.test.js.map +1 -0
  162. package/dist/lib/__tests__/rotate.test.d.ts +2 -0
  163. package/dist/lib/__tests__/rotate.test.d.ts.map +1 -0
  164. package/dist/lib/__tests__/rotate.test.js +80 -0
  165. package/dist/lib/__tests__/rotate.test.js.map +1 -0
  166. package/dist/lib/__tests__/secrets-bundles.test.d.ts +2 -0
  167. package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +1 -0
  168. package/dist/lib/__tests__/secrets-bundles.test.js +104 -0
  169. package/dist/lib/__tests__/secrets-bundles.test.js.map +1 -0
  170. package/dist/lib/__tests__/secrets.test.d.ts +2 -0
  171. package/dist/lib/__tests__/secrets.test.d.ts.map +1 -0
  172. package/dist/lib/__tests__/secrets.test.js +90 -0
  173. package/dist/lib/__tests__/secrets.test.js.map +1 -0
  174. package/dist/lib/__tests__/shims.test.d.ts +2 -0
  175. package/dist/lib/__tests__/shims.test.d.ts.map +1 -0
  176. package/dist/lib/__tests__/shims.test.js +39 -0
  177. package/dist/lib/__tests__/shims.test.js.map +1 -0
  178. package/dist/lib/__tests__/usage.test.js +4 -2
  179. package/dist/lib/__tests__/usage.test.js.map +1 -1
  180. package/dist/lib/__tests__/versions.test.d.ts +2 -0
  181. package/dist/lib/__tests__/versions.test.d.ts.map +1 -0
  182. package/dist/lib/__tests__/versions.test.js +63 -0
  183. package/dist/lib/__tests__/versions.test.js.map +1 -0
  184. package/dist/lib/agents.d.ts +53 -1
  185. package/dist/lib/agents.d.ts.map +1 -1
  186. package/dist/lib/agents.js +178 -37
  187. package/dist/lib/agents.js.map +1 -1
  188. package/dist/lib/artifact-actions.d.ts +8 -3
  189. package/dist/lib/artifact-actions.d.ts.map +1 -1
  190. package/dist/lib/artifact-actions.js +8 -5
  191. package/dist/lib/artifact-actions.js.map +1 -1
  192. package/dist/lib/cloud/codex.d.ts +26 -0
  193. package/dist/lib/cloud/codex.d.ts.map +1 -0
  194. package/dist/lib/cloud/codex.js +237 -0
  195. package/dist/lib/cloud/codex.js.map +1 -0
  196. package/dist/lib/cloud/factory.d.ts +32 -0
  197. package/dist/lib/cloud/factory.d.ts.map +1 -0
  198. package/dist/lib/cloud/factory.js +43 -0
  199. package/dist/lib/cloud/factory.js.map +1 -0
  200. package/dist/lib/cloud/registry.d.ts +16 -0
  201. package/dist/lib/cloud/registry.d.ts.map +1 -0
  202. package/dist/lib/cloud/registry.js +68 -0
  203. package/dist/lib/cloud/registry.js.map +1 -0
  204. package/dist/lib/cloud/rush.d.ts +37 -0
  205. package/dist/lib/cloud/rush.d.ts.map +1 -0
  206. package/dist/lib/cloud/rush.js +230 -0
  207. package/dist/lib/cloud/rush.js.map +1 -0
  208. package/dist/lib/cloud/rush.test.d.ts +2 -0
  209. package/dist/lib/cloud/rush.test.d.ts.map +1 -0
  210. package/dist/lib/cloud/rush.test.js +63 -0
  211. package/dist/lib/cloud/rush.test.js.map +1 -0
  212. package/dist/lib/cloud/store.d.ts +23 -0
  213. package/dist/lib/cloud/store.d.ts.map +1 -0
  214. package/dist/lib/cloud/store.js +116 -0
  215. package/dist/lib/cloud/store.js.map +1 -0
  216. package/dist/lib/cloud/stream.d.ts +24 -0
  217. package/dist/lib/cloud/stream.d.ts.map +1 -0
  218. package/dist/lib/cloud/stream.js +145 -0
  219. package/dist/lib/cloud/stream.js.map +1 -0
  220. package/dist/lib/cloud/types.d.ts +109 -0
  221. package/dist/lib/cloud/types.d.ts.map +1 -0
  222. package/dist/lib/cloud/types.js +33 -0
  223. package/dist/lib/cloud/types.js.map +1 -0
  224. package/dist/lib/cloud/types.test.d.ts +2 -0
  225. package/dist/lib/cloud/types.test.d.ts.map +1 -0
  226. package/dist/lib/cloud/types.test.js +41 -0
  227. package/dist/lib/cloud/types.test.js.map +1 -0
  228. package/dist/lib/commands.d.ts +67 -0
  229. package/dist/lib/commands.d.ts.map +1 -1
  230. package/dist/lib/commands.js +161 -2
  231. package/dist/lib/commands.js.map +1 -1
  232. package/dist/lib/convert.d.ts +10 -0
  233. package/dist/lib/convert.d.ts.map +1 -1
  234. package/dist/lib/convert.js +9 -0
  235. package/dist/lib/convert.js.map +1 -1
  236. package/dist/lib/daemon.d.ts +21 -0
  237. package/dist/lib/daemon.d.ts.map +1 -1
  238. package/dist/lib/daemon.js +21 -0
  239. package/dist/lib/daemon.js.map +1 -1
  240. package/dist/lib/drive-sync.d.ts +18 -0
  241. package/dist/lib/drive-sync.d.ts.map +1 -1
  242. package/dist/lib/drive-sync.js +16 -0
  243. package/dist/lib/drive-sync.js.map +1 -1
  244. package/dist/lib/exec.d.ts +64 -3
  245. package/dist/lib/exec.d.ts.map +1 -1
  246. package/dist/lib/exec.js +218 -80
  247. package/dist/lib/exec.js.map +1 -1
  248. package/dist/lib/factory/__tests__/config.test.d.ts +2 -0
  249. package/dist/lib/factory/__tests__/config.test.d.ts.map +1 -0
  250. package/dist/lib/factory/__tests__/config.test.js +128 -0
  251. package/dist/lib/factory/__tests__/config.test.js.map +1 -0
  252. package/dist/lib/factory/config.d.ts +49 -0
  253. package/dist/lib/factory/config.d.ts.map +1 -0
  254. package/dist/lib/factory/config.js +127 -0
  255. package/dist/lib/factory/config.js.map +1 -0
  256. package/dist/lib/factory.js +1 -1
  257. package/dist/lib/factory.js.map +1 -1
  258. package/dist/lib/git.d.ts +16 -1
  259. package/dist/lib/git.d.ts.map +1 -1
  260. package/dist/lib/git.js +33 -4
  261. package/dist/lib/git.js.map +1 -1
  262. package/dist/lib/help.d.ts +7 -0
  263. package/dist/lib/help.d.ts.map +1 -1
  264. package/dist/lib/help.js +3 -0
  265. package/dist/lib/help.js.map +1 -1
  266. package/dist/lib/hooks.d.ts +59 -3
  267. package/dist/lib/hooks.d.ts.map +1 -1
  268. package/dist/lib/hooks.js +413 -33
  269. package/dist/lib/hooks.js.map +1 -1
  270. package/dist/lib/ledger/__tests__/local.test.d.ts +2 -0
  271. package/dist/lib/ledger/__tests__/local.test.d.ts.map +1 -0
  272. package/dist/lib/ledger/__tests__/local.test.js +177 -0
  273. package/dist/lib/ledger/__tests__/local.test.js.map +1 -0
  274. package/dist/lib/ledger/__tests__/sync.test.d.ts +2 -0
  275. package/dist/lib/ledger/__tests__/sync.test.d.ts.map +1 -0
  276. package/dist/lib/ledger/__tests__/sync.test.js +117 -0
  277. package/dist/lib/ledger/__tests__/sync.test.js.map +1 -0
  278. package/dist/lib/ledger/index.d.ts +18 -0
  279. package/dist/lib/ledger/index.d.ts.map +1 -0
  280. package/dist/lib/ledger/index.js +32 -0
  281. package/dist/lib/ledger/index.js.map +1 -0
  282. package/dist/lib/ledger/local.d.ts +22 -0
  283. package/dist/lib/ledger/local.d.ts.map +1 -0
  284. package/dist/lib/ledger/local.js +333 -0
  285. package/dist/lib/ledger/local.js.map +1 -0
  286. package/dist/lib/ledger/r2.d.ts +41 -0
  287. package/dist/lib/ledger/r2.d.ts.map +1 -0
  288. package/dist/lib/ledger/r2.js +335 -0
  289. package/dist/lib/ledger/r2.js.map +1 -0
  290. package/dist/lib/ledger/sync.d.ts +33 -0
  291. package/dist/lib/ledger/sync.d.ts.map +1 -0
  292. package/dist/lib/ledger/sync.js +106 -0
  293. package/dist/lib/ledger/sync.js.map +1 -0
  294. package/dist/lib/ledger/types.d.ts +100 -0
  295. package/dist/lib/ledger/types.d.ts.map +1 -0
  296. package/dist/lib/ledger/types.js +21 -0
  297. package/dist/lib/ledger/types.js.map +1 -0
  298. package/dist/lib/manifest.d.ts +6 -0
  299. package/dist/lib/manifest.d.ts.map +1 -1
  300. package/dist/lib/manifest.js +12 -0
  301. package/dist/lib/manifest.js.map +1 -1
  302. package/dist/lib/markdown.d.ts.map +1 -1
  303. package/dist/lib/markdown.js +6 -0
  304. package/dist/lib/markdown.js.map +1 -1
  305. package/dist/lib/mcp.d.ts +0 -9
  306. package/dist/lib/mcp.d.ts.map +1 -1
  307. package/dist/lib/mcp.js +0 -20
  308. package/dist/lib/mcp.js.map +1 -1
  309. package/dist/lib/memory-compile.d.ts +65 -0
  310. package/dist/lib/memory-compile.d.ts.map +1 -0
  311. package/dist/lib/memory-compile.js +174 -0
  312. package/dist/lib/memory-compile.js.map +1 -0
  313. package/dist/lib/memory.d.ts +8 -0
  314. package/dist/lib/memory.d.ts.map +1 -1
  315. package/dist/lib/memory.js +8 -0
  316. package/dist/lib/memory.js.map +1 -1
  317. package/dist/lib/models.d.ts +98 -0
  318. package/dist/lib/models.d.ts.map +1 -0
  319. package/dist/lib/models.js +728 -0
  320. package/dist/lib/models.js.map +1 -0
  321. package/dist/lib/permissions.d.ts +24 -1
  322. package/dist/lib/permissions.d.ts.map +1 -1
  323. package/dist/lib/permissions.js +52 -3
  324. package/dist/lib/permissions.js.map +1 -1
  325. package/dist/lib/picker.d.ts +27 -0
  326. package/dist/lib/picker.d.ts.map +1 -0
  327. package/dist/lib/picker.js +110 -0
  328. package/dist/lib/picker.js.map +1 -0
  329. package/dist/lib/plugins.d.ts +22 -0
  330. package/dist/lib/plugins.d.ts.map +1 -1
  331. package/dist/lib/plugins.js +114 -0
  332. package/dist/lib/plugins.js.map +1 -1
  333. package/dist/lib/profiles-keychain.d.ts +11 -0
  334. package/dist/lib/profiles-keychain.d.ts.map +1 -0
  335. package/dist/lib/profiles-keychain.js +14 -0
  336. package/dist/lib/profiles-keychain.js.map +1 -0
  337. package/dist/lib/profiles-presets.d.ts +25 -0
  338. package/dist/lib/profiles-presets.d.ts.map +1 -0
  339. package/dist/lib/profiles-presets.js +104 -0
  340. package/dist/lib/profiles-presets.js.map +1 -0
  341. package/dist/lib/profiles.d.ts +70 -0
  342. package/dist/lib/profiles.d.ts.map +1 -0
  343. package/dist/lib/profiles.js +145 -0
  344. package/dist/lib/profiles.js.map +1 -0
  345. package/dist/lib/pty-client.d.ts +1 -0
  346. package/dist/lib/pty-client.d.ts.map +1 -1
  347. package/dist/lib/pty-client.js.map +1 -1
  348. package/dist/lib/pty-server.d.ts +5 -0
  349. package/dist/lib/pty-server.d.ts.map +1 -1
  350. package/dist/lib/pty-server.js +5 -0
  351. package/dist/lib/pty-server.js.map +1 -1
  352. package/dist/lib/registry.d.ts +17 -0
  353. package/dist/lib/registry.d.ts.map +1 -1
  354. package/dist/lib/registry.js +17 -0
  355. package/dist/lib/registry.js.map +1 -1
  356. package/dist/lib/resources.d.ts +5 -0
  357. package/dist/lib/resources.d.ts.map +1 -1
  358. package/dist/lib/resources.js.map +1 -1
  359. package/dist/lib/rotate.d.ts +58 -0
  360. package/dist/lib/rotate.d.ts.map +1 -0
  361. package/dist/lib/rotate.js +93 -0
  362. package/dist/lib/rotate.js.map +1 -0
  363. package/dist/lib/routines.d.ts +30 -1
  364. package/dist/lib/routines.d.ts.map +1 -1
  365. package/dist/lib/routines.js +31 -4
  366. package/dist/lib/routines.js.map +1 -1
  367. package/dist/lib/runner.d.ts +14 -0
  368. package/dist/lib/runner.d.ts.map +1 -1
  369. package/dist/lib/runner.js +45 -11
  370. package/dist/lib/runner.js.map +1 -1
  371. package/dist/lib/sandbox.d.ts +16 -0
  372. package/dist/lib/sandbox.d.ts.map +1 -1
  373. package/dist/lib/sandbox.js +19 -2
  374. package/dist/lib/sandbox.js.map +1 -1
  375. package/dist/lib/scheduler.d.ts +8 -0
  376. package/dist/lib/scheduler.d.ts.map +1 -1
  377. package/dist/lib/scheduler.js +8 -0
  378. package/dist/lib/scheduler.js.map +1 -1
  379. package/dist/lib/secrets-bundles.d.ts +38 -0
  380. package/dist/lib/secrets-bundles.d.ts.map +1 -0
  381. package/dist/lib/secrets-bundles.js +176 -0
  382. package/dist/lib/secrets-bundles.js.map +1 -0
  383. package/dist/lib/secrets.d.ts +53 -0
  384. package/dist/lib/secrets.d.ts.map +1 -0
  385. package/dist/lib/secrets.js +140 -0
  386. package/dist/lib/secrets.js.map +1 -0
  387. package/dist/lib/session/__tests__/db.test.d.ts +2 -0
  388. package/dist/lib/session/__tests__/db.test.d.ts.map +1 -0
  389. package/dist/lib/session/__tests__/db.test.js +54 -0
  390. package/dist/lib/session/__tests__/db.test.js.map +1 -0
  391. package/dist/lib/session/__tests__/discover.test.js +54 -91
  392. package/dist/lib/session/__tests__/discover.test.js.map +1 -1
  393. package/dist/lib/session/__tests__/prompt.test.d.ts +2 -0
  394. package/dist/lib/session/__tests__/prompt.test.d.ts.map +1 -0
  395. package/dist/lib/session/__tests__/prompt.test.js +44 -0
  396. package/dist/lib/session/__tests__/prompt.test.js.map +1 -0
  397. package/dist/lib/session/__tests__/render.test.d.ts +2 -0
  398. package/dist/lib/session/__tests__/render.test.d.ts.map +1 -0
  399. package/dist/lib/session/__tests__/render.test.js +602 -0
  400. package/dist/lib/session/__tests__/render.test.js.map +1 -0
  401. package/dist/lib/session/artifacts.d.ts +15 -0
  402. package/dist/lib/session/artifacts.d.ts.map +1 -0
  403. package/dist/lib/session/artifacts.js +86 -0
  404. package/dist/lib/session/artifacts.js.map +1 -0
  405. package/dist/lib/session/db.d.ts +140 -0
  406. package/dist/lib/session/db.d.ts.map +1 -0
  407. package/dist/lib/session/db.js +599 -0
  408. package/dist/lib/session/db.js.map +1 -0
  409. package/dist/lib/session/discover.d.ts +44 -32
  410. package/dist/lib/session/discover.d.ts.map +1 -1
  411. package/dist/lib/session/discover.js +418 -464
  412. package/dist/lib/session/discover.js.map +1 -1
  413. package/dist/lib/session/parse.d.ts +11 -0
  414. package/dist/lib/session/parse.d.ts.map +1 -1
  415. package/dist/lib/session/parse.js +50 -0
  416. package/dist/lib/session/parse.js.map +1 -1
  417. package/dist/lib/session/prompt.d.ts +10 -0
  418. package/dist/lib/session/prompt.d.ts.map +1 -1
  419. package/dist/lib/session/prompt.js +38 -2
  420. package/dist/lib/session/prompt.js.map +1 -1
  421. package/dist/lib/session/prompt.test.d.ts +2 -0
  422. package/dist/lib/session/prompt.test.d.ts.map +1 -0
  423. package/dist/lib/session/prompt.test.js +57 -0
  424. package/dist/lib/session/prompt.test.js.map +1 -0
  425. package/dist/lib/session/render.d.ts +91 -10
  426. package/dist/lib/session/render.d.ts.map +1 -1
  427. package/dist/lib/session/render.js +708 -180
  428. package/dist/lib/session/render.js.map +1 -1
  429. package/dist/lib/session/team-filter.d.ts +35 -0
  430. package/dist/lib/session/team-filter.d.ts.map +1 -0
  431. package/dist/lib/session/team-filter.js +75 -0
  432. package/dist/lib/session/team-filter.js.map +1 -0
  433. package/dist/lib/session/team-filter.test.d.ts +2 -0
  434. package/dist/lib/session/team-filter.test.d.ts.map +1 -0
  435. package/dist/lib/session/team-filter.test.js +157 -0
  436. package/dist/lib/session/team-filter.test.js.map +1 -0
  437. package/dist/lib/session/types.d.ts +48 -6
  438. package/dist/lib/session/types.d.ts.map +1 -1
  439. package/dist/lib/session/types.js +9 -0
  440. package/dist/lib/session/types.js.map +1 -1
  441. package/dist/lib/shims.d.ts +101 -2
  442. package/dist/lib/shims.d.ts.map +1 -1
  443. package/dist/lib/shims.js +282 -25
  444. package/dist/lib/shims.js.map +1 -1
  445. package/dist/lib/skills.d.ts +68 -0
  446. package/dist/lib/skills.d.ts.map +1 -1
  447. package/dist/lib/skills.js +267 -1
  448. package/dist/lib/skills.js.map +1 -1
  449. package/dist/lib/state.d.ts +41 -2
  450. package/dist/lib/state.d.ts.map +1 -1
  451. package/dist/lib/state.js +63 -4
  452. package/dist/lib/state.js.map +1 -1
  453. package/dist/lib/subagents.d.ts +9 -0
  454. package/dist/lib/subagents.d.ts.map +1 -1
  455. package/dist/lib/subagents.js +9 -1
  456. package/dist/lib/subagents.js.map +1 -1
  457. package/dist/lib/teams/__tests__/oracle.test.d.ts +2 -0
  458. package/dist/lib/teams/__tests__/oracle.test.d.ts.map +1 -0
  459. package/dist/lib/teams/__tests__/oracle.test.js +89 -0
  460. package/dist/lib/teams/__tests__/oracle.test.js.map +1 -0
  461. package/dist/lib/teams/__tests__/supervisor.test.d.ts +2 -0
  462. package/dist/lib/teams/__tests__/supervisor.test.d.ts.map +1 -0
  463. package/dist/lib/teams/__tests__/supervisor.test.js +179 -0
  464. package/dist/lib/teams/__tests__/supervisor.test.js.map +1 -0
  465. package/dist/lib/teams/agents.d.ts +247 -0
  466. package/dist/lib/teams/agents.d.ts.map +1 -0
  467. package/dist/lib/teams/agents.js +1244 -0
  468. package/dist/lib/teams/agents.js.map +1 -0
  469. package/dist/lib/teams/api.d.ts +91 -0
  470. package/dist/lib/teams/api.d.ts.map +1 -0
  471. package/dist/lib/teams/api.js +239 -0
  472. package/dist/lib/teams/api.js.map +1 -0
  473. package/dist/lib/teams/cloud.d.ts +11 -0
  474. package/dist/lib/teams/cloud.d.ts.map +1 -0
  475. package/dist/lib/teams/cloud.js +169 -0
  476. package/dist/lib/teams/cloud.js.map +1 -0
  477. package/dist/lib/teams/debug.d.ts +8 -0
  478. package/dist/lib/teams/debug.d.ts.map +1 -0
  479. package/dist/lib/teams/debug.js +12 -0
  480. package/dist/lib/teams/debug.js.map +1 -0
  481. package/dist/lib/teams/file_ops.d.ts +13 -0
  482. package/dist/lib/teams/file_ops.d.ts.map +1 -0
  483. package/dist/lib/teams/file_ops.js +66 -0
  484. package/dist/lib/teams/file_ops.js.map +1 -0
  485. package/dist/lib/teams/index.d.ts +16 -0
  486. package/dist/lib/teams/index.d.ts.map +1 -0
  487. package/dist/lib/teams/index.js +15 -0
  488. package/dist/lib/teams/index.js.map +1 -0
  489. package/dist/lib/teams/oracle.d.ts +20 -0
  490. package/dist/lib/teams/oracle.d.ts.map +1 -0
  491. package/dist/lib/teams/oracle.js +59 -0
  492. package/dist/lib/teams/oracle.js.map +1 -0
  493. package/dist/lib/teams/parsers.d.ts +9 -0
  494. package/dist/lib/teams/parsers.d.ts.map +1 -0
  495. package/dist/lib/teams/parsers.js +837 -0
  496. package/dist/lib/teams/parsers.js.map +1 -0
  497. package/dist/lib/teams/persistence.d.ts +43 -0
  498. package/dist/lib/teams/persistence.d.ts.map +1 -0
  499. package/dist/lib/teams/persistence.js +299 -0
  500. package/dist/lib/teams/persistence.js.map +1 -0
  501. package/dist/lib/teams/ralph.d.ts +8 -0
  502. package/dist/lib/teams/ralph.d.ts.map +1 -0
  503. package/dist/lib/teams/ralph.js +59 -0
  504. package/dist/lib/teams/ralph.js.map +1 -0
  505. package/dist/lib/teams/registry.d.ts +18 -0
  506. package/dist/lib/teams/registry.d.ts.map +1 -0
  507. package/dist/lib/teams/registry.js +68 -0
  508. package/dist/lib/teams/registry.js.map +1 -0
  509. package/dist/lib/teams/summarizer.d.ts +73 -0
  510. package/dist/lib/teams/summarizer.d.ts.map +1 -0
  511. package/dist/lib/teams/summarizer.js +780 -0
  512. package/dist/lib/teams/summarizer.js.map +1 -0
  513. package/dist/lib/teams/supervisor.d.ts +49 -0
  514. package/dist/lib/teams/supervisor.d.ts.map +1 -0
  515. package/dist/lib/teams/supervisor.js +74 -0
  516. package/dist/lib/teams/supervisor.js.map +1 -0
  517. package/dist/lib/template.d.ts +8 -5
  518. package/dist/lib/template.d.ts.map +1 -1
  519. package/dist/lib/template.js +8 -5
  520. package/dist/lib/template.js.map +1 -1
  521. package/dist/lib/types.d.ts +58 -1
  522. package/dist/lib/types.d.ts.map +1 -1
  523. package/dist/lib/types.js +16 -1
  524. package/dist/lib/types.js.map +1 -1
  525. package/dist/lib/usage.d.ts +48 -0
  526. package/dist/lib/usage.d.ts.map +1 -1
  527. package/dist/lib/usage.js +106 -14
  528. package/dist/lib/usage.js.map +1 -1
  529. package/dist/lib/versions.d.ts +12 -1
  530. package/dist/lib/versions.d.ts.map +1 -1
  531. package/dist/lib/versions.js +124 -41
  532. package/dist/lib/versions.js.map +1 -1
  533. package/package.json +20 -6
  534. package/scripts/postinstall.js +1 -1
  535. package/scripts/rebuild-sqlite.sh +46 -0
  536. package/dist/commands/sessions.test.d.ts +0 -2
  537. package/dist/commands/sessions.test.d.ts.map +0 -1
  538. package/dist/commands/sessions.test.js +0 -53
  539. package/dist/commands/sessions.test.js.map +0 -1
@@ -26,7 +26,7 @@ export declare function promptConflictStrategy(conflictInfos: ConflictInfo[]): P
26
26
  * Generate the shim script content for an agent.
27
27
  *
28
28
  * The shim resolves the version in order:
29
- * 1. .agents-version in cwd (walk up to root)
29
+ * 1. agents.yaml in project root (walk up from $PWD, skip ~/.agents/agents.yaml)
30
30
  * 2. ~/.agents/agents.yaml default
31
31
  *
32
32
  * If version is specified but not installed, auto-installs it.
@@ -34,6 +34,27 @@ export declare function promptConflictStrategy(conflictInfos: ConflictInfo[]): P
34
34
  * Config isolation is handled via symlinks:
35
35
  * ~/.{agent} -> ~/.agents/versions/{agent}/{version}/home/.{agent}/
36
36
  */
37
+ /**
38
+ * Current shim schema version. Bump whenever `generateShimScript` changes
39
+ * in a way that requires existing on-disk shims to be regenerated (new
40
+ * flags, fixed argument parsing, new hooks, etc.). `isShimCurrent` reads
41
+ * this marker out of existing shims to decide whether to regenerate.
42
+ *
43
+ * History:
44
+ * v1 — initial shim (implicit, no marker).
45
+ * v2 — `--version=...` form in sync/refresh-memory calls; refresh-memory
46
+ * shim hook for non-@-capable agents.
47
+ * v3 — sync/refresh-memory flag renamed `--version` → `--agent-version`
48
+ * so it no longer collides with commander's top-level `--version`.
49
+ * v4 — project version marker changed from `.agents-version` to a
50
+ * root-level `agents.yaml`; shim now skips ~/.agents/agents.yaml
51
+ * when walking up for a project marker.
52
+ */
53
+ export declare const SHIM_SCHEMA_VERSION = 4;
54
+ /**
55
+ * Generate the full bash shim script for the given agent. The returned string
56
+ * is written to ~/.agents/shims/{cliCommand} and made executable.
57
+ */
37
58
  export declare function generateShimScript(agent: AgentId): string;
38
59
  /**
39
60
  * Create a shim for an agent.
@@ -43,11 +64,43 @@ export declare function createShim(agent: AgentId): string;
43
64
  * Remove the shim for an agent.
44
65
  */
45
66
  export declare function removeShim(agent: AgentId): boolean;
67
+ /**
68
+ * Current versioned-alias schema. Bump whenever `generateVersionedAliasScript`
69
+ * changes in a way that requires existing on-disk aliases to be regenerated.
70
+ *
71
+ * History:
72
+ * v1 — implicit (no marker); no CLAUDE_CONFIG_DIR export, so direct
73
+ * `claude@X` invocations leaked into ~/.claude (the default version's
74
+ * symlinked home) and `agents view` never saw the login.
75
+ * v2 — emit CLAUDE_CONFIG_DIR for claude aliases so each version has its
76
+ * own isolated config/OAuth slot; stamp a version marker so stale
77
+ * aliases can be detected and regenerated.
78
+ */
79
+ export declare const VERSIONED_ALIAS_SCHEMA_VERSION = 2;
46
80
  /**
47
81
  * Generate a versioned alias script that directly execs a specific version.
48
82
  * e.g., claude@2.0.65 -> directly runs that version's binary
49
83
  */
50
84
  export declare function generateVersionedAliasScript(agent: AgentId, version: string): string;
85
+ /**
86
+ * Read the schema version of an on-disk versioned alias. Returns null if the
87
+ * alias doesn't exist or is a pre-v2 alias (no marker — treated as stale).
88
+ */
89
+ export declare function readVersionedAliasSchemaVersion(agent: AgentId, version: string): number | null;
90
+ /**
91
+ * True if the on-disk versioned alias matches the current schema version.
92
+ */
93
+ export declare function isVersionedAliasCurrent(agent: AgentId, version: string): boolean;
94
+ /**
95
+ * Regenerate a versioned alias if missing or stale. Mirrors ensureShimCurrent
96
+ * for the main shim — callers can surface a one-line notice when something
97
+ * was upgraded.
98
+ */
99
+ export declare function ensureVersionedAliasCurrent(agent: AgentId, version: string): 'created' | 'updated' | 'current';
100
+ /**
101
+ * Get the filesystem path for a versioned alias script.
102
+ */
103
+ export declare function getVersionedAliasPath(agent: AgentId, version: string): string;
51
104
  /**
52
105
  * Create a versioned alias for a specific agent version.
53
106
  * e.g., claude@2.0.65
@@ -98,6 +151,34 @@ export declare function switchHomeFileSymlinks(agent: AgentId, version: string):
98
151
  switched: string[];
99
152
  errors: string[];
100
153
  };
154
+ /**
155
+ * Claude reads `.claude.json` at `$CLAUDE_CONFIG_DIR/.claude.json`. Our shim
156
+ * points CLAUDE_CONFIG_DIR at `<ver>/home/.claude`, so Claude's real config
157
+ * file lives at `<ver>/home/.claude/.claude.json` (INSIDE), while
158
+ * `switchHomeFileSymlinks` manages `<ver>/home/.claude.json` (OUTSIDE).
159
+ *
160
+ * To keep both views consistent we make INSIDE a symlink to OUTSIDE. Claude's
161
+ * atomic write (`Uf6`) resolves symlinks before the tmp+rename cycle, so the
162
+ * symlink survives across writes and OUTSIDE remains the single source of
163
+ * truth that agents-cli's home-file machinery already manages.
164
+ *
165
+ * This function idempotently reconciles one version:
166
+ * - INSIDE missing: create symlink -> `../.claude.json` (create OUTSIDE if needed).
167
+ * - INSIDE already symlink to OUTSIDE: no-op.
168
+ * - INSIDE is a real file: it's the authoritative auth state (Claude was
169
+ * writing to it). Move its content to OUTSIDE (merging with OUTSIDE,
170
+ * INSIDE wins for `oauthAccount`), then replace INSIDE with the symlink.
171
+ * - Symlink points elsewhere: replace it.
172
+ */
173
+ export declare function ensureClaudeInsideSymlink(version: string): void;
174
+ /**
175
+ * Apply `ensureClaudeInsideSymlink` to every installed Claude version.
176
+ * Safe to call repeatedly; per-version calls are idempotent.
177
+ */
178
+ export declare function ensureAllClaudeInsideSymlinks(): {
179
+ migrated: string[];
180
+ errors: string[];
181
+ };
101
182
  /**
102
183
  * Get the current config symlink target version, if any.
103
184
  */
@@ -106,6 +187,23 @@ export declare function getConfigSymlinkVersion(agent: AgentId): string | null;
106
187
  * Check if shim exists for an agent.
107
188
  */
108
189
  export declare function shimExists(agent: AgentId): boolean;
190
+ /**
191
+ * Read the schema version embedded in an existing on-disk shim. Returns
192
+ * `null` if the shim doesn't exist or has no version marker (pre-v2 shim).
193
+ */
194
+ export declare function readShimSchemaVersion(agent: AgentId): number | null;
195
+ /**
196
+ * True if the on-disk shim's schema version matches `SHIM_SCHEMA_VERSION`.
197
+ * False means either the shim is missing, is pre-v2 (no marker), or is an
198
+ * older version that needs regeneration.
199
+ */
200
+ export declare function isShimCurrent(agent: AgentId): boolean;
201
+ /**
202
+ * Regenerate the shim if it's missing or outdated. Returns a status describing
203
+ * what happened — callers can surface a one-line notice to the user ("Updated
204
+ * shim for codex") when appropriate.
205
+ */
206
+ export declare function ensureShimCurrent(agent: AgentId): 'created' | 'updated' | 'current';
109
207
  /**
110
208
  * Get the path to the shim for an agent.
111
209
  */
@@ -138,7 +236,8 @@ export declare function addShimsToPath(): {
138
236
  */
139
237
  export declare function ensureAllShims(): void;
140
238
  /**
141
- * Resource diff between two versions.
239
+ * Resource diff between two versions. Each field lists resources present in
240
+ * the current version but missing from the target.
142
241
  */
143
242
  export interface ResourceDiff {
144
243
  commands: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"shims.d.ts","sourceRoot":"","sources":["../../src/lib/shims.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shims.d.ts","sourceRoot":"","sources":["../../src/lib/shims.ts"],"names":[],"mappings":"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"}
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.
@@ -138,6 +148,29 @@ export async function promptConflictStrategy(conflictInfos) {
138
148
  * Config isolation is handled via symlinks:
139
149
  * ~/.{agent} -> ~/.agents/versions/{agent}/{version}/home/.{agent}/
140
150
  */
151
+ /**
152
+ * Current shim schema version. Bump whenever `generateShimScript` changes
153
+ * in a way that requires existing on-disk shims to be regenerated (new
154
+ * flags, fixed argument parsing, new hooks, etc.). `isShimCurrent` reads
155
+ * this marker out of existing shims to decide whether to regenerate.
156
+ *
157
+ * History:
158
+ * v1 — initial shim (implicit, no marker).
159
+ * v2 — `--version=...` form in sync/refresh-memory calls; refresh-memory
160
+ * shim hook for non-@-capable agents.
161
+ * v3 — sync/refresh-memory flag renamed `--version` → `--agent-version`
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
+ */
167
+ export const SHIM_SCHEMA_VERSION = 4;
168
+ /** Internal marker string used to embed the schema version in shim scripts. */
169
+ const SHIM_VERSION_MARKER = 'agents-shim-version:';
170
+ /**
171
+ * Generate the full bash shim script for the given agent. The returned string
172
+ * is written to ~/.agents/shims/{cliCommand} and made executable.
173
+ */
141
174
  export function generateShimScript(agent) {
142
175
  const agentConfig = AGENTS[agent];
143
176
  const cliCommand = agentConfig.cliCommand;
@@ -148,40 +181,43 @@ export function generateShimScript(agent) {
148
181
  # selected version's config directory so switching versions also switches the
149
182
  # live Claude account.
150
183
  export CLAUDE_CONFIG_DIR="$VERSION_DIR/home/${configDirName}"
184
+ `
185
+ : '';
186
+ // Agents that don't natively resolve @-imports in their memory file need
187
+ // agents-cli to recompile when the user edits a rule/preset file. The
188
+ // check is fast (sha256 of ~8 small files) and skips the recompile when
189
+ // sources haven't changed.
190
+ const refreshMemoryCall = !agentConfig.capabilities.memoryImports
191
+ ? `
192
+ # Recompile memory if any rule/preset source has changed since last sync.
193
+ # Fast-path check (~10-20ms) when nothing changed; full recompile only on
194
+ # actual diff. Non-blocking failure — if the refresh errors, we still launch.
195
+ agents refresh-memory --agent "$AGENT" --agent-version "$VERSION" --quiet 2>/dev/null || true
151
196
  `
152
197
  : '';
153
198
  return `#!/bin/bash
154
199
  # Auto-generated by agents-cli - do not edit
155
200
  # Shim for ${agentConfig.name}
201
+ # ${SHIM_VERSION_MARKER} ${SHIM_SCHEMA_VERSION}
156
202
 
157
203
  AGENTS_DIR="$HOME/.agents"
158
204
  AGENT="${agent}"
159
205
  CLI_COMMAND="${cliCommand}"
160
206
 
161
- # Find .agents-version walking up from cwd
207
+ # Find project agents.yaml walking up from cwd (skip ~/.agents/agents.yaml)
162
208
  find_project_version() {
163
209
  local dir="$PWD"
210
+ local user_agents_yaml="$HOME/.agents/agents.yaml"
164
211
  while [ "$dir" != "/" ]; do
165
- if [ -f "$dir/.agents-version" ]; then
166
- # Parse YAML - handle both "agent: version" and "agent:\\n - version"
212
+ local candidate="$dir/agents.yaml"
213
+ if [ -f "$candidate" ] && [ "$candidate" != "$user_agents_yaml" ]; then
214
+ # Parse agents: section — same shape as resolve_default_version()
167
215
  local version
168
216
  version=$(awk -v agent="$AGENT" '
169
- $0 ~ "^" agent ":" {
170
- # Check if value is on same line
171
- if (match($0, /:[[:space:]]+[0-9]/)) {
172
- gsub(/.*:[[:space:]]*["'"'"']?|["'"'"']?[[:space:]]*$/, "")
173
- print
174
- exit
175
- }
176
- # Value might be on next line (array format)
177
- getline
178
- if (/^[[:space:]]+-[[:space:]]/) {
179
- gsub(/^[[:space:]]+-[[:space:]]*["'"'"']?|["'"'"']?[[:space:]]*$/, "")
180
- print
181
- exit
182
- }
183
- }
184
- ' "$dir/.agents-version")
217
+ /^agents:/ { in_agents=1; next }
218
+ in_agents && /^[^ ]/ { in_agents=0 }
219
+ in_agents && $0 ~ "^ " agent ":" { gsub(/.*:[[:space:]]*["'"'"']?|["'"'"']?[[:space:]]*$/, ""); print; exit }
220
+ ' "$candidate")
185
221
  if [ -n "$version" ]; then
186
222
  echo "$version"
187
223
  return 0
@@ -204,7 +240,7 @@ resolve_default_version() {
204
240
  fi
205
241
  }
206
242
 
207
- # Find project-scoped .agents directory (stop at .git or .agents-version)
243
+ # Find project-scoped .agents directory (stop at agents.yaml or .git)
208
244
  find_project_agents_dir() {
209
245
  local dir="$PWD"
210
246
  while [ "$dir" != "/" ]; do
@@ -212,7 +248,7 @@ find_project_agents_dir() {
212
248
  echo "$dir/.agents"
213
249
  return 0
214
250
  fi
215
- if [ -f "$dir/.agents-version" ] || [ -d "$dir/.git" ] || [ -f "$dir/.git" ]; then
251
+ if [ -f "$dir/agents.yaml" ] || [ -d "$dir/.git" ] || [ -f "$dir/.git" ]; then
216
252
  break
217
253
  fi
218
254
  dir=$(dirname "$dir")
@@ -240,7 +276,7 @@ BINARY="$VERSION_DIR/node_modules/.bin/$CLI_COMMAND"
240
276
  # Auto-install if not present
241
277
  if [ ! -x "$BINARY" ]; then
242
278
  if [ "$VERSION_SOURCE" = "project" ]; then
243
- echo "agents: $AGENT@$VERSION required by .agents-version but not installed" >&2
279
+ echo "agents: $AGENT@$VERSION required by agents.yaml but not installed" >&2
244
280
 
245
281
  # Spinner animation
246
282
  spin() {
@@ -277,9 +313,9 @@ fi
277
313
  # Sync project-scoped resources into version home if a project .agents/ is present
278
314
  PROJECT_AGENTS_DIR=$(find_project_agents_dir)
279
315
  if [ -n "$PROJECT_AGENTS_DIR" ]; then
280
- agents sync --agent "$AGENT" --version "$VERSION" --project-dir "$PROJECT_AGENTS_DIR" --quiet >/dev/null 2>&1
316
+ agents sync --agent "$AGENT" --agent-version "$VERSION" --project-dir "$PROJECT_AGENTS_DIR" --quiet >/dev/null 2>&1
281
317
  fi
282
- ${managedEnv}
318
+ ${refreshMemoryCall}${managedEnv}
283
319
 
284
320
  exec "$BINARY" "$@"
285
321
  `;
@@ -309,6 +345,21 @@ export function removeShim(agent) {
309
345
  }
310
346
  return false;
311
347
  }
348
+ /**
349
+ * Current versioned-alias schema. Bump whenever `generateVersionedAliasScript`
350
+ * changes in a way that requires existing on-disk aliases to be regenerated.
351
+ *
352
+ * History:
353
+ * v1 — implicit (no marker); no CLAUDE_CONFIG_DIR export, so direct
354
+ * `claude@X` invocations leaked into ~/.claude (the default version's
355
+ * symlinked home) and `agents view` never saw the login.
356
+ * v2 — emit CLAUDE_CONFIG_DIR for claude aliases so each version has its
357
+ * own isolated config/OAuth slot; stamp a version marker so stale
358
+ * aliases can be detected and regenerated.
359
+ */
360
+ export const VERSIONED_ALIAS_SCHEMA_VERSION = 2;
361
+ /** Internal marker string used to embed the schema version in versioned alias scripts. */
362
+ const VERSIONED_ALIAS_VERSION_MARKER = 'agents-versioned-alias-version:';
312
363
  /**
313
364
  * Generate a versioned alias script that directly execs a specific version.
314
365
  * e.g., claude@2.0.65 -> directly runs that version's binary
@@ -325,6 +376,7 @@ export CLAUDE_CONFIG_DIR="$HOME/.agents/versions/${agent}/${version}/home/${conf
325
376
  : '';
326
377
  return `#!/bin/bash
327
378
  # Auto-generated by agents-cli - do not edit
379
+ # ${VERSIONED_ALIAS_VERSION_MARKER} ${VERSIONED_ALIAS_SCHEMA_VERSION}
328
380
  # Direct alias for ${agentConfig.name}@${version}
329
381
 
330
382
  BINARY="$HOME/.agents/versions/${agent}/${version}/node_modules/.bin/${agentConfig.cliCommand}"
@@ -338,6 +390,55 @@ ${managedEnv}
338
390
  exec "$BINARY" "$@"
339
391
  `;
340
392
  }
393
+ /**
394
+ * Read the schema version of an on-disk versioned alias. Returns null if the
395
+ * alias doesn't exist or is a pre-v2 alias (no marker — treated as stale).
396
+ */
397
+ export function readVersionedAliasSchemaVersion(agent, version) {
398
+ const aliasPath = getVersionedAliasPath(agent, version);
399
+ if (!fs.existsSync(aliasPath))
400
+ return null;
401
+ try {
402
+ const content = fs.readFileSync(aliasPath, 'utf8');
403
+ const header = content.split('\n', 10).join('\n');
404
+ const match = header.match(new RegExp(VERSIONED_ALIAS_VERSION_MARKER + '\\s*(\\d+)'));
405
+ if (!match)
406
+ return null;
407
+ return Number(match[1]);
408
+ }
409
+ catch {
410
+ return null;
411
+ }
412
+ }
413
+ /**
414
+ * True if the on-disk versioned alias matches the current schema version.
415
+ */
416
+ export function isVersionedAliasCurrent(agent, version) {
417
+ return readVersionedAliasSchemaVersion(agent, version) === VERSIONED_ALIAS_SCHEMA_VERSION;
418
+ }
419
+ /**
420
+ * Regenerate a versioned alias if missing or stale. Mirrors ensureShimCurrent
421
+ * for the main shim — callers can surface a one-line notice when something
422
+ * was upgraded.
423
+ */
424
+ export function ensureVersionedAliasCurrent(agent, version) {
425
+ const aliasPath = getVersionedAliasPath(agent, version);
426
+ if (!fs.existsSync(aliasPath)) {
427
+ createVersionedAlias(agent, version);
428
+ return 'created';
429
+ }
430
+ if (!isVersionedAliasCurrent(agent, version)) {
431
+ createVersionedAlias(agent, version);
432
+ return 'updated';
433
+ }
434
+ return 'current';
435
+ }
436
+ /**
437
+ * Get the filesystem path for a versioned alias script.
438
+ */
439
+ export function getVersionedAliasPath(agent, version) {
440
+ return path.join(getShimsDir(), `${AGENTS[agent].cliCommand}@${version}`);
441
+ }
341
442
  /**
342
443
  * Create a versioned alias for a specific agent version.
343
444
  * e.g., claude@2.0.65
@@ -507,6 +608,15 @@ export function switchHomeFileSymlinks(agent, version) {
507
608
  const versionsDir = getVersionsDir();
508
609
  const switched = [];
509
610
  const errors = [];
611
+ // For Claude, Claude's binary reads CLAUDE_CONFIG_DIR/.claude.json (INSIDE
612
+ // the per-version .claude dir) — not the home-level file this function
613
+ // manages. Reconcile all installed Claude versions so INSIDE is a symlink
614
+ // to OUTSIDE, making OUTSIDE the single source of truth.
615
+ if (agent === 'claude') {
616
+ const reconcile = ensureAllClaudeInsideSymlinks();
617
+ for (const e of reconcile.errors)
618
+ errors.push(e);
619
+ }
510
620
  for (const fileName of homeFiles) {
511
621
  const globalPath = path.join(home, fileName);
512
622
  const versionFilePath = path.join(versionsDir, agent, version, 'home', fileName);
@@ -595,6 +705,108 @@ export function switchHomeFileSymlinks(agent, version) {
595
705
  }
596
706
  return { switched, errors };
597
707
  }
708
+ /**
709
+ * Claude reads `.claude.json` at `$CLAUDE_CONFIG_DIR/.claude.json`. Our shim
710
+ * points CLAUDE_CONFIG_DIR at `<ver>/home/.claude`, so Claude's real config
711
+ * file lives at `<ver>/home/.claude/.claude.json` (INSIDE), while
712
+ * `switchHomeFileSymlinks` manages `<ver>/home/.claude.json` (OUTSIDE).
713
+ *
714
+ * To keep both views consistent we make INSIDE a symlink to OUTSIDE. Claude's
715
+ * atomic write (`Uf6`) resolves symlinks before the tmp+rename cycle, so the
716
+ * symlink survives across writes and OUTSIDE remains the single source of
717
+ * truth that agents-cli's home-file machinery already manages.
718
+ *
719
+ * This function idempotently reconciles one version:
720
+ * - INSIDE missing: create symlink -> `../.claude.json` (create OUTSIDE if needed).
721
+ * - INSIDE already symlink to OUTSIDE: no-op.
722
+ * - INSIDE is a real file: it's the authoritative auth state (Claude was
723
+ * writing to it). Move its content to OUTSIDE (merging with OUTSIDE,
724
+ * INSIDE wins for `oauthAccount`), then replace INSIDE with the symlink.
725
+ * - Symlink points elsewhere: replace it.
726
+ */
727
+ export function ensureClaudeInsideSymlink(version) {
728
+ const versionsDir = getVersionsDir();
729
+ const versionHome = path.join(versionsDir, 'claude', version, 'home');
730
+ const outsidePath = path.join(versionHome, '.claude.json');
731
+ const insideDir = path.join(versionHome, '.claude');
732
+ const insidePath = path.join(insideDir, '.claude.json');
733
+ const linkTarget = '../.claude.json'; // relative so version dir can be moved
734
+ if (!fs.existsSync(insideDir)) {
735
+ fs.mkdirSync(insideDir, { recursive: true });
736
+ }
737
+ let insideStat = null;
738
+ try {
739
+ insideStat = fs.lstatSync(insidePath);
740
+ }
741
+ catch {
742
+ /* INSIDE does not exist */
743
+ }
744
+ if (insideStat?.isSymbolicLink()) {
745
+ const currentTarget = fs.readlinkSync(insidePath);
746
+ if (currentTarget === linkTarget)
747
+ return;
748
+ // Wrong target — replace.
749
+ if (!fs.existsSync(outsidePath))
750
+ fs.writeFileSync(outsidePath, '{}');
751
+ fs.unlinkSync(insidePath);
752
+ fs.symlinkSync(linkTarget, insidePath);
753
+ return;
754
+ }
755
+ if (insideStat?.isFile()) {
756
+ // INSIDE is the authoritative file — Claude has been reading/writing it.
757
+ // Merge INSIDE into OUTSIDE, with INSIDE winning on every field, then
758
+ // replace INSIDE with a symlink.
759
+ let insideContent = {};
760
+ try {
761
+ insideContent = JSON.parse(fs.readFileSync(insidePath, 'utf-8'));
762
+ }
763
+ catch {
764
+ /* INSIDE corrupt — treat as empty; OUTSIDE preserved as-is */
765
+ }
766
+ let outsideContent = {};
767
+ if (fs.existsSync(outsidePath)) {
768
+ try {
769
+ outsideContent = JSON.parse(fs.readFileSync(outsidePath, 'utf-8'));
770
+ }
771
+ catch {
772
+ /* OUTSIDE corrupt — drop it */
773
+ }
774
+ }
775
+ const merged = { ...outsideContent, ...insideContent };
776
+ fs.writeFileSync(outsidePath, JSON.stringify(merged, null, 2));
777
+ fs.unlinkSync(insidePath);
778
+ fs.symlinkSync(linkTarget, insidePath);
779
+ return;
780
+ }
781
+ // INSIDE missing — ensure OUTSIDE exists, then create symlink.
782
+ if (!fs.existsSync(outsidePath))
783
+ fs.writeFileSync(outsidePath, '{}');
784
+ fs.symlinkSync(linkTarget, insidePath);
785
+ }
786
+ /**
787
+ * Apply `ensureClaudeInsideSymlink` to every installed Claude version.
788
+ * Safe to call repeatedly; per-version calls are idempotent.
789
+ */
790
+ export function ensureAllClaudeInsideSymlinks() {
791
+ const versionsDir = getVersionsDir();
792
+ const claudeVersionsDir = path.join(versionsDir, 'claude');
793
+ const migrated = [];
794
+ const errors = [];
795
+ if (!fs.existsSync(claudeVersionsDir))
796
+ return { migrated, errors };
797
+ for (const entry of fs.readdirSync(claudeVersionsDir, { withFileTypes: true })) {
798
+ if (!entry.isDirectory())
799
+ continue;
800
+ try {
801
+ ensureClaudeInsideSymlink(entry.name);
802
+ migrated.push(entry.name);
803
+ }
804
+ catch (err) {
805
+ errors.push(`${entry.name}: ${err.message}`);
806
+ }
807
+ }
808
+ return { migrated, errors };
809
+ }
598
810
  /**
599
811
  * Get the current config symlink target version, if any.
600
812
  */
@@ -709,6 +921,51 @@ export function shimExists(agent) {
709
921
  const shimPath = path.join(shimsDir, agentConfig.cliCommand);
710
922
  return fs.existsSync(shimPath);
711
923
  }
924
+ /**
925
+ * Read the schema version embedded in an existing on-disk shim. Returns
926
+ * `null` if the shim doesn't exist or has no version marker (pre-v2 shim).
927
+ */
928
+ export function readShimSchemaVersion(agent) {
929
+ if (!shimExists(agent))
930
+ return null;
931
+ try {
932
+ const content = fs.readFileSync(getShimPath(agent), 'utf8');
933
+ // Look at the first ~10 lines only — the marker lives in the header.
934
+ const header = content.split('\n', 10).join('\n');
935
+ const match = header.match(new RegExp(SHIM_VERSION_MARKER + '\\s*(\\d+)'));
936
+ if (!match)
937
+ return null;
938
+ return Number(match[1]);
939
+ }
940
+ catch {
941
+ return null;
942
+ }
943
+ }
944
+ /**
945
+ * True if the on-disk shim's schema version matches `SHIM_SCHEMA_VERSION`.
946
+ * False means either the shim is missing, is pre-v2 (no marker), or is an
947
+ * older version that needs regeneration.
948
+ */
949
+ export function isShimCurrent(agent) {
950
+ const version = readShimSchemaVersion(agent);
951
+ return version === SHIM_SCHEMA_VERSION;
952
+ }
953
+ /**
954
+ * Regenerate the shim if it's missing or outdated. Returns a status describing
955
+ * what happened — callers can surface a one-line notice to the user ("Updated
956
+ * shim for codex") when appropriate.
957
+ */
958
+ export function ensureShimCurrent(agent) {
959
+ if (!shimExists(agent)) {
960
+ createShim(agent);
961
+ return 'created';
962
+ }
963
+ if (!isShimCurrent(agent)) {
964
+ createShim(agent);
965
+ return 'updated';
966
+ }
967
+ return 'current';
968
+ }
712
969
  /**
713
970
  * Get the path to the shim for an agent.
714
971
  */