spidersan 0.10.0 → 0.20.2

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 (430) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +39 -280
  3. package/dist/bin/command-registry.d.ts +25 -0
  4. package/dist/bin/command-registry.d.ts.map +1 -0
  5. package/dist/bin/command-registry.js +29 -0
  6. package/dist/bin/command-registry.js.map +1 -0
  7. package/dist/bin/spidersan.d.ts +7 -0
  8. package/dist/bin/spidersan.d.ts.map +1 -1
  9. package/dist/bin/spidersan.js +38 -57
  10. package/dist/bin/spidersan.js.map +1 -1
  11. package/dist/commands/cleanup.d.ts.map +1 -1
  12. package/dist/commands/cleanup.js +17 -3
  13. package/dist/commands/cleanup.js.map +1 -1
  14. package/dist/commands/config.d.ts.map +1 -1
  15. package/dist/commands/config.js +11 -39
  16. package/dist/commands/config.js.map +1 -1
  17. package/dist/commands/conflicts.d.ts +22 -0
  18. package/dist/commands/conflicts.d.ts.map +1 -1
  19. package/dist/commands/conflicts.js +459 -256
  20. package/dist/commands/conflicts.js.map +1 -1
  21. package/dist/commands/cross-conflicts.d.ts.map +1 -1
  22. package/dist/commands/cross-conflicts.js +7 -8
  23. package/dist/commands/cross-conflicts.js.map +1 -1
  24. package/dist/commands/depends.d.ts +4 -1
  25. package/dist/commands/depends.d.ts.map +1 -1
  26. package/dist/commands/depends.js +35 -8
  27. package/dist/commands/depends.js.map +1 -1
  28. package/dist/commands/doctor.d.ts.map +1 -1
  29. package/dist/commands/doctor.js +25 -7
  30. package/dist/commands/doctor.js.map +1 -1
  31. package/dist/commands/git-watch.d.ts +1 -1
  32. package/dist/commands/git-watch.js +1 -1
  33. package/dist/commands/github-sync.d.ts +33 -0
  34. package/dist/commands/github-sync.d.ts.map +1 -1
  35. package/dist/commands/github-sync.js +68 -57
  36. package/dist/commands/github-sync.js.map +1 -1
  37. package/dist/commands/index.d.ts +2 -13
  38. package/dist/commands/index.d.ts.map +1 -1
  39. package/dist/commands/index.js +5 -20
  40. package/dist/commands/index.js.map +1 -1
  41. package/dist/commands/merge-order.d.ts.map +1 -1
  42. package/dist/commands/merge-order.js +8 -4
  43. package/dist/commands/merge-order.js.map +1 -1
  44. package/dist/commands/merged.d.ts.map +1 -1
  45. package/dist/commands/merged.js +5 -1
  46. package/dist/commands/merged.js.map +1 -1
  47. package/dist/commands/pr-check.d.ts +24 -0
  48. package/dist/commands/pr-check.d.ts.map +1 -0
  49. package/dist/commands/pr-check.js +85 -0
  50. package/dist/commands/pr-check.js.map +1 -0
  51. package/dist/commands/ready-check.d.ts.map +1 -1
  52. package/dist/commands/ready-check.js +6 -3
  53. package/dist/commands/ready-check.js.map +1 -1
  54. package/dist/commands/register.d.ts +5 -0
  55. package/dist/commands/register.d.ts.map +1 -1
  56. package/dist/commands/register.js +14 -1
  57. package/dist/commands/register.js.map +1 -1
  58. package/dist/commands/registry-sync.d.ts.map +1 -1
  59. package/dist/commands/registry-sync.js +12 -46
  60. package/dist/commands/registry-sync.js.map +1 -1
  61. package/dist/commands/stale.d.ts.map +1 -1
  62. package/dist/commands/stale.js +8 -3
  63. package/dist/commands/stale.js.map +1 -1
  64. package/dist/commands/sync.d.ts +14 -1
  65. package/dist/commands/sync.d.ts.map +1 -1
  66. package/dist/commands/sync.js +49 -31
  67. package/dist/commands/sync.js.map +1 -1
  68. package/dist/commands/verify-trunk.d.ts +18 -0
  69. package/dist/commands/verify-trunk.d.ts.map +1 -0
  70. package/dist/commands/verify-trunk.js +77 -0
  71. package/dist/commands/verify-trunk.js.map +1 -0
  72. package/dist/commands/watch.d.ts +0 -1
  73. package/dist/commands/watch.d.ts.map +1 -1
  74. package/dist/commands/watch.js +50 -77
  75. package/dist/commands/watch.js.map +1 -1
  76. package/dist/index.d.ts +0 -3
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +0 -3
  79. package/dist/index.js.map +1 -1
  80. package/dist/lib/activity.d.ts.map +1 -1
  81. package/dist/lib/activity.js +6 -2
  82. package/dist/lib/activity.js.map +1 -1
  83. package/dist/lib/ai/context-builder.d.ts.map +1 -1
  84. package/dist/lib/ai/context-builder.js +19 -6
  85. package/dist/lib/ai/context-builder.js.map +1 -1
  86. package/dist/lib/ai/event-handler.d.ts.map +1 -1
  87. package/dist/lib/ai/event-handler.js +15 -2
  88. package/dist/lib/ai/event-handler.js.map +1 -1
  89. package/dist/lib/ai/reasoner.d.ts.map +1 -1
  90. package/dist/lib/ai/reasoner.js +63 -82
  91. package/dist/lib/ai/reasoner.js.map +1 -1
  92. package/dist/lib/ai/setup.d.ts +1 -1
  93. package/dist/lib/ai/setup.d.ts.map +1 -1
  94. package/dist/lib/ai/types.d.ts.map +1 -1
  95. package/dist/lib/ai/types.js +5 -2
  96. package/dist/lib/ai/types.js.map +1 -1
  97. package/dist/lib/ast.d.ts +10 -2
  98. package/dist/lib/ast.d.ts.map +1 -1
  99. package/dist/lib/ast.js +52 -27
  100. package/dist/lib/ast.js.map +1 -1
  101. package/dist/lib/carries.d.ts +22 -0
  102. package/dist/lib/carries.d.ts.map +1 -0
  103. package/dist/lib/carries.js +56 -0
  104. package/dist/lib/carries.js.map +1 -0
  105. package/dist/lib/colony-subscriber.d.ts +1 -1
  106. package/dist/lib/colony-subscriber.js +1 -1
  107. package/dist/lib/config.d.ts +2 -2
  108. package/dist/lib/config.d.ts.map +1 -1
  109. package/dist/lib/config.js +13 -8
  110. package/dist/lib/config.js.map +1 -1
  111. package/dist/lib/conflict-renderer.d.ts.map +1 -1
  112. package/dist/lib/conflict-renderer.js +17 -34
  113. package/dist/lib/conflict-renderer.js.map +1 -1
  114. package/dist/lib/ecosystem-env.d.ts +33 -0
  115. package/dist/lib/ecosystem-env.d.ts.map +1 -0
  116. package/dist/lib/ecosystem-env.js +62 -0
  117. package/dist/lib/ecosystem-env.js.map +1 -0
  118. package/dist/lib/git-events-subscriber.d.ts +27 -0
  119. package/dist/lib/git-events-subscriber.d.ts.map +1 -1
  120. package/dist/lib/git-events-subscriber.js +149 -58
  121. package/dist/lib/git-events-subscriber.js.map +1 -1
  122. package/dist/lib/git-merge-analyzer.d.ts +38 -0
  123. package/dist/lib/git-merge-analyzer.d.ts.map +1 -0
  124. package/dist/lib/git-merge-analyzer.js +23 -0
  125. package/dist/lib/git-merge-analyzer.js.map +1 -0
  126. package/dist/lib/git.d.ts +88 -0
  127. package/dist/lib/git.d.ts.map +1 -1
  128. package/dist/lib/git.js +499 -9
  129. package/dist/lib/git.js.map +1 -1
  130. package/dist/lib/github.d.ts +69 -1
  131. package/dist/lib/github.d.ts.map +1 -1
  132. package/dist/lib/github.js +230 -16
  133. package/dist/lib/github.js.map +1 -1
  134. package/dist/lib/graph.d.ts +15 -0
  135. package/dist/lib/graph.d.ts.map +1 -1
  136. package/dist/lib/graph.js +31 -0
  137. package/dist/lib/graph.js.map +1 -1
  138. package/dist/lib/machine.d.ts +14 -0
  139. package/dist/lib/machine.d.ts.map +1 -0
  140. package/dist/lib/machine.js +38 -0
  141. package/dist/lib/machine.js.map +1 -0
  142. package/dist/lib/notify.d.ts +68 -0
  143. package/dist/lib/notify.d.ts.map +1 -0
  144. package/dist/lib/notify.js +111 -0
  145. package/dist/lib/notify.js.map +1 -0
  146. package/dist/lib/outline.d.ts +6 -0
  147. package/dist/lib/outline.d.ts.map +1 -0
  148. package/dist/lib/outline.js +60 -0
  149. package/dist/lib/outline.js.map +1 -0
  150. package/dist/lib/push-registry.d.ts +22 -0
  151. package/dist/lib/push-registry.d.ts.map +1 -0
  152. package/dist/lib/push-registry.js +21 -0
  153. package/dist/lib/push-registry.js.map +1 -0
  154. package/dist/lib/reconcile.d.ts +100 -0
  155. package/dist/lib/reconcile.d.ts.map +1 -0
  156. package/dist/lib/reconcile.js +121 -0
  157. package/dist/lib/reconcile.js.map +1 -0
  158. package/dist/lib/security.d.ts +1 -6
  159. package/dist/lib/security.d.ts.map +1 -1
  160. package/dist/lib/security.js +1 -11
  161. package/dist/lib/security.js.map +1 -1
  162. package/dist/lib/semantic-analysis.d.ts +31 -0
  163. package/dist/lib/semantic-analysis.d.ts.map +1 -0
  164. package/dist/lib/semantic-analysis.js +120 -0
  165. package/dist/lib/semantic-analysis.js.map +1 -0
  166. package/dist/lib/supabase-credentials.d.ts +36 -0
  167. package/dist/lib/supabase-credentials.d.ts.map +1 -0
  168. package/dist/lib/supabase-credentials.js +43 -0
  169. package/dist/lib/supabase-credentials.js.map +1 -0
  170. package/dist/lib/trunk.d.ts +39 -0
  171. package/dist/lib/trunk.d.ts.map +1 -0
  172. package/dist/lib/trunk.js +116 -0
  173. package/dist/lib/trunk.js.map +1 -0
  174. package/dist/storage/adapter.d.ts +20 -1
  175. package/dist/storage/adapter.d.ts.map +1 -1
  176. package/dist/storage/branch-registry-store.d.ts +1 -1
  177. package/dist/storage/branch-registry-store.d.ts.map +1 -1
  178. package/dist/storage/factory.d.ts +0 -4
  179. package/dist/storage/factory.d.ts.map +1 -1
  180. package/dist/storage/factory.js +2 -26
  181. package/dist/storage/factory.js.map +1 -1
  182. package/dist/storage/json-branch-registry-store.d.ts +1 -1
  183. package/dist/storage/json-branch-registry-store.d.ts.map +1 -1
  184. package/dist/storage/json-branch-registry-store.js +33 -7
  185. package/dist/storage/json-branch-registry-store.js.map +1 -1
  186. package/dist/storage/local.d.ts +1 -1
  187. package/dist/storage/local.d.ts.map +1 -1
  188. package/dist/storage/local.js +2 -2
  189. package/dist/storage/local.js.map +1 -1
  190. package/dist/storage/memory-branch-registry-store.d.ts +1 -1
  191. package/dist/storage/memory-branch-registry-store.d.ts.map +1 -1
  192. package/dist/storage/memory-branch-registry-store.js +4 -1
  193. package/dist/storage/memory-branch-registry-store.js.map +1 -1
  194. package/dist/storage/supabase-registry-sync-client-impl.d.ts +1 -7
  195. package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -1
  196. package/dist/storage/supabase-registry-sync-client-impl.js +17 -61
  197. package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -1
  198. package/dist/storage/supabase-registry-sync-client.d.ts +1 -1
  199. package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -1
  200. package/dist/storage/supabase.d.ts +3 -9
  201. package/dist/storage/supabase.d.ts.map +1 -1
  202. package/dist/storage/supabase.js +4 -22
  203. package/dist/storage/supabase.js.map +1 -1
  204. package/dist/types/cloud.d.ts +1 -0
  205. package/dist/types/cloud.d.ts.map +1 -1
  206. package/package.json +88 -90
  207. package/dist/commands/activate.d.ts +0 -9
  208. package/dist/commands/activate.d.ts.map +0 -1
  209. package/dist/commands/activate.js +0 -45
  210. package/dist/commands/activate.js.map +0 -1
  211. package/dist/commands/active-windows.d.ts +0 -16
  212. package/dist/commands/active-windows.d.ts.map +0 -1
  213. package/dist/commands/active-windows.js +0 -373
  214. package/dist/commands/active-windows.js.map +0 -1
  215. package/dist/commands/ai.d.ts +0 -15
  216. package/dist/commands/ai.d.ts.map +0 -1
  217. package/dist/commands/ai.js +0 -498
  218. package/dist/commands/ai.js.map +0 -1
  219. package/dist/commands/audit-mark.d.ts +0 -12
  220. package/dist/commands/audit-mark.d.ts.map +0 -1
  221. package/dist/commands/audit-mark.js +0 -204
  222. package/dist/commands/audit-mark.js.map +0 -1
  223. package/dist/commands/auto.d.ts +0 -8
  224. package/dist/commands/auto.d.ts.map +0 -1
  225. package/dist/commands/auto.js +0 -207
  226. package/dist/commands/auto.js.map +0 -1
  227. package/dist/commands/bot.d.ts +0 -16
  228. package/dist/commands/bot.d.ts.map +0 -1
  229. package/dist/commands/bot.js +0 -416
  230. package/dist/commands/bot.js.map +0 -1
  231. package/dist/commands/close.d.ts +0 -9
  232. package/dist/commands/close.d.ts.map +0 -1
  233. package/dist/commands/close.js +0 -129
  234. package/dist/commands/close.js.map +0 -1
  235. package/dist/commands/collab-sync.d.ts +0 -14
  236. package/dist/commands/collab-sync.d.ts.map +0 -1
  237. package/dist/commands/collab-sync.js +0 -264
  238. package/dist/commands/collab-sync.js.map +0 -1
  239. package/dist/commands/collab.d.ts +0 -6
  240. package/dist/commands/collab.d.ts.map +0 -1
  241. package/dist/commands/collab.js +0 -103
  242. package/dist/commands/collab.js.map +0 -1
  243. package/dist/commands/completions.d.ts +0 -8
  244. package/dist/commands/completions.d.ts.map +0 -1
  245. package/dist/commands/completions.js +0 -83
  246. package/dist/commands/completions.js.map +0 -1
  247. package/dist/commands/daily.d.ts +0 -7
  248. package/dist/commands/daily.d.ts.map +0 -1
  249. package/dist/commands/daily.js +0 -171
  250. package/dist/commands/daily.js.map +0 -1
  251. package/dist/commands/dashboard.d.ts +0 -22
  252. package/dist/commands/dashboard.d.ts.map +0 -1
  253. package/dist/commands/dashboard.js +0 -401
  254. package/dist/commands/dashboard.js.map +0 -1
  255. package/dist/commands/demo.d.ts +0 -3
  256. package/dist/commands/demo.d.ts.map +0 -1
  257. package/dist/commands/demo.js +0 -118
  258. package/dist/commands/demo.js.map +0 -1
  259. package/dist/commands/ecosystem-loader.d.ts +0 -14
  260. package/dist/commands/ecosystem-loader.d.ts.map +0 -1
  261. package/dist/commands/ecosystem-loader.js +0 -90
  262. package/dist/commands/ecosystem-loader.js.map +0 -1
  263. package/dist/commands/fleet-status.d.ts +0 -14
  264. package/dist/commands/fleet-status.d.ts.map +0 -1
  265. package/dist/commands/fleet-status.js +0 -127
  266. package/dist/commands/fleet-status.js.map +0 -1
  267. package/dist/commands/inbox.d.ts +0 -3
  268. package/dist/commands/inbox.d.ts.map +0 -1
  269. package/dist/commands/inbox.js +0 -120
  270. package/dist/commands/inbox.js.map +0 -1
  271. package/dist/commands/intent-scan.d.ts +0 -17
  272. package/dist/commands/intent-scan.d.ts.map +0 -1
  273. package/dist/commands/intent-scan.js +0 -336
  274. package/dist/commands/intent-scan.js.map +0 -1
  275. package/dist/commands/key-import.d.ts +0 -3
  276. package/dist/commands/key-import.d.ts.map +0 -1
  277. package/dist/commands/key-import.js +0 -54
  278. package/dist/commands/key-import.js.map +0 -1
  279. package/dist/commands/keygen.d.ts +0 -3
  280. package/dist/commands/keygen.d.ts.map +0 -1
  281. package/dist/commands/keygen.js +0 -53
  282. package/dist/commands/keygen.js.map +0 -1
  283. package/dist/commands/keys.d.ts +0 -3
  284. package/dist/commands/keys.d.ts.map +0 -1
  285. package/dist/commands/keys.js +0 -56
  286. package/dist/commands/keys.js.map +0 -1
  287. package/dist/commands/lock.d.ts +0 -11
  288. package/dist/commands/lock.d.ts.map +0 -1
  289. package/dist/commands/lock.js +0 -257
  290. package/dist/commands/lock.js.map +0 -1
  291. package/dist/commands/mcp-health.d.ts +0 -3
  292. package/dist/commands/mcp-health.d.ts.map +0 -1
  293. package/dist/commands/mcp-health.js +0 -305
  294. package/dist/commands/mcp-health.js.map +0 -1
  295. package/dist/commands/mcp-restart.d.ts +0 -3
  296. package/dist/commands/mcp-restart.d.ts.map +0 -1
  297. package/dist/commands/mcp-restart.js +0 -176
  298. package/dist/commands/mcp-restart.js.map +0 -1
  299. package/dist/commands/monitor.d.ts +0 -3
  300. package/dist/commands/monitor.d.ts.map +0 -1
  301. package/dist/commands/monitor.js +0 -153
  302. package/dist/commands/monitor.js.map +0 -1
  303. package/dist/commands/msg-read.d.ts +0 -3
  304. package/dist/commands/msg-read.d.ts.map +0 -1
  305. package/dist/commands/msg-read.js +0 -95
  306. package/dist/commands/msg-read.js.map +0 -1
  307. package/dist/commands/pulse.d.ts +0 -13
  308. package/dist/commands/pulse.d.ts.map +0 -1
  309. package/dist/commands/pulse.js +0 -174
  310. package/dist/commands/pulse.js.map +0 -1
  311. package/dist/commands/queen.d.ts +0 -25
  312. package/dist/commands/queen.d.ts.map +0 -1
  313. package/dist/commands/queen.js +0 -326
  314. package/dist/commands/queen.js.map +0 -1
  315. package/dist/commands/radar.d.ts +0 -3
  316. package/dist/commands/radar.d.ts.map +0 -1
  317. package/dist/commands/radar.js +0 -147
  318. package/dist/commands/radar.js.map +0 -1
  319. package/dist/commands/rescue.d.ts +0 -11
  320. package/dist/commands/rescue.d.ts.map +0 -1
  321. package/dist/commands/rescue.js +0 -147
  322. package/dist/commands/rescue.js.map +0 -1
  323. package/dist/commands/semantic.d.ts +0 -3
  324. package/dist/commands/semantic.d.ts.map +0 -1
  325. package/dist/commands/semantic.js +0 -62
  326. package/dist/commands/semantic.js.map +0 -1
  327. package/dist/commands/send.d.ts +0 -3
  328. package/dist/commands/send.d.ts.map +0 -1
  329. package/dist/commands/send.js +0 -121
  330. package/dist/commands/send.js.map +0 -1
  331. package/dist/commands/status.d.ts +0 -9
  332. package/dist/commands/status.d.ts.map +0 -1
  333. package/dist/commands/status.js +0 -41
  334. package/dist/commands/status.js.map +0 -1
  335. package/dist/commands/sync-advisor.d.ts +0 -14
  336. package/dist/commands/sync-advisor.d.ts.map +0 -1
  337. package/dist/commands/sync-advisor.js +0 -110
  338. package/dist/commands/sync-advisor.js.map +0 -1
  339. package/dist/commands/tension.d.ts +0 -12
  340. package/dist/commands/tension.d.ts.map +0 -1
  341. package/dist/commands/tension.js +0 -262
  342. package/dist/commands/tension.js.map +0 -1
  343. package/dist/commands/torrent.d.ts +0 -9
  344. package/dist/commands/torrent.d.ts.map +0 -1
  345. package/dist/commands/torrent.js +0 -470
  346. package/dist/commands/torrent.js.map +0 -1
  347. package/dist/commands/tui.d.ts +0 -8
  348. package/dist/commands/tui.d.ts.map +0 -1
  349. package/dist/commands/tui.js +0 -15
  350. package/dist/commands/tui.js.map +0 -1
  351. package/dist/commands/wake.d.ts +0 -9
  352. package/dist/commands/wake.d.ts.map +0 -1
  353. package/dist/commands/wake.js +0 -188
  354. package/dist/commands/wake.js.map +0 -1
  355. package/dist/commands/welcome.d.ts +0 -8
  356. package/dist/commands/welcome.d.ts.map +0 -1
  357. package/dist/commands/welcome.js +0 -85
  358. package/dist/commands/welcome.js.map +0 -1
  359. package/dist/commands/who-owns.d.ts +0 -3
  360. package/dist/commands/who-owns.d.ts.map +0 -1
  361. package/dist/commands/who-owns.js +0 -68
  362. package/dist/commands/who-owns.js.map +0 -1
  363. package/dist/commands/who-touched.d.ts +0 -9
  364. package/dist/commands/who-touched.d.ts.map +0 -1
  365. package/dist/commands/who-touched.js +0 -198
  366. package/dist/commands/who-touched.js.map +0 -1
  367. package/dist/lib/crdt.d.ts +0 -83
  368. package/dist/lib/crdt.d.ts.map +0 -1
  369. package/dist/lib/crdt.js +0 -160
  370. package/dist/lib/crdt.js.map +0 -1
  371. package/dist/lib/daily-bridge.d.ts +0 -41
  372. package/dist/lib/daily-bridge.d.ts.map +0 -1
  373. package/dist/lib/daily-bridge.js +0 -186
  374. package/dist/lib/daily-bridge.js.map +0 -1
  375. package/dist/lib/hub.d.ts +0 -31
  376. package/dist/lib/hub.d.ts.map +0 -1
  377. package/dist/lib/hub.js +0 -92
  378. package/dist/lib/hub.js.map +0 -1
  379. package/dist/lib/license.d.ts +0 -61
  380. package/dist/lib/license.d.ts.map +0 -1
  381. package/dist/lib/license.js +0 -171
  382. package/dist/lib/license.js.map +0 -1
  383. package/dist/lib/pulse-renderer.d.ts +0 -19
  384. package/dist/lib/pulse-renderer.d.ts.map +0 -1
  385. package/dist/lib/pulse-renderer.js +0 -108
  386. package/dist/lib/pulse-renderer.js.map +0 -1
  387. package/dist/lib/repo-scanner.d.ts +0 -32
  388. package/dist/lib/repo-scanner.d.ts.map +0 -1
  389. package/dist/lib/repo-scanner.js +0 -160
  390. package/dist/lib/repo-scanner.js.map +0 -1
  391. package/dist/lib/salvage-analyzer.d.ts +0 -29
  392. package/dist/lib/salvage-analyzer.d.ts.map +0 -1
  393. package/dist/lib/salvage-analyzer.js +0 -121
  394. package/dist/lib/salvage-analyzer.js.map +0 -1
  395. package/dist/lib/session-logger.d.ts +0 -54
  396. package/dist/lib/session-logger.d.ts.map +0 -1
  397. package/dist/lib/session-logger.js +0 -136
  398. package/dist/lib/session-logger.js.map +0 -1
  399. package/dist/lib/symbol-extractor.d.ts +0 -41
  400. package/dist/lib/symbol-extractor.d.ts.map +0 -1
  401. package/dist/lib/symbol-extractor.js +0 -78
  402. package/dist/lib/symbol-extractor.js.map +0 -1
  403. package/dist/storage/git-messages.d.ts +0 -53
  404. package/dist/storage/git-messages.d.ts.map +0 -1
  405. package/dist/storage/git-messages.js +0 -376
  406. package/dist/storage/git-messages.js.map +0 -1
  407. package/dist/storage/local-messages.d.ts +0 -37
  408. package/dist/storage/local-messages.d.ts.map +0 -1
  409. package/dist/storage/local-messages.js +0 -151
  410. package/dist/storage/local-messages.js.map +0 -1
  411. package/dist/storage/message-adapter.d.ts +0 -86
  412. package/dist/storage/message-adapter.d.ts.map +0 -1
  413. package/dist/storage/message-adapter.js +0 -28
  414. package/dist/storage/message-adapter.js.map +0 -1
  415. package/dist/storage/message-factory.d.ts +0 -36
  416. package/dist/storage/message-factory.d.ts.map +0 -1
  417. package/dist/storage/message-factory.js +0 -99
  418. package/dist/storage/message-factory.js.map +0 -1
  419. package/dist/storage/mycmail-adapter.d.ts +0 -38
  420. package/dist/storage/mycmail-adapter.d.ts.map +0 -1
  421. package/dist/storage/mycmail-adapter.js +0 -300
  422. package/dist/storage/mycmail-adapter.js.map +0 -1
  423. package/dist/tui/dashboard.d.ts +0 -35
  424. package/dist/tui/dashboard.d.ts.map +0 -1
  425. package/dist/tui/dashboard.js +0 -199
  426. package/dist/tui/dashboard.js.map +0 -1
  427. package/dist/tui/screen.d.ts +0 -14
  428. package/dist/tui/screen.d.ts.map +0 -1
  429. package/dist/tui/screen.js +0 -138
  430. package/dist/tui/screen.js.map +0 -1
@@ -0,0 +1,31 @@
1
+ import { type SymbolConflict } from './ast.js';
2
+ export interface SemanticTarget {
3
+ label: string;
4
+ files: string[];
5
+ /** Resolvable git ref for this target's head, or null when it isn't available locally. */
6
+ ref: string | null;
7
+ }
8
+ export interface SemanticResult {
9
+ conflicts: SymbolConflict[];
10
+ /** One human-readable line per file/target that could not be analyzed. */
11
+ skipped: string[];
12
+ /**
13
+ * Overlapping files of a type semantic analysis doesn't cover (.sql, .yaml, .md …). "No symbol
14
+ * conflicts" says nothing about them, so callers must not turn it into "safe to merge".
15
+ */
16
+ unsupported: string[];
17
+ }
18
+ /**
19
+ * A branch's tip for analysis: the LOCAL branch first (unpushed commits are the point), then
20
+ * origin's. resolveBranchRef alone prefers the remote and would read a stale tip.
21
+ */
22
+ export declare function resolveBranchTip(name: string): string | null;
23
+ /**
24
+ * A cross-machine label "<machine>/<branch>" names ANOTHER machine's branch, so it resolves only
25
+ * against origin — a same-named local branch would be the wrong tip. The caller must know the
26
+ * label is cross-machine (from where the entry came from); guessing from the label's shape is
27
+ * ambiguous for local branches like "feat/x".
28
+ */
29
+ export declare function resolveCrossMachineRef(label: string): string | null;
30
+ export declare function analyzeSemantic(currentLabel: string, currentRef: string | null, targets: SemanticTarget[], cwd?: string): SemanticResult;
31
+ //# sourceMappingURL=semantic-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-analysis.d.ts","sourceRoot":"","sources":["../../src/lib/semantic-analysis.ts"],"names":[],"mappings":"AAQA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAI1D,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0FAA0F;IAC1F,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAqBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,eAAe,CAC3B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,EAAE,cAAc,EAAE,EACzB,GAAG,CAAC,EAAE,MAAM,GACb,cAAc,CAyEhB"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * semantic-analysis.ts — the `conflicts --semantic` engine.
3
+ *
4
+ * Takes targets that carry a REAL git ref (never a display label like
5
+ * "PR #303 (branch)") and returns symbol conflicts plus every file it could not
6
+ * analyze. Callers must not print "safe to merge" while `skipped` is non-empty.
7
+ */
8
+ import { execFileSync } from 'child_process';
9
+ import { ASTParser } from './ast.js';
10
+ import { findOutlineConflicts } from './outline.js';
11
+ import { resolveBranchRef, resolveLocalBranchRef } from './git.js';
12
+ const TS_FILE = /\.(ts|js|tsx|jsx)$/;
13
+ const PY_FILE = /\.py$/;
14
+ const git = (args, cwd) => execFileSync('git', args, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], cwd, timeout: 30_000 }); // a hung object store must not hang the command
15
+ /**
16
+ * File content at ref; null ONLY when the path genuinely doesn't exist there (a legitimate
17
+ * non-conflict). Any other git failure throws, so the caller records it as skipped instead of
18
+ * reading it as "absent".
19
+ *
20
+ * `ls-tree`, not `cat-file -e`: cat-file exits 128 for a missing path AND for a bad ref/repo, so it
21
+ * can't tell them apart. ls-tree exits 0 with empty output for an absent path and non-zero otherwise.
22
+ */
23
+ function show(ref, file, cwd) {
24
+ if (!git(['ls-tree', '--name-only', ref, '--', file], cwd).trim())
25
+ return null;
26
+ return git(['show', `${ref}:${file}`], cwd);
27
+ }
28
+ /**
29
+ * A branch's tip for analysis: the LOCAL branch first (unpushed commits are the point), then
30
+ * origin's. resolveBranchRef alone prefers the remote and would read a stale tip.
31
+ */
32
+ export function resolveBranchTip(name) {
33
+ return resolveLocalBranchRef(name) ?? resolveBranchRef(name);
34
+ }
35
+ /**
36
+ * A cross-machine label "<machine>/<branch>" names ANOTHER machine's branch, so it resolves only
37
+ * against origin — a same-named local branch would be the wrong tip. The caller must know the
38
+ * label is cross-machine (from where the entry came from); guessing from the label's shape is
39
+ * ambiguous for local branches like "feat/x".
40
+ */
41
+ export function resolveCrossMachineRef(label) {
42
+ const remote = resolveBranchRef(label.slice(label.indexOf('/') + 1));
43
+ return remote?.startsWith('refs/remotes/') ? remote : null;
44
+ }
45
+ export function analyzeSemantic(currentLabel, currentRef, targets, cwd) {
46
+ const parser = new ASTParser();
47
+ const result = { conflicts: [], skipped: [], unsupported: [] };
48
+ for (const target of targets) {
49
+ for (const file of target.files) {
50
+ const isPython = PY_FILE.test(file);
51
+ if (!isPython && !TS_FILE.test(file)) {
52
+ if (!result.unsupported.includes(file))
53
+ result.unsupported.push(file);
54
+ continue;
55
+ }
56
+ // An unresolvable ref is UNKNOWN, not "no conflict" — never swallow it.
57
+ if (!currentRef) {
58
+ result.skipped.push(`${file}: no local ref for ${currentLabel}`);
59
+ continue;
60
+ }
61
+ if (!target.ref) {
62
+ result.skipped.push(`${file}: no local ref for ${target.label} (not fetched?)`);
63
+ continue;
64
+ }
65
+ let current;
66
+ let other;
67
+ try {
68
+ current = show(currentRef, file, cwd);
69
+ other = show(target.ref, file, cwd);
70
+ }
71
+ catch {
72
+ result.skipped.push(`${file}: could not read from ${target.label}`);
73
+ continue;
74
+ }
75
+ // Absent on one side = added/deleted there. A delete/modify overlap is a real git conflict, and
76
+ // symbol comparison can't judge it, so it is unanalyzed (incomplete), never "nothing to conflict".
77
+ if (current === null || other === null) {
78
+ result.skipped.push(`${file}: absent on ${current === null ? currentLabel : target.label} (added or deleted) — not analyzed`);
79
+ continue;
80
+ }
81
+ // Three-way against the merge-base. Two-way ONLY when the histories are genuinely unrelated
82
+ // (merge-base exit 1); any other failure is unknown, not a reason to change comparison mode.
83
+ let base;
84
+ try {
85
+ let mb = null;
86
+ try {
87
+ mb = git(['merge-base', currentRef, target.ref], cwd).trim();
88
+ }
89
+ catch (err) {
90
+ if (err.status !== 1)
91
+ throw err; // 1 = no common ancestor
92
+ }
93
+ base = mb ? show(mb, file, cwd) ?? undefined : undefined;
94
+ }
95
+ catch {
96
+ result.skipped.push(`${file}: could not compute merge-base with ${target.label}`);
97
+ continue;
98
+ }
99
+ let found;
100
+ try {
101
+ found = isPython
102
+ ? findOutlineConflicts('.py', current, `${currentLabel}:${file}`, other, `${target.label}:${file}`, base)
103
+ : parser.findSymbolConflicts(current, `${currentLabel}:${file}`, other, `${target.label}:${file}`, base);
104
+ }
105
+ catch {
106
+ // A parser failure is unknown, not "no conflicts". No caught message: it can carry
107
+ // internals and this line is printed.
108
+ result.skipped.push(`${file}: parse failed`);
109
+ continue;
110
+ }
111
+ if (!found) {
112
+ result.skipped.push(`${file}: semantic analysis unavailable (install ast-grep)`);
113
+ continue;
114
+ }
115
+ result.conflicts.push(...found);
116
+ }
117
+ }
118
+ return result;
119
+ }
120
+ //# sourceMappingURL=semantic-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-analysis.js","sourceRoot":"","sources":["../../src/lib/semantic-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Single source of truth for resolving spidersan's Supabase credentials.
3
+ *
4
+ * Precedence: SPIDERSAN_SUPABASE_* → SUPABASE_* → config.storage.*
5
+ *
6
+ * SPIDERSAN_SUPABASE_* MUST come first. envoak's vault-inject guard drops any
7
+ * secret whose name carries a bare SUPABASE_ prefix, so vault-injected creds
8
+ * only ever arrive under the scoped names. Resolvers checking just the bare
9
+ * names silently no-op under `envoak vault inject` — the production hook path —
10
+ * and report "Supabase not configured" while a valid grant is present (fc8cf22,
11
+ * 29aa575, tb-efmm; tb-ly0b found 7 more copies with the same defect).
12
+ *
13
+ * This module exists so that stays fixed in ONE place. Do not re-derive these
14
+ * env names inline; call resolveSupabaseCredentials()/resolveSupabaseEnv().
15
+ *
16
+ * COLONY_SUPABASE_* is deliberately absent from the chain: colony points at a
17
+ * different Supabase project, so falling back to it would silently write
18
+ * spider_registries into the wrong database (tb-ly0b).
19
+ */
20
+ export interface SupabaseCredentials {
21
+ url: string;
22
+ key: string;
23
+ }
24
+ /**
25
+ * Env-only resolution. For callers with no config file in scope (subscribers,
26
+ * activity logging) that need a synchronous answer.
27
+ */
28
+ export declare function resolveSupabaseEnv(): {
29
+ url?: string;
30
+ key?: string;
31
+ };
32
+ /**
33
+ * Env → config.storage. The default for commands; null when unconfigured.
34
+ */
35
+ export declare function resolveSupabaseCredentials(basePath?: string): Promise<SupabaseCredentials | null>;
36
+ //# sourceMappingURL=supabase-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-credentials.d.ts","sourceRoot":"","sources":["../../src/lib/supabase-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAKnE;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC5C,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAQrC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Single source of truth for resolving spidersan's Supabase credentials.
3
+ *
4
+ * Precedence: SPIDERSAN_SUPABASE_* → SUPABASE_* → config.storage.*
5
+ *
6
+ * SPIDERSAN_SUPABASE_* MUST come first. envoak's vault-inject guard drops any
7
+ * secret whose name carries a bare SUPABASE_ prefix, so vault-injected creds
8
+ * only ever arrive under the scoped names. Resolvers checking just the bare
9
+ * names silently no-op under `envoak vault inject` — the production hook path —
10
+ * and report "Supabase not configured" while a valid grant is present (fc8cf22,
11
+ * 29aa575, tb-efmm; tb-ly0b found 7 more copies with the same defect).
12
+ *
13
+ * This module exists so that stays fixed in ONE place. Do not re-derive these
14
+ * env names inline; call resolveSupabaseCredentials()/resolveSupabaseEnv().
15
+ *
16
+ * COLONY_SUPABASE_* is deliberately absent from the chain: colony points at a
17
+ * different Supabase project, so falling back to it would silently write
18
+ * spider_registries into the wrong database (tb-ly0b).
19
+ */
20
+ import { loadConfig } from './config.js';
21
+ /**
22
+ * Env-only resolution. For callers with no config file in scope (subscribers,
23
+ * activity logging) that need a synchronous answer.
24
+ */
25
+ export function resolveSupabaseEnv() {
26
+ return {
27
+ url: process.env.SPIDERSAN_SUPABASE_URL || process.env.SUPABASE_URL,
28
+ key: process.env.SPIDERSAN_SUPABASE_KEY || process.env.SUPABASE_KEY,
29
+ };
30
+ }
31
+ /**
32
+ * Env → config.storage. The default for commands; null when unconfigured.
33
+ */
34
+ export async function resolveSupabaseCredentials(basePath) {
35
+ const env = resolveSupabaseEnv();
36
+ const config = await loadConfig(basePath);
37
+ const url = env.url || config.storage.supabaseUrl;
38
+ const key = env.key || config.storage.supabaseKey;
39
+ if (!url || !key)
40
+ return null;
41
+ return { url, key };
42
+ }
43
+ //# sourceMappingURL=supabase-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-credentials.js","sourceRoot":"","sources":["../../src/lib/supabase-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAC9B,OAAO;QACH,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QACnE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;KACtE,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC5C,QAAiB;IAEjB,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAClD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAElD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Trunk branch detection.
3
+ *
4
+ * Centralizes the "which branch is trunk?" question that was previously
5
+ * hardcoded as `main`/`master` in several places.
6
+ *
7
+ * Resolution order (first hit wins):
8
+ * 1. `git symbolic-ref refs/remotes/origin/HEAD` (strip the `origin/` prefix)
9
+ * 2. `.spidersanrc` `trunk` key
10
+ * 3. `main` — if that branch exists
11
+ * 4. `master` — if that branch exists
12
+ * 5. `'main'` — default fallback
13
+ *
14
+ * Pure + cached per `cwd` within a process. Tolerates a missing
15
+ * `origin/HEAD` (fresh clones throw — we catch and fall through).
16
+ */
17
+ /**
18
+ * Resolve the repo's trunk branch name.
19
+ *
20
+ * @param opts.cwd - Repo directory (defaults to `process.cwd()`).
21
+ * @returns The trunk branch name (e.g. `'main'`, `'master'`, `'develop'`).
22
+ */
23
+ export declare function getTrunkBranch(opts?: {
24
+ cwd?: string;
25
+ }): string;
26
+ /**
27
+ * True if `branch` is the repo's trunk.
28
+ *
29
+ * @param branch - Branch name to test.
30
+ * @param opts.cwd - Repo directory (defaults to `process.cwd()`).
31
+ */
32
+ export declare function isTrunk(branch: string, opts?: {
33
+ cwd?: string;
34
+ }): boolean;
35
+ /**
36
+ * Clear the per-cwd trunk cache. Intended for tests; harmless in production.
37
+ */
38
+ export declare function _clearTrunkCache(): void;
39
+ //# sourceMappingURL=trunk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trunk.d.ts","sourceRoot":"","sources":["../../src/lib/trunk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA0EH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQ9D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAExE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Trunk branch detection.
3
+ *
4
+ * Centralizes the "which branch is trunk?" question that was previously
5
+ * hardcoded as `main`/`master` in several places.
6
+ *
7
+ * Resolution order (first hit wins):
8
+ * 1. `git symbolic-ref refs/remotes/origin/HEAD` (strip the `origin/` prefix)
9
+ * 2. `.spidersanrc` `trunk` key
10
+ * 3. `main` — if that branch exists
11
+ * 4. `master` — if that branch exists
12
+ * 5. `'main'` — default fallback
13
+ *
14
+ * Pure + cached per `cwd` within a process. Tolerates a missing
15
+ * `origin/HEAD` (fresh clones throw — we catch and fall through).
16
+ */
17
+ import { existsSync, readFileSync } from 'fs';
18
+ import { join } from 'path';
19
+ import { execGit } from './git.js';
20
+ const CONFIG_FILES = ['.spidersanrc', '.spidersanrc.json', '.spidersan.config.json'];
21
+ // Per-cwd cache so repeated calls within a process don't re-shell out to git.
22
+ const cache = new Map();
23
+ function resolveCwd(opts) {
24
+ return opts?.cwd ?? process.cwd();
25
+ }
26
+ /** origin/HEAD symbolic-ref → branch name, or null if unset / fresh clone. */
27
+ function fromOriginHead(cwd) {
28
+ try {
29
+ const out = execGit(['-C', cwd, 'symbolic-ref', 'refs/remotes/origin/HEAD'], {
30
+ stdio: ['pipe', 'pipe', 'ignore'],
31
+ }).trim();
32
+ // e.g. "refs/remotes/origin/develop" → "develop"
33
+ const prefix = 'refs/remotes/origin/';
34
+ const ref = out.startsWith(prefix) ? out.slice(prefix.length) : out.replace(/^origin\//, '');
35
+ return ref || null;
36
+ }
37
+ catch {
38
+ // Fresh clones / no origin/HEAD set: throws — fall through.
39
+ return null;
40
+ }
41
+ }
42
+ /** `.spidersanrc` `trunk` key (project-local), or null if absent/unreadable. */
43
+ function fromConfig(cwd) {
44
+ for (const filename of CONFIG_FILES) {
45
+ const path = join(cwd, filename);
46
+ if (!existsSync(path))
47
+ continue;
48
+ try {
49
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
50
+ const trunk = parsed?.trunk;
51
+ if (typeof trunk === 'string' && trunk.trim()) {
52
+ return trunk.trim();
53
+ }
54
+ }
55
+ catch {
56
+ // Malformed config — ignore and keep looking.
57
+ }
58
+ }
59
+ return null;
60
+ }
61
+ /** True if a local branch ref exists. */
62
+ function branchExists(cwd, branch) {
63
+ try {
64
+ execGit(['-C', cwd, 'rev-parse', '--verify', `refs/heads/${branch}`], {
65
+ stdio: ['pipe', 'pipe', 'ignore'],
66
+ });
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ function resolveTrunk(cwd) {
74
+ const fromHead = fromOriginHead(cwd);
75
+ if (fromHead)
76
+ return fromHead;
77
+ const fromCfg = fromConfig(cwd);
78
+ if (fromCfg)
79
+ return fromCfg;
80
+ if (branchExists(cwd, 'main'))
81
+ return 'main';
82
+ if (branchExists(cwd, 'master'))
83
+ return 'master';
84
+ return 'main';
85
+ }
86
+ /**
87
+ * Resolve the repo's trunk branch name.
88
+ *
89
+ * @param opts.cwd - Repo directory (defaults to `process.cwd()`).
90
+ * @returns The trunk branch name (e.g. `'main'`, `'master'`, `'develop'`).
91
+ */
92
+ export function getTrunkBranch(opts) {
93
+ const cwd = resolveCwd(opts);
94
+ const cached = cache.get(cwd);
95
+ if (cached !== undefined)
96
+ return cached;
97
+ const trunk = resolveTrunk(cwd);
98
+ cache.set(cwd, trunk);
99
+ return trunk;
100
+ }
101
+ /**
102
+ * True if `branch` is the repo's trunk.
103
+ *
104
+ * @param branch - Branch name to test.
105
+ * @param opts.cwd - Repo directory (defaults to `process.cwd()`).
106
+ */
107
+ export function isTrunk(branch, opts) {
108
+ return branch === getTrunkBranch(opts);
109
+ }
110
+ /**
111
+ * Clear the per-cwd trunk cache. Intended for tests; harmless in production.
112
+ */
113
+ export function _clearTrunkCache() {
114
+ cache.clear();
115
+ }
116
+ //# sourceMappingURL=trunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trunk.js","sourceRoot":"","sources":["../../src/lib/trunk.ts"],"names":[],"mappings":"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"}
@@ -9,8 +9,27 @@ export interface Branch {
9
9
  files: string[];
10
10
  registeredAt: Date;
11
11
  agent?: string;
12
+ /**
13
+ * Claude Code session (the id `tbe`/ccsessions lists) that last registered this
14
+ * branch, so a conflict can say WHICH session to resume. Local registry only:
15
+ * meaningless off the machine that owns the session, and not synced to Supabase.
16
+ */
17
+ sessionId?: string;
12
18
  status: 'active' | 'completed' | 'abandoned';
13
19
  description?: string;
20
+ /** Branches that must merge BEFORE this one (`spidersan depends`). */
21
+ dependsOn?: string[];
22
+ /** PR that merged this branch (`spidersan merged --pr`). */
23
+ prNumber?: number;
24
+ /**
25
+ * Per-file claims from before 0.20.0, when `watch` and `spidersan
26
+ * claim`/`release` wrote them. Nothing writes this any more; it stays
27
+ * so registries that still carry it keep parsing.
28
+ */
29
+ claims?: Record<string, {
30
+ agent: string;
31
+ at: string;
32
+ }>;
14
33
  }
15
34
  export interface BranchRegistry {
16
35
  branches: Record<string, Branch>;
@@ -57,6 +76,6 @@ export interface StorageAdapter {
57
76
  /**
58
77
  * Clean up old branches
59
78
  */
60
- cleanup(olderThan: Date): Promise<string[]>;
79
+ cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
61
80
  }
62
81
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAElC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvE;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhD;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC/C"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAElC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvE;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhD;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxE"}
@@ -8,6 +8,6 @@ export interface BranchRegistryStore {
8
8
  unregister(name: string): Promise<boolean>;
9
9
  get(name: string): Promise<Branch | null>;
10
10
  findByFiles(files: string[]): Promise<Branch[]>;
11
- cleanup(olderThan: Date): Promise<string[]>;
11
+ cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
12
12
  }
13
13
  //# sourceMappingURL=branch-registry-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/branch-registry-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAChC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC/C"}
1
+ {"version":3,"file":"branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/branch-registry-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAChC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxE"}
@@ -2,9 +2,5 @@
2
2
  * Storage factory - selects the right storage backend
3
3
  */
4
4
  import type { StorageAdapter } from './adapter.js';
5
- import type { BranchRegistryStore } from './branch-registry-store.js';
6
- import type { SupabaseRegistrySyncClient } from './supabase-registry-sync-client.js';
7
- export declare function getBranchRegistryStore(basePath?: string): Promise<BranchRegistryStore>;
8
- export declare function getSupabaseRegistrySyncClient(): Promise<SupabaseRegistrySyncClient | null>;
9
5
  export declare function getStorage(): Promise<StorageAdapter>;
10
6
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAwBrF,wBAAsB,sBAAsB,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAE3G;AAED,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAOhG;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAQ1D"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAQ1D"}
@@ -1,35 +1,11 @@
1
1
  /**
2
2
  * Storage factory - selects the right storage backend
3
3
  */
4
- import { JsonBranchRegistryStore } from './json-branch-registry-store.js';
5
4
  import { LocalStorage } from './local.js';
6
5
  import { SupabaseStorage } from './supabase.js';
7
- import { SupabaseRegistrySyncClientImpl } from './supabase-registry-sync-client-impl.js';
8
- import { loadConfig } from '../lib/config.js';
9
- async function getSupabaseConfig() {
10
- const config = await loadConfig();
11
- const supabaseUrl = process.env.SUPABASE_URL || config.storage.supabaseUrl;
12
- const supabaseKey = process.env.SUPABASE_KEY || config.storage.supabaseKey;
13
- if (!supabaseUrl || !supabaseKey) {
14
- return null;
15
- }
16
- return {
17
- url: supabaseUrl,
18
- key: supabaseKey,
19
- };
20
- }
21
- export async function getBranchRegistryStore(basePath = process.cwd()) {
22
- return new JsonBranchRegistryStore(basePath);
23
- }
24
- export async function getSupabaseRegistrySyncClient() {
25
- const config = await getSupabaseConfig();
26
- if (!config) {
27
- return null;
28
- }
29
- return new SupabaseRegistrySyncClientImpl(config);
30
- }
6
+ import { resolveSupabaseCredentials } from '../lib/supabase-credentials.js';
31
7
  export async function getStorage() {
32
- const supabaseConfig = await getSupabaseConfig();
8
+ const supabaseConfig = await resolveSupabaseCredentials();
33
9
  if (supabaseConfig) {
34
10
  return new SupabaseStorage(supabaseConfig);
35
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIhD,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAO9C,KAAK,UAAU,iBAAiB;IAC5B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAE3E,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,GAAG,EAAE,WAAW;QAChB,GAAG,EAAE,WAAW;KACnB,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IACzE,OAAO,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B;IAC/C,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,8BAA8B,CAAC,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEjD,IAAI,cAAc,EAAE,CAAC;QACjB,OAAO,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,YAAY,EAAE,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,cAAc,GAAG,MAAM,0BAA0B,EAAE,CAAC;IAE1D,IAAI,cAAc,EAAE,CAAC;QACjB,OAAO,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,YAAY,EAAE,CAAC;AAC9B,CAAC"}
@@ -12,7 +12,7 @@ export declare class JsonBranchRegistryStore implements BranchRegistryStore {
12
12
  unregister(name: string): Promise<boolean>;
13
13
  get(name: string): Promise<Branch | null>;
14
14
  findByFiles(files: string[]): Promise<Branch[]>;
15
- cleanup(olderThan: Date): Promise<string[]>;
15
+ cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
16
16
  private load;
17
17
  private save;
18
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"json-branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/json-branch-registry-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA6BtE,qBAAa,uBAAwB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAKtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAetE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM/C,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAkBnC,IAAI;YASJ,IAAI;CAGrB"}
1
+ {"version":3,"file":"json-branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/json-branch-registry-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA6BtE,qBAAa,uBAAwB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAKtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAetE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM/C,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAuB1D,IAAI;YA+BJ,IAAI;CAMrB"}
@@ -1,5 +1,5 @@
1
1
  import { existsSync } from 'fs';
2
- import { mkdir, readFile, writeFile } from 'fs/promises';
2
+ import { mkdir, readFile, writeFile, rename } from 'fs/promises';
3
3
  import { join } from 'path';
4
4
  const SPIDERSAN_DIR = '.spidersan';
5
5
  const REGISTRY_FILE = 'registry.json';
@@ -82,10 +82,15 @@ export class JsonBranchRegistryStore {
82
82
  const fileSet = new Set(files);
83
83
  return branches.filter((branch) => branch.files.some((file) => fileSet.has(file)));
84
84
  }
85
- async cleanup(olderThan) {
85
+ async cleanup(olderThan, includeActive = false) {
86
86
  const registry = await this.load();
87
87
  const removedNames = [];
88
88
  for (const [name, branch] of Object.entries(registry.branches)) {
89
+ // registeredAt is never refreshed, so an old ACTIVE registration
90
+ // usually means in-flight work — skip unless explicitly included.
91
+ if (!includeActive && branch.status === 'active') {
92
+ continue;
93
+ }
89
94
  if (branch.registeredAt < olderThan) {
90
95
  delete registry.branches[name];
91
96
  removedNames.push(name);
@@ -97,16 +102,37 @@ export class JsonBranchRegistryStore {
97
102
  return removedNames;
98
103
  }
99
104
  async load() {
105
+ let data;
100
106
  try {
101
- const data = await readFile(this.registryPath, 'utf-8');
102
- return normalizeRegistry(JSON.parse(data));
107
+ data = await readFile(this.registryPath, 'utf-8');
108
+ }
109
+ catch (err) {
110
+ if (err.code === 'ENOENT') {
111
+ return { branches: {}, version: REGISTRY_VERSION };
112
+ }
113
+ throw err;
103
114
  }
104
- catch {
105
- return { branches: {}, version: REGISTRY_VERSION };
115
+ // A file that EXISTS but doesn't parse must fail loudly — returning an
116
+ // empty registry here would let the next save() wipe every agent's
117
+ // registration.
118
+ const parsed = JSON.parse(data);
119
+ // Same loudness for a WRONG SHAPE: `branches` must be a name-keyed
120
+ // plain object. An array (e.g. from a stray `jq map()` edit) parses
121
+ // fine but breaks every keyed lookup — register/update/unregister all
122
+ // silently miss while list() keeps working (tb-orpt).
123
+ if (parsed === null || typeof parsed !== 'object' ||
124
+ parsed.branches === null || typeof parsed.branches !== 'object' ||
125
+ Array.isArray(parsed.branches)) {
126
+ throw new Error(`Corrupt registry at ${this.registryPath}: "branches" must be an object keyed by branch name. ` +
127
+ 'Restore it or re-init; refusing to operate on it.');
106
128
  }
129
+ return normalizeRegistry(parsed);
107
130
  }
108
131
  async save(registry) {
109
- await writeFile(this.registryPath, JSON.stringify(registry, null, 2));
132
+ // Write-then-rename so a crash mid-write can't truncate registry.json.
133
+ const tmp = `${this.registryPath}.${process.pid}.tmp`;
134
+ await writeFile(tmp, JSON.stringify(registry, null, 2));
135
+ await rename(tmp, this.registryPath);
110
136
  }
111
137
  }
112
138
  //# sourceMappingURL=json-branch-registry-store.js.map