spidersan 0.10.0 → 0.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +171 -0
- package/README.md +39 -280
- package/dist/bin/command-registry.d.ts +25 -0
- package/dist/bin/command-registry.d.ts.map +1 -0
- package/dist/bin/command-registry.js +29 -0
- package/dist/bin/command-registry.js.map +1 -0
- package/dist/bin/spidersan.d.ts +7 -0
- package/dist/bin/spidersan.d.ts.map +1 -1
- package/dist/bin/spidersan.js +38 -57
- package/dist/bin/spidersan.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +17 -3
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -39
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/conflicts.d.ts +22 -0
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +459 -256
- package/dist/commands/conflicts.js.map +1 -1
- package/dist/commands/cross-conflicts.d.ts.map +1 -1
- package/dist/commands/cross-conflicts.js +7 -8
- package/dist/commands/cross-conflicts.js.map +1 -1
- package/dist/commands/depends.d.ts +4 -1
- package/dist/commands/depends.d.ts.map +1 -1
- package/dist/commands/depends.js +35 -8
- package/dist/commands/depends.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +25 -7
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/git-watch.d.ts +1 -1
- package/dist/commands/git-watch.js +1 -1
- package/dist/commands/github-sync.d.ts +33 -0
- package/dist/commands/github-sync.d.ts.map +1 -1
- package/dist/commands/github-sync.js +68 -57
- package/dist/commands/github-sync.js.map +1 -1
- package/dist/commands/index.d.ts +2 -13
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +5 -20
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/merge-order.d.ts.map +1 -1
- package/dist/commands/merge-order.js +8 -4
- package/dist/commands/merge-order.js.map +1 -1
- package/dist/commands/merged.d.ts.map +1 -1
- package/dist/commands/merged.js +5 -1
- package/dist/commands/merged.js.map +1 -1
- package/dist/commands/pr-check.d.ts +24 -0
- package/dist/commands/pr-check.d.ts.map +1 -0
- package/dist/commands/pr-check.js +85 -0
- package/dist/commands/pr-check.js.map +1 -0
- package/dist/commands/ready-check.d.ts.map +1 -1
- package/dist/commands/ready-check.js +6 -3
- package/dist/commands/ready-check.js.map +1 -1
- package/dist/commands/register.d.ts +5 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +14 -1
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/registry-sync.d.ts.map +1 -1
- package/dist/commands/registry-sync.js +12 -46
- package/dist/commands/registry-sync.js.map +1 -1
- package/dist/commands/stale.d.ts.map +1 -1
- package/dist/commands/stale.js +8 -3
- package/dist/commands/stale.js.map +1 -1
- package/dist/commands/sync.d.ts +14 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +49 -31
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/verify-trunk.d.ts +18 -0
- package/dist/commands/verify-trunk.d.ts.map +1 -0
- package/dist/commands/verify-trunk.js +77 -0
- package/dist/commands/verify-trunk.js.map +1 -0
- package/dist/commands/watch.d.ts +0 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +50 -77
- package/dist/commands/watch.js.map +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/activity.d.ts.map +1 -1
- package/dist/lib/activity.js +6 -2
- package/dist/lib/activity.js.map +1 -1
- package/dist/lib/ai/context-builder.d.ts.map +1 -1
- package/dist/lib/ai/context-builder.js +19 -6
- package/dist/lib/ai/context-builder.js.map +1 -1
- package/dist/lib/ai/event-handler.d.ts.map +1 -1
- package/dist/lib/ai/event-handler.js +15 -2
- package/dist/lib/ai/event-handler.js.map +1 -1
- package/dist/lib/ai/reasoner.d.ts.map +1 -1
- package/dist/lib/ai/reasoner.js +63 -82
- package/dist/lib/ai/reasoner.js.map +1 -1
- package/dist/lib/ai/setup.d.ts +1 -1
- package/dist/lib/ai/setup.d.ts.map +1 -1
- package/dist/lib/ai/types.d.ts.map +1 -1
- package/dist/lib/ai/types.js +5 -2
- package/dist/lib/ai/types.js.map +1 -1
- package/dist/lib/ast.d.ts +10 -2
- package/dist/lib/ast.d.ts.map +1 -1
- package/dist/lib/ast.js +52 -27
- package/dist/lib/ast.js.map +1 -1
- package/dist/lib/carries.d.ts +22 -0
- package/dist/lib/carries.d.ts.map +1 -0
- package/dist/lib/carries.js +56 -0
- package/dist/lib/carries.js.map +1 -0
- package/dist/lib/colony-subscriber.d.ts +1 -1
- package/dist/lib/colony-subscriber.js +1 -1
- package/dist/lib/config.d.ts +2 -2
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +13 -8
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/conflict-renderer.d.ts.map +1 -1
- package/dist/lib/conflict-renderer.js +17 -34
- package/dist/lib/conflict-renderer.js.map +1 -1
- package/dist/lib/ecosystem-env.d.ts +33 -0
- package/dist/lib/ecosystem-env.d.ts.map +1 -0
- package/dist/lib/ecosystem-env.js +62 -0
- package/dist/lib/ecosystem-env.js.map +1 -0
- package/dist/lib/git-events-subscriber.d.ts +27 -0
- package/dist/lib/git-events-subscriber.d.ts.map +1 -1
- package/dist/lib/git-events-subscriber.js +149 -58
- package/dist/lib/git-events-subscriber.js.map +1 -1
- package/dist/lib/git-merge-analyzer.d.ts +38 -0
- package/dist/lib/git-merge-analyzer.d.ts.map +1 -0
- package/dist/lib/git-merge-analyzer.js +23 -0
- package/dist/lib/git-merge-analyzer.js.map +1 -0
- package/dist/lib/git.d.ts +88 -0
- package/dist/lib/git.d.ts.map +1 -1
- package/dist/lib/git.js +499 -9
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/github.d.ts +69 -1
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/github.js +230 -16
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/graph.d.ts +15 -0
- package/dist/lib/graph.d.ts.map +1 -1
- package/dist/lib/graph.js +31 -0
- package/dist/lib/graph.js.map +1 -1
- package/dist/lib/machine.d.ts +14 -0
- package/dist/lib/machine.d.ts.map +1 -0
- package/dist/lib/machine.js +38 -0
- package/dist/lib/machine.js.map +1 -0
- package/dist/lib/notify.d.ts +68 -0
- package/dist/lib/notify.d.ts.map +1 -0
- package/dist/lib/notify.js +111 -0
- package/dist/lib/notify.js.map +1 -0
- package/dist/lib/outline.d.ts +6 -0
- package/dist/lib/outline.d.ts.map +1 -0
- package/dist/lib/outline.js +60 -0
- package/dist/lib/outline.js.map +1 -0
- package/dist/lib/push-registry.d.ts +22 -0
- package/dist/lib/push-registry.d.ts.map +1 -0
- package/dist/lib/push-registry.js +21 -0
- package/dist/lib/push-registry.js.map +1 -0
- package/dist/lib/reconcile.d.ts +100 -0
- package/dist/lib/reconcile.d.ts.map +1 -0
- package/dist/lib/reconcile.js +121 -0
- package/dist/lib/reconcile.js.map +1 -0
- package/dist/lib/security.d.ts +1 -6
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +1 -11
- package/dist/lib/security.js.map +1 -1
- package/dist/lib/semantic-analysis.d.ts +31 -0
- package/dist/lib/semantic-analysis.d.ts.map +1 -0
- package/dist/lib/semantic-analysis.js +120 -0
- package/dist/lib/semantic-analysis.js.map +1 -0
- package/dist/lib/supabase-credentials.d.ts +36 -0
- package/dist/lib/supabase-credentials.d.ts.map +1 -0
- package/dist/lib/supabase-credentials.js +43 -0
- package/dist/lib/supabase-credentials.js.map +1 -0
- package/dist/lib/trunk.d.ts +39 -0
- package/dist/lib/trunk.d.ts.map +1 -0
- package/dist/lib/trunk.js +116 -0
- package/dist/lib/trunk.js.map +1 -0
- package/dist/storage/adapter.d.ts +20 -1
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/branch-registry-store.d.ts +1 -1
- package/dist/storage/branch-registry-store.d.ts.map +1 -1
- package/dist/storage/factory.d.ts +0 -4
- package/dist/storage/factory.d.ts.map +1 -1
- package/dist/storage/factory.js +2 -26
- package/dist/storage/factory.js.map +1 -1
- package/dist/storage/json-branch-registry-store.d.ts +1 -1
- package/dist/storage/json-branch-registry-store.d.ts.map +1 -1
- package/dist/storage/json-branch-registry-store.js +33 -7
- package/dist/storage/json-branch-registry-store.js.map +1 -1
- package/dist/storage/local.d.ts +1 -1
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +2 -2
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/memory-branch-registry-store.d.ts +1 -1
- package/dist/storage/memory-branch-registry-store.d.ts.map +1 -1
- package/dist/storage/memory-branch-registry-store.js +4 -1
- package/dist/storage/memory-branch-registry-store.js.map +1 -1
- package/dist/storage/supabase-registry-sync-client-impl.d.ts +1 -7
- package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -1
- package/dist/storage/supabase-registry-sync-client-impl.js +17 -61
- package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -1
- package/dist/storage/supabase-registry-sync-client.d.ts +1 -1
- package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -1
- package/dist/storage/supabase.d.ts +3 -9
- package/dist/storage/supabase.d.ts.map +1 -1
- package/dist/storage/supabase.js +4 -22
- package/dist/storage/supabase.js.map +1 -1
- package/dist/types/cloud.d.ts +1 -0
- package/dist/types/cloud.d.ts.map +1 -1
- package/package.json +88 -90
- 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type SymbolConflict } from './ast.js';
|
|
2
|
+
export interface SemanticTarget {
|
|
3
|
+
label: string;
|
|
4
|
+
files: string[];
|
|
5
|
+
/** Resolvable git ref for this target's head, or null when it isn't available locally. */
|
|
6
|
+
ref: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface SemanticResult {
|
|
9
|
+
conflicts: SymbolConflict[];
|
|
10
|
+
/** One human-readable line per file/target that could not be analyzed. */
|
|
11
|
+
skipped: string[];
|
|
12
|
+
/**
|
|
13
|
+
* Overlapping files of a type semantic analysis doesn't cover (.sql, .yaml, .md …). "No symbol
|
|
14
|
+
* conflicts" says nothing about them, so callers must not turn it into "safe to merge".
|
|
15
|
+
*/
|
|
16
|
+
unsupported: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A branch's tip for analysis: the LOCAL branch first (unpushed commits are the point), then
|
|
20
|
+
* origin's. resolveBranchRef alone prefers the remote and would read a stale tip.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveBranchTip(name: string): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* A cross-machine label "<machine>/<branch>" names ANOTHER machine's branch, so it resolves only
|
|
25
|
+
* against origin — a same-named local branch would be the wrong tip. The caller must know the
|
|
26
|
+
* label is cross-machine (from where the entry came from); guessing from the label's shape is
|
|
27
|
+
* ambiguous for local branches like "feat/x".
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveCrossMachineRef(label: string): string | null;
|
|
30
|
+
export declare function analyzeSemantic(currentLabel: string, currentRef: string | null, targets: SemanticTarget[], cwd?: string): SemanticResult;
|
|
31
|
+
//# sourceMappingURL=semantic-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-analysis.d.ts","sourceRoot":"","sources":["../../src/lib/semantic-analysis.ts"],"names":[],"mappings":"AAQA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAI1D,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0FAA0F;IAC1F,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAqBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,eAAe,CAC3B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,OAAO,EAAE,cAAc,EAAE,EACzB,GAAG,CAAC,EAAE,MAAM,GACb,cAAc,CAyEhB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* semantic-analysis.ts — the `conflicts --semantic` engine.
|
|
3
|
+
*
|
|
4
|
+
* Takes targets that carry a REAL git ref (never a display label like
|
|
5
|
+
* "PR #303 (branch)") and returns symbol conflicts plus every file it could not
|
|
6
|
+
* analyze. Callers must not print "safe to merge" while `skipped` is non-empty.
|
|
7
|
+
*/
|
|
8
|
+
import { execFileSync } from 'child_process';
|
|
9
|
+
import { ASTParser } from './ast.js';
|
|
10
|
+
import { findOutlineConflicts } from './outline.js';
|
|
11
|
+
import { resolveBranchRef, resolveLocalBranchRef } from './git.js';
|
|
12
|
+
const TS_FILE = /\.(ts|js|tsx|jsx)$/;
|
|
13
|
+
const PY_FILE = /\.py$/;
|
|
14
|
+
const git = (args, cwd) => execFileSync('git', args, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], cwd, timeout: 30_000 }); // a hung object store must not hang the command
|
|
15
|
+
/**
|
|
16
|
+
* File content at ref; null ONLY when the path genuinely doesn't exist there (a legitimate
|
|
17
|
+
* non-conflict). Any other git failure throws, so the caller records it as skipped instead of
|
|
18
|
+
* reading it as "absent".
|
|
19
|
+
*
|
|
20
|
+
* `ls-tree`, not `cat-file -e`: cat-file exits 128 for a missing path AND for a bad ref/repo, so it
|
|
21
|
+
* can't tell them apart. ls-tree exits 0 with empty output for an absent path and non-zero otherwise.
|
|
22
|
+
*/
|
|
23
|
+
function show(ref, file, cwd) {
|
|
24
|
+
if (!git(['ls-tree', '--name-only', ref, '--', file], cwd).trim())
|
|
25
|
+
return null;
|
|
26
|
+
return git(['show', `${ref}:${file}`], cwd);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A branch's tip for analysis: the LOCAL branch first (unpushed commits are the point), then
|
|
30
|
+
* origin's. resolveBranchRef alone prefers the remote and would read a stale tip.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveBranchTip(name) {
|
|
33
|
+
return resolveLocalBranchRef(name) ?? resolveBranchRef(name);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A cross-machine label "<machine>/<branch>" names ANOTHER machine's branch, so it resolves only
|
|
37
|
+
* against origin — a same-named local branch would be the wrong tip. The caller must know the
|
|
38
|
+
* label is cross-machine (from where the entry came from); guessing from the label's shape is
|
|
39
|
+
* ambiguous for local branches like "feat/x".
|
|
40
|
+
*/
|
|
41
|
+
export function resolveCrossMachineRef(label) {
|
|
42
|
+
const remote = resolveBranchRef(label.slice(label.indexOf('/') + 1));
|
|
43
|
+
return remote?.startsWith('refs/remotes/') ? remote : null;
|
|
44
|
+
}
|
|
45
|
+
export function analyzeSemantic(currentLabel, currentRef, targets, cwd) {
|
|
46
|
+
const parser = new ASTParser();
|
|
47
|
+
const result = { conflicts: [], skipped: [], unsupported: [] };
|
|
48
|
+
for (const target of targets) {
|
|
49
|
+
for (const file of target.files) {
|
|
50
|
+
const isPython = PY_FILE.test(file);
|
|
51
|
+
if (!isPython && !TS_FILE.test(file)) {
|
|
52
|
+
if (!result.unsupported.includes(file))
|
|
53
|
+
result.unsupported.push(file);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// An unresolvable ref is UNKNOWN, not "no conflict" — never swallow it.
|
|
57
|
+
if (!currentRef) {
|
|
58
|
+
result.skipped.push(`${file}: no local ref for ${currentLabel}`);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (!target.ref) {
|
|
62
|
+
result.skipped.push(`${file}: no local ref for ${target.label} (not fetched?)`);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
let current;
|
|
66
|
+
let other;
|
|
67
|
+
try {
|
|
68
|
+
current = show(currentRef, file, cwd);
|
|
69
|
+
other = show(target.ref, file, cwd);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
result.skipped.push(`${file}: could not read from ${target.label}`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// Absent on one side = added/deleted there. A delete/modify overlap is a real git conflict, and
|
|
76
|
+
// symbol comparison can't judge it, so it is unanalyzed (incomplete), never "nothing to conflict".
|
|
77
|
+
if (current === null || other === null) {
|
|
78
|
+
result.skipped.push(`${file}: absent on ${current === null ? currentLabel : target.label} (added or deleted) — not analyzed`);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Three-way against the merge-base. Two-way ONLY when the histories are genuinely unrelated
|
|
82
|
+
// (merge-base exit 1); any other failure is unknown, not a reason to change comparison mode.
|
|
83
|
+
let base;
|
|
84
|
+
try {
|
|
85
|
+
let mb = null;
|
|
86
|
+
try {
|
|
87
|
+
mb = git(['merge-base', currentRef, target.ref], cwd).trim();
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
if (err.status !== 1)
|
|
91
|
+
throw err; // 1 = no common ancestor
|
|
92
|
+
}
|
|
93
|
+
base = mb ? show(mb, file, cwd) ?? undefined : undefined;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
result.skipped.push(`${file}: could not compute merge-base with ${target.label}`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
let found;
|
|
100
|
+
try {
|
|
101
|
+
found = isPython
|
|
102
|
+
? findOutlineConflicts('.py', current, `${currentLabel}:${file}`, other, `${target.label}:${file}`, base)
|
|
103
|
+
: parser.findSymbolConflicts(current, `${currentLabel}:${file}`, other, `${target.label}:${file}`, base);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// A parser failure is unknown, not "no conflicts". No caught message: it can carry
|
|
107
|
+
// internals and this line is printed.
|
|
108
|
+
result.skipped.push(`${file}: parse failed`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (!found) {
|
|
112
|
+
result.skipped.push(`${file}: semantic analysis unavailable (install ast-grep)`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
result.conflicts.push(...found);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=semantic-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-analysis.js","sourceRoot":"","sources":["../../src/lib/semantic-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for resolving spidersan's Supabase credentials.
|
|
3
|
+
*
|
|
4
|
+
* Precedence: SPIDERSAN_SUPABASE_* → SUPABASE_* → config.storage.*
|
|
5
|
+
*
|
|
6
|
+
* SPIDERSAN_SUPABASE_* MUST come first. envoak's vault-inject guard drops any
|
|
7
|
+
* secret whose name carries a bare SUPABASE_ prefix, so vault-injected creds
|
|
8
|
+
* only ever arrive under the scoped names. Resolvers checking just the bare
|
|
9
|
+
* names silently no-op under `envoak vault inject` — the production hook path —
|
|
10
|
+
* and report "Supabase not configured" while a valid grant is present (fc8cf22,
|
|
11
|
+
* 29aa575, tb-efmm; tb-ly0b found 7 more copies with the same defect).
|
|
12
|
+
*
|
|
13
|
+
* This module exists so that stays fixed in ONE place. Do not re-derive these
|
|
14
|
+
* env names inline; call resolveSupabaseCredentials()/resolveSupabaseEnv().
|
|
15
|
+
*
|
|
16
|
+
* COLONY_SUPABASE_* is deliberately absent from the chain: colony points at a
|
|
17
|
+
* different Supabase project, so falling back to it would silently write
|
|
18
|
+
* spider_registries into the wrong database (tb-ly0b).
|
|
19
|
+
*/
|
|
20
|
+
export interface SupabaseCredentials {
|
|
21
|
+
url: string;
|
|
22
|
+
key: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Env-only resolution. For callers with no config file in scope (subscribers,
|
|
26
|
+
* activity logging) that need a synchronous answer.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveSupabaseEnv(): {
|
|
29
|
+
url?: string;
|
|
30
|
+
key?: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Env → config.storage. The default for commands; null when unconfigured.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveSupabaseCredentials(basePath?: string): Promise<SupabaseCredentials | null>;
|
|
36
|
+
//# sourceMappingURL=supabase-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-credentials.d.ts","sourceRoot":"","sources":["../../src/lib/supabase-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAKnE;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC5C,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAQrC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for resolving spidersan's Supabase credentials.
|
|
3
|
+
*
|
|
4
|
+
* Precedence: SPIDERSAN_SUPABASE_* → SUPABASE_* → config.storage.*
|
|
5
|
+
*
|
|
6
|
+
* SPIDERSAN_SUPABASE_* MUST come first. envoak's vault-inject guard drops any
|
|
7
|
+
* secret whose name carries a bare SUPABASE_ prefix, so vault-injected creds
|
|
8
|
+
* only ever arrive under the scoped names. Resolvers checking just the bare
|
|
9
|
+
* names silently no-op under `envoak vault inject` — the production hook path —
|
|
10
|
+
* and report "Supabase not configured" while a valid grant is present (fc8cf22,
|
|
11
|
+
* 29aa575, tb-efmm; tb-ly0b found 7 more copies with the same defect).
|
|
12
|
+
*
|
|
13
|
+
* This module exists so that stays fixed in ONE place. Do not re-derive these
|
|
14
|
+
* env names inline; call resolveSupabaseCredentials()/resolveSupabaseEnv().
|
|
15
|
+
*
|
|
16
|
+
* COLONY_SUPABASE_* is deliberately absent from the chain: colony points at a
|
|
17
|
+
* different Supabase project, so falling back to it would silently write
|
|
18
|
+
* spider_registries into the wrong database (tb-ly0b).
|
|
19
|
+
*/
|
|
20
|
+
import { loadConfig } from './config.js';
|
|
21
|
+
/**
|
|
22
|
+
* Env-only resolution. For callers with no config file in scope (subscribers,
|
|
23
|
+
* activity logging) that need a synchronous answer.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveSupabaseEnv() {
|
|
26
|
+
return {
|
|
27
|
+
url: process.env.SPIDERSAN_SUPABASE_URL || process.env.SUPABASE_URL,
|
|
28
|
+
key: process.env.SPIDERSAN_SUPABASE_KEY || process.env.SUPABASE_KEY,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Env → config.storage. The default for commands; null when unconfigured.
|
|
33
|
+
*/
|
|
34
|
+
export async function resolveSupabaseCredentials(basePath) {
|
|
35
|
+
const env = resolveSupabaseEnv();
|
|
36
|
+
const config = await loadConfig(basePath);
|
|
37
|
+
const url = env.url || config.storage.supabaseUrl;
|
|
38
|
+
const key = env.key || config.storage.supabaseKey;
|
|
39
|
+
if (!url || !key)
|
|
40
|
+
return null;
|
|
41
|
+
return { url, key };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=supabase-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-credentials.js","sourceRoot":"","sources":["../../src/lib/supabase-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAC9B,OAAO;QACH,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QACnE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;KACtE,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC5C,QAAiB;IAEjB,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAClD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAElD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trunk branch detection.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes the "which branch is trunk?" question that was previously
|
|
5
|
+
* hardcoded as `main`/`master` in several places.
|
|
6
|
+
*
|
|
7
|
+
* Resolution order (first hit wins):
|
|
8
|
+
* 1. `git symbolic-ref refs/remotes/origin/HEAD` (strip the `origin/` prefix)
|
|
9
|
+
* 2. `.spidersanrc` `trunk` key
|
|
10
|
+
* 3. `main` — if that branch exists
|
|
11
|
+
* 4. `master` — if that branch exists
|
|
12
|
+
* 5. `'main'` — default fallback
|
|
13
|
+
*
|
|
14
|
+
* Pure + cached per `cwd` within a process. Tolerates a missing
|
|
15
|
+
* `origin/HEAD` (fresh clones throw — we catch and fall through).
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the repo's trunk branch name.
|
|
19
|
+
*
|
|
20
|
+
* @param opts.cwd - Repo directory (defaults to `process.cwd()`).
|
|
21
|
+
* @returns The trunk branch name (e.g. `'main'`, `'master'`, `'develop'`).
|
|
22
|
+
*/
|
|
23
|
+
export declare function getTrunkBranch(opts?: {
|
|
24
|
+
cwd?: string;
|
|
25
|
+
}): string;
|
|
26
|
+
/**
|
|
27
|
+
* True if `branch` is the repo's trunk.
|
|
28
|
+
*
|
|
29
|
+
* @param branch - Branch name to test.
|
|
30
|
+
* @param opts.cwd - Repo directory (defaults to `process.cwd()`).
|
|
31
|
+
*/
|
|
32
|
+
export declare function isTrunk(branch: string, opts?: {
|
|
33
|
+
cwd?: string;
|
|
34
|
+
}): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Clear the per-cwd trunk cache. Intended for tests; harmless in production.
|
|
37
|
+
*/
|
|
38
|
+
export declare function _clearTrunkCache(): void;
|
|
39
|
+
//# sourceMappingURL=trunk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trunk.d.ts","sourceRoot":"","sources":["../../src/lib/trunk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA0EH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQ9D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAExE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trunk branch detection.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes the "which branch is trunk?" question that was previously
|
|
5
|
+
* hardcoded as `main`/`master` in several places.
|
|
6
|
+
*
|
|
7
|
+
* Resolution order (first hit wins):
|
|
8
|
+
* 1. `git symbolic-ref refs/remotes/origin/HEAD` (strip the `origin/` prefix)
|
|
9
|
+
* 2. `.spidersanrc` `trunk` key
|
|
10
|
+
* 3. `main` — if that branch exists
|
|
11
|
+
* 4. `master` — if that branch exists
|
|
12
|
+
* 5. `'main'` — default fallback
|
|
13
|
+
*
|
|
14
|
+
* Pure + cached per `cwd` within a process. Tolerates a missing
|
|
15
|
+
* `origin/HEAD` (fresh clones throw — we catch and fall through).
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, readFileSync } from 'fs';
|
|
18
|
+
import { join } from 'path';
|
|
19
|
+
import { execGit } from './git.js';
|
|
20
|
+
const CONFIG_FILES = ['.spidersanrc', '.spidersanrc.json', '.spidersan.config.json'];
|
|
21
|
+
// Per-cwd cache so repeated calls within a process don't re-shell out to git.
|
|
22
|
+
const cache = new Map();
|
|
23
|
+
function resolveCwd(opts) {
|
|
24
|
+
return opts?.cwd ?? process.cwd();
|
|
25
|
+
}
|
|
26
|
+
/** origin/HEAD symbolic-ref → branch name, or null if unset / fresh clone. */
|
|
27
|
+
function fromOriginHead(cwd) {
|
|
28
|
+
try {
|
|
29
|
+
const out = execGit(['-C', cwd, 'symbolic-ref', 'refs/remotes/origin/HEAD'], {
|
|
30
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
31
|
+
}).trim();
|
|
32
|
+
// e.g. "refs/remotes/origin/develop" → "develop"
|
|
33
|
+
const prefix = 'refs/remotes/origin/';
|
|
34
|
+
const ref = out.startsWith(prefix) ? out.slice(prefix.length) : out.replace(/^origin\//, '');
|
|
35
|
+
return ref || null;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Fresh clones / no origin/HEAD set: throws — fall through.
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** `.spidersanrc` `trunk` key (project-local), or null if absent/unreadable. */
|
|
43
|
+
function fromConfig(cwd) {
|
|
44
|
+
for (const filename of CONFIG_FILES) {
|
|
45
|
+
const path = join(cwd, filename);
|
|
46
|
+
if (!existsSync(path))
|
|
47
|
+
continue;
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
50
|
+
const trunk = parsed?.trunk;
|
|
51
|
+
if (typeof trunk === 'string' && trunk.trim()) {
|
|
52
|
+
return trunk.trim();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Malformed config — ignore and keep looking.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/** True if a local branch ref exists. */
|
|
62
|
+
function branchExists(cwd, branch) {
|
|
63
|
+
try {
|
|
64
|
+
execGit(['-C', cwd, 'rev-parse', '--verify', `refs/heads/${branch}`], {
|
|
65
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
66
|
+
});
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function resolveTrunk(cwd) {
|
|
74
|
+
const fromHead = fromOriginHead(cwd);
|
|
75
|
+
if (fromHead)
|
|
76
|
+
return fromHead;
|
|
77
|
+
const fromCfg = fromConfig(cwd);
|
|
78
|
+
if (fromCfg)
|
|
79
|
+
return fromCfg;
|
|
80
|
+
if (branchExists(cwd, 'main'))
|
|
81
|
+
return 'main';
|
|
82
|
+
if (branchExists(cwd, 'master'))
|
|
83
|
+
return 'master';
|
|
84
|
+
return 'main';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve the repo's trunk branch name.
|
|
88
|
+
*
|
|
89
|
+
* @param opts.cwd - Repo directory (defaults to `process.cwd()`).
|
|
90
|
+
* @returns The trunk branch name (e.g. `'main'`, `'master'`, `'develop'`).
|
|
91
|
+
*/
|
|
92
|
+
export function getTrunkBranch(opts) {
|
|
93
|
+
const cwd = resolveCwd(opts);
|
|
94
|
+
const cached = cache.get(cwd);
|
|
95
|
+
if (cached !== undefined)
|
|
96
|
+
return cached;
|
|
97
|
+
const trunk = resolveTrunk(cwd);
|
|
98
|
+
cache.set(cwd, trunk);
|
|
99
|
+
return trunk;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* True if `branch` is the repo's trunk.
|
|
103
|
+
*
|
|
104
|
+
* @param branch - Branch name to test.
|
|
105
|
+
* @param opts.cwd - Repo directory (defaults to `process.cwd()`).
|
|
106
|
+
*/
|
|
107
|
+
export function isTrunk(branch, opts) {
|
|
108
|
+
return branch === getTrunkBranch(opts);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Clear the per-cwd trunk cache. Intended for tests; harmless in production.
|
|
112
|
+
*/
|
|
113
|
+
export function _clearTrunkCache() {
|
|
114
|
+
cache.clear();
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=trunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trunk.js","sourceRoot":"","sources":["../../src/lib/trunk.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,27 @@ export interface Branch {
|
|
|
9
9
|
files: string[];
|
|
10
10
|
registeredAt: Date;
|
|
11
11
|
agent?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Claude Code session (the id `tbe`/ccsessions lists) that last registered this
|
|
14
|
+
* branch, so a conflict can say WHICH session to resume. Local registry only:
|
|
15
|
+
* meaningless off the machine that owns the session, and not synced to Supabase.
|
|
16
|
+
*/
|
|
17
|
+
sessionId?: string;
|
|
12
18
|
status: 'active' | 'completed' | 'abandoned';
|
|
13
19
|
description?: string;
|
|
20
|
+
/** Branches that must merge BEFORE this one (`spidersan depends`). */
|
|
21
|
+
dependsOn?: string[];
|
|
22
|
+
/** PR that merged this branch (`spidersan merged --pr`). */
|
|
23
|
+
prNumber?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Per-file claims from before 0.20.0, when `watch` and `spidersan
|
|
26
|
+
* claim`/`release` wrote them. Nothing writes this any more; it stays
|
|
27
|
+
* so registries that still carry it keep parsing.
|
|
28
|
+
*/
|
|
29
|
+
claims?: Record<string, {
|
|
30
|
+
agent: string;
|
|
31
|
+
at: string;
|
|
32
|
+
}>;
|
|
14
33
|
}
|
|
15
34
|
export interface BranchRegistry {
|
|
16
35
|
branches: Record<string, Branch>;
|
|
@@ -57,6 +76,6 @@ export interface StorageAdapter {
|
|
|
57
76
|
/**
|
|
58
77
|
* Clean up old branches
|
|
59
78
|
*/
|
|
60
|
-
cleanup(olderThan: Date): Promise<string[]>;
|
|
79
|
+
cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
|
|
61
80
|
}
|
|
62
81
|
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAElC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvE;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhD;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxE"}
|
|
@@ -8,6 +8,6 @@ export interface BranchRegistryStore {
|
|
|
8
8
|
unregister(name: string): Promise<boolean>;
|
|
9
9
|
get(name: string): Promise<Branch | null>;
|
|
10
10
|
findByFiles(files: string[]): Promise<Branch[]>;
|
|
11
|
-
cleanup(olderThan: Date): Promise<string[]>;
|
|
11
|
+
cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=branch-registry-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/branch-registry-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAChC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/branch-registry-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAChC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxE"}
|
|
@@ -2,9 +2,5 @@
|
|
|
2
2
|
* Storage factory - selects the right storage backend
|
|
3
3
|
*/
|
|
4
4
|
import type { StorageAdapter } from './adapter.js';
|
|
5
|
-
import type { BranchRegistryStore } from './branch-registry-store.js';
|
|
6
|
-
import type { SupabaseRegistrySyncClient } from './supabase-registry-sync-client.js';
|
|
7
|
-
export declare function getBranchRegistryStore(basePath?: string): Promise<BranchRegistryStore>;
|
|
8
|
-
export declare function getSupabaseRegistrySyncClient(): Promise<SupabaseRegistrySyncClient | null>;
|
|
9
5
|
export declare function getStorage(): Promise<StorageAdapter>;
|
|
10
6
|
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAQ1D"}
|
package/dist/storage/factory.js
CHANGED
|
@@ -1,35 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Storage factory - selects the right storage backend
|
|
3
3
|
*/
|
|
4
|
-
import { JsonBranchRegistryStore } from './json-branch-registry-store.js';
|
|
5
4
|
import { LocalStorage } from './local.js';
|
|
6
5
|
import { SupabaseStorage } from './supabase.js';
|
|
7
|
-
import {
|
|
8
|
-
import { loadConfig } from '../lib/config.js';
|
|
9
|
-
async function getSupabaseConfig() {
|
|
10
|
-
const config = await loadConfig();
|
|
11
|
-
const supabaseUrl = process.env.SUPABASE_URL || config.storage.supabaseUrl;
|
|
12
|
-
const supabaseKey = process.env.SUPABASE_KEY || config.storage.supabaseKey;
|
|
13
|
-
if (!supabaseUrl || !supabaseKey) {
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
return {
|
|
17
|
-
url: supabaseUrl,
|
|
18
|
-
key: supabaseKey,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
export async function getBranchRegistryStore(basePath = process.cwd()) {
|
|
22
|
-
return new JsonBranchRegistryStore(basePath);
|
|
23
|
-
}
|
|
24
|
-
export async function getSupabaseRegistrySyncClient() {
|
|
25
|
-
const config = await getSupabaseConfig();
|
|
26
|
-
if (!config) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
return new SupabaseRegistrySyncClientImpl(config);
|
|
30
|
-
}
|
|
6
|
+
import { resolveSupabaseCredentials } from '../lib/supabase-credentials.js';
|
|
31
7
|
export async function getStorage() {
|
|
32
|
-
const supabaseConfig = await
|
|
8
|
+
const supabaseConfig = await resolveSupabaseCredentials();
|
|
33
9
|
if (supabaseConfig) {
|
|
34
10
|
return new SupabaseStorage(supabaseConfig);
|
|
35
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,cAAc,GAAG,MAAM,0BAA0B,EAAE,CAAC;IAE1D,IAAI,cAAc,EAAE,CAAC;QACjB,OAAO,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,YAAY,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -12,7 +12,7 @@ export declare class JsonBranchRegistryStore implements BranchRegistryStore {
|
|
|
12
12
|
unregister(name: string): Promise<boolean>;
|
|
13
13
|
get(name: string): Promise<Branch | null>;
|
|
14
14
|
findByFiles(files: string[]): Promise<Branch[]>;
|
|
15
|
-
cleanup(olderThan: Date): Promise<string[]>;
|
|
15
|
+
cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
|
|
16
16
|
private load;
|
|
17
17
|
private save;
|
|
18
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/json-branch-registry-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA6BtE,qBAAa,uBAAwB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAKtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAetE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM/C,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"json-branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/json-branch-registry-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA6BtE,qBAAa,uBAAwB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAKtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAetE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM/C,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAuB1D,IAAI;YA+BJ,IAAI;CAMrB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { existsSync } from 'fs';
|
|
2
|
-
import { mkdir, readFile, writeFile } from 'fs/promises';
|
|
2
|
+
import { mkdir, readFile, writeFile, rename } from 'fs/promises';
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
const SPIDERSAN_DIR = '.spidersan';
|
|
5
5
|
const REGISTRY_FILE = 'registry.json';
|
|
@@ -82,10 +82,15 @@ export class JsonBranchRegistryStore {
|
|
|
82
82
|
const fileSet = new Set(files);
|
|
83
83
|
return branches.filter((branch) => branch.files.some((file) => fileSet.has(file)));
|
|
84
84
|
}
|
|
85
|
-
async cleanup(olderThan) {
|
|
85
|
+
async cleanup(olderThan, includeActive = false) {
|
|
86
86
|
const registry = await this.load();
|
|
87
87
|
const removedNames = [];
|
|
88
88
|
for (const [name, branch] of Object.entries(registry.branches)) {
|
|
89
|
+
// registeredAt is never refreshed, so an old ACTIVE registration
|
|
90
|
+
// usually means in-flight work — skip unless explicitly included.
|
|
91
|
+
if (!includeActive && branch.status === 'active') {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
89
94
|
if (branch.registeredAt < olderThan) {
|
|
90
95
|
delete registry.branches[name];
|
|
91
96
|
removedNames.push(name);
|
|
@@ -97,16 +102,37 @@ export class JsonBranchRegistryStore {
|
|
|
97
102
|
return removedNames;
|
|
98
103
|
}
|
|
99
104
|
async load() {
|
|
105
|
+
let data;
|
|
100
106
|
try {
|
|
101
|
-
|
|
102
|
-
|
|
107
|
+
data = await readFile(this.registryPath, 'utf-8');
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (err.code === 'ENOENT') {
|
|
111
|
+
return { branches: {}, version: REGISTRY_VERSION };
|
|
112
|
+
}
|
|
113
|
+
throw err;
|
|
103
114
|
}
|
|
104
|
-
|
|
105
|
-
|
|
115
|
+
// A file that EXISTS but doesn't parse must fail loudly — returning an
|
|
116
|
+
// empty registry here would let the next save() wipe every agent's
|
|
117
|
+
// registration.
|
|
118
|
+
const parsed = JSON.parse(data);
|
|
119
|
+
// Same loudness for a WRONG SHAPE: `branches` must be a name-keyed
|
|
120
|
+
// plain object. An array (e.g. from a stray `jq map()` edit) parses
|
|
121
|
+
// fine but breaks every keyed lookup — register/update/unregister all
|
|
122
|
+
// silently miss while list() keeps working (tb-orpt).
|
|
123
|
+
if (parsed === null || typeof parsed !== 'object' ||
|
|
124
|
+
parsed.branches === null || typeof parsed.branches !== 'object' ||
|
|
125
|
+
Array.isArray(parsed.branches)) {
|
|
126
|
+
throw new Error(`Corrupt registry at ${this.registryPath}: "branches" must be an object keyed by branch name. ` +
|
|
127
|
+
'Restore it or re-init; refusing to operate on it.');
|
|
106
128
|
}
|
|
129
|
+
return normalizeRegistry(parsed);
|
|
107
130
|
}
|
|
108
131
|
async save(registry) {
|
|
109
|
-
|
|
132
|
+
// Write-then-rename so a crash mid-write can't truncate registry.json.
|
|
133
|
+
const tmp = `${this.registryPath}.${process.pid}.tmp`;
|
|
134
|
+
await writeFile(tmp, JSON.stringify(registry, null, 2));
|
|
135
|
+
await rename(tmp, this.registryPath);
|
|
110
136
|
}
|
|
111
137
|
}
|
|
112
138
|
//# sourceMappingURL=json-branch-registry-store.js.map
|