borgmcp 1.1.15 → 2.0.2

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 (466) hide show
  1. package/CONTRIBUTING.md +15 -0
  2. package/LICENSE +201 -33
  3. package/NOTICE +2 -0
  4. package/README.md +85 -36
  5. package/SECURITY.md +7 -0
  6. package/dist/agent-runtime.d.ts.map +1 -0
  7. package/dist/agent-runtime.js +63 -1
  8. package/dist/agent-runtime.js.map +1 -0
  9. package/dist/assimilate-cmd.d.ts +96 -17
  10. package/dist/assimilate-cmd.d.ts.map +1 -0
  11. package/dist/assimilate-cmd.js +1396 -48
  12. package/dist/assimilate-cmd.js.map +1 -0
  13. package/dist/assimilate-deps.d.ts.map +1 -0
  14. package/dist/assimilate-deps.js +384 -3
  15. package/dist/assimilate-deps.js.map +1 -0
  16. package/dist/assimilate-guard.d.ts +5 -7
  17. package/dist/assimilate-guard.d.ts.map +1 -0
  18. package/dist/assimilate-guard.js +60 -2
  19. package/dist/assimilate-guard.js.map +1 -0
  20. package/dist/assimilate-welcome.d.ts +1 -1
  21. package/dist/assimilate-welcome.d.ts.map +1 -0
  22. package/dist/assimilate-welcome.js +32 -2
  23. package/dist/assimilate-welcome.js.map +1 -0
  24. package/dist/auth-env.d.ts +7 -50
  25. package/dist/auth-env.d.ts.map +1 -0
  26. package/dist/auth-env.js +22 -1
  27. package/dist/auth-env.js.map +1 -0
  28. package/dist/backends/launch-all-pastelist.d.ts.map +1 -0
  29. package/dist/backends/launch-all-pastelist.js +11 -4
  30. package/dist/backends/launch-all-pastelist.js.map +1 -0
  31. package/dist/backends/launch-all-tmux.d.ts.map +1 -0
  32. package/dist/backends/launch-all-tmux.js +49 -1
  33. package/dist/backends/launch-all-tmux.js.map +1 -0
  34. package/dist/backends/launch-all-windows.d.ts.map +1 -0
  35. package/dist/backends/launch-all-windows.js +86 -12
  36. package/dist/backends/launch-all-windows.js.map +1 -0
  37. package/dist/bare-launch-menu.d.ts.map +1 -0
  38. package/dist/bare-launch-menu.js +83 -6
  39. package/dist/bare-launch-menu.js.map +1 -0
  40. package/dist/claude-launch-args.d.ts.map +1 -0
  41. package/dist/claude-launch-args.js +34 -1
  42. package/dist/claude-launch-args.js.map +1 -0
  43. package/dist/claude.d.ts.map +1 -0
  44. package/dist/claude.js +486 -14
  45. package/dist/claude.js.map +1 -0
  46. package/dist/cleanup-cmd.d.ts +5 -5
  47. package/dist/cleanup-cmd.d.ts.map +1 -0
  48. package/dist/cleanup-cmd.js +453 -14
  49. package/dist/cleanup-cmd.js.map +1 -0
  50. package/dist/clear-rewake-core.d.ts.map +1 -0
  51. package/dist/clear-rewake-core.js +23 -2
  52. package/dist/clear-rewake-core.js.map +1 -0
  53. package/dist/clear-rewake.d.ts.map +1 -0
  54. package/dist/clear-rewake.js +19 -1
  55. package/dist/clear-rewake.js.map +1 -0
  56. package/dist/cli-help.d.ts +5 -0
  57. package/dist/cli-help.d.ts.map +1 -0
  58. package/dist/cli-help.js +104 -56
  59. package/dist/cli-help.js.map +1 -0
  60. package/dist/cli-platform.d.ts.map +1 -0
  61. package/dist/cli-platform.js +106 -4
  62. package/dist/cli-platform.js.map +1 -0
  63. package/dist/cli-tool-approval.d.ts +84 -0
  64. package/dist/cli-tool-approval.d.ts.map +1 -0
  65. package/dist/cli-tool-approval.js +583 -0
  66. package/dist/cli-tool-approval.js.map +1 -0
  67. package/dist/codex-app-server.d.ts.map +1 -0
  68. package/dist/codex-app-server.js +228 -4
  69. package/dist/codex-app-server.js.map +1 -0
  70. package/dist/codex-app-wake.d.ts +9 -11
  71. package/dist/codex-app-wake.d.ts.map +1 -0
  72. package/dist/codex-app-wake.js +436 -2
  73. package/dist/codex-app-wake.js.map +1 -0
  74. package/dist/codex-launch.d.ts.map +1 -0
  75. package/dist/codex-launch.js +102 -2
  76. package/dist/codex-launch.js.map +1 -0
  77. package/dist/codex-remote.d.ts +6 -1
  78. package/dist/codex-remote.d.ts.map +1 -0
  79. package/dist/codex-remote.js +394 -1
  80. package/dist/codex-remote.js.map +1 -0
  81. package/dist/codex-wake-resolve.d.ts +4 -4
  82. package/dist/codex-wake-resolve.d.ts.map +1 -0
  83. package/dist/codex-wake-resolve.js +127 -1
  84. package/dist/codex-wake-resolve.js.map +1 -0
  85. package/dist/config-utils.d.ts +2 -2
  86. package/dist/config-utils.d.ts.map +1 -0
  87. package/dist/config-utils.js +766 -3
  88. package/dist/config-utils.js.map +1 -0
  89. package/dist/config.d.ts +98 -61
  90. package/dist/config.d.ts.map +1 -0
  91. package/dist/config.js +426 -1
  92. package/dist/config.js.map +1 -0
  93. package/dist/console-prefix.d.ts.map +1 -0
  94. package/dist/console-prefix.js +96 -1
  95. package/dist/console-prefix.js.map +1 -0
  96. package/dist/cube-name.d.ts.map +1 -0
  97. package/dist/cube-name.js +67 -1
  98. package/dist/cube-name.js.map +1 -0
  99. package/dist/cubes.d.ts +126 -18
  100. package/dist/cubes.d.ts.map +1 -0
  101. package/dist/cubes.js +412 -4
  102. package/dist/cubes.js.map +1 -0
  103. package/dist/debug.d.ts.map +1 -0
  104. package/dist/debug.js +71 -1
  105. package/dist/debug.js.map +1 -0
  106. package/dist/direct-log.d.ts.map +1 -0
  107. package/dist/direct-log.js +11 -1
  108. package/dist/direct-log.js.map +1 -0
  109. package/dist/docs-sections.d.ts +11 -10
  110. package/dist/docs-sections.d.ts.map +1 -0
  111. package/dist/docs-sections.js +113 -3
  112. package/dist/docs-sections.js.map +1 -0
  113. package/dist/drone-lifecycle.d.ts +5 -21
  114. package/dist/drone-lifecycle.d.ts.map +1 -0
  115. package/dist/drone-lifecycle.js +57 -8
  116. package/dist/drone-lifecycle.js.map +1 -0
  117. package/dist/drone-management.d.ts +29 -0
  118. package/dist/drone-management.d.ts.map +1 -0
  119. package/dist/drone-management.js +109 -0
  120. package/dist/drone-management.js.map +1 -0
  121. package/dist/ensure-mcp-config.d.ts.map +1 -0
  122. package/dist/ensure-mcp-config.js +36 -1
  123. package/dist/ensure-mcp-config.js.map +1 -0
  124. package/dist/evict-drone.d.ts +10 -2
  125. package/dist/evict-drone.d.ts.map +1 -0
  126. package/dist/evict-drone.js +60 -1
  127. package/dist/evict-drone.js.map +1 -0
  128. package/dist/gc-orphan-inboxes.d.ts.map +1 -0
  129. package/dist/gc-orphan-inboxes.js +177 -1
  130. package/dist/gc-orphan-inboxes.js.map +1 -0
  131. package/dist/inbox-monitor.d.ts +1 -1
  132. package/dist/inbox-monitor.d.ts.map +1 -0
  133. package/dist/inbox-monitor.js +856 -3
  134. package/dist/inbox-monitor.js.map +1 -0
  135. package/dist/index.d.ts +6 -4
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +1034 -37
  138. package/dist/index.js.map +1 -0
  139. package/dist/launch-all-cmd.d.ts.map +1 -0
  140. package/dist/launch-all-cmd.js +377 -37
  141. package/dist/launch-all-cmd.js.map +1 -0
  142. package/dist/launch-all-command.d.ts.map +1 -0
  143. package/dist/launch-all-command.js +24 -1
  144. package/dist/launch-all-command.js.map +1 -0
  145. package/dist/launch-all-deps.d.ts +3 -8
  146. package/dist/launch-all-deps.d.ts.map +1 -0
  147. package/dist/launch-all-deps.js +99 -1
  148. package/dist/launch-all-deps.js.map +1 -0
  149. package/dist/launch-all-discovery.d.ts +1 -0
  150. package/dist/launch-all-discovery.d.ts.map +1 -0
  151. package/dist/launch-all-discovery.js +90 -4
  152. package/dist/launch-all-discovery.js.map +1 -0
  153. package/dist/launch-all-locks.d.ts.map +1 -0
  154. package/dist/launch-all-locks.js +54 -1
  155. package/dist/launch-all-locks.js.map +1 -0
  156. package/dist/launch-gate.d.ts +2 -2
  157. package/dist/launch-gate.d.ts.map +1 -0
  158. package/dist/launch-gate.js +73 -1
  159. package/dist/launch-gate.js.map +1 -0
  160. package/dist/lifecycle-log-guard.d.ts.map +1 -0
  161. package/dist/lifecycle-log-guard.js +93 -2
  162. package/dist/lifecycle-log-guard.js.map +1 -0
  163. package/dist/list-roles-render.d.ts.map +1 -0
  164. package/dist/list-roles-render.js +40 -6
  165. package/dist/list-roles-render.js.map +1 -0
  166. package/dist/local-log-routing.d.ts +19 -0
  167. package/dist/local-log-routing.d.ts.map +1 -0
  168. package/dist/local-log-routing.js +67 -0
  169. package/dist/local-log-routing.js.map +1 -0
  170. package/dist/local-manage-tool-result.d.ts +8 -0
  171. package/dist/local-manage-tool-result.d.ts.map +1 -0
  172. package/dist/local-manage-tool-result.js +10 -0
  173. package/dist/local-manage-tool-result.js.map +1 -0
  174. package/dist/local-server-cursor.d.ts +34 -0
  175. package/dist/local-server-cursor.d.ts.map +1 -0
  176. package/dist/local-server-cursor.js +151 -0
  177. package/dist/local-server-cursor.js.map +1 -0
  178. package/dist/log-audit.d.ts.map +1 -0
  179. package/dist/log-audit.js +194 -3
  180. package/dist/log-audit.js.map +1 -0
  181. package/dist/log-stream.d.ts +35 -18
  182. package/dist/log-stream.d.ts.map +1 -0
  183. package/dist/log-stream.js +1270 -12
  184. package/dist/log-stream.js.map +1 -0
  185. package/dist/model-presets.d.ts.map +1 -0
  186. package/dist/model-presets.js +19 -1
  187. package/dist/model-presets.js.map +1 -0
  188. package/dist/name-validator.d.ts.map +1 -0
  189. package/dist/name-validator.js +22 -1
  190. package/dist/name-validator.js.map +1 -0
  191. package/dist/opencode-drone.d.ts.map +1 -0
  192. package/dist/opencode-drone.js +438 -4
  193. package/dist/opencode-drone.js.map +1 -0
  194. package/dist/opencode-plugin.d.ts +1 -1
  195. package/dist/opencode-plugin.d.ts.map +1 -0
  196. package/dist/opencode-plugin.js +29 -4
  197. package/dist/opencode-plugin.js.map +1 -0
  198. package/dist/parse-assimilate-args.d.ts +1 -1
  199. package/dist/parse-assimilate-args.d.ts.map +1 -0
  200. package/dist/parse-assimilate-args.js +125 -1
  201. package/dist/parse-assimilate-args.js.map +1 -0
  202. package/dist/parse-launch-all-args.d.ts.map +1 -0
  203. package/dist/parse-launch-all-args.js +70 -1
  204. package/dist/parse-launch-all-args.js.map +1 -0
  205. package/dist/postinstall-banner.d.ts.map +1 -0
  206. package/dist/postinstall-banner.js +27 -2
  207. package/dist/postinstall-banner.js.map +1 -0
  208. package/dist/postinstall.d.ts.map +1 -0
  209. package/dist/postinstall.js +32 -5
  210. package/dist/postinstall.js.map +1 -0
  211. package/dist/readiness-probe.d.ts.map +1 -0
  212. package/dist/readiness-probe.js +9 -1
  213. package/dist/readiness-probe.js.map +1 -0
  214. package/dist/regen-format.d.ts.map +1 -0
  215. package/dist/regen-format.js +545 -13
  216. package/dist/regen-format.js.map +1 -0
  217. package/dist/regen.d.ts.map +1 -0
  218. package/dist/regen.js +141 -5
  219. package/dist/regen.js.map +1 -0
  220. package/dist/remote-client.d.ts +88 -173
  221. package/dist/remote-client.d.ts.map +1 -0
  222. package/dist/remote-client.js +997 -1
  223. package/dist/remote-client.js.map +1 -0
  224. package/dist/reset-local-seat-cmd.d.ts +50 -0
  225. package/dist/reset-local-seat-cmd.d.ts.map +1 -0
  226. package/dist/reset-local-seat-cmd.js +169 -0
  227. package/dist/reset-local-seat-cmd.js.map +1 -0
  228. package/dist/role-match.d.ts.map +1 -0
  229. package/dist/role-match.js +23 -1
  230. package/dist/role-match.js.map +1 -0
  231. package/dist/role-resolver.d.ts.map +1 -0
  232. package/dist/role-resolver.js +60 -1
  233. package/dist/role-resolver.js.map +1 -0
  234. package/dist/roster-render.d.ts.map +1 -0
  235. package/dist/roster-render.js +121 -3
  236. package/dist/roster-render.js.map +1 -0
  237. package/dist/seat-probe.d.ts +32 -13
  238. package/dist/seat-probe.d.ts.map +1 -0
  239. package/dist/seat-probe.js +78 -1
  240. package/dist/seat-probe.js.map +1 -0
  241. package/dist/seat-store.d.ts +76 -0
  242. package/dist/seat-store.d.ts.map +1 -0
  243. package/dist/seat-store.js +309 -0
  244. package/dist/seat-store.js.map +1 -0
  245. package/dist/seats.d.ts +375 -0
  246. package/dist/seats.d.ts.map +1 -0
  247. package/dist/seats.js +670 -0
  248. package/dist/seats.js.map +1 -0
  249. package/dist/self-path.d.ts +27 -0
  250. package/dist/self-path.d.ts.map +1 -0
  251. package/dist/self-path.js +43 -0
  252. package/dist/self-path.js.map +1 -0
  253. package/dist/server-endpoint.d.ts +9 -0
  254. package/dist/server-endpoint.d.ts.map +1 -0
  255. package/dist/server-endpoint.js +38 -0
  256. package/dist/server-endpoint.js.map +1 -0
  257. package/dist/server-errors.d.ts +50 -0
  258. package/dist/server-errors.d.ts.map +1 -0
  259. package/dist/server-errors.js +79 -0
  260. package/dist/server-errors.js.map +1 -0
  261. package/dist/server-handshake.d.ts +197 -0
  262. package/dist/server-handshake.d.ts.map +1 -0
  263. package/dist/server-handshake.js +533 -0
  264. package/dist/server-handshake.js.map +1 -0
  265. package/dist/server-response.d.ts +3 -0
  266. package/dist/server-response.d.ts.map +1 -0
  267. package/dist/server-response.js +67 -0
  268. package/dist/server-response.js.map +1 -0
  269. package/dist/server-trust.d.ts +14 -0
  270. package/dist/server-trust.d.ts.map +1 -0
  271. package/dist/server-trust.js +225 -0
  272. package/dist/server-trust.js.map +1 -0
  273. package/dist/session-continuity.d.ts +33 -0
  274. package/dist/session-continuity.d.ts.map +1 -0
  275. package/dist/session-continuity.js +220 -0
  276. package/dist/session-continuity.js.map +1 -0
  277. package/dist/setup-confirm.d.ts +3 -3
  278. package/dist/setup-confirm.d.ts.map +1 -0
  279. package/dist/setup-confirm.js +126 -2
  280. package/dist/setup-confirm.js.map +1 -0
  281. package/dist/setup.d.ts +5 -3
  282. package/dist/setup.d.ts.map +1 -0
  283. package/dist/setup.js +169 -46
  284. package/dist/setup.js.map +1 -0
  285. package/dist/shell-escape.d.ts.map +1 -0
  286. package/dist/shell-escape.js +22 -1
  287. package/dist/shell-escape.js.map +1 -0
  288. package/dist/spawn.d.ts +2 -2
  289. package/dist/spawn.d.ts.map +1 -0
  290. package/dist/spawn.js +29 -10
  291. package/dist/spawn.js.map +1 -0
  292. package/dist/startup-services.d.ts +0 -1
  293. package/dist/startup-services.d.ts.map +1 -0
  294. package/dist/startup-services.js +26 -1
  295. package/dist/startup-services.js.map +1 -0
  296. package/dist/stream-owner.d.ts +6 -2
  297. package/dist/stream-owner.d.ts.map +1 -0
  298. package/dist/stream-owner.js +547 -2
  299. package/dist/stream-owner.js.map +1 -0
  300. package/dist/stream-status.d.ts +1 -1
  301. package/dist/stream-status.d.ts.map +1 -0
  302. package/dist/stream-status.js +268 -3
  303. package/dist/stream-status.js.map +1 -0
  304. package/dist/sync-roles-render.d.ts.map +1 -0
  305. package/dist/sync-roles-render.js +118 -3
  306. package/dist/sync-roles-render.js.map +1 -0
  307. package/dist/sync.d.ts +1 -1
  308. package/dist/sync.d.ts.map +1 -0
  309. package/dist/sync.js +286 -22
  310. package/dist/sync.js.map +1 -0
  311. package/dist/terminal-title.d.ts.map +1 -0
  312. package/dist/terminal-title.js +68 -1
  313. package/dist/terminal-title.js.map +1 -0
  314. package/dist/token-store.d.ts +17 -111
  315. package/dist/token-store.d.ts.map +1 -0
  316. package/dist/token-store.js +81 -1
  317. package/dist/token-store.js.map +1 -0
  318. package/dist/tool-manifest.d.ts +4 -8
  319. package/dist/tool-manifest.d.ts.map +1 -0
  320. package/dist/tool-manifest.js +554 -1
  321. package/dist/tool-manifest.js.map +1 -0
  322. package/dist/tool-scope.d.ts +8 -12
  323. package/dist/tool-scope.d.ts.map +1 -0
  324. package/dist/tool-scope.js +97 -1
  325. package/dist/tool-scope.js.map +1 -0
  326. package/dist/types.d.ts +1 -5
  327. package/dist/types.d.ts.map +1 -0
  328. package/dist/types.js +5 -0
  329. package/dist/types.js.map +1 -0
  330. package/dist/unknown-subcommand.d.ts +1 -1
  331. package/dist/unknown-subcommand.d.ts.map +1 -0
  332. package/dist/unknown-subcommand.js +37 -1
  333. package/dist/unknown-subcommand.js.map +1 -0
  334. package/dist/version.d.ts +1 -1
  335. package/dist/version.d.ts.map +1 -0
  336. package/dist/version.js +78 -2
  337. package/dist/version.js.map +1 -0
  338. package/dist/working-repo.d.ts.map +1 -0
  339. package/dist/working-repo.js +81 -1
  340. package/dist/working-repo.js.map +1 -0
  341. package/dist/worktree-lifecycle.d.ts.map +1 -0
  342. package/dist/worktree-lifecycle.js +205 -2
  343. package/dist/worktree-lifecycle.js.map +1 -0
  344. package/docs/EXTRACTION_PROVENANCE.md +42 -0
  345. package/docs/LOCAL_SERVER.md +103 -0
  346. package/docs/RELEASING.md +129 -0
  347. package/package.json +52 -34
  348. package/src/agent-runtime.ts +69 -0
  349. package/src/assimilate-cmd.ts +1864 -0
  350. package/src/assimilate-deps.ts +444 -0
  351. package/src/assimilate-guard.ts +84 -0
  352. package/src/assimilate-welcome.ts +39 -0
  353. package/src/auth-env.ts +21 -0
  354. package/src/backends/launch-all-pastelist.ts +18 -0
  355. package/src/backends/launch-all-tmux.ts +75 -0
  356. package/src/backends/launch-all-windows.ts +110 -0
  357. package/src/bare-launch-menu.ts +148 -0
  358. package/src/claude-launch-args.ts +35 -0
  359. package/src/claude.ts +561 -0
  360. package/src/cleanup-cmd.ts +581 -0
  361. package/src/clear-rewake-core.ts +34 -0
  362. package/src/clear-rewake.ts +18 -0
  363. package/src/cli-help.ts +116 -0
  364. package/src/cli-platform.ts +127 -0
  365. package/src/cli-tool-approval.ts +716 -0
  366. package/src/codex-app-server.ts +238 -0
  367. package/src/codex-app-wake.ts +524 -0
  368. package/src/codex-launch.ts +140 -0
  369. package/src/codex-remote.ts +500 -0
  370. package/src/codex-wake-resolve.ts +155 -0
  371. package/src/config-utils.ts +811 -0
  372. package/src/config.ts +595 -0
  373. package/src/console-prefix.ts +99 -0
  374. package/src/cube-name.ts +69 -0
  375. package/src/cubes.ts +583 -0
  376. package/src/debug.ts +73 -0
  377. package/src/direct-log.ts +9 -0
  378. package/src/docs-sections.ts +129 -0
  379. package/src/drone-lifecycle.ts +62 -0
  380. package/src/drone-management.ts +162 -0
  381. package/src/ensure-mcp-config.ts +54 -0
  382. package/src/evict-drone.ts +82 -0
  383. package/src/gc-orphan-inboxes.ts +229 -0
  384. package/src/inbox-monitor.ts +1005 -0
  385. package/src/index.ts +1201 -0
  386. package/src/launch-all-cmd.ts +450 -0
  387. package/src/launch-all-command.ts +30 -0
  388. package/src/launch-all-deps.ts +188 -0
  389. package/src/launch-all-discovery.ts +118 -0
  390. package/src/launch-all-locks.ts +74 -0
  391. package/src/launch-gate.ts +80 -0
  392. package/src/lifecycle-log-guard.ts +144 -0
  393. package/src/list-roles-render.ts +52 -0
  394. package/src/local-log-routing.ts +106 -0
  395. package/src/local-manage-tool-result.ts +10 -0
  396. package/src/local-server-cursor.ts +188 -0
  397. package/src/log-audit.ts +207 -0
  398. package/src/log-stream.ts +1567 -0
  399. package/src/model-presets.ts +22 -0
  400. package/src/name-validator.ts +23 -0
  401. package/src/opencode-drone.ts +528 -0
  402. package/src/opencode-plugin.ts +38 -0
  403. package/src/parse-assimilate-args.ts +125 -0
  404. package/src/parse-launch-all-args.ts +100 -0
  405. package/src/postinstall-banner.ts +37 -0
  406. package/src/postinstall.ts +36 -0
  407. package/src/readiness-probe.ts +12 -0
  408. package/src/regen-format.ts +651 -0
  409. package/src/regen.ts +150 -0
  410. package/src/remote-client.ts +1457 -0
  411. package/src/reset-local-seat-cmd.ts +227 -0
  412. package/src/role-match.ts +29 -0
  413. package/src/role-resolver.ts +93 -0
  414. package/src/roster-render.ts +196 -0
  415. package/src/seat-probe.ts +115 -0
  416. package/src/seat-store.ts +333 -0
  417. package/src/seats.ts +911 -0
  418. package/src/self-path.ts +51 -0
  419. package/src/server-endpoint.ts +38 -0
  420. package/src/server-errors.ts +95 -0
  421. package/src/server-handshake.ts +816 -0
  422. package/src/server-response.ts +76 -0
  423. package/src/server-trust.ts +245 -0
  424. package/src/session-continuity.ts +280 -0
  425. package/src/setup-confirm.ts +171 -0
  426. package/src/setup.ts +186 -0
  427. package/src/shell-escape.ts +22 -0
  428. package/src/spawn.ts +31 -0
  429. package/src/startup-services.ts +36 -0
  430. package/src/stream-owner.ts +686 -0
  431. package/src/stream-status.ts +337 -0
  432. package/src/sync-roles-render.ts +163 -0
  433. package/src/sync.ts +363 -0
  434. package/src/terminal-title.ts +76 -0
  435. package/src/token-store.ts +102 -0
  436. package/src/tool-manifest.ts +610 -0
  437. package/src/tool-scope.ts +110 -0
  438. package/src/types.ts +5 -0
  439. package/src/unknown-subcommand.ts +35 -0
  440. package/src/version.ts +82 -0
  441. package/src/working-repo.ts +99 -0
  442. package/src/worktree-lifecycle.ts +254 -0
  443. package/dist/auth-recovery.d.ts +0 -33
  444. package/dist/auth-recovery.js +0 -1
  445. package/dist/auth.d.ts +0 -103
  446. package/dist/auth.js +0 -39
  447. package/dist/device-auth.d.ts +0 -75
  448. package/dist/device-auth.js +0 -1
  449. package/dist/drone-address.d.ts +0 -26
  450. package/dist/drone-address.js +0 -1
  451. package/dist/get-started.d.ts +0 -20
  452. package/dist/get-started.js +0 -2
  453. package/dist/health-beat.d.ts +0 -134
  454. package/dist/health-beat.js +0 -1
  455. package/dist/role-section.d.ts +0 -110
  456. package/dist/role-section.js +0 -8
  457. package/dist/setup-action.d.ts +0 -20
  458. package/dist/setup-action.js +0 -1
  459. package/dist/stale-version-check.d.ts +0 -40
  460. package/dist/stale-version-check.js +0 -1
  461. package/dist/subscription-retry.d.ts +0 -40
  462. package/dist/subscription-retry.js +0 -1
  463. package/dist/templates.d.ts +0 -107
  464. package/dist/templates.js +0 -359
  465. package/dist/token-crypto.d.ts +0 -50
  466. package/dist/token-crypto.js +0 -1
package/dist/claude.js CHANGED
@@ -1,15 +1,487 @@
1
1
  #!/usr/bin/env node
2
- import{spawn as G}from"child_process";import{randomUUID as M}from"node:crypto";import{basename as Y}from"node:path";import{createInterface as U}from"node:readline/promises";import i from"chalk";import{findProjectRoot as D,getActiveCube as V,inboxPathForDrone as j,setCodexWakeTarget as q,pruneDeadCodexWakeTargets as X}from"./cubes.js";import{monitorStateRootForWorktree as z}from"./inbox-monitor.js";import{handleVersionFlag as J,getPackageVersion as w}from"./version.js";import{isHelpFlag as O,setupHelpText as Q,topLevelHelpText as Z,assimilateHelpText as ee}from"./cli-help.js";import{runSpawn as re}from"./spawn.js";import{buildClaudeLaunchArgs as oe}from"./claude-launch-args.js";import{parseSyncArgs as se,runSync as te}from"./sync.js";import{parseCleanupArgs as ie,runCleanup as ne}from"./cleanup-cmd.js";import{parseAssimilateArgs as ae}from"./parse-assimilate-args.js";import{runAssimilate as ce}from"./assimilate-cmd.js";import{buildDefaultAssimilateDeps as le}from"./assimilate-deps.js";import{parseLaunchAllArgs as E}from"./parse-launch-all-args.js";import{unknownSubcommand as de}from"./unknown-subcommand.js";import{runLaunchAll as H}from"./launch-all-cmd.js";import{buildDefaultLaunchAllDeps as v}from"./launch-all-deps.js";import{discoverDroneCandidates as pe}from"./launch-all-discovery.js";import{explicitCliLaunchHint as ue,runBareLaunchMenu as me,shouldResolveExplicitCliLaunchHintTargets as fe,shouldShowLaunchMenu as ge}from"./bare-launch-menu.js";import{setTerminalTitle as he}from"./terminal-title.js";import{initConsolePrefix as we,consolePrefix as t}from"./console-prefix.js";import{initDebugFromArgv as Ce}from"./debug.js";import{fetchLatestBorgmcpVersion as xe,compareVersionsForStaleness as ke}from"./stale-version-check.js";import{defaultCliChoiceDeps as be,detectCliAvailability as $,installedCliNames as N,parseCliFlag as ve,resolveCliChoice as $e}from"./cli-platform.js";import{getRefreshToken as Ae,getIdToken as Se}from"./config.js";import{composeGetStarted as ye,shouldShowGetStarted as Te}from"./get-started.js";import{prepareCodexRemoteLaunch as Pe,withCodexCwdArg as Re,defaultCodexRemoteDeps as Ie,checkCodexBridgeHealthy as Le}from"./codex-remote.js";import{BORG_CODEX_REMOTE_WAKE_ENV as De,codexAgentKindConfigArgs as Oe,codexRemoteWakeConfigArgs as Ee,withAgentRuntimeEnv as A}from"./agent-runtime.js";import{findLoadedCodexThread as He}from"./codex-app-server.js";import{buildAgentKickoffPrompt as Ne,buildKickoffWakePathClause as Fe,recordCodexWakeTarget as Be,socketPathFromRemoteArgs as F}from"./codex-launch.js";import{codexBorgSessionConfigArgs as We}from"./launch-gate.js";import{addCodexSessionStartHook as _e,addCodexUserPromptSubmitHook as Ke,addProjectSessionStartHook as Ge,addUserPromptSubmitHook as Me,removeSessionStartHook as Ye}from"./config-utils.js";import{ensureCliMcpConfigured as S}from"./ensure-mcp-config.js";import{installBorgPlugin as Ue}from"./opencode-plugin.js";import{connectOpenCodeDrone as Ve,computeOpenCodePort as B,createOpenCodeLaunchKickoff as je,injectInitialKickoff as qe}from"./opencode-drone.js";async function Xe(){Ce(process.argv),J(),await we();const c=(async()=>{if(!process.stderr.isTTY)return;const e=w(),s=await xe();if(!s)return;const n=ke(e,s);n.stale&&n.message&&process.stderr.write(`${t()}${n.message}
3
- `)})();if((process.argv[2]==="--help"||process.argv[2]==="-h")&&(process.stdout.write(Z(w())),process.exit(0)),process.argv[2]==="setup"){O(process.argv[3])&&(process.stdout.write(Q(w())),process.exit(0)),await import("./setup.js");return}if(process.argv[2]==="assimilate"){process.argv.slice(3).some(O)&&(process.stdout.write(ee(w())),process.exit(0));const e=ae(process.argv.slice(3));e.ok||(process.stderr.write(i.red(`${t()}\u25FC borg assimilate: ${e.error}
4
- `)),process.stderr.write("Run `borg --help` for usage.\n"),process.exit(1));const s=le(),n=await ce({role:e.role,flags:e.flags},s);process.exit(n)}if(process.argv[2]==="spawn"){const e=await re();process.exit(e)}if(process.argv[2]==="sync"){const e=se(process.argv.slice(3));e.ok||(process.stderr.write(i.red(`${t()}\u25FC borg sync: ${e.error}
5
- `)),process.stderr.write("Run `borg --help` for usage.\n"),process.exit(1));const s=await te({},e.options);process.exit(s)}if(process.argv[2]==="cleanup"){const e=ie(process.argv.slice(3));e.ok||(process.stderr.write(i.red(`${t()}\u25FC borg cleanup: ${e.error}
6
- `)),process.stderr.write("Run `borg --help` for usage.\n"),process.exit(1));const s=await ne({},e.options);process.exit(s)}if(process.argv[2]==="launch-all"){const e=E(process.argv.slice(3));e.ok||(process.stderr.write(i.red(`${t()}\u25FC borg launch-all: ${e.error}
7
- `)),process.stderr.write("Run `borg --help` for usage.\n"),process.exit(1));const s=v(),n=await H(e.args,s);process.exit(n)}const a=de(process.argv[2]);if(a!==null&&(process.stderr.write(i.red(`${t()}\u25FC unknown command: ${a}
8
- `)),process.stderr.write("Run `borg --help` for usage.\n"),process.exit(1)),Te(await Ae()!==null,await Se()!==null)){const e=N($()).length>0;process.stdout.write(ye(e)),process.exit(0)}const d=ve(process.argv.slice(2));d.error&&(process.stderr.write(i.red(`${t()}\u25FC ${d.error}
9
- `)),process.stderr.write("Run `borg --help` for usage.\n"),process.exit(1));const y=async e=>{const s=U({input:process.stdin,output:process.stdout});try{return await s.question(e)}finally{s.close()}};let r=await $e(d.cli,be(y,()=>process.stdin.isTTY===!0));ze();const o=await V();let C;const T=async()=>o?(C===void 0&&(C=(await pe({targetCubeId:o.cubeId},v())).length>0),C):!1,x=process.stdin.isTTY===!0,k=process.stdout.isTTY===!0,P=ue({explicitCli:d.cli,stdinIsTTY:x,stdoutIsTTY:k,hasActiveCube:o!==null,hasLaunchAllTargets:fe({explicitCli:d.cli,stdinIsTTY:x,stdoutIsTTY:k,hasActiveCube:o!==null})?await T():!1});if(P&&process.stderr.write(P),ge({extraArgs:process.argv.slice(2),stdinIsTTY:x,stdoutIsTTY:k})){const e=N($()).filter(n=>n!==r),s=await me({defaultCli:r,otherInstalledClis:e,hasLaunchAllTargets:await T()},y);if(s.kind==="launch-all"){const n=E([]),K=n.ok?await H(n.args,v()):1;process.exit(K)}r=s.cli}const l=d.rest;he(o?{label:o.droneLabel,cubeName:o.name}:null,Y(process.cwd()));const W=Fe(r,o&&r==="claude"?j(o.cubeId,o.droneId):null,o&&r==="claude"?z(D(process.cwd())):null);await Promise.race([c,new Promise(e=>setTimeout(e,2e3))]);const R=r==="codex"?`borg-wake-${M()}`:null;let m,I=[],b={...A(process.env,r),BORG_SESSION:"1"},p=null,u=null;if(r==="codex"&&!l.includes("--remote")){console.error(`${t()}${i.gray("\u25FC Starting Codex remote-wake app-server\u2026")}`);const e=await Pe(Ie());e.warning?(console.error(`${t()}${i.yellow(`warning: ${e.warning}`)}`),m="\u26A0 Codex wake-path capability check failed: remote-control is unavailable for this session. Run borg_regen manually whenever you return, and expect only fallback wakeups until relaunch."):m="Codex wake-path capability check passed: remote-control socket established for this session.",I=e.args,b={...A(process.env,r),...e.env,BORG_SESSION:"1"},p=F(e.args),u=e.server?.cleanup??null}else r==="codex"&&l.includes("--remote")&&(m="Codex wake-path capability check: using caller-provided --remote socket; if no wake arrives, run borg_regen manually when returning to the session.",p=F(l),p&&(b={...A(process.env,r),[De]:"1",BORG_SESSION:"1"}));const f=Ne({cli:r,codexWakeNonce:R,monitorClause:W,codexWakePathClause:m});let g=null,h;if(r==="codex")h=[...We(),...Oe(),...Ee(p!==null),...I,...Re([...l,f],process.cwd())];else if(r==="opencode"){const e=o?B(o.droneId):14096;Ue(),g=je(f),h=[process.cwd(),"--port",String(e),"--auto","--prompt",g.prompt,...l]}else h=oe(l,f);const _=r==="claude"?"Claude Code":r==="codex"?"Codex":"OpenCode";console.error(`${t()}${i.blue(`\u25FC Launching ${_}\u2026`)}`);const L=G(r,h,{stdio:"inherit",shell:!1,env:b});if(r==="opencode"&&g){const e=g,n=`http://127.0.0.1:${o?B(o.droneId):14096}`;Ve({serverUrl:n,directory:process.cwd(),droneLabel:o?.droneLabel??"opencode",cubeName:o?.name??"borg"}).then(()=>qe(e)).catch(()=>{})}r==="codex"&&o&&p&&(Be({deps:{setCodexWakeTarget:q,findLoadedCodexThread:He},cubeId:o.cubeId,droneId:o.droneId,socketPath:p,passthroughArgs:l,previewNeedle:R??f.slice(0,120),cwd:process.cwd(),launchedAtSeconds:Math.floor(Date.now()/1e3)}),X(e=>Le(e))),L.on("error",e=>{if(u)try{u()}catch{}if(e.code==="ENOENT"){console.error(`${t()}${i.red(`
10
- \u25FC Failed to launch ${r}`)}`);const s=r==="opencode"?"opencode":r;console.error(`${t()}${i.gray(`Make sure ${s} is installed.
11
- `)}`)}else console.error(`${t()}${i.red(`
12
- \u25FC Failed to launch ${r}: ${e.message}
13
- `)}`);process.exit(1)}),L.on("exit",e=>{if(u)try{u()}catch{}process.exit(e??0)})}function ze(){const c=$();if(c.claude)try{S("claude"),Ge(D(process.cwd())),Ye(),Me()}catch(a){console.error(`${t()}${i.yellow(`warning: Claude Code integration check failed: ${a?.message??a}`)}`)}if(c.codex)try{S("codex"),_e(),Ke()}catch(a){console.error(`${t()}${i.yellow(`warning: Codex integration check failed: ${a?.message??a}`)}`)}if(c.opencode)try{S("opencode")}catch(a){console.error(`${t()}${i.yellow(`warning: OpenCode integration check failed: ${a?.message??a}`)}`)}}Xe().catch(c=>{console.error(`${t()}${i.red(`
14
- \u25FC Error: ${c.message}
15
- `)}`),process.exit(1)});
2
+ /**
3
+ * Borg CLI launcher
4
+ *
5
+ * Spawns Claude Code with a minimal kickoff prompt so the SessionStart
6
+ * hook's injected drone playbook actually fires on the first turn.
7
+ * Without this, Claude sits waiting for user input and the autonomous
8
+ * "look at the log and act" directive never executes.
9
+ *
10
+ * Commands:
11
+ * borg → Launch Claude with kickoff prompt
12
+ * borg setup → Re-route to the setup wizard
13
+ * borg spawn <name> → Create a sibling git worktree + launch a
14
+ * fresh drone inside it (see spawn.ts)
15
+ * borg sync → Advance the current worktree across the 5
16
+ * lifecycle states (see sync.ts, gh#33)
17
+ */
18
+ import { spawn } from 'child_process';
19
+ import { randomUUID } from 'node:crypto';
20
+ import { basename } from 'node:path';
21
+ import { createInterface } from 'node:readline/promises';
22
+ import chalk from 'chalk';
23
+ import { findProjectRoot, getActiveCube, inboxPathForDrone, setCodexWakeTarget, pruneDeadCodexWakeTargets } from './cubes.js';
24
+ import { monitorStateRootForWorktree } from './inbox-monitor.js';
25
+ import { handleVersionFlag, getPackageVersion } from './version.js';
26
+ import { isHelpFlag, setupHelpText, topLevelHelpText, assimilateHelpText, resetLocalSeatHelpText } from './cli-help.js';
27
+ import { runSpawn } from './spawn.js';
28
+ import { buildClaudeLaunchArgs } from './claude-launch-args.js';
29
+ import { parseSyncArgs, runSync } from './sync.js';
30
+ import { parseCleanupArgs, runCleanup } from './cleanup-cmd.js';
31
+ import { parseAssimilateArgs } from './parse-assimilate-args.js';
32
+ import { runAssimilate } from './assimilate-cmd.js';
33
+ import { buildDefaultAssimilateDeps } from './assimilate-deps.js';
34
+ import { parseResetLocalSeatArgs, runResetLocalSeat, buildDefaultResetLocalSeatDeps, } from './reset-local-seat-cmd.js';
35
+ import { parseLaunchAllArgs } from './parse-launch-all-args.js';
36
+ import { unknownSubcommand } from './unknown-subcommand.js';
37
+ import { runLaunchAll } from './launch-all-cmd.js';
38
+ import { buildDefaultLaunchAllDeps } from './launch-all-deps.js';
39
+ import { discoverDroneCandidates } from './launch-all-discovery.js';
40
+ import { explicitCliLaunchHint, runBareLaunchMenu, shouldResolveExplicitCliLaunchHintTargets, shouldShowLaunchMenu, } from './bare-launch-menu.js';
41
+ import { setTerminalTitle } from './terminal-title.js';
42
+ import { initConsolePrefix, consolePrefix } from './console-prefix.js';
43
+ import { initDebugFromArgv } from './debug.js';
44
+ import { defaultCliChoiceDeps, detectCliAvailability, installedCliNames, parseCliFlag, resolveCliChoice } from './cli-platform.js';
45
+ import { prepareCodexRemoteLaunch, resolveCodexLaunchCwd, withCodexCwdArg, defaultCodexRemoteDeps, checkCodexBridgeHealthy } from './codex-remote.js';
46
+ import { BORG_CODEX_REMOTE_WAKE_ENV, codexAgentKindConfigArgs, codexRemoteWakeConfigArgs, withAgentRuntimeEnv, } from './agent-runtime.js';
47
+ import { findLoadedCodexThread } from './codex-app-server.js';
48
+ import { buildAgentKickoffPrompt, buildKickoffWakePathClause, recordCodexWakeTarget, socketPathFromRemoteArgs, } from './codex-launch.js';
49
+ import { codexBorgSessionConfigArgs } from './launch-gate.js';
50
+ import { addCodexSessionStartHook, addCodexUserPromptSubmitHook, addProjectSessionStartHook, addUserPromptSubmitHook, removeSessionStartHook, } from './config-utils.js';
51
+ import { ensureCliMcpConfigured } from './ensure-mcp-config.js';
52
+ import { installBorgPlugin } from './opencode-plugin.js';
53
+ import { connectOpenCodeDrone, computeOpenCodePort, createOpenCodeLaunchKickoff, injectInitialKickoff } from './opencode-drone.js';
54
+ import { buildOpenCodeLaunchArgs, defaultApprovalIo, resolveLaunchBorgApprovals } from './cli-tool-approval.js';
55
+ async function main() {
56
+ // `--debug` / BORG_DEBUG: enable HTTP request/response logging to stderr
57
+ // (observability for failures like the cross-account assimilate 404).
58
+ // Done first so debug covers everything below; strips `--debug` from argv
59
+ // so subcommand parsers (which reject unknown flags) never see it. Covers
60
+ // the top-level dispatcher + `borg setup` + `borg assimilate` — all route
61
+ // through this main.
62
+ initDebugFromArgv(process.argv);
63
+ // Honor `--version` / `-v` before any other work.
64
+ handleVersionFlag();
65
+ // Resolve drone self-identification prefix (gh#25) before any error
66
+ // emission so messages carry `[drone-X · cube]` from launch onward.
67
+ await initConsolePrefix();
68
+ // Local-only client: bare `borg` performs NO automatic external network I/O
69
+ // (no npm-registry stale-version check) before authority selection. Only the
70
+ // explicitly selected local server may be contacted. A version comparison is
71
+ // available as an explicit operator action via `borg --version`.
72
+ // Intercept --help / -h before handing off to Claude.
73
+ if (process.argv[2] === '--help' || process.argv[2] === '-h') {
74
+ process.stdout.write(topLevelHelpText(getPackageVersion()));
75
+ process.exit(0);
76
+ }
77
+ // Re-route subcommands.
78
+ if (process.argv[2] === 'setup') {
79
+ // gh#520: `borg setup --help` must show help, not run the wizard.
80
+ if (isHelpFlag(process.argv[3])) {
81
+ process.stdout.write(setupHelpText(getPackageVersion()));
82
+ process.exit(0);
83
+ }
84
+ await import('./setup.js');
85
+ return;
86
+ }
87
+ if (process.argv[2] === 'assimilate') {
88
+ // `borg assimilate --help` (or `... <role> --help`) must show help, not be
89
+ // rejected by the parser as an unknown flag.
90
+ if (process.argv.slice(3).some(isHelpFlag)) {
91
+ process.stdout.write(assimilateHelpText(getPackageVersion()));
92
+ process.exit(0);
93
+ }
94
+ const parsed = parseAssimilateArgs(process.argv.slice(3));
95
+ if (!parsed.ok) {
96
+ process.stderr.write(chalk.red(`${consolePrefix()}◼ borg assimilate: ${parsed.error}\n`));
97
+ process.stderr.write(`Run \`borg --help\` for usage.\n`);
98
+ process.exit(1);
99
+ }
100
+ const deps = buildDefaultAssimilateDeps();
101
+ const code = await runAssimilate({ role: parsed.role, flags: parsed.flags }, deps);
102
+ process.exit(code);
103
+ }
104
+ if (process.argv[2] === 'reset-local-seat') {
105
+ if (process.argv.slice(3).some(isHelpFlag)) {
106
+ process.stdout.write(resetLocalSeatHelpText(getPackageVersion()));
107
+ process.exit(0);
108
+ }
109
+ const parsed = parseResetLocalSeatArgs(process.argv.slice(3));
110
+ if (!parsed.ok) {
111
+ process.stderr.write(chalk.red(`${consolePrefix()}◼ borg reset-local-seat: ${parsed.error}\n`));
112
+ process.stderr.write(`Run \`borg --help\` for usage.\n`);
113
+ process.exit(1);
114
+ }
115
+ const code = await runResetLocalSeat(parsed.flags, buildDefaultResetLocalSeatDeps());
116
+ process.exit(code);
117
+ }
118
+ if (process.argv[2] === 'spawn') {
119
+ // Deprecated; the stub prints a redirect message and exits 2.
120
+ const code = await runSpawn();
121
+ process.exit(code);
122
+ }
123
+ if (process.argv[2] === 'sync') {
124
+ const parsed = parseSyncArgs(process.argv.slice(3));
125
+ if (!parsed.ok) {
126
+ process.stderr.write(chalk.red(`${consolePrefix()}◼ borg sync: ${parsed.error}\n`));
127
+ process.stderr.write(`Run \`borg --help\` for usage.\n`);
128
+ process.exit(1);
129
+ }
130
+ const code = await runSync({}, parsed.options);
131
+ process.exit(code);
132
+ }
133
+ if (process.argv[2] === 'cleanup') {
134
+ const parsed = parseCleanupArgs(process.argv.slice(3));
135
+ if (!parsed.ok) {
136
+ process.stderr.write(chalk.red(`${consolePrefix()}◼ borg cleanup: ${parsed.error}\n`));
137
+ process.stderr.write(`Run \`borg --help\` for usage.\n`);
138
+ process.exit(1);
139
+ }
140
+ const code = await runCleanup({}, parsed.options);
141
+ process.exit(code);
142
+ }
143
+ if (process.argv[2] === 'launch-all') {
144
+ const parsed = parseLaunchAllArgs(process.argv.slice(3));
145
+ if (!parsed.ok) {
146
+ process.stderr.write(chalk.red(`${consolePrefix()}◼ borg launch-all: ${parsed.error}\n`));
147
+ process.stderr.write(`Run \`borg --help\` for usage.\n`);
148
+ process.exit(1);
149
+ }
150
+ const deps = buildDefaultLaunchAllDeps();
151
+ const code = await runLaunchAll(parsed.args, deps);
152
+ process.exit(code);
153
+ }
154
+ // gh#911: an unknown NON-FLAG argv[2] that isn't a known subcommand must
155
+ // ERROR, not silently fall through and launch an agent with the typo'd word
156
+ // as its prompt (the `borg evict-drone X` footgun). Bare `borg` and
157
+ // recognized flags still fall through to launch below.
158
+ const unknownCmd = unknownSubcommand(process.argv[2]);
159
+ if (unknownCmd !== null) {
160
+ process.stderr.write(chalk.red(`${consolePrefix()}◼ unknown command: ${unknownCmd}\n`));
161
+ process.stderr.write(`Run \`borg --help\` for usage.\n`);
162
+ process.exit(1);
163
+ }
164
+ const parsedCli = parseCliFlag(process.argv.slice(2));
165
+ if (parsedCli.error) {
166
+ process.stderr.write(chalk.red(`${consolePrefix()}◼ ${parsedCli.error}\n`));
167
+ process.stderr.write(`Run \`borg --help\` for usage.\n`);
168
+ process.exit(1);
169
+ }
170
+ const prompt = async (message) => {
171
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
172
+ try {
173
+ return await rl.question(message);
174
+ }
175
+ finally {
176
+ rl.close();
177
+ }
178
+ };
179
+ let cli = await resolveCliChoice(parsedCli.cli, defaultCliChoiceDeps(prompt, () => process.stdin.isTTY === true));
180
+ ensureDetectedCliConfigured();
181
+ // Active cube for this directory — needed for the launch menu's option-3
182
+ // availability, the terminal title, and the inbox-Monitor clause below.
183
+ const active = await getActiveCube();
184
+ let launchAllTargetsAvailable;
185
+ const hasLaunchAllTargets = async () => {
186
+ if (!active)
187
+ return false;
188
+ if (launchAllTargetsAvailable === undefined) {
189
+ const candidates = await discoverDroneCandidates({ targetCubeId: active.cubeId }, buildDefaultLaunchAllDeps());
190
+ launchAllTargetsAvailable = candidates.length > 0;
191
+ }
192
+ return launchAllTargetsAvailable;
193
+ };
194
+ const stdinIsTTY = process.stdin.isTTY === true;
195
+ const stdoutIsTTY = process.stdout.isTTY === true;
196
+ const explicitCliHint = explicitCliLaunchHint({
197
+ explicitCli: parsedCli.cli,
198
+ stdinIsTTY,
199
+ stdoutIsTTY,
200
+ hasActiveCube: active !== null,
201
+ hasLaunchAllTargets: shouldResolveExplicitCliLaunchHintTargets({
202
+ explicitCli: parsedCli.cli,
203
+ stdinIsTTY,
204
+ stdoutIsTTY,
205
+ hasActiveCube: active !== null,
206
+ }) ? await hasLaunchAllTargets() : false,
207
+ });
208
+ if (explicitCliHint)
209
+ process.stderr.write(explicitCliHint);
210
+ // gh#853: bare `borg` (no args) interactive launch menu. TTY-only + bare-args-
211
+ // only (shouldShowLaunchMenu) so every scripted/programmatic `borg` and every
212
+ // explicit subcommand/flag is untouched; the get-started breadcrumb already
213
+ // exited above, so it keeps precedence over the menu. The option-set and
214
+ // selection→action mapping are pure (bare-launch-menu.ts) — this is the glue
215
+ // that computes inputs and dispatches the chosen action.
216
+ if (shouldShowLaunchMenu({
217
+ extraArgs: process.argv.slice(2),
218
+ stdinIsTTY,
219
+ stdoutIsTTY,
220
+ })) {
221
+ const otherInstalledClis = installedCliNames(detectCliAvailability()).filter((c) => c !== cli);
222
+ const action = await runBareLaunchMenu({ defaultCli: cli, otherInstalledClis, hasLaunchAllTargets: await hasLaunchAllTargets() }, prompt);
223
+ if (action.kind === 'launch-all') {
224
+ const parsed = parseLaunchAllArgs([]); // empty args → active cube, auto backend
225
+ const code = parsed.ok ? await runLaunchAll(parsed.args, buildDefaultLaunchAllDeps()) : 1;
226
+ process.exit(code);
227
+ }
228
+ // option 1 → configured default; option 2 → the other agent, ONE-SHOT
229
+ // (we deliberately do NOT call setProjectCliPreference — the saved
230
+ // preference is changed only via `borg --cli <agent>`).
231
+ cli = action.cli;
232
+ }
233
+ // client#20: inspect only the SELECTED harness after the one-shot launch
234
+ // menu choice. Explicit consent enables a narrow per-process override;
235
+ // Borg never rewrites the user's approval policy here.
236
+ const approvalCwd = cli === 'codex'
237
+ ? resolveCodexLaunchCwd(parsedCli.rest, process.cwd())
238
+ : process.cwd();
239
+ const launchApproval = await resolveLaunchBorgApprovals(cli, defaultApprovalIo(prompt, () => process.stdin.isTTY === true, {
240
+ cwd: approvalCwd,
241
+ env: process.env,
242
+ codexArgs: parsedCli.rest,
243
+ }));
244
+ if (launchApproval.warning) {
245
+ console.error(`${consolePrefix()}${chalk.yellow(`warning: ${launchApproval.warning}`)}`);
246
+ }
247
+ // Forward any user-supplied flags (e.g. --resume <id>, --cwd, etc.) to
248
+ // the selected agent CLI unchanged.
249
+ //
250
+ // The kickoff prompt goes at the end as the positional user-message
251
+ // argument so the SessionStart hook + drone playbook get a turn to
252
+ // execute on session start. Works for fresh sessions and resumed ones.
253
+ //
254
+ // The /loop wrapper (dynamic mode — no fixed interval) lets Claude
255
+ // self-pace iterations. We instruct it to arm a persistent Monitor on
256
+ // the inbox file so it wakes the moment another drone posts to the
257
+ // cube (the MCP client appends a line to that file in real time via
258
+ // the long-poll poller). One adaptive ScheduleWakeup recovery deadline
259
+ // backs it up: 3h ±30m while Monitor status is healthy or indeterminate,
260
+ // 15m ±3m only while explicitly broken; a real Monitor wake replaces it.
261
+ const passthroughArgs = parsedCli.rest;
262
+ // `active` (resolved above for the launch menu) also gates the inbox-Monitor
263
+ // instruction: only arm it when this project is assimilated to a cube —
264
+ // otherwise we don't know which inbox file to watch and a Monitor on a
265
+ // not-yet-relevant path produces no signal. The user can assimilate and
266
+ // relaunch to engage real-time wake; the /loop heartbeat covers the meantime.
267
+ // Set the terminal title so sibling drone sessions are
268
+ // distinguishable in Cmd-Tab / tab bars / Mission Control. No-op
269
+ // when stdout isn't a TTY (piped invocation, CI). Claude Code does
270
+ // not set its own title, so this persists for the session.
271
+ setTerminalTitle(active ? { label: active.droneLabel, cubeName: active.name } : null, basename(process.cwd()));
272
+ // gh#929: the claude wake-path/Monitor-arming clause is the SHARED
273
+ // wakePathArming (same core the SessionStart hook + /clear orientation use)
274
+ // + the NEVER-TaskStop reminder. Codex / opencode / no-active-cube → empty.
275
+ const monitorClause = buildKickoffWakePathClause(cli, active && cli === 'claude' ? inboxPathForDrone(active.cubeId, active.droneId) : null, active && cli === 'claude'
276
+ ? monitorStateRootForWorktree(findProjectRoot(process.cwd()))
277
+ : null);
278
+ const codexWakeNonce = cli === 'codex' ? `borg-wake-${randomUUID()}` : null;
279
+ let codexWakePathClause;
280
+ let remoteArgs = [];
281
+ // gh#673 P1: mark the agent session as borg-launched. Claude Code's MCP
282
+ // child + hook commands inherit this env, gating the borg activation
283
+ // surface (launch-gate.ts). ACTIVATION-only — never a security gate.
284
+ // OpenCode MCP children get BORG_SESSION from the pinned env in the
285
+ // opencode.json config (same mechanism as codex's pinned env).
286
+ // Pin CLI identity independently of a model selection and the optional
287
+ // Codex remote-wake transport. In particular, clear a stale Codex marker
288
+ // before a Codex -> Claude relaunch can reach its MCP child.
289
+ let launchEnv = { ...withAgentRuntimeEnv(process.env, cli), BORG_SESSION: '1' };
290
+ if (cli === 'opencode' && launchApproval.openCodePermission) {
291
+ launchEnv.OPENCODE_PERMISSION = launchApproval.openCodePermission;
292
+ }
293
+ let codexSocketPath = null;
294
+ let codexServerCleanup = null;
295
+ if (cli === 'codex' && !passthroughArgs.includes('--remote')) {
296
+ console.error(`${consolePrefix()}${chalk.gray('◼ Starting Codex remote-wake app-server…')}`);
297
+ const remote = await prepareCodexRemoteLaunch(defaultCodexRemoteDeps());
298
+ if (remote.warning) {
299
+ console.error(`${consolePrefix()}${chalk.yellow(`warning: ${remote.warning}`)}`);
300
+ codexWakePathClause =
301
+ `⚠ Codex wake-path capability check failed: remote-control is unavailable for this session. Run borg_regen manually whenever you return, and expect only fallback wakeups until relaunch.`;
302
+ }
303
+ else {
304
+ codexWakePathClause =
305
+ `Codex wake-path capability check passed: remote-control socket established for this session.`;
306
+ }
307
+ remoteArgs = remote.args;
308
+ launchEnv = {
309
+ ...withAgentRuntimeEnv(process.env, cli),
310
+ ...remote.env,
311
+ BORG_SESSION: '1',
312
+ };
313
+ codexSocketPath = socketPathFromRemoteArgs(remote.args);
314
+ codexServerCleanup = remote.server?.cleanup ?? null;
315
+ }
316
+ else if (cli === 'codex' && passthroughArgs.includes('--remote')) {
317
+ codexWakePathClause =
318
+ `Codex wake-path capability check: using caller-provided --remote socket; if no wake arrives, run borg_regen manually when returning to the session.`;
319
+ codexSocketPath = socketPathFromRemoteArgs(passthroughArgs);
320
+ if (codexSocketPath) {
321
+ launchEnv = {
322
+ ...withAgentRuntimeEnv(process.env, cli),
323
+ [BORG_CODEX_REMOTE_WAKE_ENV]: '1',
324
+ BORG_SESSION: '1',
325
+ };
326
+ }
327
+ }
328
+ const kickoff = buildAgentKickoffPrompt({
329
+ cli,
330
+ codexWakeNonce,
331
+ monitorClause,
332
+ codexWakePathClause,
333
+ });
334
+ // This stays separate from the shared kickoff so Claude and Codex preserve
335
+ // their existing launch prompts. OpenCode records this nonce-bearing copy
336
+ // and later uses the nonce to bind its separately spawned MCP child.
337
+ let openCodeKickoff = null;
338
+ let launchArgs;
339
+ if (cli === 'codex') {
340
+ // gh#673 P1-codex: codex MCP children only see the pinned
341
+ // [mcp_servers.borg.env], never inherited env (V2 probe) — deliver
342
+ // the borg-launch marker and selected CLI identity via per-invocation
343
+ // -c overrides instead (V2b-proven). Remote wake remains a separate
344
+ // transport capability, explicitly disabled when this launch has no
345
+ // socket so legacy static config cannot spuriously arm a bridge.
346
+ // client#20: the exact approval overrides above are launch-scoped and
347
+ // consented. They remain separate from activation/identity/wake config.
348
+ launchArgs = [
349
+ ...launchApproval.codexArgs,
350
+ ...codexBorgSessionConfigArgs(),
351
+ ...codexAgentKindConfigArgs(),
352
+ ...codexRemoteWakeConfigArgs(codexSocketPath !== null),
353
+ ...remoteArgs,
354
+ ...withCodexCwdArg([...passthroughArgs, kickoff], process.cwd()),
355
+ ];
356
+ }
357
+ else if (cli === 'opencode') {
358
+ // OpenCode launch: start TUI with the kickoff passed via --prompt
359
+ // (auto-submits it as the first message). BORG_SESSION is pinned in
360
+ // opencode.json. A unique port is assigned so the MCP child can connect
361
+ // via the HTTP API for context-streaming (injectOpenCodeEntry).
362
+ const dronePort = active
363
+ ? computeOpenCodePort(active.droneId)
364
+ : 14096;
365
+ installBorgPlugin();
366
+ openCodeKickoff = createOpenCodeLaunchKickoff(kickoff);
367
+ launchArgs = buildOpenCodeLaunchArgs(process.cwd(), dronePort, openCodeKickoff.prompt, passthroughArgs);
368
+ }
369
+ else {
370
+ // gh#702: borg-launched claude drones auto-allow ONLY mcp__borg__* so they
371
+ // never prompt on borg coordination calls; Bash/file/web still prompt.
372
+ launchArgs = buildClaudeLaunchArgs(passthroughArgs, kickoff);
373
+ }
374
+ const cliDisplayName = cli === 'claude' ? 'Claude Code' : cli === 'codex' ? 'Codex' : 'OpenCode';
375
+ console.error(`${consolePrefix()}${chalk.blue(`◼ Launching ${cliDisplayName}…`)}`);
376
+ const agentProcess = spawn(cli, launchArgs, {
377
+ stdio: 'inherit',
378
+ shell: false,
379
+ env: launchEnv,
380
+ });
381
+ // gh#opencode: find the opened session after launch. The kickoff was already
382
+ // submitted via --prompt, so we just discover the session ID for inbox
383
+ // entry injection. Fire-and-forget; never delay the launch.
384
+ if (cli === 'opencode' && openCodeKickoff) {
385
+ const launchKickoff = openCodeKickoff;
386
+ const dronePort = active
387
+ ? computeOpenCodePort(active.droneId)
388
+ : 14096;
389
+ const serverUrl = `http://127.0.0.1:${dronePort}`;
390
+ // Fire-and-forget; never delay the launch or crash on failure.
391
+ connectOpenCodeDrone({ serverUrl, directory: process.cwd(), droneLabel: active?.droneLabel ?? 'opencode', cubeName: active?.name ?? 'borg' })
392
+ .then(() => injectInitialKickoff(launchKickoff))
393
+ .catch(() => { });
394
+ }
395
+ // gh#857 WI-2: wake-target recording is codex-only (app-server bridge).
396
+ // OpenCode has no remote-wake mechanisms yet; claude uses the inbox Monitor.
397
+ if (cli === 'codex' && active && codexSocketPath) {
398
+ void recordCodexWakeTarget({
399
+ deps: { setCodexWakeTarget, findLoadedCodexThread },
400
+ cubeId: active.cubeId,
401
+ droneId: active.droneId,
402
+ socketPath: codexSocketPath,
403
+ passthroughArgs,
404
+ previewNeedle: codexWakeNonce ?? kickoff.slice(0, 120),
405
+ cwd: process.cwd(),
406
+ launchedAtSeconds: Math.floor(Date.now() / 1000),
407
+ });
408
+ // gh#855: self-heal the wake-target file — drop entries whose app-server
409
+ // socket is positively dead (crashed prior launches), mirroring the
410
+ // socket-dir pruneStaleSockets. Best-effort; never blocks the launch.
411
+ void pruneDeadCodexWakeTargets((sock) => checkCodexBridgeHealthy(sock));
412
+ }
413
+ agentProcess.on('error', (err) => {
414
+ if (codexServerCleanup) {
415
+ try {
416
+ codexServerCleanup();
417
+ }
418
+ catch {
419
+ // best-effort
420
+ }
421
+ }
422
+ if (err.code === 'ENOENT') {
423
+ console.error(`${consolePrefix()}${chalk.red(`\n◼ Failed to launch ${cli}`)}`);
424
+ const cliName = cli === 'opencode' ? 'opencode' : cli;
425
+ console.error(`${consolePrefix()}${chalk.gray(`Make sure ${cliName} is installed.\n`)}`);
426
+ }
427
+ else {
428
+ console.error(`${consolePrefix()}${chalk.red(`\n◼ Failed to launch ${cli}: ${err.message}\n`)}`);
429
+ }
430
+ process.exit(1);
431
+ });
432
+ agentProcess.on('exit', (code) => {
433
+ if (codexServerCleanup) {
434
+ try {
435
+ codexServerCleanup();
436
+ }
437
+ catch {
438
+ // best-effort
439
+ }
440
+ }
441
+ process.exit(code ?? 0);
442
+ });
443
+ }
444
+ function ensureDetectedCliConfigured() {
445
+ const found = detectCliAvailability();
446
+ if (found.claude) {
447
+ try {
448
+ ensureCliMcpConfigured('claude');
449
+ // gh#673 P2 (WI-1): the orientation hook lives PROJECT-LOCAL in
450
+ // <root>/.claude/settings.local.json — ensured on every bare
451
+ // `borg` launch so pre-P2 worktrees self-heal. The legacy GLOBAL
452
+ // hook is then removed: safe because this ensure precedes every
453
+ // borg-launched agent spawn (other projects get their local hook
454
+ // at their own next launch/assimilate), and P1's BORG_SESSION
455
+ // gate already no-ops the global hook in non-borg sessions.
456
+ addProjectSessionStartHook(findProjectRoot(process.cwd()));
457
+ removeSessionStartHook();
458
+ addUserPromptSubmitHook();
459
+ }
460
+ catch (err) {
461
+ console.error(`${consolePrefix()}${chalk.yellow(`warning: Claude Code integration check failed: ${err?.message ?? err}`)}`);
462
+ }
463
+ }
464
+ if (found.codex) {
465
+ try {
466
+ ensureCliMcpConfigured('codex');
467
+ addCodexSessionStartHook();
468
+ addCodexUserPromptSubmitHook();
469
+ }
470
+ catch (err) {
471
+ console.error(`${consolePrefix()}${chalk.yellow(`warning: Codex integration check failed: ${err?.message ?? err}`)}`);
472
+ }
473
+ }
474
+ if (found.opencode) {
475
+ try {
476
+ ensureCliMcpConfigured('opencode');
477
+ }
478
+ catch (err) {
479
+ console.error(`${consolePrefix()}${chalk.yellow(`warning: OpenCode integration check failed: ${err?.message ?? err}`)}`);
480
+ }
481
+ }
482
+ }
483
+ main().catch((error) => {
484
+ console.error(`${consolePrefix()}${chalk.red(`\n◼ Error: ${error.message}\n`)}`);
485
+ process.exit(1);
486
+ });
487
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * `autoEvictPresumedDead`, or gh#877 graceful self-shutdown) leaves its
6
6
  * worktree dir (`~/.borg/worktrees/<repo>/<name>`) + its `wt-<suffix>`
7
7
  * branch on disk. Nothing reclaims them. This command finds and SAFELY
8
- * removes worktrees orphaned by eviction — never destroying live, frozen,
8
+ * removes worktrees orphaned by eviction — never destroying live,
9
9
  * dirty, unmerged, or precious-local-state work.
10
10
  *
11
11
  * Pure composition over `worktree-lifecycle.ts` + the gh#877 per-seat
@@ -16,8 +16,8 @@
16
16
  * SEC gate (gh#882, S1–S5 — design entries 98e45fbf / acd76794):
17
17
  * S1 Destructive prune authority = server 410 DRONE_EVICTED on the
18
18
  * worktree's OWN saved-seat token, ONLY.
19
- * S2 KEEP classes (any one → never prune, surface): 423 DRONE_FROZEN
20
- * (reversible); dirty; unmerged; non-regenerable gitignored-local.
19
+ * S2 KEEP classes (any one → never prune, surface): dirty; unmerged;
20
+ * non-regenerable gitignored-local.
21
21
  * S3 Report-only until gh#877 is DEPLOYED. The destructive path keys on
22
22
  * the 410 CODE — pre-deploy the server returns 401 → probe resolves
23
23
  * 'indeterminate' → report-only → safe. No flag / deploy coupling;
@@ -37,7 +37,7 @@ import { type ActiveCube } from './cubes.js';
37
37
  import { type SeatStatus } from './seat-probe.js';
38
38
  export type { SeatStatus };
39
39
  /** Per-worktree classification outcome. PRUNABLE is the ONLY delete class. */
40
- export type CleanupReason = 'PRUNABLE' | 'SURVIVES-dirty' | 'SURVIVES-clobber' | 'SURVIVES-unmerged' | 'SURVIVES-detached' | 'SURVIVES-frozen' | 'SURVIVES-live' | 'SURVIVES-self' | 'UNKNOWN-indeterminate' | 'UNKNOWN-no-seat' | 'LEGACY-manual-review';
40
+ export type CleanupReason = 'PRUNABLE' | 'SURVIVES-dirty' | 'SURVIVES-clobber' | 'SURVIVES-unmerged' | 'SURVIVES-detached' | 'SURVIVES-rejected' | 'SURVIVES-live' | 'SURVIVES-self' | 'UNKNOWN-indeterminate' | 'UNKNOWN-no-seat' | 'LEGACY-manual-review';
41
41
  export interface CleanupRow {
42
42
  worktreePath: string;
43
43
  wtBranch: string | null;
@@ -60,7 +60,7 @@ export interface CleanupDeps {
60
60
  cube: ActiveCube;
61
61
  }>>;
62
62
  /** Probe ONE seat's eviction status using ITS OWN token (gh#877). */
63
- probeSeat?: (sessionToken: string, apiUrl: string) => Promise<SeatStatus>;
63
+ probeSeat?: (sessionToken: string, apiUrl: string, serverTrustIdentity?: string) => Promise<SeatStatus>;
64
64
  /** realpath resolver — injected so tests can model symlink escape. */
65
65
  realpath?: (p: string) => string;
66
66
  stdout?: (line: string) => void;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-cmd.d.ts","sourceRoot":"","sources":["../src/cleanup-cmd.ts"],"names":[],"mappings":"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"}