docorbit 0.1.0 → 0.1.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 (402) hide show
  1. package/bin/docorbit.js +2 -2
  2. package/dist/apps/cli/src/commands/add.d.ts +7 -0
  3. package/dist/apps/cli/src/commands/add.js +35 -0
  4. package/dist/apps/cli/src/commands/api.d.ts +2 -0
  5. package/dist/apps/cli/src/commands/api.js +35 -0
  6. package/dist/apps/cli/src/commands/context.d.ts +10 -0
  7. package/dist/apps/cli/src/commands/context.js +36 -0
  8. package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
  9. package/dist/apps/cli/src/commands/dashboard.js +43 -0
  10. package/dist/apps/cli/src/commands/diff.d.ts +2 -0
  11. package/dist/apps/cli/src/commands/diff.js +29 -0
  12. package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
  13. package/dist/apps/cli/src/commands/evaluate.js +101 -0
  14. package/dist/apps/cli/src/commands/examples.d.ts +2 -0
  15. package/dist/apps/cli/src/commands/examples.js +36 -0
  16. package/dist/apps/cli/src/commands/export.d.ts +11 -0
  17. package/dist/apps/cli/src/commands/export.js +72 -0
  18. package/dist/apps/cli/src/commands/impact.d.ts +2 -0
  19. package/dist/apps/cli/src/commands/impact.js +30 -0
  20. package/dist/apps/cli/src/commands/init.d.ts +5 -0
  21. package/dist/apps/cli/src/commands/init.js +52 -0
  22. package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
  23. package/dist/apps/cli/src/commands/inspect.js +24 -0
  24. package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
  25. package/dist/apps/cli/src/commands/mcp.js +49 -0
  26. package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
  27. package/dist/apps/cli/src/commands/pitfalls.js +35 -0
  28. package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
  29. package/dist/apps/cli/src/commands/recipes.js +33 -0
  30. package/dist/apps/cli/src/commands/search.d.ts +11 -0
  31. package/dist/apps/cli/src/commands/search.js +36 -0
  32. package/dist/apps/cli/src/commands/update.d.ts +6 -0
  33. package/dist/apps/cli/src/commands/update.js +53 -0
  34. package/dist/apps/cli/src/commands/verify.d.ts +2 -0
  35. package/dist/apps/cli/src/commands/verify.js +44 -0
  36. package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
  37. package/dist/apps/cli/src/formatters/colors.js +22 -0
  38. package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
  39. package/dist/apps/cli/src/formatters/inspection.js +88 -0
  40. package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
  41. package/dist/apps/cli/src/formatters/knowledge.js +229 -0
  42. package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
  43. package/dist/apps/cli/src/formatters/retrieval.js +61 -0
  44. package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
  45. package/dist/apps/cli/src/formatters/terminal.js +5 -0
  46. package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
  47. package/dist/apps/cli/src/formatters/verification.js +102 -0
  48. package/dist/apps/cli/src/index.d.ts +1 -0
  49. package/dist/apps/cli/src/index.js +376 -0
  50. package/dist/packages/core/src/dashboard/server.d.ts +33 -0
  51. package/dist/packages/core/src/dashboard/server.js +267 -0
  52. package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
  53. package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
  54. package/dist/packages/core/src/implementation-service.d.ts +73 -0
  55. package/dist/packages/core/src/implementation-service.js +325 -0
  56. package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
  57. package/dist/packages/core/src/index.js +6 -0
  58. package/dist/packages/core/src/inspector.d.ts +22 -0
  59. package/dist/packages/core/src/inspector.js +38 -0
  60. package/dist/packages/core/src/pipeline.d.ts +45 -0
  61. package/dist/packages/core/src/pipeline.js +246 -0
  62. package/dist/packages/crawler/src/config.d.ts +2 -0
  63. package/dist/packages/crawler/src/config.js +10 -0
  64. package/dist/packages/crawler/src/fetcher.d.ts +31 -0
  65. package/dist/packages/crawler/src/fetcher.js +139 -0
  66. package/dist/packages/crawler/src/index.js +2 -0
  67. package/dist/packages/discovery/src/index.d.ts +11 -0
  68. package/dist/packages/discovery/src/index.js +29 -0
  69. package/dist/packages/discovery/src/provider.d.ts +12 -0
  70. package/dist/packages/discovery/src/provider.js +30 -0
  71. package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
  72. package/dist/packages/discovery/src/providers/generic.js +94 -0
  73. package/dist/packages/discovery/src/providers/github.d.ts +7 -0
  74. package/dist/packages/discovery/src/providers/github.js +52 -0
  75. package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
  76. package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
  77. package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
  78. package/dist/packages/discovery/src/providers/markdown.js +38 -0
  79. package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
  80. package/dist/packages/discovery/src/providers/openapi.js +77 -0
  81. package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
  82. package/dist/packages/discovery/src/providers/sitemap.js +53 -0
  83. package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
  84. package/dist/packages/discovery/src/providers/skill.js +46 -0
  85. package/dist/packages/discovery/src/ranker.d.ts +6 -0
  86. package/dist/packages/discovery/src/ranker.js +107 -0
  87. package/dist/packages/evaluation/src/dataset.d.ts +2 -0
  88. package/dist/packages/evaluation/src/dataset.js +944 -0
  89. package/dist/packages/evaluation/src/index.js +8 -0
  90. package/dist/packages/evaluation/src/runner.d.ts +7 -0
  91. package/dist/packages/evaluation/src/runner.js +196 -0
  92. package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
  93. package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
  94. package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
  95. package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
  96. package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
  97. package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
  98. package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
  99. package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
  100. package/dist/packages/evaluation/src/types.d.ts +15 -0
  101. package/dist/packages/evaluation/src/types.js +1 -0
  102. package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
  103. package/dist/packages/evaluation/src/version-matcher.js +61 -0
  104. package/dist/packages/export/src/agents-md.d.ts +19 -0
  105. package/dist/packages/export/src/agents-md.js +170 -0
  106. package/dist/packages/export/src/claude-md.d.ts +17 -0
  107. package/dist/packages/export/src/claude-md.js +118 -0
  108. package/dist/packages/export/src/docs-map.d.ts +14 -0
  109. package/dist/packages/export/src/docs-map.js +118 -0
  110. package/dist/packages/export/src/index.js +6 -0
  111. package/dist/packages/export/src/llms-txt.d.ts +15 -0
  112. package/dist/packages/export/src/llms-txt.js +73 -0
  113. package/dist/packages/export/src/service.d.ts +23 -0
  114. package/dist/packages/export/src/service.js +210 -0
  115. package/dist/packages/export/src/skill-md.d.ts +14 -0
  116. package/dist/packages/export/src/skill-md.js +107 -0
  117. package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
  118. package/dist/packages/mcp/src/index.js +6 -0
  119. package/dist/packages/mcp/src/resources/index.d.ts +12 -0
  120. package/dist/packages/mcp/src/resources/index.js +165 -0
  121. package/dist/packages/mcp/src/server.d.ts +30 -0
  122. package/dist/packages/mcp/src/server.js +243 -0
  123. package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
  124. package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
  125. package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
  126. package/dist/packages/mcp/src/tools/check-api.js +74 -0
  127. package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
  128. package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
  129. package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
  130. package/dist/packages/mcp/src/tools/export-context.js +61 -0
  131. package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
  132. package/dist/packages/mcp/src/tools/find-api.js +91 -0
  133. package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
  134. package/dist/packages/mcp/src/tools/find-example.js +92 -0
  135. package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
  136. package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
  137. package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
  138. package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
  139. package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
  140. package/dist/packages/mcp/src/tools/get-doc.js +118 -0
  141. package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
  142. package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
  143. package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
  144. package/dist/packages/mcp/src/tools/get-version.js +104 -0
  145. package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
  146. package/dist/packages/mcp/src/tools/implementation-context.js +82 -0
  147. package/dist/packages/mcp/src/tools/index.d.ts +18 -0
  148. package/dist/packages/mcp/src/tools/index.js +39 -0
  149. package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
  150. package/dist/packages/mcp/src/tools/list-sources.js +76 -0
  151. package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
  152. package/dist/packages/mcp/src/tools/search-docs.js +113 -0
  153. package/dist/packages/mcp/src/tools/types.d.ts +22 -0
  154. package/dist/packages/mcp/src/tools/types.js +1 -0
  155. package/dist/packages/mcp/src/transports/http.d.ts +31 -0
  156. package/dist/packages/mcp/src/transports/http.js +215 -0
  157. package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
  158. package/dist/packages/mcp/src/transports/stdio.js +86 -0
  159. package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
  160. package/dist/packages/mcp/src/transports/types.js +1 -0
  161. package/dist/packages/mcp/src/types.d.ts +89 -0
  162. package/dist/packages/mcp/src/types.js +7 -0
  163. package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
  164. package/dist/packages/normalizer/src/example-indexer.js +200 -0
  165. package/dist/packages/normalizer/src/html.d.ts +13 -0
  166. package/dist/packages/normalizer/src/html.js +221 -0
  167. package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
  168. package/dist/packages/normalizer/src/index.js +7 -0
  169. package/dist/packages/normalizer/src/llms.d.ts +3 -0
  170. package/dist/packages/normalizer/src/llms.js +71 -0
  171. package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
  172. package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
  173. package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
  174. package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
  175. package/dist/packages/normalizer/src/openapi.js +2 -0
  176. package/dist/packages/normalizer/src/page.d.ts +13 -0
  177. package/dist/packages/normalizer/src/page.js +150 -0
  178. package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
  179. package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
  180. package/dist/packages/normalizer/src/slicer.d.ts +30 -0
  181. package/dist/packages/normalizer/src/slicer.js +360 -0
  182. package/dist/packages/retrieval/src/engine.d.ts +17 -0
  183. package/dist/packages/retrieval/src/engine.js +93 -0
  184. package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
  185. package/dist/packages/retrieval/src/index.js +6 -0
  186. package/dist/packages/retrieval/src/intent.d.ts +6 -0
  187. package/dist/packages/retrieval/src/intent.js +39 -0
  188. package/dist/packages/retrieval/src/packer.d.ts +2 -0
  189. package/dist/packages/retrieval/src/packer.js +108 -0
  190. package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
  191. package/dist/packages/retrieval/src/recipe-engine.js +265 -0
  192. package/dist/packages/retrieval/src/scorer.d.ts +13 -0
  193. package/dist/packages/retrieval/src/scorer.js +110 -0
  194. package/dist/packages/retrieval/src/weights.d.ts +3 -0
  195. package/dist/packages/retrieval/src/weights.js +28 -0
  196. package/dist/packages/security/src/annotations.d.ts +10 -0
  197. package/dist/packages/security/src/annotations.js +100 -0
  198. package/dist/packages/security/src/index.js +2 -0
  199. package/dist/packages/security/src/ssrf.d.ts +17 -0
  200. package/dist/packages/security/src/ssrf.js +132 -0
  201. package/dist/packages/shared/src/errors.d.ts +22 -0
  202. package/dist/packages/shared/src/errors.js +44 -0
  203. package/dist/packages/shared/src/hashing.d.ts +3 -0
  204. package/dist/packages/shared/src/hashing.js +21 -0
  205. package/dist/packages/shared/src/index.js +3 -0
  206. package/dist/packages/shared/src/types.d.ts +715 -0
  207. package/dist/packages/shared/src/types.js +1 -0
  208. package/dist/packages/storage/src/db.d.ts +10 -0
  209. package/dist/packages/storage/src/db.js +61 -0
  210. package/dist/packages/storage/src/index.js +10 -0
  211. package/dist/packages/storage/src/interfaces.d.ts +83 -0
  212. package/dist/packages/storage/src/interfaces.js +1 -0
  213. package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
  214. package/dist/packages/storage/src/repositories/api-repository.js +169 -0
  215. package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
  216. package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
  217. package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
  218. package/dist/packages/storage/src/repositories/example-repository.js +158 -0
  219. package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
  220. package/dist/packages/storage/src/repositories/page-repository.js +161 -0
  221. package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
  222. package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
  223. package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
  224. package/dist/packages/storage/src/repositories/source-repository.js +153 -0
  225. package/dist/packages/storage/src/repository.d.ts +92 -0
  226. package/dist/packages/storage/src/repository.js +157 -0
  227. package/dist/packages/storage/src/schema.d.ts +2 -0
  228. package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
  229. package/dist/packages/storage/src/search-tokens.d.ts +6 -0
  230. package/dist/packages/storage/src/search-tokens.js +26 -0
  231. package/dist/packages/verification/src/diff-engine.d.ts +18 -0
  232. package/dist/packages/verification/src/diff-engine.js +218 -0
  233. package/dist/packages/verification/src/extractor.d.ts +29 -0
  234. package/dist/packages/verification/src/extractor.js +302 -0
  235. package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
  236. package/dist/packages/verification/src/impact-scanner.js +181 -0
  237. package/dist/packages/verification/src/index.js +5 -0
  238. package/dist/packages/verification/src/services.d.ts +55 -0
  239. package/dist/packages/verification/src/services.js +189 -0
  240. package/dist/packages/verification/src/verifier.d.ts +15 -0
  241. package/dist/packages/verification/src/verifier.js +315 -0
  242. package/dist/packages/workspace/src/detector.d.ts +7 -0
  243. package/dist/packages/workspace/src/detector.js +117 -0
  244. package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
  245. package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
  246. package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
  247. package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
  248. package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
  249. package/dist/packages/workspace/src/ecosystems/go.js +49 -0
  250. package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
  251. package/dist/packages/workspace/src/ecosystems/index.js +21 -0
  252. package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
  253. package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
  254. package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
  255. package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
  256. package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
  257. package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
  258. package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
  259. package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
  260. package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
  261. package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
  262. package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
  263. package/dist/packages/workspace/src/ecosystems/types.js +1 -0
  264. package/dist/packages/workspace/src/index.js +5 -0
  265. package/dist/packages/workspace/src/lockfile.d.ts +21 -0
  266. package/dist/packages/workspace/src/lockfile.js +153 -0
  267. package/dist/packages/workspace/src/resolver.d.ts +39 -0
  268. package/dist/packages/workspace/src/resolver.js +164 -0
  269. package/dist/packages/workspace/src/semver.d.ts +33 -0
  270. package/dist/packages/workspace/src/semver.js +235 -0
  271. package/package.json +8 -7
  272. package/apps/cli/bin/docorbit.js +0 -8
  273. package/apps/cli/src/commands/add.ts +0 -44
  274. package/apps/cli/src/commands/api.ts +0 -38
  275. package/apps/cli/src/commands/context.ts +0 -47
  276. package/apps/cli/src/commands/dashboard.ts +0 -55
  277. package/apps/cli/src/commands/diff.ts +0 -30
  278. package/apps/cli/src/commands/evaluate.ts +0 -133
  279. package/apps/cli/src/commands/examples.ts +0 -39
  280. package/apps/cli/src/commands/export.ts +0 -89
  281. package/apps/cli/src/commands/impact.ts +0 -31
  282. package/apps/cli/src/commands/init.ts +0 -69
  283. package/apps/cli/src/commands/inspect.ts +0 -30
  284. package/apps/cli/src/commands/mcp.ts +0 -72
  285. package/apps/cli/src/commands/pitfalls.ts +0 -38
  286. package/apps/cli/src/commands/recipes.ts +0 -35
  287. package/apps/cli/src/commands/search.ts +0 -48
  288. package/apps/cli/src/commands/update.ts +0 -73
  289. package/apps/cli/src/commands/verify.ts +0 -48
  290. package/apps/cli/src/formatters/colors.ts +0 -23
  291. package/apps/cli/src/formatters/inspection.ts +0 -102
  292. package/apps/cli/src/formatters/knowledge.ts +0 -272
  293. package/apps/cli/src/formatters/retrieval.ts +0 -74
  294. package/apps/cli/src/formatters/verification.ts +0 -126
  295. package/apps/cli/src/index.ts +0 -409
  296. package/packages/core/src/dashboard/server.ts +0 -314
  297. package/packages/core/src/implementation-service.ts +0 -451
  298. package/packages/core/src/inspector.ts +0 -71
  299. package/packages/core/src/pipeline.ts +0 -331
  300. package/packages/crawler/src/config.ts +0 -12
  301. package/packages/crawler/src/fetcher.ts +0 -185
  302. package/packages/discovery/src/index.ts +0 -31
  303. package/packages/discovery/src/provider.ts +0 -47
  304. package/packages/discovery/src/providers/generic.ts +0 -98
  305. package/packages/discovery/src/providers/github.ts +0 -61
  306. package/packages/discovery/src/providers/llms-txt.ts +0 -73
  307. package/packages/discovery/src/providers/markdown.ts +0 -48
  308. package/packages/discovery/src/providers/openapi.ts +0 -91
  309. package/packages/discovery/src/providers/sitemap.ts +0 -62
  310. package/packages/discovery/src/providers/skill.ts +0 -54
  311. package/packages/discovery/src/ranker.ts +0 -123
  312. package/packages/evaluation/src/dataset.ts +0 -963
  313. package/packages/evaluation/src/runner.ts +0 -241
  314. package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
  315. package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
  316. package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
  317. package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
  318. package/packages/evaluation/src/types.ts +0 -34
  319. package/packages/evaluation/src/version-matcher.ts +0 -73
  320. package/packages/export/src/agents-md.ts +0 -200
  321. package/packages/export/src/claude-md.ts +0 -141
  322. package/packages/export/src/docs-map.ts +0 -150
  323. package/packages/export/src/llms-txt.ts +0 -96
  324. package/packages/export/src/service.ts +0 -250
  325. package/packages/export/src/skill-md.ts +0 -128
  326. package/packages/mcp/src/resources/index.ts +0 -189
  327. package/packages/mcp/src/server.ts +0 -278
  328. package/packages/mcp/src/tools/analyze-impact.ts +0 -74
  329. package/packages/mcp/src/tools/check-api.ts +0 -86
  330. package/packages/mcp/src/tools/diff-docs.ts +0 -68
  331. package/packages/mcp/src/tools/export-context.ts +0 -73
  332. package/packages/mcp/src/tools/find-api.ts +0 -99
  333. package/packages/mcp/src/tools/find-example.ts +0 -100
  334. package/packages/mcp/src/tools/find-pitfall.ts +0 -94
  335. package/packages/mcp/src/tools/find-recipe.ts +0 -98
  336. package/packages/mcp/src/tools/get-doc.ts +0 -130
  337. package/packages/mcp/src/tools/get-docs-map.ts +0 -64
  338. package/packages/mcp/src/tools/get-version.ts +0 -118
  339. package/packages/mcp/src/tools/implementation-context.ts +0 -88
  340. package/packages/mcp/src/tools/index.ts +0 -59
  341. package/packages/mcp/src/tools/list-sources.ts +0 -85
  342. package/packages/mcp/src/tools/search-docs.ts +0 -123
  343. package/packages/mcp/src/tools/types.ts +0 -28
  344. package/packages/mcp/src/transports/http.ts +0 -256
  345. package/packages/mcp/src/transports/stdio.ts +0 -105
  346. package/packages/mcp/src/types.ts +0 -102
  347. package/packages/normalizer/src/example-indexer.ts +0 -240
  348. package/packages/normalizer/src/html.ts +0 -253
  349. package/packages/normalizer/src/llms.ts +0 -83
  350. package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
  351. package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
  352. package/packages/normalizer/src/page.ts +0 -184
  353. package/packages/normalizer/src/pitfall-extractor.ts +0 -190
  354. package/packages/normalizer/src/slicer.ts +0 -455
  355. package/packages/retrieval/src/engine.ts +0 -120
  356. package/packages/retrieval/src/intent.ts +0 -43
  357. package/packages/retrieval/src/packer.ts +0 -145
  358. package/packages/retrieval/src/recipe-engine.ts +0 -313
  359. package/packages/retrieval/src/scorer.ts +0 -139
  360. package/packages/retrieval/src/weights.ts +0 -31
  361. package/packages/security/src/annotations.ts +0 -112
  362. package/packages/security/src/ssrf.ts +0 -153
  363. package/packages/shared/src/errors.ts +0 -53
  364. package/packages/shared/src/hashing.ts +0 -23
  365. package/packages/shared/src/types.ts +0 -881
  366. package/packages/storage/src/db.ts +0 -72
  367. package/packages/storage/src/interfaces.ts +0 -115
  368. package/packages/storage/src/repositories/api-repository.ts +0 -219
  369. package/packages/storage/src/repositories/chunk-repository.ts +0 -316
  370. package/packages/storage/src/repositories/example-repository.ts +0 -206
  371. package/packages/storage/src/repositories/page-repository.ts +0 -205
  372. package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
  373. package/packages/storage/src/repositories/source-repository.ts +0 -205
  374. package/packages/storage/src/repository.ts +0 -256
  375. package/packages/storage/src/search-tokens.ts +0 -28
  376. package/packages/verification/src/diff-engine.ts +0 -258
  377. package/packages/verification/src/extractor.ts +0 -339
  378. package/packages/verification/src/impact-scanner.ts +0 -203
  379. package/packages/verification/src/services.ts +0 -238
  380. package/packages/verification/src/verifier.ts +0 -375
  381. package/packages/workspace/src/detector.ts +0 -143
  382. package/packages/workspace/src/ecosystems/cargo.ts +0 -84
  383. package/packages/workspace/src/ecosystems/composer.ts +0 -42
  384. package/packages/workspace/src/ecosystems/go.ts +0 -54
  385. package/packages/workspace/src/ecosystems/maven.ts +0 -34
  386. package/packages/workspace/src/ecosystems/npm.ts +0 -83
  387. package/packages/workspace/src/ecosystems/pub.ts +0 -40
  388. package/packages/workspace/src/ecosystems/pypi.ts +0 -100
  389. package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
  390. package/packages/workspace/src/ecosystems/types.ts +0 -18
  391. package/packages/workspace/src/lockfile.ts +0 -194
  392. package/packages/workspace/src/resolver.ts +0 -234
  393. package/packages/workspace/src/semver.ts +0 -259
  394. /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
  395. /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
  396. /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
  397. /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
  398. /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
  399. /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
  400. /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
  401. /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
  402. /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
@@ -1,194 +0,0 @@
1
- import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import type {
4
- DocsLock,
5
- LockedDoc,
6
- WorkspaceScanResult,
7
- ProjectDependency,
8
- DocVersionMatch,
9
- } from '../../shared/src/index.ts';
10
- import type { DocOrbitRepository } from '../../storage/src/index.ts';
11
- import { resolveDocVersion } from './semver.ts';
12
-
13
- export const DOCS_LOCK_FILENAME = 'docs.lock';
14
-
15
- /**
16
- * Reads and parses docs.lock from a project directory if present.
17
- */
18
- export function readDocsLock(projectDir: string): DocsLock | null {
19
- const filePath = join(projectDir, DOCS_LOCK_FILENAME);
20
- if (!existsSync(filePath)) return null;
21
-
22
- try {
23
- const raw = readFileSync(filePath, 'utf-8');
24
- const parsed = JSON.parse(raw);
25
- if (parsed && parsed.version === 1 && typeof parsed.dependencies === 'object') {
26
- return parsed as DocsLock;
27
- }
28
- } catch {
29
- // Malformed lockfile
30
- }
31
- return null;
32
- }
33
-
34
- /**
35
- * Deterministically writes a docs.lock file to project directory.
36
- * Sorts dependency keys alphabetically and uses 2-space indentation.
37
- */
38
- export function writeDocsLock(projectDir: string, lock: DocsLock): void {
39
- const filePath = join(projectDir, DOCS_LOCK_FILENAME);
40
-
41
- // Sort dependency keys alphabetically
42
- const sortedDeps: Record<string, LockedDoc> = {};
43
- for (const key of Object.keys(lock.dependencies).sort()) {
44
- sortedDeps[key] = lock.dependencies[key];
45
- }
46
-
47
- const deterministicLock: DocsLock = {
48
- version: 1,
49
- workspaceRoot: lock.workspaceRoot,
50
- dependencies: sortedDeps,
51
- };
52
-
53
- const serialized = JSON.stringify(deterministicLock, null, 2) + '\n';
54
- writeFileSync(filePath, serialized, 'utf-8');
55
- }
56
-
57
- /**
58
- * Helper to match a project dependency to an ingested source in the repository.
59
- */
60
- function findMatchingSource(dep: ProjectDependency, repo: DocOrbitRepository) {
61
- const sources = repo.listSources();
62
- const depClean = dep.name.toLowerCase().replace(/^@[^/]+\//, ''); // e.g. @stripe/stripe-js -> stripe-js
63
-
64
- for (const src of sources) {
65
- const srcUrl = src.url.toLowerCase();
66
- // Direct match: URL or metadata contains dependency name
67
- if (
68
- srcUrl.includes(depClean) ||
69
- srcUrl.includes(dep.name.toLowerCase()) ||
70
- (src.metadata && String(src.metadata.name || '').toLowerCase() === depClean)
71
- ) {
72
- return src;
73
- }
74
- }
75
- return null;
76
- }
77
-
78
- /**
79
- * Generates a DocsLock manifest from workspace scan result and repository state.
80
- * Preserves timestamps for unchanged documentation snapshots to prevent lockfile churn.
81
- */
82
- export function generateDocsLock(
83
- scanResult: WorkspaceScanResult,
84
- repo: DocOrbitRepository,
85
- existingLock?: DocsLock | null
86
- ): DocsLock {
87
- const lockedDeps: Record<string, LockedDoc> = {};
88
- const allSnapshots = repo.listSnapshots();
89
-
90
- // Detect duplicate package names across monorepo packages
91
- const nameCounts = new Map<string, number>();
92
- for (const dep of scanResult.dependencies) {
93
- nameCounts.set(dep.name, (nameCounts.get(dep.name) || 0) + 1);
94
- }
95
-
96
- for (const dep of scanResult.dependencies) {
97
- // Monorepo key disambiguation
98
- const isMulti = (nameCounts.get(dep.name) || 0) > 1;
99
- const depKey = isMulti && dep.packagePath && dep.packagePath !== '.'
100
- ? `${dep.packagePath}:${dep.name}`
101
- : dep.name;
102
-
103
- // Check if we have documentation for this dependency
104
- const matchingSource = findMatchingSource(dep, repo);
105
- if (!matchingSource) continue;
106
-
107
- // Find snapshots for matching source
108
- const sourceSnapshots = allSnapshots.filter(s => s.sourceId === matchingSource.id);
109
- if (sourceSnapshots.length === 0) continue;
110
-
111
- // Gather available versions from snapshots
112
- const versionToSnapshot = new Map<string, typeof sourceSnapshots[0]>();
113
- for (const snap of sourceSnapshots) {
114
- const v = snap.docVersion || 'latest';
115
- if (!versionToSnapshot.has(v)) {
116
- versionToSnapshot.set(v, snap);
117
- }
118
- }
119
-
120
- const availableVersions = Array.from(versionToSnapshot.keys());
121
- const projectVersion = dep.resolvedVersion || dep.requestedVersion;
122
- const resolution = resolveDocVersion(projectVersion, availableVersions, dep.name);
123
-
124
- const selectedSnapshot = versionToSnapshot.get(resolution.selectedDocVersion) || sourceSnapshots[0];
125
- const snapshotHash = selectedSnapshot.snapshotHash;
126
-
127
- // Deterministic timestamp preservation:
128
- // If existingLock already has this dependency with identical snapshotHash and resolvedVersion, keep the timestamp
129
- const existing = existingLock?.dependencies[depKey];
130
- const isUnchanged =
131
- existing &&
132
- existing.snapshotHash === snapshotHash &&
133
- existing.resolvedDependencyVersion === (dep.resolvedVersion || dep.requestedVersion) &&
134
- existing.docVersion === resolution.selectedDocVersion;
135
-
136
- const retrievedAt = isUnchanged ? existing.retrievedAt : new Date().toISOString();
137
-
138
- lockedDeps[depKey] = {
139
- name: dep.name,
140
- ecosystem: dep.ecosystem,
141
- requestedVersion: dep.requestedVersion,
142
- resolvedDependencyVersion: dep.resolvedVersion || dep.requestedVersion,
143
- sourceFile: dep.sourceFile,
144
- docSourceUrl: matchingSource.url,
145
- docVersion: resolution.selectedDocVersion,
146
- matchType: resolution.matchType,
147
- confidence: resolution.confidence,
148
- snapshotId: selectedSnapshot.id,
149
- snapshotHash,
150
- retrievedAt,
151
- };
152
- }
153
-
154
- return {
155
- version: 1,
156
- workspaceRoot: scanResult.workspaceRoot,
157
- dependencies: lockedDeps,
158
- };
159
- }
160
-
161
- /**
162
- * Selectively or globally updates docs.lock for a project.
163
- */
164
- export function updateDocsLock(
165
- scanResult: WorkspaceScanResult,
166
- repo: DocOrbitRepository,
167
- existingLock: DocsLock,
168
- specificDependency?: string
169
- ): DocsLock {
170
- if (!specificDependency) {
171
- // Full update: regenerate with existing lock as baseline for unchanged items
172
- return generateDocsLock(scanResult, repo, existingLock);
173
- }
174
-
175
- // Selective update: only force refresh of specific dependency
176
- const updated = generateDocsLock(scanResult, repo, existingLock);
177
- const resultDeps = { ...existingLock.dependencies };
178
-
179
- for (const [key, doc] of Object.entries(updated.dependencies)) {
180
- if (doc.name === specificDependency || key === specificDependency) {
181
- // Force new timestamp for the target dependency being updated
182
- resultDeps[key] = {
183
- ...doc,
184
- retrievedAt: new Date().toISOString(),
185
- };
186
- }
187
- }
188
-
189
- return {
190
- version: 1,
191
- workspaceRoot: scanResult.workspaceRoot,
192
- dependencies: resultDeps,
193
- };
194
- }
@@ -1,234 +0,0 @@
1
- import type {
2
- DocsLock,
3
- ProjectDependency,
4
- WorkspaceScanResult,
5
- VersionResolutionResult,
6
- } from '../../shared/src/index.ts';
7
- import type { DocOrbitRepository } from '../../storage/src/index.ts';
8
- import { readDocsLock } from './lockfile.ts';
9
- import { detectWorkspaceDependencies } from './detector.ts';
10
- import { resolveDocVersion } from './semver.ts';
11
-
12
- export interface ResolvedProjectContext {
13
- projectDir: string;
14
- hasLockfile: boolean;
15
- matchedDependency?: {
16
- name: string;
17
- projectVersion: string;
18
- targetDocVersion: string;
19
- targetSnapshotId?: string;
20
- confidence: number;
21
- matchType: string;
22
- };
23
- allDependencies: ProjectDependency[];
24
- }
25
-
26
- /**
27
- * Normalizes query string for token matching against dependency names.
28
- */
29
- function normalizeQueryTokens(query: string): Set<string> {
30
- const tokens = query
31
- .toLowerCase()
32
- .replace(/[^\w\s-]/g, ' ')
33
- .split(/\s+/)
34
- .filter(t => t.length > 1);
35
-
36
- const set = new Set(tokens);
37
- // Add common aliases
38
- if (set.has('nextjs') || set.has('next.js')) {
39
- set.add('next');
40
- }
41
- if (set.has('reactjs') || set.has('react.js')) {
42
- set.add('react');
43
- }
44
- if (set.has('vuejs') || set.has('vue.js')) {
45
- set.add('vue');
46
- }
47
- return set;
48
- }
49
-
50
- /**
51
- * Resolves project context and detects if a query targets a specific dependency in the project.
52
- * Uses docs.lock if present for zero-overhead deterministic pinned resolution,
53
- * or falls back to live manifest scanning and resolution.
54
- */
55
- export function resolveProjectContext(
56
- projectDir: string,
57
- query: string,
58
- repo: DocOrbitRepository
59
- ): ResolvedProjectContext {
60
- const lock = readDocsLock(projectDir);
61
- const queryTokens = normalizeQueryTokens(query);
62
-
63
- if (lock) {
64
- // 1. Check locked dependencies
65
- for (const [key, lockedDoc] of Object.entries(lock.dependencies)) {
66
- const cleanName = lockedDoc.name.toLowerCase().replace(/^@[^/]+\//, '');
67
- const parts = cleanName.split(/[-_.]/);
68
-
69
- const matches =
70
- queryTokens.has(lockedDoc.name.toLowerCase()) ||
71
- queryTokens.has(cleanName) ||
72
- parts.some(p => p.length > 2 && queryTokens.has(p));
73
-
74
- if (matches) {
75
- return {
76
- projectDir,
77
- hasLockfile: true,
78
- matchedDependency: {
79
- name: lockedDoc.name,
80
- projectVersion: lockedDoc.resolvedDependencyVersion,
81
- targetDocVersion: lockedDoc.docVersion,
82
- targetSnapshotId: lockedDoc.snapshotId,
83
- confidence: lockedDoc.confidence,
84
- matchType: lockedDoc.matchType,
85
- },
86
- allDependencies: Object.values(lock.dependencies).map(d => ({
87
- name: d.name,
88
- ecosystem: d.ecosystem,
89
- requestedVersion: d.requestedVersion,
90
- resolvedVersion: d.resolvedDependencyVersion,
91
- sourceFile: d.sourceFile,
92
- })),
93
- };
94
- }
95
- }
96
-
97
- return {
98
- projectDir,
99
- hasLockfile: true,
100
- allDependencies: Object.values(lock.dependencies).map(d => ({
101
- name: d.name,
102
- ecosystem: d.ecosystem,
103
- requestedVersion: d.requestedVersion,
104
- resolvedVersion: d.resolvedDependencyVersion,
105
- sourceFile: d.sourceFile,
106
- })),
107
- };
108
- }
109
-
110
- // 2. Fallback: scan workspace manifests directly
111
- const scan = detectWorkspaceDependencies(projectDir);
112
- const allSnapshots = repo.listSnapshots();
113
- const allSources = repo.listSources();
114
-
115
- for (const dep of scan.dependencies) {
116
- const cleanName = dep.name.toLowerCase().replace(/^@[^/]+\//, '');
117
- const parts = cleanName.split(/[-_.]/);
118
-
119
- const matches =
120
- queryTokens.has(dep.name.toLowerCase()) ||
121
- queryTokens.has(cleanName) ||
122
- parts.some(p => p.length > 2 && queryTokens.has(p));
123
-
124
- if (matches) {
125
- // Find matching source
126
- const src = allSources.find(s => {
127
- const u = s.url.toLowerCase();
128
- return u.includes(cleanName) || u.includes(dep.name.toLowerCase());
129
- });
130
-
131
- if (src) {
132
- const snapshots = allSnapshots.filter(s => s.sourceId === src.id);
133
- const availableVersions = snapshots.map(s => s.docVersion || 'latest');
134
- const projectVer = dep.resolvedVersion || dep.requestedVersion;
135
- const resolution = resolveDocVersion(projectVer, availableVersions, dep.name);
136
-
137
- const chosenSnapshot = snapshots.find(
138
- s => (s.docVersion || 'latest') === resolution.selectedDocVersion
139
- ) || snapshots[0];
140
-
141
- return {
142
- projectDir,
143
- hasLockfile: false,
144
- matchedDependency: {
145
- name: dep.name,
146
- projectVersion: projectVer,
147
- targetDocVersion: resolution.selectedDocVersion,
148
- targetSnapshotId: chosenSnapshot?.id,
149
- confidence: resolution.confidence,
150
- matchType: resolution.matchType,
151
- },
152
- allDependencies: scan.dependencies,
153
- };
154
- }
155
- }
156
- }
157
-
158
- return {
159
- projectDir,
160
- hasLockfile: false,
161
- allDependencies: scan.dependencies,
162
- };
163
- }
164
-
165
- export interface WorkspaceMatch {
166
- dependency: ProjectDependency;
167
- targetVersion: string;
168
- confidence: number;
169
- snapshotId?: string;
170
- matchedBy: string;
171
- }
172
-
173
- export interface WorkspaceResolutionSummary {
174
- matches: WorkspaceMatch[];
175
- }
176
-
177
- export class WorkspaceResolver {
178
- private repo: DocOrbitRepository;
179
-
180
- constructor(repo: DocOrbitRepository) {
181
- this.repo = repo;
182
- }
183
-
184
- resolveProjectContext(projectDir: string, query: string): ResolvedProjectContext {
185
- return resolveProjectContext(projectDir, query, this.repo);
186
- }
187
-
188
- scanWorkspace(projectDir: string): WorkspaceScanResult {
189
- return detectWorkspaceDependencies(projectDir);
190
- }
191
-
192
- resolveWorkspace(scan: WorkspaceScanResult, _existingLock?: DocsLock | null): WorkspaceResolutionSummary {
193
- const allSnapshots = this.repo.listSnapshots();
194
- const allSources = this.repo.listSources();
195
- const matches: WorkspaceMatch[] = [];
196
-
197
- for (const dep of scan.dependencies) {
198
- const cleanName = dep.name.toLowerCase().replace(/^@[^/]+\//, '');
199
- const src = allSources.find(s => {
200
- const u = s.url.toLowerCase();
201
- return u.includes(cleanName) || u.includes(dep.name.toLowerCase()) ||
202
- (s.metadata && String(s.metadata.name || '').toLowerCase() === cleanName);
203
- });
204
-
205
- if (!src) continue;
206
-
207
- const snapshots = allSnapshots.filter(s => s.sourceId === src.id);
208
- if (snapshots.length === 0) continue;
209
-
210
- const availableVersions = snapshots.map(s => s.docVersion || 'latest');
211
- const projectVer = dep.resolvedVersion || dep.requestedVersion;
212
- const resolution = resolveDocVersion(projectVer, availableVersions, dep.name);
213
-
214
- const chosenSnapshot = snapshots.find(
215
- s => (s.docVersion || 'latest') === resolution.selectedDocVersion
216
- ) || snapshots[0];
217
-
218
- matches.push({
219
- dependency: dep,
220
- targetVersion: resolution.selectedDocVersion,
221
- confidence: resolution.confidence,
222
- snapshotId: chosenSnapshot?.id,
223
- matchedBy: resolution.matchType,
224
- });
225
- }
226
-
227
- return { matches };
228
- }
229
-
230
- resolveVersion(projectVersion: string, availableDocVersions: string[], packageName?: string): VersionResolutionResult {
231
- return resolveDocVersion(projectVersion, availableDocVersions, packageName);
232
- }
233
- }
234
-
@@ -1,259 +0,0 @@
1
- import type {
2
- DocVersionMatch,
3
- VersionResolutionResult,
4
- } from '../../shared/src/index.ts';
5
-
6
- export interface ParsedSemVer {
7
- major: number;
8
- minor: number;
9
- patch: number;
10
- prerelease?: string;
11
- raw: string;
12
- }
13
-
14
- /**
15
- * Parses a version string into semantic components.
16
- * Handles standard SemVer, leading 'v', partial versions ('14', '14.2'),
17
- * and prereleases ('15.0.0-rc.1', '14.2.0-canary').
18
- */
19
- export function parseSemVer(versionStr: string): ParsedSemVer | null {
20
- if (!versionStr || typeof versionStr !== 'string') return null;
21
-
22
- const cleaned = versionStr.trim().replace(/^[v=]/, '');
23
- // Match major, optional minor, optional patch, optional prerelease
24
- const match = cleaned.match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z.-]+))?/);
25
- if (!match) return null;
26
-
27
- const major = parseInt(match[1], 10);
28
- const minor = match[2] !== undefined ? parseInt(match[2], 10) : 0;
29
- const patch = match[3] !== undefined ? parseInt(match[3], 10) : 0;
30
- const prerelease = match[4];
31
-
32
- return { major, minor, patch, prerelease, raw: versionStr.trim() };
33
- }
34
-
35
- /**
36
- * Deterministic SemVer comparison.
37
- * Returns negative if v1 < v2, positive if v1 > v2, 0 if v1 == v2.
38
- * Prereleases have lower precedence than normal releases (e.g. 15.0.0-rc.1 < 15.0.0).
39
- */
40
- export function compareVersions(v1: string, v2: string): number {
41
- const p1 = parseSemVer(v1);
42
- const p2 = parseSemVer(v2);
43
-
44
- if (!p1 && !p2) return v1.localeCompare(v2);
45
- if (!p1) return -1;
46
- if (!p2) return 1;
47
-
48
- if (p1.major !== p2.major) return p1.major - p2.major;
49
- if (p1.minor !== p2.minor) return p1.minor - p2.minor;
50
- if (p1.patch !== p2.patch) return p1.patch - p2.patch;
51
-
52
- // Prerelease comparison:
53
- // 1.0.0-alpha < 1.0.0 (version with prerelease is lower than version without)
54
- if (p1.prerelease && !p2.prerelease) return -1;
55
- if (!p1.prerelease && p2.prerelease) return 1;
56
- if (p1.prerelease && p2.prerelease) {
57
- return p1.prerelease.localeCompare(p2.prerelease);
58
- }
59
-
60
- return 0;
61
- }
62
-
63
- /**
64
- * Evaluates whether a concrete version satisfies a SemVer range specification.
65
- * Supports '^', '~', '>=', '<=', '<', '>', '*', 'x', space-separated and '||'.
66
- */
67
- export function satisfiesRange(version: string, range: string): boolean {
68
- if (!range || range === '*' || range === 'latest' || range === 'x') {
69
- return true;
70
- }
71
-
72
- const ver = parseSemVer(version);
73
- if (!ver) return false;
74
-
75
- // Handle disjunction (||)
76
- if (range.includes('||')) {
77
- return range.split('||').some(r => satisfiesRange(version, r.trim()));
78
- }
79
-
80
- // Handle conjunction (space separated conditions e.g. ">=14.0.0 <15.0.0")
81
- const clauses = range.trim().split(/\s+/).filter(Boolean);
82
- if (clauses.length > 1) {
83
- return clauses.every(c => satisfiesRange(version, c));
84
- }
85
-
86
- const single = clauses[0];
87
-
88
- // Caret ranges: ^14.2.0 -> >=14.2.0 <15.0.0 (or for 0.x: ^0.2.3 -> >=0.2.3 <0.3.0)
89
- if (single.startsWith('^')) {
90
- const base = parseSemVer(single.slice(1));
91
- if (!base) return false;
92
- if (ver.major !== base.major) return false;
93
- if (base.major === 0) {
94
- if (ver.minor !== base.minor) return false;
95
- return ver.patch >= base.patch;
96
- }
97
- if (ver.minor < base.minor) return false;
98
- if (ver.minor === base.minor && ver.patch < base.patch) return false;
99
- return true;
100
- }
101
-
102
- // Tilde ranges: ~14.2.0 -> >=14.2.0 <14.3.0
103
- if (single.startsWith('~')) {
104
- const base = parseSemVer(single.slice(1));
105
- if (!base) return false;
106
- if (ver.major !== base.major || ver.minor !== base.minor) return false;
107
- return ver.patch >= base.patch;
108
- }
109
-
110
- // Wildcard ranges: 14.x or 14.*
111
- const wildcardMatch = single.match(/^(\d+)(?:\.(\d+|\*|x))?(?:\.(\d+|\*|x))?$/);
112
- if (wildcardMatch) {
113
- const wMajor = parseInt(wildcardMatch[1], 10);
114
- const wMinor = wildcardMatch[2];
115
- if (ver.major !== wMajor) return false;
116
- if (wMinor && wMinor !== '*' && wMinor !== 'x') {
117
- if (ver.minor !== parseInt(wMinor, 10)) return false;
118
- }
119
- return true;
120
- }
121
-
122
- // Comparison operators: >=, <=, >, <, =
123
- const compMatch = single.match(/^(>=|<=|>|<|=)(.+)$/);
124
- if (compMatch) {
125
- const op = compMatch[1];
126
- const target = compMatch[2].trim();
127
- const cmp = compareVersions(version, target);
128
- if (op === '>=') return cmp >= 0;
129
- if (op === '<=') return cmp <= 0;
130
- if (op === '>') return cmp > 0;
131
- if (op === '<') return cmp < 0;
132
- if (op === '=') return cmp === 0;
133
- }
134
-
135
- // Direct equality check
136
- const targetVer = parseSemVer(single);
137
- if (targetVer) {
138
- return (
139
- ver.major === targetVer.major &&
140
- ver.minor === targetVer.minor &&
141
- ver.patch === targetVer.patch
142
- );
143
- }
144
-
145
- return false;
146
- }
147
-
148
- /**
149
- * Deterministically resolves a project's dependency version to the best available
150
- * documentation version using the hierarchical confidence ladder:
151
- * exact (1.0) -> major_minor (0.95) -> major (0.90) -> range (0.85) -> latest_fallback (0.50) -> unresolved (0.0)
152
- *
153
- * Never claims exact match when documentation is coarse (e.g. 'v14' or 'latest').
154
- */
155
- export function resolveDocVersion(
156
- projectVersion: string,
157
- availableDocVersions: string[],
158
- dependencyName: string = 'package'
159
- ): VersionResolutionResult {
160
- if (!availableDocVersions || availableDocVersions.length === 0) {
161
- return {
162
- dependencyName,
163
- projectVersion,
164
- selectedDocVersion: 'unresolved',
165
- matchType: 'unresolved',
166
- confidence: 0.0,
167
- availableVersions: [],
168
- };
169
- }
170
-
171
- const cleaned = projectVersion.replace(/^[\^~=v><\s]+/, '');
172
- const pVer = parseSemVer(projectVersion) || parseSemVer(cleaned);
173
- const cleanTarget = projectVersion.replace(/^[v=]/, '');
174
-
175
- // 1. Exact match (e.g. project '14.2.3' and doc '14.2.3' or 'v14.2.3')
176
- const exactMatch = availableDocVersions.find(v => {
177
- const c = v.replace(/^[v=]/, '');
178
- return c === cleanTarget;
179
- });
180
- if (exactMatch) {
181
- return {
182
- dependencyName,
183
- projectVersion,
184
- selectedDocVersion: exactMatch,
185
- matchType: 'exact',
186
- confidence: 1.0,
187
- availableVersions: availableDocVersions,
188
- };
189
- }
190
-
191
- if (pVer) {
192
- // 2. Major.Minor match (e.g. project '14.2.3' and doc 'v14.2' or '14.2')
193
- const mmTarget = `${pVer.major}.${pVer.minor}`;
194
- const mmMatch = availableDocVersions.find(v => {
195
- const c = v.replace(/^[v=]/, '');
196
- return c === mmTarget || c === `${mmTarget}.x`;
197
- });
198
- if (mmMatch) {
199
- return {
200
- dependencyName,
201
- projectVersion,
202
- selectedDocVersion: mmMatch,
203
- matchType: 'major_minor',
204
- confidence: 0.95,
205
- availableVersions: availableDocVersions,
206
- };
207
- }
208
-
209
- // 3. Major match (e.g. project '14.2.3' and doc 'v14', '14.x', or '14')
210
- const majorTarget = `${pVer.major}`;
211
- const majorMatch = availableDocVersions.find(v => {
212
- const c = v.replace(/^[v=]/, '');
213
- return c === majorTarget || c === `${majorTarget}.x` || c === `${majorTarget}.*`;
214
- });
215
- if (majorMatch) {
216
- return {
217
- dependencyName,
218
- projectVersion,
219
- selectedDocVersion: majorMatch,
220
- matchType: 'major',
221
- confidence: 0.90,
222
- availableVersions: availableDocVersions,
223
- };
224
- }
225
-
226
- // 4. SemVer range satisfaction (find doc version that satisfies project version range or vice versa)
227
- const rangeMatch = availableDocVersions
228
- .filter(v => !['latest', 'stable', 'current', 'main', 'default'].includes(v.toLowerCase()))
229
- .find(v => {
230
- return satisfiesRange(projectVersion, v) || satisfiesRange(v, projectVersion);
231
- });
232
- if (rangeMatch) {
233
- return {
234
- dependencyName,
235
- projectVersion,
236
- selectedDocVersion: rangeMatch,
237
- matchType: 'range',
238
- confidence: 0.85,
239
- availableVersions: availableDocVersions,
240
- };
241
- }
242
- }
243
-
244
- // 5. Fallback: 'latest' / 'stable' / 'current' or highest available version
245
- const latestCandidate = availableDocVersions.find(v =>
246
- ['latest', 'stable', 'current', 'main', 'default'].includes(v.toLowerCase())
247
- );
248
-
249
- const fallbackVersion = latestCandidate || availableDocVersions[0];
250
-
251
- return {
252
- dependencyName,
253
- projectVersion,
254
- selectedDocVersion: fallbackVersion,
255
- matchType: 'latest_fallback',
256
- confidence: 0.50,
257
- availableVersions: availableDocVersions,
258
- };
259
- }