spidersan 0.2.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 +91 -0
- package/LICENSE +21 -0
- package/LICENSE.md +85 -0
- package/README.md +217 -0
- package/dist/bin/spidersan.d.ts +9 -0
- package/dist/bin/spidersan.d.ts.map +1 -0
- package/dist/bin/spidersan.js +152 -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 +49 -0
- package/dist/commands/abandon.js.map +1 -0
- package/dist/commands/activate.d.ts +9 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +45 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/active-windows.d.ts +16 -0
- package/dist/commands/active-windows.d.ts.map +1 -0
- package/dist/commands/active-windows.js +373 -0
- package/dist/commands/active-windows.js.map +1 -0
- package/dist/commands/audit-mark.d.ts +12 -0
- package/dist/commands/audit-mark.d.ts.map +1 -0
- package/dist/commands/audit-mark.js +204 -0
- package/dist/commands/audit-mark.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 +41 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/close.d.ts +9 -0
- package/dist/commands/close.d.ts.map +1 -0
- package/dist/commands/close.js +129 -0
- package/dist/commands/close.js.map +1 -0
- package/dist/commands/collab-sync.d.ts +14 -0
- package/dist/commands/collab-sync.d.ts.map +1 -0
- package/dist/commands/collab-sync.js +240 -0
- package/dist/commands/collab-sync.js.map +1 -0
- package/dist/commands/collab.d.ts +6 -0
- package/dist/commands/collab.d.ts.map +1 -0
- package/dist/commands/collab.js +103 -0
- package/dist/commands/collab.js.map +1 -0
- package/dist/commands/completions.d.ts +8 -0
- package/dist/commands/completions.d.ts.map +1 -0
- package/dist/commands/completions.js +83 -0
- package/dist/commands/completions.js.map +1 -0
- package/dist/commands/conflicts.d.ts +12 -0
- package/dist/commands/conflicts.d.ts.map +1 -0
- package/dist/commands/conflicts.js +426 -0
- package/dist/commands/conflicts.js.map +1 -0
- package/dist/commands/demo.d.ts +3 -0
- package/dist/commands/demo.d.ts.map +1 -0
- package/dist/commands/demo.js +113 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/depends.d.ts +8 -0
- package/dist/commands/depends.d.ts.map +1 -0
- package/dist/commands/depends.js +44 -0
- package/dist/commands/depends.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +249 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +66 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/index.d.ts +43 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +61 -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/intent-scan.d.ts +17 -0
- package/dist/commands/intent-scan.d.ts.map +1 -0
- package/dist/commands/intent-scan.js +336 -0
- package/dist/commands/intent-scan.js.map +1 -0
- package/dist/commands/key-import.d.ts +3 -0
- package/dist/commands/key-import.d.ts.map +1 -0
- package/dist/commands/key-import.js +54 -0
- package/dist/commands/key-import.js.map +1 -0
- package/dist/commands/keygen.d.ts +3 -0
- package/dist/commands/keygen.d.ts.map +1 -0
- package/dist/commands/keygen.js +53 -0
- package/dist/commands/keygen.js.map +1 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +56 -0
- package/dist/commands/keys.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/lock.d.ts +11 -0
- package/dist/commands/lock.d.ts.map +1 -0
- package/dist/commands/lock.js +220 -0
- package/dist/commands/lock.js.map +1 -0
- package/dist/commands/log.d.ts +8 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +95 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/mcp-health.d.ts +3 -0
- package/dist/commands/mcp-health.d.ts.map +1 -0
- package/dist/commands/mcp-health.js +305 -0
- package/dist/commands/mcp-health.js.map +1 -0
- package/dist/commands/mcp-restart.d.ts +3 -0
- package/dist/commands/mcp-restart.d.ts.map +1 -0
- package/dist/commands/mcp-restart.js +176 -0
- package/dist/commands/mcp-restart.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 +138 -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 +39 -0
- package/dist/commands/merged.js.map +1 -0
- package/dist/commands/msg-read.d.ts +3 -0
- package/dist/commands/msg-read.d.ts.map +1 -0
- package/dist/commands/msg-read.js +70 -0
- package/dist/commands/msg-read.js.map +1 -0
- package/dist/commands/pulse.d.ts +9 -0
- package/dist/commands/pulse.d.ts.map +1 -0
- package/dist/commands/pulse.js +232 -0
- package/dist/commands/pulse.js.map +1 -0
- package/dist/commands/radar.d.ts +3 -0
- package/dist/commands/radar.d.ts.map +1 -0
- package/dist/commands/radar.js +147 -0
- package/dist/commands/radar.js.map +1 -0
- package/dist/commands/ready-check.d.ts +9 -0
- package/dist/commands/ready-check.d.ts.map +1 -0
- package/dist/commands/ready-check.js +156 -0
- package/dist/commands/ready-check.js.map +1 -0
- package/dist/commands/register.d.ts +3 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +124 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +134 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/stale.d.ts +8 -0
- package/dist/commands/stale.d.ts.map +1 -0
- package/dist/commands/stale.js +38 -0
- package/dist/commands/stale.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +41 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync-all.d.ts +9 -0
- package/dist/commands/sync-all.d.ts.map +1 -0
- package/dist/commands/sync-all.js +180 -0
- package/dist/commands/sync-all.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +49 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/tension.d.ts +12 -0
- package/dist/commands/tension.d.ts.map +1 -0
- package/dist/commands/tension.js +242 -0
- package/dist/commands/tension.js.map +1 -0
- package/dist/commands/torrent.d.ts +9 -0
- package/dist/commands/torrent.d.ts.map +1 -0
- package/dist/commands/torrent.js +431 -0
- package/dist/commands/torrent.js.map +1 -0
- package/dist/commands/tui.d.ts +8 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +15 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/wake.d.ts +9 -0
- package/dist/commands/wake.d.ts.map +1 -0
- package/dist/commands/wake.js +188 -0
- package/dist/commands/wake.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +245 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/who-touched.d.ts +9 -0
- package/dist/commands/who-touched.d.ts.map +1 -0
- package/dist/commands/who-touched.js +186 -0
- package/dist/commands/who-touched.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.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 +143 -0
- package/dist/lib/agent-errors.js.map +1 -0
- package/dist/lib/ast.d.ts +56 -0
- package/dist/lib/ast.d.ts.map +1 -0
- package/dist/lib/ast.js +134 -0
- package/dist/lib/ast.js.map +1 -0
- package/dist/lib/config.d.ts +33 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +127 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/crdt.d.ts +83 -0
- package/dist/lib/crdt.d.ts.map +1 -0
- package/dist/lib/crdt.js +160 -0
- package/dist/lib/crdt.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 +172 -0
- package/dist/lib/crypto.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/license.d.ts +61 -0
- package/dist/lib/license.d.ts.map +1 -0
- package/dist/lib/license.js +171 -0
- package/dist/lib/license.js.map +1 -0
- package/dist/lib/security.d.ts +53 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +122 -0
- package/dist/lib/security.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/storage/adapter.d.ts +58 -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/factory.d.ts +6 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +22 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +24 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +101 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/supabase.d.ts +52 -0
- package/dist/storage/supabase.d.ts.map +1 -0
- package/dist/storage/supabase.js +221 -0
- package/dist/storage/supabase.js.map +1 -0
- package/dist/tui/screen.d.ts +14 -0
- package/dist/tui/screen.d.ts.map +1 -0
- package/dist/tui/screen.js +136 -0
- package/dist/tui/screen.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import { getStorage } from '../storage/index.js';
|
|
4
|
+
import { checkBranchLimit } from '../lib/license.js';
|
|
5
|
+
import * as readline from 'readline';
|
|
6
|
+
function getCurrentBranch() {
|
|
7
|
+
try {
|
|
8
|
+
return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
throw new Error('Not in a git repository');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function getChangedFiles() {
|
|
15
|
+
try {
|
|
16
|
+
// Get files changed from main or last commit
|
|
17
|
+
const output = execSync('git diff --name-only main...HEAD 2>/dev/null || git diff --name-only HEAD~1 2>/dev/null || git diff --name-only HEAD', { encoding: 'utf-8' });
|
|
18
|
+
return output.trim().split('\n').filter(Boolean);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function promptForFiles(detectedFiles) {
|
|
25
|
+
const rl = readline.createInterface({
|
|
26
|
+
input: process.stdin,
|
|
27
|
+
output: process.stdout
|
|
28
|
+
});
|
|
29
|
+
return new Promise((resolve) => {
|
|
30
|
+
if (detectedFiles.length > 0) {
|
|
31
|
+
console.log('\nš·ļø Detected changed files:');
|
|
32
|
+
detectedFiles.forEach((f, i) => console.log(` ${i + 1}. ${f}`));
|
|
33
|
+
console.log('');
|
|
34
|
+
rl.question('Use these files? [Y/n/edit]: ', (answer) => {
|
|
35
|
+
rl.close();
|
|
36
|
+
const a = answer.toLowerCase().trim();
|
|
37
|
+
if (a === '' || a === 'y' || a === 'yes') {
|
|
38
|
+
resolve(detectedFiles);
|
|
39
|
+
}
|
|
40
|
+
else if (a === 'n' || a === 'no') {
|
|
41
|
+
resolve([]);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Let them enter custom files
|
|
45
|
+
console.log(' Enter comma-separated files, or leave empty:');
|
|
46
|
+
const rl2 = readline.createInterface({
|
|
47
|
+
input: process.stdin,
|
|
48
|
+
output: process.stdout
|
|
49
|
+
});
|
|
50
|
+
rl2.question(' Files: ', (files) => {
|
|
51
|
+
rl2.close();
|
|
52
|
+
resolve(files ? files.split(',').map(f => f.trim()) : []);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
rl.question('Enter files (comma-separated) or leave empty: ', (files) => {
|
|
59
|
+
rl.close();
|
|
60
|
+
resolve(files ? files.split(',').map(f => f.trim()) : []);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export const registerCommand = new Command('register')
|
|
66
|
+
.description('Register the current branch with files being modified')
|
|
67
|
+
.option('-f, --files <files>', 'Comma-separated list of files being modified')
|
|
68
|
+
.option('-d, --description <desc>', 'Description of what this branch does')
|
|
69
|
+
.option('-a, --agent <agent>', 'Agent identifier (e.g., claude-code, cursor)')
|
|
70
|
+
.option('-i, --interactive', 'Interactive mode (prompt for files)')
|
|
71
|
+
.option('--auto', 'Auto-detect files from git diff')
|
|
72
|
+
.action(async (options) => {
|
|
73
|
+
const storage = await getStorage();
|
|
74
|
+
if (!await storage.isInitialized()) {
|
|
75
|
+
console.error('ā Spidersan not initialized. Run: spidersan init');
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const branchName = getCurrentBranch();
|
|
79
|
+
let files = [];
|
|
80
|
+
if (options.files) {
|
|
81
|
+
files = options.files.split(',').map((f) => f.trim());
|
|
82
|
+
}
|
|
83
|
+
else if (options.auto) {
|
|
84
|
+
files = getChangedFiles();
|
|
85
|
+
if (files.length > 0) {
|
|
86
|
+
console.log(`š·ļø Auto-detected ${files.length} changed file(s)`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (options.interactive) {
|
|
90
|
+
const detected = getChangedFiles();
|
|
91
|
+
files = await promptForFiles(detected);
|
|
92
|
+
}
|
|
93
|
+
// Check if branch already registered
|
|
94
|
+
const existing = await storage.get(branchName);
|
|
95
|
+
if (!existing) {
|
|
96
|
+
// New registration - check branch limit for free tier
|
|
97
|
+
const activeBranches = (await storage.list()).filter(b => b.status === 'active');
|
|
98
|
+
await checkBranchLimit(activeBranches.length);
|
|
99
|
+
}
|
|
100
|
+
if (existing) {
|
|
101
|
+
// Update existing registration
|
|
102
|
+
await storage.update(branchName, {
|
|
103
|
+
files: [...new Set([...existing.files, ...files])],
|
|
104
|
+
description: options.description || existing.description,
|
|
105
|
+
agent: options.agent || existing.agent,
|
|
106
|
+
});
|
|
107
|
+
console.log(`š·ļø Updated branch: ${branchName}`);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// New registration
|
|
111
|
+
await storage.register({
|
|
112
|
+
name: branchName,
|
|
113
|
+
files,
|
|
114
|
+
status: 'active',
|
|
115
|
+
description: options.description,
|
|
116
|
+
agent: options.agent,
|
|
117
|
+
});
|
|
118
|
+
console.log(`š·ļø Registered branch: ${branchName}`);
|
|
119
|
+
}
|
|
120
|
+
if (files.length > 0) {
|
|
121
|
+
console.log(` Files: ${files.join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,eAAO,MAAM,WAAW,SA8GlB,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { execSync, spawnSync } from 'child_process';
|
|
3
|
+
// Security: Input validation
|
|
4
|
+
const VALID_AGENT_ID = /^[a-z0-9][a-z0-9_-]{0,30}$/i;
|
|
5
|
+
function validateAgentId(agentId) {
|
|
6
|
+
if (!VALID_AGENT_ID.test(agentId)) {
|
|
7
|
+
throw new Error(`Invalid agent ID: "${agentId.slice(0, 20)}..." (must be alphanumeric with - or _)`);
|
|
8
|
+
}
|
|
9
|
+
return agentId;
|
|
10
|
+
}
|
|
11
|
+
function sanitizeText(text) {
|
|
12
|
+
// Remove shell metacharacters but allow normal text
|
|
13
|
+
return text.replace(/[`$(){}[\]|;&<>]/g, '');
|
|
14
|
+
}
|
|
15
|
+
function getMessageFromStdin() {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const chunks = [];
|
|
18
|
+
process.stdin.on('data', chunk => chunks.push(chunk));
|
|
19
|
+
process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8').trim()));
|
|
20
|
+
process.stdin.on('error', reject);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function getCurrentBranch() {
|
|
24
|
+
try {
|
|
25
|
+
return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return '';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const sendCommand = new Command('send')
|
|
32
|
+
.description('Send a message to another agent (via Myceliumail)')
|
|
33
|
+
.argument('<to>', 'Recipient agent identifier')
|
|
34
|
+
.argument('<subject>', 'Message subject')
|
|
35
|
+
.option('-m, --message <text>', 'Message body (or reads from stdin)')
|
|
36
|
+
.option('-t, --type <type>', 'Message type: info, question, alert, handoff, file_share', 'info')
|
|
37
|
+
.option('-f, --from <agent>', 'Sender identifier (default: current agent)')
|
|
38
|
+
.option('-b, --branch <name>', 'Related branch name')
|
|
39
|
+
.option('--files <files>', 'Comma-separated list of related files')
|
|
40
|
+
.option('--reply-to <id>', 'Message ID this is replying to (not yet supported in mycmail)')
|
|
41
|
+
.option('--encrypt', 'Encrypt the message')
|
|
42
|
+
.option('--json', 'Output as JSON')
|
|
43
|
+
.action(async (to, subject, options) => {
|
|
44
|
+
// 1. Get message body
|
|
45
|
+
let messageBody = options.message;
|
|
46
|
+
if (!messageBody) {
|
|
47
|
+
if (process.stdin.isTTY) {
|
|
48
|
+
console.error('ā Message body is required (use -m or pipe stdin)');
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
messageBody = await getMessageFromStdin();
|
|
52
|
+
}
|
|
53
|
+
if (!messageBody) {
|
|
54
|
+
console.error('ā Message body empty');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
// 2. Prepare context
|
|
58
|
+
const branch = options.branch || getCurrentBranch();
|
|
59
|
+
const type = options.type || 'info';
|
|
60
|
+
const files = options.files ? options.files.split(',') : [];
|
|
61
|
+
// 3. Format message with Spidersan context (until mycmail supports metadata)
|
|
62
|
+
let contextHeader = '';
|
|
63
|
+
if (type !== 'info')
|
|
64
|
+
contextHeader += `Type: ${type}\n`;
|
|
65
|
+
if (branch)
|
|
66
|
+
contextHeader += `Branch: ${branch}\n`;
|
|
67
|
+
if (files.length > 0)
|
|
68
|
+
contextHeader += `Files: ${files.join(', ')}\n`;
|
|
69
|
+
const fullMessage = contextHeader ? `${contextHeader}\n${messageBody}` : messageBody;
|
|
70
|
+
// 4. Construct mycmail command
|
|
71
|
+
// Note: We use the sender identity for MYCELIUMAIL_AGENT_ID env var
|
|
72
|
+
const sender = options.from || process.env.SPIDERSAN_AGENT || 'cli-agent';
|
|
73
|
+
try {
|
|
74
|
+
// Check if mycmail is available
|
|
75
|
+
execSync('which mycmail', { stdio: 'ignore' });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
console.error('ā Myceliumail (mycmail) not found.');
|
|
79
|
+
console.error(' Please install it: npm install -g myceliumail');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
const cmdParts = [
|
|
83
|
+
`MYCELIUMAIL_AGENT_ID=${sender}`,
|
|
84
|
+
'mycmail',
|
|
85
|
+
'send',
|
|
86
|
+
to,
|
|
87
|
+
`"${subject}"`, // Subject needs quotes
|
|
88
|
+
'--message',
|
|
89
|
+
`"${fullMessage.replace(/"/g, '\\"')}"` // Escape quotes in message
|
|
90
|
+
];
|
|
91
|
+
if (options.encrypt) {
|
|
92
|
+
cmdParts.push('--encrypt');
|
|
93
|
+
}
|
|
94
|
+
// Execute
|
|
95
|
+
// Execute using execFileSync with argument array (prevents shell injection)
|
|
96
|
+
try {
|
|
97
|
+
// Security: Validate and sanitize inputs
|
|
98
|
+
const safeTo = validateAgentId(to);
|
|
99
|
+
const safeSubject = sanitizeText(subject);
|
|
100
|
+
const safeMessage = sanitizeText(fullMessage);
|
|
101
|
+
const args = ['send', safeTo, safeSubject, '--message', safeMessage];
|
|
102
|
+
if (options.encrypt) {
|
|
103
|
+
args.push('--encrypt');
|
|
104
|
+
}
|
|
105
|
+
const result = spawnSync('mycmail', args, {
|
|
106
|
+
encoding: 'utf-8',
|
|
107
|
+
env: { ...process.env, MYCELIUMAIL_AGENT_ID: sender }
|
|
108
|
+
});
|
|
109
|
+
if (result.error) {
|
|
110
|
+
throw result.error;
|
|
111
|
+
}
|
|
112
|
+
const output = result.stdout || '';
|
|
113
|
+
if (options.json) {
|
|
114
|
+
// Try to parse mycmail output or create synthetic JSON
|
|
115
|
+
// mycmail 1.0.0 output is text. 1.1.0 might have --json
|
|
116
|
+
console.log(JSON.stringify({
|
|
117
|
+
status: 'sent',
|
|
118
|
+
to,
|
|
119
|
+
subject,
|
|
120
|
+
encrypted: !!options.encrypt,
|
|
121
|
+
original_output: output.trim()
|
|
122
|
+
}, null, 2));
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
console.log(output);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
console.error('ā Failed to send message via Myceliumail');
|
|
130
|
+
console.error(error.message || error);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale.d.ts","sourceRoot":"","sources":["../../src/commands/stale.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,YAAY,SAqCnB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan stale
|
|
3
|
+
*
|
|
4
|
+
* Show branches that haven't been updated recently.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { getStorage } from '../storage/index.js';
|
|
8
|
+
export const staleCommand = new Command('stale')
|
|
9
|
+
.description('Show stale branches (not updated recently)')
|
|
10
|
+
.option('--days <n>', 'Days threshold for staleness', '7')
|
|
11
|
+
.option('--json', 'Output as JSON')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
const storage = await getStorage();
|
|
14
|
+
if (!await storage.isInitialized()) {
|
|
15
|
+
console.error('ā Spidersan not initialized. Run: spidersan init');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const days = parseInt(options.days, 10);
|
|
19
|
+
const threshold = new Date();
|
|
20
|
+
threshold.setDate(threshold.getDate() - days);
|
|
21
|
+
const branches = await storage.list();
|
|
22
|
+
const stale = branches.filter(b => new Date(b.registeredAt) < threshold);
|
|
23
|
+
if (options.json) {
|
|
24
|
+
console.log(JSON.stringify(stale, null, 2));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (stale.length === 0) {
|
|
28
|
+
console.log(`š·ļø No stale branches (older than ${days} days)`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
console.log(`š·ļø Stale Branches (>${days} days old):\n`);
|
|
32
|
+
for (const branch of stale) {
|
|
33
|
+
const age = Math.floor((Date.now() - new Date(branch.registeredAt).getTime()) / 86400000);
|
|
34
|
+
console.log(` ā ļø ${branch.name} (${age} days old)`);
|
|
35
|
+
}
|
|
36
|
+
console.log(`\nRun 'spidersan cleanup' to remove these.`);
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=stale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/commands/stale.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC3C,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,YAAY,EAAE,8BAA8B,EAAE,GAAG,CAAC;KACzD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,IAAI,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,CAAC;IAEzE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,QAAQ,CAAC,CAAC;QAC/D,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,eAAe,CAAC,CAAC;IAEzD,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,KAAK,GAAG,YAAY,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SAgCpB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License Status Command
|
|
3
|
+
*
|
|
4
|
+
* Shows current license status and plan details.
|
|
5
|
+
* Usage: spidersan status
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { getLicenseStatus, FREE_TIER_LIMITS } from '../lib/license.js';
|
|
9
|
+
import { getStorage } from '../storage/index.js';
|
|
10
|
+
export const statusCommand = new Command('status')
|
|
11
|
+
.description('Show license status and plan details')
|
|
12
|
+
.action(async () => {
|
|
13
|
+
const status = getLicenseStatus();
|
|
14
|
+
const storage = await getStorage();
|
|
15
|
+
let branchCount = 0;
|
|
16
|
+
if (await storage.isInitialized()) {
|
|
17
|
+
const branches = await storage.list();
|
|
18
|
+
branchCount = branches.filter(b => b.status === 'active').length;
|
|
19
|
+
}
|
|
20
|
+
console.log('š·ļø Spidersan Status\n');
|
|
21
|
+
if (status.plan === 'pro') {
|
|
22
|
+
console.log(` Plan: š Pro`);
|
|
23
|
+
console.log(` Email: ${status.email}`);
|
|
24
|
+
console.log(` Expires: ${new Date(status.expiresAt).toLocaleDateString()} (${status.daysRemaining} days)`);
|
|
25
|
+
console.log(` Features: ${status.features.join(', ')}`);
|
|
26
|
+
console.log(` Branches: ${branchCount} active (unlimited)`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.log(` Plan: Free`);
|
|
30
|
+
console.log(` Branches: ${branchCount}/${FREE_TIER_LIMITS.maxConcurrentBranches} active`);
|
|
31
|
+
console.log('');
|
|
32
|
+
console.log(' š Upgrade to Pro for:');
|
|
33
|
+
console.log(' ⢠Unlimited branches');
|
|
34
|
+
console.log(' ⢠MCP Server integration');
|
|
35
|
+
console.log(' ⢠Conflict prediction');
|
|
36
|
+
console.log(' ⢠Priority support');
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log(' Get Pro: spidersan.dev/pro');
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC7C,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEtC,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,CAAC,kBAAkB,EAAE,KAAK,MAAM,CAAC,aAAa,QAAQ,CAAC,CAAC;QAChH,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,qBAAqB,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,IAAI,gBAAgB,CAAC,qBAAqB,SAAS,CAAC,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACjD,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-all.d.ts","sourceRoot":"","sources":["../../src/commands/sync-all.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8GpC,eAAO,MAAM,cAAc,SAuGrB,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spidersan sync-all
|
|
3
|
+
*
|
|
4
|
+
* Scan and sync all /Dev repositories.
|
|
5
|
+
* Global git coordination for the entire ecosystem.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { execSync } from 'child_process';
|
|
9
|
+
import { existsSync, readdirSync, statSync } from 'fs';
|
|
10
|
+
import { join, basename } from 'path';
|
|
11
|
+
const DEV_DIR = '/Users/freedbird/Dev';
|
|
12
|
+
function runGitInRepo(repoPath, cmd) {
|
|
13
|
+
try {
|
|
14
|
+
const output = execSync(`git ${cmd}`, {
|
|
15
|
+
cwd: repoPath,
|
|
16
|
+
encoding: 'utf-8',
|
|
17
|
+
stdio: 'pipe'
|
|
18
|
+
}).trim();
|
|
19
|
+
return { success: true, output };
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const output = error instanceof Error && 'stdout' in error
|
|
23
|
+
? error.stdout?.trim() || ''
|
|
24
|
+
: '';
|
|
25
|
+
return { success: false, output };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function discoverRepos(baseDir) {
|
|
29
|
+
const repos = [];
|
|
30
|
+
try {
|
|
31
|
+
const entries = readdirSync(baseDir);
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
const fullPath = join(baseDir, entry);
|
|
34
|
+
// Skip non-directories
|
|
35
|
+
if (!statSync(fullPath).isDirectory())
|
|
36
|
+
continue;
|
|
37
|
+
// Skip hidden directories except .git
|
|
38
|
+
if (entry.startsWith('.') && entry !== '.git')
|
|
39
|
+
continue;
|
|
40
|
+
// Check if it's a git repo
|
|
41
|
+
const gitPath = join(fullPath, '.git');
|
|
42
|
+
if (existsSync(gitPath)) {
|
|
43
|
+
repos.push(fullPath);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Directory doesn't exist or can't be read
|
|
49
|
+
}
|
|
50
|
+
return repos.sort();
|
|
51
|
+
}
|
|
52
|
+
function getRepoStatus(repoPath) {
|
|
53
|
+
const name = basename(repoPath);
|
|
54
|
+
const status = {
|
|
55
|
+
name,
|
|
56
|
+
path: repoPath,
|
|
57
|
+
uncommitted: 0,
|
|
58
|
+
unpushed: 0,
|
|
59
|
+
behind: 0,
|
|
60
|
+
branch: 'unknown'
|
|
61
|
+
};
|
|
62
|
+
// Get current branch
|
|
63
|
+
const branchResult = runGitInRepo(repoPath, 'rev-parse --abbrev-ref HEAD');
|
|
64
|
+
if (branchResult.success) {
|
|
65
|
+
status.branch = branchResult.output;
|
|
66
|
+
}
|
|
67
|
+
// Count uncommitted changes
|
|
68
|
+
const statusResult = runGitInRepo(repoPath, 'status --porcelain');
|
|
69
|
+
if (statusResult.success) {
|
|
70
|
+
const lines = statusResult.output.split('\n').filter(Boolean);
|
|
71
|
+
status.uncommitted = lines.length;
|
|
72
|
+
}
|
|
73
|
+
// Count unpushed commits
|
|
74
|
+
const unpushedResult = runGitInRepo(repoPath, 'log @{u}..HEAD --oneline');
|
|
75
|
+
if (unpushedResult.success) {
|
|
76
|
+
const lines = unpushedResult.output.split('\n').filter(Boolean);
|
|
77
|
+
status.unpushed = lines.length;
|
|
78
|
+
}
|
|
79
|
+
// Count behind remote
|
|
80
|
+
const behindResult = runGitInRepo(repoPath, 'log HEAD..@{u} --oneline');
|
|
81
|
+
if (behindResult.success) {
|
|
82
|
+
const lines = behindResult.output.split('\n').filter(Boolean);
|
|
83
|
+
status.behind = lines.length;
|
|
84
|
+
}
|
|
85
|
+
return status;
|
|
86
|
+
}
|
|
87
|
+
export const syncAllCommand = new Command('sync-all')
|
|
88
|
+
.description('Scan and sync all /Dev repositories')
|
|
89
|
+
.option('--status', 'Show status of all repos (default)')
|
|
90
|
+
.option('--pull', 'Pull all repos from remote')
|
|
91
|
+
.option('--push', 'Push all repos to remote')
|
|
92
|
+
.option('--repos <names>', 'Comma-separated repo names to sync')
|
|
93
|
+
.option('--json', 'Output as JSON')
|
|
94
|
+
.addHelpText('after', `
|
|
95
|
+
Examples:
|
|
96
|
+
$ spidersan sync-all # Show status of all repos
|
|
97
|
+
$ spidersan sync-all --pull # Pull all repos
|
|
98
|
+
$ spidersan sync-all --push # Push all repos with commits
|
|
99
|
+
$ spidersan sync-all --pull --push # Full sync cycle
|
|
100
|
+
$ spidersan sync-all --repos "Envoak,Sherlocksan" --pull
|
|
101
|
+
`)
|
|
102
|
+
.action(async (options) => {
|
|
103
|
+
// Default to status if no action specified
|
|
104
|
+
const showStatus = options.status || (!options.pull && !options.push);
|
|
105
|
+
// Discover repos
|
|
106
|
+
let repos = discoverRepos(DEV_DIR);
|
|
107
|
+
// Filter by name if specified
|
|
108
|
+
if (options.repos) {
|
|
109
|
+
const filterNames = options.repos.split(',').map(n => n.trim().toLowerCase());
|
|
110
|
+
repos = repos.filter(r => filterNames.includes(basename(r).toLowerCase()));
|
|
111
|
+
}
|
|
112
|
+
if (repos.length === 0) {
|
|
113
|
+
console.log('š·ļø No repositories found.');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const statuses = [];
|
|
117
|
+
if (!options.json) {
|
|
118
|
+
console.log(`\nš·ļø SYNC-ALL ā ${repos.length} repositories\n`);
|
|
119
|
+
console.log('ā'.repeat(50));
|
|
120
|
+
}
|
|
121
|
+
for (const repoPath of repos) {
|
|
122
|
+
const name = basename(repoPath);
|
|
123
|
+
let status = getRepoStatus(repoPath);
|
|
124
|
+
// Pull if requested
|
|
125
|
+
if (options.pull) {
|
|
126
|
+
if (!options.json)
|
|
127
|
+
process.stdout.write(`š„ ${name}: pulling... `);
|
|
128
|
+
const result = runGitInRepo(repoPath, 'pull --rebase');
|
|
129
|
+
if (!options.json) {
|
|
130
|
+
console.log(result.success ? 'ā
' : 'ā ļø');
|
|
131
|
+
}
|
|
132
|
+
// Refresh status after pull
|
|
133
|
+
status = getRepoStatus(repoPath);
|
|
134
|
+
}
|
|
135
|
+
// Push if requested and has unpushed commits
|
|
136
|
+
if (options.push && status.unpushed > 0) {
|
|
137
|
+
if (!options.json)
|
|
138
|
+
process.stdout.write(`š¤ ${name}: pushing ${status.unpushed} commit(s)... `);
|
|
139
|
+
const result = runGitInRepo(repoPath, 'push');
|
|
140
|
+
if (!options.json) {
|
|
141
|
+
console.log(result.success ? 'ā
' : 'ā ļø');
|
|
142
|
+
}
|
|
143
|
+
// Refresh status after push
|
|
144
|
+
status = getRepoStatus(repoPath);
|
|
145
|
+
}
|
|
146
|
+
statuses.push(status);
|
|
147
|
+
// Show status
|
|
148
|
+
if (showStatus && !options.json) {
|
|
149
|
+
let icon = 'ā
';
|
|
150
|
+
if (status.uncommitted > 0)
|
|
151
|
+
icon = 'š';
|
|
152
|
+
if (status.unpushed > 0)
|
|
153
|
+
icon = 'š¤';
|
|
154
|
+
if (status.behind > 0)
|
|
155
|
+
icon = 'š„';
|
|
156
|
+
if (status.uncommitted > 0 && status.behind > 0)
|
|
157
|
+
icon = 'ā ļø';
|
|
158
|
+
console.log(`${icon} ${name.padEnd(20)} ${status.branch.padEnd(10)} | ${status.uncommitted} uncommitted | ${status.unpushed} unpushed | ${status.behind} behind`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (options.json) {
|
|
162
|
+
console.log(JSON.stringify({ repos: statuses }, null, 2));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
console.log('ā'.repeat(50));
|
|
166
|
+
// Summary
|
|
167
|
+
const withUncommitted = statuses.filter(s => s.uncommitted > 0).length;
|
|
168
|
+
const withUnpushed = statuses.filter(s => s.unpushed > 0).length;
|
|
169
|
+
const withBehind = statuses.filter(s => s.behind > 0).length;
|
|
170
|
+
const clean = statuses.filter(s => s.uncommitted === 0 && s.unpushed === 0 && s.behind === 0).length;
|
|
171
|
+
console.log(`\nš Summary: ${clean} clean | ${withUncommitted} uncommitted | ${withUnpushed} unpushed | ${withBehind} behind`);
|
|
172
|
+
if (withBehind > 0 && !options.pull) {
|
|
173
|
+
console.log('\nš” Run: spidersan sync-all --pull');
|
|
174
|
+
}
|
|
175
|
+
if (withUnpushed > 0 && !options.push) {
|
|
176
|
+
console.log('š” Run: spidersan sync-all --push');
|
|
177
|
+
}
|
|
178
|
+
console.log('');
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=sync-all.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-all.js","sourceRoot":"","sources":["../../src/commands/sync-all.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,WAAW,SAoClB,CAAC"}
|