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
@@ -0,0 +1,427 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readdir, readFile, rm, stat, mkdir } from "node:fs/promises";
3
+ import { join, relative, resolve } from "node:path";
4
+ import { writeFileAtomic } from "../utils/atomic-file.js";
5
+ import { parse as parseYaml } from "yaml";
6
+ import { SUPPORTED_TOOLS } from "../tools/sources.js";
7
+ export const BUILT_IN_SKILL_ID = "xtctx-handoff";
8
+ const HASH_PREFIX = "sha256:";
9
+ const SKILL_HASH_PATTERN = /xtctx:skill-hash\s+([a-z0-9:]+)/i;
10
+ export async function syncProjectSkills(options) {
11
+ const projectRoot = resolve(options.projectRoot);
12
+ const sourceDir = skillSourceDir(projectRoot);
13
+ const existing = await readExistingSkillConfig(options.configPath);
14
+ const discovered = await discoverProjectSkills({ projectRoot, homeDir: options.homeDir });
15
+ const selectedIds = resolveSelectedSkillIds(existing, options.selectedSkillIds);
16
+ const writes = [];
17
+ const warnings = [];
18
+ await mkdir(sourceDir, { recursive: true });
19
+ for (const skillId of selectedIds) {
20
+ const sourcePath = join(sourceDir, skillId, "SKILL.md");
21
+ const discoveredSkill = discovered.find((skill) => skill.id === skillId);
22
+ const content = skillId === BUILT_IN_SKILL_ID ? builtInHandoffSkill() : discoveredSkill?.content;
23
+ if (!content) {
24
+ warnings.push(`Selected skill ${skillId} was not found in connected tool skill sources.`);
25
+ continue;
26
+ }
27
+ writes.push({
28
+ path: sourcePath,
29
+ kind: `skill-source:${skillId}`,
30
+ changed: await writeIfChanged(sourcePath, content),
31
+ });
32
+ }
33
+ const selected = await readSelectedSkills(sourceDir, selectedIds);
34
+ const targetConfig = buildTargetConfig(projectRoot);
35
+ for (const skill of selected) {
36
+ for (const tool of SUPPORTED_TOOLS) {
37
+ const capability = tool.skillSync;
38
+ if (!capability || capability.mode === "unsupported" || capability.mode === "managed-block") {
39
+ continue;
40
+ }
41
+ const targetPath = capability.targetPath?.(projectRoot, skill.id);
42
+ if (!targetPath) {
43
+ continue;
44
+ }
45
+ const write = await syncSkillToTarget({
46
+ skill,
47
+ mode: capability.mode,
48
+ targetPath,
49
+ });
50
+ writes.push({ path: write.path, kind: `skill:${tool.id}:${skill.id}`, changed: write.changed });
51
+ }
52
+ }
53
+ for (const tool of SUPPORTED_TOOLS.filter((item) => item.skillSync?.mode === "unsupported")) {
54
+ warnings.push(`${tool.label} has no verified native skill or instruction surface; skill sync is not installed there.`);
55
+ }
56
+ return {
57
+ config: {
58
+ sourceDir: ".xtctx/skills",
59
+ selected: Object.fromEntries(selected.map((skill) => [skill.id, { hash: skill.hash, source: toProjectRelative(projectRoot, skill.path) }])),
60
+ targets: targetConfig,
61
+ },
62
+ selected,
63
+ writes,
64
+ warnings,
65
+ };
66
+ }
67
+ export async function discoverProjectSkills(options) {
68
+ const projectRoot = resolve(options.projectRoot);
69
+ const home = options.homeDir ?? process.env.USERPROFILE ?? process.env.HOME ?? "";
70
+ const codexHome = process.env.CODEX_HOME ?? (home ? join(home, ".codex") : "");
71
+ const candidates = [
72
+ { source: "xtctx", root: skillSourceDir(projectRoot) },
73
+ { source: "claude-code project", root: join(projectRoot, ".claude", "skills") },
74
+ { source: "claude-code user", root: home ? join(home, ".claude", "skills") : "" },
75
+ { source: "codex project", root: join(projectRoot, ".codex", "skills") },
76
+ { source: "codex user", root: codexHome ? join(codexHome, "skills") : "" },
77
+ ].filter((candidate) => candidate.root.length > 0);
78
+ const discovered = [
79
+ parseSkillContent(BUILT_IN_SKILL_ID, builtInHandoffSkill(), "<built-in>", "xtctx built-in"),
80
+ ];
81
+ for (const candidate of candidates) {
82
+ const entries = await readSkillDir(candidate.root, candidate.source);
83
+ for (const entry of entries) {
84
+ if (!discovered.some((skill) => skill.id === entry.id)) {
85
+ discovered.push(entry);
86
+ }
87
+ }
88
+ }
89
+ return discovered.sort((left, right) => left.id.localeCompare(right.id));
90
+ }
91
+ export async function inspectSkillStatus(projectRoot, configPath) {
92
+ const root = resolve(projectRoot);
93
+ const sourceDir = skillSourceDir(root);
94
+ const existing = await readExistingSkillConfig(configPath);
95
+ const selectedIds = resolveSelectedSkillIds(existing);
96
+ const selected = await Promise.all(selectedIds.map(async (id) => {
97
+ const path = join(sourceDir, id, "SKILL.md");
98
+ const content = await readUtf8IfExists(path);
99
+ return {
100
+ id,
101
+ exists: content !== null,
102
+ hash: content ? hashContent(content) : undefined,
103
+ };
104
+ }));
105
+ const targets = [];
106
+ for (const tool of SUPPORTED_TOOLS) {
107
+ const capability = tool.skillSync;
108
+ const mode = capability?.mode ?? "unsupported";
109
+ if (mode === "unsupported") {
110
+ targets.push({ tool: tool.id, mode, state: "unsupported" });
111
+ continue;
112
+ }
113
+ if (mode === "managed-block") {
114
+ targets.push({
115
+ tool: tool.id,
116
+ mode,
117
+ path: capability?.targetPath?.(root, BUILT_IN_SKILL_ID),
118
+ state: "managed-block",
119
+ });
120
+ continue;
121
+ }
122
+ for (const skill of selected) {
123
+ const targetPath = capability?.targetPath?.(root, skill.id);
124
+ if (!targetPath) {
125
+ targets.push({ tool: tool.id, mode, skillId: skill.id, state: "unsupported" });
126
+ continue;
127
+ }
128
+ const content = await readUtf8IfExists(targetPath);
129
+ let state = "missing";
130
+ if (content !== null && skill.hash) {
131
+ state = targetHasHash(content, skill.hash, mode) ? "ok" : "drift";
132
+ }
133
+ targets.push({ tool: tool.id, mode, skillId: skill.id, path: targetPath, state });
134
+ }
135
+ }
136
+ return { sourceDir, selected, targets };
137
+ }
138
+ export async function removeSyncedSkillsForTools(projectRoot, tools) {
139
+ const root = resolve(projectRoot);
140
+ const writes = [];
141
+ const selectedIds = await listCanonicalSkillIds(skillSourceDir(root));
142
+ for (const toolId of tools) {
143
+ const tool = SUPPORTED_TOOLS.find((item) => item.id === toolId);
144
+ const capability = tool?.skillSync;
145
+ if (!capability || capability.mode === "unsupported" || capability.mode === "managed-block") {
146
+ continue;
147
+ }
148
+ for (const skillId of selectedIds) {
149
+ const targetPath = capability.targetPath?.(root, skillId);
150
+ if (!targetPath) {
151
+ continue;
152
+ }
153
+ const changed = await removePath(targetPath);
154
+ writes.push({ path: targetPath, kind: `skill:${toolId}:${skillId}`, changed });
155
+ }
156
+ }
157
+ return writes;
158
+ }
159
+ export function renderSyncedSkillsBlock(selected) {
160
+ if (selected.length === 0) {
161
+ return [];
162
+ }
163
+ return [
164
+ "## Synced Skills",
165
+ "- Canonical project skills live in `.xtctx/skills`.",
166
+ "- If a task matches a synced skill, read that skill file before following it.",
167
+ ...selected.map((skill) => `- ${skill.id}: \`.xtctx/skills/${skill.id}/SKILL.md\``),
168
+ "",
169
+ ];
170
+ }
171
+ function resolveSelectedSkillIds(existing, explicit) {
172
+ const ids = explicit && explicit.length > 0 ? explicit : existing.selectedIds;
173
+ return uniqueIds([BUILT_IN_SKILL_ID, ...ids]);
174
+ }
175
+ async function readSelectedSkills(sourceDir, selectedIds) {
176
+ const selected = [];
177
+ for (const id of selectedIds) {
178
+ const path = join(sourceDir, id, "SKILL.md");
179
+ const content = await readUtf8IfExists(path);
180
+ if (content === null) {
181
+ continue;
182
+ }
183
+ selected.push({ id, path, source: toPosixPath(path), hash: hashContent(content) });
184
+ }
185
+ return selected;
186
+ }
187
+ async function syncSkillToTarget(input) {
188
+ const content = await readFile(input.skill.path, "utf-8");
189
+ const parsed = parseSkillContent(input.skill.id, content, input.skill.path, "xtctx");
190
+ const rendered = renderTargetContent({
191
+ skill: parsed,
192
+ sourceHash: input.skill.hash,
193
+ mode: input.mode,
194
+ content,
195
+ });
196
+ return {
197
+ path: input.targetPath,
198
+ changed: await writeIfChanged(input.targetPath, rendered),
199
+ };
200
+ }
201
+ function renderTargetContent(input) {
202
+ if (input.mode === "native-skill") {
203
+ return `${normalizeNewlines(input.content).trimEnd()}\n`;
204
+ }
205
+ const title = input.skill.name || input.skill.id;
206
+ const header = [
207
+ "<!-- xtctx:skill begin -->",
208
+ `<!-- xtctx:skill-id ${input.skill.id} -->`,
209
+ `<!-- xtctx:skill-hash ${input.sourceHash} -->`,
210
+ "Generated by xtctx setup. Do not edit this file directly.",
211
+ "",
212
+ ].join("\n");
213
+ const body = stripFrontmatter(input.content).trim();
214
+ const footer = "\n\n<!-- xtctx:skill end -->\n";
215
+ if (input.mode === "rule-adapter") {
216
+ return [
217
+ "---",
218
+ `description: ${quoteYamlString(`${input.skill.description} Synced from xtctx project skills.`)}`,
219
+ 'globs: "**/*"',
220
+ "alwaysApply: false",
221
+ "---",
222
+ "",
223
+ header,
224
+ `# ${title}`,
225
+ "",
226
+ body,
227
+ footer,
228
+ ].join("\n");
229
+ }
230
+ if (input.mode === "instruction-adapter") {
231
+ return [
232
+ "---",
233
+ 'applyTo: "**"',
234
+ "---",
235
+ "",
236
+ header,
237
+ `# ${title}`,
238
+ "",
239
+ body,
240
+ footer,
241
+ ].join("\n");
242
+ }
243
+ switch (input.mode) {
244
+ case "managed-block":
245
+ case "unsupported":
246
+ return input.content;
247
+ default: {
248
+ const _exhaustive = input.mode;
249
+ void _exhaustive;
250
+ return input.content;
251
+ }
252
+ }
253
+ }
254
+ function targetHasHash(content, hash, mode) {
255
+ if (mode === "native-skill") {
256
+ return hashContent(content.replace(/\n?$/, "\n")) === hash;
257
+ }
258
+ const match = SKILL_HASH_PATTERN.exec(content);
259
+ return match?.[1] === hash;
260
+ }
261
+ async function readExistingSkillConfig(configPath) {
262
+ const raw = await readUtf8IfExists(configPath);
263
+ if (raw === null) {
264
+ return { selectedIds: [] };
265
+ }
266
+ try {
267
+ const parsed = parseYaml(raw);
268
+ if (!isRecord(parsed) || !isRecord(parsed.skills) || !isRecord(parsed.skills.selected)) {
269
+ return { selectedIds: [] };
270
+ }
271
+ return { selectedIds: Object.keys(parsed.skills.selected) };
272
+ }
273
+ catch {
274
+ return { selectedIds: [] };
275
+ }
276
+ }
277
+ async function readSkillDir(root, source) {
278
+ if (!(await pathExists(root))) {
279
+ return [];
280
+ }
281
+ const entries = await readdir(root, { withFileTypes: true });
282
+ const skills = [];
283
+ for (const entry of entries) {
284
+ if (!entry.isDirectory()) {
285
+ continue;
286
+ }
287
+ const skillId = normalizeSkillId(entry.name);
288
+ if (!skillId) {
289
+ continue;
290
+ }
291
+ const skillPath = join(root, entry.name, "SKILL.md");
292
+ const content = await readUtf8IfExists(skillPath);
293
+ if (!content) {
294
+ continue;
295
+ }
296
+ skills.push(parseSkillContent(skillId, content, skillPath, source));
297
+ }
298
+ return skills;
299
+ }
300
+ function parseSkillContent(id, content, path, source) {
301
+ const frontmatter = /^---\n([\s\S]*?)\n---\n?/.exec(normalizeNewlines(content));
302
+ let name = id;
303
+ let description = `Synced project skill ${id}`;
304
+ if (frontmatter) {
305
+ try {
306
+ const parsed = parseYaml(frontmatter[1]);
307
+ if (isRecord(parsed)) {
308
+ if (typeof parsed.name === "string" && parsed.name.trim()) {
309
+ name = parsed.name.trim();
310
+ }
311
+ if (typeof parsed.description === "string" && parsed.description.trim()) {
312
+ description = parsed.description.trim();
313
+ }
314
+ }
315
+ }
316
+ catch {
317
+ // Invalid skill frontmatter should not stop setup from repairing other surfaces.
318
+ }
319
+ }
320
+ return { id, name, description, path, source, content: normalizeNewlines(content) };
321
+ }
322
+ function stripFrontmatter(content) {
323
+ return normalizeNewlines(content).replace(/^---\n[\s\S]*?\n---\n?/, "");
324
+ }
325
+ function buildTargetConfig(projectRoot) {
326
+ return Object.fromEntries(SUPPORTED_TOOLS.map((tool) => [
327
+ tool.id,
328
+ {
329
+ mode: tool.skillSync?.mode ?? "unsupported",
330
+ path: tool.skillSync?.targetPath
331
+ ? toProjectRelative(projectRoot, tool.skillSync.targetPath(projectRoot, BUILT_IN_SKILL_ID))
332
+ : undefined,
333
+ },
334
+ ]));
335
+ }
336
+ async function listCanonicalSkillIds(sourceDir) {
337
+ const entries = await readSkillDir(sourceDir, "xtctx");
338
+ return entries.map((entry) => entry.id);
339
+ }
340
+ function builtInHandoffSkill() {
341
+ return [
342
+ "---",
343
+ "name: xtctx-handoff",
344
+ "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.",
345
+ "---",
346
+ "",
347
+ "# xtctx Handoff",
348
+ "",
349
+ "Use the xtctx MCP tools to retrieve recent local transcript context for this project.",
350
+ "",
351
+ "## Workflow",
352
+ "",
353
+ "1. Call `xtctx_recent_sessions` to list recent sessions for the current project.",
354
+ "2. Call `xtctx_session_detail` with a relevant `session_ref` before continuing the work.",
355
+ "3. Call `xtctx_search_sessions` when keyword or semantic search is more useful than recency.",
356
+ "4. Use `xtctx_continuity_status` only for wiring, cache, and freshness diagnostics.",
357
+ "",
358
+ "Raw transcript files remain authoritative. Do not invent a summary when raw detail is available.",
359
+ "",
360
+ ].join("\n");
361
+ }
362
+ function skillSourceDir(projectRoot) {
363
+ return join(projectRoot, ".xtctx", "skills");
364
+ }
365
+ function hashContent(content) {
366
+ return `${HASH_PREFIX}${createHash("sha256").update(normalizeNewlines(content).trimEnd() + "\n").digest("hex")}`;
367
+ }
368
+ async function writeIfChanged(filePath, content) {
369
+ const normalized = normalizeNewlines(content);
370
+ const existing = await readUtf8IfExists(filePath);
371
+ if (existing !== null && normalizeNewlines(existing) === normalized) {
372
+ return false;
373
+ }
374
+ await writeFileAtomic(filePath, normalized);
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,26 @@
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
+ /**
16
+ * Split text into segments that fit the embedding model's sequence window
17
+ * (~4 chars per token; the default 1000 chars stays under 256 tokens).
18
+ * Splits on line boundaries; a single oversized line is hard-sliced.
19
+ */
20
+ export declare function splitTextForEmbedding(text: string, maxChars?: number): string[];
21
+ /**
22
+ * Mean-pool segment vectors into one unit vector, re-normalized to unit
23
+ * length so cosine scores stay comparable with single-segment vectors.
24
+ */
25
+ export declare function poolVectors(vectors: Float32Array[]): Float32Array;
26
+ //# 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;AAMjE,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;AA0BD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAgB,GAAG,MAAM,EAAE,CAgCtF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,CAyBjE"}
@@ -0,0 +1,132 @@
1
+ export const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
2
+ const MAX_SEQ_TOKENS = 256;
3
+ /** ~4 characters per token, the budget splitTextForEmbedding segments to. */
4
+ const MAX_SEQ_CHARS = MAX_SEQ_TOKENS * 4;
5
+ const MAX_BATCH_SIZE = 32;
6
+ export class TransformersEmbeddingProvider {
7
+ model;
8
+ extractor = null;
9
+ constructor(model = DEFAULT_EMBEDDING_MODEL) {
10
+ this.model = model;
11
+ }
12
+ async embed(text) {
13
+ const [vector] = await this.embedBatch([text]);
14
+ return vector;
15
+ }
16
+ async embedBatch(texts) {
17
+ if (texts.length === 0) {
18
+ return [];
19
+ }
20
+ const extractor = await this.getExtractor();
21
+ const vectors = [];
22
+ for (let start = 0; start < texts.length; start += MAX_BATCH_SIZE) {
23
+ const batch = texts.slice(start, start + MAX_BATCH_SIZE);
24
+ const output = await extractor(batch, { pooling: "mean", normalize: true });
25
+ vectors.push(...splitBatchOutput(output, batch.length));
26
+ }
27
+ return vectors;
28
+ }
29
+ async getExtractor() {
30
+ if (this.extractor) {
31
+ return this.extractor;
32
+ }
33
+ process.stderr.write(`xtctx: Initializing local embedding provider (${this.model})...\n`);
34
+ const transformers = (await import("@huggingface/transformers"));
35
+ const extractor = await transformers.pipeline("feature-extraction", this.model, {
36
+ dtype: "fp32",
37
+ });
38
+ // `model_max_length` is a getter with no setter in @huggingface/transformers,
39
+ // so assigning it threw a TypeError on every embed call under ESM's strict
40
+ // mode — semantic search failed for every user while hybrid mode silently
41
+ // degraded to keyword-only. Callers segment input to MAX_SEQ_TOKENS via
42
+ // splitTextForEmbedding before it reaches the model, and the model's own
43
+ // 512-token limit is the backstop, so nothing needs to be set here.
44
+ this.extractor = extractor;
45
+ return extractor;
46
+ }
47
+ }
48
+ function splitBatchOutput(output, batchSize) {
49
+ const flat = toFloat32Array(output.data);
50
+ const dimension = flat.length / batchSize;
51
+ if (!Number.isInteger(dimension) || dimension <= 0) {
52
+ throw new Error("Embedding model returned an unexpected output shape");
53
+ }
54
+ const vectors = [];
55
+ for (let index = 0; index < batchSize; index += 1) {
56
+ vectors.push(flat.slice(index * dimension, (index + 1) * dimension));
57
+ }
58
+ return vectors;
59
+ }
60
+ function toFloat32Array(data) {
61
+ if (data instanceof Float32Array) {
62
+ return data;
63
+ }
64
+ return Float32Array.from(data);
65
+ }
66
+ /**
67
+ * Split text into segments that fit the embedding model's sequence window
68
+ * (~4 chars per token; the default 1000 chars stays under 256 tokens).
69
+ * Splits on line boundaries; a single oversized line is hard-sliced.
70
+ */
71
+ export function splitTextForEmbedding(text, maxChars = MAX_SEQ_CHARS) {
72
+ if (text.length <= maxChars) {
73
+ return [text];
74
+ }
75
+ const segments = [];
76
+ let current = "";
77
+ for (const line of text.split("\n")) {
78
+ if (line.length > maxChars) {
79
+ if (current) {
80
+ segments.push(current);
81
+ current = "";
82
+ }
83
+ for (let start = 0; start < line.length; start += maxChars) {
84
+ segments.push(line.slice(start, start + maxChars));
85
+ }
86
+ continue;
87
+ }
88
+ if (!current) {
89
+ current = line;
90
+ }
91
+ else if (current.length + 1 + line.length <= maxChars) {
92
+ current = `${current}\n${line}`;
93
+ }
94
+ else {
95
+ segments.push(current);
96
+ current = line;
97
+ }
98
+ }
99
+ if (current) {
100
+ segments.push(current);
101
+ }
102
+ return segments;
103
+ }
104
+ /**
105
+ * Mean-pool segment vectors into one unit vector, re-normalized to unit
106
+ * length so cosine scores stay comparable with single-segment vectors.
107
+ */
108
+ export function poolVectors(vectors) {
109
+ if (vectors.length === 1) {
110
+ return vectors[0];
111
+ }
112
+ const dimensions = vectors[0]?.length ?? 0;
113
+ const pooled = new Float32Array(dimensions);
114
+ for (const vector of vectors) {
115
+ for (let index = 0; index < dimensions; index += 1) {
116
+ pooled[index] += vector[index];
117
+ }
118
+ }
119
+ let norm = 0;
120
+ for (let index = 0; index < dimensions; index += 1) {
121
+ pooled[index] /= vectors.length;
122
+ norm += pooled[index] * pooled[index];
123
+ }
124
+ if (norm > 0) {
125
+ const scale = 1 / Math.sqrt(norm);
126
+ for (let index = 0; index < dimensions; index += 1) {
127
+ pooled[index] *= scale;
128
+ }
129
+ }
130
+ return pooled;
131
+ }
132
+ //# 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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"}