@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,367 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { DiscoveryScheduler } from "../always-on/discovery-scheduler.js";
3
+ import { DEFAULT_TICK_INTERVAL_MS, RECENT_TICKS_CAP, } from "../always-on/types.js";
4
+ // Helper: build a fake clock that advances when we advance vi timers.
5
+ function makeClock(startMs) {
6
+ let nowMs = startMs;
7
+ return {
8
+ now: () => new Date(nowMs),
9
+ advance(ms) { nowMs += ms; },
10
+ set(ms) { nowMs = ms; },
11
+ get ms() { return nowMs; },
12
+ };
13
+ }
14
+ /**
15
+ * Wait microtasks until the scheduler's in-flight tick resolves. vi's
16
+ * fake-timer advance fires the setTimeout synchronously but the runTick body
17
+ * is async, so we need to flush microtasks for the chained .catch / finally
18
+ * (and any user-supplied async gate / onFire) to settle.
19
+ */
20
+ async function flush() {
21
+ // A few yields cover gate-evaluate -> onFire -> finally chains.
22
+ for (let i = 0; i < 5; i++)
23
+ await Promise.resolve();
24
+ }
25
+ describe("DiscoveryScheduler", () => {
26
+ beforeEach(() => { vi.useFakeTimers(); });
27
+ afterEach(() => { vi.useRealTimers(); });
28
+ it("mode=off → start() is no-op; snapshot shows nextTickAt: null", () => {
29
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
30
+ const onFire = vi.fn().mockResolvedValue(undefined);
31
+ const s = new DiscoveryScheduler({ mode: "off", now: clock.now, onFire });
32
+ s.start();
33
+ expect(s.snapshot().nextTickAt).toBeNull();
34
+ expect(s.snapshot().mode).toBe("off");
35
+ vi.advanceTimersByTime(60 * 60 * 1000);
36
+ expect(onFire).not.toHaveBeenCalled();
37
+ });
38
+ it("mode=active → start() schedules timer; tick fires onFire", async () => {
39
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
40
+ const onFire = vi.fn().mockResolvedValue(undefined);
41
+ const s = new DiscoveryScheduler({ mode: "active", now: clock.now, onFire });
42
+ s.start();
43
+ const next = s.snapshot().nextTickAt;
44
+ expect(next).not.toBeNull();
45
+ expect(next.getTime() - clock.ms).toBe(DEFAULT_TICK_INTERVAL_MS.active);
46
+ clock.advance(DEFAULT_TICK_INTERVAL_MS.active);
47
+ vi.advanceTimersByTime(DEFAULT_TICK_INTERVAL_MS.active);
48
+ await flush();
49
+ expect(onFire).toHaveBeenCalledTimes(1);
50
+ const snap = s.snapshot();
51
+ expect(snap.ticksToday).toBe(1);
52
+ expect(snap.lastFireAt).not.toBeNull();
53
+ expect(snap.recentTicks[0].decision).toBe("fired");
54
+ s.stop();
55
+ });
56
+ it("dailyBudget=3 → 4th tick is skipped with reason 'daily budget exhausted'", async () => {
57
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
58
+ const onFire = vi.fn().mockResolvedValue(undefined);
59
+ const s = new DiscoveryScheduler({
60
+ mode: "active",
61
+ dailyBudget: 3,
62
+ tickInterval: 1000,
63
+ now: clock.now,
64
+ onFire,
65
+ });
66
+ s.start();
67
+ for (let i = 0; i < 4; i++) {
68
+ clock.advance(1000);
69
+ vi.advanceTimersByTime(1000);
70
+ await flush();
71
+ }
72
+ expect(onFire).toHaveBeenCalledTimes(3);
73
+ const snap = s.snapshot();
74
+ expect(snap.ticksToday).toBe(3);
75
+ expect(snap.recentTicks).toHaveLength(4);
76
+ const last = snap.recentTicks[3];
77
+ expect(last.decision).toBe("skipped");
78
+ const skipper = last.gateBreakdown.at(-1);
79
+ expect(skipper.gate).toBe("dailyBudget");
80
+ expect(skipper.decision.kind).toBe("skip");
81
+ if (skipper.decision.kind === "skip") {
82
+ expect(skipper.decision.reason).toMatch(/daily budget exhausted/i);
83
+ }
84
+ s.stop();
85
+ });
86
+ it("user gate returns skip → onFire not called; breakdown shows gate that skipped", async () => {
87
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
88
+ const onFire = vi.fn().mockResolvedValue(undefined);
89
+ const blocker = {
90
+ name: "userBlocker",
91
+ evaluate: () => ({ kind: "skip", reason: "user is typing" }),
92
+ };
93
+ const s = new DiscoveryScheduler({
94
+ mode: "active",
95
+ tickInterval: 500,
96
+ gates: [blocker],
97
+ now: clock.now,
98
+ onFire,
99
+ });
100
+ s.start();
101
+ clock.advance(500);
102
+ vi.advanceTimersByTime(500);
103
+ await flush();
104
+ expect(onFire).not.toHaveBeenCalled();
105
+ const last = s.snapshot().recentTicks.at(-1);
106
+ expect(last.decision).toBe("skipped");
107
+ const lastGate = last.gateBreakdown.at(-1);
108
+ expect(lastGate.gate).toBe("userBlocker");
109
+ // built-ins evaluated and passed before the user gate
110
+ expect(last.gateBreakdown.map(g => g.gate)).toEqual([
111
+ "modeNotOff", "dailyBudget", "userBlocker",
112
+ ]);
113
+ s.stop();
114
+ });
115
+ it("user gate returns halt → scheduler stops; subsequent ticks no-op", async () => {
116
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
117
+ const onFire = vi.fn().mockResolvedValue(undefined);
118
+ const halter = {
119
+ name: "halter",
120
+ evaluate: () => ({ kind: "halt", reason: "config broken" }),
121
+ };
122
+ const s = new DiscoveryScheduler({
123
+ mode: "active",
124
+ tickInterval: 500,
125
+ gates: [halter],
126
+ now: clock.now,
127
+ onFire,
128
+ });
129
+ s.start();
130
+ clock.advance(500);
131
+ vi.advanceTimersByTime(500);
132
+ await flush();
133
+ const snap1 = s.snapshot();
134
+ expect(snap1.recentTicks.at(-1).decision).toBe("halted");
135
+ expect(snap1.nextTickAt).toBeNull();
136
+ expect(onFire).not.toHaveBeenCalled();
137
+ // start() after halt is a no-op
138
+ s.start();
139
+ expect(s.snapshot().nextTickAt).toBeNull();
140
+ // future timer advance — nothing fires
141
+ vi.advanceTimersByTime(60_000);
142
+ await flush();
143
+ expect(onFire).not.toHaveBeenCalled();
144
+ });
145
+ it("setMode('aggressive') while running → next tick uses new interval", async () => {
146
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
147
+ const s = new DiscoveryScheduler({ mode: "active", now: clock.now });
148
+ s.start();
149
+ expect(s.snapshot().nextTickAt.getTime() - clock.ms).toBe(DEFAULT_TICK_INTERVAL_MS.active);
150
+ s.setMode("aggressive");
151
+ expect(s.snapshot().nextTickAt.getTime() - clock.ms).toBe(DEFAULT_TICK_INTERVAL_MS.aggressive);
152
+ s.stop();
153
+ });
154
+ it("setMode('off') while running → stops; next tick won't fire", async () => {
155
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
156
+ const onFire = vi.fn().mockResolvedValue(undefined);
157
+ const s = new DiscoveryScheduler({
158
+ mode: "active", tickInterval: 1000, now: clock.now, onFire,
159
+ });
160
+ s.start();
161
+ s.setMode("off");
162
+ expect(s.snapshot().nextTickAt).toBeNull();
163
+ clock.advance(5000);
164
+ vi.advanceTimersByTime(5000);
165
+ await flush();
166
+ expect(onFire).not.toHaveBeenCalled();
167
+ });
168
+ it("tickNow() bypasses interval but runs gates (dailyBudget still applies)", async () => {
169
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
170
+ const onFire = vi.fn().mockResolvedValue(undefined);
171
+ const s = new DiscoveryScheduler({
172
+ mode: "active",
173
+ dailyBudget: 2,
174
+ tickInterval: 1_000_000, // huge — wouldn't fire on its own in this test
175
+ now: clock.now,
176
+ onFire,
177
+ });
178
+ s.start();
179
+ const r1 = await s.tickNow();
180
+ const r2 = await s.tickNow();
181
+ const r3 = await s.tickNow();
182
+ expect(r1.decision).toBe("fired");
183
+ expect(r2.decision).toBe("fired");
184
+ expect(r3.decision).toBe("skipped");
185
+ expect(onFire).toHaveBeenCalledTimes(2);
186
+ expect(s.snapshot().ticksToday).toBe(2);
187
+ s.stop();
188
+ });
189
+ it("daily reset across midnight zeroes ticksToday", async () => {
190
+ // Use local-noon to avoid any UTC/local boundary surprises in toDateString.
191
+ const day1Noon = new Date(2026, 5, 5, 12, 0, 0).getTime();
192
+ const clock = makeClock(day1Noon);
193
+ const onFire = vi.fn().mockResolvedValue(undefined);
194
+ const s = new DiscoveryScheduler({
195
+ mode: "active",
196
+ dailyBudget: 1,
197
+ tickInterval: 1_000_000,
198
+ now: clock.now,
199
+ onFire,
200
+ });
201
+ s.start();
202
+ const a = await s.tickNow();
203
+ expect(a.decision).toBe("fired");
204
+ const b = await s.tickNow();
205
+ expect(b.decision).toBe("skipped"); // budget=1 exhausted
206
+ // Jump to noon next day
207
+ clock.advance(24 * 60 * 60 * 1000);
208
+ const c = await s.tickNow();
209
+ expect(c.decision).toBe("fired");
210
+ expect(s.snapshot().ticksToday).toBe(1); // reset then incremented
211
+ s.stop();
212
+ });
213
+ it("onFire throw → I1: does NOT burn budget; ticksToday stays 0; next tick still scheduled", async () => {
214
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
215
+ const onFire = vi.fn()
216
+ .mockRejectedValueOnce(new Error("boom"))
217
+ .mockResolvedValue(undefined);
218
+ const s = new DiscoveryScheduler({
219
+ mode: "active",
220
+ tickInterval: 1000,
221
+ now: clock.now,
222
+ onFire,
223
+ });
224
+ s.start();
225
+ clock.advance(1000);
226
+ vi.advanceTimersByTime(1000);
227
+ await flush();
228
+ // I1 hotfix: rejected onFire is now recorded as "skipped" so the daily
229
+ // quota isn't silently spent. Three template-not-found failures used to
230
+ // lock the project for the day; they now keep retrying.
231
+ expect(onFire).toHaveBeenCalledTimes(1);
232
+ expect(s.snapshot().ticksToday).toBe(0);
233
+ const failedRecord = s.snapshot().recentTicks.at(-1);
234
+ expect(failedRecord.decision).toBe("skipped");
235
+ const lastGate = failedRecord.gateBreakdown.at(-1);
236
+ expect(lastGate.gate).toBe("onFire");
237
+ expect(lastGate.decision.kind).toBe("skip");
238
+ expect(s.snapshot().nextTickAt).not.toBeNull();
239
+ // Second tick — onFire resolves, ticksToday goes to 1.
240
+ clock.advance(1000);
241
+ vi.advanceTimersByTime(1000);
242
+ await flush();
243
+ expect(onFire).toHaveBeenCalledTimes(2);
244
+ expect(s.snapshot().ticksToday).toBe(1);
245
+ s.stop();
246
+ });
247
+ it("recentTicks ring buffer caps at 10", async () => {
248
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
249
+ const s = new DiscoveryScheduler({
250
+ mode: "active",
251
+ dailyBudget: null, // unlimited so we can produce >10 fires
252
+ tickInterval: 1000,
253
+ now: clock.now,
254
+ onFire: async () => { },
255
+ });
256
+ s.start();
257
+ for (let i = 0; i < 15; i++) {
258
+ clock.advance(1000);
259
+ vi.advanceTimersByTime(1000);
260
+ await flush();
261
+ }
262
+ const snap = s.snapshot();
263
+ expect(snap.recentTicks).toHaveLength(RECENT_TICKS_CAP);
264
+ expect(snap.ticksToday).toBe(15);
265
+ s.stop();
266
+ });
267
+ it("concurrent tickNow() rejects the second caller", async () => {
268
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
269
+ let resolveOnFire;
270
+ const onFire = vi.fn().mockImplementation(() => new Promise((res) => { resolveOnFire = res; }));
271
+ const s = new DiscoveryScheduler({
272
+ mode: "active",
273
+ tickInterval: 1_000_000,
274
+ now: clock.now,
275
+ onFire,
276
+ });
277
+ s.start();
278
+ const p1 = s.tickNow(); // starts; onFire pending
279
+ await flush(); // let runTick reach onFire await
280
+ await expect(s.tickNow()).rejects.toThrow(/already in progress/i);
281
+ resolveOnFire();
282
+ const r1 = await p1;
283
+ expect(r1.decision).toBe("fired");
284
+ // After resolution, tickNow works again.
285
+ const p2 = s.tickNow();
286
+ await flush();
287
+ resolveOnFire();
288
+ const r2 = await p2;
289
+ expect(r2.decision).toBe("fired");
290
+ s.stop();
291
+ });
292
+ it("user gate after a skip is NOT evaluated (short-circuit)", async () => {
293
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
294
+ const second = vi.fn()
295
+ .mockReturnValue({ kind: "fire" });
296
+ const skipper = {
297
+ name: "skipper",
298
+ evaluate: () => ({ kind: "skip", reason: "nope" }),
299
+ };
300
+ const after = { name: "after", evaluate: second };
301
+ const onFire = vi.fn().mockResolvedValue(undefined);
302
+ const s = new DiscoveryScheduler({
303
+ mode: "active", tickInterval: 1000, gates: [skipper, after], now: clock.now, onFire,
304
+ });
305
+ s.start();
306
+ clock.advance(1000);
307
+ vi.advanceTimersByTime(1000);
308
+ await flush();
309
+ expect(second).not.toHaveBeenCalled();
310
+ expect(onFire).not.toHaveBeenCalled();
311
+ s.stop();
312
+ });
313
+ it("onTick observer receives every record", async () => {
314
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
315
+ const seen = [];
316
+ const s = new DiscoveryScheduler({
317
+ mode: "active", tickInterval: 1000, dailyBudget: 1,
318
+ now: clock.now, onFire: async () => { },
319
+ onTick: (r) => { seen.push(r); },
320
+ });
321
+ s.start();
322
+ for (let i = 0; i < 3; i++) {
323
+ clock.advance(1000);
324
+ vi.advanceTimersByTime(1000);
325
+ await flush();
326
+ }
327
+ expect(seen.map(r => r.decision)).toEqual(["fired", "skipped", "skipped"]);
328
+ s.stop();
329
+ });
330
+ /**
331
+ * M8.2 — IntrospectionSource integration property.
332
+ *
333
+ * The introspection source returns null from pick() (it spawns its own
334
+ * swarm side-effectfully and never produces a TaskRef). In the discovery
335
+ * scheduler's worldview, that just means onFire ran. If the onFire callback
336
+ * resolves (the work cycle completed cleanly even though it picked no
337
+ * task), ticksToday DOES increment — same as any other "empty cascade"
338
+ * cycle. The brief proposed the opposite ("budget NOT charged") but the
339
+ * scheduler's I1 hotfix only excludes onFire THROWS, not resolved-empty
340
+ * cycles. Until AlwaysOnManager.onFire decides to throw on result.status
341
+ * === "skipped" (a behavior change deliberately out of scope for M8.2 —
342
+ * see deviations in the PR), this test pins the actual behavior so any
343
+ * future change is explicit.
344
+ */
345
+ it("M8.2: onFire resolved (introspection side-effect, no TaskRef) still increments ticksToday", async () => {
346
+ const clock = makeClock(Date.UTC(2026, 5, 5, 9, 0, 0));
347
+ // Simulates AlwaysOnManager.onFire when the cascade only has an
348
+ // introspection rung: the source did its work + returned null, the
349
+ // runner reported status=skipped, and the manager's onFire callback
350
+ // resolved without throwing.
351
+ const onFire = vi.fn().mockResolvedValue(undefined);
352
+ const s = new DiscoveryScheduler({
353
+ mode: "active",
354
+ tickInterval: 1000,
355
+ now: clock.now,
356
+ onFire,
357
+ });
358
+ s.start();
359
+ clock.advance(1000);
360
+ vi.advanceTimersByTime(1000);
361
+ await flush();
362
+ expect(onFire).toHaveBeenCalledTimes(1);
363
+ expect(s.snapshot().ticksToday).toBe(1);
364
+ s.stop();
365
+ });
366
+ });
367
+ //# sourceMappingURL=discovery-scheduler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-scheduler.test.js","sourceRoot":"","sources":["../../src/__tests__/discovery-scheduler.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=env-forward-e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-forward-e2e.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/env-forward-e2e.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { spawn } from "node:child_process";
3
+ import { mkdtempSync, writeFileSync, rmSync, readFileSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ /**
7
+ * Scaled-down E2E: pins the contract that the spawn pattern used by
8
+ * claude-adapter / codex-adapter — `env: { ...process.env, ...options.env }`
9
+ * — actually delivers CLAWNET_PROJECT_ROOT to the spawned MCP child.
10
+ *
11
+ * Not a full CLI-in-the-loop test (that would need a real claude/codex
12
+ * binary). A future regression where an adapter is rewritten to
13
+ * `env: process.env` (dropping options.env) would need a follow-up
14
+ * integration test against real CLI to catch.
15
+ */
16
+ describe("CLAWNET_PROJECT_ROOT env forwarding (scaled-down E2E)", () => {
17
+ it("env passed to spawn options reaches the child via merge-over-process.env", async () => {
18
+ const tmp = mkdtempSync(join(tmpdir(), "env-e2e-"));
19
+ const probePath = join(tmp, "probe.txt");
20
+ const probeScript = join(tmp, "probe.js");
21
+ // a 1-line "MCP child stub" that writes CLAWNET_PROJECT_ROOT to a file
22
+ writeFileSync(probeScript, `require("node:fs").writeFileSync(${JSON.stringify(probePath)}, process.env.CLAWNET_PROJECT_ROOT || "MISSING");`);
23
+ // Emulate the claude-adapter spawn signature: { ...process.env, ...options.env }
24
+ const ENV_FROM_COORDINATOR = { CLAWNET_PROJECT_ROOT: "/my/real/project" };
25
+ await new Promise((resolve, reject) => {
26
+ const child = spawn("node", [probeScript], {
27
+ env: { ...process.env, ...ENV_FROM_COORDINATOR },
28
+ stdio: "ignore",
29
+ });
30
+ child.on("error", reject);
31
+ child.on("exit", (code) => (code === 0 ? resolve() : reject(new Error(`exit ${code}`))));
32
+ });
33
+ expect(readFileSync(probePath, "utf-8")).toBe("/my/real/project");
34
+ rmSync(tmp, { recursive: true, force: true });
35
+ });
36
+ it("env from options OVERRIDES the same key in parent process.env", async () => {
37
+ const tmp = mkdtempSync(join(tmpdir(), "env-e2e-"));
38
+ const probePath = join(tmp, "probe.txt");
39
+ const probeScript = join(tmp, "probe.js");
40
+ writeFileSync(probeScript, `require("node:fs").writeFileSync(${JSON.stringify(probePath)}, process.env.CLAWNET_PROJECT_ROOT || "MISSING");`);
41
+ // Parent has one value; coordinator overrides with another. Spread order
42
+ // guarantees override.
43
+ const parentEnv = { ...process.env, CLAWNET_PROJECT_ROOT: "/parent/leak" };
44
+ const overrideEnv = { CLAWNET_PROJECT_ROOT: "/coordinator/win" };
45
+ await new Promise((resolve, reject) => {
46
+ const child = spawn("node", [probeScript], {
47
+ env: { ...parentEnv, ...overrideEnv },
48
+ stdio: "ignore",
49
+ });
50
+ child.on("error", reject);
51
+ child.on("exit", (code) => (code === 0 ? resolve() : reject(new Error(`exit ${code}`))));
52
+ });
53
+ expect(readFileSync(probePath, "utf-8")).toBe("/coordinator/win");
54
+ rmSync(tmp, { recursive: true, force: true });
55
+ });
56
+ });
57
+ //# sourceMappingURL=env-forward-e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-forward-e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/env-forward-e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gh-pr-creator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-pr-creator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/gh-pr-creator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { createDraftPR } from "../shipment/gh-pr-creator.js";
3
+ function makeRunner(responses, capturedStdin) {
4
+ return async (cmd, args, opts) => {
5
+ if (opts.stdin && capturedStdin)
6
+ capturedStdin.push(opts.stdin);
7
+ const key = `${cmd} ${args.slice(0, 3).join(" ")}`;
8
+ for (const k of Object.keys(responses)) {
9
+ if (key.startsWith(k))
10
+ return {
11
+ exitCode: responses[k].exitCode,
12
+ stdout: responses[k].stdout ?? "",
13
+ stderr: responses[k].stderr ?? "",
14
+ };
15
+ }
16
+ throw new Error(`unexpected runner call: ${cmd} ${args.join(" ")}`);
17
+ };
18
+ }
19
+ describe("createDraftPR", () => {
20
+ const baseInput = {
21
+ cwd: "/wt",
22
+ branchName: "clawnet/swarm-abc",
23
+ baseBranch: "main",
24
+ title: "swarm: do the thing",
25
+ bodyMarkdown: "# Summary\nDid stuff.",
26
+ };
27
+ it("happy path: push then gh create returns parsed URL", async () => {
28
+ const captured = [];
29
+ const runner = makeRunner({
30
+ "git push": { exitCode: 0 },
31
+ "gh pr create": {
32
+ exitCode: 0,
33
+ stdout: "Creating draft pull request...\nhttps://github.com/org/repo/pull/42\n",
34
+ },
35
+ }, captured);
36
+ const r = await createDraftPR(baseInput, { runner });
37
+ expect(r.ok).toBe(true);
38
+ if (r.ok)
39
+ expect(r.url).toBe("https://github.com/org/repo/pull/42");
40
+ expect(captured).toEqual(["# Summary\nDid stuff."]);
41
+ });
42
+ it("push failure: returns step=push, no gh call", async () => {
43
+ let ghCalled = false;
44
+ const runner = async (cmd) => {
45
+ if (cmd === "gh") {
46
+ ghCalled = true;
47
+ return { exitCode: 0, stdout: "", stderr: "" };
48
+ }
49
+ return { exitCode: 1, stdout: "", stderr: "remote rejected" };
50
+ };
51
+ const r = await createDraftPR(baseInput, { runner });
52
+ expect(r.ok).toBe(false);
53
+ if (!r.ok) {
54
+ expect(r.step).toBe("push");
55
+ expect(r.error).toContain("remote rejected");
56
+ }
57
+ expect(ghCalled).toBe(false);
58
+ });
59
+ it("gh create failure: returns step=create with stderr", async () => {
60
+ const runner = makeRunner({
61
+ "git push": { exitCode: 0 },
62
+ "gh pr create": { exitCode: 1, stderr: "must specify --base" },
63
+ });
64
+ const r = await createDraftPR(baseInput, { runner });
65
+ expect(r.ok).toBe(false);
66
+ if (!r.ok) {
67
+ expect(r.step).toBe("create");
68
+ expect(r.error).toContain("must specify --base");
69
+ }
70
+ });
71
+ it("parse failure: gh succeeds but no URL in stdout", async () => {
72
+ const runner = makeRunner({
73
+ "git push": { exitCode: 0 },
74
+ "gh pr create": { exitCode: 0, stdout: "weird output without a URL" },
75
+ });
76
+ const r = await createDraftPR(baseInput, { runner });
77
+ expect(r.ok).toBe(false);
78
+ if (!r.ok) {
79
+ expect(r.step).toBe("parse");
80
+ expect(r.error).toContain("weird output");
81
+ }
82
+ });
83
+ it("validates non-empty inputs", async () => {
84
+ const runner = makeRunner({});
85
+ for (const bad of [
86
+ { ...baseInput, branchName: "" },
87
+ { ...baseInput, title: "" },
88
+ { ...baseInput, baseBranch: "" },
89
+ { ...baseInput, cwd: "" },
90
+ ]) {
91
+ const r = await createDraftPR(bad, { runner });
92
+ expect(r.ok).toBe(false);
93
+ }
94
+ });
95
+ it("special chars in title go through gh argv (not stdin)", async () => {
96
+ const runner = makeRunner({
97
+ "git push": { exitCode: 0 },
98
+ "gh pr create": { exitCode: 0, stdout: "https://github.com/x/y/pull/1" },
99
+ });
100
+ const r = await createDraftPR({
101
+ ...baseInput,
102
+ title: 'Backticks `code` and "quotes" and $vars',
103
+ }, { runner });
104
+ expect(r.ok).toBe(true);
105
+ });
106
+ });
107
+ //# sourceMappingURL=gh-pr-creator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-pr-creator.test.js","sourceRoot":"","sources":["../../src/__tests__/gh-pr-creator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=git-worktree-provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-worktree-provider.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/git-worktree-provider.test.ts"],"names":[],"mappings":""}