@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
package/dist/lib/exec.js CHANGED
@@ -1,10 +1,18 @@
1
+ /**
2
+ * Agent execution -- command building, process spawning, and rate-limit fallback.
3
+ *
4
+ * Translates high-level ExecOptions into CLI invocations for each supported agent,
5
+ * manages environment isolation per agent, and chains fallback agents on rate limits.
6
+ */
1
7
  import { spawn } from 'child_process';
2
8
  import { randomUUID } from 'crypto';
3
9
  import * as path from 'path';
4
10
  import { parseTimeout } from './routines.js';
5
11
  import { getVersionHomePath, isVersionInstalled, resolveVersion } from './versions.js';
6
12
  import { resolveModel, buildReasoningFlags } from './models.js';
13
+ /** Pattern for valid environment variable names (C identifier rules). */
7
14
  const EXEC_ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
15
+ /** Parse a single KEY=VALUE string into a tuple, validating the key name. */
8
16
  function parseExecEnvEntry(entry) {
9
17
  const separatorIndex = entry.indexOf('=');
10
18
  if (separatorIndex <= 0) {
@@ -17,34 +25,58 @@ function parseExecEnvEntry(entry) {
17
25
  }
18
26
  return [key, value];
19
27
  }
28
+ /** Parse an array of KEY=VALUE strings into an env record. Returns undefined for empty input. */
20
29
  export function parseExecEnv(entries) {
21
30
  if (entries.length === 0) {
22
31
  return undefined;
23
32
  }
24
33
  return Object.fromEntries(entries.map(parseExecEnvEntry));
25
34
  }
35
+ /**
36
+ * Build the process environment for an agent invocation.
37
+ * Pins CLAUDE_CONFIG_DIR for Claude and CODEX_HOME for Codex; strips the
38
+ * other agent's env var so it doesn't leak into unrelated invocations.
39
+ */
26
40
  export function buildExecEnv(options) {
27
41
  const result = { ...process.env };
28
- // CLAUDE_CONFIG_DIR is Claude-specific. When the caller is running inside
29
- // a Claude-managed shell, process.env already carries it; spreading into a
30
- // non-Claude agent's env would leak a config pointer that the target CLI
31
- // doesn't understand. Strip it unless we're actually invoking Claude, and
32
- // when we are, pin it to the resolved version's home.
42
+ // Config-dir env vars are agent-specific. When the caller is running inside
43
+ // an agent-managed shell, process.env already carries one; spreading into a
44
+ // different agent's env would leak a config pointer the target CLI doesn't
45
+ // understand. Strip foreign vars and pin the right one to the versioned home.
33
46
  if (options.agent === 'claude') {
34
47
  const cwd = options.cwd || process.cwd();
35
- const version = options.version || resolveVersion('claude', cwd);
36
- if (version && isVersionInstalled('claude', version)) {
48
+ const resolvedVersion = options.version ?? resolveVersion('claude', cwd);
49
+ // Use an explicitly pinned version unconditionally; for auto-resolved versions
50
+ // only inject the path when the version is actually installed on disk.
51
+ const version = options.version
52
+ ? resolvedVersion
53
+ : (resolvedVersion && isVersionInstalled('claude', resolvedVersion) ? resolvedVersion : null);
54
+ if (version) {
37
55
  result.CLAUDE_CONFIG_DIR = path.join(getVersionHomePath('claude', version), '.claude');
38
56
  }
57
+ delete result.CODEX_HOME;
58
+ }
59
+ else if (options.agent === 'codex') {
60
+ const cwd = options.cwd || process.cwd();
61
+ const resolvedVersion = options.version ?? resolveVersion('codex', cwd);
62
+ const version = options.version
63
+ ? resolvedVersion
64
+ : (resolvedVersion && isVersionInstalled('codex', resolvedVersion) ? resolvedVersion : null);
65
+ if (version) {
66
+ result.CODEX_HOME = path.join(getVersionHomePath('codex', version), '.codex');
67
+ }
68
+ delete result.CLAUDE_CONFIG_DIR;
39
69
  }
40
70
  else {
41
71
  delete result.CLAUDE_CONFIG_DIR;
72
+ delete result.CODEX_HOME;
42
73
  }
43
74
  return {
44
75
  ...result,
45
76
  ...options.env,
46
77
  };
47
78
  }
79
+ /** CLI command templates for every supported agent. */
48
80
  export const AGENT_COMMANDS = {
49
81
  claude: {
50
82
  base: ['claude'],
@@ -164,10 +196,11 @@ export const AGENT_COMMANDS = {
164
196
  modelFlag: '--model',
165
197
  },
166
198
  };
199
+ /** Assemble the full CLI argument array for an agent invocation. */
167
200
  export function buildExecCommand(options) {
168
201
  const template = AGENT_COMMANDS[options.agent];
169
202
  const cmd = [...template.base];
170
- const interactive = options.prompt === undefined;
203
+ const interactive = options.interactive === true || options.prompt === undefined;
171
204
  // Use versioned alias if a specific version was requested (e.g., claude@2.1.98)
172
205
  if (options.version && cmd.length > 0) {
173
206
  cmd[0] = `${cmd[0]}@${options.version}`;
@@ -191,7 +224,7 @@ export function buildExecCommand(options) {
191
224
  const modeFlags = template.modeFlags[options.mode];
192
225
  cmd.push(...modeFlags);
193
226
  // Add print/headless flags only when a prompt is provided. Without a prompt
194
- // the caller wants an interactive REPL passing --print would immediately
227
+ // the caller wants an interactive REPL -- passing --print would immediately
195
228
  // wait on stdin and never render the TUI.
196
229
  if (!interactive && options.headless && template.printFlags) {
197
230
  cmd.push(...template.printFlags);
@@ -225,8 +258,10 @@ export function buildExecCommand(options) {
225
258
  cmd.push(template.verboseFlag);
226
259
  }
227
260
  }
228
- // Add prompt (skipped in interactive mode so the CLI launches its TUI)
229
- if (!interactive) {
261
+ // Add prompt when provided. In pure interactive mode (no prompt) we skip this
262
+ // so the CLI launches its TUI. When --interactive is passed alongside a prompt
263
+ // we still forward the prompt so the agent receives it as the first message.
264
+ if (options.prompt !== undefined) {
230
265
  if (template.promptFlag === 'positional') {
231
266
  cmd.push(options.prompt);
232
267
  }
@@ -242,6 +277,7 @@ export function buildExecCommand(options) {
242
277
  }
243
278
  return cmd;
244
279
  }
280
+ /** Spawn an agent and return its exit code. Convenience wrapper over spawnAgent. */
245
281
  export async function execAgent(options) {
246
282
  const { exitCode } = await spawnAgent(options);
247
283
  return exitCode;
@@ -250,7 +286,7 @@ export async function execAgent(options) {
250
286
  * Spawn an agent process and return its exit code plus a tee'd copy of stderr.
251
287
  *
252
288
  * Stderr is always piped so the caller can inspect it (e.g., for rate-limit
253
- * detection) while also forwarding every chunk to process.stderr in real time
289
+ * detection) while also forwarding every chunk to process.stderr in real time --
254
290
  * the user sees the same output they would with stdio: 'inherit'. Stdout keeps
255
291
  * the original behavior: 'pipe' when downstream output is piped (so `agents
256
292
  * run ... | ...` composes cleanly), otherwise 'inherit' so TTY output is
@@ -261,7 +297,7 @@ async function spawnAgent(options) {
261
297
  const [executable, ...args] = cmd;
262
298
  const timeoutMs = options.timeout ? parseTimeout(options.timeout) : undefined;
263
299
  const piped = !process.stdout.isTTY;
264
- const interactive = options.prompt === undefined;
300
+ const interactive = options.interactive === true || options.prompt === undefined;
265
301
  return new Promise((resolve, reject) => {
266
302
  // Interactive mode inherits all stdio so the CLI owns the TTY (TUI
267
303
  // rendering, raw-mode keystrokes, colored output). Headless mode pipes
@@ -313,7 +349,7 @@ async function spawnAgent(options) {
313
349
  }
314
350
  /**
315
351
  * Patterns that indicate a rate/usage limit. Matching is intentionally broad
316
- * because providers phrase these differently Anthropic uses "5-hour limit"
352
+ * because providers phrase these differently -- Anthropic uses "5-hour limit"
317
353
  * and "rate limit", OpenAI surfaces 429s, Google says "quota exceeded".
318
354
  * False positives here just trigger a fallback attempt; false negatives leave
319
355
  * the original error unhandled, which is worse.
@@ -328,6 +364,7 @@ export const RATE_LIMIT_PATTERNS = [
328
364
  /api[\s_-]?overloaded/i,
329
365
  /\boverloaded\b/i,
330
366
  ];
367
+ /** Return true if the text contains any known rate-limit or overload indicator. */
331
368
  export function detectRateLimit(text) {
332
369
  return RATE_LIMIT_PATTERNS.some(pattern => pattern.test(text));
333
370
  }
@@ -338,7 +375,7 @@ export function detectRateLimit(text) {
338
375
  * When the prior agent was Claude we pin its session ID via `--session-id` so
339
376
  * `prevSessionId` is always defined; for other primaries we pass undefined and
340
377
  * get a simpler retry-with-context prompt. Claude understands `/continue <id>`
341
- * via its shipped skill other agents fall through to an explicit instruction
378
+ * via its shipped skill -- other agents fall through to an explicit instruction
342
379
  * that points at the version-agnostic `agents sessions <id>` reader.
343
380
  */
344
381
  export function buildFallbackPrompt(prevAgent, prevSessionId, nextAgent, originalPrompt) {
@@ -359,7 +396,7 @@ export function buildFallbackPrompt(prevAgent, prevSessionId, nextAgent, origina
359
396
  *
360
397
  * The primary agent gets the original prompt. Subsequent agents get a
361
398
  * `/continue <id>`-style handoff (see buildFallbackPrompt) when we can pin a
362
- * session ID which today means Claude as primary (supports `--session-id`).
399
+ * session ID -- which today means Claude as primary (supports `--session-id`).
363
400
  * For other primaries, fallbacks run with the original prompt plus a
364
401
  * retry-with-context note, since we can't deterministically resolve their
365
402
  * auto-generated session IDs.
@@ -420,4 +457,3 @@ export async function runWithFallback(options) {
420
457
  }
421
458
  return 1;
422
459
  }
423
- //# sourceMappingURL=exec.js.map
@@ -0,0 +1,2 @@
1
+ /** Walk a directory recursively for files with a given extension. */
2
+ export declare function walkForFiles(dir: string, ext: string, limit: number): string[];
@@ -0,0 +1,40 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /** Walk a directory recursively for files with a given extension. */
4
+ export function walkForFiles(dir, ext, limit) {
5
+ const results = [];
6
+ function walk(d, depth) {
7
+ if (depth > 5)
8
+ return;
9
+ let entries;
10
+ try {
11
+ entries = fs.readdirSync(d);
12
+ }
13
+ catch {
14
+ return;
15
+ }
16
+ for (const entry of entries) {
17
+ const full = path.join(d, entry);
18
+ const stat = safeStatSync(full);
19
+ if (!stat)
20
+ continue;
21
+ if (stat.isDirectory()) {
22
+ walk(full, depth + 1);
23
+ }
24
+ else if (entry.endsWith(ext)) {
25
+ results.push({ path: full, mtime: stat.mtimeMs });
26
+ }
27
+ }
28
+ }
29
+ walk(dir, 0);
30
+ results.sort((a, b) => b.mtime - a.mtime);
31
+ return results.slice(0, limit).map(r => r.path);
32
+ }
33
+ function safeStatSync(p) {
34
+ try {
35
+ return fs.statSync(p);
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Fuzzy string matching for user-provided identifiers.
3
+ * Auto-corrects typos like "cladue" -> "claude" based on Levenshtein distance.
4
+ */
5
+ /** Levenshtein edit distance between two strings. */
6
+ export declare function levenshtein(a: string, b: string): number;
7
+ export interface FuzzyOptions {
8
+ /** Absolute max edit distance allowed. */
9
+ maxDistance?: number;
10
+ /** Max ratio of distance to input length. If set, effective threshold = min(maxDistance, floor(len * maxRatio)). */
11
+ maxRatio?: number;
12
+ }
13
+ /**
14
+ * Fuzzy match an input string against a list of candidates.
15
+ * Returns the single best match within tolerance, or null if no match or ambiguous.
16
+ */
17
+ export declare function fuzzyMatch<T extends string>(input: string, candidates: readonly T[], options?: FuzzyOptions): T | null;
18
+ /**
19
+ * Preset configurations for different identifier types.
20
+ * Based on pairwise distance analysis of candidate pools.
21
+ */
22
+ export declare const FUZZY_PRESETS: {
23
+ /** Agents: min pairwise dist=3 (opencode/openclaw), safe tolerance=2 */
24
+ readonly agents: {
25
+ readonly maxDistance: 2;
26
+ };
27
+ /** Modes: plan/edit/full all at dist=4, lenient */
28
+ readonly modes: {
29
+ readonly maxDistance: 2;
30
+ };
31
+ /** Efforts: high/xhigh at dist=1, must be strict */
32
+ readonly efforts: {
33
+ readonly maxDistance: 1;
34
+ };
35
+ /** Strategies: pinned/available/rotate all far apart */
36
+ readonly strategies: {
37
+ readonly maxDistance: 2;
38
+ };
39
+ /** Beta features: drive/factory at dist=7, lenient */
40
+ readonly beta: {
41
+ readonly maxDistance: 2;
42
+ };
43
+ /** Dynamic/user-defined: profiles, commands, hooks, etc. */
44
+ readonly dynamic: {
45
+ readonly maxDistance: 2;
46
+ readonly maxRatio: 0.3;
47
+ };
48
+ /** Skills: often longer names, slightly more lenient */
49
+ readonly skills: {
50
+ readonly maxDistance: 3;
51
+ readonly maxRatio: 0.3;
52
+ };
53
+ };
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Fuzzy string matching for user-provided identifiers.
3
+ * Auto-corrects typos like "cladue" -> "claude" based on Levenshtein distance.
4
+ */
5
+ /** Levenshtein edit distance between two strings. */
6
+ export function levenshtein(a, b) {
7
+ const m = a.length, n = b.length;
8
+ if (m === 0)
9
+ return n;
10
+ if (n === 0)
11
+ return m;
12
+ const dp = Array.from({ length: m + 1 }, (_, i) => Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)));
13
+ for (let i = 1; i <= m; i++) {
14
+ for (let j = 1; j <= n; j++) {
15
+ dp[i][j] = a[i - 1] === b[j - 1]
16
+ ? dp[i - 1][j - 1]
17
+ : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
18
+ }
19
+ }
20
+ return dp[m][n];
21
+ }
22
+ /**
23
+ * Fuzzy match an input string against a list of candidates.
24
+ * Returns the single best match within tolerance, or null if no match or ambiguous.
25
+ */
26
+ export function fuzzyMatch(input, candidates, options = {}) {
27
+ const { maxDistance = 2, maxRatio } = options;
28
+ const lower = input.toLowerCase();
29
+ // Reject inputs that are too short - they're too ambiguous
30
+ if (lower.length < 3)
31
+ return null;
32
+ // Compute effective threshold
33
+ const threshold = maxRatio
34
+ ? Math.min(maxDistance, Math.floor(lower.length * maxRatio))
35
+ : maxDistance;
36
+ // Find all candidates within threshold (excluding exact matches)
37
+ const matches = [];
38
+ for (const candidate of candidates) {
39
+ const dist = levenshtein(lower, candidate.toLowerCase());
40
+ if (dist > 0 && dist <= threshold) {
41
+ matches.push({ candidate, dist });
42
+ }
43
+ }
44
+ if (matches.length === 0)
45
+ return null;
46
+ // Sort by distance
47
+ matches.sort((a, b) => a.dist - b.dist);
48
+ // Only return if exactly one candidate at the minimum distance (no ambiguity)
49
+ const minDist = matches[0].dist;
50
+ const atMinDist = matches.filter(m => m.dist === minDist);
51
+ return atMinDist.length === 1 ? atMinDist[0].candidate : null;
52
+ }
53
+ /**
54
+ * Preset configurations for different identifier types.
55
+ * Based on pairwise distance analysis of candidate pools.
56
+ */
57
+ export const FUZZY_PRESETS = {
58
+ /** Agents: min pairwise dist=3 (opencode/openclaw), safe tolerance=2 */
59
+ agents: { maxDistance: 2 },
60
+ /** Modes: plan/edit/full all at dist=4, lenient */
61
+ modes: { maxDistance: 2 },
62
+ /** Efforts: high/xhigh at dist=1, must be strict */
63
+ efforts: { maxDistance: 1 },
64
+ /** Strategies: pinned/available/rotate all far apart */
65
+ strategies: { maxDistance: 2 },
66
+ /** Beta features: drive/factory at dist=7, lenient */
67
+ beta: { maxDistance: 2 },
68
+ /** Dynamic/user-defined: profiles, commands, hooks, etc. */
69
+ dynamic: { maxDistance: 2, maxRatio: 0.3 },
70
+ /** Skills: often longer names, slightly more lenient */
71
+ skills: { maxDistance: 3, maxRatio: 0.3 },
72
+ };
@@ -0,0 +1,4 @@
1
+ export declare function readGeminiSettings(settingsPath: string): Record<string, unknown>;
2
+ export declare function writeGeminiSettings(settingsPath: string, settings: Record<string, unknown>): void;
3
+ export declare function updateGeminiSettings(settingsPath: string, mutate: (settings: Record<string, unknown>) => void): Record<string, unknown>;
4
+ export declare function setGeminiAutoUpdateDisabled(settings: Record<string, unknown>): void;
@@ -0,0 +1,33 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ function isRecord(value) {
4
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
5
+ }
6
+ export function readGeminiSettings(settingsPath) {
7
+ if (!fs.existsSync(settingsPath)) {
8
+ return {};
9
+ }
10
+ const raw = fs.readFileSync(settingsPath, 'utf-8');
11
+ const parsed = JSON.parse(raw);
12
+ if (!isRecord(parsed)) {
13
+ throw new Error(`Gemini settings must be a JSON object: ${settingsPath}`);
14
+ }
15
+ return parsed;
16
+ }
17
+ export function writeGeminiSettings(settingsPath, settings) {
18
+ fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
19
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
20
+ }
21
+ export function updateGeminiSettings(settingsPath, mutate) {
22
+ const settings = readGeminiSettings(settingsPath);
23
+ mutate(settings);
24
+ writeGeminiSettings(settingsPath, settings);
25
+ return settings;
26
+ }
27
+ export function setGeminiAutoUpdateDisabled(settings) {
28
+ const general = isRecord(settings.general) ? settings.general : {};
29
+ settings.general = {
30
+ ...general,
31
+ enableAutoUpdate: false,
32
+ };
33
+ }
package/dist/lib/git.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /** Parsed representation of a git source string (GitHub, generic URL, or local path). */
1
2
  export interface GitSource {
2
3
  type: 'github' | 'url' | 'local';
3
4
  url: string;
@@ -21,20 +22,24 @@ export interface GitSource {
21
22
  * ./relative/path -> local path
22
23
  */
23
24
  export declare function parseSource(source: string): GitSource;
25
+ /** Clone a remote repo or pull updates if it already exists locally. */
24
26
  export declare function cloneOrPull(source: GitSource, targetDir: string): Promise<{
25
27
  isNew: boolean;
26
28
  commit: string;
27
29
  }>;
30
+ /** Clone a repository from a source string, returning the local path and commit hash. */
28
31
  export declare function cloneRepo(source: string): Promise<{
29
32
  localPath: string;
30
33
  commit: string;
31
34
  isNew: boolean;
32
35
  }>;
36
+ /** Clone a package from a source string into the packages directory. */
33
37
  export declare function clonePackage(source: string): Promise<{
34
38
  localPath: string;
35
39
  commit: string;
36
40
  isNew: boolean;
37
41
  }>;
42
+ /** Get the short commit hash (8 chars) of the latest commit in a repo. */
38
43
  export declare function getRepoCommit(repoPath: string): Promise<string>;
39
44
  /**
40
45
  * Get the current GitHub username using gh CLI.
@@ -91,7 +96,7 @@ export declare function isSystemRepoOrigin(dir: string): Promise<boolean>;
91
96
  export declare function hasLocalChanges(dir: string): Promise<boolean>;
92
97
  /**
93
98
  * Pull changes in an existing repo.
94
- * Refuses to pull if the working tree is dirty user must commit or discard changes first.
99
+ * Refuses to pull if the working tree is dirty -- user must commit or discard changes first.
95
100
  */
96
101
  export declare function pullRepo(dir: string): Promise<{
97
102
  success: boolean;
@@ -103,12 +108,18 @@ export declare function pullRepo(dir: string): Promise<{
103
108
  * Returns files categorized by their status relative to HEAD.
104
109
  */
105
110
  export interface GitSyncStatus {
111
+ /** Tracked and unchanged files. */
106
112
  synced: string[];
113
+ /** Modified but not staged files. */
107
114
  modified: string[];
115
+ /** Untracked files. */
108
116
  new: string[];
117
+ /** Staged for commit. */
109
118
  staged: string[];
119
+ /** Deleted files. */
110
120
  deleted: string[];
111
121
  }
122
+ /** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
112
123
  export declare function getGitSyncStatus(dir: string, subdir?: string): Promise<GitSyncStatus | null>;
113
124
  /**
114
125
  * Get list of files tracked by git in a directory.
@@ -143,4 +154,3 @@ export declare function tryAutoPull(dir: string): Promise<{
143
154
  pulled: boolean;
144
155
  error?: string;
145
156
  }>;
146
- //# sourceMappingURL=git.d.ts.map
package/dist/lib/git.js CHANGED
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Git operations for the agents-cli system repo and package repositories.
3
+ *
4
+ * Handles cloning, pulling, syncing, and inspecting git repos used by
5
+ * the agents version management and plugin/package system. Includes
6
+ * source parsing for GitHub shorthand, SSH, HTTPS, and local paths.
7
+ */
1
8
  import simpleGit from 'simple-git';
2
9
  import * as fs from 'fs';
3
10
  import * as path from 'path';
@@ -8,7 +15,7 @@ import { DEFAULT_SYSTEM_REPO, LEGACY_SYSTEM_REPO, systemRepoSlug } from './types
8
15
  *
9
16
  * Why: `git config core.hooksPath` is a known sandbox-escape vector and is
10
17
  * blocked by some sandboxed environments (e.g. Claude Code). Symlinks inside
11
- * `.git/hooks/` sidestep that restriction entirely Git runs them the same way.
18
+ * `.git/hooks/` sidestep that restriction entirely -- Git runs them the same way.
12
19
  */
13
20
  function installGithooksSymlinks(repoDir) {
14
21
  const githooksDir = path.join(repoDir, '.githooks');
@@ -149,6 +156,7 @@ export function parseSource(source) {
149
156
  }
150
157
  throw new Error(`Invalid source: ${source}. Supported formats: gh:owner/repo, owner/repo, github.com/owner/repo, https://github.com/owner/repo, or local path`);
151
158
  }
159
+ /** Clone a remote repo or pull updates if it already exists locally. */
152
160
  export async function cloneOrPull(source, targetDir) {
153
161
  const git = simpleGit();
154
162
  if (source.type === 'local') {
@@ -174,6 +182,7 @@ export async function cloneOrPull(source, targetDir) {
174
182
  const log = await repoGit.log({ maxCount: 1 });
175
183
  return { isNew: true, commit: log.latest?.hash.slice(0, 8) || 'unknown' };
176
184
  }
185
+ /** Clone a repository from a source string, returning the local path and commit hash. */
177
186
  export async function cloneRepo(source) {
178
187
  const parsed = parseSource(source);
179
188
  if (parsed.type === 'local') {
@@ -191,6 +200,7 @@ export async function cloneRepo(source) {
191
200
  isNew: result.isNew,
192
201
  };
193
202
  }
203
+ /** Clone a package from a source string into the packages directory. */
194
204
  export async function clonePackage(source) {
195
205
  const parsed = parseSource(source);
196
206
  if (parsed.type === 'local') {
@@ -208,6 +218,7 @@ export async function clonePackage(source) {
208
218
  isNew: result.isNew,
209
219
  };
210
220
  }
221
+ /** Get the short commit hash (8 chars) of the latest commit in a repo. */
211
222
  export async function getRepoCommit(repoPath) {
212
223
  try {
213
224
  const git = simpleGit(repoPath);
@@ -270,10 +281,10 @@ export async function setRemoteUrl(repoPath, url) {
270
281
  */
271
282
  export async function checkGitHubRepoExists(owner, repo) {
272
283
  try {
273
- const { exec } = await import('child_process');
284
+ const { execFile } = await import('child_process');
274
285
  const { promisify } = await import('util');
275
- const execAsync = promisify(exec);
276
- await execAsync(`gh repo view ${owner}/${repo} --json name`);
286
+ const execFileAsync = promisify(execFile);
287
+ await execFileAsync('gh', ['repo', 'view', `${owner}/${repo}`, '--json', 'name']);
277
288
  return true;
278
289
  }
279
290
  catch {
@@ -414,7 +425,7 @@ export async function hasLocalChanges(dir) {
414
425
  }
415
426
  /**
416
427
  * Pull changes in an existing repo.
417
- * Refuses to pull if the working tree is dirty user must commit or discard changes first.
428
+ * Refuses to pull if the working tree is dirty -- user must commit or discard changes first.
418
429
  */
419
430
  export async function pullRepo(dir) {
420
431
  try {
@@ -440,6 +451,7 @@ export async function pullRepo(dir) {
440
451
  return { success: false, commit: '', error: err.message };
441
452
  }
442
453
  }
454
+ /** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
443
455
  export async function getGitSyncStatus(dir, subdir) {
444
456
  if (!isGitRepo(dir)) {
445
457
  return null;
@@ -632,4 +644,3 @@ export async function tryAutoPull(dir) {
632
644
  return { pulled: false, error: err.message };
633
645
  }
634
646
  }
635
- //# sourceMappingURL=git.js.map
@@ -1,3 +1,22 @@
1
+ /**
2
+ * Custom help formatting for the CLI.
3
+ *
4
+ * Overrides commander's default help layout to show Commands before Options,
5
+ * and applies consistent conventions (short -h flag, no implicit help subcommand).
6
+ */
1
7
  import type { Command } from 'commander';
8
+ /** Description of a named command group rendered as its own section in help output. */
9
+ export interface CommandGroup {
10
+ /** Section heading, e.g. 'Bundle commands'. */
11
+ title: string;
12
+ /** Subcommand names (in desired display order) that belong to this group. */
13
+ names: readonly string[];
14
+ }
15
+ /**
16
+ * Register named groups for a parent command so its help output splits the
17
+ * Commands section into multiple labeled sections. Subcommands not listed in
18
+ * any group fall back to a plain "Commands:" section below the groups.
19
+ */
20
+ export declare function registerCommandGroups(parent: Command, groups: readonly CommandGroup[]): void;
21
+ /** Apply standardized help formatting to the root command and all subcommands. */
2
22
  export declare function applyGlobalHelpConventions(root: Command): void;
3
- //# sourceMappingURL=help.d.ts.map
package/dist/lib/help.js CHANGED
@@ -1,3 +1,13 @@
1
+ const commandGroupRegistry = new WeakMap();
2
+ /**
3
+ * Register named groups for a parent command so its help output splits the
4
+ * Commands section into multiple labeled sections. Subcommands not listed in
5
+ * any group fall back to a plain "Commands:" section below the groups.
6
+ */
7
+ export function registerCommandGroups(parent, groups) {
8
+ commandGroupRegistry.set(parent, groups);
9
+ }
10
+ /** Format help output with Commands listed before Options for better discoverability. */
1
11
  function formatHelpCommandsFirst(cmd, helper) {
2
12
  const termWidth = helper.padWidth(cmd, helper);
3
13
  const helpWidth = helper.helpWidth || 80;
@@ -24,11 +34,39 @@ function formatHelpCommandsFirst(cmd, helper) {
24
34
  if (argumentList.length > 0) {
25
35
  output = output.concat(['Arguments:', formatList(argumentList), '']);
26
36
  }
27
- const commandList = helper.visibleCommands(cmd).map((subcommand) => {
28
- return formatItem(helper.subcommandTerm(subcommand), helper.subcommandDescription(subcommand));
29
- });
30
- if (commandList.length > 0) {
31
- output = output.concat(['Commands:', formatList(commandList), '']);
37
+ const visibleCommands = helper.visibleCommands(cmd);
38
+ const subcommandTermNoAlias = (sub) => {
39
+ // Mirror commander's default subcommandTerm but drop the |alias suffix.
40
+ const argList = sub.registeredArguments ?? [];
41
+ const args = argList
42
+ .map((a) => {
43
+ const n = a.name() + (a.variadic ? '...' : '');
44
+ return a.required ? `<${n}>` : `[${n}]`;
45
+ })
46
+ .join(' ');
47
+ return sub.name() + (sub.options.length > 0 ? ' [options]' : '') + (args ? ` ${args}` : '');
48
+ };
49
+ const renderCommand = (sub) => formatItem(subcommandTermNoAlias(sub), helper.subcommandDescription(sub));
50
+ const groups = commandGroupRegistry.get(cmd);
51
+ if (groups && groups.length > 0) {
52
+ const byName = new Map(visibleCommands.map((s) => [s.name(), s]));
53
+ const placed = new Set();
54
+ for (const { title, names } of groups) {
55
+ const subs = names
56
+ .map((n) => byName.get(n))
57
+ .filter((s) => s !== undefined);
58
+ if (subs.length === 0)
59
+ continue;
60
+ subs.forEach((s) => placed.add(s.name()));
61
+ output = output.concat([`${title}:`, formatList(subs.map(renderCommand)), '']);
62
+ }
63
+ const remaining = visibleCommands.filter((s) => !placed.has(s.name()));
64
+ if (remaining.length > 0) {
65
+ output = output.concat(['Commands:', formatList(remaining.map(renderCommand)), '']);
66
+ }
67
+ }
68
+ else if (visibleCommands.length > 0) {
69
+ output = output.concat(['Commands:', formatList(visibleCommands.map(renderCommand)), '']);
32
70
  }
33
71
  const optionList = helper.visibleOptions(cmd).map((option) => {
34
72
  return formatItem(helper.optionTerm(option), helper.optionDescription(option));
@@ -46,6 +84,7 @@ function formatHelpCommandsFirst(cmd, helper) {
46
84
  }
47
85
  return output.join('\n');
48
86
  }
87
+ /** Recursively apply help conventions (-h flag, no help subcommand, custom formatter). */
49
88
  function applyHelpConventionsRecursive(cmd) {
50
89
  cmd
51
90
  .helpOption('-h, --help', 'Show help')
@@ -57,7 +96,7 @@ function applyHelpConventionsRecursive(cmd) {
57
96
  applyHelpConventionsRecursive(subcommand);
58
97
  }
59
98
  }
99
+ /** Apply standardized help formatting to the root command and all subcommands. */
60
100
  export function applyGlobalHelpConventions(root) {
61
101
  applyHelpConventionsRecursive(root);
62
102
  }
63
- //# sourceMappingURL=help.js.map