docorbit 0.1.0 → 0.1.2

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 (405) hide show
  1. package/README.md +29 -15
  2. package/bin/docorbit.js +2 -2
  3. package/dist/apps/cli/src/commands/add.d.ts +7 -0
  4. package/dist/apps/cli/src/commands/add.js +35 -0
  5. package/dist/apps/cli/src/commands/api.d.ts +2 -0
  6. package/dist/apps/cli/src/commands/api.js +35 -0
  7. package/dist/apps/cli/src/commands/context.d.ts +10 -0
  8. package/dist/apps/cli/src/commands/context.js +36 -0
  9. package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
  10. package/dist/apps/cli/src/commands/dashboard.js +43 -0
  11. package/dist/apps/cli/src/commands/diff.d.ts +2 -0
  12. package/dist/apps/cli/src/commands/diff.js +29 -0
  13. package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
  14. package/dist/apps/cli/src/commands/evaluate.js +101 -0
  15. package/dist/apps/cli/src/commands/examples.d.ts +2 -0
  16. package/dist/apps/cli/src/commands/examples.js +36 -0
  17. package/dist/apps/cli/src/commands/export.d.ts +11 -0
  18. package/dist/apps/cli/src/commands/export.js +72 -0
  19. package/dist/apps/cli/src/commands/impact.d.ts +2 -0
  20. package/dist/apps/cli/src/commands/impact.js +30 -0
  21. package/dist/apps/cli/src/commands/init.d.ts +5 -0
  22. package/dist/apps/cli/src/commands/init.js +52 -0
  23. package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
  24. package/dist/apps/cli/src/commands/inspect.js +24 -0
  25. package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
  26. package/dist/apps/cli/src/commands/mcp.js +49 -0
  27. package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
  28. package/dist/apps/cli/src/commands/pitfalls.js +35 -0
  29. package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
  30. package/dist/apps/cli/src/commands/recipes.js +33 -0
  31. package/dist/apps/cli/src/commands/search.d.ts +11 -0
  32. package/dist/apps/cli/src/commands/search.js +36 -0
  33. package/dist/apps/cli/src/commands/update.d.ts +6 -0
  34. package/dist/apps/cli/src/commands/update.js +53 -0
  35. package/dist/apps/cli/src/commands/verify.d.ts +2 -0
  36. package/dist/apps/cli/src/commands/verify.js +44 -0
  37. package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
  38. package/dist/apps/cli/src/formatters/colors.js +22 -0
  39. package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
  40. package/dist/apps/cli/src/formatters/inspection.js +88 -0
  41. package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
  42. package/dist/apps/cli/src/formatters/knowledge.js +229 -0
  43. package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
  44. package/dist/apps/cli/src/formatters/retrieval.js +61 -0
  45. package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
  46. package/dist/apps/cli/src/formatters/terminal.js +5 -0
  47. package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
  48. package/dist/apps/cli/src/formatters/verification.js +102 -0
  49. package/dist/apps/cli/src/index.d.ts +1 -0
  50. package/dist/apps/cli/src/index.js +376 -0
  51. package/dist/packages/core/src/dashboard/server.d.ts +33 -0
  52. package/dist/packages/core/src/dashboard/server.js +267 -0
  53. package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
  54. package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
  55. package/dist/packages/core/src/implementation-service.d.ts +73 -0
  56. package/dist/packages/core/src/implementation-service.js +325 -0
  57. package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
  58. package/dist/packages/core/src/index.js +6 -0
  59. package/dist/packages/core/src/inspector.d.ts +22 -0
  60. package/dist/packages/core/src/inspector.js +38 -0
  61. package/dist/packages/core/src/pipeline.d.ts +45 -0
  62. package/dist/packages/core/src/pipeline.js +246 -0
  63. package/dist/packages/crawler/src/config.d.ts +2 -0
  64. package/dist/packages/crawler/src/config.js +10 -0
  65. package/dist/packages/crawler/src/fetcher.d.ts +31 -0
  66. package/dist/packages/crawler/src/fetcher.js +139 -0
  67. package/dist/packages/crawler/src/index.js +2 -0
  68. package/dist/packages/discovery/src/index.d.ts +11 -0
  69. package/dist/packages/discovery/src/index.js +29 -0
  70. package/dist/packages/discovery/src/provider.d.ts +12 -0
  71. package/dist/packages/discovery/src/provider.js +30 -0
  72. package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
  73. package/dist/packages/discovery/src/providers/generic.js +94 -0
  74. package/dist/packages/discovery/src/providers/github.d.ts +7 -0
  75. package/dist/packages/discovery/src/providers/github.js +52 -0
  76. package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
  77. package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
  78. package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
  79. package/dist/packages/discovery/src/providers/markdown.js +38 -0
  80. package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
  81. package/dist/packages/discovery/src/providers/openapi.js +77 -0
  82. package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
  83. package/dist/packages/discovery/src/providers/sitemap.js +53 -0
  84. package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
  85. package/dist/packages/discovery/src/providers/skill.js +46 -0
  86. package/dist/packages/discovery/src/ranker.d.ts +6 -0
  87. package/dist/packages/discovery/src/ranker.js +107 -0
  88. package/dist/packages/evaluation/src/dataset.d.ts +2 -0
  89. package/dist/packages/evaluation/src/dataset.js +944 -0
  90. package/dist/packages/evaluation/src/index.js +8 -0
  91. package/dist/packages/evaluation/src/runner.d.ts +7 -0
  92. package/dist/packages/evaluation/src/runner.js +196 -0
  93. package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
  94. package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
  95. package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
  96. package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
  97. package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
  98. package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
  99. package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
  100. package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
  101. package/dist/packages/evaluation/src/types.d.ts +15 -0
  102. package/dist/packages/evaluation/src/types.js +1 -0
  103. package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
  104. package/dist/packages/evaluation/src/version-matcher.js +61 -0
  105. package/dist/packages/export/src/agents-md.d.ts +19 -0
  106. package/dist/packages/export/src/agents-md.js +170 -0
  107. package/dist/packages/export/src/claude-md.d.ts +17 -0
  108. package/dist/packages/export/src/claude-md.js +118 -0
  109. package/dist/packages/export/src/docs-map.d.ts +14 -0
  110. package/dist/packages/export/src/docs-map.js +118 -0
  111. package/dist/packages/export/src/index.js +6 -0
  112. package/dist/packages/export/src/llms-txt.d.ts +15 -0
  113. package/dist/packages/export/src/llms-txt.js +73 -0
  114. package/dist/packages/export/src/service.d.ts +23 -0
  115. package/dist/packages/export/src/service.js +210 -0
  116. package/dist/packages/export/src/skill-md.d.ts +14 -0
  117. package/dist/packages/export/src/skill-md.js +107 -0
  118. package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
  119. package/dist/packages/mcp/src/index.js +6 -0
  120. package/dist/packages/mcp/src/resources/index.d.ts +12 -0
  121. package/dist/packages/mcp/src/resources/index.js +165 -0
  122. package/dist/packages/mcp/src/server.d.ts +30 -0
  123. package/dist/packages/mcp/src/server.js +243 -0
  124. package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
  125. package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
  126. package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
  127. package/dist/packages/mcp/src/tools/check-api.js +74 -0
  128. package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
  129. package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
  130. package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
  131. package/dist/packages/mcp/src/tools/export-context.js +61 -0
  132. package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
  133. package/dist/packages/mcp/src/tools/find-api.js +91 -0
  134. package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
  135. package/dist/packages/mcp/src/tools/find-example.js +92 -0
  136. package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
  137. package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
  138. package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
  139. package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
  140. package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
  141. package/dist/packages/mcp/src/tools/get-doc.js +118 -0
  142. package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
  143. package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
  144. package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
  145. package/dist/packages/mcp/src/tools/get-version.js +104 -0
  146. package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
  147. package/dist/packages/mcp/src/tools/implementation-context.js +102 -0
  148. package/dist/packages/mcp/src/tools/index.d.ts +19 -0
  149. package/dist/packages/mcp/src/tools/index.js +41 -0
  150. package/dist/packages/mcp/src/tools/ingest-doc.d.ts +6 -0
  151. package/dist/packages/mcp/src/tools/ingest-doc.js +264 -0
  152. package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
  153. package/dist/packages/mcp/src/tools/list-sources.js +76 -0
  154. package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
  155. package/dist/packages/mcp/src/tools/search-docs.js +113 -0
  156. package/dist/packages/mcp/src/tools/types.d.ts +22 -0
  157. package/dist/packages/mcp/src/tools/types.js +1 -0
  158. package/dist/packages/mcp/src/transports/http.d.ts +31 -0
  159. package/dist/packages/mcp/src/transports/http.js +215 -0
  160. package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
  161. package/dist/packages/mcp/src/transports/stdio.js +86 -0
  162. package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
  163. package/dist/packages/mcp/src/transports/types.js +1 -0
  164. package/dist/packages/mcp/src/types.d.ts +89 -0
  165. package/dist/packages/mcp/src/types.js +7 -0
  166. package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
  167. package/dist/packages/normalizer/src/example-indexer.js +200 -0
  168. package/dist/packages/normalizer/src/html.d.ts +13 -0
  169. package/dist/packages/normalizer/src/html.js +221 -0
  170. package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
  171. package/dist/packages/normalizer/src/index.js +7 -0
  172. package/dist/packages/normalizer/src/llms.d.ts +3 -0
  173. package/dist/packages/normalizer/src/llms.js +71 -0
  174. package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
  175. package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
  176. package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
  177. package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
  178. package/dist/packages/normalizer/src/openapi.js +2 -0
  179. package/dist/packages/normalizer/src/page.d.ts +13 -0
  180. package/dist/packages/normalizer/src/page.js +150 -0
  181. package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
  182. package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
  183. package/dist/packages/normalizer/src/slicer.d.ts +30 -0
  184. package/dist/packages/normalizer/src/slicer.js +360 -0
  185. package/dist/packages/retrieval/src/engine.d.ts +17 -0
  186. package/dist/packages/retrieval/src/engine.js +93 -0
  187. package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
  188. package/dist/packages/retrieval/src/index.js +6 -0
  189. package/dist/packages/retrieval/src/intent.d.ts +6 -0
  190. package/dist/packages/retrieval/src/intent.js +39 -0
  191. package/dist/packages/retrieval/src/packer.d.ts +2 -0
  192. package/dist/packages/retrieval/src/packer.js +108 -0
  193. package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
  194. package/dist/packages/retrieval/src/recipe-engine.js +265 -0
  195. package/dist/packages/retrieval/src/scorer.d.ts +13 -0
  196. package/dist/packages/retrieval/src/scorer.js +110 -0
  197. package/dist/packages/retrieval/src/weights.d.ts +3 -0
  198. package/dist/packages/retrieval/src/weights.js +28 -0
  199. package/dist/packages/security/src/annotations.d.ts +10 -0
  200. package/dist/packages/security/src/annotations.js +100 -0
  201. package/dist/packages/security/src/index.js +2 -0
  202. package/dist/packages/security/src/ssrf.d.ts +17 -0
  203. package/dist/packages/security/src/ssrf.js +132 -0
  204. package/dist/packages/shared/src/errors.d.ts +22 -0
  205. package/dist/packages/shared/src/errors.js +44 -0
  206. package/dist/packages/shared/src/hashing.d.ts +3 -0
  207. package/dist/packages/shared/src/hashing.js +21 -0
  208. package/dist/packages/shared/src/index.js +3 -0
  209. package/dist/packages/shared/src/types.d.ts +715 -0
  210. package/dist/packages/shared/src/types.js +1 -0
  211. package/dist/packages/storage/src/db.d.ts +11 -0
  212. package/dist/packages/storage/src/db.js +128 -0
  213. package/dist/packages/storage/src/index.js +10 -0
  214. package/dist/packages/storage/src/interfaces.d.ts +83 -0
  215. package/dist/packages/storage/src/interfaces.js +1 -0
  216. package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
  217. package/dist/packages/storage/src/repositories/api-repository.js +169 -0
  218. package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
  219. package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
  220. package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
  221. package/dist/packages/storage/src/repositories/example-repository.js +158 -0
  222. package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
  223. package/dist/packages/storage/src/repositories/page-repository.js +161 -0
  224. package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
  225. package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
  226. package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
  227. package/dist/packages/storage/src/repositories/source-repository.js +153 -0
  228. package/dist/packages/storage/src/repository.d.ts +92 -0
  229. package/dist/packages/storage/src/repository.js +157 -0
  230. package/dist/packages/storage/src/schema.d.ts +2 -0
  231. package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
  232. package/dist/packages/storage/src/search-tokens.d.ts +6 -0
  233. package/dist/packages/storage/src/search-tokens.js +26 -0
  234. package/dist/packages/verification/src/diff-engine.d.ts +18 -0
  235. package/dist/packages/verification/src/diff-engine.js +218 -0
  236. package/dist/packages/verification/src/extractor.d.ts +29 -0
  237. package/dist/packages/verification/src/extractor.js +302 -0
  238. package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
  239. package/dist/packages/verification/src/impact-scanner.js +181 -0
  240. package/dist/packages/verification/src/index.js +5 -0
  241. package/dist/packages/verification/src/services.d.ts +55 -0
  242. package/dist/packages/verification/src/services.js +189 -0
  243. package/dist/packages/verification/src/verifier.d.ts +15 -0
  244. package/dist/packages/verification/src/verifier.js +315 -0
  245. package/dist/packages/workspace/src/detector.d.ts +7 -0
  246. package/dist/packages/workspace/src/detector.js +117 -0
  247. package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
  248. package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
  249. package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
  250. package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
  251. package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
  252. package/dist/packages/workspace/src/ecosystems/go.js +49 -0
  253. package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
  254. package/dist/packages/workspace/src/ecosystems/index.js +21 -0
  255. package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
  256. package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
  257. package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
  258. package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
  259. package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
  260. package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
  261. package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
  262. package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
  263. package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
  264. package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
  265. package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
  266. package/dist/packages/workspace/src/ecosystems/types.js +1 -0
  267. package/dist/packages/workspace/src/index.js +5 -0
  268. package/dist/packages/workspace/src/lockfile.d.ts +21 -0
  269. package/dist/packages/workspace/src/lockfile.js +153 -0
  270. package/dist/packages/workspace/src/resolver.d.ts +39 -0
  271. package/dist/packages/workspace/src/resolver.js +164 -0
  272. package/dist/packages/workspace/src/semver.d.ts +33 -0
  273. package/dist/packages/workspace/src/semver.js +235 -0
  274. package/package.json +13 -9
  275. package/apps/cli/bin/docorbit.js +0 -8
  276. package/apps/cli/src/commands/add.ts +0 -44
  277. package/apps/cli/src/commands/api.ts +0 -38
  278. package/apps/cli/src/commands/context.ts +0 -47
  279. package/apps/cli/src/commands/dashboard.ts +0 -55
  280. package/apps/cli/src/commands/diff.ts +0 -30
  281. package/apps/cli/src/commands/evaluate.ts +0 -133
  282. package/apps/cli/src/commands/examples.ts +0 -39
  283. package/apps/cli/src/commands/export.ts +0 -89
  284. package/apps/cli/src/commands/impact.ts +0 -31
  285. package/apps/cli/src/commands/init.ts +0 -69
  286. package/apps/cli/src/commands/inspect.ts +0 -30
  287. package/apps/cli/src/commands/mcp.ts +0 -72
  288. package/apps/cli/src/commands/pitfalls.ts +0 -38
  289. package/apps/cli/src/commands/recipes.ts +0 -35
  290. package/apps/cli/src/commands/search.ts +0 -48
  291. package/apps/cli/src/commands/update.ts +0 -73
  292. package/apps/cli/src/commands/verify.ts +0 -48
  293. package/apps/cli/src/formatters/colors.ts +0 -23
  294. package/apps/cli/src/formatters/inspection.ts +0 -102
  295. package/apps/cli/src/formatters/knowledge.ts +0 -272
  296. package/apps/cli/src/formatters/retrieval.ts +0 -74
  297. package/apps/cli/src/formatters/verification.ts +0 -126
  298. package/apps/cli/src/index.ts +0 -409
  299. package/packages/core/src/dashboard/server.ts +0 -314
  300. package/packages/core/src/implementation-service.ts +0 -451
  301. package/packages/core/src/inspector.ts +0 -71
  302. package/packages/core/src/pipeline.ts +0 -331
  303. package/packages/crawler/src/config.ts +0 -12
  304. package/packages/crawler/src/fetcher.ts +0 -185
  305. package/packages/discovery/src/index.ts +0 -31
  306. package/packages/discovery/src/provider.ts +0 -47
  307. package/packages/discovery/src/providers/generic.ts +0 -98
  308. package/packages/discovery/src/providers/github.ts +0 -61
  309. package/packages/discovery/src/providers/llms-txt.ts +0 -73
  310. package/packages/discovery/src/providers/markdown.ts +0 -48
  311. package/packages/discovery/src/providers/openapi.ts +0 -91
  312. package/packages/discovery/src/providers/sitemap.ts +0 -62
  313. package/packages/discovery/src/providers/skill.ts +0 -54
  314. package/packages/discovery/src/ranker.ts +0 -123
  315. package/packages/evaluation/src/dataset.ts +0 -963
  316. package/packages/evaluation/src/runner.ts +0 -241
  317. package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
  318. package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
  319. package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
  320. package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
  321. package/packages/evaluation/src/types.ts +0 -34
  322. package/packages/evaluation/src/version-matcher.ts +0 -73
  323. package/packages/export/src/agents-md.ts +0 -200
  324. package/packages/export/src/claude-md.ts +0 -141
  325. package/packages/export/src/docs-map.ts +0 -150
  326. package/packages/export/src/llms-txt.ts +0 -96
  327. package/packages/export/src/service.ts +0 -250
  328. package/packages/export/src/skill-md.ts +0 -128
  329. package/packages/mcp/src/resources/index.ts +0 -189
  330. package/packages/mcp/src/server.ts +0 -278
  331. package/packages/mcp/src/tools/analyze-impact.ts +0 -74
  332. package/packages/mcp/src/tools/check-api.ts +0 -86
  333. package/packages/mcp/src/tools/diff-docs.ts +0 -68
  334. package/packages/mcp/src/tools/export-context.ts +0 -73
  335. package/packages/mcp/src/tools/find-api.ts +0 -99
  336. package/packages/mcp/src/tools/find-example.ts +0 -100
  337. package/packages/mcp/src/tools/find-pitfall.ts +0 -94
  338. package/packages/mcp/src/tools/find-recipe.ts +0 -98
  339. package/packages/mcp/src/tools/get-doc.ts +0 -130
  340. package/packages/mcp/src/tools/get-docs-map.ts +0 -64
  341. package/packages/mcp/src/tools/get-version.ts +0 -118
  342. package/packages/mcp/src/tools/implementation-context.ts +0 -88
  343. package/packages/mcp/src/tools/index.ts +0 -59
  344. package/packages/mcp/src/tools/list-sources.ts +0 -85
  345. package/packages/mcp/src/tools/search-docs.ts +0 -123
  346. package/packages/mcp/src/tools/types.ts +0 -28
  347. package/packages/mcp/src/transports/http.ts +0 -256
  348. package/packages/mcp/src/transports/stdio.ts +0 -105
  349. package/packages/mcp/src/types.ts +0 -102
  350. package/packages/normalizer/src/example-indexer.ts +0 -240
  351. package/packages/normalizer/src/html.ts +0 -253
  352. package/packages/normalizer/src/llms.ts +0 -83
  353. package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
  354. package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
  355. package/packages/normalizer/src/page.ts +0 -184
  356. package/packages/normalizer/src/pitfall-extractor.ts +0 -190
  357. package/packages/normalizer/src/slicer.ts +0 -455
  358. package/packages/retrieval/src/engine.ts +0 -120
  359. package/packages/retrieval/src/intent.ts +0 -43
  360. package/packages/retrieval/src/packer.ts +0 -145
  361. package/packages/retrieval/src/recipe-engine.ts +0 -313
  362. package/packages/retrieval/src/scorer.ts +0 -139
  363. package/packages/retrieval/src/weights.ts +0 -31
  364. package/packages/security/src/annotations.ts +0 -112
  365. package/packages/security/src/ssrf.ts +0 -153
  366. package/packages/shared/src/errors.ts +0 -53
  367. package/packages/shared/src/hashing.ts +0 -23
  368. package/packages/shared/src/types.ts +0 -881
  369. package/packages/storage/src/db.ts +0 -72
  370. package/packages/storage/src/interfaces.ts +0 -115
  371. package/packages/storage/src/repositories/api-repository.ts +0 -219
  372. package/packages/storage/src/repositories/chunk-repository.ts +0 -316
  373. package/packages/storage/src/repositories/example-repository.ts +0 -206
  374. package/packages/storage/src/repositories/page-repository.ts +0 -205
  375. package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
  376. package/packages/storage/src/repositories/source-repository.ts +0 -205
  377. package/packages/storage/src/repository.ts +0 -256
  378. package/packages/storage/src/search-tokens.ts +0 -28
  379. package/packages/verification/src/diff-engine.ts +0 -258
  380. package/packages/verification/src/extractor.ts +0 -339
  381. package/packages/verification/src/impact-scanner.ts +0 -203
  382. package/packages/verification/src/services.ts +0 -238
  383. package/packages/verification/src/verifier.ts +0 -375
  384. package/packages/workspace/src/detector.ts +0 -143
  385. package/packages/workspace/src/ecosystems/cargo.ts +0 -84
  386. package/packages/workspace/src/ecosystems/composer.ts +0 -42
  387. package/packages/workspace/src/ecosystems/go.ts +0 -54
  388. package/packages/workspace/src/ecosystems/maven.ts +0 -34
  389. package/packages/workspace/src/ecosystems/npm.ts +0 -83
  390. package/packages/workspace/src/ecosystems/pub.ts +0 -40
  391. package/packages/workspace/src/ecosystems/pypi.ts +0 -100
  392. package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
  393. package/packages/workspace/src/ecosystems/types.ts +0 -18
  394. package/packages/workspace/src/lockfile.ts +0 -194
  395. package/packages/workspace/src/resolver.ts +0 -234
  396. package/packages/workspace/src/semver.ts +0 -259
  397. /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
  398. /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
  399. /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
  400. /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
  401. /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
  402. /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
  403. /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
  404. /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
  405. /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
- }