@phnx-labs/agents-cli 0.1.0

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 (486) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/LICENSE +21 -0
  3. package/README.md +537 -0
  4. package/dist/commands/__tests__/sessions.test.d.ts +2 -0
  5. package/dist/commands/__tests__/sessions.test.d.ts.map +1 -0
  6. package/dist/commands/__tests__/sessions.test.js +636 -0
  7. package/dist/commands/__tests__/sessions.test.js.map +1 -0
  8. package/dist/commands/cloud.d.ts +3 -0
  9. package/dist/commands/cloud.d.ts.map +1 -0
  10. package/dist/commands/cloud.js +322 -0
  11. package/dist/commands/cloud.js.map +1 -0
  12. package/dist/commands/commands.d.ts +3 -0
  13. package/dist/commands/commands.d.ts.map +1 -0
  14. package/dist/commands/commands.js +628 -0
  15. package/dist/commands/commands.js.map +1 -0
  16. package/dist/commands/daemon.d.ts +3 -0
  17. package/dist/commands/daemon.d.ts.map +1 -0
  18. package/dist/commands/daemon.js +110 -0
  19. package/dist/commands/daemon.js.map +1 -0
  20. package/dist/commands/drive.d.ts +3 -0
  21. package/dist/commands/drive.d.ts.map +1 -0
  22. package/dist/commands/drive.js +166 -0
  23. package/dist/commands/drive.js.map +1 -0
  24. package/dist/commands/exec.d.ts +3 -0
  25. package/dist/commands/exec.d.ts.map +1 -0
  26. package/dist/commands/exec.js +241 -0
  27. package/dist/commands/exec.js.map +1 -0
  28. package/dist/commands/fork.d.ts +3 -0
  29. package/dist/commands/fork.d.ts.map +1 -0
  30. package/dist/commands/fork.js +139 -0
  31. package/dist/commands/fork.js.map +1 -0
  32. package/dist/commands/hooks.d.ts +3 -0
  33. package/dist/commands/hooks.d.ts.map +1 -0
  34. package/dist/commands/hooks.js +689 -0
  35. package/dist/commands/hooks.js.map +1 -0
  36. package/dist/commands/init.d.ts +6 -0
  37. package/dist/commands/init.d.ts.map +1 -0
  38. package/dist/commands/init.js +127 -0
  39. package/dist/commands/init.js.map +1 -0
  40. package/dist/commands/mcp.d.ts +3 -0
  41. package/dist/commands/mcp.d.ts.map +1 -0
  42. package/dist/commands/mcp.js +581 -0
  43. package/dist/commands/mcp.js.map +1 -0
  44. package/dist/commands/models.d.ts +3 -0
  45. package/dist/commands/models.d.ts.map +1 -0
  46. package/dist/commands/models.js +158 -0
  47. package/dist/commands/models.js.map +1 -0
  48. package/dist/commands/packages.d.ts +3 -0
  49. package/dist/commands/packages.d.ts.map +1 -0
  50. package/dist/commands/packages.js +541 -0
  51. package/dist/commands/packages.js.map +1 -0
  52. package/dist/commands/permissions.d.ts +3 -0
  53. package/dist/commands/permissions.d.ts.map +1 -0
  54. package/dist/commands/permissions.js +723 -0
  55. package/dist/commands/permissions.js.map +1 -0
  56. package/dist/commands/plugins.d.ts +3 -0
  57. package/dist/commands/plugins.d.ts.map +1 -0
  58. package/dist/commands/plugins.js +382 -0
  59. package/dist/commands/plugins.js.map +1 -0
  60. package/dist/commands/profiles.d.ts +3 -0
  61. package/dist/commands/profiles.d.ts.map +1 -0
  62. package/dist/commands/profiles.js +242 -0
  63. package/dist/commands/profiles.js.map +1 -0
  64. package/dist/commands/pty.d.ts +20 -0
  65. package/dist/commands/pty.d.ts.map +1 -0
  66. package/dist/commands/pty.js +389 -0
  67. package/dist/commands/pty.js.map +1 -0
  68. package/dist/commands/pull.d.ts +3 -0
  69. package/dist/commands/pull.d.ts.map +1 -0
  70. package/dist/commands/pull.js +448 -0
  71. package/dist/commands/pull.js.map +1 -0
  72. package/dist/commands/push.d.ts +3 -0
  73. package/dist/commands/push.d.ts.map +1 -0
  74. package/dist/commands/push.js +180 -0
  75. package/dist/commands/push.js.map +1 -0
  76. package/dist/commands/refresh-memory.d.ts +9 -0
  77. package/dist/commands/refresh-memory.d.ts.map +1 -0
  78. package/dist/commands/refresh-memory.js +45 -0
  79. package/dist/commands/refresh-memory.js.map +1 -0
  80. package/dist/commands/resource-view.d.ts +31 -0
  81. package/dist/commands/resource-view.d.ts.map +1 -0
  82. package/dist/commands/resource-view.js +183 -0
  83. package/dist/commands/resource-view.js.map +1 -0
  84. package/dist/commands/routines.d.ts +3 -0
  85. package/dist/commands/routines.d.ts.map +1 -0
  86. package/dist/commands/routines.js +579 -0
  87. package/dist/commands/routines.js.map +1 -0
  88. package/dist/commands/rules.d.ts +3 -0
  89. package/dist/commands/rules.d.ts.map +1 -0
  90. package/dist/commands/rules.js +488 -0
  91. package/dist/commands/rules.js.map +1 -0
  92. package/dist/commands/secrets.d.ts +3 -0
  93. package/dist/commands/secrets.d.ts.map +1 -0
  94. package/dist/commands/secrets.js +339 -0
  95. package/dist/commands/secrets.js.map +1 -0
  96. package/dist/commands/sessions-picker.d.ts +16 -0
  97. package/dist/commands/sessions-picker.d.ts.map +1 -0
  98. package/dist/commands/sessions-picker.js +256 -0
  99. package/dist/commands/sessions-picker.js.map +1 -0
  100. package/dist/commands/sessions.d.ts +16 -0
  101. package/dist/commands/sessions.d.ts.map +1 -0
  102. package/dist/commands/sessions.js +1077 -0
  103. package/dist/commands/sessions.js.map +1 -0
  104. package/dist/commands/skills.d.ts +3 -0
  105. package/dist/commands/skills.d.ts.map +1 -0
  106. package/dist/commands/skills.js +716 -0
  107. package/dist/commands/skills.js.map +1 -0
  108. package/dist/commands/status.d.ts +3 -0
  109. package/dist/commands/status.d.ts.map +1 -0
  110. package/dist/commands/status.js +19 -0
  111. package/dist/commands/status.js.map +1 -0
  112. package/dist/commands/subagents.d.ts +3 -0
  113. package/dist/commands/subagents.d.ts.map +1 -0
  114. package/dist/commands/subagents.js +350 -0
  115. package/dist/commands/subagents.js.map +1 -0
  116. package/dist/commands/sync.d.ts +3 -0
  117. package/dist/commands/sync.d.ts.map +1 -0
  118. package/dist/commands/sync.js +62 -0
  119. package/dist/commands/sync.js.map +1 -0
  120. package/dist/commands/teams-picker.d.ts +14 -0
  121. package/dist/commands/teams-picker.d.ts.map +1 -0
  122. package/dist/commands/teams-picker.js +278 -0
  123. package/dist/commands/teams-picker.js.map +1 -0
  124. package/dist/commands/teams.d.ts +3 -0
  125. package/dist/commands/teams.d.ts.map +1 -0
  126. package/dist/commands/teams.js +917 -0
  127. package/dist/commands/teams.js.map +1 -0
  128. package/dist/commands/utils.d.ts +39 -0
  129. package/dist/commands/utils.d.ts.map +1 -0
  130. package/dist/commands/utils.js +100 -0
  131. package/dist/commands/utils.js.map +1 -0
  132. package/dist/commands/versions.d.ts +3 -0
  133. package/dist/commands/versions.d.ts.map +1 -0
  134. package/dist/commands/versions.js +700 -0
  135. package/dist/commands/versions.js.map +1 -0
  136. package/dist/commands/view.d.ts +8 -0
  137. package/dist/commands/view.d.ts.map +1 -0
  138. package/dist/commands/view.js +626 -0
  139. package/dist/commands/view.js.map +1 -0
  140. package/dist/index.d.ts +3 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +484 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/lib/__tests__/bugfixes.test.d.ts +2 -0
  145. package/dist/lib/__tests__/bugfixes.test.d.ts.map +1 -0
  146. package/dist/lib/__tests__/bugfixes.test.js +192 -0
  147. package/dist/lib/__tests__/bugfixes.test.js.map +1 -0
  148. package/dist/lib/__tests__/exec.test.d.ts +2 -0
  149. package/dist/lib/__tests__/exec.test.d.ts.map +1 -0
  150. package/dist/lib/__tests__/exec.test.js +446 -0
  151. package/dist/lib/__tests__/exec.test.js.map +1 -0
  152. package/dist/lib/__tests__/git-sync.test.d.ts +2 -0
  153. package/dist/lib/__tests__/git-sync.test.d.ts.map +1 -0
  154. package/dist/lib/__tests__/git-sync.test.js +138 -0
  155. package/dist/lib/__tests__/git-sync.test.js.map +1 -0
  156. package/dist/lib/__tests__/hooks.test.d.ts +2 -0
  157. package/dist/lib/__tests__/hooks.test.d.ts.map +1 -0
  158. package/dist/lib/__tests__/hooks.test.js +203 -0
  159. package/dist/lib/__tests__/hooks.test.js.map +1 -0
  160. package/dist/lib/__tests__/memory-compile.test.d.ts +2 -0
  161. package/dist/lib/__tests__/memory-compile.test.d.ts.map +1 -0
  162. package/dist/lib/__tests__/memory-compile.test.js +95 -0
  163. package/dist/lib/__tests__/memory-compile.test.js.map +1 -0
  164. package/dist/lib/__tests__/models.test.d.ts +2 -0
  165. package/dist/lib/__tests__/models.test.d.ts.map +1 -0
  166. package/dist/lib/__tests__/models.test.js +239 -0
  167. package/dist/lib/__tests__/models.test.js.map +1 -0
  168. package/dist/lib/__tests__/rotate.test.d.ts +2 -0
  169. package/dist/lib/__tests__/rotate.test.d.ts.map +1 -0
  170. package/dist/lib/__tests__/rotate.test.js +80 -0
  171. package/dist/lib/__tests__/rotate.test.js.map +1 -0
  172. package/dist/lib/__tests__/secrets-bundles.test.d.ts +2 -0
  173. package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +1 -0
  174. package/dist/lib/__tests__/secrets-bundles.test.js +104 -0
  175. package/dist/lib/__tests__/secrets-bundles.test.js.map +1 -0
  176. package/dist/lib/__tests__/secrets.test.d.ts +2 -0
  177. package/dist/lib/__tests__/secrets.test.d.ts.map +1 -0
  178. package/dist/lib/__tests__/secrets.test.js +90 -0
  179. package/dist/lib/__tests__/secrets.test.js.map +1 -0
  180. package/dist/lib/__tests__/shims.test.d.ts +2 -0
  181. package/dist/lib/__tests__/shims.test.d.ts.map +1 -0
  182. package/dist/lib/__tests__/shims.test.js +39 -0
  183. package/dist/lib/__tests__/shims.test.js.map +1 -0
  184. package/dist/lib/__tests__/usage.test.d.ts +2 -0
  185. package/dist/lib/__tests__/usage.test.d.ts.map +1 -0
  186. package/dist/lib/__tests__/usage.test.js +220 -0
  187. package/dist/lib/__tests__/usage.test.js.map +1 -0
  188. package/dist/lib/__tests__/versions.test.d.ts +2 -0
  189. package/dist/lib/__tests__/versions.test.d.ts.map +1 -0
  190. package/dist/lib/__tests__/versions.test.js +63 -0
  191. package/dist/lib/__tests__/versions.test.js.map +1 -0
  192. package/dist/lib/agents.d.ts +107 -0
  193. package/dist/lib/agents.d.ts.map +1 -0
  194. package/dist/lib/agents.js +1096 -0
  195. package/dist/lib/agents.js.map +1 -0
  196. package/dist/lib/artifact-actions.d.ts +22 -0
  197. package/dist/lib/artifact-actions.d.ts.map +1 -0
  198. package/dist/lib/artifact-actions.js +55 -0
  199. package/dist/lib/artifact-actions.js.map +1 -0
  200. package/dist/lib/cloud/codex.d.ts +19 -0
  201. package/dist/lib/cloud/codex.d.ts.map +1 -0
  202. package/dist/lib/cloud/codex.js +210 -0
  203. package/dist/lib/cloud/codex.js.map +1 -0
  204. package/dist/lib/cloud/factory.d.ts +26 -0
  205. package/dist/lib/cloud/factory.d.ts.map +1 -0
  206. package/dist/lib/cloud/factory.js +37 -0
  207. package/dist/lib/cloud/factory.js.map +1 -0
  208. package/dist/lib/cloud/registry.d.ts +6 -0
  209. package/dist/lib/cloud/registry.d.ts.map +1 -0
  210. package/dist/lib/cloud/registry.js +56 -0
  211. package/dist/lib/cloud/registry.js.map +1 -0
  212. package/dist/lib/cloud/rush.d.ts +15 -0
  213. package/dist/lib/cloud/rush.d.ts.map +1 -0
  214. package/dist/lib/cloud/rush.js +185 -0
  215. package/dist/lib/cloud/rush.js.map +1 -0
  216. package/dist/lib/cloud/store.d.ts +10 -0
  217. package/dist/lib/cloud/store.d.ts.map +1 -0
  218. package/dist/lib/cloud/store.js +96 -0
  219. package/dist/lib/cloud/store.js.map +1 -0
  220. package/dist/lib/cloud/stream.d.ts +18 -0
  221. package/dist/lib/cloud/stream.d.ts.map +1 -0
  222. package/dist/lib/cloud/stream.js +138 -0
  223. package/dist/lib/cloud/stream.js.map +1 -0
  224. package/dist/lib/cloud/types.d.ts +60 -0
  225. package/dist/lib/cloud/types.d.ts.map +1 -0
  226. package/dist/lib/cloud/types.js +2 -0
  227. package/dist/lib/cloud/types.js.map +1 -0
  228. package/dist/lib/commands.d.ts +121 -0
  229. package/dist/lib/commands.d.ts.map +1 -0
  230. package/dist/lib/commands.js +499 -0
  231. package/dist/lib/commands.js.map +1 -0
  232. package/dist/lib/convert.d.ts +11 -0
  233. package/dist/lib/convert.d.ts.map +1 -0
  234. package/dist/lib/convert.js +45 -0
  235. package/dist/lib/convert.js.map +1 -0
  236. package/dist/lib/daemon.d.ts +22 -0
  237. package/dist/lib/daemon.d.ts.map +1 -0
  238. package/dist/lib/daemon.js +311 -0
  239. package/dist/lib/daemon.js.map +1 -0
  240. package/dist/lib/drive-sync.d.ts +28 -0
  241. package/dist/lib/drive-sync.d.ts.map +1 -0
  242. package/dist/lib/drive-sync.js +193 -0
  243. package/dist/lib/drive-sync.js.map +1 -0
  244. package/dist/lib/exec.d.ts +85 -0
  245. package/dist/lib/exec.d.ts.map +1 -0
  246. package/dist/lib/exec.js +423 -0
  247. package/dist/lib/exec.js.map +1 -0
  248. package/dist/lib/factory.d.ts +57 -0
  249. package/dist/lib/factory.d.ts.map +1 -0
  250. package/dist/lib/factory.js +110 -0
  251. package/dist/lib/factory.js.map +1 -0
  252. package/dist/lib/git.d.ts +146 -0
  253. package/dist/lib/git.d.ts.map +1 -0
  254. package/dist/lib/git.js +635 -0
  255. package/dist/lib/git.js.map +1 -0
  256. package/dist/lib/help.d.ts +3 -0
  257. package/dist/lib/help.d.ts.map +1 -0
  258. package/dist/lib/help.js +63 -0
  259. package/dist/lib/help.js.map +1 -0
  260. package/dist/lib/hooks.d.ts +116 -0
  261. package/dist/lib/hooks.d.ts.map +1 -0
  262. package/dist/lib/hooks.js +837 -0
  263. package/dist/lib/hooks.js.map +1 -0
  264. package/dist/lib/manifest.d.ts +8 -0
  265. package/dist/lib/manifest.d.ts.map +1 -0
  266. package/dist/lib/manifest.js +36 -0
  267. package/dist/lib/manifest.js.map +1 -0
  268. package/dist/lib/markdown.d.ts +5 -0
  269. package/dist/lib/markdown.d.ts.map +1 -0
  270. package/dist/lib/markdown.js +11 -0
  271. package/dist/lib/markdown.js.map +1 -0
  272. package/dist/lib/mcp.d.ts +64 -0
  273. package/dist/lib/mcp.d.ts.map +1 -0
  274. package/dist/lib/mcp.js +327 -0
  275. package/dist/lib/mcp.js.map +1 -0
  276. package/dist/lib/memory-compile.d.ts +56 -0
  277. package/dist/lib/memory-compile.d.ts.map +1 -0
  278. package/dist/lib/memory-compile.js +167 -0
  279. package/dist/lib/memory-compile.js.map +1 -0
  280. package/dist/lib/memory.d.ts +56 -0
  281. package/dist/lib/memory.d.ts.map +1 -0
  282. package/dist/lib/memory.js +267 -0
  283. package/dist/lib/memory.js.map +1 -0
  284. package/dist/lib/models.d.ts +91 -0
  285. package/dist/lib/models.d.ts.map +1 -0
  286. package/dist/lib/models.js +706 -0
  287. package/dist/lib/models.js.map +1 -0
  288. package/dist/lib/permissions.d.ts +204 -0
  289. package/dist/lib/permissions.d.ts.map +1 -0
  290. package/dist/lib/permissions.js +1022 -0
  291. package/dist/lib/permissions.js.map +1 -0
  292. package/dist/lib/picker.d.ts +17 -0
  293. package/dist/lib/picker.d.ts.map +1 -0
  294. package/dist/lib/picker.js +95 -0
  295. package/dist/lib/picker.js.map +1 -0
  296. package/dist/lib/plugins.d.ts +73 -0
  297. package/dist/lib/plugins.d.ts.map +1 -0
  298. package/dist/lib/plugins.js +549 -0
  299. package/dist/lib/plugins.js.map +1 -0
  300. package/dist/lib/profiles-keychain.d.ts +3 -0
  301. package/dist/lib/profiles-keychain.d.ts.map +1 -0
  302. package/dist/lib/profiles-keychain.js +10 -0
  303. package/dist/lib/profiles-keychain.js.map +1 -0
  304. package/dist/lib/profiles-presets.d.ts +15 -0
  305. package/dist/lib/profiles-presets.d.ts.map +1 -0
  306. package/dist/lib/profiles-presets.js +95 -0
  307. package/dist/lib/profiles-presets.js.map +1 -0
  308. package/dist/lib/profiles.d.ts +35 -0
  309. package/dist/lib/profiles.d.ts.map +1 -0
  310. package/dist/lib/profiles.js +123 -0
  311. package/dist/lib/profiles.js.map +1 -0
  312. package/dist/lib/pty-client.d.ts +22 -0
  313. package/dist/lib/pty-client.d.ts.map +1 -0
  314. package/dist/lib/pty-client.js +181 -0
  315. package/dist/lib/pty-client.js.map +1 -0
  316. package/dist/lib/pty-server.d.ts +16 -0
  317. package/dist/lib/pty-server.d.ts.map +1 -0
  318. package/dist/lib/pty-server.js +422 -0
  319. package/dist/lib/pty-server.js.map +1 -0
  320. package/dist/lib/registry.d.ts +28 -0
  321. package/dist/lib/registry.d.ts.map +1 -0
  322. package/dist/lib/registry.js +203 -0
  323. package/dist/lib/registry.js.map +1 -0
  324. package/dist/lib/resources.d.ts +50 -0
  325. package/dist/lib/resources.d.ts.map +1 -0
  326. package/dist/lib/resources.js +103 -0
  327. package/dist/lib/resources.js.map +1 -0
  328. package/dist/lib/rotate.d.ts +52 -0
  329. package/dist/lib/rotate.d.ts.map +1 -0
  330. package/dist/lib/rotate.js +87 -0
  331. package/dist/lib/rotate.js.map +1 -0
  332. package/dist/lib/routines.d.ts +70 -0
  333. package/dist/lib/routines.d.ts.map +1 -0
  334. package/dist/lib/routines.js +325 -0
  335. package/dist/lib/routines.js.map +1 -0
  336. package/dist/lib/runner.d.ts +12 -0
  337. package/dist/lib/runner.d.ts.map +1 -0
  338. package/dist/lib/runner.js +311 -0
  339. package/dist/lib/runner.js.map +1 -0
  340. package/dist/lib/sandbox.d.ts +10 -0
  341. package/dist/lib/sandbox.d.ts.map +1 -0
  342. package/dist/lib/sandbox.js +201 -0
  343. package/dist/lib/sandbox.js.map +1 -0
  344. package/dist/lib/scheduler.d.ts +18 -0
  345. package/dist/lib/scheduler.d.ts.map +1 -0
  346. package/dist/lib/scheduler.js +69 -0
  347. package/dist/lib/scheduler.js.map +1 -0
  348. package/dist/lib/secrets-bundles.d.ts +29 -0
  349. package/dist/lib/secrets-bundles.d.ts.map +1 -0
  350. package/dist/lib/secrets-bundles.js +168 -0
  351. package/dist/lib/secrets-bundles.js.map +1 -0
  352. package/dist/lib/secrets.d.ts +27 -0
  353. package/dist/lib/secrets.d.ts.map +1 -0
  354. package/dist/lib/secrets.js +127 -0
  355. package/dist/lib/secrets.js.map +1 -0
  356. package/dist/lib/session/__tests__/db.test.d.ts +2 -0
  357. package/dist/lib/session/__tests__/db.test.d.ts.map +1 -0
  358. package/dist/lib/session/__tests__/db.test.js +54 -0
  359. package/dist/lib/session/__tests__/db.test.js.map +1 -0
  360. package/dist/lib/session/__tests__/discover.test.d.ts +2 -0
  361. package/dist/lib/session/__tests__/discover.test.d.ts.map +1 -0
  362. package/dist/lib/session/__tests__/discover.test.js +63 -0
  363. package/dist/lib/session/__tests__/discover.test.js.map +1 -0
  364. package/dist/lib/session/__tests__/prompt.test.d.ts +2 -0
  365. package/dist/lib/session/__tests__/prompt.test.d.ts.map +1 -0
  366. package/dist/lib/session/__tests__/prompt.test.js +44 -0
  367. package/dist/lib/session/__tests__/prompt.test.js.map +1 -0
  368. package/dist/lib/session/__tests__/render.test.d.ts +2 -0
  369. package/dist/lib/session/__tests__/render.test.d.ts.map +1 -0
  370. package/dist/lib/session/__tests__/render.test.js +602 -0
  371. package/dist/lib/session/__tests__/render.test.js.map +1 -0
  372. package/dist/lib/session/artifacts.d.ts +5 -0
  373. package/dist/lib/session/artifacts.d.ts.map +1 -0
  374. package/dist/lib/session/artifacts.js +75 -0
  375. package/dist/lib/session/artifacts.js.map +1 -0
  376. package/dist/lib/session/db.d.ts +118 -0
  377. package/dist/lib/session/db.d.ts.map +1 -0
  378. package/dist/lib/session/db.js +576 -0
  379. package/dist/lib/session/db.js.map +1 -0
  380. package/dist/lib/session/discover.d.ts +60 -0
  381. package/dist/lib/session/discover.d.ts.map +1 -0
  382. package/dist/lib/session/discover.js +1272 -0
  383. package/dist/lib/session/discover.js.map +1 -0
  384. package/dist/lib/session/parse.d.ts +23 -0
  385. package/dist/lib/session/parse.d.ts.map +1 -0
  386. package/dist/lib/session/parse.js +650 -0
  387. package/dist/lib/session/parse.js.map +1 -0
  388. package/dist/lib/session/prompt.d.ts +4 -0
  389. package/dist/lib/session/prompt.d.ts.map +1 -0
  390. package/dist/lib/session/prompt.js +64 -0
  391. package/dist/lib/session/prompt.js.map +1 -0
  392. package/dist/lib/session/prompt.test.d.ts +2 -0
  393. package/dist/lib/session/prompt.test.d.ts.map +1 -0
  394. package/dist/lib/session/prompt.test.js +57 -0
  395. package/dist/lib/session/prompt.test.js.map +1 -0
  396. package/dist/lib/session/render.d.ts +90 -0
  397. package/dist/lib/session/render.d.ts.map +1 -0
  398. package/dist/lib/session/render.js +778 -0
  399. package/dist/lib/session/render.js.map +1 -0
  400. package/dist/lib/session/team-filter.d.ts +26 -0
  401. package/dist/lib/session/team-filter.d.ts.map +1 -0
  402. package/dist/lib/session/team-filter.js +66 -0
  403. package/dist/lib/session/team-filter.js.map +1 -0
  404. package/dist/lib/session/team-filter.test.d.ts +2 -0
  405. package/dist/lib/session/team-filter.test.d.ts.map +1 -0
  406. package/dist/lib/session/team-filter.test.js +157 -0
  407. package/dist/lib/session/team-filter.test.js.map +1 -0
  408. package/dist/lib/session/types.d.ts +69 -0
  409. package/dist/lib/session/types.d.ts.map +1 -0
  410. package/dist/lib/session/types.js +2 -0
  411. package/dist/lib/session/types.js.map +1 -0
  412. package/dist/lib/shims.d.ts +228 -0
  413. package/dist/lib/shims.d.ts.map +1 -0
  414. package/dist/lib/shims.js +1170 -0
  415. package/dist/lib/shims.js.map +1 -0
  416. package/dist/lib/skills.d.ts +134 -0
  417. package/dist/lib/skills.d.ts.map +1 -0
  418. package/dist/lib/skills.js +783 -0
  419. package/dist/lib/skills.js.map +1 -0
  420. package/dist/lib/state.d.ts +53 -0
  421. package/dist/lib/state.d.ts.map +1 -0
  422. package/dist/lib/state.js +299 -0
  423. package/dist/lib/state.js.map +1 -0
  424. package/dist/lib/subagents.d.ts +75 -0
  425. package/dist/lib/subagents.d.ts.map +1 -0
  426. package/dist/lib/subagents.js +402 -0
  427. package/dist/lib/subagents.js.map +1 -0
  428. package/dist/lib/teams/agents.d.ts +146 -0
  429. package/dist/lib/teams/agents.d.ts.map +1 -0
  430. package/dist/lib/teams/agents.js +1072 -0
  431. package/dist/lib/teams/agents.js.map +1 -0
  432. package/dist/lib/teams/api.d.ts +77 -0
  433. package/dist/lib/teams/api.d.ts.map +1 -0
  434. package/dist/lib/teams/api.js +229 -0
  435. package/dist/lib/teams/api.js.map +1 -0
  436. package/dist/lib/teams/cloud.d.ts +11 -0
  437. package/dist/lib/teams/cloud.d.ts.map +1 -0
  438. package/dist/lib/teams/cloud.js +169 -0
  439. package/dist/lib/teams/cloud.js.map +1 -0
  440. package/dist/lib/teams/debug.d.ts +2 -0
  441. package/dist/lib/teams/debug.d.ts.map +1 -0
  442. package/dist/lib/teams/debug.js +6 -0
  443. package/dist/lib/teams/debug.js.map +1 -0
  444. package/dist/lib/teams/file_ops.d.ts +6 -0
  445. package/dist/lib/teams/file_ops.d.ts.map +1 -0
  446. package/dist/lib/teams/file_ops.js +59 -0
  447. package/dist/lib/teams/file_ops.js.map +1 -0
  448. package/dist/lib/teams/parsers.d.ts +5 -0
  449. package/dist/lib/teams/parsers.d.ts.map +1 -0
  450. package/dist/lib/teams/parsers.js +826 -0
  451. package/dist/lib/teams/parsers.js.map +1 -0
  452. package/dist/lib/teams/persistence.d.ts +28 -0
  453. package/dist/lib/teams/persistence.d.ts.map +1 -0
  454. package/dist/lib/teams/persistence.js +289 -0
  455. package/dist/lib/teams/persistence.js.map +1 -0
  456. package/dist/lib/teams/ralph.d.ts +8 -0
  457. package/dist/lib/teams/ralph.d.ts.map +1 -0
  458. package/dist/lib/teams/ralph.js +59 -0
  459. package/dist/lib/teams/ralph.js.map +1 -0
  460. package/dist/lib/teams/registry.d.ts +11 -0
  461. package/dist/lib/teams/registry.d.ts.map +1 -0
  462. package/dist/lib/teams/registry.js +56 -0
  463. package/dist/lib/teams/registry.js.map +1 -0
  464. package/dist/lib/teams/summarizer.d.ts +58 -0
  465. package/dist/lib/teams/summarizer.d.ts.map +1 -0
  466. package/dist/lib/teams/summarizer.js +766 -0
  467. package/dist/lib/teams/summarizer.js.map +1 -0
  468. package/dist/lib/template.d.ts +24 -0
  469. package/dist/lib/template.d.ts.map +1 -0
  470. package/dist/lib/template.js +57 -0
  471. package/dist/lib/template.js.map +1 -0
  472. package/dist/lib/types.d.ts +282 -0
  473. package/dist/lib/types.d.ts.map +1 -0
  474. package/dist/lib/types.js +18 -0
  475. package/dist/lib/types.js.map +1 -0
  476. package/dist/lib/usage.d.ts +73 -0
  477. package/dist/lib/usage.d.ts.map +1 -0
  478. package/dist/lib/usage.js +623 -0
  479. package/dist/lib/usage.js.map +1 -0
  480. package/dist/lib/versions.d.ts +248 -0
  481. package/dist/lib/versions.d.ts.map +1 -0
  482. package/dist/lib/versions.js +1737 -0
  483. package/dist/lib/versions.js.map +1 -0
  484. package/package.json +82 -0
  485. package/scripts/postinstall.js +72 -0
  486. package/scripts/rebuild-sqlite.sh +46 -0
@@ -0,0 +1,723 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import * as fs from 'fs';
4
+ import * as os from 'os';
5
+ import * as path from 'path';
6
+ import { confirm, checkbox } from '@inquirer/prompts';
7
+ import { AGENTS, resolveAgentName, formatAgentError, agentLabel, } from '../lib/agents.js';
8
+ import { cloneRepo } from '../lib/git.js';
9
+ import { PERMISSIONS_CAPABLE_AGENTS, listInstalledPermissions, discoverPermissionsFromRepo, installPermissionSet, removePermissionSet, applyPermissionsToVersion, readAgentPermissions, exportPermissionsFromPath, getDefaultPermissionSet, computePermissionsDiff, mergePermissionSets, saveDefaultPermissionSet, } from '../lib/permissions.js';
10
+ import { listInstalledVersions, getGlobalDefault, getVersionHomePath, promptAgentVersionSelection, resolveAgentVersionTargets, } from '../lib/versions.js';
11
+ import { recordVersionResources } from '../lib/state.js';
12
+ import { isPromptCancelled, isInteractiveTerminal, parseCommaSeparatedList, printWithPager, requireInteractiveSelection, } from './utils.js';
13
+ export function registerPermissionsCommands(program) {
14
+ const permissionsCmd = program
15
+ .command('permissions')
16
+ .description('Control what agents can access with allow/deny rules for bash, tools, and filesystem')
17
+ .addHelpText('after', `
18
+ Permissions define the boundary of what an agent can touch. Rules are organized into named sets stored in ~/.agents/permissions/ as YAML files. Apply sets to specific agent versions to reduce permission prompts or lock down behavior.
19
+
20
+ Examples:
21
+ # List permission sets in central storage
22
+ agents permissions list
23
+
24
+ # Check active permissions for an agent
25
+ agents permissions list claude@2.1.112
26
+
27
+ # Import permissions from an existing agent config
28
+ agents permissions add ~/.claude/settings.json --agents claude
29
+
30
+ # Install a permission set from GitHub
31
+ agents permissions add gh:team/permissions --agents codex,claude
32
+
33
+ # Apply a stored set to multiple versions
34
+ agents permissions add --names default --agents claude@2.1.112,codex@0.116.0
35
+
36
+ When to use:
37
+ - Reducing prompts: extract your allow list with 'agents permissions add ~/.claude/settings.json'
38
+ - Team sync: share permission sets via 'agents permissions add gh:team/perms'
39
+ - Version isolation: apply stricter permissions to experimental versions
40
+ `);
41
+ permissionsCmd
42
+ .command('list [agent]')
43
+ .description('Show permission sets in storage or active permissions for an agent version')
44
+ .option('-s, --scope <scope>', 'user (global) or project (repo-specific)', 'user')
45
+ .action(async (agentArg, options) => {
46
+ const cwd = process.cwd();
47
+ // Helper to render permissions for a specific version
48
+ const renderVersionPermissions = (agentId, version, isDefault, home, scope) => {
49
+ const agent = AGENTS[agentId];
50
+ const defaultLabel = isDefault ? ' default' : '';
51
+ const versionStr = chalk.gray(` (${version}${defaultLabel})`);
52
+ const perms = readAgentPermissions(agentId, scope, cwd, { home });
53
+ if (!perms) {
54
+ console.log(` ${chalk.bold(agentLabel(agent.id))}${versionStr}: ${chalk.gray('none')}`);
55
+ console.log();
56
+ return;
57
+ }
58
+ console.log(` ${chalk.bold(agentLabel(agent.id))}${versionStr}:`);
59
+ if (agentId === 'claude') {
60
+ const claudePerms = perms;
61
+ if (claudePerms.permissions.allow.length > 0) {
62
+ console.log(chalk.green(' Allow:'));
63
+ for (const p of claudePerms.permissions.allow) {
64
+ console.log(` ${chalk.cyan(p)}`);
65
+ }
66
+ }
67
+ if (claudePerms.permissions.deny.length > 0) {
68
+ console.log(chalk.red(' Deny:'));
69
+ for (const p of claudePerms.permissions.deny) {
70
+ console.log(` ${chalk.yellow(p)}`);
71
+ }
72
+ }
73
+ }
74
+ else if (agentId === 'opencode') {
75
+ const ocPerms = perms;
76
+ console.log(chalk.gray(' Bash commands:'));
77
+ for (const [pattern, action] of Object.entries(ocPerms.permission.bash)) {
78
+ const color = action === 'allow' ? chalk.green : action === 'deny' ? chalk.red : chalk.yellow;
79
+ console.log(` ${chalk.cyan(pattern)}: ${color(action)}`);
80
+ }
81
+ }
82
+ else if (agentId === 'codex') {
83
+ const codexPerms = perms;
84
+ if (codexPerms.approval_policy) {
85
+ console.log(` ${chalk.gray('approval_policy:')} ${chalk.cyan(codexPerms.approval_policy)}`);
86
+ }
87
+ if (codexPerms.sandbox_mode) {
88
+ console.log(` ${chalk.gray('sandbox_mode:')} ${chalk.cyan(codexPerms.sandbox_mode)}`);
89
+ }
90
+ if (codexPerms.sandbox_workspace_write) {
91
+ const sw = codexPerms.sandbox_workspace_write;
92
+ if (sw.network_access !== undefined) {
93
+ console.log(` ${chalk.gray('network_access:')} ${chalk.cyan(String(sw.network_access))}`);
94
+ }
95
+ if (sw.writable_roots && sw.writable_roots.length > 0) {
96
+ console.log(` ${chalk.gray('writable_roots:')}`);
97
+ for (const r of sw.writable_roots) {
98
+ console.log(` ${chalk.cyan(r)}`);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ console.log();
104
+ };
105
+ if (agentArg) {
106
+ // Parse agent@version syntax
107
+ const parts = agentArg.split('@');
108
+ const agentName = parts[0];
109
+ const requestedVersion = parts[1] || null;
110
+ const agentId = resolveAgentName(agentName);
111
+ if (!agentId) {
112
+ console.log(chalk.red(formatAgentError(agentName, PERMISSIONS_CAPABLE_AGENTS)));
113
+ process.exit(1);
114
+ }
115
+ if (!PERMISSIONS_CAPABLE_AGENTS.includes(agentId)) {
116
+ console.log(chalk.yellow(`${AGENTS[agentId].name} does not support fine-grained permissions`));
117
+ return;
118
+ }
119
+ const agent = AGENTS[agentId];
120
+ const installedVersions = listInstalledVersions(agentId);
121
+ const defaultVer = getGlobalDefault(agentId);
122
+ console.log(chalk.bold(`Installed Permissions for ${agentLabel(agent.id)} (${options.scope}):\n`));
123
+ if (installedVersions.length === 0) {
124
+ // Not version-managed - use default home
125
+ const perms = readAgentPermissions(agentId, options.scope, cwd);
126
+ if (!perms) {
127
+ console.log(chalk.gray(` No permissions configured`));
128
+ return;
129
+ }
130
+ console.log(` ${chalk.bold(agentLabel(agent.id))}:`);
131
+ if (agentId === 'claude') {
132
+ const claudePerms = perms;
133
+ if (claudePerms.permissions.allow.length > 0) {
134
+ console.log(chalk.green(' Allow:'));
135
+ for (const p of claudePerms.permissions.allow) {
136
+ console.log(` ${chalk.cyan(p)}`);
137
+ }
138
+ }
139
+ if (claudePerms.permissions.deny.length > 0) {
140
+ console.log(chalk.red(' Deny:'));
141
+ for (const p of claudePerms.permissions.deny) {
142
+ console.log(` ${chalk.yellow(p)}`);
143
+ }
144
+ }
145
+ }
146
+ return;
147
+ }
148
+ // Version-managed: determine which versions to show
149
+ let versionsToShow;
150
+ if (requestedVersion === 'default') {
151
+ if (!defaultVer) {
152
+ console.log(chalk.yellow(` No default version set for ${agentLabel(agent.id)}. Run: agents use ${agentId}@<version>`));
153
+ return;
154
+ }
155
+ versionsToShow = [defaultVer];
156
+ }
157
+ else if (requestedVersion) {
158
+ if (!installedVersions.includes(requestedVersion)) {
159
+ console.log(chalk.red(` Version ${requestedVersion} not installed for ${agentLabel(agent.id)}.`));
160
+ console.log(chalk.gray(` Installed versions: ${installedVersions.join(', ')}`));
161
+ return;
162
+ }
163
+ versionsToShow = [requestedVersion];
164
+ }
165
+ else {
166
+ // Show all versions, default first
167
+ versionsToShow = [...installedVersions].sort((a, b) => {
168
+ if (a === defaultVer)
169
+ return -1;
170
+ if (b === defaultVer)
171
+ return 1;
172
+ return 0;
173
+ });
174
+ }
175
+ for (const version of versionsToShow) {
176
+ const home = getVersionHomePath(agentId, version);
177
+ renderVersionPermissions(agentId, version, version === defaultVer, home, options.scope);
178
+ }
179
+ }
180
+ else {
181
+ // List central permission sets
182
+ const sets = listInstalledPermissions();
183
+ if (sets.length === 0) {
184
+ console.log(chalk.gray('No permission sets installed.'));
185
+ console.log(chalk.gray('Use `agents permissions add <source>` to add permission sets.'));
186
+ return;
187
+ }
188
+ console.log(chalk.bold('Installed Permission Sets:\n'));
189
+ for (const perm of sets) {
190
+ const desc = perm.set.description ? ` - ${chalk.gray(perm.set.description)}` : '';
191
+ console.log(` ${chalk.cyan(perm.name)}${desc}`);
192
+ console.log(` ${chalk.gray(`${perm.set.allow.length} allow, ${perm.set.deny?.length || 0} deny rules`)}`);
193
+ }
194
+ }
195
+ });
196
+ permissionsCmd
197
+ .command('add [source]')
198
+ .description('Import permissions from an agent config, YAML, or GitHub, then apply to versions')
199
+ .option('-a, --agents <list>', 'Targets: claude, codex@0.116.0, or gemini@default')
200
+ .option('--names <list>', 'Permission set names from ~/.agents/permissions/ (comma-separated)')
201
+ .option('--all', 'Apply to all installed versions instead of just defaults')
202
+ .option('--replace', 'Replace managed permission block instead of merging (drops rules no longer in the set)')
203
+ .option('-y, --yes', 'Skip all prompts and confirmations')
204
+ .addHelpText('after', `
205
+ Examples:
206
+ # Import from an existing agent config (merges into default.yml)
207
+ agents permissions add ~/.claude/settings.json --agents claude
208
+
209
+ # Install permission YAML from GitHub
210
+ agents permissions add gh:team/permissions --agents codex,claude
211
+
212
+ # Apply a stored set to specific versions
213
+ agents permissions add --names default --agents claude@2.1.112,codex@0.116.0
214
+
215
+ # Apply to all installed versions non-interactively
216
+ agents permissions add --names default --all --yes
217
+
218
+ # Replace (don't merge) — drop rules no longer in the central set
219
+ agents permissions add --names default --agents claude@default --replace --yes
220
+ `)
221
+ .action(async (source, options) => {
222
+ try {
223
+ const skipPrompts = options.yes || !isInteractiveTerminal();
224
+ // Interactive mode: pick from central storage
225
+ if (!source) {
226
+ const installedSets = listInstalledPermissions();
227
+ if (installedSets.length === 0) {
228
+ console.log(chalk.yellow('No permission sets in ~/.agents/permissions/'));
229
+ console.log(chalk.gray('\nTo add permissions from a file or repo:'));
230
+ console.log(chalk.cyan(' agents permissions add ~/.claude/settings.json'));
231
+ console.log(chalk.cyan(' agents permissions add gh:user/repo'));
232
+ return;
233
+ }
234
+ const availableSetNames = installedSets.map((set) => set.name);
235
+ const requestedNames = parseCommaSeparatedList(options.names);
236
+ let selectedNames;
237
+ if (requestedNames.length > 0) {
238
+ const missing = requestedNames.filter((name) => !availableSetNames.includes(name));
239
+ if (missing.length > 0) {
240
+ console.log(chalk.red(`Unknown permission set(s): ${missing.join(', ')}`));
241
+ console.log(chalk.gray(`Available: ${availableSetNames.join(', ')}`));
242
+ process.exit(1);
243
+ }
244
+ selectedNames = requestedNames;
245
+ }
246
+ else {
247
+ if (!isInteractiveTerminal()) {
248
+ requireInteractiveSelection('Selecting permission sets from ~/.agents/permissions/', [
249
+ 'agents permissions add --names default --agents codex',
250
+ 'agents permissions add ./permissions/default.yml --agents codex',
251
+ ]);
252
+ }
253
+ const choices = installedSets.map((installed) => ({
254
+ value: installed.name,
255
+ name: installed.set.description
256
+ ? `${installed.name} ${chalk.gray(installed.set.description.slice(0, 40))}`
257
+ : `${installed.name} ${chalk.gray(`${installed.set.allow.length} allow, ${installed.set.deny?.length || 0} deny`)}`,
258
+ }));
259
+ const selected = await checkbox({
260
+ message: 'Select permission sets to apply',
261
+ choices: [
262
+ { value: '__all__', name: chalk.bold('Select All') },
263
+ ...choices,
264
+ ],
265
+ });
266
+ if (selected.length === 0) {
267
+ console.log(chalk.gray('No permission sets selected.'));
268
+ return;
269
+ }
270
+ selectedNames = selected.includes('__all__')
271
+ ? availableSetNames
272
+ : selected.filter((s) => s !== '__all__');
273
+ }
274
+ let selectedAgents;
275
+ let versionSelections;
276
+ if (options.agents) {
277
+ const result = resolveAgentVersionTargets(options.agents, PERMISSIONS_CAPABLE_AGENTS, {
278
+ allVersions: options.all,
279
+ });
280
+ selectedAgents = result.selectedAgents;
281
+ versionSelections = result.versionSelections;
282
+ }
283
+ else if (options.all) {
284
+ selectedAgents = [...PERMISSIONS_CAPABLE_AGENTS];
285
+ versionSelections = new Map();
286
+ for (const agentId of selectedAgents) {
287
+ const versions = listInstalledVersions(agentId);
288
+ if (versions.length > 0) {
289
+ versionSelections.set(agentId, [...versions]);
290
+ }
291
+ }
292
+ }
293
+ else {
294
+ const result = await promptAgentVersionSelection(PERMISSIONS_CAPABLE_AGENTS, { skipPrompts });
295
+ selectedAgents = result.selectedAgents;
296
+ versionSelections = result.versionSelections;
297
+ }
298
+ if (selectedAgents.length === 0) {
299
+ console.log(chalk.yellow('\nNo agents selected.'));
300
+ return;
301
+ }
302
+ // Apply selected permission sets
303
+ let applied = 0;
304
+ for (const setName of selectedNames) {
305
+ const installed = installedSets.find((s) => s.name === setName);
306
+ if (!installed)
307
+ continue;
308
+ for (const [agentId, versions] of versionSelections) {
309
+ for (const version of versions) {
310
+ const versionHome = getVersionHomePath(agentId, version);
311
+ const applyResult = applyPermissionsToVersion(agentId, installed.set, versionHome, !options.replace);
312
+ if (applyResult.success) {
313
+ console.log(chalk.green(` Applied ${setName} to ${agentLabel(agentId)}@${version}`));
314
+ recordVersionResources(agentId, version, 'permissions', [setName]);
315
+ applied++;
316
+ }
317
+ else {
318
+ console.log(chalk.red(` Failed: ${agentLabel(agentId)}@${version}: ${applyResult.error}`));
319
+ }
320
+ }
321
+ }
322
+ }
323
+ console.log(chalk.green(`\nApplied permissions to ${applied} version(s).`));
324
+ return;
325
+ }
326
+ const spinner = ora('Fetching permissions...').start();
327
+ const isGitRepo = source.startsWith('gh:') || source.startsWith('git:') ||
328
+ source.startsWith('ssh:') || source.startsWith('https://') ||
329
+ source.startsWith('http://');
330
+ let localPath;
331
+ if (isGitRepo) {
332
+ const result = await cloneRepo(source);
333
+ localPath = result.localPath;
334
+ spinner.succeed('Repository cloned');
335
+ }
336
+ else {
337
+ localPath = source.startsWith('~')
338
+ ? path.join(os.homedir(), source.slice(1))
339
+ : path.resolve(source);
340
+ if (!fs.existsSync(localPath)) {
341
+ spinner.fail(`Path not found: ${localPath}`);
342
+ return;
343
+ }
344
+ spinner.succeed('Using local path');
345
+ }
346
+ // Check if this is an agent config file
347
+ const isAgentConfig = localPath.endsWith('.json') || localPath.endsWith('.jsonc') || localPath.endsWith('.toml');
348
+ const looksLikeAgentConfig = localPath.includes('.claude') || localPath.includes('.opencode') || localPath.includes('.codex');
349
+ if (isAgentConfig && looksLikeAgentConfig) {
350
+ // Handle agent config file - convert, diff, merge into default set
351
+ const incoming = exportPermissionsFromPath(localPath);
352
+ if (!incoming || (incoming.allow.length === 0 && (!incoming.deny || incoming.deny.length === 0))) {
353
+ console.log(chalk.yellow(`\nNo permissions found in ${localPath}`));
354
+ return;
355
+ }
356
+ // Get existing default permission set
357
+ const existing = getDefaultPermissionSet();
358
+ // Compute diff
359
+ const diff = computePermissionsDiff(existing, incoming);
360
+ const totalNew = diff.allow.added.length + diff.deny.added.length;
361
+ const totalExisting = diff.allow.existing.length + diff.deny.existing.length;
362
+ if (totalNew === 0) {
363
+ console.log(chalk.gray('\nAll permissions already exist in central storage.'));
364
+ return;
365
+ }
366
+ // Show diff
367
+ console.log(chalk.bold('\nPermissions to add:\n'));
368
+ if (diff.allow.added.length > 0) {
369
+ console.log(chalk.green(' New allow rules:'));
370
+ for (const rule of diff.allow.added.slice(0, 20)) {
371
+ console.log(chalk.green(` + ${rule}`));
372
+ }
373
+ if (diff.allow.added.length > 20) {
374
+ console.log(chalk.green(` ... and ${diff.allow.added.length - 20} more`));
375
+ }
376
+ }
377
+ if (diff.deny.added.length > 0) {
378
+ console.log(chalk.red('\n New deny rules:'));
379
+ for (const rule of diff.deny.added) {
380
+ console.log(chalk.red(` + ${rule}`));
381
+ }
382
+ }
383
+ if (totalExisting > 0) {
384
+ console.log(chalk.gray(`\n (${totalExisting} rules already exist, will be skipped)`));
385
+ }
386
+ console.log();
387
+ // Confirm
388
+ if (!skipPrompts) {
389
+ const proceed = await confirm({
390
+ message: `Add ${totalNew} new permission rule${totalNew === 1 ? '' : 's'}?`,
391
+ default: true,
392
+ });
393
+ if (!proceed) {
394
+ console.log(chalk.gray('Cancelled.'));
395
+ return;
396
+ }
397
+ }
398
+ // Merge and save
399
+ const merged = mergePermissionSets(existing, incoming);
400
+ const result = saveDefaultPermissionSet(merged);
401
+ if (!result.success) {
402
+ console.log(chalk.red(`Failed to save: ${result.error}`));
403
+ return;
404
+ }
405
+ console.log(chalk.green(`Added ${totalNew} permission${totalNew === 1 ? '' : 's'} to ~/.agents/permissions/default.yml`));
406
+ // Apply to agent versions
407
+ let selectedAgents;
408
+ let versionSelections;
409
+ if (options.agents) {
410
+ const result = resolveAgentVersionTargets(options.agents, PERMISSIONS_CAPABLE_AGENTS, {
411
+ allVersions: options.all,
412
+ });
413
+ selectedAgents = result.selectedAgents;
414
+ versionSelections = result.versionSelections;
415
+ }
416
+ else if (options.all) {
417
+ selectedAgents = [...PERMISSIONS_CAPABLE_AGENTS];
418
+ versionSelections = new Map();
419
+ for (const agentId of selectedAgents) {
420
+ const versions = listInstalledVersions(agentId);
421
+ if (versions.length > 0) {
422
+ versionSelections.set(agentId, [...versions]);
423
+ }
424
+ }
425
+ }
426
+ else if (!skipPrompts) {
427
+ const applyNow = await confirm({
428
+ message: 'Apply permissions to agent versions now?',
429
+ default: true,
430
+ });
431
+ if (applyNow) {
432
+ const result = await promptAgentVersionSelection(PERMISSIONS_CAPABLE_AGENTS, { skipPrompts: false });
433
+ selectedAgents = result.selectedAgents;
434
+ versionSelections = result.versionSelections;
435
+ }
436
+ else {
437
+ selectedAgents = [];
438
+ versionSelections = new Map();
439
+ }
440
+ }
441
+ else {
442
+ selectedAgents = [];
443
+ versionSelections = new Map();
444
+ }
445
+ if (selectedAgents.length > 0) {
446
+ let applied = 0;
447
+ for (const [agentId, versions] of versionSelections) {
448
+ for (const version of versions) {
449
+ const versionHome = getVersionHomePath(agentId, version);
450
+ const applyResult = applyPermissionsToVersion(agentId, merged, versionHome, !options.replace);
451
+ if (applyResult.success) {
452
+ console.log(chalk.green(` Applied to ${agentLabel(agentId)}@${version}`));
453
+ recordVersionResources(agentId, version, 'permissions', [merged.name || 'default']);
454
+ applied++;
455
+ }
456
+ else {
457
+ console.log(chalk.red(` Failed: ${agentLabel(agentId)}@${version}: ${applyResult.error}`));
458
+ }
459
+ }
460
+ }
461
+ console.log(chalk.gray(`\nApplied permissions to ${applied} version(s).`));
462
+ }
463
+ }
464
+ else {
465
+ // Handle permission YAML files or repo
466
+ let permissions;
467
+ if (localPath.endsWith('.yml') || localPath.endsWith('.yaml')) {
468
+ const { parsePermissionSet } = await import('../lib/permissions.js');
469
+ const set = parsePermissionSet(localPath);
470
+ if (set) {
471
+ permissions = [{ name: set.name, path: localPath, set }];
472
+ }
473
+ else {
474
+ console.log(chalk.red('Invalid permission file'));
475
+ return;
476
+ }
477
+ }
478
+ else {
479
+ permissions = discoverPermissionsFromRepo(localPath);
480
+ }
481
+ if (permissions.length === 0) {
482
+ console.log(chalk.yellow('\nNo permission sets found'));
483
+ return;
484
+ }
485
+ console.log(chalk.bold(`\nFound ${permissions.length} permission set(s):`));
486
+ for (const perm of permissions) {
487
+ const desc = perm.set.description ? ` - ${perm.set.description}` : '';
488
+ console.log(` ${chalk.cyan(perm.name)}${desc}`);
489
+ console.log(` ${chalk.gray(`${perm.set.allow.length} allow, ${perm.set.deny?.length || 0} deny rules`)}`);
490
+ }
491
+ // Confirm installation
492
+ if (!skipPrompts) {
493
+ const proceed = await confirm({
494
+ message: 'Install these permission sets?',
495
+ default: true,
496
+ });
497
+ if (!proceed) {
498
+ console.log(chalk.gray('Cancelled.'));
499
+ return;
500
+ }
501
+ }
502
+ const installSpinner = ora('Installing permission sets...').start();
503
+ let installed = 0;
504
+ for (const perm of permissions) {
505
+ const result = installPermissionSet(perm.path, perm.name);
506
+ if (result.success) {
507
+ installed++;
508
+ }
509
+ else {
510
+ installSpinner.stop();
511
+ console.log(chalk.red(` Failed to install ${perm.name}: ${result.error}`));
512
+ installSpinner.start();
513
+ }
514
+ }
515
+ installSpinner.succeed(`Installed ${installed} permission set(s) to ~/.agents/permissions/`);
516
+ // Apply to agent versions
517
+ let selectedAgents;
518
+ let versionSelections;
519
+ if (options.agents) {
520
+ const result = resolveAgentVersionTargets(options.agents, PERMISSIONS_CAPABLE_AGENTS, {
521
+ allVersions: options.all,
522
+ });
523
+ selectedAgents = result.selectedAgents;
524
+ versionSelections = result.versionSelections;
525
+ }
526
+ else if (options.all) {
527
+ selectedAgents = [...PERMISSIONS_CAPABLE_AGENTS];
528
+ versionSelections = new Map();
529
+ for (const agentId of selectedAgents) {
530
+ const versions = listInstalledVersions(agentId);
531
+ if (versions.length > 0) {
532
+ versionSelections.set(agentId, [...versions]);
533
+ }
534
+ }
535
+ }
536
+ else if (!skipPrompts) {
537
+ const applyNow = await confirm({
538
+ message: 'Apply these permissions to agent versions now?',
539
+ default: true,
540
+ });
541
+ if (applyNow) {
542
+ const result = await promptAgentVersionSelection(PERMISSIONS_CAPABLE_AGENTS, { skipPrompts: false });
543
+ selectedAgents = result.selectedAgents;
544
+ versionSelections = result.versionSelections;
545
+ }
546
+ else {
547
+ selectedAgents = [];
548
+ versionSelections = new Map();
549
+ }
550
+ }
551
+ else {
552
+ selectedAgents = [];
553
+ versionSelections = new Map();
554
+ }
555
+ if (selectedAgents.length > 0) {
556
+ let applied = 0;
557
+ for (const perm of permissions) {
558
+ for (const [agentId, versions] of versionSelections) {
559
+ for (const version of versions) {
560
+ const versionHome = getVersionHomePath(agentId, version);
561
+ const applyResult = applyPermissionsToVersion(agentId, perm.set, versionHome, !options.replace);
562
+ if (applyResult.success) {
563
+ console.log(chalk.green(` Applied ${perm.name} to ${agentLabel(agentId)}@${version}`));
564
+ recordVersionResources(agentId, version, 'permissions', [perm.name]);
565
+ applied++;
566
+ }
567
+ else {
568
+ console.log(chalk.red(` Failed: ${agentLabel(agentId)}@${version}: ${applyResult.error}`));
569
+ }
570
+ }
571
+ }
572
+ }
573
+ console.log(chalk.gray(`\nApplied permissions to ${applied} version(s).`));
574
+ }
575
+ }
576
+ }
577
+ catch (err) {
578
+ if (isPromptCancelled(err)) {
579
+ console.log(chalk.gray('\nCancelled.'));
580
+ return;
581
+ }
582
+ console.error(chalk.red(`Error: ${err.message}`));
583
+ }
584
+ });
585
+ permissionsCmd
586
+ .command('remove [name]')
587
+ .description('Delete a permission set from ~/.agents/permissions/ (interactive picker if no name given)')
588
+ .addHelpText('after', `
589
+ Examples:
590
+ # Remove a set by name
591
+ agents permissions remove default
592
+
593
+ # Interactive picker
594
+ agents permissions remove
595
+ `)
596
+ .action(async (name) => {
597
+ let setsToRemove;
598
+ if (name) {
599
+ setsToRemove = [name];
600
+ }
601
+ else {
602
+ // Interactive picker
603
+ const installedSets = listInstalledPermissions();
604
+ if (installedSets.length === 0) {
605
+ console.log(chalk.yellow('No permission sets installed.'));
606
+ return;
607
+ }
608
+ if (!isInteractiveTerminal()) {
609
+ requireInteractiveSelection('Selecting permission sets to remove', [
610
+ 'agents permissions remove default',
611
+ ]);
612
+ }
613
+ try {
614
+ const selected = await checkbox({
615
+ message: 'Select permission sets to remove',
616
+ choices: installedSets.map((perm) => ({
617
+ value: perm.name,
618
+ name: perm.set.description
619
+ ? `${perm.name} - ${perm.set.description}`
620
+ : perm.name,
621
+ })),
622
+ });
623
+ if (selected.length === 0) {
624
+ console.log(chalk.gray('No permission sets selected.'));
625
+ return;
626
+ }
627
+ setsToRemove = selected;
628
+ }
629
+ catch (err) {
630
+ if (isPromptCancelled(err)) {
631
+ console.log(chalk.gray('Cancelled'));
632
+ return;
633
+ }
634
+ throw err;
635
+ }
636
+ }
637
+ for (const setName of setsToRemove) {
638
+ const result = removePermissionSet(setName);
639
+ if (result.success) {
640
+ console.log(chalk.green(`Removed permission set '${setName}'`));
641
+ }
642
+ else {
643
+ console.log(chalk.red(result.error));
644
+ }
645
+ }
646
+ });
647
+ permissionsCmd
648
+ .command('view [name]')
649
+ .description('Read the allow and deny rules for a stored permission set')
650
+ .addHelpText('after', `
651
+ Examples:
652
+ # View a specific permission set
653
+ agents permissions view default
654
+
655
+ # Interactive picker
656
+ agents permissions view
657
+ `)
658
+ .action(async (name) => {
659
+ const installedSets = listInstalledPermissions();
660
+ if (installedSets.length === 0) {
661
+ console.log(chalk.yellow('No permission sets installed'));
662
+ return;
663
+ }
664
+ // If no name provided, show interactive select
665
+ if (!name) {
666
+ if (!isInteractiveTerminal()) {
667
+ requireInteractiveSelection('Selecting a permission set to view', [
668
+ 'agents permissions view default',
669
+ ]);
670
+ }
671
+ try {
672
+ const { select } = await import('@inquirer/prompts');
673
+ name = await select({
674
+ message: 'Select a permission set to view',
675
+ choices: installedSets.map((perm) => ({
676
+ value: perm.name,
677
+ name: perm.set.description
678
+ ? `${perm.name} - ${perm.set.description}`
679
+ : perm.name,
680
+ })),
681
+ });
682
+ }
683
+ catch (err) {
684
+ if (isPromptCancelled(err)) {
685
+ console.log(chalk.gray('Cancelled'));
686
+ return;
687
+ }
688
+ throw err;
689
+ }
690
+ }
691
+ const perm = installedSets.find((p) => p.name === name);
692
+ if (!perm) {
693
+ console.log(chalk.yellow(`Permission set '${name}' not found`));
694
+ return;
695
+ }
696
+ // Build output
697
+ const lines = [];
698
+ lines.push(chalk.bold(`\n${perm.name}\n`));
699
+ if (perm.set.description) {
700
+ lines.push(` ${perm.set.description}`);
701
+ }
702
+ lines.push('');
703
+ if (perm.set.allow.length > 0) {
704
+ lines.push(chalk.green(' Allow rules:'));
705
+ for (const rule of perm.set.allow) {
706
+ lines.push(` ${chalk.cyan(rule)}`);
707
+ }
708
+ }
709
+ if (perm.set.deny && perm.set.deny.length > 0) {
710
+ lines.push(chalk.red('\n Deny rules:'));
711
+ for (const rule of perm.set.deny) {
712
+ lines.push(` ${chalk.yellow(rule)}`);
713
+ }
714
+ }
715
+ lines.push('');
716
+ const output = lines.join('\n');
717
+ printWithPager(output, lines.length);
718
+ });
719
+ // Deprecated alias handler for 'perms'
720
+ // Note: This needs to be registered at the program level, not as a subcommand
721
+ // The actual deprecation message is shown in index.ts
722
+ }
723
+ //# sourceMappingURL=permissions.js.map