codesift-mcp 0.9.0 → 0.9.10

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 (1325) hide show
  1. package/README.md +39 -23
  2. package/dist/cli/commands.d.ts.map +1 -1
  3. package/dist/cli/commands.js +88 -2
  4. package/dist/cli/commands.js.map +1 -1
  5. package/dist/cli/help.d.ts +1 -1
  6. package/dist/cli/help.d.ts.map +1 -1
  7. package/dist/cli/help.js +18 -0
  8. package/dist/cli/help.js.map +1 -1
  9. package/dist/cli/hooks/input.d.ts +11 -0
  10. package/dist/cli/hooks/input.d.ts.map +1 -0
  11. package/dist/cli/hooks/input.js +111 -0
  12. package/dist/cli/hooks/input.js.map +1 -0
  13. package/dist/cli/hooks/post-tool-use.d.ts +2 -0
  14. package/dist/cli/hooks/post-tool-use.d.ts.map +1 -0
  15. package/dist/cli/hooks/post-tool-use.js +339 -0
  16. package/dist/cli/hooks/post-tool-use.js.map +1 -0
  17. package/dist/cli/hooks/pre-compact.d.ts +2 -0
  18. package/dist/cli/hooks/pre-compact.d.ts.map +1 -0
  19. package/dist/cli/hooks/pre-compact.js +41 -0
  20. package/dist/cli/hooks/pre-compact.js.map +1 -0
  21. package/dist/cli/hooks/pre-tool-use.d.ts +5 -0
  22. package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -0
  23. package/dist/cli/hooks/pre-tool-use.js +215 -0
  24. package/dist/cli/hooks/pre-tool-use.js.map +1 -0
  25. package/dist/cli/hooks/session.d.ts +5 -0
  26. package/dist/cli/hooks/session.d.ts.map +1 -0
  27. package/dist/cli/hooks/session.js +188 -0
  28. package/dist/cli/hooks/session.js.map +1 -0
  29. package/dist/cli/hooks/shared.d.ts +6 -0
  30. package/dist/cli/hooks/shared.d.ts.map +1 -0
  31. package/dist/cli/hooks/shared.js +70 -0
  32. package/dist/cli/hooks/shared.js.map +1 -0
  33. package/dist/cli/hooks/wiki.d.ts +10 -0
  34. package/dist/cli/hooks/wiki.d.ts.map +1 -0
  35. package/dist/cli/hooks/wiki.js +202 -0
  36. package/dist/cli/hooks/wiki.js.map +1 -0
  37. package/dist/cli/hooks.d.ts +5 -16
  38. package/dist/cli/hooks.d.ts.map +1 -1
  39. package/dist/cli/hooks.js +5 -1132
  40. package/dist/cli/hooks.js.map +1 -1
  41. package/dist/cli/setup/claude.d.ts +4 -0
  42. package/dist/cli/setup/claude.d.ts.map +1 -0
  43. package/dist/cli/setup/claude.js +123 -0
  44. package/dist/cli/setup/claude.js.map +1 -0
  45. package/dist/cli/setup/codex.d.ts +12 -0
  46. package/dist/cli/setup/codex.d.ts.map +1 -0
  47. package/dist/cli/setup/codex.js +182 -0
  48. package/dist/cli/setup/codex.js.map +1 -0
  49. package/dist/cli/setup/cursor.d.ts +3 -0
  50. package/dist/cli/setup/cursor.d.ts.map +1 -0
  51. package/dist/cli/setup/cursor.js +6 -0
  52. package/dist/cli/setup/cursor.js.map +1 -0
  53. package/dist/cli/setup/fs.d.ts +6 -0
  54. package/dist/cli/setup/fs.d.ts.map +1 -0
  55. package/dist/cli/setup/fs.js +44 -0
  56. package/dist/cli/setup/fs.js.map +1 -0
  57. package/dist/cli/setup/gemini.d.ts +5 -0
  58. package/dist/cli/setup/gemini.d.ts.map +1 -0
  59. package/dist/cli/setup/gemini.js +46 -0
  60. package/dist/cli/setup/gemini.js.map +1 -0
  61. package/dist/cli/setup/hooks.d.ts +12 -0
  62. package/dist/cli/setup/hooks.d.ts.map +1 -0
  63. package/dist/cli/setup/hooks.js +29 -0
  64. package/dist/cli/setup/hooks.js.map +1 -0
  65. package/dist/cli/setup/mcp.d.ts +13 -0
  66. package/dist/cli/setup/mcp.d.ts.map +1 -0
  67. package/dist/cli/setup/mcp.js +104 -0
  68. package/dist/cli/setup/mcp.js.map +1 -0
  69. package/dist/cli/setup/rules.d.ts +4 -0
  70. package/dist/cli/setup/rules.d.ts.map +1 -0
  71. package/dist/cli/setup/rules.js +157 -0
  72. package/dist/cli/setup/rules.js.map +1 -0
  73. package/dist/cli/setup/types.d.ts +24 -0
  74. package/dist/cli/setup/types.d.ts.map +1 -0
  75. package/dist/cli/setup/types.js +2 -0
  76. package/dist/cli/setup/types.js.map +1 -0
  77. package/dist/cli/setup.d.ts +8 -48
  78. package/dist/cli/setup.d.ts.map +1 -1
  79. package/dist/cli/setup.js +49 -724
  80. package/dist/cli/setup.js.map +1 -1
  81. package/dist/config.d.ts +15 -0
  82. package/dist/config.d.ts.map +1 -1
  83. package/dist/config.js +56 -2
  84. package/dist/config.js.map +1 -1
  85. package/dist/formatter-dispatch.d.ts +53 -0
  86. package/dist/formatter-dispatch.d.ts.map +1 -0
  87. package/dist/formatter-dispatch.js +54 -0
  88. package/dist/formatter-dispatch.js.map +1 -0
  89. package/dist/formatters-analysis.d.ts +9 -0
  90. package/dist/formatters-analysis.d.ts.map +1 -0
  91. package/dist/formatters-analysis.js +166 -0
  92. package/dist/formatters-analysis.js.map +1 -0
  93. package/dist/formatters-core.d.ts +200 -0
  94. package/dist/formatters-core.d.ts.map +1 -0
  95. package/dist/formatters-core.js +206 -0
  96. package/dist/formatters-core.js.map +1 -0
  97. package/dist/formatters-graph.d.ts +124 -0
  98. package/dist/formatters-graph.d.ts.map +1 -0
  99. package/dist/formatters-graph.js +175 -0
  100. package/dist/formatters-graph.js.map +1 -0
  101. package/dist/formatters-nextjs.d.ts +22 -0
  102. package/dist/formatters-nextjs.d.ts.map +1 -0
  103. package/dist/formatters-nextjs.js +394 -0
  104. package/dist/formatters-nextjs.js.map +1 -0
  105. package/dist/formatters.d.ts +8 -349
  106. package/dist/formatters.d.ts.map +1 -1
  107. package/dist/formatters.js +10 -929
  108. package/dist/formatters.js.map +1 -1
  109. package/dist/parser/astro-template/preprocess.d.ts +12 -0
  110. package/dist/parser/astro-template/preprocess.d.ts.map +1 -0
  111. package/dist/parser/astro-template/preprocess.js +34 -0
  112. package/dist/parser/astro-template/preprocess.js.map +1 -0
  113. package/dist/parser/astro-template/resolution.d.ts +16 -0
  114. package/dist/parser/astro-template/resolution.d.ts.map +1 -0
  115. package/dist/parser/astro-template/resolution.js +58 -0
  116. package/dist/parser/astro-template/resolution.js.map +1 -0
  117. package/dist/parser/astro-template/scanner.d.ts +4 -0
  118. package/dist/parser/astro-template/scanner.d.ts.map +1 -0
  119. package/dist/parser/astro-template/scanner.js +71 -0
  120. package/dist/parser/astro-template/scanner.js.map +1 -0
  121. package/dist/parser/astro-template/state.d.ts +22 -0
  122. package/dist/parser/astro-template/state.d.ts.map +1 -0
  123. package/dist/parser/astro-template/state.js +48 -0
  124. package/dist/parser/astro-template/state.js.map +1 -0
  125. package/dist/parser/astro-template/tag-processor.d.ts +3 -0
  126. package/dist/parser/astro-template/tag-processor.d.ts.map +1 -0
  127. package/dist/parser/astro-template/tag-processor.js +63 -0
  128. package/dist/parser/astro-template/tag-processor.js.map +1 -0
  129. package/dist/parser/astro-template/types.d.ts +42 -0
  130. package/dist/parser/astro-template/types.d.ts.map +1 -0
  131. package/dist/parser/astro-template/types.js +2 -0
  132. package/dist/parser/astro-template/types.js.map +1 -0
  133. package/dist/parser/astro-template.d.ts +2 -45
  134. package/dist/parser/astro-template.d.ts.map +1 -1
  135. package/dist/parser/astro-template.js +7 -168
  136. package/dist/parser/astro-template.js.map +1 -1
  137. package/dist/parser/extractors/_shared.js +1 -1
  138. package/dist/parser/extractors/_shared.js.map +1 -1
  139. package/dist/parser/extractors/astro.js +1 -1
  140. package/dist/parser/extractors/astro.js.map +1 -1
  141. package/dist/parser/extractors/conversation.js +1 -1
  142. package/dist/parser/extractors/conversation.js.map +1 -1
  143. package/dist/parser/extractors/hono-app-discovery.d.ts +4 -0
  144. package/dist/parser/extractors/hono-app-discovery.d.ts.map +1 -0
  145. package/dist/parser/extractors/hono-app-discovery.js +169 -0
  146. package/dist/parser/extractors/hono-app-discovery.js.map +1 -0
  147. package/dist/parser/extractors/hono-ast-utils.d.ts +6 -0
  148. package/dist/parser/extractors/hono-ast-utils.d.ts.map +1 -0
  149. package/dist/parser/extractors/hono-ast-utils.js +77 -0
  150. package/dist/parser/extractors/hono-ast-utils.js.map +1 -0
  151. package/dist/parser/extractors/hono-context-extractor.d.ts +15 -0
  152. package/dist/parser/extractors/hono-context-extractor.d.ts.map +1 -0
  153. package/dist/parser/extractors/hono-context-extractor.js +191 -0
  154. package/dist/parser/extractors/hono-context-extractor.js.map +1 -0
  155. package/dist/parser/extractors/hono-middleware-extractor.d.ts +38 -0
  156. package/dist/parser/extractors/hono-middleware-extractor.d.ts.map +1 -0
  157. package/dist/parser/extractors/hono-middleware-extractor.js +480 -0
  158. package/dist/parser/extractors/hono-middleware-extractor.js.map +1 -0
  159. package/dist/parser/extractors/hono-openapi-extractor.d.ts +11 -0
  160. package/dist/parser/extractors/hono-openapi-extractor.d.ts.map +1 -0
  161. package/dist/parser/extractors/hono-openapi-extractor.js +119 -0
  162. package/dist/parser/extractors/hono-openapi-extractor.js.map +1 -0
  163. package/dist/parser/extractors/hono-route-extractor.d.ts +11 -0
  164. package/dist/parser/extractors/hono-route-extractor.d.ts.map +1 -0
  165. package/dist/parser/extractors/hono-route-extractor.js +128 -0
  166. package/dist/parser/extractors/hono-route-extractor.js.map +1 -0
  167. package/dist/parser/extractors/hono-route-utils.d.ts +11 -0
  168. package/dist/parser/extractors/hono-route-utils.d.ts.map +1 -0
  169. package/dist/parser/extractors/hono-route-utils.js +40 -0
  170. package/dist/parser/extractors/hono-route-utils.js.map +1 -0
  171. package/dist/parser/extractors/hono-runtime-extractor.d.ts +17 -0
  172. package/dist/parser/extractors/hono-runtime-extractor.d.ts.map +1 -0
  173. package/dist/parser/extractors/hono-runtime-extractor.js +141 -0
  174. package/dist/parser/extractors/hono-runtime-extractor.js.map +1 -0
  175. package/dist/parser/extractors/hono.d.ts +5 -79
  176. package/dist/parser/extractors/hono.d.ts.map +1 -1
  177. package/dist/parser/extractors/hono.js +32 -1159
  178. package/dist/parser/extractors/hono.js.map +1 -1
  179. package/dist/parser/extractors/kotlin-ast-helpers.d.ts +43 -0
  180. package/dist/parser/extractors/kotlin-ast-helpers.d.ts.map +1 -0
  181. package/dist/parser/extractors/kotlin-ast-helpers.js +187 -0
  182. package/dist/parser/extractors/kotlin-ast-helpers.js.map +1 -0
  183. package/dist/parser/extractors/kotlin-test-symbols.d.ts +21 -0
  184. package/dist/parser/extractors/kotlin-test-symbols.d.ts.map +1 -0
  185. package/dist/parser/extractors/kotlin-test-symbols.js +162 -0
  186. package/dist/parser/extractors/kotlin-test-symbols.js.map +1 -0
  187. package/dist/parser/extractors/kotlin.d.ts.map +1 -1
  188. package/dist/parser/extractors/kotlin.js +3 -334
  189. package/dist/parser/extractors/kotlin.js.map +1 -1
  190. package/dist/parser/extractors/markdown.js +1 -1
  191. package/dist/parser/extractors/markdown.js.map +1 -1
  192. package/dist/parser/extractors/prisma.js +1 -1
  193. package/dist/parser/extractors/prisma.js.map +1 -1
  194. package/dist/parser/extractors/sql-boundaries.d.ts +3 -0
  195. package/dist/parser/extractors/sql-boundaries.d.ts.map +1 -0
  196. package/dist/parser/extractors/sql-boundaries.js +19 -0
  197. package/dist/parser/extractors/sql-boundaries.js.map +1 -0
  198. package/dist/parser/extractors/sql-columns.d.ts +14 -0
  199. package/dist/parser/extractors/sql-columns.d.ts.map +1 -0
  200. package/dist/parser/extractors/sql-columns.js +59 -0
  201. package/dist/parser/extractors/sql-columns.js.map +1 -0
  202. package/dist/parser/extractors/sql-docstrings.d.ts +2 -0
  203. package/dist/parser/extractors/sql-docstrings.d.ts.map +1 -0
  204. package/dist/parser/extractors/sql-docstrings.js +45 -0
  205. package/dist/parser/extractors/sql-docstrings.js.map +1 -0
  206. package/dist/parser/extractors/sql-end-scanner.d.ts +5 -0
  207. package/dist/parser/extractors/sql-end-scanner.d.ts.map +1 -0
  208. package/dist/parser/extractors/sql-end-scanner.js +84 -0
  209. package/dist/parser/extractors/sql-end-scanner.js.map +1 -0
  210. package/dist/parser/extractors/sql-jinja.d.ts +2 -0
  211. package/dist/parser/extractors/sql-jinja.d.ts.map +1 -0
  212. package/dist/parser/extractors/sql-jinja.js +8 -0
  213. package/dist/parser/extractors/sql-jinja.js.map +1 -0
  214. package/dist/parser/extractors/sql-matcher-catalog.d.ts +9 -0
  215. package/dist/parser/extractors/sql-matcher-catalog.d.ts.map +1 -0
  216. package/dist/parser/extractors/sql-matcher-catalog.js +15 -0
  217. package/dist/parser/extractors/sql-matcher-catalog.js.map +1 -0
  218. package/dist/parser/extractors/sql-matchers.d.ts +9 -0
  219. package/dist/parser/extractors/sql-matchers.d.ts.map +1 -0
  220. package/dist/parser/extractors/sql-matchers.js +20 -0
  221. package/dist/parser/extractors/sql-matchers.js.map +1 -0
  222. package/dist/parser/extractors/sql-offsets.d.ts +2 -0
  223. package/dist/parser/extractors/sql-offsets.d.ts.map +1 -0
  224. package/dist/parser/extractors/sql-offsets.js +25 -0
  225. package/dist/parser/extractors/sql-offsets.js.map +1 -0
  226. package/dist/parser/extractors/sql-parens.d.ts +4 -0
  227. package/dist/parser/extractors/sql-parens.d.ts.map +1 -0
  228. package/dist/parser/extractors/sql-parens.js +70 -0
  229. package/dist/parser/extractors/sql-parens.js.map +1 -0
  230. package/dist/parser/extractors/sql-symbols.d.ts +11 -0
  231. package/dist/parser/extractors/sql-symbols.d.ts.map +1 -0
  232. package/dist/parser/extractors/sql-symbols.js +23 -0
  233. package/dist/parser/extractors/sql-symbols.js.map +1 -0
  234. package/dist/parser/extractors/sql.d.ts +2 -30
  235. package/dist/parser/extractors/sql.d.ts.map +1 -1
  236. package/dist/parser/extractors/sql.js +23 -496
  237. package/dist/parser/extractors/sql.js.map +1 -1
  238. package/dist/parser/extractors/typescript-cjs-nodes.d.ts +5 -0
  239. package/dist/parser/extractors/typescript-cjs-nodes.d.ts.map +1 -0
  240. package/dist/parser/extractors/typescript-cjs-nodes.js +148 -0
  241. package/dist/parser/extractors/typescript-cjs-nodes.js.map +1 -0
  242. package/dist/parser/extractors/typescript-class-nodes.d.ts +8 -0
  243. package/dist/parser/extractors/typescript-class-nodes.d.ts.map +1 -0
  244. package/dist/parser/extractors/typescript-class-nodes.js +183 -0
  245. package/dist/parser/extractors/typescript-class-nodes.js.map +1 -0
  246. package/dist/parser/extractors/typescript-declaration-nodes.d.ts +5 -0
  247. package/dist/parser/extractors/typescript-declaration-nodes.d.ts.map +1 -0
  248. package/dist/parser/extractors/typescript-declaration-nodes.js +105 -0
  249. package/dist/parser/extractors/typescript-declaration-nodes.js.map +1 -0
  250. package/dist/parser/extractors/typescript-module-nodes.d.ts +6 -0
  251. package/dist/parser/extractors/typescript-module-nodes.d.ts.map +1 -0
  252. package/dist/parser/extractors/typescript-module-nodes.js +151 -0
  253. package/dist/parser/extractors/typescript-module-nodes.js.map +1 -0
  254. package/dist/parser/extractors/typescript-react.d.ts +11 -0
  255. package/dist/parser/extractors/typescript-react.d.ts.map +1 -0
  256. package/dist/parser/extractors/typescript-react.js +101 -0
  257. package/dist/parser/extractors/typescript-react.js.map +1 -0
  258. package/dist/parser/extractors/typescript-shared.d.ts +26 -0
  259. package/dist/parser/extractors/typescript-shared.d.ts.map +1 -0
  260. package/dist/parser/extractors/typescript-shared.js +101 -0
  261. package/dist/parser/extractors/typescript-shared.js.map +1 -0
  262. package/dist/parser/extractors/typescript-test-nodes.d.ts +4 -0
  263. package/dist/parser/extractors/typescript-test-nodes.d.ts.map +1 -0
  264. package/dist/parser/extractors/typescript-test-nodes.js +112 -0
  265. package/dist/parser/extractors/typescript-test-nodes.js.map +1 -0
  266. package/dist/parser/extractors/typescript-type-nodes.d.ts +6 -0
  267. package/dist/parser/extractors/typescript-type-nodes.d.ts.map +1 -0
  268. package/dist/parser/extractors/typescript-type-nodes.js +48 -0
  269. package/dist/parser/extractors/typescript-type-nodes.js.map +1 -0
  270. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  271. package/dist/parser/extractors/typescript.js +68 -1127
  272. package/dist/parser/extractors/typescript.js.map +1 -1
  273. package/dist/parser/parser-manager.d.ts.map +1 -1
  274. package/dist/parser/parser-manager.js +5 -0
  275. package/dist/parser/parser-manager.js.map +1 -1
  276. package/dist/parser/symbol-extractor.d.ts +1 -12
  277. package/dist/parser/symbol-extractor.d.ts.map +1 -1
  278. package/dist/parser/symbol-extractor.js +2 -24
  279. package/dist/parser/symbol-extractor.js.map +1 -1
  280. package/dist/parser/symbol-utils.d.ts +4 -0
  281. package/dist/parser/symbol-utils.d.ts.map +1 -0
  282. package/dist/parser/symbol-utils.js +20 -0
  283. package/dist/parser/symbol-utils.js.map +1 -0
  284. package/dist/register-tool-groups/analysis/cross-repo.d.ts +4 -0
  285. package/dist/register-tool-groups/analysis/cross-repo.d.ts.map +1 -0
  286. package/dist/register-tool-groups/analysis/cross-repo.js +108 -0
  287. package/dist/register-tool-groups/analysis/cross-repo.js.map +1 -0
  288. package/dist/register-tool-groups/analysis/review.d.ts +3 -0
  289. package/dist/register-tool-groups/analysis/review.d.ts.map +1 -0
  290. package/dist/register-tool-groups/analysis/review.js +96 -0
  291. package/dist/register-tool-groups/analysis/review.js.map +1 -0
  292. package/dist/register-tool-groups/analysis/workspace.d.ts +3 -0
  293. package/dist/register-tool-groups/analysis/workspace.d.ts.map +1 -0
  294. package/dist/register-tool-groups/analysis/workspace.js +82 -0
  295. package/dist/register-tool-groups/analysis/workspace.js.map +1 -0
  296. package/dist/register-tool-groups/analysis.d.ts +3 -0
  297. package/dist/register-tool-groups/analysis.d.ts.map +1 -0
  298. package/dist/register-tool-groups/analysis.js +541 -0
  299. package/dist/register-tool-groups/analysis.js.map +1 -0
  300. package/dist/register-tool-groups/astro.d.ts +3 -0
  301. package/dist/register-tool-groups/astro.d.ts.map +1 -0
  302. package/dist/register-tool-groups/astro.js +302 -0
  303. package/dist/register-tool-groups/astro.js.map +1 -0
  304. package/dist/register-tool-groups/core/index.d.ts +3 -0
  305. package/dist/register-tool-groups/core/index.d.ts.map +1 -0
  306. package/dist/register-tool-groups/core/index.js +96 -0
  307. package/dist/register-tool-groups/core/index.js.map +1 -0
  308. package/dist/register-tool-groups/core/meta.d.ts +3 -0
  309. package/dist/register-tool-groups/core/meta.d.ts.map +1 -0
  310. package/dist/register-tool-groups/core/meta.js +180 -0
  311. package/dist/register-tool-groups/core/meta.js.map +1 -0
  312. package/dist/register-tool-groups/core/schema.d.ts +3 -0
  313. package/dist/register-tool-groups/core/schema.d.ts.map +1 -0
  314. package/dist/register-tool-groups/core/schema.js +16 -0
  315. package/dist/register-tool-groups/core/schema.js.map +1 -0
  316. package/dist/register-tool-groups/core/search.d.ts +4 -0
  317. package/dist/register-tool-groups/core/search.d.ts.map +1 -0
  318. package/dist/register-tool-groups/core/search.js +262 -0
  319. package/dist/register-tool-groups/core/search.js.map +1 -0
  320. package/dist/register-tool-groups/core/symbols.d.ts +3 -0
  321. package/dist/register-tool-groups/core/symbols.d.ts.map +1 -0
  322. package/dist/register-tool-groups/core/symbols.js +338 -0
  323. package/dist/register-tool-groups/core/symbols.js.map +1 -0
  324. package/dist/register-tool-groups/core.d.ts +3 -0
  325. package/dist/register-tool-groups/core.d.ts.map +1 -0
  326. package/dist/register-tool-groups/core.js +12 -0
  327. package/dist/register-tool-groups/core.js.map +1 -0
  328. package/dist/register-tool-groups/deps.d.ts +10 -0
  329. package/dist/register-tool-groups/deps.d.ts.map +1 -0
  330. package/dist/register-tool-groups/deps.js +6 -0
  331. package/dist/register-tool-groups/deps.js.map +1 -0
  332. package/dist/register-tool-groups/handler-wrappers.d.ts +63 -0
  333. package/dist/register-tool-groups/handler-wrappers.d.ts.map +1 -0
  334. package/dist/register-tool-groups/handler-wrappers.js +106 -0
  335. package/dist/register-tool-groups/handler-wrappers.js.map +1 -0
  336. package/dist/register-tool-groups/hono.d.ts +3 -0
  337. package/dist/register-tool-groups/hono.d.ts.map +1 -0
  338. package/dist/register-tool-groups/hono.js +179 -0
  339. package/dist/register-tool-groups/hono.js.map +1 -0
  340. package/dist/register-tool-groups/index.d.ts +3 -0
  341. package/dist/register-tool-groups/index.d.ts.map +1 -0
  342. package/dist/register-tool-groups/index.js +28 -0
  343. package/dist/register-tool-groups/index.js.map +1 -0
  344. package/dist/register-tool-groups/kotlin.d.ts +3 -0
  345. package/dist/register-tool-groups/kotlin.d.ts.map +1 -0
  346. package/dist/register-tool-groups/kotlin.js +162 -0
  347. package/dist/register-tool-groups/kotlin.js.map +1 -0
  348. package/dist/register-tool-groups/meta.d.ts +3 -0
  349. package/dist/register-tool-groups/meta.d.ts.map +1 -0
  350. package/dist/register-tool-groups/meta.js +563 -0
  351. package/dist/register-tool-groups/meta.js.map +1 -0
  352. package/dist/register-tool-groups/nextjs.d.ts +3 -0
  353. package/dist/register-tool-groups/nextjs.d.ts.map +1 -0
  354. package/dist/register-tool-groups/nextjs.js +78 -0
  355. package/dist/register-tool-groups/nextjs.js.map +1 -0
  356. package/dist/register-tool-groups/php.d.ts +3 -0
  357. package/dist/register-tool-groups/php.d.ts.map +1 -0
  358. package/dist/register-tool-groups/php.js +312 -0
  359. package/dist/register-tool-groups/php.js.map +1 -0
  360. package/dist/register-tool-groups/python.d.ts +3 -0
  361. package/dist/register-tool-groups/python.d.ts.map +1 -0
  362. package/dist/register-tool-groups/python.js +366 -0
  363. package/dist/register-tool-groups/python.js.map +1 -0
  364. package/dist/register-tool-groups/react.d.ts +3 -0
  365. package/dist/register-tool-groups/react.d.ts.map +1 -0
  366. package/dist/register-tool-groups/react.js +119 -0
  367. package/dist/register-tool-groups/react.js.map +1 -0
  368. package/dist/register-tool-groups/shared.d.ts +156 -0
  369. package/dist/register-tool-groups/shared.d.ts.map +1 -0
  370. package/dist/register-tool-groups/shared.js +182 -0
  371. package/dist/register-tool-groups/shared.js.map +1 -0
  372. package/dist/register-tool-groups/sql.d.ts +3 -0
  373. package/dist/register-tool-groups/sql.d.ts.map +1 -0
  374. package/dist/register-tool-groups/sql.js +260 -0
  375. package/dist/register-tool-groups/sql.js.map +1 -0
  376. package/dist/register-tool-loaders.d.ts +22 -22
  377. package/dist/register-tool-loaders.d.ts.map +1 -1
  378. package/dist/register-tools/autoload.d.ts +8 -0
  379. package/dist/register-tools/autoload.d.ts.map +1 -0
  380. package/dist/register-tools/autoload.js +517 -0
  381. package/dist/register-tools/autoload.js.map +1 -0
  382. package/dist/register-tools/discovery.d.ts +55 -0
  383. package/dist/register-tools/discovery.d.ts.map +1 -0
  384. package/dist/register-tools/discovery.js +206 -0
  385. package/dist/register-tools/discovery.js.map +1 -0
  386. package/dist/register-tools/runtime.d.ts +89 -0
  387. package/dist/register-tools/runtime.d.ts.map +1 -0
  388. package/dist/register-tools/runtime.js +491 -0
  389. package/dist/register-tools/runtime.js.map +1 -0
  390. package/dist/register-tools.d.ts +5 -172
  391. package/dist/register-tools.d.ts.map +1 -1
  392. package/dist/register-tools.js +27 -4878
  393. package/dist/register-tools.js.map +1 -1
  394. package/dist/search/bm25.js +1 -1
  395. package/dist/search/bm25.js.map +1 -1
  396. package/dist/search/tool-embedding-cache.d.ts +4 -0
  397. package/dist/search/tool-embedding-cache.d.ts.map +1 -0
  398. package/dist/search/tool-embedding-cache.js +44 -0
  399. package/dist/search/tool-embedding-cache.js.map +1 -0
  400. package/dist/search/tool-embedding-storage.d.ts +8 -0
  401. package/dist/search/tool-embedding-storage.d.ts.map +1 -0
  402. package/dist/search/tool-embedding-storage.js +56 -0
  403. package/dist/search/tool-embedding-storage.js.map +1 -0
  404. package/dist/search/tool-ranker-bm25.d.ts +6 -0
  405. package/dist/search/tool-ranker-bm25.d.ts.map +1 -0
  406. package/dist/search/tool-ranker-bm25.js +40 -0
  407. package/dist/search/tool-ranker-bm25.js.map +1 -0
  408. package/dist/search/tool-ranker-orchestrator.d.ts +3 -0
  409. package/dist/search/tool-ranker-orchestrator.d.ts.map +1 -0
  410. package/dist/search/tool-ranker-orchestrator.js +49 -0
  411. package/dist/search/tool-ranker-orchestrator.js.map +1 -0
  412. package/dist/search/tool-ranker-reasoning.d.ts +4 -0
  413. package/dist/search/tool-ranker-reasoning.d.ts.map +1 -0
  414. package/dist/search/tool-ranker-reasoning.js +35 -0
  415. package/dist/search/tool-ranker-reasoning.js.map +1 -0
  416. package/dist/search/tool-ranker-signal-math.d.ts +6 -0
  417. package/dist/search/tool-ranker-signal-math.d.ts.map +1 -0
  418. package/dist/search/tool-ranker-signal-math.js +51 -0
  419. package/dist/search/tool-ranker-signal-math.js.map +1 -0
  420. package/dist/search/tool-ranker-signals.d.ts +20 -0
  421. package/dist/search/tool-ranker-signals.d.ts.map +1 -0
  422. package/dist/search/tool-ranker-signals.js +50 -0
  423. package/dist/search/tool-ranker-signals.js.map +1 -0
  424. package/dist/search/tool-ranker-types.d.ts +26 -0
  425. package/dist/search/tool-ranker-types.d.ts.map +1 -0
  426. package/dist/search/tool-ranker-types.js +2 -0
  427. package/dist/search/tool-ranker-types.js.map +1 -0
  428. package/dist/search/tool-ranker.d.ts +6 -89
  429. package/dist/search/tool-ranker.d.ts.map +1 -1
  430. package/dist/search/tool-ranker.js +5 -419
  431. package/dist/search/tool-ranker.js.map +1 -1
  432. package/dist/server-helpers/repo-resolution.d.ts +45 -0
  433. package/dist/server-helpers/repo-resolution.d.ts.map +1 -0
  434. package/dist/server-helpers/repo-resolution.js +113 -0
  435. package/dist/server-helpers/repo-resolution.js.map +1 -0
  436. package/dist/server-helpers/response-hints.d.ts +9 -0
  437. package/dist/server-helpers/response-hints.d.ts.map +1 -0
  438. package/dist/server-helpers/response-hints.js +225 -0
  439. package/dist/server-helpers/response-hints.js.map +1 -0
  440. package/dist/server-helpers.d.ts +14 -35
  441. package/dist/server-helpers.d.ts.map +1 -1
  442. package/dist/server-helpers.js +53 -320
  443. package/dist/server-helpers.js.map +1 -1
  444. package/dist/server.d.ts.map +1 -1
  445. package/dist/server.js +41 -1
  446. package/dist/server.js.map +1 -1
  447. package/dist/storage/usage-tracker.d.ts.map +1 -1
  448. package/dist/storage/usage-tracker.js +12 -0
  449. package/dist/storage/usage-tracker.js.map +1 -1
  450. package/dist/tools/astro-actions/ast.d.ts +14 -0
  451. package/dist/tools/astro-actions/ast.d.ts.map +1 -0
  452. package/dist/tools/astro-actions/ast.js +75 -0
  453. package/dist/tools/astro-actions/ast.js.map +1 -0
  454. package/dist/tools/astro-actions/audit.d.ts +5 -0
  455. package/dist/tools/astro-actions/audit.d.ts.map +1 -0
  456. package/dist/tools/astro-actions/audit.js +102 -0
  457. package/dist/tools/astro-actions/audit.js.map +1 -0
  458. package/dist/tools/astro-actions/callers.d.ts +9 -0
  459. package/dist/tools/astro-actions/callers.d.ts.map +1 -0
  460. package/dist/tools/astro-actions/callers.js +84 -0
  461. package/dist/tools/astro-actions/callers.js.map +1 -0
  462. package/dist/tools/astro-actions/parser.d.ts +3 -0
  463. package/dist/tools/astro-actions/parser.d.ts.map +1 -0
  464. package/dist/tools/astro-actions/parser.js +156 -0
  465. package/dist/tools/astro-actions/parser.js.map +1 -0
  466. package/dist/tools/astro-actions/types.d.ts +58 -0
  467. package/dist/tools/astro-actions/types.d.ts.map +1 -0
  468. package/dist/tools/astro-actions/types.js +2 -0
  469. package/dist/tools/astro-actions/types.js.map +1 -0
  470. package/dist/tools/astro-actions/zod-ast.d.ts +7 -0
  471. package/dist/tools/astro-actions/zod-ast.d.ts.map +1 -0
  472. package/dist/tools/astro-actions/zod-ast.js +51 -0
  473. package/dist/tools/astro-actions/zod-ast.js.map +1 -0
  474. package/dist/tools/astro-actions.d.ts +6 -46
  475. package/dist/tools/astro-actions.d.ts.map +1 -1
  476. package/dist/tools/astro-actions.js +6 -545
  477. package/dist/tools/astro-actions.js.map +1 -1
  478. package/dist/tools/astro-content-collections/diagnostics.d.ts +3 -0
  479. package/dist/tools/astro-content-collections/diagnostics.d.ts.map +1 -0
  480. package/dist/tools/astro-content-collections/diagnostics.js +277 -0
  481. package/dist/tools/astro-content-collections/diagnostics.js.map +1 -0
  482. package/dist/tools/astro-content-collections/discovery.d.ts +6 -0
  483. package/dist/tools/astro-content-collections/discovery.d.ts.map +1 -0
  484. package/dist/tools/astro-content-collections/discovery.js +152 -0
  485. package/dist/tools/astro-content-collections/discovery.js.map +1 -0
  486. package/dist/tools/astro-content-collections/schema.d.ts +15 -0
  487. package/dist/tools/astro-content-collections/schema.d.ts.map +1 -0
  488. package/dist/tools/astro-content-collections/schema.js +119 -0
  489. package/dist/tools/astro-content-collections/schema.js.map +1 -0
  490. package/dist/tools/astro-content-collections/types.d.ts +61 -0
  491. package/dist/tools/astro-content-collections/types.d.ts.map +1 -0
  492. package/dist/tools/astro-content-collections/types.js +2 -0
  493. package/dist/tools/astro-content-collections/types.js.map +1 -0
  494. package/dist/tools/astro-content-collections.d.ts +5 -40
  495. package/dist/tools/astro-content-collections.d.ts.map +1 -1
  496. package/dist/tools/astro-content-collections.js +42 -449
  497. package/dist/tools/astro-content-collections.js.map +1 -1
  498. package/dist/tools/astro-routes.js +1 -1
  499. package/dist/tools/astro-routes.js.map +1 -1
  500. package/dist/tools/complexity-tools.d.ts +6 -0
  501. package/dist/tools/complexity-tools.d.ts.map +1 -1
  502. package/dist/tools/complexity-tools.js +26 -0
  503. package/dist/tools/complexity-tools.js.map +1 -1
  504. package/dist/tools/context-levels/l0.d.ts +4 -0
  505. package/dist/tools/context-levels/l0.d.ts.map +1 -0
  506. package/dist/tools/context-levels/l0.js +17 -0
  507. package/dist/tools/context-levels/l0.js.map +1 -0
  508. package/dist/tools/context-levels/l1.d.ts +4 -0
  509. package/dist/tools/context-levels/l1.d.ts.map +1 -0
  510. package/dist/tools/context-levels/l1.js +26 -0
  511. package/dist/tools/context-levels/l1.js.map +1 -0
  512. package/dist/tools/context-levels/l2.d.ts +4 -0
  513. package/dist/tools/context-levels/l2.d.ts.map +1 -0
  514. package/dist/tools/context-levels/l2.js +36 -0
  515. package/dist/tools/context-levels/l2.js.map +1 -0
  516. package/dist/tools/context-levels/l3.d.ts +4 -0
  517. package/dist/tools/context-levels/l3.d.ts.map +1 -0
  518. package/dist/tools/context-levels/l3.js +30 -0
  519. package/dist/tools/context-levels/l3.js.map +1 -0
  520. package/dist/tools/context-levels/shared.d.ts +2 -0
  521. package/dist/tools/context-levels/shared.d.ts.map +1 -0
  522. package/dist/tools/context-levels/shared.js +4 -0
  523. package/dist/tools/context-levels/shared.js.map +1 -0
  524. package/dist/tools/context-levels/types.d.ts +34 -0
  525. package/dist/tools/context-levels/types.d.ts.map +1 -0
  526. package/dist/tools/context-levels/types.js +2 -0
  527. package/dist/tools/context-levels/types.js.map +1 -0
  528. package/dist/tools/context-tools.d.ts +2 -34
  529. package/dist/tools/context-tools.d.ts.map +1 -1
  530. package/dist/tools/context-tools.js +11 -127
  531. package/dist/tools/context-tools.js.map +1 -1
  532. package/dist/tools/conversation-cache.d.ts +6 -0
  533. package/dist/tools/conversation-cache.d.ts.map +1 -0
  534. package/dist/tools/conversation-cache.js +29 -0
  535. package/dist/tools/conversation-cache.js.map +1 -0
  536. package/dist/tools/conversation-index-tools.d.ts +39 -0
  537. package/dist/tools/conversation-index-tools.d.ts.map +1 -0
  538. package/dist/tools/conversation-index-tools.js +136 -0
  539. package/dist/tools/conversation-index-tools.js.map +1 -0
  540. package/dist/tools/conversation-paths.d.ts +4 -0
  541. package/dist/tools/conversation-paths.d.ts.map +1 -0
  542. package/dist/tools/conversation-paths.js +15 -0
  543. package/dist/tools/conversation-paths.js.map +1 -0
  544. package/dist/tools/conversation-search-tools.d.ts +52 -0
  545. package/dist/tools/conversation-search-tools.d.ts.map +1 -0
  546. package/dist/tools/conversation-search-tools.js +229 -0
  547. package/dist/tools/conversation-search-tools.js.map +1 -0
  548. package/dist/tools/conversation-tools.d.ts +6 -113
  549. package/dist/tools/conversation-tools.d.ts.map +1 -1
  550. package/dist/tools/conversation-tools.js +4 -464
  551. package/dist/tools/conversation-tools.js.map +1 -1
  552. package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts +5 -0
  553. package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -0
  554. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +76 -0
  555. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -0
  556. package/dist/tools/cross-repo-outbound-lexer/context.d.ts +18 -0
  557. package/dist/tools/cross-repo-outbound-lexer/context.d.ts.map +1 -0
  558. package/dist/tools/cross-repo-outbound-lexer/context.js +33 -0
  559. package/dist/tools/cross-repo-outbound-lexer/context.js.map +1 -0
  560. package/dist/tools/cross-repo-outbound-lexer/literal-readers.d.ts +6 -0
  561. package/dist/tools/cross-repo-outbound-lexer/literal-readers.d.ts.map +1 -0
  562. package/dist/tools/cross-repo-outbound-lexer/literal-readers.js +65 -0
  563. package/dist/tools/cross-repo-outbound-lexer/literal-readers.js.map +1 -0
  564. package/dist/tools/cross-repo-outbound-lexer/non-code-states.d.ts +3 -0
  565. package/dist/tools/cross-repo-outbound-lexer/non-code-states.d.ts.map +1 -0
  566. package/dist/tools/cross-repo-outbound-lexer/non-code-states.js +103 -0
  567. package/dist/tools/cross-repo-outbound-lexer/non-code-states.js.map +1 -0
  568. package/dist/tools/cross-repo-outbound-lexer/template-reader.d.ts +3 -0
  569. package/dist/tools/cross-repo-outbound-lexer/template-reader.d.ts.map +1 -0
  570. package/dist/tools/cross-repo-outbound-lexer/template-reader.js +82 -0
  571. package/dist/tools/cross-repo-outbound-lexer/template-reader.js.map +1 -0
  572. package/dist/tools/cross-repo-outbound-lexer/types.d.ts +18 -0
  573. package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -0
  574. package/dist/tools/cross-repo-outbound-lexer/types.js +2 -0
  575. package/dist/tools/cross-repo-outbound-lexer/types.js.map +1 -0
  576. package/dist/tools/cross-repo-outbound-lexer.d.ts +5 -31
  577. package/dist/tools/cross-repo-outbound-lexer.d.ts.map +1 -1
  578. package/dist/tools/cross-repo-outbound-lexer.js +75 -575
  579. package/dist/tools/cross-repo-outbound-lexer.js.map +1 -1
  580. package/dist/tools/dependency-audit-freshness-tools.d.ts +3 -0
  581. package/dist/tools/dependency-audit-freshness-tools.d.ts.map +1 -0
  582. package/dist/tools/dependency-audit-freshness-tools.js +62 -0
  583. package/dist/tools/dependency-audit-freshness-tools.js.map +1 -0
  584. package/dist/tools/dependency-audit-license-tools.d.ts +5 -0
  585. package/dist/tools/dependency-audit-license-tools.d.ts.map +1 -0
  586. package/dist/tools/dependency-audit-license-tools.js +75 -0
  587. package/dist/tools/dependency-audit-license-tools.js.map +1 -0
  588. package/dist/tools/dependency-audit-lockfile-tools.d.ts +3 -0
  589. package/dist/tools/dependency-audit-lockfile-tools.d.ts.map +1 -0
  590. package/dist/tools/dependency-audit-lockfile-tools.js +147 -0
  591. package/dist/tools/dependency-audit-lockfile-tools.js.map +1 -0
  592. package/dist/tools/dependency-audit-tools.d.ts +2 -54
  593. package/dist/tools/dependency-audit-tools.d.ts.map +1 -1
  594. package/dist/tools/dependency-audit-tools.js +69 -484
  595. package/dist/tools/dependency-audit-tools.js.map +1 -1
  596. package/dist/tools/dependency-audit-types.d.ts +65 -0
  597. package/dist/tools/dependency-audit-types.d.ts.map +1 -0
  598. package/dist/tools/dependency-audit-types.js +19 -0
  599. package/dist/tools/dependency-audit-types.js.map +1 -0
  600. package/dist/tools/dependency-audit-vulnerability-tools.d.ts +4 -0
  601. package/dist/tools/dependency-audit-vulnerability-tools.d.ts.map +1 -0
  602. package/dist/tools/dependency-audit-vulnerability-tools.js +103 -0
  603. package/dist/tools/dependency-audit-vulnerability-tools.js.map +1 -0
  604. package/dist/tools/diff-tools.d.ts.map +1 -1
  605. package/dist/tools/diff-tools.js +5 -7
  606. package/dist/tools/diff-tools.js.map +1 -1
  607. package/dist/tools/impact-tools.d.ts.map +1 -1
  608. package/dist/tools/impact-tools.js +5 -4
  609. package/dist/tools/impact-tools.js.map +1 -1
  610. package/dist/tools/index-shared.d.ts +17 -0
  611. package/dist/tools/index-shared.d.ts.map +1 -0
  612. package/dist/tools/index-shared.js +18 -0
  613. package/dist/tools/index-shared.js.map +1 -0
  614. package/dist/tools/index-tools/file-indexer.d.ts +27 -0
  615. package/dist/tools/index-tools/file-indexer.d.ts.map +1 -0
  616. package/dist/tools/index-tools/file-indexer.js +223 -0
  617. package/dist/tools/index-tools/file-indexer.js.map +1 -0
  618. package/dist/tools/index-tools/folder-indexer.d.ts +21 -0
  619. package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -0
  620. package/dist/tools/index-tools/folder-indexer.js +399 -0
  621. package/dist/tools/index-tools/folder-indexer.js.map +1 -0
  622. package/dist/tools/index-tools/folder-merge.d.ts +23 -0
  623. package/dist/tools/index-tools/folder-merge.d.ts.map +1 -0
  624. package/dist/tools/index-tools/folder-merge.js +205 -0
  625. package/dist/tools/index-tools/folder-merge.js.map +1 -0
  626. package/dist/tools/index-tools/parse.d.ts +35 -0
  627. package/dist/tools/index-tools/parse.d.ts.map +1 -0
  628. package/dist/tools/index-tools/parse.js +262 -0
  629. package/dist/tools/index-tools/parse.js.map +1 -0
  630. package/dist/tools/index-tools/registry.d.ts +40 -0
  631. package/dist/tools/index-tools/registry.d.ts.map +1 -0
  632. package/dist/tools/index-tools/registry.js +258 -0
  633. package/dist/tools/index-tools/registry.js.map +1 -0
  634. package/dist/tools/index-tools/snapshots.d.ts +51 -0
  635. package/dist/tools/index-tools/snapshots.d.ts.map +1 -0
  636. package/dist/tools/index-tools/snapshots.js +223 -0
  637. package/dist/tools/index-tools/snapshots.js.map +1 -0
  638. package/dist/tools/index-tools/state.d.ts +8 -0
  639. package/dist/tools/index-tools/state.d.ts.map +1 -0
  640. package/dist/tools/index-tools/state.js +6 -0
  641. package/dist/tools/index-tools/state.js.map +1 -0
  642. package/dist/tools/index-tools/types.d.ts +20 -0
  643. package/dist/tools/index-tools/types.d.ts.map +1 -0
  644. package/dist/tools/index-tools/types.js +2 -0
  645. package/dist/tools/index-tools/types.js.map +1 -0
  646. package/dist/tools/index-tools/watcher.d.ts +10 -0
  647. package/dist/tools/index-tools/watcher.d.ts.map +1 -0
  648. package/dist/tools/index-tools/watcher.js +130 -0
  649. package/dist/tools/index-tools/watcher.js.map +1 -0
  650. package/dist/tools/index-tools.d.ts +16 -152
  651. package/dist/tools/index-tools.d.ts.map +1 -1
  652. package/dist/tools/index-tools.js +12 -1674
  653. package/dist/tools/index-tools.js.map +1 -1
  654. package/dist/tools/kotlin-extension-tools.d.ts +16 -0
  655. package/dist/tools/kotlin-extension-tools.d.ts.map +1 -0
  656. package/dist/tools/kotlin-extension-tools.js +31 -0
  657. package/dist/tools/kotlin-extension-tools.js.map +1 -0
  658. package/dist/tools/kotlin-flow-tools.d.ts +12 -0
  659. package/dist/tools/kotlin-flow-tools.d.ts.map +1 -0
  660. package/dist/tools/kotlin-flow-tools.js +72 -0
  661. package/dist/tools/kotlin-flow-tools.js.map +1 -0
  662. package/dist/tools/kotlin-kmp-tools.d.ts +29 -0
  663. package/dist/tools/kotlin-kmp-tools.d.ts.map +1 -0
  664. package/dist/tools/kotlin-kmp-tools.js +87 -0
  665. package/dist/tools/kotlin-kmp-tools.js.map +1 -0
  666. package/dist/tools/kotlin-sealed-tools.d.ts +27 -0
  667. package/dist/tools/kotlin-sealed-tools.d.ts.map +1 -0
  668. package/dist/tools/kotlin-sealed-tools.js +130 -0
  669. package/dist/tools/kotlin-sealed-tools.js.map +1 -0
  670. package/dist/tools/kotlin-suspend-tools.d.ts +24 -0
  671. package/dist/tools/kotlin-suspend-tools.d.ts.map +1 -0
  672. package/dist/tools/kotlin-suspend-tools.js +161 -0
  673. package/dist/tools/kotlin-suspend-tools.js.map +1 -0
  674. package/dist/tools/kotlin-tools.d.ts +6 -141
  675. package/dist/tools/kotlin-tools.d.ts.map +1 -1
  676. package/dist/tools/kotlin-tools.js +6 -571
  677. package/dist/tools/kotlin-tools.js.map +1 -1
  678. package/dist/tools/nest-audit-tools.d.ts +43 -0
  679. package/dist/tools/nest-audit-tools.d.ts.map +1 -0
  680. package/dist/tools/nest-audit-tools.js +232 -0
  681. package/dist/tools/nest-audit-tools.js.map +1 -0
  682. package/dist/tools/nest-di-tools.d.ts +32 -0
  683. package/dist/tools/nest-di-tools.d.ts.map +1 -0
  684. package/dist/tools/nest-di-tools.js +161 -0
  685. package/dist/tools/nest-di-tools.js.map +1 -0
  686. package/dist/tools/nest-guard-tools.d.ts +34 -0
  687. package/dist/tools/nest-guard-tools.d.ts.map +1 -0
  688. package/dist/tools/nest-guard-tools.js +240 -0
  689. package/dist/tools/nest-guard-tools.js.map +1 -0
  690. package/dist/tools/nest-lifecycle-tools.d.ts +16 -0
  691. package/dist/tools/nest-lifecycle-tools.d.ts.map +1 -0
  692. package/dist/tools/nest-lifecycle-tools.js +54 -0
  693. package/dist/tools/nest-lifecycle-tools.js.map +1 -0
  694. package/dist/tools/nest-module-tools.d.ts +28 -0
  695. package/dist/tools/nest-module-tools.d.ts.map +1 -0
  696. package/dist/tools/nest-module-tools.js +86 -0
  697. package/dist/tools/nest-module-tools.js.map +1 -0
  698. package/dist/tools/nest-pipeline-tools.d.ts +32 -0
  699. package/dist/tools/nest-pipeline-tools.d.ts.map +1 -0
  700. package/dist/tools/nest-pipeline-tools.js +122 -0
  701. package/dist/tools/nest-pipeline-tools.js.map +1 -0
  702. package/dist/tools/nest-route-tools.d.ts +43 -0
  703. package/dist/tools/nest-route-tools.d.ts.map +1 -0
  704. package/dist/tools/nest-route-tools.js +261 -0
  705. package/dist/tools/nest-route-tools.js.map +1 -0
  706. package/dist/tools/nest-shared-tools.d.ts +13 -0
  707. package/dist/tools/nest-shared-tools.d.ts.map +1 -0
  708. package/dist/tools/nest-shared-tools.js +36 -0
  709. package/dist/tools/nest-shared-tools.js.map +1 -0
  710. package/dist/tools/nest-tools.d.ts +18 -195
  711. package/dist/tools/nest-tools.d.ts.map +1 -1
  712. package/dist/tools/nest-tools.js +11 -1140
  713. package/dist/tools/nest-tools.js.map +1 -1
  714. package/dist/tools/pattern-registry.d.ts +4 -0
  715. package/dist/tools/pattern-registry.d.ts.map +1 -0
  716. package/dist/tools/pattern-registry.js +3 -0
  717. package/dist/tools/pattern-registry.js.map +1 -0
  718. package/dist/tools/pattern-tools.d.ts +5 -46
  719. package/dist/tools/pattern-tools.d.ts.map +1 -1
  720. package/dist/tools/pattern-tools.js +4 -1102
  721. package/dist/tools/pattern-tools.js.map +1 -1
  722. package/dist/tools/patterns/adapters/astro.d.ts +3 -0
  723. package/dist/tools/patterns/adapters/astro.d.ts.map +1 -0
  724. package/dist/tools/patterns/adapters/astro.js +56 -0
  725. package/dist/tools/patterns/adapters/astro.js.map +1 -0
  726. package/dist/tools/patterns/adapters/common.d.ts +3 -0
  727. package/dist/tools/patterns/adapters/common.d.ts.map +1 -0
  728. package/dist/tools/patterns/adapters/common.js +38 -0
  729. package/dist/tools/patterns/adapters/common.js.map +1 -0
  730. package/dist/tools/patterns/adapters/database.d.ts +3 -0
  731. package/dist/tools/patterns/adapters/database.d.ts.map +1 -0
  732. package/dist/tools/patterns/adapters/database.js +32 -0
  733. package/dist/tools/patterns/adapters/database.js.map +1 -0
  734. package/dist/tools/patterns/adapters/hono.d.ts +3 -0
  735. package/dist/tools/patterns/adapters/hono.d.ts.map +1 -0
  736. package/dist/tools/patterns/adapters/hono.js +32 -0
  737. package/dist/tools/patterns/adapters/hono.js.map +1 -0
  738. package/dist/tools/patterns/adapters/kotlin.d.ts +3 -0
  739. package/dist/tools/patterns/adapters/kotlin.d.ts.map +1 -0
  740. package/dist/tools/patterns/adapters/kotlin.js +50 -0
  741. package/dist/tools/patterns/adapters/kotlin.js.map +1 -0
  742. package/dist/tools/patterns/adapters/nest.d.ts +3 -0
  743. package/dist/tools/patterns/adapters/nest.d.ts.map +1 -0
  744. package/dist/tools/patterns/adapters/nest.js +122 -0
  745. package/dist/tools/patterns/adapters/nest.js.map +1 -0
  746. package/dist/tools/patterns/adapters/nextjs.d.ts +4 -0
  747. package/dist/tools/patterns/adapters/nextjs.d.ts.map +1 -0
  748. package/dist/tools/patterns/adapters/nextjs.js +59 -0
  749. package/dist/tools/patterns/adapters/nextjs.js.map +1 -0
  750. package/dist/tools/patterns/adapters/php.d.ts +3 -0
  751. package/dist/tools/patterns/adapters/php.d.ts.map +1 -0
  752. package/dist/tools/patterns/adapters/php.js +157 -0
  753. package/dist/tools/patterns/adapters/php.js.map +1 -0
  754. package/dist/tools/patterns/adapters/python.d.ts +3 -0
  755. package/dist/tools/patterns/adapters/python.d.ts.map +1 -0
  756. package/dist/tools/patterns/adapters/python.js +72 -0
  757. package/dist/tools/patterns/adapters/python.js.map +1 -0
  758. package/dist/tools/patterns/adapters/react.d.ts +4 -0
  759. package/dist/tools/patterns/adapters/react.d.ts.map +1 -0
  760. package/dist/tools/patterns/adapters/react.js +345 -0
  761. package/dist/tools/patterns/adapters/react.js.map +1 -0
  762. package/dist/tools/patterns/catalog.d.ts +8 -0
  763. package/dist/tools/patterns/catalog.d.ts.map +1 -0
  764. package/dist/tools/patterns/catalog.js +30 -0
  765. package/dist/tools/patterns/catalog.js.map +1 -0
  766. package/dist/tools/patterns/execution.d.ts +38 -0
  767. package/dist/tools/patterns/execution.d.ts.map +1 -0
  768. package/dist/tools/patterns/execution.js +298 -0
  769. package/dist/tools/patterns/execution.js.map +1 -0
  770. package/dist/tools/patterns/types.d.ts +13 -0
  771. package/dist/tools/patterns/types.d.ts.map +1 -0
  772. package/dist/tools/patterns/types.js +2 -0
  773. package/dist/tools/patterns/types.js.map +1 -0
  774. package/dist/tools/pg-drift-compare.d.ts +3 -0
  775. package/dist/tools/pg-drift-compare.d.ts.map +1 -0
  776. package/dist/tools/pg-drift-compare.js +30 -0
  777. package/dist/tools/pg-drift-compare.js.map +1 -0
  778. package/dist/tools/pg-drift-schema.d.ts +5 -0
  779. package/dist/tools/pg-drift-schema.d.ts.map +1 -0
  780. package/dist/tools/pg-drift-schema.js +28 -0
  781. package/dist/tools/pg-drift-schema.js.map +1 -0
  782. package/dist/tools/pg-drift-types.d.ts +25 -0
  783. package/dist/tools/pg-drift-types.d.ts.map +1 -0
  784. package/dist/tools/pg-drift-types.js +2 -0
  785. package/dist/tools/pg-drift-types.js.map +1 -0
  786. package/dist/tools/pg-drift.d.ts +5 -0
  787. package/dist/tools/pg-drift.d.ts.map +1 -0
  788. package/dist/tools/pg-drift.js +30 -0
  789. package/dist/tools/pg-drift.js.map +1 -0
  790. package/dist/tools/pg-introspect-formatters.d.ts +7 -0
  791. package/dist/tools/pg-introspect-formatters.d.ts.map +1 -0
  792. package/dist/tools/pg-introspect-formatters.js +66 -0
  793. package/dist/tools/pg-introspect-formatters.js.map +1 -0
  794. package/dist/tools/pg-introspect-tools.d.ts +5 -146
  795. package/dist/tools/pg-introspect-tools.d.ts.map +1 -1
  796. package/dist/tools/pg-introspect-tools.js +3 -395
  797. package/dist/tools/pg-introspect-tools.js.map +1 -1
  798. package/dist/tools/pg-introspection.d.ts +90 -0
  799. package/dist/tools/pg-introspection.d.ts.map +1 -0
  800. package/dist/tools/pg-introspection.js +288 -0
  801. package/dist/tools/pg-introspection.js.map +1 -0
  802. package/dist/tools/php-active-record-tools.d.ts +22 -0
  803. package/dist/tools/php-active-record-tools.d.ts.map +1 -0
  804. package/dist/tools/php-active-record-tools.js +165 -0
  805. package/dist/tools/php-active-record-tools.js.map +1 -0
  806. package/dist/tools/php-event-tools.d.ts +21 -0
  807. package/dist/tools/php-event-tools.d.ts.map +1 -0
  808. package/dist/tools/php-event-tools.js +205 -0
  809. package/dist/tools/php-event-tools.js.map +1 -0
  810. package/dist/tools/php-god-model-tools.d.ts +34 -0
  811. package/dist/tools/php-god-model-tools.d.ts.map +1 -0
  812. package/dist/tools/php-god-model-tools.js +88 -0
  813. package/dist/tools/php-god-model-tools.js.map +1 -0
  814. package/dist/tools/php-import-utils.d.ts +10 -0
  815. package/dist/tools/php-import-utils.d.ts.map +1 -0
  816. package/dist/tools/php-import-utils.js +71 -0
  817. package/dist/tools/php-import-utils.js.map +1 -0
  818. package/dist/tools/php-namespace-tools.d.ts +10 -0
  819. package/dist/tools/php-namespace-tools.d.ts.map +1 -0
  820. package/dist/tools/php-namespace-tools.js +98 -0
  821. package/dist/tools/php-namespace-tools.js.map +1 -0
  822. package/dist/tools/php-nplus1-tools.d.ts +27 -0
  823. package/dist/tools/php-nplus1-tools.d.ts.map +1 -0
  824. package/dist/tools/php-nplus1-tools.js +191 -0
  825. package/dist/tools/php-nplus1-tools.js.map +1 -0
  826. package/dist/tools/php-project-audit-tools.d.ts +31 -0
  827. package/dist/tools/php-project-audit-tools.d.ts.map +1 -0
  828. package/dist/tools/php-project-audit-tools.js +173 -0
  829. package/dist/tools/php-project-audit-tools.js.map +1 -0
  830. package/dist/tools/php-security-tools.d.ts +24 -0
  831. package/dist/tools/php-security-tools.d.ts.map +1 -0
  832. package/dist/tools/php-security-tools.js +172 -0
  833. package/dist/tools/php-security-tools.js.map +1 -0
  834. package/dist/tools/php-service-tools.d.ts +25 -0
  835. package/dist/tools/php-service-tools.d.ts.map +1 -0
  836. package/dist/tools/php-service-tools.js +326 -0
  837. package/dist/tools/php-service-tools.js.map +1 -0
  838. package/dist/tools/php-tools.d.ts +21 -255
  839. package/dist/tools/php-tools.d.ts.map +1 -1
  840. package/dist/tools/php-tools.js +12 -1423
  841. package/dist/tools/php-tools.js.map +1 -1
  842. package/dist/tools/php-view-tools.d.ts +76 -0
  843. package/dist/tools/php-view-tools.d.ts.map +1 -0
  844. package/dist/tools/php-view-tools.js +413 -0
  845. package/dist/tools/php-view-tools.js.map +1 -0
  846. package/dist/tools/plan-turn/formatter.d.ts +3 -0
  847. package/dist/tools/plan-turn/formatter.d.ts.map +1 -0
  848. package/dist/tools/plan-turn/formatter.js +88 -0
  849. package/dist/tools/plan-turn/formatter.js.map +1 -0
  850. package/dist/tools/plan-turn/framework-context.d.ts +5 -0
  851. package/dist/tools/plan-turn/framework-context.d.ts.map +1 -0
  852. package/dist/tools/plan-turn/framework-context.js +68 -0
  853. package/dist/tools/plan-turn/framework-context.js.map +1 -0
  854. package/dist/tools/plan-turn/framework-data.d.ts +5 -0
  855. package/dist/tools/plan-turn/framework-data.d.ts.map +1 -0
  856. package/dist/tools/plan-turn/framework-data.js +48 -0
  857. package/dist/tools/plan-turn/framework-data.js.map +1 -0
  858. package/dist/tools/plan-turn/orchestrator.d.ts +4 -0
  859. package/dist/tools/plan-turn/orchestrator.d.ts.map +1 -0
  860. package/dist/tools/plan-turn/orchestrator.js +262 -0
  861. package/dist/tools/plan-turn/orchestrator.js.map +1 -0
  862. package/dist/tools/plan-turn/query-parser.d.ts +6 -0
  863. package/dist/tools/plan-turn/query-parser.d.ts.map +1 -0
  864. package/dist/tools/plan-turn/query-parser.js +60 -0
  865. package/dist/tools/plan-turn/query-parser.js.map +1 -0
  866. package/dist/tools/plan-turn/recommendations.d.ts +11 -0
  867. package/dist/tools/plan-turn/recommendations.d.ts.map +1 -0
  868. package/dist/tools/plan-turn/recommendations.js +93 -0
  869. package/dist/tools/plan-turn/recommendations.js.map +1 -0
  870. package/dist/tools/plan-turn/stale-index.d.ts +4 -0
  871. package/dist/tools/plan-turn/stale-index.d.ts.map +1 -0
  872. package/dist/tools/plan-turn/stale-index.js +17 -0
  873. package/dist/tools/plan-turn/stale-index.js.map +1 -0
  874. package/dist/tools/plan-turn/types.d.ts +61 -0
  875. package/dist/tools/plan-turn/types.d.ts.map +1 -0
  876. package/dist/tools/plan-turn/types.js +2 -0
  877. package/dist/tools/plan-turn/types.js.map +1 -0
  878. package/dist/tools/plan-turn-tools.d.ts +8 -111
  879. package/dist/tools/plan-turn-tools.d.ts.map +1 -1
  880. package/dist/tools/plan-turn-tools.js +6 -696
  881. package/dist/tools/plan-turn-tools.js.map +1 -1
  882. package/dist/tools/project-profile-express.d.ts +3 -0
  883. package/dist/tools/project-profile-express.d.ts.map +1 -0
  884. package/dist/tools/project-profile-express.js +46 -0
  885. package/dist/tools/project-profile-express.js.map +1 -0
  886. package/dist/tools/project-profile-extractors.d.ts +9 -0
  887. package/dist/tools/project-profile-extractors.d.ts.map +1 -0
  888. package/dist/tools/project-profile-extractors.js +312 -0
  889. package/dist/tools/project-profile-extractors.js.map +1 -0
  890. package/dist/tools/project-profile-fs.d.ts +3 -0
  891. package/dist/tools/project-profile-fs.d.ts.map +1 -0
  892. package/dist/tools/project-profile-fs.js +19 -0
  893. package/dist/tools/project-profile-fs.js.map +1 -0
  894. package/dist/tools/project-profile-hono.d.ts +13 -0
  895. package/dist/tools/project-profile-hono.d.ts.map +1 -0
  896. package/dist/tools/project-profile-hono.js +110 -0
  897. package/dist/tools/project-profile-hono.js.map +1 -0
  898. package/dist/tools/project-profile-imports.d.ts +6 -0
  899. package/dist/tools/project-profile-imports.d.ts.map +1 -0
  900. package/dist/tools/project-profile-imports.js +95 -0
  901. package/dist/tools/project-profile-imports.js.map +1 -0
  902. package/dist/tools/project-profile-nest.d.ts +8 -0
  903. package/dist/tools/project-profile-nest.d.ts.map +1 -0
  904. package/dist/tools/project-profile-nest.js +352 -0
  905. package/dist/tools/project-profile-nest.js.map +1 -0
  906. package/dist/tools/project-profile-next.d.ts +5 -0
  907. package/dist/tools/project-profile-next.d.ts.map +1 -0
  908. package/dist/tools/project-profile-next.js +92 -0
  909. package/dist/tools/project-profile-next.js.map +1 -0
  910. package/dist/tools/project-profile-persistence.d.ts +3 -0
  911. package/dist/tools/project-profile-persistence.d.ts.map +1 -0
  912. package/dist/tools/project-profile-persistence.js +19 -0
  913. package/dist/tools/project-profile-persistence.js.map +1 -0
  914. package/dist/tools/project-profile-php.d.ts +8 -0
  915. package/dist/tools/project-profile-php.d.ts.map +1 -0
  916. package/dist/tools/project-profile-php.js +76 -0
  917. package/dist/tools/project-profile-php.js.map +1 -0
  918. package/dist/tools/project-profile-python.d.ts +5 -0
  919. package/dist/tools/project-profile-python.d.ts.map +1 -0
  920. package/dist/tools/project-profile-python.js +51 -0
  921. package/dist/tools/project-profile-python.js.map +1 -0
  922. package/dist/tools/project-profile-react.d.ts +6 -0
  923. package/dist/tools/project-profile-react.d.ts.map +1 -0
  924. package/dist/tools/project-profile-react.js +106 -0
  925. package/dist/tools/project-profile-react.js.map +1 -0
  926. package/dist/tools/project-profile-stack.d.ts +3 -0
  927. package/dist/tools/project-profile-stack.d.ts.map +1 -0
  928. package/dist/tools/project-profile-stack.js +354 -0
  929. package/dist/tools/project-profile-stack.js.map +1 -0
  930. package/dist/tools/project-profile-summary.d.ts +30 -0
  931. package/dist/tools/project-profile-summary.d.ts.map +1 -0
  932. package/dist/tools/project-profile-summary.js +112 -0
  933. package/dist/tools/project-profile-summary.js.map +1 -0
  934. package/dist/tools/project-profile-types.d.ts +315 -0
  935. package/dist/tools/project-profile-types.d.ts.map +1 -0
  936. package/dist/tools/project-profile-types.js +2 -0
  937. package/dist/tools/project-profile-types.js.map +1 -0
  938. package/dist/tools/project-tools.d.ts +17 -383
  939. package/dist/tools/project-tools.d.ts.map +1 -1
  940. package/dist/tools/project-tools.js +35 -1621
  941. package/dist/tools/project-tools.js.map +1 -1
  942. package/dist/tools/python-audit/aggregate.d.ts +3 -0
  943. package/dist/tools/python-audit/aggregate.d.ts.map +1 -0
  944. package/dist/tools/python-audit/aggregate.js +103 -0
  945. package/dist/tools/python-audit/aggregate.js.map +1 -0
  946. package/dist/tools/python-audit/checks/anti-patterns.d.ts +6 -0
  947. package/dist/tools/python-audit/checks/anti-patterns.d.ts.map +1 -0
  948. package/dist/tools/python-audit/checks/anti-patterns.js +14 -0
  949. package/dist/tools/python-audit/checks/anti-patterns.js.map +1 -0
  950. package/dist/tools/python-audit/checks/celery.d.ts +2 -0
  951. package/dist/tools/python-audit/checks/celery.d.ts.map +1 -0
  952. package/dist/tools/python-audit/checks/celery.js +5 -0
  953. package/dist/tools/python-audit/checks/celery.js.map +1 -0
  954. package/dist/tools/python-audit/checks/circular-imports.d.ts +2 -0
  955. package/dist/tools/python-audit/checks/circular-imports.d.ts.map +1 -0
  956. package/dist/tools/python-audit/checks/circular-imports.js +5 -0
  957. package/dist/tools/python-audit/checks/circular-imports.js.map +1 -0
  958. package/dist/tools/python-audit/checks/dead-code.d.ts +2 -0
  959. package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -0
  960. package/dist/tools/python-audit/checks/dead-code.js +5 -0
  961. package/dist/tools/python-audit/checks/dead-code.js.map +1 -0
  962. package/dist/tools/python-audit/checks/dependencies.d.ts +2 -0
  963. package/dist/tools/python-audit/checks/dependencies.d.ts.map +1 -0
  964. package/dist/tools/python-audit/checks/dependencies.js +5 -0
  965. package/dist/tools/python-audit/checks/dependencies.js.map +1 -0
  966. package/dist/tools/python-audit/checks/django-settings.d.ts +2 -0
  967. package/dist/tools/python-audit/checks/django-settings.d.ts.map +1 -0
  968. package/dist/tools/python-audit/checks/django-settings.js +5 -0
  969. package/dist/tools/python-audit/checks/django-settings.js.map +1 -0
  970. package/dist/tools/python-audit/checks/framework-wiring.d.ts +2 -0
  971. package/dist/tools/python-audit/checks/framework-wiring.d.ts.map +1 -0
  972. package/dist/tools/python-audit/checks/framework-wiring.js +5 -0
  973. package/dist/tools/python-audit/checks/framework-wiring.js.map +1 -0
  974. package/dist/tools/python-audit/checks/pytest-fixtures.d.ts +2 -0
  975. package/dist/tools/python-audit/checks/pytest-fixtures.d.ts.map +1 -0
  976. package/dist/tools/python-audit/checks/pytest-fixtures.js +5 -0
  977. package/dist/tools/python-audit/checks/pytest-fixtures.js.map +1 -0
  978. package/dist/tools/python-audit/runner.d.ts +5 -0
  979. package/dist/tools/python-audit/runner.d.ts.map +1 -0
  980. package/dist/tools/python-audit/runner.js +18 -0
  981. package/dist/tools/python-audit/runner.js.map +1 -0
  982. package/dist/tools/python-audit/types.d.ts +43 -0
  983. package/dist/tools/python-audit/types.d.ts.map +1 -0
  984. package/dist/tools/python-audit/types.js +2 -0
  985. package/dist/tools/python-audit/types.js.map +1 -0
  986. package/dist/tools/python-audit.d.ts +3 -39
  987. package/dist/tools/python-audit.d.ts.map +1 -1
  988. package/dist/tools/python-audit.js +34 -233
  989. package/dist/tools/python-audit.js.map +1 -1
  990. package/dist/tools/react-compiler-tools.d.ts +37 -0
  991. package/dist/tools/react-compiler-tools.d.ts.map +1 -0
  992. package/dist/tools/react-compiler-tools.js +104 -0
  993. package/dist/tools/react-compiler-tools.js.map +1 -0
  994. package/dist/tools/react-component-tree-tools.d.ts +58 -0
  995. package/dist/tools/react-component-tree-tools.d.ts.map +1 -0
  996. package/dist/tools/react-component-tree-tools.js +292 -0
  997. package/dist/tools/react-component-tree-tools.js.map +1 -0
  998. package/dist/tools/react-context-tools.d.ts +41 -0
  999. package/dist/tools/react-context-tools.d.ts.map +1 -0
  1000. package/dist/tools/react-context-tools.js +76 -0
  1001. package/dist/tools/react-context-tools.js.map +1 -0
  1002. package/dist/tools/react-hooks-tools.d.ts +58 -0
  1003. package/dist/tools/react-hooks-tools.d.ts.map +1 -0
  1004. package/dist/tools/react-hooks-tools.js +144 -0
  1005. package/dist/tools/react-hooks-tools.js.map +1 -0
  1006. package/dist/tools/react-quickstart-tools.d.ts +59 -0
  1007. package/dist/tools/react-quickstart-tools.d.ts.map +1 -0
  1008. package/dist/tools/react-quickstart-tools.js +164 -0
  1009. package/dist/tools/react-quickstart-tools.js.map +1 -0
  1010. package/dist/tools/react-render-tools.d.ts +75 -0
  1011. package/dist/tools/react-render-tools.d.ts.map +1 -0
  1012. package/dist/tools/react-render-tools.js +234 -0
  1013. package/dist/tools/react-render-tools.js.map +1 -0
  1014. package/dist/tools/react-shared-tools.d.ts +5 -0
  1015. package/dist/tools/react-shared-tools.d.ts.map +1 -0
  1016. package/dist/tools/react-shared-tools.js +12 -0
  1017. package/dist/tools/react-shared-tools.js.map +1 -0
  1018. package/dist/tools/react-suspense-tools.d.ts +29 -0
  1019. package/dist/tools/react-suspense-tools.d.ts.map +1 -0
  1020. package/dist/tools/react-suspense-tools.js +269 -0
  1021. package/dist/tools/react-suspense-tools.js.map +1 -0
  1022. package/dist/tools/react-tools.d.ts +19 -340
  1023. package/dist/tools/react-tools.d.ts.map +1 -1
  1024. package/dist/tools/react-tools.js +10 -1263
  1025. package/dist/tools/react-tools.js.map +1 -1
  1026. package/dist/tools/review-diff/check-runner.d.ts +5 -0
  1027. package/dist/tools/review-diff/check-runner.d.ts.map +1 -0
  1028. package/dist/tools/review-diff/check-runner.js +26 -0
  1029. package/dist/tools/review-diff/check-runner.js.map +1 -0
  1030. package/dist/tools/review-diff/checks/astro-hydration.d.ts +8 -0
  1031. package/dist/tools/review-diff/checks/astro-hydration.d.ts.map +1 -0
  1032. package/dist/tools/review-diff/checks/astro-hydration.js +54 -0
  1033. package/dist/tools/review-diff/checks/astro-hydration.js.map +1 -0
  1034. package/dist/tools/review-diff/checks/blast-radius.d.ts +7 -0
  1035. package/dist/tools/review-diff/checks/blast-radius.d.ts.map +1 -0
  1036. package/dist/tools/review-diff/checks/blast-radius.js +39 -0
  1037. package/dist/tools/review-diff/checks/blast-radius.js.map +1 -0
  1038. package/dist/tools/review-diff/checks/breaking.d.ts +13 -0
  1039. package/dist/tools/review-diff/checks/breaking.d.ts.map +1 -0
  1040. package/dist/tools/review-diff/checks/breaking.js +115 -0
  1041. package/dist/tools/review-diff/checks/breaking.js.map +1 -0
  1042. package/dist/tools/review-diff/checks/bug-patterns.d.ts +8 -0
  1043. package/dist/tools/review-diff/checks/bug-patterns.d.ts.map +1 -0
  1044. package/dist/tools/review-diff/checks/bug-patterns.js +130 -0
  1045. package/dist/tools/review-diff/checks/bug-patterns.js.map +1 -0
  1046. package/dist/tools/review-diff/checks/complexity.d.ts +8 -0
  1047. package/dist/tools/review-diff/checks/complexity.d.ts.map +1 -0
  1048. package/dist/tools/review-diff/checks/complexity.js +41 -0
  1049. package/dist/tools/review-diff/checks/complexity.js.map +1 -0
  1050. package/dist/tools/review-diff/checks/coupling.d.ts +7 -0
  1051. package/dist/tools/review-diff/checks/coupling.d.ts.map +1 -0
  1052. package/dist/tools/review-diff/checks/coupling.js +52 -0
  1053. package/dist/tools/review-diff/checks/coupling.js.map +1 -0
  1054. package/dist/tools/review-diff/checks/dead-code.d.ts +7 -0
  1055. package/dist/tools/review-diff/checks/dead-code.d.ts.map +1 -0
  1056. package/dist/tools/review-diff/checks/dead-code.js +39 -0
  1057. package/dist/tools/review-diff/checks/dead-code.js.map +1 -0
  1058. package/dist/tools/review-diff/checks/hotspots.d.ts +8 -0
  1059. package/dist/tools/review-diff/checks/hotspots.d.ts.map +1 -0
  1060. package/dist/tools/review-diff/checks/hotspots.js +39 -0
  1061. package/dist/tools/review-diff/checks/hotspots.js.map +1 -0
  1062. package/dist/tools/review-diff/checks/secrets.d.ts +7 -0
  1063. package/dist/tools/review-diff/checks/secrets.d.ts.map +1 -0
  1064. package/dist/tools/review-diff/checks/secrets.js +38 -0
  1065. package/dist/tools/review-diff/checks/secrets.js.map +1 -0
  1066. package/dist/tools/review-diff/checks/test-gaps.d.ts +16 -0
  1067. package/dist/tools/review-diff/checks/test-gaps.d.ts.map +1 -0
  1068. package/dist/tools/review-diff/checks/test-gaps.js +77 -0
  1069. package/dist/tools/review-diff/checks/test-gaps.js.map +1 -0
  1070. package/dist/tools/review-diff/constants.d.ts +6 -0
  1071. package/dist/tools/review-diff/constants.d.ts.map +1 -0
  1072. package/dist/tools/review-diff/constants.js +16 -0
  1073. package/dist/tools/review-diff/constants.js.map +1 -0
  1074. package/dist/tools/review-diff/file-pattern.d.ts +2 -0
  1075. package/dist/tools/review-diff/file-pattern.d.ts.map +1 -0
  1076. package/dist/tools/review-diff/file-pattern.js +9 -0
  1077. package/dist/tools/review-diff/file-pattern.js.map +1 -0
  1078. package/dist/tools/review-diff/orchestrator.d.ts +3 -0
  1079. package/dist/tools/review-diff/orchestrator.d.ts.map +1 -0
  1080. package/dist/tools/review-diff/orchestrator.js +173 -0
  1081. package/dist/tools/review-diff/orchestrator.js.map +1 -0
  1082. package/dist/tools/review-diff/scoring.d.ts +31 -0
  1083. package/dist/tools/review-diff/scoring.d.ts.map +1 -0
  1084. package/dist/tools/review-diff/scoring.js +82 -0
  1085. package/dist/tools/review-diff/scoring.js.map +1 -0
  1086. package/dist/tools/review-diff/timeout.d.ts +5 -0
  1087. package/dist/tools/review-diff/timeout.d.ts.map +1 -0
  1088. package/dist/tools/review-diff/timeout.js +14 -0
  1089. package/dist/tools/review-diff/timeout.js.map +1 -0
  1090. package/dist/tools/review-diff/types.d.ts +56 -0
  1091. package/dist/tools/review-diff/types.d.ts.map +1 -0
  1092. package/dist/tools/review-diff/types.js +2 -0
  1093. package/dist/tools/review-diff/types.js.map +1 -0
  1094. package/dist/tools/review-diff-tools.d.ts +19 -147
  1095. package/dist/tools/review-diff-tools.d.ts.map +1 -1
  1096. package/dist/tools/review-diff-tools.js +18 -941
  1097. package/dist/tools/review-diff-tools.js.map +1 -1
  1098. package/dist/tools/route-shared.d.ts +6 -0
  1099. package/dist/tools/route-shared.d.ts.map +1 -0
  1100. package/dist/tools/route-shared.js +37 -0
  1101. package/dist/tools/route-shared.js.map +1 -0
  1102. package/dist/tools/route-tools.d.ts +1 -7
  1103. package/dist/tools/route-tools.d.ts.map +1 -1
  1104. package/dist/tools/route-tools.js +2 -22
  1105. package/dist/tools/route-tools.js.map +1 -1
  1106. package/dist/tools/search-tools/constants.d.ts +33 -0
  1107. package/dist/tools/search-tools/constants.d.ts.map +1 -0
  1108. package/dist/tools/search-tools/constants.js +54 -0
  1109. package/dist/tools/search-tools/constants.js.map +1 -0
  1110. package/dist/tools/search-tools/ripgrep.d.ts +13 -0
  1111. package/dist/tools/search-tools/ripgrep.d.ts.map +1 -0
  1112. package/dist/tools/search-tools/ripgrep.js +138 -0
  1113. package/dist/tools/search-tools/ripgrep.js.map +1 -0
  1114. package/dist/tools/search-tools/semantic-search.d.ts +9 -0
  1115. package/dist/tools/search-tools/semantic-search.d.ts.map +1 -0
  1116. package/dist/tools/search-tools/semantic-search.js +19 -0
  1117. package/dist/tools/search-tools/semantic-search.js.map +1 -0
  1118. package/dist/tools/search-tools/symbol-search.d.ts +4 -0
  1119. package/dist/tools/search-tools/symbol-search.d.ts.map +1 -0
  1120. package/dist/tools/search-tools/symbol-search.js +146 -0
  1121. package/dist/tools/search-tools/symbol-search.js.map +1 -0
  1122. package/dist/tools/search-tools/text-search.d.ts +10 -0
  1123. package/dist/tools/search-tools/text-search.d.ts.map +1 -0
  1124. package/dist/tools/search-tools/text-search.js +260 -0
  1125. package/dist/tools/search-tools/text-search.js.map +1 -0
  1126. package/dist/tools/search-tools/types.d.ts +28 -0
  1127. package/dist/tools/search-tools/types.d.ts.map +1 -0
  1128. package/dist/tools/search-tools/types.js +2 -0
  1129. package/dist/tools/search-tools/types.js.map +1 -0
  1130. package/dist/tools/search-tools/zero-hit.d.ts +3 -0
  1131. package/dist/tools/search-tools/zero-hit.d.ts.map +1 -0
  1132. package/dist/tools/search-tools/zero-hit.js +92 -0
  1133. package/dist/tools/search-tools/zero-hit.js.map +1 -0
  1134. package/dist/tools/search-tools.d.ts +5 -64
  1135. package/dist/tools/search-tools.d.ts.map +1 -1
  1136. package/dist/tools/search-tools.js +4 -770
  1137. package/dist/tools/search-tools.js.map +1 -1
  1138. package/dist/tools/secret-detectors.d.ts +12 -0
  1139. package/dist/tools/secret-detectors.d.ts.map +1 -0
  1140. package/dist/tools/secret-detectors.js +86 -0
  1141. package/dist/tools/secret-detectors.js.map +1 -0
  1142. package/dist/tools/secret-file-scanner.d.ts +7 -0
  1143. package/dist/tools/secret-file-scanner.d.ts.map +1 -0
  1144. package/dist/tools/secret-file-scanner.js +52 -0
  1145. package/dist/tools/secret-file-scanner.js.map +1 -0
  1146. package/dist/tools/secret-scan-cache.d.ts +6 -0
  1147. package/dist/tools/secret-scan-cache.d.ts.map +1 -0
  1148. package/dist/tools/secret-scan-cache.js +14 -0
  1149. package/dist/tools/secret-scan-cache.js.map +1 -0
  1150. package/dist/tools/secret-scan-shared.d.ts +5 -0
  1151. package/dist/tools/secret-scan-shared.d.ts.map +1 -0
  1152. package/dist/tools/secret-scan-shared.js +4 -0
  1153. package/dist/tools/secret-scan-shared.js.map +1 -0
  1154. package/dist/tools/secret-scan-types.d.ts +21 -0
  1155. package/dist/tools/secret-scan-types.d.ts.map +1 -0
  1156. package/dist/tools/secret-scan-types.js +2 -0
  1157. package/dist/tools/secret-scan-types.js.map +1 -0
  1158. package/dist/tools/secret-tools.d.ts +3 -75
  1159. package/dist/tools/secret-tools.d.ts.map +1 -1
  1160. package/dist/tools/secret-tools.js +4 -316
  1161. package/dist/tools/secret-tools.js.map +1 -1
  1162. package/dist/tools/sql-audit-tools.d.ts +42 -0
  1163. package/dist/tools/sql-audit-tools.d.ts.map +1 -0
  1164. package/dist/tools/sql-audit-tools.js +130 -0
  1165. package/dist/tools/sql-audit-tools.js.map +1 -0
  1166. package/dist/tools/sql-column-tools.d.ts +28 -0
  1167. package/dist/tools/sql-column-tools.d.ts.map +1 -0
  1168. package/dist/tools/sql-column-tools.js +58 -0
  1169. package/dist/tools/sql-column-tools.js.map +1 -0
  1170. package/dist/tools/sql-complexity-tools.d.ts +22 -0
  1171. package/dist/tools/sql-complexity-tools.d.ts.map +1 -0
  1172. package/dist/tools/sql-complexity-tools.js +60 -0
  1173. package/dist/tools/sql-complexity-tools.js.map +1 -0
  1174. package/dist/tools/sql-dml-safety-tools.d.ts +26 -0
  1175. package/dist/tools/sql-dml-safety-tools.d.ts.map +1 -0
  1176. package/dist/tools/sql-dml-safety-tools.js +104 -0
  1177. package/dist/tools/sql-dml-safety-tools.js.map +1 -0
  1178. package/dist/tools/sql-drift-tools.d.ts +39 -0
  1179. package/dist/tools/sql-drift-tools.d.ts.map +1 -0
  1180. package/dist/tools/sql-drift-tools.js +238 -0
  1181. package/dist/tools/sql-drift-tools.js.map +1 -0
  1182. package/dist/tools/sql-lint-schema-tools.d.ts +28 -0
  1183. package/dist/tools/sql-lint-schema-tools.d.ts.map +1 -0
  1184. package/dist/tools/sql-lint-schema-tools.js +96 -0
  1185. package/dist/tools/sql-lint-schema-tools.js.map +1 -0
  1186. package/dist/tools/sql-migration-diff-tools.d.ts +24 -0
  1187. package/dist/tools/sql-migration-diff-tools.d.ts.map +1 -0
  1188. package/dist/tools/sql-migration-diff-tools.js +120 -0
  1189. package/dist/tools/sql-migration-diff-tools.js.map +1 -0
  1190. package/dist/tools/sql-orphan-table-tools.d.ts +20 -0
  1191. package/dist/tools/sql-orphan-table-tools.d.ts.map +1 -0
  1192. package/dist/tools/sql-orphan-table-tools.js +70 -0
  1193. package/dist/tools/sql-orphan-table-tools.js.map +1 -0
  1194. package/dist/tools/sql-query-tools.d.ts +32 -0
  1195. package/dist/tools/sql-query-tools.d.ts.map +1 -0
  1196. package/dist/tools/sql-query-tools.js +130 -0
  1197. package/dist/tools/sql-query-tools.js.map +1 -0
  1198. package/dist/tools/sql-schema-tools.d.ts +47 -0
  1199. package/dist/tools/sql-schema-tools.d.ts.map +1 -0
  1200. package/dist/tools/sql-schema-tools.js +202 -0
  1201. package/dist/tools/sql-schema-tools.js.map +1 -0
  1202. package/dist/tools/sql-shared-tools.d.ts +6 -0
  1203. package/dist/tools/sql-shared-tools.d.ts.map +1 -0
  1204. package/dist/tools/sql-shared-tools.js +59 -0
  1205. package/dist/tools/sql-shared-tools.js.map +1 -0
  1206. package/dist/tools/sql-tools.d.ts +25 -296
  1207. package/dist/tools/sql-tools.d.ts.map +1 -1
  1208. package/dist/tools/sql-tools.js +15 -1232
  1209. package/dist/tools/sql-tools.js.map +1 -1
  1210. package/dist/tools/status-tools.js +1 -1
  1211. package/dist/tools/status-tools.js.map +1 -1
  1212. package/dist/tools/workspace-tools.d.ts +1 -1
  1213. package/dist/tools/yii3-migration-categories-application.d.ts +4 -0
  1214. package/dist/tools/yii3-migration-categories-application.d.ts.map +1 -0
  1215. package/dist/tools/yii3-migration-categories-application.js +56 -0
  1216. package/dist/tools/yii3-migration-categories-application.js.map +1 -0
  1217. package/dist/tools/yii3-migration-categories-infrastructure.d.ts +4 -0
  1218. package/dist/tools/yii3-migration-categories-infrastructure.d.ts.map +1 -0
  1219. package/dist/tools/yii3-migration-categories-infrastructure.js +67 -0
  1220. package/dist/tools/yii3-migration-categories-infrastructure.js.map +1 -0
  1221. package/dist/tools/yii3-migration-categories-model-view.d.ts +4 -0
  1222. package/dist/tools/yii3-migration-categories-model-view.d.ts.map +1 -0
  1223. package/dist/tools/yii3-migration-categories-model-view.js +59 -0
  1224. package/dist/tools/yii3-migration-categories-model-view.js.map +1 -0
  1225. package/dist/tools/yii3-migration-categories-runtime.d.ts +4 -0
  1226. package/dist/tools/yii3-migration-categories-runtime.d.ts.map +1 -0
  1227. package/dist/tools/yii3-migration-categories-runtime.js +49 -0
  1228. package/dist/tools/yii3-migration-categories-runtime.js.map +1 -0
  1229. package/dist/tools/yii3-migration-categories.d.ts +5 -0
  1230. package/dist/tools/yii3-migration-categories.d.ts.map +1 -0
  1231. package/dist/tools/yii3-migration-categories.js +18 -0
  1232. package/dist/tools/yii3-migration-categories.js.map +1 -0
  1233. package/dist/tools/yii3-migration-report.d.ts +4 -0
  1234. package/dist/tools/yii3-migration-report.d.ts.map +1 -0
  1235. package/dist/tools/yii3-migration-report.js +88 -0
  1236. package/dist/tools/yii3-migration-report.js.map +1 -0
  1237. package/dist/tools/yii3-migration-scanner.d.ts +28 -0
  1238. package/dist/tools/yii3-migration-scanner.d.ts.map +1 -0
  1239. package/dist/tools/yii3-migration-scanner.js +87 -0
  1240. package/dist/tools/yii3-migration-scanner.js.map +1 -0
  1241. package/dist/tools/yii3-migration-tools.d.ts +4 -73
  1242. package/dist/tools/yii3-migration-tools.d.ts.map +1 -1
  1243. package/dist/tools/yii3-migration-tools.js +5 -433
  1244. package/dist/tools/yii3-migration-tools.js.map +1 -1
  1245. package/dist/tools/yii3-migration-types.d.ts +50 -0
  1246. package/dist/tools/yii3-migration-types.d.ts.map +1 -0
  1247. package/dist/tools/yii3-migration-types.js +3 -0
  1248. package/dist/tools/yii3-migration-types.js.map +1 -0
  1249. package/dist/utils/git-validation.d.ts +24 -0
  1250. package/dist/utils/git-validation.d.ts.map +1 -1
  1251. package/dist/utils/git-validation.js +30 -0
  1252. package/dist/utils/git-validation.js.map +1 -1
  1253. package/dist/utils/source-stripper/code-handler.d.ts +3 -0
  1254. package/dist/utils/source-stripper/code-handler.d.ts.map +1 -0
  1255. package/dist/utils/source-stripper/code-handler.js +79 -0
  1256. package/dist/utils/source-stripper/code-handler.js.map +1 -0
  1257. package/dist/utils/source-stripper/comment-handler.d.ts +4 -0
  1258. package/dist/utils/source-stripper/comment-handler.d.ts.map +1 -0
  1259. package/dist/utils/source-stripper/comment-handler.js +24 -0
  1260. package/dist/utils/source-stripper/comment-handler.js.map +1 -0
  1261. package/dist/utils/source-stripper/machine.d.ts +2 -0
  1262. package/dist/utils/source-stripper/machine.d.ts.map +1 -0
  1263. package/dist/utils/source-stripper/machine.js +34 -0
  1264. package/dist/utils/source-stripper/machine.js.map +1 -0
  1265. package/dist/utils/source-stripper/regex-handler.d.ts +3 -0
  1266. package/dist/utils/source-stripper/regex-handler.d.ts.map +1 -0
  1267. package/dist/utils/source-stripper/regex-handler.js +44 -0
  1268. package/dist/utils/source-stripper/regex-handler.js.map +1 -0
  1269. package/dist/utils/source-stripper/state.d.ts +4 -0
  1270. package/dist/utils/source-stripper/state.d.ts.map +1 -0
  1271. package/dist/utils/source-stripper/state.js +20 -0
  1272. package/dist/utils/source-stripper/state.js.map +1 -0
  1273. package/dist/utils/source-stripper/string-handler.d.ts +3 -0
  1274. package/dist/utils/source-stripper/string-handler.d.ts.map +1 -0
  1275. package/dist/utils/source-stripper/string-handler.js +19 -0
  1276. package/dist/utils/source-stripper/string-handler.js.map +1 -0
  1277. package/dist/utils/source-stripper/template-handler.d.ts +4 -0
  1278. package/dist/utils/source-stripper/template-handler.d.ts.map +1 -0
  1279. package/dist/utils/source-stripper/template-handler.js +40 -0
  1280. package/dist/utils/source-stripper/template-handler.js.map +1 -0
  1281. package/dist/utils/source-stripper/types.d.ts +17 -0
  1282. package/dist/utils/source-stripper/types.d.ts.map +1 -0
  1283. package/dist/utils/source-stripper/types.js +4 -0
  1284. package/dist/utils/source-stripper/types.js.map +1 -0
  1285. package/dist/utils/source-stripper.d.ts +0 -21
  1286. package/dist/utils/source-stripper.d.ts.map +1 -1
  1287. package/dist/utils/source-stripper.js +6 -234
  1288. package/dist/utils/source-stripper.js.map +1 -1
  1289. package/dist/utils/walk/errors.d.ts +4 -0
  1290. package/dist/utils/walk/errors.d.ts.map +1 -0
  1291. package/dist/utils/walk/errors.js +18 -0
  1292. package/dist/utils/walk/errors.js.map +1 -0
  1293. package/dist/utils/walk/filters.d.ts +11 -0
  1294. package/dist/utils/walk/filters.d.ts.map +1 -0
  1295. package/dist/utils/walk/filters.js +53 -0
  1296. package/dist/utils/walk/filters.js.map +1 -0
  1297. package/dist/utils/walk/limits.d.ts +10 -0
  1298. package/dist/utils/walk/limits.d.ts.map +1 -0
  1299. package/dist/utils/walk/limits.js +22 -0
  1300. package/dist/utils/walk/limits.js.map +1 -0
  1301. package/dist/utils/walk/traversal.d.ts +9 -0
  1302. package/dist/utils/walk/traversal.d.ts.map +1 -0
  1303. package/dist/utils/walk/traversal.js +38 -0
  1304. package/dist/utils/walk/traversal.js.map +1 -0
  1305. package/dist/utils/walk/types.d.ts +18 -0
  1306. package/dist/utils/walk/types.d.ts.map +1 -0
  1307. package/dist/utils/walk/types.js +2 -0
  1308. package/dist/utils/walk/types.js.map +1 -0
  1309. package/dist/utils/walk.d.ts +4 -65
  1310. package/dist/utils/walk.d.ts.map +1 -1
  1311. package/dist/utils/walk.js +23 -151
  1312. package/dist/utils/walk.js.map +1 -1
  1313. package/package.json +7 -6
  1314. package/rules/codesift.md +1 -1
  1315. package/rules/codesift.mdc +1 -1
  1316. package/rules/codex.md +1 -1
  1317. package/rules/gemini.md +1 -1
  1318. package/dist/tools/hono-conditional-middleware.d.ts +0 -27
  1319. package/dist/tools/hono-conditional-middleware.d.ts.map +0 -1
  1320. package/dist/tools/hono-conditional-middleware.js +0 -62
  1321. package/dist/tools/hono-conditional-middleware.js.map +0 -1
  1322. package/dist/tools/hono-env-regression.d.ts +0 -29
  1323. package/dist/tools/hono-env-regression.d.ts.map +0 -1
  1324. package/dist/tools/hono-env-regression.js +0 -157
  1325. package/dist/tools/hono-env-regression.js.map +0 -1
@@ -5,408 +5,34 @@
5
5
  * framework-specific conventions. Produces a JSON profile conforming to
6
6
  * the zuvo project-profile schema v1.0.
7
7
  */
8
- import { readFile, writeFile, access, readdir, mkdir } from "node:fs/promises";
9
- import { readFileSync } from "node:fs";
10
- import { join, relative } from "node:path";
11
- import { execFile } from "node:child_process";
12
- import { promisify } from "node:util";
13
- const execFileAsync = promisify(execFile);
14
- import { getCodeIndex } from "./index-tools.js";
8
+ import { readFile } from "node:fs/promises";
9
+ import { join } from "node:path";
10
+ import { EXTRACTOR_VERSIONS } from "./index-shared.js";
15
11
  import { extractAstroConventions } from "./astro-config.js";
12
+ import { extractDependencyGraph, extractDependencyHealth, extractGitHealth, extractIdentity, extractKnownGotchas, extractTestConventions, } from "./project-profile-extractors.js";
13
+ import { readJson } from "./project-profile-fs.js";
14
+ import { buildImporterCount, buildImporterCountFromSources } from "./project-profile-imports.js";
15
+ import { writeProfileToDisk } from "./project-profile-persistence.js";
16
+ import { buildSummary } from "./project-profile-summary.js";
17
+ import { detectStack } from "./project-profile-stack.js";
18
+ import { extractHonoConventions, getHonoFallbackCount } from "./project-profile-hono.js";
19
+ import { extractNestConventions, parseMiddlewareChains } from "./project-profile-nest.js";
20
+ import { extractNextConventions } from "./project-profile-next.js";
21
+ import { extractExpressConventions } from "./project-profile-express.js";
22
+ import { extractReactConventions } from "./project-profile-react.js";
23
+ import { extractPythonConventions } from "./project-profile-python.js";
24
+ import { extractPhpConventions, extractYii2Conventions } from "./project-profile-php.js";
16
25
  // ---------------------------------------------------------------------------
17
26
  // Versioning — used by get_extractor_versions
18
27
  // ---------------------------------------------------------------------------
19
- export const EXTRACTOR_VERSIONS = {
20
- stack_detector: "1.0.0",
21
- file_classifier: "1.0.0",
22
- hono: "2.0.0",
23
- nestjs: "1.0.0",
24
- nextjs: "1.0.0",
25
- express: "1.0.0",
26
- react: "2.0.0", // Wave 1-4 + Tier 1-4: component/hook kinds, classifyReactKind, React class heritage — forces cache invalidation
27
- typescript: "3.0.0", // v3: extends/implements heritage, generics in signatures, enum members as constants, is_async flag, modifiers + accessor_kind in meta, namespace + ambient module declarations, anonymous default export synth, RangeError guard, AST-based import-graph branch with type_only flag + tsconfig paths resolution + find_circular_deps type-only filter (was v2.1: field_definition, CommonJS exports, object-literal methods, class_static_block, generator_function_declaration)
28
- javascript: "1.0.0", // independent JS version — bump for JS-only extractor changes (CJS, .jsx-specific) without forcing TS reindex
29
- python: "1.0.0",
30
- php: "2.0.0", // v2: extends/implements/uses_traits/modifiers/attributes on classes; typed properties + readonly + @var fallback on properties; promoted constructor params as synthetic field symbols; backed enum types; method-level modifiers + attributes; Codeception base classes (Unit/Cest/Cept) classify as test_suite — forces full reindex of PHP files
31
- astro: "1.0.0",
32
- kotlin: "1.0.0",
33
- monorepo: "1.0.0", // workspace resolver — bump forces reindex when workspace schema changes
34
- };
35
- // ---------------------------------------------------------------------------
36
- // Stack Detector
37
- // ---------------------------------------------------------------------------
38
- async function fileExists(path) {
39
- try {
40
- await access(path);
41
- return true;
42
- }
43
- catch {
44
- return false;
45
- }
46
- }
47
- async function readJson(path) {
48
- try {
49
- return JSON.parse(await readFile(path, "utf-8"));
50
- }
51
- catch {
52
- return null;
53
- }
54
- }
55
- export async function detectStack(projectRoot) {
56
- const detected_from = [];
57
- const pkg = await readJson(join(projectRoot, "package.json"));
58
- // Framework detection
59
- let framework = null;
60
- let framework_version = null;
61
- if (pkg) {
62
- const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
63
- const frameworkMap = [
64
- ["hono", "hono"],
65
- ["@nestjs/core", "nestjs"],
66
- ["next", "nextjs"],
67
- ["nuxt", "nuxt"],
68
- ["@remix-run/node", "remix"],
69
- ["astro", "astro"],
70
- ["express", "express"],
71
- ["fastify", "fastify"],
72
- ["@angular/core", "angular"],
73
- ["vue", "vue"],
74
- ["svelte", "svelte"],
75
- ];
76
- for (const [dep, name] of frameworkMap) {
77
- if (allDeps?.[dep]) {
78
- framework = name;
79
- framework_version = allDeps[dep]?.replace(/^[\^~>=<]/, "") ?? null;
80
- detected_from.push(`package.json:dependencies.${dep}`);
81
- break;
82
- }
83
- }
84
- // React detection (only if no framework found — React is often a sub-dep)
85
- if (!framework && allDeps?.["react"]) {
86
- framework = "react";
87
- framework_version = allDeps["react"]?.replace(/^[\^~>=<]/, "") ?? null;
88
- detected_from.push("package.json:dependencies.react");
89
- }
90
- }
91
- // Python framework detection (if no JS framework found)
92
- if (!framework) {
93
- const pyproject = await readJson(join(projectRoot, "pyproject.toml")) ?? null;
94
- const requirements = await readFile(join(projectRoot, "requirements.txt"), "utf-8").catch(() => "");
95
- const pipfile = await readFile(join(projectRoot, "Pipfile"), "utf-8").catch(() => "");
96
- const pyDeps = requirements + pipfile + (pyproject ? JSON.stringify(pyproject) : "");
97
- if (pyDeps.includes("fastapi")) {
98
- framework = "fastapi";
99
- detected_from.push("python:fastapi");
100
- }
101
- else if (pyDeps.includes("django")) {
102
- framework = "django";
103
- detected_from.push("python:django");
104
- }
105
- else if (pyDeps.includes("flask")) {
106
- framework = "flask";
107
- detected_from.push("python:flask");
108
- }
109
- }
110
- // PHP framework detection
111
- if (!framework) {
112
- const composer = await readJson(join(projectRoot, "composer.json"));
113
- if (composer) {
114
- const phpDeps = { ...composer.require, ...composer["require-dev"] };
115
- if (phpDeps?.["laravel/framework"]) {
116
- framework = "laravel";
117
- framework_version = phpDeps["laravel/framework"]?.replace(/^[\^~>=<]/, "") ?? null;
118
- detected_from.push("composer.json:require.laravel/framework");
119
- }
120
- else if (phpDeps?.["yiisoft/yii2"]) {
121
- framework = "yii2";
122
- framework_version = phpDeps["yiisoft/yii2"]?.replace(/^[\^~>=<]/, "") ?? null;
123
- detected_from.push("composer.json:require.yiisoft/yii2");
124
- }
125
- else if (phpDeps?.["symfony/framework-bundle"]) {
126
- framework = "symfony";
127
- detected_from.push("composer.json:require.symfony/framework-bundle");
128
- }
129
- }
130
- }
131
- // Language detection
132
- let language = "javascript";
133
- let language_version = null;
134
- // Check for Python first
135
- if (["fastapi", "django", "flask"].includes(framework ?? "")) {
136
- language = "python";
137
- detected_from.push("framework implies python");
138
- }
139
- else if (await fileExists(join(projectRoot, "pyproject.toml")) || await fileExists(join(projectRoot, "requirements.txt"))) {
140
- language = "python";
141
- detected_from.push("pyproject.toml or requirements.txt");
142
- }
143
- // Check for PHP
144
- if (["laravel", "symfony", "yii2"].includes(framework ?? "")) {
145
- language = "php";
146
- detected_from.push("framework implies php");
147
- }
148
- // TypeScript/JavaScript (only if not already Python/PHP)
149
- if (language === "javascript") {
150
- const tsconfig = await readJson(join(projectRoot, "tsconfig.json"));
151
- if (tsconfig) {
152
- language = "typescript";
153
- language_version = tsconfig?.compilerOptions?.target ?? null;
154
- detected_from.push("tsconfig.json");
155
- }
156
- }
157
- // Test runner detection
158
- let test_runner = null;
159
- if (language === "python") {
160
- if (await fileExists(join(projectRoot, "pytest.ini")) || await fileExists(join(projectRoot, "conftest.py"))) {
161
- test_runner = "pytest";
162
- detected_from.push("pytest.ini or conftest.py");
163
- }
164
- }
165
- else if (language === "php") {
166
- if (await fileExists(join(projectRoot, "phpunit.xml")) || await fileExists(join(projectRoot, "phpunit.xml.dist"))) {
167
- test_runner = "phpunit";
168
- detected_from.push("phpunit.xml");
169
- }
170
- }
171
- else if (pkg) {
172
- const devDeps = pkg.devDependencies ?? {};
173
- if (devDeps["vitest"]) {
174
- test_runner = "vitest";
175
- detected_from.push("package.json:devDependencies.vitest");
176
- }
177
- else if (devDeps["jest"]) {
178
- test_runner = "jest";
179
- detected_from.push("package.json:devDependencies.jest");
180
- }
181
- else if (devDeps["mocha"]) {
182
- test_runner = "mocha";
183
- detected_from.push("package.json:devDependencies.mocha");
184
- }
185
- }
186
- // Package manager detection
187
- let package_manager = null;
188
- if (await fileExists(join(projectRoot, "pnpm-lock.yaml"))) {
189
- package_manager = "pnpm";
190
- detected_from.push("pnpm-lock.yaml");
191
- }
192
- else if (await fileExists(join(projectRoot, "yarn.lock"))) {
193
- package_manager = "yarn";
194
- detected_from.push("yarn.lock");
195
- }
196
- else if (await fileExists(join(projectRoot, "package-lock.json"))) {
197
- package_manager = "npm";
198
- detected_from.push("package-lock.json");
199
- }
200
- else if (await fileExists(join(projectRoot, "bun.lockb"))) {
201
- package_manager = "bun";
202
- detected_from.push("bun.lockb");
203
- }
204
- // Monorepo detection — resolveWorkspaces() (Task 4) is the primary path.
205
- // Falls back to the legacy regex YAML parser when resolveWorkspaces returns
206
- // null (covers @manypkg's edge cases such as malformed configs).
207
- let monorepo = null;
208
- // Read raw workspace globs from manifest first — they are the canonical
209
- // shape exposed by `monorepo.workspaces` (string[] of patterns).
210
- let manifestWorkspaces = null;
211
- if (pkg?.workspaces) {
212
- manifestWorkspaces = Array.isArray(pkg.workspaces)
213
- ? pkg.workspaces
214
- : pkg.workspaces.packages ?? [];
215
- detected_from.push("package.json:workspaces");
216
- }
217
- else if (await fileExists(join(projectRoot, "pnpm-workspace.yaml"))) {
218
- try {
219
- const content = await readFile(join(projectRoot, "pnpm-workspace.yaml"), "utf-8");
220
- manifestWorkspaces =
221
- content.match(/- ['"]?([^'"]+)['"]?/g)?.map((m) => m.replace(/- ['"]?/, "").replace(/['"]$/, "")) ?? [];
222
- detected_from.push("pnpm-workspace.yaml");
223
- }
224
- catch {
225
- /* ignore parse errors */
226
- }
227
- }
228
- if (manifestWorkspaces) {
229
- const turboExists = await fileExists(join(projectRoot, "turbo.json"));
230
- const nxExists = await fileExists(join(projectRoot, "nx.json"));
231
- const tool = turboExists
232
- ? "turborepo"
233
- : nxExists
234
- ? "nx"
235
- : pkg?.workspaces
236
- ? "workspaces"
237
- : "pnpm-workspaces";
238
- // Try the rich resolver (Task 4) — graceful degradation if it returns null
239
- let workspace_details;
240
- try {
241
- const { resolveWorkspaces } = await import("../storage/workspace-resolver.js");
242
- const resolved = await resolveWorkspaces(projectRoot);
243
- if (resolved) {
244
- workspace_details = resolved.workspaces;
245
- detected_from.push("workspace-resolver");
246
- }
247
- }
248
- catch {
249
- /* fall back to manifest-only data — graceful */
250
- }
251
- monorepo = {
252
- tool,
253
- workspaces: manifestWorkspaces,
254
- ...(workspace_details ? { workspace_details } : {}),
255
- };
256
- }
257
- // Monorepo workspace scanning — if root has no framework/test_runner, scan workspaces
258
- if (monorepo && (!framework || !test_runner || language === "javascript")) {
259
- const workspacePatterns = monorepo.workspaces;
260
- const workspaceDirs = [];
261
- for (const pattern of workspacePatterns) {
262
- // Expand simple glob patterns like "apps/*" or "packages/*"
263
- const base = pattern.replace(/\/?\*$/, "");
264
- const baseDir = join(projectRoot, base);
265
- try {
266
- const entries = await readdir(baseDir, { withFileTypes: true });
267
- for (const entry of entries) {
268
- if (entry.isDirectory()) {
269
- workspaceDirs.push(join(baseDir, entry.name));
270
- }
271
- }
272
- }
273
- catch { /* directory doesn't exist */ }
274
- }
275
- const frameworkMap = [
276
- ["hono", "hono"],
277
- ["@nestjs/core", "nestjs"],
278
- ["next", "nextjs"],
279
- ["nuxt", "nuxt"],
280
- ["@remix-run/node", "remix"],
281
- ["astro", "astro"],
282
- ["express", "express"],
283
- ["fastify", "fastify"],
284
- ];
285
- for (const wsDir of workspaceDirs) {
286
- const wsPkg = await readJson(join(wsDir, "package.json"));
287
- if (!wsPkg)
288
- continue;
289
- const wsDeps = { ...wsPkg.dependencies, ...wsPkg.devDependencies };
290
- const wsName = relative(projectRoot, wsDir);
291
- // Framework from workspace (prefer backend frameworks: hono, nestjs, express)
292
- if (!framework) {
293
- for (const [dep, name] of frameworkMap) {
294
- if (wsDeps?.[dep]) {
295
- framework = name;
296
- framework_version = wsDeps[dep]?.replace(/^[\^~>=<]/, "") ?? null;
297
- detected_from.push(`${wsName}/package.json:dependencies.${dep}`);
298
- break;
299
- }
300
- }
301
- }
302
- // Test runner from workspace
303
- if (!test_runner) {
304
- if (wsDeps?.["vitest"]) {
305
- test_runner = "vitest";
306
- detected_from.push(`${wsName}/package.json:devDependencies.vitest`);
307
- }
308
- else if (wsDeps?.["jest"]) {
309
- test_runner = "jest";
310
- detected_from.push(`${wsName}/package.json:devDependencies.jest`);
311
- }
312
- }
313
- // TypeScript from workspace
314
- if (language === "javascript") {
315
- const wsTsconfig = await readJson(join(wsDir, "tsconfig.json"));
316
- if (wsTsconfig) {
317
- language = "typescript";
318
- language_version = wsTsconfig?.compilerOptions?.target ?? null;
319
- detected_from.push(`${wsName}/tsconfig.json`);
320
- }
321
- }
322
- }
323
- }
324
- // Also check root tsconfig.base.json for monorepos that use base config
325
- if (language === "javascript") {
326
- const baseTsconfig = await readJson(join(projectRoot, "tsconfig.base.json"));
327
- if (baseTsconfig) {
328
- language = "typescript";
329
- language_version = baseTsconfig?.compilerOptions?.target ?? null;
330
- detected_from.push("tsconfig.base.json");
331
- }
332
- }
333
- // Build tool detection (Vite, CRA, webpack, Parcel, esbuild, Rspack, Turbopack)
334
- // Order matters: check more specific/modern tools first.
335
- let build_tool = null;
336
- if (pkg) {
337
- const devDeps = pkg.devDependencies ?? {};
338
- const deps = pkg.dependencies ?? {};
339
- const allDeps = { ...deps, ...devDeps };
340
- if (allDeps["vite"]) {
341
- build_tool = "vite";
342
- detected_from.push("package.json:vite");
343
- }
344
- else if (allDeps["react-scripts"]) {
345
- build_tool = "cra";
346
- detected_from.push("package.json:react-scripts");
347
- }
348
- else if (allDeps["@rsbuild/core"]) {
349
- build_tool = "rsbuild";
350
- detected_from.push("package.json:@rsbuild/core");
351
- }
352
- else if (allDeps["@rspack/cli"] || allDeps["@rspack/core"]) {
353
- build_tool = "rspack";
354
- detected_from.push("package.json:@rspack/*");
355
- }
356
- else if (allDeps["parcel"] || allDeps["parcel-bundler"]) {
357
- build_tool = "parcel";
358
- detected_from.push("package.json:parcel");
359
- }
360
- else if (allDeps["webpack"] || allDeps["webpack-cli"]) {
361
- build_tool = "webpack";
362
- detected_from.push("package.json:webpack");
363
- }
364
- else if (allDeps["esbuild"]) {
365
- build_tool = "esbuild";
366
- detected_from.push("package.json:esbuild");
367
- }
368
- else if (allDeps["turbopack"]) {
369
- build_tool = "turbopack";
370
- detected_from.push("package.json:turbopack");
371
- }
372
- }
373
- // Fallback: look for config files if no dep match
374
- if (!build_tool) {
375
- const configChecks = [
376
- ["vite.config.ts", "vite"],
377
- ["vite.config.js", "vite"],
378
- ["vite.config.mjs", "vite"],
379
- ["webpack.config.js", "webpack"],
380
- ["webpack.config.ts", "webpack"],
381
- ["rspack.config.js", "rspack"],
382
- ["rsbuild.config.ts", "rsbuild"],
383
- [".parcelrc", "parcel"],
384
- ];
385
- for (const [file, tool] of configChecks) {
386
- if (await fileExists(join(projectRoot, file))) {
387
- build_tool = tool;
388
- detected_from.push(file);
389
- break;
390
- }
391
- }
392
- }
393
- return {
394
- framework,
395
- framework_version,
396
- language,
397
- language_version,
398
- test_runner,
399
- package_manager,
400
- build_tool,
401
- monorepo,
402
- detected_from,
403
- };
404
- }
28
+ export { EXTRACTOR_VERSIONS } from "./index-shared.js";
29
+ export { buildConventionsSummary } from "./project-profile-summary.js";
30
+ export { detectStack, extractHonoConventions, getHonoFallbackCount, extractNestConventions, parseMiddlewareChains, extractNextConventions, extractExpressConventions, extractReactConventions, extractPythonConventions, extractPhpConventions, extractYii2Conventions, };
405
31
  // ---------------------------------------------------------------------------
406
32
  // File Classifier
407
33
  // ---------------------------------------------------------------------------
408
34
  const CRITICAL_PATH_PATTERNS = [
409
- /\/(app|main|server)\.(ts|js|tsx|jsx)$/,
35
+ /(^|\/)(app|main|server)\.(ts|js|tsx|jsx)$/,
410
36
  /\/middleware\//,
411
37
  /\/security\//,
412
38
  /\/auth\//,
@@ -414,7 +40,7 @@ const CRITICAL_PATH_PATTERNS = [
414
40
  ];
415
41
  /** index.ts is critical ONLY at shallow depth (src/index.ts, apps/api/src/index.ts) — not barrel re-exports */
416
42
  function isEntryPointIndex(path) {
417
- if (!/\/index\.(ts|js|tsx|jsx)$/.test(path))
43
+ if (!/(^|\/)index\.(ts|js|tsx|jsx)$/.test(path))
418
44
  return false;
419
45
  // Count path depth — barrel files are deep (components/Foo/index.ts = 3+ segments after src)
420
46
  const parts = path.split("/");
@@ -445,7 +71,7 @@ function isTestFile(path) {
445
71
  return /\.(test|spec)\.(ts|js|tsx|jsx)$/.test(path);
446
72
  }
447
73
  function classifyCodeType(path, _symbol_count) {
448
- if (/\/(app|main|server)\.(ts|js)$/.test(path))
74
+ if (/(^|\/)(app|main|server)\.(ts|js)$/.test(path))
449
75
  return "ORCHESTRATOR";
450
76
  if (/\/middleware\//.test(path))
451
77
  return "GUARD";
@@ -467,19 +93,11 @@ function classifyCodeType(path, _symbol_count) {
467
93
  return "CONSTANT";
468
94
  return "PURE";
469
95
  }
470
- export function classifyFiles(index) {
96
+ export function classifyFiles(index, importerCount = buildImporterCountFromSources(index)) {
471
97
  const critical = [];
472
98
  const important = [];
473
99
  const routineCounts = {};
474
100
  let routineCount = 0;
475
- // Build importer count map
476
- const importerCount = new Map();
477
- for (const sym of index.symbols) {
478
- // Count how many unique files import each file
479
- if (sym.source?.includes("import ") || sym.source?.includes("require(")) {
480
- // Simplified — in production this would use the actual import graph
481
- }
482
- }
483
101
  // Build test file set for has_tests detection
484
102
  const testFiles = new Set(index.files
485
103
  .filter((f) => isTestFile(f.path))
@@ -543,1119 +161,21 @@ export function classifyFiles(index) {
543
161
  routine: { count: routineCount, by_type: routineCounts },
544
162
  };
545
163
  }
546
- // ---------------------------------------------------------------------------
547
- // Hono Extractor
548
- // ---------------------------------------------------------------------------
549
- let _honoFallbackCount = 0;
550
- export function getHonoFallbackCount() { return _honoFallbackCount; }
551
- /**
552
- * Extract Hono conventions from an orchestrator file.
553
- *
554
- * Uses the tree-sitter AST extractor (HonoExtractor) and adapts the result
555
- * to the legacy Conventions shape. Falls back to the regex-based legacy
556
- * implementation on failure (with counter tracking for observability).
557
- *
558
- * Kill switch: set CODESIFT_LEGACY_HONO=1 to force legacy extractor.
559
- */
560
- export async function extractHonoConventions(source, filePath) {
561
- if (process.env.CODESIFT_LEGACY_HONO === "1") {
562
- const { legacyExtractHonoConventions } = await import("./legacy-hono-conventions.js");
563
- return legacyExtractHonoConventions(source, filePath);
564
- }
565
- // If called with a source string and a file path that doesn't exist on disk,
566
- // this is the legacy string-fixture API — use legacy extractor directly.
567
- // The AST extractor needs a real file to parse.
568
- const { existsSync } = await import("node:fs");
569
- const { isAbsolute, resolve: pathResolve } = await import("node:path");
570
- const resolved = isAbsolute(filePath) ? filePath : pathResolve(filePath);
571
- if (!existsSync(resolved)) {
572
- const { legacyExtractHonoConventions } = await import("./legacy-hono-conventions.js");
573
- return legacyExtractHonoConventions(source, filePath);
574
- }
575
- try {
576
- return await honoConventionsAdapter(resolved);
577
- }
578
- catch (err) {
579
- _honoFallbackCount++;
580
- const msg = err instanceof Error ? err.message : String(err);
581
- console.warn(`[codesift] Hono AST extractor failed (fallback #${_honoFallbackCount}): ${msg}`);
582
- if (process.env.NODE_ENV !== "production" && process.env.CODESIFT_SILENT_FALLBACK !== "1") {
583
- throw err;
584
- }
585
- const { legacyExtractHonoConventions } = await import("./legacy-hono-conventions.js");
586
- return legacyExtractHonoConventions(source, filePath);
587
- }
588
- }
589
- /**
590
- * Adapter: run HonoExtractor.parse() and map HonoAppModel → Conventions.
591
- */
592
- async function honoConventionsAdapter(filePath) {
593
- const { HonoExtractor } = await import("../parser/extractors/hono.js");
594
- const extractor = new HonoExtractor();
595
- const model = await extractor.parse(filePath);
596
- // Map middleware_chains
597
- const middleware_chains = model.middleware_chains.map((mc) => ({
598
- scope: mc.scope === "*" ? "global" : mc.scope.replace(/\/\*$/, "").split("/").filter(Boolean)[1] ?? mc.scope,
599
- file: mc.entries[0]?.file ?? filePath,
600
- chain: mc.entries.map((e) => ({
601
- name: e.name,
602
- line: e.line,
603
- order: e.order,
604
- })),
605
- }));
606
- // Map route_mounts
607
- const route_mounts = model.mounts
608
- .filter((m) => m.mount_type === "hono_route")
609
- .map((m) => ({
610
- file: filePath,
611
- line: 0, // line not tracked in new model at mount level
612
- mount_path: m.mount_path,
613
- imported_from: m.child_file || null,
614
- exported_as: m.child_var,
615
- }));
616
- // Map auth_patterns from middleware names
617
- const authGroups = {};
618
- let auth_middleware = null;
619
- for (const mc of model.middleware_chains) {
620
- const scope = mc.scope === "*" ? "global" : mc.scope.replace(/\/\*$/, "").split("/").filter(Boolean)[1] ?? mc.scope;
621
- for (const entry of mc.entries) {
622
- if (/auth|clerk|jwt|session|passport/i.test(entry.name)) {
623
- auth_middleware = entry.name;
624
- if (!authGroups[scope])
625
- authGroups[scope] = { requires_auth: false, middleware: [] };
626
- authGroups[scope].requires_auth = true;
627
- if (!authGroups[scope].middleware.includes(entry.name)) {
628
- authGroups[scope].middleware.push(entry.name);
629
- }
630
- }
631
- }
632
- }
633
- // Ensure all route groups represented
634
- for (const mount of model.mounts) {
635
- const group = mount.mount_path.split("/").filter(Boolean)[1] ?? "root";
636
- if (!authGroups[group])
637
- authGroups[group] = { requires_auth: false, middleware: [] };
638
- }
639
- return {
640
- middleware_chains,
641
- rate_limits: [], // rate limits extracted from AST in future; empty for now
642
- route_mounts,
643
- auth_patterns: { auth_middleware, groups: authGroups },
644
- };
645
- }
646
- // ---------------------------------------------------------------------------
647
- // NestJS Extractor
648
- // ---------------------------------------------------------------------------
649
- /** Count net `[` vs `]` on a line — positive means more open brackets. */
650
- function countBracketBalance(text) {
651
- let depth = 0;
652
- for (const ch of text) {
653
- if (ch === "[")
654
- depth++;
655
- else if (ch === "]")
656
- depth--;
657
- }
658
- return depth;
659
- }
660
- export function extractNestConventions(source, filePath) {
661
- const lines = source.split("\n");
662
- // Build import map
663
- const importMap = new Map();
664
- for (const line of lines) {
665
- const defaultImport = line.match(/import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/);
666
- if (defaultImport) {
667
- const names = defaultImport[1].split(",").map((n) => n.trim().split(/\s+as\s+/).pop().trim());
668
- for (const name of names) {
669
- importMap.set(name, defaultImport[2]);
670
- }
671
- }
672
- }
673
- const modules = [];
674
- const global_guards = [];
675
- const global_filters = [];
676
- const global_pipes = [];
677
- const global_interceptors = [];
678
- const controllers = [];
679
- let throttler = null;
680
- let inImports = false;
681
- let importsBracketDepth = 0;
682
- let inProviders = false;
683
- let providersBracketDepth = 0;
684
- let inControllers = false;
685
- let controllersBracketDepth = 0;
686
- for (let i = 0; i < lines.length; i++) {
687
- const line = lines[i];
688
- const lineNum = i + 1;
689
- // Track @Module sections via bracket depth — handles both multi-line arrays
690
- // (imports: [\n A,\n B,\n]) and single-line arrays (imports: [A, B]).
691
- // Critical: mark inImports BEFORE scanning the current line so the scan
692
- // block runs on single-line `imports: [...]` arrays.
693
- let closeInImportsAfterLine = false;
694
- if (/imports:\s*\[/.test(line)) {
695
- inImports = true;
696
- importsBracketDepth += countBracketBalance(line.slice(line.indexOf("[")));
697
- if (importsBracketDepth <= 0) {
698
- closeInImportsAfterLine = true;
699
- importsBracketDepth = 0;
700
- }
701
- }
702
- else if (inImports) {
703
- importsBracketDepth += countBracketBalance(line);
704
- if (importsBracketDepth <= 0) {
705
- closeInImportsAfterLine = true;
706
- importsBracketDepth = 0;
707
- }
708
- }
709
- // R-1 fix: use bracket-depth tracking for providers/controllers too
710
- // (same approach as imports) so single-line arrays close correctly.
711
- let closeProvidersAfterLine = false;
712
- if (/providers:\s*\[/.test(line)) {
713
- inProviders = true;
714
- providersBracketDepth += countBracketBalance(line.slice(line.indexOf("[", line.indexOf("providers"))));
715
- if (providersBracketDepth <= 0) {
716
- closeProvidersAfterLine = true;
717
- providersBracketDepth = 0;
718
- }
719
- }
720
- else if (inProviders) {
721
- providersBracketDepth += countBracketBalance(line);
722
- if (providersBracketDepth <= 0) {
723
- closeProvidersAfterLine = true;
724
- providersBracketDepth = 0;
725
- }
726
- }
727
- let closeControllersAfterLine = false;
728
- if (/controllers:\s*\[/.test(line)) {
729
- inControllers = true;
730
- controllersBracketDepth += countBracketBalance(line.slice(line.indexOf("[", line.indexOf("controllers"))));
731
- if (controllersBracketDepth <= 0) {
732
- closeControllersAfterLine = true;
733
- controllersBracketDepth = 0;
734
- }
735
- }
736
- else if (inControllers) {
737
- controllersBracketDepth += countBracketBalance(line);
738
- if (controllersBracketDepth <= 0) {
739
- closeControllersAfterLine = true;
740
- controllersBracketDepth = 0;
741
- }
742
- }
743
- // Extract module imports — scan for all module names on the line (not just
744
- // the first indented one). Handles single-line `imports: [A, B.forFeature([...]), C]`
745
- // where multiple modules share one line.
746
- if (inImports) {
747
- const moduleRe = /(\w+Module)(?:\.for(Root|Feature)(?:Async)?\s*\()?/g;
748
- let moduleMatch;
749
- const matchedThisLine = new Set();
750
- while ((moduleMatch = moduleRe.exec(line)) !== null) {
751
- // Avoid duplicates within the same line
752
- const key = `${moduleMatch[1]}:${moduleMatch.index}`;
753
- if (matchedThisLine.has(key))
754
- continue;
755
- matchedThisLine.add(key);
756
- const name = moduleMatch[1];
757
- const dynamicKind = moduleMatch[2]; // "Root" | "Feature" | undefined
758
- const isGlobal = /isGlobal:\s*true/.test(line) || /ConfigModule|SentryModule/.test(name);
759
- const entry = {
760
- name,
761
- file: filePath,
762
- line: lineNum,
763
- imported_from: importMap.get(name) ?? null,
764
- is_global: isGlobal,
765
- };
766
- // G2: forFeature([...]) — extract entity class names (scan ahead up to 15 lines)
767
- if (dynamicKind === "Feature") {
768
- const entities = [];
769
- let bracketDepth = 0;
770
- let started = false;
771
- for (let j = i; j < Math.min(i + 15, lines.length); j++) {
772
- for (const ch of lines[j]) {
773
- if (ch === "[") {
774
- bracketDepth++;
775
- started = true;
776
- }
777
- else if (ch === "]") {
778
- bracketDepth--;
779
- if (started && bracketDepth === 0)
780
- break;
781
- }
782
- }
783
- // Capture entity names after the opening [
784
- const featureMatch = lines[j].match(/forFeature\s*\(\s*\[([^\]]*)\]?/);
785
- if (featureMatch) {
786
- const inner = featureMatch[1];
787
- for (const m of inner.matchAll(/\b([A-Z]\w*)\b/g))
788
- entities.push(m[1]);
789
- // Continue to next lines if the array spans multiple
790
- for (let k = j + 1; k < Math.min(j + 10, lines.length) && !/\]/.test(lines[k - 1]); k++) {
791
- for (const m of lines[k].matchAll(/\b([A-Z]\w*)\b/g))
792
- entities.push(m[1]);
793
- }
794
- break;
795
- }
796
- // Multi-line case: forFeature([ on one line, entities on next
797
- if (/forFeature\s*\(\s*\[\s*$/.test(lines[j])) {
798
- for (let k = j + 1; k < Math.min(j + 10, lines.length); k++) {
799
- if (/^\s*\]/.test(lines[k]))
800
- break;
801
- for (const m of lines[k].matchAll(/\b([A-Z]\w*)\b/g))
802
- entities.push(m[1]);
803
- }
804
- break;
805
- }
806
- }
807
- if (entities.length > 0)
808
- entry.entities = entities;
809
- }
810
- // G2: forRoot({...}) — extract top-level config keys
811
- if (dynamicKind === "Root") {
812
- const keys = [];
813
- let braceDepth = 0;
814
- for (let j = i; j < Math.min(i + 15, lines.length); j++) {
815
- for (const ch of lines[j]) {
816
- if (ch === "{")
817
- braceDepth++;
818
- else if (ch === "}")
819
- braceDepth--;
820
- }
821
- // Only capture keys at the top-level of the forRoot config object
822
- if (braceDepth >= 1) {
823
- // Match indented key: value pattern at top-level (heuristic: 1-level indent)
824
- const keyMatch = lines[j].match(/^\s{6,10}(\w+):\s*/);
825
- if (keyMatch && !keys.includes(keyMatch[1]))
826
- keys.push(keyMatch[1]);
827
- }
828
- if (braceDepth === 0 && j > i)
829
- break;
830
- }
831
- if (keys.length > 0)
832
- entry.dynamic_config_keys = keys;
833
- }
834
- modules.push(entry);
835
- }
836
- // Extract ThrottlerModule config
837
- if (/ThrottlerModule/.test(line)) {
838
- // Scan ahead for ttl and limit
839
- for (let j = i; j < Math.min(i + 15, lines.length); j++) {
840
- const ttlMatch = lines[j].match(/ttl:\s*(\d+)/);
841
- const limitMatch = lines[j].match(/limit:\s*(?:.*?:\s*)?(\d+)/);
842
- if (ttlMatch && !throttler) {
843
- throttler = { ttl: parseInt(ttlMatch[1]), limit: 60 };
844
- }
845
- if (limitMatch && throttler) {
846
- // Take the production value (non-development)
847
- const allLimits = lines[j].match(/(\d+)/g);
848
- if (allLimits && allLimits.length > 0) {
849
- throttler.limit = parseInt(allLimits[allLimits.length - 1]);
850
- }
851
- }
852
- }
853
- }
854
- }
855
- // Extract controllers
856
- if (inControllers) {
857
- const ctrlMatch = line.match(/(\w+Controller)\b/);
858
- if (ctrlMatch)
859
- controllers.push(ctrlMatch[1]);
860
- }
861
- // Extract global providers (APP_GUARD, APP_FILTER, APP_PIPE)
862
- if (inProviders) {
863
- if (/provide:\s*APP_GUARD/.test(line)) {
864
- // Scan for useClass on next lines
865
- for (let j = i; j < Math.min(i + 5, lines.length); j++) {
866
- const useClassMatch = lines[j].match(/useClass:\s*(\w+)/);
867
- if (useClassMatch) {
868
- global_guards.push({
869
- name: useClassMatch[1],
870
- token: "APP_GUARD",
871
- file: filePath,
872
- line: j + 1,
873
- imported_from: importMap.get(useClassMatch[1]) ?? null,
874
- });
875
- break;
876
- }
877
- }
878
- }
879
- if (/provide:\s*APP_FILTER/.test(line)) {
880
- for (let j = i; j < Math.min(i + 5, lines.length); j++) {
881
- const useClassMatch = lines[j].match(/useClass:\s*(\w+)/);
882
- if (useClassMatch) {
883
- global_filters.push({
884
- name: useClassMatch[1],
885
- token: "APP_FILTER",
886
- file: filePath,
887
- line: j + 1,
888
- imported_from: importMap.get(useClassMatch[1]) ?? null,
889
- });
890
- break;
891
- }
892
- }
893
- }
894
- if (/provide:\s*APP_PIPE/.test(line)) {
895
- for (let j = i; j < Math.min(i + 5, lines.length); j++) {
896
- const useClassMatch = lines[j].match(/useClass:\s*(\w+)/);
897
- if (useClassMatch) {
898
- global_pipes.push({
899
- name: useClassMatch[1],
900
- token: "APP_PIPE",
901
- file: filePath,
902
- line: j + 1,
903
- imported_from: importMap.get(useClassMatch[1]) ?? null,
904
- });
905
- break;
906
- }
907
- }
908
- }
909
- if (/provide:\s*APP_INTERCEPTOR/.test(line)) {
910
- for (let j = i; j < Math.min(i + 5, lines.length); j++) {
911
- const useClassMatch = lines[j].match(/useClass:\s*(\w+)/);
912
- if (useClassMatch) {
913
- global_interceptors.push({
914
- name: useClassMatch[1],
915
- token: "APP_INTERCEPTOR",
916
- file: filePath,
917
- line: j + 1,
918
- imported_from: importMap.get(useClassMatch[1]) ?? null,
919
- });
920
- break;
921
- }
922
- }
923
- }
924
- }
925
- // Close inImports at end of line iteration if brackets balanced
926
- if (closeInImportsAfterLine)
927
- inImports = false;
928
- if (closeProvidersAfterLine)
929
- inProviders = false;
930
- if (closeControllersAfterLine)
931
- inControllers = false;
932
- }
933
- // G1: parse middleware.configure(consumer) chains
934
- const middleware_chains = parseMiddlewareChains(source, filePath);
935
- return { modules, global_guards, global_filters, global_pipes, global_interceptors, controllers, throttler, middleware_chains };
936
- }
937
- /**
938
- * G1: Parse `configure(consumer: MiddlewareConsumer) { ... }` blocks.
939
- * Extracts consumer.apply(Middleware).forRoutes(...) chains.
940
- */
941
- export function parseMiddlewareChains(source, filePath) {
942
- const results = [];
943
- // Find configure( method — can be `configure(consumer` or `configure(consumer: MiddlewareConsumer)`
944
- const configureStart = source.search(/\bconfigure\s*\(\s*\w+\s*(?::\s*\w+)?\s*\)\s*\{/);
945
- if (configureStart === -1)
946
- return results;
947
- // Extract body of configure method via brace counting
948
- const bodyStart = source.indexOf("{", configureStart);
949
- if (bodyStart === -1)
950
- return results;
951
- let depth = 1;
952
- let i = bodyStart + 1;
953
- while (i < source.length && depth > 0) {
954
- if (source[i] === "{")
955
- depth++;
956
- else if (source[i] === "}")
957
- depth--;
958
- i++;
959
- }
960
- const body = source.slice(bodyStart + 1, i - 1);
961
- // Match: consumer.apply(Middleware).forRoutes(<args>) — may chain multiple middlewares
962
- // Use a tolerant pattern that captures the apply(...) arg and forRoutes(...) arg separately.
963
- const applyRe = /\.apply\s*\(\s*([\w,\s]+)\s*\)\s*\.forRoutes\s*\(([\s\S]*?)\)\s*[;}]/g;
964
- let m;
965
- while ((m = applyRe.exec(body)) !== null) {
966
- const middlewareNames = m[1].split(",").map((s) => s.trim()).filter(Boolean);
967
- const routesArg = m[2];
968
- const routes = [];
969
- // Parse routesArg — supports:
970
- // '*'
971
- // 'users/*'
972
- // { path: 'users', method: RequestMethod.GET }
973
- // ControllerClass
974
- const stringPathRe = /['"`]([^'"`]+)['"`]/g;
975
- let sm;
976
- while ((sm = stringPathRe.exec(routesArg)) !== null) {
977
- // Check if this string is part of a { path: '...', method: ... } object literal
978
- const before = routesArg.slice(Math.max(0, sm.index - 30), sm.index);
979
- if (/path:\s*$/.test(before)) {
980
- // Object form — capture path AND method
981
- const objRe = /path:\s*['"`]([^'"`]+)['"`]\s*,\s*method:\s*(?:RequestMethod\.)?(\w+)/;
982
- const afterContext = routesArg.slice(Math.max(0, sm.index - 20), sm.index + 200);
983
- const objMatch = objRe.exec(afterContext);
984
- if (objMatch) {
985
- routes.push({ path: objMatch[1], method: objMatch[2] });
986
- continue;
987
- }
988
- }
989
- routes.push({ path: sm[1] });
990
- }
991
- // Also capture bare ControllerClass (PascalCase identifier) if present
992
- for (const name of middlewareNames) {
993
- // R-3 fix: guard indexOf returning -1 (would produce wrong line via slice(0,-1))
994
- const namePos = source.indexOf(name, configureStart);
995
- const line = namePos >= 0 ? source.slice(0, namePos).split("\n").length : 0;
996
- results.push({ middleware: name, routes, file: filePath, line });
997
- }
998
- }
999
- return results;
1000
- }
1001
- export function extractNextConventions(_projectRoot, files) {
1002
- const pages = [];
1003
- const api_routes = [];
1004
- const inngest_functions = [];
1005
- const webhooks = [];
1006
- let services_count = 0;
1007
- let client_component_count = 0;
1008
- let server_action_count = 0;
1009
- let middleware = null;
1010
- const hasAppDir = files.some((f) => f.path.includes("app/"));
1011
- const hasSrcDir = files.some((f) => f.path.startsWith("src/"));
1012
- const hasI18n = files.some((f) => f.path.includes("[locale]") || f.path.includes("i18n"));
1013
- for (const file of files) {
1014
- const p = file.path;
1015
- // Middleware
1016
- if (/^(src\/)?middleware\.(ts|js)$/.test(p)) {
1017
- middleware = { file: p, matchers: [] };
1018
- }
1019
- // App Router pages (paths from index have no leading /)
1020
- if (/app\/.*\/page\.(tsx|jsx|ts|js)$/.test(p)) {
1021
- pages.push({ path: p, type: "page" });
1022
- }
1023
- if (/app\/.*\/layout\.(tsx|jsx|ts|js)$/.test(p)) {
1024
- pages.push({ path: p, type: "layout" });
1025
- }
1026
- if (/app\/.*\/loading\.(tsx|jsx|ts|js)$/.test(p)) {
1027
- pages.push({ path: p, type: "loading" });
1028
- }
1029
- if (/app\/.*\/error\.(tsx|jsx|ts|js)$/.test(p)) {
1030
- pages.push({ path: p, type: "error" });
1031
- }
1032
- if (/app\/.*\/not-found\.(tsx|jsx|ts|js)$/.test(p)) {
1033
- pages.push({ path: p, type: "not-found" });
1034
- }
1035
- if (/app\/.*\/global-error\.(tsx|jsx|ts|js)$/.test(p)) {
1036
- pages.push({ path: p, type: "global-error" });
1037
- }
1038
- if (/app\/.*\/default\.(tsx|jsx|ts|js)$/.test(p)) {
1039
- pages.push({ path: p, type: "default" });
1040
- }
1041
- if (/app\/.*\/template\.(tsx|jsx|ts|js)$/.test(p)) {
1042
- pages.push({ path: p, type: "template" });
1043
- }
1044
- // API routes (App Router — route.ts files under app/api/)
1045
- if (/app\/api\/.*route\.(ts|js)$/.test(p)) {
1046
- api_routes.push({ path: p, methods: [], file: p });
1047
- }
1048
- // Pages Router API routes
1049
- if (/pages\/api\//.test(p)) {
1050
- api_routes.push({ path: p, methods: [], file: p });
1051
- }
1052
- // Inngest functions
1053
- if (/inngest\/.*\.(ts|js)$/.test(p) && !/\.test\./.test(p) && !/\.spec\./.test(p) && !/index\./.test(p)) {
1054
- inngest_functions.push(p);
1055
- }
1056
- // Services
1057
- if (/services?\/[^/]+\.(ts|js)$/.test(p) && !/\.test\./.test(p) && !/\.spec\./.test(p) && !/\.d\.ts$/.test(p) && !/index\./.test(p)) {
1058
- services_count++;
1059
- }
1060
- // Webhooks
1061
- if (/webhook/.test(p) && /route\.(ts|js)$/.test(p)) {
1062
- webhooks.push(p);
1063
- }
1064
- // Directive scanning — check first line for "use client" / "use server"
1065
- if (/\.(tsx|ts|jsx|js)$/.test(p) && /app\//.test(p)) {
1066
- try {
1067
- const head = readFileSync(join(_projectRoot, p), { encoding: "utf8", flag: "r" }).slice(0, 80);
1068
- if (/['"]use client['"]/.test(head))
1069
- client_component_count++;
1070
- if (/['"]use server['"]/.test(head))
1071
- server_action_count++;
1072
- }
1073
- catch {
1074
- // file may have been deleted since indexing
1075
- }
1076
- }
1077
- }
1078
- return {
1079
- pages,
1080
- middleware,
1081
- api_routes,
1082
- services_count,
1083
- client_component_count,
1084
- server_action_count,
1085
- inngest_functions,
1086
- webhooks,
1087
- config: { app_router: hasAppDir, src_dir: hasSrcDir, i18n: hasI18n },
1088
- };
1089
- }
1090
- export function extractExpressConventions(source, filePath) {
1091
- const lines = source.split("\n");
1092
- const middleware = [];
1093
- const routers = [];
1094
- const error_handlers = [];
1095
- // Import map
1096
- const importMap = new Map();
1097
- for (const line of lines) {
1098
- const req = line.match(/(?:const|let|var)\s+(\w+)\s*=\s*require\s*\(\s*['"]([^'"]+)['"]\s*\)/);
1099
- if (req)
1100
- importMap.set(req[1], req[2]);
1101
- const imp = line.match(/import\s+(?:\{([^}]+)\}|(\w+))\s+from\s+['"]([^'"]+)['"]/);
1102
- if (imp) {
1103
- const names = imp[1] ? imp[1].split(",").map((n) => n.trim()) : [imp[2]];
1104
- for (const n of names)
1105
- importMap.set(n, imp[3]);
1106
- }
1107
- }
1108
- for (let i = 0; i < lines.length; i++) {
1109
- const line = lines[i];
1110
- const lineNum = i + 1;
1111
- // app.use(middleware)
1112
- const useMatch = line.match(/app\.use\s*\(\s*(\w+)\s*\)/);
1113
- if (useMatch) {
1114
- middleware.push({ name: useMatch[1], file: filePath, line: lineNum });
1115
- continue;
1116
- }
1117
- // app.use("/path", router)
1118
- const routeMatch = line.match(/app\.use\s*\(\s*['"]([^'"]+)['"]\s*,\s*(\w+)\s*\)/);
1119
- if (routeMatch) {
1120
- routers.push({
1121
- mount_path: routeMatch[1],
1122
- file: filePath,
1123
- line: lineNum,
1124
- imported_from: importMap.get(routeMatch[2]) ?? null,
1125
- });
1126
- continue;
1127
- }
1128
- // Error handler: (err, req, res, next) => ...
1129
- if (/app\.use\s*\(\s*(?:function\s*)?\(\s*err\s*,/.test(line) || /app\.use\s*\(\s*\(\s*err\s*:/.test(line)) {
1130
- error_handlers.push({ file: filePath, line: lineNum });
1131
- }
1132
- }
1133
- return { middleware, routers, error_handlers };
1134
- }
1135
- export function extractReactConventions(files, deps, symbols) {
1136
- // State management
1137
- let state_management = null;
1138
- if (deps["@reduxjs/toolkit"] || deps["redux"])
1139
- state_management = "redux";
1140
- else if (deps["zustand"])
1141
- state_management = "zustand";
1142
- else if (deps["jotai"])
1143
- state_management = "jotai";
1144
- else if (deps["recoil"])
1145
- state_management = "recoil";
1146
- else if (deps["mobx"])
1147
- state_management = "mobx";
1148
- // Routing
1149
- let routing = null;
1150
- if (deps["react-router-dom"] || deps["react-router"])
1151
- routing = "react-router";
1152
- else if (deps["@tanstack/react-router"])
1153
- routing = "tanstack-router";
1154
- else if (deps["wouter"])
1155
- routing = "wouter";
1156
- // UI library
1157
- // shadcn/ui detection: canonical path pattern is components/ui/*.tsx — checked
1158
- // FIRST so it takes precedence over generic radix dep (shadcn re-exports radix).
1159
- const hasShadcnFiles = files.some((f) => /(^|\/)components\/ui\/[a-z-]+\.(tsx|jsx)$/.test(f.path));
1160
- let ui_library = null;
1161
- if (hasShadcnFiles)
1162
- ui_library = "shadcn";
1163
- else if (deps["@mui/material"])
1164
- ui_library = "mui";
1165
- else if (deps["@chakra-ui/react"])
1166
- ui_library = "chakra";
1167
- else if (deps["antd"])
1168
- ui_library = "antd";
1169
- else if (deps["@radix-ui/react-dialog"] || deps["@radix-ui/themes"])
1170
- ui_library = "radix";
1171
- else if (deps["tailwindcss"])
1172
- ui_library = "tailwind";
1173
- // Form library detection (Item 7)
1174
- let form_library = null;
1175
- if (deps["react-hook-form"])
1176
- form_library = "react-hook-form";
1177
- else if (deps["formik"])
1178
- form_library = "formik";
1179
- else if (deps["final-form"] || deps["react-final-form"])
1180
- form_library = "final-form";
1181
- // File-path-based component counts (legacy, coarse)
1182
- let pages = 0, components = 0, hooks = 0;
1183
- for (const f of files) {
1184
- if (/\/pages?\//.test(f.path) && /\.(tsx|jsx)$/.test(f.path))
1185
- pages++;
1186
- else if (/\/components?\//.test(f.path) && /\.(tsx|jsx)$/.test(f.path))
1187
- components++;
1188
- if (/\/hooks?\//.test(f.path) || /\.hook\.(ts|js)$/.test(f.path))
1189
- hooks++;
1190
- }
1191
- // Symbol-based semantic counts (requires Wave 1 extractor)
1192
- let actual_component_count = 0;
1193
- let actual_hook_count = 0;
1194
- const hookUsageMap = new Map();
1195
- const component_patterns = { memo: 0, forwardRef: 0, lazy: 0 };
1196
- if (symbols) {
1197
- // Set of stdlib hooks to exclude from "hook usage" tracking — we want
1198
- // to highlight which library/custom hooks components consume.
1199
- for (const sym of symbols) {
1200
- if (sym.kind === "component") {
1201
- actual_component_count++;
1202
- if (sym.source) {
1203
- // Detect wrapper patterns in component source
1204
- // Generic-aware patterns: memo<Props>(...), forwardRef<T, P>(...), lazy<T>(...) — Item 9
1205
- if (/\b(?:React\.)?memo\s*(?:<[^>]+>)?\s*\(/.test(sym.source))
1206
- component_patterns.memo++;
1207
- if (/\b(?:React\.)?forwardRef\s*(?:<[^>]+>)?\s*\(/.test(sym.source))
1208
- component_patterns.forwardRef++;
1209
- if (/\b(?:React\.)?lazy\s*(?:<[^>]+>)?\s*\(/.test(sym.source))
1210
- component_patterns.lazy++;
1211
- // Count hook calls inside this component
1212
- const hookCalls = sym.source.matchAll(/\b(use[A-Z]\w*)\s*\(/g);
1213
- for (const m of hookCalls) {
1214
- const hookName = m[1];
1215
- hookUsageMap.set(hookName, (hookUsageMap.get(hookName) ?? 0) + 1);
1216
- }
1217
- }
1218
- }
1219
- else if (sym.kind === "hook") {
1220
- actual_hook_count++;
1221
- }
1222
- }
1223
- }
1224
- const hook_usage = [...hookUsageMap.entries()]
1225
- .sort((a, b) => b[1] - a[1])
1226
- .slice(0, 10)
1227
- .map(([name, count]) => ({ name, count }));
1228
- return {
1229
- state_management,
1230
- routing,
1231
- ui_library,
1232
- form_library,
1233
- component_count: { pages, components, hooks },
1234
- actual_component_count,
1235
- actual_hook_count,
1236
- hook_usage,
1237
- component_patterns,
1238
- };
1239
- }
1240
- export function extractPythonConventions(files) {
1241
- const routers = [];
1242
- const middlewareSet = new Set();
1243
- let models_dir = null;
1244
- let framework_type = null;
1245
- for (const f of files) {
1246
- // FastAPI routers
1247
- if (/router\.py$|routes?\.py$/.test(f.path)) {
1248
- routers.push({ path: f.path, file: f.path });
1249
- if (!framework_type)
1250
- framework_type = "fastapi";
1251
- }
1252
- // Django views/urls
1253
- if (/views\.py$|urls\.py$/.test(f.path)) {
1254
- routers.push({ path: f.path, file: f.path });
1255
- if (!framework_type)
1256
- framework_type = "django";
1257
- }
1258
- // Flask blueprints
1259
- if (/blueprint/.test(f.path)) {
1260
- routers.push({ path: f.path, file: f.path });
1261
- if (!framework_type)
1262
- framework_type = "flask";
1263
- }
1264
- // Middleware
1265
- if (/middleware/.test(f.path) && f.path.endsWith(".py")) {
1266
- middlewareSet.add(f.path);
1267
- }
1268
- // Models
1269
- if (/models?\.py$/.test(f.path) && !models_dir) {
1270
- const dir = f.path.split("/").slice(0, -1).join("/");
1271
- models_dir = dir || null;
1272
- }
1273
- }
1274
- // Test framework detection
1275
- let test_framework = null;
1276
- if (files.some((f) => /conftest\.py$/.test(f.path) || /test_.*\.py$/.test(f.path))) {
1277
- test_framework = "pytest";
1278
- }
1279
- else if (files.some((f) => /tests?\.py$/.test(f.path))) {
1280
- test_framework = "unittest";
1281
- }
1282
- return {
1283
- framework_type,
1284
- routers,
1285
- middleware: [...middlewareSet],
1286
- models_dir,
1287
- test_framework,
1288
- };
1289
- }
1290
- export function extractPhpConventions(files) {
1291
- const controllers = [];
1292
- const middleware = [];
1293
- const models = [];
1294
- const routes_files = [];
1295
- let migrations_count = 0;
1296
- for (const f of files) {
1297
- const name = f.path.split("/").pop()?.replace(/\.php$/, "") ?? "";
1298
- if (/Controller\.php$/.test(f.path)) {
1299
- controllers.push({ name, path: f.path });
1300
- }
1301
- if (/(^|\/)[Mm]iddleware\//.test(f.path) && f.path.endsWith(".php")) {
1302
- middleware.push({ name, path: f.path });
1303
- }
1304
- if (/(^|\/)[Mm]odels?\//.test(f.path) && f.path.endsWith(".php")) {
1305
- models.push({ name, path: f.path });
1306
- }
1307
- if (/(^|\/)routes\//.test(f.path) && f.path.endsWith(".php")) {
1308
- routes_files.push(f.path);
1309
- }
1310
- if (/(^|\/)migrations?\//.test(f.path)) {
1311
- migrations_count++;
1312
- }
1313
- }
1314
- return { controllers, middleware, models, routes_files, migrations_count };
1315
- }
1316
- export function extractYii2Conventions(files) {
1317
- const base = extractPhpConventions(files);
1318
- const modules = [];
1319
- const widgets = [];
1320
- const behaviors = [];
1321
- const components = [];
1322
- const assets = [];
1323
- const config_files = [];
1324
- for (const f of files) {
1325
- const name = f.path.split("/").pop()?.replace(/\.php$/, "") ?? "";
1326
- // Modules: Module.php in modules/*/ directories
1327
- if (/(^|\/)modules\/[^/]+\/Module\.php$/.test(f.path)) {
1328
- modules.push({ name, path: f.path });
1329
- }
1330
- // Widgets: files in widgets/ directories or named *Widget.php
1331
- if ((/(^|\/)widgets\//.test(f.path) || /Widget\.php$/.test(f.path)) && f.path.endsWith(".php")) {
1332
- widgets.push({ name, path: f.path });
1333
- }
1334
- // Behaviors: files in behaviors/ directories or named *Behavior.php
1335
- if ((/(^|\/)behaviors\//.test(f.path) || /Behavior\.php$/.test(f.path)) && f.path.endsWith(".php")) {
1336
- behaviors.push({ name, path: f.path });
1337
- }
1338
- // Components: files in components/ directory
1339
- if (/(^|\/)components\//.test(f.path) && f.path.endsWith(".php")) {
1340
- components.push({ name, path: f.path });
1341
- }
1342
- // Assets: files named *Asset.php in assets/ directory
1343
- if (/(^|\/)assets\//.test(f.path) && /Asset\.php$/.test(f.path)) {
1344
- assets.push({ name, path: f.path });
1345
- }
1346
- // Config files
1347
- if (/config\/(web|console|db|params|main|test)\.php$/.test(f.path)) {
1348
- config_files.push(f.path);
1349
- }
1350
- }
1351
- return {
1352
- ...base,
1353
- framework_type: "yii2",
1354
- modules,
1355
- widgets,
1356
- behaviors,
1357
- components,
1358
- assets,
1359
- config_files,
1360
- };
1361
- }
1362
- // ---------------------------------------------------------------------------
1363
- // Identity Extractor
1364
- // ---------------------------------------------------------------------------
1365
- async function extractIdentity(projectRoot) {
1366
- const pkg = await readJson(join(projectRoot, "package.json"));
1367
- const projectName = pkg?.name ?? projectRoot.split("/").pop() ?? "unknown";
1368
- // Detect monorepo
1369
- const isMonorepo = !!(pkg?.workspaces || await fileExists(join(projectRoot, "pnpm-workspace.yaml")));
1370
- // Git remote
1371
- let gitRemote = null;
1372
- try {
1373
- const { stdout } = await execFileAsync("git", ["config", "--get", "remote.origin.url"], {
1374
- cwd: projectRoot, timeout: 3000,
1375
- });
1376
- gitRemote = stdout.toString().trim().replace(/\.git$/, "").replace(/^git@github\.com:/, "github.com/") || null;
1377
- }
1378
- catch { /* not a git repo or no remote */ }
1379
- return {
1380
- project_name: projectName,
1381
- project_type: isMonorepo ? "monorepo" : "single",
1382
- workspace_root: projectRoot,
1383
- git_remote: gitRemote,
1384
- };
1385
- }
1386
- // ---------------------------------------------------------------------------
1387
- // Dependency Graph Extractor
1388
- // ---------------------------------------------------------------------------
1389
- function extractDependencyGraph(index) {
1390
- // Entry points: files matching app/main/server/index at shallow depth
1391
- const entry_points = [];
1392
- const importCount = new Map();
1393
- // Count imports per file from symbols
1394
- for (const sym of index.symbols) {
1395
- if (sym.source) {
1396
- const importMatches = sym.source.match(/from\s+['"]([^'"]+)['"]/g);
1397
- if (importMatches) {
1398
- for (const m of importMatches) {
1399
- const path = m.replace(/from\s+['"]/, "").replace(/['"]$/, "");
1400
- // Resolve relative imports to file paths
1401
- if (path.startsWith(".")) {
1402
- const resolved = join(sym.file.replace(/\/[^/]+$/, ""), path).replace(/\.(js|ts|tsx|jsx)$/, "");
1403
- importCount.set(resolved, (importCount.get(resolved) ?? 0) + 1);
1404
- }
1405
- }
1406
- }
1407
- }
1408
- }
1409
- // Find entry points
1410
- for (const f of index.files) {
1411
- if (/\/(app|main|server)\.(ts|js|tsx)$/.test(f.path))
1412
- entry_points.push(f.path);
1413
- if (/^(src\/)?index\.(ts|js)$/.test(f.path))
1414
- entry_points.push(f.path);
1415
- }
1416
- // Hub modules: files imported by many others
1417
- const hub_modules = [...importCount.entries()]
1418
- .filter(([, count]) => count >= 5)
1419
- .sort((a, b) => b[1] - a[1])
1420
- .slice(0, 20)
1421
- .map(([path, count]) => ({ path, imported_by_count: count }));
1422
- // Leaf modules: files that import others but are not imported themselves
1423
- const importedFiles = new Set(importCount.keys());
1424
- const leaf_modules = index.files
1425
- .filter((f) => !importedFiles.has(f.path.replace(/\.(ts|js|tsx|jsx)$/, "")) && !/(test|spec)\.(ts|js)$/.test(f.path))
1426
- .slice(0, 30)
1427
- .map((f) => f.path);
1428
- // Orphan files: files with no imports AND not imported
1429
- const orphan_files = index.files
1430
- .filter((f) => {
1431
- const base = f.path.replace(/\.(ts|js|tsx|jsx)$/, "");
1432
- return !importedFiles.has(base) && f.symbol_count === 0 && !/(test|spec)\.(ts|js)$/.test(f.path);
1433
- })
1434
- .slice(0, 20)
1435
- .map((f) => f.path);
1436
- return { entry_points, hub_modules, leaf_modules, orphan_files };
1437
- }
1438
- // ---------------------------------------------------------------------------
1439
- // Test Conventions Extractor
1440
- // ---------------------------------------------------------------------------
1441
- async function extractTestConventions(projectRoot, index) {
1442
- const testFiles = index.files.filter((f) => /(test|spec)\.(ts|js|tsx|jsx)$/.test(f.path));
1443
- const file_patterns = [...new Set(testFiles.map((f) => {
1444
- if (f.path.includes(".test."))
1445
- return "*.test.*";
1446
- if (f.path.includes(".spec."))
1447
- return "*.spec.*";
1448
- return "*.test.*";
1449
- }))];
1450
- // Find setup files
1451
- const setup_files = [];
1452
- for (const f of index.files) {
1453
- if (/setup\.(ts|js)$/.test(f.path) && !/(node_modules|dist|\.next)/.test(f.path)) {
1454
- setup_files.push(f.path);
1455
- }
1456
- if (/vitest\.setup\.(ts|js)$/.test(f.path))
1457
- setup_files.push(f.path);
1458
- if (/jest\.setup\.(ts|js)$/.test(f.path))
1459
- setup_files.push(f.path);
1460
- }
1461
- // Detect mock style and common patterns by reading a few test files
1462
- let mock_style = null;
1463
- const mock_patterns = [];
1464
- const common_mocks_set = new Set();
1465
- // Read up to 5 test files to detect patterns
1466
- const sampleTests = testFiles
1467
- .filter((f) => f.path.includes("service") || f.path.includes("controller") || f.path.includes("guard"))
1468
- .slice(0, 5);
1469
- for (const tf of sampleTests) {
1470
- try {
1471
- const content = await readFile(join(projectRoot, tf.path), "utf-8");
1472
- // Mock style
1473
- if (!mock_style) {
1474
- if (content.includes("vi.mock"))
1475
- mock_style = "vi.mock";
1476
- else if (content.includes("jest.mock"))
1477
- mock_style = "jest.mock";
1478
- else if (content.includes("sinon"))
1479
- mock_style = "sinon";
1480
- }
1481
- // Common mock patterns — extract vi.mock/jest.mock calls
1482
- const mockCalls = content.match(/(?:vi|jest)\.mock\s*\(\s*['"]([^'"]+)['"]/g);
1483
- if (mockCalls) {
1484
- for (const mc of mockCalls) {
1485
- const path = mc.match(/['"]([^'"]+)['"]/)?.[1];
1486
- if (path)
1487
- common_mocks_set.add(path);
1488
- }
1489
- }
1490
- // Detect specific patterns
1491
- if (content.includes("mockPrismaClient") || content.includes("prismaMock")) {
1492
- if (!mock_patterns.some((p) => p.name === "prisma")) {
1493
- mock_patterns.push({ name: "prisma", import_from: "setup or inline", usage: "mockPrismaClient / prismaMock" });
1494
- }
1495
- }
1496
- if (content.includes("mockDeep") || content.includes("DeepMockProxy")) {
1497
- if (!mock_patterns.some((p) => p.name === "deep-mock")) {
1498
- mock_patterns.push({ name: "deep-mock", import_from: "vitest-mock-extended or jest-mock-extended", usage: "mockDeep<Type>()" });
1499
- }
1500
- }
1501
- if (content.includes("$transaction") && content.includes("mock")) {
1502
- if (!mock_patterns.some((p) => p.name === "transaction")) {
1503
- mock_patterns.push({ name: "transaction", import_from: "prisma mock", usage: "$transaction mock for DB operations" });
1504
- }
1505
- }
1506
- }
1507
- catch { /* skip unreadable files */ }
1508
- }
1509
- // Also check setup files for shared patterns
1510
- for (const sf of setup_files) {
1511
- try {
1512
- const content = await readFile(join(projectRoot, sf), "utf-8");
1513
- const exports = content.match(/export\s+(?:const|function|class)\s+(\w+)/g);
1514
- if (exports) {
1515
- for (const exp of exports) {
1516
- const name = exp.match(/(\w+)$/)?.[1];
1517
- if (name && /mock|stub|fake|fixture|factory/i.test(name)) {
1518
- mock_patterns.push({ name, import_from: sf, usage: "shared test helper" });
1519
- }
1520
- }
1521
- }
1522
- }
1523
- catch { /* skip */ }
1524
- }
1525
- // Determine assertion library from stack
1526
- const pkg = await readJson(join(projectRoot, "package.json"));
1527
- const devDeps = pkg?.devDependencies ?? {};
1528
- let assertion_library = "expect"; // default
1529
- if (devDeps["vitest"])
1530
- assertion_library = "vitest/expect";
1531
- else if (devDeps["jest"])
1532
- assertion_library = "jest/expect";
1533
- else if (devDeps["chai"])
1534
- assertion_library = "chai";
1535
- return {
1536
- mock_style,
1537
- setup_files,
1538
- mock_patterns: mock_patterns.slice(0, 10),
1539
- assertion_library,
1540
- file_patterns,
1541
- common_mocks: [...common_mocks_set].slice(0, 20),
1542
- };
1543
- }
1544
- // ---------------------------------------------------------------------------
1545
- // Known Gotchas Extractor
1546
- // ---------------------------------------------------------------------------
1547
- function extractKnownGotchas(index) {
1548
- const gotchas = [];
1549
- // Check for common gotcha patterns in symbols
1550
- for (const sym of index.symbols) {
1551
- if (!sym.source)
1552
- continue;
1553
- // as any casts in production code (not tests)
1554
- if (/(test|spec)\.(ts|js)$/.test(sym.file))
1555
- continue;
1556
- // Detect patterns that are known gotchas
1557
- if (/process\.env\.\w+/.test(sym.source) && !/config|env\.schema|validate/.test(sym.file)) {
1558
- if (!gotchas.some((g) => g.gotcha.includes("scattered process.env"))) {
1559
- gotchas.push({
1560
- gotcha: "scattered process.env access outside config module",
1561
- evidence: [sym.file],
1562
- severity: "medium",
1563
- });
1564
- }
1565
- }
1566
- }
1567
- // Check for common project-level gotchas
1568
- const hasEslintIgnore = index.files.some((f) => f.path.includes(".eslintignore"));
1569
- if (hasEslintIgnore) {
1570
- gotchas.push({
1571
- gotcha: ".eslintignore present — some files bypass linting",
1572
- evidence: [".eslintignore"],
1573
- severity: "low",
1574
- });
1575
- }
1576
- return { auto_detected: gotchas.slice(0, 10) };
1577
- }
1578
- // ---------------------------------------------------------------------------
1579
- // Dependency Health
1580
- // ---------------------------------------------------------------------------
1581
- async function extractDependencyHealth(projectRoot) {
1582
- const pkg = await readJson(join(projectRoot, "package.json"));
1583
- if (!pkg) {
1584
- // Try Python
1585
- const pyproject = await readJson(join(projectRoot, "pyproject.toml"));
1586
- if (!pyproject)
1587
- return null;
1588
- return { total: 0, prod: 0, dev: 0, key_versions: {} };
1589
- }
1590
- const prod = Object.keys(pkg.dependencies ?? {});
1591
- const dev = Object.keys(pkg.devDependencies ?? {});
1592
- const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
1593
- // Extract key versions — frameworks, runtimes, major tools
1594
- const keyPackages = [
1595
- "react", "next", "hono", "@nestjs/core", "express", "vue", "angular",
1596
- "typescript", "vitest", "jest", "prisma", "@prisma/client",
1597
- "tailwindcss", "@anthropic-ai/sdk", "openai",
1598
- "stripe", "inngest", "@clerk/nextjs", "@clerk/backend",
1599
- "@sentry/nextjs", "@sentry/nestjs", "drizzle-orm",
1600
- ];
1601
- const key_versions = {};
1602
- for (const k of keyPackages) {
1603
- if (allDeps[k])
1604
- key_versions[k] = allDeps[k];
1605
- }
1606
- return {
1607
- total: prod.length + dev.length,
1608
- prod: prod.length,
1609
- dev: dev.length,
1610
- key_versions,
1611
- };
1612
- }
1613
- // ---------------------------------------------------------------------------
1614
- // Git Health
1615
- // ---------------------------------------------------------------------------
1616
- async function extractGitHealth(projectRoot) {
1617
- try {
1618
- const totalRes = await execFileAsync("git", ["rev-list", "--count", "HEAD"], {
1619
- cwd: projectRoot, timeout: 5000,
1620
- });
1621
- const totalStr = totalRes.stdout.toString().trim();
1622
- const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString();
1623
- const recentRes = await execFileAsync("git", ["rev-list", "--count", `--since=${thirtyDaysAgo}`, "HEAD"], {
1624
- cwd: projectRoot, timeout: 5000,
1625
- });
1626
- const recentStr = recentRes.stdout.toString().trim();
1627
- const lastRes = await execFileAsync("git", ["log", "-1", "--format=%aI"], {
1628
- cwd: projectRoot, timeout: 5000,
1629
- });
1630
- const lastCommitDate = lastRes.stdout.toString().trim();
1631
- const contribRes = await execFileAsync("git", ["shortlog", "-sn", "--no-merges", "HEAD"], {
1632
- cwd: projectRoot, timeout: 10000,
1633
- maxBuffer: 5 * 1024 * 1024, // 5MB — many contributors on long-lived repos
1634
- });
1635
- const contributorsStr = contribRes.stdout.toString().trim();
1636
- const contributors = contributorsStr.split("\n").filter(Boolean).length;
1637
- return {
1638
- total_commits: parseInt(totalStr) || 0,
1639
- recent_commits_30d: parseInt(recentStr) || 0,
1640
- last_commit_date: lastCommitDate || null,
1641
- contributors,
1642
- };
1643
- }
1644
- catch {
1645
- return null;
1646
- }
1647
- }
1648
164
  const analyzeProjectCache = new Map();
1649
165
  /** Test-only — clear the analyzeProject cache. */
1650
166
  export function resetAnalyzeProjectCacheForTesting() {
1651
167
  analyzeProjectCache.clear();
1652
168
  }
169
+ async function getProjectCodeIndex(repoName) {
170
+ const { getCodeIndex } = await import("./index-tools.js");
171
+ return getCodeIndex(repoName);
172
+ }
1653
173
  export async function analyzeProject(repoName, options = {}) {
1654
174
  const startTime = Date.now();
1655
175
  let files_analyzed = 0;
1656
176
  let files_skipped = 0;
1657
177
  const skip_reasons = {};
1658
- const index = await getCodeIndex(repoName);
178
+ const index = await getProjectCodeIndex(repoName);
1659
179
  if (!index) {
1660
180
  const failedProfile = {
1661
181
  version: "1.0",
@@ -1698,9 +218,10 @@ export async function analyzeProject(repoName, options = {}) {
1698
218
  // Step 1: Stack detection
1699
219
  const stack = await detectStack(projectRoot);
1700
220
  // Step 2: File classification
1701
- const file_classifications = classifyFiles(index);
221
+ const importerCount = await buildImporterCount(index);
222
+ const file_classifications = classifyFiles(index, importerCount);
1702
223
  // Step 2b: Dependency graph
1703
- const dependency_graph = extractDependencyGraph(index);
224
+ const dependency_graph = extractDependencyGraph(index, importerCount);
1704
225
  // Step 2c: Test conventions
1705
226
  const test_conventions = await extractTestConventions(projectRoot, index);
1706
227
  // Step 2d: Known gotchas
@@ -1781,6 +302,8 @@ export async function analyzeProject(repoName, options = {}) {
1781
302
  status = "partial";
1782
303
  skip_reasons[`${fw ?? "unknown"}_extractor_error`] = 1;
1783
304
  }
305
+ const dependencyHealth = await extractDependencyHealth(projectRoot);
306
+ const gitHealth = await extractGitHealth(projectRoot);
1784
307
  const profile = {
1785
308
  version: "1.0",
1786
309
  generated_at: new Date().toISOString(),
@@ -1805,8 +328,8 @@ export async function analyzeProject(repoName, options = {}) {
1805
328
  ...(pythonConventions ? { python_conventions: pythonConventions } : {}),
1806
329
  ...(phpConventions ? { php_conventions: phpConventions } : {}),
1807
330
  ...(astroConventions ? { astro_conventions: astroConventions } : {}),
1808
- dependency_health: await extractDependencyHealth(projectRoot) ?? undefined,
1809
- git_health: (await extractGitHealth(projectRoot)) ?? undefined,
331
+ ...(dependencyHealth ? { dependency_health: dependencyHealth } : {}),
332
+ ...(gitHealth ? { git_health: gitHealth } : {}),
1810
333
  generation_metadata: {
1811
334
  files_analyzed,
1812
335
  files_skipped,
@@ -1821,115 +344,6 @@ export async function analyzeProject(repoName, options = {}) {
1821
344
  return summary;
1822
345
  }
1823
346
  // ---------------------------------------------------------------------------
1824
- // Disk persistence — write profile to .zuvo/project-profile.json
1825
- // ---------------------------------------------------------------------------
1826
- async function writeProfileToDisk(projectRoot, profile) {
1827
- const zuvoDir = join(projectRoot, ".zuvo");
1828
- await mkdir(zuvoDir, { recursive: true });
1829
- const profilePath = join(zuvoDir, "project-profile.json");
1830
- await writeFile(profilePath, JSON.stringify(profile, null, 2), "utf-8");
1831
- return profilePath;
1832
- }
1833
- export function buildConventionsSummary(profile) {
1834
- const p = profile;
1835
- if (p.conventions)
1836
- return {
1837
- middleware_chains: p.conventions.middleware_chains.length,
1838
- rate_limits: p.conventions.rate_limits.length,
1839
- route_mounts: p.conventions.route_mounts.length,
1840
- auth_groups: Object.keys(p.conventions.auth_patterns.groups).length,
1841
- };
1842
- if (p.nest_conventions)
1843
- return {
1844
- type: "nestjs",
1845
- modules: p.nest_conventions.modules.length,
1846
- global_guards: p.nest_conventions.global_guards.length,
1847
- global_filters: p.nest_conventions.global_filters.length,
1848
- global_interceptors: p.nest_conventions.global_interceptors.length,
1849
- controllers: p.nest_conventions.controllers.length,
1850
- has_throttler: !!p.nest_conventions.throttler,
1851
- };
1852
- if (p.next_conventions)
1853
- return {
1854
- type: "nextjs",
1855
- pages: p.next_conventions.pages.length,
1856
- api_routes: p.next_conventions.api_routes.length,
1857
- services: p.next_conventions.services_count,
1858
- inngest_functions: p.next_conventions.inngest_functions.length,
1859
- webhooks: p.next_conventions.webhooks.length,
1860
- has_middleware: !!p.next_conventions.middleware,
1861
- app_router: p.next_conventions.config.app_router,
1862
- i18n: p.next_conventions.config.i18n,
1863
- };
1864
- if (p.express_conventions)
1865
- return {
1866
- type: "express",
1867
- middleware: p.express_conventions.middleware.length,
1868
- routers: p.express_conventions.routers.length,
1869
- error_handlers: p.express_conventions.error_handlers.length,
1870
- };
1871
- if (p.react_conventions)
1872
- return {
1873
- type: "react",
1874
- ...p.react_conventions.component_count,
1875
- state_management: p.react_conventions.state_management,
1876
- ui_library: p.react_conventions.ui_library,
1877
- };
1878
- if (p.python_conventions)
1879
- return {
1880
- type: "python",
1881
- routers: p.python_conventions.routers.length,
1882
- middleware: p.python_conventions.middleware.length,
1883
- framework_type: p.python_conventions.framework_type,
1884
- };
1885
- if (p.php_conventions)
1886
- return {
1887
- type: "php",
1888
- controllers: p.php_conventions.controllers.length,
1889
- middleware: p.php_conventions.middleware.length,
1890
- models: p.php_conventions.models.length,
1891
- migrations: p.php_conventions.migrations_count,
1892
- };
1893
- if (p.astro_conventions)
1894
- return {
1895
- type: "astro",
1896
- output_mode: p.astro_conventions.output_mode,
1897
- adapter: p.astro_conventions.adapter,
1898
- integrations: p.astro_conventions.integrations.length,
1899
- has_i18n: !!p.astro_conventions.i18n,
1900
- config_resolution: p.astro_conventions.config_resolution,
1901
- };
1902
- return null;
1903
- }
1904
- function buildSummary(profile, profilePath) {
1905
- return {
1906
- status: profile.status,
1907
- profile_path: profilePath,
1908
- stack: {
1909
- framework: profile.stack?.framework ?? null,
1910
- language: profile.stack?.language ?? "unknown",
1911
- test_runner: profile.stack?.test_runner ?? null,
1912
- package_manager: profile.stack?.package_manager ?? null,
1913
- monorepo: !!profile.stack?.monorepo,
1914
- },
1915
- file_counts: {
1916
- critical: profile.file_classifications?.critical.length ?? 0,
1917
- important: profile.file_classifications?.important.count ?? 0,
1918
- routine: profile.file_classifications?.routine.count ?? 0,
1919
- total_analyzed: profile.generation_metadata.files_analyzed,
1920
- },
1921
- conventions_summary: buildConventionsSummary(profile),
1922
- dependency_health: profile.dependency_health ? {
1923
- total: profile.dependency_health.total,
1924
- prod: profile.dependency_health.prod,
1925
- dev: profile.dependency_health.dev,
1926
- key_count: Object.keys(profile.dependency_health.key_versions).length,
1927
- } : null,
1928
- git_health: profile.git_health ?? null,
1929
- duration_ms: profile.generation_metadata.duration_ms,
1930
- };
1931
- }
1932
- // ---------------------------------------------------------------------------
1933
347
  // get_extractor_versions — fast metadata call
1934
348
  // ---------------------------------------------------------------------------
1935
349
  /**