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,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan verify-trunk
|
|
3
|
+
*
|
|
4
|
+
* Detect (and optionally fix) registry "trunk-poison": the trunk branch
|
|
5
|
+
* (main/master/develop…) claiming files in the spidersan registry. A clean
|
|
6
|
+
* auto-merge can silently re-poison main, so the post-merge hook gates on this.
|
|
7
|
+
*
|
|
8
|
+
* Promotes the 2026-06-15 `spidersan-post.sh` hook into a first-class command.
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { getStorage } from '../storage/index.js';
|
|
12
|
+
import { getTrunkBranch } from '../lib/trunk.js';
|
|
13
|
+
/**
|
|
14
|
+
* The set of branch names that MUST claim no files: the resolved trunk plus the
|
|
15
|
+
* literal `main`/`master` (a repo can have stray entries for either even when
|
|
16
|
+
* trunk resolves to something else). De-duplicated, order-stable.
|
|
17
|
+
*/
|
|
18
|
+
export function trunkEquivalentNames(trunk) {
|
|
19
|
+
const names = [trunk, 'main', 'master'];
|
|
20
|
+
return [...new Set(names)];
|
|
21
|
+
}
|
|
22
|
+
export const verifyTrunkCommand = new Command('verify-trunk')
|
|
23
|
+
.description('Detect registry trunk-poison (main/master must claim no files)')
|
|
24
|
+
.option('--json', 'Output as JSON')
|
|
25
|
+
.option('--fix', 'Reset every poisoned trunk-equivalent entry to files:[]')
|
|
26
|
+
.option('--exit-code', 'Exit 1 when any trunk entry is poisoned — for hook gating')
|
|
27
|
+
.action(async (options) => {
|
|
28
|
+
const storage = await getStorage();
|
|
29
|
+
if (!await storage.isInitialized()) {
|
|
30
|
+
console.error('❌ Spidersan not initialized. Run: spidersan init');
|
|
31
|
+
if (options.exitCode)
|
|
32
|
+
process.exit(1);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const trunk = getTrunkBranch();
|
|
36
|
+
const candidates = trunkEquivalentNames(trunk);
|
|
37
|
+
const branches = await storage.list();
|
|
38
|
+
const byName = new Map(branches.map(b => [b.name, b]));
|
|
39
|
+
const poisoned = [];
|
|
40
|
+
for (const name of candidates) {
|
|
41
|
+
const branch = byName.get(name);
|
|
42
|
+
if (branch && branch.files.length > 0) {
|
|
43
|
+
poisoned.push({ name, files: [...branch.files] });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// --fix: clear files:[] for every poisoned trunk-equivalent entry.
|
|
47
|
+
if (options.fix) {
|
|
48
|
+
for (const entry of poisoned) {
|
|
49
|
+
await storage.update(entry.name, { files: [] });
|
|
50
|
+
entry.fixed = true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (options.json) {
|
|
54
|
+
console.log(JSON.stringify({ trunk, poisoned: poisoned.length > 0, entries: poisoned }, null, 2));
|
|
55
|
+
}
|
|
56
|
+
else if (poisoned.length === 0) {
|
|
57
|
+
console.log(`✅ trunk \`${trunk}\` is clean (files:[]).`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
for (const entry of poisoned) {
|
|
61
|
+
const preview = entry.files.slice(0, 3).join(', ');
|
|
62
|
+
const more = entry.files.length > 3 ? `, +${entry.files.length - 3} more` : '';
|
|
63
|
+
if (entry.fixed) {
|
|
64
|
+
console.log(`🔧 \`${entry.name}\` had ${entry.files.length} file(s) (${preview}${more}) — reset to files:[].`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(`⚠️ TRUNK POISON: \`${entry.name}\` claims ${entry.files.length} file(s) in the registry ` +
|
|
68
|
+
`(${preview}${more}). A merge re-poisoned it (silent on clean auto-merge). ` +
|
|
69
|
+
`Reset to files:[] before pushing (run with --fix).`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (options.exitCode && poisoned.length > 0 && !options.fix) {
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=verify-trunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-trunk.js","sourceRoot":"","sources":["../../src/commands/verify-trunk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkGpC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DhB;AAED,eAAO,MAAM,YAAY,SAyNnB,CAAC"}
|
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { execFileSync, spawnSync } from 'child_process';
|
|
3
|
+
import { getStorage } from '../storage/index.js';
|
|
4
|
+
import * as chokidar from 'chokidar';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { homedir } from 'os';
|
|
7
|
+
import { loadConfig } from '../lib/config.js';
|
|
8
|
+
import { syncFromColony } from '../lib/colony-subscriber.js';
|
|
9
|
+
import { getCurrentBranch, getRemoteHead, getRepoName } from '../lib/git.js';
|
|
10
|
+
import { classifyTier } from '../lib/conflict-tier.js';
|
|
11
|
+
import { createNotifier, deliver } from '../lib/notify.js';
|
|
12
|
+
import { computeDriftResult } from '../lib/remote-drift.js';
|
|
13
|
+
import { renderFetchPollDrift, renderFetchPollHeartbeat } from '../lib/watch-renderer.js';
|
|
14
|
+
import { getCLIPath } from '../lib/security.js';
|
|
15
|
+
const DEBOUNCE_MS = 1000; // Debounce file changes
|
|
16
|
+
// Lazy so the transport is resolved at first use, not at import — same shape as
|
|
17
|
+
// git-events-subscriber.ts, which keeps it mockable under vi.resetModules().
|
|
18
|
+
let _notifier = null;
|
|
19
|
+
function notifier() {
|
|
20
|
+
return (_notifier ??= createNotifier());
|
|
21
|
+
}
|
|
22
|
+
function getRepoRoot() {
|
|
23
|
+
try {
|
|
24
|
+
return execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf-8' }).trim();
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return process.cwd();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function parsePaths(value) {
|
|
31
|
+
return value.split(',').map((entry) => entry.trim()).filter(Boolean);
|
|
32
|
+
}
|
|
33
|
+
function formatConflictChatMessage(branch, conflicts) {
|
|
34
|
+
const conflictDetails = conflicts
|
|
35
|
+
.map(c => `• **${c.branch}**: ${c.files.join(', ')}`)
|
|
36
|
+
.join('\n');
|
|
37
|
+
return `🕷️⚠️ **CONFLICT DETECTED** on branch \`${branch}\`\n\n${conflictDetails}`;
|
|
38
|
+
}
|
|
39
|
+
function formatFetchPollTime(date) {
|
|
40
|
+
return date.toLocaleTimeString('en-GB', { hour12: false });
|
|
41
|
+
}
|
|
42
|
+
function runInRepoDir(repoDir, work) {
|
|
43
|
+
const originalDir = process.cwd();
|
|
44
|
+
const shouldChangeDir = repoDir && originalDir !== repoDir;
|
|
45
|
+
let restoreInFinally = true;
|
|
46
|
+
if (shouldChangeDir) {
|
|
47
|
+
process.chdir(repoDir);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const result = work();
|
|
51
|
+
if (result instanceof Promise) {
|
|
52
|
+
restoreInFinally = false;
|
|
53
|
+
return result.finally(() => {
|
|
54
|
+
if (shouldChangeDir) {
|
|
55
|
+
process.chdir(originalDir);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
if (restoreInFinally && shouldChangeDir && process.cwd() === repoDir) {
|
|
63
|
+
process.chdir(originalDir);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function isDriftSkipped(result) {
|
|
68
|
+
return 'skipped' in result;
|
|
69
|
+
}
|
|
70
|
+
export async function startFetchPollLoop(opts) {
|
|
71
|
+
const intervalMs = Math.max(1, opts.intervalSecs) * 1000;
|
|
72
|
+
try {
|
|
73
|
+
const branch = runInRepoDir(opts.repoDir, () => getCurrentBranch());
|
|
74
|
+
const storage = await getStorage();
|
|
75
|
+
let lastRemoteHead = runInRepoDir(opts.repoDir, () => getRemoteHead('origin', branch));
|
|
76
|
+
let inFlight = false;
|
|
77
|
+
setInterval(() => {
|
|
78
|
+
if (inFlight)
|
|
79
|
+
return;
|
|
80
|
+
inFlight = true;
|
|
81
|
+
void (async () => {
|
|
82
|
+
try {
|
|
83
|
+
const currentRemoteHead = runInRepoDir(opts.repoDir, () => getRemoteHead('origin', branch));
|
|
84
|
+
if (currentRemoteHead === lastRemoteHead) {
|
|
85
|
+
if (!opts.quiet) {
|
|
86
|
+
console.log(renderFetchPollHeartbeat({
|
|
87
|
+
branch,
|
|
88
|
+
timestamp: formatFetchPollTime(new Date()),
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
lastRemoteHead = currentRemoteHead;
|
|
94
|
+
const registeredFiles = (await storage.get(branch))?.files ?? [];
|
|
95
|
+
const result = await runInRepoDir(opts.repoDir, () => computeDriftResult(registeredFiles, { remote: 'origin', branch }));
|
|
96
|
+
if (isDriftSkipped(result)) {
|
|
97
|
+
if (!opts.quiet) {
|
|
98
|
+
console.log(renderFetchPollDrift({ branch, drift: result }));
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (result.remoteAhead === 0) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Drift is not a conflict, and this loop already prints the
|
|
106
|
+
// report the operator is watching. No external delivery.
|
|
107
|
+
console.log(renderFetchPollDrift({ branch, drift: result }));
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
111
|
+
console.warn(`⚠️ [FETCH-POLL] ${message}`);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
inFlight = false;
|
|
115
|
+
}
|
|
116
|
+
})();
|
|
117
|
+
}, intervalMs);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
121
|
+
console.warn(`⚠️ [FETCH-POLL] ${message}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export const watchCommand = new Command('watch')
|
|
125
|
+
.description('🕷️ Watch files and auto-register changes (daemon mode)')
|
|
126
|
+
.argument('[directory]', 'Directory to watch (default: current repo)')
|
|
127
|
+
.option('-d, --dir <directory>', 'Directory to watch (alias for positional arg)')
|
|
128
|
+
.option('--paths <paths>', 'Comma-separated list of files or folders to watch')
|
|
129
|
+
.option('--root <root>', 'Project root for relative paths (default: git root)')
|
|
130
|
+
.option('-a, --agent <agent>', 'Agent identifier for registration')
|
|
131
|
+
.option('-q, --quiet', 'Only log conflicts, not file changes')
|
|
132
|
+
.option('--fetch-poll [seconds]', 'Poll git ls-remote origin every N seconds (default: 60)')
|
|
133
|
+
.option('--legacy', 'Legacy mode: use old watcher settings (more file descriptors)')
|
|
134
|
+
.action(async (directory, options) => {
|
|
135
|
+
const storage = await getStorage();
|
|
136
|
+
const config = await loadConfig();
|
|
137
|
+
if (!await storage.isInitialized()) {
|
|
138
|
+
console.error('❌ Spidersan not initialized. Run: spidersan init');
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
const branch = getCurrentBranch();
|
|
142
|
+
const repoRoot = options.root || getRepoRoot();
|
|
143
|
+
const watchTargets = options.paths
|
|
144
|
+
? parsePaths(options.paths).map((entry) => path.isAbsolute(entry) ? entry : path.join(repoRoot, entry))
|
|
145
|
+
: [directory || options.dir || repoRoot];
|
|
146
|
+
const configuredAgent = config.agent.name?.trim();
|
|
147
|
+
const agent = options.agent || process.env.SPIDERSAN_AGENT || configuredAgent || 'unknown';
|
|
148
|
+
const watchLabel = watchTargets.length === 1 ? watchTargets[0] : `${watchTargets.length} paths`;
|
|
149
|
+
console.log(`
|
|
150
|
+
🕷️ SPIDERSAN WATCH MODE
|
|
151
|
+
━━━━━━━━━━━━━━━━━━━━━━━
|
|
152
|
+
Branch: ${branch}
|
|
153
|
+
Agent: ${agent}
|
|
154
|
+
Root: ${repoRoot}
|
|
155
|
+
Watching: ${watchLabel}
|
|
156
|
+
━━━━━━━━━━━━━━━━━━━━━━━
|
|
157
|
+
Press Ctrl+C to stop.
|
|
158
|
+
`);
|
|
159
|
+
// Track recently changed files for debouncing
|
|
160
|
+
const pendingFiles = new Set();
|
|
161
|
+
let debounceTimer = null;
|
|
162
|
+
// Process accumulated file changes
|
|
163
|
+
async function processChanges() {
|
|
164
|
+
if (pendingFiles.size === 0)
|
|
165
|
+
return;
|
|
166
|
+
const files = Array.from(pendingFiles);
|
|
167
|
+
pendingFiles.clear();
|
|
168
|
+
// Register files
|
|
169
|
+
const existing = await storage.get(branch);
|
|
170
|
+
// ponytail: capture the pre-write agent/files — storage.update below
|
|
171
|
+
// overwrites them with ours, so this is the only chance to see who else was
|
|
172
|
+
// just here.
|
|
173
|
+
const previousAgent = existing?.agent;
|
|
174
|
+
const previousFiles = existing?.files ?? [];
|
|
175
|
+
const allFiles = existing
|
|
176
|
+
? [...new Set([...existing.files, ...files])]
|
|
177
|
+
: files;
|
|
178
|
+
if (existing) {
|
|
179
|
+
await storage.update(branch, { files: allFiles, agent });
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
await storage.register({
|
|
183
|
+
name: branch,
|
|
184
|
+
files: allFiles,
|
|
185
|
+
status: 'active',
|
|
186
|
+
agent,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (!options.quiet) {
|
|
190
|
+
console.log(`📝 Registered: ${files.join(', ')}`);
|
|
191
|
+
}
|
|
192
|
+
// Check for conflicts
|
|
193
|
+
const allBranches = await storage.list();
|
|
194
|
+
const conflicts = [];
|
|
195
|
+
// Performance Optimization: Convert changed files to Set for O(1) lookup
|
|
196
|
+
const filesSet = new Set(files);
|
|
197
|
+
// Same-branch conflict: another agent's edits to the same file(s) on this
|
|
198
|
+
// branch, still visible only because we grabbed `existing` before overwriting it.
|
|
199
|
+
if (previousAgent && previousAgent !== agent) {
|
|
200
|
+
const sameBranchOverlap = previousFiles.filter(f => filesSet.has(f));
|
|
201
|
+
if (sameBranchOverlap.length > 0) {
|
|
202
|
+
conflicts.push({ branch: `${branch} (agent: ${previousAgent})`, files: sameBranchOverlap });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
for (const otherBranch of allBranches) {
|
|
206
|
+
if (otherBranch.name === branch || otherBranch.status !== 'active')
|
|
207
|
+
continue;
|
|
208
|
+
const overlapping = otherBranch.files.filter(f => filesSet.has(f));
|
|
209
|
+
if (overlapping.length > 0) {
|
|
210
|
+
conflicts.push({ branch: otherBranch.name, files: overlapping });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (conflicts.length > 0) {
|
|
214
|
+
console.log(`\n⚠️ CONFLICT DETECTED!`);
|
|
215
|
+
conflicts.forEach(c => {
|
|
216
|
+
console.log(` 🔴 ${c.branch}: ${c.files.join(', ')}`);
|
|
217
|
+
});
|
|
218
|
+
console.log('');
|
|
219
|
+
// Second consumer of the sp-8iqm delivery seam. `deliver` is the
|
|
220
|
+
// only thing that reports an outcome, and only after inspecting
|
|
221
|
+
// it — there is no unconditional "posted" line here any more.
|
|
222
|
+
const contested = [...new Set(conflicts.flatMap(c => c.files))].sort();
|
|
223
|
+
await deliver(notifier(), {
|
|
224
|
+
repo: getRepoName(),
|
|
225
|
+
branch,
|
|
226
|
+
tier: Math.max(...contested.map(f => classifyTier(f))),
|
|
227
|
+
message: formatConflictChatMessage(branch, conflicts),
|
|
228
|
+
// Deterministic facts only: same branch contesting the same
|
|
229
|
+
// files is the same event, however the message is worded.
|
|
230
|
+
dedupe: `watch:${branch}:${contested.join(',')}`,
|
|
231
|
+
agent,
|
|
232
|
+
files: contested,
|
|
233
|
+
}, (m) => console.log(m));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Build extended ignore patterns for smart mode
|
|
237
|
+
const smartIgnores = [
|
|
238
|
+
'**/.next/**', '**/build/**', '**/out/**', '**/coverage/**',
|
|
239
|
+
'**/.cache/**', '**/__pycache__/**', '**/target/**',
|
|
240
|
+
'**/vendor/**', '**/bower_components/**', '**/.pnpm/**',
|
|
241
|
+
'**/.idea/**', '**/.vscode/**', '**/*.swp', '**/*.swo',
|
|
242
|
+
'**/.DS_Store', '**/Thumbs.db',
|
|
243
|
+
'**/package-lock.json', '**/yarn.lock', '**/pnpm-lock.yaml',
|
|
244
|
+
'**/*.png', '**/*.jpg', '**/*.jpeg', '**/*.gif', '**/*.ico',
|
|
245
|
+
'**/*.woff', '**/*.woff2', '**/*.ttf', '**/*.pdf',
|
|
246
|
+
];
|
|
247
|
+
if (options.legacy) {
|
|
248
|
+
console.log('⚠️ Legacy mode: Using old watcher settings (more file descriptors)');
|
|
249
|
+
}
|
|
250
|
+
// Start watching
|
|
251
|
+
// SECURITY FIX: Always limit depth to prevent EMFILE errors (Sherlock 2026-01-02)
|
|
252
|
+
const watcher = chokidar.watch(watchTargets, {
|
|
253
|
+
ignored: !options.legacy ? [
|
|
254
|
+
...smartIgnores,
|
|
255
|
+
/(^|[/\\])\../, // dotfiles
|
|
256
|
+
'**/node_modules/**',
|
|
257
|
+
'**/dist/**',
|
|
258
|
+
'**/*.log',
|
|
259
|
+
'**/.git/**', // ALWAYS ignore .git
|
|
260
|
+
] : [
|
|
261
|
+
/(^|[/\\])\../, // dotfiles (ALWAYS ignore)
|
|
262
|
+
'**/node_modules/**',
|
|
263
|
+
'**/dist/**',
|
|
264
|
+
'**/*.log',
|
|
265
|
+
'**/.git/**', // ALWAYS ignore .git
|
|
266
|
+
],
|
|
267
|
+
persistent: true,
|
|
268
|
+
ignoreInitial: true,
|
|
269
|
+
awaitWriteFinish: {
|
|
270
|
+
stabilityThreshold: 500,
|
|
271
|
+
pollInterval: 100
|
|
272
|
+
},
|
|
273
|
+
// ALWAYS limit depth to prevent EMFILE (default: 5, legacy: 10)
|
|
274
|
+
depth: !options.legacy ? 5 : 10,
|
|
275
|
+
// ponytail: no usePolling. It was added to dodge EMFILE, but on macOS
|
|
276
|
+
// chokidar uses FSEvents — one kernel watch for the whole tree, so there
|
|
277
|
+
// were never fds to run out of. Polling cost 37% of a core forever
|
|
278
|
+
// (stat'ing ~10k files/sec on a 2.1G repo). Set CHOKIDAR_USEPOLLING=1 if a
|
|
279
|
+
// network mount or a Linux box with a low inotify limit ever needs it.
|
|
280
|
+
});
|
|
281
|
+
watcher.on('change', (filePath) => {
|
|
282
|
+
const relativePath = path.relative(repoRoot, filePath);
|
|
283
|
+
pendingFiles.add(relativePath);
|
|
284
|
+
// Debounce: wait for more changes before processing
|
|
285
|
+
if (debounceTimer)
|
|
286
|
+
clearTimeout(debounceTimer);
|
|
287
|
+
debounceTimer = setTimeout(processChanges, DEBOUNCE_MS);
|
|
288
|
+
});
|
|
289
|
+
watcher.on('add', (filePath) => {
|
|
290
|
+
const relativePath = path.relative(repoRoot, filePath);
|
|
291
|
+
pendingFiles.add(relativePath);
|
|
292
|
+
if (debounceTimer)
|
|
293
|
+
clearTimeout(debounceTimer);
|
|
294
|
+
debounceTimer = setTimeout(processChanges, DEBOUNCE_MS);
|
|
295
|
+
});
|
|
296
|
+
watcher.on('error', (err) => {
|
|
297
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
298
|
+
console.error(`❌ Watcher error: ${errorMsg}`);
|
|
299
|
+
});
|
|
300
|
+
if (options.fetchPoll) {
|
|
301
|
+
const parsedSecs = typeof options.fetchPoll === 'string'
|
|
302
|
+
? Number.parseInt(options.fetchPoll, 10)
|
|
303
|
+
: Number.NaN;
|
|
304
|
+
const intervalSecs = Number.isFinite(parsedSecs) && parsedSecs > 0 ? parsedSecs : 60;
|
|
305
|
+
void startFetchPollLoop({
|
|
306
|
+
intervalSecs,
|
|
307
|
+
quiet: !!options.quiet,
|
|
308
|
+
repoDir: repoRoot,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
// Handle graceful shutdown
|
|
312
|
+
process.on('SIGINT', () => {
|
|
313
|
+
console.log('\n🕷️ Watch mode stopped.');
|
|
314
|
+
watcher.close();
|
|
315
|
+
process.exit(0);
|
|
316
|
+
});
|
|
317
|
+
process.on('SIGTERM', () => {
|
|
318
|
+
watcher.close();
|
|
319
|
+
process.exit(0);
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
// ── Mode 1: Treetop Observer ──────────────────────────────────────────────────
|
|
323
|
+
/**
|
|
324
|
+
* Default ecosystem repos to watch. Override with --repos flag or
|
|
325
|
+
* SPIDERSAN_REPOS env var (colon-separated paths).
|
|
326
|
+
*/
|
|
327
|
+
function getDefaultTreetopRepos() {
|
|
328
|
+
if (process.env.SPIDERSAN_REPOS) {
|
|
329
|
+
return process.env.SPIDERSAN_REPOS.split(':').map((r) => r.trim()).filter(Boolean);
|
|
330
|
+
}
|
|
331
|
+
const homeDir = process.env.HOME || homedir();
|
|
332
|
+
return [
|
|
333
|
+
`${homeDir}/Dev/Envoak`,
|
|
334
|
+
`${homeDir}/Dev/treebird-internal`,
|
|
335
|
+
`${homeDir}/Dev/spidersan`,
|
|
336
|
+
`${homeDir}/Dev/Toak`,
|
|
337
|
+
`${homeDir}/Dev/flockview`,
|
|
338
|
+
`${homeDir}/Dev/mappersan`,
|
|
339
|
+
];
|
|
340
|
+
}
|
|
341
|
+
const DEFAULT_TREETOP_REPOS = getDefaultTreetopRepos();
|
|
342
|
+
/**
|
|
343
|
+
* Run one full observer tick: SYNC → SCAN → TEND → SURFACE.
|
|
344
|
+
* Returns tier counts and idle status for adaptive sleep calculation.
|
|
345
|
+
*/
|
|
346
|
+
async function runObserverTick(repos, dryRun, broadcastedConflicts) {
|
|
347
|
+
let totalTier3 = 0;
|
|
348
|
+
let totalTier2 = 0;
|
|
349
|
+
let totalBranches = 0;
|
|
350
|
+
const tier3Alerts = [];
|
|
351
|
+
// ── STEP 1: SYNC ──────────────────────────────────────────────────────────
|
|
352
|
+
// Pull colony gradient into local registry per repo.
|
|
353
|
+
for (const repo of repos) {
|
|
354
|
+
try {
|
|
355
|
+
process.chdir(repo);
|
|
356
|
+
await syncFromColony();
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
// Repo not initialized or colony unreachable — continue
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// ── STEP 2: SCAN ─────────────────────────────────────────────────────────
|
|
363
|
+
// Detect conflicts in each repo. spawnSync captures output even on exit 1.
|
|
364
|
+
for (const repo of repos) {
|
|
365
|
+
try {
|
|
366
|
+
const result = spawnSync(process.execPath, [getCLIPath(), 'conflicts', '--json'], {
|
|
367
|
+
cwd: repo,
|
|
368
|
+
encoding: 'utf-8',
|
|
369
|
+
timeout: 15000,
|
|
370
|
+
});
|
|
371
|
+
if (result.stdout) {
|
|
372
|
+
const data = JSON.parse(result.stdout);
|
|
373
|
+
const summary = data.summary ?? { tier3: 0, tier2: 0, tier1: 0 };
|
|
374
|
+
totalTier3 += summary.tier3 ?? 0;
|
|
375
|
+
totalTier2 += summary.tier2 ?? 0;
|
|
376
|
+
// Count active branches via conflicts (each conflict references another branch)
|
|
377
|
+
const otherBranches = new Set(data.conflicts?.map((c) => c.branch).filter(Boolean) ?? []);
|
|
378
|
+
totalBranches += otherBranches.size;
|
|
379
|
+
if ((summary.tier3 ?? 0) > 0) {
|
|
380
|
+
const files = data.conflicts
|
|
381
|
+
.filter((c) => c.tier === 3)
|
|
382
|
+
.flatMap((c) => c.files ?? [])
|
|
383
|
+
.slice(0, 3);
|
|
384
|
+
tier3Alerts.push({ repo, files });
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
catch {
|
|
389
|
+
// Repo not initialized or spidersan unavailable — skip
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// ── STEP 3: TEND ─────────────────────────────────────────────────────────
|
|
393
|
+
// Colony GC (non-critical — always continue on failure).
|
|
394
|
+
try {
|
|
395
|
+
spawnSync('envoak', ['colony', 'gc'], { encoding: 'utf-8', timeout: 10000 });
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
/* ignore */
|
|
399
|
+
}
|
|
400
|
+
// Stale check per repo (informational — no --auto-cleanup yet).
|
|
401
|
+
for (const repo of repos) {
|
|
402
|
+
try {
|
|
403
|
+
spawnSync(process.execPath, [getCLIPath(), 'stale'], {
|
|
404
|
+
cwd: repo,
|
|
405
|
+
encoding: 'utf-8',
|
|
406
|
+
timeout: 10000,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
/* ignore */
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// ── STEP 4: SURFACE ───────────────────────────────────────────────────────
|
|
414
|
+
// Broadcast TIER 3 alerts (deduplicated). Clear resolved conflicts.
|
|
415
|
+
const currentKeys = new Set(tier3Alerts.map((a) => `${a.repo}:${a.files.join(',')}`));
|
|
416
|
+
for (const alert of tier3Alerts) {
|
|
417
|
+
const key = `${alert.repo}:${alert.files.join(',')}`;
|
|
418
|
+
if (!broadcastedConflicts.has(key)) {
|
|
419
|
+
broadcastedConflicts.add(key);
|
|
420
|
+
const repoName = path.basename(alert.repo);
|
|
421
|
+
const filesStr = alert.files.length > 0 ? alert.files.join(', ') : 'multiple files';
|
|
422
|
+
const message = `spidersan TIER 3: conflict in ${repoName} — ${filesStr}. Halt writes on affected files.`;
|
|
423
|
+
if (dryRun) {
|
|
424
|
+
console.log(`[DRY-RUN] Would broadcast TIER 3 alert: ${message}`);
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
const r = spawnSync('envoak', ['colony', 'broadcast', '--type', 'alert', '--message', message], { encoding: 'utf-8', timeout: 10000 });
|
|
428
|
+
if (r.status === 0) {
|
|
429
|
+
console.log(`[TIER 3] Broadcast: ${message}`);
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
console.error(`[TIER 3] Broadcast failed: ${r.stderr ?? r.stdout}`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// Evict resolved conflicts from dedup set
|
|
438
|
+
for (const key of broadcastedConflicts) {
|
|
439
|
+
if (!currentKeys.has(key)) {
|
|
440
|
+
broadcastedConflicts.delete(key);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
const allIdle = totalTier3 === 0 && totalTier2 === 0 && totalBranches === 0;
|
|
444
|
+
// Emit treetop heartbeat (skipped in dry-run)
|
|
445
|
+
const summary = `Watching ${repos.length} repos, ${totalBranches} active branches. ` +
|
|
446
|
+
`T3:${totalTier3} T2:${totalTier2}. GC run. Stale checked.`;
|
|
447
|
+
console.log(`[TICK] ${new Date().toISOString()} — ${summary}`);
|
|
448
|
+
if (!dryRun) {
|
|
449
|
+
spawnSync('envoak', ['colony', 'signal', '--status', 'idle', '--task', 'treetop watch', '--summary', summary], { encoding: 'utf-8', timeout: 10000 });
|
|
450
|
+
}
|
|
451
|
+
return { tier3: totalTier3, tier2: totalTier2, repoCount: repos.length, branchCount: totalBranches, allIdle };
|
|
452
|
+
}
|
|
453
|
+
function resolveRepos(reposOption) {
|
|
454
|
+
if (reposOption) {
|
|
455
|
+
return reposOption.split(',').map((r) => r.trim()).filter(Boolean);
|
|
456
|
+
}
|
|
457
|
+
const envRepos = process.env['SPIDERSAN_REPOS'];
|
|
458
|
+
if (envRepos) {
|
|
459
|
+
return envRepos.split(':').map((r) => r.trim()).filter(Boolean);
|
|
460
|
+
}
|
|
461
|
+
return DEFAULT_TREETOP_REPOS;
|
|
462
|
+
}
|
|
463
|
+
function adaptiveInterval(result, baseMs) {
|
|
464
|
+
if (result.tier3 > 0)
|
|
465
|
+
return 15_000; // Stay alert
|
|
466
|
+
if (result.tier2 > 0)
|
|
467
|
+
return 30_000; // Watch closely
|
|
468
|
+
if (result.allIdle)
|
|
469
|
+
return 300_000; // Colony quiet — back off
|
|
470
|
+
return baseMs;
|
|
471
|
+
}
|
|
472
|
+
const watchTreetopCommand = new Command('treetop')
|
|
473
|
+
.description('Mode 1: treetop observer — periodic multi-repo conflict scan + colony gradient sync')
|
|
474
|
+
.option('--interval <seconds>', 'Base tick interval in seconds (default: 120)', '120')
|
|
475
|
+
.option('--repos <paths>', 'Comma-separated repo paths (overrides ecosystem defaults)')
|
|
476
|
+
.option('--dry-run', 'Run one tick and exit — no sleep, no colony writes')
|
|
477
|
+
.action(async (options) => {
|
|
478
|
+
const repos = resolveRepos(options.repos);
|
|
479
|
+
const baseMs = parseInt(options.interval, 10) * 1000;
|
|
480
|
+
const dryRun = options.dryRun ?? false;
|
|
481
|
+
console.log(`
|
|
482
|
+
🕷️ SPIDERSAN TREETOP OBSERVER (Mode 1)
|
|
483
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
484
|
+
Repos: ${repos.length} (${repos.map((r) => path.basename(r)).join(', ')})
|
|
485
|
+
Interval: ${options.interval}s base (adaptive)
|
|
486
|
+
Dry-run: ${dryRun}
|
|
487
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
488
|
+
${dryRun ? 'Running one tick then exiting.' : 'Press Ctrl+C to stop.'}
|
|
489
|
+
`);
|
|
490
|
+
const broadcastedConflicts = new Set();
|
|
491
|
+
if (dryRun) {
|
|
492
|
+
await runObserverTick(repos, true, broadcastedConflicts);
|
|
493
|
+
console.log('[DRY-RUN] Tick complete. Exiting.');
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
// Graceful shutdown
|
|
497
|
+
let running = true;
|
|
498
|
+
process.on('SIGINT', () => { running = false; console.log('\n🕷️ Treetop observer stopped.'); process.exit(0); });
|
|
499
|
+
process.on('SIGTERM', () => { running = false; process.exit(0); });
|
|
500
|
+
while (running) {
|
|
501
|
+
const result = await runObserverTick(repos, false, broadcastedConflicts);
|
|
502
|
+
const nextMs = adaptiveInterval(result, baseMs);
|
|
503
|
+
console.log(`[SLEEP] Next tick in ${nextMs / 1000}s`);
|
|
504
|
+
await new Promise((resolve) => setTimeout(resolve, nextMs));
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
// Attach Mode 1 as a subcommand of watch
|
|
508
|
+
watchCommand.addCommand(watchTreetopCommand);
|
|
509
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
|