spidersan 0.20.1 → 0.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/bin/command-registry.d.ts +25 -0
- package/dist/bin/command-registry.d.ts.map +1 -0
- package/dist/bin/command-registry.js +29 -0
- package/dist/bin/command-registry.js.map +1 -0
- package/dist/bin/spidersan.d.ts +16 -0
- package/dist/bin/spidersan.d.ts.map +1 -0
- package/dist/bin/spidersan.js +98 -0
- package/dist/bin/spidersan.js.map +1 -0
- package/dist/commands/abandon.d.ts +8 -0
- package/dist/commands/abandon.d.ts.map +1 -0
- package/dist/commands/abandon.js +43 -0
- package/dist/commands/abandon.js.map +1 -0
- package/dist/commands/cleanup.d.ts +8 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +50 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/config.d.ts +15 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +309 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/conflicts.d.ts +34 -0
- package/dist/commands/conflicts.d.ts.map +1 -0
- package/dist/commands/conflicts.js +773 -0
- package/dist/commands/conflicts.js.map +1 -0
- 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 +17 -0
- package/dist/commands/cross-conflicts.d.ts.map +1 -0
- package/dist/commands/cross-conflicts.js +273 -0
- package/dist/commands/cross-conflicts.js.map +1 -0
- package/dist/commands/depends.d.ts +11 -0
- package/dist/commands/depends.d.ts.map +1 -0
- package/dist/commands/depends.js +63 -0
- package/dist/commands/depends.js.map +1 -0
- package/dist/commands/doctor.d.ts +30 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +558 -0
- package/dist/commands/doctor.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/github-sync.d.ts +42 -0
- package/dist/commands/github-sync.d.ts.map +1 -0
- package/dist/commands/github-sync.js +191 -0
- package/dist/commands/github-sync.js.map +1 -0
- package/dist/commands/index.d.ts +25 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +29 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +23 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +45 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/log.d.ts +7 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +110 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/merge-order.d.ts +9 -0
- package/dist/commands/merge-order.d.ts.map +1 -0
- package/dist/commands/merge-order.js +100 -0
- package/dist/commands/merge-order.js.map +1 -0
- package/dist/commands/merged.d.ts +8 -0
- package/dist/commands/merged.d.ts.map +1 -0
- package/dist/commands/merged.js +37 -0
- package/dist/commands/merged.js.map +1 -0
- package/dist/commands/pr-check.d.ts +24 -0
- package/dist/commands/pr-check.d.ts.map +1 -0
- package/dist/commands/pr-check.js +85 -0
- package/dist/commands/pr-check.js.map +1 -0
- package/dist/commands/ready-check.d.ts +11 -0
- package/dist/commands/ready-check.d.ts.map +1 -0
- package/dist/commands/ready-check.js +150 -0
- package/dist/commands/ready-check.js.map +1 -0
- package/dist/commands/rebase-helper.d.ts +3 -0
- package/dist/commands/rebase-helper.d.ts.map +1 -0
- package/dist/commands/rebase-helper.js +52 -0
- package/dist/commands/rebase-helper.js.map +1 -0
- package/dist/commands/register.d.ts +10 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +176 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/registry-sync.d.ts +9 -0
- package/dist/commands/registry-sync.d.ts.map +1 -0
- package/dist/commands/registry-sync.js +129 -0
- package/dist/commands/registry-sync.js.map +1 -0
- package/dist/commands/stale.d.ts +17 -0
- package/dist/commands/stale.d.ts.map +1 -0
- package/dist/commands/stale.js +136 -0
- package/dist/commands/stale.js.map +1 -0
- package/dist/commands/sync.d.ts +21 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +78 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/verify-trunk.d.ts +18 -0
- package/dist/commands/verify-trunk.d.ts.map +1 -0
- package/dist/commands/verify-trunk.js +77 -0
- package/dist/commands/verify-trunk.js.map +1 -0
- package/dist/commands/watch.d.ts +8 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +509 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/activity.d.ts +53 -0
- package/dist/lib/activity.d.ts.map +1 -0
- package/dist/lib/activity.js +271 -0
- package/dist/lib/activity.js.map +1 -0
- package/dist/lib/agent-errors.d.ts +41 -0
- package/dist/lib/agent-errors.d.ts.map +1 -0
- package/dist/lib/agent-errors.js +145 -0
- package/dist/lib/agent-errors.js.map +1 -0
- 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 +229 -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 +111 -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 +227 -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 +42 -0
- package/dist/lib/ai/types.js.map +1 -0
- package/dist/lib/ast.d.ts +44 -0
- package/dist/lib/ast.d.ts.map +1 -0
- package/dist/lib/ast.js +160 -0
- package/dist/lib/ast.js.map +1 -0
- package/dist/lib/carries.d.ts +22 -0
- package/dist/lib/carries.d.ts.map +1 -0
- package/dist/lib/carries.js +56 -0
- package/dist/lib/carries.js.map +1 -0
- package/dist/lib/colony-subscriber.d.ts +56 -0
- package/dist/lib/colony-subscriber.d.ts.map +1 -0
- package/dist/lib/colony-subscriber.js +265 -0
- package/dist/lib/colony-subscriber.js.map +1 -0
- package/dist/lib/config.d.ts +62 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +235 -0
- package/dist/lib/config.js.map +1 -0
- 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 +145 -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.d.ts +71 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +176 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/ecosystem-env.d.ts +33 -0
- package/dist/lib/ecosystem-env.d.ts.map +1 -0
- package/dist/lib/ecosystem-env.js +62 -0
- package/dist/lib/ecosystem-env.js.map +1 -0
- package/dist/lib/errors.d.ts +35 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +71 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/git-events-subscriber.d.ts +86 -0
- package/dist/lib/git-events-subscriber.d.ts.map +1 -0
- package/dist/lib/git-events-subscriber.js +870 -0
- package/dist/lib/git-events-subscriber.js.map +1 -0
- package/dist/lib/git-merge-analyzer.d.ts +38 -0
- package/dist/lib/git-merge-analyzer.d.ts.map +1 -0
- package/dist/lib/git-merge-analyzer.js +23 -0
- package/dist/lib/git-merge-analyzer.js.map +1 -0
- package/dist/lib/git.d.ts +103 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +670 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/github.d.ts +151 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +425 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/graph.d.ts +38 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +165 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/machine.d.ts +14 -0
- package/dist/lib/machine.d.ts.map +1 -0
- package/dist/lib/machine.js +38 -0
- package/dist/lib/machine.js.map +1 -0
- package/dist/lib/notify.d.ts +68 -0
- package/dist/lib/notify.d.ts.map +1 -0
- package/dist/lib/notify.js +111 -0
- package/dist/lib/notify.js.map +1 -0
- package/dist/lib/outline.d.ts +6 -0
- package/dist/lib/outline.d.ts.map +1 -0
- package/dist/lib/outline.js +60 -0
- package/dist/lib/outline.js.map +1 -0
- package/dist/lib/push-registry.d.ts +22 -0
- package/dist/lib/push-registry.d.ts.map +1 -0
- package/dist/lib/push-registry.js +21 -0
- package/dist/lib/push-registry.js.map +1 -0
- package/dist/lib/reconcile.d.ts +100 -0
- package/dist/lib/reconcile.d.ts.map +1 -0
- package/dist/lib/reconcile.js +121 -0
- package/dist/lib/reconcile.js.map +1 -0
- package/dist/lib/regex-utils.d.ts +6 -0
- package/dist/lib/regex-utils.d.ts.map +1 -0
- package/dist/lib/regex-utils.js +24 -0
- package/dist/lib/regex-utils.js.map +1 -0
- package/dist/lib/register-renderer.d.ts +10 -0
- package/dist/lib/register-renderer.d.ts.map +1 -0
- package/dist/lib/register-renderer.js +19 -0
- package/dist/lib/register-renderer.js.map +1 -0
- package/dist/lib/remote-drift.d.ts +61 -0
- package/dist/lib/remote-drift.d.ts.map +1 -0
- package/dist/lib/remote-drift.js +227 -0
- package/dist/lib/remote-drift.js.map +1 -0
- package/dist/lib/security.d.ts +72 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +180 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/lib/semantic-analysis.d.ts +31 -0
- package/dist/lib/semantic-analysis.d.ts.map +1 -0
- package/dist/lib/semantic-analysis.js +120 -0
- package/dist/lib/semantic-analysis.js.map +1 -0
- package/dist/lib/supabase-credentials.d.ts +36 -0
- package/dist/lib/supabase-credentials.d.ts.map +1 -0
- package/dist/lib/supabase-credentials.js +43 -0
- package/dist/lib/supabase-credentials.js.map +1 -0
- package/dist/lib/trunk.d.ts +39 -0
- package/dist/lib/trunk.d.ts.map +1 -0
- package/dist/lib/trunk.js +116 -0
- package/dist/lib/trunk.js.map +1 -0
- package/dist/lib/update-check.d.ts +11 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +113 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/watch-renderer.d.ts +13 -0
- package/dist/lib/watch-renderer.d.ts.map +1 -0
- package/dist/lib/watch-renderer.js +35 -0
- package/dist/lib/watch-renderer.js.map +1 -0
- package/dist/storage/adapter.d.ts +81 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +8 -0
- package/dist/storage/adapter.js.map +1 -0
- 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 +6 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +14 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- 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 +138 -0
- package/dist/storage/json-branch-registry-store.js.map +1 -0
- package/dist/storage/local.d.ts +20 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +40 -0
- package/dist/storage/local.js.map +1 -0
- 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 +68 -0
- package/dist/storage/memory-branch-registry-store.js.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts +40 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.js +278 -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 +28 -0
- package/dist/storage/supabase.d.ts.map +1 -0
- package/dist/storage/supabase.js +56 -0
- package/dist/storage/supabase.js.map +1 -0
- package/dist/types/cloud.d.ts +102 -0
- package/dist/types/cloud.d.ts.map +1 -0
- package/dist/types/cloud.js +13 -0
- package/dist/types/cloud.js.map +1 -0
- package/package.json +1 -1
|
@@ -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 conflicts`
|
|
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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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan github-sync
|
|
3
|
+
*
|
|
4
|
+
* Fetch branch/PR/CI status from GitHub for configured repos.
|
|
5
|
+
* Part of F2: GitHub Branch Inventory.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { type GitHubRepoConfig, type GitHubBranchInfo, type GitHubPRInfo, type AheadBehind } from '../lib/github.js';
|
|
9
|
+
import type { MachineIdentity } from '../types/cloud.js';
|
|
10
|
+
interface GitHubBranchRow {
|
|
11
|
+
id: string;
|
|
12
|
+
repo_owner: string;
|
|
13
|
+
repo_name: string;
|
|
14
|
+
branch_name: string;
|
|
15
|
+
author: string;
|
|
16
|
+
last_commit_sha: string;
|
|
17
|
+
last_commit_date: string;
|
|
18
|
+
/** null = comparison could not be determined (NOT the same as in-sync {0,0}). */
|
|
19
|
+
ahead_behind: AheadBehind | null;
|
|
20
|
+
pr_number: number | null;
|
|
21
|
+
pr_status: string | null;
|
|
22
|
+
is_default: boolean;
|
|
23
|
+
scanned_at: string;
|
|
24
|
+
scanned_by_machine: string;
|
|
25
|
+
}
|
|
26
|
+
interface ScanOptions {
|
|
27
|
+
includeCi: boolean;
|
|
28
|
+
staleDays: number;
|
|
29
|
+
machine: MachineIdentity;
|
|
30
|
+
/** Max branches scanned in parallel. Bounded to stay under gh's rate limits. */
|
|
31
|
+
concurrency?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Scan a single branch into a row, or null when it has no commit (e.g. just
|
|
35
|
+
* deleted) and should be skipped. Each call makes 1-3 independent gh calls;
|
|
36
|
+
* scanRepository runs these under a bounded pool.
|
|
37
|
+
*/
|
|
38
|
+
export declare function scanBranch(config: GitHubRepoConfig, branch: GitHubBranchInfo, prs: GitHubPRInfo[], options: ScanOptions): Promise<GitHubBranchRow | null>;
|
|
39
|
+
export declare function scanRepository(config: GitHubRepoConfig, options: ScanOptions): Promise<GitHubBranchRow[]>;
|
|
40
|
+
export declare const githubSyncCommand: Command;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=github-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-sync.d.ts","sourceRoot":"","sources":["../../src/commands/github-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,OAAO,EAOH,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,UAAU,eAAe;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAyBD,UAAU,WAAW;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,CAAC;IACzB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD;;;;GAIG;AACH,wBAAsB,UAAU,CAC5B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,YAAY,EAAE,EACnB,OAAO,EAAE,WAAW,GACrB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmCjC;AAED,wBAAsB,cAAc,CAChC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,WAAW,GACrB,OAAO,CAAC,eAAe,EAAE,CAAC,CA0B5B;AAYD,eAAO,MAAM,iBAAiB,SA0ExB,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan github-sync
|
|
3
|
+
*
|
|
4
|
+
* Fetch branch/PR/CI status from GitHub for configured repos.
|
|
5
|
+
* Part of F2: GitHub Branch Inventory.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { resolveSupabaseCredentials } from '../lib/supabase-credentials.js';
|
|
9
|
+
import { loadMachineIdentity } from '../lib/machine.js';
|
|
10
|
+
import { SupabaseStorage } from '../storage/supabase.js';
|
|
11
|
+
import { readFile } from 'fs/promises';
|
|
12
|
+
import { existsSync } from 'fs';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
import { execFileSync } from 'child_process';
|
|
15
|
+
import { isGhAvailable, listBranches, listPullRequests, getCIStatus, getCommitInfo, getAheadBehind, } from '../lib/github.js';
|
|
16
|
+
async function loadReposConfig() {
|
|
17
|
+
const configPath = join(process.cwd(), '.spidersan', 'repos.json');
|
|
18
|
+
if (!existsSync(configPath))
|
|
19
|
+
return null;
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(await readFile(configPath, 'utf-8'));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function getCurrentRepo() {
|
|
28
|
+
try {
|
|
29
|
+
const remote = execFileSync('git', ['config', 'remote.origin.url'], { encoding: 'utf-8' }).trim();
|
|
30
|
+
const sshMatch = remote.match(/git@github\.com:([^/]+)\/(.+?)(?:\.git)?$/);
|
|
31
|
+
if (sshMatch)
|
|
32
|
+
return { owner: sshMatch[1], repo: sshMatch[2] };
|
|
33
|
+
const httpsMatch = remote.match(/github\.com\/([^/]+)\/(.+?)(?:\.git)?$/);
|
|
34
|
+
if (httpsMatch)
|
|
35
|
+
return { owner: httpsMatch[1], repo: httpsMatch[2] };
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Default in-flight branch count — small enough to avoid gh secondary rate limits. */
|
|
43
|
+
const DEFAULT_SCAN_CONCURRENCY = 6;
|
|
44
|
+
const TRUNK_BRANCHES = new Set(['main', 'master', 'develop', 'production']);
|
|
45
|
+
/**
|
|
46
|
+
* Scan a single branch into a row, or null when it has no commit (e.g. just
|
|
47
|
+
* deleted) and should be skipped. Each call makes 1-3 independent gh calls;
|
|
48
|
+
* scanRepository runs these under a bounded pool.
|
|
49
|
+
*/
|
|
50
|
+
export async function scanBranch(config, branch, prs, options) {
|
|
51
|
+
const commit = await getCommitInfo(config, branch.name);
|
|
52
|
+
if (!commit)
|
|
53
|
+
return null;
|
|
54
|
+
const pr = prs.find(p => p.headBranch === branch.name);
|
|
55
|
+
// CI status is fetched when requested but not yet persisted (Supabase table
|
|
56
|
+
// pending). Kept for behaviour parity with the previous serial scan.
|
|
57
|
+
if (options.includeCi)
|
|
58
|
+
void (await getCIStatus(config, branch.name));
|
|
59
|
+
const row = {
|
|
60
|
+
id: '',
|
|
61
|
+
repo_owner: config.owner,
|
|
62
|
+
repo_name: config.repo,
|
|
63
|
+
branch_name: branch.name,
|
|
64
|
+
author: commit.author,
|
|
65
|
+
last_commit_sha: commit.sha,
|
|
66
|
+
last_commit_date: commit.date,
|
|
67
|
+
ahead_behind: null,
|
|
68
|
+
pr_number: pr?.number || null,
|
|
69
|
+
pr_status: pr?.state || null,
|
|
70
|
+
is_default: false,
|
|
71
|
+
scanned_at: new Date().toISOString(),
|
|
72
|
+
scanned_by_machine: options.machine.id,
|
|
73
|
+
};
|
|
74
|
+
const aheadBehind = await getAheadBehind(config, branch.name);
|
|
75
|
+
if (aheadBehind) {
|
|
76
|
+
row.ahead_behind = aheadBehind;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Comparison failed (rate-limit / auth / network). Leave it null rather
|
|
80
|
+
// than recording {0,0}, which would mislabel a diverged branch as in-sync.
|
|
81
|
+
console.warn(` ⚠️ ${branch.name}: could not determine ahead/behind (left as unknown)`);
|
|
82
|
+
}
|
|
83
|
+
return row;
|
|
84
|
+
}
|
|
85
|
+
export async function scanRepository(config, options) {
|
|
86
|
+
console.log(` 📡 Scanning ${config.owner}/${config.repo}...`);
|
|
87
|
+
const branches = await listBranches(config);
|
|
88
|
+
const prs = await listPullRequests(config);
|
|
89
|
+
const targets = branches.filter(b => !TRUNK_BRANCHES.has(b.name));
|
|
90
|
+
if (targets.length === 0)
|
|
91
|
+
return [];
|
|
92
|
+
// Per-branch gh calls are independent, so scan with a bounded worker pool
|
|
93
|
+
// (mirrors gatherFacts in merge-plan.ts). Bounded, NOT unbounded: a burst of
|
|
94
|
+
// parallel `gh` spawns trips GitHub's secondary rate limits. Order is
|
|
95
|
+
// preserved by writing each result into its input slot.
|
|
96
|
+
const concurrency = Math.max(1, Math.min(options.concurrency ?? DEFAULT_SCAN_CONCURRENCY, targets.length));
|
|
97
|
+
const slots = new Array(targets.length).fill(null);
|
|
98
|
+
let cursor = 0;
|
|
99
|
+
async function worker() {
|
|
100
|
+
while (cursor < targets.length) {
|
|
101
|
+
const i = cursor++;
|
|
102
|
+
slots[i] = await scanBranch(config, targets[i], prs, options);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
await Promise.all(Array.from({ length: concurrency }, () => worker()));
|
|
106
|
+
return slots.filter((r) => r !== null);
|
|
107
|
+
}
|
|
108
|
+
async function storeResults(_results, _supabase) {
|
|
109
|
+
try {
|
|
110
|
+
console.warn(` ⚠️ Supabase storage does not support GitHub branch sync yet`);
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.warn(` ⚠️ Could not write to Supabase: ${error instanceof Error ? error.message : String(error)}`);
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export const githubSyncCommand = new Command('github-sync')
|
|
119
|
+
.description('Fetch branch/PR/CI status from GitHub for configured repos')
|
|
120
|
+
.option('--repo <owner/repo>', 'Sync specific repo (auto-detects from git remote if not provided)')
|
|
121
|
+
.option('--all', 'Sync all repos from .spidersan/repos.json')
|
|
122
|
+
.option('--ci', 'Include CI/Actions status (slower)')
|
|
123
|
+
.option('--json', 'Output as JSON')
|
|
124
|
+
.option('--stale-days <n>', 'Mark branches older than N days as stale', '7')
|
|
125
|
+
.option('--concurrency <n>', 'Max branches scanned in parallel (lower if rate-limited)', String(DEFAULT_SCAN_CONCURRENCY))
|
|
126
|
+
.action(async (options) => {
|
|
127
|
+
if (!isGhAvailable()) {
|
|
128
|
+
console.error('❌ GitHub CLI (gh) not found or not authenticated.');
|
|
129
|
+
console.error(' Install: https://cli.github.com → gh auth login');
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const machine = await loadMachineIdentity();
|
|
133
|
+
const creds = await resolveSupabaseCredentials();
|
|
134
|
+
const supabase = creds ? new SupabaseStorage(creds) : null;
|
|
135
|
+
let reposToScan;
|
|
136
|
+
if (options.all) {
|
|
137
|
+
const reposConfig = await loadReposConfig();
|
|
138
|
+
if (!reposConfig) {
|
|
139
|
+
console.error('❌ No .spidersan/repos.json found.');
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
reposToScan = reposConfig.repos.map(r => ({ owner: r.owner, repo: r.name }));
|
|
143
|
+
}
|
|
144
|
+
else if (options.repo) {
|
|
145
|
+
const [owner, repo] = options.repo.split('/');
|
|
146
|
+
reposToScan = [{ owner, repo }];
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const current = await getCurrentRepo();
|
|
150
|
+
if (!current) {
|
|
151
|
+
console.error('❌ Could not detect current repo. Use --repo owner/repo');
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
reposToScan = [current];
|
|
155
|
+
}
|
|
156
|
+
console.log(`🕷️ GitHub sync: scanning ${reposToScan.length} repo(s)\n`);
|
|
157
|
+
const allResults = [];
|
|
158
|
+
let storedCount = 0;
|
|
159
|
+
for (const repo of reposToScan) {
|
|
160
|
+
try {
|
|
161
|
+
const parsedConcurrency = parseInt(options.concurrency, 10);
|
|
162
|
+
const results = await scanRepository(repo, {
|
|
163
|
+
includeCi: options.ci,
|
|
164
|
+
staleDays: parseInt(options.staleDays, 10),
|
|
165
|
+
machine,
|
|
166
|
+
concurrency: Number.isFinite(parsedConcurrency) ? parsedConcurrency : undefined,
|
|
167
|
+
});
|
|
168
|
+
console.log(` ✅ Found ${results.length} branches`);
|
|
169
|
+
allResults.push(...results);
|
|
170
|
+
if (supabase && results.length > 0) {
|
|
171
|
+
storedCount += await storeResults(results, supabase);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error(` ❌ ${error instanceof Error ? error.message : String(error)}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (options.json) {
|
|
179
|
+
console.log(JSON.stringify(allResults, null, 2));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(`\n 📊 Total branches: ${allResults.length}`);
|
|
183
|
+
if (supabase && storedCount > 0) {
|
|
184
|
+
console.log(` 💾 Stored in Supabase: ${storedCount}`);
|
|
185
|
+
}
|
|
186
|
+
else if (!supabase) {
|
|
187
|
+
console.log(` ℹ️ Supabase not configured or table missing (results shown above only)`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=github-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-sync.js","sourceRoot":"","sources":["../../src/commands/github-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { initCommand } from './init.js';
|
|
2
|
+
export { registerCommand } from './register.js';
|
|
3
|
+
export { listCommand } from './list.js';
|
|
4
|
+
export { conflictsCommand } from './conflicts.js';
|
|
5
|
+
export { mergeOrderCommand } from './merge-order.js';
|
|
6
|
+
export { readyCheckCommand } from './ready-check.js';
|
|
7
|
+
export { dependsCommand } from './depends.js';
|
|
8
|
+
export { staleCommand } from './stale.js';
|
|
9
|
+
export { cleanupCommand } from './cleanup.js';
|
|
10
|
+
export { abandonCommand } from './abandon.js';
|
|
11
|
+
export { mergedCommand } from './merged.js';
|
|
12
|
+
export { syncCommand } from './sync.js';
|
|
13
|
+
export { watchCommand } from './watch.js';
|
|
14
|
+
export { doctorCommand } from './doctor.js';
|
|
15
|
+
export { configCommand } from './config.js';
|
|
16
|
+
export { rebaseHelperCommand } from './rebase-helper.js';
|
|
17
|
+
export { registrySyncCommand } from './registry-sync.js';
|
|
18
|
+
export { crossConflictsCommand } from './cross-conflicts.js';
|
|
19
|
+
export { gitWatchCommand } from './git-watch.js';
|
|
20
|
+
export { githubSyncCommand } from './github-sync.js';
|
|
21
|
+
export { prCheckCommand } from './pr-check.js';
|
|
22
|
+
export { verifyTrunkCommand } from './verify-trunk.js';
|
|
23
|
+
export { logCommand } from './log.js';
|
|
24
|
+
export { contextCommand } from './context.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,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,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export { initCommand } from './init.js';
|
|
2
|
+
export { registerCommand } from './register.js';
|
|
3
|
+
export { listCommand } from './list.js';
|
|
4
|
+
export { conflictsCommand } from './conflicts.js';
|
|
5
|
+
export { mergeOrderCommand } from './merge-order.js';
|
|
6
|
+
export { readyCheckCommand } from './ready-check.js';
|
|
7
|
+
export { dependsCommand } from './depends.js';
|
|
8
|
+
export { staleCommand } from './stale.js';
|
|
9
|
+
export { cleanupCommand } from './cleanup.js';
|
|
10
|
+
export { abandonCommand } from './abandon.js';
|
|
11
|
+
export { mergedCommand } from './merged.js';
|
|
12
|
+
export { syncCommand } from './sync.js';
|
|
13
|
+
export { watchCommand } from './watch.js';
|
|
14
|
+
export { doctorCommand } from './doctor.js';
|
|
15
|
+
export { configCommand } from './config.js';
|
|
16
|
+
export { rebaseHelperCommand } from './rebase-helper.js';
|
|
17
|
+
export { registrySyncCommand } from './registry-sync.js';
|
|
18
|
+
export { crossConflictsCommand } from './cross-conflicts.js';
|
|
19
|
+
export { gitWatchCommand } from './git-watch.js';
|
|
20
|
+
// F2: GitHub inventory
|
|
21
|
+
export { githubSyncCommand } from './github-sync.js';
|
|
22
|
+
// PR coordination: pr-check, verify-trunk
|
|
23
|
+
export { prCheckCommand } from './pr-check.js';
|
|
24
|
+
export { verifyTrunkCommand } from './verify-trunk.js';
|
|
25
|
+
// L1: Activity Log
|
|
26
|
+
export { logCommand } from './log.js';
|
|
27
|
+
// Context
|
|
28
|
+
export { contextCommand } from './context.js';
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,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,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,uBAAuB;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,0CAA0C;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,WAAW,SAgBlB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan init
|
|
3
|
+
*
|
|
4
|
+
* Initialize Spidersan in the current project.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { LocalStorage } from '../storage/index.js';
|
|
8
|
+
export const initCommand = new Command('init')
|
|
9
|
+
.description('Initialize Spidersan in the current project')
|
|
10
|
+
.action(async () => {
|
|
11
|
+
const storage = new LocalStorage();
|
|
12
|
+
if (await storage.isInitialized()) {
|
|
13
|
+
console.log('🕷️ Spidersan is already initialized in this project.');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
await storage.init();
|
|
17
|
+
console.log('🕷️ Spidersan initialized!');
|
|
18
|
+
console.log(' Created .spidersan/registry.json');
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log('Next steps:');
|
|
21
|
+
console.log(' spidersan register --files "src/foo.ts,lib/bar.ts"');
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACzC,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAEnC,IAAI,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO;IACX,CAAC;IAED,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,WAAW,SAuClB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { getStorage } from '../storage/index.js';
|
|
3
|
+
export const listCommand = new Command('list')
|
|
4
|
+
.description('List all registered branches')
|
|
5
|
+
.option('--json', 'Output as JSON')
|
|
6
|
+
.action(async (options) => {
|
|
7
|
+
const storage = await getStorage();
|
|
8
|
+
if (!await storage.isInitialized()) {
|
|
9
|
+
console.error('❌ Spidersan not initialized. Run: spidersan init');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const branches = await storage.list();
|
|
13
|
+
if (branches.length === 0) {
|
|
14
|
+
console.log('🕷️ No branches registered yet.');
|
|
15
|
+
console.log(' Run: spidersan register --files "src/foo.ts"');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (options.json) {
|
|
19
|
+
console.log(JSON.stringify(branches, null, 2));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
console.log('🕷️ Registered Branches:\n');
|
|
23
|
+
for (const branch of branches) {
|
|
24
|
+
const status = branch.status === 'active' ? '🔄' :
|
|
25
|
+
branch.status === 'completed' ? '✅' : '❌';
|
|
26
|
+
const ago = getTimeAgo(new Date(branch.registeredAt));
|
|
27
|
+
console.log(` ${status} ${branch.name}`);
|
|
28
|
+
console.log(` └─ ${ago}${branch.agent ? ` | ${branch.agent}` : ''}`);
|
|
29
|
+
if (branch.files.length > 0) {
|
|
30
|
+
console.log(` └─ Files: ${branch.files.slice(0, 3).join(', ')}${branch.files.length > 3 ? ` (+${branch.files.length - 3} more)` : ''}`);
|
|
31
|
+
}
|
|
32
|
+
console.log('');
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
function getTimeAgo(date) {
|
|
36
|
+
const seconds = Math.floor((new Date().getTime() - date.getTime()) / 1000);
|
|
37
|
+
if (seconds < 60)
|
|
38
|
+
return 'Just now';
|
|
39
|
+
if (seconds < 3600)
|
|
40
|
+
return `${Math.floor(seconds / 60)} min ago`;
|
|
41
|
+
if (seconds < 86400)
|
|
42
|
+
return `${Math.floor(seconds / 3600)} hours ago`;
|
|
43
|
+
return `${Math.floor(seconds / 86400)} days ago`;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,QAmE1C"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan log — Activity log viewer
|
|
3
|
+
* Shows branch operation history from local JSONL or Supabase
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { queryActivityLog } from '../lib/activity.js';
|
|
7
|
+
const EVENT_ICONS = {
|
|
8
|
+
register: '📋',
|
|
9
|
+
merge: '✅',
|
|
10
|
+
abandon: '🗑️',
|
|
11
|
+
conflict_detected: '⚠️',
|
|
12
|
+
sync: '🔄',
|
|
13
|
+
cleanup: '🧹',
|
|
14
|
+
ready_check_pass: '✔️',
|
|
15
|
+
ready_check_fail: '❌',
|
|
16
|
+
session_start: '🌅',
|
|
17
|
+
session_end: '🌙',
|
|
18
|
+
};
|
|
19
|
+
export function logCommand(program) {
|
|
20
|
+
program
|
|
21
|
+
.command('log')
|
|
22
|
+
.description('Show branch operation history')
|
|
23
|
+
.option('-b, --branch <name>', 'Filter by branch name')
|
|
24
|
+
.option('-a, --agent <id>', 'Filter by agent')
|
|
25
|
+
.option('-r, --repo <name>', 'Filter by repo')
|
|
26
|
+
.option('-s, --since <duration>', 'Time range e.g. 24h, 7d, 30d', '24h')
|
|
27
|
+
.option('-n, --limit <n>', 'Max records', '50')
|
|
28
|
+
.option('--json', 'Output as JSON')
|
|
29
|
+
.action(async (options) => {
|
|
30
|
+
try {
|
|
31
|
+
const since = parseDuration(options.since || '24h');
|
|
32
|
+
const query = {
|
|
33
|
+
branch: options.branch,
|
|
34
|
+
agent: options.agent,
|
|
35
|
+
repo: options.repo,
|
|
36
|
+
since,
|
|
37
|
+
limit: parseInt(options.limit || '50', 10),
|
|
38
|
+
};
|
|
39
|
+
const result = await queryActivityLog(query);
|
|
40
|
+
if (options.json) {
|
|
41
|
+
console.log(JSON.stringify(result, null, 2));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const { records, source } = result;
|
|
45
|
+
console.log(chalk.cyan(`🕷️ Spidersan Activity Log`) + chalk.gray(` (${source})`));
|
|
46
|
+
console.log(chalk.gray(` Since: ${since.toISOString().split('T')[0]} — ${records.length} record(s)\n`));
|
|
47
|
+
if (records.length === 0) {
|
|
48
|
+
console.log(chalk.yellow('No activity found for the given filters.'));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
for (const r of records) {
|
|
52
|
+
const icon = EVENT_ICONS[r.event] || '•';
|
|
53
|
+
const time = new Date(r.created_at).toLocaleString('en-GB', {
|
|
54
|
+
month: 'short', day: 'numeric',
|
|
55
|
+
hour: '2-digit', minute: '2-digit',
|
|
56
|
+
});
|
|
57
|
+
const agent = r.agent ? chalk.magenta(`[${r.agent}]`) : '';
|
|
58
|
+
const branch = r.branch ? chalk.green(r.branch) : '';
|
|
59
|
+
const repo = r.repo ? chalk.gray(`${r.repo}/`) : '';
|
|
60
|
+
const detail = formatDetail(r.event, r.details);
|
|
61
|
+
console.log(`${chalk.gray(time)} ${icon} ${agent} ${repo}${branch}` +
|
|
62
|
+
(detail ? chalk.gray(` — ${detail}`) : ''));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
console.error(chalk.red(`❌ ${err.message}`));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function parseDuration(s) {
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
const match = s.match(/^(\d+)([hdwm])$/);
|
|
74
|
+
if (!match)
|
|
75
|
+
return new Date(now - 24 * 60 * 60 * 1000);
|
|
76
|
+
const n = parseInt(match[1], 10);
|
|
77
|
+
const unit = match[2];
|
|
78
|
+
const ms = unit === 'h' ? n * 3600000
|
|
79
|
+
: unit === 'd' ? n * 86400000
|
|
80
|
+
: unit === 'w' ? n * 604800000
|
|
81
|
+
: n * 2592000000;
|
|
82
|
+
return new Date(now - ms);
|
|
83
|
+
}
|
|
84
|
+
function formatDetail(event, details) {
|
|
85
|
+
if (event === 'conflict_detected') {
|
|
86
|
+
// details stores tier counts {tier3, tier2, tier1} — derive max tier
|
|
87
|
+
const t3 = details.tier3 ?? 0;
|
|
88
|
+
const t2 = details.tier2 ?? 0;
|
|
89
|
+
const t1 = details.tier1 ?? 0;
|
|
90
|
+
const maxTier = t3 > 0 ? 3 : t2 > 0 ? 2 : t1 > 0 ? 1 : details.tier;
|
|
91
|
+
const branches = details.conflicting_branches?.join(', ');
|
|
92
|
+
return `TIER ${maxTier ?? '?'}${branches ? ` with ${branches}` : ''}`;
|
|
93
|
+
}
|
|
94
|
+
if (event === 'register' && details.description)
|
|
95
|
+
return details.description;
|
|
96
|
+
if (event === 'merge' && details.pr_number)
|
|
97
|
+
return `PR #${details.pr_number}`;
|
|
98
|
+
if (event === 'ready_check_fail' && details.blockers) {
|
|
99
|
+
const b = details.blockers;
|
|
100
|
+
return b.slice(0, 2).join(', ') + (b.length > 2 ? '…' : '');
|
|
101
|
+
}
|
|
102
|
+
if (event === 'sync') {
|
|
103
|
+
const orphans = details.orphans_removed;
|
|
104
|
+
const synced = details.branches_synced;
|
|
105
|
+
if (orphans !== undefined || synced !== undefined)
|
|
106
|
+
return `${synced ?? 0} synced, ${orphans ?? 0} orphans removed`;
|
|
107
|
+
}
|
|
108
|
+
return '';
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=log.js.map
|