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,204 @@
1
+ /**
2
+ * spidersan audit-mark
3
+ *
4
+ * Tag branches as security-reviewed by Sherlocksan (or other auditors).
5
+ * Stores audit metadata in the branch description field as JSON prefix.
6
+ *
7
+ * Part of: Security Pipeline (ssan + srlk)
8
+ * See: treebird-internal/collab/DESIGN_security_pipeline_ssan_srlk.md
9
+ */
10
+ import { Command } from 'commander';
11
+ import { execSync } from 'child_process';
12
+ import { getStorage } from '../storage/index.js';
13
+ const AUDIT_MARK_PREFIX = '[AUDIT:';
14
+ const AUDIT_MARK_SUFFIX = ']';
15
+ function getCurrentBranch() {
16
+ try {
17
+ return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
18
+ }
19
+ catch {
20
+ throw new Error('Not in a git repository');
21
+ }
22
+ }
23
+ function extractAuditMark(description) {
24
+ if (!description)
25
+ return null;
26
+ const start = description.indexOf(AUDIT_MARK_PREFIX);
27
+ if (start === -1)
28
+ return null;
29
+ const end = description.indexOf(AUDIT_MARK_SUFFIX, start);
30
+ if (end === -1)
31
+ return null;
32
+ try {
33
+ const json = description.substring(start + AUDIT_MARK_PREFIX.length, end);
34
+ return JSON.parse(json);
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ function injectAuditMark(description, mark) {
41
+ // Remove any existing audit mark
42
+ let cleanDescription = description || '';
43
+ const start = cleanDescription.indexOf(AUDIT_MARK_PREFIX);
44
+ if (start !== -1) {
45
+ const end = cleanDescription.indexOf(AUDIT_MARK_SUFFIX, start);
46
+ if (end !== -1) {
47
+ cleanDescription = (cleanDescription.substring(0, start) +
48
+ cleanDescription.substring(end + AUDIT_MARK_SUFFIX.length)).trim();
49
+ }
50
+ }
51
+ if (mark === null) {
52
+ return cleanDescription;
53
+ }
54
+ // Add new audit mark
55
+ const markStr = `${AUDIT_MARK_PREFIX}${JSON.stringify(mark)}${AUDIT_MARK_SUFFIX}`;
56
+ return cleanDescription ? `${markStr} ${cleanDescription}` : markStr;
57
+ }
58
+ export const auditMarkCommand = new Command('audit-mark')
59
+ .description('Tag a branch as security-reviewed (srlk integration)')
60
+ .argument('[branch]', 'Branch to mark (default: current branch)')
61
+ .option('--reviewer <agent>', 'Agent who performed the audit (default: srlk)', 'srlk')
62
+ .option('--passed', 'Mark as passed security review')
63
+ .option('--failed', 'Mark as failed security review')
64
+ .option('--verdict <verdict>', 'Audit verdict: safe, review, block', 'safe')
65
+ .option('--audit-id <id>', 'Reference to audit report ID')
66
+ .option('--notes <text>', 'Additional notes about the audit')
67
+ .option('--json', 'Output as JSON')
68
+ .option('--unmark', 'Remove audit mark from branch')
69
+ .option('--show', 'Show current audit mark without changing it')
70
+ .action(async (branchArg, options) => {
71
+ const storage = await getStorage();
72
+ if (!await storage.isInitialized()) {
73
+ console.error('❌ Spidersan not initialized. Run: spidersan init');
74
+ process.exit(1);
75
+ }
76
+ const branchName = branchArg || getCurrentBranch();
77
+ const branch = await storage.get(branchName);
78
+ if (!branch) {
79
+ console.error(`❌ Branch "${branchName}" is not registered.`);
80
+ console.error(' Run: spidersan register --files "..."');
81
+ process.exit(1);
82
+ }
83
+ const existingMark = extractAuditMark(branch.description);
84
+ // Handle --show
85
+ if (options.show) {
86
+ if (options.json) {
87
+ console.log(JSON.stringify({
88
+ branch: branchName,
89
+ auditMark: existingMark,
90
+ }, null, 2));
91
+ }
92
+ else if (existingMark) {
93
+ const verdictEmoji = { safe: '✅', review: '⚠️', block: '🚫' };
94
+ console.log('');
95
+ console.log('🕷️ Audit Mark Status');
96
+ console.log('');
97
+ console.log(` 📍 Branch: ${branchName}`);
98
+ console.log(` ${verdictEmoji[existingMark.verdict]} Verdict: ${existingMark.verdict.toUpperCase()}`);
99
+ console.log(` 🔍 Reviewer: ${existingMark.reviewer}`);
100
+ console.log(` ⏰ Timestamp: ${existingMark.timestamp}`);
101
+ if (existingMark.audit_id) {
102
+ console.log(` 📋 Audit ID: ${existingMark.audit_id}`);
103
+ }
104
+ if (existingMark.notes) {
105
+ console.log(` 📝 Notes: ${existingMark.notes}`);
106
+ }
107
+ console.log('');
108
+ }
109
+ else {
110
+ console.log(`⚠️ Branch "${branchName}" has no audit mark.`);
111
+ }
112
+ return;
113
+ }
114
+ // Handle unmark
115
+ if (options.unmark) {
116
+ if (existingMark) {
117
+ const newDescription = injectAuditMark(branch.description, null);
118
+ await storage.update(branchName, { description: newDescription || undefined });
119
+ if (options.json) {
120
+ console.log(JSON.stringify({ action: 'unmark', branch: branchName, success: true }));
121
+ }
122
+ else {
123
+ console.log(`🕷️ Removed audit mark from "${branchName}"`);
124
+ }
125
+ }
126
+ else {
127
+ if (options.json) {
128
+ console.log(JSON.stringify({ action: 'unmark', branch: branchName, success: false, reason: 'no mark found' }));
129
+ }
130
+ else {
131
+ console.log(`⚠️ Branch "${branchName}" has no audit mark to remove.`);
132
+ }
133
+ }
134
+ return;
135
+ }
136
+ // Determine pass/fail status
137
+ let passed = true;
138
+ if (options.failed) {
139
+ passed = false;
140
+ }
141
+ else if (options.passed) {
142
+ passed = true;
143
+ }
144
+ else if (options.verdict === 'block' || options.verdict === 'review') {
145
+ passed = false;
146
+ }
147
+ // Map verdict
148
+ let verdict = 'safe';
149
+ if (options.verdict && ['safe', 'review', 'block'].includes(options.verdict)) {
150
+ verdict = options.verdict;
151
+ }
152
+ else if (options.failed) {
153
+ verdict = 'block';
154
+ }
155
+ // Create audit mark
156
+ const auditMark = {
157
+ reviewer: options.reviewer,
158
+ passed,
159
+ verdict,
160
+ timestamp: new Date().toISOString(),
161
+ };
162
+ if (options.auditId) {
163
+ auditMark.audit_id = options.auditId;
164
+ }
165
+ if (options.notes) {
166
+ auditMark.notes = options.notes;
167
+ }
168
+ // Update branch description with audit mark
169
+ const newDescription = injectAuditMark(branch.description, auditMark);
170
+ await storage.update(branchName, { description: newDescription });
171
+ // Output
172
+ if (options.json) {
173
+ console.log(JSON.stringify({
174
+ action: 'mark',
175
+ branch: branchName,
176
+ auditMark,
177
+ success: true,
178
+ }, null, 2));
179
+ return;
180
+ }
181
+ // Human-readable output
182
+ console.log('');
183
+ console.log('🕷️ Spidersan Audit Mark');
184
+ console.log('');
185
+ const verdictEmoji = {
186
+ safe: '✅',
187
+ review: '⚠️',
188
+ block: '🚫',
189
+ };
190
+ console.log(` 📍 Branch: ${branchName}`);
191
+ console.log(` ${verdictEmoji[verdict]} Verdict: ${verdict.toUpperCase()}`);
192
+ console.log(` 🔍 Reviewer: ${options.reviewer}`);
193
+ console.log(` ⏰ Timestamp: ${auditMark.timestamp}`);
194
+ if (auditMark.audit_id) {
195
+ console.log(` 📋 Audit ID: ${auditMark.audit_id}`);
196
+ }
197
+ if (auditMark.notes) {
198
+ console.log(` 📝 Notes: ${auditMark.notes}`);
199
+ }
200
+ console.log('');
201
+ console.log(` ${passed ? '✅ Branch marked as PASSED security review' : '❌ Branch marked as FAILED security review'}`);
202
+ console.log('');
203
+ });
204
+ //# sourceMappingURL=audit-mark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-mark.js","sourceRoot":"","sources":["../../src/commands/audit-mark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * spidersan cleanup
3
+ *
4
+ * Remove stale branches from the registry.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const cleanupCommand: Command;
8
+ //# sourceMappingURL=cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,cAAc,SAuCrB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * spidersan cleanup
3
+ *
4
+ * Remove stale branches from the registry.
5
+ */
6
+ import { Command } from 'commander';
7
+ import { getStorage } from '../storage/index.js';
8
+ export const cleanupCommand = new Command('cleanup')
9
+ .description('Remove stale branches from registry')
10
+ .option('--days <n>', 'Days threshold', '7')
11
+ .option('--dry-run', 'Show what would be removed without removing')
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 (stale.length === 0) {
24
+ console.log(`🕷️ No stale branches to clean up.`);
25
+ return;
26
+ }
27
+ if (options.dryRun) {
28
+ console.log(`🕷️ Would remove ${stale.length} stale branch(es):\n`);
29
+ stale.forEach(b => console.log(` - ${b.name}`));
30
+ return;
31
+ }
32
+ let removed = 0;
33
+ for (const branch of stale) {
34
+ if (await storage.unregister(branch.name)) {
35
+ removed++;
36
+ console.log(` 🗑️ Removed: ${branch.name}`);
37
+ }
38
+ }
39
+ console.log(`\n🕷️ Cleaned up ${removed} branch(es).`);
40
+ });
41
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KAC/C,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,CAAC;KAC3C,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;KAClE,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,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO;IACX,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,MAAM,sBAAsB,CAAC,CAAC;QACpE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO;IACX,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,cAAc,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * spidersan close
3
+ *
4
+ * End session cleanly.
5
+ * "Securing the Web" - the spider rests, but the web holds.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare const closeCommand: Command;
9
+ //# sourceMappingURL=close.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,YAAY,SAqHnB,CAAC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * spidersan close
3
+ *
4
+ * End session cleanly.
5
+ * "Securing the Web" - the spider rests, but the web holds.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { execSync } from 'child_process';
9
+ import { execa } from 'execa';
10
+ import { getStorage } from '../storage/index.js';
11
+ function getCurrentBranch() {
12
+ try {
13
+ return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ function hasMycmail() {
20
+ try {
21
+ execSync('which mycmail', { stdio: 'ignore' });
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export const closeCommand = new Command('close')
29
+ .description('End session - secure the web, rest well')
30
+ .option('-m, --message <msg>', 'Custom sign-off message')
31
+ .option('--mark-stale', 'Mark your active branches as stale')
32
+ .option('--silent', 'Skip mycmail broadcast')
33
+ .option('--json', 'Output as JSON')
34
+ .option('-q, --quiet', 'Minimal output')
35
+ .action(async (options) => {
36
+ const storage = await getStorage();
37
+ const currentBranch = getCurrentBranch();
38
+ const result = {
39
+ currentBranch,
40
+ activeBranches: [],
41
+ markedStale: [],
42
+ conflictsResolved: 0,
43
+ mycmailCalled: false,
44
+ };
45
+ // Get active branches
46
+ if (await storage.isInitialized()) {
47
+ const branches = await storage.list();
48
+ result.activeBranches = branches
49
+ .filter(b => b.status === 'active')
50
+ .map(b => ({ name: b.name, agent: b.agent }));
51
+ // Mark branches as stale if requested
52
+ if (options.markStale) {
53
+ for (const branch of branches) {
54
+ if (branch.status === 'active') {
55
+ await storage.update(branch.name, { status: 'abandoned' });
56
+ result.markedStale.push(branch.name);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ // Call mycmail close (with timeout protection!)
62
+ if (!options.silent && hasMycmail()) {
63
+ try {
64
+ const args = ['close', '--quiet'];
65
+ if (options.message) {
66
+ args.push('-m', options.message);
67
+ }
68
+ await execa('mycmail', args, {
69
+ timeout: 30000, // 30 second timeout - prevents hanging!
70
+ reject: false, // Don't throw on non-zero exit
71
+ });
72
+ result.mycmailCalled = true;
73
+ }
74
+ catch {
75
+ // Ignore mycmail errors - but we won't hang!
76
+ }
77
+ }
78
+ // JSON output
79
+ if (options.json) {
80
+ console.log(JSON.stringify(result, null, 2));
81
+ return;
82
+ }
83
+ // Quiet output
84
+ if (options.quiet) {
85
+ const staleInfo = result.markedStale.length > 0 ? `, ${result.markedStale.length} secured` : '';
86
+ console.log(`🕷️ Close: ${result.activeBranches.length} threads${staleInfo}`);
87
+ return;
88
+ }
89
+ // ═══════════════════════════════════════════════════════════
90
+ // CEREMONIAL OUTPUT: "Securing the Web"
91
+ // ═══════════════════════════════════════════════════════════
92
+ console.log('');
93
+ console.log('🕷️ Spidersan Resting...');
94
+ console.log('');
95
+ console.log(' ╭─────────────────────────────────────╮');
96
+ console.log(' │ Securing anchor points... │');
97
+ console.log(' ╰─────────────────────────────────────╯');
98
+ console.log('');
99
+ // Session summary
100
+ console.log(' 📋 Session Summary:');
101
+ console.log(` • ${result.activeBranches.length} thread${result.activeBranches.length !== 1 ? 's' : ''} in the web`);
102
+ if (result.markedStale.length > 0) {
103
+ console.log(` • ${result.markedStale.length} thread${result.markedStale.length !== 1 ? 's' : ''} secured (marked stale)`);
104
+ for (const branch of result.markedStale.slice(0, 3)) {
105
+ console.log(` └─ ${branch}`);
106
+ }
107
+ if (result.markedStale.length > 3) {
108
+ console.log(` └─ ...and ${result.markedStale.length - 3} more`);
109
+ }
110
+ }
111
+ // Notify others
112
+ if (result.mycmailCalled) {
113
+ console.log('');
114
+ console.log(' 🔔 Web Watchers Notified');
115
+ if (options.message) {
116
+ console.log(` └─ "${options.message}"`);
117
+ }
118
+ }
119
+ // Closing ceremony
120
+ console.log('');
121
+ console.log(' 💤 The web holds while you rest.');
122
+ console.log(' Next session: spidersan wake');
123
+ console.log('');
124
+ console.log(' ╭─────────────────────────────────────╮');
125
+ console.log(' │ Threads secured. Sweet dreams. 🌙 │');
126
+ console.log(' ╰─────────────────────────────────────╯');
127
+ console.log('');
128
+ });
129
+ //# sourceMappingURL=close.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.js","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * spidersan collab-sync
3
+ *
4
+ * Sync daily collab files with git to prevent merge conflicts.
5
+ * Designed for append-only collaboration documents.
6
+ *
7
+ * FlockView Integration:
8
+ * - Use --json for API consumption
9
+ * - Call --pre on collab open
10
+ * - Call --post on collab save/close
11
+ */
12
+ import { Command } from 'commander';
13
+ export declare const collabSyncCommand: Command;
14
+ //# sourceMappingURL=collab-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collab-sync.d.ts","sourceRoot":"","sources":["../../src/commands/collab-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6EpC,eAAO,MAAM,iBAAiB,SA6LxB,CAAC"}