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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assimilate-guard.js","sourceRoot":"","sources":["../src/assimilate-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,6EAA6E;AAC7E,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAuC,EACvC,iBAAyB;IAEzB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC5C,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5E,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA2D,EAC3D,iBAAyB;IAEzB,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,CACL,wFAAwF;YACxF,8EAA8E;YAC9E,IAAI,iBAAiB,qEAAqE;YAC1F,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO,CACL,wCAAwC,QAAQ,CAAC,cAAc,gBAAgB;QAC/E,2DAA2D,iBAAiB,cAAc;QAC1F,eAAe,iBAAiB,qDAAqD;QACrF,6CAA6C,CAC9C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAGtC;IACC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CACL,wFAAwF;QACxF,sCAAsC,MAAM,IAAI;QAChD,+EAA+E;QAC/E,qDAAqD,CACtD,CAAC;AACJ,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare function renderAssimilationWelcome(roleName: string, cubeName: string, useColor: boolean): string;
1
+ export declare function renderAssimilationWelcome(droneLabel: string, roleName: string, cubeName: string, useColor: boolean, localApiUrl?: string): string;
2
2
  //# sourceMappingURL=assimilate-welcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assimilate-welcome.d.ts","sourceRoot":"","sources":["../src/assimilate-welcome.ts"],"names":[],"mappings":"AAgBA,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAgBR"}
@@ -1,2 +1,32 @@
1
- const t="\x1B[32m",r="\x1B[0m";function c(e,o,n){return[`${n?`${t}\u2713${r}`:"\u2713"} Joined as \`${e}\` in cube \`${o}\`.`,"","Next: ask your agent to run the `borg_regen` tool to see your cube.","Add a teammate: run `borg assimilate <role>` in another terminal.","You're set up \u2014 your team can now see you in the cube.",""].join(`
2
- `)}export{c as renderAssimilationWelcome};
1
+ // Pedagogical hint rendered to stdout immediately after assimilation
2
+ // completes, before Claude Code launches. The cube-agnostic shape points
3
+ // the user at borg_whoami / borg_roster rather than embedding role-specific
4
+ // text — so
5
+ // cubes using non-default templates (writers-room, ops, etc.) render identically
6
+ // to software-dev cubes. The concrete drone, role seat, and cube names come from
7
+ // the completed server attach response.
8
+ //
9
+ // Color: ANSI green on the ✓ glyph only; gated on the caller's useColor
10
+ // boolean (computed from process.stdout.isTTY && !NO_COLOR && !CI in the
11
+ // assimilate-cmd call site). Body text carries no ANSI by design — color
12
+ // is hierarchy-cueing, not decoration.
13
+ const GREEN = '\x1b[32m';
14
+ const RESET = '\x1b[0m';
15
+ export function renderAssimilationWelcome(droneLabel, roleName, cubeName, useColor, localApiUrl) {
16
+ const check = useColor ? `${GREEN}✓${RESET}` : '✓';
17
+ const teammateLines = localApiUrl === undefined
18
+ ? [`Add a teammate: run \`borg assimilate <role>\` in another terminal.`]
19
+ : [
20
+ `Add a teammate from the intended worktree:`,
21
+ `run \`borg assimilate --host ${localApiUrl} <role>\` in another terminal.`,
22
+ ];
23
+ return [
24
+ `${check} Attached \`${droneLabel}\` to \`${roleName}\` in cube \`${cubeName}\`.`,
25
+ ``,
26
+ `In the launched agent, run \`borg_whoami\` and \`borg_roster\` to verify the seat`,
27
+ `and begin coordinating.`,
28
+ ...teammateLines,
29
+ ``,
30
+ ].join('\n');
31
+ }
32
+ //# sourceMappingURL=assimilate-welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assimilate-welcome.js","sourceRoot":"","sources":["../src/assimilate-welcome.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,yEAAyE;AACzE,4EAA4E;AAC5E,YAAY;AACZ,iFAAiF;AACjF,iFAAiF;AACjF,wCAAwC;AACxC,EAAE;AACF,wEAAwE;AACxE,yEAAyE;AACzE,yEAAyE;AACzE,uCAAuC;AAEvC,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,QAAgB,EAChB,QAAgB,EAChB,QAAiB,EACjB,WAAoB;IAEpB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACnD,MAAM,aAAa,GAAG,WAAW,KAAK,SAAS;QAC7C,CAAC,CAAC,CAAC,qEAAqE,CAAC;QACzE,CAAC,CAAC;YACE,4CAA4C;YAC5C,gCAAgC,WAAW,gCAAgC;SAC5E,CAAC;IACN,OAAO;QACL,GAAG,KAAK,eAAe,UAAU,WAAW,QAAQ,gBAAgB,QAAQ,KAAK;QACjF,EAAE;QACF,mFAAmF;QACnF,yBAAyB;QACzB,GAAG,aAAa;QAChB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -1,60 +1,17 @@
1
1
  /**
2
- * gh#557 environment / capability detection for remote-terminal auth.
2
+ * Local environment / capability primitives.
3
3
  *
4
- * The default OAuth path (auth.ts) opens a browser and listens on a
5
- * localhost-loopback callback server. Both assumptions break on a remote
6
- * terminal: there's no browser to open, and the loopback URL Google would
7
- * redirect to is unreachable from the user's actual browser on another
8
- * machine. These pure helpers decide when to fall back to the RFC 8628
9
- * device-grant flow (no browser) and when the OS keychain is unavailable
10
- * (so a keychain-less token store must be used instead).
11
- *
12
- * Kept free of side effects (env + platform are injected) so the decision
13
- * logic is unit-testable without a real display / SSH session / keychain.
4
+ * Pure helpers kept free of side effects (env is injected) so the decision logic
5
+ * is unit-testable. (The OS-keychain availability probe was removed with the
6
+ * Queen rescope credentials now rest in the 0600 file store, so there is no
7
+ * keychain to probe.)
14
8
  */
15
- export interface BrowserEnvProbe {
16
- /** A snapshot of the relevant environment variables (defaults to process.env). */
17
- env: NodeJS.ProcessEnv;
18
- /** The platform string (defaults to process.platform). */
19
- platform: NodeJS.Platform;
20
- }
21
9
  /**
22
10
  * A BORG_* toggle is "on" only when present and not one of the falsy
23
11
  * spellings. Mirrors how the rest of the client reads boolean env vars:
24
12
  * an unset var and the explicit "0"/"false"/"" spellings are all off.
25
- * Exported for the gh#673 launch-gate (BORG_SESSION) so every BORG_*
26
- * boolean reads through one convention.
13
+ * Used by the gh#673 launch-gate (BORG_SESSION) so every BORG_* boolean
14
+ * reads through one convention.
27
15
  */
28
16
  export declare function envToggleOn(value: string | undefined): boolean;
29
- /**
30
- * Decide whether the current environment lacks a usable local browser, so
31
- * the loopback OAuth flow can't work and the device-grant flow should be
32
- * used instead.
33
- *
34
- * Decision order (first match wins):
35
- * 1. BORG_FORCE_BROWSER on → false (escape hatch: operator has an
36
- * SSH-forwarded / X-forwarded browser and wants the loopback flow)
37
- * 2. BORG_NO_BROWSER on → true (explicit opt-in to device flow)
38
- * 3. SSH session → true (remote terminal — even on a Mac the
39
- * browser that opens is on the *server*, unreachable to the user)
40
- * 4. container marker → true (headless by construction)
41
- * 5. Linux without any display (no DISPLAY, no WAYLAND_DISPLAY) → true
42
- * 6. otherwise → false (desktop macOS/Windows, or Linux with
43
- * a display — the loopback flow works)
44
- *
45
- * The `--no-browser` / `--device` CLI flag is surfaced by the caller as
46
- * BORG_NO_BROWSER (or by passing an env with it set) so there's a single
47
- * decision funnel.
48
- */
49
- export declare function isNoBrowserEnv(probe?: Partial<BrowserEnvProbe>): boolean;
50
- /**
51
- * Returns true when the OS keychain can be written to and read from. The
52
- * round-trip is injectable so callers/tests can supply a deterministic
53
- * probe; in production the default probe touches the real keychain.
54
- *
55
- * Any thrown error from the probe (no Secret Service, locked keychain,
56
- * permission denial) is treated as "unavailable" — the caller then selects
57
- * the encrypted-file fallback store.
58
- */
59
- export declare function isKeyringAvailable(roundTrip?: () => Promise<void>): Promise<boolean>;
60
17
  //# sourceMappingURL=auth-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-env.d.ts","sourceRoot":"","sources":["../src/auth-env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI9D"}
package/dist/auth-env.js CHANGED
@@ -1 +1,22 @@
1
- import{AsyncEntry as o}from"@napi-rs/keyring";function n(t){if(t===void 0)return!1;const r=t.trim().toLowerCase();return r!==""&&r!=="0"&&r!=="false"&&r!=="no"}function i(t){const r=t?.env??process.env,e=t?.platform??process.platform;return n(r.BORG_FORCE_BROWSER)?!1:!!(n(r.BORG_NO_BROWSER)||r.SSH_TTY||r.SSH_CONNECTION||r.SSH_CLIENT||r.container||e==="linux"&&!r.DISPLAY&&!r.WAYLAND_DISPLAY)}async function s(){const t="borg-mcp",r="__borg_keyring_probe__",e=new o(t,r);await e.setPassword("probe"),await e.getPassword();try{await e.deletePassword()}catch{}}async function u(t=s){try{return await t(),!0}catch{return!1}}export{n as envToggleOn,u as isKeyringAvailable,i as isNoBrowserEnv};
1
+ /**
2
+ * Local environment / capability primitives.
3
+ *
4
+ * Pure helpers kept free of side effects (env is injected) so the decision logic
5
+ * is unit-testable. (The OS-keychain availability probe was removed with the
6
+ * Queen rescope — credentials now rest in the 0600 file store, so there is no
7
+ * keychain to probe.)
8
+ */
9
+ /**
10
+ * A BORG_* toggle is "on" only when present and not one of the falsy
11
+ * spellings. Mirrors how the rest of the client reads boolean env vars:
12
+ * an unset var and the explicit "0"/"false"/"" spellings are all off.
13
+ * Used by the gh#673 launch-gate (BORG_SESSION) so every BORG_* boolean
14
+ * reads through one convention.
15
+ */
16
+ export function envToggleOn(value) {
17
+ if (value === undefined)
18
+ return false;
19
+ const v = value.trim().toLowerCase();
20
+ return v !== '' && v !== '0' && v !== 'false' && v !== 'no';
21
+ }
22
+ //# sourceMappingURL=auth-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-env.js","sourceRoot":"","sources":["../src/auth-env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC;AAC9D,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-all-pastelist.d.ts","sourceRoot":"","sources":["../../src/backends/launch-all-pastelist.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,cAAc,EAAE,EAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,GAClB,IAAI,CAMN"}
@@ -1,4 +1,11 @@
1
- import{buildLaunchCommand as a}from"../launch-all-command.js";function i(o,r,n){n.stdout(`# borg launch-all: open each worktree in a terminal window and run:
2
-
3
- `);for(const t of o)n.stdout(a(t.worktreeDir,r)+`
4
- `)}export{i as runPastelistBackend};
1
+ // gh#556 Part 2 pastelist backend (never-fail floor, spec §4.3).
2
+ // Prints copy-pasteable `cd <dir> && borg assimilate --here` lines.
3
+ import { buildLaunchCommand } from '../launch-all-command.js';
4
+ export function runPastelistBackend(candidates, borgPath, deps) {
5
+ deps.stdout('# borg launch-all: open each worktree in a terminal window and run:\n\n');
6
+ for (const c of candidates) {
7
+ // No keep-open-on-fail: the operator owns their own shell in pastelist mode.
8
+ deps.stdout(buildLaunchCommand(c.worktreeDir, borgPath) + '\n');
9
+ }
10
+ }
11
+ //# sourceMappingURL=launch-all-pastelist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-all-pastelist.js","sourceRoot":"","sources":["../../src/backends/launch-all-pastelist.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oEAAoE;AAIpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,UAAU,mBAAmB,CACjC,UAA4B,EAC5B,QAAgB,EAChB,IAAmB;IAEnB,IAAI,CAAC,MAAM,CAAC,yEAAyE,CAAC,CAAC;IACvF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,6EAA6E;QAC7E,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-all-tmux.d.ts","sourceRoot":"","sources":["../../src/backends/launch-all-tmux.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzC,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAgDf"}
@@ -1 +1,49 @@
1
- import{buildLaunchCommand as d}from"../launch-all-command.js";import{writeLockMarker as x}from"../launch-all-locks.js";async function y(o,s,t){const{sessionName:e,borgPath:u,attachMode:c,launchedAtISO:w,launchDelayMs:a,sleep:m}=s,l=t.runSyncExitCode("tmux",["has-session","-t",e])===0;for(let r=0;r<o.length;r++){const n=o[r];r>0&&a>0&&await m(a);let i;r===0&&!l?i=t.runSync("tmux",["new-session","-d","-P","-F","#{window_id}","-s",e,"-c",n.worktreeDir]).trim():i=t.runSync("tmux",["new-window","-P","-F","#{window_id}","-t",e,"-c",n.worktreeDir]).trim(),t.runSync("tmux",["rename-window","-t",i,n.droneLabel]);const h=d(n.worktreeDir,u,{keepOpenOnFail:!0});t.runSync("tmux",["send-keys","-t",i,h,"Enter"]),x(t,n.cubeId,n.droneLabel,n.worktreeDir,w)}c==="switch"?t.attachInteractive("tmux",["switch-client","-t",e]):c==="attach"&&t.attachInteractive("tmux",["attach-session","-t",e])}export{y as runTmuxBackend};
1
+ // gh#556 Part 2 tmux backend (primary, spec §4.1).
2
+ // One detached `borg-<cube>` session, one window per drone, each running
3
+ // `borg assimilate --here`. Idempotent: reuses an existing session (adds windows).
4
+ import { buildLaunchCommand } from '../launch-all-command.js';
5
+ import { writeLockMarker } from '../launch-all-locks.js';
6
+ export async function runTmuxBackend(candidates, opts, deps) {
7
+ const { sessionName, borgPath, attachMode, launchedAtISO, launchDelayMs, sleep } = opts;
8
+ const sessionExists = deps.runSyncExitCode('tmux', ['has-session', '-t', sessionName]) === 0;
9
+ for (let i = 0; i < candidates.length; i++) {
10
+ const c = candidates[i];
11
+ // Rate-limit stagger: wait BEFORE each launch after the first, so a fleet's
12
+ // agents don't all bootstrap (assimilate + regen + roster) simultaneously and
13
+ // trip the per-user/IP limiter. Window creation is ~instant otherwise, so
14
+ // without this N agents start within ~100ms. 0 → no delay (first never waits).
15
+ if (i > 0 && launchDelayMs > 0) {
16
+ await sleep(launchDelayMs);
17
+ }
18
+ // CR f98b2d70: target windows by their CAPTURED id (`-P -F '#{window_id}'` prints
19
+ // e.g. `@3`), NOT a computed 0-based index. Index-targeting hard-failed under the
20
+ // common `set -g base-index 1` config (new-session creates window 1, not 0) and was
21
+ // fragile to index gaps on the reuse path. Capturing the real id is base-index-proof
22
+ // and gap-proof. new-session AND new-window both print the new window's id with -P -F.
23
+ let windowId;
24
+ if (i === 0 && !sessionExists) {
25
+ windowId = deps
26
+ .runSync('tmux', ['new-session', '-d', '-P', '-F', '#{window_id}', '-s', sessionName, '-c', c.worktreeDir])
27
+ .trim();
28
+ }
29
+ else {
30
+ windowId = deps
31
+ .runSync('tmux', ['new-window', '-P', '-F', '#{window_id}', '-t', sessionName, '-c', c.worktreeDir])
32
+ .trim();
33
+ }
34
+ // tmux-level window name (status bar). The agent's own OSC-0 may update it later.
35
+ deps.runSync('tmux', ['rename-window', '-t', windowId, c.droneLabel]);
36
+ const cmd = buildLaunchCommand(c.worktreeDir, borgPath, { keepOpenOnFail: true });
37
+ deps.runSync('tmux', ['send-keys', '-t', windowId, cmd, 'Enter']);
38
+ // Lock marker written immediately after dispatch (best-effort liveness signal).
39
+ writeLockMarker(deps, c.cubeId, c.droneLabel, c.worktreeDir, launchedAtISO);
40
+ }
41
+ if (attachMode === 'switch') {
42
+ deps.attachInteractive('tmux', ['switch-client', '-t', sessionName]);
43
+ }
44
+ else if (attachMode === 'attach') {
45
+ deps.attachInteractive('tmux', ['attach-session', '-t', sessionName]);
46
+ }
47
+ // 'none' → caller prints the cheat-sheet instead.
48
+ }
49
+ //# sourceMappingURL=launch-all-tmux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-all-tmux.js","sourceRoot":"","sources":["../../src/backends/launch-all-tmux.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,yEAAyE;AACzE,mFAAmF;AAInF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAezD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAA4B,EAC5B,IAAc,EACd,IAAmB;IAEnB,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAExF,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC;IAE7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAExB,4EAA4E;QAC5E,8EAA8E;QAC9E,0EAA0E;QAC1E,+EAA+E;QAC/E,IAAI,CAAC,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAED,kFAAkF;QAClF,kFAAkF;QAClF,oFAAoF;QACpF,qFAAqF;QACrF,uFAAuF;QACvF,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9B,QAAQ,GAAG,IAAI;iBACZ,OAAO,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;iBAC1G,IAAI,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAI;iBACZ,OAAO,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;iBACnG,IAAI,EAAE,CAAC;QACZ,CAAC;QAED,kFAAkF;QAClF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAEtE,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAElE,gFAAgF;QAChF,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,kDAAkD;AACpD,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-all-windows.d.ts","sourceRoot":"","sources":["../../src/backends/launch-all-windows.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAuED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,cAAc,EAAE,EAC5B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -1,12 +1,86 @@
1
- import{buildLaunchCommand as m}from"../launch-all-command.js";import{writeLockMarker as u}from"../launch-all-locks.js";function s(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}class f extends Error{}async function w(t,e,r){const i=r.pathExists("/Applications/iTerm.app"),o=r.pathExists("/Applications/Terminal.app");if(!i&&!o)throw new f(`borg launch-all: --mode windows requires a compatible terminal app.
2
- Not found: iTerm.app, Terminal.app
3
- Install iTerm2 (https://iterm2.com) or use --mode tmux (brew install tmux).
4
- `);for(let a=0;a<t.length;a++){const n=t[a];a>0&&e.launchDelayMs>0&&await e.sleep(e.launchDelayMs);const l=m(n.worktreeDir,e.borgPath),c=i?`tell application "iTerm"
5
- tell current window to create tab with default profile command "${s(l)}"
6
- end tell`:`tell application "Terminal"
7
- do script "${s(l)}"
8
- activate
9
- end tell`;r.runSync("osascript",["-e",c]),u(r,n.cubeId,n.droneLabel,n.worktreeDir,e.launchedAtISO)}}async function h(t,e,r){const i=r.getEnv("BORG_TERMINAL")||r.getEnv("TERMINAL"),o=["gnome-terminal","konsole","kitty","wezterm","xterm"];let a=i;if(!a){for(const n of o)if(r.runSyncExitCode("which",[n])===0){a=n;break}}if(!a)throw new f(`borg launch-all: --mode windows requires a terminal emulator.
10
- Not found. Set $BORG_TERMINAL=<path> or use --mode tmux.
11
- `);for(let n=0;n<t.length;n++){const l=t[n];n>0&&e.launchDelayMs>0&&await e.sleep(e.launchDelayMs);const c=m(l.worktreeDir,e.borgPath,{keepOpenOnFail:!0});r.runSync(a,["-e","sh","-c",c]),u(r,l.cubeId,l.droneLabel,l.worktreeDir,e.launchedAtISO)}}const p=/[\x00-\x1f\x7f]/;async function k(t,e,r){const i=t.filter(o=>p.test(o.worktreeDir)?(r.stderr(`skipping ${o.droneLabel} (${JSON.stringify(o.worktreeDir)}): worktree path contains a control character \u2014 unsafe for --mode windows; use --mode tmux instead.
12
- `),!1):!0);e.platform==="darwin"?await w(i,e,r):await h(i,e,r)}export{k as runWindowsBackend};
1
+ // gh#556 Part 2 windows backend (explicit `--mode windows` only, spec §4.2).
2
+ // Opens each worktree as a new terminal window/tab. macOS: iTerm/Terminal via
3
+ // osascript. Linux: $BORG_TERMINAL / $TERMINAL / probed emulator. No shared
4
+ // session, so no post-launch attach. Hard-fails if no compatible terminal found.
5
+ import { buildLaunchCommand } from '../launch-all-command.js';
6
+ import { writeLockMarker } from '../launch-all-locks.js';
7
+ /** AppleScript string-literal escaping (backslash + double-quote). */
8
+ function appleScriptEscape(s) {
9
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
10
+ }
11
+ class NoTerminalError extends Error {
12
+ }
13
+ /** macOS: open each candidate in iTerm or Terminal via osascript. */
14
+ async function launchMacOS(candidates, opts, deps) {
15
+ const hasITerm = deps.pathExists('/Applications/iTerm.app');
16
+ const hasTerminal = deps.pathExists('/Applications/Terminal.app');
17
+ if (!hasITerm && !hasTerminal) {
18
+ throw new NoTerminalError('borg launch-all: --mode windows requires a compatible terminal app.\n' +
19
+ 'Not found: iTerm.app, Terminal.app\n' +
20
+ 'Install iTerm2 (https://iterm2.com) or use --mode tmux (brew install tmux).\n');
21
+ }
22
+ for (let i = 0; i < candidates.length; i++) {
23
+ const c = candidates[i];
24
+ if (i > 0 && opts.launchDelayMs > 0)
25
+ await opts.sleep(opts.launchDelayMs); // rate-limit stagger
26
+ const cmd = buildLaunchCommand(c.worktreeDir, opts.borgPath);
27
+ const script = hasITerm
28
+ ? `tell application "iTerm"\n tell current window to create tab with default profile command "${appleScriptEscape(cmd)}"\nend tell`
29
+ : `tell application "Terminal"\n do script "${appleScriptEscape(cmd)}"\n activate\nend tell`;
30
+ deps.runSync('osascript', ['-e', script]);
31
+ writeLockMarker(deps, c.cubeId, c.droneLabel, c.worktreeDir, opts.launchedAtISO);
32
+ }
33
+ }
34
+ /** Linux: open each candidate in the first available terminal emulator. */
35
+ async function launchLinux(candidates, opts, deps) {
36
+ const explicit = deps.getEnv('BORG_TERMINAL') || deps.getEnv('TERMINAL');
37
+ const probe = ['gnome-terminal', 'konsole', 'kitty', 'wezterm', 'xterm'];
38
+ let term = explicit;
39
+ if (!term) {
40
+ for (const name of probe) {
41
+ if (deps.runSyncExitCode('which', [name]) === 0) {
42
+ term = name;
43
+ break;
44
+ }
45
+ }
46
+ }
47
+ if (!term) {
48
+ throw new NoTerminalError('borg launch-all: --mode windows requires a terminal emulator.\n' +
49
+ 'Not found. Set $BORG_TERMINAL=<path> or use --mode tmux.\n');
50
+ }
51
+ for (let i = 0; i < candidates.length; i++) {
52
+ const c = candidates[i];
53
+ if (i > 0 && opts.launchDelayMs > 0)
54
+ await opts.sleep(opts.launchDelayMs); // rate-limit stagger
55
+ const cmd = buildLaunchCommand(c.worktreeDir, opts.borgPath, { keepOpenOnFail: true });
56
+ // `<term> -e sh -c '<cmd>'` opens a new window running the command.
57
+ deps.runSync(term, ['-e', 'sh', '-c', cmd]);
58
+ writeLockMarker(deps, c.cubeId, c.droneLabel, c.worktreeDir, opts.launchedAtISO);
59
+ }
60
+ }
61
+ /**
62
+ * Control char (incl. newline) in a worktree path. SR f94bb3fe + Coordinator
63
+ * c6370c41 fold-in: a newline in the path breaks the macOS osascript AppleScript
64
+ * string literal (parse error). Reject such paths up front (the user's own path;
65
+ * pathological) — fail-loud + skip, never silently mangle. Applies to both
66
+ * platforms defensively (the tmux primary handles control chars fine via
67
+ * shellEscape + array-args, so this guard is windows-backend-specific).
68
+ */
69
+ const CONTROL_CHAR_RE = /[\x00-\x1f\x7f]/;
70
+ export async function runWindowsBackend(candidates, opts, deps) {
71
+ const safe = candidates.filter((c) => {
72
+ if (CONTROL_CHAR_RE.test(c.worktreeDir)) {
73
+ deps.stderr(`skipping ${c.droneLabel} (${JSON.stringify(c.worktreeDir)}): worktree path contains a control ` +
74
+ `character — unsafe for --mode windows; use --mode tmux instead.\n`);
75
+ return false;
76
+ }
77
+ return true;
78
+ });
79
+ if (opts.platform === 'darwin') {
80
+ await launchMacOS(safe, opts, deps);
81
+ }
82
+ else {
83
+ await launchLinux(safe, opts, deps);
84
+ }
85
+ }
86
+ //# sourceMappingURL=launch-all-windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-all-windows.js","sourceRoot":"","sources":["../../src/backends/launch-all-windows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bare-launch-menu.d.ts","sourceRoot":"","sources":["../src/bare-launch-menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3B,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,UAAU,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,kBAAkB,EAAE,OAAO,EAAE,CAAC;IAC9B,8EAA8E;IAC9E,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAEV;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,MAAM,GAAG,IAAI,CAIhB;AAED,wBAAgB,yCAAyC,CAAC,IAAI,EAAE;IAC9D,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAEV;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAuBnF;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,QAAQ,EAAE,MAAM,GACf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAKxD;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAGpE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAC5C,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GACpE,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
@@ -1,6 +1,83 @@
1
- const c={claude:"Claude",codex:"Codex",opencode:"OpenCode"};function f(n){return n.extraArgs.length===0&&n.stdinIsTTY&&n.stdoutIsTTY}function p(n){return!n.explicitCli||!n.stdinIsTTY||!n.stdoutIsTTY||!n.hasActiveCube||!n.hasLaunchAllTargets?null:`borg --cli ${n.explicitCli} launches ${c[n.explicitCli]} directly; use bare borg for the launch menu or borg launch-all --cli ${n.explicitCli} for all drone worktrees.
2
- `}function x(n){return!!(n.explicitCli&&n.stdinIsTTY&&n.stdoutIsTTY&&n.hasActiveCube)}function h(n){const e=[{key:"1",label:`Launch (default \xB7 ${c[n.defaultCli]})`,action:{kind:"launch",cli:n.defaultCli}}];for(const t of n.otherInstalledClis)e.push({key:String(e.length+1),label:`Launch with ${c[t]} (one-shot)`,action:{kind:"launch",cli:t}});return n.hasLaunchAllTargets&&e.push({key:String(e.length+1),label:"Launch all (this cube's drone worktrees)",action:{kind:"launch-all"}}),e}function s(n,e){const t=e.trim();if(t==="")return{ok:!0,action:n[0].action};const i=n.find(o=>o.key===t);return i?{ok:!0,action:i.action}:{ok:!1}}function d(n){return`borg \u2014 how do you want to launch?
3
- ${n.map(t=>` ${t.key}) ${t.label}`).join(`
4
- `)}
5
- [1]: `}async function T(n,e,t={}){const i=h(n);if(i.length===1)return i[0].action;const o=t.maxAttempts??3,u=d(i);for(let l=0;l<o;l++){const r=await e(l===0?u:`Invalid choice.
6
- ${u}`),a=s(i,r);if(a.ok)return a.action;t.warn?.(`invalid launch-menu selection: ${JSON.stringify(r.trim())}`)}return i[0].action}export{h as buildLaunchMenuOptions,p as explicitCliLaunchHint,d as renderLaunchMenu,s as resolveLaunchMenuChoice,T as runBareLaunchMenu,x as shouldResolveExplicitCliLaunchHintTargets,f as shouldShowLaunchMenu};
1
+ const PRETTY = { claude: 'Claude', codex: 'Codex', opencode: 'OpenCode' };
2
+ /**
3
+ * Gate: the menu fires ONLY for bare `borg` (no args) in a TTY. Any explicit
4
+ * subcommand/flag, or a non-TTY (piped/scripted/CI) invocation, falls straight
5
+ * through to the existing default launch — no menu, no behavior change.
6
+ */
7
+ export function shouldShowLaunchMenu(args) {
8
+ return args.extraArgs.length === 0 && args.stdinIsTTY && args.stdoutIsTTY;
9
+ }
10
+ export function explicitCliLaunchHint(args) {
11
+ if (!args.explicitCli || !args.stdinIsTTY || !args.stdoutIsTTY)
12
+ return null;
13
+ if (!args.hasActiveCube || !args.hasLaunchAllTargets)
14
+ return null;
15
+ return `borg --cli ${args.explicitCli} launches ${PRETTY[args.explicitCli]} directly; use bare borg for the launch menu or borg launch-all --cli ${args.explicitCli} for all drone worktrees.\n`;
16
+ }
17
+ export function shouldResolveExplicitCliLaunchHintTargets(args) {
18
+ return Boolean(args.explicitCli && args.stdinIsTTY && args.stdoutIsTTY && args.hasActiveCube);
19
+ }
20
+ /**
21
+ * The context-filtered option set. Option 1 is always present; options 2/3 are
22
+ * included only when applicable. Keys are sequential with no gaps, so a hidden
23
+ * middle option never produces a "1) … 3) …" gap menu.
24
+ */
25
+ export function buildLaunchMenuOptions(inputs) {
26
+ const options = [
27
+ {
28
+ key: '1',
29
+ label: `Launch (default · ${PRETTY[inputs.defaultCli]})`,
30
+ action: { kind: 'launch', cli: inputs.defaultCli },
31
+ },
32
+ ];
33
+ for (const cli of inputs.otherInstalledClis) {
34
+ options.push({
35
+ key: String(options.length + 1),
36
+ label: `Launch with ${PRETTY[cli]} (one-shot)`,
37
+ action: { kind: 'launch', cli },
38
+ });
39
+ }
40
+ if (inputs.hasLaunchAllTargets) {
41
+ options.push({
42
+ key: String(options.length + 1),
43
+ label: "Launch all (this cube's drone worktrees)",
44
+ action: { kind: 'launch-all' },
45
+ });
46
+ }
47
+ return options;
48
+ }
49
+ /** Map a raw prompt answer to an action. Empty/Enter → option 1 (default). */
50
+ export function resolveLaunchMenuChoice(options, rawInput) {
51
+ const trimmed = rawInput.trim();
52
+ if (trimmed === '')
53
+ return { ok: true, action: options[0].action };
54
+ const match = options.find((o) => o.key === trimmed);
55
+ return match ? { ok: true, action: match.action } : { ok: false };
56
+ }
57
+ /** The rendered menu text (prompt suffix `[1]:` defaults to option 1 on Enter). */
58
+ export function renderLaunchMenu(options) {
59
+ const lines = options.map((o) => ` ${o.key}) ${o.label}`);
60
+ return `borg — how do you want to launch?\n${lines.join('\n')}\n[1]: `;
61
+ }
62
+ /**
63
+ * Orchestrate the menu with an injected readline-style prompt. Collapses to a
64
+ * direct default launch (no render, no prompt) when only option 1 applies.
65
+ * Re-prompts on invalid input up to `maxAttempts`, then falls back to the safe
66
+ * default (option 1) so a fat-fingered session still launches.
67
+ */
68
+ export async function runBareLaunchMenu(inputs, prompt, opts = {}) {
69
+ const options = buildLaunchMenuOptions(inputs);
70
+ if (options.length === 1)
71
+ return options[0].action; // collapse — never a 1-item menu
72
+ const maxAttempts = opts.maxAttempts ?? 3;
73
+ const menu = renderLaunchMenu(options);
74
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
75
+ const raw = await prompt(attempt === 0 ? menu : `Invalid choice.\n${menu}`);
76
+ const res = resolveLaunchMenuChoice(options, raw);
77
+ if (res.ok)
78
+ return res.action;
79
+ opts.warn?.(`invalid launch-menu selection: ${JSON.stringify(raw.trim())}`);
80
+ }
81
+ return options[0].action; // exhausted → safe default
82
+ }
83
+ //# sourceMappingURL=bare-launch-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bare-launch-menu.js","sourceRoot":"","sources":["../src/bare-launch-menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-launch-args.d.ts","sourceRoot":"","sources":["../src/claude-launch-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,sBAAsB,iBAAiB,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1F"}
@@ -1 +1,34 @@
1
- const r="mcp__borg__*";function e(o,_){return[...o,_,"--allowedTools",r]}export{r as BORG_MCP_ALLOWED_TOOLS,e as buildClaudeLaunchArgs};
1
+ /**
2
+ * gh#702 — borg-launched Claude Code drones auto-allow the borg MCP
3
+ * coordination tools so a drone never prompts on borg_regen / borg_log /
4
+ * borg_ack / etc. mid-loop.
5
+ *
6
+ * SCOPED, by deliberate design (Option A, per-launch — avoids the gh#844
7
+ * settings-mutation/consent class):
8
+ * - ONLY `mcp__borg__*` is auto-allowed. Bash, file edits (Read/Write/Edit),
9
+ * web (WebFetch/WebSearch), and everything else STILL prompt. This is an
10
+ * allowlist ADD, NOT `--dangerously-skip-permissions` and NOT a blanket
11
+ * allow.
12
+ * - Applied ONLY by the borg launcher (a per-invocation CLI flag) — there is
13
+ * NO persistent user-settings write, so no consent gate is involved.
14
+ * - claude only. Codex parity is a separate follow-up (different permission
15
+ * model) — intentionally not handled here.
16
+ */
17
+ /** The allowlist pattern matching every tool from the `borg` MCP server. */
18
+ export const BORG_MCP_ALLOWED_TOOLS = 'mcp__borg__*';
19
+ /**
20
+ * Build the argv for a borg-launched `claude` process: the user's passthrough
21
+ * args.
22
+ *
23
+ * ORDER IS LOAD-BEARING (CR blocker 0e5c697e): `--allowedTools` is a VARIADIC
24
+ * option (`<tools...>`, a space-separated list), so it greedily consumes every
25
+ * following non-flag argv element. If the kickoff prompt came AFTER it, claude
26
+ * would absorb the prompt as a 2nd "allowed tool" and launch with NO kickoff.
27
+ * So the kickoff positional goes FIRST and the variadic flag goes LAST, where
28
+ * it can only consume its own single value:
29
+ * [...passthrough, kickoff, '--allowedTools', 'mcp__borg__*']
30
+ */
31
+ export function buildClaudeLaunchArgs(passthroughArgs, kickoff) {
32
+ return [...passthroughArgs, kickoff, '--allowedTools', BORG_MCP_ALLOWED_TOOLS];
33
+ }
34
+ //# sourceMappingURL=claude-launch-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-launch-args.js","sourceRoot":"","sources":["../src/claude-launch-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,eAAyB,EAAE,OAAe;IAC9E,OAAO,CAAC,GAAG,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}