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,426 @@
1
+ /**
2
+ * spidersan conflicts
3
+ *
4
+ * Detect file conflicts between branches.
5
+ * Supports tiered conflict blocking:
6
+ * TIER 1: Warning only (informational)
7
+ * TIER 2: Pause (notify agent, recommend action)
8
+ * TIER 3: Block (exit with error, prevent merge)
9
+ */
10
+ import { Command } from 'commander';
11
+ import { execSync } from 'child_process';
12
+ import { getStorage } from '../storage/index.js';
13
+ import { ASTParser } from '../lib/ast.js';
14
+ // Security: Input validation patterns
15
+ const VALID_AGENT_ID = /^[a-z0-9][a-z0-9_-]{0,30}$/i;
16
+ const VALID_BRANCH_NAME = /^[a-zA-Z0-9][a-zA-Z0-9/_.-]{0,99}$/;
17
+ function validateAgentId(agentId) {
18
+ if (!VALID_AGENT_ID.test(agentId)) {
19
+ throw new Error(`Invalid agent ID: "${agentId.slice(0, 20)}..." (must be alphanumeric with - or _)`);
20
+ }
21
+ return agentId;
22
+ }
23
+ function validateBranchName(branch) {
24
+ if (!VALID_BRANCH_NAME.test(branch)) {
25
+ throw new Error(`Invalid branch name: "${branch.slice(0, 20)}..."`);
26
+ }
27
+ return branch;
28
+ }
29
+ // Config
30
+ const HUB_URL = process.env.HUB_URL || 'https://hub.treebird.uk';
31
+ // Critical files that trigger TIER 3 blocking
32
+ const TIER_3_PATTERNS = [
33
+ /\.env$/,
34
+ /secrets?\./i,
35
+ /credentials/i,
36
+ /password/i,
37
+ /api[_-]?key/i,
38
+ /private[_-]?key/i,
39
+ /\.pem$/,
40
+ /auth\.(ts|js)$/,
41
+ /security\.(ts|js)$/,
42
+ ];
43
+ // Important files that trigger TIER 2 pause
44
+ const TIER_2_PATTERNS = [
45
+ /package\.json$/,
46
+ /package-lock\.json$/,
47
+ /tsconfig\.json$/,
48
+ /CLAUDE\.md$/,
49
+ /\.gitignore$/,
50
+ /server\.(ts|js)$/,
51
+ /index\.(ts|js)$/,
52
+ /config\.(ts|js)$/,
53
+ ];
54
+ function getConflictTier(file) {
55
+ // Check TIER 3 first (most critical)
56
+ for (const pattern of TIER_3_PATTERNS) {
57
+ if (pattern.test(file)) {
58
+ return {
59
+ tier: 3,
60
+ label: 'BLOCK',
61
+ icon: '🔴',
62
+ action: 'Merge blocked. Resolve conflict first.'
63
+ };
64
+ }
65
+ }
66
+ // Check TIER 2
67
+ for (const pattern of TIER_2_PATTERNS) {
68
+ if (pattern.test(file)) {
69
+ return {
70
+ tier: 2,
71
+ label: 'PAUSE',
72
+ icon: '🟠',
73
+ action: 'Coordinate with other agent before proceeding.'
74
+ };
75
+ }
76
+ }
77
+ // Default: TIER 1
78
+ return {
79
+ tier: 1,
80
+ label: 'WARN',
81
+ icon: '🟡',
82
+ action: 'Consider coordinating, but safe to proceed.'
83
+ };
84
+ }
85
+ function getCurrentBranch() {
86
+ try {
87
+ return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
88
+ }
89
+ catch {
90
+ throw new Error('Not in a git repository');
91
+ }
92
+ }
93
+ async function notifyHub(branch, conflicts) {
94
+ const tier3 = conflicts.filter(c => c.tier === 3);
95
+ const tier2 = conflicts.filter(c => c.tier === 2);
96
+ if (tier3.length === 0 && tier2.length === 0)
97
+ return;
98
+ const severity = tier3.length > 0 ? '🔴 TIER 3 BLOCK' : '🟠 TIER 2 PAUSE';
99
+ const message = `🕷️⚠️ **Conflict Alert** on \`${branch}\`\n\n${severity}\n\nConflicting files require coordination.`;
100
+ try {
101
+ await fetch(`${HUB_URL}/api/chat`, {
102
+ method: 'POST',
103
+ headers: { 'Content-Type': 'application/json' },
104
+ body: JSON.stringify({
105
+ agent: 'ssan',
106
+ name: 'Spidersan',
107
+ message,
108
+ glyph: '🕷️'
109
+ })
110
+ });
111
+ }
112
+ catch {
113
+ // Hub offline - silent fail
114
+ }
115
+ }
116
+ /**
117
+ * Wake a conflicting agent and send them a message about what to fix
118
+ */
119
+ async function wakeConflictingAgent(agentId, myBranch, theirBranch, conflictingFiles) {
120
+ const fileList = conflictingFiles.slice(0, 5).join(', ');
121
+ const more = conflictingFiles.length > 5 ? ` (+${conflictingFiles.length - 5} more)` : '';
122
+ // 1. Wake the agent via Hub
123
+ try {
124
+ const wakeResponse = await fetch(`${HUB_URL}/api/wake/${agentId}`, {
125
+ method: 'POST',
126
+ headers: { 'Content-Type': 'application/json' },
127
+ body: JSON.stringify({
128
+ sender: 'ssan',
129
+ reason: `Conflict on ${theirBranch} - need resolution`
130
+ })
131
+ });
132
+ if (wakeResponse.ok) {
133
+ console.log(` 🔔 Wake signal sent to ${agentId}`);
134
+ }
135
+ }
136
+ catch {
137
+ console.log(` ⚠️ Could not wake ${agentId} via Hub`);
138
+ }
139
+ // 2. Send a detailed mycmail message
140
+ try {
141
+ const { execFileSync } = await import('child_process');
142
+ // Security: Validate inputs before shell execution
143
+ const safeAgentId = validateAgentId(agentId);
144
+ const safeBranch = validateBranchName(theirBranch);
145
+ const safeMyBranch = validateBranchName(myBranch);
146
+ const subject = `🕷️ Conflict Alert: ${safeBranch}`;
147
+ const body = [
148
+ `Hey ${safeAgentId}!`,
149
+ ``,
150
+ `Spidersan detected a conflict between our branches:`,
151
+ ``,
152
+ ` My branch: ${safeMyBranch}`,
153
+ ` Your branch: ${safeBranch}`,
154
+ ``,
155
+ `Conflicting files: ${fileList}${more}`,
156
+ ``,
157
+ `Action needed:`,
158
+ ` 1. Check your changes on these files`,
159
+ ` 2. Coordinate with me or rebase`,
160
+ ` 3. Run: spidersan conflicts --branch ${safeBranch}`,
161
+ ``,
162
+ `Let's sync up! 🕷️`
163
+ ].join('\n');
164
+ // Security: Use execFileSync with argument array instead of string interpolation
165
+ execFileSync('mycmail', ['send', safeAgentId, subject, '-m', body], {
166
+ encoding: 'utf-8',
167
+ stdio: 'pipe'
168
+ });
169
+ console.log(` 📧 Message sent to ${agentId}`);
170
+ return true;
171
+ }
172
+ catch {
173
+ console.log(` ⚠️ Could not send mycmail to ${agentId}`);
174
+ return false;
175
+ }
176
+ }
177
+ /**
178
+ * Wait for a specified time
179
+ */
180
+ function sleep(ms) {
181
+ return new Promise(resolve => setTimeout(resolve, ms));
182
+ }
183
+ /**
184
+ * Prompt user for Y/N confirmation (prevents Ralph Wiggum loops)
185
+ * @param prompt - The question to ask
186
+ * @param autoConfirm - If true, skip prompt and return true (for --auto mode)
187
+ */
188
+ async function confirmAction(prompt, autoConfirm = false) {
189
+ if (autoConfirm) {
190
+ console.log(`${prompt} [Y/n]: Y (auto)`);
191
+ return true;
192
+ }
193
+ const readline = await import('readline');
194
+ const rl = readline.createInterface({
195
+ input: process.stdin,
196
+ output: process.stdout
197
+ });
198
+ return new Promise((resolve) => {
199
+ rl.question(`${prompt} [Y/n]: `, (answer) => {
200
+ rl.close();
201
+ const normalized = answer.toLowerCase().trim();
202
+ resolve(normalized === '' || normalized === 'y' || normalized === 'yes');
203
+ });
204
+ });
205
+ }
206
+ export const conflictsCommand = new Command('conflicts')
207
+ .description('Detect file conflicts between branches (with tiered blocking)')
208
+ .option('--branch <name>', 'Check conflicts for specific branch')
209
+ .option('--json', 'Output as JSON')
210
+ .option('--tier <level>', 'Filter by minimum tier (1, 2, or 3)', '1')
211
+ .option('--strict', 'Strict mode: exit with error if TIER 2+ conflicts found')
212
+ .option('--notify', 'Notify Hub of TIER 2+ conflicts')
213
+ .option('--wake', 'Wake conflicting agents and send them fix instructions')
214
+ .option('--retry <seconds>', 'After waking, wait N seconds and re-check conflicts')
215
+ .option('--auto', 'Auto mode: skip confirmations (enables Ralph Wiggum loop)')
216
+ .option('--max-retries <count>', 'Maximum retry attempts in auto mode (default: 5)', '5')
217
+ .option('--semantic', 'Use semantic (AST) analysis for symbol-level conflict detection')
218
+ .action(async (options) => {
219
+ const storage = await getStorage();
220
+ if (!await storage.isInitialized()) {
221
+ console.error('❌ Spidersan not initialized. Run: spidersan init');
222
+ process.exit(1);
223
+ }
224
+ const targetBranch = options.branch || getCurrentBranch();
225
+ const target = await storage.get(targetBranch);
226
+ const minTier = parseInt(options.tier, 10);
227
+ if (!target) {
228
+ console.error(`❌ Branch "${targetBranch}" is not registered.`);
229
+ console.error(' Run: spidersan register --files "..."');
230
+ process.exit(1);
231
+ }
232
+ const allBranches = await storage.list();
233
+ const conflicts = [];
234
+ for (const branch of allBranches) {
235
+ if (branch.name === targetBranch || branch.status !== 'active')
236
+ continue;
237
+ const overlappingFiles = branch.files.filter(f => target.files.includes(f));
238
+ if (overlappingFiles.length > 0) {
239
+ // Get highest tier for this conflict
240
+ let maxTier = { tier: 1, label: 'WARN', icon: '🟡', action: '' };
241
+ for (const file of overlappingFiles) {
242
+ const fileTier = getConflictTier(file);
243
+ if (fileTier.tier > maxTier.tier) {
244
+ maxTier = fileTier;
245
+ }
246
+ }
247
+ if (maxTier.tier >= minTier) {
248
+ conflicts.push({
249
+ branch: branch.name,
250
+ files: overlappingFiles,
251
+ tier: maxTier.tier,
252
+ tierInfo: maxTier
253
+ });
254
+ }
255
+ }
256
+ }
257
+ // SEMANTIC ANALYSIS with AST parser
258
+ const semanticConflicts = [];
259
+ if (options.semantic && conflicts.length > 0) {
260
+ console.log('\n🔬 Running semantic (AST) analysis...');
261
+ const astParser = new ASTParser();
262
+ for (const conflict of conflicts) {
263
+ for (const file of conflict.files) {
264
+ // Only analyze TypeScript/JavaScript files
265
+ if (!/\.(ts|js|tsx|jsx)$/.test(file))
266
+ continue;
267
+ try {
268
+ // Get file content from both branches
269
+ const currentContent = execSync(`git show HEAD:${file}`, { encoding: 'utf-8' });
270
+ const otherContent = execSync(`git show ${conflict.branch}:${file}`, { encoding: 'utf-8' });
271
+ const symbolConflicts = astParser.findSymbolConflicts(currentContent, `${targetBranch}:${file}`, otherContent, `${conflict.branch}:${file}`);
272
+ semanticConflicts.push(...symbolConflicts);
273
+ }
274
+ catch {
275
+ // File might not exist in one branch, skip
276
+ }
277
+ }
278
+ }
279
+ }
280
+ // Sort by tier (highest first)
281
+ conflicts.sort((a, b) => b.tier - a.tier);
282
+ // Check for blocking conditions
283
+ const tier3Count = conflicts.filter(c => c.tier === 3).length;
284
+ const tier2Count = conflicts.filter(c => c.tier === 2).length;
285
+ const shouldBlock = options.strict && (tier3Count > 0 || tier2Count > 0);
286
+ // Notify Hub if requested
287
+ if (options.notify && (tier3Count > 0 || tier2Count > 0)) {
288
+ await notifyHub(targetBranch, conflicts);
289
+ }
290
+ if (options.json) {
291
+ console.log(JSON.stringify({
292
+ branch: targetBranch,
293
+ conflicts,
294
+ summary: {
295
+ tier3: tier3Count,
296
+ tier2: tier2Count,
297
+ tier1: conflicts.filter(c => c.tier === 1).length,
298
+ blocked: shouldBlock
299
+ }
300
+ }, null, 2));
301
+ if (shouldBlock)
302
+ process.exit(1);
303
+ return;
304
+ }
305
+ if (conflicts.length === 0) {
306
+ console.log(`🕷️ No conflicts detected for "${targetBranch}"`);
307
+ console.log(' ✅ You\'re good to merge!');
308
+ return;
309
+ }
310
+ console.log(`
311
+ 🕷️ CONFLICT ANALYSIS: "${targetBranch}"
312
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
313
+ `);
314
+ for (const conflict of conflicts) {
315
+ console.log(`${conflict.tierInfo.icon} TIER ${conflict.tier} (${conflict.tierInfo.label}): ${conflict.branch}`);
316
+ for (const file of conflict.files) {
317
+ const fileTier = getConflictTier(file);
318
+ console.log(` ${fileTier.icon} ${file}`);
319
+ }
320
+ console.log(` → ${conflict.tierInfo.action}`);
321
+ console.log('');
322
+ }
323
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
324
+ console.log(`📊 Summary: 🔴 ${tier3Count} BLOCK | 🟠 ${tier2Count} PAUSE | 🟡 ${conflicts.filter(c => c.tier === 1).length} WARN`);
325
+ // Show semantic analysis results
326
+ if (options.semantic && semanticConflicts.length > 0) {
327
+ console.log(`\n🔬 SEMANTIC CONFLICTS DETECTED (${semanticConflicts.length} symbols):`);
328
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
329
+ for (const sc of semanticConflicts) {
330
+ console.log(` ⚡ ${sc.symbolType} '${sc.symbolName}'`);
331
+ console.log(` Modified in BOTH branches (different content)`);
332
+ }
333
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
334
+ console.log('\n💡 TIP: Coordinate on these specific functions/classes,');
335
+ console.log(' not just the files. One of you should rebase.');
336
+ }
337
+ else if (options.semantic && semanticConflicts.length === 0) {
338
+ console.log('\n🔬 SEMANTIC ANALYSIS: No symbol-level conflicts!');
339
+ console.log(' Files overlap, but different functions were modified.');
340
+ console.log(' ✅ Likely safe to merge (git will auto-merge).');
341
+ }
342
+ if (tier3Count > 0) {
343
+ console.log(`
344
+ 🔴 TIER 3 CONFLICTS FOUND
345
+ These files are security-critical and MUST be resolved.
346
+ Merge is BLOCKED until conflicts are cleared.
347
+ `);
348
+ }
349
+ else if (tier2Count > 0) {
350
+ console.log(`
351
+ 🟠 TIER 2 CONFLICTS FOUND
352
+ Coordinate with the other agent before proceeding.
353
+ Use: mycmail send <agent> "Need to sync on <file>"
354
+ `);
355
+ }
356
+ // Wake conflicting agents if --wake flag is set
357
+ if (options.wake && conflicts.length > 0) {
358
+ // Collect agents to wake
359
+ const agentsToWake = new Map();
360
+ for (const conflict of conflicts) {
361
+ const conflictBranch = await storage.get(conflict.branch);
362
+ const agentId = conflictBranch?.agent;
363
+ if (agentId && !agentsToWake.has(agentId)) {
364
+ agentsToWake.set(agentId, { branch: conflict.branch, files: conflict.files });
365
+ }
366
+ }
367
+ if (agentsToWake.size === 0) {
368
+ console.log('\n⚠️ No agents registered on conflicting branches.');
369
+ }
370
+ else {
371
+ // Show what will happen and ask for confirmation
372
+ console.log('\n🔔 WAKE AGENTS?');
373
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
374
+ for (const [agent, info] of agentsToWake) {
375
+ console.log(` • ${agent} (${info.branch})`);
376
+ }
377
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
378
+ console.log('This will:');
379
+ console.log(' 1. Send wake signal via Hub');
380
+ console.log(' 2. Send mycmail with conflict details\n');
381
+ const confirmed = await confirmAction('Wake these agents?', options.auto);
382
+ if (confirmed) {
383
+ console.log('\n🔔 WAKING AGENTS...\n');
384
+ for (const [agentId, info] of agentsToWake) {
385
+ await wakeConflictingAgent(agentId, targetBranch, info.branch, info.files);
386
+ }
387
+ console.log(`\n✅ Woke ${agentsToWake.size} agent(s)`);
388
+ // If --retry is set, ask before waiting
389
+ if (options.retry) {
390
+ const waitSeconds = parseInt(options.retry, 10);
391
+ const retryConfirmed = await confirmAction(`\nWait ${waitSeconds}s and re-check conflicts?`, options.auto);
392
+ if (retryConfirmed) {
393
+ console.log(`\n⏳ Waiting ${waitSeconds}s for agents to resolve conflicts...`);
394
+ await sleep(waitSeconds * 1000);
395
+ console.log('\n🔄 RE-CHECKING CONFLICTS...\n');
396
+ const { execFileSync } = await import('child_process');
397
+ try {
398
+ // Security: Use execFileSync with argument array
399
+ const safeBranch = validateBranchName(targetBranch);
400
+ const tierArg = String(parseInt(options.tier, 10) || 1);
401
+ execFileSync('node', [process.argv[1], 'conflicts', '--branch', safeBranch, '--tier', tierArg], {
402
+ encoding: 'utf-8',
403
+ stdio: 'inherit'
404
+ });
405
+ return;
406
+ }
407
+ catch {
408
+ console.log('❌ Conflicts still exist after retry.');
409
+ }
410
+ }
411
+ else {
412
+ console.log('⏭️ Skipping retry.');
413
+ }
414
+ }
415
+ }
416
+ else {
417
+ console.log('⏭️ Skipping wake.');
418
+ }
419
+ }
420
+ }
421
+ if (shouldBlock) {
422
+ console.log('❌ Strict mode: Exiting with error due to TIER 2+ conflicts.');
423
+ process.exit(1);
424
+ }
425
+ });
426
+ //# sourceMappingURL=conflicts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/commands/conflicts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const demoCommand: Command;
3
+ //# sourceMappingURL=demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4HpC,eAAO,MAAM,WAAW,SAIlB,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { Command } from 'commander';
2
+ // ANSI color codes for terminal output
3
+ const colors = {
4
+ reset: '\x1b[0m',
5
+ bright: '\x1b[1m',
6
+ dim: '\x1b[2m',
7
+ red: '\x1b[31m',
8
+ green: '\x1b[32m',
9
+ yellow: '\x1b[33m',
10
+ blue: '\x1b[34m',
11
+ magenta: '\x1b[35m',
12
+ cyan: '\x1b[36m',
13
+ };
14
+ const c = colors;
15
+ function sleep(ms) {
16
+ return new Promise(resolve => setTimeout(resolve, ms));
17
+ }
18
+ async function runDemo() {
19
+ console.log(`
20
+ ${c.bright}${c.magenta}╔════════════════════════════════════════════════════════════╗
21
+ ║ ║
22
+ ║ 🕷️ SPIDERSAN DEMO - See It In Action ║
23
+ ║ ║
24
+ ╚════════════════════════════════════════════════════════════╝${c.reset}
25
+ `);
26
+ await sleep(500);
27
+ // Scenario setup
28
+ console.log(`${c.cyan}📋 SCENARIO: Two AI agents working on the same codebase${c.reset}\n`);
29
+ await sleep(800);
30
+ console.log(`${c.dim}Simulating a typical multi-agent workflow...${c.reset}\n`);
31
+ await sleep(600);
32
+ // Agent 1 registers
33
+ console.log(`${c.yellow}━━━ Agent 1: Claude (Session A) ━━━${c.reset}`);
34
+ await sleep(400);
35
+ console.log(`${c.green}✓${c.reset} Registering branch: ${c.bright}feature/auth${c.reset}`);
36
+ await sleep(300);
37
+ console.log(`${c.green}✓${c.reset} Files: ${c.cyan}src/auth.ts, src/middleware.ts${c.reset}`);
38
+ await sleep(600);
39
+ console.log(`\n${c.dim}[Claude starts working on authentication...]${c.reset}\n`);
40
+ await sleep(800);
41
+ // Agent 2 registers - conflict!
42
+ console.log(`${c.yellow}━━━ Agent 2: Cursor (Session B) ━━━${c.reset}`);
43
+ await sleep(400);
44
+ console.log(`${c.green}✓${c.reset} Registering branch: ${c.bright}feature/api${c.reset}`);
45
+ await sleep(300);
46
+ console.log(`${c.green}✓${c.reset} Files: ${c.cyan}src/api.ts, src/middleware.ts${c.reset}`);
47
+ await sleep(600);
48
+ // CONFLICT DETECTED
49
+ console.log(`
50
+ ${c.bright}${c.red}╔════════════════════════════════════════════════════════════╗
51
+ ║ ⚠️ CONFLICT DETECTED! ║
52
+ ╚════════════════════════════════════════════════════════════╝${c.reset}
53
+ `);
54
+ await sleep(500);
55
+ console.log(`${c.red}🔴 File: ${c.bright}src/middleware.ts${c.reset}`);
56
+ console.log(`${c.red} ├─ ${c.yellow}feature/auth${c.reset} ${c.dim}(Claude)${c.reset}`);
57
+ console.log(`${c.red} └─ ${c.yellow}feature/api${c.reset} ${c.dim}(Cursor)${c.reset}`);
58
+ await sleep(800);
59
+ console.log(`
60
+ ${c.cyan}💡 Spidersan caught this BEFORE you created a merge conflict!${c.reset}
61
+ `);
62
+ await sleep(600);
63
+ // Resolution
64
+ console.log(`${c.green}━━━ RESOLUTION OPTIONS ━━━${c.reset}`);
65
+ console.log(`${c.dim}1.${c.reset} Coordinate with the other agent`);
66
+ console.log(`${c.dim}2.${c.reset} Wait for their branch to merge first`);
67
+ console.log(`${c.dim}3.${c.reset} Split the work differently`);
68
+ await sleep(800);
69
+ // Watch mode teaser
70
+ console.log(`
71
+ ${c.bright}${c.blue}━━━ NEW: WATCH MODE ━━━${c.reset}
72
+ ${c.dim}Auto-register files as you edit them:${c.reset}
73
+
74
+ ${c.cyan}$ spidersan watch --agent claude${c.reset}
75
+
76
+ ${c.dim}Files are tracked automatically. Conflicts detected in real-time.${c.reset}
77
+ `);
78
+ await sleep(500);
79
+ // Next steps
80
+ console.log(`
81
+ ${c.bright}${c.magenta}╔════════════════════════════════════════════════════════════╗
82
+ ║ 🚀 READY TO START? ║
83
+ ╚════════════════════════════════════════════════════════════╝${c.reset}
84
+
85
+ ${c.bright}Quick Setup:${c.reset}
86
+
87
+ ${c.cyan}1.${c.reset} Initialize in your project:
88
+ ${c.green}$ spidersan init${c.reset}
89
+
90
+ ${c.cyan}2.${c.reset} Register your branch:
91
+ ${c.green}$ spidersan register --files "src/myfile.ts"${c.reset}
92
+
93
+ ${c.cyan}3.${c.reset} Check for conflicts:
94
+ ${c.green}$ spidersan conflicts${c.reset}
95
+
96
+ ${c.cyan}4.${c.reset} Or just watch automatically:
97
+ ${c.green}$ spidersan watch --agent myname${c.reset}
98
+
99
+ ${c.bright}Learn More:${c.reset}
100
+ 📖 Docs: ${c.cyan}https://github.com/treebird7/Spidersan${c.reset}
101
+ 💬 Discord: ${c.cyan}https://discord.gg/treebird${c.reset}
102
+ 📧 Help: ${c.cyan}treebird7@proton.me${c.reset}
103
+
104
+ ${c.dim}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
105
+ ${c.bright}🕷️ The web catches conflicts before they catch you.${c.reset}
106
+ `);
107
+ }
108
+ export const demoCommand = new Command('demo')
109
+ .description('🕷️ Interactive demo - see Spidersan in action')
110
+ .action(async () => {
111
+ await runDemo();
112
+ });
113
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * spidersan depends
3
+ *
4
+ * Set dependencies between branches.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const dependsCommand: Command;
8
+ //# sourceMappingURL=depends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depends.d.ts","sourceRoot":"","sources":["../../src/commands/depends.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,cAAc,SA+BrB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * spidersan depends
3
+ *
4
+ * Set dependencies between branches.
5
+ */
6
+ import { Command } from 'commander';
7
+ import { execSync } from 'child_process';
8
+ import { getStorage } from '../storage/index.js';
9
+ function getCurrentBranch() {
10
+ try {
11
+ return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
12
+ }
13
+ catch {
14
+ throw new Error('Not in a git repository');
15
+ }
16
+ }
17
+ export const dependsCommand = new Command('depends')
18
+ .description('Set or show dependencies for a branch')
19
+ .argument('[branches...]', 'Branches this branch depends on')
20
+ .option('--branch <name>', 'Target branch (default: current)')
21
+ .option('--clear', 'Clear all dependencies')
22
+ .action(async (branches, options) => {
23
+ const storage = await getStorage();
24
+ if (!await storage.isInitialized()) {
25
+ console.error('❌ Spidersan not initialized. Run: spidersan init');
26
+ process.exit(1);
27
+ }
28
+ const branchName = options.branch || getCurrentBranch();
29
+ const branch = await storage.get(branchName);
30
+ if (!branch) {
31
+ console.error(`❌ Branch "${branchName}" is not registered.`);
32
+ process.exit(1);
33
+ }
34
+ // Show current dependencies if no args
35
+ if (branches.length === 0 && !options.clear) {
36
+ // For local storage, we don't have depends_on field
37
+ console.log(`🕷️ Dependencies for "${branchName}":`);
38
+ console.log(' (Local storage doesn\'t track dependencies. Use Supabase for this feature.)');
39
+ return;
40
+ }
41
+ console.log(`🕷️ Dependency tracking requires Supabase storage.`);
42
+ console.log(' Set SUPABASE_URL and SUPABASE_KEY to enable.');
43
+ });
44
+ //# sourceMappingURL=depends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depends.js","sourceRoot":"","sources":["../../src/commands/depends.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,SAAS,gBAAgB;IACrB,IAAI,CAAC;QACD,OAAO,QAAQ,CAAC,iCAAiC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KAC/C,WAAW,CAAC,uCAAuC,CAAC;KACpD,QAAQ,CAAC,eAAe,EAAE,iCAAiC,CAAC;KAC5D,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;KAC7D,MAAM,CAAC,SAAS,EAAE,wBAAwB,CAAC;KAC3C,MAAM,CAAC,KAAK,EAAE,QAAkB,EAAE,OAAO,EAAE,EAAE;IAC1C,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,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,aAAa,UAAU,sBAAsB,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,uCAAuC;IACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1C,oDAAoD;QACpD,OAAO,CAAC,GAAG,CAAC,yBAAyB,UAAU,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC9F,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * spidersan doctor
3
+ *
4
+ * Diagnose common issues with Spidersan setup.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const doctorCommand: Command;
8
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmOpC,eAAO,MAAM,aAAa,SA0CpB,CAAC"}