spidersan 0.4.3 → 0.5.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.
Files changed (172) hide show
  1. package/CHANGELOG.md +124 -0
  2. package/README.md +95 -23
  3. package/dist/bin/spidersan.d.ts.map +1 -1
  4. package/dist/bin/spidersan.js +22 -2
  5. package/dist/bin/spidersan.js.map +1 -1
  6. package/dist/commands/abandon.d.ts.map +1 -1
  7. package/dist/commands/abandon.js +4 -2
  8. package/dist/commands/abandon.js.map +1 -1
  9. package/dist/commands/auto.js +6 -6
  10. package/dist/commands/auto.js.map +1 -1
  11. package/dist/commands/cleanup.d.ts.map +1 -1
  12. package/dist/commands/cleanup.js +3 -8
  13. package/dist/commands/cleanup.js.map +1 -1
  14. package/dist/commands/config.d.ts +7 -0
  15. package/dist/commands/config.d.ts.map +1 -1
  16. package/dist/commands/config.js +12 -0
  17. package/dist/commands/config.js.map +1 -1
  18. package/dist/commands/conflicts.d.ts.map +1 -1
  19. package/dist/commands/conflicts.js +238 -34
  20. package/dist/commands/conflicts.js.map +1 -1
  21. package/dist/commands/cross-conflicts.d.ts +17 -0
  22. package/dist/commands/cross-conflicts.d.ts.map +1 -0
  23. package/dist/commands/cross-conflicts.js +305 -0
  24. package/dist/commands/cross-conflicts.js.map +1 -0
  25. package/dist/commands/daily.d.ts +7 -0
  26. package/dist/commands/daily.d.ts.map +1 -0
  27. package/dist/commands/daily.js +171 -0
  28. package/dist/commands/daily.js.map +1 -0
  29. package/dist/commands/dashboard.d.ts +22 -0
  30. package/dist/commands/dashboard.d.ts.map +1 -0
  31. package/dist/commands/dashboard.js +401 -0
  32. package/dist/commands/dashboard.js.map +1 -0
  33. package/dist/commands/depends.js +2 -2
  34. package/dist/commands/depends.js.map +1 -1
  35. package/dist/commands/doctor.d.ts +22 -0
  36. package/dist/commands/doctor.d.ts.map +1 -1
  37. package/dist/commands/doctor.js +215 -14
  38. package/dist/commands/doctor.js.map +1 -1
  39. package/dist/commands/github-sync.d.ts +9 -0
  40. package/dist/commands/github-sync.d.ts.map +1 -0
  41. package/dist/commands/github-sync.js +180 -0
  42. package/dist/commands/github-sync.js.map +1 -0
  43. package/dist/commands/index.d.ts +11 -0
  44. package/dist/commands/index.d.ts.map +1 -1
  45. package/dist/commands/index.js +17 -0
  46. package/dist/commands/index.js.map +1 -1
  47. package/dist/commands/log.d.ts +3 -4
  48. package/dist/commands/log.d.ts.map +1 -1
  49. package/dist/commands/log.js +102 -87
  50. package/dist/commands/log.js.map +1 -1
  51. package/dist/commands/merge-order.js +8 -1
  52. package/dist/commands/merge-order.js.map +1 -1
  53. package/dist/commands/merged.d.ts.map +1 -1
  54. package/dist/commands/merged.js +4 -2
  55. package/dist/commands/merged.js.map +1 -1
  56. package/dist/commands/pulse.d.ts +6 -2
  57. package/dist/commands/pulse.d.ts.map +1 -1
  58. package/dist/commands/pulse.js +152 -202
  59. package/dist/commands/pulse.js.map +1 -1
  60. package/dist/commands/queen.d.ts +25 -0
  61. package/dist/commands/queen.d.ts.map +1 -0
  62. package/dist/commands/queen.js +309 -0
  63. package/dist/commands/queen.js.map +1 -0
  64. package/dist/commands/ready-check.d.ts +1 -0
  65. package/dist/commands/ready-check.d.ts.map +1 -1
  66. package/dist/commands/ready-check.js +43 -28
  67. package/dist/commands/ready-check.js.map +1 -1
  68. package/dist/commands/rebase-helper.d.ts +3 -0
  69. package/dist/commands/rebase-helper.d.ts.map +1 -0
  70. package/dist/commands/rebase-helper.js +52 -0
  71. package/dist/commands/rebase-helper.js.map +1 -0
  72. package/dist/commands/register.d.ts +2 -0
  73. package/dist/commands/register.d.ts.map +1 -1
  74. package/dist/commands/register.js +66 -10
  75. package/dist/commands/register.js.map +1 -1
  76. package/dist/commands/registry-sync.d.ts +9 -0
  77. package/dist/commands/registry-sync.d.ts.map +1 -0
  78. package/dist/commands/registry-sync.js +163 -0
  79. package/dist/commands/registry-sync.js.map +1 -0
  80. package/dist/commands/rescue.d.ts.map +1 -1
  81. package/dist/commands/rescue.js +69 -12
  82. package/dist/commands/rescue.js.map +1 -1
  83. package/dist/commands/stale.d.ts +16 -0
  84. package/dist/commands/stale.d.ts.map +1 -1
  85. package/dist/commands/stale.js +55 -21
  86. package/dist/commands/stale.js.map +1 -1
  87. package/dist/commands/sync-advisor.d.ts +14 -0
  88. package/dist/commands/sync-advisor.d.ts.map +1 -0
  89. package/dist/commands/sync-advisor.js +110 -0
  90. package/dist/commands/sync-advisor.js.map +1 -0
  91. package/dist/commands/sync.d.ts.map +1 -1
  92. package/dist/commands/sync.js +16 -5
  93. package/dist/commands/sync.js.map +1 -1
  94. package/dist/commands/torrent.d.ts.map +1 -1
  95. package/dist/commands/torrent.js +45 -22
  96. package/dist/commands/torrent.js.map +1 -1
  97. package/dist/commands/watch.d.ts.map +1 -1
  98. package/dist/commands/watch.js +198 -7
  99. package/dist/commands/watch.js.map +1 -1
  100. package/dist/lib/activity.d.ts +53 -0
  101. package/dist/lib/activity.d.ts.map +1 -0
  102. package/dist/lib/activity.js +267 -0
  103. package/dist/lib/activity.js.map +1 -0
  104. package/dist/lib/agent-errors.d.ts.map +1 -1
  105. package/dist/lib/agent-errors.js +3 -1
  106. package/dist/lib/agent-errors.js.map +1 -1
  107. package/dist/lib/ast.d.ts.map +1 -1
  108. package/dist/lib/ast.js +66 -19
  109. package/dist/lib/ast.js.map +1 -1
  110. package/dist/lib/colony-subscriber.d.ts +53 -0
  111. package/dist/lib/colony-subscriber.d.ts.map +1 -0
  112. package/dist/lib/colony-subscriber.js +184 -0
  113. package/dist/lib/colony-subscriber.js.map +1 -0
  114. package/dist/lib/config.d.ts +1 -0
  115. package/dist/lib/config.d.ts.map +1 -1
  116. package/dist/lib/config.js +7 -3
  117. package/dist/lib/config.js.map +1 -1
  118. package/dist/lib/crypto.d.ts.map +1 -1
  119. package/dist/lib/crypto.js +7 -3
  120. package/dist/lib/crypto.js.map +1 -1
  121. package/dist/lib/daily-bridge.d.ts +41 -0
  122. package/dist/lib/daily-bridge.d.ts.map +1 -0
  123. package/dist/lib/daily-bridge.js +185 -0
  124. package/dist/lib/daily-bridge.js.map +1 -0
  125. package/dist/lib/github.d.ts +83 -0
  126. package/dist/lib/github.d.ts.map +1 -0
  127. package/dist/lib/github.js +206 -0
  128. package/dist/lib/github.js.map +1 -0
  129. package/dist/lib/repo-scanner.d.ts +36 -0
  130. package/dist/lib/repo-scanner.d.ts.map +1 -0
  131. package/dist/lib/repo-scanner.js +159 -0
  132. package/dist/lib/repo-scanner.js.map +1 -0
  133. package/dist/lib/salvage-analyzer.d.ts +29 -0
  134. package/dist/lib/salvage-analyzer.d.ts.map +1 -0
  135. package/dist/lib/salvage-analyzer.js +122 -0
  136. package/dist/lib/salvage-analyzer.js.map +1 -0
  137. package/dist/lib/security.d.ts +15 -8
  138. package/dist/lib/security.d.ts.map +1 -1
  139. package/dist/lib/security.js +36 -1
  140. package/dist/lib/security.js.map +1 -1
  141. package/dist/lib/symbol-extractor.d.ts +41 -0
  142. package/dist/lib/symbol-extractor.d.ts.map +1 -0
  143. package/dist/lib/symbol-extractor.js +78 -0
  144. package/dist/lib/symbol-extractor.js.map +1 -0
  145. package/dist/storage/adapter.d.ts +1 -1
  146. package/dist/storage/adapter.d.ts.map +1 -1
  147. package/dist/storage/git-messages.d.ts.map +1 -1
  148. package/dist/storage/git-messages.js +57 -53
  149. package/dist/storage/git-messages.js.map +1 -1
  150. package/dist/storage/local.d.ts +1 -1
  151. package/dist/storage/local.d.ts.map +1 -1
  152. package/dist/storage/local.js +7 -5
  153. package/dist/storage/local.js.map +1 -1
  154. package/dist/storage/mycmail-adapter.d.ts.map +1 -1
  155. package/dist/storage/mycmail-adapter.js +11 -6
  156. package/dist/storage/mycmail-adapter.js.map +1 -1
  157. package/dist/storage/supabase.d.ts +21 -1
  158. package/dist/storage/supabase.d.ts.map +1 -1
  159. package/dist/storage/supabase.js +171 -6
  160. package/dist/storage/supabase.js.map +1 -1
  161. package/dist/tui/dashboard.d.ts.map +1 -1
  162. package/dist/tui/dashboard.js +15 -6
  163. package/dist/tui/dashboard.js.map +1 -1
  164. package/dist/types/cloud.d.ts +101 -0
  165. package/dist/types/cloud.d.ts.map +1 -0
  166. package/dist/types/cloud.js +13 -0
  167. package/dist/types/cloud.js.map +1 -0
  168. package/package.json +9 -6
  169. package/dist/commands/sync-all.d.ts +0 -9
  170. package/dist/commands/sync-all.d.ts.map +0 -1
  171. package/dist/commands/sync-all.js +0 -180
  172. package/dist/commands/sync-all.js.map +0 -1
@@ -0,0 +1,309 @@
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
+ import { spawnSync } from 'child_process';
25
+ import * as path from 'path';
26
+ import * as os from 'os';
27
+ import { writeFileSync } from 'fs';
28
+ // ── Helpers ───────────────────────────────────────────────────────────────────
29
+ function resolveRepos(reposOption) {
30
+ if (reposOption) {
31
+ return reposOption.split(',').map((r) => r.trim()).filter(Boolean);
32
+ }
33
+ const envRepos = process.env['SPIDERSAN_REPOS'];
34
+ if (envRepos) {
35
+ return envRepos.split(':').map((r) => r.trim()).filter(Boolean);
36
+ }
37
+ const homeDir = process.env.HOME || os.homedir();
38
+ return [
39
+ `${homeDir}/Dev/Envoak`,
40
+ `${homeDir}/Dev/treebird-internal`,
41
+ `${homeDir}/Dev/spidersan`,
42
+ `${homeDir}/Dev/Toak`,
43
+ `${homeDir}/Dev/flockview`,
44
+ `${homeDir}/Dev/mappersan`,
45
+ ];
46
+ }
47
+ /**
48
+ * Emit a queen colony signal and return its ID.
49
+ * Returns null on failure (envoak not available / vault expired).
50
+ */
51
+ function emitQueenSignal(task, repos) {
52
+ const summary = `Queen Spider dispatching ${repos.length} ground job(s): ` +
53
+ repos.map((r) => path.basename(r)).join(', ');
54
+ const result = spawnSync('envoak', [
55
+ 'colony', 'signal',
56
+ '--status', 'in-progress',
57
+ '--task', task,
58
+ '--summary', summary,
59
+ ], { encoding: 'utf-8', timeout: 15000 });
60
+ if (result.status !== 0) {
61
+ console.error(`[QUEEN] Failed to emit colony signal: ${result.stderr ?? result.stdout}`);
62
+ return null;
63
+ }
64
+ // Parse signal ID directly from "Signal emitted (id: UUID)" in stdout
65
+ const match = (result.stdout ?? '').match(/Signal emitted \(id:\s*([\w-]+)\)/);
66
+ if (match?.[1])
67
+ return match[1];
68
+ // Fallback: query the colony gradient for the latest in-progress signal with this task
69
+ try {
70
+ const statusResult = spawnSync('envoak', ['colony', 'status', '--json'], { encoding: 'utf-8', timeout: 10000 });
71
+ if (statusResult.stdout) {
72
+ const data = JSON.parse(statusResult.stdout);
73
+ const gradient = data.signals ?? data.gradient ?? [];
74
+ const latest = gradient.find((s) => s.task === task && s.status === 'in-progress');
75
+ if (latest)
76
+ return latest.id;
77
+ }
78
+ }
79
+ catch {
80
+ /* ignore — signal was emitted, ID lookup failed */
81
+ }
82
+ return null;
83
+ }
84
+ /**
85
+ * Build the ground job script for a sub-spidersan.
86
+ * Returns the shell script string to be printed or written to a file.
87
+ */
88
+ function buildGroundJobScript(repo, task, jobType, queenSignalId) {
89
+ const repoName = path.basename(repo);
90
+ const priorFlag = queenSignalId
91
+ ? `\n --prior-signal-id "${queenSignalId}" \\`
92
+ : '';
93
+ const jobCommands = {
94
+ sync: ` # GROUND JOB: sync
95
+ git pull origin main --rebase 2>&1 | tail -3
96
+ spidersan pulse --quiet`,
97
+ conflicts: ` # GROUND JOB: conflict scan
98
+ spidersan conflicts --json --tier 1 > /tmp/ssan-conflicts-${repoName}.json
99
+ cat /tmp/ssan-conflicts-${repoName}.json | jq '.summary'`,
100
+ cleanup: ` # GROUND JOB: stale cleanup
101
+ spidersan stale
102
+ envoak colony gc`,
103
+ custom: ` # GROUND JOB: custom — replace this with your commands
104
+ echo "Custom job in ${repoName}"`,
105
+ };
106
+ return `#!/usr/bin/env bash
107
+ # Sub-spidersan ground job: ${task} in ${repoName}
108
+ # Queen signal: ${queenSignalId ?? '(unknown)'}
109
+ # Generated by: spidersan queen spawn
110
+ # Fire-complete-dissolve pattern — run, emit result, exit.
111
+
112
+ set -euo pipefail
113
+
114
+ REPO="${repo}"
115
+ TASK="${task} [${repoName}]"
116
+ QUEEN_SIGNAL_ID="${queenSignalId ?? ''}"
117
+
118
+ cd "$REPO"
119
+
120
+ # ── Enlist ────────────────────────────────────────────────────────────────────
121
+ envoak colony signal \\
122
+ --status in-progress \\
123
+ --task "$TASK" \\
124
+ --summary "Sub-spidersan started in ${repoName}." \\${priorFlag}
125
+ || true # non-fatal if vault expired
126
+
127
+ # ── Ground job ────────────────────────────────────────────────────────────────
128
+ ${jobCommands[jobType]}
129
+ RESULT=$?
130
+
131
+ # ── Dissolve ──────────────────────────────────────────────────────────────────
132
+ if [ $RESULT -eq 0 ]; then
133
+ envoak colony close \\
134
+ --summary "Ground job complete: $TASK — success." \\
135
+ || true
136
+ echo "[SUB-SSAN] ✅ Done: ${repoName}"
137
+ else
138
+ envoak colony signal \\
139
+ --status blocked \\
140
+ --task "$TASK" \\
141
+ --summary "Ground job failed in ${repoName} (exit $RESULT). Queen: ${queenSignalId ?? 'unknown'}." \\
142
+ || true
143
+ envoak colony close --summary "Ground job failed — see blocked signal." || true
144
+ echo "[SUB-SSAN] ❌ Failed: ${repoName} (exit $RESULT)"
145
+ fi
146
+ `;
147
+ }
148
+ // ── Commands ──────────────────────────────────────────────────────────────────
149
+ const queenSpawnCommand = new Command('spawn')
150
+ .description('Dispatch sub-spidersans for parallel ground jobs')
151
+ .requiredOption('-t, --task <description>', 'One-line description of the ground job')
152
+ .option('--type <type>', 'Job type: sync | conflicts | cleanup | custom (default: sync)', 'sync')
153
+ .option('--repos <paths>', 'Comma-separated repo paths (default: ecosystem repos)')
154
+ .option('--key-id <uuid>', 'Agent key ID to include in colony signal')
155
+ .option('--dry-run', 'Print job scripts without emitting colony signals')
156
+ .option('--json', 'Output job manifest as JSON')
157
+ .action(async (options) => {
158
+ const repos = resolveRepos(options.repos);
159
+ const jobType = options.type ?? 'sync';
160
+ const dryRun = options.dryRun ?? false;
161
+ console.log(`
162
+ 🕷️ QUEEN SPIDER — SPAWNING ${repos.length} SUB-SPIDERSAN(S)
163
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
164
+ Task: ${options.task}
165
+ Job type: ${jobType}
166
+ Repos: ${repos.map((r) => path.basename(r)).join(', ')}
167
+ Dry-run: ${dryRun}
168
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
169
+ `);
170
+ // Emit queen signal (skip in dry-run)
171
+ let queenSignalId = null;
172
+ if (!dryRun) {
173
+ queenSignalId = emitQueenSignal(options.task, repos);
174
+ if (queenSignalId) {
175
+ console.log(`[QUEEN] Signal emitted: ${queenSignalId}`);
176
+ }
177
+ else {
178
+ console.warn('[QUEEN] Could not retrieve queen signal ID — sub-spidersans will have no prior_signal_id.');
179
+ }
180
+ }
181
+ else {
182
+ queenSignalId = 'DRY-RUN-QUEEN-SIGNAL';
183
+ }
184
+ // Generate job scripts
185
+ const scriptDir = path.join(os.tmpdir(), `ssan-queen-${Date.now()}`);
186
+ const manifest = [];
187
+ for (const repo of repos) {
188
+ const script = buildGroundJobScript(repo, options.task, jobType, queenSignalId);
189
+ const repoName = path.basename(repo);
190
+ const scriptPath = path.join(scriptDir, `sub-ssan-${repoName}.sh`);
191
+ if (!dryRun) {
192
+ try {
193
+ const { mkdirSync } = await import('fs');
194
+ mkdirSync(scriptDir, { recursive: true });
195
+ writeFileSync(scriptPath, script, { mode: 0o755 });
196
+ }
197
+ catch {
198
+ /* non-fatal */
199
+ }
200
+ }
201
+ manifest.push({ repo, script: scriptPath, queenSignalId });
202
+ console.log(`\n── Sub-spidersan: ${repoName} ──`);
203
+ if (dryRun) {
204
+ console.log(script);
205
+ }
206
+ else {
207
+ console.log(` Script: ${scriptPath}`);
208
+ console.log(` Run: bash "${scriptPath}"`);
209
+ }
210
+ }
211
+ if (!dryRun && manifest.length > 0) {
212
+ console.log(`
213
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
214
+ [QUEEN] ${repos.length} job script(s) written to ${scriptDir}
215
+ [QUEEN] Run all in parallel:
216
+
217
+ for f in ${scriptDir}/sub-ssan-*.sh; do bash "$f" & done; wait
218
+
219
+ [QUEEN] Monitor via: spidersan queen status --queen-signal-id ${queenSignalId ?? '<id>'}
220
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
221
+ }
222
+ if (options.json) {
223
+ console.log(JSON.stringify({ queenSignalId, repos, jobType, task: options.task, scripts: manifest.map((m) => m.script) }, null, 2));
224
+ }
225
+ });
226
+ const queenStatusCommand = new Command('status')
227
+ .description('Show active sub-spidersans spawned by this queen signal')
228
+ .option('--queen-signal-id <id>', 'Queen signal ID to filter by (reads colony gradient)')
229
+ .option('--json', 'Output as JSON')
230
+ .action(async (options) => {
231
+ const result = spawnSync('envoak', ['colony', 'status', '--json'], { encoding: 'utf-8', timeout: 10000 });
232
+ if (result.status !== 0 || !result.stdout) {
233
+ console.error('[QUEEN] Failed to read colony gradient');
234
+ process.exit(1);
235
+ }
236
+ let data = {};
237
+ try {
238
+ const parsed = JSON.parse(result.stdout);
239
+ data = parsed;
240
+ }
241
+ catch {
242
+ console.error('[QUEEN] Failed to parse colony gradient JSON');
243
+ process.exit(1);
244
+ }
245
+ // Filter to sub-spidersans: signals where payload.spawned_by matches queen signal ID
246
+ const gradient = data.signals ?? data.gradient ?? [];
247
+ const subs = gradient.filter((s) => {
248
+ if (!options.queenSignalId) {
249
+ // No filter — show all signals with a spawned_by field
250
+ return s.payload && typeof s.payload === 'object' && 'spawned_by' in s.payload;
251
+ }
252
+ return (s.payload &&
253
+ typeof s.payload === 'object' &&
254
+ s.payload['spawned_by'] === options.queenSignalId);
255
+ });
256
+ if (options.json) {
257
+ console.log(JSON.stringify({ queenSignalId: options.queenSignalId ?? null, subs }, null, 2));
258
+ return;
259
+ }
260
+ console.log(`
261
+ 🕷️ QUEEN STATUS${options.queenSignalId ? ` (queen: ${options.queenSignalId.slice(0, 8)})` : ''}
262
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
263
+ Active sub-spidersans: ${subs.length}
264
+ `);
265
+ if (subs.length === 0) {
266
+ console.log(' No active sub-spidersans found.');
267
+ console.log(' (Sub-spidersans dissolve after completing their ground job.)');
268
+ return;
269
+ }
270
+ for (const sub of subs) {
271
+ const staleFlag = sub.isStale ? ' ⚠️ STALE' : '';
272
+ console.log(` ${sub.status.padEnd(12)} ${sub.task ?? '(no task)'}${staleFlag}`);
273
+ if (sub.summary)
274
+ console.log(` ${sub.summary}`);
275
+ }
276
+ });
277
+ const queenDissolveCommand = new Command('dissolve')
278
+ .description('Manually close a stuck sub-spidersan session')
279
+ .argument('<signal-id>', 'Signal ID of the stuck sub-spidersan')
280
+ .option('--summary <text>', 'Dissolution summary', 'Manually dissolved by queen spider.')
281
+ .option('--dry-run', 'Print what would happen without acting')
282
+ .action(async (signalId, options) => {
283
+ if (options.dryRun) {
284
+ console.log(`[DRY-RUN] Would emit blocked signal for ${signalId} then close session.`);
285
+ return;
286
+ }
287
+ console.log(`[QUEEN] Dissolving sub-spidersan ${signalId.slice(0, 8)}...`);
288
+ // Emit a blocked signal to mark it, then it can be GC'd
289
+ const result = spawnSync('envoak', [
290
+ 'colony', 'signal',
291
+ '--status', 'blocked',
292
+ '--task', 'sub-spidersan dissolved',
293
+ '--summary', options.summary ?? 'Manually dissolved by queen spider.',
294
+ '--prior-signal-id', signalId,
295
+ ], { encoding: 'utf-8', timeout: 10000 });
296
+ if (result.status === 0) {
297
+ console.log(`[QUEEN] ✅ Dissolution signal emitted. Run 'envoak colony gc' to clean up.`);
298
+ }
299
+ else {
300
+ console.error(`[QUEEN] Failed to emit dissolution signal: ${result.stderr ?? result.stdout}`);
301
+ process.exit(1);
302
+ }
303
+ });
304
+ export const queenCommand = new Command('queen')
305
+ .description('Mode 3: Queen Spider — dispatch sub-spidersans for parallel ground jobs')
306
+ .addCommand(queenSpawnCommand)
307
+ .addCommand(queenStatusCommand)
308
+ .addCommand(queenDissolveCommand);
309
+ //# sourceMappingURL=queen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queen.js","sourceRoot":"","sources":["../../src/commands/queen.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,6 @@
5
5
  * Uses .spidersanrc config for customizable patterns.
6
6
  */
7
7
  import { Command } from 'commander';
8
+ export declare function shouldExcludeFile(file: string, excludePatterns: string[]): boolean;
8
9
  export declare const readyCheckCommand: Command;
9
10
  //# sourceMappingURL=ready-check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ready-check.d.ts","sourceRoot":"","sources":["../../src/commands/ready-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,eAAO,MAAM,iBAAiB,SAsIxB,CAAC"}
1
+ {"version":3,"file":"ready-check.d.ts","sourceRoot":"","sources":["../../src/commands/ready-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAElF;AAED,eAAO,MAAM,iBAAiB,SAgJxB,CAAC"}
@@ -5,36 +5,43 @@
5
5
  * Uses .spidersanrc config for customizable patterns.
6
6
  */
7
7
  import { Command } from 'commander';
8
- import { execSync } from 'child_process';
8
+ import { execFileSync } from 'child_process';
9
9
  import { readFile } from 'fs/promises';
10
10
  import { getStorage } from '../storage/index.js';
11
- import { loadConfig } from '../lib/config.js';
11
+ import { loadConfig, getWipPatterns } from '../lib/config.js';
12
12
  import { minimatch } from 'minimatch';
13
13
  function getCurrentBranch() {
14
14
  try {
15
- return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
15
+ return execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' }).trim();
16
16
  }
17
17
  catch {
18
18
  throw new Error('Not in a git repository');
19
19
  }
20
20
  }
21
21
  function getChangedFiles() {
22
- try {
23
- const diff = execSync('git diff --name-only main...HEAD 2>/dev/null || git diff --name-only HEAD~1', {
24
- encoding: 'utf-8'
25
- });
26
- return diff.trim().split('\n').filter(Boolean);
27
- }
28
- catch {
29
- return [];
22
+ // Try strategies in order: main...HEAD, HEAD~1, HEAD — no shell chain needed
23
+ const strategies = [
24
+ ['diff', '--name-only', 'main...HEAD'],
25
+ ['diff', '--name-only', 'HEAD~1'],
26
+ ['diff', '--name-only', 'HEAD'],
27
+ ];
28
+ for (const args of strategies) {
29
+ try {
30
+ const out = execFileSync('git', args, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] });
31
+ const files = out.trim().split('\n').filter(Boolean);
32
+ if (files.length > 0)
33
+ return files;
34
+ }
35
+ catch { /* try next */ }
30
36
  }
37
+ return [];
31
38
  }
32
- function shouldExcludeFile(file, excludePatterns) {
39
+ export function shouldExcludeFile(file, excludePatterns) {
33
40
  return excludePatterns.some(pattern => minimatch(file, pattern));
34
41
  }
35
42
  export const readyCheckCommand = new Command('ready-check')
36
43
  .description('Verify branch is ready to merge')
37
- .option('--strict', 'Fail on any WIP markers')
44
+ .option('--strict', 'Warn on WIP markers (kept for compatibility, no longer blocks)')
38
45
  .option('--json', 'Output as JSON')
39
46
  .option('--skip-wip', 'Skip WIP detection')
40
47
  .action(async (options) => {
@@ -50,6 +57,10 @@ export const readyCheckCommand = new Command('ready-check')
50
57
  const issues = [];
51
58
  // Check for WIP markers (if enabled and not skipped)
52
59
  if (config.readyCheck.enableWipDetection && !options.skipWip) {
60
+ // Performance Optimization: Hoist RegExp creation outside the loop
61
+ // Note: RegExp instances here do not use the global 'g' flag, so they are stateless
62
+ // and safe to reuse across files and lines.
63
+ const wipRegexes = getWipPatterns(config);
53
64
  for (const file of changedFiles) {
54
65
  // Skip excluded files
55
66
  if (shouldExcludeFile(file, config.readyCheck.excludeFiles)) {
@@ -59,14 +70,13 @@ export const readyCheckCommand = new Command('ready-check')
59
70
  const content = await readFile(file, 'utf-8');
60
71
  const lines = content.split('\n');
61
72
  lines.forEach((line, i) => {
62
- for (const pattern of config.readyCheck.wipPatterns) {
63
- // Case-insensitive match
64
- if (line.toUpperCase().includes(pattern.toUpperCase())) {
73
+ for (const regex of wipRegexes) {
74
+ if (regex.test(line)) {
65
75
  issues.push({
66
76
  type: 'wip',
67
77
  file,
68
78
  line: i + 1,
69
- pattern,
79
+ pattern: regex.source,
70
80
  });
71
81
  }
72
82
  }
@@ -76,9 +86,12 @@ export const readyCheckCommand = new Command('ready-check')
76
86
  // File might not exist (deleted)
77
87
  }
78
88
  }
79
- // Check for experimental patterns
80
- if (config.readyCheck.enableExperimentalDetection) {
89
+ // Check for experimental patterns — hoist combined regex as pre-filter (PR#79)
90
+ if (config.readyCheck.enableExperimentalDetection && config.readyCheck.experimentalPatterns.length > 0) {
91
+ const combinedRegex = new RegExp(config.readyCheck.experimentalPatterns.map(p => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'));
81
92
  for (const file of changedFiles) {
93
+ if (!combinedRegex.test(file))
94
+ continue;
82
95
  for (const pattern of config.readyCheck.experimentalPatterns) {
83
96
  if (file.includes(pattern)) {
84
97
  issues.push({
@@ -95,17 +108,19 @@ export const readyCheckCommand = new Command('ready-check')
95
108
  const allBranches = await storage.list();
96
109
  const conflicts = [];
97
110
  if (branch) {
111
+ // Performance Optimization: Convert branch files to Set for O(1) lookup
112
+ const branchFilesSet = new Set(branch.files);
98
113
  for (const other of allBranches) {
99
114
  if (other.name === branchName)
100
115
  continue;
101
- if (other.files.some(f => branch.files.includes(f))) {
116
+ if (other.files.some(f => branchFilesSet.has(f))) {
102
117
  conflicts.push(other.name);
103
118
  }
104
119
  }
105
120
  }
106
121
  const result = {
107
122
  branch: branchName,
108
- ready: issues.length === 0 && conflicts.length === 0,
123
+ ready: conflicts.length === 0, // WIP markers are advisory only — don't block merges
109
124
  issues,
110
125
  conflicts,
111
126
  config: {
@@ -115,7 +130,7 @@ export const readyCheckCommand = new Command('ready-check')
115
130
  };
116
131
  if (options.json) {
117
132
  console.log(JSON.stringify(result, null, 2));
118
- process.exit(result.ready ? 0 : 1);
133
+ process.exit(result.ready ? 0 : 1); // only exits 1 on file conflicts
119
134
  }
120
135
  console.log(`🕷️ Ready Check: ${branchName}\n`);
121
136
  if (issues.length > 0) {
@@ -132,7 +147,7 @@ export const readyCheckCommand = new Command('ready-check')
132
147
  console.log('');
133
148
  }
134
149
  if (expIssues.length > 0) {
135
- console.log(`⚠️ Found ${expIssues.length} experimental file(s):\n`);
150
+ console.log(`ℹ️ Found ${expIssues.length} experimental file(s) (advisory):\n`);
136
151
  for (const issue of expIssues) {
137
152
  console.log(` ${issue.file}`);
138
153
  }
@@ -144,13 +159,13 @@ export const readyCheckCommand = new Command('ready-check')
144
159
  }
145
160
  if (result.ready) {
146
161
  console.log('✅ Branch is ready to merge!');
162
+ if (issues.length > 0) {
163
+ console.log(' (WIP/XXX/experimental markers above are advisory — not blocking)');
164
+ }
147
165
  }
148
166
  else {
149
- console.log('❌ Branch is NOT ready to merge.');
150
- console.log(' Tip: Use --skip-wip to bypass WIP detection');
151
- if (options.strict) {
152
- process.exit(1);
153
- }
167
+ console.log('❌ Branch is NOT ready to merge (file conflicts with other branches).');
168
+ process.exit(1);
154
169
  }
155
170
  });
156
171
  //# sourceMappingURL=ready-check.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ready-check.js","sourceRoot":"","sources":["../../src/commands/ready-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ready-check.js","sourceRoot":"","sources":["../../src/commands/ready-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const rebaseHelperCommand: Command;
3
+ //# sourceMappingURL=rebase-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebase-helper.d.ts","sourceRoot":"","sources":["../../src/commands/rebase-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,mBAAmB,SAgD1B,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { Command } from 'commander';
2
+ import { existsSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { execFileSync } from 'child_process';
5
+ export const rebaseHelperCommand = new Command('rebase-helper')
6
+ .description('Detect and help resolve local git rebase states (non-interactive guidance)')
7
+ .option('--abort', 'Abort an in-progress rebase')
8
+ .option('--continue', 'Attempt to continue rebase (will skip editor prompts where possible)')
9
+ .action(async (options) => {
10
+ const repoRoot = process.cwd();
11
+ const rebaseMerge = join(repoRoot, '.git', 'rebase-merge');
12
+ const rebaseApply = join(repoRoot, '.git', 'rebase-apply');
13
+ const inMerge = existsSync(rebaseMerge) || existsSync(rebaseApply);
14
+ if (!inMerge) {
15
+ console.log('✅ No rebase in progress.');
16
+ return;
17
+ }
18
+ console.log('⚠️ Rebase state detected in this repository.');
19
+ console.log('Common fixes:');
20
+ console.log(' - To abort: git rebase --abort');
21
+ console.log(' - To continue: git rebase --continue');
22
+ console.log('If an editor opens during these commands, close it (ESC :q! for vim, Ctrl+X for nano).');
23
+ if (options.abort) {
24
+ try {
25
+ execFileSync('git', ['rebase', '--abort'], {
26
+ stdio: 'inherit',
27
+ env: { ...process.env, GIT_EDITOR: 'true', GIT_SEQUENCE_EDITOR: 'true' }
28
+ });
29
+ console.log('✅ Rebase aborted successfully');
30
+ }
31
+ catch {
32
+ console.error('❌ Failed to abort rebase non-interactively. Try aborting in your terminal.');
33
+ process.exit(1);
34
+ }
35
+ return;
36
+ }
37
+ if (options.continue) {
38
+ try {
39
+ execFileSync('git', ['rebase', '--continue'], {
40
+ stdio: 'inherit',
41
+ env: { ...process.env, GIT_EDITOR: 'true', GIT_SEQUENCE_EDITOR: 'true' }
42
+ });
43
+ console.log('✅ Rebase continued (or completed).');
44
+ }
45
+ catch {
46
+ console.error('❌ Failed to continue rebase non-interactively. Please resolve conflicts and run git rebase --continue');
47
+ process.exit(1);
48
+ }
49
+ return;
50
+ }
51
+ });
52
+ //# sourceMappingURL=rebase-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebase-helper.js","sourceRoot":"","sources":["../../src/commands/rebase-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KAC1D,WAAW,CAAC,4EAA4E,CAAC;KACzF,MAAM,CAAC,SAAS,EAAE,6BAA6B,CAAC;KAChD,MAAM,CAAC,YAAY,EAAE,sEAAsE,CAAC;KAC5F,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IACnE,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;IAEtG,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC;YACD,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACvC,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE;aAC3E,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,OAAO;IACX,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,IAAI,CAAC;YACD,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE;gBAC1C,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE;aAC3E,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,CAAC,KAAK,CAAC,uGAAuG,CAAC,CAAC;YACvH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,OAAO;IACX,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,3 +1,5 @@
1
1
  import { Command } from 'commander';
2
+ export declare function isExcludedPath(file: string): boolean;
3
+ export declare function validateRegistrationFiles(files: string[]): void;
2
4
  export declare const registerCommand: Command;
3
5
  //# sourceMappingURL=register.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoEpC,eAAO,MAAM,eAAe,SA4DtB,CAAC"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIpD;AAoBD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAI/D;AA2CD,eAAO,MAAM,eAAe,SAqFtB,CAAC"}