@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,98 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { mkdtempSync, writeFileSync, rmSync, existsSync } from "node:fs";
3
+ import { execSync } from "node:child_process";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { GitWorktreeProvider } from "../workspace/git-worktree-provider.js";
7
+ function setupRepo() {
8
+ const dir = mkdtempSync(join(tmpdir(), "gwp-"));
9
+ execSync("git init -q", { cwd: dir });
10
+ execSync("git config user.email t@t.t && git config user.name t", { cwd: dir, shell: "/bin/sh" });
11
+ writeFileSync(join(dir, "README.md"), "# t\n");
12
+ execSync("git add -A && git commit -q -m init", { cwd: dir, shell: "/bin/sh" });
13
+ return dir;
14
+ }
15
+ describe("GitWorktreeProvider", () => {
16
+ it("isApplicable: true for clean git repo", async () => {
17
+ const dir = setupRepo();
18
+ const p = new GitWorktreeProvider();
19
+ expect(await p.isApplicable(dir)).toBe(true);
20
+ rmSync(dir, { recursive: true, force: true });
21
+ });
22
+ it("isApplicable: false for non-git dir", async () => {
23
+ const dir = mkdtempSync(join(tmpdir(), "non-git-"));
24
+ const p = new GitWorktreeProvider();
25
+ expect(await p.isApplicable(dir)).toBe(false);
26
+ rmSync(dir, { recursive: true, force: true });
27
+ });
28
+ it("isApplicable: false when working tree dirty", async () => {
29
+ const dir = setupRepo();
30
+ writeFileSync(join(dir, "dirty.txt"), "x");
31
+ const p = new GitWorktreeProvider();
32
+ expect(await p.isApplicable(dir)).toBe(false);
33
+ rmSync(dir, { recursive: true, force: true });
34
+ });
35
+ it("prepare: creates worktree at <projectRoot>/.worktrees/<swarmId> on a new branch", async () => {
36
+ const dir = setupRepo();
37
+ const p = new GitWorktreeProvider();
38
+ const h = await p.prepare({ swarmId: "swarm-abc", projectRoot: dir });
39
+ expect(h.cwd).toBe(join(dir, ".worktrees", "swarm-abc"));
40
+ expect(h.strategy).toBe("git-worktree");
41
+ expect(h.metadata.branchName).toBe("clawnet/swarm-swarm-abc");
42
+ expect(existsSync(h.cwd)).toBe(true);
43
+ expect(existsSync(join(h.cwd, "README.md"))).toBe(true);
44
+ await p.dispose(h, { keep: false });
45
+ expect(existsSync(h.cwd)).toBe(false);
46
+ rmSync(dir, { recursive: true, force: true });
47
+ });
48
+ it("dispose: keep=true leaves worktree on disk", async () => {
49
+ const dir = setupRepo();
50
+ const p = new GitWorktreeProvider();
51
+ const h = await p.prepare({ swarmId: "keep-me", projectRoot: dir });
52
+ await p.dispose(h, { keep: true });
53
+ expect(existsSync(h.cwd)).toBe(true);
54
+ rmSync(dir, { recursive: true, force: true });
55
+ });
56
+ it("dispose: idempotent — removing twice does not throw", async () => {
57
+ const dir = setupRepo();
58
+ const p = new GitWorktreeProvider();
59
+ const h = await p.prepare({ swarmId: "idem", projectRoot: dir });
60
+ await p.dispose(h, { keep: false });
61
+ await expect(p.dispose(h, { keep: false })).resolves.not.toThrow();
62
+ rmSync(dir, { recursive: true, force: true });
63
+ });
64
+ // After a crash, a stale worktree dir + branch may exist. A retry with the
65
+ // same swarmId must scrub-and-recreate rather than fail with "already exists".
66
+ it("prepare: scrubs a stale worktree at the same path/branch before re-creating", async () => {
67
+ const dir = setupRepo();
68
+ const p = new GitWorktreeProvider();
69
+ const h1 = await p.prepare({ swarmId: "stale", projectRoot: dir });
70
+ // Simulate a crash: leave files on disk + branch in place; do NOT call dispose.
71
+ writeFileSync(join(h1.cwd, "leftover.txt"), "from old run");
72
+ // Re-prepare with the same swarmId should succeed.
73
+ const h2 = await p.prepare({ swarmId: "stale", projectRoot: dir });
74
+ expect(existsSync(h2.cwd)).toBe(true);
75
+ // The leftover file from h1 must be gone (worktree was scrubbed)
76
+ expect(existsSync(join(h2.cwd, "leftover.txt"))).toBe(false);
77
+ await p.dispose(h2, { keep: false });
78
+ rmSync(dir, { recursive: true, force: true });
79
+ });
80
+ it("dispose: preserves branch with unmerged commits (uses branch -d not -D)", async () => {
81
+ const dir = setupRepo();
82
+ const p = new GitWorktreeProvider();
83
+ const h = await p.prepare({ swarmId: "with-commit", projectRoot: dir });
84
+ // make a commit on the worktree branch — represents work that would be lost
85
+ writeFileSync(join(h.cwd, "x"), "new");
86
+ execSync("git add -A && git commit -q -m work", { cwd: h.cwd, shell: "/bin/sh" });
87
+ await p.dispose(h, { keep: false });
88
+ // worktree dir is removed
89
+ expect(existsSync(h.cwd)).toBe(false);
90
+ // but branch is preserved (branch -d refused because unmerged)
91
+ const branches = execSync("git branch --list 'clawnet/swarm-*'", { cwd: dir }).toString();
92
+ expect(branches).toContain(h.metadata.branchName);
93
+ // cleanup
94
+ execSync(`git -C ${dir} branch -D ${h.metadata.branchName}`, { shell: "/bin/sh" });
95
+ rmSync(dir, { recursive: true, force: true });
96
+ });
97
+ });
98
+ //# sourceMappingURL=git-worktree-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-worktree-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/git-worktree-provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gitignore-check.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore-check.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/gitignore-check.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { mkdtempSync, writeFileSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { isWorktreesIgnored } from "../workspace/gitignore-check.js";
6
+ describe("isWorktreesIgnored", () => {
7
+ it("true when .gitignore contains .worktrees/", () => {
8
+ const dir = mkdtempSync(join(tmpdir(), "gi-"));
9
+ writeFileSync(join(dir, ".gitignore"), "node_modules/\n.worktrees/\n");
10
+ expect(isWorktreesIgnored(dir)).toBe(true);
11
+ rmSync(dir, { recursive: true, force: true });
12
+ });
13
+ it("true for variants .worktrees, /.worktrees, .worktrees/**", () => {
14
+ const dir = mkdtempSync(join(tmpdir(), "gi-"));
15
+ for (const line of [".worktrees", "/.worktrees", ".worktrees/", "/.worktrees/", ".worktrees/**"]) {
16
+ writeFileSync(join(dir, ".gitignore"), line + "\n");
17
+ expect(isWorktreesIgnored(dir), `line: ${line}`).toBe(true);
18
+ }
19
+ rmSync(dir, { recursive: true, force: true });
20
+ });
21
+ it("false when .gitignore missing the entry", () => {
22
+ const dir = mkdtempSync(join(tmpdir(), "gi-"));
23
+ writeFileSync(join(dir, ".gitignore"), "node_modules/\n");
24
+ expect(isWorktreesIgnored(dir)).toBe(false);
25
+ rmSync(dir, { recursive: true, force: true });
26
+ });
27
+ it("false when .gitignore does not exist", () => {
28
+ const dir = mkdtempSync(join(tmpdir(), "gi-"));
29
+ expect(isWorktreesIgnored(dir)).toBe(false);
30
+ rmSync(dir, { recursive: true, force: true });
31
+ });
32
+ it("ignores commented-out lines", () => {
33
+ const dir = mkdtempSync(join(tmpdir(), "gi-"));
34
+ writeFileSync(join(dir, ".gitignore"), "# .worktrees/\n\n");
35
+ expect(isWorktreesIgnored(dir)).toBe(false);
36
+ rmSync(dir, { recursive: true, force: true });
37
+ });
38
+ });
39
+ //# sourceMappingURL=gitignore-check.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore-check.test.js","sourceRoot":"","sources":["../../src/__tests__/gitignore-check.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=idea-research-source.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea-research-source.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/idea-research-source.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,425 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync, utimesSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { encodeCwd } from "@mclawnet/shared";
6
+ import { createIdeaResearchSource, sortIdeasForResearch, parseReportFrontmatter, normaliseConclusion, } from "../always-on/task-sources/idea-research-source.js";
7
+ function makeIdea(over) {
8
+ return {
9
+ id: "i1",
10
+ userId: "u1",
11
+ projectId: encodeCwd("/proj"),
12
+ title: "title",
13
+ body: "",
14
+ status: "idea",
15
+ priority: "medium",
16
+ tags: [],
17
+ sourceSessionId: null,
18
+ sourceMessageId: null,
19
+ sourceSwarmId: null,
20
+ sourceRole: null,
21
+ linkedSessionId: null,
22
+ linkedSwarmTaskId: null,
23
+ researchReports: [],
24
+ researchKind: null,
25
+ createdAt: "2026-01-01T00:00:00.000Z",
26
+ updatedAt: "2026-01-01T00:00:00.000Z",
27
+ ...over,
28
+ };
29
+ }
30
+ function makeClient(opts) {
31
+ return {
32
+ async list() {
33
+ if (opts.throwOnList)
34
+ throw new Error("net down");
35
+ return opts.list ?? [];
36
+ },
37
+ async get(id) {
38
+ return opts.byId?.[id] ?? opts.list?.find((i) => i.id === id) ?? null;
39
+ },
40
+ async patch(id, partial) {
41
+ opts.onPatch?.(id, partial);
42
+ const base = opts.byId?.[id] ?? opts.list?.find((i) => i.id === id) ?? makeIdea({ id });
43
+ return { ...base, ...partial };
44
+ },
45
+ async create(input) {
46
+ // Not exercised by IdeaResearchSource; satisfies the interface for M8.2.
47
+ return makeIdea({ id: "created", title: input.title });
48
+ },
49
+ };
50
+ }
51
+ // ── parseReportFrontmatter ─────────────────────────────────────────────
52
+ describe("parseReportFrontmatter", () => {
53
+ it("extracts conclusion from a basic frontmatter block", () => {
54
+ const out = parseReportFrontmatter("---\nconclusion: promote\n---\nbody here");
55
+ expect(out).toEqual({ conclusion: "promote" });
56
+ });
57
+ it("returns null when no frontmatter is present", () => {
58
+ expect(parseReportFrontmatter("plain body without delimiters")).toBeNull();
59
+ });
60
+ it("strips quoted values and handles CRLF line endings", () => {
61
+ const out = parseReportFrontmatter("---\r\nconclusion: \"archive\"\r\ntitle: 'foo'\r\n---\r\nbody");
62
+ expect(out).toEqual({ conclusion: "archive", title: "foo" });
63
+ });
64
+ });
65
+ // ── normaliseConclusion ────────────────────────────────────────────────
66
+ describe("normaliseConclusion", () => {
67
+ it("accepts canonical values", () => {
68
+ expect(normaliseConclusion("promote")).toBe("promote");
69
+ expect(normaliseConclusion("archive")).toBe("archive");
70
+ expect(normaliseConclusion("needs-info")).toBe("needs-info");
71
+ });
72
+ it("tolerates casing + whitespace + dash variants", () => {
73
+ expect(normaliseConclusion("PROMOTE")).toBe("promote");
74
+ expect(normaliseConclusion(" Archive ")).toBe("archive");
75
+ expect(normaliseConclusion("needs info")).toBe("needs-info");
76
+ expect(normaliseConclusion("needsInfo")).toBe("needs-info");
77
+ });
78
+ it("returns null for unknown values", () => {
79
+ expect(normaliseConclusion("maybe")).toBeNull();
80
+ expect(normaliseConclusion("")).toBeNull();
81
+ expect(normaliseConclusion(undefined)).toBeNull();
82
+ });
83
+ });
84
+ // ── sortIdeasForResearch ───────────────────────────────────────────────
85
+ describe("sortIdeasForResearch", () => {
86
+ it("sorts priority desc then updatedAt asc", () => {
87
+ const high = makeIdea({ id: "high", priority: "high", updatedAt: "2026-01-05T00:00:00Z" });
88
+ const med1 = makeIdea({ id: "m1", priority: "medium", updatedAt: "2026-01-02T00:00:00Z" });
89
+ const med2 = makeIdea({ id: "m2", priority: "medium", updatedAt: "2026-01-04T00:00:00Z" });
90
+ const low = makeIdea({ id: "low", priority: "low", updatedAt: "2026-01-01T00:00:00Z" });
91
+ const sorted = sortIdeasForResearch([low, med2, high, med1]);
92
+ expect(sorted.map((i) => i.id)).toEqual(["high", "m1", "m2", "low"]);
93
+ });
94
+ });
95
+ // ── IdeaResearchSource ─────────────────────────────────────────────────
96
+ describe("IdeaResearchSource", () => {
97
+ const projectRoot = "/proj";
98
+ const projectId = encodeCwd(projectRoot);
99
+ it("returns null when ideas list is empty", async () => {
100
+ const source = createIdeaResearchSource({ ideasClient: makeClient({ list: [] }) });
101
+ expect(await source.pick(projectRoot)).toBeNull();
102
+ });
103
+ it("filters by status=idea and projectId, picks highest priority oldest first", async () => {
104
+ const ideas = [
105
+ makeIdea({ id: "low", priority: "low", projectId }),
106
+ makeIdea({ id: "highnew", priority: "high", projectId, updatedAt: "2026-02-01T00:00:00Z" }),
107
+ makeIdea({
108
+ id: "highold",
109
+ priority: "high",
110
+ projectId,
111
+ updatedAt: "2026-01-15T00:00:00Z",
112
+ body: "investigate this",
113
+ }),
114
+ // status=todo should NOT be picked up by the research source.
115
+ makeIdea({ id: "todo", priority: "high", status: "todo", projectId }),
116
+ ];
117
+ const source = createIdeaResearchSource({ ideasClient: makeClient({ list: ideas }) });
118
+ const ref = await source.pick(projectRoot);
119
+ expect(ref).toEqual({
120
+ id: "highold",
121
+ title: "title",
122
+ description: "investigate this",
123
+ sourceKind: "idea-research",
124
+ sourceId: "highold",
125
+ projectRoot,
126
+ cycleKind: "research",
127
+ });
128
+ });
129
+ it("returns null when list throws — best-effort", async () => {
130
+ const warn = vi.fn();
131
+ const source = createIdeaResearchSource({
132
+ ideasClient: makeClient({ throwOnList: true }),
133
+ warn,
134
+ });
135
+ expect(await source.pick(projectRoot)).toBeNull();
136
+ expect(warn).toHaveBeenCalledTimes(1);
137
+ });
138
+ it("onClaim PATCHes researching + researchKind=investigate + linkedSwarmTaskId", async () => {
139
+ const patches = [];
140
+ const source = createIdeaResearchSource({
141
+ ideasClient: makeClient({
142
+ list: [],
143
+ onPatch: (id, partial) => patches.push({ id, partial }),
144
+ }),
145
+ });
146
+ await source.onClaim({
147
+ id: "i9",
148
+ title: "x",
149
+ sourceKind: "idea-research",
150
+ sourceId: "i9",
151
+ projectRoot,
152
+ cycleKind: "research",
153
+ }, "swarm-77");
154
+ expect(patches).toEqual([
155
+ {
156
+ id: "i9",
157
+ partial: {
158
+ status: "researching",
159
+ researchKind: "investigate",
160
+ linkedSwarmTaskId: "swarm-77",
161
+ },
162
+ },
163
+ ]);
164
+ });
165
+ it("onFailure reverts to status=idea, clears researchKind + linkedSwarmTaskId", async () => {
166
+ const patches = [];
167
+ const source = createIdeaResearchSource({
168
+ ideasClient: makeClient({
169
+ list: [],
170
+ onPatch: (id, partial) => patches.push({ id, partial }),
171
+ }),
172
+ });
173
+ await source.onFailure({ id: "i1", title: "x", sourceId: "i1", projectRoot, cycleKind: "research" }, "swarm-1", "boom");
174
+ expect(patches).toEqual([
175
+ {
176
+ id: "i1",
177
+ partial: {
178
+ status: "idea",
179
+ researchKind: null,
180
+ linkedSwarmTaskId: null,
181
+ },
182
+ },
183
+ ]);
184
+ });
185
+ // ── onSuccess: filesystem-driven transitions ────────────────────────
186
+ function tmpProject() {
187
+ const dir = mkdtempSync(join(tmpdir(), "idea-research-"));
188
+ return {
189
+ dir,
190
+ cleanup: () => {
191
+ try {
192
+ rmSync(dir, { recursive: true, force: true });
193
+ }
194
+ catch {
195
+ // best-effort
196
+ }
197
+ },
198
+ };
199
+ }
200
+ function writeReport(projDir, ideaId, name, body, mtimeMs) {
201
+ const dir = join(projDir, ".clawnet", "ideas", ideaId);
202
+ mkdirSync(dir, { recursive: true });
203
+ const full = join(dir, name);
204
+ writeFileSync(full, body, "utf-8");
205
+ if (mtimeMs !== undefined) {
206
+ const sec = mtimeMs / 1000;
207
+ utimesSync(full, sec, sec);
208
+ }
209
+ return full;
210
+ }
211
+ it("onSuccess parses promote → status=todo, appends ResearchRef newest-first", async () => {
212
+ const proj = tmpProject();
213
+ try {
214
+ const ideaId = "ix";
215
+ const existingRef = {
216
+ reportPath: ".clawnet/ideas/ix/research-old.md",
217
+ swarmId: "swarm-old",
218
+ conclusion: "needs-info",
219
+ ranAt: "2026-01-01T00:00:00.000Z",
220
+ };
221
+ const idea = makeIdea({
222
+ id: ideaId,
223
+ projectId: encodeCwd(proj.dir),
224
+ researchReports: [existingRef],
225
+ });
226
+ writeReport(proj.dir, ideaId, "research-2026-06-06T00:00:00Z.md", "---\nconclusion: promote\n---\nbody");
227
+ const patches = [];
228
+ const source = createIdeaResearchSource({
229
+ ideasClient: makeClient({
230
+ byId: { [ideaId]: idea },
231
+ onPatch: (id, partial) => patches.push({ id, partial }),
232
+ }),
233
+ now: () => new Date("2026-06-06T00:00:00.000Z"),
234
+ });
235
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir, cycleKind: "research" }, "swarm-new");
236
+ expect(patches.length).toBe(1);
237
+ const { partial } = patches[0];
238
+ expect(partial.status).toBe("todo");
239
+ expect(partial.researchKind).toBeNull();
240
+ expect(partial.researchReports[0].conclusion).toBe("promote");
241
+ expect(partial.researchReports[0].swarmId).toBe("swarm-new");
242
+ expect(partial.researchReports[0].reportPath).toMatch(/\.clawnet\/ideas\/ix\/research-/);
243
+ expect(partial.researchReports[1]).toEqual(existingRef);
244
+ }
245
+ finally {
246
+ proj.cleanup();
247
+ }
248
+ });
249
+ it("onSuccess archive → status=archived", async () => {
250
+ const proj = tmpProject();
251
+ try {
252
+ const ideaId = "ia";
253
+ writeReport(proj.dir, ideaId, "research-x.md", "---\nconclusion: archive\n---\nbody");
254
+ const patches = [];
255
+ const source = createIdeaResearchSource({
256
+ ideasClient: makeClient({
257
+ onPatch: (id, partial) => patches.push({ id, partial }),
258
+ }),
259
+ });
260
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
261
+ expect(patches[0].partial.status).toBe("archived");
262
+ expect(patches[0].partial.researchReports[0].conclusion).toBe("archive");
263
+ }
264
+ finally {
265
+ proj.cleanup();
266
+ }
267
+ });
268
+ it("onSuccess needs-info → status=idea", async () => {
269
+ const proj = tmpProject();
270
+ try {
271
+ const ideaId = "in";
272
+ writeReport(proj.dir, ideaId, "research-x.md", "---\nconclusion: needs-info\n---\nbody");
273
+ const patches = [];
274
+ const source = createIdeaResearchSource({
275
+ ideasClient: makeClient({
276
+ onPatch: (id, partial) => patches.push({ id, partial }),
277
+ }),
278
+ });
279
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
280
+ expect(patches[0].partial.status).toBe("idea");
281
+ }
282
+ finally {
283
+ proj.cleanup();
284
+ }
285
+ });
286
+ it("onSuccess missing report → needs-info / status=idea", async () => {
287
+ const proj = tmpProject();
288
+ try {
289
+ const ideaId = "imiss";
290
+ // No file written.
291
+ const patches = [];
292
+ const warn = vi.fn();
293
+ const source = createIdeaResearchSource({
294
+ ideasClient: makeClient({
295
+ onPatch: (id, partial) => patches.push({ id, partial }),
296
+ }),
297
+ warn,
298
+ });
299
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
300
+ expect(patches[0].partial.status).toBe("idea");
301
+ expect(patches[0].partial.researchReports[0].conclusion).toBe("needs-info");
302
+ expect(warn).toHaveBeenCalled();
303
+ }
304
+ finally {
305
+ proj.cleanup();
306
+ }
307
+ });
308
+ it("onSuccess malformed frontmatter → needs-info", async () => {
309
+ const proj = tmpProject();
310
+ try {
311
+ const ideaId = "ibad";
312
+ writeReport(proj.dir, ideaId, "research-x.md", "no frontmatter at all\njust prose");
313
+ const patches = [];
314
+ const source = createIdeaResearchSource({
315
+ ideasClient: makeClient({
316
+ onPatch: (id, partial) => patches.push({ id, partial }),
317
+ }),
318
+ });
319
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
320
+ expect(patches[0].partial.status).toBe("idea");
321
+ expect(patches[0].partial.researchReports[0].conclusion).toBe("needs-info");
322
+ }
323
+ finally {
324
+ proj.cleanup();
325
+ }
326
+ });
327
+ it("onSuccess picks the newest report when multiple exist", async () => {
328
+ const proj = tmpProject();
329
+ try {
330
+ const ideaId = "imulti";
331
+ // Old report — archive.
332
+ writeReport(proj.dir, ideaId, "research-2026-01-01T00:00:00Z.md", "---\nconclusion: archive\n---\nbody", Date.parse("2026-01-01T00:00:00Z"));
333
+ // Newest — promote.
334
+ writeReport(proj.dir, ideaId, "research-2026-06-06T00:00:00Z.md", "---\nconclusion: promote\n---\nbody", Date.parse("2026-06-06T00:00:00Z"));
335
+ const patches = [];
336
+ const source = createIdeaResearchSource({
337
+ ideasClient: makeClient({
338
+ onPatch: (id, partial) => patches.push({ id, partial }),
339
+ }),
340
+ });
341
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
342
+ expect(patches[0].partial.status).toBe("todo");
343
+ expect(patches[0].partial.researchReports[0].conclusion).toBe("promote");
344
+ }
345
+ finally {
346
+ proj.cleanup();
347
+ }
348
+ });
349
+ it("onSuccess tolerates conclusion casing variants", async () => {
350
+ const proj = tmpProject();
351
+ try {
352
+ const ideaId = "icase";
353
+ writeReport(proj.dir, ideaId, "research-x.md", "---\nconclusion: PROMOTE\n---\nbody");
354
+ const patches = [];
355
+ const source = createIdeaResearchSource({
356
+ ideasClient: makeClient({
357
+ onPatch: (id, partial) => patches.push({ id, partial }),
358
+ }),
359
+ });
360
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-1");
361
+ expect(patches[0].partial.status).toBe("todo");
362
+ }
363
+ finally {
364
+ proj.cleanup();
365
+ }
366
+ });
367
+ it("M8 hotfix I5 — storedReportPath uses path.relative (no startsWith leak across sibling dirs)", async () => {
368
+ // Simulate the dangerous case from the brief: report path
369
+ // `/x/proj-other/.../report.md` evaluated against `/x/proj` as project
370
+ // root. Old code: `reportPath.startsWith(projectRoot)` returned true
371
+ // (substring match) and stripped "/x/proj" leaving "-other/.../report.md".
372
+ // New code: path.relative returns "../proj-other/.../report.md" which
373
+ // starts with ".." → we fall back to the absolute path.
374
+ const proj = tmpProject();
375
+ try {
376
+ const ideaId = "irel";
377
+ const otherProj = mkdtempSync(join(tmpdir(), `${proj.dir.split(/[\\/]/).pop()}-other-`));
378
+ try {
379
+ const reportInSibling = writeReport(otherProj, ideaId, "research-x.md", "---\nconclusion: promote\n---\nbody");
380
+ const patches = [];
381
+ const source = createIdeaResearchSource({
382
+ ideasClient: makeClient({
383
+ onPatch: (id, partial) => patches.push({ id, partial }),
384
+ }),
385
+ // Force the resolver to point at the sibling tree (outside proj.dir).
386
+ resolveReportDir: () => join(otherProj, ".clawnet", "ideas", ideaId),
387
+ });
388
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-rel");
389
+ const stored = patches[0].partial.researchReports[0].reportPath;
390
+ // Must NOT begin with a stripped prefix like "-other/..."; should
391
+ // be either the absolute path or start with ".." (we accept either —
392
+ // implementation falls back to the absolute path).
393
+ expect(stored).toBe(reportInSibling);
394
+ expect(stored.startsWith("-")).toBe(false);
395
+ }
396
+ finally {
397
+ rmSync(otherProj, { recursive: true, force: true });
398
+ }
399
+ }
400
+ finally {
401
+ proj.cleanup();
402
+ }
403
+ });
404
+ it("M8 hotfix I5 — storedReportPath is relative without leading slash when inside projectRoot", async () => {
405
+ const proj = tmpProject();
406
+ try {
407
+ const ideaId = "iin";
408
+ writeReport(proj.dir, ideaId, "research-x.md", "---\nconclusion: promote\n---\nbody");
409
+ const patches = [];
410
+ const source = createIdeaResearchSource({
411
+ ideasClient: makeClient({
412
+ onPatch: (id, partial) => patches.push({ id, partial }),
413
+ }),
414
+ });
415
+ await source.onSuccess({ id: ideaId, title: "x", sourceId: ideaId, projectRoot: proj.dir }, "swarm-rel-in");
416
+ const stored = patches[0].partial.researchReports[0].reportPath;
417
+ expect(stored).toBe(`.clawnet/ideas/${ideaId}/research-x.md`);
418
+ expect(stored.startsWith("/")).toBe(false);
419
+ }
420
+ finally {
421
+ proj.cleanup();
422
+ }
423
+ });
424
+ });
425
+ //# sourceMappingURL=idea-research-source.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea-research-source.test.js","sourceRoot":"","sources":["../../src/__tests__/idea-research-source.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=idea-todo-source.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea-todo-source.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/idea-todo-source.test.ts"],"names":[],"mappings":""}