@mclawnet/swarm 0.1.13 → 0.1.14

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 (320) hide show
  1. package/dist/__tests__/always-on-activity-reader.test.d.ts +2 -0
  2. package/dist/__tests__/always-on-activity-reader.test.d.ts.map +1 -0
  3. package/dist/__tests__/always-on-activity-reader.test.js +193 -0
  4. package/dist/__tests__/always-on-activity-reader.test.js.map +1 -0
  5. package/dist/__tests__/always-on-config.test.d.ts +2 -0
  6. package/dist/__tests__/always-on-config.test.d.ts.map +1 -0
  7. package/dist/__tests__/always-on-config.test.js +285 -0
  8. package/dist/__tests__/always-on-config.test.js.map +1 -0
  9. package/dist/__tests__/always-on-manager.test.d.ts +2 -0
  10. package/dist/__tests__/always-on-manager.test.d.ts.map +1 -0
  11. package/dist/__tests__/always-on-manager.test.js +797 -0
  12. package/dist/__tests__/always-on-manager.test.js.map +1 -0
  13. package/dist/__tests__/always-on-parity.test.d.ts +2 -0
  14. package/dist/__tests__/always-on-parity.test.d.ts.map +1 -0
  15. package/dist/__tests__/always-on-parity.test.js +20 -0
  16. package/dist/__tests__/always-on-parity.test.js.map +1 -0
  17. package/dist/__tests__/cascade-picker.test.d.ts +2 -0
  18. package/dist/__tests__/cascade-picker.test.d.ts.map +1 -0
  19. package/dist/__tests__/cascade-picker.test.js +122 -0
  20. package/dist/__tests__/cascade-picker.test.js.map +1 -0
  21. package/dist/__tests__/coordinator-shipment.test.d.ts +2 -0
  22. package/dist/__tests__/coordinator-shipment.test.d.ts.map +1 -0
  23. package/dist/__tests__/coordinator-shipment.test.js +280 -0
  24. package/dist/__tests__/coordinator-shipment.test.js.map +1 -0
  25. package/dist/__tests__/coordinator-workspace-recover.test.d.ts +2 -0
  26. package/dist/__tests__/coordinator-workspace-recover.test.d.ts.map +1 -0
  27. package/dist/__tests__/coordinator-workspace-recover.test.js +140 -0
  28. package/dist/__tests__/coordinator-workspace-recover.test.js.map +1 -0
  29. package/dist/__tests__/coordinator-workspace.test.d.ts +2 -0
  30. package/dist/__tests__/coordinator-workspace.test.d.ts.map +1 -0
  31. package/dist/__tests__/coordinator-workspace.test.js +135 -0
  32. package/dist/__tests__/coordinator-workspace.test.js.map +1 -0
  33. package/dist/__tests__/default-runner-epipe.test.d.ts +2 -0
  34. package/dist/__tests__/default-runner-epipe.test.d.ts.map +1 -0
  35. package/dist/__tests__/default-runner-epipe.test.js +43 -0
  36. package/dist/__tests__/default-runner-epipe.test.js.map +1 -0
  37. package/dist/__tests__/discovery-scheduler.test.d.ts +2 -0
  38. package/dist/__tests__/discovery-scheduler.test.d.ts.map +1 -0
  39. package/dist/__tests__/discovery-scheduler.test.js +367 -0
  40. package/dist/__tests__/discovery-scheduler.test.js.map +1 -0
  41. package/dist/__tests__/env-forward-e2e.test.d.ts +2 -0
  42. package/dist/__tests__/env-forward-e2e.test.d.ts.map +1 -0
  43. package/dist/__tests__/env-forward-e2e.test.js +57 -0
  44. package/dist/__tests__/env-forward-e2e.test.js.map +1 -0
  45. package/dist/__tests__/gh-pr-creator.test.d.ts +2 -0
  46. package/dist/__tests__/gh-pr-creator.test.d.ts.map +1 -0
  47. package/dist/__tests__/gh-pr-creator.test.js +107 -0
  48. package/dist/__tests__/gh-pr-creator.test.js.map +1 -0
  49. package/dist/__tests__/git-worktree-provider.test.d.ts +2 -0
  50. package/dist/__tests__/git-worktree-provider.test.d.ts.map +1 -0
  51. package/dist/__tests__/git-worktree-provider.test.js +98 -0
  52. package/dist/__tests__/git-worktree-provider.test.js.map +1 -0
  53. package/dist/__tests__/gitignore-check.test.d.ts +2 -0
  54. package/dist/__tests__/gitignore-check.test.d.ts.map +1 -0
  55. package/dist/__tests__/gitignore-check.test.js +39 -0
  56. package/dist/__tests__/gitignore-check.test.js.map +1 -0
  57. package/dist/__tests__/idea-research-source.test.d.ts +2 -0
  58. package/dist/__tests__/idea-research-source.test.d.ts.map +1 -0
  59. package/dist/__tests__/idea-research-source.test.js +425 -0
  60. package/dist/__tests__/idea-research-source.test.js.map +1 -0
  61. package/dist/__tests__/idea-todo-source.test.d.ts +2 -0
  62. package/dist/__tests__/idea-todo-source.test.d.ts.map +1 -0
  63. package/dist/__tests__/idea-todo-source.test.js +258 -0
  64. package/dist/__tests__/idea-todo-source.test.js.map +1 -0
  65. package/dist/__tests__/introspection-dedupe.test.d.ts +2 -0
  66. package/dist/__tests__/introspection-dedupe.test.d.ts.map +1 -0
  67. package/dist/__tests__/introspection-dedupe.test.js +484 -0
  68. package/dist/__tests__/introspection-dedupe.test.js.map +1 -0
  69. package/dist/__tests__/introspection-source.test.d.ts +2 -0
  70. package/dist/__tests__/introspection-source.test.d.ts.map +1 -0
  71. package/dist/__tests__/introspection-source.test.js +1051 -0
  72. package/dist/__tests__/introspection-source.test.js.map +1 -0
  73. package/dist/__tests__/migration-roles.test.js +1 -22
  74. package/dist/__tests__/migration-roles.test.js.map +1 -1
  75. package/dist/__tests__/reconcile-researching.test.d.ts +2 -0
  76. package/dist/__tests__/reconcile-researching.test.d.ts.map +1 -0
  77. package/dist/__tests__/reconcile-researching.test.js +224 -0
  78. package/dist/__tests__/reconcile-researching.test.js.map +1 -0
  79. package/dist/__tests__/role-loader-preamble-all.test.js +3 -1
  80. package/dist/__tests__/role-loader-preamble-all.test.js.map +1 -1
  81. package/dist/__tests__/role-loader.test.js +95 -0
  82. package/dist/__tests__/role-loader.test.js.map +1 -1
  83. package/dist/__tests__/role-prompt-no-legacy-protocol.test.js +3 -1
  84. package/dist/__tests__/role-prompt-no-legacy-protocol.test.js.map +1 -1
  85. package/dist/__tests__/secret-scrub.test.d.ts +2 -0
  86. package/dist/__tests__/secret-scrub.test.d.ts.map +1 -0
  87. package/dist/__tests__/secret-scrub.test.js +55 -0
  88. package/dist/__tests__/secret-scrub.test.js.map +1 -0
  89. package/dist/__tests__/shipment-actions.test.d.ts +2 -0
  90. package/dist/__tests__/shipment-actions.test.d.ts.map +1 -0
  91. package/dist/__tests__/shipment-actions.test.js +378 -0
  92. package/dist/__tests__/shipment-actions.test.js.map +1 -0
  93. package/dist/__tests__/shipment-persistence.test.d.ts +2 -0
  94. package/dist/__tests__/shipment-persistence.test.d.ts.map +1 -0
  95. package/dist/__tests__/shipment-persistence.test.js +120 -0
  96. package/dist/__tests__/shipment-persistence.test.js.map +1 -0
  97. package/dist/__tests__/shipment-pipeline.test.d.ts +2 -0
  98. package/dist/__tests__/shipment-pipeline.test.d.ts.map +1 -0
  99. package/dist/__tests__/shipment-pipeline.test.js +392 -0
  100. package/dist/__tests__/shipment-pipeline.test.js.map +1 -0
  101. package/dist/__tests__/shipment-report.test.d.ts +2 -0
  102. package/dist/__tests__/shipment-report.test.d.ts.map +1 -0
  103. package/dist/__tests__/shipment-report.test.js +78 -0
  104. package/dist/__tests__/shipment-report.test.js.map +1 -0
  105. package/dist/__tests__/shipment-stdin-integration.test.d.ts +2 -0
  106. package/dist/__tests__/shipment-stdin-integration.test.d.ts.map +1 -0
  107. package/dist/__tests__/shipment-stdin-integration.test.js +49 -0
  108. package/dist/__tests__/shipment-stdin-integration.test.js.map +1 -0
  109. package/dist/__tests__/shipment-type-parity.test.d.ts +2 -0
  110. package/dist/__tests__/shipment-type-parity.test.d.ts.map +1 -0
  111. package/dist/__tests__/shipment-type-parity.test.js +10 -0
  112. package/dist/__tests__/shipment-type-parity.test.js.map +1 -0
  113. package/dist/__tests__/snapshot-copy-provider.test.d.ts +2 -0
  114. package/dist/__tests__/snapshot-copy-provider.test.d.ts.map +1 -0
  115. package/dist/__tests__/snapshot-copy-provider.test.js +88 -0
  116. package/dist/__tests__/snapshot-copy-provider.test.js.map +1 -0
  117. package/dist/__tests__/swarm-coordinator-backend.test.js +153 -0
  118. package/dist/__tests__/swarm-coordinator-backend.test.js.map +1 -1
  119. package/dist/__tests__/swarm-coordinator-complete-intercept.test.d.ts +2 -0
  120. package/dist/__tests__/swarm-coordinator-complete-intercept.test.d.ts.map +1 -0
  121. package/dist/__tests__/swarm-coordinator-complete-intercept.test.js +111 -0
  122. package/dist/__tests__/swarm-coordinator-complete-intercept.test.js.map +1 -0
  123. package/dist/__tests__/task-store-source.test.d.ts +2 -0
  124. package/dist/__tests__/task-store-source.test.d.ts.map +1 -0
  125. package/dist/__tests__/task-store-source.test.js +56 -0
  126. package/dist/__tests__/task-store-source.test.js.map +1 -0
  127. package/dist/__tests__/transport-detect.test.d.ts +2 -0
  128. package/dist/__tests__/transport-detect.test.d.ts.map +1 -0
  129. package/dist/__tests__/transport-detect.test.js +92 -0
  130. package/dist/__tests__/transport-detect.test.js.map +1 -0
  131. package/dist/__tests__/workcycle-runner-cascade.test.d.ts +2 -0
  132. package/dist/__tests__/workcycle-runner-cascade.test.d.ts.map +1 -0
  133. package/dist/__tests__/workcycle-runner-cascade.test.js +203 -0
  134. package/dist/__tests__/workcycle-runner-cascade.test.js.map +1 -0
  135. package/dist/__tests__/workcycle-runner.test.d.ts +2 -0
  136. package/dist/__tests__/workcycle-runner.test.d.ts.map +1 -0
  137. package/dist/__tests__/workcycle-runner.test.js +369 -0
  138. package/dist/__tests__/workcycle-runner.test.js.map +1 -0
  139. package/dist/__tests__/workspace-diff.test.d.ts +2 -0
  140. package/dist/__tests__/workspace-diff.test.d.ts.map +1 -0
  141. package/dist/__tests__/workspace-diff.test.js +62 -0
  142. package/dist/__tests__/workspace-diff.test.js.map +1 -0
  143. package/dist/__tests__/workspace-manager.test.d.ts +2 -0
  144. package/dist/__tests__/workspace-manager.test.d.ts.map +1 -0
  145. package/dist/__tests__/workspace-manager.test.js +120 -0
  146. package/dist/__tests__/workspace-manager.test.js.map +1 -0
  147. package/dist/__tests__/workspace-types.test.d.ts +2 -0
  148. package/dist/__tests__/workspace-types.test.d.ts.map +1 -0
  149. package/dist/__tests__/workspace-types.test.js +37 -0
  150. package/dist/__tests__/workspace-types.test.js.map +1 -0
  151. package/dist/__tests__/worktree-gc.test.d.ts +2 -0
  152. package/dist/__tests__/worktree-gc.test.d.ts.map +1 -0
  153. package/dist/__tests__/worktree-gc.test.js +183 -0
  154. package/dist/__tests__/worktree-gc.test.js.map +1 -0
  155. package/dist/always-on/activity-reader.d.ts +27 -0
  156. package/dist/always-on/activity-reader.d.ts.map +1 -0
  157. package/dist/always-on/activity-reader.js +95 -0
  158. package/dist/always-on/activity-reader.js.map +1 -0
  159. package/dist/always-on/always-on-manager.d.ts +170 -0
  160. package/dist/always-on/always-on-manager.d.ts.map +1 -0
  161. package/dist/always-on/always-on-manager.js +538 -0
  162. package/dist/always-on/always-on-manager.js.map +1 -0
  163. package/dist/always-on/config.d.ts +141 -0
  164. package/dist/always-on/config.d.ts.map +1 -0
  165. package/dist/always-on/config.js +324 -0
  166. package/dist/always-on/config.js.map +1 -0
  167. package/dist/always-on/discovery-scheduler.d.ts +60 -0
  168. package/dist/always-on/discovery-scheduler.d.ts.map +1 -0
  169. package/dist/always-on/discovery-scheduler.js +287 -0
  170. package/dist/always-on/discovery-scheduler.js.map +1 -0
  171. package/dist/always-on/ideas-client.d.ts +23 -0
  172. package/dist/always-on/ideas-client.d.ts.map +1 -0
  173. package/dist/always-on/ideas-client.js +13 -0
  174. package/dist/always-on/ideas-client.js.map +1 -0
  175. package/dist/always-on/reconcile-researching.d.ts +42 -0
  176. package/dist/always-on/reconcile-researching.d.ts.map +1 -0
  177. package/dist/always-on/reconcile-researching.js +133 -0
  178. package/dist/always-on/reconcile-researching.js.map +1 -0
  179. package/dist/always-on/task-sources/cascade-picker.d.ts +42 -0
  180. package/dist/always-on/task-sources/cascade-picker.d.ts.map +1 -0
  181. package/dist/always-on/task-sources/cascade-picker.js +65 -0
  182. package/dist/always-on/task-sources/cascade-picker.js.map +1 -0
  183. package/dist/always-on/task-sources/idea-dedupe.d.ts +62 -0
  184. package/dist/always-on/task-sources/idea-dedupe.d.ts.map +1 -0
  185. package/dist/always-on/task-sources/idea-dedupe.js +130 -0
  186. package/dist/always-on/task-sources/idea-dedupe.js.map +1 -0
  187. package/dist/always-on/task-sources/idea-research-source.d.ts +46 -0
  188. package/dist/always-on/task-sources/idea-research-source.d.ts.map +1 -0
  189. package/dist/always-on/task-sources/idea-research-source.js +308 -0
  190. package/dist/always-on/task-sources/idea-research-source.js.map +1 -0
  191. package/dist/always-on/task-sources/idea-sort.d.ts +3 -0
  192. package/dist/always-on/task-sources/idea-sort.d.ts.map +1 -0
  193. package/dist/always-on/task-sources/idea-sort.js +25 -0
  194. package/dist/always-on/task-sources/idea-sort.js.map +1 -0
  195. package/dist/always-on/task-sources/idea-todo-source.d.ts +48 -0
  196. package/dist/always-on/task-sources/idea-todo-source.d.ts.map +1 -0
  197. package/dist/always-on/task-sources/idea-todo-source.js +226 -0
  198. package/dist/always-on/task-sources/idea-todo-source.js.map +1 -0
  199. package/dist/always-on/task-sources/introspection-source.d.ts +101 -0
  200. package/dist/always-on/task-sources/introspection-source.d.ts.map +1 -0
  201. package/dist/always-on/task-sources/introspection-source.js +695 -0
  202. package/dist/always-on/task-sources/introspection-source.js.map +1 -0
  203. package/dist/always-on/task-sources/task-store-source.d.ts +15 -0
  204. package/dist/always-on/task-sources/task-store-source.d.ts.map +1 -0
  205. package/dist/always-on/task-sources/task-store-source.js +59 -0
  206. package/dist/always-on/task-sources/task-store-source.js.map +1 -0
  207. package/dist/always-on/task-sources/types.d.ts +108 -0
  208. package/dist/always-on/task-sources/types.d.ts.map +1 -0
  209. package/dist/always-on/task-sources/types.js +13 -0
  210. package/dist/always-on/task-sources/types.js.map +1 -0
  211. package/dist/always-on/types.d.ts +76 -0
  212. package/dist/always-on/types.d.ts.map +1 -0
  213. package/dist/always-on/types.js +17 -0
  214. package/dist/always-on/types.js.map +1 -0
  215. package/dist/always-on/workcycle-runner.d.ts +115 -0
  216. package/dist/always-on/workcycle-runner.d.ts.map +1 -0
  217. package/dist/always-on/workcycle-runner.js +285 -0
  218. package/dist/always-on/workcycle-runner.js.map +1 -0
  219. package/dist/always-on/worktree-gc.d.ts +41 -0
  220. package/dist/always-on/worktree-gc.d.ts.map +1 -0
  221. package/dist/always-on/worktree-gc.js +167 -0
  222. package/dist/always-on/worktree-gc.js.map +1 -0
  223. package/dist/index.d.ts +26 -2
  224. package/dist/index.d.ts.map +1 -1
  225. package/dist/index.js +24 -1
  226. package/dist/index.js.map +1 -1
  227. package/dist/persistence.d.ts +37 -1
  228. package/dist/persistence.d.ts.map +1 -1
  229. package/dist/persistence.js +48 -0
  230. package/dist/persistence.js.map +1 -1
  231. package/dist/retrospective.d.ts.map +1 -1
  232. package/dist/retrospective.js +6 -0
  233. package/dist/retrospective.js.map +1 -1
  234. package/dist/roles/role-loader.d.ts +1 -1
  235. package/dist/roles/role-loader.d.ts.map +1 -1
  236. package/dist/roles/role-loader.js +18 -0
  237. package/dist/roles/role-loader.js.map +1 -1
  238. package/dist/roles/types.d.ts +12 -0
  239. package/dist/roles/types.d.ts.map +1 -1
  240. package/dist/shipment/gh-pr-creator.d.ts +28 -0
  241. package/dist/shipment/gh-pr-creator.d.ts.map +1 -0
  242. package/dist/shipment/gh-pr-creator.js +80 -0
  243. package/dist/shipment/gh-pr-creator.js.map +1 -0
  244. package/dist/shipment/report.d.ts +27 -0
  245. package/dist/shipment/report.d.ts.map +1 -0
  246. package/dist/shipment/report.js +41 -0
  247. package/dist/shipment/report.js.map +1 -0
  248. package/dist/shipment/secret-scrub.d.ts +12 -0
  249. package/dist/shipment/secret-scrub.d.ts.map +1 -0
  250. package/dist/shipment/secret-scrub.js +30 -0
  251. package/dist/shipment/secret-scrub.js.map +1 -0
  252. package/dist/shipment/shipment-actions.d.ts +85 -0
  253. package/dist/shipment/shipment-actions.d.ts.map +1 -0
  254. package/dist/shipment/shipment-actions.js +190 -0
  255. package/dist/shipment/shipment-actions.js.map +1 -0
  256. package/dist/shipment/shipment-pipeline.d.ts +48 -0
  257. package/dist/shipment/shipment-pipeline.d.ts.map +1 -0
  258. package/dist/shipment/shipment-pipeline.js +256 -0
  259. package/dist/shipment/shipment-pipeline.js.map +1 -0
  260. package/dist/shipment/transport-detect.d.ts +16 -0
  261. package/dist/shipment/transport-detect.d.ts.map +1 -0
  262. package/dist/shipment/transport-detect.js +54 -0
  263. package/dist/shipment/transport-detect.js.map +1 -0
  264. package/dist/shipment/workspace-diff.d.ts +39 -0
  265. package/dist/shipment/workspace-diff.d.ts.map +1 -0
  266. package/dist/shipment/workspace-diff.js +64 -0
  267. package/dist/shipment/workspace-diff.js.map +1 -0
  268. package/dist/swarm-coordinator.d.ts +20 -1
  269. package/dist/swarm-coordinator.d.ts.map +1 -1
  270. package/dist/swarm-coordinator.js +193 -10
  271. package/dist/swarm-coordinator.js.map +1 -1
  272. package/dist/types.d.ts +62 -0
  273. package/dist/types.d.ts.map +1 -1
  274. package/dist/workspace/git-worktree-provider.d.ts +11 -0
  275. package/dist/workspace/git-worktree-provider.d.ts.map +1 -0
  276. package/dist/workspace/git-worktree-provider.js +123 -0
  277. package/dist/workspace/git-worktree-provider.js.map +1 -0
  278. package/dist/workspace/gitignore-check.d.ts +10 -0
  279. package/dist/workspace/gitignore-check.d.ts.map +1 -0
  280. package/dist/workspace/gitignore-check.js +25 -0
  281. package/dist/workspace/gitignore-check.js.map +1 -0
  282. package/dist/workspace/index.d.ts +5 -0
  283. package/dist/workspace/index.d.ts.map +1 -0
  284. package/dist/workspace/index.js +5 -0
  285. package/dist/workspace/index.js.map +1 -0
  286. package/dist/workspace/snapshot-copy-provider.d.ts +11 -0
  287. package/dist/workspace/snapshot-copy-provider.d.ts.map +1 -0
  288. package/dist/workspace/snapshot-copy-provider.js +66 -0
  289. package/dist/workspace/snapshot-copy-provider.js.map +1 -0
  290. package/dist/workspace/types.d.ts +36 -0
  291. package/dist/workspace/types.d.ts.map +1 -0
  292. package/dist/workspace/types.js +2 -0
  293. package/dist/workspace/types.js.map +1 -0
  294. package/dist/workspace/workspace-manager.d.ts +30 -0
  295. package/dist/workspace/workspace-manager.d.ts.map +1 -0
  296. package/dist/workspace/workspace-manager.js +104 -0
  297. package/dist/workspace/workspace-manager.js.map +1 -0
  298. package/package.json +4 -4
  299. package/roles/queen.md +1 -0
  300. package/templates/introspection.md +64 -0
  301. package/templates/research-only.md +58 -0
  302. package/roles/preset-analyst-simons.md +0 -39
  303. package/roles/preset-architect-knuth.md +0 -39
  304. package/roles/preset-designer-norman.md +0 -39
  305. package/roles/preset-designer.md +0 -39
  306. package/roles/preset-dev-carmack.md +0 -39
  307. package/roles/preset-dev-gosling.md +0 -39
  308. package/roles/preset-developer.md +0 -52
  309. package/roles/preset-manager-grove.md +0 -39
  310. package/roles/preset-manager-musk.md +0 -39
  311. package/roles/preset-pm.md +0 -78
  312. package/roles/preset-researcher-feynman.md +0 -39
  313. package/roles/preset-reviewer.md +0 -46
  314. package/roles/preset-strategist-buffett.md +0 -39
  315. package/roles/preset-strategist-munger.md +0 -39
  316. package/roles/preset-strategist-sunzi.md +0 -39
  317. package/roles/preset-tester-beck.md +0 -40
  318. package/roles/preset-tester.md +0 -47
  319. package/roles/preset-writer-orwell.md +0 -39
  320. package/roles/preset-writer.md +0 -39
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipment-pipeline.js","sourceRoot":"","sources":["../../src/shipment/shipment-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAsB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAsB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAA+B,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAC3C,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAElD,kFAAkF;AAClF,MAAM,WAAW,GAAG,MAAM,CAAC;AAE3B,SAAS,UAAU,CAAC,OAAe,EAAE,QAAkB,EAAE;IACvD,OAAO;QACL,IAAI;QACJ,aAAa,kBAAkB,EAAE;QACjC,IAAI;QACJ,cAAc,mBAAmB,EAAE;QACnC,QAAQ;QACR,UAAU;QACV,GAAG,kBAAkB,KAAK,mBAAmB,GAAG;QAChD,GAAG,KAAK;QACR,IAAI;QACJ,OAAO;KACR,CAAC;AACJ,CAAC;AAyCD;;;;;GAKG;AACH,2EAA2E;AAC3E,6EAA6E;AAC7E,8DAA8D;AAC9D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACtF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SACtE,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC5C,sEAAsE;YACtE,qEAAqE;YACrE,uEAAuE;YACvE,qEAAqE;YACrE,wBAAwB;YACxB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrF,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAoB;IACpD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;QAC3B,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QAC1E,IAAI,EAAE,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;YACnC,OAAO;gBACL,QAAQ,EAAE,SAAS;gBACnB,SAAS;gBACT,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,4CAA4C;aAClE,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAA2B,KAAK,CAAC,MAAM,IAAI,sBAAsB,CAAC;QAC9E,+EAA+E;QAC/E,MAAM,aAAa,GAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACpF,MAAM,SAAS,GACb,KAAK,CAAC,SAAS;YACf,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBACd,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QAEL,yCAAyC;QACzC,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/F,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvE,qEAAqE;YACrE,sEAAsE;YACtE,+DAA+D;YAC/D,GAAG,CAAC,IAAI,CACN;gBACE,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACrD,EACD,wCAAwC,CACzC,CAAC;YACF,MAAM,SAAS,GAAG,iBAAiB,KAAK,CAAC,EAAE,EAAE,CAAC;YAC9C,IAAI,MAAM,GAAG,MAAM,aAAa,CAC9B,KAAK,EACL,UAAU,CAAC,SAAS,CAAC,EACrB,EAAE,CAAC,GAAG,CACP,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACrC,GAAG,CAAC,IAAI,CACN,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAC7C,iFAAiF,CAClF,CAAC;gBACF,MAAM,GAAG,MAAM,aAAa,CAC1B,KAAK,EACL,UAAU,CAAC,GAAG,SAAS,iCAAiC,EAAE,CAAC,aAAa,CAAC,CAAC,EAC1E,EAAE,CAAC,GAAG,CACP,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACrC,GAAG,CAAC,IAAI,CACN,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAC7C,0EAA0E,CAC3E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,UAAU;QACV,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC;YACtC,WAAW,EAAE,EAAE,CAAC,GAAG;YACnB,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAW;YACnC,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7E,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAE5F,2EAA2E;QAC3E,2EAA2E;QAC3E,+DAA+D;QAC/D,MAAM,YAAY,GAAkB;YAClC,GAAG,IAAI;YACP,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;SAChC,CAAC;QAEF,mCAAmC;QACnC,IAAI,KAAK,GAAG,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC;QACjC,IAAI,OAAO,GAAG,kBAAkB,YAAY,CAAC,KAAK,CAAC,MAAM,uBAAuB,YAAY,CAAC,IAAI,EAAE,CAAC;QACpG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;qBACxE,IAAI,EAAE;qBACN,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC;oBAAE,KAAK,GAAG,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrF,IAAI,CAAC;oBAAE,OAAO,GAAG,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,EAC1B,mDAAmD,CACpD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,+EAA+E;QAC/E,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAEhC,mBAAmB;QACnB,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,gBAAgB,EAAE,KAAK,CAAC,WAAW;YACnC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS;YACrC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,IAAI,MAAM;YAC5C,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAW;YACnC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAW;YACnC,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC;YACzC,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;YAC/B,QAAQ,EAAE,YAAY,CAAC,IAAI;YAC3B,YAAY,EAAE,YAAY,CAAC,KAAK;YAChC,KAAK;YACL,OAAO;YACP,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3C,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,eAAe;QACf,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAW,CAAC;QAE3C,aAAa;QACb,IAAI,cAAkC,CAAC;QACvC,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC5B,sEAAsE;YACtE,0EAA0E;YAC1E,IAAI,IAAI,GAAG,MAAM,CAAC;YAClB,IAAI,IAAI,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;gBAC9B,IAAI;oBACF,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;wBAC9B,oEAAoE,CAAC;YACzE,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,aAAa,CAC5B;gBACE,GAAG,EAAE,EAAE,CAAC,GAAG;gBACX,UAAU;gBACV,UAAU,EAAE,SAAS,CAAC,aAAa,IAAI,MAAM;gBAC7C,KAAK;gBACL,YAAY,EAAE,IAAI;aACnB,EACD,EAAE,MAAM,EAAE,CACX,CAAC;YACF,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBACV,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC;gBACvE,OAAO;oBACL,QAAQ,EAAE,IAAI;oBACd,SAAS;oBACT,KAAK;oBACL,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;oBAClC,KAAK,EAAE,EAAE,CAAC,GAAG;oBACb,UAAU;iBACX,CAAC;YACJ,CAAC;YACD,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;YAC3C,GAAG,CAAC,IAAI,CACN,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,EACnD,yDAAyD,CAC1D,CAAC;YACF,eAAe;QACjB,CAAC;QAED,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CACN,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAC3C,2CAA2C,CAC5C,CAAC;QACF,OAAO;YACL,QAAQ,EAAE,WAAW;YACrB,SAAS;YACT,KAAK;YACL,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YAClC,QAAQ;YACR,UAAU;YACV,UAAU;YACV,cAAc;SACf,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,8BAA8B,CAAC,CAAC;QAC3E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAChF,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAoB,EAAE,IAAmB;IACjE,OAAO,CACL,gEAAgE;QAChE,aAAa,KAAK,CAAC,EAAE,IAAI;QACzB,mBAAmB,IAAI,CAAC,IAAI,MAAM;QAClC,4EAA4E,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAoB,EAAE,IAAmB;IACnE,OAAO,CACL,mGAAmG;QACnG,aAAa,KAAK,CAAC,EAAE,IAAI;QACzB,mBAAmB,IAAI,CAAC,IAAI,MAAM;QAClC,oCAAoC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM;QACvE,0DAA0D,CAC3D,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB,EAAE,QAAgB;IAC1D,MAAM,SAAS,GAAI,KAAa,CAAC,SAAS,CAAC;IAC3C,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5E,8EAA8E;IAC9E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAAC,CAA0B;IAC3C,IAAI,CAAC,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC1C,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface TransportDetectResult {
2
+ kind: "pr" | "diff-only" | "no-remote";
3
+ reason: string;
4
+ defaultBranch?: string;
5
+ remoteUrl?: string;
6
+ }
7
+ export type CommandRunner = (cmd: string, args: string[], cwd?: string) => Promise<{
8
+ exitCode: number;
9
+ stdout: string;
10
+ stderr: string;
11
+ }>;
12
+ export interface TransportDetectOptions {
13
+ runner?: CommandRunner;
14
+ }
15
+ export declare function detectTransport(cwd: string, opts?: TransportDetectOptions): Promise<TransportDetectResult>;
16
+ //# sourceMappingURL=transport-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-detect.d.ts","sourceRoot":"","sources":["../../src/shipment/transport-detect.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,CAAC,EAAE,MAAM,KACT,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAkBD,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAkDhC"}
@@ -0,0 +1,54 @@
1
+ import { spawn } from "node:child_process";
2
+ const INSTALL_HINTS = "macOS: brew install gh | " +
3
+ "Linux: see https://github.com/cli/cli/blob/trunk/docs/install_linux.md | " +
4
+ "Windows: winget install --id GitHub.cli";
5
+ const defaultRunner = (cmd, args, cwd) => new Promise((resolve) => {
6
+ const child = spawn(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
7
+ let stdout = "";
8
+ let stderr = "";
9
+ child.stdout?.on("data", (c) => (stdout += c.toString("utf-8")));
10
+ child.stderr?.on("data", (c) => (stderr += c.toString("utf-8")));
11
+ child.on("error", (e) => resolve({ exitCode: -1, stdout, stderr: e.message }));
12
+ child.on("close", (code) => resolve({ exitCode: code ?? -1, stdout, stderr }));
13
+ });
14
+ export async function detectTransport(cwd, opts = {}) {
15
+ const run = opts.runner ?? defaultRunner;
16
+ // 1. Origin remote
17
+ const remote = await run("git", ["remote", "get-url", "origin"], cwd).catch(() => null);
18
+ if (!remote || remote.exitCode !== 0 || !remote.stdout.trim()) {
19
+ return { kind: "no-remote", reason: "no 'origin' remote configured" };
20
+ }
21
+ const remoteUrl = remote.stdout.trim();
22
+ // 2. gh CLI
23
+ const gh = await run("gh", ["--version"]).catch(() => null);
24
+ if (!gh || gh.exitCode !== 0) {
25
+ return {
26
+ kind: "diff-only",
27
+ reason: `gh CLI not installed; install with: ${INSTALL_HINTS}`,
28
+ remoteUrl,
29
+ };
30
+ }
31
+ // 3. Default branch
32
+ const symref = await run("git", ["symbolic-ref", "refs/remotes/origin/HEAD"], cwd).catch(() => null);
33
+ let defaultBranch = "main";
34
+ if (symref && symref.exitCode === 0 && symref.stdout.trim()) {
35
+ defaultBranch =
36
+ symref.stdout.trim().replace(/^refs\/remotes\/origin\//, "") || "main";
37
+ }
38
+ else {
39
+ // Fresh clones often have origin/HEAD unset → symbolic-ref exits non-zero.
40
+ // Ask gh for the repo's declared default branch before falling back to "main"
41
+ // (which is wrong on legacy master repos and breaks PR creation).
42
+ const ghDefault = await run("gh", ["repo", "view", "--json", "defaultBranchRef", "-q", ".defaultBranchRef.name"], cwd).catch(() => null);
43
+ if (ghDefault && ghDefault.exitCode === 0 && ghDefault.stdout.trim()) {
44
+ defaultBranch = ghDefault.stdout.trim();
45
+ }
46
+ }
47
+ return {
48
+ kind: "pr",
49
+ reason: "remote + gh ok",
50
+ defaultBranch,
51
+ remoteUrl,
52
+ };
53
+ }
54
+ //# sourceMappingURL=transport-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-detect.js","sourceRoot":"","sources":["../../src/shipment/transport-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type DiffCommandRunner = (cmd: string, args: string[], cwd?: string) => Promise<{
2
+ exitCode: number;
3
+ stdout: string;
4
+ stderr: string;
5
+ }>;
6
+ export interface WorkspaceDiffFile {
7
+ path: string;
8
+ added: number;
9
+ removed: number;
10
+ }
11
+ export interface WorkspaceDiff {
12
+ /** Human-readable `git diff --stat` body. Empty when no changes. */
13
+ stat: string;
14
+ /** Full unified diff (may be empty). */
15
+ patch: string;
16
+ /** Structured per-file additions/removals. */
17
+ files: WorkspaceDiffFile[];
18
+ /** Set when the underlying git command failed. */
19
+ error?: string;
20
+ }
21
+ export interface ComputeWorkspaceDiffInput {
22
+ /** Absolute path to the worktree. */
23
+ worktreeCwd: string;
24
+ /** Base commit (the commit the worktree was created from). */
25
+ baseCommit: string;
26
+ /** Optional injected runner (defaults to internal spawn-based git). */
27
+ runner?: DiffCommandRunner;
28
+ }
29
+ /**
30
+ * Compute the diff of a worktree relative to its base commit. Includes both
31
+ * committed (HEAD vs baseCommit) and uncommitted (workdir + index vs HEAD)
32
+ * changes — `git diff <baseCommit>` covers both naturally.
33
+ *
34
+ * Returns an error result (not throws) on non-git dirs / git failures, so the
35
+ * caller (ShipmentPipeline) can gracefully fall back to a "skipped" outcome
36
+ * instead of aborting the swarm destroy flow.
37
+ */
38
+ export declare function computeWorkspaceDiff(input: ComputeWorkspaceDiffInput): Promise<WorkspaceDiff>;
39
+ //# sourceMappingURL=workspace-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-diff.d.ts","sourceRoot":"","sources":["../../src/shipment/workspace-diff.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,CAAC,EAAE,MAAM,KACT,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,yBAAyB;IACxC,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
@@ -0,0 +1,64 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createLogger } from "@mclawnet/logger";
3
+ const log = createLogger({ module: "swarm/shipment/workspace-diff" });
4
+ /**
5
+ * Compute the diff of a worktree relative to its base commit. Includes both
6
+ * committed (HEAD vs baseCommit) and uncommitted (workdir + index vs HEAD)
7
+ * changes — `git diff <baseCommit>` covers both naturally.
8
+ *
9
+ * Returns an error result (not throws) on non-git dirs / git failures, so the
10
+ * caller (ShipmentPipeline) can gracefully fall back to a "skipped" outcome
11
+ * instead of aborting the swarm destroy flow.
12
+ */
13
+ export async function computeWorkspaceDiff(input) {
14
+ const run = input.runner ?? ((cmd, args, cwd) => defaultSpawn(cmd, args, cwd));
15
+ const stat = await run("git", ["diff", "--stat", input.baseCommit], input.worktreeCwd).catch(() => null);
16
+ if (!stat || stat.exitCode !== 0) {
17
+ return {
18
+ stat: "",
19
+ patch: "",
20
+ files: [],
21
+ error: stat?.stderr || "git diff --stat failed",
22
+ };
23
+ }
24
+ const patch = await run("git", ["diff", input.baseCommit], input.worktreeCwd).catch(() => null);
25
+ if (!patch || patch.exitCode !== 0) {
26
+ return {
27
+ stat: "",
28
+ patch: "",
29
+ files: [],
30
+ error: patch?.stderr || "git diff failed",
31
+ };
32
+ }
33
+ const numstat = await run("git", ["diff", "--numstat", input.baseCommit], input.worktreeCwd).catch(() => null);
34
+ const files = [];
35
+ if (numstat && numstat.exitCode === 0) {
36
+ for (const line of numstat.stdout.split("\n")) {
37
+ if (!line.trim())
38
+ continue;
39
+ const parts = line.split("\t");
40
+ if (parts.length < 3)
41
+ continue;
42
+ const [a, r, ...rest] = parts;
43
+ const path = rest.join("\t");
44
+ // For binary files git emits "-" "-" — treat as 0/0
45
+ const added = a === "-" ? 0 : parseInt(a, 10) || 0;
46
+ const removed = r === "-" ? 0 : parseInt(r, 10) || 0;
47
+ files.push({ path, added, removed });
48
+ }
49
+ }
50
+ log.debug({ worktreeCwd: input.worktreeCwd, baseCommit: input.baseCommit, fileCount: files.length }, "computeWorkspaceDiff ok");
51
+ return { stat: stat.stdout, patch: patch.stdout, files };
52
+ }
53
+ function defaultSpawn(cmd, args, cwd) {
54
+ return new Promise((resolve) => {
55
+ const child = spawn(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
56
+ let stdout = "";
57
+ let stderr = "";
58
+ child.stdout?.on("data", (c) => (stdout += c.toString("utf-8")));
59
+ child.stderr?.on("data", (c) => (stderr += c.toString("utf-8")));
60
+ child.on("error", (e) => resolve({ exitCode: -1, stdout, stderr: e.message }));
61
+ child.on("close", (code) => resolve({ exitCode: code ?? -1, stdout, stderr }));
62
+ });
63
+ }
64
+ //# sourceMappingURL=workspace-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-diff.js","sourceRoot":"","sources":["../../src/shipment/workspace-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC,CAAC;AAkCtE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAgC;IAEhC,MAAM,GAAG,GACP,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACzG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,wBAAwB;SAChD,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,iBAAiB;SAC1C,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/G,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC/B,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,oDAAoD;YACpD,MAAM,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,GAAG,CAAC,KAAK,CACP,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,EACzF,yBAAyB,CAC1B,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3D,CAAC;AAID,SAAS,YAAY,CAAC,GAAW,EAAE,IAAc,EAAE,GAAY;IAC7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -4,6 +4,7 @@ import { InboxWatcher } from "./inbox-watcher.js";
4
4
  import { TaskStore } from "@mclawnet/task";
5
5
  import type { SwarmInstance, RoleInstance, SwarmCreateOptions, CustomRoleDefinition } from "./types.js";
6
6
  import { type SandboxLevel } from "@mclawnet/shared";
7
+ import { WorkspaceManager } from "./workspace/index.js";
7
8
  /**
8
9
  * SwarmCoordinator — orchestrates multi-role Claude CLI swarms.
9
10
  *
@@ -30,6 +31,14 @@ export declare class SwarmCoordinator {
30
31
  * inline call sites still honour `CLAWNET_HOME` env var as before.
31
32
  */
32
33
  private home?;
34
+ /**
35
+ * Optional WorkspaceManager (M6). Used to prepare an isolated workspace
36
+ * (git worktree or snapshot copy) per swarm on create(), and to dispose
37
+ * it on destroy(). When omitted, a default WorkspaceManager is created
38
+ * (git-worktree → snapshot-copy fallback). Workspace prepare is
39
+ * best-effort: if it fails the swarm continues using `workDir` as before.
40
+ */
41
+ private workspaceManager;
33
42
  private swarms;
34
43
  readonly inboxRelay: InboxRelay;
35
44
  readonly inboxWatcher: InboxWatcher;
@@ -61,7 +70,15 @@ export declare class SwarmCoordinator {
61
70
  * `homedir()` and write files into the real `~/.clawnet`. When omitted,
62
71
  * inline call sites still honour `CLAWNET_HOME` env var as before.
63
72
  */
64
- home?: string | undefined);
73
+ home?: string | undefined,
74
+ /**
75
+ * Optional WorkspaceManager (M6). Used to prepare an isolated workspace
76
+ * (git worktree or snapshot copy) per swarm on create(), and to dispose
77
+ * it on destroy(). When omitted, a default WorkspaceManager is created
78
+ * (git-worktree → snapshot-copy fallback). Workspace prepare is
79
+ * best-effort: if it fails the swarm continues using `workDir` as before.
80
+ */
81
+ workspaceManager?: WorkspaceManager);
65
82
  /** Resolve the user-home root used for InboxStore / TaskStore lookups. */
66
83
  private resolveHome;
67
84
  /**
@@ -144,6 +161,8 @@ export declare class SwarmCoordinator {
144
161
  presetInstanceId?: string;
145
162
  backendOverride?: "claude" | "codex";
146
163
  sandboxOverride?: SandboxLevel;
164
+ modelOverride?: string;
165
+ modeOverride?: string;
147
166
  isDynamicAdd?: boolean;
148
167
  }): Promise<RoleInstance>;
149
168
  /** Spawn a new role instance in a swarm (real implementation, serialized by spawnRole). */
@@ -1 +1 @@
1
- {"version":3,"file":"swarm-coordinator.d.ts","sourceRoot":"","sources":["../src/swarm-coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"swarm-coordinator.d.ts","sourceRoot":"","sources":["../src/swarm-coordinator.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { resolveRoleTools } from "./roles/role-tools.js";
3
3
  import { loadTemplate } from "./templates/template-loader.js";
4
4
  import { parsePlanFromText } from "./action-parser.js";
5
5
  import { BUILTIN_ROLES, initDatabase, syncToAutoMemory } from "@mclawnet/memory";
6
- import { saveSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, loadSwarmSnapshot, readMessageLog, listRecoverableSwarmIds } from "./persistence.js";
6
+ import { saveSwarmSnapshot, deleteSwarmSnapshot, appendMessageLog, loadSwarmSnapshot, readMessageLog, listRecoverableSwarmIds, saveShipmentResult } from "./persistence.js";
7
7
  import { runRetrospective } from "./retrospective.js";
8
8
  import { InboxRelay } from "./inbox-relay.js";
9
9
  import { InboxStore } from "./inbox-store.js";
@@ -17,6 +17,7 @@ import { homedir } from "node:os";
17
17
  import { join } from "node:path";
18
18
  import { createLogger } from "@mclawnet/logger";
19
19
  import { DEFAULT_SANDBOX } from "@mclawnet/shared";
20
+ import { WorkspaceManager } from "./workspace/index.js";
20
21
  const log = createLogger({ module: "swarm" });
21
22
  // Queen periodic patrol: pure safety-net heartbeat now that crash detection
22
23
  // is event-driven via handleRoleCrashed. Worker `task_set_status` /
@@ -48,6 +49,7 @@ export class SwarmCoordinator {
48
49
  hub;
49
50
  taskStoreFactory;
50
51
  home;
52
+ workspaceManager;
51
53
  swarms = new Map();
52
54
  inboxRelay;
53
55
  inboxWatcher;
@@ -79,11 +81,20 @@ export class SwarmCoordinator {
79
81
  * `homedir()` and write files into the real `~/.clawnet`. When omitted,
80
82
  * inline call sites still honour `CLAWNET_HOME` env var as before.
81
83
  */
82
- home) {
84
+ home,
85
+ /**
86
+ * Optional WorkspaceManager (M6). Used to prepare an isolated workspace
87
+ * (git worktree or snapshot copy) per swarm on create(), and to dispose
88
+ * it on destroy(). When omitted, a default WorkspaceManager is created
89
+ * (git-worktree → snapshot-copy fallback). Workspace prepare is
90
+ * best-effort: if it fails the swarm continues using `workDir` as before.
91
+ */
92
+ workspaceManager = new WorkspaceManager()) {
83
93
  this.sessionAdapter = sessionAdapter;
84
94
  this.hub = hub;
85
95
  this.taskStoreFactory = taskStoreFactory;
86
96
  this.home = home;
97
+ this.workspaceManager = workspaceManager;
87
98
  this.inboxRelay = new InboxRelay(sessionAdapter, (id) => this.swarms.get(id), (swarmId, instanceId, msg) => this.handleInterceptedMessage(swarmId, instanceId, msg), home);
88
99
  this.inboxWatcher = new InboxWatcher(this.inboxRelay);
89
100
  }
@@ -217,7 +228,7 @@ export class SwarmCoordinator {
217
228
  const idx = roleSpecs.findIndex((s, i) => !claimed.has(i) && s.roleName === uiRole.roleName);
218
229
  if (idx >= 0) {
219
230
  claimed.add(idx);
220
- if (uiRole.backend) {
231
+ if (uiRole.backend !== undefined) {
221
232
  roleSpecs[idx] = { ...roleSpecs[idx], backend: uiRole.backend };
222
233
  }
223
234
  // Mirror backend overlay for sandbox so user's per-role choice in
@@ -225,9 +236,20 @@ export class SwarmCoordinator {
225
236
  // persistence.json. Without this, only dynamically-added roles
226
237
  // ever carried `sandbox`; the 6 initial roles silently dropped to
227
238
  // undefined and recovery.json had no record of the user's pick.
228
- if (uiRole.sandbox) {
239
+ if (uiRole.sandbox !== undefined) {
229
240
  roleSpecs[idx] = { ...roleSpecs[idx], sandbox: uiRole.sandbox };
230
241
  }
242
+ // N4.5 per-role sticky model + mode (UI ModelPicker / ModePicker).
243
+ // Same overlay pattern as backend/sandbox so the per-role choice
244
+ // reaches spawnRole → definition → SessionAdapter.createSession.
245
+ // Use !== undefined (not truthy) so a future caller can clear a
246
+ // field by passing "" without being silently ignored.
247
+ if (uiRole.model !== undefined) {
248
+ roleSpecs[idx] = { ...roleSpecs[idx], model: uiRole.model };
249
+ }
250
+ if (uiRole.mode !== undefined) {
251
+ roleSpecs[idx] = { ...roleSpecs[idx], mode: uiRole.mode };
252
+ }
231
253
  }
232
254
  }
233
255
  }
@@ -249,9 +271,27 @@ export class SwarmCoordinator {
249
271
  isPaused: false,
250
272
  status: "creating",
251
273
  planStatus: "none",
274
+ // PR-B D11 — default "user" when caller doesn't specify (preserves
275
+ // pre-D11 chat-driven create() behaviour).
276
+ kind: options.kind ?? "user",
252
277
  };
253
278
  // Store pending role specs for on-demand spawning
254
279
  this.swarms.set(swarmSessionId, swarm);
280
+ // M6: prepare an isolated workspace for this swarm (git worktree or
281
+ // snapshot copy). Best-effort — if it fails, the swarm falls back to
282
+ // using `workDir` directly (legacy behavior, no regression).
283
+ if (swarm.workDir) {
284
+ try {
285
+ swarm.workspace = await this.workspaceManager.prepare({
286
+ swarmId: swarmSessionId,
287
+ projectRoot: swarm.workDir,
288
+ });
289
+ log.info({ swarmId: swarmSessionId, strategy: swarm.workspace.strategy, cwd: swarm.workspace.cwd }, "workspace prepared for swarm");
290
+ }
291
+ catch (err) {
292
+ log.warn({ err, swarmId: swarmSessionId }, "workspace prepare failed; swarm continues using main workDir");
293
+ }
294
+ }
255
295
  // Snapshot may already exist from a prior run (continuation, or
256
296
  // restart-after-crash with the same swarmId). Record this BEFORE any
257
297
  // spawnRole writes a new one — cleanup must not delete what wasn't ours.
@@ -283,6 +323,8 @@ export class SwarmCoordinator {
283
323
  customDefinition: spec.customDefinition,
284
324
  backendOverride: spec.backend,
285
325
  sandboxOverride: spec.sandbox,
326
+ modelOverride: spec.model,
327
+ modeOverride: spec.mode,
286
328
  });
287
329
  trackOpen(role);
288
330
  }
@@ -529,7 +571,7 @@ export class SwarmCoordinator {
529
571
  }
530
572
  /** Spawn a new role instance in a swarm (real implementation, serialized by spawnRole). */
531
573
  async doSpawnRole(swarmId, roleName, opts = {}) {
532
- const { taskPrompt, customPrompt, customDefinition, additionalDirs, resumeId, presetInstanceId, backendOverride, sandboxOverride, isDynamicAdd, } = opts;
574
+ const { taskPrompt, customPrompt, customDefinition, additionalDirs, resumeId, presetInstanceId, backendOverride, sandboxOverride, modelOverride, modeOverride, isDynamicAdd, } = opts;
533
575
  const swarm = this.swarms.get(swarmId);
534
576
  if (!swarm)
535
577
  throw new Error(`Swarm ${swarmId} not found`);
@@ -545,6 +587,8 @@ export class SwarmCoordinator {
545
587
  color: customDefinition.color,
546
588
  promptBody: customDefinition.promptBody,
547
589
  backend: customDefinition.backend,
590
+ model: customDefinition.model,
591
+ mode: customDefinition.mode,
548
592
  };
549
593
  }
550
594
  else {
@@ -556,16 +600,26 @@ export class SwarmCoordinator {
556
600
  }
557
601
  // Per-spawn backend override (UI selector) takes precedence over the
558
602
  // role definition's static backend. Frozen here for the lifetime of the
559
- // role instance.
560
- if (backendOverride) {
603
+ // role instance. Use !== undefined (not truthy) so callers can opt out
604
+ // explicitly with an empty string in the future without being ignored.
605
+ if (backendOverride !== undefined) {
561
606
  definition = { ...definition, backend: backendOverride };
562
607
  }
563
608
  // Per-spawn sandbox override — same precedence rule. Each adapter
564
609
  // maps the abstract level to its own permission model (see
565
610
  // SpawnOptions.sandbox in @mclawnet/agent).
566
- if (sandboxOverride) {
611
+ if (sandboxOverride !== undefined) {
567
612
  definition = { ...definition, sandbox: sandboxOverride };
568
613
  }
614
+ // N4.5 per-spawn sticky model / mode override (UI ModelPicker / ModePicker).
615
+ // Same precedence rule as backend/sandbox: per-spawn override wins over
616
+ // any value baked into the role definition (frontmatter or customDefinition).
617
+ if (modelOverride !== undefined) {
618
+ definition = { ...definition, model: modelOverride };
619
+ }
620
+ if (modeOverride !== undefined) {
621
+ definition = { ...definition, mode: modeOverride };
622
+ }
569
623
  // Final default: role files don't currently declare `sandbox`, and not
570
624
  // every caller passes an override (e.g. legacy recovery, programmatic
571
625
  // spawns). Pin to DEFAULT_SANDBOX so snapshots and the membership-change
@@ -634,7 +688,7 @@ export class SwarmCoordinator {
634
688
  try {
635
689
  await this.sessionAdapter.createSession({
636
690
  sessionId: roleSessionId,
637
- workDir: swarm.workDir,
691
+ workDir: swarm.workspace?.cwd ?? swarm.workDir,
638
692
  systemPrompt: finalPrompt,
639
693
  roleId,
640
694
  additionalDirs,
@@ -646,6 +700,20 @@ export class SwarmCoordinator {
646
700
  disallowedTools: tools.disallowedTools,
647
701
  backend: definition.backend,
648
702
  sandbox: definition.sandbox,
703
+ model: definition.model,
704
+ mode: definition.mode,
705
+ // M6 T7: when the swarm is running inside a prepared workspace (worktree
706
+ // or snapshot), the role's cwd is the workspace path — NOT the original
707
+ // project root. MCP tools (inbox / task / wakeup) take a `workDir` arg
708
+ // that the LLM typically derives from `process.cwd()`, which would now
709
+ // land in a per-worktree namespace and break cross-swarm routing.
710
+ // Expose the original project root via env so MCP tools can fall back
711
+ // to it when `workDir` is missing or when the caller wants the canonical
712
+ // namespace. Always set (even when no workspace) so tools have a
713
+ // consistent fallback.
714
+ ...(swarm.workDir
715
+ ? { env: { CLAWNET_PROJECT_ROOT: swarm.workDir } }
716
+ : {}),
649
717
  });
650
718
  sessionOpened = true;
651
719
  }
@@ -782,6 +850,27 @@ export class SwarmCoordinator {
782
850
  planStatus: snapshot.planStatus ?? "none",
783
851
  };
784
852
  this.swarms.set(swarmId, swarm);
853
+ // M6 T8: re-adopt the per-swarm workspace from the snapshot. We do this
854
+ // BEFORE respawning roles so spawnRole sees the correct workspace.cwd and
855
+ // routes the role into the same worktree the previous session used. If the
856
+ // workspace directory disappeared between sessions (e.g. user `rm -rf`'d
857
+ // it), fall back to the main workDir without throwing.
858
+ if (snapshot.workspace) {
859
+ const { existsSync } = await import("node:fs");
860
+ if (existsSync(snapshot.workspace.cwd)) {
861
+ this.workspaceManager.adopt(snapshot.workspace);
862
+ swarm.workspace = snapshot.workspace;
863
+ log.info({ swarmId, cwd: snapshot.workspace.cwd, strategy: snapshot.workspace.strategy }, "workspace adopted from snapshot");
864
+ }
865
+ else {
866
+ log.warn({ swarmId, cwd: snapshot.workspace.cwd }, "workspace dir missing on disk (deleted between sessions); swarm falls back to main workDir");
867
+ }
868
+ }
869
+ // M6.1 T7: Restore shipment result from snapshot (one-shot — never re-run
870
+ // shipment on recover, only surface the previous outcome to the UI).
871
+ if (snapshot.shipment) {
872
+ swarm.shipment = snapshot.shipment;
873
+ }
785
874
  // Respawn each role with the same instanceId, passing backendSessionId
786
875
  // through as resumeId so SessionAdapter can `--resume` the conversation.
787
876
  // Suppress per-role snapshot writes — we save once at the end with the
@@ -946,6 +1035,14 @@ export class SwarmCoordinator {
946
1035
  else {
947
1036
  log.warn({ swarmId }, "destroy: swarm.workDir missing, cannot delete snapshot");
948
1037
  }
1038
+ // M6: dispose the per-swarm workspace (git worktree or snapshot copy).
1039
+ // Best-effort: never block destroy on filesystem cleanup.
1040
+ try {
1041
+ await this.workspaceManager.dispose(swarmId, { keep: false });
1042
+ }
1043
+ catch (err) {
1044
+ log.warn({ err, swarmId }, "workspace dispose failed (best-effort)");
1045
+ }
949
1046
  log.info({ swarmId }, "swarm destroyed");
950
1047
  }
951
1048
  /** Check if a session ID belongs to any swarm. */
@@ -1119,6 +1216,30 @@ export class SwarmCoordinator {
1119
1216
  * idempotent so duplicate reviewer envelopes (e.g. retries) are safe.
1120
1217
  */
1121
1218
  async handleInterceptedMessage(swarmId, instanceId, msg) {
1219
+ // PR-B Sub-PR-B2 — `swarm_complete_request` (queen → self via the
1220
+ // `swarm_complete` MCP tool). Coordinator runs the full cleanup chain
1221
+ // (runRetroAndCleanup → closeSession → workspace dispose → shipment).
1222
+ // Returns true to drop the raw message from the LLM payload.
1223
+ if (msg.type === "swarm_complete_request") {
1224
+ // Authorization: only queen instances may complete a swarm. The MCP
1225
+ // tool's `from.startsWith("queen-")` guard is advisory across the
1226
+ // process boundary — enforce again at the trust boundary.
1227
+ if (!msg.from.startsWith("queen-")) {
1228
+ log.warn({ swarmId, instanceId, msgId: msg.id, from: msg.from }, "swarm_complete_request interceptor: rejected non-queen sender — consuming");
1229
+ return true;
1230
+ }
1231
+ log.info({ swarmId, instanceId, from: msg.from, msgId: msg.id }, "swarm_complete_request interceptor: queen requested completion — running cleanup");
1232
+ try {
1233
+ await this.complete(swarmId);
1234
+ }
1235
+ catch (err) {
1236
+ // Best-effort: complete() is idempotent. A failure here would mean
1237
+ // the swarm stays alive after the queen tried to close it; the
1238
+ // runner's D14 paused-fallback or a manual UI cancel will catch it.
1239
+ log.warn({ err, swarmId, from: msg.from }, "swarm_complete_request interceptor: complete() threw — leaving swarm for fallback paths");
1240
+ }
1241
+ return true;
1242
+ }
1122
1243
  if (msg.type !== "plan_review_result")
1123
1244
  return false;
1124
1245
  // Authorization: only reviewer instances may flip planStatus via this path.
@@ -1349,6 +1470,68 @@ export class SwarmCoordinator {
1349
1470
  for (const role of swarm.roles.values()) {
1350
1471
  await this.sessionAdapter.closeSession(role.roleSessionId).catch(() => { });
1351
1472
  }
1473
+ // 3.5 M6.1: Shipment — compute diff, generate report, try PR / write
1474
+ // fallback artifacts. Best-effort: never block destroy. Runs after role
1475
+ // sessions are closed (so git commands don't race with role processes)
1476
+ // and before workspace dispose / snapshot delete (so the worktree dir
1477
+ // still exists and the snapshot can record the result for M6.2 UI).
1478
+ // Skips snapshot-copy and missing workspaces — git-worktree only.
1479
+ if (swarm.workspace && swarm.workspace.strategy === "git-worktree") {
1480
+ if (swarm.shipment) {
1481
+ // Re-entrancy guard: double-destroy must not re-run shipment and
1482
+ // overwrite the first result. Existing snapshot already has the
1483
+ // outcome from the prior call (or from recovery restoration above).
1484
+ log.info({ swarmId, existing: swarm.shipment.strategy }, "shipment already ran; skipping re-entry");
1485
+ }
1486
+ else {
1487
+ try {
1488
+ const { runShipment } = await import("./shipment/shipment-pipeline.js");
1489
+ const result = await runShipment({ swarm });
1490
+ swarm.shipment = result;
1491
+ log.info({ swarmId, strategy: result.strategy, prUrl: result.prUrl, error: result.error }, "shipment complete");
1492
+ // M6.2.0: persist to dedicated shipment.json *first* — this file
1493
+ // survives `deleteSwarmSnapshot` below (which only wipes
1494
+ // recovery.json), so the M6.2 UI can still read the outcome after
1495
+ // the workspace is disposed. Done before saveSwarmSnapshot so a
1496
+ // snapshot-write failure can't strand the shipment outcome.
1497
+ if (swarm.workDir) {
1498
+ try {
1499
+ saveShipmentResult(swarm.workDir, swarmId, result);
1500
+ }
1501
+ catch (err) {
1502
+ log.warn({ err, swarmId }, "shipment: saveShipmentResult failed");
1503
+ }
1504
+ }
1505
+ // Persist so M6.2 UI can read it after dispose.
1506
+ if (swarm.workDir) {
1507
+ try {
1508
+ saveSwarmSnapshot(swarm);
1509
+ }
1510
+ catch (err) {
1511
+ log.warn({ err, swarmId }, "shipment snapshot save failed");
1512
+ }
1513
+ }
1514
+ // M6.2.1: best-effort live push to the hub so the UI can react
1515
+ // immediately without waiting for the user to reload. The file
1516
+ // (shipment.json) already saved above is the source of truth; this
1517
+ // push is purely a notification. Swallow all errors so a flaky hub
1518
+ // connection can never block destroy.
1519
+ try {
1520
+ this.hub.send({
1521
+ type: "swarm.shipment",
1522
+ sessionId: swarmId,
1523
+ shipment: result,
1524
+ });
1525
+ }
1526
+ catch (err) {
1527
+ log.warn({ err, swarmId }, "shipment: hub push failed (best-effort, file already saved)");
1528
+ }
1529
+ }
1530
+ catch (err) {
1531
+ log.warn({ swarmId, err }, "shipment failed (best-effort)");
1532
+ }
1533
+ }
1534
+ }
1352
1535
  // 4. Delete recovery.json (keep messages.jsonl)
1353
1536
  if (swarm.workDir) {
1354
1537
  // Detach tasks before deleting snapshot — keeps task index consistent
@@ -1715,7 +1898,7 @@ ${planJson}
1715
1898
  await this.deliverInbox(swarm, queen.instanceId, {
1716
1899
  from: "system",
1717
1900
  type: "system",
1718
- data: `[系统] 蜂群已自动暂停。连续${swarm.maxIdleChecks}次巡查发现所有成员空闲,已暂停任务释放资源。用户可以resume恢复。`,
1901
+ data: `[系统] 蜂群已自动暂停。连续${swarm.maxIdleChecks}次巡查发现所有成员空闲。注意:资源(CLI 进程、worktree、内存)仍占用——如不再需要请 cancel 释放,或 resume 继续。Queen 任务完成后应该显式调 swarm_complete 工具,而不是依赖此暂停兜底。`,
1719
1902
  });
1720
1903
  log.info({ swarmId, idleChecks: swarm.maxIdleChecks }, "swarm auto-paused");
1721
1904
  return; // Don't schedule next tick