xtctx 0.3.2 → 0.11.1

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 (300) hide show
  1. package/CHANGELOG.md +267 -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 +21 -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 +71 -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 +77 -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 +84 -0
  22. package/dist/src/cli/status.js.map +1 -0
  23. package/dist/src/config/disconnect.d.ts +32 -0
  24. package/dist/src/config/disconnect.d.ts.map +1 -0
  25. package/dist/src/config/disconnect.js +304 -0
  26. package/dist/src/config/disconnect.js.map +1 -0
  27. package/dist/src/config/mcp-config.d.ts +91 -0
  28. package/dist/src/config/mcp-config.d.ts.map +1 -0
  29. package/dist/src/config/mcp-config.js +462 -0
  30. package/dist/src/config/mcp-config.js.map +1 -0
  31. package/dist/src/config/setup.d.ts +37 -0
  32. package/dist/src/config/setup.d.ts.map +1 -0
  33. package/dist/src/config/setup.js +338 -0
  34. package/dist/src/config/setup.js.map +1 -0
  35. package/dist/src/config/skills.d.ts +73 -0
  36. package/dist/src/config/skills.d.ts.map +1 -0
  37. package/dist/src/config/skills.js +427 -0
  38. package/dist/src/config/skills.js.map +1 -0
  39. package/dist/src/handoff/embeddings.d.ts +15 -0
  40. package/dist/src/handoff/embeddings.d.ts.map +1 -0
  41. package/dist/src/handoff/embeddings.js +63 -0
  42. package/dist/src/handoff/embeddings.js.map +1 -0
  43. package/dist/src/handoff/sqlite-index.d.ts +43 -0
  44. package/dist/src/handoff/sqlite-index.d.ts.map +1 -0
  45. package/dist/src/handoff/sqlite-index.js +718 -0
  46. package/dist/src/handoff/sqlite-index.js.map +1 -0
  47. package/dist/src/handoff/types.d.ts +57 -0
  48. package/dist/src/handoff/types.d.ts.map +1 -0
  49. package/dist/src/handoff/types.js +2 -0
  50. package/dist/src/handoff/types.js.map +1 -0
  51. package/dist/src/handoff/vector.d.ts +4 -0
  52. package/dist/src/handoff/vector.d.ts.map +1 -0
  53. package/dist/src/handoff/vector.js +31 -0
  54. package/dist/src/handoff/vector.js.map +1 -0
  55. package/dist/src/mcp/server.d.ts +2 -19
  56. package/dist/src/mcp/server.d.ts.map +1 -1
  57. package/dist/src/mcp/server.js +75 -199
  58. package/dist/src/mcp/server.js.map +1 -1
  59. package/dist/src/mcp/tools/continuity.d.ts +3 -0
  60. package/dist/src/mcp/tools/continuity.d.ts.map +1 -0
  61. package/dist/src/mcp/tools/continuity.js +30 -0
  62. package/dist/src/mcp/tools/continuity.js.map +1 -0
  63. package/dist/src/mcp/tools/manifest.d.ts +40 -0
  64. package/dist/src/mcp/tools/manifest.d.ts.map +1 -0
  65. package/dist/src/mcp/tools/manifest.js +96 -0
  66. package/dist/src/mcp/tools/manifest.js.map +1 -0
  67. package/dist/src/mcp/tools/sessions.d.ts +11 -32
  68. package/dist/src/mcp/tools/sessions.d.ts.map +1 -1
  69. package/dist/src/mcp/tools/sessions.js +47 -13
  70. package/dist/src/mcp/tools/sessions.js.map +1 -1
  71. package/dist/src/runtime/services.d.ts +11 -38
  72. package/dist/src/runtime/services.d.ts.map +1 -1
  73. package/dist/src/runtime/services.js +43 -202
  74. package/dist/src/runtime/services.js.map +1 -1
  75. package/dist/src/scrapers/antigravity.d.ts +41 -0
  76. package/dist/src/scrapers/antigravity.d.ts.map +1 -0
  77. package/dist/src/scrapers/antigravity.js +858 -0
  78. package/dist/src/scrapers/antigravity.js.map +1 -0
  79. package/dist/src/scrapers/base.d.ts +53 -1
  80. package/dist/src/scrapers/base.d.ts.map +1 -1
  81. package/dist/src/scrapers/base.js +89 -3
  82. package/dist/src/scrapers/base.js.map +1 -1
  83. package/dist/src/scrapers/claude-code.d.ts +20 -6
  84. package/dist/src/scrapers/claude-code.d.ts.map +1 -1
  85. package/dist/src/scrapers/claude-code.js +144 -26
  86. package/dist/src/scrapers/claude-code.js.map +1 -1
  87. package/dist/src/scrapers/codex.d.ts +36 -6
  88. package/dist/src/scrapers/codex.d.ts.map +1 -1
  89. package/dist/src/scrapers/codex.js +256 -46
  90. package/dist/src/scrapers/codex.js.map +1 -1
  91. package/dist/src/scrapers/copilot-cli.d.ts +33 -0
  92. package/dist/src/scrapers/copilot-cli.d.ts.map +1 -0
  93. package/dist/src/scrapers/copilot-cli.js +257 -0
  94. package/dist/src/scrapers/copilot-cli.js.map +1 -0
  95. package/dist/src/scrapers/copilot.d.ts +41 -8
  96. package/dist/src/scrapers/copilot.d.ts.map +1 -1
  97. package/dist/src/scrapers/copilot.js +256 -118
  98. package/dist/src/scrapers/copilot.js.map +1 -1
  99. package/dist/src/scrapers/cursor.d.ts +24 -9
  100. package/dist/src/scrapers/cursor.d.ts.map +1 -1
  101. package/dist/src/scrapers/cursor.js +247 -151
  102. package/dist/src/scrapers/cursor.js.map +1 -1
  103. package/dist/src/scrapers/index.d.ts +18 -0
  104. package/dist/src/scrapers/index.d.ts.map +1 -0
  105. package/dist/src/scrapers/index.js +17 -0
  106. package/dist/src/scrapers/index.js.map +1 -0
  107. package/dist/src/scrapers/opencode.d.ts +36 -0
  108. package/dist/src/scrapers/opencode.d.ts.map +1 -0
  109. package/dist/src/scrapers/opencode.js +248 -0
  110. package/dist/src/scrapers/opencode.js.map +1 -0
  111. package/dist/src/scrapers/registry.d.ts +1 -0
  112. package/dist/src/scrapers/registry.d.ts.map +1 -1
  113. package/dist/src/scrapers/registry.js +3 -0
  114. package/dist/src/scrapers/registry.js.map +1 -1
  115. package/dist/src/tools/sources.d.ts +28 -0
  116. package/dist/src/tools/sources.d.ts.map +1 -0
  117. package/dist/src/tools/sources.js +149 -0
  118. package/dist/src/tools/sources.js.map +1 -0
  119. package/dist/src/types/config.d.ts +24 -37
  120. package/dist/src/types/config.d.ts.map +1 -1
  121. package/dist/src/types/index.d.ts +0 -2
  122. package/dist/src/types/index.d.ts.map +1 -1
  123. package/dist/src/types/index.js +0 -2
  124. package/dist/src/types/index.js.map +1 -1
  125. package/dist/src/types/scraper.d.ts +34 -5
  126. package/dist/src/types/scraper.d.ts.map +1 -1
  127. package/dist/src/utils/errors.d.ts +2 -0
  128. package/dist/src/utils/errors.d.ts.map +1 -0
  129. package/dist/src/utils/errors.js +7 -0
  130. package/dist/src/utils/errors.js.map +1 -0
  131. package/dist/src/utils/package-info.d.ts +11 -0
  132. package/dist/src/utils/package-info.d.ts.map +1 -0
  133. package/dist/src/utils/package-info.js +30 -0
  134. package/dist/src/utils/package-info.js.map +1 -0
  135. package/dist/src/utils/project-scope.d.ts +3 -0
  136. package/dist/src/utils/project-scope.d.ts.map +1 -0
  137. package/dist/src/utils/project-scope.js +45 -0
  138. package/dist/src/utils/project-scope.js.map +1 -0
  139. package/package.json +70 -66
  140. package/dist/src/api/routes/config.d.ts +0 -4
  141. package/dist/src/api/routes/config.d.ts.map +0 -1
  142. package/dist/src/api/routes/config.js +0 -61
  143. package/dist/src/api/routes/config.js.map +0 -1
  144. package/dist/src/api/routes/knowledge.d.ts +0 -4
  145. package/dist/src/api/routes/knowledge.d.ts.map +0 -1
  146. package/dist/src/api/routes/knowledge.js +0 -40
  147. package/dist/src/api/routes/knowledge.js.map +0 -1
  148. package/dist/src/api/routes/search.d.ts +0 -7
  149. package/dist/src/api/routes/search.d.ts.map +0 -1
  150. package/dist/src/api/routes/search.js +0 -108
  151. package/dist/src/api/routes/search.js.map +0 -1
  152. package/dist/src/api/routes/sources.d.ts +0 -12
  153. package/dist/src/api/routes/sources.d.ts.map +0 -1
  154. package/dist/src/api/routes/sources.js +0 -70
  155. package/dist/src/api/routes/sources.js.map +0 -1
  156. package/dist/src/api/server.d.ts +0 -26
  157. package/dist/src/api/server.d.ts.map +0 -1
  158. package/dist/src/api/server.js +0 -312
  159. package/dist/src/api/server.js.map +0 -1
  160. package/dist/src/cli/ingest.d.ts +0 -6
  161. package/dist/src/cli/ingest.d.ts.map +0 -1
  162. package/dist/src/cli/ingest.js +0 -11
  163. package/dist/src/cli/ingest.js.map +0 -1
  164. package/dist/src/cli/init.d.ts +0 -6
  165. package/dist/src/cli/init.d.ts.map +0 -1
  166. package/dist/src/cli/init.js +0 -105
  167. package/dist/src/cli/init.js.map +0 -1
  168. package/dist/src/cli/serve.d.ts +0 -7
  169. package/dist/src/cli/serve.d.ts.map +0 -1
  170. package/dist/src/cli/serve.js +0 -100
  171. package/dist/src/cli/serve.js.map +0 -1
  172. package/dist/src/cli/sync.d.ts +0 -5
  173. package/dist/src/cli/sync.d.ts.map +0 -1
  174. package/dist/src/cli/sync.js +0 -13
  175. package/dist/src/cli/sync.js.map +0 -1
  176. package/dist/src/compaction/pipeline.d.ts +0 -19
  177. package/dist/src/compaction/pipeline.d.ts.map +0 -1
  178. package/dist/src/compaction/pipeline.js +0 -37
  179. package/dist/src/compaction/pipeline.js.map +0 -1
  180. package/dist/src/compaction/providers/cli.d.ts +0 -13
  181. package/dist/src/compaction/providers/cli.d.ts.map +0 -1
  182. package/dist/src/compaction/providers/cli.js +0 -60
  183. package/dist/src/compaction/providers/cli.js.map +0 -1
  184. package/dist/src/compaction/rule-based.d.ts +0 -8
  185. package/dist/src/compaction/rule-based.d.ts.map +0 -1
  186. package/dist/src/compaction/rule-based.js +0 -120
  187. package/dist/src/compaction/rule-based.js.map +0 -1
  188. package/dist/src/config/loader.d.ts +0 -12
  189. package/dist/src/config/loader.d.ts.map +0 -1
  190. package/dist/src/config/loader.js +0 -76
  191. package/dist/src/config/loader.js.map +0 -1
  192. package/dist/src/config/mappings/claude-code.d.ts +0 -3
  193. package/dist/src/config/mappings/claude-code.d.ts.map +0 -1
  194. package/dist/src/config/mappings/claude-code.js +0 -31
  195. package/dist/src/config/mappings/claude-code.js.map +0 -1
  196. package/dist/src/config/mappings/codex.d.ts +0 -3
  197. package/dist/src/config/mappings/codex.d.ts.map +0 -1
  198. package/dist/src/config/mappings/codex.js +0 -31
  199. package/dist/src/config/mappings/codex.js.map +0 -1
  200. package/dist/src/config/mappings/copilot.d.ts +0 -3
  201. package/dist/src/config/mappings/copilot.d.ts.map +0 -1
  202. package/dist/src/config/mappings/copilot.js +0 -33
  203. package/dist/src/config/mappings/copilot.js.map +0 -1
  204. package/dist/src/config/mappings/cursor.d.ts +0 -3
  205. package/dist/src/config/mappings/cursor.d.ts.map +0 -1
  206. package/dist/src/config/mappings/cursor.js +0 -29
  207. package/dist/src/config/mappings/cursor.js.map +0 -1
  208. package/dist/src/config/sync.d.ts +0 -13
  209. package/dist/src/config/sync.d.ts.map +0 -1
  210. package/dist/src/config/sync.js +0 -96
  211. package/dist/src/config/sync.js.map +0 -1
  212. package/dist/src/ingestion/coordinator.d.ts +0 -37
  213. package/dist/src/ingestion/coordinator.d.ts.map +0 -1
  214. package/dist/src/ingestion/coordinator.js +0 -127
  215. package/dist/src/ingestion/coordinator.js.map +0 -1
  216. package/dist/src/ingestion/daemon.d.ts +0 -17
  217. package/dist/src/ingestion/daemon.d.ts.map +0 -1
  218. package/dist/src/ingestion/daemon.js +0 -35
  219. package/dist/src/ingestion/daemon.js.map +0 -1
  220. package/dist/src/ingestion/watcher.d.ts +0 -19
  221. package/dist/src/ingestion/watcher.d.ts.map +0 -1
  222. package/dist/src/ingestion/watcher.js +0 -70
  223. package/dist/src/ingestion/watcher.js.map +0 -1
  224. package/dist/src/knowledge/autotag.d.ts +0 -3
  225. package/dist/src/knowledge/autotag.d.ts.map +0 -1
  226. package/dist/src/knowledge/autotag.js +0 -24
  227. package/dist/src/knowledge/autotag.js.map +0 -1
  228. package/dist/src/knowledge/dedup.d.ts +0 -7
  229. package/dist/src/knowledge/dedup.d.ts.map +0 -1
  230. package/dist/src/knowledge/dedup.js +0 -15
  231. package/dist/src/knowledge/dedup.js.map +0 -1
  232. package/dist/src/knowledge/repository.d.ts +0 -12
  233. package/dist/src/knowledge/repository.d.ts.map +0 -1
  234. package/dist/src/knowledge/repository.js +0 -74
  235. package/dist/src/knowledge/repository.js.map +0 -1
  236. package/dist/src/mcp/tools/config.d.ts +0 -36
  237. package/dist/src/mcp/tools/config.d.ts.map +0 -1
  238. package/dist/src/mcp/tools/config.js +0 -54
  239. package/dist/src/mcp/tools/config.js.map +0 -1
  240. package/dist/src/mcp/tools/knowledge.d.ts +0 -17
  241. package/dist/src/mcp/tools/knowledge.d.ts.map +0 -1
  242. package/dist/src/mcp/tools/knowledge.js +0 -46
  243. package/dist/src/mcp/tools/knowledge.js.map +0 -1
  244. package/dist/src/mcp/tools/search.d.ts +0 -22
  245. package/dist/src/mcp/tools/search.d.ts.map +0 -1
  246. package/dist/src/mcp/tools/search.js +0 -30
  247. package/dist/src/mcp/tools/search.js.map +0 -1
  248. package/dist/src/mcp/tools/write.d.ts +0 -38
  249. package/dist/src/mcp/tools/write.d.ts.map +0 -1
  250. package/dist/src/mcp/tools/write.js +0 -97
  251. package/dist/src/mcp/tools/write.js.map +0 -1
  252. package/dist/src/runtime/ingestion.d.ts +0 -17
  253. package/dist/src/runtime/ingestion.d.ts.map +0 -1
  254. package/dist/src/runtime/ingestion.js +0 -106
  255. package/dist/src/runtime/ingestion.js.map +0 -1
  256. package/dist/src/scrapers/gemini.d.ts +0 -17
  257. package/dist/src/scrapers/gemini.d.ts.map +0 -1
  258. package/dist/src/scrapers/gemini.js +0 -245
  259. package/dist/src/scrapers/gemini.js.map +0 -1
  260. package/dist/src/store/embeddings.d.ts +0 -9
  261. package/dist/src/store/embeddings.d.ts.map +0 -1
  262. package/dist/src/store/embeddings.js +0 -28
  263. package/dist/src/store/embeddings.js.map +0 -1
  264. package/dist/src/store/lance.d.ts +0 -25
  265. package/dist/src/store/lance.d.ts.map +0 -1
  266. package/dist/src/store/lance.js +0 -74
  267. package/dist/src/store/lance.js.map +0 -1
  268. package/dist/src/store/search.d.ts +0 -18
  269. package/dist/src/store/search.d.ts.map +0 -1
  270. package/dist/src/store/search.js +0 -55
  271. package/dist/src/store/search.js.map +0 -1
  272. package/dist/src/types/compaction.d.ts +0 -29
  273. package/dist/src/types/compaction.d.ts.map +0 -1
  274. package/dist/src/types/compaction.js +0 -2
  275. package/dist/src/types/compaction.js.map +0 -1
  276. package/dist/src/types/context.d.ts +0 -33
  277. package/dist/src/types/context.d.ts.map +0 -1
  278. package/dist/src/types/context.js +0 -18
  279. package/dist/src/types/context.js.map +0 -1
  280. package/dist/src/utils/retry.d.ts +0 -11
  281. package/dist/src/utils/retry.d.ts.map +0 -1
  282. package/dist/src/utils/retry.js +0 -46
  283. package/dist/src/utils/retry.js.map +0 -1
  284. package/dist/src/utils/shutdown.d.ts +0 -25
  285. package/dist/src/utils/shutdown.d.ts.map +0 -1
  286. package/dist/src/utils/shutdown.js +0 -56
  287. package/dist/src/utils/shutdown.js.map +0 -1
  288. package/dist/web/apple-touch-icon.png +0 -0
  289. package/dist/web/assets/index-Nuadr5ox.css +0 -1
  290. package/dist/web/assets/index-aA0u8eXA.js +0 -3504
  291. package/dist/web/assets/primeicons-C6QP2o4f.woff2 +0 -0
  292. package/dist/web/assets/primeicons-DMOk5skT.eot +0 -0
  293. package/dist/web/assets/primeicons-Dr5RGzOO.svg +0 -345
  294. package/dist/web/assets/primeicons-MpK4pl85.ttf +0 -0
  295. package/dist/web/assets/primeicons-WjwUDZjB.woff +0 -0
  296. package/dist/web/favicon.ico +0 -0
  297. package/dist/web/favicon.svg +0 -21
  298. package/dist/web/index.html +0 -21
  299. package/dist/web/site.webmanifest +0 -19
  300. package/dist/web/vite.svg +0 -1
@@ -0,0 +1,427 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readdir, readFile, rm, stat, writeFile, mkdir } from "node:fs/promises";
3
+ import { dirname, join, relative, resolve } from "node:path";
4
+ import { parse as parseYaml } from "yaml";
5
+ import { SUPPORTED_TOOLS } from "../tools/sources.js";
6
+ export const BUILT_IN_SKILL_ID = "xtctx-handoff";
7
+ const HASH_PREFIX = "sha256:";
8
+ const SKILL_HASH_PATTERN = /xtctx:skill-hash\s+([a-z0-9:]+)/i;
9
+ export async function syncProjectSkills(options) {
10
+ const projectRoot = resolve(options.projectRoot);
11
+ const sourceDir = skillSourceDir(projectRoot);
12
+ const existing = await readExistingSkillConfig(options.configPath);
13
+ const discovered = await discoverProjectSkills({ projectRoot, homeDir: options.homeDir });
14
+ const selectedIds = resolveSelectedSkillIds(existing, options.selectedSkillIds);
15
+ const writes = [];
16
+ const warnings = [];
17
+ await mkdir(sourceDir, { recursive: true });
18
+ for (const skillId of selectedIds) {
19
+ const sourcePath = join(sourceDir, skillId, "SKILL.md");
20
+ const discoveredSkill = discovered.find((skill) => skill.id === skillId);
21
+ const content = skillId === BUILT_IN_SKILL_ID ? builtInHandoffSkill() : discoveredSkill?.content;
22
+ if (!content) {
23
+ warnings.push(`Selected skill ${skillId} was not found in connected tool skill sources.`);
24
+ continue;
25
+ }
26
+ writes.push({
27
+ path: sourcePath,
28
+ kind: `skill-source:${skillId}`,
29
+ changed: await writeIfChanged(sourcePath, content),
30
+ });
31
+ }
32
+ const selected = await readSelectedSkills(sourceDir, selectedIds);
33
+ const targetConfig = buildTargetConfig(projectRoot);
34
+ for (const skill of selected) {
35
+ for (const tool of SUPPORTED_TOOLS) {
36
+ const capability = tool.skillSync;
37
+ if (!capability || capability.mode === "unsupported" || capability.mode === "managed-block") {
38
+ continue;
39
+ }
40
+ const targetPath = capability.targetPath?.(projectRoot, skill.id);
41
+ if (!targetPath) {
42
+ continue;
43
+ }
44
+ const write = await syncSkillToTarget({
45
+ skill,
46
+ mode: capability.mode,
47
+ targetPath,
48
+ });
49
+ writes.push({ path: write.path, kind: `skill:${tool.id}:${skill.id}`, changed: write.changed });
50
+ }
51
+ }
52
+ for (const tool of SUPPORTED_TOOLS.filter((item) => item.skillSync?.mode === "unsupported")) {
53
+ warnings.push(`${tool.label} has no verified native skill or instruction surface; skill sync is not installed there.`);
54
+ }
55
+ return {
56
+ config: {
57
+ sourceDir: ".xtctx/skills",
58
+ selected: Object.fromEntries(selected.map((skill) => [skill.id, { hash: skill.hash, source: toProjectRelative(projectRoot, skill.path) }])),
59
+ targets: targetConfig,
60
+ },
61
+ selected,
62
+ writes,
63
+ warnings,
64
+ };
65
+ }
66
+ export async function discoverProjectSkills(options) {
67
+ const projectRoot = resolve(options.projectRoot);
68
+ const home = options.homeDir ?? process.env.USERPROFILE ?? process.env.HOME ?? "";
69
+ const codexHome = process.env.CODEX_HOME ?? (home ? join(home, ".codex") : "");
70
+ const candidates = [
71
+ { source: "xtctx", root: skillSourceDir(projectRoot) },
72
+ { source: "claude-code project", root: join(projectRoot, ".claude", "skills") },
73
+ { source: "claude-code user", root: home ? join(home, ".claude", "skills") : "" },
74
+ { source: "codex project", root: join(projectRoot, ".codex", "skills") },
75
+ { source: "codex user", root: codexHome ? join(codexHome, "skills") : "" },
76
+ ].filter((candidate) => candidate.root.length > 0);
77
+ const discovered = [
78
+ parseSkillContent(BUILT_IN_SKILL_ID, builtInHandoffSkill(), "<built-in>", "xtctx built-in"),
79
+ ];
80
+ for (const candidate of candidates) {
81
+ const entries = await readSkillDir(candidate.root, candidate.source);
82
+ for (const entry of entries) {
83
+ if (!discovered.some((skill) => skill.id === entry.id)) {
84
+ discovered.push(entry);
85
+ }
86
+ }
87
+ }
88
+ return discovered.sort((left, right) => left.id.localeCompare(right.id));
89
+ }
90
+ export async function inspectSkillStatus(projectRoot, configPath) {
91
+ const root = resolve(projectRoot);
92
+ const sourceDir = skillSourceDir(root);
93
+ const existing = await readExistingSkillConfig(configPath);
94
+ const selectedIds = resolveSelectedSkillIds(existing);
95
+ const selected = await Promise.all(selectedIds.map(async (id) => {
96
+ const path = join(sourceDir, id, "SKILL.md");
97
+ const content = await readUtf8IfExists(path);
98
+ return {
99
+ id,
100
+ exists: content !== null,
101
+ hash: content ? hashContent(content) : undefined,
102
+ };
103
+ }));
104
+ const targets = [];
105
+ for (const tool of SUPPORTED_TOOLS) {
106
+ const capability = tool.skillSync;
107
+ const mode = capability?.mode ?? "unsupported";
108
+ if (mode === "unsupported") {
109
+ targets.push({ tool: tool.id, mode, state: "unsupported" });
110
+ continue;
111
+ }
112
+ if (mode === "managed-block") {
113
+ targets.push({
114
+ tool: tool.id,
115
+ mode,
116
+ path: capability?.targetPath?.(root, BUILT_IN_SKILL_ID),
117
+ state: "managed-block",
118
+ });
119
+ continue;
120
+ }
121
+ for (const skill of selected) {
122
+ const targetPath = capability?.targetPath?.(root, skill.id);
123
+ if (!targetPath) {
124
+ targets.push({ tool: tool.id, mode, skillId: skill.id, state: "unsupported" });
125
+ continue;
126
+ }
127
+ const content = await readUtf8IfExists(targetPath);
128
+ let state = "missing";
129
+ if (content !== null && skill.hash) {
130
+ state = targetHasHash(content, skill.hash, mode) ? "ok" : "drift";
131
+ }
132
+ targets.push({ tool: tool.id, mode, skillId: skill.id, path: targetPath, state });
133
+ }
134
+ }
135
+ return { sourceDir, selected, targets };
136
+ }
137
+ export async function removeSyncedSkillsForTools(projectRoot, tools) {
138
+ const root = resolve(projectRoot);
139
+ const writes = [];
140
+ const selectedIds = await listCanonicalSkillIds(skillSourceDir(root));
141
+ for (const toolId of tools) {
142
+ const tool = SUPPORTED_TOOLS.find((item) => item.id === toolId);
143
+ const capability = tool?.skillSync;
144
+ if (!capability || capability.mode === "unsupported" || capability.mode === "managed-block") {
145
+ continue;
146
+ }
147
+ for (const skillId of selectedIds) {
148
+ const targetPath = capability.targetPath?.(root, skillId);
149
+ if (!targetPath) {
150
+ continue;
151
+ }
152
+ const changed = await removePath(targetPath);
153
+ writes.push({ path: targetPath, kind: `skill:${toolId}:${skillId}`, changed });
154
+ }
155
+ }
156
+ return writes;
157
+ }
158
+ export function renderSyncedSkillsBlock(selected) {
159
+ if (selected.length === 0) {
160
+ return [];
161
+ }
162
+ return [
163
+ "## Synced Skills",
164
+ "- Canonical project skills live in `.xtctx/skills`.",
165
+ "- If a task matches a synced skill, read that skill file before following it.",
166
+ ...selected.map((skill) => `- ${skill.id}: \`.xtctx/skills/${skill.id}/SKILL.md\``),
167
+ "",
168
+ ];
169
+ }
170
+ function resolveSelectedSkillIds(existing, explicit) {
171
+ const ids = explicit && explicit.length > 0 ? explicit : existing.selectedIds;
172
+ return uniqueIds([BUILT_IN_SKILL_ID, ...ids]);
173
+ }
174
+ async function readSelectedSkills(sourceDir, selectedIds) {
175
+ const selected = [];
176
+ for (const id of selectedIds) {
177
+ const path = join(sourceDir, id, "SKILL.md");
178
+ const content = await readUtf8IfExists(path);
179
+ if (content === null) {
180
+ continue;
181
+ }
182
+ selected.push({ id, path, source: toPosixPath(path), hash: hashContent(content) });
183
+ }
184
+ return selected;
185
+ }
186
+ async function syncSkillToTarget(input) {
187
+ const content = await readFile(input.skill.path, "utf-8");
188
+ const parsed = parseSkillContent(input.skill.id, content, input.skill.path, "xtctx");
189
+ const rendered = renderTargetContent({
190
+ skill: parsed,
191
+ sourceHash: input.skill.hash,
192
+ mode: input.mode,
193
+ content,
194
+ });
195
+ return {
196
+ path: input.targetPath,
197
+ changed: await writeIfChanged(input.targetPath, rendered),
198
+ };
199
+ }
200
+ function renderTargetContent(input) {
201
+ if (input.mode === "native-skill") {
202
+ return `${normalizeNewlines(input.content).trimEnd()}\n`;
203
+ }
204
+ const title = input.skill.name || input.skill.id;
205
+ const header = [
206
+ "<!-- xtctx:skill begin -->",
207
+ `<!-- xtctx:skill-id ${input.skill.id} -->`,
208
+ `<!-- xtctx:skill-hash ${input.sourceHash} -->`,
209
+ "Generated by xtctx setup. Do not edit this file directly.",
210
+ "",
211
+ ].join("\n");
212
+ const body = stripFrontmatter(input.content).trim();
213
+ const footer = "\n\n<!-- xtctx:skill end -->\n";
214
+ if (input.mode === "rule-adapter") {
215
+ return [
216
+ "---",
217
+ `description: ${quoteYamlString(`${input.skill.description} Synced from xtctx project skills.`)}`,
218
+ 'globs: "**/*"',
219
+ "alwaysApply: false",
220
+ "---",
221
+ "",
222
+ header,
223
+ `# ${title}`,
224
+ "",
225
+ body,
226
+ footer,
227
+ ].join("\n");
228
+ }
229
+ if (input.mode === "instruction-adapter") {
230
+ return [
231
+ "---",
232
+ 'applyTo: "**"',
233
+ "---",
234
+ "",
235
+ header,
236
+ `# ${title}`,
237
+ "",
238
+ body,
239
+ footer,
240
+ ].join("\n");
241
+ }
242
+ switch (input.mode) {
243
+ case "managed-block":
244
+ case "unsupported":
245
+ return input.content;
246
+ default: {
247
+ const _exhaustive = input.mode;
248
+ void _exhaustive;
249
+ return input.content;
250
+ }
251
+ }
252
+ }
253
+ function targetHasHash(content, hash, mode) {
254
+ if (mode === "native-skill") {
255
+ return hashContent(content.replace(/\n?$/, "\n")) === hash;
256
+ }
257
+ const match = SKILL_HASH_PATTERN.exec(content);
258
+ return match?.[1] === hash;
259
+ }
260
+ async function readExistingSkillConfig(configPath) {
261
+ const raw = await readUtf8IfExists(configPath);
262
+ if (raw === null) {
263
+ return { selectedIds: [] };
264
+ }
265
+ try {
266
+ const parsed = parseYaml(raw);
267
+ if (!isRecord(parsed) || !isRecord(parsed.skills) || !isRecord(parsed.skills.selected)) {
268
+ return { selectedIds: [] };
269
+ }
270
+ return { selectedIds: Object.keys(parsed.skills.selected) };
271
+ }
272
+ catch {
273
+ return { selectedIds: [] };
274
+ }
275
+ }
276
+ async function readSkillDir(root, source) {
277
+ if (!(await pathExists(root))) {
278
+ return [];
279
+ }
280
+ const entries = await readdir(root, { withFileTypes: true });
281
+ const skills = [];
282
+ for (const entry of entries) {
283
+ if (!entry.isDirectory()) {
284
+ continue;
285
+ }
286
+ const skillId = normalizeSkillId(entry.name);
287
+ if (!skillId) {
288
+ continue;
289
+ }
290
+ const skillPath = join(root, entry.name, "SKILL.md");
291
+ const content = await readUtf8IfExists(skillPath);
292
+ if (!content) {
293
+ continue;
294
+ }
295
+ skills.push(parseSkillContent(skillId, content, skillPath, source));
296
+ }
297
+ return skills;
298
+ }
299
+ function parseSkillContent(id, content, path, source) {
300
+ const frontmatter = /^---\n([\s\S]*?)\n---\n?/.exec(normalizeNewlines(content));
301
+ let name = id;
302
+ let description = `Synced project skill ${id}`;
303
+ if (frontmatter) {
304
+ try {
305
+ const parsed = parseYaml(frontmatter[1]);
306
+ if (isRecord(parsed)) {
307
+ if (typeof parsed.name === "string" && parsed.name.trim()) {
308
+ name = parsed.name.trim();
309
+ }
310
+ if (typeof parsed.description === "string" && parsed.description.trim()) {
311
+ description = parsed.description.trim();
312
+ }
313
+ }
314
+ }
315
+ catch {
316
+ // Invalid skill frontmatter should not stop setup from repairing other surfaces.
317
+ }
318
+ }
319
+ return { id, name, description, path, source, content: normalizeNewlines(content) };
320
+ }
321
+ function stripFrontmatter(content) {
322
+ return normalizeNewlines(content).replace(/^---\n[\s\S]*?\n---\n?/, "");
323
+ }
324
+ function buildTargetConfig(projectRoot) {
325
+ return Object.fromEntries(SUPPORTED_TOOLS.map((tool) => [
326
+ tool.id,
327
+ {
328
+ mode: tool.skillSync?.mode ?? "unsupported",
329
+ path: tool.skillSync?.targetPath
330
+ ? toProjectRelative(projectRoot, tool.skillSync.targetPath(projectRoot, BUILT_IN_SKILL_ID))
331
+ : undefined,
332
+ },
333
+ ]));
334
+ }
335
+ async function listCanonicalSkillIds(sourceDir) {
336
+ const entries = await readSkillDir(sourceDir, "xtctx");
337
+ return entries.map((entry) => entry.id);
338
+ }
339
+ function builtInHandoffSkill() {
340
+ return [
341
+ "---",
342
+ "name: xtctx-handoff",
343
+ "description: Retrieve cross-tool handoff context with xtctx MCP when starting work in a project configured by xtctx. Use when switching AI coding tools, resuming work from another agent, or needing recent local transcript context.",
344
+ "---",
345
+ "",
346
+ "# xtctx Handoff",
347
+ "",
348
+ "Use the xtctx MCP tools to retrieve recent local transcript context for this project.",
349
+ "",
350
+ "## Workflow",
351
+ "",
352
+ "1. Call `xtctx_recent_sessions` to list recent sessions for the current project.",
353
+ "2. Call `xtctx_session_detail` with a relevant `session_ref` before continuing the work.",
354
+ "3. Call `xtctx_search_sessions` when keyword or semantic search is more useful than recency.",
355
+ "4. Use `xtctx_continuity_status` only for wiring, cache, and freshness diagnostics.",
356
+ "",
357
+ "Raw transcript files remain authoritative. Do not invent a summary when raw detail is available.",
358
+ "",
359
+ ].join("\n");
360
+ }
361
+ function skillSourceDir(projectRoot) {
362
+ return join(projectRoot, ".xtctx", "skills");
363
+ }
364
+ function hashContent(content) {
365
+ return `${HASH_PREFIX}${createHash("sha256").update(normalizeNewlines(content).trimEnd() + "\n").digest("hex")}`;
366
+ }
367
+ async function writeIfChanged(filePath, content) {
368
+ const normalized = normalizeNewlines(content);
369
+ const existing = await readUtf8IfExists(filePath);
370
+ if (existing !== null && normalizeNewlines(existing) === normalized) {
371
+ return false;
372
+ }
373
+ await mkdir(dirname(filePath), { recursive: true });
374
+ await writeFile(filePath, normalized, "utf-8");
375
+ return true;
376
+ }
377
+ async function removePath(path) {
378
+ if (!(await pathExists(path))) {
379
+ return false;
380
+ }
381
+ await rm(path, { force: true });
382
+ return true;
383
+ }
384
+ async function readUtf8IfExists(filePath) {
385
+ try {
386
+ return await readFile(filePath, "utf-8");
387
+ }
388
+ catch {
389
+ return null;
390
+ }
391
+ }
392
+ async function pathExists(path) {
393
+ try {
394
+ await stat(path);
395
+ return true;
396
+ }
397
+ catch {
398
+ return false;
399
+ }
400
+ }
401
+ function quoteYamlString(value) {
402
+ return JSON.stringify(value);
403
+ }
404
+ function normalizeSkillId(value) {
405
+ const normalized = value.trim().toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "");
406
+ return normalized.length > 0 ? normalized : null;
407
+ }
408
+ function uniqueIds(ids) {
409
+ return [...new Set(ids.map(normalizeSkillId).filter((id) => Boolean(id)))];
410
+ }
411
+ function toProjectRelative(projectRoot, path) {
412
+ const rel = relative(projectRoot, path);
413
+ if (!rel.startsWith("..")) {
414
+ return toPosixPath(rel);
415
+ }
416
+ return toPosixPath(path);
417
+ }
418
+ function toPosixPath(path) {
419
+ return path.replace(/\\/g, "/");
420
+ }
421
+ function normalizeNewlines(input) {
422
+ return input.replace(/\r\n/g, "\n");
423
+ }
424
+ function isRecord(value) {
425
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
426
+ }
427
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/config/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
2
+ export interface EmbeddingProvider {
3
+ readonly model: string;
4
+ embed(text: string): Promise<Float32Array>;
5
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
6
+ }
7
+ export declare class TransformersEmbeddingProvider implements EmbeddingProvider {
8
+ readonly model: string;
9
+ private extractor;
10
+ constructor(model?: string);
11
+ embed(text: string): Promise<Float32Array>;
12
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
13
+ private getExtractor;
14
+ }
15
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/handoff/embeddings.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAIjE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACtD;AAiBD,qBAAa,6BAA8B,YAAW,iBAAiB;IACrE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,SAAS,CAA0C;gBAE/C,KAAK,SAA0B;IAIrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAK1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAe5C,YAAY;CAuB3B"}
@@ -0,0 +1,63 @@
1
+ export const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
2
+ const MAX_SEQ_TOKENS = 256;
3
+ const MAX_BATCH_SIZE = 32;
4
+ export class TransformersEmbeddingProvider {
5
+ model;
6
+ extractor = null;
7
+ constructor(model = DEFAULT_EMBEDDING_MODEL) {
8
+ this.model = model;
9
+ }
10
+ async embed(text) {
11
+ const [vector] = await this.embedBatch([text]);
12
+ return vector;
13
+ }
14
+ async embedBatch(texts) {
15
+ if (texts.length === 0) {
16
+ return [];
17
+ }
18
+ const extractor = await this.getExtractor();
19
+ const vectors = [];
20
+ for (let start = 0; start < texts.length; start += MAX_BATCH_SIZE) {
21
+ const batch = texts.slice(start, start + MAX_BATCH_SIZE);
22
+ const output = await extractor(batch, { pooling: "mean", normalize: true });
23
+ vectors.push(...splitBatchOutput(output, batch.length));
24
+ }
25
+ return vectors;
26
+ }
27
+ async getExtractor() {
28
+ if (this.extractor) {
29
+ return this.extractor;
30
+ }
31
+ process.stderr.write(`xtctx: Initializing local embedding provider (${this.model})...\n`);
32
+ const transformers = (await import("@huggingface/transformers"));
33
+ const extractor = await transformers.pipeline("feature-extraction", this.model, {
34
+ dtype: "fp32",
35
+ });
36
+ const tokenizer = extractor
37
+ .tokenizer;
38
+ if (tokenizer) {
39
+ tokenizer.model_max_length = MAX_SEQ_TOKENS;
40
+ }
41
+ this.extractor = extractor;
42
+ return extractor;
43
+ }
44
+ }
45
+ function splitBatchOutput(output, batchSize) {
46
+ const flat = toFloat32Array(output.data);
47
+ const dimension = flat.length / batchSize;
48
+ if (!Number.isInteger(dimension) || dimension <= 0) {
49
+ throw new Error("Embedding model returned an unexpected output shape");
50
+ }
51
+ const vectors = [];
52
+ for (let index = 0; index < batchSize; index += 1) {
53
+ vectors.push(flat.slice(index * dimension, (index + 1) * dimension));
54
+ }
55
+ return vectors;
56
+ }
57
+ function toFloat32Array(data) {
58
+ if (data instanceof Float32Array) {
59
+ return data;
60
+ }
61
+ return Float32Array.from(data);
62
+ }
63
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../../src/handoff/embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { ConversationScraper } from "../types/scraper.js";
2
+ import { type EmbeddingProvider } from "./embeddings.js";
3
+ import type { HandoffStatus, SessionMessage, SessionSearchMode, SessionService, SessionSummary } from "./types.js";
4
+ interface ToolRuntime {
5
+ tool: string;
6
+ scraper: ConversationScraper;
7
+ }
8
+ interface SqliteHandoffIndexOptions {
9
+ embeddingProvider?: EmbeddingProvider;
10
+ windowSize?: number;
11
+ windowStride?: number;
12
+ }
13
+ export declare class SqliteHandoffIndex implements SessionService {
14
+ private readonly dbPath;
15
+ private readonly projectRoot;
16
+ private readonly tools;
17
+ private db;
18
+ private readonly initialized;
19
+ private refreshPromise;
20
+ private lastRefreshMs;
21
+ private readonly refreshTtlMs;
22
+ private readonly embeddingProvider;
23
+ private readonly windowSize;
24
+ private readonly windowStride;
25
+ constructor(dbPath: string, projectRoot: string, tools: ToolRuntime[], options?: SqliteHandoffIndexOptions);
26
+ listRecentSessions(limit: number, toolFilter?: string[]): Promise<SessionSummary[]>;
27
+ getSessionDetail(sessionRef: string, offset: number, limit: number): Promise<SessionMessage[]>;
28
+ searchSessions(query: string, limit: number, toolFilter?: string[], mode?: SessionSearchMode): Promise<SessionSummary[]>;
29
+ getStatus(): Promise<HandoffStatus>;
30
+ close(): Promise<void>;
31
+ private refresh;
32
+ private refreshNow;
33
+ private upsertChunk;
34
+ private rebuildRetrievalUnitsForSession;
35
+ private keywordSearch;
36
+ private semanticSearch;
37
+ private queryKeywordUnits;
38
+ private ensureVectors;
39
+ private initialize;
40
+ private getDb;
41
+ }
42
+ export {};
43
+ //# sourceMappingURL=sqlite-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-index.d.ts","sourceRoot":"","sources":["../../../src/handoff/sqlite-index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,aAAa,EAEb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,UAAU,yBAAyB;IACjC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6DD,qBAAa,kBAAmB,YAAW,cAAc;IAWrD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAZxB,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAAE,EACrC,OAAO,GAAE,yBAA8B;IASnC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmBnF,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,EAAE,CAAC;IAuBtB,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,iBAA4B,GACjC,OAAO,CAAC,cAAc,EAAE,CAAC;IAsBtB,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAoDnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAMd,OAAO;YAuBP,UAAU;IAqDxB,OAAO,CAAC,WAAW;IAiGnB,OAAO,CAAC,+BAA+B;YA8DzB,aAAa;YASb,cAAc;IAsD5B,OAAO,CAAC,iBAAiB;YA2BX,aAAa;YAuDb,UAAU;IAQxB,OAAO,CAAC,KAAK;CAMd"}