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,238 +0,0 @@
1
- import type {
2
- DocDiffResult,
3
- ImpactAnalysisResult,
4
- VerificationResult,
5
- } from '../../shared/src/index.ts';
6
- import type { DocOrbitRepository } from '../../storage/src/index.ts';
7
- import { WorkspaceResolver } from '../../workspace/src/index.ts';
8
- import { CodeApiExtractor } from './extractor.ts';
9
- import { SchemaVerifier } from './verifier.ts';
10
- import { DocDiffEngine, type DiffOptions } from './diff-engine.ts';
11
- import { WorkspaceImpactScanner } from './impact-scanner.ts';
12
-
13
- export interface VerifyCodeRequest {
14
- code: string;
15
- language?: string;
16
- library?: string;
17
- version?: string;
18
- projectDir?: string;
19
- filePath?: string;
20
- }
21
-
22
- export class VerificationService {
23
- private repo: DocOrbitRepository;
24
- private extractor: CodeApiExtractor;
25
- private verifier: SchemaVerifier;
26
- private resolver: WorkspaceResolver;
27
-
28
- constructor(repo: DocOrbitRepository) {
29
- this.repo = repo;
30
- this.extractor = new CodeApiExtractor();
31
- this.verifier = new SchemaVerifier(repo);
32
- this.resolver = new WorkspaceResolver(repo);
33
- }
34
-
35
- verifyCode(request: VerifyCodeRequest): { result: VerificationResult; markdown: string } {
36
- let effectiveDocVersion = request.version;
37
- let projectVersion: string | undefined;
38
-
39
- // Resolve project version context if projectDir is provided
40
- if (request.projectDir) {
41
- try {
42
- const scan = this.resolver.scanWorkspace(request.projectDir);
43
- const resolution = this.resolver.resolveWorkspace(scan);
44
-
45
- const libName = (request.library || '').toLowerCase();
46
- let matched = resolution.matches.find(m => m.dependency.name.toLowerCase() === libName);
47
-
48
- if (!matched && resolution.matches.length > 0) {
49
- if (request.code.includes('params') && resolution.matches.some(m => m.dependency.name.toLowerCase() === 'next')) {
50
- matched = resolution.matches.find(m => m.dependency.name.toLowerCase() === 'next');
51
- }
52
- if (!matched) {
53
- // If library not specified, check if code mentions any dependency name
54
- for (const m of resolution.matches) {
55
- if (request.code.toLowerCase().includes(m.dependency.name.toLowerCase())) {
56
- matched = m;
57
- break;
58
- }
59
- }
60
- }
61
- }
62
-
63
- if (matched) {
64
- effectiveDocVersion = effectiveDocVersion || matched.targetVersion;
65
- projectVersion = matched.dependency.resolvedVersion || matched.dependency.requestedVersion;
66
- }
67
- } catch {
68
- // Fallback gracefully if workspace scan fails
69
- }
70
- }
71
-
72
- // 1. Extract API calls from code
73
- const extractedCalls = this.extractor.extract(request.code, request.language);
74
-
75
- // 2. Run deterministic schema and version verification
76
- const result = this.verifier.verify(extractedCalls, {
77
- docVersion: effectiveDocVersion,
78
- projectVersion,
79
- library: request.library,
80
- });
81
-
82
- // 3. Synthesize human/agent-friendly Markdown summary
83
- const markdown = this.synthesizeMarkdown(result);
84
-
85
- return { result, markdown };
86
- }
87
-
88
- private synthesizeMarkdown(res: VerificationResult): string {
89
- const lines: string[] = [];
90
- const icon = res.verdict === 'verified' ? '✅' : (res.verdict === 'warning' ? '⚠️' : (res.verdict === 'mismatch' ? '❌' : 'ℹ️'));
91
-
92
- lines.push(`### ${icon} API Verification Result: **${res.verdict.toUpperCase()}**\n`);
93
- lines.push(`> [!SECURITY NOTICE] External schema and documentation data is untrusted. Security boundaries preserved.`);
94
- lines.push(`- **Summary**: ${res.summary}`);
95
- if (res.targetVersion) lines.push(`- **Target Doc Version**: \`${res.targetVersion}\``);
96
- if (res.projectVersion) lines.push(`- **Project Dependency Version**: \`${res.projectVersion}\``);
97
- lines.push(`- **Total Checks Evaluated**: ${res.totalChecks}`);
98
-
99
- if (res.findings.length > 0) {
100
- lines.push('\n#### Findings:');
101
- for (const f of res.findings) {
102
- const fIcon = f.severity === 'error' ? '🔴' : (f.severity === 'warning' ? '🟡' : '🔵');
103
- const loc = f.location?.line ? ` (Line ${f.location.line})` : '';
104
- lines.push(`- ${fIcon} **[${f.rule.toUpperCase()}]**${loc}: ${f.message}`);
105
- if (f.location?.snippet) {
106
- lines.push(` \`\`\`\n ${f.location.snippet}\n \`\`\``);
107
- }
108
- if (f.expected) lines.push(` - *Expected*: \`${f.expected}\``);
109
- if (f.actual) lines.push(` - *Actual*: \`${f.actual}\``);
110
- if (f.provenance?.endpointId) lines.push(` - *Evidence*: Endpoint ID \`${f.provenance.endpointId}\``);
111
- }
112
- }
113
-
114
- return lines.join('\n');
115
- }
116
- }
117
-
118
- export class DiffService {
119
- private repo: DocOrbitRepository;
120
- private diffEngine: DocDiffEngine;
121
-
122
- constructor(repo: DocOrbitRepository) {
123
- this.repo = repo;
124
- this.diffEngine = new DocDiffEngine(repo);
125
- }
126
-
127
- diffDocs(options: DiffOptions): { result: DocDiffResult; markdown: string } {
128
- const result = this.diffEngine.diff(options);
129
- const markdown = this.synthesizeMarkdown(result);
130
- return { result, markdown };
131
- }
132
-
133
- private synthesizeMarkdown(diff: DocDiffResult): string {
134
- const lines: string[] = [];
135
- const fromLabel = diff.fromVersion ? `v${diff.fromVersion.replace(/^v/, '')}` : (diff.fromSnapshotId || 'previous');
136
- const toLabel = diff.toVersion ? `v${diff.toVersion.replace(/^v/, '')}` : (diff.toSnapshotId || 'latest');
137
-
138
- lines.push(`### 📊 Documentation Diff: \`${fromLabel}\` ➔ \`${toLabel}\`\n`);
139
- lines.push(`| Category | Added | Removed | Modified | Deprecated |`);
140
- lines.push(`| :--- | :---: | :---: | :---: | :---: |`);
141
- lines.push(`| **Endpoints** | ${diff.summary.endpointsAdded} | ${diff.summary.endpointsRemoved} | ${diff.summary.endpointsModified} | ${diff.summary.endpointsDeprecated} |`);
142
- lines.push(`| **Pitfalls** | ${diff.summary.pitfallsAdded} | ${diff.summary.pitfallsRemoved} | - | - |`);
143
- lines.push(`| **Sections** | - | - | ${diff.summary.contentChanged} | - |\n`);
144
-
145
- if (diff.apiChanges.length > 0) {
146
- lines.push('#### API Endpoint Changes:');
147
- for (const ch of diff.apiChanges) {
148
- const badge = ch.changeType === 'added' ? '🟢 ADDED' : (ch.changeType === 'removed' ? '🔴 REMOVED' : (ch.changeType === 'deprecated' ? '🟡 DEPRECATED' : '🔵 MODIFIED'));
149
- lines.push(`- **[${badge}]** \`${ch.method.toUpperCase()} ${ch.path}\``);
150
- if (ch.changes && ch.changes.length > 0) {
151
- for (const detail of ch.changes) {
152
- lines.push(` - ${detail}`);
153
- }
154
- }
155
- }
156
- }
157
-
158
- if (diff.pitfallChanges.length > 0) {
159
- lines.push('\n#### Pitfall & Deprecation Changes:');
160
- for (const p of diff.pitfallChanges) {
161
- const badge = p.changeType === 'added' ? '⚠️ NEW' : 'REMOVED';
162
- lines.push(`- **[${badge}]** \`${p.pitfall.kind}\`: ${p.pitfall.title}`);
163
- }
164
- }
165
-
166
- return lines.join('\n');
167
- }
168
- }
169
-
170
- export class ImpactAnalysisService {
171
- private repo?: DocOrbitRepository;
172
- private diffService?: DiffService;
173
- private scanner: WorkspaceImpactScanner;
174
-
175
- constructor(repo?: DocOrbitRepository) {
176
- this.repo = repo;
177
- if (repo) {
178
- this.diffService = new DiffService(repo);
179
- }
180
- this.scanner = new WorkspaceImpactScanner();
181
- }
182
-
183
- analyzeWorkspaceImpact(projectDir: string, diff: DocDiffResult): { structured: ImpactAnalysisResult; markdown: string } {
184
- const structured = this.scanner.scan(projectDir, diff);
185
- const markdown = this.synthesizeMarkdown(structured);
186
- return { structured, markdown };
187
- }
188
-
189
- analyzeImpact(options: {
190
- projectDir: string;
191
- fromVersion?: string;
192
- toVersion?: string;
193
- fromSnapshotId?: string;
194
- toSnapshotId?: string;
195
- sourceId?: string;
196
- }): { result: ImpactAnalysisResult; markdown: string } {
197
- if (!this.diffService) {
198
- throw new Error('Repository is required for diff-based impact analysis');
199
- }
200
- const { result: diff } = this.diffService.diffDocs({
201
- fromVersion: options.fromVersion,
202
- toVersion: options.toVersion,
203
- fromSnapshotId: options.fromSnapshotId,
204
- toSnapshotId: options.toSnapshotId,
205
- sourceId: options.sourceId,
206
- });
207
-
208
- const result = this.scanner.scan(options.projectDir, diff);
209
- const markdown = this.synthesizeMarkdown(result);
210
-
211
- return { result, markdown };
212
- }
213
-
214
- private synthesizeMarkdown(res: ImpactAnalysisResult): string {
215
- const lines: string[] = [];
216
- lines.push(`### 🔍 Project Impact Analysis`);
217
- lines.push(`- **Scanned Workspace**: \`${res.projectDir}\``);
218
- lines.push(`- **Files Scanned**: ${res.totalFilesScanned}`);
219
- lines.push(`- **Impacted Files**: ${res.affectedFilesCount}`);
220
- lines.push(`- **Total Affected Locations**: ${res.affectedLocations.length}\n`);
221
-
222
- if (res.affectedLocations.length === 0) {
223
- lines.push(`✅ No breaking changes or deprecated API usages detected in current project files.`);
224
- return lines.join('\n');
225
- }
226
-
227
- lines.push(`#### Affected Locations:\n`);
228
- for (const loc of res.affectedLocations) {
229
- const certBadge = loc.certainty === 'high' ? '🎯 High Certainty' : (loc.certainty === 'medium' ? '⚖️ Medium' : '🔎 Heuristic');
230
- lines.push(`- **\`${loc.filePath}:${loc.line}\`** (${certBadge}, Confidence: ${Math.round(loc.confidence * 100)}%)`);
231
- lines.push(` - **Reason**: ${loc.reason}`);
232
- lines.push(` - **Matched**: \`${loc.matchedPattern}\``);
233
- lines.push(` \`\`\`\n ${loc.snippet}\n \`\`\``);
234
- }
235
-
236
- return lines.join('\n');
237
- }
238
- }
@@ -1,375 +0,0 @@
1
- import type {
2
- ApiEndpoint,
3
- ExtractedApiCall,
4
- Pitfall,
5
- VerificationFinding,
6
- VerificationResult,
7
- VerificationStatus,
8
- } from '../../shared/src/index.ts';
9
- import type { DocOrbitRepository } from '../../storage/src/index.ts';
10
- import { matchEndpointPath } from './extractor.ts';
11
-
12
- export interface VerifierOptions {
13
- docVersion?: string;
14
- projectVersion?: string;
15
- library?: string;
16
- }
17
-
18
- export class SchemaVerifier {
19
- private repo: DocOrbitRepository;
20
-
21
- constructor(repo: DocOrbitRepository) {
22
- this.repo = repo;
23
- }
24
-
25
- verify(calls: ExtractedApiCall[], options: VerifierOptions = {}): VerificationResult {
26
- const findings: VerificationFinding[] = [];
27
- const docVersion = options.docVersion;
28
- const projectVersion = options.projectVersion;
29
-
30
- // Load available endpoints and pitfalls for target version
31
- const allEndpoints = this.repo.searchApiEndpoints('', {
32
- docVersion,
33
- limit: 200,
34
- });
35
- const allPitfalls = this.repo.searchPitfalls('', {
36
- docVersion,
37
- limit: 100,
38
- });
39
-
40
- let totalChecks = 0;
41
-
42
- for (let i = 0; i < calls.length; i++) {
43
- const call = calls[i];
44
-
45
- // Handle ambiguous or unsupported calls
46
- if (call.isDynamicOrAmbiguous) {
47
- totalChecks++;
48
- findings.push({
49
- id: `find_ambiguous_${i}`,
50
- rule: 'endpoint_validity',
51
- severity: 'info',
52
- status: 'insufficient_evidence',
53
- message: call.reasonIfAmbiguous || 'Unable to statically verify dynamic or unsupported expression.',
54
- location: {
55
- line: call.line,
56
- snippet: call.rawSnippet,
57
- },
58
- confidence: 0.5,
59
- });
60
- continue;
61
- }
62
-
63
- // 1. Next.js Version Syntax Checks
64
- if (call.symbol?.startsWith('nextjs_route_params')) {
65
- this.verifyNextJsParams(call, projectVersion || docVersion, findings, i);
66
- totalChecks++;
67
- continue;
68
- }
69
-
70
- // If no endpoint path was extracted
71
- if (!call.endpointPath) {
72
- totalChecks++;
73
- findings.push({
74
- id: `find_no_path_${i}`,
75
- rule: 'endpoint_validity',
76
- severity: 'info',
77
- status: 'insufficient_evidence',
78
- message: 'No API path could be extracted from code call.',
79
- location: { line: call.line, snippet: call.rawSnippet },
80
- confidence: 0.5,
81
- });
82
- continue;
83
- }
84
-
85
- // 2. Endpoint Path Match
86
- const matchedEndpoints = allEndpoints.filter(ep =>
87
- matchEndpointPath(call.endpointPath!, ep.path)
88
- );
89
-
90
- if (matchedEndpoints.length === 0) {
91
- totalChecks++;
92
- // Check if endpoint exists in ANY version (to see if removed)
93
- const removedCheck = this.repo.searchApiEndpoints(call.endpointPath!, { limit: 5 });
94
- const removedPitfall = allPitfalls.find(
95
- p => p.kind === 'removed' && (p.relatedApi?.includes(call.endpointPath!) || p.content.includes(call.endpointPath!))
96
- );
97
-
98
- if (removedCheck.length > 0 || removedPitfall) {
99
- findings.push({
100
- id: `find_removed_${i}`,
101
- rule: 'removed_api',
102
- severity: 'error',
103
- status: 'mismatch',
104
- message: `Endpoint "${call.endpointPath}" was removed in API version ${docVersion || 'target'}.`,
105
- location: { line: call.line, snippet: call.rawSnippet },
106
- docVersion,
107
- provenance: removedCheck[0]?.provenance ? {
108
- sourceUrl: removedCheck[0].provenance.sourceUrl,
109
- endpointId: removedCheck[0].id,
110
- } : undefined,
111
- confidence: 0.95,
112
- });
113
- } else {
114
- findings.push({
115
- id: `find_endpoint_${i}`,
116
- rule: 'endpoint_validity',
117
- severity: 'error',
118
- status: 'mismatch',
119
- message: `Endpoint "${call.endpointPath}" does not exist in API documentation (version: ${docVersion || 'latest'}).`,
120
- location: { line: call.line, snippet: call.rawSnippet },
121
- docVersion,
122
- confidence: 0.9,
123
- });
124
- }
125
- continue;
126
- }
127
-
128
- // 3. HTTP Method Match
129
- const methodLower = (call.method || 'get').toLowerCase();
130
- const exactMethodEp = matchedEndpoints.find(ep => ep.method.toLowerCase() === methodLower);
131
-
132
- totalChecks++;
133
- if (!exactMethodEp) {
134
- const allowed = matchedEndpoints.map(ep => ep.method.toUpperCase()).join(', ');
135
- findings.push({
136
- id: `find_method_${i}`,
137
- rule: 'method_validity',
138
- severity: 'error',
139
- status: 'mismatch',
140
- message: `Endpoint "${call.endpointPath}" does not support HTTP method "${methodLower.toUpperCase()}". Supported methods: [${allowed}].`,
141
- location: { line: call.line, snippet: call.rawSnippet },
142
- expected: allowed,
143
- actual: methodLower.toUpperCase(),
144
- docVersion,
145
- provenance: matchedEndpoints[0].provenance ? {
146
- sourceUrl: matchedEndpoints[0].provenance.sourceUrl,
147
- endpointId: matchedEndpoints[0].id,
148
- } : undefined,
149
- confidence: 0.95,
150
- });
151
- continue;
152
- }
153
-
154
- // 4. Deprecation Checks
155
- totalChecks++;
156
- if (exactMethodEp.deprecated) {
157
- findings.push({
158
- id: `find_dep_${i}`,
159
- rule: 'deprecation',
160
- severity: 'warning',
161
- status: 'warning',
162
- message: `Endpoint "${exactMethodEp.method.toUpperCase()} ${exactMethodEp.path}" is deprecated in documentation (version: ${docVersion || 'current'}).`,
163
- location: { line: call.line, snippet: call.rawSnippet },
164
- docVersion,
165
- provenance: exactMethodEp.provenance ? {
166
- sourceUrl: exactMethodEp.provenance.sourceUrl,
167
- endpointId: exactMethodEp.id,
168
- } : undefined,
169
- confidence: 1.0,
170
- });
171
- }
172
-
173
- // Check for related deprecation pitfalls
174
- const depPitfall = allPitfalls.find(
175
- p => p.kind === 'deprecated' && (p.relatedApi?.includes(exactMethodEp.path) || p.content.includes(exactMethodEp.path))
176
- );
177
- if (depPitfall) {
178
- findings.push({
179
- id: `find_dep_pit_${i}`,
180
- rule: 'deprecation',
181
- severity: 'warning',
182
- status: 'warning',
183
- message: `Deprecation notice for ${exactMethodEp.path}: ${depPitfall.title}`,
184
- location: { line: call.line, snippet: call.rawSnippet },
185
- docVersion,
186
- provenance: depPitfall.provenance ? {
187
- sourceUrl: depPitfall.provenance.sourceUrl,
188
- pitfallId: depPitfall.id,
189
- } : undefined,
190
- confidence: 0.9,
191
- });
192
- }
193
-
194
- // 5. Required Parameters & Body Fields
195
- totalChecks++;
196
- this.verifyParameters(call, exactMethodEp, findings, i, docVersion);
197
-
198
- // 6. Response Assumptions
199
- if (call.responseFieldsAccessed && call.responseFieldsAccessed.length > 0 && exactMethodEp.responseSchema) {
200
- totalChecks++;
201
- this.verifyResponseFields(call, exactMethodEp, findings, i, docVersion);
202
- }
203
- }
204
-
205
- // Determine overall verdict
206
- let verdict: VerificationStatus = 'verified';
207
- if (findings.some(f => f.status === 'mismatch')) {
208
- verdict = 'mismatch';
209
- } else if (findings.some(f => f.status === 'warning')) {
210
- verdict = 'warning';
211
- } else if (findings.length > 0 && findings.every(f => f.status === 'insufficient_evidence')) {
212
- verdict = 'insufficient_evidence';
213
- }
214
-
215
- // Build summary string
216
- let summary: string;
217
- const mismatches = findings.filter(f => f.status === 'mismatch').length;
218
- const warnings = findings.filter(f => f.status === 'warning').length;
219
-
220
- if (verdict === 'verified') {
221
- summary = `All ${totalChecks} check(s) verified successfully against API documentation${docVersion ? ` (${docVersion})` : ''}.`;
222
- } else if (verdict === 'mismatch') {
223
- summary = `Verification failed with ${mismatches} mismatch(es) and ${warnings} warning(s).`;
224
- } else if (verdict === 'warning') {
225
- summary = `Verification passed with ${warnings} warning(s) (e.g. deprecated APIs or unverified fields).`;
226
- } else {
227
- summary = 'Verification inconclusive: insufficient evidence or unsupported expressions in code.';
228
- }
229
-
230
- return {
231
- verdict,
232
- summary,
233
- targetVersion: docVersion,
234
- projectVersion,
235
- matchedLibrary: options.library,
236
- findings,
237
- extractedCalls: calls,
238
- totalChecks,
239
- untrusted: true,
240
- };
241
- }
242
-
243
- private verifyParameters(
244
- call: ExtractedApiCall,
245
- ep: ApiEndpoint,
246
- findings: VerificationFinding[],
247
- idx: number,
248
- docVersion?: string
249
- ): void {
250
- const requiredParams = ep.parameters.filter(p => p.required);
251
- const bodyFields = new Set(call.bodyFields || []);
252
-
253
- // Check required query/path parameters
254
- for (const req of requiredParams) {
255
- if (req.in === 'path') {
256
- // Path parameters are verified by URL structure match
257
- continue;
258
- }
259
- if (!bodyFields.has(req.name) && !(call.parameters && req.name in call.parameters)) {
260
- findings.push({
261
- id: `find_req_param_${idx}_${req.name}`,
262
- rule: 'required_parameters',
263
- severity: 'error',
264
- status: 'mismatch',
265
- message: `Missing required parameter "${req.name}" (${req.in}) for ${ep.method.toUpperCase()} ${ep.path}.`,
266
- location: { line: call.line, snippet: call.rawSnippet },
267
- expected: req.name,
268
- docVersion,
269
- provenance: ep.provenance ? {
270
- sourceUrl: ep.provenance.sourceUrl,
271
- endpointId: ep.id,
272
- } : undefined,
273
- confidence: 0.95,
274
- });
275
- }
276
- }
277
-
278
- // Check request body schema required fields
279
- if (ep.requestSchema?.required && Array.isArray(ep.requestSchema.required)) {
280
- for (const reqField of ep.requestSchema.required) {
281
- if (!bodyFields.has(reqField)) {
282
- findings.push({
283
- id: `find_req_body_${idx}_${reqField}`,
284
- rule: 'required_parameters',
285
- severity: 'error',
286
- status: 'mismatch',
287
- message: `Missing required body field "${reqField}" for ${ep.method.toUpperCase()} ${ep.path}.`,
288
- location: { line: call.line, snippet: call.rawSnippet },
289
- expected: reqField,
290
- docVersion,
291
- provenance: ep.provenance ? {
292
- sourceUrl: ep.provenance.sourceUrl,
293
- endpointId: ep.id,
294
- } : undefined,
295
- confidence: 0.95,
296
- });
297
- }
298
- }
299
- }
300
- }
301
-
302
- private verifyResponseFields(
303
- call: ExtractedApiCall,
304
- ep: ApiEndpoint,
305
- findings: VerificationFinding[],
306
- idx: number,
307
- docVersion?: string
308
- ): void {
309
- // Collect all documented response property names across 200/201 schemas
310
- const documentedProps = new Set<string>();
311
- for (const [status, resp] of Object.entries(ep.responseSchema || {})) {
312
- if (status.startsWith('2') && resp.schema?.properties) {
313
- for (const propName of Object.keys(resp.schema.properties)) {
314
- documentedProps.add(propName);
315
- }
316
- }
317
- }
318
-
319
- if (documentedProps.size === 0) return;
320
-
321
- for (const accessedField of call.responseFieldsAccessed || []) {
322
- if (!documentedProps.has(accessedField)) {
323
- findings.push({
324
- id: `find_resp_${idx}_${accessedField}`,
325
- rule: 'response_assumption',
326
- severity: 'warning',
327
- status: 'warning',
328
- message: `Field "${accessedField}" accessed from response is not in documented 2xx response schema for ${ep.method.toUpperCase()} ${ep.path}.`,
329
- location: { line: call.line, snippet: call.rawSnippet },
330
- actual: accessedField,
331
- docVersion,
332
- provenance: ep.provenance ? {
333
- sourceUrl: ep.provenance.sourceUrl,
334
- endpointId: ep.id,
335
- } : undefined,
336
- confidence: 0.75,
337
- });
338
- }
339
- }
340
- }
341
-
342
- private verifyNextJsParams(
343
- call: ExtractedApiCall,
344
- version: string | undefined,
345
- findings: VerificationFinding[],
346
- idx: number
347
- ): void {
348
- const isV14 = version?.includes('14') || version?.startsWith('v14');
349
- const isV15OrAbove = version?.includes('15') || version?.includes('16') || version?.startsWith('v15') || version?.startsWith('v16');
350
-
351
- if (call.symbol === 'nextjs_route_params_async' && isV14) {
352
- findings.push({
353
- id: `find_nextjs_${idx}`,
354
- rule: 'version_mismatch',
355
- severity: 'error',
356
- status: 'mismatch',
357
- message: 'Next.js 14 requires synchronous route params ("params.slug"). "await params" is only supported in Next.js 15+.',
358
- location: { line: call.line, snippet: call.rawSnippet },
359
- docVersion: version,
360
- confidence: 0.95,
361
- });
362
- } else if (call.symbol === 'nextjs_route_params_sync' && isV15OrAbove) {
363
- findings.push({
364
- id: `find_nextjs_${idx}`,
365
- rule: 'deprecation',
366
- severity: 'warning',
367
- status: 'warning',
368
- message: 'Synchronous route params ("params.slug") is deprecated in Next.js 15 and removed in Next.js 16. Use "await params".',
369
- location: { line: call.line, snippet: call.rawSnippet },
370
- docVersion: version,
371
- confidence: 0.95,
372
- });
373
- }
374
- }
375
- }