@phnx-labs/agents-cli 1.22.35 → 1.22.38

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 (500) hide show
  1. package/CHANGELOG.md +708 -2
  2. package/README.md +83 -43
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.d.ts +15 -0
  5. package/dist/bootstrap.js +1212 -0
  6. package/dist/commands/accounts.d.ts +4 -11
  7. package/dist/commands/accounts.js +159 -27
  8. package/dist/commands/artifacts-setup.d.ts +53 -0
  9. package/dist/commands/artifacts-setup.js +161 -0
  10. package/dist/commands/artifacts.d.ts +18 -0
  11. package/dist/commands/artifacts.js +58 -0
  12. package/dist/commands/attach.js +17 -4
  13. package/dist/commands/audit.d.ts +8 -8
  14. package/dist/commands/audit.js +57 -47
  15. package/dist/commands/browser.js +17 -11
  16. package/dist/commands/cloud.js +1 -1
  17. package/dist/commands/commands.js +0 -11
  18. package/dist/commands/computer-actions.js +33 -0
  19. package/dist/commands/computer-sessions-picker.d.ts +21 -0
  20. package/dist/commands/computer-sessions-picker.js +141 -0
  21. package/dist/commands/computer.d.ts +16 -0
  22. package/dist/commands/computer.js +37 -0
  23. package/dist/commands/config.d.ts +17 -0
  24. package/dist/commands/config.js +401 -0
  25. package/dist/commands/cp.d.ts +84 -0
  26. package/dist/commands/cp.js +231 -0
  27. package/dist/commands/daemon.js +243 -14
  28. package/dist/commands/detach-core.d.ts +1 -1
  29. package/dist/commands/detach-core.js +12 -2
  30. package/dist/commands/detach.js +1 -1
  31. package/dist/commands/doctor.js +64 -5
  32. package/dist/commands/events.d.ts +24 -12
  33. package/dist/commands/events.js +144 -28
  34. package/dist/commands/exec.js +86 -42
  35. package/dist/commands/feed.d.ts +1 -1
  36. package/dist/commands/feed.js +16 -8
  37. package/dist/commands/focus.d.ts +33 -1
  38. package/dist/commands/focus.js +177 -17
  39. package/dist/commands/funnel.d.ts +1 -1
  40. package/dist/commands/go.js +9 -8
  41. package/dist/commands/harness-wizard.d.ts +1 -0
  42. package/dist/commands/harness-wizard.js +18 -20
  43. package/dist/commands/harness.d.ts +2 -0
  44. package/dist/commands/harness.js +59 -26
  45. package/dist/commands/hooks.js +0 -11
  46. package/dist/commands/inspect.d.ts +94 -1
  47. package/dist/commands/inspect.js +866 -40
  48. package/dist/commands/lease.d.ts +4 -4
  49. package/dist/commands/lease.js +6 -6
  50. package/dist/commands/login.js +0 -13
  51. package/dist/commands/logs.d.ts +2 -2
  52. package/dist/commands/logs.js +2 -2
  53. package/dist/commands/mcp.js +7 -2
  54. package/dist/commands/memory.js +7 -2
  55. package/dist/commands/message.d.ts +1 -1
  56. package/dist/commands/message.js +37 -6
  57. package/dist/commands/models.js +71 -0
  58. package/dist/commands/monitors.d.ts +0 -1
  59. package/dist/commands/monitors.js +199 -16
  60. package/dist/commands/open.d.ts +18 -0
  61. package/dist/commands/open.js +57 -0
  62. package/dist/commands/packages.js +2 -107
  63. package/dist/commands/plugins.js +6 -3
  64. package/dist/commands/profiles.d.ts +1 -0
  65. package/dist/commands/profiles.js +16 -160
  66. package/dist/commands/projects.d.ts +28 -0
  67. package/dist/commands/projects.js +125 -5
  68. package/dist/commands/reconnect.js +9 -3
  69. package/dist/commands/repo.js +42 -1
  70. package/dist/commands/resource-view.d.ts +17 -0
  71. package/dist/commands/resource-view.js +36 -14
  72. package/dist/commands/resume.js +9 -2
  73. package/dist/commands/routines.d.ts +0 -2
  74. package/dist/commands/routines.js +473 -289
  75. package/dist/commands/secrets.js +52 -9
  76. package/dist/commands/sessions-export.d.ts +47 -0
  77. package/dist/commands/sessions-export.js +116 -6
  78. package/dist/commands/sessions-import.d.ts +17 -0
  79. package/dist/commands/sessions-import.js +114 -6
  80. package/dist/commands/sessions-migrate.d.ts +27 -0
  81. package/dist/commands/sessions-migrate.js +50 -9
  82. package/dist/commands/sessions-picker.js +23 -4
  83. package/dist/commands/sessions-resume.d.ts +5 -3
  84. package/dist/commands/sessions-resume.js +30 -8
  85. package/dist/commands/sessions-watch.d.ts +2 -0
  86. package/dist/commands/sessions-watch.js +53 -0
  87. package/dist/commands/sessions.d.ts +66 -3
  88. package/dist/commands/sessions.js +298 -47
  89. package/dist/commands/setup-browser.js +2 -2
  90. package/dist/commands/setup-mine.js +0 -1
  91. package/dist/commands/setup-preferences.js +1 -1
  92. package/dist/commands/setup.d.ts +5 -0
  93. package/dist/commands/setup.js +31 -5
  94. package/dist/commands/share.d.ts +87 -7
  95. package/dist/commands/share.js +320 -58
  96. package/dist/commands/skills.js +0 -11
  97. package/dist/commands/snapshot.js +1 -1
  98. package/dist/commands/ssh.d.ts +18 -0
  99. package/dist/commands/ssh.js +549 -210
  100. package/dist/commands/sync.d.ts +5 -0
  101. package/dist/commands/sync.js +212 -32
  102. package/dist/commands/teams.d.ts +13 -0
  103. package/dist/commands/teams.js +187 -30
  104. package/dist/commands/tickets.d.ts +2 -0
  105. package/dist/commands/tickets.js +43 -0
  106. package/dist/commands/update.js +2 -4
  107. package/dist/commands/usage.js +5 -3
  108. package/dist/commands/versions.js +11 -5
  109. package/dist/commands/view.js +15 -7
  110. package/dist/commands/webhook.d.ts +2 -2
  111. package/dist/commands/webhook.js +7 -7
  112. package/dist/index.d.ts +18 -2
  113. package/dist/index.js +53 -1264
  114. package/dist/lib/account-catalog.d.ts +18 -0
  115. package/dist/lib/account-catalog.js +38 -0
  116. package/dist/lib/account-provider-registry.d.ts +18 -0
  117. package/dist/lib/account-provider-registry.js +59 -0
  118. package/dist/lib/account-registry.d.ts +40 -0
  119. package/dist/lib/account-registry.js +239 -0
  120. package/dist/lib/account-schema.d.ts +44 -0
  121. package/dist/lib/account-schema.js +91 -0
  122. package/dist/lib/account-state-service.d.ts +21 -0
  123. package/dist/lib/account-state-service.js +60 -0
  124. package/dist/lib/activity.d.ts +1 -1
  125. package/dist/lib/activity.js +8 -1
  126. package/dist/lib/add-dir.d.ts +80 -0
  127. package/dist/lib/add-dir.js +241 -0
  128. package/dist/lib/agent-cli-commands.d.ts +11 -0
  129. package/dist/lib/agent-cli-commands.js +30 -0
  130. package/dist/lib/agents.js +44 -36
  131. package/dist/lib/answer-router.js +1 -1
  132. package/dist/lib/audit/log.d.ts +10 -27
  133. package/dist/lib/audit/log.js +20 -33
  134. package/dist/lib/auth-health.d.ts +9 -2
  135. package/dist/lib/auth-health.js +42 -9
  136. package/dist/lib/auto-pull-worker.js +7 -3
  137. package/dist/lib/auto-pull.d.ts +44 -3
  138. package/dist/lib/auto-pull.js +88 -5
  139. package/dist/lib/binary-shadow.d.ts +28 -0
  140. package/dist/lib/binary-shadow.js +121 -0
  141. package/dist/lib/brand.js +9 -3
  142. package/dist/lib/browser/hygiene.d.ts +90 -0
  143. package/dist/lib/browser/hygiene.js +146 -0
  144. package/dist/lib/browser/ipc.d.ts +30 -0
  145. package/dist/lib/browser/ipc.js +93 -4
  146. package/dist/lib/browser/profiles.d.ts +3 -2
  147. package/dist/lib/browser/profiles.js +65 -22
  148. package/dist/lib/browser/service.d.ts +79 -1
  149. package/dist/lib/browser/service.js +231 -14
  150. package/dist/lib/browser/sessions-list.d.ts +22 -2
  151. package/dist/lib/browser/sessions-list.js +54 -6
  152. package/dist/lib/browser/stream.d.ts +2 -0
  153. package/dist/lib/browser/stream.js +1 -0
  154. package/dist/lib/browser/types.d.ts +63 -1
  155. package/dist/lib/byok-usage.d.ts +9 -2
  156. package/dist/lib/byok-usage.js +133 -31
  157. package/dist/lib/cli-entry.d.ts +11 -0
  158. package/dist/lib/cli-entry.js +46 -0
  159. package/dist/lib/cloud/host.d.ts +1 -1
  160. package/dist/lib/cloud/host.js +2 -2
  161. package/dist/lib/cloud/registry.js +1 -1
  162. package/dist/lib/cloud/types.d.ts +1 -1
  163. package/dist/lib/commands.d.ts +2 -0
  164. package/dist/lib/commands.js +2 -0
  165. package/dist/lib/computer/sessions-list.d.ts +150 -0
  166. package/dist/lib/computer/sessions-list.js +363 -0
  167. package/dist/lib/config-keys.d.ts +86 -0
  168. package/dist/lib/config-keys.js +193 -0
  169. package/dist/lib/config-machine-keys.d.ts +12 -0
  170. package/dist/lib/config-machine-keys.js +17 -0
  171. package/dist/lib/config-transfer.js +3 -4
  172. package/dist/lib/crabbox/cli.d.ts +2 -2
  173. package/dist/lib/crabbox/cli.js +3 -3
  174. package/dist/lib/daemon-health.d.ts +22 -0
  175. package/dist/lib/daemon-health.js +33 -3
  176. package/dist/lib/daemon-services.d.ts +50 -0
  177. package/dist/lib/daemon-services.js +147 -0
  178. package/dist/lib/daemon-ticks.d.ts +35 -66
  179. package/dist/lib/daemon-ticks.js +77 -159
  180. package/dist/lib/daemon.d.ts +72 -4
  181. package/dist/lib/daemon.js +792 -202
  182. package/dist/lib/deeplink/register.d.ts +49 -0
  183. package/dist/lib/deeplink/register.js +253 -0
  184. package/dist/lib/deeplink/url.d.ts +34 -0
  185. package/dist/lib/deeplink/url.js +78 -0
  186. package/dist/lib/device-config.d.ts +124 -29
  187. package/dist/lib/device-config.js +346 -141
  188. package/dist/lib/devices/config-migration.d.ts +42 -0
  189. package/dist/lib/devices/config-migration.js +203 -0
  190. package/dist/lib/devices/connect.js +14 -7
  191. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  192. package/dist/lib/devices/doctor-findings.js +20 -1
  193. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  194. package/dist/lib/devices/harness-inventory.js +0 -0
  195. package/dist/lib/devices/health.d.ts +1 -1
  196. package/dist/lib/devices/health.js +1 -1
  197. package/dist/lib/devices/pending.d.ts +22 -1
  198. package/dist/lib/devices/pending.js +67 -2
  199. package/dist/lib/devices/registry.d.ts +0 -25
  200. package/dist/lib/devices/registry.js +2 -83
  201. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  202. package/dist/lib/devices/resolve-profile.js +44 -0
  203. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  204. package/dist/lib/devices/rollout-verify.js +193 -0
  205. package/dist/lib/devices/ssh-config.js +10 -6
  206. package/dist/lib/event-families.d.ts +28 -0
  207. package/dist/lib/event-families.js +159 -0
  208. package/dist/lib/event-stream.d.ts +9 -1
  209. package/dist/lib/event-stream.js +26 -9
  210. package/dist/lib/events.d.ts +9 -1
  211. package/dist/lib/events.js +21 -6
  212. package/dist/lib/exec.d.ts +30 -0
  213. package/dist/lib/exec.js +219 -121
  214. package/dist/lib/feed-broadcast.d.ts +25 -0
  215. package/dist/lib/feed-broadcast.js +33 -0
  216. package/dist/lib/feed.d.ts +1 -1
  217. package/dist/lib/feed.js +12 -2
  218. package/dist/lib/fleet/capture.js +15 -0
  219. package/dist/lib/fleet/manifest.js +9 -0
  220. package/dist/lib/fleet/types.d.ts +9 -0
  221. package/dist/lib/fleet-status.js +10 -8
  222. package/dist/lib/git.d.ts +21 -7
  223. package/dist/lib/git.js +122 -18
  224. package/dist/lib/hosts/dispatch.d.ts +8 -3
  225. package/dist/lib/hosts/dispatch.js +29 -3
  226. package/dist/lib/hosts/logs.d.ts +2 -2
  227. package/dist/lib/hosts/logs.js +2 -2
  228. package/dist/lib/hosts/option.js +1 -1
  229. package/dist/lib/hosts/passthrough.d.ts +2 -3
  230. package/dist/lib/hosts/passthrough.js +10 -24
  231. package/dist/lib/hosts/progress.js +2 -2
  232. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  233. package/dist/lib/hosts/providers/devices.js +18 -12
  234. package/dist/lib/hosts/ready.d.ts +5 -1
  235. package/dist/lib/hosts/ready.js +9 -3
  236. package/dist/lib/hosts/reconcile.d.ts +2 -2
  237. package/dist/lib/hosts/reconcile.js +2 -2
  238. package/dist/lib/hosts/registry.js +14 -9
  239. package/dist/lib/hosts/remote-cmd.js +1 -1
  240. package/dist/lib/hosts/remote-os.d.ts +9 -6
  241. package/dist/lib/hosts/remote-os.js +13 -6
  242. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  243. package/dist/lib/hosts/routing-flag.js +41 -0
  244. package/dist/lib/hosts/run-target.js +1 -1
  245. package/dist/lib/hosts/session-index.js +1 -1
  246. package/dist/lib/hosts/tasks.d.ts +6 -6
  247. package/dist/lib/hosts/tasks.js +4 -4
  248. package/dist/lib/hosts/types.js +1 -2
  249. package/dist/lib/installations/resolve.js +2 -8
  250. package/dist/lib/isolation-boundary-report.js +0 -1
  251. package/dist/lib/linear-cache.d.ts +7 -0
  252. package/dist/lib/linear-cache.js +31 -4
  253. package/dist/lib/linear-project-counts.d.ts +1 -1
  254. package/dist/lib/linear-project-counts.js +2 -3
  255. package/dist/lib/linear-projects.js +1 -1
  256. package/dist/lib/loop.d.ts +2 -2
  257. package/dist/lib/loop.js +1 -1
  258. package/dist/lib/mailbox-target.d.ts +1 -1
  259. package/dist/lib/mailbox-target.js +1 -1
  260. package/dist/lib/manifest.js +7 -4
  261. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  262. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  263. package/dist/lib/menubar/snapshot.d.ts +3 -2
  264. package/dist/lib/menubar/snapshot.js +6 -2
  265. package/dist/lib/migrate-fold.d.ts +33 -0
  266. package/dist/lib/migrate-fold.js +130 -0
  267. package/dist/lib/migrate.d.ts +34 -34
  268. package/dist/lib/migrate.js +106 -128
  269. package/dist/lib/model-tier-overrides.d.ts +1 -1
  270. package/dist/lib/model-tier-overrides.js +15 -2
  271. package/dist/lib/monitors/config.d.ts +17 -3
  272. package/dist/lib/monitors/config.js +52 -18
  273. package/dist/lib/monitors/engine.d.ts +32 -1
  274. package/dist/lib/monitors/engine.js +94 -11
  275. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  276. package/dist/lib/monitors/fingerprint.js +100 -0
  277. package/dist/lib/monitors/remote.d.ts +47 -0
  278. package/dist/lib/monitors/remote.js +81 -0
  279. package/dist/lib/monitors/state.d.ts +39 -0
  280. package/dist/lib/monitors/state.js +56 -0
  281. package/dist/lib/onepassword.d.ts +17 -0
  282. package/dist/lib/onepassword.js +52 -22
  283. package/dist/lib/open-url.js +1 -1
  284. package/dist/lib/picker.d.ts +14 -2
  285. package/dist/lib/picker.js +35 -13
  286. package/dist/lib/placement.d.ts +1 -1
  287. package/dist/lib/placement.js +1 -1
  288. package/dist/lib/pr-land-detach.d.ts +32 -0
  289. package/dist/lib/pr-land-detach.js +79 -0
  290. package/dist/lib/profiles-presets.js +13 -0
  291. package/dist/lib/profiles.d.ts +2 -0
  292. package/dist/lib/profiles.js +44 -1
  293. package/dist/lib/project-focus.d.ts +1 -1
  294. package/dist/lib/project-focus.js +1 -1
  295. package/dist/lib/project-probe.d.ts +4 -1
  296. package/dist/lib/project-probe.js +5 -4
  297. package/dist/lib/project-resources.js +2 -18
  298. package/dist/lib/project-root.d.ts +16 -0
  299. package/dist/lib/project-root.js +20 -2
  300. package/dist/lib/projects.d.ts +20 -1
  301. package/dist/lib/projects.js +78 -1
  302. package/dist/lib/refresh-coordinator.d.ts +24 -0
  303. package/dist/lib/refresh-coordinator.js +52 -0
  304. package/dist/lib/registry.d.ts +2 -2
  305. package/dist/lib/registry.js +1 -1
  306. package/dist/lib/resource-aliases.d.ts +13 -0
  307. package/dist/lib/resource-aliases.js +26 -0
  308. package/dist/lib/resources/types.d.ts +1 -1
  309. package/dist/lib/resources.d.ts +16 -0
  310. package/dist/lib/resources.js +66 -10
  311. package/dist/lib/rotate.d.ts +3 -4
  312. package/dist/lib/rotate.js +4 -5
  313. package/dist/lib/routine-activation.d.ts +22 -2
  314. package/dist/lib/routine-activation.js +63 -16
  315. package/dist/lib/routine-context.d.ts +9 -2
  316. package/dist/lib/routine-context.js +21 -6
  317. package/dist/lib/routines-project.d.ts +58 -48
  318. package/dist/lib/routines-project.js +190 -159
  319. package/dist/lib/routines.d.ts +44 -7
  320. package/dist/lib/routines.js +92 -34
  321. package/dist/lib/run-defaults.d.ts +5 -0
  322. package/dist/lib/run-defaults.js +11 -1
  323. package/dist/lib/runner.d.ts +10 -8
  324. package/dist/lib/runner.js +122 -39
  325. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  326. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  327. package/dist/lib/secrets/agent.d.ts +10 -3
  328. package/dist/lib/secrets/agent.js +43 -8
  329. package/dist/lib/secrets/bundles.d.ts +1 -0
  330. package/dist/lib/secrets/bundles.js +92 -80
  331. package/dist/lib/secrets/index.js +32 -9
  332. package/dist/lib/secrets/install-helper.d.ts +4 -4
  333. package/dist/lib/secrets/install-helper.js +4 -4
  334. package/dist/lib/secrets/push.d.ts +40 -6
  335. package/dist/lib/secrets/push.js +58 -11
  336. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  337. package/dist/lib/secrets/read-backoff.js +1 -1
  338. package/dist/lib/secrets/remote.d.ts +24 -0
  339. package/dist/lib/secrets/remote.js +54 -4
  340. package/dist/lib/self-update.d.ts +108 -0
  341. package/dist/lib/self-update.js +276 -1
  342. package/dist/lib/session/active.d.ts +89 -5
  343. package/dist/lib/session/active.js +165 -10
  344. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  345. package/dist/lib/session/actor-sidecar.js +2 -1
  346. package/dist/lib/session/db.d.ts +176 -2
  347. package/dist/lib/session/db.js +484 -17
  348. package/dist/lib/session/discover.js +27 -4
  349. package/dist/lib/session/hook-sessions.js +2 -2
  350. package/dist/lib/session/host-link.d.ts +2 -2
  351. package/dist/lib/session/host-link.js +2 -2
  352. package/dist/lib/session/pid-registry.d.ts +21 -0
  353. package/dist/lib/session/pid-registry.js +57 -0
  354. package/dist/lib/session/remote-active.js +15 -1
  355. package/dist/lib/session/remote.js +2 -2
  356. package/dist/lib/session/session-cache.d.ts +14 -7
  357. package/dist/lib/session/session-cache.js +51 -9
  358. package/dist/lib/session/state.d.ts +2 -2
  359. package/dist/lib/session/state.js +1 -1
  360. package/dist/lib/session/sync/config.d.ts +10 -10
  361. package/dist/lib/session/sync/config.js +10 -10
  362. package/dist/lib/session/sync/r2.d.ts +34 -0
  363. package/dist/lib/session/sync/r2.js +123 -0
  364. package/dist/lib/session/throughput.d.ts +1 -1
  365. package/dist/lib/session/throughput.js +1 -1
  366. package/dist/lib/session/types.d.ts +23 -1
  367. package/dist/lib/session/types.js +15 -0
  368. package/dist/lib/session/viewing-in.d.ts +1 -1
  369. package/dist/lib/session/viewing-in.js +1 -1
  370. package/dist/lib/session/watch.d.ts +101 -0
  371. package/dist/lib/session/watch.js +242 -0
  372. package/dist/lib/share/analytics.js +1 -1
  373. package/dist/lib/share/capture.d.ts +1 -1
  374. package/dist/lib/share/capture.js +3 -3
  375. package/dist/lib/share/config.d.ts +6 -2
  376. package/dist/lib/share/config.js +6 -5
  377. package/dist/lib/share/delete.js +3 -3
  378. package/dist/lib/share/provision.d.ts +38 -0
  379. package/dist/lib/share/provision.js +51 -1
  380. package/dist/lib/share/publish.d.ts +40 -1
  381. package/dist/lib/share/publish.js +119 -6
  382. package/dist/lib/share/worker-template.d.ts +12 -1
  383. package/dist/lib/share/worker-template.js +83 -7
  384. package/dist/lib/shims.d.ts +17 -3
  385. package/dist/lib/shims.js +98 -26
  386. package/dist/lib/signin-badge.js +3 -2
  387. package/dist/lib/skills.js +2 -0
  388. package/dist/lib/smart-launch.d.ts +8 -8
  389. package/dist/lib/smart-launch.js +80 -59
  390. package/dist/lib/ssh-exec.d.ts +1 -1
  391. package/dist/lib/ssh-exec.js +1 -1
  392. package/dist/lib/staleness/prune.d.ts +88 -0
  393. package/dist/lib/staleness/prune.js +69 -0
  394. package/dist/lib/staleness/registry.d.ts +1 -1
  395. package/dist/lib/staleness/writers/commands.js +34 -2
  396. package/dist/lib/staleness/writers/hooks.js +16 -0
  397. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  398. package/dist/lib/staleness/writers/skills.js +19 -0
  399. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  400. package/dist/lib/staleness/writers/subagents.js +0 -4
  401. package/dist/lib/staleness/writers/types.d.ts +32 -0
  402. package/dist/lib/startup/command-registry.d.ts +16 -14
  403. package/dist/lib/startup/command-registry.js +26 -37
  404. package/dist/lib/startup/dev-build.d.ts +10 -0
  405. package/dist/lib/startup/dev-build.js +13 -1
  406. package/dist/lib/startup/spellcheck.d.ts +18 -0
  407. package/dist/lib/startup/spellcheck.js +45 -0
  408. package/dist/lib/state.d.ts +36 -9
  409. package/dist/lib/state.js +96 -46
  410. package/dist/lib/subagents-registry.d.ts +0 -7
  411. package/dist/lib/subagents-registry.js +38 -65
  412. package/dist/lib/subagents.d.ts +0 -33
  413. package/dist/lib/subagents.js +0 -75
  414. package/dist/lib/sync-umbrella.js +1 -1
  415. package/dist/lib/teams/agents.d.ts +41 -1
  416. package/dist/lib/teams/agents.js +187 -9
  417. package/dist/lib/teams/api.d.ts +11 -1
  418. package/dist/lib/teams/api.js +11 -2
  419. package/dist/lib/teams/delivery.d.ts +41 -0
  420. package/dist/lib/teams/delivery.js +60 -0
  421. package/dist/lib/teams/registry.d.ts +14 -0
  422. package/dist/lib/teams/registry.js +51 -1
  423. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  424. package/dist/lib/teams/remoteWorktree.js +29 -0
  425. package/dist/lib/teams/scheduler.d.ts +1 -1
  426. package/dist/lib/teams/scheduler.js +1 -1
  427. package/dist/lib/teams/worktree.d.ts +24 -0
  428. package/dist/lib/teams/worktree.js +42 -0
  429. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  430. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  431. package/dist/lib/terminal/engine.d.ts +4 -0
  432. package/dist/lib/terminal/engine.js +8 -2
  433. package/dist/lib/terminal/types.d.ts +21 -2
  434. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  435. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  436. package/dist/lib/tickets/list.d.ts +53 -0
  437. package/dist/lib/tickets/list.js +153 -0
  438. package/dist/lib/tmux/orphan-reap.d.ts +316 -0
  439. package/dist/lib/tmux/orphan-reap.js +638 -0
  440. package/dist/lib/tmux/session.d.ts +68 -3
  441. package/dist/lib/tmux/session.js +96 -5
  442. package/dist/lib/triggers/handlers.d.ts +20 -0
  443. package/dist/lib/triggers/handlers.js +16 -1
  444. package/dist/lib/triggers/webhook.js +10 -0
  445. package/dist/lib/types.d.ts +47 -35
  446. package/dist/lib/usage-fleet.d.ts +32 -0
  447. package/dist/lib/usage-fleet.js +125 -0
  448. package/dist/lib/usage-refresh.d.ts +3 -3
  449. package/dist/lib/usage-refresh.js +19 -16
  450. package/dist/lib/usage.d.ts +51 -47
  451. package/dist/lib/usage.js +145 -153
  452. package/dist/lib/version-duplicates.js +2 -2
  453. package/dist/lib/versions.d.ts +56 -13
  454. package/dist/lib/versions.js +195 -45
  455. package/dist/lib/watchdog/log.d.ts +1 -1
  456. package/dist/lib/watchdog/log.js +3 -3
  457. package/dist/lib/watchdog/rotate.d.ts +6 -6
  458. package/dist/lib/watchdog/rotate.js +6 -6
  459. package/dist/lib/workflows.d.ts +1 -1
  460. package/dist/lib/yaml-io.d.ts +47 -0
  461. package/dist/lib/yaml-io.js +55 -0
  462. package/package.json +2 -1
  463. package/scripts/install-helper.js +2 -2
  464. package/scripts/postinstall.js +23 -20
  465. package/dist/commands/defaults.d.ts +0 -7
  466. package/dist/commands/defaults.js +0 -107
  467. package/dist/commands/export.d.ts +0 -11
  468. package/dist/commands/export.js +0 -215
  469. package/dist/commands/helper.d.ts +0 -12
  470. package/dist/commands/helper.js +0 -87
  471. package/dist/commands/hosts.d.ts +0 -11
  472. package/dist/commands/hosts.js +0 -330
  473. package/dist/commands/lock.d.ts +0 -12
  474. package/dist/commands/lock.js +0 -70
  475. package/dist/commands/pull.d.ts +0 -17
  476. package/dist/commands/pull.js +0 -39
  477. package/dist/commands/push.d.ts +0 -14
  478. package/dist/commands/push.js +0 -30
  479. package/dist/commands/set.d.ts +0 -15
  480. package/dist/commands/set.js +0 -79
  481. package/dist/commands/setup-share.d.ts +0 -17
  482. package/dist/commands/setup-share.js +0 -85
  483. package/dist/commands/wallet.d.ts +0 -20
  484. package/dist/commands/wallet.js +0 -216
  485. package/dist/commands/worktree.d.ts +0 -19
  486. package/dist/commands/worktree.js +0 -272
  487. package/dist/lib/account-labels.d.ts +0 -24
  488. package/dist/lib/account-labels.js +0 -72
  489. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  490. package/dist/lib/auto-dispatch-linear.js +0 -107
  491. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  492. package/dist/lib/auto-dispatch-provider.js +0 -30
  493. package/dist/lib/auto-dispatch.d.ts +0 -93
  494. package/dist/lib/auto-dispatch.js +0 -128
  495. package/dist/lib/export.d.ts +0 -72
  496. package/dist/lib/export.js +0 -269
  497. package/dist/lib/lock.d.ts +0 -93
  498. package/dist/lib/lock.js +0 -207
  499. package/dist/lib/wallet/index.d.ts +0 -78
  500. package/dist/lib/wallet/index.js +0 -253
@@ -16,9 +16,8 @@ import { parseBundleValue, secretsKeychainItem } from '../lib/secrets/index.js';
16
16
  import { readBundle } from '../lib/secrets/bundles.js';
17
17
  import { isInteractiveTerminal } from './utils.js';
18
18
  import { getAgentsInvocation } from '../lib/daemon.js';
19
- import { getActiveResourceProfileName, getResourceProfilePreset, listResourceProfileNames, setActiveResourceProfile, upsertResourceProfilePreset, validateResourceProfileName, } from '../lib/resource-profiles.js';
20
- import { AGENTS, ALL_AGENT_IDS } from '../lib/agents.js';
21
- import { listInstalledVersions, syncResourcesToVersion } from '../lib/versions.js';
19
+ import { ALL_AGENT_IDS } from '../lib/agents.js';
20
+ import { findAccount } from '../lib/account-registry.js';
22
21
  /**
23
22
  * Pure helper: builds a Profile from collected wizard inputs. Extracted so the
24
23
  * shape of preset->profile mapping for the `create` wizard is unit-testable
@@ -159,6 +158,9 @@ export async function applyFromSecrets(profile, spec, explicitAuthProvider, opts
159
158
  */
160
159
  export async function addProfile(name, opts, label = 'Profile') {
161
160
  validateProfileName(name);
161
+ const account = opts.account ? findAccount(opts.account) : null;
162
+ if (opts.account && !account)
163
+ throw new Error(`Unknown account '${opts.account}'.`);
162
164
  if (profileExists(name) && !opts.force) {
163
165
  throw new Error(`${label} '${name}' already exists. Use --force to overwrite.`);
164
166
  }
@@ -190,6 +192,10 @@ export async function addProfile(name, opts, label = 'Profile') {
190
192
  provider: opts.authProvider,
191
193
  authEnvVar,
192
194
  });
195
+ if (account) {
196
+ profile.account = account.id;
197
+ profile.provider = account.provider;
198
+ }
193
199
  if (opts.fromSecrets)
194
200
  await applyFromSecrets(profile, opts.fromSecrets, opts.authProvider);
195
201
  writeProfile(profile);
@@ -204,10 +210,14 @@ export async function addProfile(name, opts, label = 'Profile') {
204
210
  throw new Error(`No preset '${presetName}'.\nAvailable presets: ${listPresets().map((p) => p.name).join(', ')}\n` +
205
211
  'Or build a custom harness: --host <agent> --model <id>.');
206
212
  }
207
- if (!opts.fromSecrets && !preset.authOptional) {
213
+ if (!account && !opts.fromSecrets && !preset.authOptional) {
208
214
  await ensureProviderToken(preset.provider, preset.signupUrl, opts.keyStdin);
209
215
  }
210
216
  const profile = profileFromPreset(name, preset, opts.version);
217
+ if (account) {
218
+ profile.account = account.id;
219
+ profile.provider = account.provider;
220
+ }
211
221
  if (opts.fromSecrets)
212
222
  await applyFromSecrets(profile, opts.fromSecrets, opts.authProvider);
213
223
  writeProfile(profile);
@@ -221,141 +231,8 @@ function renderProfileRow(p) {
221
231
  const provider = p.provider || (p.auth?.keychainItem?.split('.')[1]) || '-';
222
232
  return `${chalk.cyan(p.name.padEnd(16))} ${host.padEnd(14)} ${provider.padEnd(12)} ${chalk.gray(model)}`;
223
233
  }
224
- function splitList(value) {
225
- if (value === undefined)
226
- return undefined;
227
- return value.split(',').map((part) => part.trim()).filter(Boolean);
228
- }
229
- function buildResourceProfileFromOptions(existing, opts) {
230
- const next = { ...(existing ?? {}) };
231
- if (opts.description !== undefined)
232
- next.description = opts.description || undefined;
233
- const keys = ['commands', 'skills', 'hooks', 'subagents', 'plugins', 'workflows', 'permissions', 'mcp'];
234
- for (const key of keys) {
235
- const parsed = splitList(opts[key]);
236
- if (parsed !== undefined)
237
- next[key] = parsed;
238
- }
239
- const secrets = splitList(opts.secrets);
240
- if (secrets !== undefined)
241
- next.secrets = secrets;
242
- if (opts.rules !== undefined)
243
- next.rules = opts.rules || undefined;
244
- return next;
245
- }
246
- function printResourceProfile(name, preset, activeName) {
247
- const activeMark = activeName === name ? '*' : ' ';
248
- const description = preset.description ? ` ${chalk.gray(preset.description)}` : '';
249
- console.log(`${activeMark} ${chalk.cyan(name)}${description}`);
250
- }
251
- function syncInstalledVersionsForActiveProfile(cwd) {
252
- let synced = 0;
253
- for (const agent of Object.keys(AGENTS)) {
254
- for (const version of listInstalledVersions(agent)) {
255
- syncResourcesToVersion(agent, version, undefined, { cwd, force: true });
256
- synced++;
257
- }
258
- }
259
- return synced;
260
- }
261
- function registerResourceProfileCommands(program) {
262
- const cmd = program
263
- .command('profile')
264
- .description('Activate top-level resource profiles across commands, skills, hooks, rules, MCP, permissions, and secrets.');
265
- cmd
266
- .command('list')
267
- .alias('ls')
268
- .description('List top-level resource profiles')
269
- .action(() => {
270
- const names = listResourceProfileNames();
271
- if (names.length === 0) {
272
- console.log(chalk.gray('No resource profiles configured.'));
273
- console.log(chalk.gray('Try: agents profile set work --skills user:code-review --secrets work'));
274
- return;
275
- }
276
- const active = getActiveResourceProfileName();
277
- for (const name of names) {
278
- printResourceProfile(name, getResourceProfilePreset(name), active);
279
- }
280
- });
281
- cmd
282
- .command('status')
283
- .description('Show the active top-level resource profile')
284
- .action(() => {
285
- const active = getActiveResourceProfileName();
286
- if (!active) {
287
- console.log(chalk.gray('No resource profile active.'));
288
- return;
289
- }
290
- const preset = getResourceProfilePreset(active);
291
- console.log(chalk.bold(active));
292
- if (!preset) {
293
- console.log(chalk.red('Configured active profile is missing from profiles.presets.'));
294
- return;
295
- }
296
- if (preset.description)
297
- console.log(chalk.gray(preset.description));
298
- for (const [key, value] of Object.entries(preset)) {
299
- if (key === 'description')
300
- continue;
301
- console.log(`${key}: ${Array.isArray(value) ? value.join(', ') : value}`);
302
- }
303
- });
304
- cmd
305
- .command('set <name>')
306
- .alias('define')
307
- .description('Create or update a top-level resource profile')
308
- .option('--description <text>', 'Free-form description')
309
- .option('--commands <patterns>', 'Comma-separated command selectors, e.g. system:commit,user:*')
310
- .option('--skills <patterns>', 'Comma-separated skill selectors')
311
- .option('--hooks <patterns>', 'Comma-separated hook selectors')
312
- .option('--subagents <patterns>', 'Comma-separated subagent selectors')
313
- .option('--plugins <patterns>', 'Comma-separated plugin selectors')
314
- .option('--workflows <patterns>', 'Comma-separated workflow selectors')
315
- .option('--permissions <patterns>', 'Comma-separated permission group selectors')
316
- .option('--mcp <patterns>', 'Comma-separated MCP server selectors')
317
- .option('--rules <preset>', 'Rules preset to compose while active')
318
- .option('--secrets <names>', 'Comma-separated secrets bundles, or "*"')
319
- .action((name, opts) => {
320
- try {
321
- validateResourceProfileName(name);
322
- const preset = buildResourceProfileFromOptions(getResourceProfilePreset(name), opts);
323
- upsertResourceProfilePreset(name, preset);
324
- console.log(chalk.green(`Profile '${name}' saved.`));
325
- }
326
- catch (err) {
327
- console.error(chalk.red(err.message));
328
- process.exit(1);
329
- }
330
- });
331
- cmd
332
- .command('use <name>')
333
- .description('Activate a top-level resource profile and reconcile installed versions')
334
- .action((name) => {
335
- try {
336
- setActiveResourceProfile(name);
337
- const synced = syncInstalledVersionsForActiveProfile(process.cwd());
338
- console.log(chalk.green(`Profile '${name}' active.`));
339
- console.log(chalk.gray(`Reconciled ${synced} installed version${synced === 1 ? '' : 's'}.`));
340
- }
341
- catch (err) {
342
- console.error(chalk.red(err.message));
343
- process.exit(1);
344
- }
345
- });
346
- cmd
347
- .command('clear')
348
- .description('Clear the active top-level resource profile and reconcile installed versions')
349
- .action(() => {
350
- setActiveResourceProfile(null);
351
- const synced = syncInstalledVersionsForActiveProfile(process.cwd());
352
- console.log(chalk.green('Resource profile cleared.'));
353
- console.log(chalk.gray(`Reconciled ${synced} installed version${synced === 1 ? '' : 's'}.`));
354
- });
355
- }
356
234
  /** Register the `agents profiles` command tree. */
357
235
  export function registerProfilesCommands(program) {
358
- registerResourceProfileCommands(program);
359
236
  const cmd = program
360
237
  .command('profiles')
361
238
  .description('Named bundles of (host CLI, endpoint, model, auth) — run Kimi/DeepSeek/Qwen/etc through Claude Code without a proxy.')
@@ -427,28 +304,6 @@ Examples:
427
304
  # Fully remove the OpenRouter key from Keychain
428
305
  agents profiles logout openrouter
429
306
  `);
430
- cmd
431
- .command('use <name>')
432
- .description('Alias for `agents profile use <name>`')
433
- .action((name) => {
434
- try {
435
- setActiveResourceProfile(name);
436
- const synced = syncInstalledVersionsForActiveProfile(process.cwd());
437
- console.log(chalk.green(`Profile '${name}' active.`));
438
- console.log(chalk.gray(`Reconciled ${synced} installed version${synced === 1 ? '' : 's'}.`));
439
- }
440
- catch (err) {
441
- console.error(chalk.red(err.message));
442
- process.exit(1);
443
- }
444
- });
445
- cmd
446
- .command('status')
447
- .description('Alias for `agents profile status`')
448
- .action(() => {
449
- const active = getActiveResourceProfileName();
450
- console.log(active ? active : chalk.gray('No resource profile active.'));
451
- });
452
307
  cmd
453
308
  .command('list')
454
309
  .alias('ls')
@@ -609,6 +464,7 @@ Examples:
609
464
  .description('Add a profile. If <name> matches a built-in preset, the preset is applied. Prompts for API key (once per provider).')
610
465
  .option('--preset <preset>', 'Use a named preset (defaults to <name> if a preset by that name exists)')
611
466
  .option('--version <version>', 'Pin the host CLI version (e.g., 2.1.113)')
467
+ .option('--account <name>', 'Attach an existing durable credential account')
612
468
  .option('--key-stdin', 'Read API key from stdin instead of prompting (for scripts/CI)')
613
469
  .option('--force', 'Overwrite an existing profile with the same name')
614
470
  .addHelpText('after', '\nTo build a custom harness from a host CLI + model in one shot, use `agents harness add`.\n')
@@ -617,7 +473,7 @@ Examples:
617
473
  // device routing (see lib/hosts/passthrough.ts). The host+model one-shot
618
474
  // lives on `agents harness add`, which owns its own `--host`.
619
475
  try {
620
- await addProfile(name, { preset: opts.preset, version: opts.version, keyStdin: opts.keyStdin, force: opts.force }, 'Profile');
476
+ await addProfile(name, { preset: opts.preset, version: opts.version, account: opts.account, keyStdin: opts.keyStdin, force: opts.force }, 'Profile');
621
477
  }
622
478
  catch (err) {
623
479
  console.error(chalk.red(err.message));
@@ -8,9 +8,18 @@
8
8
  * lifecycle state, plan completion, open PRs, and tickets in flight.
9
9
  */
10
10
  import type { Command } from 'commander';
11
+ import { type ProjectRepo } from '../lib/projects.js';
11
12
  import { type LinearMilestone } from '../lib/linear-project-counts.js';
12
13
  /** Recursion guard: a peer answering a probe fan-out never re-fans-out itself. */
13
14
  export declare const PROJECTS_NO_FANOUT_ENV = "AGENTS_PROJECTS_LOCAL";
15
+ /**
16
+ * Render `agents projects for-cwd`'s output for a resolved (or absent)
17
+ * project name — `--json` always prints `{"name": ...}` even on no match, so
18
+ * a scripted caller can distinguish "ran and found nothing" from a crash;
19
+ * the plain-text form prints nothing on no match. Returns '' when nothing
20
+ * should be printed.
21
+ */
22
+ export declare function formatForCwdOutput(name: string | undefined, json: boolean): string;
14
23
  /**
15
24
  * One compact trailing note for peers that didn't answer the `--fleet`
16
25
  * fan-out — unreachable, running an agents-cli too old to carry `projects
@@ -28,6 +37,25 @@ export declare function formatFleetSkippedNote(skipped: string[]): string;
28
37
  * expected answer here (`undefined`), not something to report.
29
38
  */
30
39
  export declare function originSlug(cwd: string): string | undefined;
40
+ /**
41
+ * Turn a `--dir` / `--add-dir` value into a `repos[]` row.
42
+ *
43
+ * The slug comes from the DIRECTORY'S OWN origin remote, never from its path:
44
+ * a checkout at `~/src/github.com/muqsitnawaz/agents-cli` whose origin is
45
+ * `phnx-labs/agents-cli` must record the remote it actually pushes to. Pass
46
+ * `slugOverride` for a directory with no origin (a vendored tree, a fresh
47
+ * `git init`).
48
+ *
49
+ * The stored `path` is left for `writeProjectDef` to normalize home-relative,
50
+ * so the same definition re-roots on every machine.
51
+ */
52
+ export declare function projectRepoFromDir(dir: string, slugOverride?: string): {
53
+ ok: true;
54
+ repo: ProjectRepo;
55
+ } | {
56
+ ok: false;
57
+ error: string;
58
+ };
31
59
  /** One `projects list` row, pre-render. */
32
60
  export interface ProjectListRow {
33
61
  name: string;
@@ -21,7 +21,7 @@ import { getActiveSessions } from '../lib/session/active.js';
21
21
  import { gatherRemoteActive } from '../lib/session/remote-active.js';
22
22
  import { gatherRemoteAgentsJson } from '../lib/remote-agents-json.js';
23
23
  import { formatFleetSummary, formatFleetWorkspaces, parseRemoteProbe, probeProjectWorkspaces, workspaceTargetsForDef, workspaceWarnings, } from '../lib/project-probe.js';
24
- import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, } from '../lib/projects.js';
24
+ import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, projectNameForCwd, } from '../lib/projects.js';
25
25
  import { rollupSessionsByProject, withDefaultMachine, isDeadStatus, formatDeadSummary, liveDeadSplit, enrichProjectSignals, formatProjectMembersByHost, formatProjectWarnings, } from '../lib/project-status.js';
26
26
  import { fetchLinearProjectCounts } from '../lib/linear-project-counts.js';
27
27
  import { listLinearProjects, pickLinearProject } from '../lib/linear-projects.js';
@@ -33,6 +33,18 @@ import { buildLinearImportCandidates, validateImportOpts, } from '../lib/project
33
33
  export const PROJECTS_NO_FANOUT_ENV = 'AGENTS_PROJECTS_LOCAL';
34
34
  /** Max peers named in the skipped note before the rest collapse to `+N`. */
35
35
  const SKIPPED_NAME_LIMIT = 4;
36
+ /**
37
+ * Render `agents projects for-cwd`'s output for a resolved (or absent)
38
+ * project name — `--json` always prints `{"name": ...}` even on no match, so
39
+ * a scripted caller can distinguish "ran and found nothing" from a crash;
40
+ * the plain-text form prints nothing on no match. Returns '' when nothing
41
+ * should be printed.
42
+ */
43
+ export function formatForCwdOutput(name, json) {
44
+ if (json)
45
+ return JSON.stringify({ name: name ?? null });
46
+ return name ?? '';
47
+ }
36
48
  /**
37
49
  * One compact trailing note for peers that didn't answer the `--fleet`
38
50
  * fan-out — unreachable, running an agents-cli too old to carry `projects
@@ -88,6 +100,34 @@ export function originSlug(cwd) {
88
100
  return undefined;
89
101
  }
90
102
  }
103
+ /**
104
+ * Turn a `--dir` / `--add-dir` value into a `repos[]` row.
105
+ *
106
+ * The slug comes from the DIRECTORY'S OWN origin remote, never from its path:
107
+ * a checkout at `~/src/github.com/muqsitnawaz/agents-cli` whose origin is
108
+ * `phnx-labs/agents-cli` must record the remote it actually pushes to. Pass
109
+ * `slugOverride` for a directory with no origin (a vendored tree, a fresh
110
+ * `git init`).
111
+ *
112
+ * The stored `path` is left for `writeProjectDef` to normalize home-relative,
113
+ * so the same definition re-roots on every machine.
114
+ */
115
+ export function projectRepoFromDir(dir, slugOverride) {
116
+ const abs = path.resolve(expandLocalHome(dir));
117
+ if (!fs.existsSync(abs))
118
+ return { ok: false, error: `No such directory: ${abs}` };
119
+ if (!fs.statSync(abs).isDirectory())
120
+ return { ok: false, error: `Not a directory: ${abs}` };
121
+ const slug = slugOverride ?? originSlug(abs);
122
+ if (!slug) {
123
+ return {
124
+ ok: false,
125
+ error: `${abs} has no origin remote, so its slug cannot be inferred.\n` +
126
+ ` Name it explicitly: --add-dir ${dir} --slug <owner/repo>`,
127
+ };
128
+ }
129
+ return { ok: true, repo: { slug, path: toHomeRelative(abs) } };
130
+ }
91
131
  /**
92
132
  * List the workspace's Linear projects and plan their import, binding each to a
93
133
  * local checkout under the configured projects root when the names match
@@ -411,9 +451,12 @@ export function registerProjectsCommands(program) {
411
451
  examples: `
412
452
  agents projects import --from-linear # the projects you actually track
413
453
  agents projects add rush --repo phnx-labs/rush --path apps/web
454
+ agents projects add rush --root ~/src/rush --dir ~/src/rush-infra # bind another dir
455
+ agents projects set rush --add-dir ~/.agents/.system # bind one more
456
+ agents projects set rush --rm-dir ~/src/rush-infra # unbind it again
414
457
  agents projects list # definitions only (no session scan)
415
458
  agents projects list --with-agents # opt-in local active counts
416
- agents projects list --json # machine-readable defs (Factory uses this)
459
+ agents projects list --json # machine-readable defs (AGI EXT uses this)
417
460
  echo '{...}' | agents projects save --json # create/update one def from stdin
418
461
  agents projects rm rush --json # machine-readable delete
419
462
  agents projects status # every project, across the whole fleet
@@ -425,8 +468,14 @@ export function registerProjectsCommands(program) {
425
468
  `,
426
469
  notes: `
427
470
  Definitions are hand-editable YAML in ~/.agents/projects/ and sync across
428
- machines with 'agents push/pull'. Factory reads and writes only through
429
- these commands — never ~/.agents/factory/projects.json.
471
+ machines with 'agents repo push user' / 'agents repo pull user'. AGI EXT
472
+ reads and writes only through these commands — never
473
+ ~/.agents/factory/projects.json.
474
+
475
+ A project may bind several directories ('--dir' / '--add-dir'). The cwd an
476
+ agent lands in is 'defaultPath' (else 'root') — set it with --root/--path,
477
+ not with --dir. Every bound directory other than that cwd rides along as
478
+ an --add-dir grant (Claude, Codex, Cursor, Kimi, Grok consume it; others ignore).
430
479
  `,
431
480
  });
432
481
  // ---- list ----
@@ -465,6 +514,17 @@ export function registerProjectsCommands(program) {
465
514
  console.log(` ${chalk.bold(row.name.padEnd(w.name))} ${chalk.dim(row.path.padEnd(w.path))} ${chalk.cyan(row.repo.padEnd(w.repo))}${agentsSuffix}`);
466
515
  }
467
516
  });
517
+ // ---- for-cwd ----
518
+ projects
519
+ .command('for-cwd [cwd]')
520
+ .description('Resolve a directory to its defined project name (root or a repos[].path/subpath match). Defaults to the current directory.')
521
+ .option('--json', 'Machine-readable output: {"name": string | null}')
522
+ .action((cwdArg, opts) => {
523
+ const name = projectNameForCwd(cwdArg ?? process.cwd(), listProjectDefs());
524
+ const out = formatForCwdOutput(name, !!opts.json);
525
+ if (out)
526
+ console.log(out);
527
+ });
468
528
  // ---- add ----
469
529
  projects
470
530
  .command('add <name>')
@@ -472,6 +532,7 @@ export function registerProjectsCommands(program) {
472
532
  .option('--root <path>', 'Repo / monorepo root (defaults to the current git repo root)')
473
533
  .option('--path <subdir>', 'Default cwd for agents (a monorepo subdir)')
474
534
  .option('--repo <owner/repo>', 'Primary GitHub slug (defaults to the origin remote)')
535
+ .option('--dir <path...>', 'A directory this project binds; slug read from its origin. Repeatable')
475
536
  .option('--context <path:purpose...>', 'A described starting point; repeatable')
476
537
  .option('--goal <objective:measure...>', 'An outcome the project serves; repeatable')
477
538
  .option('--linear <url-or-id>', 'Linear project URL or id')
@@ -502,6 +563,18 @@ export function registerProjectsCommands(program) {
502
563
  def.defaultPath = `${root.replace(/\/$/, '')}/${opts.path.replace(/^\//, '')}`;
503
564
  if (repo)
504
565
  def.repo = repo;
566
+ if (opts.dir?.length) {
567
+ const repos = [];
568
+ for (const d of opts.dir) {
569
+ const r = projectRepoFromDir(d);
570
+ if (!r.ok) {
571
+ console.error(chalk.red(r.error));
572
+ process.exit(1);
573
+ }
574
+ repos.push(r.repo);
575
+ }
576
+ def.repos = repos;
577
+ }
505
578
  if (opts.context?.length)
506
579
  def.contexts = opts.context.map(parseContextFlag);
507
580
  if (opts.goal?.length)
@@ -513,6 +586,8 @@ export function registerProjectsCommands(program) {
513
586
  console.log(chalk.green(`Defined project "${name}"`));
514
587
  console.log(chalk.gray(` ${target}`));
515
588
  console.log(chalk.gray(` root ${def.root}${def.repo ? ` · repo ${def.repo}` : ''}`));
589
+ for (const r of def.repos ?? [])
590
+ console.log(chalk.gray(` dir ${r.path} · ${r.slug}`));
516
591
  });
517
592
  /** Merge `--device a b` (variadic) and `--devices a,b,c` (comma list) into one
518
593
  * deduped device filter; undefined when neither was given (= whole fleet). */
@@ -748,6 +823,9 @@ export function registerProjectsCommands(program) {
748
823
  .option('--path <subdir>', 'Default cwd for agents (a monorepo subdir)')
749
824
  .option('--description <text>', 'One-line description shown on the card')
750
825
  .option('--goal <objective:measure...>', 'Replace the goals this project serves; repeatable')
826
+ .option('--add-dir <path>', 'Bind another directory to this project; repeatable', (val, prev) => [...prev, val], [])
827
+ .option('--rm-dir <path>', 'Unbind a directory from this project; repeatable', (val, prev) => [...prev, val], [])
828
+ .option('--slug <owner/repo>', 'Slug for a single --add-dir whose origin cannot be read')
751
829
  .action((name, opts) => {
752
830
  const def = loadProjectDef(name);
753
831
  if (!def) {
@@ -755,10 +833,17 @@ export function registerProjectsCommands(program) {
755
833
  process.exit(1);
756
834
  }
757
835
  const fields = ['repo', 'root', 'path', 'description'].filter((k) => opts[k] !== undefined);
758
- if (fields.length === 0 && !opts.goal?.length) {
836
+ const dirWork = opts.addDir.length > 0 || opts.rmDir.length > 0;
837
+ if (fields.length === 0 && !opts.goal?.length && !dirWork) {
759
838
  console.error(chalk.red('Nothing to set. Pass a field, e.g. --repo <owner/repo>.'));
760
839
  process.exit(1);
761
840
  }
841
+ // One --slug cannot name two directories. Refuse rather than guess which
842
+ // --add-dir it was meant for.
843
+ if (opts.slug && opts.addDir.length !== 1) {
844
+ console.error(chalk.red('--slug names a single --add-dir; pass exactly one --add-dir with it.'));
845
+ process.exit(1);
846
+ }
762
847
  // Load, mutate the named fields, write back — the `link` pattern. NEVER
763
848
  // the `add --force` pattern, which rebuilds the def from flags alone and
764
849
  // silently drops linear/contexts/integrations that were not re-passed.
@@ -784,12 +869,47 @@ export function registerProjectsCommands(program) {
784
869
  }
785
870
  def.defaultPath = `${base}/${opts.path.replace(/^\//, '')}`;
786
871
  }
872
+ // --rm-dir before --add-dir, so re-pointing one directory in a single
873
+ // command (`--rm-dir old --add-dir new`) does what it reads like.
874
+ const removed = [];
875
+ for (const d of opts.rmDir) {
876
+ const target = path.resolve(expandLocalHome(d));
877
+ const before = def.repos?.length ?? 0;
878
+ def.repos = (def.repos ?? []).filter((r) => !r.path || path.resolve(expandLocalHome(r.path)) !== target);
879
+ if ((def.repos.length ?? 0) === before) {
880
+ console.error(chalk.red(`"${def.name}" does not bind ${target} — nothing to remove.`));
881
+ process.exit(1);
882
+ }
883
+ removed.push(target);
884
+ }
885
+ const added = [];
886
+ for (const d of opts.addDir) {
887
+ const r = projectRepoFromDir(d, opts.slug);
888
+ if (!r.ok) {
889
+ console.error(chalk.red(r.error));
890
+ process.exit(1);
891
+ }
892
+ const target = path.resolve(expandLocalHome(r.repo.path));
893
+ const dup = (def.repos ?? []).some((x) => x.path && path.resolve(expandLocalHome(x.path)) === target);
894
+ if (dup) {
895
+ console.error(chalk.red(`"${def.name}" already binds ${target}.`));
896
+ process.exit(1);
897
+ }
898
+ def.repos = [...(def.repos ?? []), r.repo];
899
+ added.push(r.repo);
900
+ }
901
+ if (def.repos?.length === 0)
902
+ delete def.repos;
787
903
  writeProjectDef(def);
788
904
  console.log(chalk.green(`Updated ${def.name}`));
789
905
  for (const f of fields)
790
906
  console.log(chalk.gray(` ${f} ${f === 'path' ? def.defaultPath : def[f]}`));
791
907
  if (opts.goal?.length)
792
908
  console.log(chalk.gray(` goals ${def.goals?.map((g) => g.objective).join(' · ')}`));
909
+ for (const r of removed)
910
+ console.log(chalk.gray(` - dir ${toHomeRelative(r)}`));
911
+ for (const r of added)
912
+ console.log(chalk.gray(` + dir ${r.path} · ${r.slug}`));
793
913
  });
794
914
  // ---- link ----
795
915
  projects
@@ -81,11 +81,17 @@ export async function reconnectAction(id) {
81
81
  await focusAction(recent.id, {});
82
82
  }
83
83
  export function registerReconnectCommand(program) {
84
+ // Deprecated: superseded by `agents sessions resume`, which does the same
85
+ // attach-else-recover and additionally takes a tmux alias. Hidden + warned +
86
+ // functional for one release. Bare `reconnect` targeted the most recent
87
+ // session in this directory; that default now lives on `resume`'s picker.
84
88
  const cmd = program
85
- .command('reconnect')
89
+ .command('reconnect', { hidden: true })
86
90
  .argument('[session-id]', 'Session id/prefix to reconnect (default: the most recent session started here)')
87
- .description('Re-enter a dropped agent terminal: attach the live pane if it survived, else resume the session')
91
+ .description('Deprecated use `agents sessions resume` instead.')
88
92
  .action(async (id) => {
93
+ console.warn(chalk.yellow('`agents reconnect` is deprecated — use `agents sessions resume` instead:'));
94
+ console.warn(chalk.gray(` agents sessions resume${id ? ` ${id}` : ''}`));
89
95
  await reconnectAction(id);
90
96
  });
91
97
  setHelpSections(cmd, {
@@ -103,7 +109,7 @@ export function registerReconnectCommand(program) {
103
109
  - Best-effort recovery: a living remote tmux pane is JOINED (a second client, no fork); a dropped one is RESUMED on its origin device (a copy if it was mid-run, a /continue if idle).
104
110
  - With no id, targets the most recent session started from this directory (the terminal that most likely just dropped), not the full fleet picker. Falls back to the most recent session anywhere when this directory has none.
105
111
  - This is the manual companion to the automatic reconnect that runs during a live 'agents run --device <box>' when the network blinks; use it after that gave up or the terminal tab closed.
106
- - Related: 'agents sessions focus' (attach/recover with a picker) and 'agents sessions resume' (multi-select history -> tabs).
112
+ - Deprecated: use 'agents sessions resume' it attaches a live pane, foregrounds a headless session, or recovers an ended one.
107
113
  `,
108
114
  });
109
115
  }
@@ -29,7 +29,7 @@ function resolveRepoPath(target) {
29
29
  return path.join(HOME, `.agents-${trimmed}`);
30
30
  }
31
31
  import { applyExtraAliasToVersions, ensureAgentsDir, getExtraRepoDir, getSystemAgentsDir, getUserAgentsDir, readMeta, resolveExtraRepoDir, updateMeta, } from '../lib/state.js';
32
- import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, getRemoteUrl, sameGitRemote, displayHomePath, } from '../lib/git.js';
32
+ import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, getRemoteUrl, sameGitRemote, displayHomePath, syncRepoGit, } from '../lib/git.js';
33
33
  import { DEFAULT_SYSTEM_REPO } from '../lib/types.js';
34
34
  import { ALL_AGENT_IDS, isAgentName, resolveAgentName } from '../lib/agents.js';
35
35
  import { refresh } from '../lib/refresh.js';
@@ -1089,6 +1089,47 @@ export function registerRepoCommands(program) {
1089
1089
  }
1090
1090
  }
1091
1091
  });
1092
+ // agents repo sync <name> — git-level sync for a single DotAgents repo.
1093
+ // Replaces the git portion of the old `agents sync <repo>` verb.
1094
+ // Semantics: system is pull-only (push: false); user and enabled extras push.
1095
+ repoCmd
1096
+ .command('sync <alias>')
1097
+ .description('Git-sync a repo: pull (and push for user/extras). Aliases: "system", "user", or a registered extra.')
1098
+ .addHelpText('after', `
1099
+ Examples:
1100
+ # Pull the system repo (read-only mirror)
1101
+ agents repo sync system
1102
+
1103
+ # Pull and push the user repo
1104
+ agents repo sync user
1105
+
1106
+ # Sync a registered extra
1107
+ agents repo sync work
1108
+ `)
1109
+ .action(async (alias) => {
1110
+ const targets = collectRepoTargets(alias);
1111
+ if (!targets) {
1112
+ process.exitCode = 1;
1113
+ return;
1114
+ }
1115
+ for (const t of targets) {
1116
+ if (!fs.existsSync(t.dir) || !isGitRepo(t.dir)) {
1117
+ console.log(chalk.yellow(` ${t.alias}: not a git repo, skipping`));
1118
+ continue;
1119
+ }
1120
+ const push = t.alias !== 'system';
1121
+ const spinner = ora(`Syncing ${formatRepoTarget(t.alias, t.dir)}...`).start();
1122
+ const result = await syncRepoGit(t.dir, { push });
1123
+ if (result.success) {
1124
+ const pushed = result.pushed ? ' (pushed)' : '';
1125
+ spinner.succeed(`${formatRepoTarget(t.alias, t.dir)}: ${result.commit}${pushed}`);
1126
+ }
1127
+ else {
1128
+ spinner.fail(`${formatRepoTarget(t.alias, t.dir)}: ${result.error}`);
1129
+ process.exitCode = 1;
1130
+ }
1131
+ }
1132
+ });
1092
1133
  // Deprecated: superseded by `agents sync`. `agents sync --local` runs the same
1093
1134
  // reconcile stage (sync-umbrella.ts calls this exact `refresh()`), and `agents
1094
1135
  // sync <agent>` targets one agent — with the added reach `refresh` lacks
@@ -35,6 +35,23 @@ export interface ResourceViewOptions {
35
35
  filterVersion?: string;
36
36
  /** Emit machine-readable JSON instead of the picker/table (for agents/scripts). */
37
37
  json?: boolean;
38
+ /**
39
+ * Show the "Synced" column. Default true — the central-storage commands all
40
+ * answer "which agent versions have this?". `agents inspect <repo>` does not:
41
+ * there the repo IS the source, and empty `targets` would render the
42
+ * misleading "no installed versions". Set false to drop the column entirely.
43
+ */
44
+ showSync?: boolean;
45
+ /**
46
+ * Cap for the Name column. Defaults to NAME_CAP (22), which suits the
47
+ * central-storage commands. Kinds whose rows have no description — hooks are
48
+ * all script names and no prose — want a wider cap, otherwise four pairs of
49
+ * `00-agent-verify-work-complete…` truncate to the same string while the
50
+ * empty Description column wastes the rest of the terminal.
51
+ */
52
+ nameCap?: number;
53
+ /** Per-row OSC-8 link target, keyed by row name; makes names clickable. */
54
+ linkFor?: (row: ResourceRow) => string | undefined;
38
55
  }
39
56
  /** Display a resource list: interactive picker in TTY mode, plain table otherwise. */
40
57
  export declare function showResourceList(opts: ResourceViewOptions): Promise<void>;