spidersan 0.10.0 → 0.20.1

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 (479) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/README.md +39 -280
  3. package/package.json +88 -90
  4. package/dist/bin/spidersan.d.ts +0 -9
  5. package/dist/bin/spidersan.d.ts.map +0 -1
  6. package/dist/bin/spidersan.js +0 -117
  7. package/dist/bin/spidersan.js.map +0 -1
  8. package/dist/commands/abandon.d.ts +0 -8
  9. package/dist/commands/abandon.d.ts.map +0 -1
  10. package/dist/commands/abandon.js +0 -43
  11. package/dist/commands/abandon.js.map +0 -1
  12. package/dist/commands/activate.d.ts +0 -9
  13. package/dist/commands/activate.d.ts.map +0 -1
  14. package/dist/commands/activate.js +0 -45
  15. package/dist/commands/activate.js.map +0 -1
  16. package/dist/commands/active-windows.d.ts +0 -16
  17. package/dist/commands/active-windows.d.ts.map +0 -1
  18. package/dist/commands/active-windows.js +0 -373
  19. package/dist/commands/active-windows.js.map +0 -1
  20. package/dist/commands/ai.d.ts +0 -15
  21. package/dist/commands/ai.d.ts.map +0 -1
  22. package/dist/commands/ai.js +0 -498
  23. package/dist/commands/ai.js.map +0 -1
  24. package/dist/commands/audit-mark.d.ts +0 -12
  25. package/dist/commands/audit-mark.d.ts.map +0 -1
  26. package/dist/commands/audit-mark.js +0 -204
  27. package/dist/commands/audit-mark.js.map +0 -1
  28. package/dist/commands/auto.d.ts +0 -8
  29. package/dist/commands/auto.d.ts.map +0 -1
  30. package/dist/commands/auto.js +0 -207
  31. package/dist/commands/auto.js.map +0 -1
  32. package/dist/commands/bot.d.ts +0 -16
  33. package/dist/commands/bot.d.ts.map +0 -1
  34. package/dist/commands/bot.js +0 -416
  35. package/dist/commands/bot.js.map +0 -1
  36. package/dist/commands/cleanup.d.ts +0 -8
  37. package/dist/commands/cleanup.d.ts.map +0 -1
  38. package/dist/commands/cleanup.js +0 -36
  39. package/dist/commands/cleanup.js.map +0 -1
  40. package/dist/commands/close.d.ts +0 -9
  41. package/dist/commands/close.d.ts.map +0 -1
  42. package/dist/commands/close.js +0 -129
  43. package/dist/commands/close.js.map +0 -1
  44. package/dist/commands/collab-sync.d.ts +0 -14
  45. package/dist/commands/collab-sync.d.ts.map +0 -1
  46. package/dist/commands/collab-sync.js +0 -264
  47. package/dist/commands/collab-sync.js.map +0 -1
  48. package/dist/commands/collab.d.ts +0 -6
  49. package/dist/commands/collab.d.ts.map +0 -1
  50. package/dist/commands/collab.js +0 -103
  51. package/dist/commands/collab.js.map +0 -1
  52. package/dist/commands/completions.d.ts +0 -8
  53. package/dist/commands/completions.d.ts.map +0 -1
  54. package/dist/commands/completions.js +0 -83
  55. package/dist/commands/completions.js.map +0 -1
  56. package/dist/commands/config.d.ts +0 -15
  57. package/dist/commands/config.d.ts.map +0 -1
  58. package/dist/commands/config.js +0 -337
  59. package/dist/commands/config.js.map +0 -1
  60. package/dist/commands/conflicts.d.ts +0 -12
  61. package/dist/commands/conflicts.d.ts.map +0 -1
  62. package/dist/commands/conflicts.js +0 -570
  63. package/dist/commands/conflicts.js.map +0 -1
  64. package/dist/commands/context.d.ts +0 -8
  65. package/dist/commands/context.d.ts.map +0 -1
  66. package/dist/commands/context.js +0 -104
  67. package/dist/commands/context.js.map +0 -1
  68. package/dist/commands/cross-conflicts.d.ts +0 -17
  69. package/dist/commands/cross-conflicts.d.ts.map +0 -1
  70. package/dist/commands/cross-conflicts.js +0 -274
  71. package/dist/commands/cross-conflicts.js.map +0 -1
  72. package/dist/commands/daily.d.ts +0 -7
  73. package/dist/commands/daily.d.ts.map +0 -1
  74. package/dist/commands/daily.js +0 -171
  75. package/dist/commands/daily.js.map +0 -1
  76. package/dist/commands/dashboard.d.ts +0 -22
  77. package/dist/commands/dashboard.d.ts.map +0 -1
  78. package/dist/commands/dashboard.js +0 -401
  79. package/dist/commands/dashboard.js.map +0 -1
  80. package/dist/commands/demo.d.ts +0 -3
  81. package/dist/commands/demo.d.ts.map +0 -1
  82. package/dist/commands/demo.js +0 -118
  83. package/dist/commands/demo.js.map +0 -1
  84. package/dist/commands/depends.d.ts +0 -8
  85. package/dist/commands/depends.d.ts.map +0 -1
  86. package/dist/commands/depends.js +0 -36
  87. package/dist/commands/depends.js.map +0 -1
  88. package/dist/commands/doctor.d.ts +0 -30
  89. package/dist/commands/doctor.d.ts.map +0 -1
  90. package/dist/commands/doctor.js +0 -540
  91. package/dist/commands/doctor.js.map +0 -1
  92. package/dist/commands/ecosystem-loader.d.ts +0 -14
  93. package/dist/commands/ecosystem-loader.d.ts.map +0 -1
  94. package/dist/commands/ecosystem-loader.js +0 -90
  95. package/dist/commands/ecosystem-loader.js.map +0 -1
  96. package/dist/commands/fleet-status.d.ts +0 -14
  97. package/dist/commands/fleet-status.d.ts.map +0 -1
  98. package/dist/commands/fleet-status.js +0 -127
  99. package/dist/commands/fleet-status.js.map +0 -1
  100. package/dist/commands/git-watch.d.ts +0 -24
  101. package/dist/commands/git-watch.d.ts.map +0 -1
  102. package/dist/commands/git-watch.js +0 -84
  103. package/dist/commands/git-watch.js.map +0 -1
  104. package/dist/commands/github-sync.d.ts +0 -9
  105. package/dist/commands/github-sync.d.ts.map +0 -1
  106. package/dist/commands/github-sync.js +0 -180
  107. package/dist/commands/github-sync.js.map +0 -1
  108. package/dist/commands/inbox.d.ts +0 -3
  109. package/dist/commands/inbox.d.ts.map +0 -1
  110. package/dist/commands/inbox.js +0 -120
  111. package/dist/commands/inbox.js.map +0 -1
  112. package/dist/commands/index.d.ts +0 -36
  113. package/dist/commands/index.d.ts.map +0 -1
  114. package/dist/commands/index.js +0 -44
  115. package/dist/commands/index.js.map +0 -1
  116. package/dist/commands/init.d.ts +0 -8
  117. package/dist/commands/init.d.ts.map +0 -1
  118. package/dist/commands/init.js +0 -23
  119. package/dist/commands/init.js.map +0 -1
  120. package/dist/commands/intent-scan.d.ts +0 -17
  121. package/dist/commands/intent-scan.d.ts.map +0 -1
  122. package/dist/commands/intent-scan.js +0 -336
  123. package/dist/commands/intent-scan.js.map +0 -1
  124. package/dist/commands/key-import.d.ts +0 -3
  125. package/dist/commands/key-import.d.ts.map +0 -1
  126. package/dist/commands/key-import.js +0 -54
  127. package/dist/commands/key-import.js.map +0 -1
  128. package/dist/commands/keygen.d.ts +0 -3
  129. package/dist/commands/keygen.d.ts.map +0 -1
  130. package/dist/commands/keygen.js +0 -53
  131. package/dist/commands/keygen.js.map +0 -1
  132. package/dist/commands/keys.d.ts +0 -3
  133. package/dist/commands/keys.d.ts.map +0 -1
  134. package/dist/commands/keys.js +0 -56
  135. package/dist/commands/keys.js.map +0 -1
  136. package/dist/commands/list.d.ts +0 -3
  137. package/dist/commands/list.d.ts.map +0 -1
  138. package/dist/commands/list.js +0 -45
  139. package/dist/commands/list.js.map +0 -1
  140. package/dist/commands/lock.d.ts +0 -11
  141. package/dist/commands/lock.d.ts.map +0 -1
  142. package/dist/commands/lock.js +0 -257
  143. package/dist/commands/lock.js.map +0 -1
  144. package/dist/commands/log.d.ts +0 -7
  145. package/dist/commands/log.d.ts.map +0 -1
  146. package/dist/commands/log.js +0 -110
  147. package/dist/commands/log.js.map +0 -1
  148. package/dist/commands/mcp-health.d.ts +0 -3
  149. package/dist/commands/mcp-health.d.ts.map +0 -1
  150. package/dist/commands/mcp-health.js +0 -305
  151. package/dist/commands/mcp-health.js.map +0 -1
  152. package/dist/commands/mcp-restart.d.ts +0 -3
  153. package/dist/commands/mcp-restart.d.ts.map +0 -1
  154. package/dist/commands/mcp-restart.js +0 -176
  155. package/dist/commands/mcp-restart.js.map +0 -1
  156. package/dist/commands/merge-order.d.ts +0 -9
  157. package/dist/commands/merge-order.d.ts.map +0 -1
  158. package/dist/commands/merge-order.js +0 -96
  159. package/dist/commands/merge-order.js.map +0 -1
  160. package/dist/commands/merged.d.ts +0 -8
  161. package/dist/commands/merged.d.ts.map +0 -1
  162. package/dist/commands/merged.js +0 -33
  163. package/dist/commands/merged.js.map +0 -1
  164. package/dist/commands/monitor.d.ts +0 -3
  165. package/dist/commands/monitor.d.ts.map +0 -1
  166. package/dist/commands/monitor.js +0 -153
  167. package/dist/commands/monitor.js.map +0 -1
  168. package/dist/commands/msg-read.d.ts +0 -3
  169. package/dist/commands/msg-read.d.ts.map +0 -1
  170. package/dist/commands/msg-read.js +0 -95
  171. package/dist/commands/msg-read.js.map +0 -1
  172. package/dist/commands/pulse.d.ts +0 -13
  173. package/dist/commands/pulse.d.ts.map +0 -1
  174. package/dist/commands/pulse.js +0 -174
  175. package/dist/commands/pulse.js.map +0 -1
  176. package/dist/commands/queen.d.ts +0 -25
  177. package/dist/commands/queen.d.ts.map +0 -1
  178. package/dist/commands/queen.js +0 -326
  179. package/dist/commands/queen.js.map +0 -1
  180. package/dist/commands/radar.d.ts +0 -3
  181. package/dist/commands/radar.d.ts.map +0 -1
  182. package/dist/commands/radar.js +0 -147
  183. package/dist/commands/radar.js.map +0 -1
  184. package/dist/commands/ready-check.d.ts +0 -11
  185. package/dist/commands/ready-check.d.ts.map +0 -1
  186. package/dist/commands/ready-check.js +0 -147
  187. package/dist/commands/ready-check.js.map +0 -1
  188. package/dist/commands/rebase-helper.d.ts +0 -3
  189. package/dist/commands/rebase-helper.d.ts.map +0 -1
  190. package/dist/commands/rebase-helper.js +0 -52
  191. package/dist/commands/rebase-helper.js.map +0 -1
  192. package/dist/commands/register.d.ts +0 -5
  193. package/dist/commands/register.d.ts.map +0 -1
  194. package/dist/commands/register.js +0 -163
  195. package/dist/commands/register.js.map +0 -1
  196. package/dist/commands/registry-sync.d.ts +0 -9
  197. package/dist/commands/registry-sync.d.ts.map +0 -1
  198. package/dist/commands/registry-sync.js +0 -163
  199. package/dist/commands/registry-sync.js.map +0 -1
  200. package/dist/commands/rescue.d.ts +0 -11
  201. package/dist/commands/rescue.d.ts.map +0 -1
  202. package/dist/commands/rescue.js +0 -147
  203. package/dist/commands/rescue.js.map +0 -1
  204. package/dist/commands/semantic.d.ts +0 -3
  205. package/dist/commands/semantic.d.ts.map +0 -1
  206. package/dist/commands/semantic.js +0 -62
  207. package/dist/commands/semantic.js.map +0 -1
  208. package/dist/commands/send.d.ts +0 -3
  209. package/dist/commands/send.d.ts.map +0 -1
  210. package/dist/commands/send.js +0 -121
  211. package/dist/commands/send.js.map +0 -1
  212. package/dist/commands/stale.d.ts +0 -17
  213. package/dist/commands/stale.d.ts.map +0 -1
  214. package/dist/commands/stale.js +0 -131
  215. package/dist/commands/stale.js.map +0 -1
  216. package/dist/commands/status.d.ts +0 -9
  217. package/dist/commands/status.d.ts.map +0 -1
  218. package/dist/commands/status.js +0 -41
  219. package/dist/commands/status.js.map +0 -1
  220. package/dist/commands/sync-advisor.d.ts +0 -14
  221. package/dist/commands/sync-advisor.d.ts.map +0 -1
  222. package/dist/commands/sync-advisor.js +0 -110
  223. package/dist/commands/sync-advisor.js.map +0 -1
  224. package/dist/commands/sync.d.ts +0 -8
  225. package/dist/commands/sync.d.ts.map +0 -1
  226. package/dist/commands/sync.js +0 -60
  227. package/dist/commands/sync.js.map +0 -1
  228. package/dist/commands/tension.d.ts +0 -12
  229. package/dist/commands/tension.d.ts.map +0 -1
  230. package/dist/commands/tension.js +0 -262
  231. package/dist/commands/tension.js.map +0 -1
  232. package/dist/commands/torrent.d.ts +0 -9
  233. package/dist/commands/torrent.d.ts.map +0 -1
  234. package/dist/commands/torrent.js +0 -470
  235. package/dist/commands/torrent.js.map +0 -1
  236. package/dist/commands/tui.d.ts +0 -8
  237. package/dist/commands/tui.d.ts.map +0 -1
  238. package/dist/commands/tui.js +0 -15
  239. package/dist/commands/tui.js.map +0 -1
  240. package/dist/commands/wake.d.ts +0 -9
  241. package/dist/commands/wake.d.ts.map +0 -1
  242. package/dist/commands/wake.js +0 -188
  243. package/dist/commands/wake.js.map +0 -1
  244. package/dist/commands/watch.d.ts +0 -9
  245. package/dist/commands/watch.d.ts.map +0 -1
  246. package/dist/commands/watch.js +0 -536
  247. package/dist/commands/watch.js.map +0 -1
  248. package/dist/commands/welcome.d.ts +0 -8
  249. package/dist/commands/welcome.d.ts.map +0 -1
  250. package/dist/commands/welcome.js +0 -85
  251. package/dist/commands/welcome.js.map +0 -1
  252. package/dist/commands/who-owns.d.ts +0 -3
  253. package/dist/commands/who-owns.d.ts.map +0 -1
  254. package/dist/commands/who-owns.js +0 -68
  255. package/dist/commands/who-owns.js.map +0 -1
  256. package/dist/commands/who-touched.d.ts +0 -9
  257. package/dist/commands/who-touched.d.ts.map +0 -1
  258. package/dist/commands/who-touched.js +0 -198
  259. package/dist/commands/who-touched.js.map +0 -1
  260. package/dist/index.d.ts +0 -11
  261. package/dist/index.d.ts.map +0 -1
  262. package/dist/index.js +0 -11
  263. package/dist/index.js.map +0 -1
  264. package/dist/lib/activity.d.ts +0 -53
  265. package/dist/lib/activity.d.ts.map +0 -1
  266. package/dist/lib/activity.js +0 -267
  267. package/dist/lib/activity.js.map +0 -1
  268. package/dist/lib/agent-errors.d.ts +0 -41
  269. package/dist/lib/agent-errors.d.ts.map +0 -1
  270. package/dist/lib/agent-errors.js +0 -145
  271. package/dist/lib/agent-errors.js.map +0 -1
  272. package/dist/lib/ai/context-builder.d.ts +0 -16
  273. package/dist/lib/ai/context-builder.d.ts.map +0 -1
  274. package/dist/lib/ai/context-builder.js +0 -216
  275. package/dist/lib/ai/context-builder.js.map +0 -1
  276. package/dist/lib/ai/event-handler.d.ts +0 -21
  277. package/dist/lib/ai/event-handler.d.ts.map +0 -1
  278. package/dist/lib/ai/event-handler.js +0 -98
  279. package/dist/lib/ai/event-handler.js.map +0 -1
  280. package/dist/lib/ai/index.d.ts +0 -13
  281. package/dist/lib/ai/index.d.ts.map +0 -1
  282. package/dist/lib/ai/index.js +0 -11
  283. package/dist/lib/ai/index.js.map +0 -1
  284. package/dist/lib/ai/llm-client.d.ts +0 -37
  285. package/dist/lib/ai/llm-client.d.ts.map +0 -1
  286. package/dist/lib/ai/llm-client.js +0 -225
  287. package/dist/lib/ai/llm-client.js.map +0 -1
  288. package/dist/lib/ai/reasoner.d.ts +0 -11
  289. package/dist/lib/ai/reasoner.d.ts.map +0 -1
  290. package/dist/lib/ai/reasoner.js +0 -246
  291. package/dist/lib/ai/reasoner.js.map +0 -1
  292. package/dist/lib/ai/setup.d.ts +0 -40
  293. package/dist/lib/ai/setup.d.ts.map +0 -1
  294. package/dist/lib/ai/setup.js +0 -154
  295. package/dist/lib/ai/setup.js.map +0 -1
  296. package/dist/lib/ai/types.d.ts +0 -135
  297. package/dist/lib/ai/types.d.ts.map +0 -1
  298. package/dist/lib/ai/types.js +0 -39
  299. package/dist/lib/ai/types.js.map +0 -1
  300. package/dist/lib/ast.d.ts +0 -36
  301. package/dist/lib/ast.d.ts.map +0 -1
  302. package/dist/lib/ast.js +0 -135
  303. package/dist/lib/ast.js.map +0 -1
  304. package/dist/lib/colony-subscriber.d.ts +0 -56
  305. package/dist/lib/colony-subscriber.d.ts.map +0 -1
  306. package/dist/lib/colony-subscriber.js +0 -265
  307. package/dist/lib/colony-subscriber.js.map +0 -1
  308. package/dist/lib/config.d.ts +0 -62
  309. package/dist/lib/config.d.ts.map +0 -1
  310. package/dist/lib/config.js +0 -230
  311. package/dist/lib/config.js.map +0 -1
  312. package/dist/lib/conflict-analyzer.d.ts +0 -33
  313. package/dist/lib/conflict-analyzer.d.ts.map +0 -1
  314. package/dist/lib/conflict-analyzer.js +0 -114
  315. package/dist/lib/conflict-analyzer.js.map +0 -1
  316. package/dist/lib/conflict-renderer.d.ts +0 -7
  317. package/dist/lib/conflict-renderer.d.ts.map +0 -1
  318. package/dist/lib/conflict-renderer.js +0 -162
  319. package/dist/lib/conflict-renderer.js.map +0 -1
  320. package/dist/lib/conflict-tier.d.ts +0 -20
  321. package/dist/lib/conflict-tier.d.ts.map +0 -1
  322. package/dist/lib/conflict-tier.js +0 -49
  323. package/dist/lib/conflict-tier.js.map +0 -1
  324. package/dist/lib/crdt.d.ts +0 -83
  325. package/dist/lib/crdt.d.ts.map +0 -1
  326. package/dist/lib/crdt.js +0 -160
  327. package/dist/lib/crdt.js.map +0 -1
  328. package/dist/lib/crypto.d.ts +0 -71
  329. package/dist/lib/crypto.d.ts.map +0 -1
  330. package/dist/lib/crypto.js +0 -176
  331. package/dist/lib/crypto.js.map +0 -1
  332. package/dist/lib/daily-bridge.d.ts +0 -41
  333. package/dist/lib/daily-bridge.d.ts.map +0 -1
  334. package/dist/lib/daily-bridge.js +0 -186
  335. package/dist/lib/daily-bridge.js.map +0 -1
  336. package/dist/lib/errors.d.ts +0 -35
  337. package/dist/lib/errors.d.ts.map +0 -1
  338. package/dist/lib/errors.js +0 -71
  339. package/dist/lib/errors.js.map +0 -1
  340. package/dist/lib/git-events-subscriber.d.ts +0 -59
  341. package/dist/lib/git-events-subscriber.d.ts.map +0 -1
  342. package/dist/lib/git-events-subscriber.js +0 -779
  343. package/dist/lib/git-events-subscriber.js.map +0 -1
  344. package/dist/lib/git.d.ts +0 -15
  345. package/dist/lib/git.d.ts.map +0 -1
  346. package/dist/lib/git.js +0 -180
  347. package/dist/lib/git.js.map +0 -1
  348. package/dist/lib/github.d.ts +0 -83
  349. package/dist/lib/github.d.ts.map +0 -1
  350. package/dist/lib/github.js +0 -211
  351. package/dist/lib/github.js.map +0 -1
  352. package/dist/lib/graph.d.ts +0 -23
  353. package/dist/lib/graph.d.ts.map +0 -1
  354. package/dist/lib/graph.js +0 -134
  355. package/dist/lib/graph.js.map +0 -1
  356. package/dist/lib/hub.d.ts +0 -31
  357. package/dist/lib/hub.d.ts.map +0 -1
  358. package/dist/lib/hub.js +0 -92
  359. package/dist/lib/hub.js.map +0 -1
  360. package/dist/lib/license.d.ts +0 -61
  361. package/dist/lib/license.d.ts.map +0 -1
  362. package/dist/lib/license.js +0 -171
  363. package/dist/lib/license.js.map +0 -1
  364. package/dist/lib/pulse-renderer.d.ts +0 -19
  365. package/dist/lib/pulse-renderer.d.ts.map +0 -1
  366. package/dist/lib/pulse-renderer.js +0 -108
  367. package/dist/lib/pulse-renderer.js.map +0 -1
  368. package/dist/lib/regex-utils.d.ts +0 -6
  369. package/dist/lib/regex-utils.d.ts.map +0 -1
  370. package/dist/lib/regex-utils.js +0 -24
  371. package/dist/lib/regex-utils.js.map +0 -1
  372. package/dist/lib/register-renderer.d.ts +0 -10
  373. package/dist/lib/register-renderer.d.ts.map +0 -1
  374. package/dist/lib/register-renderer.js +0 -19
  375. package/dist/lib/register-renderer.js.map +0 -1
  376. package/dist/lib/remote-drift.d.ts +0 -61
  377. package/dist/lib/remote-drift.d.ts.map +0 -1
  378. package/dist/lib/remote-drift.js +0 -227
  379. package/dist/lib/remote-drift.js.map +0 -1
  380. package/dist/lib/repo-scanner.d.ts +0 -32
  381. package/dist/lib/repo-scanner.d.ts.map +0 -1
  382. package/dist/lib/repo-scanner.js +0 -160
  383. package/dist/lib/repo-scanner.js.map +0 -1
  384. package/dist/lib/salvage-analyzer.d.ts +0 -29
  385. package/dist/lib/salvage-analyzer.d.ts.map +0 -1
  386. package/dist/lib/salvage-analyzer.js +0 -121
  387. package/dist/lib/salvage-analyzer.js.map +0 -1
  388. package/dist/lib/security.d.ts +0 -77
  389. package/dist/lib/security.d.ts.map +0 -1
  390. package/dist/lib/security.js +0 -190
  391. package/dist/lib/security.js.map +0 -1
  392. package/dist/lib/session-logger.d.ts +0 -54
  393. package/dist/lib/session-logger.d.ts.map +0 -1
  394. package/dist/lib/session-logger.js +0 -136
  395. package/dist/lib/session-logger.js.map +0 -1
  396. package/dist/lib/symbol-extractor.d.ts +0 -41
  397. package/dist/lib/symbol-extractor.d.ts.map +0 -1
  398. package/dist/lib/symbol-extractor.js +0 -78
  399. package/dist/lib/symbol-extractor.js.map +0 -1
  400. package/dist/lib/update-check.d.ts +0 -11
  401. package/dist/lib/update-check.d.ts.map +0 -1
  402. package/dist/lib/update-check.js +0 -113
  403. package/dist/lib/update-check.js.map +0 -1
  404. package/dist/lib/watch-renderer.d.ts +0 -13
  405. package/dist/lib/watch-renderer.d.ts.map +0 -1
  406. package/dist/lib/watch-renderer.js +0 -35
  407. package/dist/lib/watch-renderer.js.map +0 -1
  408. package/dist/storage/adapter.d.ts +0 -62
  409. package/dist/storage/adapter.d.ts.map +0 -1
  410. package/dist/storage/adapter.js +0 -8
  411. package/dist/storage/adapter.js.map +0 -1
  412. package/dist/storage/branch-registry-store.d.ts +0 -13
  413. package/dist/storage/branch-registry-store.d.ts.map +0 -1
  414. package/dist/storage/branch-registry-store.js +0 -2
  415. package/dist/storage/branch-registry-store.js.map +0 -1
  416. package/dist/storage/factory.d.ts +0 -10
  417. package/dist/storage/factory.d.ts.map +0 -1
  418. package/dist/storage/factory.js +0 -38
  419. package/dist/storage/factory.js.map +0 -1
  420. package/dist/storage/git-messages.d.ts +0 -53
  421. package/dist/storage/git-messages.d.ts.map +0 -1
  422. package/dist/storage/git-messages.js +0 -376
  423. package/dist/storage/git-messages.js.map +0 -1
  424. package/dist/storage/index.d.ts +0 -10
  425. package/dist/storage/index.d.ts.map +0 -1
  426. package/dist/storage/index.js +0 -11
  427. package/dist/storage/index.js.map +0 -1
  428. package/dist/storage/json-branch-registry-store.d.ts +0 -19
  429. package/dist/storage/json-branch-registry-store.d.ts.map +0 -1
  430. package/dist/storage/json-branch-registry-store.js +0 -112
  431. package/dist/storage/json-branch-registry-store.js.map +0 -1
  432. package/dist/storage/local-messages.d.ts +0 -37
  433. package/dist/storage/local-messages.d.ts.map +0 -1
  434. package/dist/storage/local-messages.js +0 -151
  435. package/dist/storage/local-messages.js.map +0 -1
  436. package/dist/storage/local.d.ts +0 -20
  437. package/dist/storage/local.d.ts.map +0 -1
  438. package/dist/storage/local.js +0 -40
  439. package/dist/storage/local.js.map +0 -1
  440. package/dist/storage/memory-branch-registry-store.d.ts +0 -16
  441. package/dist/storage/memory-branch-registry-store.d.ts.map +0 -1
  442. package/dist/storage/memory-branch-registry-store.js +0 -65
  443. package/dist/storage/memory-branch-registry-store.js.map +0 -1
  444. package/dist/storage/message-adapter.d.ts +0 -86
  445. package/dist/storage/message-adapter.d.ts.map +0 -1
  446. package/dist/storage/message-adapter.js +0 -28
  447. package/dist/storage/message-adapter.js.map +0 -1
  448. package/dist/storage/message-factory.d.ts +0 -36
  449. package/dist/storage/message-factory.d.ts.map +0 -1
  450. package/dist/storage/message-factory.js +0 -99
  451. package/dist/storage/message-factory.js.map +0 -1
  452. package/dist/storage/mycmail-adapter.d.ts +0 -38
  453. package/dist/storage/mycmail-adapter.d.ts.map +0 -1
  454. package/dist/storage/mycmail-adapter.js +0 -300
  455. package/dist/storage/mycmail-adapter.js.map +0 -1
  456. package/dist/storage/supabase-registry-sync-client-impl.d.ts +0 -46
  457. package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +0 -1
  458. package/dist/storage/supabase-registry-sync-client-impl.js +0 -322
  459. package/dist/storage/supabase-registry-sync-client-impl.js.map +0 -1
  460. package/dist/storage/supabase-registry-sync-client.d.ts +0 -9
  461. package/dist/storage/supabase-registry-sync-client.d.ts.map +0 -1
  462. package/dist/storage/supabase-registry-sync-client.js +0 -2
  463. package/dist/storage/supabase-registry-sync-client.js.map +0 -1
  464. package/dist/storage/supabase.d.ts +0 -34
  465. package/dist/storage/supabase.d.ts.map +0 -1
  466. package/dist/storage/supabase.js +0 -74
  467. package/dist/storage/supabase.js.map +0 -1
  468. package/dist/tui/dashboard.d.ts +0 -35
  469. package/dist/tui/dashboard.d.ts.map +0 -1
  470. package/dist/tui/dashboard.js +0 -199
  471. package/dist/tui/dashboard.js.map +0 -1
  472. package/dist/tui/screen.d.ts +0 -14
  473. package/dist/tui/screen.d.ts.map +0 -1
  474. package/dist/tui/screen.js +0 -138
  475. package/dist/tui/screen.js.map +0 -1
  476. package/dist/types/cloud.d.ts +0 -101
  477. package/dist/types/cloud.d.ts.map +0 -1
  478. package/dist/types/cloud.js +0 -13
  479. package/dist/types/cloud.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,169 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [0.20.1] - 2026-10-28
11
+
12
+ ### Fixed
13
+
14
+ - **The plugin's dangerous-`rm` block did not block** (`spidersan-pre.sh` v2.7). It
15
+ answered `{"continue": false}`, and Claude Code ran the command anyway and only stopped
16
+ the agent afterwards. It now returns `permissionDecision: "deny"`, the form
17
+ `force-push-guard` already used.
18
+ - **It also fired on safe commands.** It searched the whole line for a bare `~` or `/`, so
19
+ `cd ~ && rm -rf /tmp/x` was "blocked". It now reads only the arguments of a command that
20
+ is `rm` (per `&&`, `||`, `;` and `|` segment, after `sudo` or `VAR=`), parsed with
21
+ `shlex`, so a quoted `"$HOME"` or `'/'` counts and `echo 'rm -rf ~'` doesn't. `git rm`
22
+ is not `rm`. 22 new cases, all red before the fix.
23
+ - **The soft "rm detected" warning** uses the same parse, so a path containing `-rm-` or a
24
+ `git rm` no longer triggers it. One `python3` call per Bash command fewer.
25
+
26
+ ### Added
27
+
28
+ - **The `/spidersan` skill ships with the plugin** (`plugin/skills/spidersan`, #333):
29
+ conflict tiers, real merge checks (`bin/pr-conflicts <N>`), and branch tidying. The same
30
+ skill is published as `skill-spidersan` in treebird7/treebird-oss-skills.
31
+
32
+ ## [0.20.0] - 2026-10-28
33
+
34
+ A trim to the core, plus the git safety hooks as a Claude Code plugin. Pre-1.0 on
35
+ purpose: it gets a week of use before 1.0. The last full build is tagged
36
+ `v0.11.0-full`, and any removed command can be restored from it.
37
+
38
+ ### Added
39
+
40
+ - **Claude Code plugin** (`plugin/`, #331). `/plugin marketplace add treebird7/spidersan-oss`,
41
+ then `/plugin install spidersan@spidersan`. It installs six hooks:
42
+ - `force-push-guard`: blocks plain force-pushes.
43
+ - `same-file-warn`: warns when two sessions share a checkout, and blocks a commit
44
+ that would sweep up another session's files.
45
+ - `spidersan-pre` and `spidersan-post`: conflict, ownership and dead-branch advisories,
46
+ plus trunk-poison repair.
47
+ - `spidersan-overlap-warn` and `spidersan-worktree-guard`.
48
+
49
+ Agent identity is optional, via `SPIDERSAN_IDENTITY_FILE` / `SPIDERSAN_IDENTITY_KEY` /
50
+ `SPIDERSAN_AGENT` / `SPIDERSAN_SESSION_HINT`. Four shell suites (151 cases) run in CI.
51
+ - A parity test that every name the AI reasoner treats as a real command is one the CLI
52
+ registers. The old list included the removed commands and `collab`, which never existed.
53
+
54
+ ### Removed (breaking)
55
+
56
+ - **15 commands that a usage audit found nothing calls** (#330): `daily`, `pulse`,
57
+ `queen`, `torrent`, `bot`, `ask` / `advise` / `explain` / `ai-ping` / `ai-setup` /
58
+ `ai-telemetry` / `check-opt-out`, `mq`, `dashboard`, `rescue`, `welcome`, `fleet-status`,
59
+ `merge-plan`, `sync-advisor`, `auto`, `claim` / `release` / `whos-here`.
60
+ - **The `spidersan-ecosystem` plugin loader**, so `SPIDERSAN_CORE_ONLY` and
61
+ `SPIDERSAN_ECOSYSTEM=0` no longer switch anything. `conflicts --ecosystem` (the
62
+ multi-repo scan) is unrelated and stays.
63
+ - `watch` no longer writes per-file claims or puts an in-file coordination marker into
64
+ your files. Old registries that carry `claims` still load.
65
+ - The public export `escapeBlessed`, and the dependencies `blessed`, `@types/blessed` and `ts-morph`.
66
+ - MCP server (`spidersan-mcp` 2.0.0): the `pulse_remote_drift` tool, which called `pulse`.
67
+ - `config` wizard questions about the ecosystem plugin and auto-watch.
68
+
69
+
70
+ ### Added
71
+
72
+ - **A graphify knowledge graph of the repo, regenerated on demand into the now-gitignored `graphify-out/`.** ~1,980 nodes and ~4,280 edges over 247 code files, queryable with `graphify explain` / `affected` / `path` instead of grepping; `AGENTS.md` carries the commands, each run verbatim first. Nothing is committed — it rebuilds in ~30s. Extraction is local tree-sitter AST under `--code-only`, with the wrapper running under `env -i` because `extract` picks its backend from *whichever API key is set*: the stripped environment is the control, the flag is only the intent. `--with tree-sitter-sql` fails silently without the grammar, parsing the 26 `.sql` files to nothing behind a single warning and exit 0. The freshness check is `git rev-list --count HEAD..origin/main` rather than an mtime comparison, because a checkout behind the remote rebuilds into a graph that *looks* fresh — `built_at_commit` agrees with `HEAD` while both are stale. Measured on this repo: every file parsed with no syntax errors, `path` returns meaningful short routes (`conflictsCommand` → `fetchCrossMachineBranches()` → `SupabaseStorage`), `god-nodes` mixes framework fan-in (`vitest` 67, `commander` 45) with real hubs (`getStorage()` 63, `Branch` 54), and 176 labels are shared by more than one node — which matters because the verbs disagree about ambiguity: `explain` refuses and lists the candidate ids, `affected` refuses with *No unique node match*, and `path` does neither, answering *No directed path found* exactly as it would for a genuine negative.
73
+
74
+ ### Fixed
75
+
76
+ - **`conflicts` no longer flags branches whose PRs merged long ago, and a missing ref no longer counts as deleted** (#327, #329, sp-slemub). `activeBranches()` dropped only entries proven merged into trunk. A squash-merged, deleted branch is never an ancestor of trunk, so it read as *orphaned* and was kept: `conflicts --pr 543 --real --vs-prs` in Envoak raised a TIER 2 PAUSE and two TIER 1 WARNs against branches of PRs merged weeks earlier (Envoak #212, #214, #484), and 11 of that registry's 12 entries were stale. A missing ref is ambiguous, though. `resolveBranchRef` only sees refs already on this machine, so a branch live on another machine but never fetched here looks the same, and `ready-check` gets no cross-machine registry pull. The rule, shared by the read side and `sync` through `splitOrphans()`: an orphan is dropped only when `git ls-remote --heads origin` confirms the branch is gone. It is one call, made only when some entry is orphaned, with a 15 s cap. If origin can't be asked, every orphan is kept. `sync` now deletes only confirmed-gone orphans, says which ones it kept and why, and still prunes `abandoned` entries without asking. Cost: `conflicts --json` on a 14-entry registry with 12 orphans went from about 0.47 s to 0.94 s. Run `sync` to clear confirmed-gone entries and get it back.
77
+ - **The "Add/Add Conflict Helper" is gone** (#328). It fired on any overlapping path matching `/\.md$/` or `docs/` and told the reader to `git checkout --theirs` and rename to `.incoming`. In Envoak it said that about a long-lived `CLAUDE.md` that both branches had only modified. Neither emitter (`suggestAddAddResolution` in the command, `renderAddAddResolution` in the renderer) had a merge base to check against, so both were removed. A genuine add/add is still reported by `--real`, which prints the merge-tree kind per file (`docs/new.md (add/add)`).
78
+
79
+ - **`SPIDERSAN_CORE_ONLY` was inverted** (PR #313) — `=0` disabled the ecosystem plugin and `=1` did nothing. Now `1/true/yes/on` disables it and anything else allows it. `SPIDERSAN_ECOSYSTEM=0/1/true/false/…` are plugin switches only and are never read as a repo path (it used to scan a repo named `0`).
80
+ - **`conflicts --real` merges into the REMOTE trunk, not a stale local one** (sp-vifo) — the base came from `getTrunkBranch()`, which returns a branch *name* (`main`), so merge-tree ran against whatever the local ref happened to point at. In a long-lived checkout that drifts: on `~/Dev/treebird` a leftover worktree from the retired beads tool had pinned local `main` **78 commits** behind `origin/main`, and `--real` reported *clean vs main* on a branch that `--real --base origin/main` showed conflicting. Green, earned by comparing against the wrong thing. The base is now `origin/<trunk>` when that remote-tracking ref exists (via the existing `resolveBranchRef()`), falling back to the local name when it does not — fresh clones and no-origin repos are unchanged. **No fetch**: this reads refs already on disk, because `--real` runs from a pre-merge hook and a check that hits the network every invocation is a different problem; `origin/<trunk>` can therefore be stale too, which is why the report always names the base it used. An explicit `--base` still short-circuits trunk detection entirely. The `--pr` arm already reasoned this way (tb-57fr) and is unchanged — it fetches, because it is already fetching the PR head.
81
+ - **`conflicts` no longer claims merge-readiness from a registry-only check** (PR #295) — the zero-conflict path printed "✅ You're good to merge!" after comparing *registered file lists*, which runs no merge and is structurally blind to add/add and content conflicts against the base. Repro'd live: the pre-merge hook printed the all-clear while `git merge-tree` reported `CONFLICT (add/add)`. Both emitters (the command, and the unwired `renderConflictReport` seam) now state scope — `No registry overlap for "<branch>" (vs N registered branches)` plus the command that does answer merge-readiness. The branch count makes "did the work" observable. Guarded by tests on both the live emitter and the seam.
82
+ - **`conflicts --real --vs-prs` no longer silently drops the cross-PR half** (sp-a1l3) — `options.real` short-circuited into the merge-tree path and `return`ed, so the `--vs-prs` block was never reached. `conflicts --pr <N> --real --vs-prs` — documented as THE authoritative pre-merge check — therefore printed only "clean vs trunk" and exited 0 while never consulting GitHub for other open PRs: a check reporting success while doing nothing. The two flags now compose: the merge-tree check runs first, then execution falls through to the cross-PR/overlap pass, and the process exit code is `max(real, overlap)` (real conflicts are tier-blocking, overlap only blocks under `--strict`). `--real` alone, `--pr N` alone and `--vs-prs` alone are unchanged and pinned by tests. On the composed path an uninitialized registry or an unregistered branch degrades the overlap half with a loud "did NOT run" warning instead of failing the whole command, so `--real`'s registry-independence survives. Proven by effect with a `gh`-disabled shim: before, `--real --vs-prs` printed one line and never called `gh`; after, it prints the merge-tree verdict *and* the cross-PR/registry overlap report.
83
+
84
+ ### Added
85
+
86
+ - **GitHub Actions auto-register is back — zero-secret OIDC edition** (PR #279, #280) — successor to the workflow retired in c9a449b for keeping a DB key in public-repo Actions secrets. New flow: on push, CI mints a short-lived GitHub OIDC token (`permissions: id-token: write`, **no repo secrets at all**); the new `supabase/functions/register-branch` edge function verifies it (RS256, issuer, audience, `repository` claim allowlist + optional `repository_id` pin — the `repository` claim is the only real gate) and writes `branch_registry` server-side with an `sb_secret_*` key held only in Supabase function secrets. Branch and actor come from verified token claims, never the request body. Existing branches get a `files_changed`-only refresh — a push can never re-activate a merged branch or overwrite attribution (which also neutralizes token replay). The workflow (`.github/workflows/auto-register.yml`) no-ops until the `SPIDERSAN_REGISTER_URL` repo variable is set. Proven end-to-end in production (probe push → workflow green → correct claims-derived row).
87
+ - **`setup-oidc-autoregister` Claude Code skill** (`.claude/skills/setup-oidc-autoregister/SKILL.md`) — guided BYK adoption of the above on your own repo + Supabase project: deploy, wire secrets server-side, copy workflow, strict 4-point verify (three exact reject codes + probe row). Security invariants stated as non-negotiable, including rejecting legacy `eyJ` service_role JWTs via a no-print prefix check. Note: `.claude/skills/` is allowlist-gated in `.gitignore` — new skills need a `!` entry.
88
+
89
+ ### Changed
90
+
91
+ - **`conflicts --ecosystem` no longer ships a hardcoded repo list** (PR #313) — repos come from `--repos`, then `SPIDERSAN_ECOSYSTEM` (colon-separated paths), then `conflicts.ecosystemRepos` in a config file; a project file replaces the global list. Unconfigured scans no repos and prints a hint (`--json` still emits a valid empty report). `spidersan config` shows the resolved count and source. See README → *Ecosystem scan repo list*.
92
+ - **Retired short agent IDs are no longer accepted by `bot`** (PR #314) — its permission lists dropped `ssan`, `srlk`, `bsan`, `wsan`, `tsan`, `mycs`, `trbr`, `nemo`, `codx`, `goos`. A sender still using one gets no permission tier (access only narrows). Broadcasts are signed `spidersan`; temp files use a `spidersan-*` prefix; `daily` maps 🔍 to `sherlock` and still recognises `sherlocksan` in old dailies.
93
+ - **`branch_registry` uniqueness is now composite `(repo_name, branch_name)`** (tb-31t4, PR #282 + #284) — the fleet-wide auto-register rollout proved the old global-UNIQUE `branch_name` collision: the same branch name pushed from three repos left one row (first writer wins). Interim function fix (#282): the files-refresh PATCH is scoped by `repo_name` and a colliding insert reports `collided: true` instead of silently touching another repo's row. Real fix (#284, applied to prod as migration `20260801195726` with `UNIQUE NULLS NOT DISTINCT` — legacy NULL-`repo_name` rows keep their shared-namespace semantics): cross-repo same-name branches now coexist; same-repo duplicates still violate. CLI unaffected — its only `branch_registry` touch is a connectivity probe; machine sync uses `spider_registries` (already composite).
94
+ - **eslint 8 → 10, flat config** (tb-wb47, PR #283) — `eslint.config.mjs` replaces `.eslintrc.json`, same rule intent. The two new recommended rules flagged 8 real issues, fixed in code not config: three dead initializers removed (`no-useless-assignment`) and five `throw` sites now attach `{ cause }` (`preserve-caught-error`).
95
+
96
+ ### Security
97
+
98
+ - **CI dependency audit scoped to production deps** (`npm audit --omit=dev --audit-level=high`) — GHSA-mh99-v99m-4gvg (brace-expansion, published 2026-07-29) is unfixable inside eslint 8's transitive tree: the only patched release (5.0.8) breaks minimatch@3's direct-function import (verified). The published CLI ships none of that chain. Full-tree audit returns with the eslint 8→10 flat-config migration (tracked as invoak tb-wb47). js-yaml and postcss high advisories fixed via lockfile bump in the same pass.
99
+ - **Restored to full tree** in PR #283: with eslint 10 the dev-chain advisories are gone — `npm audit --audit-level=high` runs unscoped again and reports 0 vulnerabilities.
100
+
101
+ ### Removed
102
+
103
+ - **The Treebird Hub transport is gone** (sp-hnjf, follow-up to sp-8iqm/#290) — `hub.treebird.uk` was decommissioned 2026-09-05 and answers `404 Application not found` behind `x-railway-fallback: true`, so every call site below was dead code, not a severed channel. Deleted `src/lib/hub.ts` (`HubClient` + `FetchHubAdapter`), the `HUB_URL` env var, and the `--hub` / `--hub-sync` flags on `watch`, `auto start` and `pulse`, plus `autoWatch.hub` / `autoWatch.hubSync` in `.spidersanrc`. An existing config file carrying those keys stays valid and inert — `validateConfig` only checks keys it knows. `socket.io-client` dropped with the `--hub` WebSocket.
104
+ - Three further **unconditional success lines** of the same class as `git-events-subscriber.ts:467` are gone: `watch.ts` printed `📤 Posted conflict to Hub chat` after awaiting a `Promise<void>` that swallowed failure at *both* the adapter and client layers; `torrent claim` / `torrent complete` each printed `✅ Notified Hub` from inside a `try` that only catches throws, so a 404 response read as success; and `conflicts --wake` printed `✅ Woke N agent(s)` for a helper that returned `true` unconditionally. `--wake` / `--retry` are removed outright, and `conflicts --auto` with them — it only ever suppressed the wake-flow confirmations and is now read by nothing (`register --auto` is a different flag and is untouched).
105
+ - **Re-pointed, not dropped:** the `watch` conflict alert and `conflicts --notify` now go through `deliver()`/`notify()` from `src/lib/notify.ts`, the seam landed in #290 — so they report the real delivery outcome and never claim a send they did not inspect. Delivery is configured by `SPIDERSAN_ROOM_TOKEN`, not by a flag; unset means the alert is logged `NOT NOTIFIED`.
106
+ - **Dropped, not re-pointed:** remote-drift alerts (`pulse --hub-sync`, and the `watch --fetch-poll` variant). Drift is not a conflict, so it does not belong in the seam's event class, and both commands already print the drift report the operator is reading.
107
+
108
+ ### Removed (docs)
109
+
110
+ - `INSTALL_AUTO_REGISTER.md`, `AUTO_REGISTER_USE_CASES.md` and the local `install-auto-register` skill (832 lines) — they taught the retired secret-in-CI flow. README § "GitHub Actions Auto-Register (OIDC)" is the single current reference.
111
+
112
+ ### Added
113
+
114
+ - **`spidersan depends` actually works now** (tb-5h9b) — it was a stub that always printed "requires Supabase storage" and stored nothing. Dependencies (`dependsOn`) and the merged PR (`prNumber`, via `merged --pr N`) now live on the registry `Branch` entry itself, so they work with **local** storage too. `merge-order` folds declared dependencies into its sort as directed edges (new `addDependencyEdges` in `src/lib/graph.ts`): "A depends on B" puts B first regardless of file overlap. `registry-sync` pushes/pulls both fields (`depends_on`, `pr_number` on `spider_registries` — canonical table, not the dead `branch_registry` path removed above). **Deploy order:** apply migration `treebird/supabase/migrations/20260711000000_spider_registries_depends_pr.sql` before shipping this, or cloud pushes will reject the unknown columns.
115
+
116
+ ### Fixed
117
+
118
+ - **Registry store: crash-safe writes + no silent wipe** (`src/storage/json-branch-registry-store.ts`) — `save()` now writes temp-then-rename (atomic), and `load()` only falls back to an empty registry on ENOENT. Previously a corrupt/truncated `registry.json` (crash mid-write) parsed as "empty" and the next `register` **silently destroyed every agent's registrations**; now it fails loudly and never saves over the corrupt file.
119
+ - **`cleanup` no longer deletes active registrations** — `registeredAt` is never refreshed, so an old ACTIVE entry usually means in-flight work; deleting it blinded conflict detection for every other agent. `storage.cleanup(olderThan, includeActive)` now skips `status: 'active'` by default; new `cleanup --force` restores the old behavior. Both `cleanup` and `stale` also reject non-numeric `--days` instead of silently matching nothing.
120
+ - **`conflicts --pr` survives PR force-pushes** — the stash refspec is now `+pull/<n>/head:refs/spidersan/pr-<n>`; without the `+`, a rebased PR made every subsequent check fail with "Could not fetch PR head" until the ref was deleted by hand.
121
+ - **`conflicts --pr --strict` is honoured** — the real merge-tree path only read `--exit-code`, so the advertised CI flag `--strict` silently exited 0 on real conflicts. `--strict` now gates the real path too. The dead `--max-retries` option (declared, never read) is removed.
122
+ - **`conflicts --pr --gate` fails closed** — `getPRLabels` now returns `null` on failure (vs `[]`), and the gate treats "couldn't read labels" (gh missing/unauthenticated/rate-limited) as UNMET instead of invisibly bypassing a `needs-*:` blocking label.
123
+ - **`mq run --execute` refuses a repo mismatch** — the speculative merge fetches `pull/<n>/head` from the **cwd's** origin, so `--repo other/repo` from a different checkout would CI-test one repo's code and land another's PRs. Now hard-errors unless the cwd checkout IS the target repo.
124
+ - **`mq` red-gate with zero applied PRs no longer crashes** — a red gate before any PR applied (broken base) hit `culprit.number` on `undefined`, aborting the run and losing landed/ejected state; it now aborts cleanly with `converged: false`.
125
+ - **Reconcile-on-read: unpushed local commits are no longer reconciled away** — `reconcileBranches` preferred the remote-tracking ref, so a branch whose PR landed but that kept receiving local commits was classified `merged` and vanished from conflict detection. Both tips (stale `origin/<name>` AND `refs/heads/<name>`, new `resolveLocalBranchRef`) must now be ancestors of trunk.
126
+ - **`getRemoteHead` matches the exact ref** — `git ls-remote --heads origin main` pattern-matches ref *suffixes* (`feature/main` too) and the first line won; remote-drift detection could compare against the wrong branch's SHA. Now queries and matches `refs/heads/<branch>` exactly.
127
+ - **`getChangedFiles` empty-diff semantics** — a successful-but-empty `main...HEAD` diff no longer falls through to `HEAD~1` (which reported the previous already-merged commit's files as "changed" — phantom registrations on fully-merged branches). Also passes `core.quotepath=off` so non-ASCII paths aren't stored C-quoted, and `ready-check`/`register` now diff against the detected trunk instead of hardcoded `main`.
128
+ - **`stale --notify` delivers to the agent's own pending file** — the cwd's `.pending_task.md` was checked first, so every agent's notifications landed in whatever repo the command ran from; now only agent-owned locations are considered (incl. `~/Dev/treebird/agents/<agent>/`).
129
+ - **`bot`**: command args can no longer start with `-` (git option injection, e.g. `/pull repo --force`); `/log abc` no longer produces `git log -NaN`; `/sync` no longer runs registration + conflict-check twice; dead `pollInterval`/`syncInterval`/`rateLimit` config fields removed.
130
+
131
+ ### Removed
132
+
133
+ - **Dead code sweep (~700 lines + a dependency)** — `src/lib/crdt.ts` (Yjs SwarmState, zero callers; drops the `yjs` dependency), `src/tui/dashboard.ts` + `src/tui/screen.ts` (two unwired TUI implementations; `spidersan dashboard` uses `src/commands/dashboard.ts`), the never-called `branch_registry` method family (`setDependencies`/`setConflicts`/`markMerged`/`getStale`/`getRaw`/`pushGitHubBranches` on the Supabase impl + wrappers), and the unused factory functions `getBranchRegistryStore`/`getSupabaseRegistrySyncClient`. `mqCommand` added to the library barrel (was CLI-only).
134
+
135
+ ### Added
136
+
137
+ - **`mq` conflict-graph ordering** (tb-y121, merge queue phase 1.5, PR #254 + #255) — `mq run`/`mq status` order the ready-PR queue with the existing `buildConflictGraph` + `topologicalSort` (`src/lib/graph.ts`, already used by `merge-order`) instead of plain PR-number order: the most-blocking (most file-overlapping) PRs sort first so a "hub" PR lands before the PRs it conflicts with. Non-conflicting PRs and ties fall back to oldest-first. Pure `conflictOrder` over a pre-fetched `filesByPr` map — no IO — so `mq run`'s plan, `mq status`, and the actual `--execute` all agree on the same order. `listChangedFiles` (one `gh pr view` per PR, 30s timeout) degrades to "no files" on fetch failure with a visible stderr warning, rather than silently collapsing back to oldest-first. Correctness still rests on the speculative-merge + CI gate, not this ordering.
138
+ - **`spidersan pulse` smalltoak health probe** (tb-r9s) — `pulse` now proactively probes the smalltoak comms bridge (`SMALLTOAK_SERVER_URL`) that `spidersan bot` depends on, surfacing an outage before message-driven git ops silently stall. New `src/lib/smalltoak.ts` `probeSmalltoak()`: GETs `/health` with a 2s timeout; **any HTTP response = reachable** (a missing `/health` route never false-alarms), only a network error/timeout = DOWN. No-op when `SMALLTOAK_SERVER_URL` is unset. Shown in the human report (`Smalltoak: ✅ up` / `🔴 DOWN`) and JSON (`smalltoak` field).
139
+
140
+ ### Tests
141
+
142
+ - **`merge-plan` fused-verdict integration test** (tb-uvy) — `tests/merge-plan.integration.test.ts` drives a real temp-git train (genuine `git merge-tree` conflict + a real stacked base) through `analyzeRealConflicts` → `buildMergePlan`, asserting BLOCKED (real conflict file surfaced), WAIT (stacked, parent-before-child order), and MERGE. Closes the dogfood gap from tb-bi2, whose live RT train was disjoint and only exercised MERGE/STALE/ordering.
143
+
144
+ ### Added
145
+
146
+ - **Reconcile-on-read** (`src/lib/reconcile.ts`) — `conflicts`, `ready-check`, and `merge-order` now fold git truth over the registry's `status` before answering: a branch already merged into trunk (`git merge-base --is-ancestor`, or registry status `completed`) is dropped from conflict detection. Retires the phantom-conflict class where a fully-merged branch kept showing as conflicting from a stale worktree. New git primitives `resolveBranchRef` / `isMergedInto` (`src/lib/git.ts`). Orphaned (no-ref) branches are deliberately KEPT on the read path — a missing ref can mean "unfetched on another machine", and dropping it would miss a real conflict.
147
+
148
+ ### Security
149
+
150
+ - **Consolidate `spider_registries` to runtime + harden RLS** (PR #247) — fixed silent cross-project drift where `spider_registries` lived on the vault Supabase project (`<vault-project-ref>`) while `branch_registry` lives on runtime (`<runtime-project-ref>`). Registry-sync uses a single `SUPABASE_URL` client, so the `spider_registries` half of every runtime-pointed sync was silently 404-ing. Canonical = runtime. Also closes wide-open anon RLS on the public project: `spider_registries` and `branch_registry` both had anon `INSERT/UPDATE/SELECT` open; views used owner-rights that bypassed base-table RLS. Hardening: service_role writes, authenticated agent-JWT reads, anon denied, views `security_invoker`.
151
+ - **Migrations** — `20260219_spider_registries.sql` (hardened CREATE + GIN index, runtime), `20260623_harden_spidersan_rls.sql` (branch_registry + views, runtime), `20260623_decommission_vault_spider_registries.sql` (vault teardown, manual, gated on parity), `supabase/migrations/CONSOLIDATION.md` (ordered deploy runbook).
152
+
153
+ ### Removed
154
+
155
+ - **`auto-register.yml` CI workflow** — retired. It ran `spidersan register` on every push using an anon `SUPABASE_KEY` from Actions secrets, writing `branch_registry` as anon. The RLS hardening above denies anon writes, making this workflow both broken and a security risk (promoting the key to service_role in a public repo's CI secrets is worse). Machine-side `registry-sync` with the service key is the correct sync path.
156
+
157
+ ### Fixed
158
+
159
+ - **`merge-plan` fused verdict is additive, not lossy** (tb-cdz) — a PR that is both behind base and has non-required checks red (`STALE` + `UNSTABLE`) now keeps the `STALE` headline **and** annotates the suppressed check axis (`↳ non-required checks red`). Previously the `UNSTABLE` signal was silently dropped on the STALE path. Ref coord-tree pair `fused_verdict_must_be_additive_not_lossy`.
160
+ - **`spidersan sync`** now prunes **merged** registry entries (is-ancestor / status `completed`), not just orphans. Previously a merged branch whose ref still existed lingered forever and kept phantom-conflicting; merged entries are now deleted, not just marked.
161
+
162
+ ## [0.11.0] - 2026-06-16
163
+
164
+ ### Added
165
+
166
+ - **`spidersan merge-plan`** — ordered merge plan for open PRs; fuses PR merge-state + CI rollup (`src/lib/github.ts`), real `git merge-tree` conflicts (`src/lib/git-merge-analyzer.ts`), staleness (commits behind base), and stacked-base detection into a per-PR verdict (MERGE / BLOCKED / WAIT / VERIFY / STALE / UNKNOWN) plus a topologically-ordered global plan. Fork-safe head via `pull/<n>/head`; advisory (always exit 0). Supports `--json`, `--base`, `--limit`, `--include-drafts`, `--repo`.
167
+ - **`spidersan pr-check <number>`** — check a single PR's merge readiness: stacked-base detection and red/behind/conflict state with failing *required* checks surfaced. Advisory by default; `--exit-code` makes it gate for pre-merge hooks. Supports `--json`, `--repo`.
168
+ - **`spidersan verify-trunk`** — detect (and with `--fix` reset) registry "trunk-poison": the trunk branch (main/master) claiming files in the spidersan registry, which a clean auto-merge can silently re-introduce. `--exit-code` gates for post-merge hooks; `--json` for tooling.
169
+ - **`spidersan conflicts --real`** — compute TRUE merge conflicts via `git merge-tree` (vs registry overlap), distinguishing same-file-different-region (clean) from real conflict. Works with no registry for a single target; `--all` checks every active branch, `--base <ref>` sets trunk, `--exit-code` gates.
170
+
8
171
  ## [0.10.0] - 2026-05-11
9
172
 
10
173
  ### Added
package/README.md CHANGED
@@ -53,13 +53,6 @@ spidersan ready-check
53
53
  npm install -g spidersan
54
54
  ```
55
55
 
56
- ### Guided Setup (Optional)
57
-
58
- ```bash
59
- spidersan welcome
60
- spidersan config wizard
61
- ```
62
-
63
56
  ### Basic Usage
64
57
 
65
58
  ```bash
@@ -88,169 +81,52 @@ spidersan merge-order
88
81
  | `spidersan register --files` | Register a branch with the files being modified |
89
82
  | `spidersan list` | List all registered branches and their file ownership |
90
83
  | `spidersan conflicts` | Detect file conflicts between branches (tiered: T1/T2/T3) |
91
- | `spidersan conflicts --ecosystem` | Aggregate conflict scan across all repos in your dev folder |
84
+ | `spidersan conflicts --ecosystem` | Aggregate conflict scan across the repos you configure (see [Ecosystem scan](#ecosystem-scan-repo-list)) |
85
+ | `spidersan conflicts --real` | Compute TRUE merge conflicts via `git merge-tree` (vs registry overlap) |
92
86
  | `spidersan merge-order` | Get topologically-sorted optimal merge order |
93
87
  | `spidersan ready-check` | Verify branch is ready to merge (no WIP, no conflicts) |
94
- | `spidersan depends` | Set/show branch dependencies (Supabase only) |
88
+ | `spidersan depends` | Set/show branch dependencies (deps merge first; synced cross-machine) |
95
89
  | `spidersan stale` | Find stale branches |
96
90
  | `spidersan cleanup` | Remove stale branches from registry |
97
- | `spidersan rescue` | Rescue mode — scan for and salvage rogue/unregistered work |
98
91
  | `spidersan abandon` | Abandon a branch (mark inactive) |
99
92
  | `spidersan merged` | Mark a branch merged |
100
93
  | `spidersan sync` | Sync registry with actual git branches |
101
94
  | `spidersan watch` | Daemon mode: watch files and auto-register |
102
95
  | `spidersan doctor` | Diagnose local state and registry health |
103
- | `spidersan config` | View/edit configuration + guided wizard |
104
- | `spidersan auto` | Auto-watch start/stop/status (config-based) |
105
- | `spidersan welcome` | Onboarding and quick start |
96
+ | `spidersan config` | View/edit configuration + setup wizard |
106
97
  | `spidersan log` | Show branch operation history (local activity log) |
107
- | `spidersan daily` | Show branch-relevant entries from daily collab logs |
108
98
  | `spidersan rebase-helper` | Detect and guide through local git rebase states |
109
99
  | `spidersan git-watch` | Subscribe to GitHub webhook events — cross-machine push/PR/create/delete with AI conflict routing |
110
100
 
111
- ### 🧠 AI Commands (Gemma 4 / LM Studio)
101
+ #### Ecosystem scan repo list
112
102
 
113
- Ask spidersan questions about your repo state — powered by a local LLM with an embedded gitops playbook.
103
+ `conflicts --ecosystem` ships with no built-in repo list. Pick one (first match wins):
114
104
 
115
- | Command | Description |
116
- |---------|-------------|
117
- | `spidersan context` | Build full repo context (registry, conflicts, colony, git) |
118
- | `spidersan ask "<question>"` | Ask a question — get actionable gitops advice with commands |
119
- | `spidersan advise` | Get proactive recommendations based on current repo state |
120
- | `spidersan explain <branch>` | Explain what a branch does, its risk, and next steps |
121
- | `spidersan ai-ping` | Test LLM connectivity and latency |
105
+ 1. `--repos /path/to/repo-a,/path/to/repo-b`
106
+ 2. `SPIDERSAN_ECOSYSTEM=/path/to/repo-a:/path/to/repo-b` (colon-separated)
107
+ 3. A config file (`~/.spidersanrc`, `.spidersanrc`, `.spidersanrc.json` or `.spidersan.config.json`):
122
108
 
123
- ```bash
124
- # Get AI-powered advice
125
- spidersan ask "I have 3 branches touching auth.ts — what should I do?"
126
-
127
- # Proactive recommendations
128
- spidersan advise
129
-
130
- # Understand a mystery branch
131
- spidersan explain feat/strange-refactor
132
-
133
- # Flags
134
- spidersan context --json --verbose --repo ~/Dev/other-repo
135
- spidersan ask "merge strategy?" --provider copilot
136
- ```
137
-
138
- **Features:**
139
- - 🏠 **Local-first**: Defaults to Gemma 4 26B on LM Studio (no API key needed)
140
- - 🔒 **Privacy**: Code context never leaves your machine unless you opt into remote providers
141
- - 📋 **18-scenario playbook**: PHC-optimized command reference covering all spidersan workflows
142
- - 🔧 **MCP integration**: All AI commands available as MCP tools (27 total)
143
- - 🧠 **Training data**: Use `/spidersan-gold` skill to mine gold pairs for fine-tuning — see [spidersan-ai](https://github.com/treebird7/spidersan-ai)
144
-
145
- ### 🤖 Remote Bot (Cross-Machine Git Operations)
146
-
147
- Trigger git operations on a remote machine from any agent — no SSH needed.
148
-
149
- ```bash
150
- # Start the bot daemon (listens for /commands via smalltoak)
151
- envoak vault inject --key GIT_BOT_ENABLED -- spidersan bot
152
-
153
- # One-shot: process pending commands and exit (good for cron)
154
- spidersan bot --once
155
-
156
- # Manage watched repos
157
- spidersan bot add myrepo --path ~/Dev/myrepo --branch main --push src/
158
- spidersan bot repos
159
- spidersan bot remove myrepo
109
+ ```json
110
+ { "conflicts": { "ecosystemRepos": ["~/code/repo-a", "/path/to/repo-b"] } }
160
111
  ```
161
112
 
162
- **How it works:** An agent on M2 wants to push `spidersan-ai` from M5. They send `/push spidersan-ai` via smalltoak. The bot running on M5 picks it up, executes `git push`, and replies with the result. Tier-based permissions gate which agents can trigger which operations.
113
+ A project-level file's list replaces the global one rather than extending it. With nothing configured the scan prints a hint and checks no repos.
163
114
 
164
- | Command | Description |
165
- |---------|-------------|
166
- | `spidersan bot` | Start remote git ops daemon (polls smalltoak) |
167
- | `spidersan bot --once` | Process pending commands once and exit |
168
- | `spidersan bot add` | Register a repo for bot management |
169
- | `spidersan bot repos` | List managed repos |
170
- | `spidersan bot remove` | Unregister a repo |
115
+ Plugin switches (separate from the repo list): `SPIDERSAN_CORE_ONLY=1` or `SPIDERSAN_ECOSYSTEM=0` disables the optional `spidersan-ecosystem` plugin. Neither value is read as a repo path.
171
116
 
172
117
  ### 🌐 Multi-Repo & Cloud Commands
173
118
 
174
119
  | Command | Description |
175
120
  |---------|-------------|
176
- | `spidersan sync-advisor` | Scan all repos and recommend push/pull/cleanup actions |
177
- | `spidersan registry-sync --push` | Push local branch registry to colony Supabase (share with fleet) |
121
+ | `spidersan registry-sync --push` | Push local branch registry to the shared Supabase (share with other machines) |
178
122
  | `spidersan registry-sync --pull` | Pull other machines' registries — see what the full fleet is working on |
179
123
  | `spidersan registry-sync --status` | Show sync status across all machines |
180
124
  | `spidersan cross-conflicts` | Detect file conflicts across machines via Supabase |
181
125
  | `spidersan github-sync` | Fetch branch/PR/CI status from GitHub for configured repos |
182
- | `spidersan pulse` | Sync from Colony then show active conflicts (quick health-check) |
183
- | `spidersan pulse --remote-drift` | Fetch origin + detect remote drift zone; cross-ref against registry and unstaged files |
184
-
185
- ### 📡 Remote Drift Detection
186
-
187
- `spidersan pulse --remote-drift` closes the gap between registry-level conflict detection and single-agent divergence:
188
-
189
- ```bash
190
- # Check if origin has advanced past local HEAD
191
- spidersan pulse --remote-drift
192
-
193
- # Machine-readable output
194
- spidersan pulse --remote-drift --json
195
-
196
- # Post alert to Hub if registered or unstaged files are in the drift zone
197
- spidersan pulse --remote-drift --hub-sync
198
-
199
- # Exit 1 if any drift risk — use as a pre-push gate
200
- spidersan pulse --remote-drift --strict
201
-
202
- # As a pre-push hook:
203
- # .git/hooks/pre-push
204
- spidersan pulse --remote-drift --strict || { echo "Fetch + resolve drift first"; exit 1; }
205
- ```
206
-
207
- **What it detects:**
208
- - 📥 Remote commits that local doesn't have (the *drift zone*)
209
- - 🟠/🔴 Registered files in the drift zone → rebase conflict risk, classified by tier
210
- - ⚠️ Unstaged tracked files in the drift zone → `git rebase --continue` blocker risk (even after resolving conflict markers — fix: `git checkout HEAD -- <file>`)
211
-
212
- **Graceful degradation:** offline, detached HEAD, mid-rebase, no remote branch — all print a warning and continue without exit 1.
213
-
214
-
215
-
216
- Dispatch sub-spidersans to run ground jobs across multiple repos in parallel:
217
-
218
- ```bash
219
- # Spawn sub-spidersans for a task (generates fire-complete-dissolve scripts)
220
- spidersan queen spawn --task "morning sync" --type sync --repos "repo1,repo2"
221
-
222
- # Dry-run: preview scripts without emitting colony signals
223
- spidersan queen spawn --task "conflict scan" --type conflicts --dry-run
224
-
225
- # Monitor active sub-spidersans via the colony gradient
226
- spidersan queen status --queen-signal-id <id>
227
-
228
- # Manually dissolve a stuck sub-spidersan
229
- spidersan queen dissolve <signal-id>
230
- ```
126
+ | `spidersan pr-check <number>` | Check a PR's merge readiness (stacked base, red/behind state) |
127
+ | `spidersan verify-trunk` | Detect registry trunk-poison (main/master must claim no files) |
231
128
 
232
- Job types: `sync` | `conflicts` | `cleanup` | `custom`
233
-
234
- ### 🔄 Task Torrenting (Branch-per-Task)
235
-
236
- Create and manage parallel task branches with conflict-aware merge ordering:
237
-
238
- ```bash
239
- spidersan torrent create DASH-001 --agent myagent
240
- spidersan torrent status
241
- spidersan torrent tree
242
- spidersan torrent complete DASH-001
243
- spidersan torrent merge-order
244
- spidersan torrent decompose DASH --into "DASH-A,DASH-B,DASH-C"
245
- ```
246
-
247
- ### 📊 TUI Dashboard
248
-
249
- Real-time 4-panel terminal UI — ecosystem overview, conflict map, activity feed, merge queue:
250
-
251
- ```bash
252
- spidersan dashboard
253
- ```
129
+ > **Note:** `registry-sync`, `cross-conflicts`, and `git-watch` require a **`service_role`** key in `SUPABASE_KEY` — anon writes are denied by RLS. See `.env.example` for the required credential format.
254
130
 
255
131
  ### Watch Mode (Daemon)
256
132
 
@@ -260,11 +136,8 @@ Real-time file monitoring with auto-registration:
260
136
  # Start watching (auto-registers file changes)
261
137
  spidersan watch --agent myagent
262
138
 
263
- # With Hub integration for real-time conflict warnings
264
- spidersan watch --agent myagent --hub
265
-
266
139
  # Quiet mode (only show conflicts)
267
- spidersan watch --agent myagent --hub --quiet
140
+ spidersan watch --agent myagent --quiet
268
141
 
269
142
  # Watch only specific paths
270
143
  spidersan watch --paths "src,lib" --root .
@@ -273,22 +146,11 @@ spidersan watch --paths "src,lib" --root .
273
146
  **Features:**
274
147
  - 📁 Auto-registers files when you edit them
275
148
  - ⚠️ Real-time conflict detection
276
- - 🔌 Hub integration for team visibility
277
149
  - 🕐 Debounced (1s) to prevent spam
278
150
 
279
- ### ⚡ Auto Watch (Background)
280
-
281
- Run a background watcher using paths from your config:
282
-
283
- ```bash
284
- spidersan auto start
285
- spidersan auto status
286
- spidersan auto stop
287
- ```
288
-
289
151
  ### 🔔 git-watch — GitHub Webhook Notifications
290
152
 
291
- Cross-machine push/delete notifications via a GitHub org webhook → Supabase edge function → `spidersan_git_events` table. Each machine runs a polling daemon that reacts to events: auto-abandons deleted branches in the registry, warns to `spidersan pulse` on pushes.
153
+ Cross-machine push/delete notifications via a GitHub org webhook → Supabase edge function → `spidersan_git_events` table. Each machine runs a polling daemon that reacts to events: auto-abandons deleted branches in the registry, warns to run `spidersan conflicts` on pushes.
292
154
 
293
155
  **Infrastructure (one-time setup):**
294
156
 
@@ -312,12 +174,12 @@ Cross-machine push/delete notifications via a GitHub org webhook → Supabase ed
312
174
  ```bash
313
175
  # One-shot catch-up (useful for cron / CI)
314
176
  SUPABASE_URL=https://<runtime-ref>.supabase.co \
315
- SUPABASE_KEY=<anon-key> \
177
+ SUPABASE_KEY=<service-role-key> \
316
178
  spidersan git-watch --once
317
179
 
318
180
  # Persistent daemon (poll every 30s)
319
181
  SUPABASE_URL=https://<runtime-ref>.supabase.co \
320
- SUPABASE_KEY=<anon-key> \
182
+ SUPABASE_KEY=<service-role-key> \
321
183
  spidersan git-watch --interval 30000
322
184
  ```
323
185
 
@@ -349,140 +211,37 @@ tail -f /tmp/spidersan-git-watch.log
349
211
 
350
212
  | Event | Action |
351
213
  |-------|--------|
352
- | `push` | Logs to `activity.jsonl`, warns to run `spidersan pulse`. Detects new gold pairs in `sql-tree/pairs/` and `ts-tree/pairs/` — emits `🌱 tree_pairs_ready` cue to `~/.spidersan/git-events-pending.jsonl` |
353
- | `delete` | Marks branch `abandoned` in registry, archives to `~/.spidersan/archive.jsonl` |
214
+ | `push` | Logs to `activity.jsonl`, warns to run `spidersan conflicts`. Detects new gold pairs in `sql-tree/pairs/` and `ts-tree/pairs/` — emits `🌱 tree_pairs_ready` cue to `~/.spidersan/git-events-pending.jsonl` |
215
+ | `delete` | Marks branch `abandoned` in the local registry, archives to `~/.spidersan/archive.jsonl` |
354
216
  | `pull_request` / `create` | Logged only |
355
217
 
356
- ### 🤖 GitHub Actions Auto-Register
357
-
358
- **Zero-effort branch registration via GitHub workflow**
359
-
360
- When enabled, every push to a branch automatically:
361
- - ✅ Registers the branch with Spidersan
362
- - ✅ Detects changed files via git diff
363
- - ✅ Checks for conflicts with other branches
364
- - ✅ Reports TIER 2+ conflicts as workflow warnings
365
- - ✅ Extracts agent name from branch prefix (e.g., `claude/feature` → `claude`)
366
-
367
- **Setup:**
368
- 1. Workflow is already included: `.github/workflows/auto-register.yml`
369
- 2. Just push to any branch (except main/staging)
370
- 3. View results in GitHub Actions tab
371
-
372
- **Example:**
373
- ```bash
374
- git checkout -b yourname/new-feature
375
- git add src/api.ts
376
- git commit -m "feat: add new endpoint"
377
- git push origin yourname/new-feature
378
- # ✅ Auto-registered in ~15 seconds!
379
- ```
380
-
381
- **Benefits:**
382
- - No manual `spidersan register` needed
383
- - Works across all contributors and AI agents
384
- - Conflict warnings appear in CI checks
385
- - Perfect for multi-agent repositories
386
-
387
- **Note:** This complements (doesn't replace) local `spidersan watch` for real-time file monitoring.
218
+ ### 🤖 Pushed branches register themselves
388
219
 
389
- **Installation:**
390
- - [📖 Complete Installation Guide →](./INSTALL_AUTO_REGISTER.md)
391
- - [🎯 Use Cases & Examples →](./AUTO_REGISTER_USE_CASES.md)
392
- - [🤖 Claude Code Skill →](./.claude/skills/install-auto-register.md)
220
+ Every push to a watched repo reaches the `spidersan-webhook` edge function through
221
+ the GitHub webhook, so a branch pushed by any tool — Codex, Copilot, a cloud agent,
222
+ the web editor, a person — is registered in `spider_registries` and shows up in
223
+ `conflicts` on every machine, even though no local hook ran. No GitHub Actions
224
+ workflow, and no write credential outside Supabase.
393
225
 
394
- ### 🦺 Rescue Mode
395
-
396
- Got a repo with 10+ abandoned branches? Let Spidersan clean up the mess:
397
-
398
- ```bash
399
- # Scan for rogue files/branches
400
- spidersan rescue --scan
226
+ Rows sit under the virtual machine `github`, files are computed against the repo's
227
+ default branch, and a row is ignored wherever a real machine already has the same
228
+ branch. A closed PR or a deleted branch retires it.
401
229
 
402
- # Salvage a file into ./salvage/
403
- spidersan rescue --salvage path/to/file.ts
404
-
405
- # Abandon a rogue file
406
- spidersan rescue --abandon path/to/file.ts
407
- ```
408
-
409
- **Perfect for:** Post-hackathon cleanup, onboarding to chaotic repos, AI agent disasters.
230
+ The earlier OIDC Actions workflow (`auto-register.yml` → `register-branch` edge
231
+ function → `branch_registry`) was removed: nothing read `branch_registry`.
410
232
 
411
233
  ---
412
234
 
413
- ## 🪝 Claude Code Hook Recipes
414
-
415
- Wire Spidersan into Claude Code's hook system so conflict checks, AI advice, and registry syncs happen **automatically** — no agent needs to remember to run them.
416
-
417
- ### How it works
235
+ ## 🪝 Claude Code Plugin
418
236
 
419
- Claude Code's `~/.claude/settings.json` supports `PreToolUse` hooks that fire before any Bash command and can hard-block execution (returning `continue: false`) or inject context back to the model. Spidersan's `--strict` flag exits with code `1` on TIER 2+ conflicts, making it a natural hard-stop gate.
237
+ The hooks ship as a Claude Code plugin, so checks happen **automatically** and no agent has to remember to run them:
420
238
 
421
- ### The full recipe
422
-
423
- Add these hooks to `~/.claude/settings.json`:
424
-
425
- ```json
426
- {
427
- "hooks": {
428
- "PreToolUse": [
429
- {
430
- "matcher": "Bash",
431
- "hooks": [
432
- {
433
- "type": "command",
434
- "command": "jq -r '.tool_input.command // empty' | grep -qE '\\brm\\b' && jq -n '{\"continue\":false,\"stopReason\":\"🛑 rm blocked — verify paths and request explicit permission.\"}' || echo '{}'"
435
- },
436
- {
437
- "type": "command",
438
- "command": "bash -c 'cmd=$(jq -r \".tool_input.command // empty\"); if echo \"$cmd\" | grep -qE \"\\\\bgit\\\\s+push\\\\b\"; then if ! spidersan conflicts --tier 2 --strict 2>/dev/null; then jq -n \"{\\\"continue\\\":false,\\\"stopReason\\\":\\\"🕷️ Spidersan: TIER 2+ conflict detected. Run spidersan conflicts to review before pushing.\\\"}\"; exit 0; fi; advice=$(spidersan advise 2>/dev/null | head -30); [ -n \"$advice\" ] && jq -n --arg a \"$advice\" \"{\\\"hookSpecificOutput\\\":{\\\"hookEventName\\\":\\\"PreToolUse\\\",\\\"additionalContext\\\":\\\"🕷️ Spidersan pre-push advice:\\\\n\\($a)\\\"}}\" || echo \"{}\"; elif echo \"$cmd\" | grep -qE \"\\\\bgit\\\\s+(merge|rebase)\\\\b\"; then if ! spidersan conflicts --tier 3 --strict 2>/dev/null; then jq -n \"{\\\"continue\\\":false,\\\"stopReason\\\":\\\"🕷️ Spidersan: TIER 3 critical conflict detected. Run spidersan conflicts --tier 3 before merging.\\\"}\"; exit 0; fi; echo \"{}\"; else echo \"{}\"; fi'"
439
- }
440
- ]
441
- }
442
- ],
443
- "PostToolUse": [
444
- {
445
- "matcher": "Bash",
446
- "hooks": [
447
- {
448
- "type": "command",
449
- "command": "bash -c 'cmd=$(jq -r \".tool_input.command // empty\"); echo \"$cmd\" | grep -qE \"\\\\bgit\\\\s+push\\\\b\" && spidersan registry-sync --push 2>/dev/null &; echo \"{}\"'",
450
- "async": true
451
- }
452
- ]
453
- }
454
- ]
455
- }
456
- }
457
239
  ```
458
-
459
- ### What each hook does
460
-
461
- | Hook | Trigger | Action |
462
- |------|---------|--------|
463
- | `rm` guard | Any `rm` command | **Hard block** — requires explicit permission |
464
- | Pre-push conflict check | `git push` | Runs `spidersan conflicts --tier 2 --strict` — **hard blocks** if TIER 2+ found |
465
- | Pre-push AI advice | `git push` (after conflict check passes) | Runs `spidersan advise`, injects recommendations into model context |
466
- | Pre-merge conflict check | `git merge` / `git rebase` | Runs `spidersan conflicts --tier 3 --strict` — **hard blocks** on critical files |
467
- | Post-push registry sync | `git push` (success) | Runs `spidersan registry-sync --push` async — keeps fleet registry fresh |
468
-
469
- ### Conflict tiers
470
-
471
- | Tier | Threshold | Example files | Gate used on |
472
- |------|-----------|---------------|--------------|
473
- | TIER 1 WARN | Low risk | `.md`, `.css`, `.json` | Not blocked |
474
- | TIER 2 PAUSE | Medium risk | `package.json`, migrations, types | `git push` |
475
- | TIER 3 BLOCK | Critical | `.env`, auth files, core lib | `git merge`, `git rebase` |
476
-
477
- ### Installing
478
-
479
- ```bash
480
- # Merge into your global settings (preserves existing config)
481
- cp ~/.claude/settings.json ~/.claude/settings.json.bak
482
- # Then add the hooks block above — or use /update-config in Claude Code
240
+ /plugin marketplace add treebird7/spidersan-oss
241
+ /plugin install spidersan@spidersan
483
242
  ```
484
243
 
485
- The hooks are global (`~/.claude/settings.json`) so they apply across all projects automatically. Every agent on the machine benefits without per-repo setup.
244
+ It blocks force-pushes and commits that would sweep up another session's files. It also warns when two sessions share a checkout, when an edited file is registered on another branch, when a branch's PR already merged, and when a worktree holds someone else's uncommitted work. On push, merge and rebase it runs `spidersan conflicts`. See [plugin/README.md](plugin/README.md) for each hook, its requirements and the optional agent-identity settings. The plugin also adds the `/spidersan` skill.
486
245
 
487
246
  ---
488
247