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,22 @@
1
+ /**
2
+ * Storage factory - selects the right storage backend
3
+ */
4
+ import { LocalStorage } from './local.js';
5
+ import { SupabaseStorage } from './supabase.js';
6
+ import { loadConfig } from '../lib/config.js';
7
+ export async function getStorage() {
8
+ const config = await loadConfig();
9
+ // Check environment variables first
10
+ const supabaseUrl = process.env.SUPABASE_URL || config.storage.supabaseUrl;
11
+ const supabaseKey = process.env.SUPABASE_KEY || config.storage.supabaseKey;
12
+ // Use Supabase if credentials are available
13
+ if (supabaseUrl && supabaseKey) {
14
+ return new SupabaseStorage({
15
+ url: supabaseUrl,
16
+ key: supabaseKey,
17
+ });
18
+ }
19
+ // Default to local storage
20
+ return new LocalStorage();
21
+ }
22
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,oCAAoC;IACpC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAE3E,4CAA4C;IAC5C,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC7B,OAAO,IAAI,eAAe,CAAC;YACvB,GAAG,EAAE,WAAW;YAChB,GAAG,EAAE,WAAW;SACnB,CAAC,CAAC;IACP,CAAC;IAED,2BAA2B;IAC3B,OAAO,IAAI,YAAY,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './adapter.js';
2
+ export * from './local.js';
3
+ export * from './supabase.js';
4
+ export * from './factory.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './adapter.js';
2
+ export * from './local.js';
3
+ export * from './supabase.js';
4
+ export * from './factory.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Local JSON Storage Adapter
3
+ *
4
+ * Stores branch registry in .spidersan/registry.json
5
+ * This is the default free-tier storage.
6
+ */
7
+ import type { StorageAdapter, Branch } from './adapter.js';
8
+ export declare class LocalStorage implements StorageAdapter {
9
+ private basePath;
10
+ private registryPath;
11
+ constructor(basePath?: string);
12
+ init(): Promise<void>;
13
+ isInitialized(): Promise<boolean>;
14
+ private load;
15
+ private save;
16
+ list(): Promise<Branch[]>;
17
+ register(branch: Omit<Branch, 'registeredAt'>): Promise<Branch>;
18
+ update(name: string, updates: Partial<Branch>): Promise<Branch | null>;
19
+ unregister(name: string): Promise<boolean>;
20
+ get(name: string): Promise<Branch | null>;
21
+ findByFiles(files: string[]): Promise<Branch[]>;
22
+ cleanup(olderThan: Date): Promise<number>;
23
+ }
24
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAM3E,qBAAa,YAAa,YAAW,cAAc;IAC/C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAKtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;YAIzB,IAAI;YASJ,IAAI;IAIZ,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAW/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAatE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAO/C,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAgBlD"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Local JSON Storage Adapter
3
+ *
4
+ * Stores branch registry in .spidersan/registry.json
5
+ * This is the default free-tier storage.
6
+ */
7
+ import { readFile, writeFile, mkdir } from 'fs/promises';
8
+ import { existsSync } from 'fs';
9
+ import { join } from 'path';
10
+ const SPIDERSAN_DIR = '.spidersan';
11
+ const REGISTRY_FILE = 'registry.json';
12
+ const REGISTRY_VERSION = '1.0';
13
+ export class LocalStorage {
14
+ basePath;
15
+ registryPath;
16
+ constructor(basePath = process.cwd()) {
17
+ this.basePath = basePath;
18
+ this.registryPath = join(basePath, SPIDERSAN_DIR, REGISTRY_FILE);
19
+ }
20
+ async init() {
21
+ const dir = join(this.basePath, SPIDERSAN_DIR);
22
+ if (!existsSync(dir)) {
23
+ await mkdir(dir, { recursive: true });
24
+ }
25
+ if (!existsSync(this.registryPath)) {
26
+ await this.save({ branches: {}, version: REGISTRY_VERSION });
27
+ }
28
+ }
29
+ async isInitialized() {
30
+ return existsSync(this.registryPath);
31
+ }
32
+ async load() {
33
+ try {
34
+ const data = await readFile(this.registryPath, 'utf-8');
35
+ return JSON.parse(data);
36
+ }
37
+ catch {
38
+ return { branches: {}, version: REGISTRY_VERSION };
39
+ }
40
+ }
41
+ async save(registry) {
42
+ await writeFile(this.registryPath, JSON.stringify(registry, null, 2));
43
+ }
44
+ async list() {
45
+ const registry = await this.load();
46
+ return Object.values(registry.branches);
47
+ }
48
+ async register(branch) {
49
+ const registry = await this.load();
50
+ const newBranch = {
51
+ ...branch,
52
+ registeredAt: new Date(),
53
+ };
54
+ registry.branches[branch.name] = newBranch;
55
+ await this.save(registry);
56
+ return newBranch;
57
+ }
58
+ async update(name, updates) {
59
+ const registry = await this.load();
60
+ if (!registry.branches[name])
61
+ return null;
62
+ registry.branches[name] = {
63
+ ...registry.branches[name],
64
+ ...updates,
65
+ name, // ensure name doesn't change
66
+ };
67
+ await this.save(registry);
68
+ return registry.branches[name];
69
+ }
70
+ async unregister(name) {
71
+ const registry = await this.load();
72
+ if (!registry.branches[name])
73
+ return false;
74
+ delete registry.branches[name];
75
+ await this.save(registry);
76
+ return true;
77
+ }
78
+ async get(name) {
79
+ const registry = await this.load();
80
+ return registry.branches[name] || null;
81
+ }
82
+ async findByFiles(files) {
83
+ const branches = await this.list();
84
+ return branches.filter(branch => branch.files.some(file => files.includes(file)));
85
+ }
86
+ async cleanup(olderThan) {
87
+ const registry = await this.load();
88
+ let removed = 0;
89
+ for (const [name, branch] of Object.entries(registry.branches)) {
90
+ if (new Date(branch.registeredAt) < olderThan) {
91
+ delete registry.branches[name];
92
+ removed++;
93
+ }
94
+ }
95
+ if (removed > 0) {
96
+ await this.save(registry);
97
+ }
98
+ return removed;
99
+ }
100
+ }
101
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,aAAa,GAAG,YAAY,CAAC;AACnC,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,OAAO,YAAY;IACb,QAAQ,CAAS;IACjB,YAAY,CAAS;IAE7B,YAAY,WAAmB,OAAO,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa;QACf,OAAO,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,IAAI;QACd,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QACvD,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,QAAwB;QACvC,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAoC;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,SAAS,GAAW;YACtB,GAAG,MAAM;YACT,YAAY,EAAE,IAAI,IAAI,EAAE;SAC3B,CAAC;QACF,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,OAAwB;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAE1C,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG;YACtB,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1B,GAAG,OAAO;YACV,IAAI,EAAE,6BAA6B;SACtC,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAe;QAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAClD,CAAC;IACN,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAe;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7D,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,SAAS,EAAE,CAAC;gBAC5C,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,EAAE,CAAC;YACd,CAAC;QACL,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Supabase Storage Adapter
3
+ *
4
+ * Cloud-based storage for team coordination.
5
+ * Matches Recovery-Tree's branch_registry schema.
6
+ */
7
+ import type { StorageAdapter, Branch } from './adapter.js';
8
+ interface SupabaseConfig {
9
+ url: string;
10
+ key: string;
11
+ projectId?: string;
12
+ }
13
+ interface SupabaseBranchRow {
14
+ id: string;
15
+ branch_name: string;
16
+ created_by_session: string | null;
17
+ created_by_agent: string | null;
18
+ parent_branch: string;
19
+ state: string;
20
+ depends_on: string[] | null;
21
+ conflict_with: string[] | null;
22
+ files_changed: string[] | null;
23
+ description: string | null;
24
+ pr_number: number | null;
25
+ created_at: string;
26
+ updated_at: string;
27
+ }
28
+ export declare class SupabaseStorage implements StorageAdapter {
29
+ private url;
30
+ private key;
31
+ private projectId;
32
+ private initialized;
33
+ constructor(config: SupabaseConfig);
34
+ private fetch;
35
+ private rowToBranch;
36
+ init(): Promise<void>;
37
+ isInitialized(): Promise<boolean>;
38
+ list(): Promise<Branch[]>;
39
+ register(branch: Omit<Branch, 'registeredAt'>): Promise<Branch>;
40
+ update(name: string, updates: Partial<Branch>): Promise<Branch | null>;
41
+ unregister(name: string): Promise<boolean>;
42
+ get(name: string): Promise<Branch | null>;
43
+ findByFiles(files: string[]): Promise<Branch[]>;
44
+ cleanup(_olderThan: Date): Promise<number>;
45
+ setDependencies(name: string, dependsOn: string[]): Promise<void>;
46
+ setConflicts(name: string, conflictsWith: string[]): Promise<void>;
47
+ markMerged(name: string, prNumber?: number): Promise<void>;
48
+ getStale(): Promise<Branch[]>;
49
+ getRaw(name: string): Promise<SupabaseBranchRow | null>;
50
+ }
51
+ export {};
52
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/storage/supabase.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3D,UAAU,cAAc;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD,UAAU,iBAAiB;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAgB,YAAW,cAAc;IAClD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,cAAc;YAMpB,KAAK;IAqDnB,OAAO,CAAC,WAAW;IAYb,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAUjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA4B/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBtE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS/C,OAAO,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB1C,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1D,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAO7B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAOhE"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Supabase Storage Adapter
3
+ *
4
+ * Cloud-based storage for team coordination.
5
+ * Matches Recovery-Tree's branch_registry schema.
6
+ */
7
+ export class SupabaseStorage {
8
+ url;
9
+ key;
10
+ projectId;
11
+ initialized = false;
12
+ constructor(config) {
13
+ this.url = config.url;
14
+ this.key = config.key;
15
+ this.projectId = config.projectId || 'default';
16
+ }
17
+ async fetch(endpoint, options = {}) {
18
+ const url = `${this.url}/rest/v1/${endpoint}`;
19
+ try {
20
+ const response = await fetch(url, {
21
+ ...options,
22
+ headers: {
23
+ 'apikey': this.key,
24
+ 'Authorization': `Bearer ${this.key}`,
25
+ 'Content-Type': 'application/json',
26
+ 'Prefer': 'return=representation',
27
+ ...options.headers,
28
+ },
29
+ });
30
+ // Check for common errors and provide helpful messages
31
+ if (!response.ok) {
32
+ const text = await response.text();
33
+ let parsed = {};
34
+ try {
35
+ parsed = JSON.parse(text);
36
+ }
37
+ catch { /* ignore */ }
38
+ if (parsed.message?.includes('Invalid API key')) {
39
+ throw new Error('Invalid Supabase API key.\n' +
40
+ ' Hint: Check your SUPABASE_KEY environment variable.\n' +
41
+ ' Note: A local .env file may be overriding your mycmail config.');
42
+ }
43
+ if (response.status === 401 || response.status === 403) {
44
+ throw new Error('Supabase authentication failed.\n' +
45
+ ' • Check SUPABASE_URL and SUPABASE_KEY are correct\n' +
46
+ ' • Verify RLS policies allow access\n' +
47
+ ' • Check for .env conflicts in current directory');
48
+ }
49
+ throw new Error(`Supabase error (${response.status}): ${parsed.message || text}`);
50
+ }
51
+ return response;
52
+ }
53
+ catch (error) {
54
+ if (error instanceof TypeError && error.message.includes('fetch')) {
55
+ throw new Error('Network error connecting to Supabase.\n' +
56
+ ' • Check your internet connection\n' +
57
+ ' • Verify SUPABASE_URL is correct');
58
+ }
59
+ throw error;
60
+ }
61
+ }
62
+ rowToBranch(row) {
63
+ return {
64
+ name: row.branch_name,
65
+ files: row.files_changed || [],
66
+ registeredAt: new Date(row.created_at),
67
+ agent: row.created_by_agent || undefined,
68
+ status: row.state === 'active' ? 'active' :
69
+ row.state === 'merged' ? 'completed' : 'abandoned',
70
+ description: row.description || undefined,
71
+ };
72
+ }
73
+ async init() {
74
+ if (!this.url || !this.key) {
75
+ throw new Error('Supabase URL and key required. Set SUPABASE_URL and SUPABASE_KEY env vars.');
76
+ }
77
+ const response = await this.fetch('branch_registry?select=id&limit=1');
78
+ if (!response.ok) {
79
+ throw new Error(`Failed to connect to Supabase: ${await response.text()}`);
80
+ }
81
+ this.initialized = true;
82
+ }
83
+ async isInitialized() {
84
+ if (this.initialized)
85
+ return true;
86
+ try {
87
+ await this.init();
88
+ return true;
89
+ }
90
+ catch {
91
+ return false;
92
+ }
93
+ }
94
+ async list() {
95
+ const response = await this.fetch('active_branches?select=*&order=created_at.desc');
96
+ if (!response.ok)
97
+ throw new Error(`Failed to list: ${await response.text()}`);
98
+ const rows = await response.json();
99
+ return rows.map(r => this.rowToBranch(r));
100
+ }
101
+ async register(branch) {
102
+ const payload = {
103
+ branch_name: branch.name,
104
+ files_changed: branch.files,
105
+ state: branch.status || 'active',
106
+ description: branch.description,
107
+ created_by_agent: branch.agent || 'unknown',
108
+ created_by_session: branch.agent || 'cli-session',
109
+ parent_branch: 'main',
110
+ };
111
+ const response = await this.fetch('branch_registry', {
112
+ method: 'POST',
113
+ body: JSON.stringify(payload),
114
+ });
115
+ if (!response.ok) {
116
+ const error = await response.text();
117
+ if (error.includes('duplicate') || error.includes('unique')) {
118
+ throw new Error(`Branch "${branch.name}" already registered`);
119
+ }
120
+ throw new Error(`Failed to register: ${error}`);
121
+ }
122
+ const [row] = await response.json();
123
+ return this.rowToBranch(row);
124
+ }
125
+ async update(name, updates) {
126
+ const payload = { updated_at: new Date().toISOString() };
127
+ if (updates.files)
128
+ payload.files_changed = updates.files;
129
+ if (updates.status)
130
+ payload.state = updates.status;
131
+ if (updates.description)
132
+ payload.description = updates.description;
133
+ if (updates.agent)
134
+ payload.created_by_agent = updates.agent;
135
+ const response = await this.fetch(`branch_registry?branch_name=eq.${encodeURIComponent(name)}`, {
136
+ method: 'PATCH',
137
+ body: JSON.stringify(payload),
138
+ });
139
+ if (!response.ok)
140
+ throw new Error(`Failed to update: ${await response.text()}`);
141
+ const rows = await response.json();
142
+ return rows.length > 0 ? this.rowToBranch(rows[0]) : null;
143
+ }
144
+ async unregister(name) {
145
+ const response = await this.fetch(`branch_registry?branch_name=eq.${encodeURIComponent(name)}`, {
146
+ method: 'PATCH',
147
+ body: JSON.stringify({ state: 'abandoned', updated_at: new Date().toISOString() }),
148
+ });
149
+ if (!response.ok)
150
+ throw new Error(`Failed to unregister: ${await response.text()}`);
151
+ const rows = await response.json();
152
+ return rows.length > 0;
153
+ }
154
+ async get(name) {
155
+ const response = await this.fetch(`branch_registry?branch_name=eq.${encodeURIComponent(name)}&limit=1`);
156
+ if (!response.ok)
157
+ throw new Error(`Failed to get: ${await response.text()}`);
158
+ const rows = await response.json();
159
+ return rows.length > 0 ? this.rowToBranch(rows[0]) : null;
160
+ }
161
+ async findByFiles(files) {
162
+ // Security: URL-encode file paths to prevent query injection
163
+ const safeFiles = files.map(f => encodeURIComponent(f.replace(/[,{}]/g, '_')));
164
+ const response = await this.fetch(`active_branches?files_changed=ov.{${safeFiles.join(',')}}`);
165
+ if (!response.ok)
166
+ throw new Error(`Failed to find by files: ${await response.text()}`);
167
+ const rows = await response.json();
168
+ return rows.map(r => this.rowToBranch(r));
169
+ }
170
+ async cleanup(_olderThan) {
171
+ const response = await this.fetch('stale_branches?select=id');
172
+ if (!response.ok)
173
+ throw new Error(`Failed to get stale: ${await response.text()}`);
174
+ const rows = await response.json();
175
+ if (rows.length === 0)
176
+ return 0;
177
+ const ids = rows.map(r => r.id);
178
+ await this.fetch(`branch_registry?id=in.(${ids.join(',')})`, {
179
+ method: 'PATCH',
180
+ body: JSON.stringify({ state: 'abandoned', updated_at: new Date().toISOString() }),
181
+ });
182
+ return rows.length;
183
+ }
184
+ // Extended Supabase-specific methods
185
+ async setDependencies(name, dependsOn) {
186
+ await this.fetch(`branch_registry?branch_name=eq.${encodeURIComponent(name)}`, {
187
+ method: 'PATCH',
188
+ body: JSON.stringify({ depends_on: dependsOn, updated_at: new Date().toISOString() }),
189
+ });
190
+ }
191
+ async setConflicts(name, conflictsWith) {
192
+ await this.fetch(`branch_registry?branch_name=eq.${encodeURIComponent(name)}`, {
193
+ method: 'PATCH',
194
+ body: JSON.stringify({ conflict_with: conflictsWith, updated_at: new Date().toISOString() }),
195
+ });
196
+ }
197
+ async markMerged(name, prNumber) {
198
+ const payload = { state: 'merged', updated_at: new Date().toISOString() };
199
+ if (prNumber)
200
+ payload.pr_number = prNumber;
201
+ await this.fetch(`branch_registry?branch_name=eq.${encodeURIComponent(name)}`, {
202
+ method: 'PATCH',
203
+ body: JSON.stringify(payload),
204
+ });
205
+ }
206
+ async getStale() {
207
+ const response = await this.fetch('stale_branches?select=*');
208
+ if (!response.ok)
209
+ throw new Error(`Failed to get stale: ${await response.text()}`);
210
+ const rows = await response.json();
211
+ return rows.map(r => this.rowToBranch(r));
212
+ }
213
+ async getRaw(name) {
214
+ const response = await this.fetch(`branch_registry?branch_name=eq.${encodeURIComponent(name)}&limit=1`);
215
+ if (!response.ok)
216
+ return null;
217
+ const rows = await response.json();
218
+ return rows[0] || null;
219
+ }
220
+ }
221
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/storage/supabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Spidersan TUI - Terminal User Interface
3
+ * Interactive dashboard for branch coordination
4
+ */
5
+ export declare class SpidersanTUI {
6
+ private screen;
7
+ private panels;
8
+ constructor();
9
+ private createPanel;
10
+ private createPanels;
11
+ refresh(): Promise<void>;
12
+ start(): void;
13
+ }
14
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/tui/screen.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,MAAM,CAAqD;;IAgBnE,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,YAAY;IAwDd,OAAO;IA2Cb,KAAK;CAoBR"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Spidersan TUI - Terminal User Interface
3
+ * Interactive dashboard for branch coordination
4
+ */
5
+ import blessed from 'blessed';
6
+ import { getStorage } from '../storage/index.js';
7
+ export class SpidersanTUI {
8
+ screen;
9
+ panels = {};
10
+ constructor() {
11
+ this.screen = blessed.screen({
12
+ smartCSR: true,
13
+ title: 'šŸ•·ļø Spidersan Dashboard',
14
+ });
15
+ // Quit keys
16
+ this.screen.key(['q', 'escape', 'C-c'], () => {
17
+ return process.exit(0);
18
+ });
19
+ this.createPanels();
20
+ }
21
+ createPanel(options) {
22
+ const panel = blessed.box({
23
+ ...options,
24
+ border: { type: 'line' },
25
+ style: {
26
+ border: { fg: 'cyan' },
27
+ },
28
+ tags: true,
29
+ scrollable: true,
30
+ alwaysScroll: true,
31
+ });
32
+ this.screen.append(panel);
33
+ return panel;
34
+ }
35
+ createPanels() {
36
+ // Top-left: Active Branches
37
+ this.panels.branches = this.createPanel({
38
+ top: 0,
39
+ left: 0,
40
+ width: '50%',
41
+ height: '33%',
42
+ label: ' šŸ•·ļø Active Branches ',
43
+ });
44
+ // Top-right: Symbol Locks
45
+ this.panels.locks = this.createPanel({
46
+ top: 0,
47
+ left: '50%',
48
+ width: '50%',
49
+ height: '33%',
50
+ label: ' šŸ”’ Symbol Locks ',
51
+ });
52
+ // Middle-left: Merge Order
53
+ this.panels.merge = this.createPanel({
54
+ top: '33%',
55
+ left: 0,
56
+ width: '50%',
57
+ height: '33%',
58
+ label: ' šŸ”„ Merge Order ',
59
+ });
60
+ // Middle-right: Intent Log
61
+ this.panels.intents = this.createPanel({
62
+ top: '33%',
63
+ left: '50%',
64
+ width: '50%',
65
+ height: '33%',
66
+ label: ' šŸ“ Intent Log ',
67
+ });
68
+ // Bottom: Conflict Map
69
+ this.panels.conflicts = this.createPanel({
70
+ top: '66%',
71
+ left: 0,
72
+ width: '100%',
73
+ height: '28%',
74
+ label: ' āš ļø Conflict Map ',
75
+ });
76
+ // Status bar
77
+ this.panels.status = this.createPanel({
78
+ top: '94%',
79
+ left: 0,
80
+ width: '100%',
81
+ height: '6%',
82
+ label: '',
83
+ });
84
+ }
85
+ async refresh() {
86
+ const storage = await getStorage();
87
+ // Branches panel
88
+ try {
89
+ const branches = await storage.list();
90
+ let content = '';
91
+ for (const branch of branches) {
92
+ const status = branch.status === 'active' ? '🟢' : 'šŸ”“';
93
+ content += `${status} {bold}${branch.name}{/bold}\n`;
94
+ content += ` Agent: ${branch.agent || 'unknown'}\n`;
95
+ const files = branch.files?.slice(0, 3) || [];
96
+ if (files.length > 0) {
97
+ content += ` Files: ${files.join(', ')}\n`;
98
+ }
99
+ content += '\n';
100
+ }
101
+ this.panels.branches.setContent(content || 'No active branches');
102
+ }
103
+ catch {
104
+ this.panels.branches.setContent('Error loading branches');
105
+ }
106
+ // Locks panel (from CRDT state)
107
+ this.panels.locks.setContent('šŸ”’ Symbol locks will appear here\nRun: spidersan lock --list');
108
+ // Merge order
109
+ this.panels.merge.setContent('šŸ”„ Merge sequence:\n1. → 2. → 3.\n(Run spidersan merge-order for details)');
110
+ // Intent log
111
+ this.panels.intents.setContent('šŸ“ Agent intents:\n• sherlocksan: "Security review"\n• gemini: "AST implementation"');
112
+ // Conflicts
113
+ this.panels.conflicts.setContent('āš ļø Conflicts:\n(Run spidersan conflicts --semantic for analysis)');
114
+ // Status bar
115
+ const time = new Date().toLocaleTimeString();
116
+ this.panels.status.setContent(`{center}[L]ocks [C]onflicts [R]efresh [Q]uit | Last update: ${time}{/center}`);
117
+ this.screen.render();
118
+ }
119
+ start() {
120
+ // Initial render
121
+ this.refresh();
122
+ // Auto-refresh every 5 seconds
123
+ setInterval(() => this.refresh(), 5000);
124
+ // Keyboard shortcuts
125
+ this.screen.key(['r'], () => this.refresh());
126
+ this.screen.key(['l'], () => {
127
+ this.panels.locks.focus();
128
+ this.screen.render();
129
+ });
130
+ this.screen.key(['c'], () => {
131
+ this.panels.conflicts.focus();
132
+ this.screen.render();
133
+ });
134
+ }
135
+ }
136
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/tui/screen.ts"],"names":[],"mappings":"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"}