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.
- package/CHANGELOG.md +163 -0
- package/README.md +39 -280
- package/package.json +88 -90
- package/dist/bin/spidersan.d.ts +0 -9
- package/dist/bin/spidersan.d.ts.map +0 -1
- package/dist/bin/spidersan.js +0 -117
- package/dist/bin/spidersan.js.map +0 -1
- package/dist/commands/abandon.d.ts +0 -8
- package/dist/commands/abandon.d.ts.map +0 -1
- package/dist/commands/abandon.js +0 -43
- package/dist/commands/abandon.js.map +0 -1
- package/dist/commands/activate.d.ts +0 -9
- package/dist/commands/activate.d.ts.map +0 -1
- package/dist/commands/activate.js +0 -45
- package/dist/commands/activate.js.map +0 -1
- package/dist/commands/active-windows.d.ts +0 -16
- package/dist/commands/active-windows.d.ts.map +0 -1
- package/dist/commands/active-windows.js +0 -373
- package/dist/commands/active-windows.js.map +0 -1
- package/dist/commands/ai.d.ts +0 -15
- package/dist/commands/ai.d.ts.map +0 -1
- package/dist/commands/ai.js +0 -498
- package/dist/commands/ai.js.map +0 -1
- package/dist/commands/audit-mark.d.ts +0 -12
- package/dist/commands/audit-mark.d.ts.map +0 -1
- package/dist/commands/audit-mark.js +0 -204
- package/dist/commands/audit-mark.js.map +0 -1
- package/dist/commands/auto.d.ts +0 -8
- package/dist/commands/auto.d.ts.map +0 -1
- package/dist/commands/auto.js +0 -207
- package/dist/commands/auto.js.map +0 -1
- package/dist/commands/bot.d.ts +0 -16
- package/dist/commands/bot.d.ts.map +0 -1
- package/dist/commands/bot.js +0 -416
- package/dist/commands/bot.js.map +0 -1
- package/dist/commands/cleanup.d.ts +0 -8
- package/dist/commands/cleanup.d.ts.map +0 -1
- package/dist/commands/cleanup.js +0 -36
- package/dist/commands/cleanup.js.map +0 -1
- package/dist/commands/close.d.ts +0 -9
- package/dist/commands/close.d.ts.map +0 -1
- package/dist/commands/close.js +0 -129
- package/dist/commands/close.js.map +0 -1
- package/dist/commands/collab-sync.d.ts +0 -14
- package/dist/commands/collab-sync.d.ts.map +0 -1
- package/dist/commands/collab-sync.js +0 -264
- package/dist/commands/collab-sync.js.map +0 -1
- package/dist/commands/collab.d.ts +0 -6
- package/dist/commands/collab.d.ts.map +0 -1
- package/dist/commands/collab.js +0 -103
- package/dist/commands/collab.js.map +0 -1
- package/dist/commands/completions.d.ts +0 -8
- package/dist/commands/completions.d.ts.map +0 -1
- package/dist/commands/completions.js +0 -83
- package/dist/commands/completions.js.map +0 -1
- package/dist/commands/config.d.ts +0 -15
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -337
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/conflicts.d.ts +0 -12
- package/dist/commands/conflicts.d.ts.map +0 -1
- package/dist/commands/conflicts.js +0 -570
- package/dist/commands/conflicts.js.map +0 -1
- package/dist/commands/context.d.ts +0 -8
- package/dist/commands/context.d.ts.map +0 -1
- package/dist/commands/context.js +0 -104
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/cross-conflicts.d.ts +0 -17
- package/dist/commands/cross-conflicts.d.ts.map +0 -1
- package/dist/commands/cross-conflicts.js +0 -274
- package/dist/commands/cross-conflicts.js.map +0 -1
- package/dist/commands/daily.d.ts +0 -7
- package/dist/commands/daily.d.ts.map +0 -1
- package/dist/commands/daily.js +0 -171
- package/dist/commands/daily.js.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -22
- package/dist/commands/dashboard.d.ts.map +0 -1
- package/dist/commands/dashboard.js +0 -401
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/commands/demo.d.ts +0 -3
- package/dist/commands/demo.d.ts.map +0 -1
- package/dist/commands/demo.js +0 -118
- package/dist/commands/demo.js.map +0 -1
- package/dist/commands/depends.d.ts +0 -8
- package/dist/commands/depends.d.ts.map +0 -1
- package/dist/commands/depends.js +0 -36
- package/dist/commands/depends.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -30
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -540
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/ecosystem-loader.d.ts +0 -14
- package/dist/commands/ecosystem-loader.d.ts.map +0 -1
- package/dist/commands/ecosystem-loader.js +0 -90
- package/dist/commands/ecosystem-loader.js.map +0 -1
- package/dist/commands/fleet-status.d.ts +0 -14
- package/dist/commands/fleet-status.d.ts.map +0 -1
- package/dist/commands/fleet-status.js +0 -127
- package/dist/commands/fleet-status.js.map +0 -1
- package/dist/commands/git-watch.d.ts +0 -24
- package/dist/commands/git-watch.d.ts.map +0 -1
- package/dist/commands/git-watch.js +0 -84
- package/dist/commands/git-watch.js.map +0 -1
- package/dist/commands/github-sync.d.ts +0 -9
- package/dist/commands/github-sync.d.ts.map +0 -1
- package/dist/commands/github-sync.js +0 -180
- package/dist/commands/github-sync.js.map +0 -1
- package/dist/commands/inbox.d.ts +0 -3
- package/dist/commands/inbox.d.ts.map +0 -1
- package/dist/commands/inbox.js +0 -120
- package/dist/commands/inbox.js.map +0 -1
- package/dist/commands/index.d.ts +0 -36
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/index.js +0 -44
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/init.d.ts +0 -8
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -23
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/intent-scan.d.ts +0 -17
- package/dist/commands/intent-scan.d.ts.map +0 -1
- package/dist/commands/intent-scan.js +0 -336
- package/dist/commands/intent-scan.js.map +0 -1
- package/dist/commands/key-import.d.ts +0 -3
- package/dist/commands/key-import.d.ts.map +0 -1
- package/dist/commands/key-import.js +0 -54
- package/dist/commands/key-import.js.map +0 -1
- package/dist/commands/keygen.d.ts +0 -3
- package/dist/commands/keygen.d.ts.map +0 -1
- package/dist/commands/keygen.js +0 -53
- package/dist/commands/keygen.js.map +0 -1
- package/dist/commands/keys.d.ts +0 -3
- package/dist/commands/keys.d.ts.map +0 -1
- package/dist/commands/keys.js +0 -56
- package/dist/commands/keys.js.map +0 -1
- package/dist/commands/list.d.ts +0 -3
- package/dist/commands/list.d.ts.map +0 -1
- package/dist/commands/list.js +0 -45
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/lock.d.ts +0 -11
- package/dist/commands/lock.d.ts.map +0 -1
- package/dist/commands/lock.js +0 -257
- package/dist/commands/lock.js.map +0 -1
- package/dist/commands/log.d.ts +0 -7
- package/dist/commands/log.d.ts.map +0 -1
- package/dist/commands/log.js +0 -110
- package/dist/commands/log.js.map +0 -1
- package/dist/commands/mcp-health.d.ts +0 -3
- package/dist/commands/mcp-health.d.ts.map +0 -1
- package/dist/commands/mcp-health.js +0 -305
- package/dist/commands/mcp-health.js.map +0 -1
- package/dist/commands/mcp-restart.d.ts +0 -3
- package/dist/commands/mcp-restart.d.ts.map +0 -1
- package/dist/commands/mcp-restart.js +0 -176
- package/dist/commands/mcp-restart.js.map +0 -1
- package/dist/commands/merge-order.d.ts +0 -9
- package/dist/commands/merge-order.d.ts.map +0 -1
- package/dist/commands/merge-order.js +0 -96
- package/dist/commands/merge-order.js.map +0 -1
- package/dist/commands/merged.d.ts +0 -8
- package/dist/commands/merged.d.ts.map +0 -1
- package/dist/commands/merged.js +0 -33
- package/dist/commands/merged.js.map +0 -1
- package/dist/commands/monitor.d.ts +0 -3
- package/dist/commands/monitor.d.ts.map +0 -1
- package/dist/commands/monitor.js +0 -153
- package/dist/commands/monitor.js.map +0 -1
- package/dist/commands/msg-read.d.ts +0 -3
- package/dist/commands/msg-read.d.ts.map +0 -1
- package/dist/commands/msg-read.js +0 -95
- package/dist/commands/msg-read.js.map +0 -1
- package/dist/commands/pulse.d.ts +0 -13
- package/dist/commands/pulse.d.ts.map +0 -1
- package/dist/commands/pulse.js +0 -174
- package/dist/commands/pulse.js.map +0 -1
- package/dist/commands/queen.d.ts +0 -25
- package/dist/commands/queen.d.ts.map +0 -1
- package/dist/commands/queen.js +0 -326
- package/dist/commands/queen.js.map +0 -1
- package/dist/commands/radar.d.ts +0 -3
- package/dist/commands/radar.d.ts.map +0 -1
- package/dist/commands/radar.js +0 -147
- package/dist/commands/radar.js.map +0 -1
- package/dist/commands/ready-check.d.ts +0 -11
- package/dist/commands/ready-check.d.ts.map +0 -1
- package/dist/commands/ready-check.js +0 -147
- package/dist/commands/ready-check.js.map +0 -1
- package/dist/commands/rebase-helper.d.ts +0 -3
- package/dist/commands/rebase-helper.d.ts.map +0 -1
- package/dist/commands/rebase-helper.js +0 -52
- package/dist/commands/rebase-helper.js.map +0 -1
- package/dist/commands/register.d.ts +0 -5
- package/dist/commands/register.d.ts.map +0 -1
- package/dist/commands/register.js +0 -163
- package/dist/commands/register.js.map +0 -1
- package/dist/commands/registry-sync.d.ts +0 -9
- package/dist/commands/registry-sync.d.ts.map +0 -1
- package/dist/commands/registry-sync.js +0 -163
- package/dist/commands/registry-sync.js.map +0 -1
- package/dist/commands/rescue.d.ts +0 -11
- package/dist/commands/rescue.d.ts.map +0 -1
- package/dist/commands/rescue.js +0 -147
- package/dist/commands/rescue.js.map +0 -1
- package/dist/commands/semantic.d.ts +0 -3
- package/dist/commands/semantic.d.ts.map +0 -1
- package/dist/commands/semantic.js +0 -62
- package/dist/commands/semantic.js.map +0 -1
- package/dist/commands/send.d.ts +0 -3
- package/dist/commands/send.d.ts.map +0 -1
- package/dist/commands/send.js +0 -121
- package/dist/commands/send.js.map +0 -1
- package/dist/commands/stale.d.ts +0 -17
- package/dist/commands/stale.d.ts.map +0 -1
- package/dist/commands/stale.js +0 -131
- package/dist/commands/stale.js.map +0 -1
- package/dist/commands/status.d.ts +0 -9
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -41
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/sync-advisor.d.ts +0 -14
- package/dist/commands/sync-advisor.d.ts.map +0 -1
- package/dist/commands/sync-advisor.js +0 -110
- package/dist/commands/sync-advisor.js.map +0 -1
- package/dist/commands/sync.d.ts +0 -8
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js +0 -60
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/tension.d.ts +0 -12
- package/dist/commands/tension.d.ts.map +0 -1
- package/dist/commands/tension.js +0 -262
- package/dist/commands/tension.js.map +0 -1
- package/dist/commands/torrent.d.ts +0 -9
- package/dist/commands/torrent.d.ts.map +0 -1
- package/dist/commands/torrent.js +0 -470
- package/dist/commands/torrent.js.map +0 -1
- package/dist/commands/tui.d.ts +0 -8
- package/dist/commands/tui.d.ts.map +0 -1
- package/dist/commands/tui.js +0 -15
- package/dist/commands/tui.js.map +0 -1
- package/dist/commands/wake.d.ts +0 -9
- package/dist/commands/wake.d.ts.map +0 -1
- package/dist/commands/wake.js +0 -188
- package/dist/commands/wake.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -9
- package/dist/commands/watch.d.ts.map +0 -1
- package/dist/commands/watch.js +0 -536
- package/dist/commands/watch.js.map +0 -1
- package/dist/commands/welcome.d.ts +0 -8
- package/dist/commands/welcome.d.ts.map +0 -1
- package/dist/commands/welcome.js +0 -85
- package/dist/commands/welcome.js.map +0 -1
- package/dist/commands/who-owns.d.ts +0 -3
- package/dist/commands/who-owns.d.ts.map +0 -1
- package/dist/commands/who-owns.js +0 -68
- package/dist/commands/who-owns.js.map +0 -1
- package/dist/commands/who-touched.d.ts +0 -9
- package/dist/commands/who-touched.d.ts.map +0 -1
- package/dist/commands/who-touched.js +0 -198
- package/dist/commands/who-touched.js.map +0 -1
- package/dist/index.d.ts +0 -11
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -11
- package/dist/index.js.map +0 -1
- package/dist/lib/activity.d.ts +0 -53
- package/dist/lib/activity.d.ts.map +0 -1
- package/dist/lib/activity.js +0 -267
- package/dist/lib/activity.js.map +0 -1
- package/dist/lib/agent-errors.d.ts +0 -41
- package/dist/lib/agent-errors.d.ts.map +0 -1
- package/dist/lib/agent-errors.js +0 -145
- package/dist/lib/agent-errors.js.map +0 -1
- package/dist/lib/ai/context-builder.d.ts +0 -16
- package/dist/lib/ai/context-builder.d.ts.map +0 -1
- package/dist/lib/ai/context-builder.js +0 -216
- package/dist/lib/ai/context-builder.js.map +0 -1
- package/dist/lib/ai/event-handler.d.ts +0 -21
- package/dist/lib/ai/event-handler.d.ts.map +0 -1
- package/dist/lib/ai/event-handler.js +0 -98
- package/dist/lib/ai/event-handler.js.map +0 -1
- package/dist/lib/ai/index.d.ts +0 -13
- package/dist/lib/ai/index.d.ts.map +0 -1
- package/dist/lib/ai/index.js +0 -11
- package/dist/lib/ai/index.js.map +0 -1
- package/dist/lib/ai/llm-client.d.ts +0 -37
- package/dist/lib/ai/llm-client.d.ts.map +0 -1
- package/dist/lib/ai/llm-client.js +0 -225
- package/dist/lib/ai/llm-client.js.map +0 -1
- package/dist/lib/ai/reasoner.d.ts +0 -11
- package/dist/lib/ai/reasoner.d.ts.map +0 -1
- package/dist/lib/ai/reasoner.js +0 -246
- package/dist/lib/ai/reasoner.js.map +0 -1
- package/dist/lib/ai/setup.d.ts +0 -40
- package/dist/lib/ai/setup.d.ts.map +0 -1
- package/dist/lib/ai/setup.js +0 -154
- package/dist/lib/ai/setup.js.map +0 -1
- package/dist/lib/ai/types.d.ts +0 -135
- package/dist/lib/ai/types.d.ts.map +0 -1
- package/dist/lib/ai/types.js +0 -39
- package/dist/lib/ai/types.js.map +0 -1
- package/dist/lib/ast.d.ts +0 -36
- package/dist/lib/ast.d.ts.map +0 -1
- package/dist/lib/ast.js +0 -135
- package/dist/lib/ast.js.map +0 -1
- package/dist/lib/colony-subscriber.d.ts +0 -56
- package/dist/lib/colony-subscriber.d.ts.map +0 -1
- package/dist/lib/colony-subscriber.js +0 -265
- package/dist/lib/colony-subscriber.js.map +0 -1
- package/dist/lib/config.d.ts +0 -62
- package/dist/lib/config.d.ts.map +0 -1
- package/dist/lib/config.js +0 -230
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/conflict-analyzer.d.ts +0 -33
- package/dist/lib/conflict-analyzer.d.ts.map +0 -1
- package/dist/lib/conflict-analyzer.js +0 -114
- package/dist/lib/conflict-analyzer.js.map +0 -1
- package/dist/lib/conflict-renderer.d.ts +0 -7
- package/dist/lib/conflict-renderer.d.ts.map +0 -1
- package/dist/lib/conflict-renderer.js +0 -162
- package/dist/lib/conflict-renderer.js.map +0 -1
- package/dist/lib/conflict-tier.d.ts +0 -20
- package/dist/lib/conflict-tier.d.ts.map +0 -1
- package/dist/lib/conflict-tier.js +0 -49
- package/dist/lib/conflict-tier.js.map +0 -1
- package/dist/lib/crdt.d.ts +0 -83
- package/dist/lib/crdt.d.ts.map +0 -1
- package/dist/lib/crdt.js +0 -160
- package/dist/lib/crdt.js.map +0 -1
- package/dist/lib/crypto.d.ts +0 -71
- package/dist/lib/crypto.d.ts.map +0 -1
- package/dist/lib/crypto.js +0 -176
- package/dist/lib/crypto.js.map +0 -1
- package/dist/lib/daily-bridge.d.ts +0 -41
- package/dist/lib/daily-bridge.d.ts.map +0 -1
- package/dist/lib/daily-bridge.js +0 -186
- package/dist/lib/daily-bridge.js.map +0 -1
- package/dist/lib/errors.d.ts +0 -35
- package/dist/lib/errors.d.ts.map +0 -1
- package/dist/lib/errors.js +0 -71
- package/dist/lib/errors.js.map +0 -1
- package/dist/lib/git-events-subscriber.d.ts +0 -59
- package/dist/lib/git-events-subscriber.d.ts.map +0 -1
- package/dist/lib/git-events-subscriber.js +0 -779
- package/dist/lib/git-events-subscriber.js.map +0 -1
- package/dist/lib/git.d.ts +0 -15
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js +0 -180
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/github.d.ts +0 -83
- package/dist/lib/github.d.ts.map +0 -1
- package/dist/lib/github.js +0 -211
- package/dist/lib/github.js.map +0 -1
- package/dist/lib/graph.d.ts +0 -23
- package/dist/lib/graph.d.ts.map +0 -1
- package/dist/lib/graph.js +0 -134
- package/dist/lib/graph.js.map +0 -1
- package/dist/lib/hub.d.ts +0 -31
- package/dist/lib/hub.d.ts.map +0 -1
- package/dist/lib/hub.js +0 -92
- package/dist/lib/hub.js.map +0 -1
- package/dist/lib/license.d.ts +0 -61
- package/dist/lib/license.d.ts.map +0 -1
- package/dist/lib/license.js +0 -171
- package/dist/lib/license.js.map +0 -1
- package/dist/lib/pulse-renderer.d.ts +0 -19
- package/dist/lib/pulse-renderer.d.ts.map +0 -1
- package/dist/lib/pulse-renderer.js +0 -108
- package/dist/lib/pulse-renderer.js.map +0 -1
- package/dist/lib/regex-utils.d.ts +0 -6
- package/dist/lib/regex-utils.d.ts.map +0 -1
- package/dist/lib/regex-utils.js +0 -24
- package/dist/lib/regex-utils.js.map +0 -1
- package/dist/lib/register-renderer.d.ts +0 -10
- package/dist/lib/register-renderer.d.ts.map +0 -1
- package/dist/lib/register-renderer.js +0 -19
- package/dist/lib/register-renderer.js.map +0 -1
- package/dist/lib/remote-drift.d.ts +0 -61
- package/dist/lib/remote-drift.d.ts.map +0 -1
- package/dist/lib/remote-drift.js +0 -227
- package/dist/lib/remote-drift.js.map +0 -1
- package/dist/lib/repo-scanner.d.ts +0 -32
- package/dist/lib/repo-scanner.d.ts.map +0 -1
- package/dist/lib/repo-scanner.js +0 -160
- package/dist/lib/repo-scanner.js.map +0 -1
- package/dist/lib/salvage-analyzer.d.ts +0 -29
- package/dist/lib/salvage-analyzer.d.ts.map +0 -1
- package/dist/lib/salvage-analyzer.js +0 -121
- package/dist/lib/salvage-analyzer.js.map +0 -1
- package/dist/lib/security.d.ts +0 -77
- package/dist/lib/security.d.ts.map +0 -1
- package/dist/lib/security.js +0 -190
- package/dist/lib/security.js.map +0 -1
- package/dist/lib/session-logger.d.ts +0 -54
- package/dist/lib/session-logger.d.ts.map +0 -1
- package/dist/lib/session-logger.js +0 -136
- package/dist/lib/session-logger.js.map +0 -1
- package/dist/lib/symbol-extractor.d.ts +0 -41
- package/dist/lib/symbol-extractor.d.ts.map +0 -1
- package/dist/lib/symbol-extractor.js +0 -78
- package/dist/lib/symbol-extractor.js.map +0 -1
- package/dist/lib/update-check.d.ts +0 -11
- package/dist/lib/update-check.d.ts.map +0 -1
- package/dist/lib/update-check.js +0 -113
- package/dist/lib/update-check.js.map +0 -1
- package/dist/lib/watch-renderer.d.ts +0 -13
- package/dist/lib/watch-renderer.d.ts.map +0 -1
- package/dist/lib/watch-renderer.js +0 -35
- package/dist/lib/watch-renderer.js.map +0 -1
- package/dist/storage/adapter.d.ts +0 -62
- package/dist/storage/adapter.d.ts.map +0 -1
- package/dist/storage/adapter.js +0 -8
- package/dist/storage/adapter.js.map +0 -1
- package/dist/storage/branch-registry-store.d.ts +0 -13
- package/dist/storage/branch-registry-store.d.ts.map +0 -1
- package/dist/storage/branch-registry-store.js +0 -2
- package/dist/storage/branch-registry-store.js.map +0 -1
- package/dist/storage/factory.d.ts +0 -10
- package/dist/storage/factory.d.ts.map +0 -1
- package/dist/storage/factory.js +0 -38
- package/dist/storage/factory.js.map +0 -1
- package/dist/storage/git-messages.d.ts +0 -53
- package/dist/storage/git-messages.d.ts.map +0 -1
- package/dist/storage/git-messages.js +0 -376
- package/dist/storage/git-messages.js.map +0 -1
- package/dist/storage/index.d.ts +0 -10
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -11
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/json-branch-registry-store.d.ts +0 -19
- package/dist/storage/json-branch-registry-store.d.ts.map +0 -1
- package/dist/storage/json-branch-registry-store.js +0 -112
- package/dist/storage/json-branch-registry-store.js.map +0 -1
- package/dist/storage/local-messages.d.ts +0 -37
- package/dist/storage/local-messages.d.ts.map +0 -1
- package/dist/storage/local-messages.js +0 -151
- package/dist/storage/local-messages.js.map +0 -1
- package/dist/storage/local.d.ts +0 -20
- package/dist/storage/local.d.ts.map +0 -1
- package/dist/storage/local.js +0 -40
- package/dist/storage/local.js.map +0 -1
- package/dist/storage/memory-branch-registry-store.d.ts +0 -16
- package/dist/storage/memory-branch-registry-store.d.ts.map +0 -1
- package/dist/storage/memory-branch-registry-store.js +0 -65
- package/dist/storage/memory-branch-registry-store.js.map +0 -1
- package/dist/storage/message-adapter.d.ts +0 -86
- package/dist/storage/message-adapter.d.ts.map +0 -1
- package/dist/storage/message-adapter.js +0 -28
- package/dist/storage/message-adapter.js.map +0 -1
- package/dist/storage/message-factory.d.ts +0 -36
- package/dist/storage/message-factory.d.ts.map +0 -1
- package/dist/storage/message-factory.js +0 -99
- package/dist/storage/message-factory.js.map +0 -1
- package/dist/storage/mycmail-adapter.d.ts +0 -38
- package/dist/storage/mycmail-adapter.d.ts.map +0 -1
- package/dist/storage/mycmail-adapter.js +0 -300
- package/dist/storage/mycmail-adapter.js.map +0 -1
- package/dist/storage/supabase-registry-sync-client-impl.d.ts +0 -46
- package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +0 -1
- package/dist/storage/supabase-registry-sync-client-impl.js +0 -322
- package/dist/storage/supabase-registry-sync-client-impl.js.map +0 -1
- package/dist/storage/supabase-registry-sync-client.d.ts +0 -9
- package/dist/storage/supabase-registry-sync-client.d.ts.map +0 -1
- package/dist/storage/supabase-registry-sync-client.js +0 -2
- package/dist/storage/supabase-registry-sync-client.js.map +0 -1
- package/dist/storage/supabase.d.ts +0 -34
- package/dist/storage/supabase.d.ts.map +0 -1
- package/dist/storage/supabase.js +0 -74
- package/dist/storage/supabase.js.map +0 -1
- package/dist/tui/dashboard.d.ts +0 -35
- package/dist/tui/dashboard.d.ts.map +0 -1
- package/dist/tui/dashboard.js +0 -199
- package/dist/tui/dashboard.js.map +0 -1
- package/dist/tui/screen.d.ts +0 -14
- package/dist/tui/screen.d.ts.map +0 -1
- package/dist/tui/screen.js +0 -138
- package/dist/tui/screen.js.map +0 -1
- package/dist/types/cloud.d.ts +0 -101
- package/dist/types/cloud.d.ts.map +0 -1
- package/dist/types/cloud.js +0 -13
- 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
|
|
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 (
|
|
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 +
|
|
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
|
-
|
|
101
|
+
#### Ecosystem scan repo list
|
|
112
102
|
|
|
113
|
-
|
|
103
|
+
`conflicts --ecosystem` ships with no built-in repo list. Pick one (first match wins):
|
|
114
104
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
```
|
|
124
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
183
|
-
| `spidersan
|
|
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
|
-
|
|
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 --
|
|
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
|
|
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=<
|
|
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=<
|
|
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
|
|
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
|
-
### 🤖
|
|
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
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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
|
-
|
|
395
|
-
|
|
396
|
-
|
|
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
|
-
|
|
403
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|