codesift-mcp 0.2.18 → 0.4.0

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 (461) hide show
  1. package/README.md +143 -20
  2. package/dist/cache/hono-cache.d.ts +50 -0
  3. package/dist/cache/hono-cache.d.ts.map +1 -0
  4. package/dist/cache/hono-cache.js +132 -0
  5. package/dist/cache/hono-cache.js.map +1 -0
  6. package/dist/cli/setup.d.ts.map +1 -1
  7. package/dist/cli/setup.js +17 -2
  8. package/dist/cli/setup.js.map +1 -1
  9. package/dist/formatters-shortening.d.ts +13 -0
  10. package/dist/formatters-shortening.d.ts.map +1 -1
  11. package/dist/formatters-shortening.js +131 -0
  12. package/dist/formatters-shortening.js.map +1 -1
  13. package/dist/formatters.d.ts +38 -0
  14. package/dist/formatters.d.ts.map +1 -1
  15. package/dist/formatters.js +498 -0
  16. package/dist/formatters.js.map +1 -1
  17. package/dist/instructions.d.ts +1 -1
  18. package/dist/instructions.d.ts.map +1 -1
  19. package/dist/instructions.js +27 -26
  20. package/dist/instructions.js.map +1 -1
  21. package/dist/lsp/lsp-servers.d.ts.map +1 -1
  22. package/dist/lsp/lsp-servers.js +5 -0
  23. package/dist/lsp/lsp-servers.js.map +1 -1
  24. package/dist/lsp/lsp-tools.d.ts.map +1 -1
  25. package/dist/lsp/lsp-tools.js +1 -0
  26. package/dist/lsp/lsp-tools.js.map +1 -1
  27. package/dist/parser/astro-template.d.ts +47 -0
  28. package/dist/parser/astro-template.d.ts.map +1 -0
  29. package/dist/parser/astro-template.js +171 -0
  30. package/dist/parser/astro-template.js.map +1 -0
  31. package/dist/parser/extractors/_shared.d.ts +4 -0
  32. package/dist/parser/extractors/_shared.d.ts.map +1 -1
  33. package/dist/parser/extractors/_shared.js +8 -0
  34. package/dist/parser/extractors/_shared.js.map +1 -1
  35. package/dist/parser/extractors/astro.d.ts +4 -5
  36. package/dist/parser/extractors/astro.d.ts.map +1 -1
  37. package/dist/parser/extractors/astro.js +102 -26
  38. package/dist/parser/extractors/astro.js.map +1 -1
  39. package/dist/parser/extractors/gradle-kts.d.ts +4 -0
  40. package/dist/parser/extractors/gradle-kts.d.ts.map +1 -0
  41. package/dist/parser/extractors/gradle-kts.js +246 -0
  42. package/dist/parser/extractors/gradle-kts.js.map +1 -0
  43. package/dist/parser/extractors/hono-inline-analyzer.d.ts +34 -0
  44. package/dist/parser/extractors/hono-inline-analyzer.d.ts.map +1 -0
  45. package/dist/parser/extractors/hono-inline-analyzer.js +465 -0
  46. package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -0
  47. package/dist/parser/extractors/hono-model.d.ts +196 -0
  48. package/dist/parser/extractors/hono-model.d.ts.map +1 -0
  49. package/dist/parser/extractors/hono-model.js +10 -0
  50. package/dist/parser/extractors/hono-model.js.map +1 -0
  51. package/dist/parser/extractors/hono.d.ts +118 -0
  52. package/dist/parser/extractors/hono.d.ts.map +1 -0
  53. package/dist/parser/extractors/hono.js +1527 -0
  54. package/dist/parser/extractors/hono.js.map +1 -0
  55. package/dist/parser/extractors/kotlin.d.ts +4 -0
  56. package/dist/parser/extractors/kotlin.d.ts.map +1 -0
  57. package/dist/parser/extractors/kotlin.js +521 -0
  58. package/dist/parser/extractors/kotlin.js.map +1 -0
  59. package/dist/parser/extractors/php.d.ts +22 -0
  60. package/dist/parser/extractors/php.d.ts.map +1 -0
  61. package/dist/parser/extractors/php.js +326 -0
  62. package/dist/parser/extractors/php.js.map +1 -0
  63. package/dist/parser/extractors/python.d.ts.map +1 -1
  64. package/dist/parser/extractors/python.js +234 -11
  65. package/dist/parser/extractors/python.js.map +1 -1
  66. package/dist/parser/extractors/sql.d.ts +33 -0
  67. package/dist/parser/extractors/sql.d.ts.map +1 -0
  68. package/dist/parser/extractors/sql.js +506 -0
  69. package/dist/parser/extractors/sql.js.map +1 -0
  70. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  71. package/dist/parser/extractors/typescript.js +166 -3
  72. package/dist/parser/extractors/typescript.js.map +1 -1
  73. package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
  74. package/dist/parser/languages/tree-sitter-kotlin.wasm +0 -0
  75. package/dist/parser/languages/tree-sitter-php.wasm +0 -0
  76. package/dist/parser/languages/tree-sitter-php_only.wasm +0 -0
  77. package/dist/parser/languages/tree-sitter-python.wasm +0 -0
  78. package/dist/parser/parser-manager.d.ts +32 -0
  79. package/dist/parser/parser-manager.d.ts.map +1 -1
  80. package/dist/parser/parser-manager.js +82 -3
  81. package/dist/parser/parser-manager.js.map +1 -1
  82. package/dist/parser/symbol-extractor.d.ts.map +1 -1
  83. package/dist/parser/symbol-extractor.js +16 -0
  84. package/dist/parser/symbol-extractor.js.map +1 -1
  85. package/dist/register-tools.d.ts +37 -1
  86. package/dist/register-tools.d.ts.map +1 -1
  87. package/dist/register-tools.js +2657 -191
  88. package/dist/register-tools.js.map +1 -1
  89. package/dist/search/reranker.js +1 -1
  90. package/dist/search/reranker.js.map +1 -1
  91. package/dist/server-helpers.d.ts.map +1 -1
  92. package/dist/server-helpers.js +11 -0
  93. package/dist/server-helpers.js.map +1 -1
  94. package/dist/server.js +28 -1
  95. package/dist/server.js.map +1 -1
  96. package/dist/storage/index-store.d.ts +15 -1
  97. package/dist/storage/index-store.d.ts.map +1 -1
  98. package/dist/storage/index-store.js +27 -1
  99. package/dist/storage/index-store.js.map +1 -1
  100. package/dist/storage/session-state.d.ts +1 -1
  101. package/dist/storage/session-state.d.ts.map +1 -1
  102. package/dist/storage/session-state.js +6 -4
  103. package/dist/storage/session-state.js.map +1 -1
  104. package/dist/tools/agent-config-tools.d.ts +24 -0
  105. package/dist/tools/agent-config-tools.d.ts.map +1 -0
  106. package/dist/tools/agent-config-tools.js +119 -0
  107. package/dist/tools/agent-config-tools.js.map +1 -0
  108. package/dist/tools/architecture-tools.d.ts +23 -0
  109. package/dist/tools/architecture-tools.d.ts.map +1 -0
  110. package/dist/tools/architecture-tools.js +140 -0
  111. package/dist/tools/architecture-tools.js.map +1 -0
  112. package/dist/tools/astro-config.d.ts +33 -0
  113. package/dist/tools/astro-config.d.ts.map +1 -0
  114. package/dist/tools/astro-config.js +260 -0
  115. package/dist/tools/astro-config.js.map +1 -0
  116. package/dist/tools/astro-islands.d.ts +61 -0
  117. package/dist/tools/astro-islands.d.ts.map +1 -0
  118. package/dist/tools/astro-islands.js +240 -0
  119. package/dist/tools/astro-islands.js.map +1 -0
  120. package/dist/tools/astro-routes.d.ts +49 -0
  121. package/dist/tools/astro-routes.d.ts.map +1 -0
  122. package/dist/tools/astro-routes.js +119 -0
  123. package/dist/tools/astro-routes.js.map +1 -0
  124. package/dist/tools/audit-tools.d.ts +38 -0
  125. package/dist/tools/audit-tools.d.ts.map +1 -0
  126. package/dist/tools/audit-tools.js +248 -0
  127. package/dist/tools/audit-tools.js.map +1 -0
  128. package/dist/tools/celery-tools.d.ts +38 -0
  129. package/dist/tools/celery-tools.d.ts.map +1 -0
  130. package/dist/tools/celery-tools.js +154 -0
  131. package/dist/tools/celery-tools.js.map +1 -0
  132. package/dist/tools/clone-tools.js +1 -1
  133. package/dist/tools/clone-tools.js.map +1 -1
  134. package/dist/tools/complexity-tools.d.ts +4 -0
  135. package/dist/tools/complexity-tools.d.ts.map +1 -1
  136. package/dist/tools/complexity-tools.js +78 -4
  137. package/dist/tools/complexity-tools.js.map +1 -1
  138. package/dist/tools/compose-tools.d.ts +60 -0
  139. package/dist/tools/compose-tools.d.ts.map +1 -0
  140. package/dist/tools/compose-tools.js +203 -0
  141. package/dist/tools/compose-tools.js.map +1 -0
  142. package/dist/tools/coupling-tools.d.ts +50 -0
  143. package/dist/tools/coupling-tools.d.ts.map +1 -0
  144. package/dist/tools/coupling-tools.js +262 -0
  145. package/dist/tools/coupling-tools.js.map +1 -0
  146. package/dist/tools/dependency-audit-tools.d.ts +65 -0
  147. package/dist/tools/dependency-audit-tools.d.ts.map +1 -0
  148. package/dist/tools/dependency-audit-tools.js +553 -0
  149. package/dist/tools/dependency-audit-tools.js.map +1 -0
  150. package/dist/tools/django-settings.d.ts +22 -0
  151. package/dist/tools/django-settings.d.ts.map +1 -0
  152. package/dist/tools/django-settings.js +301 -0
  153. package/dist/tools/django-settings.js.map +1 -0
  154. package/dist/tools/frequency-tools.js +1 -1
  155. package/dist/tools/frequency-tools.js.map +1 -1
  156. package/dist/tools/graph-tools.d.ts +8 -2
  157. package/dist/tools/graph-tools.d.ts.map +1 -1
  158. package/dist/tools/graph-tools.js +44 -3
  159. package/dist/tools/graph-tools.js.map +1 -1
  160. package/dist/tools/hilt-tools.d.ts +55 -0
  161. package/dist/tools/hilt-tools.d.ts.map +1 -0
  162. package/dist/tools/hilt-tools.js +258 -0
  163. package/dist/tools/hilt-tools.js.map +1 -0
  164. package/dist/tools/hono-analyze-app.d.ts +48 -0
  165. package/dist/tools/hono-analyze-app.d.ts.map +1 -0
  166. package/dist/tools/hono-analyze-app.js +102 -0
  167. package/dist/tools/hono-analyze-app.js.map +1 -0
  168. package/dist/tools/hono-api-contract.d.ts +22 -0
  169. package/dist/tools/hono-api-contract.d.ts.map +1 -0
  170. package/dist/tools/hono-api-contract.js +80 -0
  171. package/dist/tools/hono-api-contract.js.map +1 -0
  172. package/dist/tools/hono-conditional-middleware.d.ts +27 -0
  173. package/dist/tools/hono-conditional-middleware.d.ts.map +1 -0
  174. package/dist/tools/hono-conditional-middleware.js +62 -0
  175. package/dist/tools/hono-conditional-middleware.js.map +1 -0
  176. package/dist/tools/hono-context-flow.d.ts +24 -0
  177. package/dist/tools/hono-context-flow.d.ts.map +1 -0
  178. package/dist/tools/hono-context-flow.js +78 -0
  179. package/dist/tools/hono-context-flow.js.map +1 -0
  180. package/dist/tools/hono-dead-routes.d.ts +26 -0
  181. package/dist/tools/hono-dead-routes.d.ts.map +1 -0
  182. package/dist/tools/hono-dead-routes.js +109 -0
  183. package/dist/tools/hono-dead-routes.js.map +1 -0
  184. package/dist/tools/hono-env-regression.d.ts +29 -0
  185. package/dist/tools/hono-env-regression.d.ts.map +1 -0
  186. package/dist/tools/hono-env-regression.js +157 -0
  187. package/dist/tools/hono-env-regression.js.map +1 -0
  188. package/dist/tools/hono-inline-analyze.d.ts +31 -0
  189. package/dist/tools/hono-inline-analyze.d.ts.map +1 -0
  190. package/dist/tools/hono-inline-analyze.js +67 -0
  191. package/dist/tools/hono-inline-analyze.js.map +1 -0
  192. package/dist/tools/hono-middleware-chain.d.ts +22 -0
  193. package/dist/tools/hono-middleware-chain.d.ts.map +1 -0
  194. package/dist/tools/hono-middleware-chain.js +84 -0
  195. package/dist/tools/hono-middleware-chain.js.map +1 -0
  196. package/dist/tools/hono-modules.d.ts +22 -0
  197. package/dist/tools/hono-modules.d.ts.map +1 -0
  198. package/dist/tools/hono-modules.js +126 -0
  199. package/dist/tools/hono-modules.js.map +1 -0
  200. package/dist/tools/hono-response-types.d.ts +37 -0
  201. package/dist/tools/hono-response-types.d.ts.map +1 -0
  202. package/dist/tools/hono-response-types.js +84 -0
  203. package/dist/tools/hono-response-types.js.map +1 -0
  204. package/dist/tools/hono-rpc-types.d.ts +21 -0
  205. package/dist/tools/hono-rpc-types.d.ts.map +1 -0
  206. package/dist/tools/hono-rpc-types.js +57 -0
  207. package/dist/tools/hono-rpc-types.js.map +1 -0
  208. package/dist/tools/hono-security.d.ts +21 -0
  209. package/dist/tools/hono-security.d.ts.map +1 -0
  210. package/dist/tools/hono-security.js +98 -0
  211. package/dist/tools/hono-security.js.map +1 -0
  212. package/dist/tools/hono-visualize.d.ts +13 -0
  213. package/dist/tools/hono-visualize.d.ts.map +1 -0
  214. package/dist/tools/hono-visualize.js +72 -0
  215. package/dist/tools/hono-visualize.js.map +1 -0
  216. package/dist/tools/hotspot-tools.d.ts.map +1 -1
  217. package/dist/tools/hotspot-tools.js +9 -7
  218. package/dist/tools/hotspot-tools.js.map +1 -1
  219. package/dist/tools/index-tools.d.ts +17 -0
  220. package/dist/tools/index-tools.d.ts.map +1 -1
  221. package/dist/tools/index-tools.js +210 -10
  222. package/dist/tools/index-tools.js.map +1 -1
  223. package/dist/tools/kotlin-tools.d.ts +142 -0
  224. package/dist/tools/kotlin-tools.d.ts.map +1 -0
  225. package/dist/tools/kotlin-tools.js +572 -0
  226. package/dist/tools/kotlin-tools.js.map +1 -0
  227. package/dist/tools/legacy-hono-conventions.d.ts +14 -0
  228. package/dist/tools/legacy-hono-conventions.d.ts.map +1 -0
  229. package/dist/tools/legacy-hono-conventions.js +152 -0
  230. package/dist/tools/legacy-hono-conventions.js.map +1 -0
  231. package/dist/tools/migration-lint-tools.d.ts +26 -0
  232. package/dist/tools/migration-lint-tools.d.ts.map +1 -0
  233. package/dist/tools/migration-lint-tools.js +247 -0
  234. package/dist/tools/migration-lint-tools.js.map +1 -0
  235. package/dist/tools/model-tools.d.ts +30 -0
  236. package/dist/tools/model-tools.d.ts.map +1 -0
  237. package/dist/tools/model-tools.js +145 -0
  238. package/dist/tools/model-tools.js.map +1 -0
  239. package/dist/tools/nest-ext-tools.d.ts +92 -0
  240. package/dist/tools/nest-ext-tools.d.ts.map +1 -0
  241. package/dist/tools/nest-ext-tools.js +359 -0
  242. package/dist/tools/nest-ext-tools.js.map +1 -0
  243. package/dist/tools/nest-tools.d.ts +171 -0
  244. package/dist/tools/nest-tools.d.ts.map +1 -0
  245. package/dist/tools/nest-tools.js +1042 -0
  246. package/dist/tools/nest-tools.js.map +1 -0
  247. package/dist/tools/nextjs-api-contract-readers.d.ts +14 -0
  248. package/dist/tools/nextjs-api-contract-readers.d.ts.map +1 -0
  249. package/dist/tools/nextjs-api-contract-readers.js +204 -0
  250. package/dist/tools/nextjs-api-contract-readers.js.map +1 -0
  251. package/dist/tools/nextjs-api-contract-tools.d.ts +57 -0
  252. package/dist/tools/nextjs-api-contract-tools.d.ts.map +1 -0
  253. package/dist/tools/nextjs-api-contract-tools.js +144 -0
  254. package/dist/tools/nextjs-api-contract-tools.js.map +1 -0
  255. package/dist/tools/nextjs-boundary-tools.d.ts +39 -0
  256. package/dist/tools/nextjs-boundary-tools.d.ts.map +1 -0
  257. package/dist/tools/nextjs-boundary-tools.js +152 -0
  258. package/dist/tools/nextjs-boundary-tools.js.map +1 -0
  259. package/dist/tools/nextjs-component-tools.d.ts +121 -0
  260. package/dist/tools/nextjs-component-tools.d.ts.map +1 -0
  261. package/dist/tools/nextjs-component-tools.js +460 -0
  262. package/dist/tools/nextjs-component-tools.js.map +1 -0
  263. package/dist/tools/nextjs-data-flow-tools.d.ts +42 -0
  264. package/dist/tools/nextjs-data-flow-tools.d.ts.map +1 -0
  265. package/dist/tools/nextjs-data-flow-tools.js +158 -0
  266. package/dist/tools/nextjs-data-flow-tools.js.map +1 -0
  267. package/dist/tools/nextjs-framework-audit-tools.d.ts +37 -0
  268. package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -0
  269. package/dist/tools/nextjs-framework-audit-tools.js +211 -0
  270. package/dist/tools/nextjs-framework-audit-tools.js.map +1 -0
  271. package/dist/tools/nextjs-link-tools.d.ts +41 -0
  272. package/dist/tools/nextjs-link-tools.d.ts.map +1 -0
  273. package/dist/tools/nextjs-link-tools.js +157 -0
  274. package/dist/tools/nextjs-link-tools.js.map +1 -0
  275. package/dist/tools/nextjs-metadata-tools.d.ts +74 -0
  276. package/dist/tools/nextjs-metadata-tools.d.ts.map +1 -0
  277. package/dist/tools/nextjs-metadata-tools.js +252 -0
  278. package/dist/tools/nextjs-metadata-tools.js.map +1 -0
  279. package/dist/tools/nextjs-middleware-coverage-tools.d.ts +41 -0
  280. package/dist/tools/nextjs-middleware-coverage-tools.d.ts.map +1 -0
  281. package/dist/tools/nextjs-middleware-coverage-tools.js +88 -0
  282. package/dist/tools/nextjs-middleware-coverage-tools.js.map +1 -0
  283. package/dist/tools/nextjs-route-tools.d.ts +100 -0
  284. package/dist/tools/nextjs-route-tools.d.ts.map +1 -0
  285. package/dist/tools/nextjs-route-tools.js +493 -0
  286. package/dist/tools/nextjs-route-tools.js.map +1 -0
  287. package/dist/tools/nextjs-security-readers.d.ts +22 -0
  288. package/dist/tools/nextjs-security-readers.d.ts.map +1 -0
  289. package/dist/tools/nextjs-security-readers.js +318 -0
  290. package/dist/tools/nextjs-security-readers.js.map +1 -0
  291. package/dist/tools/nextjs-security-scoring.d.ts +15 -0
  292. package/dist/tools/nextjs-security-scoring.d.ts.map +1 -0
  293. package/dist/tools/nextjs-security-scoring.js +65 -0
  294. package/dist/tools/nextjs-security-scoring.js.map +1 -0
  295. package/dist/tools/nextjs-security-tools.d.ts +75 -0
  296. package/dist/tools/nextjs-security-tools.d.ts.map +1 -0
  297. package/dist/tools/nextjs-security-tools.js +153 -0
  298. package/dist/tools/nextjs-security-tools.js.map +1 -0
  299. package/dist/tools/nextjs-tools.d.ts +15 -0
  300. package/dist/tools/nextjs-tools.d.ts.map +1 -0
  301. package/dist/tools/nextjs-tools.js +15 -0
  302. package/dist/tools/nextjs-tools.js.map +1 -0
  303. package/dist/tools/outline-tools.d.ts.map +1 -1
  304. package/dist/tools/outline-tools.js +20 -0
  305. package/dist/tools/outline-tools.js.map +1 -1
  306. package/dist/tools/pattern-tools.d.ts +8 -0
  307. package/dist/tools/pattern-tools.d.ts.map +1 -1
  308. package/dist/tools/pattern-tools.js +561 -3
  309. package/dist/tools/pattern-tools.js.map +1 -1
  310. package/dist/tools/perf-tools.d.ts +32 -0
  311. package/dist/tools/perf-tools.d.ts.map +1 -0
  312. package/dist/tools/perf-tools.js +227 -0
  313. package/dist/tools/perf-tools.js.map +1 -0
  314. package/dist/tools/php-tools.d.ts +176 -0
  315. package/dist/tools/php-tools.d.ts.map +1 -0
  316. package/dist/tools/php-tools.js +543 -0
  317. package/dist/tools/php-tools.js.map +1 -0
  318. package/dist/tools/prisma-schema-tools.d.ts +44 -0
  319. package/dist/tools/prisma-schema-tools.d.ts.map +1 -0
  320. package/dist/tools/prisma-schema-tools.js +358 -0
  321. package/dist/tools/prisma-schema-tools.js.map +1 -0
  322. package/dist/tools/project-tools.d.ts +115 -6
  323. package/dist/tools/project-tools.d.ts.map +1 -1
  324. package/dist/tools/project-tools.js +594 -217
  325. package/dist/tools/project-tools.js.map +1 -1
  326. package/dist/tools/pyproject-tools.d.ts +23 -0
  327. package/dist/tools/pyproject-tools.d.ts.map +1 -0
  328. package/dist/tools/pyproject-tools.js +133 -0
  329. package/dist/tools/pyproject-tools.js.map +1 -0
  330. package/dist/tools/pytest-tools.d.ts +20 -0
  331. package/dist/tools/pytest-tools.d.ts.map +1 -0
  332. package/dist/tools/pytest-tools.js +106 -0
  333. package/dist/tools/pytest-tools.js.map +1 -0
  334. package/dist/tools/python-callers.d.ts +28 -0
  335. package/dist/tools/python-callers.d.ts.map +1 -0
  336. package/dist/tools/python-callers.js +110 -0
  337. package/dist/tools/python-callers.js.map +1 -0
  338. package/dist/tools/python-circular-imports.d.ts +19 -0
  339. package/dist/tools/python-circular-imports.d.ts.map +1 -0
  340. package/dist/tools/python-circular-imports.js +126 -0
  341. package/dist/tools/python-circular-imports.js.map +1 -0
  342. package/dist/tools/python-deps-analyzer.d.ts +46 -0
  343. package/dist/tools/python-deps-analyzer.d.ts.map +1 -0
  344. package/dist/tools/python-deps-analyzer.js +227 -0
  345. package/dist/tools/python-deps-analyzer.js.map +1 -0
  346. package/dist/tools/query-tools.d.ts +23 -0
  347. package/dist/tools/query-tools.d.ts.map +1 -0
  348. package/dist/tools/query-tools.js +256 -0
  349. package/dist/tools/query-tools.js.map +1 -0
  350. package/dist/tools/react-tools.d.ts +218 -0
  351. package/dist/tools/react-tools.d.ts.map +1 -0
  352. package/dist/tools/react-tools.js +714 -0
  353. package/dist/tools/react-tools.js.map +1 -0
  354. package/dist/tools/report-tools.js +47 -0
  355. package/dist/tools/report-tools.js.map +1 -1
  356. package/dist/tools/review-diff-tools.d.ts +2 -6
  357. package/dist/tools/review-diff-tools.d.ts.map +1 -1
  358. package/dist/tools/review-diff-tools.js +51 -66
  359. package/dist/tools/review-diff-tools.js.map +1 -1
  360. package/dist/tools/room-tools.d.ts +36 -0
  361. package/dist/tools/room-tools.d.ts.map +1 -0
  362. package/dist/tools/room-tools.js +147 -0
  363. package/dist/tools/room-tools.js.map +1 -0
  364. package/dist/tools/route-tools.d.ts +27 -1
  365. package/dist/tools/route-tools.d.ts.map +1 -1
  366. package/dist/tools/route-tools.js +744 -18
  367. package/dist/tools/route-tools.js.map +1 -1
  368. package/dist/tools/ruff-tools.d.ts +32 -0
  369. package/dist/tools/ruff-tools.d.ts.map +1 -0
  370. package/dist/tools/ruff-tools.js +114 -0
  371. package/dist/tools/ruff-tools.js.map +1 -0
  372. package/dist/tools/search-ranker.d.ts.map +1 -1
  373. package/dist/tools/search-ranker.js +7 -0
  374. package/dist/tools/search-ranker.js.map +1 -1
  375. package/dist/tools/serialization-tools.d.ts +24 -0
  376. package/dist/tools/serialization-tools.d.ts.map +1 -0
  377. package/dist/tools/serialization-tools.js +156 -0
  378. package/dist/tools/serialization-tools.js.map +1 -0
  379. package/dist/tools/sql-tools.d.ts +234 -0
  380. package/dist/tools/sql-tools.d.ts.map +1 -0
  381. package/dist/tools/sql-tools.js +1037 -0
  382. package/dist/tools/sql-tools.js.map +1 -0
  383. package/dist/tools/status-tools.d.ts +10 -0
  384. package/dist/tools/status-tools.d.ts.map +1 -0
  385. package/dist/tools/status-tools.js +32 -0
  386. package/dist/tools/status-tools.js.map +1 -0
  387. package/dist/tools/symbol-tools.d.ts +19 -0
  388. package/dist/tools/symbol-tools.d.ts.map +1 -1
  389. package/dist/tools/symbol-tools.js +78 -4
  390. package/dist/tools/symbol-tools.js.map +1 -1
  391. package/dist/tools/test-impact-tools.d.ts +29 -0
  392. package/dist/tools/test-impact-tools.d.ts.map +1 -0
  393. package/dist/tools/test-impact-tools.js +156 -0
  394. package/dist/tools/test-impact-tools.js.map +1 -0
  395. package/dist/tools/typecheck-tools.d.ts +39 -0
  396. package/dist/tools/typecheck-tools.d.ts.map +1 -0
  397. package/dist/tools/typecheck-tools.js +191 -0
  398. package/dist/tools/typecheck-tools.js.map +1 -0
  399. package/dist/tools/wiring-tools.d.ts +19 -0
  400. package/dist/tools/wiring-tools.d.ts.map +1 -0
  401. package/dist/tools/wiring-tools.js +147 -0
  402. package/dist/tools/wiring-tools.js.map +1 -0
  403. package/dist/types.d.ts +9 -1
  404. package/dist/types.d.ts.map +1 -1
  405. package/dist/utils/framework-detect.d.ts +18 -2
  406. package/dist/utils/framework-detect.d.ts.map +1 -1
  407. package/dist/utils/framework-detect.js +150 -3
  408. package/dist/utils/framework-detect.js.map +1 -1
  409. package/dist/utils/import-graph.d.ts +36 -0
  410. package/dist/utils/import-graph.d.ts.map +1 -1
  411. package/dist/utils/import-graph.js +212 -9
  412. package/dist/utils/import-graph.js.map +1 -1
  413. package/dist/utils/language-detect.d.ts +21 -0
  414. package/dist/utils/language-detect.d.ts.map +1 -0
  415. package/dist/utils/language-detect.js +183 -0
  416. package/dist/utils/language-detect.js.map +1 -0
  417. package/dist/utils/nextjs-ast-readers.d.ts +44 -0
  418. package/dist/utils/nextjs-ast-readers.d.ts.map +1 -0
  419. package/dist/utils/nextjs-ast-readers.js +341 -0
  420. package/dist/utils/nextjs-ast-readers.js.map +1 -0
  421. package/dist/utils/nextjs-audit-cache.d.ts +51 -0
  422. package/dist/utils/nextjs-audit-cache.d.ts.map +1 -0
  423. package/dist/utils/nextjs-audit-cache.js +116 -0
  424. package/dist/utils/nextjs-audit-cache.js.map +1 -0
  425. package/dist/utils/nextjs-metadata-readers.d.ts +65 -0
  426. package/dist/utils/nextjs-metadata-readers.d.ts.map +1 -0
  427. package/dist/utils/nextjs-metadata-readers.js +447 -0
  428. package/dist/utils/nextjs-metadata-readers.js.map +1 -0
  429. package/dist/utils/nextjs.d.ts +42 -0
  430. package/dist/utils/nextjs.d.ts.map +1 -0
  431. package/dist/utils/nextjs.js +284 -0
  432. package/dist/utils/nextjs.js.map +1 -0
  433. package/dist/utils/python-import-resolver.d.ts +42 -0
  434. package/dist/utils/python-import-resolver.d.ts.map +1 -0
  435. package/dist/utils/python-import-resolver.js +101 -0
  436. package/dist/utils/python-import-resolver.js.map +1 -0
  437. package/dist/utils/python-imports.d.ts +28 -0
  438. package/dist/utils/python-imports.d.ts.map +1 -0
  439. package/dist/utils/python-imports.js +117 -0
  440. package/dist/utils/python-imports.js.map +1 -0
  441. package/dist/utils/react-alias.d.ts +15 -0
  442. package/dist/utils/react-alias.d.ts.map +1 -0
  443. package/dist/utils/react-alias.js +31 -0
  444. package/dist/utils/react-alias.js.map +1 -0
  445. package/dist/utils/test-file.d.ts.map +1 -1
  446. package/dist/utils/test-file.js +7 -0
  447. package/dist/utils/test-file.js.map +1 -1
  448. package/dist/utils/walk.d.ts +22 -0
  449. package/dist/utils/walk.d.ts.map +1 -1
  450. package/dist/utils/walk.js +70 -2
  451. package/dist/utils/walk.js.map +1 -1
  452. package/package.json +3 -2
  453. package/rules/codesift.md +34 -5
  454. package/rules/codesift.mdc +34 -5
  455. package/rules/codex.md +34 -5
  456. package/rules/gemini.md +34 -5
  457. package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
  458. package/src/parser/languages/tree-sitter-kotlin.wasm +0 -0
  459. package/src/parser/languages/tree-sitter-php.wasm +0 -0
  460. package/src/parser/languages/tree-sitter-php_only.wasm +0 -0
  461. package/src/parser/languages/tree-sitter-python.wasm +0 -0
@@ -0,0 +1,42 @@
1
+ /** Maximum bytes to read when scanning for a directive. */
2
+ export declare const DIRECTIVE_WINDOW = 512;
3
+ /**
4
+ * Scan a file's first 512 bytes for a `"use client"` or `"use server"` directive.
5
+ * Returns the directive string or `null` if not found.
6
+ */
7
+ export declare function scanDirective(filePath: string): Promise<"use client" | "use server" | null>;
8
+ /**
9
+ * Derive a URL path from a file path relative to the repo root.
10
+ * Handles App Router route groups, dynamic segments, and Pages Router conventions.
11
+ */
12
+ export declare function deriveUrlPath(filePath: string, router: "app" | "pages"): string;
13
+ /**
14
+ * Discover Next.js workspaces in a monorepo by finding `next.config.*` files.
15
+ * Returns empty array for single-app projects (config at root only) or no config.
16
+ */
17
+ export declare function discoverWorkspaces(repoRoot: string): Promise<{
18
+ root: string;
19
+ configFile: string;
20
+ }[]>;
21
+ /**
22
+ * Walk up from `filePath` through ancestor directories collecting layout files.
23
+ * Returns relative paths from root to leaf order. Stops at the `app/` boundary.
24
+ * If `filePath` is itself a layout, it is excluded from the chain.
25
+ */
26
+ export declare function computeLayoutChain(filePath: string, repoRoot: string): Promise<string[]>;
27
+ export interface MiddlewareTraceResult {
28
+ file: string;
29
+ matchers: string[];
30
+ applies: boolean;
31
+ }
32
+ /**
33
+ * Find and analyze middleware.ts for the given repo root.
34
+ * Returns null if no middleware file exists.
35
+ * Uses tree-sitter AST to extract matcher config.
36
+ */
37
+ export declare function traceMiddleware(repoRoot: string, urlPath: string): Promise<MiddlewareTraceResult | null>;
38
+ export { parseMetadataExport, extractFetchCalls } from "./nextjs-metadata-readers.js";
39
+ export type { MetadataFields, FetchCall, FetchCallee } from "./nextjs-metadata-readers.js";
40
+ export { extractZodSchema, extractLinkHrefs } from "./nextjs-ast-readers.js";
41
+ export type { ZodShape, ZodFieldType, LinkRef, LinkRefKind } from "./nextjs-ast-readers.js";
42
+ //# sourceMappingURL=nextjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/utils/nextjs.ts"],"names":[],"mappings":"AAKA,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAmCpC;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,GAAG,YAAY,GAAG,IAAI,CAAC,CAU7C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CA0B/E;AAKD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAgCjD;AAID;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB;AA2BD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAsFvC;AAGD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtF,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,284 @@
1
+ import { readFile, readdir, access } from "node:fs/promises";
2
+ import { join, dirname, relative, basename } from "node:path";
3
+ import picomatch from "picomatch";
4
+ import { parseFile } from "../parser/parser-manager.js";
5
+ /** Maximum bytes to read when scanning for a directive. */
6
+ export const DIRECTIVE_WINDOW = 512;
7
+ /**
8
+ * Strip BOM, shebangs, single-line comments, and block comments
9
+ * from the beginning of source text.
10
+ */
11
+ function stripBomAndComments(text) {
12
+ let s = text;
13
+ // Strip BOM
14
+ if (s.charCodeAt(0) === 0xfeff)
15
+ s = s.slice(1);
16
+ // Strip shebang
17
+ if (s.startsWith("#!")) {
18
+ const nl = s.indexOf("\n");
19
+ s = nl >= 0 ? s.slice(nl + 1) : "";
20
+ }
21
+ // Iteratively strip leading comments
22
+ let changed = true;
23
+ while (changed) {
24
+ changed = false;
25
+ s = s.trimStart();
26
+ if (s.startsWith("//")) {
27
+ const nl = s.indexOf("\n");
28
+ s = nl >= 0 ? s.slice(nl + 1) : "";
29
+ changed = true;
30
+ }
31
+ else if (s.startsWith("/*")) {
32
+ const end = s.indexOf("*/");
33
+ if (end >= 0) {
34
+ s = s.slice(end + 2);
35
+ changed = true;
36
+ }
37
+ }
38
+ }
39
+ return s;
40
+ }
41
+ /**
42
+ * Scan a file's first 512 bytes for a `"use client"` or `"use server"` directive.
43
+ * Returns the directive string or `null` if not found.
44
+ */
45
+ export async function scanDirective(filePath) {
46
+ try {
47
+ const buf = await readFile(filePath, { encoding: "utf8", flag: "r" });
48
+ const head = buf.slice(0, DIRECTIVE_WINDOW);
49
+ const stripped = stripBomAndComments(head);
50
+ const match = stripped.match(/^\s*["'`](use (?:client|server))["'`]\s*;?/);
51
+ return match ? match[1] : null;
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ /**
58
+ * Derive a URL path from a file path relative to the repo root.
59
+ * Handles App Router route groups, dynamic segments, and Pages Router conventions.
60
+ */
61
+ export function deriveUrlPath(filePath, router) {
62
+ let p = filePath;
63
+ // Strip leading src/ if present
64
+ if (p.startsWith("src/"))
65
+ p = p.slice(4);
66
+ if (router === "app") {
67
+ // Strip app/ prefix
68
+ p = p.replace(/^app\//, "");
69
+ // Strip convention file at end (page.tsx, layout.tsx, route.ts, etc.)
70
+ p = p.replace(/\/?(page|layout|route|loading|error|not-found|global-error|default|template)\.[jt]sx?$/, "");
71
+ // Strip route groups like (auth)
72
+ p = p.replace(/\([^)]+\)\/?/g, "");
73
+ // Clean up trailing slash
74
+ p = p.replace(/\/+$/, "");
75
+ }
76
+ else {
77
+ // Pages Router: strip pages/ prefix and file extension
78
+ p = p.replace(/^pages\//, "");
79
+ p = p.replace(/\.[jt]sx?$/, "");
80
+ // Strip index at end
81
+ if (p === "index" || p.endsWith("/index")) {
82
+ p = p.replace(/\/?index$/, "");
83
+ }
84
+ }
85
+ return p ? `/${p}` : "/";
86
+ }
87
+ const NEXT_CONFIG_RE = /^next\.config\.(js|mjs|cjs|ts)$/;
88
+ const SKIP_DIRS = new Set(["node_modules", ".git", "dist", ".next", "build"]);
89
+ /**
90
+ * Discover Next.js workspaces in a monorepo by finding `next.config.*` files.
91
+ * Returns empty array for single-app projects (config at root only) or no config.
92
+ */
93
+ export async function discoverWorkspaces(repoRoot) {
94
+ const results = [];
95
+ async function scan(dir, depth) {
96
+ if (depth > 3)
97
+ return;
98
+ let entries;
99
+ try {
100
+ entries = await readdir(dir, { withFileTypes: true });
101
+ }
102
+ catch {
103
+ return;
104
+ }
105
+ for (const entry of entries) {
106
+ if (entry.isDirectory()) {
107
+ if (SKIP_DIRS.has(entry.name) || entry.name.startsWith("."))
108
+ continue;
109
+ await scan(join(dir, entry.name), depth + 1);
110
+ }
111
+ else if (entry.isFile() && NEXT_CONFIG_RE.test(entry.name)) {
112
+ results.push({
113
+ root: dir,
114
+ configFile: join(dir, entry.name),
115
+ });
116
+ }
117
+ }
118
+ }
119
+ await scan(repoRoot, 0);
120
+ // Single config at root = not a monorepo
121
+ if (results.length === 1 && results[0].root === repoRoot) {
122
+ return [];
123
+ }
124
+ return results;
125
+ }
126
+ const LAYOUT_EXTENSIONS = ["tsx", "jsx", "ts", "js"];
127
+ /**
128
+ * Walk up from `filePath` through ancestor directories collecting layout files.
129
+ * Returns relative paths from root to leaf order. Stops at the `app/` boundary.
130
+ * If `filePath` is itself a layout, it is excluded from the chain.
131
+ */
132
+ export async function computeLayoutChain(filePath, repoRoot) {
133
+ const chain = [];
134
+ const rel = filePath.startsWith("/") ? relative(repoRoot, filePath) : filePath;
135
+ const segments = rel.split("/");
136
+ // Find the app/ boundary index
137
+ const appIdx = segments.indexOf("app");
138
+ if (appIdx < 0)
139
+ return [];
140
+ // Walk from app/ directory down to the parent of the target file
141
+ // Skip the file's own directory if the file itself is a layout
142
+ const targetBasename = basename(rel);
143
+ const isLayout = /^layout\.[jt]sx?$/.test(targetBasename);
144
+ const targetDir = dirname(rel);
145
+ // Build paths from app/ to target's parent directory
146
+ for (let i = appIdx; i < segments.length - 1; i++) {
147
+ const dirPath = segments.slice(0, i + 1).join("/");
148
+ // If the target is a layout, skip its own directory
149
+ if (isLayout && dirPath === targetDir)
150
+ continue;
151
+ for (const ext of LAYOUT_EXTENSIONS) {
152
+ const layoutPath = join(dirPath, `layout.${ext}`);
153
+ const absPath = join(repoRoot, layoutPath);
154
+ try {
155
+ await access(absPath);
156
+ chain.push(layoutPath);
157
+ break; // Found a layout in this directory, move to next
158
+ }
159
+ catch {
160
+ // No layout with this extension
161
+ }
162
+ }
163
+ }
164
+ return chain;
165
+ }
166
+ /** Candidate middleware file paths relative to repo root. */
167
+ const MIDDLEWARE_CANDIDATES = [
168
+ "middleware.ts", "middleware.js",
169
+ "src/middleware.ts", "src/middleware.js",
170
+ ];
171
+ /**
172
+ * Convert a Next.js matcher pattern to a picomatch-compatible glob.
173
+ * Next.js uses `:path*` syntax; picomatch uses `**`.
174
+ */
175
+ function matcherToGlob(pattern) {
176
+ return pattern.replace(/:[\w]+\*/g, "**").replace(/:[\w]+/g, "*");
177
+ }
178
+ /**
179
+ * Check if a URL path matches any of the provided Next.js matcher patterns.
180
+ */
181
+ function matchesMatcher(patterns, urlPath) {
182
+ if (patterns.length === 0)
183
+ return true; // No matcher = match all
184
+ return patterns.some((p) => {
185
+ const glob = matcherToGlob(p);
186
+ return picomatch.isMatch(urlPath, glob);
187
+ });
188
+ }
189
+ /**
190
+ * Find and analyze middleware.ts for the given repo root.
191
+ * Returns null if no middleware file exists.
192
+ * Uses tree-sitter AST to extract matcher config.
193
+ */
194
+ export async function traceMiddleware(repoRoot, urlPath) {
195
+ // Find middleware file
196
+ let mwFile = null;
197
+ let mwRelPath = null;
198
+ for (const candidate of MIDDLEWARE_CANDIDATES) {
199
+ const absPath = join(repoRoot, candidate);
200
+ try {
201
+ await access(absPath);
202
+ mwFile = absPath;
203
+ mwRelPath = candidate;
204
+ break;
205
+ }
206
+ catch {
207
+ // Not found
208
+ }
209
+ }
210
+ if (!mwFile || !mwRelPath)
211
+ return null;
212
+ // Parse the middleware file with tree-sitter
213
+ let source;
214
+ try {
215
+ source = await readFile(mwFile, "utf8");
216
+ }
217
+ catch {
218
+ return { file: mwRelPath, matchers: [], applies: true };
219
+ }
220
+ const tree = await parseFile(mwFile, source);
221
+ if (!tree) {
222
+ return { file: mwRelPath, matchers: [], applies: true };
223
+ }
224
+ // Find `export const config = { matcher: ... }`
225
+ const exportStatements = tree.rootNode.descendantsOfType("export_statement");
226
+ let matchers = [];
227
+ let foundConfig = false;
228
+ for (const exportNode of exportStatements) {
229
+ const decl = exportNode.descendantsOfType("variable_declarator");
230
+ for (const d of decl) {
231
+ const nameNode = d.childForFieldName("name");
232
+ if (nameNode?.text !== "config")
233
+ continue;
234
+ foundConfig = true;
235
+ const init = d.childForFieldName("value");
236
+ if (!init)
237
+ continue;
238
+ // Find the `matcher` property inside the object
239
+ const pairs = init.descendantsOfType("pair");
240
+ for (const pair of pairs) {
241
+ const key = pair.childForFieldName("key");
242
+ if (key?.text !== "matcher")
243
+ continue;
244
+ const value = pair.childForFieldName("value");
245
+ if (!value)
246
+ continue;
247
+ if (value.type === "string") {
248
+ // Single string matcher
249
+ const text = value.text.slice(1, -1); // Remove quotes
250
+ matchers = [text];
251
+ }
252
+ else if (value.type === "array") {
253
+ // Array of matchers
254
+ const elements = value.namedChildren;
255
+ for (const el of elements) {
256
+ if (el.type === "string") {
257
+ matchers.push(el.text.slice(1, -1));
258
+ }
259
+ else {
260
+ // Non-literal element — fail-open
261
+ matchers = ["<computed>"];
262
+ return { file: mwRelPath, matchers, applies: true };
263
+ }
264
+ }
265
+ }
266
+ else {
267
+ // Computed matcher (identifier, call expression, etc.)
268
+ matchers = ["<computed>"];
269
+ return { file: mwRelPath, matchers, applies: true };
270
+ }
271
+ }
272
+ }
273
+ }
274
+ if (!foundConfig) {
275
+ // No config export → match all routes (Next.js default)
276
+ return { file: mwRelPath, matchers: [], applies: true };
277
+ }
278
+ const applies = matchesMatcher(matchers, urlPath);
279
+ return { file: mwRelPath, matchers, applies };
280
+ }
281
+ // Re-export AST readers for backward compatibility
282
+ export { parseMetadataExport, extractFetchCalls } from "./nextjs-metadata-readers.js";
283
+ export { extractZodSchema, extractLinkHrefs } from "./nextjs-ast-readers.js";
284
+ //# sourceMappingURL=nextjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/utils/nextjs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Python import resolution — pure functions, no I/O.
3
+ *
4
+ * Handles:
5
+ * - Relative imports (`from . import X`, `from ..pkg import Y`) via dot
6
+ * counting and package-root walking
7
+ * - Absolute imports (`import X`, `from X.Y import Z`) via index lookup
8
+ * with automatic `src/` layout detection
9
+ * - `.py` and `__init__.py` resolution
10
+ */
11
+ /**
12
+ * Walk upward from a file to find the innermost package root.
13
+ * A "package" is a directory containing `__init__.py`. The package root is
14
+ * the innermost ancestor directory (including the file's own directory) that
15
+ * contains `__init__.py`.
16
+ *
17
+ * If no ancestor has `__init__.py`, returns the file's directory.
18
+ * If the file is at repo root, returns "".
19
+ */
20
+ export declare function findPackageRoot(filePath: string, indexedFiles: Set<string>): string;
21
+ /**
22
+ * Detect if the project uses a `src/` layout (e.g., `src/myapp/__init__.py`).
23
+ * Returns the layout root name (`"src"`) or `null` if no src layout detected.
24
+ */
25
+ export declare function detectSrcLayout(indexedFiles: string[]): string | null;
26
+ /**
27
+ * Resolve a Python import to a file path in the indexed tree.
28
+ *
29
+ * Algorithm:
30
+ * - If `level > 0` (relative import): walk up `level - 1` dirs from the
31
+ * importing file's package root, then resolve the remaining dotted path
32
+ * - If `level === 0` (absolute import): try each search root + dotted path,
33
+ * resolving to `.py` first, then `/__init__.py`, then null
34
+ *
35
+ * Returns the resolved file path (relative to repo root) or `null` if the
36
+ * import cannot be resolved to an indexed file (stdlib, third-party, etc.).
37
+ */
38
+ export declare function resolvePythonImport(imp: {
39
+ module: string;
40
+ level: number;
41
+ }, importerFile: string, indexedFiles: string[] | Set<string>, srcLayout?: string | null): string | null;
42
+ //# sourceMappingURL=python-import-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-import-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/python-import-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,MAAM,CAcR;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAMrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACtC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EACpC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,GAAG,IAAI,CAgCf"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Python import resolution — pure functions, no I/O.
3
+ *
4
+ * Handles:
5
+ * - Relative imports (`from . import X`, `from ..pkg import Y`) via dot
6
+ * counting and package-root walking
7
+ * - Absolute imports (`import X`, `from X.Y import Z`) via index lookup
8
+ * with automatic `src/` layout detection
9
+ * - `.py` and `__init__.py` resolution
10
+ */
11
+ /**
12
+ * Walk upward from a file to find the innermost package root.
13
+ * A "package" is a directory containing `__init__.py`. The package root is
14
+ * the innermost ancestor directory (including the file's own directory) that
15
+ * contains `__init__.py`.
16
+ *
17
+ * If no ancestor has `__init__.py`, returns the file's directory.
18
+ * If the file is at repo root, returns "".
19
+ */
20
+ export function findPackageRoot(filePath, indexedFiles) {
21
+ const segments = filePath.split("/");
22
+ segments.pop(); // remove filename
23
+ // Walk from deepest dir upward; return first dir with __init__.py
24
+ for (let i = segments.length; i >= 1; i--) {
25
+ const dir = segments.slice(0, i).join("/");
26
+ if (indexedFiles.has(`${dir}/__init__.py`)) {
27
+ return dir;
28
+ }
29
+ }
30
+ // No package found — return file's directory (or "" for repo root)
31
+ return segments.join("/");
32
+ }
33
+ /**
34
+ * Detect if the project uses a `src/` layout (e.g., `src/myapp/__init__.py`).
35
+ * Returns the layout root name (`"src"`) or `null` if no src layout detected.
36
+ */
37
+ export function detectSrcLayout(indexedFiles) {
38
+ for (const f of indexedFiles) {
39
+ const match = f.match(/^src\/([^/]+)\/__init__\.py$/);
40
+ if (match)
41
+ return "src";
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Resolve a Python import to a file path in the indexed tree.
47
+ *
48
+ * Algorithm:
49
+ * - If `level > 0` (relative import): walk up `level - 1` dirs from the
50
+ * importing file's package root, then resolve the remaining dotted path
51
+ * - If `level === 0` (absolute import): try each search root + dotted path,
52
+ * resolving to `.py` first, then `/__init__.py`, then null
53
+ *
54
+ * Returns the resolved file path (relative to repo root) or `null` if the
55
+ * import cannot be resolved to an indexed file (stdlib, third-party, etc.).
56
+ */
57
+ export function resolvePythonImport(imp, importerFile, indexedFiles, srcLayout) {
58
+ const fileSet = indexedFiles instanceof Set ? indexedFiles : new Set(indexedFiles);
59
+ const { module, level } = imp;
60
+ if (level > 0) {
61
+ // Relative import
62
+ const packageRoot = findPackageRoot(importerFile, fileSet);
63
+ const packageSegments = packageRoot === "" ? [] : packageRoot.split("/");
64
+ // Walk up (level - 1) directories from package root
65
+ if (level - 1 > packageSegments.length)
66
+ return null;
67
+ const baseSegments = packageSegments.slice(0, packageSegments.length - (level - 1));
68
+ const moduleSegments = module === "" ? [] : module.split(".");
69
+ const fullPath = [...baseSegments, ...moduleSegments].join("/");
70
+ return tryResolve(fullPath, fileSet);
71
+ }
72
+ // Absolute import — try repo root first, then src/ layout
73
+ const moduleSegments = module.split(".");
74
+ const resolvedSrcLayout = srcLayout !== undefined ? srcLayout : detectSrcLayout([...fileSet]);
75
+ const searchRoots = ["", resolvedSrcLayout].filter((r) => r !== null);
76
+ for (const root of searchRoots) {
77
+ const base = root === "" ? moduleSegments.join("/") : `${root}/${moduleSegments.join("/")}`;
78
+ const resolved = tryResolve(base, fileSet);
79
+ if (resolved)
80
+ return resolved;
81
+ }
82
+ return null;
83
+ }
84
+ /**
85
+ * Try to resolve a path to an indexed file.
86
+ * Tries `.py` first, then `/__init__.py`.
87
+ */
88
+ function tryResolve(basePath, fileSet) {
89
+ if (basePath === "")
90
+ return null;
91
+ // Try direct .py file
92
+ const asPyFile = `${basePath}.py`;
93
+ if (fileSet.has(asPyFile))
94
+ return asPyFile;
95
+ // Try as package __init__.py
96
+ const asInit = `${basePath}/__init__.py`;
97
+ if (fileSet.has(asInit))
98
+ return asInit;
99
+ return null;
100
+ }
101
+ //# sourceMappingURL=python-import-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-import-resolver.js","sourceRoot":"","sources":["../../src/utils/python-import-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Python import extraction via tree-sitter AST.
3
+ *
4
+ * Walks `import_statement`, `import_from_statement`, and `if TYPE_CHECKING`
5
+ * blocks to produce a flat list of raw import descriptors. Resolution to
6
+ * file paths is the resolver's job (see python-import-resolver.ts).
7
+ *
8
+ * Because this uses the AST (not regex), string literals and comments
9
+ * cannot produce false positives.
10
+ */
11
+ import type Parser from "web-tree-sitter";
12
+ export interface PythonImportRef {
13
+ /** Dotted module path (empty string for `from . import X`) */
14
+ module: string;
15
+ /** Number of leading dots on relative imports (0 = absolute) */
16
+ level: number;
17
+ /** True if inside `if TYPE_CHECKING:` block */
18
+ is_type_only: boolean;
19
+ /** True for `from X import *` */
20
+ is_star: boolean;
21
+ /** Original source text for debugging */
22
+ raw: string;
23
+ }
24
+ /**
25
+ * Extract all Python imports from a parsed tree-sitter tree.
26
+ */
27
+ export declare function extractPythonImports(tree: Parser.Tree): PythonImportRef[];
28
+ //# sourceMappingURL=python-imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-imports.d.ts","sourceRoot":"","sources":["../../src/utils/python-imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,YAAY,EAAE,OAAO,CAAC;IACtB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,IAAI,GAChB,eAAe,EAAE,CAoGnB"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Extract all Python imports from a parsed tree-sitter tree.
3
+ */
4
+ export function extractPythonImports(tree) {
5
+ const imports = [];
6
+ function walk(node, inTypeChecking) {
7
+ switch (node.type) {
8
+ case "if_statement": {
9
+ // Detect `if TYPE_CHECKING:` or `if typing.TYPE_CHECKING:`
10
+ const condition = node.childForFieldName("condition");
11
+ const conditionText = condition?.text ?? "";
12
+ const isTypeCheck = /\bTYPE_CHECKING\b/.test(conditionText);
13
+ // Walk the consequence with type_only flag if this is a TYPE_CHECKING block
14
+ const consequence = node.childForFieldName("consequence");
15
+ if (consequence) {
16
+ walk(consequence, inTypeChecking || isTypeCheck);
17
+ }
18
+ // Walk elif / else clauses (named "alternative") without type_only.
19
+ // Compare by start index since node refs from childForFieldName are
20
+ // distinct JS objects from the namedChildren array.
21
+ const conditionStart = condition?.startIndex;
22
+ const consequenceStart = consequence?.startIndex;
23
+ for (const child of node.namedChildren) {
24
+ if (child.startIndex === conditionStart)
25
+ continue;
26
+ if (child.startIndex === consequenceStart)
27
+ continue;
28
+ walk(child, inTypeChecking);
29
+ }
30
+ return;
31
+ }
32
+ case "import_statement": {
33
+ // `import a`, `import a.b`, `import a, b, c`
34
+ // Children are `dotted_name` or `aliased_import` nodes
35
+ for (const child of node.namedChildren) {
36
+ let moduleName = null;
37
+ if (child.type === "dotted_name") {
38
+ moduleName = child.text;
39
+ }
40
+ else if (child.type === "aliased_import") {
41
+ const name = child.childForFieldName("name");
42
+ moduleName = name?.text ?? null;
43
+ }
44
+ if (moduleName) {
45
+ imports.push({
46
+ module: moduleName,
47
+ level: 0,
48
+ is_type_only: inTypeChecking,
49
+ is_star: false,
50
+ raw: node.text,
51
+ });
52
+ }
53
+ }
54
+ return;
55
+ }
56
+ case "import_from_statement": {
57
+ // `from X import Y`, `from . import Y`, `from ..X import Y`, `from X import *`
58
+ const moduleNameNode = node.childForFieldName("module_name");
59
+ let level = 0;
60
+ let module = "";
61
+ if (moduleNameNode) {
62
+ if (moduleNameNode.type === "relative_import") {
63
+ // Count leading dots and find optional dotted_name
64
+ level = countRelativeDots(moduleNameNode);
65
+ const dottedName = moduleNameNode.namedChildren.find((c) => c.type === "dotted_name");
66
+ module = dottedName?.text ?? "";
67
+ }
68
+ else if (moduleNameNode.type === "dotted_name") {
69
+ module = moduleNameNode.text;
70
+ }
71
+ }
72
+ // Detect wildcard_import `import *`
73
+ const is_star = node.namedChildren.some((c) => c.type === "wildcard_import");
74
+ imports.push({
75
+ module,
76
+ level,
77
+ is_type_only: inTypeChecking,
78
+ is_star,
79
+ raw: node.text,
80
+ });
81
+ return;
82
+ }
83
+ default: {
84
+ for (const child of node.namedChildren) {
85
+ walk(child, inTypeChecking);
86
+ }
87
+ return;
88
+ }
89
+ }
90
+ }
91
+ walk(tree.rootNode, false);
92
+ return imports;
93
+ }
94
+ /**
95
+ * Count the leading dots in a `relative_import` node.
96
+ * The dots appear as unnamed `import_prefix` child node or as separate
97
+ * "." tokens depending on grammar version.
98
+ */
99
+ function countRelativeDots(relImport) {
100
+ // Walk all children (named + unnamed); each "." token represents one level
101
+ let dots = 0;
102
+ for (let i = 0; i < relImport.childCount; i++) {
103
+ const child = relImport.child(i);
104
+ if (!child)
105
+ continue;
106
+ if (child.type === "import_prefix") {
107
+ // Some grammar versions expose dots as an import_prefix node;
108
+ // count dots in its text
109
+ dots += (child.text.match(/\./g) ?? []).length;
110
+ }
111
+ else if (child.type === ".") {
112
+ dots += 1;
113
+ }
114
+ }
115
+ return dots;
116
+ }
117
+ //# sourceMappingURL=python-imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-imports.js","sourceRoot":"","sources":["../../src/utils/python-imports.ts"],"names":[],"mappings":"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"}