@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":"transport-detect.test.js","sourceRoot":"","sources":["../../src/__tests__/transport-detect.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workcycle-runner-cascade.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workcycle-runner-cascade.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/workcycle-runner-cascade.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,203 @@
1
+ // M8.0 — integration test for WorkCycleRunner + cascade picker + source hooks.
2
+ //
3
+ // Verifies the end-to-end flow:
4
+ // - cascade picker hands the runner a task + the source that produced it
5
+ // - runner calls source.onClaim after coordinator.create succeeds
6
+ // - on success terminal (swarm completed + shipment landed), source.onSuccess fires
7
+ // - on failure terminal (swarm failed OR shipment skipped), source.onFailure fires
8
+ //
9
+ // Uses the same FakeCoordinator pattern as workcycle-runner.test.ts.
10
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
11
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { WorkCycleRunner } from "../always-on/workcycle-runner.js";
15
+ import { createCascadePicker } from "../always-on/task-sources/cascade-picker.js";
16
+ class FakeCoordinator {
17
+ swarms = new Map();
18
+ initialStatus = "running";
19
+ onPoll = null;
20
+ async create(swarmId, options) {
21
+ const inst = {
22
+ id: swarmId,
23
+ hubSessionId: swarmId,
24
+ workDir: options.workDir,
25
+ teamName: options.templateName,
26
+ roles: new Map(),
27
+ plan: null,
28
+ nextInstanceSeq: new Map(),
29
+ idleCheckCount: 0,
30
+ maxIdleChecks: 10,
31
+ isPaused: false,
32
+ status: this.initialStatus,
33
+ planStatus: "none",
34
+ };
35
+ this.swarms.set(swarmId, inst);
36
+ }
37
+ getSwarm(swarmId) {
38
+ const swarm = this.swarms.get(swarmId);
39
+ if (swarm && this.onPoll)
40
+ this.onPoll(swarm);
41
+ return swarm;
42
+ }
43
+ async complete(swarmId) { this.swarms.delete(swarmId); }
44
+ async fail(swarmId) { this.swarms.delete(swarmId); }
45
+ async destroy(swarmId) { this.swarms.delete(swarmId); }
46
+ }
47
+ function silentLog() {
48
+ return { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() };
49
+ }
50
+ function withTmpHome() {
51
+ const home = mkdtempSync(join(tmpdir(), "wcr-cascade-test-"));
52
+ const projectRoot = mkdtempSync(join(tmpdir(), "wcr-cascade-proj-"));
53
+ process.env.CLAWNET_HOME = home;
54
+ return {
55
+ projectRoot,
56
+ cleanup() {
57
+ delete process.env.CLAWNET_HOME;
58
+ try {
59
+ rmSync(home, { recursive: true, force: true });
60
+ }
61
+ catch { /* ignore */ }
62
+ try {
63
+ rmSync(projectRoot, { recursive: true, force: true });
64
+ }
65
+ catch { /* ignore */ }
66
+ },
67
+ };
68
+ }
69
+ function seedShipment(projectRoot, swarmId, result) {
70
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
71
+ const { projectRoot: pr } = require("@mclawnet/task");
72
+ const home = process.env.CLAWNET_HOME;
73
+ const swarmDir = join(pr(projectRoot, home), "swarms", swarmId);
74
+ mkdirSync(swarmDir, { recursive: true });
75
+ writeFileSync(join(swarmDir, "shipment.json"), JSON.stringify(result, null, 2));
76
+ }
77
+ function makeSourceWithHooks(name, pick) {
78
+ const calls = { claim: [], success: [], failure: [] };
79
+ const source = {
80
+ name,
81
+ pick,
82
+ async onClaim(ref, swarmId) { calls.claim.push({ ref, swarmId }); },
83
+ async onSuccess(ref, swarmId) { calls.success.push({ ref, swarmId }); },
84
+ async onFailure(ref, swarmId, error) { calls.failure.push({ ref, swarmId, error }); },
85
+ };
86
+ return { source, calls };
87
+ }
88
+ describe("WorkCycleRunner + cascade picker (M8.0)", () => {
89
+ let tmp;
90
+ beforeEach(() => { tmp = withTmpHome(); });
91
+ afterEach(() => { tmp.cleanup(); });
92
+ it("L1 empty + L2 hits → runner picks L2's task and calls L2's hooks", async () => {
93
+ const coord = new FakeCoordinator();
94
+ coord.onPoll = (s) => { s.status = "completed"; };
95
+ const l1 = makeSourceWithHooks("l1", async () => null);
96
+ const l2Ref = { id: "l2-task", title: "L2 picked", sourceKind: "l2", sourceId: "l2-task" };
97
+ const l2 = makeSourceWithHooks("l2", async () => l2Ref);
98
+ const picker = createCascadePicker([l1.source, l2.source]);
99
+ const runner = new WorkCycleRunner({
100
+ pickNextTask: (root) => picker.pickNextTask(root),
101
+ resolveTaskSource: (ref) => picker.resolveSource(ref),
102
+ swarmCoordinator: coord,
103
+ log: silentLog(),
104
+ initialSettleMs: 0,
105
+ pollIntervalMs: 1,
106
+ sleep: () => Promise.resolve(),
107
+ });
108
+ // Seed shipment so the success path is reachable.
109
+ const origCreate = coord.create.bind(coord);
110
+ coord.create = async (swarmId, options) => {
111
+ await origCreate(swarmId, options);
112
+ seedShipment(tmp.projectRoot, swarmId, {
113
+ strategy: "pr",
114
+ createdAt: new Date().toISOString(),
115
+ prUrl: "https://example.com/pr/1",
116
+ branchName: "swarm/test",
117
+ title: "L2 picked",
118
+ });
119
+ };
120
+ const result = await runner.run({ projectRoot: tmp.projectRoot });
121
+ expect(result.status).toBe("completed");
122
+ expect(result.taskRef?.id).toBe("l2-task");
123
+ // L1 never claimed/handled anything
124
+ expect(l1.calls.claim).toHaveLength(0);
125
+ expect(l1.calls.success).toHaveLength(0);
126
+ expect(l1.calls.failure).toHaveLength(0);
127
+ // L2 saw claim + success
128
+ expect(l2.calls.claim).toHaveLength(1);
129
+ expect(l2.calls.claim[0].swarmId).toBe(result.swarmId);
130
+ expect(l2.calls.success).toHaveLength(1);
131
+ expect(l2.calls.success[0].ref.id).toBe("l2-task");
132
+ expect(l2.calls.failure).toHaveLength(0);
133
+ });
134
+ it("shipment.strategy=skipped → onFailure (not onSuccess) even when swarm completed", async () => {
135
+ const coord = new FakeCoordinator();
136
+ coord.onPoll = (s) => { s.status = "completed"; };
137
+ const ref = { id: "x", title: "x", sourceKind: "only", sourceId: "x" };
138
+ const { source, calls } = makeSourceWithHooks("only", async () => ref);
139
+ const picker = createCascadePicker([source]);
140
+ const runner = new WorkCycleRunner({
141
+ pickNextTask: (root) => picker.pickNextTask(root),
142
+ resolveTaskSource: (r) => picker.resolveSource(r),
143
+ swarmCoordinator: coord,
144
+ log: silentLog(),
145
+ initialSettleMs: 0,
146
+ pollIntervalMs: 1,
147
+ sleep: () => Promise.resolve(),
148
+ });
149
+ const origCreate = coord.create.bind(coord);
150
+ coord.create = async (swarmId, options) => {
151
+ await origCreate(swarmId, options);
152
+ seedShipment(tmp.projectRoot, swarmId, {
153
+ strategy: "skipped",
154
+ createdAt: new Date().toISOString(),
155
+ error: "no changes",
156
+ });
157
+ };
158
+ await runner.run({ projectRoot: tmp.projectRoot });
159
+ expect(calls.success).toHaveLength(0);
160
+ expect(calls.failure).toHaveLength(1);
161
+ expect(calls.failure[0].error).toMatch(/no changes|skipped/);
162
+ });
163
+ it("no sources hit → result.status='skipped', no hooks fire", async () => {
164
+ const coord = new FakeCoordinator();
165
+ const { source, calls } = makeSourceWithHooks("empty", async () => null);
166
+ const picker = createCascadePicker([source]);
167
+ const runner = new WorkCycleRunner({
168
+ pickNextTask: (root) => picker.pickNextTask(root),
169
+ resolveTaskSource: (r) => picker.resolveSource(r),
170
+ swarmCoordinator: coord,
171
+ log: silentLog(),
172
+ initialSettleMs: 0,
173
+ pollIntervalMs: 1,
174
+ sleep: () => Promise.resolve(),
175
+ });
176
+ const result = await runner.run({ projectRoot: tmp.projectRoot });
177
+ expect(result.status).toBe("skipped");
178
+ expect(calls.claim).toHaveLength(0);
179
+ expect(calls.success).toHaveLength(0);
180
+ expect(calls.failure).toHaveLength(0);
181
+ });
182
+ it("swarm failed terminal → onFailure with the swarm error message", async () => {
183
+ const coord = new FakeCoordinator();
184
+ coord.onPoll = (s) => { s.status = "failed"; };
185
+ const ref = { id: "f", title: "f", sourceKind: "only", sourceId: "f" };
186
+ const { source, calls } = makeSourceWithHooks("only", async () => ref);
187
+ const picker = createCascadePicker([source]);
188
+ const runner = new WorkCycleRunner({
189
+ pickNextTask: (root) => picker.pickNextTask(root),
190
+ resolveTaskSource: (r) => picker.resolveSource(r),
191
+ swarmCoordinator: coord,
192
+ log: silentLog(),
193
+ initialSettleMs: 0,
194
+ pollIntervalMs: 1,
195
+ sleep: () => Promise.resolve(),
196
+ });
197
+ await runner.run({ projectRoot: tmp.projectRoot });
198
+ expect(calls.claim).toHaveLength(1);
199
+ expect(calls.failure).toHaveLength(1);
200
+ expect(calls.success).toHaveLength(0);
201
+ });
202
+ });
203
+ //# sourceMappingURL=workcycle-runner-cascade.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workcycle-runner-cascade.test.js","sourceRoot":"","sources":["../../src/__tests__/workcycle-runner-cascade.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workcycle-runner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workcycle-runner.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/workcycle-runner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,369 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { WorkCycleRunner } from "../always-on/workcycle-runner.js";
6
+ import { loadTemplate } from "../templates/template-loader.js";
7
+ /**
8
+ * Minimal fake SwarmCoordinator. Only the methods WorkCycleRunner touches are
9
+ * implemented; everything else stays unreachable so accidental coupling
10
+ * surfaces as a TypeError during test runs.
11
+ */
12
+ class FakeCoordinator {
13
+ swarms = new Map();
14
+ createCalls = [];
15
+ completeCalls = [];
16
+ failCalls = [];
17
+ destroyCalls = [];
18
+ // Hook for tests: what status the swarm gets after create().
19
+ initialStatus = "running";
20
+ // Hook: programmatic transition during waitForTerminal poll loop.
21
+ onPoll = null;
22
+ // Hook: throw on create().
23
+ throwOnCreate = null;
24
+ async create(swarmId, options) {
25
+ this.createCalls.push({ swarmId, options });
26
+ if (this.throwOnCreate)
27
+ throw this.throwOnCreate;
28
+ const inst = {
29
+ id: swarmId,
30
+ hubSessionId: swarmId,
31
+ workDir: options.workDir,
32
+ teamName: options.templateName,
33
+ roles: new Map(),
34
+ plan: null,
35
+ nextInstanceSeq: new Map(),
36
+ idleCheckCount: 0,
37
+ maxIdleChecks: 10,
38
+ isPaused: false,
39
+ status: this.initialStatus,
40
+ planStatus: "none",
41
+ };
42
+ this.swarms.set(swarmId, inst);
43
+ }
44
+ getSwarm(swarmId) {
45
+ const swarm = this.swarms.get(swarmId);
46
+ if (swarm && this.onPoll)
47
+ this.onPoll(swarm);
48
+ return swarm;
49
+ }
50
+ async complete(swarmId) {
51
+ this.completeCalls.push(swarmId);
52
+ // Mirror real coordinator: removes from registry on cleanup.
53
+ this.swarms.delete(swarmId);
54
+ }
55
+ async fail(swarmId) {
56
+ this.failCalls.push(swarmId);
57
+ this.swarms.delete(swarmId);
58
+ }
59
+ async destroy(swarmId) {
60
+ this.destroyCalls.push(swarmId);
61
+ this.swarms.delete(swarmId);
62
+ }
63
+ }
64
+ function makeFake() {
65
+ return new FakeCoordinator();
66
+ }
67
+ function silentLog() {
68
+ return {
69
+ info: vi.fn(),
70
+ warn: vi.fn(),
71
+ error: vi.fn(),
72
+ debug: vi.fn(),
73
+ };
74
+ }
75
+ /**
76
+ * Build a real on-disk projectRoot inside a tmp dir AND seed it with the
77
+ * .clawnet/projects/<encoded>/swarms/<swarmId>/shipment.json layout that
78
+ * loadShipmentResult expects. We use process.env.CLAWNET_HOME so persistence.ts
79
+ * resolves to our tmp dir instead of ~/.
80
+ */
81
+ function withTmpHome() {
82
+ const home = mkdtempSync(join(tmpdir(), "wcr-test-"));
83
+ const projectRoot = mkdtempSync(join(tmpdir(), "wcr-proj-"));
84
+ process.env.CLAWNET_HOME = home;
85
+ return {
86
+ projectRoot,
87
+ cleanup() {
88
+ delete process.env.CLAWNET_HOME;
89
+ try {
90
+ rmSync(home, { recursive: true, force: true });
91
+ }
92
+ catch { /* ignore */ }
93
+ try {
94
+ rmSync(projectRoot, { recursive: true, force: true });
95
+ }
96
+ catch { /* ignore */ }
97
+ },
98
+ };
99
+ }
100
+ /**
101
+ * Write a fake shipment.json for a given swarmId so loadShipmentResult finds it.
102
+ * Mirrors the path computation in persistence.ts: <CLAWNET_HOME>/.clawnet/projects/<encoded>/swarms/<swarmId>/shipment.json
103
+ */
104
+ function seedShipment(projectRoot, swarmId, result) {
105
+ // Re-derive the path the same way persistence.ts does via projectRoot() from
106
+ // @mclawnet/task. Keep it dynamic so a refactor doesn't silently break tests.
107
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
108
+ const { projectRoot: pr } = require("@mclawnet/task");
109
+ const home = process.env.CLAWNET_HOME;
110
+ const swarmDir = join(pr(projectRoot, home), "swarms", swarmId);
111
+ mkdirSync(swarmDir, { recursive: true });
112
+ writeFileSync(join(swarmDir, "shipment.json"), JSON.stringify(result, null, 2));
113
+ }
114
+ describe("WorkCycleRunner", () => {
115
+ let tmp;
116
+ beforeEach(() => {
117
+ tmp = withTmpHome();
118
+ });
119
+ afterEach(() => {
120
+ tmp.cleanup();
121
+ });
122
+ it("pickNextTask returns null → result.status === 'skipped'", async () => {
123
+ const coord = makeFake();
124
+ const runner = new WorkCycleRunner({
125
+ pickNextTask: async () => null,
126
+ swarmCoordinator: coord,
127
+ log: silentLog(),
128
+ initialSettleMs: 0,
129
+ pollIntervalMs: 1,
130
+ sleep: () => Promise.resolve(),
131
+ });
132
+ const result = await runner.run({ projectRoot: tmp.projectRoot });
133
+ expect(result.status).toBe("skipped");
134
+ expect(result.error).toMatch(/no task available/i);
135
+ expect(result.taskRef).toBeNull();
136
+ expect(coord.createCalls).toHaveLength(0);
137
+ expect(result.cycleId).toBeTruthy();
138
+ expect(result.swarmId).toMatch(/^m7-cycle-/);
139
+ });
140
+ it("happy path: task picked → create called → polling sees completed → shipment loaded", async () => {
141
+ const coord = makeFake();
142
+ const fake = coord;
143
+ // Flip to completed on the very first poll.
144
+ let polled = 0;
145
+ fake.onPoll = (s) => { if (++polled >= 1)
146
+ s.status = "completed"; };
147
+ const task = { id: "t-1", title: "Refactor X", description: "Do the thing" };
148
+ const runner = new WorkCycleRunner({
149
+ pickNextTask: async () => task,
150
+ swarmCoordinator: coord,
151
+ log: silentLog(),
152
+ initialSettleMs: 0,
153
+ pollIntervalMs: 1,
154
+ sleep: () => Promise.resolve(),
155
+ });
156
+ // Pre-stage shipment.json so loadShipmentResult returns something.
157
+ // We need to compute swarmId AFTER run() generates it — so we'll intercept
158
+ // the create call to seed the file then.
159
+ const origCreate = fake.create.bind(fake);
160
+ fake.create = async (swarmId, options) => {
161
+ await origCreate(swarmId, options);
162
+ seedShipment(tmp.projectRoot, swarmId, {
163
+ strategy: "pr",
164
+ createdAt: new Date().toISOString(),
165
+ prUrl: "https://example.com/pr/1",
166
+ branchName: "swarm/test",
167
+ title: "Refactor X",
168
+ });
169
+ };
170
+ const result = await runner.run({ projectRoot: tmp.projectRoot });
171
+ expect(result.status).toBe("completed");
172
+ expect(result.taskRef).toEqual(task);
173
+ expect(fake.createCalls).toHaveLength(1);
174
+ expect(fake.createCalls[0].options.task).toBe("Do the thing");
175
+ // C1 hotfix: default template flipped from the non-existent "default" to
176
+ // the bundled "minimal" template so loadTemplate() actually resolves.
177
+ expect(fake.createCalls[0].options.templateName).toBe("minimal");
178
+ // PR-B D11 — runner stamps kind="always-on-cycle" so UI / GC / shipment
179
+ // can distinguish always-on swarms from chat-driven user swarms.
180
+ expect(fake.createCalls[0].options.kind).toBe("always-on-cycle");
181
+ expect(fake.completeCalls).toEqual([fake.createCalls[0].swarmId]);
182
+ expect(result.shipment).toBeDefined();
183
+ expect(result.shipment?.prUrl).toBe("https://example.com/pr/1");
184
+ });
185
+ it("C1: caller-supplied templateName overrides the default", async () => {
186
+ const coord = makeFake();
187
+ const fake = coord;
188
+ fake.onPoll = (s) => { s.status = "completed"; };
189
+ const runner = new WorkCycleRunner({
190
+ pickNextTask: async () => ({ id: "t-x", title: "Task", description: "d" }),
191
+ swarmCoordinator: coord,
192
+ log: silentLog(),
193
+ initialSettleMs: 0,
194
+ pollIntervalMs: 1,
195
+ sleep: () => Promise.resolve(),
196
+ });
197
+ await runner.run({ projectRoot: tmp.projectRoot, templateName: "dev-team" });
198
+ expect(fake.createCalls[0].options.templateName).toBe("dev-team");
199
+ });
200
+ // M8.1: TaskRef.cycleKind === "research" overrides the template regardless
201
+ // of caller-supplied templateName.
202
+ it("M8.1: TaskRef.cycleKind=research forces template=research-only", async () => {
203
+ const coord = makeFake();
204
+ const fake = coord;
205
+ fake.onPoll = (s) => { s.status = "completed"; };
206
+ const runner = new WorkCycleRunner({
207
+ pickNextTask: async () => ({
208
+ id: "i-1",
209
+ title: "Investigate X",
210
+ description: "look into X",
211
+ cycleKind: "research",
212
+ }),
213
+ swarmCoordinator: coord,
214
+ log: silentLog(),
215
+ initialSettleMs: 0,
216
+ pollIntervalMs: 1,
217
+ sleep: () => Promise.resolve(),
218
+ });
219
+ // Even with caller templateName="dev-team", research wins.
220
+ await runner.run({ projectRoot: tmp.projectRoot, templateName: "dev-team" });
221
+ expect(fake.createCalls[0].options.templateName).toBe("research-only");
222
+ });
223
+ it("M8.1: TaskRef.cycleKind=execute falls back to caller template (default behaviour)", async () => {
224
+ const coord = makeFake();
225
+ const fake = coord;
226
+ fake.onPoll = (s) => { s.status = "completed"; };
227
+ const runner = new WorkCycleRunner({
228
+ pickNextTask: async () => ({
229
+ id: "t-1",
230
+ title: "Do thing",
231
+ description: "d",
232
+ cycleKind: "execute",
233
+ }),
234
+ swarmCoordinator: coord,
235
+ log: silentLog(),
236
+ initialSettleMs: 0,
237
+ pollIntervalMs: 1,
238
+ sleep: () => Promise.resolve(),
239
+ });
240
+ await runner.run({ projectRoot: tmp.projectRoot, templateName: "dev-team" });
241
+ expect(fake.createCalls[0].options.templateName).toBe("dev-team");
242
+ });
243
+ it("M8.1: research-only template ships and resolves via loadTemplate", () => {
244
+ // Sanity: the template file lives under packages/@clawnet/swarm/templates
245
+ // and parses cleanly. If this fails the runner would crash mid-cycle.
246
+ expect(() => loadTemplate("research-only")).not.toThrow();
247
+ });
248
+ it("C1: default template name actually resolves via loadTemplate", async () => {
249
+ // Integration-style sanity check: rather than spinning up a real
250
+ // SwarmCoordinator (which would drag in the whole role lifecycle), we
251
+ // call loadTemplate directly to prove the literal the runner passes is
252
+ // valid. Pre-hotfix this asserted on "default" which threw "Template not
253
+ // found"; the runner now uses "minimal" which ships with the package.
254
+ expect(() => loadTemplate("minimal")).not.toThrow();
255
+ // TODO(M7-followup): full integration test that wires WorkCycleRunner to a
256
+ // real SwarmCoordinator + loadTemplate via roleSpecs resolution.
257
+ });
258
+ it("coordinator.create throws → result.status === 'failed' with throw message", async () => {
259
+ const coord = makeFake();
260
+ const fake = coord;
261
+ fake.throwOnCreate = new Error("backend missing");
262
+ const runner = new WorkCycleRunner({
263
+ pickNextTask: async () => ({ id: "t-2", title: "Task", description: "do" }),
264
+ swarmCoordinator: coord,
265
+ log: silentLog(),
266
+ initialSettleMs: 0,
267
+ pollIntervalMs: 1,
268
+ sleep: () => Promise.resolve(),
269
+ });
270
+ const result = await runner.run({ projectRoot: tmp.projectRoot });
271
+ expect(result.status).toBe("failed");
272
+ expect(result.error).toMatch(/backend missing/);
273
+ expect(fake.completeCalls).toHaveLength(0);
274
+ expect(fake.failCalls).toHaveLength(0);
275
+ });
276
+ it("PR-B D14: swarm.status flips to 'paused' (queen idle 100min) → runner calls complete, result.status === 'completed'", async () => {
277
+ const coord = makeFake();
278
+ const fake = coord;
279
+ fake.onPoll = (s) => { s.status = "paused"; };
280
+ // Seed shipment on create (D14 keeps the cleanup path so any shipment
281
+ // pipeline still fires; surrounding ingest assertions stay valid).
282
+ const runner = new WorkCycleRunner({
283
+ pickNextTask: async () => ({ id: "t-paused", title: "Task" }),
284
+ swarmCoordinator: coord,
285
+ log: silentLog(),
286
+ initialSettleMs: 0,
287
+ pollIntervalMs: 100,
288
+ sleep: (_ms) => Promise.resolve(),
289
+ });
290
+ const result = await runner.run({ projectRoot: tmp.projectRoot });
291
+ // D14: paused → runner promotes to complete, NOT failed.
292
+ expect(result.status).toBe("completed");
293
+ // Runner called complete() (not destroy / fail) so the cleanup chain
294
+ // runs and any in-progress work gets shipped.
295
+ expect(fake.completeCalls).toHaveLength(1);
296
+ expect(fake.completeCalls[0]).toBe(fake.createCalls[0].swarmId);
297
+ expect(fake.destroyCalls).toHaveLength(0);
298
+ expect(fake.failCalls).toHaveLength(0);
299
+ });
300
+ it("swarm.status flips to 'failed' → fail() called, result.status === 'failed', shipment still loaded", async () => {
301
+ const coord = makeFake();
302
+ const fake = coord;
303
+ fake.onPoll = (s) => { s.status = "failed"; };
304
+ // Seed shipment on create
305
+ const origCreate = fake.create.bind(fake);
306
+ fake.create = async (swarmId, options) => {
307
+ await origCreate(swarmId, options);
308
+ seedShipment(tmp.projectRoot, swarmId, {
309
+ strategy: "diff-only",
310
+ createdAt: new Date().toISOString(),
311
+ diffPath: "/tmp/diff.patch",
312
+ prAttemptError: "no gh CLI",
313
+ });
314
+ };
315
+ const runner = new WorkCycleRunner({
316
+ pickNextTask: async () => ({ id: "t-4", title: "T", description: "d" }),
317
+ swarmCoordinator: coord,
318
+ log: silentLog(),
319
+ initialSettleMs: 0,
320
+ pollIntervalMs: 1,
321
+ sleep: () => Promise.resolve(),
322
+ });
323
+ const result = await runner.run({ projectRoot: tmp.projectRoot });
324
+ expect(result.status).toBe("failed");
325
+ expect(fake.failCalls).toEqual([fake.createCalls[0].swarmId]);
326
+ expect(result.shipment).toBeDefined();
327
+ expect(result.shipment?.strategy).toBe("diff-only");
328
+ });
329
+ it("cycleId is unique across calls", async () => {
330
+ const coord = makeFake();
331
+ const runner = new WorkCycleRunner({
332
+ pickNextTask: async () => null,
333
+ swarmCoordinator: coord,
334
+ log: silentLog(),
335
+ initialSettleMs: 0,
336
+ pollIntervalMs: 1,
337
+ sleep: () => Promise.resolve(),
338
+ });
339
+ const a = await runner.run({ projectRoot: tmp.projectRoot });
340
+ const b = await runner.run({ projectRoot: tmp.projectRoot });
341
+ const c = await runner.run({ projectRoot: tmp.projectRoot });
342
+ expect(a.cycleId).not.toBe(b.cycleId);
343
+ expect(b.cycleId).not.toBe(c.cycleId);
344
+ expect(a.cycleId).not.toBe(c.cycleId);
345
+ // UUID v4 shape (basic sanity — 36 chars with dashes, no overlap of swarmId).
346
+ for (const r of [a, b, c]) {
347
+ expect(r.cycleId).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
348
+ }
349
+ });
350
+ it("swarmId carries 'm7-cycle-' prefix so the UI can identify scheduler-spawned swarms", async () => {
351
+ const coord = makeFake();
352
+ const fake = coord;
353
+ fake.onPoll = (s) => { s.status = "completed"; };
354
+ const runner = new WorkCycleRunner({
355
+ pickNextTask: async () => ({ id: "t-5", title: "Task", description: "d" }),
356
+ swarmCoordinator: coord,
357
+ log: silentLog(),
358
+ initialSettleMs: 0,
359
+ pollIntervalMs: 1,
360
+ sleep: () => Promise.resolve(),
361
+ });
362
+ const result = await runner.run({ projectRoot: tmp.projectRoot });
363
+ expect(result.swarmId.startsWith("m7-cycle-")).toBe(true);
364
+ // The suffix is the cycleId — useful for joining audit logs.
365
+ expect(result.swarmId).toBe(`m7-cycle-${result.cycleId}`);
366
+ expect(fake.createCalls[0].swarmId).toBe(result.swarmId);
367
+ });
368
+ });
369
+ //# sourceMappingURL=workcycle-runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workcycle-runner.test.js","sourceRoot":"","sources":["../../src/__tests__/workcycle-runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workspace-diff.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-diff.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/workspace-diff.test.ts"],"names":[],"mappings":""}