@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,55 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { scrubSecrets } from "../shipment/secret-scrub.js";
3
+ describe("scrubSecrets", () => {
4
+ it("redacts GitHub personal access tokens", () => {
5
+ const input = "token=ghp_abcdefghijklmnopqrstuvwxyz0123456789AB";
6
+ expect(scrubSecrets(input)).toContain("[REDACTED-github-token]");
7
+ expect(scrubSecrets(input)).not.toContain("ghp_abcd");
8
+ });
9
+ it("redacts Slack tokens", () => {
10
+ const input = "xoxb-1234567890-abcdef";
11
+ expect(scrubSecrets(input)).toContain("[REDACTED-slack-token]");
12
+ });
13
+ it("redacts OpenAI keys", () => {
14
+ const input = "OPENAI=sk-abcdefghijklmnopqrstuvwxyz0123";
15
+ const scrubbed = scrubSecrets(input);
16
+ expect(scrubbed).toContain("[REDACTED-openai-key]");
17
+ expect(scrubbed).not.toContain("sk-abcdef");
18
+ });
19
+ it("redacts AWS access key ids", () => {
20
+ const input = "aws_access_key_id = AKIAIOSFODNN7EXAMPLE";
21
+ expect(scrubSecrets(input)).toContain("[REDACTED-aws-akia]");
22
+ });
23
+ it("redacts generic KEY=value lines", () => {
24
+ const input = 'API_KEY="abcdef1234567890"';
25
+ expect(scrubSecrets(input)).toContain("[REDACTED]");
26
+ expect(scrubSecrets(input)).not.toContain("abcdef1234567890");
27
+ });
28
+ it("redacts PASSWORD= assignments", () => {
29
+ const input = "PASSWORD=hunter2hunter2";
30
+ expect(scrubSecrets(input)).toContain("[REDACTED]");
31
+ });
32
+ it("does not redact short values below 8-char threshold", () => {
33
+ const input = "TOKEN=12";
34
+ expect(scrubSecrets(input)).toBe("TOKEN=12");
35
+ });
36
+ it("does not redact safe non-secret content", () => {
37
+ const input = "function foo() { return 42; }";
38
+ expect(scrubSecrets(input)).toBe(input);
39
+ });
40
+ it("handles empty input", () => {
41
+ expect(scrubSecrets("")).toBe("");
42
+ });
43
+ it("redacts multiple secrets in one document", () => {
44
+ const input = `
45
+ github=ghp_abcdefghijklmnopqrstuvwxyz0123456789AB
46
+ aws=AKIAIOSFODNN7EXAMPLE
47
+ nothing=here
48
+ `;
49
+ const out = scrubSecrets(input);
50
+ expect(out).toContain("[REDACTED-github-token]");
51
+ expect(out).toContain("[REDACTED-aws-akia]");
52
+ expect(out).toContain("nothing=here");
53
+ });
54
+ });
55
+ //# sourceMappingURL=secret-scrub.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scrub.test.js","sourceRoot":"","sources":["../../src/__tests__/secret-scrub.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shipment-actions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipment-actions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/shipment-actions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,378 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { applyShipment, mergeShipment, discardShipment, } from "../shipment/shipment-actions.js";
6
+ import { saveShipmentResult, saveSwarmSnapshot, loadShipmentResult } from "../persistence.js";
7
+ let HOME;
8
+ let WORK;
9
+ beforeEach(() => {
10
+ HOME = mkdtempSync(join(tmpdir(), "ship-act-home-"));
11
+ WORK = mkdtempSync(join(tmpdir(), "ship-act-work-"));
12
+ process.env.CLAWNET_HOME = HOME;
13
+ });
14
+ afterEach(() => {
15
+ rmSync(HOME, { recursive: true, force: true });
16
+ rmSync(WORK, { recursive: true, force: true });
17
+ delete process.env.CLAWNET_HOME;
18
+ });
19
+ /**
20
+ * Recording fake runner: captures every git invocation so assertions can pin
21
+ * exit code + argv exactly. Defaults to exit 0; per-call overrides via
22
+ * `responses` map keyed on the second arg (`worktree`, `branch`, `checkout`,
23
+ * `apply`).
24
+ */
25
+ function makeRunner(responses = {}) {
26
+ const calls = [];
27
+ const r = async (cmd, args, cwd) => {
28
+ calls.push({ cmd, args, cwd });
29
+ // Find the first arg that names a git subcommand we care about.
30
+ const sub = args.find((a) => ["worktree", "branch", "checkout", "apply", "status", "rev-parse"].includes(a));
31
+ const resp = sub ? responses[sub] : undefined;
32
+ // Defaults that make the I1 pre-checks pass without explicit override:
33
+ // - status: exit 0 + empty stdout (clean tree)
34
+ // - rev-parse: exit 1 (branch doesn't exist yet)
35
+ // Override per-call via the `responses` map to simulate dirty / existing.
36
+ let exitCode = resp?.exitCode;
37
+ if (exitCode === undefined) {
38
+ exitCode = sub === "rev-parse" ? 1 : 0;
39
+ }
40
+ return {
41
+ exitCode,
42
+ stdout: resp?.stdout ?? "",
43
+ stderr: resp?.stderr ?? "",
44
+ };
45
+ };
46
+ r.calls = calls;
47
+ return r;
48
+ }
49
+ function seedSnapshot(swarmId, opts) {
50
+ saveSwarmSnapshot({
51
+ id: swarmId,
52
+ hubSessionId: "hub",
53
+ workDir: WORK,
54
+ teamName: "default",
55
+ roles: new Map(),
56
+ plan: null,
57
+ nextInstanceSeq: new Map(),
58
+ status: "completed",
59
+ workspace: {
60
+ swarmId,
61
+ projectRoot: opts.repoRoot,
62
+ strategy: "git-worktree",
63
+ cwd: opts.cwd,
64
+ metadata: {
65
+ repoRoot: opts.repoRoot,
66
+ baseBranch: "main",
67
+ baseCommit: "abc",
68
+ branchName: opts.branchName,
69
+ },
70
+ },
71
+ });
72
+ }
73
+ describe("mergeShipment", () => {
74
+ it("stamps mergedAt on shipment.json for strategy=pr", async () => {
75
+ saveShipmentResult(WORK, "s-pr", {
76
+ strategy: "pr",
77
+ createdAt: "2026-06-05T00:00:00Z",
78
+ prUrl: "https://github.com/o/r/pull/1",
79
+ branchName: "clawnet/s-pr",
80
+ });
81
+ const r = await mergeShipment({ workDir: WORK, swarmId: "s-pr" });
82
+ expect(r.ok).toBe(true);
83
+ expect(r.message).toContain("merged");
84
+ const stored = loadShipmentResult(WORK, "s-pr");
85
+ expect(stored.mergedAt).toMatch(/^\d{4}-\d{2}-\d{2}T/);
86
+ });
87
+ it("rejects when shipment.json missing", async () => {
88
+ const r = await mergeShipment({ workDir: WORK, swarmId: "never" });
89
+ expect(r.ok).toBe(false);
90
+ expect(r.error).toContain("no shipment");
91
+ });
92
+ it("rejects when strategy is not pr", async () => {
93
+ saveShipmentResult(WORK, "s-diff", {
94
+ strategy: "diff-only",
95
+ createdAt: "2026-06-05T00:00:00Z",
96
+ diffPath: "/tmp/x.patch",
97
+ });
98
+ const r = await mergeShipment({ workDir: WORK, swarmId: "s-diff" });
99
+ expect(r.ok).toBe(false);
100
+ expect(r.error).toContain("strategy=pr");
101
+ });
102
+ it("does NOT call any git subprocess (record-only per Q1=A)", async () => {
103
+ saveShipmentResult(WORK, "s-pr2", {
104
+ strategy: "pr",
105
+ createdAt: "2026-06-05T00:00:00Z",
106
+ prUrl: "https://github.com/o/r/pull/2",
107
+ });
108
+ const runner = makeRunner();
109
+ await mergeShipment({ workDir: WORK, swarmId: "s-pr2", runner });
110
+ expect(runner.calls).toHaveLength(0);
111
+ });
112
+ });
113
+ describe("applyShipment", () => {
114
+ it("rejects when diffPath missing", async () => {
115
+ seedSnapshot("s-no-diff", {
116
+ cwd: "/tmp/wt",
117
+ repoRoot: "/tmp/repo",
118
+ branchName: "clawnet/s-no-diff",
119
+ });
120
+ saveShipmentResult(WORK, "s-no-diff", {
121
+ strategy: "pr",
122
+ createdAt: "2026-06-05T00:00:00Z",
123
+ prUrl: "https://x",
124
+ });
125
+ const r = await applyShipment({ workDir: WORK, swarmId: "s-no-diff", runner: makeRunner() });
126
+ expect(r.ok).toBe(false);
127
+ expect(r.error).toContain("diffPath");
128
+ });
129
+ it("rejects when diff file is missing from disk", async () => {
130
+ seedSnapshot("s-gone", {
131
+ cwd: "/tmp/wt",
132
+ repoRoot: "/tmp/repo",
133
+ branchName: "clawnet/s-gone",
134
+ });
135
+ saveShipmentResult(WORK, "s-gone", {
136
+ strategy: "diff-only",
137
+ createdAt: "2026-06-05T00:00:00Z",
138
+ diffPath: "/nonexistent/x.patch",
139
+ });
140
+ const r = await applyShipment({ workDir: WORK, swarmId: "s-gone", runner: makeRunner() });
141
+ expect(r.ok).toBe(false);
142
+ expect(r.error).toContain("not found on disk");
143
+ });
144
+ it("checks out clawnet-applied/<id> and applies the diff", async () => {
145
+ const diffDir = mkdtempSync(join(tmpdir(), "diff-"));
146
+ const diffPath = join(diffDir, "x.patch");
147
+ writeFileSync(diffPath, "diff --git a/x b/x\n");
148
+ const repoRoot = mkdtempSync(join(tmpdir(), "repo-"));
149
+ seedSnapshot("s-apply", {
150
+ cwd: "/tmp/wt",
151
+ repoRoot,
152
+ branchName: "clawnet/s-apply",
153
+ });
154
+ saveShipmentResult(WORK, "s-apply", {
155
+ strategy: "diff-only",
156
+ createdAt: "2026-06-05T00:00:00Z",
157
+ diffPath,
158
+ });
159
+ const runner = makeRunner();
160
+ const r = await applyShipment({ workDir: WORK, swarmId: "s-apply", runner });
161
+ expect(r.ok).toBe(true);
162
+ expect(r.newBranchName).toBe("clawnet-applied/s-apply");
163
+ // I1 pre-checks run first:
164
+ expect(runner.calls[0].args).toEqual(["-C", repoRoot, "status", "--porcelain"]);
165
+ expect(runner.calls[1].args).toEqual([
166
+ "-C",
167
+ repoRoot,
168
+ "rev-parse",
169
+ "--verify",
170
+ "clawnet-applied/s-apply",
171
+ ]);
172
+ expect(runner.calls[2].args).toEqual([
173
+ "-C",
174
+ repoRoot,
175
+ "checkout",
176
+ "-B",
177
+ "clawnet-applied/s-apply",
178
+ ]);
179
+ expect(runner.calls[3].args).toEqual(["-C", repoRoot, "apply", diffPath]);
180
+ rmSync(diffDir, { recursive: true, force: true });
181
+ rmSync(repoRoot, { recursive: true, force: true });
182
+ });
183
+ it("surfaces git checkout failure", async () => {
184
+ const diffDir = mkdtempSync(join(tmpdir(), "diff-"));
185
+ const diffPath = join(diffDir, "x.patch");
186
+ writeFileSync(diffPath, "diff --git a/x b/x\n");
187
+ const repoRoot = mkdtempSync(join(tmpdir(), "repo-"));
188
+ seedSnapshot("s-co-fail", { cwd: "/tmp/wt", repoRoot, branchName: "b" });
189
+ saveShipmentResult(WORK, "s-co-fail", {
190
+ strategy: "diff-only",
191
+ createdAt: "2026-06-05T00:00:00Z",
192
+ diffPath,
193
+ });
194
+ const runner = makeRunner({ checkout: { exitCode: 1, stderr: "boom" } });
195
+ const r = await applyShipment({ workDir: WORK, swarmId: "s-co-fail", runner });
196
+ expect(r.ok).toBe(false);
197
+ expect(r.error).toContain("checkout");
198
+ expect(r.error).toContain("boom");
199
+ rmSync(diffDir, { recursive: true, force: true });
200
+ rmSync(repoRoot, { recursive: true, force: true });
201
+ });
202
+ it("surfaces git apply failure", async () => {
203
+ const diffDir = mkdtempSync(join(tmpdir(), "diff-"));
204
+ const diffPath = join(diffDir, "x.patch");
205
+ writeFileSync(diffPath, "diff --git a/x b/x\n");
206
+ const repoRoot = mkdtempSync(join(tmpdir(), "repo-"));
207
+ seedSnapshot("s-ap-fail", { cwd: "/tmp/wt", repoRoot, branchName: "b" });
208
+ saveShipmentResult(WORK, "s-ap-fail", {
209
+ strategy: "diff-only",
210
+ createdAt: "2026-06-05T00:00:00Z",
211
+ diffPath,
212
+ });
213
+ const runner = makeRunner({ apply: { exitCode: 1, stderr: "patch does not apply" } });
214
+ const r = await applyShipment({ workDir: WORK, swarmId: "s-ap-fail", runner });
215
+ expect(r.ok).toBe(false);
216
+ expect(r.error).toContain("patch does not apply");
217
+ rmSync(diffDir, { recursive: true, force: true });
218
+ rmSync(repoRoot, { recursive: true, force: true });
219
+ });
220
+ // M6.2 hotfix I1
221
+ it("refuses to apply onto a dirty working tree", async () => {
222
+ const diffDir = mkdtempSync(join(tmpdir(), "diff-"));
223
+ const diffPath = join(diffDir, "x.patch");
224
+ writeFileSync(diffPath, "diff --git a/x b/x\n");
225
+ const repoRoot = mkdtempSync(join(tmpdir(), "repo-"));
226
+ seedSnapshot("s-dirty", { cwd: "/tmp/wt", repoRoot, branchName: "b" });
227
+ saveShipmentResult(WORK, "s-dirty", {
228
+ strategy: "diff-only",
229
+ createdAt: "2026-06-05T00:00:00Z",
230
+ diffPath,
231
+ });
232
+ const runner = makeRunner({ status: { exitCode: 0, stdout: " M src/foo.ts\n" } });
233
+ const r = await applyShipment({ workDir: WORK, swarmId: "s-dirty", runner });
234
+ expect(r.ok).toBe(false);
235
+ expect(r.error).toContain("uncommitted");
236
+ // No checkout/apply should have been attempted.
237
+ expect(runner.calls.some((c) => c.args.includes("checkout"))).toBe(false);
238
+ expect(runner.calls.some((c) => c.args.includes("apply") && !c.args.includes("status"))).toBe(false);
239
+ rmSync(diffDir, { recursive: true, force: true });
240
+ rmSync(repoRoot, { recursive: true, force: true });
241
+ });
242
+ it("refuses to clobber an existing clawnet-applied/<id> branch", async () => {
243
+ const diffDir = mkdtempSync(join(tmpdir(), "diff-"));
244
+ const diffPath = join(diffDir, "x.patch");
245
+ writeFileSync(diffPath, "diff --git a/x b/x\n");
246
+ const repoRoot = mkdtempSync(join(tmpdir(), "repo-"));
247
+ seedSnapshot("s-exists", { cwd: "/tmp/wt", repoRoot, branchName: "b" });
248
+ saveShipmentResult(WORK, "s-exists", {
249
+ strategy: "diff-only",
250
+ createdAt: "2026-06-05T00:00:00Z",
251
+ diffPath,
252
+ });
253
+ // rev-parse --verify returns 0 → branch already exists.
254
+ const runner = makeRunner({ "rev-parse": { exitCode: 0, stdout: "abc123\n" } });
255
+ const r = await applyShipment({ workDir: WORK, swarmId: "s-exists", runner });
256
+ expect(r.ok).toBe(false);
257
+ expect(r.error).toContain("already exists");
258
+ expect(runner.calls.some((c) => c.args.includes("checkout"))).toBe(false);
259
+ rmSync(diffDir, { recursive: true, force: true });
260
+ rmSync(repoRoot, { recursive: true, force: true });
261
+ });
262
+ it("force=true bypasses both pre-checks and applies", async () => {
263
+ const diffDir = mkdtempSync(join(tmpdir(), "diff-"));
264
+ const diffPath = join(diffDir, "x.patch");
265
+ writeFileSync(diffPath, "diff --git a/x b/x\n");
266
+ const repoRoot = mkdtempSync(join(tmpdir(), "repo-"));
267
+ seedSnapshot("s-force", { cwd: "/tmp/wt", repoRoot, branchName: "b" });
268
+ saveShipmentResult(WORK, "s-force", {
269
+ strategy: "diff-only",
270
+ createdAt: "2026-06-05T00:00:00Z",
271
+ diffPath,
272
+ });
273
+ // Both dirty tree AND existing branch — both should be bypassed.
274
+ const runner = makeRunner({
275
+ status: { exitCode: 0, stdout: " M src/foo.ts\n" },
276
+ "rev-parse": { exitCode: 0, stdout: "abc123\n" },
277
+ });
278
+ const r = await applyShipment({
279
+ workDir: WORK,
280
+ swarmId: "s-force",
281
+ runner,
282
+ force: true,
283
+ });
284
+ expect(r.ok).toBe(true);
285
+ // First call goes straight to checkout — no status / rev-parse probes.
286
+ expect(runner.calls[0].args).toEqual([
287
+ "-C",
288
+ repoRoot,
289
+ "checkout",
290
+ "-B",
291
+ "clawnet-applied/s-force",
292
+ ]);
293
+ rmSync(diffDir, { recursive: true, force: true });
294
+ rmSync(repoRoot, { recursive: true, force: true });
295
+ });
296
+ });
297
+ describe("discardShipment", () => {
298
+ it("removes worktree, branch, and shipment.json", async () => {
299
+ const repoRoot = mkdtempSync(join(tmpdir(), "repo-"));
300
+ const wt = mkdtempSync(join(tmpdir(), "wt-"));
301
+ seedSnapshot("s-disc", { cwd: wt, repoRoot, branchName: "clawnet/s-disc" });
302
+ saveShipmentResult(WORK, "s-disc", {
303
+ strategy: "pr",
304
+ createdAt: "2026-06-05T00:00:00Z",
305
+ prUrl: "https://x",
306
+ branchName: "clawnet/s-disc",
307
+ });
308
+ const runner = makeRunner();
309
+ const r = await discardShipment({ workDir: WORK, swarmId: "s-disc", runner });
310
+ expect(r.ok).toBe(true);
311
+ expect(loadShipmentResult(WORK, "s-disc")).toBeNull();
312
+ // First call: git worktree remove --force <wt>
313
+ expect(runner.calls[0].args).toEqual([
314
+ "-C",
315
+ repoRoot,
316
+ "worktree",
317
+ "remove",
318
+ "--force",
319
+ wt,
320
+ ]);
321
+ // Second call: git branch -D clawnet/s-disc
322
+ expect(runner.calls[1].args).toEqual([
323
+ "-C",
324
+ repoRoot,
325
+ "branch",
326
+ "-D",
327
+ "clawnet/s-disc",
328
+ ]);
329
+ rmSync(repoRoot, { recursive: true, force: true });
330
+ rmSync(wt, { recursive: true, force: true });
331
+ });
332
+ it("treats worktree-remove + branch-delete failures as warnings (still ok)", async () => {
333
+ const repoRoot = mkdtempSync(join(tmpdir(), "repo-"));
334
+ const wt = mkdtempSync(join(tmpdir(), "wt-"));
335
+ seedSnapshot("s-warn", { cwd: wt, repoRoot, branchName: "b" });
336
+ saveShipmentResult(WORK, "s-warn", {
337
+ strategy: "pr",
338
+ createdAt: "2026-06-05T00:00:00Z",
339
+ prUrl: "https://x",
340
+ branchName: "b",
341
+ });
342
+ const runner = makeRunner({
343
+ worktree: { exitCode: 1, stderr: "already gone" },
344
+ branch: { exitCode: 1, stderr: "no such branch" },
345
+ });
346
+ const r = await discardShipment({ workDir: WORK, swarmId: "s-warn", runner });
347
+ expect(r.ok).toBe(true);
348
+ expect(r.message).toContain("warnings");
349
+ expect(loadShipmentResult(WORK, "s-warn")).toBeNull();
350
+ rmSync(repoRoot, { recursive: true, force: true });
351
+ rmSync(wt, { recursive: true, force: true });
352
+ });
353
+ it("succeeds when no snapshot/workspace exists (shipment-only)", async () => {
354
+ saveShipmentResult(WORK, "s-orphan", {
355
+ strategy: "pr",
356
+ createdAt: "2026-06-05T00:00:00Z",
357
+ prUrl: "https://x",
358
+ });
359
+ const runner = makeRunner();
360
+ const r = await discardShipment({ workDir: WORK, swarmId: "s-orphan", runner });
361
+ expect(r.ok).toBe(true);
362
+ // No git calls because we have no workspaceRepoRoot.
363
+ expect(runner.calls).toHaveLength(0);
364
+ expect(loadShipmentResult(WORK, "s-orphan")).toBeNull();
365
+ });
366
+ it("is idempotent — second discard on same swarm still ok", async () => {
367
+ saveShipmentResult(WORK, "s-twice", {
368
+ strategy: "pr",
369
+ createdAt: "2026-06-05T00:00:00Z",
370
+ prUrl: "https://x",
371
+ });
372
+ const runner = makeRunner();
373
+ await discardShipment({ workDir: WORK, swarmId: "s-twice", runner });
374
+ const r2 = await discardShipment({ workDir: WORK, swarmId: "s-twice", runner });
375
+ expect(r2.ok).toBe(true);
376
+ });
377
+ });
378
+ //# sourceMappingURL=shipment-actions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipment-actions.test.js","sourceRoot":"","sources":["../../src/__tests__/shipment-actions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shipment-persistence.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipment-persistence.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/shipment-persistence.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync, existsSync, writeFileSync, readdirSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { saveShipmentResult, loadShipmentResult, saveSwarmSnapshot, deleteSwarmSnapshot, } from "../persistence.js";
6
+ let HOME;
7
+ let WORK;
8
+ beforeEach(() => {
9
+ HOME = mkdtempSync(join(tmpdir(), "ship-persist-"));
10
+ WORK = mkdtempSync(join(tmpdir(), "ship-persist-work-"));
11
+ process.env.CLAWNET_HOME = HOME;
12
+ });
13
+ afterEach(() => {
14
+ rmSync(HOME, { recursive: true, force: true });
15
+ rmSync(WORK, { recursive: true, force: true });
16
+ delete process.env.CLAWNET_HOME;
17
+ });
18
+ describe("shipment persistence (M6.2.0)", () => {
19
+ it("saveShipmentResult writes JSON and loadShipmentResult round-trips", () => {
20
+ const r = {
21
+ strategy: "pr",
22
+ createdAt: "2026-06-05T10:00:00Z",
23
+ prUrl: "https://github.com/o/r/pull/42",
24
+ branchName: "clawnet/swarm-abc",
25
+ title: "test PR",
26
+ summary: "did stuff",
27
+ };
28
+ saveShipmentResult(WORK, "s1", r);
29
+ const loaded = loadShipmentResult(WORK, "s1");
30
+ expect(loaded).toEqual(r);
31
+ });
32
+ it("loadShipmentResult returns null when file missing", () => {
33
+ expect(loadShipmentResult(WORK, "never-shipped")).toBeNull();
34
+ });
35
+ it("loadShipmentResult returns null on corrupt JSON", () => {
36
+ const r = {
37
+ strategy: "skipped",
38
+ createdAt: "2026-06-05T10:00:00Z",
39
+ error: "x",
40
+ };
41
+ // Save a valid file first so we can find its path, then overwrite with garbage.
42
+ saveShipmentResult(WORK, "s2", r);
43
+ // Locate the file by listing the swarm dir for "s2" — we know shipment.json
44
+ // sits next to recovery.json under the project-encoded swarms dir. To stay
45
+ // implementation-agnostic, write garbage via the same save+overwrite pattern:
46
+ // re-derive the path by scanning ~/.clawnet for shipment.json under "s2".
47
+ const projectsDir = join(HOME, ".clawnet", "projects");
48
+ let shipmentPath = null;
49
+ for (const proj of readdirSync(projectsDir, { withFileTypes: true })) {
50
+ if (!proj.isDirectory())
51
+ continue;
52
+ const candidate = join(projectsDir, proj.name, "swarms", "s2", "shipment.json");
53
+ if (existsSync(candidate)) {
54
+ shipmentPath = candidate;
55
+ break;
56
+ }
57
+ }
58
+ expect(shipmentPath).not.toBeNull();
59
+ writeFileSync(shipmentPath, "{not valid json", "utf-8");
60
+ expect(loadShipmentResult(WORK, "s2")).toBeNull();
61
+ });
62
+ it("survives deleteSwarmSnapshot — shipment.json is a separate file from recovery.json", () => {
63
+ const r = {
64
+ strategy: "diff-only",
65
+ createdAt: "2026-06-05T10:00:00Z",
66
+ diffPath: "/tmp/diff.patch",
67
+ reportPath: "/tmp/report.md",
68
+ };
69
+ // Save a snapshot AND a shipment.json next to it.
70
+ saveSwarmSnapshot({
71
+ id: "s3",
72
+ hubSessionId: "hub",
73
+ workDir: WORK,
74
+ teamName: "default",
75
+ roles: new Map(),
76
+ plan: null,
77
+ nextInstanceSeq: new Map(),
78
+ status: "completed",
79
+ });
80
+ saveShipmentResult(WORK, "s3", r);
81
+ // Confirm both files exist before destroy.
82
+ const projectsDir = join(HOME, ".clawnet", "projects");
83
+ let swarmDir = null;
84
+ for (const proj of readdirSync(projectsDir, { withFileTypes: true })) {
85
+ if (!proj.isDirectory())
86
+ continue;
87
+ const candidate = join(projectsDir, proj.name, "swarms", "s3");
88
+ if (existsSync(candidate)) {
89
+ swarmDir = candidate;
90
+ break;
91
+ }
92
+ }
93
+ expect(swarmDir).not.toBeNull();
94
+ expect(existsSync(join(swarmDir, "recovery.json"))).toBe(true);
95
+ expect(existsSync(join(swarmDir, "shipment.json"))).toBe(true);
96
+ // Simulate the destroy path: deleteSwarmSnapshot wipes recovery.json only.
97
+ deleteSwarmSnapshot(WORK, "s3");
98
+ expect(existsSync(join(swarmDir, "recovery.json"))).toBe(false);
99
+ expect(existsSync(join(swarmDir, "shipment.json"))).toBe(true);
100
+ // And loadShipmentResult still round-trips.
101
+ const loaded = loadShipmentResult(WORK, "s3");
102
+ expect(loaded).toEqual(r);
103
+ });
104
+ it("saveShipmentResult overwrites prior shipment.json (idempotent)", () => {
105
+ const a = {
106
+ strategy: "diff-only",
107
+ createdAt: "2026-06-05T09:00:00Z",
108
+ diffPath: "/tmp/old.patch",
109
+ };
110
+ const b = {
111
+ strategy: "pr",
112
+ createdAt: "2026-06-05T10:00:00Z",
113
+ prUrl: "https://example.com/pr/1",
114
+ };
115
+ saveShipmentResult(WORK, "s4", a);
116
+ saveShipmentResult(WORK, "s4", b);
117
+ expect(loadShipmentResult(WORK, "s4")).toEqual(b);
118
+ });
119
+ });
120
+ //# sourceMappingURL=shipment-persistence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipment-persistence.test.js","sourceRoot":"","sources":["../../src/__tests__/shipment-persistence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shipment-pipeline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipment-pipeline.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/shipment-pipeline.test.ts"],"names":[],"mappings":""}