@phnx-labs/agents-cli 0.1.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 (554) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +283 -372
  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 +8 -1
  8. package/dist/commands/cloud.js +108 -22
  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 +96 -27
  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 +16 -4
  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 +9 -1
  38. package/dist/commands/profiles.js +56 -7
  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 +58 -128
  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 +8 -1
  56. package/dist/commands/secrets.js +235 -63
  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 +188 -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 +317 -24
  83. package/dist/index.d.ts +7 -2
  84. package/dist/index.js +172 -34
  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 +197 -21
  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 +9 -3
  104. package/dist/lib/cloud/codex.js +53 -13
  105. package/dist/lib/cloud/factory.d.ts +8 -3
  106. package/dist/lib/cloud/factory.js +19 -3
  107. package/dist/lib/cloud/registry.d.ts +10 -1
  108. package/dist/lib/cloud/registry.js +14 -3
  109. package/dist/lib/cloud/rush.d.ts +63 -3
  110. package/dist/lib/cloud/rush.js +273 -20
  111. package/dist/lib/cloud/store.d.ts +13 -1
  112. package/dist/lib/cloud/store.js +23 -4
  113. package/dist/lib/cloud/stream.d.ts +6 -1
  114. package/dist/lib/cloud/stream.js +95 -39
  115. package/dist/lib/cloud/types.d.ts +153 -8
  116. package/dist/lib/cloud/types.js +34 -2
  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 +23 -6
  128. package/dist/lib/exec.js +53 -17
  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 +119 -101
  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 +10 -4
  156. package/dist/lib/models.js +36 -15
  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 +10 -1
  168. package/dist/lib/profiles-presets.js +9 -1
  169. package/dist/lib/profiles.d.ts +35 -1
  170. package/dist/lib/profiles.js +36 -15
  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 +40 -13
  180. package/dist/lib/rotate.js +238 -40
  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 → secrets/bundles.d.ts} +12 -2
  195. package/dist/lib/{secrets-bundles.js → secrets/bundles.js} +38 -17
  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 +12 -1
  203. package/dist/lib/session/artifacts.js +25 -5
  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 +16 -2
  219. package/dist/lib/session/types.js +10 -2
  220. package/dist/lib/shims.d.ts +64 -5
  221. package/dist/lib/shims.js +309 -47
  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 +112 -27
  227. package/dist/lib/state.js +320 -148
  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 +32 -1
  257. package/dist/lib/usage.js +70 -6
  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 +33 -4
  261. package/dist/lib/versions.js +376 -108
  262. package/package.json +32 -17
  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/cloud.d.ts.map +0 -1
  269. package/dist/commands/cloud.js.map +0 -1
  270. package/dist/commands/commands.d.ts.map +0 -1
  271. package/dist/commands/commands.js.map +0 -1
  272. package/dist/commands/daemon.d.ts.map +0 -1
  273. package/dist/commands/daemon.js.map +0 -1
  274. package/dist/commands/drive.d.ts.map +0 -1
  275. package/dist/commands/drive.js.map +0 -1
  276. package/dist/commands/exec.d.ts.map +0 -1
  277. package/dist/commands/exec.js.map +0 -1
  278. package/dist/commands/fork.d.ts.map +0 -1
  279. package/dist/commands/fork.js.map +0 -1
  280. package/dist/commands/hooks.d.ts.map +0 -1
  281. package/dist/commands/hooks.js.map +0 -1
  282. package/dist/commands/init.d.ts.map +0 -1
  283. package/dist/commands/init.js.map +0 -1
  284. package/dist/commands/mcp.d.ts.map +0 -1
  285. package/dist/commands/mcp.js.map +0 -1
  286. package/dist/commands/models.d.ts.map +0 -1
  287. package/dist/commands/models.js.map +0 -1
  288. package/dist/commands/packages.d.ts.map +0 -1
  289. package/dist/commands/packages.js.map +0 -1
  290. package/dist/commands/permissions.d.ts.map +0 -1
  291. package/dist/commands/permissions.js.map +0 -1
  292. package/dist/commands/plugins.d.ts.map +0 -1
  293. package/dist/commands/plugins.js.map +0 -1
  294. package/dist/commands/profiles.d.ts.map +0 -1
  295. package/dist/commands/profiles.js.map +0 -1
  296. package/dist/commands/pty.d.ts.map +0 -1
  297. package/dist/commands/pty.js.map +0 -1
  298. package/dist/commands/pull.d.ts.map +0 -1
  299. package/dist/commands/pull.js.map +0 -1
  300. package/dist/commands/push.d.ts +0 -3
  301. package/dist/commands/push.d.ts.map +0 -1
  302. package/dist/commands/push.js +0 -180
  303. package/dist/commands/push.js.map +0 -1
  304. package/dist/commands/refresh-memory.d.ts.map +0 -1
  305. package/dist/commands/refresh-memory.js.map +0 -1
  306. package/dist/commands/resource-view.d.ts.map +0 -1
  307. package/dist/commands/resource-view.js.map +0 -1
  308. package/dist/commands/routines.d.ts.map +0 -1
  309. package/dist/commands/routines.js.map +0 -1
  310. package/dist/commands/rules.d.ts.map +0 -1
  311. package/dist/commands/rules.js.map +0 -1
  312. package/dist/commands/secrets.d.ts.map +0 -1
  313. package/dist/commands/secrets.js.map +0 -1
  314. package/dist/commands/sessions-picker.d.ts.map +0 -1
  315. package/dist/commands/sessions-picker.js.map +0 -1
  316. package/dist/commands/sessions.d.ts.map +0 -1
  317. package/dist/commands/sessions.js.map +0 -1
  318. package/dist/commands/skills.d.ts.map +0 -1
  319. package/dist/commands/skills.js.map +0 -1
  320. package/dist/commands/status.d.ts.map +0 -1
  321. package/dist/commands/status.js.map +0 -1
  322. package/dist/commands/subagents.d.ts.map +0 -1
  323. package/dist/commands/subagents.js.map +0 -1
  324. package/dist/commands/sync.d.ts.map +0 -1
  325. package/dist/commands/sync.js.map +0 -1
  326. package/dist/commands/teams-picker.d.ts.map +0 -1
  327. package/dist/commands/teams-picker.js.map +0 -1
  328. package/dist/commands/teams.d.ts.map +0 -1
  329. package/dist/commands/teams.js.map +0 -1
  330. package/dist/commands/utils.d.ts.map +0 -1
  331. package/dist/commands/utils.js.map +0 -1
  332. package/dist/commands/versions.d.ts.map +0 -1
  333. package/dist/commands/versions.js.map +0 -1
  334. package/dist/commands/view.d.ts.map +0 -1
  335. package/dist/commands/view.js.map +0 -1
  336. package/dist/index.d.ts.map +0 -1
  337. package/dist/index.js.map +0 -1
  338. package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
  339. package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
  340. package/dist/lib/__tests__/bugfixes.test.js +0 -192
  341. package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
  342. package/dist/lib/__tests__/exec.test.d.ts +0 -2
  343. package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
  344. package/dist/lib/__tests__/exec.test.js +0 -446
  345. package/dist/lib/__tests__/exec.test.js.map +0 -1
  346. package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
  347. package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
  348. package/dist/lib/__tests__/git-sync.test.js +0 -138
  349. package/dist/lib/__tests__/git-sync.test.js.map +0 -1
  350. package/dist/lib/__tests__/hooks.test.d.ts +0 -2
  351. package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
  352. package/dist/lib/__tests__/hooks.test.js +0 -203
  353. package/dist/lib/__tests__/hooks.test.js.map +0 -1
  354. package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
  355. package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
  356. package/dist/lib/__tests__/memory-compile.test.js +0 -95
  357. package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
  358. package/dist/lib/__tests__/models.test.d.ts +0 -2
  359. package/dist/lib/__tests__/models.test.d.ts.map +0 -1
  360. package/dist/lib/__tests__/models.test.js +0 -239
  361. package/dist/lib/__tests__/models.test.js.map +0 -1
  362. package/dist/lib/__tests__/rotate.test.d.ts +0 -2
  363. package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
  364. package/dist/lib/__tests__/rotate.test.js +0 -80
  365. package/dist/lib/__tests__/rotate.test.js.map +0 -1
  366. package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
  367. package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
  368. package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
  369. package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
  370. package/dist/lib/__tests__/secrets.test.d.ts +0 -2
  371. package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
  372. package/dist/lib/__tests__/secrets.test.js +0 -90
  373. package/dist/lib/__tests__/secrets.test.js.map +0 -1
  374. package/dist/lib/__tests__/shims.test.d.ts +0 -2
  375. package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
  376. package/dist/lib/__tests__/shims.test.js +0 -39
  377. package/dist/lib/__tests__/shims.test.js.map +0 -1
  378. package/dist/lib/__tests__/usage.test.d.ts +0 -2
  379. package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
  380. package/dist/lib/__tests__/usage.test.js +0 -220
  381. package/dist/lib/__tests__/usage.test.js.map +0 -1
  382. package/dist/lib/__tests__/versions.test.d.ts +0 -2
  383. package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
  384. package/dist/lib/__tests__/versions.test.js +0 -63
  385. package/dist/lib/__tests__/versions.test.js.map +0 -1
  386. package/dist/lib/agents.d.ts.map +0 -1
  387. package/dist/lib/agents.js.map +0 -1
  388. package/dist/lib/artifact-actions.d.ts.map +0 -1
  389. package/dist/lib/artifact-actions.js.map +0 -1
  390. package/dist/lib/cloud/codex.d.ts.map +0 -1
  391. package/dist/lib/cloud/codex.js.map +0 -1
  392. package/dist/lib/cloud/factory.d.ts.map +0 -1
  393. package/dist/lib/cloud/factory.js.map +0 -1
  394. package/dist/lib/cloud/registry.d.ts.map +0 -1
  395. package/dist/lib/cloud/registry.js.map +0 -1
  396. package/dist/lib/cloud/rush.d.ts.map +0 -1
  397. package/dist/lib/cloud/rush.js.map +0 -1
  398. package/dist/lib/cloud/store.d.ts.map +0 -1
  399. package/dist/lib/cloud/store.js.map +0 -1
  400. package/dist/lib/cloud/stream.d.ts.map +0 -1
  401. package/dist/lib/cloud/stream.js.map +0 -1
  402. package/dist/lib/cloud/types.d.ts.map +0 -1
  403. package/dist/lib/cloud/types.js.map +0 -1
  404. package/dist/lib/commands.d.ts.map +0 -1
  405. package/dist/lib/commands.js.map +0 -1
  406. package/dist/lib/convert.d.ts.map +0 -1
  407. package/dist/lib/convert.js.map +0 -1
  408. package/dist/lib/daemon.d.ts.map +0 -1
  409. package/dist/lib/daemon.js.map +0 -1
  410. package/dist/lib/drive-sync.d.ts.map +0 -1
  411. package/dist/lib/drive-sync.js.map +0 -1
  412. package/dist/lib/exec.d.ts.map +0 -1
  413. package/dist/lib/exec.js.map +0 -1
  414. package/dist/lib/factory.d.ts +0 -57
  415. package/dist/lib/factory.d.ts.map +0 -1
  416. package/dist/lib/factory.js +0 -110
  417. package/dist/lib/factory.js.map +0 -1
  418. package/dist/lib/git.d.ts.map +0 -1
  419. package/dist/lib/git.js.map +0 -1
  420. package/dist/lib/help.d.ts.map +0 -1
  421. package/dist/lib/help.js.map +0 -1
  422. package/dist/lib/hooks.d.ts.map +0 -1
  423. package/dist/lib/hooks.js.map +0 -1
  424. package/dist/lib/manifest.d.ts.map +0 -1
  425. package/dist/lib/manifest.js.map +0 -1
  426. package/dist/lib/markdown.d.ts.map +0 -1
  427. package/dist/lib/markdown.js.map +0 -1
  428. package/dist/lib/mcp.d.ts.map +0 -1
  429. package/dist/lib/mcp.js.map +0 -1
  430. package/dist/lib/memory-compile.d.ts.map +0 -1
  431. package/dist/lib/memory-compile.js.map +0 -1
  432. package/dist/lib/memory.d.ts.map +0 -1
  433. package/dist/lib/memory.js.map +0 -1
  434. package/dist/lib/models.d.ts.map +0 -1
  435. package/dist/lib/models.js.map +0 -1
  436. package/dist/lib/permissions.d.ts.map +0 -1
  437. package/dist/lib/permissions.js.map +0 -1
  438. package/dist/lib/picker.d.ts.map +0 -1
  439. package/dist/lib/picker.js.map +0 -1
  440. package/dist/lib/plugins.d.ts.map +0 -1
  441. package/dist/lib/plugins.js.map +0 -1
  442. package/dist/lib/profiles-keychain.d.ts +0 -3
  443. package/dist/lib/profiles-keychain.d.ts.map +0 -1
  444. package/dist/lib/profiles-keychain.js +0 -10
  445. package/dist/lib/profiles-keychain.js.map +0 -1
  446. package/dist/lib/profiles-presets.d.ts.map +0 -1
  447. package/dist/lib/profiles-presets.js.map +0 -1
  448. package/dist/lib/profiles.d.ts.map +0 -1
  449. package/dist/lib/profiles.js.map +0 -1
  450. package/dist/lib/pty-client.d.ts.map +0 -1
  451. package/dist/lib/pty-client.js.map +0 -1
  452. package/dist/lib/pty-server.d.ts.map +0 -1
  453. package/dist/lib/pty-server.js.map +0 -1
  454. package/dist/lib/registry.d.ts.map +0 -1
  455. package/dist/lib/registry.js.map +0 -1
  456. package/dist/lib/resources.d.ts.map +0 -1
  457. package/dist/lib/resources.js.map +0 -1
  458. package/dist/lib/rotate.d.ts.map +0 -1
  459. package/dist/lib/rotate.js.map +0 -1
  460. package/dist/lib/routines.d.ts.map +0 -1
  461. package/dist/lib/routines.js.map +0 -1
  462. package/dist/lib/runner.d.ts.map +0 -1
  463. package/dist/lib/runner.js.map +0 -1
  464. package/dist/lib/sandbox.d.ts.map +0 -1
  465. package/dist/lib/sandbox.js.map +0 -1
  466. package/dist/lib/scheduler.d.ts.map +0 -1
  467. package/dist/lib/scheduler.js.map +0 -1
  468. package/dist/lib/secrets-bundles.d.ts.map +0 -1
  469. package/dist/lib/secrets-bundles.js.map +0 -1
  470. package/dist/lib/secrets.d.ts +0 -27
  471. package/dist/lib/secrets.d.ts.map +0 -1
  472. package/dist/lib/secrets.js +0 -127
  473. package/dist/lib/secrets.js.map +0 -1
  474. package/dist/lib/session/__tests__/db.test.d.ts +0 -2
  475. package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
  476. package/dist/lib/session/__tests__/db.test.js +0 -54
  477. package/dist/lib/session/__tests__/db.test.js.map +0 -1
  478. package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
  479. package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
  480. package/dist/lib/session/__tests__/discover.test.js +0 -63
  481. package/dist/lib/session/__tests__/discover.test.js.map +0 -1
  482. package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
  483. package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
  484. package/dist/lib/session/__tests__/prompt.test.js +0 -44
  485. package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
  486. package/dist/lib/session/__tests__/render.test.d.ts +0 -2
  487. package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
  488. package/dist/lib/session/__tests__/render.test.js +0 -602
  489. package/dist/lib/session/__tests__/render.test.js.map +0 -1
  490. package/dist/lib/session/artifacts.d.ts.map +0 -1
  491. package/dist/lib/session/artifacts.js.map +0 -1
  492. package/dist/lib/session/db.d.ts.map +0 -1
  493. package/dist/lib/session/db.js.map +0 -1
  494. package/dist/lib/session/discover.d.ts.map +0 -1
  495. package/dist/lib/session/discover.js.map +0 -1
  496. package/dist/lib/session/parse.d.ts.map +0 -1
  497. package/dist/lib/session/parse.js.map +0 -1
  498. package/dist/lib/session/prompt.d.ts.map +0 -1
  499. package/dist/lib/session/prompt.js.map +0 -1
  500. package/dist/lib/session/prompt.test.d.ts +0 -2
  501. package/dist/lib/session/prompt.test.d.ts.map +0 -1
  502. package/dist/lib/session/prompt.test.js +0 -57
  503. package/dist/lib/session/prompt.test.js.map +0 -1
  504. package/dist/lib/session/render.d.ts.map +0 -1
  505. package/dist/lib/session/render.js.map +0 -1
  506. package/dist/lib/session/team-filter.d.ts.map +0 -1
  507. package/dist/lib/session/team-filter.js.map +0 -1
  508. package/dist/lib/session/team-filter.test.d.ts +0 -2
  509. package/dist/lib/session/team-filter.test.d.ts.map +0 -1
  510. package/dist/lib/session/team-filter.test.js +0 -157
  511. package/dist/lib/session/team-filter.test.js.map +0 -1
  512. package/dist/lib/session/types.d.ts.map +0 -1
  513. package/dist/lib/session/types.js.map +0 -1
  514. package/dist/lib/shims.d.ts.map +0 -1
  515. package/dist/lib/shims.js.map +0 -1
  516. package/dist/lib/skills.d.ts.map +0 -1
  517. package/dist/lib/skills.js.map +0 -1
  518. package/dist/lib/state.d.ts.map +0 -1
  519. package/dist/lib/state.js.map +0 -1
  520. package/dist/lib/subagents.d.ts.map +0 -1
  521. package/dist/lib/subagents.js.map +0 -1
  522. package/dist/lib/teams/agents.d.ts.map +0 -1
  523. package/dist/lib/teams/agents.js.map +0 -1
  524. package/dist/lib/teams/api.d.ts.map +0 -1
  525. package/dist/lib/teams/api.js.map +0 -1
  526. package/dist/lib/teams/cloud.d.ts +0 -11
  527. package/dist/lib/teams/cloud.d.ts.map +0 -1
  528. package/dist/lib/teams/cloud.js +0 -169
  529. package/dist/lib/teams/cloud.js.map +0 -1
  530. package/dist/lib/teams/debug.d.ts.map +0 -1
  531. package/dist/lib/teams/debug.js.map +0 -1
  532. package/dist/lib/teams/file_ops.d.ts.map +0 -1
  533. package/dist/lib/teams/file_ops.js.map +0 -1
  534. package/dist/lib/teams/parsers.d.ts.map +0 -1
  535. package/dist/lib/teams/parsers.js.map +0 -1
  536. package/dist/lib/teams/persistence.d.ts.map +0 -1
  537. package/dist/lib/teams/persistence.js.map +0 -1
  538. package/dist/lib/teams/ralph.d.ts +0 -8
  539. package/dist/lib/teams/ralph.d.ts.map +0 -1
  540. package/dist/lib/teams/ralph.js +0 -59
  541. package/dist/lib/teams/ralph.js.map +0 -1
  542. package/dist/lib/teams/registry.d.ts.map +0 -1
  543. package/dist/lib/teams/registry.js.map +0 -1
  544. package/dist/lib/teams/summarizer.d.ts.map +0 -1
  545. package/dist/lib/teams/summarizer.js.map +0 -1
  546. package/dist/lib/template.d.ts.map +0 -1
  547. package/dist/lib/template.js.map +0 -1
  548. package/dist/lib/types.d.ts.map +0 -1
  549. package/dist/lib/types.js.map +0 -1
  550. package/dist/lib/usage.d.ts.map +0 -1
  551. package/dist/lib/usage.js.map +0 -1
  552. package/dist/lib/versions.d.ts.map +0 -1
  553. package/dist/lib/versions.js.map +0 -1
  554. package/scripts/rebuild-sqlite.sh +0 -46
@@ -1,8 +1,17 @@
1
+ /**
2
+ * Secrets bundle management commands.
3
+ *
4
+ * Registers the `agents secrets` command tree for creating, viewing,
5
+ * and managing named bundles of environment variables backed by macOS
6
+ * Keychain. Bundles are injected at run time via `agents run --secrets`.
7
+ */
1
8
  import chalk from 'chalk';
2
9
  import * as fs from 'fs';
3
- import { bundleExists, deleteBundle, describeBundle, keychainItemsForBundle, keychainRef, listBundles, parseDotenv, readBundle, validateBundleName, validateEnvKey, writeBundle, } from '../lib/secrets-bundles.js';
4
- import { deleteKeychainToken, getKeychainToken, hasKeychainToken, secretsKeychainItem, setKeychainToken, } from '../lib/secrets.js';
10
+ import { bundleExists, deleteBundle, describeBundle, keychainItemsForBundle, keychainRef, listBundles, parseDotenv, readBundle, validateBundleName, validateEnvKey, writeBundle, } from '../lib/secrets/bundles.js';
11
+ import { deleteKeychainToken, getKeychainToken, hasKeychainToken, secretsKeychainItem, setKeychainToken, } from '../lib/secrets/index.js';
12
+ import { registerCommandGroups } from '../lib/help.js';
5
13
  import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
14
+ /** Prompt the user for a secret value with masked input. Requires an interactive TTY. */
6
15
  async function promptForSecret(message) {
7
16
  if (!isInteractiveTerminal()) {
8
17
  throw new Error('A secret is required but the shell is not interactive. Pass --value, --value-stdin, or run from a TTY.');
@@ -10,6 +19,79 @@ async function promptForSecret(message) {
10
19
  const { password } = await import('@inquirer/prompts');
11
20
  return await password({ message, mask: true });
12
21
  }
22
+ /** Prompt the user to pick an existing bundle by name. Requires an interactive TTY. */
23
+ async function pickBundleName(action) {
24
+ const bundles = listBundles();
25
+ if (bundles.length === 0) {
26
+ throw new Error('No secrets bundles configured. Try: agents secrets create <name>');
27
+ }
28
+ if (!isInteractiveTerminal()) {
29
+ throw new Error('A bundle name is required. Pass it as an argument or run from a TTY.');
30
+ }
31
+ const { select } = await import('@inquirer/prompts');
32
+ return await select({
33
+ message: `Which bundle to ${action}?`,
34
+ choices: bundles.map((b) => ({
35
+ name: b.name,
36
+ value: b.name,
37
+ description: b.description || undefined,
38
+ })),
39
+ });
40
+ }
41
+ /** Prompt the user to type a new bundle name. Requires an interactive TTY. */
42
+ async function promptBundleName() {
43
+ if (!isInteractiveTerminal()) {
44
+ throw new Error('A bundle name is required. Pass it as an argument or run from a TTY.');
45
+ }
46
+ const { input } = await import('@inquirer/prompts');
47
+ return await input({
48
+ message: 'Bundle name',
49
+ validate: (value) => {
50
+ try {
51
+ validateBundleName(value);
52
+ return true;
53
+ }
54
+ catch (err) {
55
+ return err.message;
56
+ }
57
+ },
58
+ });
59
+ }
60
+ /** Prompt the user to pick an existing key from a bundle. Requires an interactive TTY. */
61
+ async function pickKey(bundle, action) {
62
+ const keys = Object.keys(bundle.vars);
63
+ if (keys.length === 0) {
64
+ throw new Error(`Bundle '${bundle.name}' has no keys.`);
65
+ }
66
+ if (!isInteractiveTerminal()) {
67
+ throw new Error('A key name is required. Pass it as an argument or run from a TTY.');
68
+ }
69
+ const { select } = await import('@inquirer/prompts');
70
+ return await select({
71
+ message: `Which key to ${action}?`,
72
+ choices: keys.map((k) => ({ name: k, value: k })),
73
+ });
74
+ }
75
+ /** Prompt the user to type a new key name for a bundle. Requires an interactive TTY. */
76
+ async function promptKeyName(bundleName) {
77
+ if (!isInteractiveTerminal()) {
78
+ throw new Error('A key name is required. Pass it as an argument or run from a TTY.');
79
+ }
80
+ const { input } = await import('@inquirer/prompts');
81
+ return await input({
82
+ message: `Key name to add to '${bundleName}'`,
83
+ validate: (value) => {
84
+ try {
85
+ validateEnvKey(value);
86
+ return true;
87
+ }
88
+ catch (err) {
89
+ return err.message;
90
+ }
91
+ },
92
+ });
93
+ }
94
+ /** Read all available data from stdin synchronously, trimmed. */
13
95
  function readStdinSync() {
14
96
  const chunks = [];
15
97
  const buf = Buffer.alloc(65536);
@@ -27,12 +109,14 @@ function readStdinSync() {
27
109
  }
28
110
  return Buffer.concat(chunks).toString('utf-8').trim();
29
111
  }
112
+ /** Format a single bundle as a table row for the `secrets list` output. */
30
113
  function renderBundleRow(b) {
31
114
  const entries = describeBundle(b);
32
115
  const keys = entries.length;
33
116
  const sensitive = entries.filter((e) => e.kind === 'keychain').length;
34
117
  return `${chalk.cyan(b.name.padEnd(20))} ${String(keys).padEnd(6)} ${chalk.yellow(String(sensitive).padEnd(10))} ${chalk.gray(b.description || '')}`;
35
118
  }
119
+ /** Colorize a variable source kind (literal, keychain, env, file, exec). */
36
120
  function kindLabel(kind) {
37
121
  switch (kind) {
38
122
  case 'literal': return chalk.gray('literal');
@@ -43,6 +127,7 @@ function kindLabel(kind) {
43
127
  default: return kind;
44
128
  }
45
129
  }
130
+ /** Mask a value with asterisks unless reveal is true. */
46
131
  function redact(value, reveal) {
47
132
  if (reveal)
48
133
  return value;
@@ -50,10 +135,53 @@ function redact(value, reveal) {
50
135
  return '';
51
136
  return '*'.repeat(Math.min(value.length, 8));
52
137
  }
138
+ /** Register the `agents secrets` command tree. */
53
139
  export function registerSecretsCommands(program) {
54
140
  const cmd = program
55
141
  .command('secrets')
56
- .description('Named bundles of env variables backed by macOS Keychain. Inject into agents via `agents run --secrets <name>`.');
142
+ .description('Named bundles of env variables backed by macOS Keychain. Inject into agents via `agents run --secrets <name>`.')
143
+ .addHelpText('after', `
144
+ Workflow:
145
+ Bundles are containers; secrets are the variables inside them. Create a
146
+ bundle once, add secrets to it, then inject the whole bundle into any agent
147
+ run with --secrets <name>. Keychain-backed values never touch disk in
148
+ plaintext.
149
+
150
+ Examples:
151
+ # Create a bundle for production credentials
152
+ agents secrets create prod --description "Production keys for the api stack"
153
+
154
+ # Add a keychain-backed secret (prompts for the value)
155
+ agents secrets add prod STRIPE_API_KEY
156
+
157
+ # Add a literal (non-sensitive) value
158
+ agents secrets add prod LOG_LEVEL --value info
159
+
160
+ # Import an entire .env file straight into keychain
161
+ agents secrets import prod --from .env.prod
162
+
163
+ # See what's in a bundle (values masked)
164
+ agents secrets view prod
165
+
166
+ # Reveal the real values in an interactive shell
167
+ agents secrets view prod --reveal
168
+
169
+ # Inject the bundle into an agent run
170
+ agents run claude "deploy the worker" --secrets prod
171
+
172
+ # Eval the bundle into your current shell
173
+ eval "$(agents secrets export prod --plaintext)"
174
+
175
+ # Remove one key (purges the keychain item by default)
176
+ agents secrets remove prod STRIPE_API_KEY
177
+
178
+ # Delete the whole bundle and purge every keychain item it owned
179
+ agents secrets delete prod
180
+ `);
181
+ registerCommandGroups(cmd, [
182
+ { title: 'Bundle commands', names: ['list', 'view', 'create', 'delete'] },
183
+ { title: 'Secret commands', names: ['add', 'remove', 'import', 'export'] },
184
+ ]);
57
185
  cmd
58
186
  .command('list')
59
187
  .alias('ls')
@@ -62,7 +190,7 @@ export function registerSecretsCommands(program) {
62
190
  const bundles = listBundles();
63
191
  if (bundles.length === 0) {
64
192
  console.log(chalk.gray('No secrets bundles configured.'));
65
- console.log(chalk.gray('Try: agents secrets add <name>'));
193
+ console.log(chalk.gray('Try: agents secrets create <name>'));
66
194
  return;
67
195
  }
68
196
  console.log(chalk.bold(`${'NAME'.padEnd(20)} ${'KEYS'.padEnd(6)} ${'SENSITIVE'.padEnd(10)} DESCRIPTION`));
@@ -71,20 +199,23 @@ export function registerSecretsCommands(program) {
71
199
  }
72
200
  });
73
201
  cmd
74
- .command('view <name>')
202
+ .command('view [name]')
75
203
  .alias('show')
76
204
  .description('Show a bundle. Keychain values are masked by default — pass --reveal to see them.')
77
205
  .option('--reveal', 'Print keychain-backed values in the clear (TTY only unless --plaintext)')
78
206
  .option('--plaintext', 'Allow --reveal in non-interactive shells (use with care)')
79
- .action((name, opts) => {
207
+ .action(async (name, opts) => {
80
208
  try {
81
- const bundle = readBundle(name);
209
+ const resolvedName = name ?? (await pickBundleName('view'));
210
+ const bundle = readBundle(resolvedName);
82
211
  const entries = describeBundle(bundle);
83
212
  console.log(chalk.bold(bundle.name));
84
213
  if (bundle.description)
85
214
  console.log(chalk.gray(bundle.description));
86
215
  if (bundle.allow_exec)
87
216
  console.log(chalk.yellow('allow_exec: true'));
217
+ if (bundle.icloud_sync)
218
+ console.log(chalk.cyan('icloud_sync: true'));
88
219
  console.log();
89
220
  if (entries.length === 0) {
90
221
  console.log(chalk.gray('(no keys)'));
@@ -98,12 +229,12 @@ export function registerSecretsCommands(program) {
98
229
  for (const e of entries) {
99
230
  if (e.kind === 'keychain') {
100
231
  const item = secretsKeychainItem(bundle.name, e.detail);
101
- const stored = hasKeychainToken(item);
232
+ const stored = hasKeychainToken(item, bundle.icloud_sync);
102
233
  const marker = stored ? chalk.green('stored') : chalk.red('missing');
103
234
  let valueCol = `[keychain:${e.detail}] ${marker}`;
104
235
  if (reveal && stored) {
105
236
  try {
106
- valueCol = redact(getKeychainToken(item), true);
237
+ valueCol = redact(getKeychainToken(item, bundle.icloud_sync), true);
107
238
  }
108
239
  catch {
109
240
  // fall through to masked
@@ -124,41 +255,48 @@ export function registerSecretsCommands(program) {
124
255
  }
125
256
  }
126
257
  catch (err) {
258
+ if (isPromptCancelled(err))
259
+ return;
127
260
  console.error(chalk.red(err.message));
128
261
  process.exit(1);
129
262
  }
130
263
  });
131
264
  cmd
132
- .command('add <name>')
265
+ .command('create [name]')
133
266
  .description('Create an empty bundle')
134
267
  .option('--description <text>', 'Free-form description')
135
268
  .option('--allow-exec', 'Allow exec: refs in this bundle (off by default)')
269
+ .option('--icloud-sync', 'Store keychain values in iCloud Keychain so they sync across your Macs (requires Xcode CLT)')
136
270
  .option('--force', 'Overwrite an existing bundle')
137
- .action((name, opts) => {
271
+ .action(async (name, opts) => {
138
272
  try {
139
- validateBundleName(name);
140
- if (bundleExists(name) && !opts.force) {
141
- console.error(chalk.red(`Bundle '${name}' already exists. Use --force to overwrite.`));
273
+ const resolvedName = name ?? (await promptBundleName());
274
+ validateBundleName(resolvedName);
275
+ if (bundleExists(resolvedName) && !opts.force) {
276
+ console.error(chalk.red(`Bundle '${resolvedName}' already exists. Use --force to overwrite.`));
142
277
  process.exit(1);
143
278
  }
144
279
  const bundle = {
145
- name,
280
+ name: resolvedName,
146
281
  description: opts.description,
147
282
  allow_exec: opts.allowExec,
283
+ icloud_sync: opts.icloudSync,
148
284
  vars: {},
149
285
  };
150
286
  writeBundle(bundle);
151
- console.log(chalk.green(`Bundle '${name}' created.`));
152
- console.log(chalk.gray(`Try: agents secrets set ${name} MY_KEY`));
287
+ console.log(chalk.green(`Bundle '${resolvedName}' created.`));
288
+ console.log(chalk.gray(`Try: agents secrets add ${resolvedName} MY_KEY`));
153
289
  }
154
290
  catch (err) {
291
+ if (isPromptCancelled(err))
292
+ return;
155
293
  console.error(chalk.red(err.message));
156
294
  process.exit(1);
157
295
  }
158
296
  });
159
297
  cmd
160
- .command('set <bundle> <key>')
161
- .description('Set a variable. Defaults to keychain-backed; pass --value for literal, --env/--file/--exec for refs.')
298
+ .command('add [bundle] [key]')
299
+ .description('Add a variable to a bundle. Defaults to keychain-backed; pass --value for literal, --env/--file/--exec for refs.')
162
300
  .option('--value <v>', 'Store as a plaintext literal in the YAML (non-sensitive values only)')
163
301
  .option('--value-stdin', 'Read the value from stdin (stored in keychain unless combined with --value)')
164
302
  .option('--env <VAR>', 'Store as an env: ref that reads from the parent process.env at run time')
@@ -166,37 +304,39 @@ export function registerSecretsCommands(program) {
166
304
  .option('--exec <cmd>', 'Store as an exec: ref that runs a command at run time (requires allow_exec)')
167
305
  .action(async (bundleName, key, opts) => {
168
306
  try {
169
- validateEnvKey(key);
170
- const bundle = readBundle(bundleName);
307
+ const resolvedBundleName = bundleName ?? (await pickBundleName('add to'));
308
+ const bundle = readBundle(resolvedBundleName);
309
+ const resolvedKey = key ?? (await promptKeyName(resolvedBundleName));
310
+ validateEnvKey(resolvedKey);
171
311
  const sources = [opts.value !== undefined, Boolean(opts.env), Boolean(opts.file), Boolean(opts.exec)].filter(Boolean).length;
172
312
  if (sources > 1) {
173
313
  throw new Error('Pick one of: --value, --env, --file, --exec.');
174
314
  }
175
315
  if (opts.env) {
176
- bundle.vars[key] = `env:${opts.env}`;
316
+ bundle.vars[resolvedKey] = `env:${opts.env}`;
177
317
  writeBundle(bundle);
178
- console.log(chalk.green(`${bundleName}.${key} -> env:${opts.env}`));
318
+ console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> env:${opts.env}`));
179
319
  return;
180
320
  }
181
321
  if (opts.file) {
182
- bundle.vars[key] = `file:${opts.file}`;
322
+ bundle.vars[resolvedKey] = `file:${opts.file}`;
183
323
  writeBundle(bundle);
184
- console.log(chalk.green(`${bundleName}.${key} -> file:${opts.file}`));
324
+ console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> file:${opts.file}`));
185
325
  return;
186
326
  }
187
327
  if (opts.exec) {
188
328
  if (!bundle.allow_exec) {
189
- throw new Error(`Bundle '${bundleName}' does not allow exec refs. Re-create with --allow-exec.`);
329
+ throw new Error(`Bundle '${resolvedBundleName}' does not allow exec refs. Re-create with --allow-exec.`);
190
330
  }
191
- bundle.vars[key] = `exec:${opts.exec}`;
331
+ bundle.vars[resolvedKey] = `exec:${opts.exec}`;
192
332
  writeBundle(bundle);
193
- console.log(chalk.green(`${bundleName}.${key} -> exec:${opts.exec}`));
333
+ console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> exec:${opts.exec}`));
194
334
  return;
195
335
  }
196
336
  if (opts.value !== undefined) {
197
- bundle.vars[key] = { value: opts.value };
337
+ bundle.vars[resolvedKey] = { value: opts.value };
198
338
  writeBundle(bundle);
199
- console.log(chalk.green(`${bundleName}.${key} = <literal>`));
339
+ console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} = <literal>`));
200
340
  return;
201
341
  }
202
342
  // Default path: keychain-backed.
@@ -207,13 +347,14 @@ export function registerSecretsCommands(program) {
207
347
  throw new Error('No value received on stdin.');
208
348
  }
209
349
  else {
210
- secretValue = await promptForSecret(`Enter value for ${bundleName}.${key}`);
350
+ secretValue = await promptForSecret(`Enter value for ${resolvedBundleName}.${resolvedKey}`);
211
351
  }
212
- const item = secretsKeychainItem(bundleName, key);
213
- setKeychainToken(item, secretValue);
214
- bundle.vars[key] = keychainRef(key);
352
+ const item = secretsKeychainItem(resolvedBundleName, resolvedKey);
353
+ setKeychainToken(item, secretValue, bundle.icloud_sync);
354
+ bundle.vars[resolvedKey] = keychainRef(resolvedKey);
215
355
  writeBundle(bundle);
216
- console.log(chalk.green(`${bundleName}.${key} stored in keychain (${item}).`));
356
+ const where = bundle.icloud_sync ? 'iCloud Keychain' : 'keychain';
357
+ console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} stored in ${where} (${item}).`));
217
358
  }
218
359
  catch (err) {
219
360
  if (isPromptCancelled(err))
@@ -223,68 +364,95 @@ export function registerSecretsCommands(program) {
223
364
  }
224
365
  });
225
366
  cmd
226
- .command('unset <bundle> <key>')
367
+ .command('remove [bundle] [key]')
227
368
  .description('Remove a key from the bundle. Purges the keychain item if the ref was keychain:. Use --keep-secret to retain it.')
228
369
  .option('--keep-secret', 'Leave the keychain item in place after removing the YAML ref')
229
- .action((bundleName, key, opts) => {
370
+ .action(async (bundleName, key, opts) => {
230
371
  try {
231
- const bundle = readBundle(bundleName);
232
- if (!(key in bundle.vars)) {
233
- console.error(chalk.red(`Key '${key}' not found in bundle '${bundleName}'.`));
372
+ const resolvedBundleName = bundleName ?? (await pickBundleName('remove from'));
373
+ const bundle = readBundle(resolvedBundleName);
374
+ const resolvedKey = key ?? (await pickKey(bundle, 'remove'));
375
+ if (!(resolvedKey in bundle.vars)) {
376
+ console.error(chalk.red(`Key '${resolvedKey}' not found in bundle '${resolvedBundleName}'.`));
234
377
  process.exit(1);
235
378
  }
236
- const raw = bundle.vars[key];
237
- delete bundle.vars[key];
379
+ const raw = bundle.vars[resolvedKey];
380
+ delete bundle.vars[resolvedKey];
238
381
  writeBundle(bundle);
239
382
  if (!opts.keepSecret && typeof raw === 'string' && raw.startsWith('keychain:')) {
240
- const item = secretsKeychainItem(bundleName, raw.slice('keychain:'.length));
241
- const removed = deleteKeychainToken(item);
383
+ const item = secretsKeychainItem(resolvedBundleName, raw.slice('keychain:'.length));
384
+ const removed = deleteKeychainToken(item, bundle.icloud_sync);
242
385
  if (removed) {
243
- console.log(chalk.green(`Removed ${bundleName}.${key} and purged keychain item.`));
386
+ console.log(chalk.green(`Removed ${resolvedBundleName}.${resolvedKey} and purged keychain item.`));
244
387
  return;
245
388
  }
246
389
  }
247
- console.log(chalk.green(`Removed ${bundleName}.${key}.`));
390
+ console.log(chalk.green(`Removed ${resolvedBundleName}.${resolvedKey}.`));
248
391
  }
249
392
  catch (err) {
393
+ if (isPromptCancelled(err))
394
+ return;
250
395
  console.error(chalk.red(err.message));
251
396
  process.exit(1);
252
397
  }
253
398
  });
254
399
  cmd
255
- .command('rm <name>')
256
- .alias('remove')
400
+ .command('delete [name]')
257
401
  .description('Delete a bundle and purge all its keychain items (use --keep-secrets to retain them).')
258
402
  .option('--keep-secrets', 'Leave keychain items in place after deleting the bundle file')
259
- .action((name, opts) => {
403
+ .option('-y, --yes', 'Skip the confirmation prompt')
404
+ .action(async (name, opts) => {
260
405
  try {
261
- const bundle = readBundle(name);
406
+ const resolvedName = name ?? (await pickBundleName('delete'));
407
+ const bundle = readBundle(resolvedName);
408
+ if (!opts.yes) {
409
+ if (!isInteractiveTerminal()) {
410
+ console.error(chalk.red(`Refusing to delete '${resolvedName}' without --yes in a non-interactive shell.`));
411
+ process.exit(1);
412
+ }
413
+ const keychainCount = describeBundle(bundle).filter((e) => e.kind === 'keychain').length;
414
+ const suffix = keychainCount && !opts.keepSecrets
415
+ ? ` and purge ${keychainCount} keychain item${keychainCount === 1 ? '' : 's'}`
416
+ : '';
417
+ const { confirm } = await import('@inquirer/prompts');
418
+ const proceed = await confirm({
419
+ message: `Delete bundle '${resolvedName}'${suffix}?`,
420
+ default: false,
421
+ });
422
+ if (!proceed) {
423
+ console.log(chalk.gray('Cancelled.'));
424
+ return;
425
+ }
426
+ }
262
427
  if (!opts.keepSecrets) {
263
428
  for (const { item } of keychainItemsForBundle(bundle)) {
264
- deleteKeychainToken(item);
429
+ deleteKeychainToken(item, bundle.icloud_sync);
265
430
  }
266
431
  }
267
- const existed = deleteBundle(name);
432
+ const existed = deleteBundle(resolvedName);
268
433
  if (!existed) {
269
- console.error(chalk.red(`Bundle '${name}' not found.`));
434
+ console.error(chalk.red(`Bundle '${resolvedName}' not found.`));
270
435
  process.exit(1);
271
436
  }
272
- console.log(chalk.green(`Bundle '${name}' removed.`));
437
+ console.log(chalk.green(`Bundle '${resolvedName}' deleted.`));
273
438
  }
274
439
  catch (err) {
440
+ if (isPromptCancelled(err))
441
+ return;
275
442
  console.error(chalk.red(err.message));
276
443
  process.exit(1);
277
444
  }
278
445
  });
279
446
  cmd
280
- .command('import <bundle>')
447
+ .command('import [bundle]')
281
448
  .description('Import keys from a .env file into a bundle. By default every key is stored in keychain.')
282
449
  .requiredOption('--from <path>', 'Path to a .env file')
283
450
  .option('--all-plaintext', 'Store every imported value as a YAML literal (skip keychain prompts)')
284
451
  .option('--force', 'Overwrite an existing key in the bundle')
285
- .action((bundleName, opts) => {
452
+ .action(async (bundleName, opts) => {
286
453
  try {
287
- const bundle = readBundle(bundleName);
454
+ const resolvedBundleName = bundleName ?? (await pickBundleName('import into'));
455
+ const bundle = readBundle(resolvedBundleName);
288
456
  const raw = fs.readFileSync(opts.from, 'utf-8');
289
457
  const pairs = parseDotenv(raw);
290
458
  let added = 0;
@@ -298,8 +466,8 @@ export function registerSecretsCommands(program) {
298
466
  bundle.vars[key] = { value };
299
467
  }
300
468
  else {
301
- const item = secretsKeychainItem(bundleName, key);
302
- setKeychainToken(item, value);
469
+ const item = secretsKeychainItem(resolvedBundleName, key);
470
+ setKeychainToken(item, value, bundle.icloud_sync);
303
471
  bundle.vars[key] = keychainRef(key);
304
472
  }
305
473
  added++;
@@ -308,18 +476,21 @@ export function registerSecretsCommands(program) {
308
476
  console.log(chalk.green(`Imported ${added} key(s)${skipped ? `, skipped ${skipped} (already set, pass --force)` : ''}.`));
309
477
  }
310
478
  catch (err) {
479
+ if (isPromptCancelled(err))
480
+ return;
311
481
  console.error(chalk.red(err.message));
312
482
  process.exit(1);
313
483
  }
314
484
  });
315
485
  cmd
316
- .command('export <bundle>')
486
+ .command('export [bundle]')
317
487
  .description('Resolve a bundle and print KEY=VALUE lines (for `eval "$(agents secrets export prod)"`). Refuses on a TTY unless --plaintext.')
318
488
  .option('--plaintext', 'Acknowledge that the resolved values will be printed in the clear')
319
489
  .action(async (bundleName, opts) => {
320
490
  try {
321
- const { resolveBundleEnv } = await import('../lib/secrets-bundles.js');
322
- const bundle = readBundle(bundleName);
491
+ const { resolveBundleEnv } = await import('../lib/secrets/bundles.js');
492
+ const resolvedBundleName = bundleName ?? (await pickBundleName('export'));
493
+ const bundle = readBundle(resolvedBundleName);
323
494
  if (isInteractiveTerminal() && !opts.plaintext) {
324
495
  console.error(chalk.red('export to a TTY requires --plaintext (prevents shoulder-surfing).'));
325
496
  process.exit(1);
@@ -331,9 +502,10 @@ export function registerSecretsCommands(program) {
331
502
  }
332
503
  }
333
504
  catch (err) {
505
+ if (isPromptCancelled(err))
506
+ return;
334
507
  console.error(chalk.red(err.message));
335
508
  process.exit(1);
336
509
  }
337
510
  });
338
511
  }
339
- //# sourceMappingURL=secrets.js.map
@@ -11,6 +11,7 @@ export interface SessionPickerConfig {
11
11
  pageSize?: number;
12
12
  initialSearch?: string;
13
13
  }
14
+ /** Build a cached multi-line preview string for display in the session picker. */
14
15
  export declare function buildPreview(session: SessionMeta): string;
16
+ /** Show an interactive session picker and return the selected session with its action (resume or view). */
15
17
  export declare function sessionPicker(config: SessionPickerConfig): Promise<PickedSession | null>;
16
- //# sourceMappingURL=sessions-picker.d.ts.map