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,339 +0,0 @@
1
- import type { ExtractedApiCall } from '../../shared/src/index.ts';
2
-
3
- /**
4
- * Normalizes an API path for comparison against schema paths.
5
- * E.g. extracts pathname from full URLs ("https://api.stripe.com/v1/webhook_endpoints" -> "/v1/webhook_endpoints")
6
- */
7
- export function normalizeApiPath(urlOrPath: string): string {
8
- try {
9
- if (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://')) {
10
- const parsed = new URL(urlOrPath);
11
- return parsed.pathname;
12
- }
13
- } catch {
14
- // Fall back to regex
15
- }
16
- const match = urlOrPath.match(/^https?:\/\/[^/]+(\/.*)$/);
17
- if (match) return match[1].split('?')[0];
18
- return urlOrPath.split('?')[0].trim();
19
- }
20
-
21
- /**
22
- * Checks if an extracted path matches an OpenAPI schema path template.
23
- * E.g. candidate "/v1/webhook_endpoints/we_123" matches schema "/v1/webhook_endpoints/{id}"
24
- */
25
- export function matchEndpointPath(candidatePath: string, schemaPath: string): boolean {
26
- const normCandidate = normalizeApiPath(candidatePath).replace(/\/+$/, '');
27
- const normSchema = normalizeApiPath(schemaPath).replace(/\/+$/, '');
28
-
29
- if (normCandidate.toLowerCase() === normSchema.toLowerCase()) {
30
- return true;
31
- }
32
-
33
- // Convert schema {param} or :param to regex wildcard
34
- const regexPattern = normSchema
35
- .replace(/{[^}]+}/g, '([^/]+)')
36
- .replace(/:[a-zA-Z0-9_]+/g, '([^/]+)')
37
- .replace(/\//g, '\\/');
38
-
39
- const regex = new RegExp(`^${regexPattern}$`, 'i');
40
- return regex.test(normCandidate);
41
- }
42
-
43
- /**
44
- * Extracts top-level key names from a JS/Python object or JSON snippet string.
45
- */
46
- function extractObjectKeys(objSnippet: string): string[] {
47
- const keys: Set<string> = new Set();
48
- // Try standard JSON parse first
49
- try {
50
- const parsed = JSON.parse(objSnippet);
51
- if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
52
- return Object.keys(parsed);
53
- }
54
- } catch {
55
- // Fall back to lexical key extraction
56
- }
57
-
58
- // Match identifier keys: { foo: ..., "bar": ..., 'baz': ... }
59
- const keyRegex = /(?:[{,]\s*)(?:["']?([a-zA-Z0-9_-]+)["']?)\s*:/g;
60
- let match: RegExpExecArray | null;
61
- while ((match = keyRegex.exec(objSnippet)) !== null) {
62
- if (match[1] && !['method', 'headers', 'body'].includes(match[1])) {
63
- keys.add(match[1]);
64
- }
65
- }
66
-
67
- return Array.from(keys);
68
- }
69
-
70
- /**
71
- * Deterministically extracts API calls, parameters, methods, and version syntax from code.
72
- */
73
- export class CodeApiExtractor {
74
- /**
75
- * Extracts API calls from code.
76
- */
77
- extract(code: string, language?: string): ExtractedApiCall[] {
78
- const results: ExtractedApiCall[] = [];
79
- const lines = code.split('\n');
80
-
81
- // 1. Check for Next.js Route Params patterns (sync vs async)
82
- this.extractNextJsParams(code, lines, results);
83
-
84
- // 2. Extract Fetch calls: fetch('url', { method: 'POST', body: ... })
85
- this.extractFetchCalls(code, lines, results);
86
-
87
- // 3. Extract Axios calls: axios.post('url', {...}) / axios.get('url')
88
- this.extractAxiosCalls(code, lines, results);
89
-
90
- // 4. Extract Python Requests calls: requests.post('url', json={...})
91
- this.extractPythonRequestsCalls(code, lines, results);
92
-
93
- // 5. Extract cURL commands: curl -X POST ...
94
- this.extractCurlCalls(code, lines, results);
95
-
96
- // 6. Extract common SDK calls: stripe.webhookEndpoints.create({...}), etc.
97
- this.extractSdkCalls(code, lines, results);
98
-
99
- // 7. Check for dynamic / unresolvable URLs: e.g. fetch(apiUrl) or axios.get(endpoint)
100
- this.extractDynamicCalls(code, lines, results);
101
-
102
- // If nothing was extracted at all, create an ambiguous marker
103
- if (results.length === 0) {
104
- results.push({
105
- rawSnippet: code.slice(0, 150),
106
- isDynamicOrAmbiguous: true,
107
- reasonIfAmbiguous: language && !['javascript', 'typescript', 'python', 'curl', 'bash'].includes(language.toLowerCase())
108
- ? `Language "${language}" is not currently supported for deep AST schema verification.`
109
- : 'No recognizable HTTP/API client calls, SDK invocations, or endpoint paths found in code.',
110
- language,
111
- });
112
- }
113
-
114
- return results;
115
- }
116
-
117
- private findLineNumber(lines: string[], snippetPattern: string): number {
118
- const clean = snippetPattern.trim().split('\n')[0].slice(0, 40);
119
- for (let i = 0; i < lines.length; i++) {
120
- if (lines[i].includes(clean)) return i + 1;
121
- }
122
- return 1;
123
- }
124
-
125
- private extractNextJsParams(code: string, lines: string[], results: ExtractedApiCall[]): void {
126
- // Next.js 14 sync: params.slug, const { slug } = params
127
- const syncParamRegex = /(?:const\s+{\s*([^}]+)\s*}\s*=\s*params\b|\bparams\.([a-zA-Z0-9_]+))/;
128
- // Next.js 15+ async: await params, const { slug } = await params
129
- const asyncParamRegex = /(?:await\s+params\b|const\s+{\s*([^}]+)\s*}\s*=\s*await\s+params\b)/;
130
-
131
- const hasAsync = asyncParamRegex.test(code);
132
- const hasSync = syncParamRegex.test(code) && !hasAsync;
133
-
134
- if (hasAsync) {
135
- const match = code.match(asyncParamRegex);
136
- results.push({
137
- symbol: 'nextjs_route_params_async',
138
- endpointPath: 'nextjs/app_router/params',
139
- method: 'get',
140
- rawSnippet: match ? match[0] : 'await params',
141
- line: match ? this.findLineNumber(lines, match[0]) : 1,
142
- });
143
- } else if (hasSync) {
144
- const match = code.match(syncParamRegex);
145
- results.push({
146
- symbol: 'nextjs_route_params_sync',
147
- endpointPath: 'nextjs/app_router/params',
148
- method: 'get',
149
- rawSnippet: match ? match[0] : 'params.slug',
150
- line: match ? this.findLineNumber(lines, match[0]) : 1,
151
- });
152
- }
153
- }
154
-
155
- private extractFetchCalls(code: string, lines: string[], results: ExtractedApiCall[]): void {
156
- // Matches: fetch(['"`]([^'"`]+)['"`](?:\s*,\s*({[\s\S]*?}))?\s*\)
157
- const fetchRegex = /fetch\s*\(\s*['"`]([^'"`]+)['"`](?:\s*,\s*({[\s\S]*?}))?\s*\)/g;
158
- let match: RegExpExecArray | null;
159
-
160
- while ((match = fetchRegex.exec(code)) !== null) {
161
- const url = match[1];
162
- const optionsSnippet = match[2] || '';
163
- const endpointPath = normalizeApiPath(url);
164
-
165
- let method = 'get';
166
- const methodMatch = optionsSnippet.match(/method\s*:\s*['"]([a-zA-Z]+)['"]/i);
167
- if (methodMatch) {
168
- method = methodMatch[1].toLowerCase();
169
- }
170
-
171
- // Extract body fields if body: JSON.stringify({...}) or body: {...}
172
- let bodyFields: string[] = [];
173
- const bodyMatch = optionsSnippet.match(/body\s*:\s*(?:JSON\.stringify\s*\(\s*)?({[\s\S]*?})(?:\s*\))?/);
174
- if (bodyMatch) {
175
- bodyFields = extractObjectKeys(bodyMatch[1]);
176
- }
177
-
178
- // Extract response fields accessed: e.g. data.foo, res.json()
179
- const responseFields = this.extractResponseFields(code, endpointPath);
180
-
181
- results.push({
182
- endpointPath,
183
- method,
184
- bodyFields,
185
- responseFieldsAccessed: responseFields,
186
- rawSnippet: match[0],
187
- line: this.findLineNumber(lines, match[0]),
188
- language: 'javascript',
189
- });
190
- }
191
- }
192
-
193
- private extractAxiosCalls(code: string, lines: string[], results: ExtractedApiCall[]): void {
194
- // Matches: axios.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`](?:\s*,\s*({[\s\S]*?}))?/g
195
- const axiosRegex = /axios\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`](?:\s*,\s*({[\s\S]*?}))?/g;
196
- let match: RegExpExecArray | null;
197
-
198
- while ((match = axiosRegex.exec(code)) !== null) {
199
- const method = match[1].toLowerCase();
200
- const url = match[2];
201
- const payloadSnippet = match[3] || '';
202
- const endpointPath = normalizeApiPath(url);
203
- const bodyFields = payloadSnippet ? extractObjectKeys(payloadSnippet) : [];
204
- const responseFields = this.extractResponseFields(code, endpointPath);
205
-
206
- results.push({
207
- endpointPath,
208
- method,
209
- bodyFields,
210
- responseFieldsAccessed: responseFields,
211
- rawSnippet: match[0],
212
- line: this.findLineNumber(lines, match[0]),
213
- language: 'javascript',
214
- });
215
- }
216
- }
217
-
218
- private extractPythonRequestsCalls(code: string, lines: string[], results: ExtractedApiCall[]): void {
219
- // Matches: requests.(get|post|put|delete|patch)\s*\(\s*['"]([^'"]+)['"](?:\s*,\s*(?:json|data)\s*=\s*({[\s\S]*?}))?
220
- const requestsRegex = /requests\.(get|post|put|delete|patch)\s*\(\s*['"]([^'"]+)['"](?:\s*,\s*(?:json|data|params)\s*=\s*({[\s\S]*?}))?/g;
221
- let match: RegExpExecArray | null;
222
-
223
- while ((match = requestsRegex.exec(code)) !== null) {
224
- const method = match[1].toLowerCase();
225
- const url = match[2];
226
- const payloadSnippet = match[3] || '';
227
- const endpointPath = normalizeApiPath(url);
228
- const bodyFields = payloadSnippet ? extractObjectKeys(payloadSnippet) : [];
229
-
230
- results.push({
231
- endpointPath,
232
- method,
233
- bodyFields,
234
- rawSnippet: match[0],
235
- line: this.findLineNumber(lines, match[0]),
236
- language: 'python',
237
- });
238
- }
239
- }
240
-
241
- private extractCurlCalls(code: string, lines: string[], results: ExtractedApiCall[]): void {
242
- // Matches: curl ... https://... -X POST -d '{...}'
243
- const curlRegex = /curl\s+([^\n]+)/g;
244
- let match: RegExpExecArray | null;
245
-
246
- while ((match = curlRegex.exec(code)) !== null) {
247
- const fullCmd = match[1];
248
- const urlMatch = fullCmd.match(/https?:\/\/[^\s'"]+/);
249
- if (!urlMatch) continue;
250
-
251
- const endpointPath = normalizeApiPath(urlMatch[0]);
252
- let method = 'get';
253
- const methodMatch = fullCmd.match(/-X\s+([A-Z]+)/i);
254
- if (methodMatch) {
255
- method = methodMatch[1].toLowerCase();
256
- } else if (fullCmd.includes('-d ') || fullCmd.includes('--data')) {
257
- method = 'post';
258
- }
259
-
260
- let bodyFields: string[] = [];
261
- const dataMatch = fullCmd.match(/(?:-d|--data(?:-raw)?)\s+['"]({[\s\S]*?})['"]/);
262
- if (dataMatch) {
263
- bodyFields = extractObjectKeys(dataMatch[1]);
264
- }
265
-
266
- results.push({
267
- endpointPath,
268
- method,
269
- bodyFields,
270
- rawSnippet: match[0],
271
- line: this.findLineNumber(lines, match[0]),
272
- language: 'curl',
273
- });
274
- }
275
- }
276
-
277
- private extractSdkCalls(code: string, lines: string[], results: ExtractedApiCall[]): void {
278
- // Stripe SDK: stripe.webhookEndpoints.create({...})
279
- const stripeWebhookRegex = /stripe\.webhookEndpoints\.create\s*\(\s*({[\s\S]*?})\s*\)/g;
280
- let match: RegExpExecArray | null;
281
- while ((match = stripeWebhookRegex.exec(code)) !== null) {
282
- const bodyFields = extractObjectKeys(match[1]);
283
- results.push({
284
- endpointPath: '/v1/webhook_endpoints',
285
- method: 'post',
286
- symbol: 'stripe.webhookEndpoints.create',
287
- bodyFields,
288
- rawSnippet: match[0],
289
- line: this.findLineNumber(lines, match[0]),
290
- });
291
- }
292
-
293
- // Stripe SDK: stripe.charges.create({...})
294
- const stripeChargesRegex = /stripe\.charges\.create\s*\(\s*({[\s\S]*?})\s*\)/g;
295
- while ((match = stripeChargesRegex.exec(code)) !== null) {
296
- const bodyFields = extractObjectKeys(match[1]);
297
- results.push({
298
- endpointPath: '/v1/charges',
299
- method: 'post',
300
- symbol: 'stripe.charges.create',
301
- bodyFields,
302
- rawSnippet: match[0],
303
- line: this.findLineNumber(lines, match[0]),
304
- });
305
- }
306
- }
307
-
308
- private extractDynamicCalls(code: string, lines: string[], results: ExtractedApiCall[]): void {
309
- // Matches fetch(dynamicVar) or axios.get(dynamicVar) where argument does not start with string quote
310
- const dynamicFetch = /fetch\s*\(\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\s*(?:,|\))/g;
311
- let match: RegExpExecArray | null;
312
- while ((match = dynamicFetch.exec(code)) !== null) {
313
- const varName = match[1];
314
- // Check if variable is defined as a string literal above
315
- const defRegex = new RegExp(`(?:const|let|var)\\s+${varName}\\s*=\\s*['"\`]([^'"\`]+)['"\`]`);
316
- if (!defRegex.test(code)) {
317
- results.push({
318
- rawSnippet: match[0],
319
- isDynamicOrAmbiguous: true,
320
- reasonIfAmbiguous: `Dynamic variable "${varName}" passed to fetch() cannot be statically resolved to an API path.`,
321
- line: this.findLineNumber(lines, match[0]),
322
- });
323
- }
324
- }
325
- }
326
-
327
- private extractResponseFields(code: string, _endpoint: string): string[] {
328
- const fields: Set<string> = new Set();
329
- // Matches res.data.fieldName or data.fieldName or json.fieldName or event.fieldName
330
- const fieldRegex = /(?:res(?:ponse)?(?:\.data)?|data|json|body|payload)\.([a-zA-Z0-9_]+)/g;
331
- let m: RegExpExecArray | null;
332
- while ((m = fieldRegex.exec(code)) !== null) {
333
- if (m[1] && !['json', 'status', 'headers', 'data', 'text'].includes(m[1])) {
334
- fields.add(m[1]);
335
- }
336
- }
337
- return Array.from(fields);
338
- }
339
- }
@@ -1,203 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import type {
4
- AffectedFileLocation,
5
- DocDiffResult,
6
- ImpactAnalysisResult,
7
- } from '../../shared/src/index.ts';
8
-
9
- const SOURCE_EXTENSIONS = new Set([
10
- '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
11
- '.py', '.go', '.json',
12
- ]);
13
-
14
- const IGNORED_DIRS = new Set([
15
- 'node_modules', '.git', '.docorbit', 'dist', 'build', '.next', 'coverage',
16
- ]);
17
-
18
- export class WorkspaceImpactScanner {
19
- /**
20
- * Scans a workspace project directory and identifies files affected by documentation diffs.
21
- */
22
- scan(projectDir: string, diff: DocDiffResult): ImpactAnalysisResult {
23
- const files = this.collectFiles(projectDir);
24
- const affectedLocations: AffectedFileLocation[] = [];
25
-
26
- for (const filePath of files) {
27
- this.analyzeFile(filePath, projectDir, diff, affectedLocations);
28
- }
29
-
30
- const uniqueFiles = new Set(affectedLocations.map(loc => loc.filePath));
31
-
32
- let summary: string;
33
- if (affectedLocations.length === 0) {
34
- summary = `No project files affected across ${files.length} scanned file(s).`;
35
- } else {
36
- summary = `Found ${affectedLocations.length} affected location(s) across ${uniqueFiles.size} file(s).`;
37
- }
38
-
39
- return {
40
- projectDir,
41
- fromVersion: diff.fromVersion,
42
- toVersion: diff.toVersion,
43
- totalFilesScanned: files.length,
44
- affectedFilesCount: uniqueFiles.size,
45
- affectedLocations,
46
- summary,
47
- };
48
- }
49
-
50
- private collectFiles(dir: string): string[] {
51
- const results: string[] = [];
52
- if (!fs.existsSync(dir)) return results;
53
-
54
- const traverse = (currentDir: string) => {
55
- let entries: fs.Dirent[];
56
- try {
57
- entries = fs.readdirSync(currentDir, { withFileTypes: true });
58
- } catch {
59
- return;
60
- }
61
-
62
- for (const entry of entries) {
63
- if (IGNORED_DIRS.has(entry.name)) continue;
64
-
65
- const fullPath = path.join(currentDir, entry.name);
66
- if (entry.isDirectory()) {
67
- traverse(fullPath);
68
- } else if (entry.isFile()) {
69
- const ext = path.extname(entry.name).toLowerCase();
70
- if (SOURCE_EXTENSIONS.has(ext)) {
71
- results.push(fullPath);
72
- }
73
- }
74
- }
75
- };
76
-
77
- traverse(dir);
78
- return results;
79
- }
80
-
81
- private analyzeFile(
82
- fullPath: string,
83
- projectDir: string,
84
- diff: DocDiffResult,
85
- out: AffectedFileLocation[]
86
- ): void {
87
- let content: string;
88
- try {
89
- content = fs.readFileSync(fullPath, 'utf8');
90
- } catch {
91
- return;
92
- }
93
-
94
- const relPath = path.relative(projectDir, fullPath);
95
- const lines = content.split('\n');
96
-
97
- // Quick pre-filter: check imports
98
- const hasStripe = content.includes('stripe');
99
- const hasNext = content.includes('next');
100
-
101
- // 1. Scan for API endpoint removals, deprecations, and parameter modifications
102
- for (const apiChange of diff.apiChanges) {
103
- const epPath = apiChange.path;
104
- const cleanPath = epPath.replace(/^\//, '');
105
-
106
- for (let i = 0; i < lines.length; i++) {
107
- const lineText = lines[i];
108
-
109
- // Check if line contains endpoint path
110
- if (lineText.includes(epPath) || lineText.includes(`'${cleanPath}'`) || lineText.includes(`"${cleanPath}"`)) {
111
- if (apiChange.changeType === 'removed') {
112
- out.push({
113
- filePath: relPath,
114
- line: i + 1,
115
- snippet: lineText.trim(),
116
- reason: `Endpoint "${apiChange.method.toUpperCase()} ${epPath}" was removed in API documentation.`,
117
- matchedPattern: epPath,
118
- changeCategory: 'removed_api',
119
- certainty: 'high',
120
- confidence: 0.95,
121
- relatedChange: { endpoint: epPath },
122
- });
123
- } else if (apiChange.changeType === 'deprecated') {
124
- out.push({
125
- filePath: relPath,
126
- line: i + 1,
127
- snippet: lineText.trim(),
128
- reason: `Endpoint "${apiChange.method.toUpperCase()} ${epPath}" is deprecated in API documentation.`,
129
- matchedPattern: epPath,
130
- changeCategory: 'deprecated_api',
131
- certainty: 'high',
132
- confidence: 0.9,
133
- relatedChange: { endpoint: epPath },
134
- });
135
- } else if (apiChange.changeType === 'modified') {
136
- out.push({
137
- filePath: relPath,
138
- line: i + 1,
139
- snippet: lineText.trim(),
140
- reason: `Endpoint parameters/schemas changed: ${(apiChange.changes || []).join('; ')}`,
141
- matchedPattern: epPath,
142
- changeCategory: 'modified_parameters',
143
- certainty: 'high',
144
- confidence: 0.85,
145
- relatedChange: { endpoint: epPath },
146
- });
147
- }
148
- }
149
- }
150
- }
151
-
152
- // 2. Scan for breaking pitfalls and deprecations
153
- for (const pitChange of diff.pitfallChanges) {
154
- const pit = pitChange.pitfall;
155
- if (pitChange.changeType !== 'added') continue;
156
-
157
- const matchedLinesForThisPitfall = new Set<number>();
158
-
159
- // Next.js Route Params sync deprecation / removal
160
- if (pit.content.includes('params.slug') || pit.title.includes('route params') || pit.title.includes('Route Parameters')) {
161
- for (let i = 0; i < lines.length; i++) {
162
- const lineText = lines[i];
163
- if (lineText.includes('params.') && !lineText.includes('await params') && hasNext) {
164
- matchedLinesForThisPitfall.add(i + 1);
165
- out.push({
166
- filePath: relPath,
167
- line: i + 1,
168
- snippet: lineText.trim(),
169
- reason: `Synchronous route parameter access detected. Documentation deprecation notice: ${pit.title}`,
170
- matchedPattern: 'params.',
171
- changeCategory: 'breaking_pitfall',
172
- certainty: hasNext ? 'medium' : 'heuristic',
173
- confidence: hasNext ? 0.85 : 0.6,
174
- relatedChange: { pitfallTitle: pit.title },
175
- });
176
- }
177
- }
178
- }
179
-
180
- // Check symbol references
181
- if (pit.relatedSymbol) {
182
- for (let i = 0; i < lines.length; i++) {
183
- if (matchedLinesForThisPitfall.has(i + 1)) continue;
184
- const lineText = lines[i];
185
- if (lineText.includes(pit.relatedSymbol)) {
186
- matchedLinesForThisPitfall.add(i + 1);
187
- out.push({
188
- filePath: relPath,
189
- line: i + 1,
190
- snippet: lineText.trim(),
191
- reason: `Symbol "${pit.relatedSymbol}" referenced in file has documented pitfall: ${pit.title}`,
192
- matchedPattern: pit.relatedSymbol,
193
- changeCategory: 'breaking_pitfall',
194
- certainty: (hasStripe || hasNext) ? 'medium' : 'heuristic',
195
- confidence: (hasStripe || hasNext) ? 0.8 : 0.5,
196
- relatedChange: { symbol: pit.relatedSymbol, pitfallTitle: pit.title },
197
- });
198
- }
199
- }
200
- }
201
- }
202
- }
203
- }