spidersan 0.20.1 → 0.20.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 (310) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/bin/command-registry.d.ts +25 -0
  3. package/dist/bin/command-registry.d.ts.map +1 -0
  4. package/dist/bin/command-registry.js +29 -0
  5. package/dist/bin/command-registry.js.map +1 -0
  6. package/dist/bin/spidersan.d.ts +16 -0
  7. package/dist/bin/spidersan.d.ts.map +1 -0
  8. package/dist/bin/spidersan.js +98 -0
  9. package/dist/bin/spidersan.js.map +1 -0
  10. package/dist/commands/abandon.d.ts +8 -0
  11. package/dist/commands/abandon.d.ts.map +1 -0
  12. package/dist/commands/abandon.js +43 -0
  13. package/dist/commands/abandon.js.map +1 -0
  14. package/dist/commands/cleanup.d.ts +8 -0
  15. package/dist/commands/cleanup.d.ts.map +1 -0
  16. package/dist/commands/cleanup.js +50 -0
  17. package/dist/commands/cleanup.js.map +1 -0
  18. package/dist/commands/config.d.ts +15 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +309 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/conflicts.d.ts +34 -0
  23. package/dist/commands/conflicts.d.ts.map +1 -0
  24. package/dist/commands/conflicts.js +773 -0
  25. package/dist/commands/conflicts.js.map +1 -0
  26. package/dist/commands/context.d.ts +8 -0
  27. package/dist/commands/context.d.ts.map +1 -0
  28. package/dist/commands/context.js +104 -0
  29. package/dist/commands/context.js.map +1 -0
  30. package/dist/commands/cross-conflicts.d.ts +17 -0
  31. package/dist/commands/cross-conflicts.d.ts.map +1 -0
  32. package/dist/commands/cross-conflicts.js +273 -0
  33. package/dist/commands/cross-conflicts.js.map +1 -0
  34. package/dist/commands/depends.d.ts +11 -0
  35. package/dist/commands/depends.d.ts.map +1 -0
  36. package/dist/commands/depends.js +63 -0
  37. package/dist/commands/depends.js.map +1 -0
  38. package/dist/commands/doctor.d.ts +30 -0
  39. package/dist/commands/doctor.d.ts.map +1 -0
  40. package/dist/commands/doctor.js +558 -0
  41. package/dist/commands/doctor.js.map +1 -0
  42. package/dist/commands/git-watch.d.ts +24 -0
  43. package/dist/commands/git-watch.d.ts.map +1 -0
  44. package/dist/commands/git-watch.js +84 -0
  45. package/dist/commands/git-watch.js.map +1 -0
  46. package/dist/commands/github-sync.d.ts +42 -0
  47. package/dist/commands/github-sync.d.ts.map +1 -0
  48. package/dist/commands/github-sync.js +191 -0
  49. package/dist/commands/github-sync.js.map +1 -0
  50. package/dist/commands/index.d.ts +25 -0
  51. package/dist/commands/index.d.ts.map +1 -0
  52. package/dist/commands/index.js +29 -0
  53. package/dist/commands/index.js.map +1 -0
  54. package/dist/commands/init.d.ts +8 -0
  55. package/dist/commands/init.d.ts.map +1 -0
  56. package/dist/commands/init.js +23 -0
  57. package/dist/commands/init.js.map +1 -0
  58. package/dist/commands/list.d.ts +3 -0
  59. package/dist/commands/list.d.ts.map +1 -0
  60. package/dist/commands/list.js +45 -0
  61. package/dist/commands/list.js.map +1 -0
  62. package/dist/commands/log.d.ts +7 -0
  63. package/dist/commands/log.d.ts.map +1 -0
  64. package/dist/commands/log.js +110 -0
  65. package/dist/commands/log.js.map +1 -0
  66. package/dist/commands/merge-order.d.ts +9 -0
  67. package/dist/commands/merge-order.d.ts.map +1 -0
  68. package/dist/commands/merge-order.js +100 -0
  69. package/dist/commands/merge-order.js.map +1 -0
  70. package/dist/commands/merged.d.ts +8 -0
  71. package/dist/commands/merged.d.ts.map +1 -0
  72. package/dist/commands/merged.js +37 -0
  73. package/dist/commands/merged.js.map +1 -0
  74. package/dist/commands/pr-check.d.ts +24 -0
  75. package/dist/commands/pr-check.d.ts.map +1 -0
  76. package/dist/commands/pr-check.js +85 -0
  77. package/dist/commands/pr-check.js.map +1 -0
  78. package/dist/commands/ready-check.d.ts +11 -0
  79. package/dist/commands/ready-check.d.ts.map +1 -0
  80. package/dist/commands/ready-check.js +150 -0
  81. package/dist/commands/ready-check.js.map +1 -0
  82. package/dist/commands/rebase-helper.d.ts +3 -0
  83. package/dist/commands/rebase-helper.d.ts.map +1 -0
  84. package/dist/commands/rebase-helper.js +52 -0
  85. package/dist/commands/rebase-helper.js.map +1 -0
  86. package/dist/commands/register.d.ts +10 -0
  87. package/dist/commands/register.d.ts.map +1 -0
  88. package/dist/commands/register.js +176 -0
  89. package/dist/commands/register.js.map +1 -0
  90. package/dist/commands/registry-sync.d.ts +9 -0
  91. package/dist/commands/registry-sync.d.ts.map +1 -0
  92. package/dist/commands/registry-sync.js +129 -0
  93. package/dist/commands/registry-sync.js.map +1 -0
  94. package/dist/commands/stale.d.ts +17 -0
  95. package/dist/commands/stale.d.ts.map +1 -0
  96. package/dist/commands/stale.js +136 -0
  97. package/dist/commands/stale.js.map +1 -0
  98. package/dist/commands/sync.d.ts +21 -0
  99. package/dist/commands/sync.d.ts.map +1 -0
  100. package/dist/commands/sync.js +78 -0
  101. package/dist/commands/sync.js.map +1 -0
  102. package/dist/commands/verify-trunk.d.ts +18 -0
  103. package/dist/commands/verify-trunk.d.ts.map +1 -0
  104. package/dist/commands/verify-trunk.js +77 -0
  105. package/dist/commands/verify-trunk.js.map +1 -0
  106. package/dist/commands/watch.d.ts +8 -0
  107. package/dist/commands/watch.d.ts.map +1 -0
  108. package/dist/commands/watch.js +509 -0
  109. package/dist/commands/watch.js.map +1 -0
  110. package/dist/index.d.ts +8 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +8 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/lib/activity.d.ts +53 -0
  115. package/dist/lib/activity.d.ts.map +1 -0
  116. package/dist/lib/activity.js +271 -0
  117. package/dist/lib/activity.js.map +1 -0
  118. package/dist/lib/agent-errors.d.ts +41 -0
  119. package/dist/lib/agent-errors.d.ts.map +1 -0
  120. package/dist/lib/agent-errors.js +145 -0
  121. package/dist/lib/agent-errors.js.map +1 -0
  122. package/dist/lib/ai/context-builder.d.ts +16 -0
  123. package/dist/lib/ai/context-builder.d.ts.map +1 -0
  124. package/dist/lib/ai/context-builder.js +229 -0
  125. package/dist/lib/ai/context-builder.js.map +1 -0
  126. package/dist/lib/ai/event-handler.d.ts +21 -0
  127. package/dist/lib/ai/event-handler.d.ts.map +1 -0
  128. package/dist/lib/ai/event-handler.js +111 -0
  129. package/dist/lib/ai/event-handler.js.map +1 -0
  130. package/dist/lib/ai/index.d.ts +13 -0
  131. package/dist/lib/ai/index.d.ts.map +1 -0
  132. package/dist/lib/ai/index.js +11 -0
  133. package/dist/lib/ai/index.js.map +1 -0
  134. package/dist/lib/ai/llm-client.d.ts +37 -0
  135. package/dist/lib/ai/llm-client.d.ts.map +1 -0
  136. package/dist/lib/ai/llm-client.js +225 -0
  137. package/dist/lib/ai/llm-client.js.map +1 -0
  138. package/dist/lib/ai/reasoner.d.ts +11 -0
  139. package/dist/lib/ai/reasoner.d.ts.map +1 -0
  140. package/dist/lib/ai/reasoner.js +227 -0
  141. package/dist/lib/ai/reasoner.js.map +1 -0
  142. package/dist/lib/ai/setup.d.ts +40 -0
  143. package/dist/lib/ai/setup.d.ts.map +1 -0
  144. package/dist/lib/ai/setup.js +154 -0
  145. package/dist/lib/ai/setup.js.map +1 -0
  146. package/dist/lib/ai/types.d.ts +135 -0
  147. package/dist/lib/ai/types.d.ts.map +1 -0
  148. package/dist/lib/ai/types.js +42 -0
  149. package/dist/lib/ai/types.js.map +1 -0
  150. package/dist/lib/ast.d.ts +44 -0
  151. package/dist/lib/ast.d.ts.map +1 -0
  152. package/dist/lib/ast.js +160 -0
  153. package/dist/lib/ast.js.map +1 -0
  154. package/dist/lib/carries.d.ts +22 -0
  155. package/dist/lib/carries.d.ts.map +1 -0
  156. package/dist/lib/carries.js +56 -0
  157. package/dist/lib/carries.js.map +1 -0
  158. package/dist/lib/colony-subscriber.d.ts +56 -0
  159. package/dist/lib/colony-subscriber.d.ts.map +1 -0
  160. package/dist/lib/colony-subscriber.js +265 -0
  161. package/dist/lib/colony-subscriber.js.map +1 -0
  162. package/dist/lib/config.d.ts +62 -0
  163. package/dist/lib/config.d.ts.map +1 -0
  164. package/dist/lib/config.js +235 -0
  165. package/dist/lib/config.js.map +1 -0
  166. package/dist/lib/conflict-analyzer.d.ts +33 -0
  167. package/dist/lib/conflict-analyzer.d.ts.map +1 -0
  168. package/dist/lib/conflict-analyzer.js +114 -0
  169. package/dist/lib/conflict-analyzer.js.map +1 -0
  170. package/dist/lib/conflict-renderer.d.ts +7 -0
  171. package/dist/lib/conflict-renderer.d.ts.map +1 -0
  172. package/dist/lib/conflict-renderer.js +145 -0
  173. package/dist/lib/conflict-renderer.js.map +1 -0
  174. package/dist/lib/conflict-tier.d.ts +20 -0
  175. package/dist/lib/conflict-tier.d.ts.map +1 -0
  176. package/dist/lib/conflict-tier.js +49 -0
  177. package/dist/lib/conflict-tier.js.map +1 -0
  178. package/dist/lib/crypto.d.ts +71 -0
  179. package/dist/lib/crypto.d.ts.map +1 -0
  180. package/dist/lib/crypto.js +176 -0
  181. package/dist/lib/crypto.js.map +1 -0
  182. package/dist/lib/ecosystem-env.d.ts +33 -0
  183. package/dist/lib/ecosystem-env.d.ts.map +1 -0
  184. package/dist/lib/ecosystem-env.js +62 -0
  185. package/dist/lib/ecosystem-env.js.map +1 -0
  186. package/dist/lib/errors.d.ts +35 -0
  187. package/dist/lib/errors.d.ts.map +1 -0
  188. package/dist/lib/errors.js +71 -0
  189. package/dist/lib/errors.js.map +1 -0
  190. package/dist/lib/git-events-subscriber.d.ts +86 -0
  191. package/dist/lib/git-events-subscriber.d.ts.map +1 -0
  192. package/dist/lib/git-events-subscriber.js +870 -0
  193. package/dist/lib/git-events-subscriber.js.map +1 -0
  194. package/dist/lib/git-merge-analyzer.d.ts +38 -0
  195. package/dist/lib/git-merge-analyzer.d.ts.map +1 -0
  196. package/dist/lib/git-merge-analyzer.js +23 -0
  197. package/dist/lib/git-merge-analyzer.js.map +1 -0
  198. package/dist/lib/git.d.ts +103 -0
  199. package/dist/lib/git.d.ts.map +1 -0
  200. package/dist/lib/git.js +670 -0
  201. package/dist/lib/git.js.map +1 -0
  202. package/dist/lib/github.d.ts +151 -0
  203. package/dist/lib/github.d.ts.map +1 -0
  204. package/dist/lib/github.js +425 -0
  205. package/dist/lib/github.js.map +1 -0
  206. package/dist/lib/graph.d.ts +38 -0
  207. package/dist/lib/graph.d.ts.map +1 -0
  208. package/dist/lib/graph.js +165 -0
  209. package/dist/lib/graph.js.map +1 -0
  210. package/dist/lib/machine.d.ts +14 -0
  211. package/dist/lib/machine.d.ts.map +1 -0
  212. package/dist/lib/machine.js +38 -0
  213. package/dist/lib/machine.js.map +1 -0
  214. package/dist/lib/notify.d.ts +68 -0
  215. package/dist/lib/notify.d.ts.map +1 -0
  216. package/dist/lib/notify.js +111 -0
  217. package/dist/lib/notify.js.map +1 -0
  218. package/dist/lib/outline.d.ts +6 -0
  219. package/dist/lib/outline.d.ts.map +1 -0
  220. package/dist/lib/outline.js +60 -0
  221. package/dist/lib/outline.js.map +1 -0
  222. package/dist/lib/push-registry.d.ts +22 -0
  223. package/dist/lib/push-registry.d.ts.map +1 -0
  224. package/dist/lib/push-registry.js +21 -0
  225. package/dist/lib/push-registry.js.map +1 -0
  226. package/dist/lib/reconcile.d.ts +100 -0
  227. package/dist/lib/reconcile.d.ts.map +1 -0
  228. package/dist/lib/reconcile.js +121 -0
  229. package/dist/lib/reconcile.js.map +1 -0
  230. package/dist/lib/regex-utils.d.ts +6 -0
  231. package/dist/lib/regex-utils.d.ts.map +1 -0
  232. package/dist/lib/regex-utils.js +24 -0
  233. package/dist/lib/regex-utils.js.map +1 -0
  234. package/dist/lib/register-renderer.d.ts +10 -0
  235. package/dist/lib/register-renderer.d.ts.map +1 -0
  236. package/dist/lib/register-renderer.js +19 -0
  237. package/dist/lib/register-renderer.js.map +1 -0
  238. package/dist/lib/remote-drift.d.ts +61 -0
  239. package/dist/lib/remote-drift.d.ts.map +1 -0
  240. package/dist/lib/remote-drift.js +227 -0
  241. package/dist/lib/remote-drift.js.map +1 -0
  242. package/dist/lib/security.d.ts +72 -0
  243. package/dist/lib/security.d.ts.map +1 -0
  244. package/dist/lib/security.js +180 -0
  245. package/dist/lib/security.js.map +1 -0
  246. package/dist/lib/semantic-analysis.d.ts +31 -0
  247. package/dist/lib/semantic-analysis.d.ts.map +1 -0
  248. package/dist/lib/semantic-analysis.js +120 -0
  249. package/dist/lib/semantic-analysis.js.map +1 -0
  250. package/dist/lib/supabase-credentials.d.ts +36 -0
  251. package/dist/lib/supabase-credentials.d.ts.map +1 -0
  252. package/dist/lib/supabase-credentials.js +43 -0
  253. package/dist/lib/supabase-credentials.js.map +1 -0
  254. package/dist/lib/trunk.d.ts +39 -0
  255. package/dist/lib/trunk.d.ts.map +1 -0
  256. package/dist/lib/trunk.js +116 -0
  257. package/dist/lib/trunk.js.map +1 -0
  258. package/dist/lib/update-check.d.ts +11 -0
  259. package/dist/lib/update-check.d.ts.map +1 -0
  260. package/dist/lib/update-check.js +113 -0
  261. package/dist/lib/update-check.js.map +1 -0
  262. package/dist/lib/watch-renderer.d.ts +13 -0
  263. package/dist/lib/watch-renderer.d.ts.map +1 -0
  264. package/dist/lib/watch-renderer.js +35 -0
  265. package/dist/lib/watch-renderer.js.map +1 -0
  266. package/dist/storage/adapter.d.ts +81 -0
  267. package/dist/storage/adapter.d.ts.map +1 -0
  268. package/dist/storage/adapter.js +8 -0
  269. package/dist/storage/adapter.js.map +1 -0
  270. package/dist/storage/branch-registry-store.d.ts +13 -0
  271. package/dist/storage/branch-registry-store.d.ts.map +1 -0
  272. package/dist/storage/branch-registry-store.js +2 -0
  273. package/dist/storage/branch-registry-store.js.map +1 -0
  274. package/dist/storage/factory.d.ts +6 -0
  275. package/dist/storage/factory.d.ts.map +1 -0
  276. package/dist/storage/factory.js +14 -0
  277. package/dist/storage/factory.js.map +1 -0
  278. package/dist/storage/index.d.ts +10 -0
  279. package/dist/storage/index.d.ts.map +1 -0
  280. package/dist/storage/index.js +11 -0
  281. package/dist/storage/index.js.map +1 -0
  282. package/dist/storage/json-branch-registry-store.d.ts +19 -0
  283. package/dist/storage/json-branch-registry-store.d.ts.map +1 -0
  284. package/dist/storage/json-branch-registry-store.js +138 -0
  285. package/dist/storage/json-branch-registry-store.js.map +1 -0
  286. package/dist/storage/local.d.ts +20 -0
  287. package/dist/storage/local.d.ts.map +1 -0
  288. package/dist/storage/local.js +40 -0
  289. package/dist/storage/local.js.map +1 -0
  290. package/dist/storage/memory-branch-registry-store.d.ts +16 -0
  291. package/dist/storage/memory-branch-registry-store.d.ts.map +1 -0
  292. package/dist/storage/memory-branch-registry-store.js +68 -0
  293. package/dist/storage/memory-branch-registry-store.js.map +1 -0
  294. package/dist/storage/supabase-registry-sync-client-impl.d.ts +40 -0
  295. package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
  296. package/dist/storage/supabase-registry-sync-client-impl.js +278 -0
  297. package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -0
  298. package/dist/storage/supabase-registry-sync-client.d.ts +9 -0
  299. package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -0
  300. package/dist/storage/supabase-registry-sync-client.js +2 -0
  301. package/dist/storage/supabase-registry-sync-client.js.map +1 -0
  302. package/dist/storage/supabase.d.ts +28 -0
  303. package/dist/storage/supabase.d.ts.map +1 -0
  304. package/dist/storage/supabase.js +56 -0
  305. package/dist/storage/supabase.js.map +1 -0
  306. package/dist/types/cloud.d.ts +102 -0
  307. package/dist/types/cloud.d.ts.map +1 -0
  308. package/dist/types/cloud.js +13 -0
  309. package/dist/types/cloud.js.map +1 -0
  310. package/package.json +1 -1
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Trunk branch detection.
3
+ *
4
+ * Centralizes the "which branch is trunk?" question that was previously
5
+ * hardcoded as `main`/`master` in several places.
6
+ *
7
+ * Resolution order (first hit wins):
8
+ * 1. `git symbolic-ref refs/remotes/origin/HEAD` (strip the `origin/` prefix)
9
+ * 2. `.spidersanrc` `trunk` key
10
+ * 3. `main` — if that branch exists
11
+ * 4. `master` — if that branch exists
12
+ * 5. `'main'` — default fallback
13
+ *
14
+ * Pure + cached per `cwd` within a process. Tolerates a missing
15
+ * `origin/HEAD` (fresh clones throw — we catch and fall through).
16
+ */
17
+ import { existsSync, readFileSync } from 'fs';
18
+ import { join } from 'path';
19
+ import { execGit } from './git.js';
20
+ const CONFIG_FILES = ['.spidersanrc', '.spidersanrc.json', '.spidersan.config.json'];
21
+ // Per-cwd cache so repeated calls within a process don't re-shell out to git.
22
+ const cache = new Map();
23
+ function resolveCwd(opts) {
24
+ return opts?.cwd ?? process.cwd();
25
+ }
26
+ /** origin/HEAD symbolic-ref → branch name, or null if unset / fresh clone. */
27
+ function fromOriginHead(cwd) {
28
+ try {
29
+ const out = execGit(['-C', cwd, 'symbolic-ref', 'refs/remotes/origin/HEAD'], {
30
+ stdio: ['pipe', 'pipe', 'ignore'],
31
+ }).trim();
32
+ // e.g. "refs/remotes/origin/develop" → "develop"
33
+ const prefix = 'refs/remotes/origin/';
34
+ const ref = out.startsWith(prefix) ? out.slice(prefix.length) : out.replace(/^origin\//, '');
35
+ return ref || null;
36
+ }
37
+ catch {
38
+ // Fresh clones / no origin/HEAD set: throws — fall through.
39
+ return null;
40
+ }
41
+ }
42
+ /** `.spidersanrc` `trunk` key (project-local), or null if absent/unreadable. */
43
+ function fromConfig(cwd) {
44
+ for (const filename of CONFIG_FILES) {
45
+ const path = join(cwd, filename);
46
+ if (!existsSync(path))
47
+ continue;
48
+ try {
49
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
50
+ const trunk = parsed?.trunk;
51
+ if (typeof trunk === 'string' && trunk.trim()) {
52
+ return trunk.trim();
53
+ }
54
+ }
55
+ catch {
56
+ // Malformed config — ignore and keep looking.
57
+ }
58
+ }
59
+ return null;
60
+ }
61
+ /** True if a local branch ref exists. */
62
+ function branchExists(cwd, branch) {
63
+ try {
64
+ execGit(['-C', cwd, 'rev-parse', '--verify', `refs/heads/${branch}`], {
65
+ stdio: ['pipe', 'pipe', 'ignore'],
66
+ });
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ function resolveTrunk(cwd) {
74
+ const fromHead = fromOriginHead(cwd);
75
+ if (fromHead)
76
+ return fromHead;
77
+ const fromCfg = fromConfig(cwd);
78
+ if (fromCfg)
79
+ return fromCfg;
80
+ if (branchExists(cwd, 'main'))
81
+ return 'main';
82
+ if (branchExists(cwd, 'master'))
83
+ return 'master';
84
+ return 'main';
85
+ }
86
+ /**
87
+ * Resolve the repo's trunk branch name.
88
+ *
89
+ * @param opts.cwd - Repo directory (defaults to `process.cwd()`).
90
+ * @returns The trunk branch name (e.g. `'main'`, `'master'`, `'develop'`).
91
+ */
92
+ export function getTrunkBranch(opts) {
93
+ const cwd = resolveCwd(opts);
94
+ const cached = cache.get(cwd);
95
+ if (cached !== undefined)
96
+ return cached;
97
+ const trunk = resolveTrunk(cwd);
98
+ cache.set(cwd, trunk);
99
+ return trunk;
100
+ }
101
+ /**
102
+ * True if `branch` is the repo's trunk.
103
+ *
104
+ * @param branch - Branch name to test.
105
+ * @param opts.cwd - Repo directory (defaults to `process.cwd()`).
106
+ */
107
+ export function isTrunk(branch, opts) {
108
+ return branch === getTrunkBranch(opts);
109
+ }
110
+ /**
111
+ * Clear the per-cwd trunk cache. Intended for tests; harmless in production.
112
+ */
113
+ export function _clearTrunkCache() {
114
+ cache.clear();
115
+ }
116
+ //# sourceMappingURL=trunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trunk.js","sourceRoot":"","sources":["../../src/lib/trunk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Update Check Module
3
+ *
4
+ * Checks npm registry for newer versions and displays update notification.
5
+ * Non-blocking, fails silently.
6
+ */
7
+ /**
8
+ * Check for updates (non-blocking)
9
+ */
10
+ export declare function checkForUpdates(): Promise<void>;
11
+ //# sourceMappingURL=update-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuEH;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCrD"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Update Check Module
3
+ *
4
+ * Checks npm registry for newer versions and displays update notification.
5
+ * Non-blocking, fails silently.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { homedir } from 'os';
10
+ const CONFIG_DIR = join(homedir(), '.spidersan');
11
+ const UPDATE_CACHE = join(CONFIG_DIR, 'update-cache.json');
12
+ const PACKAGE_NAME = 'spidersan';
13
+ const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
14
+ /**
15
+ * Get current installed version
16
+ */
17
+ function getCurrentVersion() {
18
+ try {
19
+ const packagePath = new URL('../../package.json', import.meta.url);
20
+ const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
21
+ return pkg.version;
22
+ }
23
+ catch {
24
+ return '0.0.0';
25
+ }
26
+ }
27
+ /**
28
+ * Load update cache
29
+ */
30
+ function loadCache() {
31
+ try {
32
+ if (existsSync(UPDATE_CACHE)) {
33
+ return JSON.parse(readFileSync(UPDATE_CACHE, 'utf-8'));
34
+ }
35
+ }
36
+ catch {
37
+ // Ignore
38
+ }
39
+ return { lastCheck: 0, latestVersion: null };
40
+ }
41
+ /**
42
+ * Save update cache
43
+ */
44
+ function saveCache(cache) {
45
+ try {
46
+ if (!existsSync(CONFIG_DIR)) {
47
+ mkdirSync(CONFIG_DIR, { recursive: true });
48
+ }
49
+ writeFileSync(UPDATE_CACHE, JSON.stringify(cache));
50
+ }
51
+ catch {
52
+ // Ignore
53
+ }
54
+ }
55
+ /**
56
+ * Compare semantic versions
57
+ */
58
+ function isNewerVersion(current, latest) {
59
+ const currentParts = current.split('.').map(Number);
60
+ const latestParts = latest.split('.').map(Number);
61
+ for (let i = 0; i < 3; i++) {
62
+ if ((latestParts[i] || 0) > (currentParts[i] || 0))
63
+ return true;
64
+ if ((latestParts[i] || 0) < (currentParts[i] || 0))
65
+ return false;
66
+ }
67
+ return false;
68
+ }
69
+ /**
70
+ * Check for updates (non-blocking)
71
+ */
72
+ export async function checkForUpdates() {
73
+ try {
74
+ const cache = loadCache();
75
+ const now = Date.now();
76
+ // Only check once per day
77
+ if (now - cache.lastCheck < CHECK_INTERVAL_MS && cache.latestVersion) {
78
+ showUpdateNotification(cache.latestVersion);
79
+ return;
80
+ }
81
+ // Fetch latest version from npm (with timeout)
82
+ const controller = new AbortController();
83
+ const timeout = setTimeout(() => controller.abort(), 3000);
84
+ const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, { signal: controller.signal });
85
+ clearTimeout(timeout);
86
+ if (!response.ok)
87
+ return;
88
+ const data = await response.json();
89
+ const latestVersion = data.version;
90
+ // Update cache
91
+ saveCache({ lastCheck: now, latestVersion });
92
+ // Show notification if newer
93
+ showUpdateNotification(latestVersion);
94
+ }
95
+ catch {
96
+ // Silent fail - don't interrupt user
97
+ }
98
+ }
99
+ /**
100
+ * Display update notification if newer version available
101
+ */
102
+ function showUpdateNotification(latestVersion) {
103
+ const currentVersion = getCurrentVersion();
104
+ if (isNewerVersion(currentVersion, latestVersion)) {
105
+ console.log('');
106
+ console.log('╭─────────────────────────────────────────────╮');
107
+ console.log(`│ 🕷️ Update available: ${currentVersion} → ${latestVersion.padEnd(10)} │`);
108
+ console.log('│ Run: npm install -g spidersan │');
109
+ console.log('╰─────────────────────────────────────────────╯');
110
+ console.log('');
111
+ }
112
+ }
113
+ //# sourceMappingURL=update-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { DriftResult, DriftSkipped } from './remote-drift.js';
2
+ export interface FetchPollRenderOptions {
3
+ branch: string;
4
+ drift: DriftResult | DriftSkipped;
5
+ timestamp?: string;
6
+ }
7
+ /** Pure. Returns terminal string for --fetch-poll drift warnings and heartbeats. */
8
+ export declare function renderFetchPollHeartbeat(opts: {
9
+ branch: string;
10
+ timestamp?: string;
11
+ }): string;
12
+ export declare function renderFetchPollDrift(opts: FetchPollRenderOptions): string;
13
+ //# sourceMappingURL=watch-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-renderer.d.ts","sourceRoot":"","sources":["../../src/lib/watch-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAM7F;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAgBzE"}
@@ -0,0 +1,35 @@
1
+ /** Pure. Returns terminal string for --fetch-poll drift warnings and heartbeats. */
2
+ export function renderFetchPollHeartbeat(opts) {
3
+ if (opts.timestamp) {
4
+ return `📡 [FETCH-POLL] Remote unchanged (checked at ${opts.timestamp})`;
5
+ }
6
+ return '📡 [FETCH-POLL] Remote unchanged';
7
+ }
8
+ export function renderFetchPollDrift(opts) {
9
+ if ('skipped' in opts.drift) {
10
+ return `📡 [FETCH-POLL] Skipped: ${opts.drift.reason}`;
11
+ }
12
+ const drift = opts.drift;
13
+ const driftSummary = drift.driftZone.length > 0
14
+ ? drift.driftZone.map((file) => formatDriftZoneEntry(file, drift)).join(', ')
15
+ : '(none reported)';
16
+ return [
17
+ '📡 [FETCH-POLL] Remote advanced while you\'re working!',
18
+ ` Branch: ${drift.branch} | Remote is ${drift.remoteAhead} commit(s) ahead`,
19
+ ` Drift zone: ${driftSummary}`,
20
+ ` → Run: git fetch origin && git log --oneline ${drift.remote} -5`,
21
+ ].join('\n').trimEnd();
22
+ }
23
+ function formatDriftZoneEntry(file, result) {
24
+ const labels = [];
25
+ const registered = result.registeredInDrift.find((entry) => entry.file === file);
26
+ const unstaged = result.unstagedInDrift.some((entry) => entry.file === file);
27
+ if (registered && registered.tier !== null) {
28
+ labels.push(`registered tier ${registered.tier}`);
29
+ }
30
+ if (unstaged) {
31
+ labels.push('unstaged ⚠');
32
+ }
33
+ return labels.length > 0 ? `${file} [${labels.join(', ')}]` : file;
34
+ }
35
+ //# sourceMappingURL=watch-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-renderer.js","sourceRoot":"","sources":["../../src/lib/watch-renderer.ts"],"names":[],"mappings":"AAQA,oFAAoF;AACpF,MAAM,UAAU,wBAAwB,CAAC,IAA4C;IACjF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,gDAAgD,IAAI,CAAC,SAAS,GAAG,CAAC;IAC7E,CAAC;IAED,OAAO,kCAAkC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAA4B;IAC7D,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,4BAA4B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC3C,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7E,CAAC,CAAC,iBAAiB,CAAC;IAExB,OAAO;QACH,wDAAwD;QACxD,cAAc,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,WAAW,kBAAkB;QAC/E,kBAAkB,YAAY,EAAE;QAChC,mDAAmD,KAAK,CAAC,MAAM,KAAK;KACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,MAAmB;IAC3D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAE7E,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,mBAAmB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACvE,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Storage Adapter Interface
3
+ *
4
+ * Abstract interface for branch registry storage.
5
+ * Implementations: LocalStorage (JSON), SupabaseStorage (Pro)
6
+ */
7
+ export interface Branch {
8
+ name: string;
9
+ files: string[];
10
+ registeredAt: Date;
11
+ agent?: string;
12
+ /**
13
+ * Claude Code session (the id `tbe`/ccsessions lists) that last registered this
14
+ * branch, so a conflict can say WHICH session to resume. Local registry only:
15
+ * meaningless off the machine that owns the session, and not synced to Supabase.
16
+ */
17
+ sessionId?: string;
18
+ status: 'active' | 'completed' | 'abandoned';
19
+ description?: string;
20
+ /** Branches that must merge BEFORE this one (`spidersan depends`). */
21
+ dependsOn?: string[];
22
+ /** PR that merged this branch (`spidersan merged --pr`). */
23
+ prNumber?: number;
24
+ /**
25
+ * Per-file claims from before 0.20.0, when `watch` and `spidersan
26
+ * claim`/`release` wrote them. Nothing writes this any more; it stays
27
+ * so registries that still carry it keep parsing.
28
+ */
29
+ claims?: Record<string, {
30
+ agent: string;
31
+ at: string;
32
+ }>;
33
+ }
34
+ export interface BranchRegistry {
35
+ branches: Record<string, Branch>;
36
+ version: string;
37
+ projectId?: string;
38
+ }
39
+ /**
40
+ * @deprecated Use BranchRegistryStore for local registry access and
41
+ * SupabaseRegistrySyncClient for cross-machine sync.
42
+ */
43
+ export interface StorageAdapter {
44
+ /**
45
+ * Initialize the storage (create directories, connect to DB, etc.)
46
+ */
47
+ init(): Promise<void>;
48
+ /**
49
+ * Check if storage is initialized
50
+ */
51
+ isInitialized(): Promise<boolean>;
52
+ /**
53
+ * Get all registered branches
54
+ */
55
+ list(): Promise<Branch[]>;
56
+ /**
57
+ * Register a new branch
58
+ */
59
+ register(branch: Omit<Branch, 'registeredAt'>): Promise<Branch>;
60
+ /**
61
+ * Update an existing branch
62
+ */
63
+ update(name: string, updates: Partial<Branch>): Promise<Branch | null>;
64
+ /**
65
+ * Unregister a branch
66
+ */
67
+ unregister(name: string): Promise<boolean>;
68
+ /**
69
+ * Get a specific branch by name
70
+ */
71
+ get(name: string): Promise<Branch | null>;
72
+ /**
73
+ * Find branches that touch specific files
74
+ */
75
+ findByFiles(files: string[]): Promise<Branch[]>;
76
+ /**
77
+ * Clean up old branches
78
+ */
79
+ cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
80
+ }
81
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAElC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEvE;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhD;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxE"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Storage Adapter Interface
3
+ *
4
+ * Abstract interface for branch registry storage.
5
+ * Implementations: LocalStorage (JSON), SupabaseStorage (Pro)
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/storage/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,13 @@
1
+ import type { Branch } from './adapter.js';
2
+ export interface BranchRegistryStore {
3
+ init(): Promise<void>;
4
+ isInitialized(): Promise<boolean>;
5
+ list(): Promise<Branch[]>;
6
+ register(branch: Omit<Branch, 'registeredAt'>): Promise<Branch>;
7
+ update(name: string, updates: Partial<Branch>): Promise<Branch | null>;
8
+ unregister(name: string): Promise<boolean>;
9
+ get(name: string): Promise<Branch | null>;
10
+ findByFiles(files: string[]): Promise<Branch[]>;
11
+ cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
12
+ }
13
+ //# sourceMappingURL=branch-registry-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/branch-registry-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAChC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=branch-registry-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-registry-store.js","sourceRoot":"","sources":["../../src/storage/branch-registry-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Storage factory - selects the right storage backend
3
+ */
4
+ import type { StorageAdapter } from './adapter.js';
5
+ export declare function getStorage(): Promise<StorageAdapter>;
6
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAQ1D"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Storage factory - selects the right storage backend
3
+ */
4
+ import { LocalStorage } from './local.js';
5
+ import { SupabaseStorage } from './supabase.js';
6
+ import { resolveSupabaseCredentials } from '../lib/supabase-credentials.js';
7
+ export async function getStorage() {
8
+ const supabaseConfig = await resolveSupabaseCredentials();
9
+ if (supabaseConfig) {
10
+ return new SupabaseStorage(supabaseConfig);
11
+ }
12
+ return new LocalStorage();
13
+ }
14
+ //# 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,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,cAAc,GAAG,MAAM,0BAA0B,EAAE,CAAC;IAE1D,IAAI,cAAc,EAAE,CAAC;QACjB,OAAO,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,YAAY,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './adapter.js';
2
+ export * from './branch-registry-store.js';
3
+ export * from './local.js';
4
+ export * from './json-branch-registry-store.js';
5
+ export * from './memory-branch-registry-store.js';
6
+ export * from './supabase.js';
7
+ export * from './supabase-registry-sync-client.js';
8
+ export * from './supabase-registry-sync-client-impl.js';
9
+ export * from './factory.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,eAAe,CAAC;AAC9B,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Branch storage adapters
2
+ export * from './adapter.js';
3
+ export * from './branch-registry-store.js';
4
+ export * from './local.js';
5
+ export * from './json-branch-registry-store.js';
6
+ export * from './memory-branch-registry-store.js';
7
+ export * from './supabase.js';
8
+ export * from './supabase-registry-sync-client.js';
9
+ export * from './supabase-registry-sync-client-impl.js';
10
+ export * from './factory.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,eAAe,CAAC;AAC9B,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Branch } from './adapter.js';
2
+ import type { BranchRegistryStore } from './branch-registry-store.js';
3
+ export declare class JsonBranchRegistryStore implements BranchRegistryStore {
4
+ private basePath;
5
+ private registryPath;
6
+ constructor(basePath?: string);
7
+ init(): Promise<void>;
8
+ isInitialized(): Promise<boolean>;
9
+ list(): Promise<Branch[]>;
10
+ register(branch: Omit<Branch, 'registeredAt'>): Promise<Branch>;
11
+ update(name: string, updates: Partial<Branch>): Promise<Branch | null>;
12
+ unregister(name: string): Promise<boolean>;
13
+ get(name: string): Promise<Branch | null>;
14
+ findByFiles(files: string[]): Promise<Branch[]>;
15
+ cleanup(olderThan: Date, includeActive?: boolean): Promise<string[]>;
16
+ private load;
17
+ private save;
18
+ }
19
+ //# sourceMappingURL=json-branch-registry-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/json-branch-registry-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA6BtE,qBAAa,uBAAwB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAKtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAetE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,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;IAM/C,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAuB1D,IAAI;YA+BJ,IAAI;CAMrB"}