xtctx 0.3.2 → 0.11.3

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 (308) hide show
  1. package/CHANGELOG.md +317 -122
  2. package/LICENSE +21 -21
  3. package/README.md +154 -121
  4. package/dist/src/cli/disconnect.d.ts +8 -0
  5. package/dist/src/cli/disconnect.d.ts.map +1 -0
  6. package/dist/src/cli/disconnect.js +42 -0
  7. package/dist/src/cli/disconnect.js.map +1 -0
  8. package/dist/src/cli/hook.d.ts +7 -0
  9. package/dist/src/cli/hook.d.ts.map +1 -0
  10. package/dist/src/cli/hook.js +32 -0
  11. package/dist/src/cli/hook.js.map +1 -0
  12. package/dist/src/cli/index.d.ts.map +1 -1
  13. package/dist/src/cli/index.js +86 -33
  14. package/dist/src/cli/index.js.map +1 -1
  15. package/dist/src/cli/setup.d.ts +8 -0
  16. package/dist/src/cli/setup.d.ts.map +1 -0
  17. package/dist/src/cli/setup.js +76 -0
  18. package/dist/src/cli/setup.js.map +1 -0
  19. package/dist/src/cli/status.d.ts +7 -0
  20. package/dist/src/cli/status.d.ts.map +1 -0
  21. package/dist/src/cli/status.js +133 -0
  22. package/dist/src/cli/status.js.map +1 -0
  23. package/dist/src/config/disconnect.d.ts +34 -0
  24. package/dist/src/config/disconnect.d.ts.map +1 -0
  25. package/dist/src/config/disconnect.js +386 -0
  26. package/dist/src/config/disconnect.js.map +1 -0
  27. package/dist/src/config/managed-block.d.ts +29 -0
  28. package/dist/src/config/managed-block.d.ts.map +1 -0
  29. package/dist/src/config/managed-block.js +67 -0
  30. package/dist/src/config/managed-block.js.map +1 -0
  31. package/dist/src/config/mcp-config.d.ts +93 -0
  32. package/dist/src/config/mcp-config.d.ts.map +1 -0
  33. package/dist/src/config/mcp-config.js +556 -0
  34. package/dist/src/config/mcp-config.js.map +1 -0
  35. package/dist/src/config/setup.d.ts +39 -0
  36. package/dist/src/config/setup.d.ts.map +1 -0
  37. package/dist/src/config/setup.js +379 -0
  38. package/dist/src/config/setup.js.map +1 -0
  39. package/dist/src/config/skills.d.ts +73 -0
  40. package/dist/src/config/skills.d.ts.map +1 -0
  41. package/dist/src/config/skills.js +427 -0
  42. package/dist/src/config/skills.js.map +1 -0
  43. package/dist/src/handoff/embeddings.d.ts +26 -0
  44. package/dist/src/handoff/embeddings.d.ts.map +1 -0
  45. package/dist/src/handoff/embeddings.js +132 -0
  46. package/dist/src/handoff/embeddings.js.map +1 -0
  47. package/dist/src/handoff/sqlite-index.d.ts +52 -0
  48. package/dist/src/handoff/sqlite-index.d.ts.map +1 -0
  49. package/dist/src/handoff/sqlite-index.js +905 -0
  50. package/dist/src/handoff/sqlite-index.js.map +1 -0
  51. package/dist/src/handoff/types.d.ts +63 -0
  52. package/dist/src/handoff/types.d.ts.map +1 -0
  53. package/dist/src/handoff/types.js +2 -0
  54. package/dist/src/handoff/types.js.map +1 -0
  55. package/dist/src/handoff/vector.d.ts +4 -0
  56. package/dist/src/handoff/vector.d.ts.map +1 -0
  57. package/dist/src/handoff/vector.js +31 -0
  58. package/dist/src/handoff/vector.js.map +1 -0
  59. package/dist/src/mcp/server.d.ts +3 -20
  60. package/dist/src/mcp/server.d.ts.map +1 -1
  61. package/dist/src/mcp/server.js +90 -205
  62. package/dist/src/mcp/server.js.map +1 -1
  63. package/dist/src/mcp/tools/continuity.d.ts +21 -0
  64. package/dist/src/mcp/tools/continuity.d.ts.map +1 -0
  65. package/dist/src/mcp/tools/continuity.js +55 -0
  66. package/dist/src/mcp/tools/continuity.js.map +1 -0
  67. package/dist/src/mcp/tools/manifest.d.ts +40 -0
  68. package/dist/src/mcp/tools/manifest.d.ts.map +1 -0
  69. package/dist/src/mcp/tools/manifest.js +105 -0
  70. package/dist/src/mcp/tools/manifest.js.map +1 -0
  71. package/dist/src/mcp/tools/sessions.d.ts +18 -31
  72. package/dist/src/mcp/tools/sessions.d.ts.map +1 -1
  73. package/dist/src/mcp/tools/sessions.js +109 -16
  74. package/dist/src/mcp/tools/sessions.js.map +1 -1
  75. package/dist/src/runtime/services.d.ts +11 -38
  76. package/dist/src/runtime/services.d.ts.map +1 -1
  77. package/dist/src/runtime/services.js +61 -200
  78. package/dist/src/runtime/services.js.map +1 -1
  79. package/dist/src/scrapers/antigravity.d.ts +52 -0
  80. package/dist/src/scrapers/antigravity.d.ts.map +1 -0
  81. package/dist/src/scrapers/antigravity.js +869 -0
  82. package/dist/src/scrapers/antigravity.js.map +1 -0
  83. package/dist/src/scrapers/base.d.ts +53 -1
  84. package/dist/src/scrapers/base.d.ts.map +1 -1
  85. package/dist/src/scrapers/base.js +93 -4
  86. package/dist/src/scrapers/base.js.map +1 -1
  87. package/dist/src/scrapers/claude-code.d.ts +37 -6
  88. package/dist/src/scrapers/claude-code.d.ts.map +1 -1
  89. package/dist/src/scrapers/claude-code.js +214 -40
  90. package/dist/src/scrapers/claude-code.js.map +1 -1
  91. package/dist/src/scrapers/codex.d.ts +36 -6
  92. package/dist/src/scrapers/codex.d.ts.map +1 -1
  93. package/dist/src/scrapers/codex.js +283 -60
  94. package/dist/src/scrapers/codex.js.map +1 -1
  95. package/dist/src/scrapers/copilot-cli.d.ts +34 -0
  96. package/dist/src/scrapers/copilot-cli.d.ts.map +1 -0
  97. package/dist/src/scrapers/copilot-cli.js +342 -0
  98. package/dist/src/scrapers/copilot-cli.js.map +1 -0
  99. package/dist/src/scrapers/copilot.d.ts +41 -8
  100. package/dist/src/scrapers/copilot.d.ts.map +1 -1
  101. package/dist/src/scrapers/copilot.js +256 -118
  102. package/dist/src/scrapers/copilot.js.map +1 -1
  103. package/dist/src/scrapers/cursor.d.ts +24 -9
  104. package/dist/src/scrapers/cursor.d.ts.map +1 -1
  105. package/dist/src/scrapers/cursor.js +259 -152
  106. package/dist/src/scrapers/cursor.js.map +1 -1
  107. package/dist/src/scrapers/index.d.ts +23 -0
  108. package/dist/src/scrapers/index.d.ts.map +1 -0
  109. package/dist/src/scrapers/index.js +22 -0
  110. package/dist/src/scrapers/index.js.map +1 -0
  111. package/dist/src/scrapers/opencode.d.ts +37 -0
  112. package/dist/src/scrapers/opencode.d.ts.map +1 -0
  113. package/dist/src/scrapers/opencode.js +277 -0
  114. package/dist/src/scrapers/opencode.js.map +1 -0
  115. package/dist/src/scrapers/registry.d.ts +1 -0
  116. package/dist/src/scrapers/registry.d.ts.map +1 -1
  117. package/dist/src/scrapers/registry.js +3 -0
  118. package/dist/src/scrapers/registry.js.map +1 -1
  119. package/dist/src/tools/sources.d.ts +28 -0
  120. package/dist/src/tools/sources.d.ts.map +1 -0
  121. package/dist/src/tools/sources.js +149 -0
  122. package/dist/src/tools/sources.js.map +1 -0
  123. package/dist/src/types/config.d.ts +24 -37
  124. package/dist/src/types/config.d.ts.map +1 -1
  125. package/dist/src/types/index.d.ts +0 -2
  126. package/dist/src/types/index.d.ts.map +1 -1
  127. package/dist/src/types/index.js +0 -2
  128. package/dist/src/types/index.js.map +1 -1
  129. package/dist/src/types/scraper.d.ts +34 -5
  130. package/dist/src/types/scraper.d.ts.map +1 -1
  131. package/dist/src/utils/atomic-file.d.ts +8 -0
  132. package/dist/src/utils/atomic-file.d.ts.map +1 -0
  133. package/dist/src/utils/atomic-file.js +15 -0
  134. package/dist/src/utils/atomic-file.js.map +1 -0
  135. package/dist/src/utils/errors.d.ts +7 -0
  136. package/dist/src/utils/errors.d.ts.map +1 -0
  137. package/dist/src/utils/errors.js +16 -0
  138. package/dist/src/utils/errors.js.map +1 -0
  139. package/dist/src/utils/package-info.d.ts +11 -0
  140. package/dist/src/utils/package-info.d.ts.map +1 -0
  141. package/dist/src/utils/package-info.js +30 -0
  142. package/dist/src/utils/package-info.js.map +1 -0
  143. package/dist/src/utils/project-scope.d.ts +19 -0
  144. package/dist/src/utils/project-scope.d.ts.map +1 -0
  145. package/dist/src/utils/project-scope.js +61 -0
  146. package/dist/src/utils/project-scope.js.map +1 -0
  147. package/package.json +70 -66
  148. package/dist/src/api/routes/config.d.ts +0 -4
  149. package/dist/src/api/routes/config.d.ts.map +0 -1
  150. package/dist/src/api/routes/config.js +0 -61
  151. package/dist/src/api/routes/config.js.map +0 -1
  152. package/dist/src/api/routes/knowledge.d.ts +0 -4
  153. package/dist/src/api/routes/knowledge.d.ts.map +0 -1
  154. package/dist/src/api/routes/knowledge.js +0 -40
  155. package/dist/src/api/routes/knowledge.js.map +0 -1
  156. package/dist/src/api/routes/search.d.ts +0 -7
  157. package/dist/src/api/routes/search.d.ts.map +0 -1
  158. package/dist/src/api/routes/search.js +0 -108
  159. package/dist/src/api/routes/search.js.map +0 -1
  160. package/dist/src/api/routes/sources.d.ts +0 -12
  161. package/dist/src/api/routes/sources.d.ts.map +0 -1
  162. package/dist/src/api/routes/sources.js +0 -70
  163. package/dist/src/api/routes/sources.js.map +0 -1
  164. package/dist/src/api/server.d.ts +0 -26
  165. package/dist/src/api/server.d.ts.map +0 -1
  166. package/dist/src/api/server.js +0 -312
  167. package/dist/src/api/server.js.map +0 -1
  168. package/dist/src/cli/ingest.d.ts +0 -6
  169. package/dist/src/cli/ingest.d.ts.map +0 -1
  170. package/dist/src/cli/ingest.js +0 -11
  171. package/dist/src/cli/ingest.js.map +0 -1
  172. package/dist/src/cli/init.d.ts +0 -6
  173. package/dist/src/cli/init.d.ts.map +0 -1
  174. package/dist/src/cli/init.js +0 -105
  175. package/dist/src/cli/init.js.map +0 -1
  176. package/dist/src/cli/serve.d.ts +0 -7
  177. package/dist/src/cli/serve.d.ts.map +0 -1
  178. package/dist/src/cli/serve.js +0 -100
  179. package/dist/src/cli/serve.js.map +0 -1
  180. package/dist/src/cli/sync.d.ts +0 -5
  181. package/dist/src/cli/sync.d.ts.map +0 -1
  182. package/dist/src/cli/sync.js +0 -13
  183. package/dist/src/cli/sync.js.map +0 -1
  184. package/dist/src/compaction/pipeline.d.ts +0 -19
  185. package/dist/src/compaction/pipeline.d.ts.map +0 -1
  186. package/dist/src/compaction/pipeline.js +0 -37
  187. package/dist/src/compaction/pipeline.js.map +0 -1
  188. package/dist/src/compaction/providers/cli.d.ts +0 -13
  189. package/dist/src/compaction/providers/cli.d.ts.map +0 -1
  190. package/dist/src/compaction/providers/cli.js +0 -60
  191. package/dist/src/compaction/providers/cli.js.map +0 -1
  192. package/dist/src/compaction/rule-based.d.ts +0 -8
  193. package/dist/src/compaction/rule-based.d.ts.map +0 -1
  194. package/dist/src/compaction/rule-based.js +0 -120
  195. package/dist/src/compaction/rule-based.js.map +0 -1
  196. package/dist/src/config/loader.d.ts +0 -12
  197. package/dist/src/config/loader.d.ts.map +0 -1
  198. package/dist/src/config/loader.js +0 -76
  199. package/dist/src/config/loader.js.map +0 -1
  200. package/dist/src/config/mappings/claude-code.d.ts +0 -3
  201. package/dist/src/config/mappings/claude-code.d.ts.map +0 -1
  202. package/dist/src/config/mappings/claude-code.js +0 -31
  203. package/dist/src/config/mappings/claude-code.js.map +0 -1
  204. package/dist/src/config/mappings/codex.d.ts +0 -3
  205. package/dist/src/config/mappings/codex.d.ts.map +0 -1
  206. package/dist/src/config/mappings/codex.js +0 -31
  207. package/dist/src/config/mappings/codex.js.map +0 -1
  208. package/dist/src/config/mappings/copilot.d.ts +0 -3
  209. package/dist/src/config/mappings/copilot.d.ts.map +0 -1
  210. package/dist/src/config/mappings/copilot.js +0 -33
  211. package/dist/src/config/mappings/copilot.js.map +0 -1
  212. package/dist/src/config/mappings/cursor.d.ts +0 -3
  213. package/dist/src/config/mappings/cursor.d.ts.map +0 -1
  214. package/dist/src/config/mappings/cursor.js +0 -29
  215. package/dist/src/config/mappings/cursor.js.map +0 -1
  216. package/dist/src/config/sync.d.ts +0 -13
  217. package/dist/src/config/sync.d.ts.map +0 -1
  218. package/dist/src/config/sync.js +0 -96
  219. package/dist/src/config/sync.js.map +0 -1
  220. package/dist/src/ingestion/coordinator.d.ts +0 -37
  221. package/dist/src/ingestion/coordinator.d.ts.map +0 -1
  222. package/dist/src/ingestion/coordinator.js +0 -127
  223. package/dist/src/ingestion/coordinator.js.map +0 -1
  224. package/dist/src/ingestion/daemon.d.ts +0 -17
  225. package/dist/src/ingestion/daemon.d.ts.map +0 -1
  226. package/dist/src/ingestion/daemon.js +0 -35
  227. package/dist/src/ingestion/daemon.js.map +0 -1
  228. package/dist/src/ingestion/watcher.d.ts +0 -19
  229. package/dist/src/ingestion/watcher.d.ts.map +0 -1
  230. package/dist/src/ingestion/watcher.js +0 -70
  231. package/dist/src/ingestion/watcher.js.map +0 -1
  232. package/dist/src/knowledge/autotag.d.ts +0 -3
  233. package/dist/src/knowledge/autotag.d.ts.map +0 -1
  234. package/dist/src/knowledge/autotag.js +0 -24
  235. package/dist/src/knowledge/autotag.js.map +0 -1
  236. package/dist/src/knowledge/dedup.d.ts +0 -7
  237. package/dist/src/knowledge/dedup.d.ts.map +0 -1
  238. package/dist/src/knowledge/dedup.js +0 -15
  239. package/dist/src/knowledge/dedup.js.map +0 -1
  240. package/dist/src/knowledge/repository.d.ts +0 -12
  241. package/dist/src/knowledge/repository.d.ts.map +0 -1
  242. package/dist/src/knowledge/repository.js +0 -74
  243. package/dist/src/knowledge/repository.js.map +0 -1
  244. package/dist/src/mcp/tools/config.d.ts +0 -36
  245. package/dist/src/mcp/tools/config.d.ts.map +0 -1
  246. package/dist/src/mcp/tools/config.js +0 -54
  247. package/dist/src/mcp/tools/config.js.map +0 -1
  248. package/dist/src/mcp/tools/knowledge.d.ts +0 -17
  249. package/dist/src/mcp/tools/knowledge.d.ts.map +0 -1
  250. package/dist/src/mcp/tools/knowledge.js +0 -46
  251. package/dist/src/mcp/tools/knowledge.js.map +0 -1
  252. package/dist/src/mcp/tools/search.d.ts +0 -22
  253. package/dist/src/mcp/tools/search.d.ts.map +0 -1
  254. package/dist/src/mcp/tools/search.js +0 -30
  255. package/dist/src/mcp/tools/search.js.map +0 -1
  256. package/dist/src/mcp/tools/write.d.ts +0 -38
  257. package/dist/src/mcp/tools/write.d.ts.map +0 -1
  258. package/dist/src/mcp/tools/write.js +0 -97
  259. package/dist/src/mcp/tools/write.js.map +0 -1
  260. package/dist/src/runtime/ingestion.d.ts +0 -17
  261. package/dist/src/runtime/ingestion.d.ts.map +0 -1
  262. package/dist/src/runtime/ingestion.js +0 -106
  263. package/dist/src/runtime/ingestion.js.map +0 -1
  264. package/dist/src/scrapers/gemini.d.ts +0 -17
  265. package/dist/src/scrapers/gemini.d.ts.map +0 -1
  266. package/dist/src/scrapers/gemini.js +0 -245
  267. package/dist/src/scrapers/gemini.js.map +0 -1
  268. package/dist/src/store/embeddings.d.ts +0 -9
  269. package/dist/src/store/embeddings.d.ts.map +0 -1
  270. package/dist/src/store/embeddings.js +0 -28
  271. package/dist/src/store/embeddings.js.map +0 -1
  272. package/dist/src/store/lance.d.ts +0 -25
  273. package/dist/src/store/lance.d.ts.map +0 -1
  274. package/dist/src/store/lance.js +0 -74
  275. package/dist/src/store/lance.js.map +0 -1
  276. package/dist/src/store/search.d.ts +0 -18
  277. package/dist/src/store/search.d.ts.map +0 -1
  278. package/dist/src/store/search.js +0 -55
  279. package/dist/src/store/search.js.map +0 -1
  280. package/dist/src/types/compaction.d.ts +0 -29
  281. package/dist/src/types/compaction.d.ts.map +0 -1
  282. package/dist/src/types/compaction.js +0 -2
  283. package/dist/src/types/compaction.js.map +0 -1
  284. package/dist/src/types/context.d.ts +0 -33
  285. package/dist/src/types/context.d.ts.map +0 -1
  286. package/dist/src/types/context.js +0 -18
  287. package/dist/src/types/context.js.map +0 -1
  288. package/dist/src/utils/retry.d.ts +0 -11
  289. package/dist/src/utils/retry.d.ts.map +0 -1
  290. package/dist/src/utils/retry.js +0 -46
  291. package/dist/src/utils/retry.js.map +0 -1
  292. package/dist/src/utils/shutdown.d.ts +0 -25
  293. package/dist/src/utils/shutdown.d.ts.map +0 -1
  294. package/dist/src/utils/shutdown.js +0 -56
  295. package/dist/src/utils/shutdown.js.map +0 -1
  296. package/dist/web/apple-touch-icon.png +0 -0
  297. package/dist/web/assets/index-Nuadr5ox.css +0 -1
  298. package/dist/web/assets/index-aA0u8eXA.js +0 -3504
  299. package/dist/web/assets/primeicons-C6QP2o4f.woff2 +0 -0
  300. package/dist/web/assets/primeicons-DMOk5skT.eot +0 -0
  301. package/dist/web/assets/primeicons-Dr5RGzOO.svg +0 -345
  302. package/dist/web/assets/primeicons-MpK4pl85.ttf +0 -0
  303. package/dist/web/assets/primeicons-WjwUDZjB.woff +0 -0
  304. package/dist/web/favicon.ico +0 -0
  305. package/dist/web/favicon.svg +0 -21
  306. package/dist/web/index.html +0 -21
  307. package/dist/web/site.webmanifest +0 -19
  308. package/dist/web/vite.svg +0 -1
@@ -2,6 +2,17 @@ export interface ChunkMetadata {
2
2
  messageIndex: number;
3
3
  tokenEstimate?: number;
4
4
  referencedFiles?: string[];
5
+ /**
6
+ * Chunking layer indicating the abstraction level of the content.
7
+ *
8
+ * - 0 Direct conversation turn (user ↔ assistant message). Default.
9
+ * - 1 Compacted / summarized content (e.g. Codex compaction summaries,
10
+ * rule-based compaction output). Higher abstraction, fewer tokens.
11
+ *
12
+ * Consumers can prefer layer-0 for verbatim recall or layer-1 for
13
+ * condensed context that spans more conversational history.
14
+ */
15
+ layer?: number;
5
16
  }
6
17
  export interface ConversationChunk {
7
18
  tool: string;
@@ -23,7 +34,6 @@ export interface ConversationScraper<T extends ConversationChunk = ConversationC
23
34
  getStorePaths(): string[];
24
35
  scrape(since?: Date): AsyncIterable<T>;
25
36
  fullSync(): AsyncIterable<T>;
26
- parseRaw(raw: unknown): T;
27
37
  getLastScrapedPosition(): Promise<ScraperState>;
28
38
  saveScrapedPosition(state: ScraperState): Promise<void>;
29
39
  }
@@ -50,6 +60,8 @@ export interface CodexChunk extends ConversationChunk {
50
60
  metadata: ChunkMetadata & {
51
61
  approvalMode: "suggest" | "auto-edit" | "full-auto";
52
62
  sandboxed: boolean;
63
+ /** 0 = direct conversation turn; 1 = compacted/summary layer. */
64
+ layer: number;
53
65
  };
54
66
  }
55
67
  export interface CopilotChunk extends ConversationChunk {
@@ -59,12 +71,29 @@ export interface CopilotChunk extends ConversationChunk {
59
71
  completionType?: string;
60
72
  };
61
73
  }
62
- export interface GeminiChunk extends ConversationChunk {
63
- tool: "gemini";
74
+ export interface AntigravityChunk extends ConversationChunk {
75
+ tool: "antigravity";
64
76
  metadata: ChunkMetadata & {
77
+ artifactType?: string;
78
+ artifactName?: string;
79
+ summary?: string;
80
+ sourcePath?: string;
81
+ toolName?: string;
65
82
  model?: string;
66
- promptTokens?: number;
67
- responseTokens?: number;
83
+ };
84
+ }
85
+ export interface OpenCodeChunk extends ConversationChunk {
86
+ tool: "opencode";
87
+ metadata: ChunkMetadata & {
88
+ agent?: string;
89
+ model?: string;
90
+ providerID?: string;
91
+ };
92
+ }
93
+ export interface CopilotCliChunk extends ConversationChunk {
94
+ tool: "copilot-cli";
95
+ metadata: ChunkMetadata & {
96
+ eventType?: string;
68
97
  };
69
98
  }
70
99
  //# sourceMappingURL=scraper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scraper.d.ts","sourceRoot":"","sources":["../../../src/types/scraper.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB;IAE/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,aAAa,IAAI,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACvC,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,CAAC;IAC1B,sBAAsB,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAChD,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,aAAa,GAAG;QACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,aAAa,GAAG,UAAU,CAAC;QACxC,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,GAAG;QACxB,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC;QACjC,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,UAAW,SAAQ,iBAAiB;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,aAAa,GAAG;QACxB,YAAY,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;QACpD,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,GAAG;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,GAAG;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH"}
1
+ {"version":3,"file":"scraper.d.ts","sourceRoot":"","sources":["../../../src/types/scraper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Write via a temp file + rename so an interrupted setup never leaves a
3
+ * truncated config file behind — these writes target files owned by other
4
+ * tools (.mcp.json, config.toml, CLAUDE.md, …), where a partial write is a
5
+ * corruption the owning tool has to recover from.
6
+ */
7
+ export declare function writeFileAtomic(filePath: string, content: string): Promise<void>;
8
+ //# sourceMappingURL=atomic-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-file.d.ts","sourceRoot":"","sources":["../../../src/utils/atomic-file.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtF"}
@@ -0,0 +1,15 @@
1
+ import { mkdir, rename, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ /**
4
+ * Write via a temp file + rename so an interrupted setup never leaves a
5
+ * truncated config file behind — these writes target files owned by other
6
+ * tools (.mcp.json, config.toml, CLAUDE.md, …), where a partial write is a
7
+ * corruption the owning tool has to recover from.
8
+ */
9
+ export async function writeFileAtomic(filePath, content) {
10
+ await mkdir(dirname(filePath), { recursive: true });
11
+ const tmpPath = `${filePath}.xtctx-tmp`;
12
+ await writeFile(tmpPath, content, "utf-8");
13
+ await rename(tmpPath, filePath);
14
+ }
15
+ //# sourceMappingURL=atomic-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-file.js","sourceRoot":"","sources":["../../../src/utils/atomic-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,GAAG,QAAQ,YAAY,CAAC;IACxC,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function errorMessage(error: unknown): string;
2
+ /**
3
+ * Replace absolute filesystem paths with a placeholder so error text can be
4
+ * returned to an MCP client without disclosing local machine layout.
5
+ */
6
+ export declare function sanitizeErrorMessage(message: string): string;
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMnD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI5D"}
@@ -0,0 +1,16 @@
1
+ export function errorMessage(error) {
2
+ if (error instanceof Error) {
3
+ return error.message;
4
+ }
5
+ return String(error);
6
+ }
7
+ /**
8
+ * Replace absolute filesystem paths with a placeholder so error text can be
9
+ * returned to an MCP client without disclosing local machine layout.
10
+ */
11
+ export function sanitizeErrorMessage(message) {
12
+ return message
13
+ .replace(/[A-Za-z]:[\\/][^\s'"`]+/g, "<path>")
14
+ .replace(/(^|[\s'"`(])\/[^\s'"`):]+/g, "$1<path>");
15
+ }
16
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,OAAO;SACX,OAAO,CAAC,0BAA0B,EAAE,QAAQ,CAAC;SAC7C,OAAO,CAAC,4BAA4B,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Resolve the xtctx package.json by walking up from the caller's module URL
3
+ * until a package.json with name === "xtctx" is found. Works identically
4
+ * whether the caller lives in `src/...` (tsx dev mode), `dist/src/...`
5
+ * (post-build in-tree), or `node_modules/xtctx/dist/src/...` (installed).
6
+ */
7
+ export declare function readXtctxPackage(callerUrl: string): {
8
+ version: string;
9
+ name: string;
10
+ };
11
+ //# sourceMappingURL=package-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-info.d.ts","sourceRoot":"","sources":["../../../src/utils/package-info.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAiBrF"}
@@ -0,0 +1,30 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ /**
5
+ * Resolve the xtctx package.json by walking up from the caller's module URL
6
+ * until a package.json with name === "xtctx" is found. Works identically
7
+ * whether the caller lives in `src/...` (tsx dev mode), `dist/src/...`
8
+ * (post-build in-tree), or `node_modules/xtctx/dist/src/...` (installed).
9
+ */
10
+ export function readXtctxPackage(callerUrl) {
11
+ let dir = dirname(fileURLToPath(callerUrl));
12
+ for (let depth = 0; depth < 8; depth++) {
13
+ try {
14
+ const raw = readFileSync(join(dir, "package.json"), "utf8");
15
+ const pkg = JSON.parse(raw);
16
+ if (pkg.name === "xtctx" && typeof pkg.version === "string") {
17
+ return { name: pkg.name, version: pkg.version };
18
+ }
19
+ }
20
+ catch {
21
+ // not here; keep walking
22
+ }
23
+ const parent = dirname(dir);
24
+ if (parent === dir)
25
+ break;
26
+ dir = parent;
27
+ }
28
+ throw new Error(`Could not locate xtctx package.json from ${callerUrl}`);
29
+ }
30
+ //# sourceMappingURL=package-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-info.js","sourceRoot":"","sources":["../../../src/utils/package-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwC,CAAC;YACnE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5D,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,SAAS,EAAE,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * True when `candidatePath` is the project root or a path inside it.
3
+ *
4
+ * Only `/` separates a child from its parent. A previous `<root>--<suffix>`
5
+ * clause — borrowed from Claude Code's encoded *directory names*, where `--`
6
+ * is meaningful — leaked into real path comparison and made `.../app` match
7
+ * the sibling directory `.../app--secret`, indexing and serving another
8
+ * project's transcripts.
9
+ */
10
+ export declare function pathMatchesProject(candidatePath: string, projectRoot: string): boolean;
11
+ /**
12
+ * Encode a project root the way Claude Code names its store directories:
13
+ * every `:`, `\` and `/` becomes `-`. The leading separator is part of that
14
+ * encoding on POSIX (`/Users/me/app` -> `-Users-me-app`); stripping it meant
15
+ * the name never matched the directory on disk, so macOS and Linux projects
16
+ * scraped nothing. Windows paths start with a drive letter and are unaffected.
17
+ */
18
+ export declare function encodePathForToolDirectory(projectRoot: string): string;
19
+ //# sourceMappingURL=project-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-scope.d.ts","sourceRoot":"","sources":["../../../src/utils/project-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAItF;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtE"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * True when `candidatePath` is the project root or a path inside it.
3
+ *
4
+ * Only `/` separates a child from its parent. A previous `<root>--<suffix>`
5
+ * clause — borrowed from Claude Code's encoded *directory names*, where `--`
6
+ * is meaningful — leaked into real path comparison and made `.../app` match
7
+ * the sibling directory `.../app--secret`, indexing and serving another
8
+ * project's transcripts.
9
+ */
10
+ export function pathMatchesProject(candidatePath, projectRoot) {
11
+ const candidate = normalizeProjectPath(candidatePath);
12
+ const root = normalizeProjectPath(projectRoot);
13
+ return candidate === root || candidate.startsWith(`${root}/`);
14
+ }
15
+ /**
16
+ * Encode a project root the way Claude Code names its store directories:
17
+ * every `:`, `\` and `/` becomes `-`. The leading separator is part of that
18
+ * encoding on POSIX (`/Users/me/app` -> `-Users-me-app`); stripping it meant
19
+ * the name never matched the directory on disk, so macOS and Linux projects
20
+ * scraped nothing. Windows paths start with a drive letter and are unaffected.
21
+ */
22
+ export function encodePathForToolDirectory(projectRoot) {
23
+ return projectRoot.replace(/[:\\/]/g, "-").replace(/-+$/g, "");
24
+ }
25
+ function normalizeProjectPath(value) {
26
+ let normalized = value.trim();
27
+ if (/^file:/i.test(normalized)) {
28
+ normalized = fileUrlToPathLike(normalized);
29
+ }
30
+ else {
31
+ normalized = decodePathLike(normalized);
32
+ }
33
+ return normalized
34
+ .replace(/\\/g, "/")
35
+ .replace(/^\/([a-zA-Z]:\/)/, "$1")
36
+ .replace(/\/+/g, "/")
37
+ .replace(/\/$/g, "")
38
+ .toLowerCase();
39
+ }
40
+ function fileUrlToPathLike(value) {
41
+ try {
42
+ const url = new URL(value);
43
+ if (url.protocol !== "file:") {
44
+ return value;
45
+ }
46
+ const path = decodePathLike(url.pathname);
47
+ return url.hostname ? `//${url.hostname}${path}` : path;
48
+ }
49
+ catch {
50
+ return decodePathLike(value);
51
+ }
52
+ }
53
+ function decodePathLike(value) {
54
+ try {
55
+ return decodeURIComponent(value);
56
+ }
57
+ catch {
58
+ return value;
59
+ }
60
+ }
61
+ //# sourceMappingURL=project-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-scope.js","sourceRoot":"","sources":["../../../src/utils/project-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAqB,EAAE,WAAmB;IAC3E,MAAM,SAAS,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,WAAmB;IAC5D,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,IAAI,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,UAAU;SACd,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;SACjC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,69 +1,73 @@
1
- {
2
- "name": "xtctx",
3
- "version": "0.3.2",
4
- "description": "Cross-tool context for AI coding agents",
5
- "type": "module",
6
- "bin": {
7
- "xtctx": "dist/src/cli/index.js"
8
- },
9
- "scripts": {
10
- "build": "tsc",
11
- "build:bundle-web": "npm run web:build && npm run web:copy-dist",
12
- "dev": "tsx watch src/cli/index.ts",
13
- "test": "vitest run",
14
- "test:security": "vitest run tests/api/security.test.ts",
15
- "test:integration": "vitest run tests/integration",
16
- "test:watch": "vitest",
17
- "security:checklist": "node scripts/verify-security-checklist.mjs",
18
- "lint": "eslint src/ tests/",
19
- "mcp": "tsx src/mcp/server.ts",
20
- "api": "tsx src/api/server.ts",
21
- "web:dev": "npm --prefix web run dev",
22
- "web:build": "npm --prefix web run build",
23
- "web:preview": "npm --prefix web run preview",
24
- "web:copy-dist": "node scripts/copy-web-dist.mjs",
1
+ {
2
+ "name": "xtctx",
3
+ "version": "0.11.3",
4
+ "description": "Local cross-tool handoff for AI coding agents.",
5
+ "type": "module",
6
+ "bin": {
7
+ "xtctx": "dist/src/cli/index.js"
8
+ },
9
+ "exports": {
10
+ "./scrapers": {
11
+ "types": "./dist/src/scrapers/index.d.ts",
12
+ "import": "./dist/src/scrapers/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
17
+ "build": "npm run clean && tsc",
18
+ "dev": "tsx watch src/cli/index.ts",
19
+ "test": "vitest run --exclude=tests/smoke/** --exclude=tests/drift/**",
20
+ "test:security": "vitest run tests/security",
21
+ "test:integration": "vitest run tests/integration",
22
+ "test:drift": "vitest run tests/drift",
23
+ "drift:update-snapshots": "node scripts/run-with-env.mjs XTCTX_UPDATE_SNAPSHOTS=1 -- vitest run tests/drift",
24
+ "test:watch": "vitest",
25
+ "security:checklist": "node scripts/verify-security-checklist.mjs",
26
+ "lint": "eslint src/ tests/ scripts/",
27
+ "demo:public": "node scripts/public-demo-smoke.mjs",
25
28
  "landing:dev": "npm --prefix landing run dev",
26
29
  "landing:build": "npm --prefix landing run build",
27
30
  "landing:preview": "npm --prefix landing run preview",
28
- "prepack": "npm run build && npm run build:bundle-web",
29
- "smoke:cli": "node dist/src/cli/index.js --help",
30
- "verify:release": "npm test && npm run test:security && npm run security:checklist && npm run build && npm run build:bundle-web && npm run landing:build && npm run smoke:cli"
31
- },
32
- "dependencies": {
33
- "@lancedb/lancedb": "^0.13.0",
34
- "@modelcontextprotocol/sdk": "^1.12.0",
35
- "@xenova/transformers": "^2.17.2",
36
- "apache-arrow": "^17.0.0",
37
- "better-sqlite3": "^11.0.0",
38
- "chokidar": "^4.0.0",
39
- "commander": "^13.0.0",
40
- "express-rate-limit": "^7.5.0",
41
- "express": "^5.0.0",
42
- "glob": "^11.0.0",
43
- "helmet": "^8.1.0",
44
- "yaml": "^2.7.0"
45
- },
46
- "devDependencies": {
47
- "@types/better-sqlite3": "^7.6.0",
48
- "@types/express": "^5.0.0",
49
- "@types/node": "^22.0.0",
50
- "tsx": "^4.19.0",
51
- "typescript": "^5.7.0",
52
- "vitest": "^3.0.0"
53
- },
54
- "engines": {
55
- "node": ">=20.0.0"
56
- },
57
- "repository": {
58
- "type": "git",
59
- "url": "git+https://github.com/fstubner/xtctx.git"
60
- },
61
- "files": [
62
- "dist",
63
- "README.md",
64
- "LICENSE",
65
- "CHANGELOG.md"
66
- ],
67
- "license": "MIT",
68
- "homepage": "https://xtctx.com"
69
- }
31
+ "prepack": "npm run build",
32
+ "smoke:cli": "node dist/src/cli/index.js --help",
33
+ "verify:release": "npm run lint && npm test && npm run test:security && npm run security:checklist && npm audit --omit=dev && npm --prefix landing audit && npm run test:drift && npm run build && npm pack --dry-run && npm run demo:public && npm run landing:build && npm run smoke:cli"
34
+ },
35
+ "dependencies": {
36
+ "@huggingface/transformers": "^4.2.0",
37
+ "@iarna/toml": "^2.2.5",
38
+ "@modelcontextprotocol/sdk": "^1.30.0",
39
+ "better-sqlite3": "^11.0.0",
40
+ "commander": "^13.0.0",
41
+ "glob": "^11.0.0",
42
+ "yaml": "^2.7.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/better-sqlite3": "^7.6.0",
46
+ "@types/node": "^24.0.0",
47
+ "eslint": "^10.0.3",
48
+ "tsx": "^4.19.0",
49
+ "typescript": "^5.7.0",
50
+ "typescript-eslint": "^8.56.1",
51
+ "vitest": "^3.0.0"
52
+ },
53
+ "overrides": {
54
+ "protobufjs": "^7.5.5",
55
+ "sharp": "^0.35.3",
56
+ "adm-zip": "^0.6.0"
57
+ },
58
+ "engines": {
59
+ "node": ">=24.0.0"
60
+ },
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "git+https://github.com/fstubner/xtctx.git"
64
+ },
65
+ "files": [
66
+ "dist",
67
+ "README.md",
68
+ "LICENSE",
69
+ "CHANGELOG.md"
70
+ ],
71
+ "license": "MIT",
72
+ "homepage": "https://xtctx.com"
73
+ }
@@ -1,4 +0,0 @@
1
- import { Router } from "express";
2
- import { type ConfigStore } from "../../mcp/tools/config.js";
3
- export declare function createConfigRouter(store: ConfigStore): Router;
4
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/api/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAIL,KAAK,WAAW,EAEjB,MAAM,2BAA2B,CAAC;AAEnC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAgD7D"}
@@ -1,61 +0,0 @@
1
- import { Router } from "express";
2
- import { createGetConfigHandler, createListConfigsHandler, createToolPreferencesHandler, } from "../../mcp/tools/config.js";
3
- export function createConfigRouter(store) {
4
- const router = Router();
5
- const listConfigs = createListConfigsHandler(store);
6
- const getConfig = createGetConfigHandler(store);
7
- const toolPreferences = createToolPreferencesHandler(store);
8
- router.get("/list", async (req, res, next) => {
9
- try {
10
- const type = normalizeListType(req.query.type);
11
- const result = await listConfigs({ type, format: "json" });
12
- res.json(result);
13
- }
14
- catch (error) {
15
- next(error);
16
- }
17
- });
18
- router.get("/get", async (req, res, next) => {
19
- try {
20
- const type = normalizeConfigType(req.query.type);
21
- const name = String(req.query.name ?? "");
22
- if (!type || !name) {
23
- res.status(400).json({ error: "type and name are required" });
24
- return;
25
- }
26
- const result = await getConfig({ type, name, format: "json" });
27
- res.json(result);
28
- }
29
- catch (error) {
30
- next(error);
31
- }
32
- });
33
- router.get("/preferences", async (req, res, next) => {
34
- try {
35
- const tool = String(req.query.tool ?? "");
36
- if (!tool) {
37
- res.status(400).json({ error: "tool is required" });
38
- return;
39
- }
40
- const result = await toolPreferences({ tool, format: "json" });
41
- res.json(result);
42
- }
43
- catch (error) {
44
- next(error);
45
- }
46
- });
47
- return router;
48
- }
49
- function normalizeListType(value) {
50
- if (value === "skill" || value === "command" || value === "agent" || value === "all") {
51
- return value;
52
- }
53
- return "all";
54
- }
55
- function normalizeConfigType(value) {
56
- if (value === "skill" || value === "command" || value === "agent") {
57
- return value;
58
- }
59
- return null;
60
- }
61
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/api/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,GAG7B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACnD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,WAAW,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACrF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,4 +0,0 @@
1
- import { Router } from "express";
2
- import { type KnowledgeStore } from "../../mcp/tools/knowledge.js";
3
- export declare function createKnowledgeRouter(knowledge: KnowledgeStore): Router;
4
- //# sourceMappingURL=knowledge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../../../src/api/routes/knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AAStC,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CA2BvE"}
@@ -1,40 +0,0 @@
1
- import { Router } from "express";
2
- import { createProjectKnowledgeHandler, } from "../../mcp/tools/knowledge.js";
3
- export function createKnowledgeRouter(knowledge) {
4
- const router = Router();
5
- const handler = createProjectKnowledgeHandler(knowledge);
6
- router.get("/", async (req, res, next) => {
7
- try {
8
- const query = req.query;
9
- const type = normalizeType(query.type);
10
- const format = query.format === "markdown" ? "markdown" : "json";
11
- const result = await handler({
12
- type,
13
- query: query.query,
14
- format,
15
- });
16
- if (format === "markdown" && typeof result === "string") {
17
- res.type("text/markdown").send(result);
18
- return;
19
- }
20
- res.json(result);
21
- }
22
- catch (error) {
23
- next(error);
24
- }
25
- });
26
- return router;
27
- }
28
- function normalizeType(value) {
29
- if (value === "decision" ||
30
- value === "error_solution" ||
31
- value === "insight" ||
32
- value === "convention" ||
33
- value === "gotcha" ||
34
- value === "faq" ||
35
- value === "all") {
36
- return value;
37
- }
38
- return "all";
39
- }
40
- //# sourceMappingURL=knowledge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../../../src/api/routes/knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,6BAA6B,GAE9B,MAAM,8BAA8B,CAAC;AAStC,MAAM,UAAU,qBAAqB,CAAC,SAAyB;IAC7D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,6BAA6B,CAAC,SAAS,CAAC,CAAC;IAEzD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAuB,CAAC;YAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;YACjE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;gBAC3B,IAAI;gBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM;aACP,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,UAAU,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxD,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IACE,KAAK,KAAK,UAAU;QACpB,KAAK,KAAK,gBAAgB;QAC1B,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,YAAY;QACtB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,KAAK;QACf,KAAK,KAAK,KAAK,EACf,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,7 +0,0 @@
1
- import { Router } from "express";
2
- import type { ContextRecord } from "../../types/context.js";
3
- export interface SearchRouteDependencies {
4
- knowledgeRecords: () => Promise<ContextRecord[]>;
5
- }
6
- export declare function createSearchRouter(deps: SearchRouteDependencies): Router;
7
- //# sourceMappingURL=search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/api/routes/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAClD;AAkDD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAkCxE"}