spidersan 0.9.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 +187 -0
- package/README.md +39 -280
- package/package.json +9 -13
- 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 -398
- 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 -581
- 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 -268
- 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 -245
- 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 -156
- 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 -3
- package/dist/commands/watch.d.ts.map +0 -1
- package/dist/commands/watch.js +0 -428
- 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/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/remote-drift.d.ts +0 -60
- package/dist/lib/remote-drift.d.ts.map +0 -1
- package/dist/lib/remote-drift.js +0 -225
- 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/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/dist/commands/wake.js
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* spidersan wake
|
|
3
|
-
*
|
|
4
|
-
* Start a session with branch context.
|
|
5
|
-
* "Weaving into the Web" - the spider feels its threads.
|
|
6
|
-
*/
|
|
7
|
-
import { Command } from 'commander';
|
|
8
|
-
import { execSync } from 'child_process';
|
|
9
|
-
import { execa } from 'execa';
|
|
10
|
-
import { getStorage } from '../storage/index.js';
|
|
11
|
-
function getCurrentBranch() {
|
|
12
|
-
try {
|
|
13
|
-
return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
function getGitBranches() {
|
|
20
|
-
try {
|
|
21
|
-
const output = execSync('git branch --format="%(refname:short)"', { encoding: 'utf-8' });
|
|
22
|
-
return output.trim().split('\n').filter(Boolean);
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
return [];
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
function hasMycmail() {
|
|
29
|
-
try {
|
|
30
|
-
execSync('which mycmail', { stdio: 'ignore' });
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
async function getInboxCount() {
|
|
38
|
-
try {
|
|
39
|
-
const result = await execa('mycmail', ['inbox', '--count'], {
|
|
40
|
-
timeout: 10000, // 10 second timeout
|
|
41
|
-
reject: false,
|
|
42
|
-
});
|
|
43
|
-
const match = result.stdout?.match(/(\d+)/);
|
|
44
|
-
return match ? parseInt(match[1], 10) : 0;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return 0;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
export const wakeCommand = new Command('wake')
|
|
51
|
-
.description('Start a session - weave into the web, feel the threads')
|
|
52
|
-
.option('--json', 'Output as JSON')
|
|
53
|
-
.option('-q, --quiet', 'Minimal output')
|
|
54
|
-
.option('--skip-mail', 'Skip mycmail integration')
|
|
55
|
-
.action(async (options) => {
|
|
56
|
-
const storage = await getStorage();
|
|
57
|
-
const currentBranch = getCurrentBranch();
|
|
58
|
-
const result = {
|
|
59
|
-
synced: 0,
|
|
60
|
-
branches: [],
|
|
61
|
-
conflicts: [],
|
|
62
|
-
inboxCount: 0,
|
|
63
|
-
mycmailCalled: false,
|
|
64
|
-
};
|
|
65
|
-
// Step 1: Sync registry with git (remove orphaned branches)
|
|
66
|
-
if (await storage.isInitialized()) {
|
|
67
|
-
const gitBranches = new Set(getGitBranches());
|
|
68
|
-
const registeredBranches = await storage.list();
|
|
69
|
-
for (const branch of registeredBranches) {
|
|
70
|
-
if (!gitBranches.has(branch.name) && branch.status === 'active') {
|
|
71
|
-
await storage.unregister(branch.name);
|
|
72
|
-
result.synced++;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// Get current branches after sync
|
|
76
|
-
const branches = await storage.list();
|
|
77
|
-
result.branches = branches
|
|
78
|
-
.filter(b => b.status === 'active')
|
|
79
|
-
.map(b => ({ name: b.name, files: b.files, status: b.status, agent: b.agent }));
|
|
80
|
-
// Step 2: Check conflicts for current branch
|
|
81
|
-
if (currentBranch) {
|
|
82
|
-
const target = await storage.get(currentBranch);
|
|
83
|
-
if (target) {
|
|
84
|
-
for (const branch of branches) {
|
|
85
|
-
if (branch.name === currentBranch || branch.status !== 'active')
|
|
86
|
-
continue;
|
|
87
|
-
const overlappingFiles = branch.files.filter(f => target.files.includes(f));
|
|
88
|
-
if (overlappingFiles.length > 0) {
|
|
89
|
-
result.conflicts.push({ branch: branch.name, files: overlappingFiles, agent: branch.agent });
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// Step 3: Call mycmail wake (with timeout protection!)
|
|
96
|
-
if (!options.skipMail && hasMycmail()) {
|
|
97
|
-
try {
|
|
98
|
-
await execa('mycmail', ['wake', '--quiet'], {
|
|
99
|
-
timeout: 30000, // 30 second timeout - prevents hanging!
|
|
100
|
-
reject: false, // Don't throw on non-zero exit
|
|
101
|
-
});
|
|
102
|
-
result.mycmailCalled = true;
|
|
103
|
-
result.inboxCount = await getInboxCount();
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
// Ignore mycmail errors - but we won't hang!
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// JSON output
|
|
110
|
-
if (options.json) {
|
|
111
|
-
console.log(JSON.stringify(result, null, 2));
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
// Quiet output
|
|
115
|
-
if (options.quiet) {
|
|
116
|
-
console.log(`🕷️ Wake: ${result.branches.length} threads, ${result.conflicts.length} tensions`);
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
// ═══════════════════════════════════════════════════════════
|
|
120
|
-
// CEREMONIAL OUTPUT: "Weaving into the Web"
|
|
121
|
-
// ═══════════════════════════════════════════════════════════
|
|
122
|
-
console.log('');
|
|
123
|
-
console.log('🕷️ Spidersan Awakens...');
|
|
124
|
-
console.log('');
|
|
125
|
-
console.log(' ╭─────────────────────────────────────╮');
|
|
126
|
-
console.log(' │ Feeling the threads... │');
|
|
127
|
-
console.log(' ╰─────────────────────────────────────╯');
|
|
128
|
-
console.log('');
|
|
129
|
-
// Web status
|
|
130
|
-
const agentCount = new Set(result.branches.map(b => b.agent).filter(Boolean)).size;
|
|
131
|
-
console.log(' 📡 Web Status:');
|
|
132
|
-
console.log(` • ${result.branches.length} thread${result.branches.length !== 1 ? 's' : ''} active`);
|
|
133
|
-
if (agentCount > 0) {
|
|
134
|
-
console.log(` • ${agentCount} agent${agentCount !== 1 ? 's' : ''} weaving`);
|
|
135
|
-
}
|
|
136
|
-
if (result.synced > 0) {
|
|
137
|
-
console.log(` • ${result.synced} broken thread${result.synced !== 1 ? 's' : ''} cleared`);
|
|
138
|
-
}
|
|
139
|
-
// Tensions (conflicts)
|
|
140
|
-
if (result.conflicts.length > 0) {
|
|
141
|
-
console.log('');
|
|
142
|
-
console.log(` ⚠️ Tension${result.conflicts.length !== 1 ? 's' : ''} detected:`);
|
|
143
|
-
for (const conflict of result.conflicts) {
|
|
144
|
-
const agentInfo = conflict.agent ? ` (${conflict.agent})` : '';
|
|
145
|
-
console.log(` └─ ${conflict.files[0]}${agentInfo}`);
|
|
146
|
-
if (conflict.files.length > 1) {
|
|
147
|
-
console.log(` +${conflict.files.length - 1} more file${conflict.files.length > 2 ? 's' : ''}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
// Active threads
|
|
152
|
-
if (result.branches.length > 0) {
|
|
153
|
-
console.log('');
|
|
154
|
-
console.log(' 🕸️ Active Threads:');
|
|
155
|
-
for (const branch of result.branches.slice(0, 4)) {
|
|
156
|
-
const isCurrent = branch.name === currentBranch ? ' ← you' : '';
|
|
157
|
-
const agentInfo = branch.agent && branch.name !== currentBranch ? ` (${branch.agent})` : '';
|
|
158
|
-
console.log(` • ${branch.name}${agentInfo}${isCurrent}`);
|
|
159
|
-
}
|
|
160
|
-
if (result.branches.length > 4) {
|
|
161
|
-
console.log(` • ...and ${result.branches.length - 4} more`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
// Messages
|
|
165
|
-
if (result.mycmailCalled) {
|
|
166
|
-
console.log('');
|
|
167
|
-
if (result.inboxCount > 0) {
|
|
168
|
-
console.log(` 📬 ${result.inboxCount} message${result.inboxCount !== 1 ? 's' : ''} waiting`);
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
console.log(' 📭 No new messages');
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// Closing
|
|
175
|
-
console.log('');
|
|
176
|
-
if (result.conflicts.length === 0) {
|
|
177
|
-
console.log(' ╭─────────────────────────────────────╮');
|
|
178
|
-
console.log(' │ The web is calm. Ready to hunt. 🎯 │');
|
|
179
|
-
console.log(' ╰─────────────────────────────────────╯');
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
console.log(' ╭─────────────────────────────────────╮');
|
|
183
|
-
console.log(' │ Tensions on the web. Tread softly. │');
|
|
184
|
-
console.log(' ╰─────────────────────────────────────╯');
|
|
185
|
-
}
|
|
186
|
-
console.log('');
|
|
187
|
-
});
|
|
188
|
-
//# sourceMappingURL=wake.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wake.js","sourceRoot":"","sources":["../../src/commands/wake.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,SAAS,gBAAgB;IACrB,IAAI,CAAC;QACD,OAAO,QAAQ,CAAC,iCAAiC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,SAAS,cAAc;IACnB,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,wCAAwC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,SAAS,UAAU;IACf,IAAI,CAAC;QACD,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa;IACxB,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;YACxD,OAAO,EAAE,KAAK,EAAE,oBAAoB;YACpC,MAAM,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,CAAC;IACb,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACzC,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC;KACvC,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,MAAM,GAMR;QACA,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,KAAK;KACvB,CAAC;IAEF,4DAA4D;IAC5D,IAAI,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9C,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAEhD,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC9D,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,EAAE,CAAC;YACpB,CAAC;QACL,CAAC;QAED,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,QAAQ,GAAG,QAAQ;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpF,6CAA6C;QAC7C,IAAI,aAAa,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,MAAM,EAAE,CAAC;gBACT,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;oBAC5B,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;wBAAE,SAAS;oBAC1E,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC5E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;oBACjG,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,UAAU,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YACD,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;gBACxC,OAAO,EAAE,KAAK,EAAE,wCAAwC;gBACxD,MAAM,EAAE,KAAK,EAAG,+BAA+B;aAClD,CAAC,CAAC;YACH,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,MAAM,CAAC,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACL,6CAA6C;QACjD,CAAC;IACL,CAAC;IAED,cAAc;IACd,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACX,CAAC;IAED,eAAe;IACf,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa,MAAM,CAAC,SAAS,CAAC,MAAM,WAAW,CAAC,CAAC;QAChG,OAAO;IACX,CAAC;IAED,8DAA8D;IAC9D,4CAA4C;IAC5C,8DAA8D;IAE9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,aAAa;IACb,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,UAAU,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACzG,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,SAAS,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACnG,CAAC;IAED,uBAAuB;IACvB,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACnF,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;YACzD,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3G,CAAC;QACL,CAAC;IACL,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QACrE,CAAC;IACL,CAAC;IAED,WAAW;IACX,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,UAAU,WAAW,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACnG,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACzC,CAAC;IACL,CAAC;IAED,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
package/dist/commands/watch.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmDpC,eAAO,MAAM,YAAY,SAwOnB,CAAC"}
|
package/dist/commands/watch.js
DELETED
|
@@ -1,428 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import { execFileSync, spawnSync } from 'child_process';
|
|
3
|
-
import { getStorage } from '../storage/index.js';
|
|
4
|
-
import * as chokidar from 'chokidar';
|
|
5
|
-
import * as path from 'path';
|
|
6
|
-
import { homedir } from 'os';
|
|
7
|
-
import { io } from 'socket.io-client';
|
|
8
|
-
import { loadConfig } from '../lib/config.js';
|
|
9
|
-
import { syncFromColony } from '../lib/colony-subscriber.js';
|
|
10
|
-
import { getCurrentBranch } from '../lib/git.js';
|
|
11
|
-
import { createHubClient } from '../lib/hub.js';
|
|
12
|
-
const DEBOUNCE_MS = 1000; // Debounce file changes
|
|
13
|
-
const hub = createHubClient();
|
|
14
|
-
function getRepoRoot() {
|
|
15
|
-
try {
|
|
16
|
-
return execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf-8' }).trim();
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return process.cwd();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function parsePaths(value) {
|
|
23
|
-
return value.split(',').map((entry) => entry.trim()).filter(Boolean);
|
|
24
|
-
}
|
|
25
|
-
function formatConflictChatMessage(branch, conflicts) {
|
|
26
|
-
const conflictDetails = conflicts
|
|
27
|
-
.map(c => `• **${c.branch}**: ${c.files.join(', ')}`)
|
|
28
|
-
.join('\n');
|
|
29
|
-
return `🕷️⚠️ **CONFLICT DETECTED** on branch \`${branch}\`\n\n${conflictDetails}`;
|
|
30
|
-
}
|
|
31
|
-
export const watchCommand = new Command('watch')
|
|
32
|
-
.description('🕷️ Watch files and auto-register changes (daemon mode)')
|
|
33
|
-
.argument('[directory]', 'Directory to watch (default: current repo)')
|
|
34
|
-
.option('-d, --dir <directory>', 'Directory to watch (alias for positional arg)')
|
|
35
|
-
.option('--paths <paths>', 'Comma-separated list of files or folders to watch')
|
|
36
|
-
.option('--root <root>', 'Project root for relative paths (default: git root)')
|
|
37
|
-
.option('-a, --agent <agent>', 'Agent identifier for registration')
|
|
38
|
-
.option('--hub', 'Connect to Hub and emit real-time conflict warnings')
|
|
39
|
-
.option('--hub-sync', 'Post conflicts to Hub chat via REST API')
|
|
40
|
-
.option('-q, --quiet', 'Only log conflicts, not file changes')
|
|
41
|
-
.option('--legacy', 'Legacy mode: use old watcher settings (more file descriptors)')
|
|
42
|
-
.action(async (directory, options) => {
|
|
43
|
-
const storage = await getStorage();
|
|
44
|
-
const config = await loadConfig();
|
|
45
|
-
if (!await storage.isInitialized()) {
|
|
46
|
-
console.error('❌ Spidersan not initialized. Run: spidersan init');
|
|
47
|
-
process.exit(1);
|
|
48
|
-
}
|
|
49
|
-
const branch = getCurrentBranch();
|
|
50
|
-
const repoRoot = options.root || getRepoRoot();
|
|
51
|
-
const watchTargets = options.paths
|
|
52
|
-
? parsePaths(options.paths).map((entry) => path.isAbsolute(entry) ? entry : path.join(repoRoot, entry))
|
|
53
|
-
: [directory || options.dir || repoRoot];
|
|
54
|
-
const configuredAgent = config.agent.name?.trim();
|
|
55
|
-
const agent = options.agent || process.env.SPIDERSAN_AGENT || configuredAgent || 'unknown';
|
|
56
|
-
const watchLabel = watchTargets.length === 1 ? watchTargets[0] : `${watchTargets.length} paths`;
|
|
57
|
-
console.log(`
|
|
58
|
-
🕷️ SPIDERSAN WATCH MODE
|
|
59
|
-
━━━━━━━━━━━━━━━━━━━━━━━
|
|
60
|
-
Branch: ${branch}
|
|
61
|
-
Agent: ${agent}
|
|
62
|
-
Root: ${repoRoot}
|
|
63
|
-
Watching: ${watchLabel}
|
|
64
|
-
Hub: ${options.hub ? hub.url : 'disabled'}
|
|
65
|
-
Hub Sync: ${options.hubSync ? 'enabled (posts to chat)' : 'disabled'}
|
|
66
|
-
━━━━━━━━━━━━━━━━━━━━━━━
|
|
67
|
-
Press Ctrl+C to stop.
|
|
68
|
-
`);
|
|
69
|
-
// Hub socket connection (optional)
|
|
70
|
-
let hubSocket = null;
|
|
71
|
-
if (options.hub) {
|
|
72
|
-
try {
|
|
73
|
-
hubSocket = io(hub.url, {
|
|
74
|
-
reconnection: true,
|
|
75
|
-
reconnectionAttempts: 5,
|
|
76
|
-
timeout: 5000
|
|
77
|
-
});
|
|
78
|
-
hubSocket.on('connect', () => {
|
|
79
|
-
console.log('🔌 Connected to Hub');
|
|
80
|
-
});
|
|
81
|
-
hubSocket.on('disconnect', () => {
|
|
82
|
-
console.log('🔌 Disconnected from Hub');
|
|
83
|
-
});
|
|
84
|
-
hubSocket.on('connect_error', (err) => {
|
|
85
|
-
if (!options.quiet) {
|
|
86
|
-
console.log(`⚠️ Hub connection failed: ${err.message}`);
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
catch {
|
|
91
|
-
console.log('⚠️ Could not connect to Hub');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Track recently changed files for debouncing
|
|
95
|
-
const pendingFiles = new Set();
|
|
96
|
-
let debounceTimer = null;
|
|
97
|
-
// Process accumulated file changes
|
|
98
|
-
async function processChanges() {
|
|
99
|
-
if (pendingFiles.size === 0)
|
|
100
|
-
return;
|
|
101
|
-
const files = Array.from(pendingFiles);
|
|
102
|
-
pendingFiles.clear();
|
|
103
|
-
// Register files
|
|
104
|
-
const existing = await storage.get(branch);
|
|
105
|
-
const allFiles = existing
|
|
106
|
-
? [...new Set([...existing.files, ...files])]
|
|
107
|
-
: files;
|
|
108
|
-
if (existing) {
|
|
109
|
-
await storage.update(branch, { files: allFiles, agent });
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
await storage.register({
|
|
113
|
-
name: branch,
|
|
114
|
-
files: allFiles,
|
|
115
|
-
status: 'active',
|
|
116
|
-
agent,
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
if (!options.quiet) {
|
|
120
|
-
console.log(`📝 Registered: ${files.join(', ')}`);
|
|
121
|
-
}
|
|
122
|
-
// Check for conflicts
|
|
123
|
-
const allBranches = await storage.list();
|
|
124
|
-
const conflicts = [];
|
|
125
|
-
// Performance Optimization: Convert changed files to Set for O(1) lookup
|
|
126
|
-
const filesSet = new Set(files);
|
|
127
|
-
for (const otherBranch of allBranches) {
|
|
128
|
-
if (otherBranch.name === branch || otherBranch.status !== 'active')
|
|
129
|
-
continue;
|
|
130
|
-
const overlapping = otherBranch.files.filter(f => filesSet.has(f));
|
|
131
|
-
if (overlapping.length > 0) {
|
|
132
|
-
conflicts.push({ branch: otherBranch.name, files: overlapping });
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
if (conflicts.length > 0) {
|
|
136
|
-
console.log(`\n⚠️ CONFLICT DETECTED!`);
|
|
137
|
-
conflicts.forEach(c => {
|
|
138
|
-
console.log(` 🔴 ${c.branch}: ${c.files.join(', ')}`);
|
|
139
|
-
});
|
|
140
|
-
console.log('');
|
|
141
|
-
// Emit to Hub via socket if connected
|
|
142
|
-
if (hubSocket?.connected) {
|
|
143
|
-
hubSocket.emit('conflicts:warning', {
|
|
144
|
-
branch,
|
|
145
|
-
agent,
|
|
146
|
-
files,
|
|
147
|
-
conflicts,
|
|
148
|
-
timestamp: new Date().toISOString()
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
// Post to Hub chat if --hub-sync enabled
|
|
152
|
-
if (options.hubSync) {
|
|
153
|
-
await hub.postToChat({
|
|
154
|
-
agent: 'spidersan',
|
|
155
|
-
name: 'Spidersan',
|
|
156
|
-
message: formatConflictChatMessage(branch, conflicts),
|
|
157
|
-
glyph: '🕷️',
|
|
158
|
-
});
|
|
159
|
-
console.log('📤 Posted conflict to Hub chat');
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
// Build extended ignore patterns for smart mode
|
|
164
|
-
const smartIgnores = [
|
|
165
|
-
'**/.next/**', '**/build/**', '**/out/**', '**/coverage/**',
|
|
166
|
-
'**/.cache/**', '**/__pycache__/**', '**/target/**',
|
|
167
|
-
'**/vendor/**', '**/bower_components/**', '**/.pnpm/**',
|
|
168
|
-
'**/.idea/**', '**/.vscode/**', '**/*.swp', '**/*.swo',
|
|
169
|
-
'**/.DS_Store', '**/Thumbs.db',
|
|
170
|
-
'**/package-lock.json', '**/yarn.lock', '**/pnpm-lock.yaml',
|
|
171
|
-
'**/*.png', '**/*.jpg', '**/*.jpeg', '**/*.gif', '**/*.ico',
|
|
172
|
-
'**/*.woff', '**/*.woff2', '**/*.ttf', '**/*.pdf',
|
|
173
|
-
];
|
|
174
|
-
if (options.legacy) {
|
|
175
|
-
console.log('⚠️ Legacy mode: Using old watcher settings (more file descriptors)');
|
|
176
|
-
}
|
|
177
|
-
// Start watching
|
|
178
|
-
// SECURITY FIX: Always limit depth to prevent EMFILE errors (Sherlocksan 2026-01-02)
|
|
179
|
-
const watcher = chokidar.watch(watchTargets, {
|
|
180
|
-
ignored: !options.legacy ? [
|
|
181
|
-
...smartIgnores,
|
|
182
|
-
/(^|[/\\])\../, // dotfiles
|
|
183
|
-
'**/node_modules/**',
|
|
184
|
-
'**/dist/**',
|
|
185
|
-
'**/*.log',
|
|
186
|
-
'**/.git/**', // ALWAYS ignore .git
|
|
187
|
-
] : [
|
|
188
|
-
/(^|[/\\])\../, // dotfiles (ALWAYS ignore)
|
|
189
|
-
'**/node_modules/**',
|
|
190
|
-
'**/dist/**',
|
|
191
|
-
'**/*.log',
|
|
192
|
-
'**/.git/**', // ALWAYS ignore .git
|
|
193
|
-
],
|
|
194
|
-
persistent: true,
|
|
195
|
-
ignoreInitial: true,
|
|
196
|
-
awaitWriteFinish: {
|
|
197
|
-
stabilityThreshold: 500,
|
|
198
|
-
pollInterval: 100
|
|
199
|
-
},
|
|
200
|
-
// ALWAYS limit depth to prevent EMFILE (default: 5, legacy: 10)
|
|
201
|
-
depth: !options.legacy ? 5 : 10,
|
|
202
|
-
// Smart mode (default): use polling to reduce file descriptor usage
|
|
203
|
-
...(!options.legacy && {
|
|
204
|
-
usePolling: true,
|
|
205
|
-
interval: 1000, // Check every 1 second
|
|
206
|
-
binaryInterval: 3000,
|
|
207
|
-
})
|
|
208
|
-
});
|
|
209
|
-
watcher.on('change', (filePath) => {
|
|
210
|
-
const relativePath = path.relative(repoRoot, filePath);
|
|
211
|
-
pendingFiles.add(relativePath);
|
|
212
|
-
// Debounce: wait for more changes before processing
|
|
213
|
-
if (debounceTimer)
|
|
214
|
-
clearTimeout(debounceTimer);
|
|
215
|
-
debounceTimer = setTimeout(processChanges, DEBOUNCE_MS);
|
|
216
|
-
});
|
|
217
|
-
watcher.on('add', (filePath) => {
|
|
218
|
-
const relativePath = path.relative(repoRoot, filePath);
|
|
219
|
-
pendingFiles.add(relativePath);
|
|
220
|
-
if (debounceTimer)
|
|
221
|
-
clearTimeout(debounceTimer);
|
|
222
|
-
debounceTimer = setTimeout(processChanges, DEBOUNCE_MS);
|
|
223
|
-
});
|
|
224
|
-
watcher.on('error', (err) => {
|
|
225
|
-
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
226
|
-
console.error(`❌ Watcher error: ${errorMsg}`);
|
|
227
|
-
});
|
|
228
|
-
// Handle graceful shutdown
|
|
229
|
-
process.on('SIGINT', () => {
|
|
230
|
-
console.log('\n🕷️ Watch mode stopped.');
|
|
231
|
-
watcher.close();
|
|
232
|
-
hubSocket?.disconnect();
|
|
233
|
-
process.exit(0);
|
|
234
|
-
});
|
|
235
|
-
process.on('SIGTERM', () => {
|
|
236
|
-
watcher.close();
|
|
237
|
-
hubSocket?.disconnect();
|
|
238
|
-
process.exit(0);
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
// ── Mode 1: Treetop Observer ──────────────────────────────────────────────────
|
|
242
|
-
/**
|
|
243
|
-
* Default ecosystem repos to watch. Override with --repos flag or
|
|
244
|
-
* SPIDERSAN_REPOS env var (colon-separated paths).
|
|
245
|
-
*/
|
|
246
|
-
function getDefaultTreetopRepos() {
|
|
247
|
-
if (process.env.SPIDERSAN_REPOS) {
|
|
248
|
-
return process.env.SPIDERSAN_REPOS.split(':').map((r) => r.trim()).filter(Boolean);
|
|
249
|
-
}
|
|
250
|
-
const homeDir = process.env.HOME || homedir();
|
|
251
|
-
return [
|
|
252
|
-
`${homeDir}/Dev/Envoak`,
|
|
253
|
-
`${homeDir}/Dev/treebird-internal`,
|
|
254
|
-
`${homeDir}/Dev/spidersan`,
|
|
255
|
-
`${homeDir}/Dev/Toak`,
|
|
256
|
-
`${homeDir}/Dev/flockview`,
|
|
257
|
-
`${homeDir}/Dev/mappersan`,
|
|
258
|
-
];
|
|
259
|
-
}
|
|
260
|
-
const DEFAULT_TREETOP_REPOS = getDefaultTreetopRepos();
|
|
261
|
-
/**
|
|
262
|
-
* Run one full observer tick: SYNC → SCAN → TEND → SURFACE.
|
|
263
|
-
* Returns tier counts and idle status for adaptive sleep calculation.
|
|
264
|
-
*/
|
|
265
|
-
async function runObserverTick(repos, dryRun, broadcastedConflicts) {
|
|
266
|
-
let totalTier3 = 0;
|
|
267
|
-
let totalTier2 = 0;
|
|
268
|
-
let totalBranches = 0;
|
|
269
|
-
const tier3Alerts = [];
|
|
270
|
-
// ── STEP 1: SYNC ──────────────────────────────────────────────────────────
|
|
271
|
-
// Pull colony gradient into local registry per repo.
|
|
272
|
-
for (const repo of repos) {
|
|
273
|
-
try {
|
|
274
|
-
process.chdir(repo);
|
|
275
|
-
await syncFromColony();
|
|
276
|
-
}
|
|
277
|
-
catch {
|
|
278
|
-
// Repo not initialized or colony unreachable — continue
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
// ── STEP 2: SCAN ─────────────────────────────────────────────────────────
|
|
282
|
-
// Detect conflicts in each repo. spawnSync captures output even on exit 1.
|
|
283
|
-
for (const repo of repos) {
|
|
284
|
-
try {
|
|
285
|
-
const result = spawnSync('spidersan', ['conflicts', '--json'], {
|
|
286
|
-
cwd: repo,
|
|
287
|
-
encoding: 'utf-8',
|
|
288
|
-
timeout: 15000,
|
|
289
|
-
});
|
|
290
|
-
if (result.stdout) {
|
|
291
|
-
const data = JSON.parse(result.stdout);
|
|
292
|
-
const summary = data.summary ?? { tier3: 0, tier2: 0, tier1: 0 };
|
|
293
|
-
totalTier3 += summary.tier3 ?? 0;
|
|
294
|
-
totalTier2 += summary.tier2 ?? 0;
|
|
295
|
-
// Count active branches via conflicts (each conflict references another branch)
|
|
296
|
-
const otherBranches = new Set(data.conflicts?.map((c) => c.branch).filter(Boolean) ?? []);
|
|
297
|
-
totalBranches += otherBranches.size;
|
|
298
|
-
if ((summary.tier3 ?? 0) > 0) {
|
|
299
|
-
const files = data.conflicts
|
|
300
|
-
.filter((c) => c.tier === 3)
|
|
301
|
-
.flatMap((c) => c.files ?? [])
|
|
302
|
-
.slice(0, 3);
|
|
303
|
-
tier3Alerts.push({ repo, files });
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
catch {
|
|
308
|
-
// Repo not initialized or spidersan unavailable — skip
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
// ── STEP 3: TEND ─────────────────────────────────────────────────────────
|
|
312
|
-
// Colony GC (non-critical — always continue on failure).
|
|
313
|
-
try {
|
|
314
|
-
spawnSync('envoak', ['colony', 'gc'], { encoding: 'utf-8', timeout: 10000 });
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
/* ignore */
|
|
318
|
-
}
|
|
319
|
-
// Stale check per repo (informational — no --auto-cleanup yet).
|
|
320
|
-
for (const repo of repos) {
|
|
321
|
-
try {
|
|
322
|
-
spawnSync('spidersan', ['stale'], {
|
|
323
|
-
cwd: repo,
|
|
324
|
-
encoding: 'utf-8',
|
|
325
|
-
timeout: 10000,
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
catch {
|
|
329
|
-
/* ignore */
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
// ── STEP 4: SURFACE ───────────────────────────────────────────────────────
|
|
333
|
-
// Broadcast TIER 3 alerts (deduplicated). Clear resolved conflicts.
|
|
334
|
-
const currentKeys = new Set(tier3Alerts.map((a) => `${a.repo}:${a.files.join(',')}`));
|
|
335
|
-
for (const alert of tier3Alerts) {
|
|
336
|
-
const key = `${alert.repo}:${alert.files.join(',')}`;
|
|
337
|
-
if (!broadcastedConflicts.has(key)) {
|
|
338
|
-
broadcastedConflicts.add(key);
|
|
339
|
-
const repoName = path.basename(alert.repo);
|
|
340
|
-
const filesStr = alert.files.length > 0 ? alert.files.join(', ') : 'multiple files';
|
|
341
|
-
const message = `ssan TIER 3: conflict in ${repoName} — ${filesStr}. Halt writes on affected files.`;
|
|
342
|
-
if (dryRun) {
|
|
343
|
-
console.log(`[DRY-RUN] Would broadcast TIER 3 alert: ${message}`);
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
const r = spawnSync('envoak', ['colony', 'broadcast', '--type', 'alert', '--message', message], { encoding: 'utf-8', timeout: 10000 });
|
|
347
|
-
if (r.status === 0) {
|
|
348
|
-
console.log(`[TIER 3] Broadcast: ${message}`);
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
console.error(`[TIER 3] Broadcast failed: ${r.stderr ?? r.stdout}`);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
// Evict resolved conflicts from dedup set
|
|
357
|
-
for (const key of broadcastedConflicts) {
|
|
358
|
-
if (!currentKeys.has(key)) {
|
|
359
|
-
broadcastedConflicts.delete(key);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
const allIdle = totalTier3 === 0 && totalTier2 === 0 && totalBranches === 0;
|
|
363
|
-
// Emit treetop heartbeat (skipped in dry-run)
|
|
364
|
-
const summary = `Watching ${repos.length} repos, ${totalBranches} active branches. ` +
|
|
365
|
-
`T3:${totalTier3} T2:${totalTier2}. GC run. Stale checked.`;
|
|
366
|
-
console.log(`[TICK] ${new Date().toISOString()} — ${summary}`);
|
|
367
|
-
if (!dryRun) {
|
|
368
|
-
spawnSync('envoak', ['colony', 'signal', '--status', 'idle', '--task', 'treetop watch', '--summary', summary], { encoding: 'utf-8', timeout: 10000 });
|
|
369
|
-
}
|
|
370
|
-
return { tier3: totalTier3, tier2: totalTier2, repoCount: repos.length, branchCount: totalBranches, allIdle };
|
|
371
|
-
}
|
|
372
|
-
function resolveRepos(reposOption) {
|
|
373
|
-
if (reposOption) {
|
|
374
|
-
return reposOption.split(',').map((r) => r.trim()).filter(Boolean);
|
|
375
|
-
}
|
|
376
|
-
const envRepos = process.env['SPIDERSAN_REPOS'];
|
|
377
|
-
if (envRepos) {
|
|
378
|
-
return envRepos.split(':').map((r) => r.trim()).filter(Boolean);
|
|
379
|
-
}
|
|
380
|
-
return DEFAULT_TREETOP_REPOS;
|
|
381
|
-
}
|
|
382
|
-
function adaptiveInterval(result, baseMs) {
|
|
383
|
-
if (result.tier3 > 0)
|
|
384
|
-
return 15_000; // Stay alert
|
|
385
|
-
if (result.tier2 > 0)
|
|
386
|
-
return 30_000; // Watch closely
|
|
387
|
-
if (result.allIdle)
|
|
388
|
-
return 300_000; // Colony quiet — back off
|
|
389
|
-
return baseMs;
|
|
390
|
-
}
|
|
391
|
-
const watchTreetopCommand = new Command('treetop')
|
|
392
|
-
.description('Mode 1: treetop observer — periodic multi-repo conflict scan + colony gradient sync')
|
|
393
|
-
.option('--interval <seconds>', 'Base tick interval in seconds (default: 120)', '120')
|
|
394
|
-
.option('--repos <paths>', 'Comma-separated repo paths (overrides ecosystem defaults)')
|
|
395
|
-
.option('--dry-run', 'Run one tick and exit — no sleep, no colony writes')
|
|
396
|
-
.action(async (options) => {
|
|
397
|
-
const repos = resolveRepos(options.repos);
|
|
398
|
-
const baseMs = parseInt(options.interval, 10) * 1000;
|
|
399
|
-
const dryRun = options.dryRun ?? false;
|
|
400
|
-
console.log(`
|
|
401
|
-
🕷️ SPIDERSAN TREETOP OBSERVER (Mode 1)
|
|
402
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
403
|
-
Repos: ${repos.length} (${repos.map((r) => path.basename(r)).join(', ')})
|
|
404
|
-
Interval: ${options.interval}s base (adaptive)
|
|
405
|
-
Dry-run: ${dryRun}
|
|
406
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
407
|
-
${dryRun ? 'Running one tick then exiting.' : 'Press Ctrl+C to stop.'}
|
|
408
|
-
`);
|
|
409
|
-
const broadcastedConflicts = new Set();
|
|
410
|
-
if (dryRun) {
|
|
411
|
-
await runObserverTick(repos, true, broadcastedConflicts);
|
|
412
|
-
console.log('[DRY-RUN] Tick complete. Exiting.');
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
// Graceful shutdown
|
|
416
|
-
let running = true;
|
|
417
|
-
process.on('SIGINT', () => { running = false; console.log('\n🕷️ Treetop observer stopped.'); process.exit(0); });
|
|
418
|
-
process.on('SIGTERM', () => { running = false; process.exit(0); });
|
|
419
|
-
while (running) {
|
|
420
|
-
const result = await runObserverTick(repos, false, broadcastedConflicts);
|
|
421
|
-
const nextMs = adaptiveInterval(result, baseMs);
|
|
422
|
-
console.log(`[SLEEP] Next tick in ${nextMs / 1000}s`);
|
|
423
|
-
await new Promise((resolve) => setTimeout(resolve, nextMs));
|
|
424
|
-
}
|
|
425
|
-
});
|
|
426
|
-
// Attach Mode 1 as a subcommand of watch
|
|
427
|
-
watchCommand.addCommand(watchTreetopCommand);
|
|
428
|
-
//# sourceMappingURL=watch.js.map
|