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.
- package/CHANGELOG.md +124 -0
- package/README.md +95 -23
- package/dist/bin/spidersan.d.ts.map +1 -1
- package/dist/bin/spidersan.js +22 -2
- 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.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +12 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +238 -34
- 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 +305 -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 +215 -14
- 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 +11 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +17 -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 +152 -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 +309 -0
- package/dist/commands/queen.js.map +1 -0
- package/dist/commands/ready-check.d.ts +1 -0
- package/dist/commands/ready-check.d.ts.map +1 -1
- package/dist/commands/ready-check.js +43 -28
- package/dist/commands/ready-check.js.map +1 -1
- 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 +2 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +66 -10
- 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 +69 -12
- package/dist/commands/rescue.js.map +1 -1
- package/dist/commands/stale.d.ts +16 -0
- package/dist/commands/stale.d.ts.map +1 -1
- package/dist/commands/stale.js +55 -21
- 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 +45 -22
- package/dist/commands/torrent.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +198 -7
- 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 +3 -1
- 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 +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +7 -3
- 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 +185 -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/repo-scanner.d.ts +36 -0
- package/dist/lib/repo-scanner.d.ts.map +1 -0
- package/dist/lib/repo-scanner.js +159 -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 +15 -8
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +36 -1
- 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/git-messages.d.ts.map +1 -1
- package/dist/storage/git-messages.js +57 -53
- package/dist/storage/git-messages.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/mycmail-adapter.d.ts.map +1 -1
- package/dist/storage/mycmail-adapter.js +11 -6
- package/dist/storage/mycmail-adapter.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 +9 -6
- 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
|
@@ -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;
|
|
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 {
|
|
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
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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', '
|
|
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
|
|
63
|
-
|
|
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 =>
|
|
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:
|
|
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(
|
|
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
|
-
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ready-check.js","sourceRoot":"","sources":["../../src/commands/ready-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,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"}
|