spidersan 0.4.5 → 0.6.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 +67 -0
- package/README.md +60 -5
- package/dist/bin/spidersan.d.ts.map +1 -1
- package/dist/bin/spidersan.js +12 -1
- package/dist/bin/spidersan.js.map +1 -1
- package/dist/commands/abandon.d.ts.map +1 -1
- package/dist/commands/abandon.js +4 -2
- package/dist/commands/abandon.js.map +1 -1
- package/dist/commands/auto.js +6 -6
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +3 -8
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +209 -56
- package/dist/commands/conflicts.js.map +1 -1
- 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 +308 -0
- package/dist/commands/cross-conflicts.js.map +1 -0
- package/dist/commands/daily.d.ts +7 -0
- package/dist/commands/daily.d.ts.map +1 -0
- package/dist/commands/daily.js +171 -0
- package/dist/commands/daily.js.map +1 -0
- package/dist/commands/dashboard.d.ts +22 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +401 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/depends.js +2 -2
- package/dist/commands/depends.js.map +1 -1
- package/dist/commands/doctor.d.ts +22 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +320 -61
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/github-sync.d.ts +9 -0
- package/dist/commands/github-sync.d.ts.map +1 -0
- package/dist/commands/github-sync.js +180 -0
- package/dist/commands/github-sync.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +16 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/log.d.ts +3 -4
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +102 -87
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/merge-order.js +8 -1
- package/dist/commands/merge-order.js.map +1 -1
- package/dist/commands/merged.d.ts.map +1 -1
- package/dist/commands/merged.js +4 -2
- package/dist/commands/merged.js.map +1 -1
- package/dist/commands/pulse.d.ts +6 -2
- package/dist/commands/pulse.d.ts.map +1 -1
- package/dist/commands/pulse.js +144 -202
- package/dist/commands/pulse.js.map +1 -1
- package/dist/commands/queen.d.ts +25 -0
- package/dist/commands/queen.d.ts.map +1 -0
- package/dist/commands/queen.js +322 -0
- package/dist/commands/queen.js.map +1 -0
- package/dist/commands/ready-check.d.ts.map +1 -1
- package/dist/commands/ready-check.js +42 -27
- package/dist/commands/ready-check.js.map +1 -1
- package/dist/commands/rebase-helper.d.ts.map +1 -1
- package/dist/commands/rebase-helper.js +13 -5
- package/dist/commands/rebase-helper.js.map +1 -1
- package/dist/commands/register.d.ts +1 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +46 -19
- package/dist/commands/register.js.map +1 -1
- 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 +163 -0
- package/dist/commands/registry-sync.js.map +1 -0
- package/dist/commands/rescue.d.ts.map +1 -1
- package/dist/commands/rescue.js +42 -6
- package/dist/commands/rescue.js.map +1 -1
- package/dist/commands/stale.d.ts +9 -1
- package/dist/commands/stale.d.ts.map +1 -1
- package/dist/commands/stale.js +38 -45
- package/dist/commands/stale.js.map +1 -1
- package/dist/commands/sync-advisor.d.ts +14 -0
- package/dist/commands/sync-advisor.d.ts.map +1 -0
- package/dist/commands/sync-advisor.js +110 -0
- package/dist/commands/sync-advisor.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +16 -5
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/torrent.d.ts.map +1 -1
- package/dist/commands/torrent.js +16 -14
- package/dist/commands/torrent.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +197 -6
- package/dist/commands/watch.js.map +1 -1
- package/dist/lib/activity.d.ts +53 -0
- package/dist/lib/activity.d.ts.map +1 -0
- package/dist/lib/activity.js +267 -0
- package/dist/lib/activity.js.map +1 -0
- package/dist/lib/agent-errors.d.ts.map +1 -1
- package/dist/lib/agent-errors.js +5 -3
- package/dist/lib/agent-errors.js.map +1 -1
- package/dist/lib/ast.d.ts.map +1 -1
- package/dist/lib/ast.js +66 -19
- package/dist/lib/ast.js.map +1 -1
- package/dist/lib/colony-subscriber.d.ts +53 -0
- package/dist/lib/colony-subscriber.d.ts.map +1 -0
- package/dist/lib/colony-subscriber.js +184 -0
- package/dist/lib/colony-subscriber.js.map +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +5 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/crypto.d.ts.map +1 -1
- package/dist/lib/crypto.js +7 -3
- package/dist/lib/crypto.js.map +1 -1
- package/dist/lib/daily-bridge.d.ts +41 -0
- package/dist/lib/daily-bridge.d.ts.map +1 -0
- package/dist/lib/daily-bridge.js +186 -0
- package/dist/lib/daily-bridge.js.map +1 -0
- package/dist/lib/github.d.ts +83 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +206 -0
- package/dist/lib/github.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/repo-scanner.d.ts +32 -0
- package/dist/lib/repo-scanner.d.ts.map +1 -0
- package/dist/lib/repo-scanner.js +160 -0
- package/dist/lib/repo-scanner.js.map +1 -0
- package/dist/lib/salvage-analyzer.d.ts +29 -0
- package/dist/lib/salvage-analyzer.d.ts.map +1 -0
- package/dist/lib/salvage-analyzer.js +122 -0
- package/dist/lib/salvage-analyzer.js.map +1 -0
- package/dist/lib/security.d.ts +11 -0
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +20 -0
- package/dist/lib/security.js.map +1 -1
- package/dist/lib/symbol-extractor.d.ts +41 -0
- package/dist/lib/symbol-extractor.d.ts.map +1 -0
- package/dist/lib/symbol-extractor.js +78 -0
- package/dist/lib/symbol-extractor.js.map +1 -0
- package/dist/storage/adapter.d.ts +1 -1
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/index.d.ts +0 -5
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +0 -6
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/local.d.ts +1 -1
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +7 -5
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/supabase.d.ts +21 -1
- package/dist/storage/supabase.d.ts.map +1 -1
- package/dist/storage/supabase.js +171 -6
- package/dist/storage/supabase.js.map +1 -1
- package/dist/tui/dashboard.d.ts.map +1 -1
- package/dist/tui/dashboard.js +15 -6
- package/dist/tui/dashboard.js.map +1 -1
- package/dist/types/cloud.d.ts +101 -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 +90 -91
- package/dist/commands/sync-all.d.ts +0 -9
- package/dist/commands/sync-all.d.ts.map +0 -1
- package/dist/commands/sync-all.js +0 -180
- package/dist/commands/sync-all.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 -374
- package/dist/storage/git-messages.js.map +0 -1
- package/dist/storage/local-messages.d.ts +0 -37
- package/dist/storage/local-messages.d.ts.map +0 -1
- package/dist/storage/local-messages.js +0 -151
- package/dist/storage/local-messages.js.map +0 -1
- package/dist/storage/message-adapter.d.ts +0 -86
- package/dist/storage/message-adapter.d.ts.map +0 -1
- package/dist/storage/message-adapter.js +0 -28
- package/dist/storage/message-adapter.js.map +0 -1
- package/dist/storage/message-factory.d.ts +0 -36
- package/dist/storage/message-factory.d.ts.map +0 -1
- package/dist/storage/message-factory.js +0 -99
- package/dist/storage/message-factory.js.map +0 -1
- package/dist/storage/mycmail-adapter.d.ts +0 -38
- package/dist/storage/mycmail-adapter.d.ts.map +0 -1
- package/dist/storage/mycmail-adapter.js +0 -297
- package/dist/storage/mycmail-adapter.js.map +0 -1
package/dist/commands/pulse.js
CHANGED
|
@@ -1,232 +1,174 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* spidersan pulse
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Quick health-check: sync from Colony, then run local conflict detection.
|
|
5
|
+
* Calls syncFromColony() first so that active work_claim signals from other
|
|
6
|
+
* agents are reflected in the registry before conflicts are computed.
|
|
7
|
+
*
|
|
8
|
+
* Offline mode: if Colony is unreachable, prints a warning and continues
|
|
9
|
+
* with existing local registry data — never crashes.
|
|
6
10
|
*/
|
|
7
11
|
import { Command } from 'commander';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { homedir } from 'os';
|
|
11
|
-
import { join } from 'path';
|
|
12
|
+
import { compilePatterns } from '../lib/regex-utils.js';
|
|
13
|
+
import { execFileSync } from 'child_process';
|
|
12
14
|
import { getStorage } from '../storage/index.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
import { syncFromColony } from '../lib/colony-subscriber.js';
|
|
16
|
+
import { loadConfig } from '../lib/config.js';
|
|
17
|
+
// Critical files — TIER 3 block
|
|
18
|
+
const TIER_3_PATTERNS = [
|
|
19
|
+
/\.env$/,
|
|
20
|
+
/secrets?\./i,
|
|
21
|
+
/credentials/i,
|
|
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;
|
|
21
54
|
}
|
|
22
|
-
function
|
|
23
|
-
if (process.env.SUPABASE_URL && process.env.SUPABASE_KEY) {
|
|
24
|
-
return 'supabase';
|
|
25
|
-
}
|
|
26
|
-
const localPath = join(process.cwd(), '.spidersan', 'registry.json');
|
|
27
|
-
const globalPath = join(homedir(), '.spidersan', 'registry.json');
|
|
28
|
-
if (existsSync(localPath) || existsSync(globalPath)) {
|
|
29
|
-
return 'local';
|
|
30
|
-
}
|
|
31
|
-
return 'unknown';
|
|
32
|
-
}
|
|
33
|
-
function getStorageSize() {
|
|
55
|
+
function getCurrentBranch() {
|
|
34
56
|
try {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (existsSync(path)) {
|
|
39
|
-
return statSync(path).size;
|
|
40
|
-
}
|
|
57
|
+
return execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
58
|
+
encoding: 'utf-8',
|
|
59
|
+
}).trim();
|
|
41
60
|
}
|
|
42
61
|
catch {
|
|
43
|
-
|
|
62
|
+
return 'unknown';
|
|
44
63
|
}
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
function daysBetween(date1, date2) {
|
|
48
|
-
const diffMs = Math.abs(date2.getTime() - date1.getTime());
|
|
49
|
-
return Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
50
|
-
}
|
|
51
|
-
function determineHealth(pulse) {
|
|
52
|
-
// Dormant: not initialized or no activity
|
|
53
|
-
if (!pulse.registry.initialized)
|
|
54
|
-
return 'dormant';
|
|
55
|
-
if (pulse.registry.activeBranches === 0)
|
|
56
|
-
return 'dormant';
|
|
57
|
-
// Weak: high stale count or low completeness
|
|
58
|
-
if (pulse.registry.staleBranches > pulse.registry.activeBranches)
|
|
59
|
-
return 'weak';
|
|
60
|
-
if (pulse.completeness.score < 50)
|
|
61
|
-
return 'weak';
|
|
62
|
-
// Steady: some issues but functional
|
|
63
|
-
if (pulse.completeness.score < 80)
|
|
64
|
-
return 'steady';
|
|
65
|
-
if (pulse.registry.staleBranches > 0)
|
|
66
|
-
return 'steady';
|
|
67
|
-
// Strong: healthy web
|
|
68
|
-
return 'strong';
|
|
69
64
|
}
|
|
70
65
|
export const pulseCommand = new Command('pulse')
|
|
71
|
-
.description(
|
|
66
|
+
.description('Sync from Colony then show active conflicts (quick health-check)')
|
|
72
67
|
.option('--json', 'Output as JSON')
|
|
73
|
-
.option('-
|
|
68
|
+
.option('--no-sync', 'Skip Colony sync, use local registry only')
|
|
74
69
|
.action(async (options) => {
|
|
75
70
|
const storage = await getStorage();
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
// Check if initialized
|
|
104
|
-
pulse.registry.initialized = await storage.isInitialized();
|
|
105
|
-
if (pulse.registry.initialized) {
|
|
106
|
-
const branches = await storage.list();
|
|
107
|
-
const gitBranches = new Set(getGitBranches());
|
|
108
|
-
// Count by status
|
|
109
|
-
const active = branches.filter(b => b.status === 'active');
|
|
110
|
-
const stale = active.filter(b => daysBetween(new Date(b.registeredAt), now) > STALE_DAYS);
|
|
111
|
-
const abandoned = branches.filter(b => b.status === 'abandoned');
|
|
112
|
-
pulse.registry.totalBranches = branches.length;
|
|
113
|
-
pulse.registry.activeBranches = active.length;
|
|
114
|
-
pulse.registry.staleBranches = stale.length;
|
|
115
|
-
pulse.registry.abandonedBranches = abandoned.length;
|
|
116
|
-
// Unique agents
|
|
117
|
-
const agents = new Set(branches.map(b => b.agent).filter((a) => !!a));
|
|
118
|
-
pulse.registry.agents = Array.from(agents);
|
|
119
|
-
// Date ranges
|
|
120
|
-
if (active.length > 0) {
|
|
121
|
-
const dates = active.map(b => new Date(b.registeredAt).getTime());
|
|
122
|
-
pulse.registry.oldestActive = new Date(Math.min(...dates));
|
|
123
|
-
pulse.registry.newestActive = new Date(Math.max(...dates));
|
|
124
|
-
pulse.lastActivity.lastSync = pulse.registry.newestActive;
|
|
125
|
-
pulse.lastActivity.daysSinceActivity = daysBetween(pulse.registry.newestActive, now);
|
|
126
|
-
}
|
|
127
|
-
// Completeness: find git branches not in registry
|
|
128
|
-
const registeredNames = new Set(branches.map(b => b.name));
|
|
129
|
-
const unregistered = Array.from(gitBranches).filter(b => !registeredNames.has(b) && b !== 'main' && b !== 'master');
|
|
130
|
-
pulse.completeness.unregisteredBranches = unregistered;
|
|
131
|
-
// Calculate completeness score
|
|
132
|
-
const relevantBranches = Array.from(gitBranches).filter(b => b !== 'main' && b !== 'master');
|
|
133
|
-
if (relevantBranches.length === 0) {
|
|
134
|
-
pulse.completeness.score = 100; // No branches to track
|
|
71
|
+
if (!await storage.isInitialized()) {
|
|
72
|
+
console.error('❌ Spidersan not initialized. Run: spidersan init');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
const config = await loadConfig();
|
|
76
|
+
const highSeverity = (config.conflicts?.highSeverityPatterns || []).map((p) => new RegExp(p));
|
|
77
|
+
const mediumSeverity = (config.conflicts?.mediumSeverityPatterns || []).map((p) => new RegExp(p));
|
|
78
|
+
const compiledHigh = compilePatterns(highSeverity);
|
|
79
|
+
const compiledMedium = compilePatterns(mediumSeverity);
|
|
80
|
+
// ── Colony sync ───────────────────────────────────────────────────────
|
|
81
|
+
let colonySynced = 0;
|
|
82
|
+
let colonyOffline = true;
|
|
83
|
+
if (options.sync !== false) {
|
|
84
|
+
const result = await syncFromColony();
|
|
85
|
+
colonySynced = result.synced;
|
|
86
|
+
colonyOffline = result.offline;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.log('ℹ Colony sync skipped (--no-sync)');
|
|
90
|
+
}
|
|
91
|
+
// ── Local conflict detection ──────────────────────────────────────────
|
|
92
|
+
const currentBranch = getCurrentBranch();
|
|
93
|
+
const allBranches = await storage.list();
|
|
94
|
+
const target = allBranches.find(b => b.name === currentBranch);
|
|
95
|
+
if (!target) {
|
|
96
|
+
if (options.json) {
|
|
97
|
+
console.log(JSON.stringify({ branch: currentBranch, registered: false, conflicts: [], colonySynced, colonyOffline }));
|
|
135
98
|
}
|
|
136
99
|
else {
|
|
137
|
-
|
|
138
|
-
|
|
100
|
+
console.log(`🕷️ Branch "${currentBranch}" is not registered.`);
|
|
101
|
+
console.log(' Run: spidersan register --files "..."');
|
|
102
|
+
if (!colonyOffline) {
|
|
103
|
+
console.log(` Colony: synced ${colonySynced} claim(s)`);
|
|
104
|
+
}
|
|
139
105
|
}
|
|
140
|
-
}
|
|
141
|
-
// Determine overall health
|
|
142
|
-
pulse.health = determineHealth(pulse);
|
|
143
|
-
// JSON output
|
|
144
|
-
if (options.json) {
|
|
145
|
-
console.log(JSON.stringify(pulse, null, 2));
|
|
146
106
|
return;
|
|
147
107
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
108
|
+
const targetFilesSet = new Set(target.files);
|
|
109
|
+
const conflicts = [];
|
|
110
|
+
for (const branch of allBranches) {
|
|
111
|
+
if (branch.name === currentBranch || branch.status !== 'active')
|
|
112
|
+
continue;
|
|
113
|
+
const overlapping = branch.files.filter(f => targetFilesSet.has(f));
|
|
114
|
+
if (overlapping.length === 0)
|
|
115
|
+
continue;
|
|
116
|
+
// Determine max tier for this conflict group
|
|
117
|
+
let maxTier = 1;
|
|
118
|
+
for (const file of overlapping) {
|
|
119
|
+
const tier = classifyTier(file, compiledHigh, compiledMedium);
|
|
120
|
+
if (tier > maxTier)
|
|
121
|
+
maxTier = tier;
|
|
122
|
+
}
|
|
123
|
+
conflicts.push({
|
|
124
|
+
branch: branch.name,
|
|
125
|
+
files: overlapping,
|
|
126
|
+
tier: maxTier,
|
|
127
|
+
agent: branch.agent,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
conflicts.sort((a, b) => b.tier - a.tier);
|
|
131
|
+
if (options.json) {
|
|
132
|
+
console.log(JSON.stringify({
|
|
133
|
+
branch: currentBranch,
|
|
134
|
+
registered: true,
|
|
135
|
+
conflicts,
|
|
136
|
+
colonySynced,
|
|
137
|
+
colonyOffline,
|
|
138
|
+
}, null, 2));
|
|
152
139
|
return;
|
|
153
140
|
}
|
|
154
|
-
//
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
console.log(
|
|
141
|
+
// ── Human-readable output ─────────────────────────────────────────────
|
|
142
|
+
const colonyStatus = colonyOffline
|
|
143
|
+
? '⚠ offline'
|
|
144
|
+
: `✅ synced ${colonySynced} claim(s)`;
|
|
145
|
+
console.log(`
|
|
146
|
+
🕷️ SPIDERSAN PULSE — "${currentBranch}"
|
|
147
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
148
|
+
Colony: ${colonyStatus}
|
|
149
|
+
Branches: ${allBranches.filter(b => b.status === 'active').length} active
|
|
150
|
+
`.trim());
|
|
159
151
|
console.log('');
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
steady: ['💛', 'STEADY', 'The web is functional.'],
|
|
164
|
-
weak: ['🧡', 'WEAK', 'The web needs attention.'],
|
|
165
|
-
dormant: ['💤', 'DORMANT', 'The spider sleeps...'],
|
|
166
|
-
};
|
|
167
|
-
const [emoji, label, tagline] = healthDisplay[pulse.health];
|
|
168
|
-
console.log(' ╭─────────────────────────────────────╮');
|
|
169
|
-
console.log(` │ ${emoji} Web Health: ${label.padEnd(23)} │`);
|
|
170
|
-
console.log(' ╰─────────────────────────────────────╯');
|
|
171
|
-
console.log(` "${tagline}"`);
|
|
172
|
-
console.log('');
|
|
173
|
-
// Registry overview
|
|
174
|
-
console.log(' 📊 Registry:');
|
|
175
|
-
console.log(` • ${pulse.registry.activeBranches} active thread${pulse.registry.activeBranches !== 1 ? 's' : ''}`);
|
|
176
|
-
if (pulse.registry.staleBranches > 0) {
|
|
177
|
-
console.log(` • ${pulse.registry.staleBranches} stale (older than ${STALE_DAYS} days)`);
|
|
178
|
-
}
|
|
179
|
-
if (pulse.registry.abandonedBranches > 0) {
|
|
180
|
-
console.log(` • ${pulse.registry.abandonedBranches} abandoned`);
|
|
181
|
-
}
|
|
182
|
-
if (pulse.registry.agents.length > 0) {
|
|
183
|
-
console.log(` • Agents: ${pulse.registry.agents.join(', ')}`);
|
|
152
|
+
if (conflicts.length === 0) {
|
|
153
|
+
console.log('✅ No conflicts detected. You\'re good to go!');
|
|
154
|
+
return;
|
|
184
155
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
console.log(` └─ ${branch}`);
|
|
195
|
-
}
|
|
196
|
-
if (pulse.completeness.unregisteredBranches.length > 3) {
|
|
197
|
-
console.log(` └─ +${pulse.completeness.unregisteredBranches.length - 3} more`);
|
|
156
|
+
const tierIcons = { 1: '🟡', 2: '🟠', 3: '🔴' };
|
|
157
|
+
const tierLabels = { 1: 'WARN', 2: 'PAUSE', 3: 'BLOCK' };
|
|
158
|
+
for (const c of conflicts) {
|
|
159
|
+
const icon = tierIcons[c.tier] ?? '🟡';
|
|
160
|
+
const label = tierLabels[c.tier] ?? 'WARN';
|
|
161
|
+
const agentTag = c.agent ? ` [@${c.agent}]` : '';
|
|
162
|
+
console.log(`${icon} TIER ${c.tier} ${label}: ${c.branch}${agentTag}`);
|
|
163
|
+
for (const f of c.files) {
|
|
164
|
+
console.log(` • ${f}`);
|
|
198
165
|
}
|
|
199
|
-
}
|
|
200
|
-
else if (pulse.completeness.score === 100) {
|
|
201
|
-
console.log(' ✅ All branches tracked');
|
|
202
|
-
}
|
|
203
|
-
// Activity
|
|
204
|
-
if (pulse.lastActivity.daysSinceActivity !== null) {
|
|
205
166
|
console.log('');
|
|
206
|
-
console.log(' ⏱️ Activity:');
|
|
207
|
-
if (pulse.lastActivity.daysSinceActivity === 0) {
|
|
208
|
-
console.log(' • Last activity: today');
|
|
209
|
-
}
|
|
210
|
-
else if (pulse.lastActivity.daysSinceActivity === 1) {
|
|
211
|
-
console.log(' • Last activity: yesterday');
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
console.log(` • Last activity: ${pulse.lastActivity.daysSinceActivity} days ago`);
|
|
215
|
-
}
|
|
216
167
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
console.log(
|
|
221
|
-
|
|
222
|
-
const kb = (pulse.storage.sizeBytes / 1024).toFixed(1);
|
|
223
|
-
console.log(` • Size: ${kb} KB`);
|
|
224
|
-
}
|
|
225
|
-
// Wyatt's question
|
|
226
|
-
console.log('');
|
|
227
|
-
console.log(' ╭─────────────────────────────────────╮');
|
|
228
|
-
console.log(' │ "Do I guide them? Or they me?" │');
|
|
229
|
-
console.log(' ╰─────────────────────────────────────╯');
|
|
230
|
-
console.log('');
|
|
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`);
|
|
231
173
|
});
|
|
232
174
|
//# sourceMappingURL=pulse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../../src/commands/pulse.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../../src/commands/pulse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan queen
|
|
3
|
+
*
|
|
4
|
+
* Mode 3: Queen Spider — sub-spidersan dispatch for parallel ground jobs.
|
|
5
|
+
*
|
|
6
|
+
* The queen never does ground work. It spawns scoped, ephemeral sub-spidersans,
|
|
7
|
+
* watches them via the colony gradient, and integrates results. Each sub fires,
|
|
8
|
+
* completes its single job, and dissolves back into the colony.
|
|
9
|
+
*
|
|
10
|
+
* Subcommands:
|
|
11
|
+
* spawn — define a ground job, emit colony assignment, print launch script
|
|
12
|
+
* status — show active sub-spidersans spawned by this queen signal
|
|
13
|
+
* dissolve — manually close a stuck sub-spidersan
|
|
14
|
+
*
|
|
15
|
+
* Colony shape:
|
|
16
|
+
* Queen emits a signal (status=in-progress, type=work_claim, task="queen dispatch")
|
|
17
|
+
* Each sub emits a signal with payload.spawned_by = queen_signal_id
|
|
18
|
+
* Sub closes via colony_close on completion (fire-complete-dissolve)
|
|
19
|
+
*
|
|
20
|
+
* Note: Actual claude spawning (via nanoclaw/INFRA-A) is stubbed until Phase 0
|
|
21
|
+
* is proven. spawn prints the launch script — execution is manual or via birdsan.
|
|
22
|
+
*/
|
|
23
|
+
import { Command } from 'commander';
|
|
24
|
+
export declare const queenCommand: Command;
|
|
25
|
+
//# sourceMappingURL=queen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queen.d.ts","sourceRoot":"","sources":["../../src/commands/queen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiYpC,eAAO,MAAM,YAAY,SAIY,CAAC"}
|