codesift-mcp 0.13.1 → 0.15.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 (546) hide show
  1. package/README.md +5 -1
  2. package/dist/cli/commands-admin.d.ts +18 -0
  3. package/dist/cli/commands-admin.d.ts.map +1 -0
  4. package/dist/cli/commands-admin.js +187 -0
  5. package/dist/cli/commands-admin.js.map +1 -0
  6. package/dist/cli/commands-daemon.d.ts +42 -0
  7. package/dist/cli/commands-daemon.d.ts.map +1 -0
  8. package/dist/cli/commands-daemon.js +163 -0
  9. package/dist/cli/commands-daemon.js.map +1 -0
  10. package/dist/cli/commands-index.d.ts +12 -0
  11. package/dist/cli/commands-index.d.ts.map +1 -0
  12. package/dist/cli/commands-index.js +133 -0
  13. package/dist/cli/commands-index.js.map +1 -0
  14. package/dist/cli/commands-maintenance.d.ts +12 -0
  15. package/dist/cli/commands-maintenance.d.ts.map +1 -0
  16. package/dist/cli/commands-maintenance.js +409 -0
  17. package/dist/cli/commands-maintenance.js.map +1 -0
  18. package/dist/cli/commands-query.d.ts +21 -0
  19. package/dist/cli/commands-query.d.ts.map +1 -0
  20. package/dist/cli/commands-query.js +270 -0
  21. package/dist/cli/commands-query.js.map +1 -0
  22. package/dist/cli/commands.d.ts +2 -36
  23. package/dist/cli/commands.d.ts.map +1 -1
  24. package/dist/cli/commands.js +8 -854
  25. package/dist/cli/commands.js.map +1 -1
  26. package/dist/cli/embed-child.js +13 -2
  27. package/dist/cli/embed-child.js.map +1 -1
  28. package/dist/cli/hooks/pre-tool-use.d.ts +1 -0
  29. package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -1
  30. package/dist/cli/hooks/pre-tool-use.js +11 -2
  31. package/dist/cli/hooks/pre-tool-use.js.map +1 -1
  32. package/dist/config.d.ts +13 -0
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +21 -0
  35. package/dist/config.js.map +1 -1
  36. package/dist/formatters-core.d.ts +7 -0
  37. package/dist/formatters-core.d.ts.map +1 -1
  38. package/dist/formatters-core.js +14 -3
  39. package/dist/formatters-core.js.map +1 -1
  40. package/dist/instructions.d.ts +1 -1
  41. package/dist/instructions.d.ts.map +1 -1
  42. package/dist/instructions.js +5 -2
  43. package/dist/instructions.js.map +1 -1
  44. package/dist/parser/extractors/hono-inline-analyzer.js +2 -2
  45. package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -1
  46. package/dist/parser/extractors/php-class-metadata.d.ts +10 -0
  47. package/dist/parser/extractors/php-class-metadata.d.ts.map +1 -0
  48. package/dist/parser/extractors/php-class-metadata.js +65 -0
  49. package/dist/parser/extractors/php-class-metadata.js.map +1 -0
  50. package/dist/parser/extractors/php-doc.d.ts +13 -0
  51. package/dist/parser/extractors/php-doc.d.ts.map +1 -0
  52. package/dist/parser/extractors/php-doc.js +39 -0
  53. package/dist/parser/extractors/php-doc.js.map +1 -0
  54. package/dist/parser/extractors/php-node-metadata.d.ts +26 -0
  55. package/dist/parser/extractors/php-node-metadata.d.ts.map +1 -0
  56. package/dist/parser/extractors/php-node-metadata.js +132 -0
  57. package/dist/parser/extractors/php-node-metadata.js.map +1 -0
  58. package/dist/parser/extractors/php-symbol-builders.d.ts +13 -0
  59. package/dist/parser/extractors/php-symbol-builders.d.ts.map +1 -0
  60. package/dist/parser/extractors/php-symbol-builders.js +58 -0
  61. package/dist/parser/extractors/php-symbol-builders.js.map +1 -0
  62. package/dist/parser/extractors/php-walker.d.ts +4 -0
  63. package/dist/parser/extractors/php-walker.d.ts.map +1 -0
  64. package/dist/parser/extractors/php-walker.js +238 -0
  65. package/dist/parser/extractors/php-walker.js.map +1 -0
  66. package/dist/parser/extractors/php.d.ts +2 -33
  67. package/dist/parser/extractors/php.d.ts.map +1 -1
  68. package/dist/parser/extractors/php.js +2 -747
  69. package/dist/parser/extractors/php.js.map +1 -1
  70. package/dist/register-tool-groups/core/search.d.ts.map +1 -1
  71. package/dist/register-tool-groups/core/search.js +14 -0
  72. package/dist/register-tool-groups/core/search.js.map +1 -1
  73. package/dist/register-tool-groups/core/symbols.d.ts.map +1 -1
  74. package/dist/register-tool-groups/core/symbols.js +50 -5
  75. package/dist/register-tool-groups/core/symbols.js.map +1 -1
  76. package/dist/register-tool-loaders.d.ts +11 -11
  77. package/dist/register-tool-loaders.d.ts.map +1 -1
  78. package/dist/register-tools/runtime.d.ts +11 -0
  79. package/dist/register-tools/runtime.d.ts.map +1 -1
  80. package/dist/register-tools/runtime.js +40 -0
  81. package/dist/register-tools/runtime.js.map +1 -1
  82. package/dist/register-tools.d.ts.map +1 -1
  83. package/dist/register-tools.js +5 -1
  84. package/dist/register-tools.js.map +1 -1
  85. package/dist/retrieval/semantic-handlers.d.ts.map +1 -1
  86. package/dist/retrieval/semantic-handlers.js +10 -3
  87. package/dist/retrieval/semantic-handlers.js.map +1 -1
  88. package/dist/search/semantic.d.ts +2 -0
  89. package/dist/search/semantic.d.ts.map +1 -1
  90. package/dist/search/semantic.js +41 -9
  91. package/dist/search/semantic.js.map +1 -1
  92. package/dist/server.d.ts.map +1 -1
  93. package/dist/server.js +54 -2
  94. package/dist/server.js.map +1 -1
  95. package/dist/storage/_shared.d.ts +21 -0
  96. package/dist/storage/_shared.d.ts.map +1 -1
  97. package/dist/storage/_shared.js +36 -0
  98. package/dist/storage/_shared.js.map +1 -1
  99. package/dist/storage/chunk-store.d.ts +14 -2
  100. package/dist/storage/chunk-store.d.ts.map +1 -1
  101. package/dist/storage/chunk-store.js +214 -34
  102. package/dist/storage/chunk-store.js.map +1 -1
  103. package/dist/storage/embedding-store.d.ts +0 -12
  104. package/dist/storage/embedding-store.d.ts.map +1 -1
  105. package/dist/storage/embedding-store.js +69 -9
  106. package/dist/storage/embedding-store.js.map +1 -1
  107. package/dist/storage/index-cache.d.ts +12 -0
  108. package/dist/storage/index-cache.d.ts.map +1 -0
  109. package/dist/storage/index-cache.js +89 -0
  110. package/dist/storage/index-cache.js.map +1 -0
  111. package/dist/storage/index-footprint.d.ts +12 -0
  112. package/dist/storage/index-footprint.d.ts.map +1 -0
  113. package/dist/storage/index-footprint.js +41 -0
  114. package/dist/storage/index-footprint.js.map +1 -0
  115. package/dist/storage/index-json-mutations.d.ts +11 -0
  116. package/dist/storage/index-json-mutations.d.ts.map +1 -0
  117. package/dist/storage/index-json-mutations.js +93 -0
  118. package/dist/storage/index-json-mutations.js.map +1 -0
  119. package/dist/storage/index-migration.d.ts +22 -0
  120. package/dist/storage/index-migration.d.ts.map +1 -0
  121. package/dist/storage/index-migration.js +80 -0
  122. package/dist/storage/index-migration.js.map +1 -0
  123. package/dist/storage/index-store.d.ts +26 -55
  124. package/dist/storage/index-store.d.ts.map +1 -1
  125. package/dist/storage/index-store.js +82 -350
  126. package/dist/storage/index-store.js.map +1 -1
  127. package/dist/storage/index-version.d.ts +39 -0
  128. package/dist/storage/index-version.d.ts.map +1 -0
  129. package/dist/storage/index-version.js +87 -0
  130. package/dist/storage/index-version.js.map +1 -0
  131. package/dist/storage/registry.d.ts +9 -1
  132. package/dist/storage/registry.d.ts.map +1 -1
  133. package/dist/storage/registry.js +233 -9
  134. package/dist/storage/registry.js.map +1 -1
  135. package/dist/storage/shared-embedding-cache.d.ts +23 -3
  136. package/dist/storage/shared-embedding-cache.d.ts.map +1 -1
  137. package/dist/storage/shared-embedding-cache.js +300 -45
  138. package/dist/storage/shared-embedding-cache.js.map +1 -1
  139. package/dist/storage/sqlite/accessors.d.ts +34 -0
  140. package/dist/storage/sqlite/accessors.d.ts.map +1 -0
  141. package/dist/storage/sqlite/accessors.js +178 -0
  142. package/dist/storage/sqlite/accessors.js.map +1 -0
  143. package/dist/storage/sqlite/connection.d.ts +43 -0
  144. package/dist/storage/sqlite/connection.d.ts.map +1 -0
  145. package/dist/storage/sqlite/connection.js +241 -0
  146. package/dist/storage/sqlite/connection.js.map +1 -0
  147. package/dist/storage/sqlite/errors.d.ts +38 -0
  148. package/dist/storage/sqlite/errors.d.ts.map +1 -0
  149. package/dist/storage/sqlite/errors.js +150 -0
  150. package/dist/storage/sqlite/errors.js.map +1 -0
  151. package/dist/storage/sqlite/index-io.d.ts +49 -0
  152. package/dist/storage/sqlite/index-io.d.ts.map +1 -0
  153. package/dist/storage/sqlite/index-io.js +268 -0
  154. package/dist/storage/sqlite/index-io.js.map +1 -0
  155. package/dist/storage/sqlite/meta.d.ts +41 -0
  156. package/dist/storage/sqlite/meta.d.ts.map +1 -0
  157. package/dist/storage/sqlite/meta.js +28 -0
  158. package/dist/storage/sqlite/meta.js.map +1 -0
  159. package/dist/storage/sqlite/rows.d.ts +64 -0
  160. package/dist/storage/sqlite/rows.d.ts.map +1 -0
  161. package/dist/storage/sqlite/rows.js +186 -0
  162. package/dist/storage/sqlite/rows.js.map +1 -0
  163. package/dist/storage/sqlite/runtime.d.ts +6 -0
  164. package/dist/storage/sqlite/runtime.d.ts.map +1 -0
  165. package/dist/storage/sqlite/runtime.js +31 -0
  166. package/dist/storage/sqlite/runtime.js.map +1 -0
  167. package/dist/storage/sqlite/schema.d.ts +34 -0
  168. package/dist/storage/sqlite/schema.d.ts.map +1 -0
  169. package/dist/storage/sqlite/schema.js +98 -0
  170. package/dist/storage/sqlite/schema.js.map +1 -0
  171. package/dist/storage/sqlite-index-store.d.ts +40 -80
  172. package/dist/storage/sqlite-index-store.d.ts.map +1 -1
  173. package/dist/storage/sqlite-index-store.js +32 -577
  174. package/dist/storage/sqlite-index-store.js.map +1 -1
  175. package/dist/storage/telemetry/config.d.ts.map +1 -1
  176. package/dist/storage/telemetry/config.js +15 -3
  177. package/dist/storage/telemetry/config.js.map +1 -1
  178. package/dist/storage/telemetry/payload.d.ts.map +1 -1
  179. package/dist/storage/telemetry/payload.js +4 -1
  180. package/dist/storage/telemetry/payload.js.map +1 -1
  181. package/dist/storage/telemetry/retro-aggregator.d.ts +48 -0
  182. package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -0
  183. package/dist/storage/telemetry/retro-aggregator.js +221 -0
  184. package/dist/storage/telemetry/retro-aggregator.js.map +1 -0
  185. package/dist/storage/telemetry/sanitizer.d.ts +46 -0
  186. package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
  187. package/dist/storage/telemetry/sanitizer.js +25 -0
  188. package/dist/storage/telemetry/sanitizer.js.map +1 -1
  189. package/dist/storage/telemetry/uploader.d.ts +3 -1
  190. package/dist/storage/telemetry/uploader.d.ts.map +1 -1
  191. package/dist/storage/telemetry/uploader.js +161 -18
  192. package/dist/storage/telemetry/uploader.js.map +1 -1
  193. package/dist/storage/workspace-resolver.js +1 -1
  194. package/dist/storage/workspace-resolver.js.map +1 -1
  195. package/dist/tools/cross-repo-contract-adapters.d.ts +39 -0
  196. package/dist/tools/cross-repo-contract-adapters.d.ts.map +1 -0
  197. package/dist/tools/cross-repo-contract-adapters.js +70 -0
  198. package/dist/tools/cross-repo-contract-adapters.js.map +1 -0
  199. package/dist/tools/cross-repo-contract-group.d.ts +17 -0
  200. package/dist/tools/cross-repo-contract-group.d.ts.map +1 -0
  201. package/dist/tools/cross-repo-contract-group.js +89 -0
  202. package/dist/tools/cross-repo-contract-group.js.map +1 -0
  203. package/dist/tools/cross-repo-contract-matcher.d.ts +24 -0
  204. package/dist/tools/cross-repo-contract-matcher.d.ts.map +1 -0
  205. package/dist/tools/cross-repo-contract-matcher.js +134 -0
  206. package/dist/tools/cross-repo-contract-matcher.js.map +1 -0
  207. package/dist/tools/cross-repo-contract-resolver.d.ts +9 -0
  208. package/dist/tools/cross-repo-contract-resolver.d.ts.map +1 -0
  209. package/dist/tools/cross-repo-contract-resolver.js +86 -0
  210. package/dist/tools/cross-repo-contract-resolver.js.map +1 -0
  211. package/dist/tools/cross-repo-contract-tools.d.ts +12 -135
  212. package/dist/tools/cross-repo-contract-tools.d.ts.map +1 -1
  213. package/dist/tools/cross-repo-contract-tools.js +8 -589
  214. package/dist/tools/cross-repo-contract-tools.js.map +1 -1
  215. package/dist/tools/cross-repo-contract-types.d.ts +30 -0
  216. package/dist/tools/cross-repo-contract-types.d.ts.map +1 -0
  217. package/dist/tools/cross-repo-contract-types.js +3 -0
  218. package/dist/tools/cross-repo-contract-types.js.map +1 -0
  219. package/dist/tools/cross-repo-outbound-calls.d.ts +28 -0
  220. package/dist/tools/cross-repo-outbound-calls.d.ts.map +1 -0
  221. package/dist/tools/cross-repo-outbound-calls.js +347 -0
  222. package/dist/tools/cross-repo-outbound-calls.js.map +1 -0
  223. package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -1
  224. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +2 -0
  225. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -1
  226. package/dist/tools/cross-repo-outbound-lexer/types.d.ts +2 -0
  227. package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -1
  228. package/dist/tools/index-tools/file-indexer.js +3 -3
  229. package/dist/tools/index-tools/file-indexer.js.map +1 -1
  230. package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
  231. package/dist/tools/index-tools/folder-indexer.js +51 -3
  232. package/dist/tools/index-tools/folder-indexer.js.map +1 -1
  233. package/dist/tools/index-tools/parse.d.ts +12 -3
  234. package/dist/tools/index-tools/parse.d.ts.map +1 -1
  235. package/dist/tools/index-tools/parse.js +33 -8
  236. package/dist/tools/index-tools/parse.js.map +1 -1
  237. package/dist/tools/index-tools/registry.d.ts +35 -0
  238. package/dist/tools/index-tools/registry.d.ts.map +1 -1
  239. package/dist/tools/index-tools/registry.js +167 -3
  240. package/dist/tools/index-tools/registry.js.map +1 -1
  241. package/dist/tools/index-tools/state.d.ts +31 -0
  242. package/dist/tools/index-tools/state.d.ts.map +1 -1
  243. package/dist/tools/index-tools/state.js +53 -0
  244. package/dist/tools/index-tools/state.js.map +1 -1
  245. package/dist/tools/index-tools/types.d.ts +9 -0
  246. package/dist/tools/index-tools/types.d.ts.map +1 -1
  247. package/dist/tools/index-tools/watcher.js +3 -3
  248. package/dist/tools/index-tools/watcher.js.map +1 -1
  249. package/dist/tools/index-tools/worktree-seed.d.ts +44 -0
  250. package/dist/tools/index-tools/worktree-seed.d.ts.map +1 -0
  251. package/dist/tools/index-tools/worktree-seed.js +302 -0
  252. package/dist/tools/index-tools/worktree-seed.js.map +1 -0
  253. package/dist/tools/index-tools.d.ts +2 -2
  254. package/dist/tools/index-tools.d.ts.map +1 -1
  255. package/dist/tools/index-tools.js +5 -3
  256. package/dist/tools/index-tools.js.map +1 -1
  257. package/dist/tools/nest-ext-tools/graphql.d.ts +17 -0
  258. package/dist/tools/nest-ext-tools/graphql.d.ts.map +1 -0
  259. package/dist/tools/nest-ext-tools/graphql.js +54 -0
  260. package/dist/tools/nest-ext-tools/graphql.js.map +1 -0
  261. package/dist/tools/nest-ext-tools/microservice.d.ts +17 -0
  262. package/dist/tools/nest-ext-tools/microservice.d.ts.map +1 -0
  263. package/dist/tools/nest-ext-tools/microservice.js +51 -0
  264. package/dist/tools/nest-ext-tools/microservice.js.map +1 -0
  265. package/dist/tools/nest-ext-tools/openapi.d.ts +81 -0
  266. package/dist/tools/nest-ext-tools/openapi.d.ts.map +1 -0
  267. package/dist/tools/nest-ext-tools/openapi.js +254 -0
  268. package/dist/tools/nest-ext-tools/openapi.js.map +1 -0
  269. package/dist/tools/nest-ext-tools/queue.d.ts +27 -0
  270. package/dist/tools/nest-ext-tools/queue.d.ts.map +1 -0
  271. package/dist/tools/nest-ext-tools/queue.js +95 -0
  272. package/dist/tools/nest-ext-tools/queue.js.map +1 -0
  273. package/dist/tools/nest-ext-tools/schedule.d.ts +19 -0
  274. package/dist/tools/nest-ext-tools/schedule.d.ts.map +1 -0
  275. package/dist/tools/nest-ext-tools/schedule.js +89 -0
  276. package/dist/tools/nest-ext-tools/schedule.js.map +1 -0
  277. package/dist/tools/nest-ext-tools/scope.d.ts +19 -0
  278. package/dist/tools/nest-ext-tools/scope.d.ts.map +1 -0
  279. package/dist/tools/nest-ext-tools/scope.js +151 -0
  280. package/dist/tools/nest-ext-tools/scope.js.map +1 -0
  281. package/dist/tools/nest-ext-tools/shared.d.ts +33 -0
  282. package/dist/tools/nest-ext-tools/shared.d.ts.map +1 -0
  283. package/dist/tools/nest-ext-tools/shared.js +279 -0
  284. package/dist/tools/nest-ext-tools/shared.js.map +1 -0
  285. package/dist/tools/nest-ext-tools/typeorm.d.ts +22 -0
  286. package/dist/tools/nest-ext-tools/typeorm.d.ts.map +1 -0
  287. package/dist/tools/nest-ext-tools/typeorm.js +59 -0
  288. package/dist/tools/nest-ext-tools/typeorm.js.map +1 -0
  289. package/dist/tools/nest-ext-tools/websocket.d.ts +21 -0
  290. package/dist/tools/nest-ext-tools/websocket.d.ts.map +1 -0
  291. package/dist/tools/nest-ext-tools/websocket.js +70 -0
  292. package/dist/tools/nest-ext-tools/websocket.js.map +1 -0
  293. package/dist/tools/nest-ext-tools.d.ts +10 -204
  294. package/dist/tools/nest-ext-tools.d.ts.map +1 -1
  295. package/dist/tools/nest-ext-tools.js +10 -749
  296. package/dist/tools/nest-ext-tools.js.map +1 -1
  297. package/dist/tools/perf-tools.js +2 -2
  298. package/dist/tools/plan-turn/stale-index.d.ts +32 -0
  299. package/dist/tools/plan-turn/stale-index.d.ts.map +1 -1
  300. package/dist/tools/plan-turn/stale-index.js +42 -5
  301. package/dist/tools/plan-turn/stale-index.js.map +1 -1
  302. package/dist/tools/python-audit/checks/dead-code.d.ts +1 -1
  303. package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -1
  304. package/dist/tools/python-constants/constant-match.d.ts +5 -0
  305. package/dist/tools/python-constants/constant-match.d.ts.map +1 -0
  306. package/dist/tools/python-constants/constant-match.js +24 -0
  307. package/dist/tools/python-constants/constant-match.js.map +1 -0
  308. package/dist/tools/python-constants/file-context.d.ts +5 -0
  309. package/dist/tools/python-constants/file-context.d.ts.map +1 -0
  310. package/dist/tools/python-constants/file-context.js +91 -0
  311. package/dist/tools/python-constants/file-context.js.map +1 -0
  312. package/dist/tools/python-constants/function-defaults.d.ts +5 -0
  313. package/dist/tools/python-constants/function-defaults.d.ts.map +1 -0
  314. package/dist/tools/python-constants/function-defaults.js +98 -0
  315. package/dist/tools/python-constants/function-defaults.js.map +1 -0
  316. package/dist/tools/python-constants/model.d.ts +78 -0
  317. package/dist/tools/python-constants/model.d.ts.map +1 -0
  318. package/dist/tools/python-constants/model.js +2 -0
  319. package/dist/tools/python-constants/model.js.map +1 -0
  320. package/dist/tools/python-constants/syntax.d.ts +22 -0
  321. package/dist/tools/python-constants/syntax.d.ts.map +1 -0
  322. package/dist/tools/python-constants/syntax.js +93 -0
  323. package/dist/tools/python-constants/syntax.js.map +1 -0
  324. package/dist/tools/python-constants/value-resolver.d.ts +6 -0
  325. package/dist/tools/python-constants/value-resolver.d.ts.map +1 -0
  326. package/dist/tools/python-constants/value-resolver.js +320 -0
  327. package/dist/tools/python-constants/value-resolver.js.map +1 -0
  328. package/dist/tools/python-constants-tools.d.ts +3 -45
  329. package/dist/tools/python-constants-tools.d.ts.map +1 -1
  330. package/dist/tools/python-constants-tools.js +2 -505
  331. package/dist/tools/python-constants-tools.js.map +1 -1
  332. package/dist/tools/route-tools/django.d.ts +8 -0
  333. package/dist/tools/route-tools/django.d.ts.map +1 -0
  334. package/dist/tools/route-tools/django.js +52 -0
  335. package/dist/tools/route-tools/django.js.map +1 -0
  336. package/dist/tools/route-tools/express.d.ts +5 -0
  337. package/dist/tools/route-tools/express.d.ts.map +1 -0
  338. package/dist/tools/route-tools/express.js +33 -0
  339. package/dist/tools/route-tools/express.js.map +1 -0
  340. package/dist/tools/route-tools/file-sources.d.ts +7 -0
  341. package/dist/tools/route-tools/file-sources.d.ts.map +1 -0
  342. package/dist/tools/route-tools/file-sources.js +15 -0
  343. package/dist/tools/route-tools/file-sources.js.map +1 -0
  344. package/dist/tools/route-tools/handler-discovery.d.ts +4 -0
  345. package/dist/tools/route-tools/handler-discovery.d.ts.map +1 -0
  346. package/dist/tools/route-tools/handler-discovery.js +38 -0
  347. package/dist/tools/route-tools/handler-discovery.js.map +1 -0
  348. package/dist/tools/route-tools/hono.d.ts +5 -0
  349. package/dist/tools/route-tools/hono.d.ts.map +1 -0
  350. package/dist/tools/route-tools/hono.js +61 -0
  351. package/dist/tools/route-tools/hono.js.map +1 -0
  352. package/dist/tools/route-tools/ktor.d.ts +5 -0
  353. package/dist/tools/route-tools/ktor.d.ts.map +1 -0
  354. package/dist/tools/route-tools/ktor.js +76 -0
  355. package/dist/tools/route-tools/ktor.js.map +1 -0
  356. package/dist/tools/route-tools/laravel.d.ts +5 -0
  357. package/dist/tools/route-tools/laravel.d.ts.map +1 -0
  358. package/dist/tools/route-tools/laravel.js +45 -0
  359. package/dist/tools/route-tools/laravel.js.map +1 -0
  360. package/dist/tools/route-tools/mermaid-call-chain.d.ts +3 -0
  361. package/dist/tools/route-tools/mermaid-call-chain.d.ts.map +1 -0
  362. package/dist/tools/route-tools/mermaid-call-chain.js +50 -0
  363. package/dist/tools/route-tools/mermaid-call-chain.js.map +1 -0
  364. package/dist/tools/route-tools/nest.d.ts +5 -0
  365. package/dist/tools/route-tools/nest.d.ts.map +1 -0
  366. package/dist/tools/route-tools/nest.js +75 -0
  367. package/dist/tools/route-tools/nest.js.map +1 -0
  368. package/dist/tools/route-tools/next-trace.d.ts +4 -0
  369. package/dist/tools/route-tools/next-trace.d.ts.map +1 -0
  370. package/dist/tools/route-tools/next-trace.js +48 -0
  371. package/dist/tools/route-tools/next-trace.js.map +1 -0
  372. package/dist/tools/route-tools/next.d.ts +7 -0
  373. package/dist/tools/route-tools/next.d.ts.map +1 -0
  374. package/dist/tools/route-tools/next.js +77 -0
  375. package/dist/tools/route-tools/next.js.map +1 -0
  376. package/dist/tools/route-tools/python-decorators.d.ts +7 -0
  377. package/dist/tools/route-tools/python-decorators.d.ts.map +1 -0
  378. package/dist/tools/route-tools/python-decorators.js +53 -0
  379. package/dist/tools/route-tools/python-decorators.js.map +1 -0
  380. package/dist/tools/route-tools/route-mermaid.d.ts +4 -0
  381. package/dist/tools/route-tools/route-mermaid.d.ts.map +1 -0
  382. package/dist/tools/route-tools/route-mermaid.js +53 -0
  383. package/dist/tools/route-tools/route-mermaid.js.map +1 -0
  384. package/dist/tools/route-tools/spring-kotlin.d.ts +5 -0
  385. package/dist/tools/route-tools/spring-kotlin.d.ts.map +1 -0
  386. package/dist/tools/route-tools/spring-kotlin.js +52 -0
  387. package/dist/tools/route-tools/spring-kotlin.js.map +1 -0
  388. package/dist/tools/route-tools/trace-analysis.d.ts +4 -0
  389. package/dist/tools/route-tools/trace-analysis.d.ts.map +1 -0
  390. package/dist/tools/route-tools/trace-analysis.js +37 -0
  391. package/dist/tools/route-tools/trace-analysis.js.map +1 -0
  392. package/dist/tools/route-tools/trace-route.d.ts +6 -0
  393. package/dist/tools/route-tools/trace-route.d.ts.map +1 -0
  394. package/dist/tools/route-tools/trace-route.js +53 -0
  395. package/dist/tools/route-tools/trace-route.js.map +1 -0
  396. package/dist/tools/route-tools/types.d.ts +35 -0
  397. package/dist/tools/route-tools/types.d.ts.map +1 -0
  398. package/dist/tools/route-tools/types.js +2 -0
  399. package/dist/tools/route-tools/types.js.map +1 -0
  400. package/dist/tools/route-tools/yii2.d.ts +5 -0
  401. package/dist/tools/route-tools/yii2.d.ts.map +1 -0
  402. package/dist/tools/route-tools/yii2.js +73 -0
  403. package/dist/tools/route-tools/yii2.js.map +1 -0
  404. package/dist/tools/route-tools.d.ts +7 -49
  405. package/dist/tools/route-tools.d.ts.map +1 -1
  406. package/dist/tools/route-tools.js +5 -978
  407. package/dist/tools/route-tools.js.map +1 -1
  408. package/dist/tools/search-tools/types.d.ts +20 -0
  409. package/dist/tools/search-tools/types.d.ts.map +1 -1
  410. package/dist/tools/search-tools/zero-hit.d.ts.map +1 -1
  411. package/dist/tools/search-tools/zero-hit.js +0 -0
  412. package/dist/tools/search-tools/zero-hit.js.map +1 -1
  413. package/dist/tools/status-tools.d.ts +10 -0
  414. package/dist/tools/status-tools.d.ts.map +1 -1
  415. package/dist/tools/status-tools.js +14 -4
  416. package/dist/tools/status-tools.js.map +1 -1
  417. package/dist/tools/symbol-analysis-tools.d.ts +81 -0
  418. package/dist/tools/symbol-analysis-tools.d.ts.map +1 -0
  419. package/dist/tools/symbol-analysis-tools.js +327 -0
  420. package/dist/tools/symbol-analysis-tools.js.map +1 -0
  421. package/dist/tools/symbol-context-tools.d.ts +68 -0
  422. package/dist/tools/symbol-context-tools.d.ts.map +1 -0
  423. package/dist/tools/symbol-context-tools.js +232 -0
  424. package/dist/tools/symbol-context-tools.js.map +1 -0
  425. package/dist/tools/symbol-lookup-tools.d.ts +77 -0
  426. package/dist/tools/symbol-lookup-tools.d.ts.map +1 -0
  427. package/dist/tools/symbol-lookup-tools.js +305 -0
  428. package/dist/tools/symbol-lookup-tools.js.map +1 -0
  429. package/dist/tools/symbol-reference-tools.d.ts +38 -0
  430. package/dist/tools/symbol-reference-tools.d.ts.map +1 -0
  431. package/dist/tools/symbol-reference-tools.js +253 -0
  432. package/dist/tools/symbol-reference-tools.js.map +1 -0
  433. package/dist/tools/symbol-tool-internals.d.ts +9 -0
  434. package/dist/tools/symbol-tool-internals.d.ts.map +1 -0
  435. package/dist/tools/symbol-tool-internals.js +47 -0
  436. package/dist/tools/symbol-tool-internals.js.map +1 -0
  437. package/dist/tools/symbol-tools.d.ts +11 -176
  438. package/dist/tools/symbol-tools.d.ts.map +1 -1
  439. package/dist/tools/symbol-tools.js +7 -975
  440. package/dist/tools/symbol-tools.js.map +1 -1
  441. package/dist/tools/taint/python-context.d.ts +10 -0
  442. package/dist/tools/taint/python-context.d.ts.map +1 -0
  443. package/dist/tools/taint/python-context.js +150 -0
  444. package/dist/tools/taint/python-context.js.map +1 -0
  445. package/dist/tools/taint/taint-analyzer.d.ts +2 -0
  446. package/dist/tools/taint/taint-analyzer.d.ts.map +1 -0
  447. package/dist/tools/taint/taint-analyzer.js +2 -0
  448. package/dist/tools/taint/taint-analyzer.js.map +1 -0
  449. package/dist/tools/taint/taint-expression.d.ts +18 -0
  450. package/dist/tools/taint/taint-expression.d.ts.map +1 -0
  451. package/dist/tools/taint/taint-expression.js +265 -0
  452. package/dist/tools/taint/taint-expression.js.map +1 -0
  453. package/dist/tools/taint/taint-flow.d.ts +10 -0
  454. package/dist/tools/taint/taint-flow.d.ts.map +1 -0
  455. package/dist/tools/taint/taint-flow.js +178 -0
  456. package/dist/tools/taint/taint-flow.js.map +1 -0
  457. package/dist/tools/taint/taint-model.d.ts +113 -0
  458. package/dist/tools/taint/taint-model.d.ts.map +1 -0
  459. package/dist/tools/taint/taint-model.js +277 -0
  460. package/dist/tools/taint/taint-model.js.map +1 -0
  461. package/dist/tools/taint-tools.d.ts +2 -34
  462. package/dist/tools/taint-tools.d.ts.map +1 -1
  463. package/dist/tools/taint-tools.js +2 -852
  464. package/dist/tools/taint-tools.js.map +1 -1
  465. package/dist/tools/typescript-constants/file-context.d.ts +7 -0
  466. package/dist/tools/typescript-constants/file-context.d.ts.map +1 -0
  467. package/dist/tools/typescript-constants/file-context.js +219 -0
  468. package/dist/tools/typescript-constants/file-context.js.map +1 -0
  469. package/dist/tools/typescript-constants/symbol-resolver.d.ts +7 -0
  470. package/dist/tools/typescript-constants/symbol-resolver.d.ts.map +1 -0
  471. package/dist/tools/typescript-constants/symbol-resolver.js +165 -0
  472. package/dist/tools/typescript-constants/symbol-resolver.js.map +1 -0
  473. package/dist/tools/typescript-constants/types.d.ts +44 -0
  474. package/dist/tools/typescript-constants/types.d.ts.map +1 -0
  475. package/dist/tools/typescript-constants/types.js +2 -0
  476. package/dist/tools/typescript-constants/types.js.map +1 -0
  477. package/dist/tools/typescript-constants/value-evaluator.d.ts +8 -0
  478. package/dist/tools/typescript-constants/value-evaluator.d.ts.map +1 -0
  479. package/dist/tools/typescript-constants/value-evaluator.js +404 -0
  480. package/dist/tools/typescript-constants/value-evaluator.js.map +1 -0
  481. package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
  482. package/dist/tools/typescript-constants-tools.js +19 -709
  483. package/dist/tools/typescript-constants-tools.js.map +1 -1
  484. package/dist/types.d.ts +6 -0
  485. package/dist/types.d.ts.map +1 -1
  486. package/dist/utils/git-head.d.ts +12 -0
  487. package/dist/utils/git-head.d.ts.map +1 -1
  488. package/dist/utils/git-head.js +25 -0
  489. package/dist/utils/git-head.js.map +1 -1
  490. package/dist/utils/import-graph/collect.d.ts +5 -0
  491. package/dist/utils/import-graph/collect.d.ts.map +1 -0
  492. package/dist/utils/import-graph/collect.js +47 -0
  493. package/dist/utils/import-graph/collect.js.map +1 -0
  494. package/dist/utils/import-graph/edge-accumulator.d.ts +7 -0
  495. package/dist/utils/import-graph/edge-accumulator.d.ts.map +1 -0
  496. package/dist/utils/import-graph/edge-accumulator.js +47 -0
  497. package/dist/utils/import-graph/edge-accumulator.js.map +1 -0
  498. package/dist/utils/import-graph/language-imports.d.ts +6 -0
  499. package/dist/utils/import-graph/language-imports.d.ts.map +1 -0
  500. package/dist/utils/import-graph/language-imports.js +84 -0
  501. package/dist/utils/import-graph/language-imports.js.map +1 -0
  502. package/dist/utils/import-graph/metrics.d.ts +6 -0
  503. package/dist/utils/import-graph/metrics.d.ts.map +1 -0
  504. package/dist/utils/import-graph/metrics.js +51 -0
  505. package/dist/utils/import-graph/metrics.js.map +1 -0
  506. package/dist/utils/import-graph/path-map.d.ts +7 -0
  507. package/dist/utils/import-graph/path-map.d.ts.map +1 -0
  508. package/dist/utils/import-graph/path-map.js +56 -0
  509. package/dist/utils/import-graph/path-map.js.map +1 -0
  510. package/dist/utils/import-graph/python-php-edge-collectors.d.ts +5 -0
  511. package/dist/utils/import-graph/python-php-edge-collectors.d.ts.map +1 -0
  512. package/dist/utils/import-graph/python-php-edge-collectors.js +56 -0
  513. package/dist/utils/import-graph/python-php-edge-collectors.js.map +1 -0
  514. package/dist/utils/import-graph/source-edge-collector.d.ts +13 -0
  515. package/dist/utils/import-graph/source-edge-collector.d.ts.map +1 -0
  516. package/dist/utils/import-graph/source-edge-collector.js +42 -0
  517. package/dist/utils/import-graph/source-edge-collector.js.map +1 -0
  518. package/dist/utils/import-graph/source-imports.d.ts +5 -0
  519. package/dist/utils/import-graph/source-imports.d.ts.map +1 -0
  520. package/dist/utils/import-graph/source-imports.js +33 -0
  521. package/dist/utils/import-graph/source-imports.js.map +1 -0
  522. package/dist/utils/import-graph/types.d.ts +15 -0
  523. package/dist/utils/import-graph/types.d.ts.map +1 -0
  524. package/dist/utils/import-graph/types.js +2 -0
  525. package/dist/utils/import-graph/types.js.map +1 -0
  526. package/dist/utils/import-graph/typescript-edge-collector.d.ts +7 -0
  527. package/dist/utils/import-graph/typescript-edge-collector.d.ts.map +1 -0
  528. package/dist/utils/import-graph/typescript-edge-collector.js +58 -0
  529. package/dist/utils/import-graph/typescript-edge-collector.js.map +1 -0
  530. package/dist/utils/import-graph/workspace-alias.d.ts +7 -0
  531. package/dist/utils/import-graph/workspace-alias.d.ts.map +1 -0
  532. package/dist/utils/import-graph/workspace-alias.js +95 -0
  533. package/dist/utils/import-graph/workspace-alias.js.map +1 -0
  534. package/dist/utils/import-graph/workspace-entry.d.ts +3 -0
  535. package/dist/utils/import-graph/workspace-entry.d.ts.map +1 -0
  536. package/dist/utils/import-graph/workspace-entry.js +81 -0
  537. package/dist/utils/import-graph/workspace-entry.js.map +1 -0
  538. package/dist/utils/import-graph.d.ts +10 -94
  539. package/dist/utils/import-graph.d.ts.map +1 -1
  540. package/dist/utils/import-graph.js +6 -702
  541. package/dist/utils/import-graph.js.map +1 -1
  542. package/package.json +6 -4
  543. package/rules/codesift.md +11 -2
  544. package/rules/codesift.mdc +11 -2
  545. package/rules/codex.md +11 -2
  546. package/rules/gemini.md +11 -2
@@ -1,703 +1,7 @@
1
- /**
2
- * Import graph utilities — shared by context-tools, route-tools, community-tools.
3
- */
4
- import { readFile } from "node:fs/promises";
5
- import { isAbsolute, join, relative, resolve, sep } from "node:path";
6
- import { readFileSync } from "node:fs";
7
- import { getParser } from "../parser/parser-manager.js";
8
- import { getCachedParse, setCachedParse } from "../parser/parse-cache.js";
9
- import { extractPythonImports } from "./python-imports.js";
10
- import { resolvePythonImport, detectSrcLayout } from "./python-import-resolver.js";
11
- import { resolvePhpNamespace } from "../tools/php-tools.js";
12
- import { extractTypeScriptImports } from "./ts-imports.js";
13
- import { resolveTsAliasedImport } from "./tsconfig-paths.js";
14
- import { DirectedGraph } from "graphology";
15
- import { createRequire } from "node:module";
16
- // graphology-metrics has no "exports" field; use createRequire so the deep
17
- // path resolves at runtime under both ESM and CJS consumers.
18
- const req = createRequire(import.meta.url);
19
- const pagerank = req("graphology-metrics/centrality/pagerank");
20
- // Patterns for detecting import statements across common languages
21
- const IMPORT_PATTERNS = [
22
- // ES modules: import ... from '...' or import ... from "..."
23
- /import\s+.*?\s+from\s+['"]([^'"]+)['"]/g,
24
- // Dynamic import: import('...')
25
- /import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
26
- // CommonJS: require('...')
27
- /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
28
- // PHP: require/include with relative path string: require __DIR__ . '/helpers.php';
29
- /(?:require|include)(?:_once)?\s*\(?\s*(?:__DIR__\s*\.\s*)?['"](\.\.?\/[^'"]+\.php)['"]/g,
30
- ];
31
- // Patterns for extracting PHP `use` statements (FQCN imports — PSR-4 based).
32
- // These are NOT file paths; they need PSR-4 resolution via composer.json.
33
- // Exposed separately so the resolver tool can opt-in.
34
- //
35
- // Accepts both UpperCase (PSR-1/2 modern) and lowercase (common in older
36
- // Yii2 apps: `use app\models\Survey`) namespaces. The FQCN must contain at
37
- // least one backslash to exclude global class imports like `use Closure;`
38
- // and `use Yii;` which would be noise for the import graph.
39
- //
40
- // Two separate patterns:
41
- // SINGLE — `use App\Models\User;` or `use App\Models\User as U;`
42
- // GROUP — `use App\Models\{User, Post, Comment};` or with aliases
43
- const PHP_USE_SINGLE_PATTERN = /^\s*use\s+(\w+(?:\\\w+)+)(?:\s+as\s+\w+)?\s*;/gm;
44
- const PHP_USE_GROUP_PATTERN = /^\s*use\s+(\w+(?:\\\w+)*)\\\{([^}]+)\}\s*;/gm;
45
- // Patterns for extracting Kotlin `import` statements (fully-qualified names).
46
- // These are NOT file paths; they need heuristic resolution against source roots.
47
- // Matches: `import com.example.UserService`, `import com.example.*`, `import com.example.Foo as Bar`
48
- const KOTLIN_IMPORT_PATTERN = /^\s*import\s+([\w.]+(?:\.\*)?)(?:\s+as\s+\w+)?\s*$/gm;
49
- /**
50
- * Extract import paths from a source string.
51
- * Returns relative paths only (skips node_modules / bare specifiers).
52
- */
53
- export function extractImports(source) {
54
- const imports = new Set();
55
- for (const pattern of IMPORT_PATTERNS) {
56
- pattern.lastIndex = 0;
57
- let match;
58
- while ((match = pattern.exec(source)) !== null) {
59
- const importPath = match[1];
60
- if (importPath && importPath.startsWith(".")) {
61
- imports.add(importPath);
62
- }
63
- }
64
- }
65
- return [...imports];
66
- }
67
- /**
68
- * Extract bare-specifier imports (e.g. `@org/shared`, `@/utils`).
69
- * Only used by the workspace-alias / tsconfig-paths resolvers when
70
- * `index.workspaces` is present. Skips relative paths and skips imports
71
- * that look like absolute file URLs.
72
- *
73
- * Task 6 of monorepo workspace intelligence plan.
74
- */
75
- export function extractBareImports(source) {
76
- const imports = new Set();
77
- for (const pattern of IMPORT_PATTERNS) {
78
- pattern.lastIndex = 0;
79
- let match;
80
- while ((match = pattern.exec(source)) !== null) {
81
- const importPath = match[1];
82
- if (!importPath)
83
- continue;
84
- if (importPath.startsWith(".") || importPath.startsWith("/"))
85
- continue;
86
- // Strip dynamic-import wrappers — we already handled them via pattern groups
87
- imports.add(importPath);
88
- }
89
- }
90
- return [...imports];
91
- }
92
- /**
93
- * Normalize an import path relative to the importing file.
94
- * Resolves "./foo" and "../bar" relative to the importer's directory.
95
- */
96
- export function resolveImportPath(importerFile, importPath) {
97
- const importerDir = importerFile.includes("/")
98
- ? importerFile.slice(0, importerFile.lastIndexOf("/"))
99
- : ".";
100
- const parts = importerDir.split("/");
101
- for (const segment of importPath.split("/")) {
102
- if (segment === ".")
103
- continue;
104
- if (segment === "..") {
105
- parts.pop();
106
- }
107
- else {
108
- parts.push(segment);
109
- }
110
- }
111
- let resolved = parts.join("/");
112
- resolved = resolved.replace(/\.(astro|ts|tsx|js|jsx|mjs|cjs|php)$/, "");
113
- return resolved;
114
- }
115
- /**
116
- * Extract PHP `use` statements (FQCN imports).
117
- * Returns fully-qualified class/namespace names without the leading backslash.
118
- * These are NOT file paths — they require PSR-4 resolution against composer.json.
119
- *
120
- * Handles both single-FQCN and grouped forms:
121
- * `use App\Models\User;`
122
- * `use App\Models\User as U;`
123
- * `use App\Models\{User, Post, Comment};`
124
- * `use App\{Models\User, Services\Auth as A};`
125
- */
126
- export function extractPhpUseStatements(source) {
127
- const uses = new Set();
128
- // Single FQCN form
129
- PHP_USE_SINGLE_PATTERN.lastIndex = 0;
130
- let match;
131
- while ((match = PHP_USE_SINGLE_PATTERN.exec(source)) !== null) {
132
- const fqcn = match[1]?.replace(/^\\/, "");
133
- if (fqcn)
134
- uses.add(fqcn);
135
- }
136
- // Grouped form — split the brace content on commas, strip aliases,
137
- // concatenate each fragment with the prefix.
138
- PHP_USE_GROUP_PATTERN.lastIndex = 0;
139
- while ((match = PHP_USE_GROUP_PATTERN.exec(source)) !== null) {
140
- const prefix = match[1]?.replace(/^\\/, "");
141
- const members = match[2];
142
- if (!prefix || !members)
143
- continue;
144
- for (const raw of members.split(",")) {
145
- // Strip `as Alias` and surrounding whitespace
146
- const bare = raw.replace(/\s+as\s+\w+\s*$/, "").trim();
147
- if (bare)
148
- uses.add(`${prefix}\\${bare}`);
149
- }
150
- }
151
- return [...uses];
152
- }
153
- /**
154
- * Extract Kotlin `import` statements (fully-qualified names).
155
- * Returns dot-separated package + class names. Wildcards (`com.example.*`) are
156
- * preserved as-is. These are NOT file paths — they require heuristic resolution
157
- * against the source root (usually `src/main/kotlin`, `src/commonMain/kotlin`, etc.).
158
- */
159
- export function extractKotlinImports(source) {
160
- const imports = new Set();
161
- KOTLIN_IMPORT_PATTERN.lastIndex = 0;
162
- let match;
163
- while ((match = KOTLIN_IMPORT_PATTERN.exec(source)) !== null) {
164
- const fqName = match[1];
165
- if (fqName)
166
- imports.add(fqName);
167
- }
168
- return [...imports];
169
- }
170
- /**
171
- * Heuristically resolve a Kotlin fully-qualified import to an indexed file.
172
- * Strategy: match the last segment of the FQN (the simple class name) against
173
- * file basenames. For `com.example.service.UserService`, tries to find a file
174
- * whose basename (without .kt/.kts) is `UserService` AND whose path contains
175
- * the package path `com/example/service`.
176
- *
177
- * Returns the matched file path or null if no match.
178
- *
179
- * Limitations: single-repo heuristic. Doesn't handle wildcard imports
180
- * (`com.example.*`) or multi-module setups with complex source roots.
181
- */
182
- export function resolveKotlinImport(fqName, kotlinFilesByBasename) {
183
- // Skip wildcard imports — can't resolve to a single file
184
- if (fqName.endsWith(".*"))
185
- return null;
186
- // Skip standard library / third-party (no way to index jar files)
187
- if (fqName.startsWith("kotlin.") || fqName.startsWith("java.") ||
188
- fqName.startsWith("javax.") || fqName.startsWith("android.") ||
189
- fqName.startsWith("androidx.") || fqName.startsWith("org.jetbrains.") ||
190
- fqName.startsWith("org.junit.")) {
191
- return null;
192
- }
193
- const parts = fqName.split(".");
194
- if (parts.length < 2)
195
- return null;
196
- const simpleName = parts[parts.length - 1];
197
- const packagePath = parts.slice(0, -1).join("/");
198
- const candidates = kotlinFilesByBasename.get(simpleName);
199
- if (!candidates)
200
- return null;
201
- // Prefer candidate whose path contains the package path
202
- for (const candidate of candidates) {
203
- if (candidate.includes(packagePath))
204
- return candidate;
205
- }
206
- // Fallback: if only one candidate, return it (common in small projects)
207
- if (candidates.length === 1)
208
- return candidates[0] ?? null;
209
- return null;
210
- }
211
- /**
212
- * Build a lookup map from Kotlin file basenames (without extension) to file paths.
213
- * Used by resolveKotlinImport for heuristic FQN resolution.
214
- */
215
- export function buildKotlinFilesByBasename(index) {
216
- const map = new Map();
217
- for (const file of index.files) {
218
- if (!/\.kts?$/.test(file.path))
219
- continue;
220
- const basename = file.path
221
- .slice(file.path.lastIndexOf("/") + 1)
222
- .replace(/\.kts?$/, "");
223
- const existing = map.get(basename);
224
- if (existing) {
225
- existing.push(file.path);
226
- }
227
- else {
228
- map.set(basename, [file.path]);
229
- }
230
- }
231
- return map;
232
- }
233
- const NULL_RESOLVER = { resolve: () => null };
234
- /** Build a workspace-alias resolver for the given index. Reads each
235
- * workspace's package.json once at construction time to discover entry
236
- * points; never reads disk afterwards. Returns a no-op resolver on flat
237
- * repos. */
238
- export function buildWorkspaceAliasResolver(index) {
239
- const workspaces = index.workspaces;
240
- if (!workspaces || workspaces.length === 0)
241
- return NULL_RESOLVER;
242
- const fileSet = new Set(index.files.map((f) => f.path));
243
- const normalizedPaths = buildNormalizedPathMap(index);
244
- // Workspace name → relative root (relative to index.root)
245
- const wsRelByName = new Map();
246
- // Workspace name → resolved entry file path (relative to index.root)
247
- const wsEntryByName = new Map();
248
- // Sorted list of (relativeRoot, workspace) for longest-prefix file lookup
249
- const wsByPath = [];
250
- for (const ws of workspaces) {
251
- const rel = relRoot(ws.root, index.root);
252
- if (rel === null)
253
- continue;
254
- wsByPath.push({ rel, ws });
255
- if (ws.name) {
256
- wsRelByName.set(ws.name, rel);
257
- wsEntryByName.set(ws.name, resolveWorkspaceEntry(ws.root, rel, fileSet, normalizedPaths));
258
- }
259
- }
260
- // Longest prefix first
261
- wsByPath.sort((a, b) => b.rel.length - a.rel.length);
262
- function findOriginatingWorkspace(importerFile) {
263
- for (const { rel, ws } of wsByPath) {
264
- if (rel === "" || importerFile === rel || importerFile.startsWith(rel + "/")) {
265
- return ws;
266
- }
267
- }
268
- return null;
269
- }
270
- function lookupFile(candidate) {
271
- if (fileSet.has(candidate))
272
- return candidate;
273
- const stripped = candidate.replace(/\.(astro|ts|tsx|js|jsx|mjs|cjs)$/, "");
274
- const normalized = normalizedPaths.get(stripped);
275
- if (normalized)
276
- return normalized;
277
- // Try common entry-file suffixes
278
- for (const suffix of ["/index.ts", "/index.tsx", "/index.js", "/index.jsx"]) {
279
- const tryPath = candidate + suffix;
280
- if (fileSet.has(tryPath))
281
- return tryPath;
282
- }
283
- return null;
284
- }
285
- function resolveByWorkspaceName(importPath) {
286
- // Exact workspace-name match → entry file
287
- const directEntry = wsEntryByName.get(importPath);
288
- if (directEntry)
289
- return directEntry;
290
- // Subpath import: `@org/shared/Button` → workspace `@org/shared` + subpath `Button`
291
- for (const [wsName, wsRel] of wsRelByName) {
292
- if (!importPath.startsWith(wsName + "/"))
293
- continue;
294
- const subpath = importPath.slice(wsName.length + 1);
295
- // Try `<wsRel>/<subpath>`, then `<wsRel>/src/<subpath>`
296
- for (const candidate of [`${wsRel}/${subpath}`, `${wsRel}/src/${subpath}`]) {
297
- const found = lookupFile(candidate);
298
- if (found)
299
- return found;
300
- }
301
- }
302
- return null;
303
- }
304
- function resolveByTsconfigPaths(importPath, importerFile) {
305
- const ws = findOriginatingWorkspace(importerFile);
306
- if (!ws)
307
- return null;
308
- for (const tsp of ws.tsconfig_paths) {
309
- const pattern = tsp.from_pattern;
310
- if (pattern.endsWith("/*")) {
311
- const prefix = pattern.slice(0, -1); // "@org/" from "@org/*"
312
- if (!importPath.startsWith(prefix))
313
- continue;
314
- const captured = importPath.slice(prefix.length);
315
- for (const target of tsp.to_paths) {
316
- const expanded = target.replace("*", captured);
317
- // Try as repo-relative; also try relative to the originating workspace
318
- const wsRel = relRoot(ws.root, index.root) ?? "";
319
- const candidates = [expanded];
320
- if (wsRel)
321
- candidates.push(`${wsRel}/${expanded}`);
322
- for (const c of candidates) {
323
- const found = lookupFile(c);
324
- if (found)
325
- return found;
326
- }
327
- }
328
- }
329
- else if (pattern === importPath) {
330
- for (const target of tsp.to_paths) {
331
- const wsRel = relRoot(ws.root, index.root) ?? "";
332
- const candidates = [target, wsRel ? `${wsRel}/${target}` : target];
333
- for (const c of candidates) {
334
- const found = lookupFile(c);
335
- if (found)
336
- return found;
337
- }
338
- }
339
- }
340
- }
341
- return null;
342
- }
343
- return {
344
- resolve: (importPath, importerFile) => {
345
- // Workspace-name match takes precedence over tsconfig paths
346
- const byName = resolveByWorkspaceName(importPath);
347
- if (byName)
348
- return byName;
349
- return resolveByTsconfigPaths(importPath, importerFile);
350
- },
351
- };
352
- }
353
- function relRoot(absPath, indexRoot) {
354
- if (!absPath.startsWith(indexRoot))
355
- return null;
356
- const rel = absPath.slice(indexRoot.length).replace(/^[\\/]+/, "");
357
- return rel;
358
- }
359
- function resolveWorkspaceEntry(wsAbsRoot, wsRel, fileSet, normalizedPaths) {
360
- const pkg = readWorkspacePackageJson(wsAbsRoot);
361
- const entryRel = pickEntry(pkg);
362
- const candidates = [];
363
- if (entryRel) {
364
- const cleaned = entryRel.replace(/^\.?\/+/, "");
365
- candidates.push(wsRel ? `${wsRel}/${cleaned}` : cleaned);
366
- }
367
- // Common defaults (in order)
368
- for (const def of ["src/index.ts", "src/index.tsx", "src/index.js", "index.ts", "index.tsx", "index.js"]) {
369
- candidates.push(wsRel ? `${wsRel}/${def}` : def);
370
- }
371
- for (const c of candidates) {
372
- if (fileSet.has(c))
373
- return c;
374
- const stripped = c.replace(/\.(astro|ts|tsx|js|jsx|mjs|cjs)$/, "");
375
- const normalized = normalizedPaths.get(stripped);
376
- if (normalized)
377
- return normalized;
378
- }
379
- return null;
380
- }
381
- function readWorkspacePackageJson(absRoot) {
382
- try {
383
- return JSON.parse(readFileSync(`${absRoot}/package.json`, "utf-8"));
384
- }
385
- catch {
386
- return null;
387
- }
388
- }
389
- function pickEntry(pkg) {
390
- if (!pkg)
391
- return null;
392
- // Prefer source > module > main; ignore complex exports
393
- if (typeof pkg.source === "string")
394
- return pkg.source;
395
- if (typeof pkg.module === "string")
396
- return pkg.module;
397
- if (typeof pkg.main === "string")
398
- return pkg.main;
399
- if (pkg.exports && typeof pkg.exports === "object") {
400
- const exp = pkg.exports;
401
- const root = exp["."];
402
- if (typeof root === "string")
403
- return root;
404
- if (root && typeof root === "object") {
405
- const r = root;
406
- for (const key of ["import", "default", "require"]) {
407
- const v = r[key];
408
- if (typeof v === "string")
409
- return v;
410
- }
411
- }
412
- }
413
- return null;
414
- }
415
- /**
416
- * Build normalized path map for matching imports to indexed files.
417
- */
418
- export function buildNormalizedPathMap(index) {
419
- const normalizedPaths = new Map();
420
- for (const file of index.files) {
421
- const normalized = file.path.replace(/\.(astro|ts|tsx|js|jsx|mjs|cjs|php|kt|kts|py)$/, "");
422
- normalizedPaths.set(normalized, file.path);
423
- if (normalized.endsWith("/index")) {
424
- normalizedPaths.set(normalized.slice(0, -6), file.path);
425
- }
426
- // Python package index: map `foo/__init__` → `foo`
427
- if (normalized.endsWith("/__init__")) {
428
- normalizedPaths.set(normalized.slice(0, -9), file.path);
429
- }
430
- }
431
- return normalizedPaths;
432
- }
433
- /**
434
- * Collect all import edges between files in the index.
435
- * Reads file source from disk to extract import statements.
436
- * Handles JS/TS/PHP relative imports AND Kotlin fully-qualified imports
437
- * (via heuristic basename + package-path matching).
438
- */
439
- export async function collectImportEdges(index, fileFilter) {
440
- const normalizedPaths = buildNormalizedPathMap(index);
441
- const kotlinFilesByBasename = buildKotlinFilesByBasename(index);
442
- // Workspace-alias resolver (Task 6) — no-op when index.workspaces is absent.
443
- const workspaceResolver = buildWorkspaceAliasResolver(index);
444
- const edgeSet = new Set();
445
- const edges = [];
446
- // Rollback kill switch — skip Python import extraction if env var set
447
- const pythonDisabled = process.env.CODESIFT_DISABLE_PYTHON_IMPORTS === "1";
448
- // Python needs the full indexed file set for package resolution — built once
449
- const indexedPyFileSet = new Set(index.files.filter((f) => f.path.endsWith(".py")).map((f) => f.path));
450
- const pySrcLayout = indexedPyFileSet.size > 0
451
- ? detectSrcLayout([...indexedPyFileSet])
452
- : null;
453
- const files = fileFilter
454
- ? index.files.filter((f) => fileFilter.has(f.path))
455
- : index.files;
456
- const addEdge = (from, to, extras) => {
457
- if (to === from)
458
- return;
459
- const edgeKey = `${from}->${to}`;
460
- if (edgeSet.has(edgeKey)) {
461
- // Upgrade: runtime import overrides a prior type_only edge
462
- if (!extras?.type_only) {
463
- const existing = edges.find((e) => e.from === from && e.to === to);
464
- if (existing?.type_only)
465
- existing.type_only = false;
466
- }
467
- return;
468
- }
469
- edgeSet.add(edgeKey);
470
- const edge = { from, to };
471
- if (extras?.type_only)
472
- edge.type_only = true;
473
- if (extras?.star_import)
474
- edge.star_import = true;
475
- if (extras?.raw)
476
- edge.raw = extras.raw;
477
- edges.push(edge);
478
- };
479
- for (const file of files) {
480
- let source;
481
- try {
482
- source = await readFile(join(index.root, file.path), "utf-8");
483
- }
484
- catch {
485
- continue;
486
- }
487
- // TS/TSX AST-based extraction with type_only flagging + tsconfig alias
488
- // resolution. Skip the regex path for these files; fall back to regex
489
- // ONLY if AST extraction throws (parse failure).
490
- const isTsFile = /\.tsx?$/.test(file.path);
491
- let tsAstHandled = false;
492
- if (isTsFile) {
493
- try {
494
- const lang = file.path.endsWith(".tsx") ? "tsx" : "typescript";
495
- const parser = await getParser(lang);
496
- if (parser) {
497
- let tree = getCachedParse(lang, source);
498
- if (!tree) {
499
- tree = parser.parse(source);
500
- // parse() is nullable since web-tree-sitter 0.25 — a file that will
501
- // not parse simply contributes no import edges, and must not be
502
- // written into the parse cache as if it had.
503
- if (!tree)
504
- continue;
505
- setCachedParse(lang, source, tree);
506
- }
507
- const tsImports = extractTypeScriptImports(tree);
508
- for (const imp of tsImports) {
509
- let resolved = null;
510
- if (imp.path.startsWith(".")) {
511
- let norm = resolveImportPath(file.path, imp.path);
512
- // resolveImportPath emits leading "./" when importer is at repo root.
513
- // Strip it so the lookup matches normalizedPaths keys (which never
514
- // have leading "./").
515
- if (norm.startsWith("./"))
516
- norm = norm.slice(2);
517
- if (normalizedPaths.has(norm))
518
- resolved = normalizedPaths.get(norm) ?? null;
519
- }
520
- else {
521
- // Bare/aliased specifier: try tsconfig paths.
522
- const aliased = resolveTsAliasedImport(join(index.root, file.path), imp.path, index.root);
523
- if (aliased) {
524
- // Only treat as in-repo when resolved path is under index.root
525
- // (relative() alone can escape with ".." for outside paths).
526
- const rootAbs = resolve(index.root);
527
- const aliasAbs = resolve(aliased);
528
- const relRaw = relative(rootAbs, aliasAbs);
529
- const inside = relRaw !== "" &&
530
- !isAbsolute(relRaw) &&
531
- !relRaw.startsWith("..");
532
- if (inside) {
533
- const rel = relRaw.split(sep).join("/");
534
- if (normalizedPaths.has(rel.replace(/\.[^./]+$/, ""))
535
- || index.files.some((f) => f.path === rel)) {
536
- resolved = rel;
537
- }
538
- }
539
- }
540
- }
541
- if (resolved) {
542
- addEdge(file.path, resolved, { type_only: imp.is_type_only });
543
- }
544
- }
545
- tsAstHandled = true;
546
- }
547
- }
548
- catch (err) {
549
- const message = err instanceof Error ? err.message : String(err);
550
- console.warn(`[import-graph] TS AST extraction failed for ${file.path}; falling back to regex: ${message}`);
551
- // Falls through to regex extractImports below.
552
- }
553
- }
554
- // Regex path: JS/JSX/PHP files always; TS/TSX only on AST-failure fallback.
555
- if (!tsAstHandled) {
556
- const importPaths = extractImports(source);
557
- for (const importPath of importPaths) {
558
- const resolved = resolveImportPath(file.path, importPath);
559
- const targetFile = normalizedPaths.get(resolved);
560
- // type_only stays undefined on regex fallback — find_circular_deps
561
- // treats undefined as runtime, which preserves cycle detection for
562
- // JS/JSX/PHP and accepts a small false-positive risk on TS-fallback files.
563
- if (targetFile)
564
- addEdge(file.path, targetFile);
565
- }
566
- }
567
- // Workspace-alias / tsconfig-paths imports (JS/TS only when monorepo).
568
- // Activated only when `index.workspaces` is non-null. Adds cross-package
569
- // edges so find_references / impact_analysis / trace_call_chain see
570
- // bare-name imports like `@org/shared`.
571
- if (workspaceResolver !== NULL_RESOLVER && /\.(astro|ts|tsx|js|jsx|mjs|cjs)$/.test(file.path)) {
572
- const bareImports = extractBareImports(source);
573
- for (const importPath of bareImports) {
574
- const targetFile = workspaceResolver.resolve(importPath, file.path);
575
- if (targetFile)
576
- addEdge(file.path, targetFile);
577
- }
578
- }
579
- // Kotlin fully-qualified imports (.kt/.kts files only)
580
- if (/\.kts?$/.test(file.path)) {
581
- const kotlinImports = extractKotlinImports(source);
582
- for (const fqName of kotlinImports) {
583
- const targetFile = resolveKotlinImport(fqName, kotlinFilesByBasename);
584
- if (targetFile)
585
- addEdge(file.path, targetFile);
586
- }
587
- }
588
- // PHP cross-file edges via PSR-4 `use` statement resolution.
589
- // Creates edges like: PostController.php → User.php when we see
590
- // `use App\Models\User;` and composer.json maps `App\` to `src/`.
591
- if (file.path.endsWith(".php")) {
592
- const uses = extractPhpUseStatements(source);
593
- for (const fqcn of uses) {
594
- try {
595
- const resolved = await resolvePhpNamespace(index.repo, fqcn);
596
- if (resolved.exists && resolved.file_path) {
597
- const candidate = resolved.file_path.replace(/^\.\//, "");
598
- // Prefer the exact indexed path (handles prefixes like "./src/")
599
- const targetFile = index.files.some((f) => f.path === candidate)
600
- ? candidate
601
- : normalizedPaths.get(candidate.replace(/\.php$/, "")) ?? null;
602
- if (targetFile && targetFile !== file.path) {
603
- addEdge(file.path, targetFile);
604
- }
605
- }
606
- }
607
- catch {
608
- // Missing composer.json, malformed PSR-4, etc. — skip edge, don't crash.
609
- }
610
- }
611
- }
612
- // Python imports via tree-sitter AST + package-aware resolution.
613
- // Uses parse cache to avoid re-parsing files already parsed by the
614
- // symbol extractor pipeline — Python files are the only ones parsed
615
- // twice per index (once for symbols, once for imports here).
616
- if (!pythonDisabled && file.path.endsWith(".py")) {
617
- try {
618
- const parser = await getParser("python");
619
- if (parser) {
620
- let tree = getCachedParse("python", source);
621
- if (!tree) {
622
- tree = parser.parse(source);
623
- // parse() is nullable since web-tree-sitter 0.25 — a file that will
624
- // not parse simply contributes no import edges, and must not be
625
- // written into the parse cache as if it had.
626
- if (!tree)
627
- continue;
628
- setCachedParse("python", source, tree);
629
- }
630
- const pyImports = extractPythonImports(tree);
631
- for (const imp of pyImports) {
632
- const targetFile = resolvePythonImport({ module: imp.module, level: imp.level }, file.path, indexedPyFileSet, pySrcLayout);
633
- if (targetFile) {
634
- addEdge(file.path, targetFile, {
635
- type_only: imp.is_type_only,
636
- star_import: imp.is_star,
637
- });
638
- }
639
- }
640
- }
641
- }
642
- catch (err) {
643
- const message = err instanceof Error ? err.message : String(err);
644
- console.warn(`[import-graph] python extraction failed for ${file.path}: ${message}`);
645
- }
646
- }
647
- }
648
- return edges;
649
- }
650
- /**
651
- * Compute file-level PageRank from import edges.
652
- *
653
- * Returns a Map of file path → PageRank score (sums to ~1). Isolated nodes
654
- * (files with neither incoming nor outgoing edges) are pre-filtered. On
655
- * empty input or a graphology/pagerank failure, returns an empty Map.
656
- * Used by wiki-hub-ranker (spec D4 Layer 2).
657
- */
658
- export function buildFilePageRank(edges) {
659
- if (edges.length === 0)
660
- return new Map();
661
- try {
662
- const graph = new DirectedGraph();
663
- for (const edge of edges) {
664
- if (!graph.hasNode(edge.from))
665
- graph.addNode(edge.from);
666
- if (!graph.hasNode(edge.to))
667
- graph.addNode(edge.to);
668
- if (edge.from === edge.to)
669
- continue;
670
- if (!graph.hasEdge(edge.from, edge.to))
671
- graph.addEdge(edge.from, edge.to);
672
- }
673
- if (graph.order === 0)
674
- return new Map();
675
- const scores = pagerank(graph);
676
- return new Map(Object.entries(scores));
677
- }
678
- catch {
679
- return new Map();
680
- }
681
- }
682
- /**
683
- * Build adjacency lists (bidirectional) from import edges.
684
- */
685
- export function buildImportAdjacency(edges) {
686
- const adj = new Map();
687
- for (const edge of edges) {
688
- let fromSet = adj.get(edge.from);
689
- if (!fromSet) {
690
- fromSet = new Set();
691
- adj.set(edge.from, fromSet);
692
- }
693
- fromSet.add(edge.to);
694
- let toSet = adj.get(edge.to);
695
- if (!toSet) {
696
- toSet = new Set();
697
- adj.set(edge.to, toSet);
698
- }
699
- toSet.add(edge.from);
700
- }
701
- return adj;
702
- }
1
+ export { extractImports, extractBareImports } from "./import-graph/source-imports.js";
2
+ export { buildNormalizedPathMap, resolveImportPath } from "./import-graph/path-map.js";
3
+ export { buildKotlinFilesByBasename, extractKotlinImports, extractPhpUseStatements, resolveKotlinImport, } from "./import-graph/language-imports.js";
4
+ export { buildWorkspaceAliasResolver } from "./import-graph/workspace-alias.js";
5
+ export { collectImportEdges } from "./import-graph/collect.js";
6
+ export { buildFilePageRank, buildImportAdjacency } from "./import-graph/metrics.js";
703
7
  //# sourceMappingURL=import-graph.js.map