spidersan 0.6.0 → 0.9.0
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 +42 -52
- package/README.md +238 -3
- package/dist/bin/spidersan.d.ts.map +1 -1
- package/dist/bin/spidersan.js +13 -1
- package/dist/bin/spidersan.js.map +1 -1
- package/dist/commands/abandon.d.ts.map +1 -1
- package/dist/commands/abandon.js +1 -9
- package/dist/commands/abandon.js.map +1 -1
- package/dist/commands/ai.d.ts +15 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +498 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/auto.d.ts.map +1 -1
- package/dist/commands/auto.js +2 -1
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/bot.d.ts +16 -0
- package/dist/commands/bot.d.ts.map +1 -0
- package/dist/commands/bot.js +398 -0
- package/dist/commands/bot.js.map +1 -0
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +260 -277
- package/dist/commands/conflicts.js.map +1 -1
- package/dist/commands/context.d.ts +8 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +104 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/cross-conflicts.d.ts.map +1 -1
- package/dist/commands/cross-conflicts.js +1 -41
- package/dist/commands/cross-conflicts.js.map +1 -1
- package/dist/commands/depends.d.ts.map +1 -1
- package/dist/commands/depends.js +1 -9
- package/dist/commands/depends.js.map +1 -1
- package/dist/commands/fleet-status.d.ts +14 -0
- package/dist/commands/fleet-status.d.ts.map +1 -0
- package/dist/commands/fleet-status.js +127 -0
- package/dist/commands/fleet-status.js.map +1 -0
- package/dist/commands/git-watch.d.ts +24 -0
- package/dist/commands/git-watch.d.ts.map +1 -0
- package/dist/commands/git-watch.js +84 -0
- package/dist/commands/git-watch.js.map +1 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +7 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/merge-order.d.ts.map +1 -1
- package/dist/commands/merge-order.js +18 -67
- package/dist/commands/merge-order.js.map +1 -1
- package/dist/commands/merged.d.ts.map +1 -1
- package/dist/commands/merged.js +1 -9
- package/dist/commands/merged.js.map +1 -1
- package/dist/commands/pulse.d.ts.map +1 -1
- package/dist/commands/pulse.js +134 -63
- package/dist/commands/pulse.js.map +1 -1
- package/dist/commands/queen.d.ts.map +1 -1
- package/dist/commands/queen.js +11 -7
- package/dist/commands/queen.js.map +1 -1
- package/dist/commands/ready-check.d.ts +2 -1
- package/dist/commands/ready-check.d.ts.map +1 -1
- package/dist/commands/ready-check.js +6 -30
- package/dist/commands/ready-check.js.map +1 -1
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +7 -29
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/torrent.d.ts.map +1 -1
- package/dist/commands/torrent.js +29 -18
- package/dist/commands/torrent.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +13 -34
- package/dist/commands/watch.js.map +1 -1
- package/dist/lib/ai/context-builder.d.ts +16 -0
- package/dist/lib/ai/context-builder.d.ts.map +1 -0
- package/dist/lib/ai/context-builder.js +216 -0
- package/dist/lib/ai/context-builder.js.map +1 -0
- package/dist/lib/ai/event-handler.d.ts +21 -0
- package/dist/lib/ai/event-handler.d.ts.map +1 -0
- package/dist/lib/ai/event-handler.js +98 -0
- package/dist/lib/ai/event-handler.js.map +1 -0
- package/dist/lib/ai/index.d.ts +13 -0
- package/dist/lib/ai/index.d.ts.map +1 -0
- package/dist/lib/ai/index.js +11 -0
- package/dist/lib/ai/index.js.map +1 -0
- package/dist/lib/ai/llm-client.d.ts +37 -0
- package/dist/lib/ai/llm-client.d.ts.map +1 -0
- package/dist/lib/ai/llm-client.js +225 -0
- package/dist/lib/ai/llm-client.js.map +1 -0
- package/dist/lib/ai/reasoner.d.ts +11 -0
- package/dist/lib/ai/reasoner.d.ts.map +1 -0
- package/dist/lib/ai/reasoner.js +246 -0
- package/dist/lib/ai/reasoner.js.map +1 -0
- package/dist/lib/ai/setup.d.ts +40 -0
- package/dist/lib/ai/setup.d.ts.map +1 -0
- package/dist/lib/ai/setup.js +154 -0
- package/dist/lib/ai/setup.js.map +1 -0
- package/dist/lib/ai/types.d.ts +135 -0
- package/dist/lib/ai/types.d.ts.map +1 -0
- package/dist/lib/ai/types.js +39 -0
- package/dist/lib/ai/types.js.map +1 -0
- package/dist/lib/colony-subscriber.d.ts +15 -12
- package/dist/lib/colony-subscriber.d.ts.map +1 -1
- package/dist/lib/colony-subscriber.js +146 -65
- package/dist/lib/colony-subscriber.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +18 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/conflict-analyzer.d.ts +33 -0
- package/dist/lib/conflict-analyzer.d.ts.map +1 -0
- package/dist/lib/conflict-analyzer.js +114 -0
- package/dist/lib/conflict-analyzer.js.map +1 -0
- package/dist/lib/conflict-renderer.d.ts +7 -0
- package/dist/lib/conflict-renderer.d.ts.map +1 -0
- package/dist/lib/conflict-renderer.js +162 -0
- package/dist/lib/conflict-renderer.js.map +1 -0
- package/dist/lib/conflict-tier.d.ts +20 -0
- package/dist/lib/conflict-tier.d.ts.map +1 -0
- package/dist/lib/conflict-tier.js +49 -0
- package/dist/lib/conflict-tier.js.map +1 -0
- package/dist/lib/crypto.js +1 -1
- package/dist/lib/crypto.js.map +1 -1
- package/dist/lib/git-events-subscriber.d.ts +59 -0
- package/dist/lib/git-events-subscriber.d.ts.map +1 -0
- package/dist/lib/git-events-subscriber.js +779 -0
- package/dist/lib/git-events-subscriber.js.map +1 -0
- package/dist/lib/git.d.ts +15 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +180 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/github.js +14 -9
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/graph.d.ts +23 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +134 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/hub.d.ts +31 -0
- package/dist/lib/hub.d.ts.map +1 -0
- package/dist/lib/hub.js +92 -0
- package/dist/lib/hub.js.map +1 -0
- package/dist/lib/remote-drift.d.ts +60 -0
- package/dist/lib/remote-drift.d.ts.map +1 -0
- package/dist/lib/remote-drift.js +225 -0
- package/dist/lib/remote-drift.js.map +1 -0
- package/dist/lib/salvage-analyzer.d.ts.map +1 -1
- package/dist/lib/salvage-analyzer.js +2 -3
- package/dist/lib/salvage-analyzer.js.map +1 -1
- package/dist/lib/security.d.ts +11 -0
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +24 -1
- package/dist/lib/security.js.map +1 -1
- package/dist/lib/session-logger.d.ts +54 -0
- package/dist/lib/session-logger.d.ts.map +1 -0
- package/dist/lib/session-logger.js +136 -0
- package/dist/lib/session-logger.js.map +1 -0
- package/dist/storage/adapter.d.ts +4 -0
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/branch-registry-store.d.ts +13 -0
- package/dist/storage/branch-registry-store.d.ts.map +1 -0
- package/dist/storage/branch-registry-store.js +2 -0
- package/dist/storage/branch-registry-store.js.map +1 -0
- package/dist/storage/factory.d.ts +4 -0
- package/dist/storage/factory.d.ts.map +1 -1
- package/dist/storage/factory.js +25 -9
- package/dist/storage/factory.js.map +1 -1
- package/dist/storage/git-messages.d.ts +53 -0
- package/dist/storage/git-messages.d.ts.map +1 -0
- package/dist/storage/git-messages.js +376 -0
- package/dist/storage/git-messages.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/json-branch-registry-store.d.ts +19 -0
- package/dist/storage/json-branch-registry-store.d.ts.map +1 -0
- package/dist/storage/json-branch-registry-store.js +112 -0
- package/dist/storage/json-branch-registry-store.js.map +1 -0
- package/dist/storage/local-messages.d.ts +37 -0
- package/dist/storage/local-messages.d.ts.map +1 -0
- package/dist/storage/local-messages.js +151 -0
- package/dist/storage/local-messages.js.map +1 -0
- package/dist/storage/local.d.ts +2 -6
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +13 -76
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/memory-branch-registry-store.d.ts +16 -0
- package/dist/storage/memory-branch-registry-store.d.ts.map +1 -0
- package/dist/storage/memory-branch-registry-store.js +65 -0
- package/dist/storage/memory-branch-registry-store.js.map +1 -0
- package/dist/storage/message-adapter.d.ts +86 -0
- package/dist/storage/message-adapter.d.ts.map +1 -0
- package/dist/storage/message-adapter.js +28 -0
- package/dist/storage/message-adapter.js.map +1 -0
- package/dist/storage/message-factory.d.ts +36 -0
- package/dist/storage/message-factory.d.ts.map +1 -0
- package/dist/storage/message-factory.js +99 -0
- package/dist/storage/message-factory.js.map +1 -0
- package/dist/storage/mycmail-adapter.d.ts +38 -0
- package/dist/storage/mycmail-adapter.d.ts.map +1 -0
- package/dist/storage/mycmail-adapter.js +300 -0
- package/dist/storage/mycmail-adapter.js.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts +46 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.js +322 -0
- package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -0
- package/dist/storage/supabase-registry-sync-client.d.ts +9 -0
- package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -0
- package/dist/storage/supabase-registry-sync-client.js +2 -0
- package/dist/storage/supabase-registry-sync-client.js.map +1 -0
- package/dist/storage/supabase.d.ts +8 -46
- package/dist/storage/supabase.d.ts.map +1 -1
- package/dist/storage/supabase.js +30 -342
- package/dist/storage/supabase.js.map +1 -1
- package/dist/tui/screen.d.ts.map +1 -1
- package/dist/tui/screen.js +5 -3
- package/dist/tui/screen.js.map +1 -1
- package/package.json +92 -90
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan git-watch
|
|
3
|
+
*
|
|
4
|
+
* Starts a git-change notification daemon that subscribes to spidersan_git_events
|
|
5
|
+
* via Supabase Realtime and catches up on missed events via polling.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* spidersan git-watch # daemon mode (runs until Ctrl+C)
|
|
9
|
+
* spidersan git-watch --once # catch-up only, then exit
|
|
10
|
+
* spidersan git-watch --repos ~/Dev/Envoak:~/Dev/Toak
|
|
11
|
+
* spidersan git-watch --interval 30000 # poll every 30s
|
|
12
|
+
* spidersan git-watch --json # machine-readable log output
|
|
13
|
+
*
|
|
14
|
+
* Notifications:
|
|
15
|
+
* push events → warns agent to run `spidersan pulse`
|
|
16
|
+
* branch delete → marks registry entry abandoned, archives it
|
|
17
|
+
* PR/create → logged to activity.jsonl
|
|
18
|
+
*
|
|
19
|
+
* Pending events are written to ~/.spidersan/git-events-pending.jsonl for
|
|
20
|
+
* future AI-layer (spidersan-smol) processing (P2).
|
|
21
|
+
*/
|
|
22
|
+
import { Command } from 'commander';
|
|
23
|
+
import { startGitWatch, catchUpOnce } from '../lib/git-events-subscriber.js';
|
|
24
|
+
export const gitWatchCommand = new Command('git-watch')
|
|
25
|
+
.description('Subscribe to git-change notifications from GitHub webhooks')
|
|
26
|
+
.option('--once', 'Catch up on missed events then exit (useful for cron)')
|
|
27
|
+
.option('--interval <ms>', 'Polling interval in ms for catch-up (default: 60000)', '60000')
|
|
28
|
+
.option('--repos <paths>', 'Colon-separated local repo paths to watch (default: auto-detect from ~/Dev)')
|
|
29
|
+
.option('--json', 'Machine-readable log output')
|
|
30
|
+
.option('--no-realtime', 'Disable WebSocket subscription (polling only)')
|
|
31
|
+
.option('--quiet', 'Suppress output')
|
|
32
|
+
.action(async (options) => {
|
|
33
|
+
const pollIntervalMs = parseInt(options.interval, 10);
|
|
34
|
+
const repoPaths = options.repos
|
|
35
|
+
? options.repos.split(':').map((p) => p.trim()).filter(Boolean)
|
|
36
|
+
: [];
|
|
37
|
+
const logger = options.quiet
|
|
38
|
+
? undefined
|
|
39
|
+
: options.json
|
|
40
|
+
? (msg) => console.log(JSON.stringify({ ts: new Date().toISOString(), msg }))
|
|
41
|
+
: (msg) => console.log(`[git-watch] ${msg}`);
|
|
42
|
+
try {
|
|
43
|
+
if (options.once) {
|
|
44
|
+
await catchUpOnce({ repoPaths, logger, quiet: options.quiet });
|
|
45
|
+
if (!options.quiet)
|
|
46
|
+
console.log('[git-watch] catch-up complete');
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
const handle = await startGitWatch({
|
|
50
|
+
pollIntervalMs,
|
|
51
|
+
repoPaths,
|
|
52
|
+
logger,
|
|
53
|
+
quiet: options.quiet,
|
|
54
|
+
disableRealtime: options.realtime === false,
|
|
55
|
+
});
|
|
56
|
+
if (!options.quiet) {
|
|
57
|
+
console.log('[git-watch] daemon running — Ctrl+C to stop');
|
|
58
|
+
console.log('[git-watch] pending events: ~/.spidersan/git-events-pending.jsonl');
|
|
59
|
+
}
|
|
60
|
+
// Graceful shutdown
|
|
61
|
+
const shutdown = () => {
|
|
62
|
+
if (!options.quiet)
|
|
63
|
+
console.log('\n[git-watch] stopping');
|
|
64
|
+
handle.stop();
|
|
65
|
+
process.exit(0);
|
|
66
|
+
};
|
|
67
|
+
process.on('SIGINT', shutdown);
|
|
68
|
+
process.on('SIGTERM', shutdown);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
72
|
+
if (options.json) {
|
|
73
|
+
console.error(JSON.stringify({ error: msg }));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.error(`[git-watch] error: ${msg}`);
|
|
77
|
+
if (msg.includes('SUPABASE_URL')) {
|
|
78
|
+
console.error(' Set SUPABASE_URL and SUPABASE_KEY (or COLONY_SESSION_JWT) env vars');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=git-watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-watch.js","sourceRoot":"","sources":["../../src/commands/git-watch.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export { rebaseHelperCommand } from './rebase-helper.js';
|
|
|
20
20
|
export { registrySyncCommand } from './registry-sync.js';
|
|
21
21
|
export { crossConflictsCommand } from './cross-conflicts.js';
|
|
22
22
|
export { pulseCommand } from './pulse.js';
|
|
23
|
+
export { gitWatchCommand } from './git-watch.js';
|
|
24
|
+
export { fleetStatusCommand } from './fleet-status.js';
|
|
23
25
|
export { loadEcosystemCommands, getEcosystemStatus } from './ecosystem-loader.js';
|
|
24
26
|
export { githubSyncCommand } from './github-sync.js';
|
|
25
27
|
export { syncAdvisorCommand } from './sync-advisor.js';
|
|
@@ -28,4 +30,7 @@ export { logCommand } from './log.js';
|
|
|
28
30
|
export { dailyCommand } from './daily.js';
|
|
29
31
|
export { torrentCommand } from './torrent.js';
|
|
30
32
|
export { queenCommand } from './queen.js';
|
|
33
|
+
export { botCommand } from './bot.js';
|
|
34
|
+
export { contextCommand } from './context.js';
|
|
35
|
+
export { askCommand, adviseCommand, explainCommand, aiPingCommand, aiSetupCommand, aiTelemetryCommand, checkOptOutCommand } from './ai.js';
|
|
31
36
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -20,6 +20,8 @@ export { rebaseHelperCommand } from './rebase-helper.js';
|
|
|
20
20
|
export { registrySyncCommand } from './registry-sync.js';
|
|
21
21
|
export { crossConflictsCommand } from './cross-conflicts.js';
|
|
22
22
|
export { pulseCommand } from './pulse.js';
|
|
23
|
+
export { gitWatchCommand } from './git-watch.js';
|
|
24
|
+
export { fleetStatusCommand } from './fleet-status.js';
|
|
23
25
|
export { loadEcosystemCommands, getEcosystemStatus } from './ecosystem-loader.js';
|
|
24
26
|
// F2/F4: GitHub inventory and sync advisor
|
|
25
27
|
export { githubSyncCommand } from './github-sync.js';
|
|
@@ -34,4 +36,9 @@ export { dailyCommand } from './daily.js';
|
|
|
34
36
|
export { torrentCommand } from './torrent.js';
|
|
35
37
|
// Mode 3: Queen Spider
|
|
36
38
|
export { queenCommand } from './queen.js';
|
|
39
|
+
// Bot: message-driven git ops via smalltoak
|
|
40
|
+
export { botCommand } from './bot.js';
|
|
41
|
+
// AI Core: Context, Ask, Advise, Explain
|
|
42
|
+
export { contextCommand } from './context.js';
|
|
43
|
+
export { askCommand, adviseCommand, explainCommand, aiPingCommand, aiSetupCommand, aiTelemetryCommand, checkOptOutCommand } from './ai.js';
|
|
37
44
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAElF,2CAA2C;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,uBAAuB;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,4CAA4C;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,yCAAyC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-order.d.ts","sourceRoot":"","sources":["../../src/commands/merge-order.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"merge-order.d.ts","sourceRoot":"","sources":["../../src/commands/merge-order.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,iBAAiB,SA2FxB,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { Command } from 'commander';
|
|
8
8
|
import { getStorage } from '../storage/index.js';
|
|
9
|
+
import { buildConflictGraph, calculateBlockingCounts, topologicalSort } from '../lib/graph.js';
|
|
9
10
|
export const mergeOrderCommand = new Command('merge-order')
|
|
10
11
|
.description('Get optimal merge order for all branches')
|
|
11
12
|
.option('--json', 'Output as JSON')
|
|
@@ -21,19 +22,21 @@ export const mergeOrderCommand = new Command('merge-order')
|
|
|
21
22
|
console.log('🕷️ No branches registered.');
|
|
22
23
|
return;
|
|
23
24
|
}
|
|
25
|
+
const branchNames = branches.map(branch => branch.name);
|
|
26
|
+
const branchByName = new Map(branches.map(branch => [branch.name, branch]));
|
|
24
27
|
// Build conflict graph
|
|
25
28
|
const conflictGraph = buildConflictGraph(branches);
|
|
26
29
|
// Calculate blocking counts (how many branches are blocked by each branch)
|
|
27
30
|
const blockingCounts = options.blockingCount
|
|
28
|
-
? calculateBlockingCounts(
|
|
29
|
-
:
|
|
31
|
+
? calculateBlockingCounts(branchNames, conflictGraph)
|
|
32
|
+
: undefined;
|
|
30
33
|
// Topological sort with conflict awareness (optionally prioritize by blocking count)
|
|
31
|
-
const order = topologicalSort(
|
|
34
|
+
const order = topologicalSort(branchNames, conflictGraph, blockingCounts);
|
|
32
35
|
if (options.json) {
|
|
33
|
-
const result = order.map(
|
|
34
|
-
name
|
|
35
|
-
blocksCount: blockingCounts
|
|
36
|
-
conflicts: conflictGraph.get(
|
|
36
|
+
const result = order.map(name => ({
|
|
37
|
+
name,
|
|
38
|
+
blocksCount: blockingCounts?.get(name) || 0,
|
|
39
|
+
conflicts: conflictGraph.get(name) || []
|
|
37
40
|
}));
|
|
38
41
|
console.log(JSON.stringify({ order: result }, null, 2));
|
|
39
42
|
return;
|
|
@@ -45,9 +48,13 @@ export const mergeOrderCommand = new Command('merge-order')
|
|
|
45
48
|
else {
|
|
46
49
|
console.log('🕷️ Recommended Merge Order:\n');
|
|
47
50
|
}
|
|
48
|
-
order.forEach((
|
|
51
|
+
order.forEach((branchName, i) => {
|
|
52
|
+
const branch = branchByName.get(branchName);
|
|
53
|
+
if (!branch) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
49
56
|
const conflicts = conflictGraph.get(branch.name) || [];
|
|
50
|
-
const blocksCount = blockingCounts
|
|
57
|
+
const blocksCount = blockingCounts?.get(branch.name) || 0;
|
|
51
58
|
// Status indicator
|
|
52
59
|
let status = '✅';
|
|
53
60
|
let priorityTag = '';
|
|
@@ -68,7 +75,7 @@ export const mergeOrderCommand = new Command('merge-order')
|
|
|
68
75
|
}
|
|
69
76
|
else if (options.blockingCount && blocksCount > 0) {
|
|
70
77
|
// Show which branches this one blocks
|
|
71
|
-
const blockedBranches = getBlockedBranches(branch.name,
|
|
78
|
+
const blockedBranches = getBlockedBranches(branch.name, conflictGraph);
|
|
72
79
|
if (blockedBranches.length > 0) {
|
|
73
80
|
console.log(` └─ Blocks: ${blockedBranches.join(', ')}`);
|
|
74
81
|
}
|
|
@@ -79,66 +86,10 @@ export const mergeOrderCommand = new Command('merge-order')
|
|
|
79
86
|
console.log('💡 Merge high-priority (🔴) branches first to unblock others.');
|
|
80
87
|
}
|
|
81
88
|
});
|
|
82
|
-
function buildConflictGraph(branches) {
|
|
83
|
-
const graph = new Map();
|
|
84
|
-
// Performance Optimization: Pre-compute sets of files for O(1) lookups
|
|
85
|
-
// Reduces nested loop complexity from O(N^2 * M * K) to O(N^2 * M)
|
|
86
|
-
const fileSets = new Map();
|
|
87
|
-
for (const branch of branches) {
|
|
88
|
-
fileSets.set(branch.name, new Set(branch.files));
|
|
89
|
-
}
|
|
90
|
-
for (const branch of branches) {
|
|
91
|
-
const conflicts = [];
|
|
92
|
-
for (const other of branches) {
|
|
93
|
-
if (branch.name === other.name)
|
|
94
|
-
continue;
|
|
95
|
-
const otherFilesSet = fileSets.get(other.name);
|
|
96
|
-
const overlap = branch.files.some(f => otherFilesSet.has(f));
|
|
97
|
-
if (overlap) {
|
|
98
|
-
conflicts.push(other.name);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
graph.set(branch.name, conflicts);
|
|
102
|
-
}
|
|
103
|
-
return graph;
|
|
104
|
-
}
|
|
105
|
-
function topologicalSort(branches, conflicts, blockingCounts, useBlockingOrder) {
|
|
106
|
-
return [...branches].sort((a, b) => {
|
|
107
|
-
// If using blocking-count mode, sort by most blocking first (rarest-first)
|
|
108
|
-
if (useBlockingOrder) {
|
|
109
|
-
const blocksA = blockingCounts.get(a.name) || 0;
|
|
110
|
-
const blocksB = blockingCounts.get(b.name) || 0;
|
|
111
|
-
if (blocksA !== blocksB) {
|
|
112
|
-
return blocksB - blocksA; // Most blocking first
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// Default: fewest conflicts first
|
|
116
|
-
const conflictsA = conflicts.get(a.name)?.length || 0;
|
|
117
|
-
const conflictsB = conflicts.get(b.name)?.length || 0;
|
|
118
|
-
if (conflictsA !== conflictsB) {
|
|
119
|
-
return conflictsA - conflictsB;
|
|
120
|
-
}
|
|
121
|
-
// Oldest first (FIFO)
|
|
122
|
-
return new Date(a.registeredAt).getTime() - new Date(b.registeredAt).getTime();
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Calculate how many branches each branch blocks.
|
|
127
|
-
* A branch "blocks" another if they share files (conflict).
|
|
128
|
-
*/
|
|
129
|
-
function calculateBlockingCounts(branches, conflictGraph) {
|
|
130
|
-
const counts = new Map();
|
|
131
|
-
for (const branch of branches) {
|
|
132
|
-
// Count how many branches conflict with this one (= are blocked by it)
|
|
133
|
-
const conflictingBranches = conflictGraph.get(branch.name) || [];
|
|
134
|
-
counts.set(branch.name, conflictingBranches.length);
|
|
135
|
-
}
|
|
136
|
-
return counts;
|
|
137
|
-
}
|
|
138
89
|
/**
|
|
139
90
|
* Get list of branch names that are blocked by a given branch.
|
|
140
91
|
*/
|
|
141
|
-
function getBlockedBranches(branchName,
|
|
92
|
+
function getBlockedBranches(branchName, conflictGraph) {
|
|
142
93
|
// Return the branches that this branch conflicts with
|
|
143
94
|
return conflictGraph.get(branchName) || [];
|
|
144
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-order.js","sourceRoot":"","sources":["../../src/commands/merge-order.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"merge-order.js","sourceRoot":"","sources":["../../src/commands/merge-order.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merged.d.ts","sourceRoot":"","sources":["../../src/commands/merged.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"merged.d.ts","sourceRoot":"","sources":["../../src/commands/merged.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SA2BpB,CAAC"}
|
package/dist/commands/merged.js
CHANGED
|
@@ -4,17 +4,9 @@
|
|
|
4
4
|
* Mark a branch as merged.
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
7
|
-
import { execFileSync } from 'child_process';
|
|
8
7
|
import { getStorage } from '../storage/index.js';
|
|
9
8
|
import { logActivity } from '../lib/activity.js';
|
|
10
|
-
|
|
11
|
-
try {
|
|
12
|
-
return execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' }).trim();
|
|
13
|
-
}
|
|
14
|
-
catch {
|
|
15
|
-
throw new Error('Not in a git repository');
|
|
16
|
-
}
|
|
17
|
-
}
|
|
9
|
+
import { getCurrentBranch } from '../lib/git.js';
|
|
18
10
|
export const mergedCommand = new Command('merged')
|
|
19
11
|
.description('Mark a branch as merged')
|
|
20
12
|
.argument('[branch]', 'Branch that was merged (default: current)')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merged.js","sourceRoot":"","sources":["../../src/commands/merged.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"merged.js","sourceRoot":"","sources":["../../src/commands/merged.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC7C,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,UAAU,EAAE,2CAA2C,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,OAAO,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,IAAI,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,IAAI,gBAAgB,EAAE,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,aAAa,UAAU,0BAA0B,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1D,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE1H,OAAO,CAAC,GAAG,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../../src/commands/pulse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../../src/commands/pulse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,eAAO,MAAM,YAAY,SA2LnB,CAAC"}
|
package/dist/commands/pulse.js
CHANGED
|
@@ -10,53 +10,16 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { Command } from 'commander';
|
|
12
12
|
import { compilePatterns } from '../lib/regex-utils.js';
|
|
13
|
-
import { execFileSync } from 'child_process';
|
|
14
13
|
import { getStorage } from '../storage/index.js';
|
|
15
14
|
import { syncFromColony } from '../lib/colony-subscriber.js';
|
|
16
15
|
import { loadConfig } from '../lib/config.js';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
/password/i,
|
|
23
|
-
/api[_-]?key/i,
|
|
24
|
-
/private[_-]?key/i,
|
|
25
|
-
/\.pem$/,
|
|
26
|
-
/auth\.(ts|js)$/,
|
|
27
|
-
/security\.(ts|js)$/,
|
|
28
|
-
];
|
|
29
|
-
// Important files — TIER 2 pause
|
|
30
|
-
const TIER_2_PATTERNS = [
|
|
31
|
-
/package\.json$/,
|
|
32
|
-
/package-lock\.json$/,
|
|
33
|
-
/tsconfig\.json$/,
|
|
34
|
-
/CLAUDE\.md$/,
|
|
35
|
-
/\.gitignore$/,
|
|
36
|
-
/server\.(ts|js)$/,
|
|
37
|
-
/index\.(ts|js)$/,
|
|
38
|
-
/config\.(ts|js)$/,
|
|
39
|
-
];
|
|
40
|
-
const COMPILED_TIER_3 = compilePatterns(TIER_3_PATTERNS);
|
|
41
|
-
const COMPILED_TIER_2 = compilePatterns(TIER_2_PATTERNS);
|
|
42
|
-
function classifyTier(file, compiledHigh = [], compiledMedium = []) {
|
|
43
|
-
const tier3 = [...COMPILED_TIER_3, ...compiledHigh];
|
|
44
|
-
for (const p of tier3) {
|
|
45
|
-
if (p.test(file))
|
|
46
|
-
return 3;
|
|
47
|
-
}
|
|
48
|
-
const tier2 = [...COMPILED_TIER_2, ...compiledMedium];
|
|
49
|
-
for (const p of tier2) {
|
|
50
|
-
if (p.test(file))
|
|
51
|
-
return 2;
|
|
52
|
-
}
|
|
53
|
-
return 1;
|
|
54
|
-
}
|
|
55
|
-
function getCurrentBranch() {
|
|
16
|
+
import { classifyTier } from '../lib/conflict-tier.js';
|
|
17
|
+
import { getCurrentBranch } from '../lib/git.js';
|
|
18
|
+
import { createHubClient } from '../lib/hub.js';
|
|
19
|
+
import { computeDriftResult } from '../lib/remote-drift.js';
|
|
20
|
+
function resolveCurrentBranch() {
|
|
56
21
|
try {
|
|
57
|
-
return
|
|
58
|
-
encoding: 'utf-8',
|
|
59
|
-
}).trim();
|
|
22
|
+
return getCurrentBranch();
|
|
60
23
|
}
|
|
61
24
|
catch {
|
|
62
25
|
return 'unknown';
|
|
@@ -66,6 +29,9 @@ export const pulseCommand = new Command('pulse')
|
|
|
66
29
|
.description('Sync from Colony then show active conflicts (quick health-check)')
|
|
67
30
|
.option('--json', 'Output as JSON')
|
|
68
31
|
.option('--no-sync', 'Skip Colony sync, use local registry only')
|
|
32
|
+
.option('--remote-drift', 'Check if remote has advanced past local HEAD')
|
|
33
|
+
.option('--hub-sync', 'Post drift alert to Hub if registered or unstaged files are in drift zone')
|
|
34
|
+
.option('--strict', 'Exit 1 if any registered or unstaged files are in the drift zone')
|
|
69
35
|
.action(async (options) => {
|
|
70
36
|
const storage = await getStorage();
|
|
71
37
|
if (!await storage.isInitialized()) {
|
|
@@ -89,12 +55,17 @@ export const pulseCommand = new Command('pulse')
|
|
|
89
55
|
console.log('ℹ Colony sync skipped (--no-sync)');
|
|
90
56
|
}
|
|
91
57
|
// ── Local conflict detection ──────────────────────────────────────────
|
|
92
|
-
const currentBranch =
|
|
58
|
+
const currentBranch = resolveCurrentBranch();
|
|
93
59
|
const allBranches = await storage.list();
|
|
94
60
|
const target = allBranches.find(b => b.name === currentBranch);
|
|
95
61
|
if (!target) {
|
|
96
62
|
if (options.json) {
|
|
97
|
-
|
|
63
|
+
const jsonOut = { branch: currentBranch, registered: false, conflicts: [], colonySynced, colonyOffline };
|
|
64
|
+
if (options.remoteDrift) {
|
|
65
|
+
const drift = await computeDriftResult([], { remote: 'origin', branch: currentBranch });
|
|
66
|
+
jsonOut.remoteDrift = 'skipped' in drift ? { skipped: true, reason: drift.reason } : drift;
|
|
67
|
+
}
|
|
68
|
+
console.log(JSON.stringify(jsonOut));
|
|
98
69
|
}
|
|
99
70
|
else {
|
|
100
71
|
console.log(`🕷️ Branch "${currentBranch}" is not registered.`);
|
|
@@ -102,6 +73,16 @@ export const pulseCommand = new Command('pulse')
|
|
|
102
73
|
if (!colonyOffline) {
|
|
103
74
|
console.log(` Colony: synced ${colonySynced} claim(s)`);
|
|
104
75
|
}
|
|
76
|
+
if (options.remoteDrift) {
|
|
77
|
+
console.log('');
|
|
78
|
+
const drift = await computeDriftResult([], { remote: 'origin', branch: currentBranch });
|
|
79
|
+
if ('skipped' in drift) {
|
|
80
|
+
console.log(`⚠ Remote drift check skipped: ${drift.reason}`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
printDriftReport(drift);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
105
86
|
}
|
|
106
87
|
return;
|
|
107
88
|
}
|
|
@@ -116,7 +97,10 @@ export const pulseCommand = new Command('pulse')
|
|
|
116
97
|
// Determine max tier for this conflict group
|
|
117
98
|
let maxTier = 1;
|
|
118
99
|
for (const file of overlapping) {
|
|
119
|
-
const tier = classifyTier(file,
|
|
100
|
+
const tier = classifyTier(file, {
|
|
101
|
+
extraTier3: compiledHigh,
|
|
102
|
+
extraTier2: compiledMedium,
|
|
103
|
+
});
|
|
120
104
|
if (tier > maxTier)
|
|
121
105
|
maxTier = tier;
|
|
122
106
|
}
|
|
@@ -129,13 +113,23 @@ export const pulseCommand = new Command('pulse')
|
|
|
129
113
|
}
|
|
130
114
|
conflicts.sort((a, b) => b.tier - a.tier);
|
|
131
115
|
if (options.json) {
|
|
132
|
-
|
|
116
|
+
const jsonOutput = {
|
|
133
117
|
branch: currentBranch,
|
|
134
118
|
registered: true,
|
|
135
119
|
conflicts,
|
|
136
120
|
colonySynced,
|
|
137
121
|
colonyOffline,
|
|
138
|
-
}
|
|
122
|
+
};
|
|
123
|
+
if (options.remoteDrift) {
|
|
124
|
+
const drift = await computeDriftResult(target?.files ?? [], { remote: 'origin', branch: currentBranch });
|
|
125
|
+
if ('skipped' in drift) {
|
|
126
|
+
jsonOutput.remoteDrift = { skipped: true, reason: drift.reason };
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
jsonOutput.remoteDrift = drift;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
139
133
|
return;
|
|
140
134
|
}
|
|
141
135
|
// ── Human-readable output ─────────────────────────────────────────────
|
|
@@ -151,24 +145,101 @@ Branches: ${allBranches.filter(b => b.status === 'active').length} active
|
|
|
151
145
|
console.log('');
|
|
152
146
|
if (conflicts.length === 0) {
|
|
153
147
|
console.log('✅ No conflicts detected. You\'re good to go!');
|
|
154
|
-
return;
|
|
155
148
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
149
|
+
else {
|
|
150
|
+
const tierIcons = { 1: '🟡', 2: '🟠', 3: '🔴' };
|
|
151
|
+
const tierLabels = { 1: 'WARN', 2: 'PAUSE', 3: 'BLOCK' };
|
|
152
|
+
for (const c of conflicts) {
|
|
153
|
+
const icon = tierIcons[c.tier] ?? '🟡';
|
|
154
|
+
const label = tierLabels[c.tier] ?? 'WARN';
|
|
155
|
+
const agentTag = c.agent ? ` [@${c.agent}]` : '';
|
|
156
|
+
console.log(`${icon} TIER ${c.tier} ${label}: ${c.branch}${agentTag}`);
|
|
157
|
+
for (const f of c.files) {
|
|
158
|
+
console.log(` • ${f}`);
|
|
159
|
+
}
|
|
160
|
+
console.log('');
|
|
165
161
|
}
|
|
162
|
+
const t3 = conflicts.filter(c => c.tier === 3).length;
|
|
163
|
+
const t2 = conflicts.filter(c => c.tier === 2).length;
|
|
164
|
+
const t1 = conflicts.filter(c => c.tier === 1).length;
|
|
165
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
166
|
+
console.log(`📊 Summary: 🔴 ${t3} BLOCK | 🟠 ${t2} PAUSE | 🟡 ${t1} WARN`);
|
|
167
|
+
}
|
|
168
|
+
// ── Remote drift section ──────────────────────────────────────────────
|
|
169
|
+
if (options.remoteDrift) {
|
|
166
170
|
console.log('');
|
|
171
|
+
const drift = await computeDriftResult(target?.files ?? [], { remote: 'origin', branch: currentBranch });
|
|
172
|
+
if ('skipped' in drift) {
|
|
173
|
+
console.log(`⚠ Remote drift check skipped: ${drift.reason}`);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
printDriftReport(drift);
|
|
177
|
+
if (options.hubSync) {
|
|
178
|
+
const hasRisk = drift.registeredInDrift.length > 0 || drift.unstagedInDrift.length > 0;
|
|
179
|
+
if (hasRisk) {
|
|
180
|
+
const hub = createHubClient();
|
|
181
|
+
const lines = [
|
|
182
|
+
`🕷️⚠️ Remote drift detected on \`${drift.branch}\``,
|
|
183
|
+
` ${drift.remoteAhead} commit(s) ahead | ${drift.registeredInDrift.length} registered file(s) at risk | ${drift.unstagedInDrift.length} rebase-continue blocker(s)`,
|
|
184
|
+
...drift.registeredInDrift.map(e => ` ${tierIcon(e.tier)} ${e.file}${e.unstaged ? ' [also has unstaged modifications]' : ''}`),
|
|
185
|
+
];
|
|
186
|
+
await hub.postToChat({ agent: 'spidersan', name: 'Spidersan', message: lines.join('\n'), glyph: '🕷️' }).catch(() => { });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (options.strict && (drift.registeredInDrift.length > 0 || drift.unstagedInDrift.length > 0)) {
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
167
193
|
}
|
|
168
|
-
const t3 = conflicts.filter(c => c.tier === 3).length;
|
|
169
|
-
const t2 = conflicts.filter(c => c.tier === 2).length;
|
|
170
|
-
const t1 = conflicts.filter(c => c.tier === 1).length;
|
|
171
|
-
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
172
|
-
console.log(`📊 Summary: 🔴 ${t3} BLOCK | 🟠 ${t2} PAUSE | 🟡 ${t1} WARN`);
|
|
173
194
|
});
|
|
195
|
+
function tierIcon(tier) {
|
|
196
|
+
if (tier === 3)
|
|
197
|
+
return '🔴';
|
|
198
|
+
if (tier === 2)
|
|
199
|
+
return '🟠';
|
|
200
|
+
if (tier === 1)
|
|
201
|
+
return '🟡';
|
|
202
|
+
return '⚪';
|
|
203
|
+
}
|
|
204
|
+
function printDriftReport(drift) {
|
|
205
|
+
if (drift.state === 'synced' || drift.remoteAhead === 0) {
|
|
206
|
+
console.log('✅ Remote drift: 0 commits ahead. Safe to push.');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const tierLabels = { 1: 'TIER 1', 2: 'TIER 2', 3: 'TIER 3' };
|
|
210
|
+
console.log(`🕷️ REMOTE DRIFT — "${drift.branch}"`);
|
|
211
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
212
|
+
console.log(`Remote is ${drift.remoteAhead} commit(s) ahead of local.`);
|
|
213
|
+
console.log('');
|
|
214
|
+
console.log('Drift zone (files touched by remote commits):');
|
|
215
|
+
for (const entry of drift.driftZone.map(file => {
|
|
216
|
+
const found = [...drift.registeredInDrift, ...drift.unstagedInDrift].find(e => e.file === file);
|
|
217
|
+
return found ?? { file, registered: false, tier: null, unstaged: false };
|
|
218
|
+
})) {
|
|
219
|
+
const parts = [];
|
|
220
|
+
if (entry.registered && entry.tier !== null) {
|
|
221
|
+
parts.push(`registered — ${tierIcon(entry.tier)} ${tierLabels[entry.tier]}`);
|
|
222
|
+
}
|
|
223
|
+
if (entry.unstaged) {
|
|
224
|
+
parts.push('unstaged modification ⚠');
|
|
225
|
+
}
|
|
226
|
+
const label = parts.length > 0 ? ` [${parts.join('] [')}]` : ' [not registered, not modified]';
|
|
227
|
+
console.log(` ${entry.file}${label}`);
|
|
228
|
+
}
|
|
229
|
+
console.log('');
|
|
230
|
+
if (drift.registeredInDrift.length > 0) {
|
|
231
|
+
console.log(`⚠ ${drift.registeredInDrift.length} registered file(s) in drift zone. Rebase will conflict.`);
|
|
232
|
+
}
|
|
233
|
+
if (drift.rebaseContinueRisk) {
|
|
234
|
+
const blockers = drift.unstagedInDrift.map(e => e.file);
|
|
235
|
+
console.log('⚠ File(s) with unstaged modifications — git rebase --continue may block even');
|
|
236
|
+
console.log(' after resolving conflict markers. Fix: git checkout HEAD -- <file>');
|
|
237
|
+
for (const f of blockers) {
|
|
238
|
+
console.log(` ${f}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
console.log('');
|
|
242
|
+
console.log(` git fetch origin`);
|
|
243
|
+
console.log(` git log --oneline ${drift.remote} -3`);
|
|
244
|
+
}
|
|
174
245
|
//# sourceMappingURL=pulse.js.map
|