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.
Files changed (245) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/LICENSE +21 -0
  3. package/LICENSE.md +85 -0
  4. package/README.md +217 -0
  5. package/dist/bin/spidersan.d.ts +9 -0
  6. package/dist/bin/spidersan.d.ts.map +1 -0
  7. package/dist/bin/spidersan.js +152 -0
  8. package/dist/bin/spidersan.js.map +1 -0
  9. package/dist/commands/abandon.d.ts +8 -0
  10. package/dist/commands/abandon.d.ts.map +1 -0
  11. package/dist/commands/abandon.js +49 -0
  12. package/dist/commands/abandon.js.map +1 -0
  13. package/dist/commands/activate.d.ts +9 -0
  14. package/dist/commands/activate.d.ts.map +1 -0
  15. package/dist/commands/activate.js +45 -0
  16. package/dist/commands/activate.js.map +1 -0
  17. package/dist/commands/active-windows.d.ts +16 -0
  18. package/dist/commands/active-windows.d.ts.map +1 -0
  19. package/dist/commands/active-windows.js +373 -0
  20. package/dist/commands/active-windows.js.map +1 -0
  21. package/dist/commands/audit-mark.d.ts +12 -0
  22. package/dist/commands/audit-mark.d.ts.map +1 -0
  23. package/dist/commands/audit-mark.js +204 -0
  24. package/dist/commands/audit-mark.js.map +1 -0
  25. package/dist/commands/cleanup.d.ts +8 -0
  26. package/dist/commands/cleanup.d.ts.map +1 -0
  27. package/dist/commands/cleanup.js +41 -0
  28. package/dist/commands/cleanup.js.map +1 -0
  29. package/dist/commands/close.d.ts +9 -0
  30. package/dist/commands/close.d.ts.map +1 -0
  31. package/dist/commands/close.js +129 -0
  32. package/dist/commands/close.js.map +1 -0
  33. package/dist/commands/collab-sync.d.ts +14 -0
  34. package/dist/commands/collab-sync.d.ts.map +1 -0
  35. package/dist/commands/collab-sync.js +240 -0
  36. package/dist/commands/collab-sync.js.map +1 -0
  37. package/dist/commands/collab.d.ts +6 -0
  38. package/dist/commands/collab.d.ts.map +1 -0
  39. package/dist/commands/collab.js +103 -0
  40. package/dist/commands/collab.js.map +1 -0
  41. package/dist/commands/completions.d.ts +8 -0
  42. package/dist/commands/completions.d.ts.map +1 -0
  43. package/dist/commands/completions.js +83 -0
  44. package/dist/commands/completions.js.map +1 -0
  45. package/dist/commands/conflicts.d.ts +12 -0
  46. package/dist/commands/conflicts.d.ts.map +1 -0
  47. package/dist/commands/conflicts.js +426 -0
  48. package/dist/commands/conflicts.js.map +1 -0
  49. package/dist/commands/demo.d.ts +3 -0
  50. package/dist/commands/demo.d.ts.map +1 -0
  51. package/dist/commands/demo.js +113 -0
  52. package/dist/commands/demo.js.map +1 -0
  53. package/dist/commands/depends.d.ts +8 -0
  54. package/dist/commands/depends.d.ts.map +1 -0
  55. package/dist/commands/depends.js +44 -0
  56. package/dist/commands/depends.js.map +1 -0
  57. package/dist/commands/doctor.d.ts +8 -0
  58. package/dist/commands/doctor.d.ts.map +1 -0
  59. package/dist/commands/doctor.js +249 -0
  60. package/dist/commands/doctor.js.map +1 -0
  61. package/dist/commands/inbox.d.ts +3 -0
  62. package/dist/commands/inbox.d.ts.map +1 -0
  63. package/dist/commands/inbox.js +66 -0
  64. package/dist/commands/inbox.js.map +1 -0
  65. package/dist/commands/index.d.ts +43 -0
  66. package/dist/commands/index.d.ts.map +1 -0
  67. package/dist/commands/index.js +61 -0
  68. package/dist/commands/index.js.map +1 -0
  69. package/dist/commands/init.d.ts +8 -0
  70. package/dist/commands/init.d.ts.map +1 -0
  71. package/dist/commands/init.js +23 -0
  72. package/dist/commands/init.js.map +1 -0
  73. package/dist/commands/intent-scan.d.ts +17 -0
  74. package/dist/commands/intent-scan.d.ts.map +1 -0
  75. package/dist/commands/intent-scan.js +336 -0
  76. package/dist/commands/intent-scan.js.map +1 -0
  77. package/dist/commands/key-import.d.ts +3 -0
  78. package/dist/commands/key-import.d.ts.map +1 -0
  79. package/dist/commands/key-import.js +54 -0
  80. package/dist/commands/key-import.js.map +1 -0
  81. package/dist/commands/keygen.d.ts +3 -0
  82. package/dist/commands/keygen.d.ts.map +1 -0
  83. package/dist/commands/keygen.js +53 -0
  84. package/dist/commands/keygen.js.map +1 -0
  85. package/dist/commands/keys.d.ts +3 -0
  86. package/dist/commands/keys.d.ts.map +1 -0
  87. package/dist/commands/keys.js +56 -0
  88. package/dist/commands/keys.js.map +1 -0
  89. package/dist/commands/list.d.ts +3 -0
  90. package/dist/commands/list.d.ts.map +1 -0
  91. package/dist/commands/list.js +45 -0
  92. package/dist/commands/list.js.map +1 -0
  93. package/dist/commands/lock.d.ts +11 -0
  94. package/dist/commands/lock.d.ts.map +1 -0
  95. package/dist/commands/lock.js +220 -0
  96. package/dist/commands/lock.js.map +1 -0
  97. package/dist/commands/log.d.ts +8 -0
  98. package/dist/commands/log.d.ts.map +1 -0
  99. package/dist/commands/log.js +95 -0
  100. package/dist/commands/log.js.map +1 -0
  101. package/dist/commands/mcp-health.d.ts +3 -0
  102. package/dist/commands/mcp-health.d.ts.map +1 -0
  103. package/dist/commands/mcp-health.js +305 -0
  104. package/dist/commands/mcp-health.js.map +1 -0
  105. package/dist/commands/mcp-restart.d.ts +3 -0
  106. package/dist/commands/mcp-restart.d.ts.map +1 -0
  107. package/dist/commands/mcp-restart.js +176 -0
  108. package/dist/commands/mcp-restart.js.map +1 -0
  109. package/dist/commands/merge-order.d.ts +9 -0
  110. package/dist/commands/merge-order.d.ts.map +1 -0
  111. package/dist/commands/merge-order.js +138 -0
  112. package/dist/commands/merge-order.js.map +1 -0
  113. package/dist/commands/merged.d.ts +8 -0
  114. package/dist/commands/merged.d.ts.map +1 -0
  115. package/dist/commands/merged.js +39 -0
  116. package/dist/commands/merged.js.map +1 -0
  117. package/dist/commands/msg-read.d.ts +3 -0
  118. package/dist/commands/msg-read.d.ts.map +1 -0
  119. package/dist/commands/msg-read.js +70 -0
  120. package/dist/commands/msg-read.js.map +1 -0
  121. package/dist/commands/pulse.d.ts +9 -0
  122. package/dist/commands/pulse.d.ts.map +1 -0
  123. package/dist/commands/pulse.js +232 -0
  124. package/dist/commands/pulse.js.map +1 -0
  125. package/dist/commands/radar.d.ts +3 -0
  126. package/dist/commands/radar.d.ts.map +1 -0
  127. package/dist/commands/radar.js +147 -0
  128. package/dist/commands/radar.js.map +1 -0
  129. package/dist/commands/ready-check.d.ts +9 -0
  130. package/dist/commands/ready-check.d.ts.map +1 -0
  131. package/dist/commands/ready-check.js +156 -0
  132. package/dist/commands/ready-check.js.map +1 -0
  133. package/dist/commands/register.d.ts +3 -0
  134. package/dist/commands/register.d.ts.map +1 -0
  135. package/dist/commands/register.js +124 -0
  136. package/dist/commands/register.js.map +1 -0
  137. package/dist/commands/send.d.ts +3 -0
  138. package/dist/commands/send.d.ts.map +1 -0
  139. package/dist/commands/send.js +134 -0
  140. package/dist/commands/send.js.map +1 -0
  141. package/dist/commands/stale.d.ts +8 -0
  142. package/dist/commands/stale.d.ts.map +1 -0
  143. package/dist/commands/stale.js +38 -0
  144. package/dist/commands/stale.js.map +1 -0
  145. package/dist/commands/status.d.ts +9 -0
  146. package/dist/commands/status.d.ts.map +1 -0
  147. package/dist/commands/status.js +41 -0
  148. package/dist/commands/status.js.map +1 -0
  149. package/dist/commands/sync-all.d.ts +9 -0
  150. package/dist/commands/sync-all.d.ts.map +1 -0
  151. package/dist/commands/sync-all.js +180 -0
  152. package/dist/commands/sync-all.js.map +1 -0
  153. package/dist/commands/sync.d.ts +8 -0
  154. package/dist/commands/sync.d.ts.map +1 -0
  155. package/dist/commands/sync.js +49 -0
  156. package/dist/commands/sync.js.map +1 -0
  157. package/dist/commands/tension.d.ts +12 -0
  158. package/dist/commands/tension.d.ts.map +1 -0
  159. package/dist/commands/tension.js +242 -0
  160. package/dist/commands/tension.js.map +1 -0
  161. package/dist/commands/torrent.d.ts +9 -0
  162. package/dist/commands/torrent.d.ts.map +1 -0
  163. package/dist/commands/torrent.js +431 -0
  164. package/dist/commands/torrent.js.map +1 -0
  165. package/dist/commands/tui.d.ts +8 -0
  166. package/dist/commands/tui.d.ts.map +1 -0
  167. package/dist/commands/tui.js +15 -0
  168. package/dist/commands/tui.js.map +1 -0
  169. package/dist/commands/wake.d.ts +9 -0
  170. package/dist/commands/wake.d.ts.map +1 -0
  171. package/dist/commands/wake.js +188 -0
  172. package/dist/commands/wake.js.map +1 -0
  173. package/dist/commands/watch.d.ts +3 -0
  174. package/dist/commands/watch.d.ts.map +1 -0
  175. package/dist/commands/watch.js +245 -0
  176. package/dist/commands/watch.js.map +1 -0
  177. package/dist/commands/who-touched.d.ts +9 -0
  178. package/dist/commands/who-touched.d.ts.map +1 -0
  179. package/dist/commands/who-touched.js +186 -0
  180. package/dist/commands/who-touched.js.map +1 -0
  181. package/dist/index.d.ts +6 -0
  182. package/dist/index.d.ts.map +1 -0
  183. package/dist/index.js +6 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/lib/agent-errors.d.ts +41 -0
  186. package/dist/lib/agent-errors.d.ts.map +1 -0
  187. package/dist/lib/agent-errors.js +143 -0
  188. package/dist/lib/agent-errors.js.map +1 -0
  189. package/dist/lib/ast.d.ts +56 -0
  190. package/dist/lib/ast.d.ts.map +1 -0
  191. package/dist/lib/ast.js +134 -0
  192. package/dist/lib/ast.js.map +1 -0
  193. package/dist/lib/config.d.ts +33 -0
  194. package/dist/lib/config.d.ts.map +1 -0
  195. package/dist/lib/config.js +127 -0
  196. package/dist/lib/config.js.map +1 -0
  197. package/dist/lib/crdt.d.ts +83 -0
  198. package/dist/lib/crdt.d.ts.map +1 -0
  199. package/dist/lib/crdt.js +160 -0
  200. package/dist/lib/crdt.js.map +1 -0
  201. package/dist/lib/crypto.d.ts +71 -0
  202. package/dist/lib/crypto.d.ts.map +1 -0
  203. package/dist/lib/crypto.js +172 -0
  204. package/dist/lib/crypto.js.map +1 -0
  205. package/dist/lib/errors.d.ts +35 -0
  206. package/dist/lib/errors.d.ts.map +1 -0
  207. package/dist/lib/errors.js +71 -0
  208. package/dist/lib/errors.js.map +1 -0
  209. package/dist/lib/license.d.ts +61 -0
  210. package/dist/lib/license.d.ts.map +1 -0
  211. package/dist/lib/license.js +171 -0
  212. package/dist/lib/license.js.map +1 -0
  213. package/dist/lib/security.d.ts +53 -0
  214. package/dist/lib/security.d.ts.map +1 -0
  215. package/dist/lib/security.js +122 -0
  216. package/dist/lib/security.js.map +1 -0
  217. package/dist/lib/update-check.d.ts +11 -0
  218. package/dist/lib/update-check.d.ts.map +1 -0
  219. package/dist/lib/update-check.js +113 -0
  220. package/dist/lib/update-check.js.map +1 -0
  221. package/dist/storage/adapter.d.ts +58 -0
  222. package/dist/storage/adapter.d.ts.map +1 -0
  223. package/dist/storage/adapter.js +8 -0
  224. package/dist/storage/adapter.js.map +1 -0
  225. package/dist/storage/factory.d.ts +6 -0
  226. package/dist/storage/factory.d.ts.map +1 -0
  227. package/dist/storage/factory.js +22 -0
  228. package/dist/storage/factory.js.map +1 -0
  229. package/dist/storage/index.d.ts +5 -0
  230. package/dist/storage/index.d.ts.map +1 -0
  231. package/dist/storage/index.js +5 -0
  232. package/dist/storage/index.js.map +1 -0
  233. package/dist/storage/local.d.ts +24 -0
  234. package/dist/storage/local.d.ts.map +1 -0
  235. package/dist/storage/local.js +101 -0
  236. package/dist/storage/local.js.map +1 -0
  237. package/dist/storage/supabase.d.ts +52 -0
  238. package/dist/storage/supabase.d.ts.map +1 -0
  239. package/dist/storage/supabase.js +221 -0
  240. package/dist/storage/supabase.js.map +1 -0
  241. package/dist/tui/screen.d.ts +14 -0
  242. package/dist/tui/screen.d.ts.map +1 -0
  243. package/dist/tui/screen.js +136 -0
  244. package/dist/tui/screen.js.map +1 -0
  245. package/package.json +89 -0
@@ -0,0 +1,431 @@
1
+ /**
2
+ * spidersan torrent
3
+ *
4
+ * Task Torrenting integration - manage branches for parallel task execution.
5
+ * BitTorrent-inspired approach: tasks are "seeded" by one agent, "downloaded" by others.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { execSync } from 'child_process';
9
+ import { getStorage } from '../storage/index.js';
10
+ // Config
11
+ const HUB_URL = process.env.HUB_URL || 'https://hub.treebird.uk';
12
+ function getCurrentBranch() {
13
+ try {
14
+ return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
15
+ }
16
+ catch {
17
+ throw new Error('Not in a git repository');
18
+ }
19
+ }
20
+ function createBranchForTask(taskId) {
21
+ const branchName = `task/${taskId}`;
22
+ try {
23
+ // Check if branch exists
24
+ execSync(`git rev-parse --verify ${branchName}`, { encoding: 'utf-8', stdio: 'pipe' });
25
+ console.log(` Branch ${branchName} already exists, checking out...`);
26
+ execSync(`git checkout ${branchName}`, { encoding: 'utf-8' });
27
+ }
28
+ catch {
29
+ // Branch doesn't exist, create it
30
+ execSync(`git checkout -b ${branchName}`, { encoding: 'utf-8' });
31
+ }
32
+ }
33
+ /**
34
+ * Parse task ID to extract parent if nested (e.g., DASH-001-A -> parent is DASH-001)
35
+ */
36
+ function getParentTaskId(taskId) {
37
+ // Pattern: PARENT-CHILD (e.g., DASH-001-A, SEC-002-B)
38
+ const match = taskId.match(/^(.+)-[A-Za-z]$/);
39
+ return match ? match[1] : null;
40
+ }
41
+ /**
42
+ * Check for conflicts with other task branches
43
+ */
44
+ async function checkForConflicts(branchName) {
45
+ const storage = await getStorage();
46
+ const branches = await storage.list();
47
+ const currentBranch = await storage.get(branchName);
48
+ if (!currentBranch)
49
+ return [];
50
+ const conflicts = [];
51
+ for (const other of branches) {
52
+ if (other.name === branchName || other.status !== 'active')
53
+ continue;
54
+ if (!other.name.startsWith('task/'))
55
+ continue; // Only check other task branches
56
+ const overlap = currentBranch.files.filter(f => other.files.includes(f));
57
+ if (overlap.length > 0) {
58
+ conflicts.push({ branch: other.name, files: overlap });
59
+ }
60
+ }
61
+ return conflicts;
62
+ }
63
+ // Main torrent command with subcommands
64
+ export const torrentCommand = new Command('torrent')
65
+ .description('🔄 Task Torrenting - manage branches for parallel task execution');
66
+ // Subcommand: torrent create <task-id>
67
+ torrentCommand
68
+ .command('create <task-id>')
69
+ .description('Create a branch for a task (e.g., spidersan torrent create DASH-001)')
70
+ .option('-a, --agent <agent>', 'Agent claiming this task')
71
+ .option('-p, --parent <parent-task>', 'Parent task ID (for nested decomposition)')
72
+ .action(async (taskId, 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 = `task/${taskId}`;
79
+ const agent = options.agent || process.env.SPIDERSAN_AGENT || 'unknown';
80
+ const parentTaskId = options.parent || getParentTaskId(taskId);
81
+ console.log(`
82
+ 🔄 TASK TORRENTING: Create Branch
83
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
84
+ Task: ${taskId}
85
+ Branch: ${branchName}
86
+ Agent: ${agent}
87
+ Parent: ${parentTaskId || '(none)'}
88
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
89
+ `);
90
+ // Create git branch
91
+ createBranchForTask(taskId);
92
+ console.log(`✅ Created and checked out: ${branchName}`);
93
+ // Register in Spidersan
94
+ const existing = await storage.get(branchName);
95
+ if (existing) {
96
+ await storage.update(branchName, {
97
+ agent,
98
+ status: 'active',
99
+ description: parentTaskId ? `Child of ${parentTaskId}` : undefined
100
+ });
101
+ }
102
+ else {
103
+ await storage.register({
104
+ name: branchName,
105
+ files: [],
106
+ status: 'active',
107
+ agent,
108
+ description: parentTaskId ? `Child of ${parentTaskId}` : undefined
109
+ });
110
+ }
111
+ console.log(`✅ Registered in Spidersan`);
112
+ // Try to notify Hub
113
+ try {
114
+ await fetch(`${HUB_URL}/api/tasks/${taskId}/claim`, {
115
+ method: 'POST',
116
+ headers: { 'Content-Type': 'application/json' },
117
+ body: JSON.stringify({ agent, branch: branchName })
118
+ });
119
+ console.log(`✅ Notified Hub`);
120
+ }
121
+ catch {
122
+ console.log(`⚠️ Could not notify Hub (offline?)`);
123
+ }
124
+ console.log(`
125
+ 💡 Next steps:
126
+ 1. Make your changes
127
+ 2. git add && git commit
128
+ 3. spidersan torrent complete ${taskId}
129
+ `);
130
+ });
131
+ // Subcommand: torrent status
132
+ torrentCommand
133
+ .command('status')
134
+ .description('Show all active task branches and their status')
135
+ .option('--json', 'Output as JSON')
136
+ .option('-p, --parent <parent-task>', 'Filter by parent task')
137
+ .action(async (options) => {
138
+ const storage = await getStorage();
139
+ if (!await storage.isInitialized()) {
140
+ console.error('❌ Spidersan not initialized. Run: spidersan init');
141
+ process.exit(1);
142
+ }
143
+ const branches = await storage.list();
144
+ const taskBranches = branches.filter(b => b.name.startsWith('task/') && b.status === 'active');
145
+ // Filter by parent if specified
146
+ const filtered = options.parent
147
+ ? taskBranches.filter(b => {
148
+ const taskId = b.name.replace('task/', '');
149
+ return taskId.startsWith(options.parent) || getParentTaskId(taskId) === options.parent;
150
+ })
151
+ : taskBranches;
152
+ if (options.json) {
153
+ console.log(JSON.stringify({ tasks: filtered }, null, 2));
154
+ return;
155
+ }
156
+ if (filtered.length === 0) {
157
+ console.log('🔄 No active task branches.');
158
+ console.log(' Use: spidersan torrent create <task-id>');
159
+ return;
160
+ }
161
+ console.log(`
162
+ 🔄 TASK TORRENTING: Status
163
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━
164
+ Active Tasks: ${filtered.length}
165
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━
166
+ `);
167
+ // Group by parent
168
+ const byParent = new Map();
169
+ for (const branch of filtered) {
170
+ const taskId = branch.name.replace('task/', '');
171
+ const parent = getParentTaskId(taskId) || 'root';
172
+ if (!byParent.has(parent))
173
+ byParent.set(parent, []);
174
+ byParent.get(parent).push(branch);
175
+ }
176
+ for (const [parent, tasks] of byParent) {
177
+ if (parent !== 'root') {
178
+ console.log(`\n📦 Parent: ${parent}`);
179
+ }
180
+ for (const task of tasks) {
181
+ const taskId = task.name.replace('task/', '');
182
+ const conflicts = await checkForConflicts(task.name);
183
+ const status = conflicts.length > 0 ? '⚠️' : '✅';
184
+ const agentTag = task.agent ? ` (${task.agent})` : '';
185
+ console.log(` ${status} ${taskId}${agentTag}`);
186
+ if (task.files.length > 0) {
187
+ console.log(` Files: ${task.files.slice(0, 3).join(', ')}${task.files.length > 3 ? '...' : ''}`);
188
+ }
189
+ if (conflicts.length > 0) {
190
+ console.log(` ⚠️ Conflicts with: ${conflicts.map(c => c.branch).join(', ')}`);
191
+ }
192
+ }
193
+ }
194
+ });
195
+ // Subcommand: torrent complete <task-id>
196
+ torrentCommand
197
+ .command('complete <task-id>')
198
+ .description('Mark a task as complete and prepare for merge')
199
+ .option('-a, --agent <agent>', 'Agent completing this task')
200
+ .action(async (taskId, options) => {
201
+ const storage = await getStorage();
202
+ const branchName = `task/${taskId}`;
203
+ const agent = options.agent || process.env.SPIDERSAN_AGENT || 'unknown';
204
+ const branch = await storage.get(branchName);
205
+ if (!branch) {
206
+ console.error(`❌ Task branch not found: ${branchName}`);
207
+ console.log(` Run: spidersan torrent create ${taskId}`);
208
+ process.exit(1);
209
+ }
210
+ // Mark as completed
211
+ await storage.update(branchName, { status: 'completed' });
212
+ console.log(`
213
+ 🎉 TASK COMPLETE: ${taskId}
214
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━
215
+ Branch: ${branchName}
216
+ Agent: ${agent}
217
+ Files: ${branch.files.length}
218
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━
219
+ `);
220
+ // Check for conflicts before merge recommendation
221
+ const conflicts = await checkForConflicts(branchName);
222
+ if (conflicts.length > 0) {
223
+ console.log(`⚠️ Conflicts detected! Resolve before merging:`);
224
+ conflicts.forEach(c => {
225
+ console.log(` • ${c.branch}: ${c.files.join(', ')}`);
226
+ });
227
+ }
228
+ else {
229
+ console.log(`✅ No conflicts - ready to merge!`);
230
+ }
231
+ // Try to notify Hub
232
+ try {
233
+ await fetch(`${HUB_URL}/api/tasks/${taskId}/complete`, {
234
+ method: 'POST',
235
+ headers: { 'Content-Type': 'application/json' },
236
+ body: JSON.stringify({ agent, branch: branchName })
237
+ });
238
+ console.log(`✅ Notified Hub`);
239
+ }
240
+ catch {
241
+ console.log(`⚠️ Could not notify Hub (offline?)`);
242
+ }
243
+ console.log(`
244
+ 💡 Next steps:
245
+ 1. Push your branch: git push origin ${branchName}
246
+ 2. Create PR or merge: git checkout main && git merge ${branchName}
247
+ 3. Clean up: spidersan merged ${branchName}
248
+ `);
249
+ });
250
+ // Subcommand: torrent merge-order
251
+ torrentCommand
252
+ .command('merge-order')
253
+ .description('Get optimal merge order for all task branches')
254
+ .option('--json', 'Output as JSON')
255
+ .action(async (options) => {
256
+ const storage = await getStorage();
257
+ const branches = await storage.list();
258
+ const taskBranches = branches.filter(b => b.name.startsWith('task/') &&
259
+ (b.status === 'active' || b.status === 'completed'));
260
+ if (taskBranches.length === 0) {
261
+ console.log('🔄 No task branches to merge.');
262
+ return;
263
+ }
264
+ // Build conflict graph
265
+ const conflictGraph = new Map();
266
+ for (const branch of taskBranches) {
267
+ const conflicts = [];
268
+ for (const other of taskBranches) {
269
+ if (branch.name === other.name)
270
+ continue;
271
+ const overlap = branch.files.some(f => other.files.includes(f));
272
+ if (overlap)
273
+ conflicts.push(other.name);
274
+ }
275
+ conflictGraph.set(branch.name, conflicts);
276
+ }
277
+ // Sort: completed first, then by fewest conflicts
278
+ const sorted = [...taskBranches].sort((a, b) => {
279
+ // Completed tasks first
280
+ if (a.status === 'completed' && b.status !== 'completed')
281
+ return -1;
282
+ if (b.status === 'completed' && a.status !== 'completed')
283
+ return 1;
284
+ // Fewest conflicts first
285
+ const conflictsA = conflictGraph.get(a.name)?.length || 0;
286
+ const conflictsB = conflictGraph.get(b.name)?.length || 0;
287
+ return conflictsA - conflictsB;
288
+ });
289
+ if (options.json) {
290
+ console.log(JSON.stringify({
291
+ order: sorted.map(b => ({
292
+ name: b.name,
293
+ taskId: b.name.replace('task/', ''),
294
+ status: b.status,
295
+ conflicts: conflictGraph.get(b.name) || []
296
+ }))
297
+ }, null, 2));
298
+ return;
299
+ }
300
+ console.log(`
301
+ 🔄 TASK TORRENTING: Merge Order
302
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
303
+ `);
304
+ sorted.forEach((branch, i) => {
305
+ const taskId = branch.name.replace('task/', '');
306
+ const conflicts = conflictGraph.get(branch.name) || [];
307
+ const statusIcon = branch.status === 'completed' ? '✅' : '🔄';
308
+ const conflictIcon = conflicts.length > 0 ? '⚠️' : '';
309
+ console.log(` ${i + 1}. ${statusIcon} ${taskId} ${conflictIcon}`);
310
+ if (conflicts.length > 0) {
311
+ console.log(` └─ Rebase after: ${conflicts.map(c => c.replace('task/', '')).join(', ')}`);
312
+ }
313
+ });
314
+ console.log(`
315
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
316
+ 💡 Merge ✅ completed tasks first, then handle 🔄 active.
317
+ `);
318
+ });
319
+ // Subcommand: torrent tree
320
+ torrentCommand
321
+ .command('tree')
322
+ .description('Show nested task branches as a tree structure')
323
+ .option('--json', 'Output as JSON')
324
+ .action(async (options) => {
325
+ const storage = await getStorage();
326
+ const branches = await storage.list();
327
+ const taskBranches = branches.filter(b => b.name.startsWith('task/'));
328
+ if (taskBranches.length === 0) {
329
+ console.log('🔄 No task branches found.');
330
+ return;
331
+ }
332
+ const nodeMap = new Map();
333
+ const roots = [];
334
+ // First pass: create all nodes
335
+ for (const branch of taskBranches) {
336
+ const taskId = branch.name.replace('task/', '');
337
+ const node = {
338
+ id: taskId,
339
+ branch: branch.name,
340
+ status: branch.status,
341
+ agent: branch.agent,
342
+ files: branch.files,
343
+ children: []
344
+ };
345
+ nodeMap.set(taskId, node);
346
+ }
347
+ // Second pass: build tree
348
+ for (const [taskId, node] of nodeMap) {
349
+ const parentId = getParentTaskId(taskId);
350
+ if (parentId && nodeMap.has(parentId)) {
351
+ nodeMap.get(parentId).children.push(node);
352
+ }
353
+ else {
354
+ roots.push(node);
355
+ }
356
+ }
357
+ if (options.json) {
358
+ console.log(JSON.stringify({ tree: roots }, null, 2));
359
+ return;
360
+ }
361
+ console.log(`
362
+ 🌲 TASK TREE (Nested Branches)
363
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
364
+ `);
365
+ // Recursive tree printer
366
+ function printNode(node, indent, isLast) {
367
+ const branch = isLast ? '└─' : '├─';
368
+ const statusIcon = node.status === 'completed' ? '✅' :
369
+ node.status === 'active' ? '🔄' : '⚫';
370
+ const agentTag = node.agent ? ` (${node.agent})` : '';
371
+ console.log(`${indent}${branch} ${statusIcon} ${node.id}${agentTag}`);
372
+ const nextIndent = indent + (isLast ? ' ' : '│ ');
373
+ node.children.forEach((child, i) => {
374
+ printNode(child, nextIndent, i === node.children.length - 1);
375
+ });
376
+ }
377
+ roots.forEach((root, i) => {
378
+ printNode(root, '', i === roots.length - 1);
379
+ });
380
+ // Summary
381
+ const total = taskBranches.length;
382
+ const completed = taskBranches.filter(b => b.status === 'completed').length;
383
+ const active = taskBranches.filter(b => b.status === 'active').length;
384
+ const parents = roots.length;
385
+ const children = total - roots.filter(r => r.children.length === 0).length;
386
+ console.log(`
387
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
388
+ 📊 Total: ${total} | Parents: ${parents} | Nested: ${children}
389
+ ✅ ${completed} complete | 🔄 ${active} active
390
+ `);
391
+ });
392
+ // Subcommand: torrent decompose <parent-id>
393
+ torrentCommand
394
+ .command('decompose <parent-id>')
395
+ .description('Create child tasks from a parent (e.g., decompose DASH into DASH-A, DASH-B, DASH-C)')
396
+ .option('-c, --count <count>', 'Number of child tasks to create', '3')
397
+ .option('-a, --agent <agent>', 'Agent creating the decomposition')
398
+ .action(async (parentId, options) => {
399
+ const storage = await getStorage();
400
+ const count = parseInt(options.count || '3', 10);
401
+ const agent = options.agent || process.env.SPIDERSAN_AGENT || 'unknown';
402
+ const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
403
+ console.log(`
404
+ 🔀 DECOMPOSING: ${parentId}
405
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
406
+ Creating ${count} child tasks...
407
+ `);
408
+ const created = [];
409
+ for (let i = 0; i < Math.min(count, 26); i++) {
410
+ const childId = `${parentId}-${letters[i]}`;
411
+ const branchName = `task/${childId}`;
412
+ // Register child task (don't create git branch, just register)
413
+ await storage.register({
414
+ name: branchName,
415
+ files: [],
416
+ status: 'active',
417
+ agent: undefined, // Not claimed yet
418
+ description: `Child of ${parentId}`
419
+ });
420
+ created.push(childId);
421
+ console.log(` 📦 ${childId}`);
422
+ }
423
+ console.log(`
424
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
425
+ ✅ Created ${created.length} child tasks
426
+
427
+ 💡 Next: Agents can claim with:
428
+ spidersan torrent create ${created[0]} --agent <name>
429
+ `);
430
+ });
431
+ //# sourceMappingURL=torrent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"torrent.js","sourceRoot":"","sources":["../../src/commands/torrent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * spidersan tui
3
+ *
4
+ * Launch interactive terminal dashboard
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const tuiCommand: Command;
8
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,UAAU,SAMjB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * spidersan tui
3
+ *
4
+ * Launch interactive terminal dashboard
5
+ */
6
+ import { Command } from 'commander';
7
+ import { SpidersanTUI } from '../tui/screen.js';
8
+ export const tuiCommand = new Command('tui')
9
+ .description('Launch interactive terminal dashboard')
10
+ .alias('dashboard')
11
+ .action(() => {
12
+ const tui = new SpidersanTUI();
13
+ tui.start();
14
+ });
15
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACvC,WAAW,CAAC,uCAAuC,CAAC;KACpD,KAAK,CAAC,WAAW,CAAC;KAClB,MAAM,CAAC,GAAG,EAAE;IACT,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;IAC/B,GAAG,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * spidersan wake
3
+ *
4
+ * Start a session with branch context.
5
+ * "Weaving into the Web" - the spider feels its threads.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare const wakeCommand: Command;
9
+ //# sourceMappingURL=wake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wake.d.ts","sourceRoot":"","sources":["../../src/commands/wake.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4CpC,eAAO,MAAM,WAAW,SAyJlB,CAAC"}