@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
@@ -30,5 +30,10 @@
30
30
  * sub-50ms steady state. Keep changes here surgical.
31
31
  */
32
32
  import { Command } from 'commander';
33
+ /**
34
+ * Attach the resource-selector flag family to the sync command.
35
+ * Exported for testing flag registration in sync.test.ts.
36
+ */
37
+ export declare function addSelectorOptions(cmd: Command): Command;
33
38
  /** Register the `agents sync` command. */
34
39
  export declare function registerSyncCommand(program: Command): void;
@@ -30,10 +30,11 @@
30
30
  * sub-50ms steady state. Keep changes here surgical.
31
31
  */
32
32
  import * as path from 'path';
33
+ import { Option } from 'commander';
33
34
  import chalk from 'chalk';
34
35
  import { resolveSyncPassphraseFromEnv } from '../lib/secrets/sync-passphrase.js';
35
36
  import { agentLabel, resolveAgentName, MANAGED_AGENT_IDS, isAgentHardDeprecated, hardDeprecationError } from '../lib/agents.js';
36
- import { isVersionInstalled, syncResourcesToVersion, parseAgentSpec, resolveVersion, resolveVersionAlias, listInstalledVersions, getAvailableResources, getActuallySyncedResources, getProjectOnlyResources, getNewResources, hasNewResources, promptResourceSelection, promptNewResourceSelection, buildRepoScopedSelection, mergeRepoScopedSelections, listRepoNames, getVersionHomePath, } from '../lib/versions.js';
37
+ import { isVersionInstalled, syncResourcesToVersion, parseAgentSpec, resolveVersion, resolveVersionAlias, listInstalledVersions, getAvailableResources, getActuallySyncedResources, getProjectOnlyResources, getNewResources, hasNewResources, promptResourceSelection, promptNewResourceSelection, buildSelection, mergeRepoScopedSelections, listRepoNames, getVersionHomePath, } from '../lib/versions.js';
37
38
  import { capableAgents } from '../lib/capabilities.js';
38
39
  import { parseHookManifest, registerHooksToSettings } from '../lib/hooks.js';
39
40
  import { compileRulesForProject } from '../lib/rules/compile.js';
@@ -48,13 +49,94 @@ import { getSystemAgentsDir, getUserAgentsDir, getEnabledExtraRepos } from '../l
48
49
  function emitJson(payload) {
49
50
  console.log(JSON.stringify(payload));
50
51
  }
52
+ /**
53
+ * Translate per-kind CLI flags into a `ResourceSelection` for `buildSelection`.
54
+ * Returns `undefined` when no kind flag was given (caller should use full sync).
55
+ *
56
+ * Each kind has a singular primary flag and a hidden plural alias; both carry
57
+ * the same value. `true` = bare flag (all names for that kind), `string[]` =
58
+ * explicit name filter, `undefined` = flag not used.
59
+ *
60
+ * --rule / --rules / --memory all map to the `memory` key (always `'all'` —
61
+ * the composed file is recompiled from every layer, individual names ignored).
62
+ */
63
+ function parseKindSelection(opts) {
64
+ function resolve(singular, plural) {
65
+ const val = singular ?? plural;
66
+ if (val === undefined)
67
+ return undefined;
68
+ return val === true ? 'all' : val;
69
+ }
70
+ const plugins = resolve(opts.plugin, opts.plugins);
71
+ const commands = resolve(opts.command, opts.commands);
72
+ const skills = resolve(opts.skill, opts.skills);
73
+ const hooks = resolve(opts.hook, opts.hooks);
74
+ const subagents = resolve(opts.subagent, opts.subagents);
75
+ const permissions = resolve(opts.permission, opts.permissions);
76
+ const mcp = resolve(opts.mcp, opts.mcps);
77
+ const workflows = resolve(opts.workflow, opts.workflows);
78
+ // --rule/--rules/--memory all enable a full memory recompile (no name filter).
79
+ const memory = (opts.rule || opts.rules || opts.memory) ? 'all' : undefined;
80
+ const anySet = [plugins, commands, skills, hooks, subagents, permissions, mcp, workflows, memory]
81
+ .some(v => v !== undefined);
82
+ if (!anySet)
83
+ return undefined;
84
+ const sel = {};
85
+ if (plugins)
86
+ sel.plugins = plugins;
87
+ if (commands)
88
+ sel.commands = commands;
89
+ if (skills)
90
+ sel.skills = skills;
91
+ if (hooks)
92
+ sel.hooks = hooks;
93
+ if (subagents)
94
+ sel.subagents = subagents;
95
+ if (permissions)
96
+ sel.permissions = permissions;
97
+ if (mcp)
98
+ sel.mcp = mcp;
99
+ if (workflows)
100
+ sel.workflows = workflows;
101
+ if (memory)
102
+ sel.memory = memory;
103
+ return sel;
104
+ }
105
+ /**
106
+ * Attach the resource-selector flag family to the sync command.
107
+ * Exported for testing flag registration in sync.test.ts.
108
+ */
109
+ export function addSelectorOptions(cmd) {
110
+ const kindCollector = (val, prev) => {
111
+ const names = val.split(',').map((s) => s.trim()).filter(Boolean);
112
+ const base = Array.isArray(prev) ? prev : [];
113
+ return [...base, ...names];
114
+ };
115
+ function addKindPair(singular, plural, desc) {
116
+ cmd.addOption(new Option(`--${singular} [names]`, desc).argParser(kindCollector));
117
+ cmd.addOption(new Option(`--${plural} [names]`, `Alias of --${singular}`).argParser(kindCollector).hideHelp());
118
+ }
119
+ addKindPair('plugin', 'plugins', 'Sync only plugins (bare = all; comma-separated names to filter)');
120
+ addKindPair('command', 'commands', 'Sync only commands (bare = all; comma-separated names to filter)');
121
+ addKindPair('skill', 'skills', 'Sync only skills (bare = all; comma-separated names to filter)');
122
+ addKindPair('hook', 'hooks', 'Sync only hooks (bare = all; comma-separated names to filter)');
123
+ addKindPair('subagent', 'subagents', 'Sync only subagents (bare = all; comma-separated names to filter)');
124
+ addKindPair('permission', 'permissions', 'Sync only permissions (bare = all; comma-separated names to filter)');
125
+ addKindPair('mcp', 'mcps', 'Sync only MCP servers (bare = all; comma-separated names to filter)');
126
+ addKindPair('workflow', 'workflows', 'Sync only workflows (bare = all; comma-separated names to filter)');
127
+ cmd.addOption(new Option('--rule [names]', 'Sync only the rules/memory file (maps to the "memory" key — the whole file is always recompiled, individual names are not filtered)').argParser(kindCollector));
128
+ cmd.addOption(new Option('--rules [names]', 'Alias of --rule').argParser(kindCollector).hideHelp());
129
+ cmd.addOption(new Option('--memory', 'Sync only the rules/memory file (alias of --rule with no name filter)'));
130
+ cmd.addOption(new Option('--version <spec>', 'Agent version or selector: @latest, @oldest, @pinned (= @default), @all, or a concrete x.y.z. "all" targets every installed version non-interactively.'));
131
+ return cmd;
132
+ }
51
133
  /** Register the `agents sync` command. */
52
134
  export function registerSyncCommand(program) {
53
- addHostOption(program.command('sync [agentSpec] [repo]'))
135
+ const cmd = addHostOption(program.command('sync [agentSpec] [repo]'))
54
136
  .summary('Make this machine current, or sync resources into one agent')
55
- .description('With an [agentSpec], syncs resources (commands, skills, hooks, rules, MCPs, plugins, etc.) into that installed agent version — previews changes and lets you pick. e.g. "claude", "claude@2.1.142", a selector: @latest / @oldest / @pinned (= @default), or @all for every installed version.\n\nAppend a [repo] (or pass --repo) to scope the sync to a single DotAgent repo — system / user / project / <alias>. e.g. "agents sync claude@all system" reconciles only the system repo\'s resources into every installed Claude.\n\nGive a DotAgent repo name ALONE — "agents sync system" / "agents sync user" / "agents sync <alias>" — to git-sync that one repo: refuse if the tree is dirty, else git pull --rebase against origin. The user repo and extra aliases also push local commits up; the system repo is a pull-only mirror.\n\nWith NO agent, runs the umbrella verb: fetch the config repos then reconcile them into every installed agent. Secrets are opt-in — add --secrets to pull secret bundles. Session transcripts are queryable live via "agents sessions --host <machine>", or moved with "agents sessions export/import". Also: --cloud (fetch only), --local (reconcile only).')
137
+ .description('With an [agentSpec], syncs resources (commands, skills, hooks, rules, MCPs, plugins, etc.) into that installed agent version — previews changes and lets you pick. e.g. "claude", "claude@2.1.142", a selector: @latest / @oldest / @pinned (= @default), or @all for every installed version.\n\nAppend a [repo] (or pass --repo) to scope the sync to a single DotAgent repo — system / user / project / <alias>. e.g. "agents sync claude@all system" reconciles only the system repo\'s resources into every installed Claude.\n\nGive a DotAgent repo name ALONE — "agents sync system" / "agents sync user" / "agents sync <alias>" — to git-sync that one repo: git pull --rebase against origin when the tree is clean; when it is dirty, fast-forward anyway if no incoming path is uncommitted, else refuse and name what collided. The user repo and extra aliases also push local commits up; the system repo is a pull-only mirror.\n\nWith NO agent, runs the umbrella verb: fetch the config repos then reconcile them into every installed agent. Secrets are opt-in — add --secrets to pull secret bundles. Session transcripts are queryable live via "agents sessions --host <machine>", or moved with "agents sessions export/import". Also: --cloud (fetch only), --local (reconcile only).')
56
138
  .option('--agent <agent>', 'Agent identifier (legacy form; prefer the positional spec)')
57
- .option('--agent-version <version>', 'Version to sync into (legacy form; prefer "agent@version")')
139
+ .option('--agent-version <version>', 'Version to sync into (legacy form; prefer "agent@version" or --version)')
58
140
  .option('--repo <name>', 'Scope the sync to a single DotAgent repo: system / user / project / <alias> (also accepted as a positional)')
59
141
  .option('--project-dir <path>', 'Path to project-level .agents/ directory containing project-scoped resources')
60
142
  .option('--cwd <path>', 'Working directory for discovering project manifest and resources')
@@ -62,6 +144,8 @@ export function registerSyncCommand(program) {
62
144
  .option('-y, --yes', 'Skip the interactive preview and auto-sync all detected resources', false)
63
145
  .option('--force', 'Re-sync even if no changes are detected since the last sync', false)
64
146
  .option('--quiet', 'Suppress all output (exit code indicates success)', false)
147
+ .option('--dry-run', 'Show what would be synced without making any changes', false)
148
+ .option('--allow-exec-surfaces', 'Allow syncing plugin exec surfaces (scripts, binaries) — off by default for safety', false)
65
149
  .option('--json', 'Emit machine-readable JSON (also accepted so fleet fan-out via --host all can parse each peer)', false)
66
150
  // Umbrella verb (no agent given): make this machine current.
67
151
  .option('--repos', 'Umbrella: git-pull ~/.agents + enabled ~/.agents-* extras', false)
@@ -71,6 +155,9 @@ export function registerSyncCommand(program) {
71
155
  .action(async (agentSpec, repo, opts) => {
72
156
  await runSync(agentSpec, repo, opts);
73
157
  });
158
+ // Per-kind resource selectors + --version. Registered after the main flags so
159
+ // help output groups the positional/repo/agent flags first.
160
+ addSelectorOptions(cmd);
74
161
  }
75
162
  /**
76
163
  * Resolve a DotAgent repo name to its git working directory + whether local
@@ -90,9 +177,10 @@ function resolveRepoGitTarget(repo) {
90
177
  return null;
91
178
  }
92
179
  /**
93
- * `agents sync <repo>` — git-sync a single DotAgent repo: refuse on a dirty
94
- * tree, else pull --rebase against origin, pushing local commits for user-owned
95
- * repos. Delegates the git work to `syncRepoGit`.
180
+ * `agents sync <repo>` — git-sync a single DotAgent repo: pull --rebase against
181
+ * origin on a clean tree; on a dirty one, fast-forward anyway when no incoming
182
+ * path is uncommitted, else refuse naming the collision. Pushes local commits
183
+ * for user-owned repos. Delegates the git work to `syncRepoGit`.
96
184
  */
97
185
  async function runRepoGitSync(repo, quiet, outLog, errLog, json = false) {
98
186
  const target = resolveRepoGitTarget(repo);
@@ -219,7 +307,7 @@ async function runInteractiveReconcile(opts, outLog, errLog) {
219
307
  const version = resolveVersion(agentId, cwd) || listInstalledVersions(agentId).slice(-1)[0];
220
308
  if (!version)
221
309
  continue;
222
- const result = syncResourcesToVersion(agentId, version, selection, { cwd });
310
+ const result = syncResourcesToVersion(agentId, version, selection, { cwd, prune: true });
223
311
  printSyncDetail(result, agentId, version, cwd);
224
312
  if (result.hooks && hookCapable.has(agentId) && Object.keys(hookManifest).length > 0) {
225
313
  registerHooksToSettings(agentId, getVersionHomePath(agentId, version), hookManifest);
@@ -336,7 +424,13 @@ async function runSync(agentSpec, repoArg, opts) {
336
424
  // user-owned repos. This is distinct from the [repo] resource-scoping arg
337
425
  // below, and it precedes agent-spec parsing because repo names like
338
426
  // "system"/"user" would otherwise fail parseAgentSpec.
427
+ //
428
+ // DEPRECATED: prefer `agents repo sync <name>` — this positional form will be
429
+ // removed in a future release.
339
430
  if (agentSpec && !opts.agent && !repoArg && listRepoNames().includes(agentSpec)) {
431
+ if (!quiet && !json) {
432
+ console.error(chalk.yellow(`Warning: 'agents sync ${agentSpec}' is deprecated. Use: agents repo sync ${agentSpec}`));
433
+ }
340
434
  await runRepoGitSync(agentSpec, quiet, outLog, errLog, json);
341
435
  return;
342
436
  }
@@ -359,6 +453,10 @@ async function runSync(agentSpec, repoArg, opts) {
359
453
  if (agentSpec.includes('@'))
360
454
  selector = parsed.version;
361
455
  }
456
+ // --version flag beats any @selector from the positional.
457
+ // Strip a leading @ so '--version @latest' and '--version latest' both work.
458
+ if (opts.version)
459
+ selector = opts.version.replace(/^@/, '');
362
460
  // Repo scope: --repo flag wins over the positional. Validate against the
363
461
  // known DotAgent repos so a typo fails loudly instead of syncing nothing.
364
462
  const repoScope = opts.repo || repoArg;
@@ -407,9 +505,20 @@ async function runSync(agentSpec, repoArg, opts) {
407
505
  const projectDir = opts.projectDir;
408
506
  const cwd = opts.cwd || process.cwd();
409
507
  const force = !!opts.force;
508
+ // Promote to @all when no version can be resolved and multiple are installed.
509
+ // Replaces the old "no default version pinned" error: bare `agents sync claude`
510
+ // with multiple installed versions and no pinned default now syncs them all.
511
+ if (!selector && !version && !opts.agentVersion) {
512
+ const pinned = resolveVersion(agentId, opts.cwd || process.cwd());
513
+ if (!pinned) {
514
+ const installed = listInstalledVersions(agentId);
515
+ if (installed.length > 1)
516
+ selector = 'all';
517
+ }
518
+ }
410
519
  // ---------- 2a. @all: reconcile every installed version of this agent ----------
411
520
  // Non-interactive by design — fanning an interactive preview across N
412
- // versions is unusable. Honors an optional repo scope.
521
+ // versions is unusable. Honors optional repo scope and per-kind flags.
413
522
  if (selector === 'all') {
414
523
  const installed = listInstalledVersions(agentId);
415
524
  if (installed.length === 0) {
@@ -421,23 +530,45 @@ async function runSync(agentSpec, repoArg, opts) {
421
530
  process.exitCode = 1;
422
531
  return;
423
532
  }
533
+ const kindFilter = parseKindSelection(opts);
424
534
  let selection;
425
- if (repoScope) {
426
- selection = buildRepoScopedSelection(repoScope, cwd);
535
+ if (repoScope || kindFilter) {
536
+ selection = buildSelection(repoScope ? [`${repoScope}:*`] : [], kindFilter ?? undefined, cwd);
427
537
  if (Object.keys(selection).length === 0) {
428
538
  if (json)
429
539
  emitJson({ ok: true, mode: 'agent-all', agent: agentId, repo: repoScope, versions: [], note: 'nothing to sync' });
430
540
  else
431
- outLog(chalk.gray(`Nothing from repo '${repoScope}' to sync.`));
541
+ outLog(chalk.gray(`Nothing to sync${repoScope ? ` from repo '${repoScope}'` : ''}.`));
432
542
  return;
433
543
  }
434
544
  }
435
545
  const scopeLabel = repoScope ? chalk.gray(` (repo: ${repoScope})`) : '';
436
546
  if (!json)
437
547
  outLog(chalk.cyan(`Syncing ${installed.length} ${agentLabel(agentId)} version(s)${scopeLabel}.`));
548
+ if (opts.dryRun) {
549
+ if (!quiet && !json) {
550
+ console.log(chalk.cyan(`Dry run — would sync ${agentLabel(agentId)} (${installed.length} version(s))${scopeLabel}:`));
551
+ if (selection) {
552
+ for (const [k, v] of Object.entries(selection)) {
553
+ const names = v === 'all' ? chalk.gray('(all)') : v.join(', ');
554
+ console.log(chalk.gray(` ${k}: ${names}`));
555
+ }
556
+ }
557
+ else {
558
+ console.log(chalk.gray(' (all resources)'));
559
+ }
560
+ }
561
+ if (json)
562
+ emitJson({ ok: true, mode: 'dry-run', agent: agentId, repo: repoScope, versions: installed, selection: selection ?? 'all' });
563
+ return;
564
+ }
438
565
  const versions = [];
439
566
  for (const v of installed) {
440
- const result = syncResourcesToVersion(agentId, v, selection, { projectDir, cwd, force });
567
+ // A repo scope makes @all a full reconcile of that repo → prune resources
568
+ // it no longer provides. Bare @all (no repo) leaves selection undefined
569
+ // and falls through to the full-sync orphan sweep, so prune is a no-op
570
+ // there (it requires a caller selection).
571
+ const result = syncResourcesToVersion(agentId, v, selection, { projectDir, cwd, force, prune: !!repoScope, allowExecSurfaces: !!opts.allowExecSurfaces });
441
572
  versions.push({ version: v, result });
442
573
  if (!quiet && !json)
443
574
  printSyncDetail(result, agentId, v, cwd);
@@ -459,6 +590,7 @@ async function runSync(agentSpec, repoArg, opts) {
459
590
  subagents: result.subagents,
460
591
  plugins: result.plugins,
461
592
  workflows: result.workflows,
593
+ pruned: result.pruned,
462
594
  })),
463
595
  });
464
596
  }
@@ -489,17 +621,19 @@ async function runSync(agentSpec, repoArg, opts) {
489
621
  return;
490
622
  }
491
623
  else {
624
+ // Multiple installed, no default — promoted to @all before reaching here.
625
+ // This branch is a safety net for unexpected flow; normal callers won't hit it.
492
626
  failJson({
493
627
  mode: 'agent',
494
628
  agent: agentId,
495
629
  error: `No default ${agentLabel(agentId)} version pinned.`,
496
630
  installed,
631
+ hint: `Use agents sync ${agentId}@all to sync every installed version, or agents sync ${agentId}@latest for the newest.`,
497
632
  });
498
633
  if (!json) {
499
- errLog(chalk.red(`No default ${agentLabel(agentId)} version pinned. Specify one:`));
500
- for (const v of installed) {
501
- errLog(chalk.gray(` agents sync ${agentId}@${v}`));
502
- }
634
+ errLog(chalk.red(`No default ${agentLabel(agentId)} version pinned.`));
635
+ errLog(chalk.gray(` Sync all: agents sync ${agentId}@all`));
636
+ errLog(chalk.gray(` Sync newest: agents sync ${agentId}@latest`));
503
637
  }
504
638
  process.exitCode = 1;
505
639
  return;
@@ -530,11 +664,12 @@ async function runSync(agentSpec, repoArg, opts) {
530
664
  runLaunchMode(agentId, version, cwd, quiet, json);
531
665
  return;
532
666
  }
533
- // ---------- 3b. Repo-scoped single-version sync ----------
534
- // An explicit --repo / positional repo is a targeted request, so skip the
535
- // interactive preview and reconcile just that repo's resources.
536
- if (repoScope) {
537
- const scoped = buildRepoScopedSelection(repoScope, cwd);
667
+ // ---------- 3b. Repo-scoped or kind-filtered single-version sync ----------
668
+ // An explicit --repo / positional repo, or any per-kind flag, is a targeted
669
+ // request: skip the interactive preview and reconcile only the specified scope.
670
+ const kindFilter = parseKindSelection(opts);
671
+ if (repoScope || kindFilter) {
672
+ const scoped = buildSelection(repoScope ? [`${repoScope}:*`] : [], kindFilter ?? undefined, cwd);
538
673
  if (Object.keys(scoped).length === 0) {
539
674
  if (json) {
540
675
  emitJson({
@@ -542,16 +677,28 @@ async function runSync(agentSpec, repoArg, opts) {
542
677
  mode: 'agent',
543
678
  agent: agentId,
544
679
  version,
545
- repo: repoScope,
680
+ ...(repoScope !== undefined ? { repo: repoScope } : {}),
546
681
  note: 'nothing to sync',
547
682
  });
548
683
  }
549
684
  else {
550
- outLog(chalk.gray(`Nothing from repo '${repoScope}' to sync into ${agentLabel(agentId)}@${version}.`));
685
+ outLog(chalk.gray(`Nothing to sync${repoScope ? ` from repo '${repoScope}'` : ''} into ${agentLabel(agentId)}@${version}.`));
686
+ }
687
+ return;
688
+ }
689
+ if (opts.dryRun) {
690
+ if (!quiet && !json) {
691
+ console.log(chalk.cyan(`Dry run — would sync into ${agentLabel(agentId)}@${version}${repoScope ? ` (repo: ${repoScope})` : ''}:`));
692
+ for (const [k, v] of Object.entries(scoped)) {
693
+ const names = v === 'all' ? chalk.gray('(all)') : v.join(', ');
694
+ console.log(chalk.gray(` ${k}: ${names}`));
695
+ }
551
696
  }
697
+ if (json)
698
+ emitJson({ ok: true, mode: 'dry-run', agent: agentId, version, repo: repoScope, selection: scoped });
552
699
  return;
553
700
  }
554
- const result = syncResourcesToVersion(agentId, version, scoped, { projectDir, cwd, force });
701
+ const result = syncResourcesToVersion(agentId, version, scoped, { projectDir, cwd, force, prune: !!repoScope, allowExecSurfaces: !!opts.allowExecSurfaces });
555
702
  if (json) {
556
703
  emitJson(agentSyncJson(agentId, version, result, repoScope));
557
704
  }
@@ -606,7 +753,24 @@ async function runSync(agentSpec, repoArg, opts) {
606
753
  }
607
754
  }
608
755
  // ---------- 5. Run sync ----------
609
- const result = syncResourcesToVersion(agentId, version, selection, { projectDir, cwd, force });
756
+ if (opts.dryRun) {
757
+ if (!quiet && !json) {
758
+ console.log(chalk.cyan(`Dry run — would sync into ${agentLabel(agentId)}@${version}${repoScope ? ` (repo: ${repoScope})` : ''}:`));
759
+ if (selection) {
760
+ for (const [k, v] of Object.entries(selection)) {
761
+ const names = v === 'all' ? chalk.gray('(all)') : v.join(', ');
762
+ console.log(chalk.gray(` ${k}: ${names}`));
763
+ }
764
+ }
765
+ else {
766
+ console.log(chalk.gray(' (all resources)'));
767
+ }
768
+ }
769
+ if (json)
770
+ emitJson({ ok: true, mode: 'dry-run', agent: agentId, version, repo: repoScope, selection: selection ?? 'all' });
771
+ return;
772
+ }
773
+ const result = syncResourcesToVersion(agentId, version, selection, { projectDir, cwd, force, allowExecSurfaces: !!opts.allowExecSurfaces });
610
774
  // Compile project-scope rules into the workspace itself so each agent's
611
775
  // native loader picks up cwd/<INSTRUCTIONS_FILE>. projectDir is the
612
776
  // .agents/ directory; the workspace root is its parent.
@@ -661,6 +825,7 @@ function agentSyncJson(agent, version, result, repo) {
661
825
  plugins: result.plugins,
662
826
  workflows: result.workflows,
663
827
  projectSkipped: result.projectSkipped,
828
+ pruned: result.pruned,
664
829
  };
665
830
  }
666
831
  function anyResources(r) {
@@ -694,22 +859,37 @@ function printSyncDetail(result, agent, version, cwd) {
694
859
  if (result.workflows.length > 0)
695
860
  lines.push({ kind: 'workflows', items: result.workflows });
696
861
  const kept = formatKeptProjectResources(result.projectSkipped);
697
- if (lines.length === 0) {
862
+ // Removals from source-deleted resources (RUSH-2438). Rendered even when
863
+ // nothing was added, so a reconcile that only pruned still reports it.
864
+ const prunedLines = Object.entries(result.pruned)
865
+ .filter(([, names]) => names.length > 0)
866
+ .map(([kind, names]) => ({ kind, items: names }));
867
+ if (lines.length === 0 && prunedLines.length === 0) {
698
868
  console.log(chalk.gray(`Already in sync — ${agentLabel(agent)}@${version}`));
699
869
  if (kept)
700
870
  console.log(chalk.gray(kept));
701
871
  return;
702
872
  }
703
- console.log(chalk.green(`Synced to ${agentLabel(agent)}@${version}:`));
704
- const kindWidth = Math.max(...lines.map(l => l.kind.length));
705
873
  const PREVIEW = 5;
706
- for (const { kind, items } of lines) {
707
- const padded = kind.padEnd(kindWidth);
874
+ const printKindLine = (label, items, width, color) => {
875
+ const padded = label.padEnd(width);
708
876
  const sorted = [...items].sort((a, b) => a.localeCompare(b));
709
877
  const preview = sorted.slice(0, PREVIEW).join(', ');
710
878
  const more = sorted.length > PREVIEW ? chalk.gray(`, +${sorted.length - PREVIEW} more`) : '';
711
- const count = chalk.cyan(`(${sorted.length})`.padStart(5));
879
+ const count = color(`(${sorted.length})`.padStart(5));
712
880
  console.log(` ${chalk.bold(padded)} ${count} ${chalk.gray(preview)}${more}`);
881
+ };
882
+ if (lines.length > 0) {
883
+ console.log(chalk.green(`Synced to ${agentLabel(agent)}@${version}:`));
884
+ const kindWidth = Math.max(...lines.map(l => l.kind.length));
885
+ for (const { kind, items } of lines)
886
+ printKindLine(kind, items, kindWidth, chalk.cyan);
887
+ }
888
+ if (prunedLines.length > 0) {
889
+ console.log(chalk.yellow(`Pruned from ${agentLabel(agent)}@${version} (removed from source):`));
890
+ const kindWidth = Math.max(...prunedLines.map(l => l.kind.length));
891
+ for (const { kind, items } of prunedLines)
892
+ printKindLine(kind, items, kindWidth, chalk.yellow);
713
893
  }
714
894
  if (kept)
715
895
  console.log(chalk.gray(kept));
@@ -87,6 +87,19 @@ export declare function decideTeamMessageRoute(status: AgentStatus, hasMessage:
87
87
  * owning this worktree.
88
88
  */
89
89
  export declare function tearDownOrphanWorktree(mgr: AgentManager, baseCwd: string, name: string): Promise<void>;
90
+ /**
91
+ * The blocking message when `teams add` is pointed at a stale checkout. Pure so
92
+ * the guidance is pinned by tests (mirrors `remoteCwdOnAddError`): it MUST name
93
+ * how far behind, tell the caller to sync with remote main, and mention `--confirm`
94
+ * as the override.
95
+ */
96
+ export declare function staleRepoError(params: {
97
+ team: string;
98
+ where: string;
99
+ behind: number;
100
+ base: string;
101
+ sync: string;
102
+ }): string;
90
103
  /**
91
104
  * Register the generic cloud dispatcher — staged cloud teammates get
92
105
  * dispatched when their --after deps resolve, using repo/branch stored on