codereview-aia 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/dist/analysis/FindingsExtractor.d.ts +105 -0
  2. package/dist/analysis/FindingsExtractor.js +363 -0
  3. package/dist/analysis/FindingsExtractor.js.map +1 -0
  4. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.d.ts +111 -0
  5. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.js +215 -0
  6. package/dist/analysis/ai-detection/analyzers/BaseAnalyzer.js.map +1 -0
  7. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.d.ts +142 -0
  8. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.js +503 -0
  9. package/dist/analysis/ai-detection/analyzers/DocumentationAnalyzer.js.map +1 -0
  10. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.d.ts +88 -0
  11. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.js +343 -0
  12. package/dist/analysis/ai-detection/analyzers/GitHistoryAnalyzer.js.map +1 -0
  13. package/dist/analysis/ai-detection/core/AIDetectionEngine.d.ts +104 -0
  14. package/dist/analysis/ai-detection/core/AIDetectionEngine.js +369 -0
  15. package/dist/analysis/ai-detection/core/AIDetectionEngine.js.map +1 -0
  16. package/dist/analysis/ai-detection/types/DetectionTypes.d.ts +364 -0
  17. package/dist/analysis/ai-detection/types/DetectionTypes.js +32 -0
  18. package/dist/analysis/ai-detection/types/DetectionTypes.js.map +1 -0
  19. package/dist/analysis/ai-detection/utils/SubmissionConverter.d.ts +97 -0
  20. package/dist/analysis/ai-detection/utils/SubmissionConverter.js +339 -0
  21. package/dist/analysis/ai-detection/utils/SubmissionConverter.js.map +1 -0
  22. package/dist/analysis/context/ReviewContext.d.ts +184 -0
  23. package/dist/analysis/context/ReviewContext.js +294 -0
  24. package/dist/analysis/context/ReviewContext.js.map +1 -0
  25. package/{src/analysis/context/index.ts → dist/analysis/context/index.d.ts} +0 -1
  26. package/dist/analysis/context/index.js +23 -0
  27. package/dist/analysis/context/index.js.map +1 -0
  28. package/{src/analysis/index.ts → dist/analysis/index.d.ts} +0 -1
  29. package/dist/analysis/index.js +24 -0
  30. package/dist/analysis/index.js.map +1 -0
  31. package/dist/analysis/static/wpPhpcsRunner.d.ts +11 -0
  32. package/dist/analysis/static/wpPhpcsRunner.js +219 -0
  33. package/dist/analysis/static/wpPhpcsRunner.js.map +1 -0
  34. package/dist/analysis/tokens/TokenAnalysisFormatter.d.ts +27 -0
  35. package/{src/analysis/tokens/TokenAnalysisFormatter.ts → dist/analysis/tokens/TokenAnalysisFormatter.js} +64 -75
  36. package/dist/analysis/tokens/TokenAnalysisFormatter.js.map +1 -0
  37. package/dist/analysis/tokens/TokenAnalyzer.d.ts +155 -0
  38. package/dist/analysis/tokens/TokenAnalyzer.js +502 -0
  39. package/dist/analysis/tokens/TokenAnalyzer.js.map +1 -0
  40. package/{src/analysis/tokens/index.ts → dist/analysis/tokens/index.d.ts} +0 -1
  41. package/dist/analysis/tokens/index.js +24 -0
  42. package/dist/analysis/tokens/index.js.map +1 -0
  43. package/dist/clients/base/abstractClient.d.ts +99 -0
  44. package/dist/clients/base/abstractClient.js +98 -0
  45. package/dist/clients/base/abstractClient.js.map +1 -0
  46. package/dist/clients/base/httpClient.d.ts +24 -0
  47. package/dist/clients/base/httpClient.js +147 -0
  48. package/dist/clients/base/httpClient.js.map +1 -0
  49. package/{src/clients/base/index.ts → dist/clients/base/index.d.ts} +0 -1
  50. package/dist/clients/base/index.js +28 -0
  51. package/dist/clients/base/index.js.map +1 -0
  52. package/dist/clients/base/modelDetection.d.ts +41 -0
  53. package/dist/clients/base/modelDetection.js +88 -0
  54. package/dist/clients/base/modelDetection.js.map +1 -0
  55. package/dist/clients/base/responseProcessor.d.ts +45 -0
  56. package/dist/clients/base/responseProcessor.js +495 -0
  57. package/dist/clients/base/responseProcessor.js.map +1 -0
  58. package/dist/clients/factory/clientFactory.d.ts +23 -0
  59. package/dist/clients/factory/clientFactory.js +50 -0
  60. package/dist/clients/factory/clientFactory.js.map +1 -0
  61. package/{src/clients/factory/index.ts → dist/clients/factory/index.d.ts} +0 -1
  62. package/dist/clients/factory/index.js +24 -0
  63. package/dist/clients/factory/index.js.map +1 -0
  64. package/{src/clients/implementations/index.ts → dist/clients/implementations/index.d.ts} +0 -1
  65. package/dist/clients/implementations/index.js +24 -0
  66. package/dist/clients/implementations/index.js.map +1 -0
  67. package/dist/clients/implementations/openRouterClient.d.ts +69 -0
  68. package/dist/clients/implementations/openRouterClient.js +294 -0
  69. package/dist/clients/implementations/openRouterClient.js.map +1 -0
  70. package/dist/clients/openRouterClient.d.ts +42 -0
  71. package/dist/clients/openRouterClient.js +580 -0
  72. package/dist/clients/openRouterClient.js.map +1 -0
  73. package/{src/clients/openRouterClientWrapper.ts → dist/clients/openRouterClientWrapper.d.ts} +2 -24
  74. package/dist/clients/openRouterClientWrapper.js +64 -0
  75. package/dist/clients/openRouterClientWrapper.js.map +1 -0
  76. package/dist/clients/utils/directoryStructure.d.ts +14 -0
  77. package/dist/clients/utils/directoryStructure.js +48 -0
  78. package/dist/clients/utils/directoryStructure.js.map +1 -0
  79. package/{src/clients/utils/index.ts → dist/clients/utils/index.d.ts} +0 -1
  80. package/dist/clients/utils/index.js +31 -0
  81. package/dist/clients/utils/index.js.map +1 -0
  82. package/dist/clients/utils/languageDetection.d.ts +13 -0
  83. package/dist/clients/utils/languageDetection.js +46 -0
  84. package/dist/clients/utils/languageDetection.js.map +1 -0
  85. package/dist/clients/utils/promptFormatter.d.ts +37 -0
  86. package/dist/clients/utils/promptFormatter.js +150 -0
  87. package/dist/clients/utils/promptFormatter.js.map +1 -0
  88. package/{src/clients/utils/promptLoader.ts → dist/clients/utils/promptLoader.d.ts} +1 -27
  89. package/dist/clients/utils/promptLoader.js +49 -0
  90. package/dist/clients/utils/promptLoader.js.map +1 -0
  91. package/dist/clients/utils/tokenCounter.d.ts +81 -0
  92. package/dist/clients/utils/tokenCounter.js +184 -0
  93. package/dist/clients/utils/tokenCounter.js.map +1 -0
  94. package/dist/core/ApiClientSelector.d.ts +8 -0
  95. package/dist/core/ApiClientSelector.js +29 -0
  96. package/dist/core/ApiClientSelector.js.map +1 -0
  97. package/dist/core/ConfigurationService.d.ts +307 -0
  98. package/dist/core/ConfigurationService.js +516 -0
  99. package/dist/core/ConfigurationService.js.map +1 -0
  100. package/dist/core/ConsolidationService.d.ts +99 -0
  101. package/dist/core/ConsolidationService.js +341 -0
  102. package/dist/core/ConsolidationService.js.map +1 -0
  103. package/dist/core/InteractiveDisplayManager.d.ts +22 -0
  104. package/dist/core/InteractiveDisplayManager.js +70 -0
  105. package/dist/core/InteractiveDisplayManager.js.map +1 -0
  106. package/dist/core/OutputManager.d.ts +26 -0
  107. package/dist/core/OutputManager.js +217 -0
  108. package/dist/core/OutputManager.js.map +1 -0
  109. package/dist/core/ReviewGenerator.d.ts +13 -0
  110. package/dist/core/ReviewGenerator.js +102 -0
  111. package/dist/core/ReviewGenerator.js.map +1 -0
  112. package/dist/core/fileDiscovery.d.ts +35 -0
  113. package/dist/core/fileDiscovery.js +202 -0
  114. package/dist/core/fileDiscovery.js.map +1 -0
  115. package/dist/core/handlers/EstimationHandler.d.ts +18 -0
  116. package/dist/core/handlers/EstimationHandler.js +110 -0
  117. package/dist/core/handlers/EstimationHandler.js.map +1 -0
  118. package/dist/core/handlers/FileProcessingHandler.d.ts +31 -0
  119. package/dist/core/handlers/FileProcessingHandler.js +164 -0
  120. package/dist/core/handlers/FileProcessingHandler.js.map +1 -0
  121. package/dist/core/handlers/OutputHandler.d.ts +27 -0
  122. package/dist/core/handlers/OutputHandler.js +127 -0
  123. package/dist/core/handlers/OutputHandler.js.map +1 -0
  124. package/dist/core/handlers/ReviewExecutor.d.ts +32 -0
  125. package/dist/core/handlers/ReviewExecutor.js +111 -0
  126. package/dist/core/handlers/ReviewExecutor.js.map +1 -0
  127. package/dist/core/reviewOrchestrator.d.ts +24 -0
  128. package/dist/core/reviewOrchestrator.js +354 -0
  129. package/dist/core/reviewOrchestrator.js.map +1 -0
  130. package/dist/core/utils/ModelInfoUtils.d.ts +16 -0
  131. package/dist/core/utils/ModelInfoUtils.js +54 -0
  132. package/dist/core/utils/ModelInfoUtils.js.map +1 -0
  133. package/{src/formatters/outputFormatter.ts → dist/formatters/outputFormatter.d.ts} +2 -33
  134. package/dist/formatters/outputFormatter.js +65 -0
  135. package/dist/formatters/outputFormatter.js.map +1 -0
  136. package/dist/formatters/utils/IssueFormatters.d.ts +20 -0
  137. package/dist/formatters/utils/IssueFormatters.js +67 -0
  138. package/dist/formatters/utils/IssueFormatters.js.map +1 -0
  139. package/dist/formatters/utils/JsonFormatter.d.ts +13 -0
  140. package/dist/formatters/utils/JsonFormatter.js +57 -0
  141. package/dist/formatters/utils/JsonFormatter.js.map +1 -0
  142. package/dist/formatters/utils/MarkdownFormatters.d.ts +51 -0
  143. package/dist/formatters/utils/MarkdownFormatters.js +456 -0
  144. package/dist/formatters/utils/MarkdownFormatters.js.map +1 -0
  145. package/dist/formatters/utils/MetadataFormatter.d.ts +65 -0
  146. package/dist/formatters/utils/MetadataFormatter.js +219 -0
  147. package/dist/formatters/utils/MetadataFormatter.js.map +1 -0
  148. package/dist/formatters/utils/ModelInfoExtractor.d.ts +33 -0
  149. package/dist/formatters/utils/ModelInfoExtractor.js +111 -0
  150. package/dist/formatters/utils/ModelInfoExtractor.js.map +1 -0
  151. package/dist/index.d.ts +1 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/plugins/PluginInterface.d.ts +44 -0
  154. package/dist/plugins/PluginInterface.js +9 -0
  155. package/dist/plugins/PluginInterface.js.map +1 -0
  156. package/dist/plugins/PluginManager.d.ts +51 -0
  157. package/dist/plugins/PluginManager.js +151 -0
  158. package/dist/plugins/PluginManager.js.map +1 -0
  159. package/dist/prompts/PromptManager.d.ts +30 -0
  160. package/dist/prompts/PromptManager.js +62 -0
  161. package/dist/prompts/PromptManager.js.map +1 -0
  162. package/dist/prompts/cache/PromptCache.d.ts +32 -0
  163. package/dist/prompts/cache/PromptCache.js +48 -0
  164. package/dist/prompts/cache/PromptCache.js.map +1 -0
  165. package/dist/runtime/auth/service.d.ts +2 -0
  166. package/dist/runtime/auth/service.js +41 -0
  167. package/dist/runtime/auth/service.js.map +1 -0
  168. package/dist/runtime/auth/session.d.ts +5 -0
  169. package/dist/runtime/auth/session.js +87 -0
  170. package/dist/runtime/auth/session.js.map +1 -0
  171. package/dist/runtime/auth/types.d.ts +9 -0
  172. package/dist/runtime/auth/types.js +3 -0
  173. package/dist/runtime/auth/types.js.map +1 -0
  174. package/dist/runtime/cliEntry.d.ts +1 -0
  175. package/dist/runtime/cliEntry.js +276 -0
  176. package/dist/runtime/cliEntry.js.map +1 -0
  177. package/dist/runtime/debug/logManager.d.ts +5 -0
  178. package/dist/runtime/debug/logManager.js +31 -0
  179. package/dist/runtime/debug/logManager.js.map +1 -0
  180. package/dist/runtime/errors.d.ts +5 -0
  181. package/dist/runtime/errors.js +15 -0
  182. package/dist/runtime/errors.js.map +1 -0
  183. package/dist/runtime/fileCollector.d.ts +14 -0
  184. package/dist/runtime/fileCollector.js +381 -0
  185. package/dist/runtime/fileCollector.js.map +1 -0
  186. package/dist/runtime/manifest.d.ts +1 -0
  187. package/dist/runtime/manifest.js +65 -0
  188. package/dist/runtime/manifest.js.map +1 -0
  189. package/dist/runtime/openrouterProxy.d.ts +4 -0
  190. package/dist/runtime/openrouterProxy.js +43 -0
  191. package/dist/runtime/openrouterProxy.js.map +1 -0
  192. package/dist/runtime/preprod/batchStreamer.d.ts +54 -0
  193. package/dist/runtime/preprod/batchStreamer.js +159 -0
  194. package/dist/runtime/preprod/batchStreamer.js.map +1 -0
  195. package/dist/runtime/preprod/crEdgeServiceClient.d.ts +30 -0
  196. package/dist/runtime/preprod/crEdgeServiceClient.js +133 -0
  197. package/dist/runtime/preprod/crEdgeServiceClient.js.map +1 -0
  198. package/dist/runtime/preprod/progressTracker.d.ts +21 -0
  199. package/dist/runtime/preprod/progressTracker.js +80 -0
  200. package/dist/runtime/preprod/progressTracker.js.map +1 -0
  201. package/dist/runtime/preprod/webCheck.d.ts +1 -0
  202. package/dist/runtime/preprod/webCheck.js +102 -0
  203. package/dist/runtime/preprod/webCheck.js.map +1 -0
  204. package/dist/runtime/proxyConfig.d.ts +6 -0
  205. package/dist/runtime/proxyConfig.js +86 -0
  206. package/dist/runtime/proxyConfig.js.map +1 -0
  207. package/dist/runtime/proxyEnvironment.d.ts +3 -0
  208. package/dist/runtime/proxyEnvironment.js +63 -0
  209. package/dist/runtime/proxyEnvironment.js.map +1 -0
  210. package/dist/runtime/reportMerge.d.ts +30 -0
  211. package/dist/runtime/reportMerge.js +70 -0
  212. package/dist/runtime/reportMerge.js.map +1 -0
  213. package/dist/runtime/reporting/markdownReportBuilder.d.ts +17 -0
  214. package/dist/runtime/reporting/markdownReportBuilder.js +154 -0
  215. package/dist/runtime/reporting/markdownReportBuilder.js.map +1 -0
  216. package/dist/runtime/reporting/reportDataCollector.d.ts +31 -0
  217. package/dist/runtime/reporting/reportDataCollector.js +170 -0
  218. package/dist/runtime/reporting/reportDataCollector.js.map +1 -0
  219. package/dist/runtime/reporting/summaryGenerator.d.ts +10 -0
  220. package/dist/runtime/reporting/summaryGenerator.js +67 -0
  221. package/dist/runtime/reporting/summaryGenerator.js.map +1 -0
  222. package/dist/runtime/reviewPipeline.d.ts +61 -0
  223. package/dist/runtime/reviewPipeline.js +231 -0
  224. package/dist/runtime/reviewPipeline.js.map +1 -0
  225. package/dist/runtime/runAiCodeReview.d.ts +36 -0
  226. package/dist/runtime/runAiCodeReview.js +409 -0
  227. package/dist/runtime/runAiCodeReview.js.map +1 -0
  228. package/dist/runtime/runtimeConfig.d.ts +4 -0
  229. package/dist/runtime/runtimeConfig.js +7 -0
  230. package/dist/runtime/runtimeConfig.js.map +1 -0
  231. package/dist/runtime/ui/Layout.d.ts +11 -0
  232. package/dist/runtime/ui/Layout.js +47 -0
  233. package/dist/runtime/ui/Layout.js.map +1 -0
  234. package/dist/runtime/ui/RuntimeApp.d.ts +6 -0
  235. package/dist/runtime/ui/RuntimeApp.js +275 -0
  236. package/dist/runtime/ui/RuntimeApp.js.map +1 -0
  237. package/dist/runtime/ui/inkModules.d.ts +10 -0
  238. package/dist/runtime/ui/inkModules.js +63 -0
  239. package/dist/runtime/ui/inkModules.js.map +1 -0
  240. package/dist/runtime/ui/screens/AuthScreen.d.ts +6 -0
  241. package/dist/runtime/ui/screens/AuthScreen.js +67 -0
  242. package/dist/runtime/ui/screens/AuthScreen.js.map +1 -0
  243. package/dist/runtime/ui/screens/ModeSelection.d.ts +11 -0
  244. package/dist/runtime/ui/screens/ModeSelection.js +169 -0
  245. package/dist/runtime/ui/screens/ModeSelection.js.map +1 -0
  246. package/dist/runtime/ui/screens/ProgressScreen.d.ts +21 -0
  247. package/dist/runtime/ui/screens/ProgressScreen.js +86 -0
  248. package/dist/runtime/ui/screens/ProgressScreen.js.map +1 -0
  249. package/dist/runtime/ui/screens/ResultsScreen.d.ts +7 -0
  250. package/dist/runtime/ui/screens/ResultsScreen.js +34 -0
  251. package/dist/runtime/ui/screens/ResultsScreen.js.map +1 -0
  252. package/dist/strategies/ArchitecturalReviewStrategy.d.ts +29 -0
  253. package/dist/strategies/ArchitecturalReviewStrategy.js +42 -0
  254. package/dist/strategies/ArchitecturalReviewStrategy.js.map +1 -0
  255. package/dist/strategies/CodingTestReviewStrategy.d.ts +194 -0
  256. package/dist/strategies/CodingTestReviewStrategy.js +681 -0
  257. package/dist/strategies/CodingTestReviewStrategy.js.map +1 -0
  258. package/dist/strategies/ConsolidatedReviewStrategy.d.ts +25 -0
  259. package/dist/strategies/ConsolidatedReviewStrategy.js +45 -0
  260. package/dist/strategies/ConsolidatedReviewStrategy.js.map +1 -0
  261. package/dist/strategies/ExtractPatternsReviewStrategy.d.ts +30 -0
  262. package/dist/strategies/ExtractPatternsReviewStrategy.js +51 -0
  263. package/dist/strategies/ExtractPatternsReviewStrategy.js.map +1 -0
  264. package/dist/strategies/MultiPassReviewStrategy.d.ts +86 -0
  265. package/dist/strategies/MultiPassReviewStrategy.js +590 -0
  266. package/dist/strategies/MultiPassReviewStrategy.js.map +1 -0
  267. package/dist/strategies/ReviewStrategy.d.ts +45 -0
  268. package/dist/strategies/ReviewStrategy.js +24 -0
  269. package/dist/strategies/ReviewStrategy.js.map +1 -0
  270. package/dist/strategies/StrategyFactory.d.ts +19 -0
  271. package/dist/strategies/StrategyFactory.js +72 -0
  272. package/dist/strategies/StrategyFactory.js.map +1 -0
  273. package/{src/strategies/index.ts → dist/strategies/index.d.ts} +0 -1
  274. package/dist/strategies/index.js +30 -0
  275. package/dist/strategies/index.js.map +1 -0
  276. package/dist/tokenizers/baseTokenizer.d.ts +25 -0
  277. package/dist/tokenizers/baseTokenizer.js +48 -0
  278. package/dist/tokenizers/baseTokenizer.js.map +1 -0
  279. package/dist/tokenizers/gptTokenizer.d.ts +7 -0
  280. package/dist/tokenizers/gptTokenizer.js +28 -0
  281. package/dist/tokenizers/gptTokenizer.js.map +1 -0
  282. package/{src/tokenizers/index.ts → dist/tokenizers/index.d.ts} +0 -1
  283. package/dist/tokenizers/index.js +24 -0
  284. package/dist/tokenizers/index.js.map +1 -0
  285. package/dist/types/apiResponses.d.ts +39 -0
  286. package/dist/types/apiResponses.js +9 -0
  287. package/dist/types/apiResponses.js.map +1 -0
  288. package/dist/types/cli.d.ts +22 -0
  289. package/dist/types/cli.js +3 -0
  290. package/dist/types/cli.js.map +1 -0
  291. package/{src/types/common.ts → dist/types/common.d.ts} +2 -19
  292. package/dist/types/common.js +14 -0
  293. package/dist/types/common.js.map +1 -0
  294. package/dist/types/configuration.d.ts +682 -0
  295. package/dist/types/configuration.js +65 -0
  296. package/dist/types/configuration.js.map +1 -0
  297. package/dist/types/review.d.ts +318 -0
  298. package/dist/types/review.js +8 -0
  299. package/dist/types/review.js.map +1 -0
  300. package/dist/types/reviewSchema.d.ts +543 -0
  301. package/{src/types/reviewSchema.ts → dist/types/reviewSchema.js} +44 -104
  302. package/dist/types/reviewSchema.js.map +1 -0
  303. package/dist/types/structuredReview.d.ts +119 -0
  304. package/dist/types/structuredReview.js +6 -0
  305. package/dist/types/structuredReview.js.map +1 -0
  306. package/dist/types/tokenAnalysis.d.ts +44 -0
  307. package/dist/types/tokenAnalysis.js +4 -0
  308. package/dist/types/tokenAnalysis.js.map +1 -0
  309. package/dist/utils/FileReader.d.ts +33 -0
  310. package/dist/utils/FileReader.js +88 -0
  311. package/dist/utils/FileReader.js.map +1 -0
  312. package/dist/utils/FileWriter.d.ts +26 -0
  313. package/dist/utils/FileWriter.js +76 -0
  314. package/dist/utils/FileWriter.js.map +1 -0
  315. package/dist/utils/PathGenerator.d.ts +30 -0
  316. package/dist/utils/PathGenerator.js +82 -0
  317. package/dist/utils/PathGenerator.js.map +1 -0
  318. package/dist/utils/api/apiUtils.d.ts +3 -0
  319. package/dist/utils/api/apiUtils.js +20 -0
  320. package/dist/utils/api/apiUtils.js.map +1 -0
  321. package/dist/utils/api/index.js +18 -0
  322. package/dist/utils/api/index.js.map +1 -0
  323. package/dist/utils/apiErrorHandler.d.ts +130 -0
  324. package/dist/utils/apiErrorHandler.js +256 -0
  325. package/dist/utils/apiErrorHandler.js.map +1 -0
  326. package/dist/utils/ciDataCollector.d.ts +51 -0
  327. package/dist/utils/ciDataCollector.js +197 -0
  328. package/dist/utils/ciDataCollector.js.map +1 -0
  329. package/dist/utils/codingTestConfigLoader.d.ts +66 -0
  330. package/dist/utils/codingTestConfigLoader.js +420 -0
  331. package/dist/utils/codingTestConfigLoader.js.map +1 -0
  332. package/dist/utils/dependencies/aiDependencyAnalyzer.d.ts +30 -0
  333. package/dist/utils/dependencies/aiDependencyAnalyzer.js +343 -0
  334. package/dist/utils/dependencies/aiDependencyAnalyzer.js.map +1 -0
  335. package/dist/utils/detection/frameworkDetector.d.ts +43 -0
  336. package/dist/utils/detection/frameworkDetector.js +850 -0
  337. package/dist/utils/detection/frameworkDetector.js.map +1 -0
  338. package/{src/utils/detection/index.ts → dist/utils/detection/index.d.ts} +0 -1
  339. package/dist/utils/detection/index.js +28 -0
  340. package/dist/utils/detection/index.js.map +1 -0
  341. package/dist/utils/detection/projectTypeDetector.d.ts +27 -0
  342. package/dist/utils/detection/projectTypeDetector.js +469 -0
  343. package/dist/utils/detection/projectTypeDetector.js.map +1 -0
  344. package/dist/utils/diagramGenerator.d.ts +49 -0
  345. package/dist/utils/diagramGenerator.js +218 -0
  346. package/dist/utils/diagramGenerator.js.map +1 -0
  347. package/dist/utils/errorLogger.d.ts +24 -0
  348. package/dist/utils/errorLogger.js +59 -0
  349. package/dist/utils/errorLogger.js.map +1 -0
  350. package/dist/utils/estimationUtils.d.ts +139 -0
  351. package/dist/utils/estimationUtils.js +329 -0
  352. package/dist/utils/estimationUtils.js.map +1 -0
  353. package/dist/utils/fileFilters.d.ts +72 -0
  354. package/dist/utils/fileFilters.js +338 -0
  355. package/dist/utils/fileFilters.js.map +1 -0
  356. package/dist/utils/fileSystem.d.ts +22 -0
  357. package/dist/utils/fileSystem.js +45 -0
  358. package/dist/utils/fileSystem.js.map +1 -0
  359. package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -14
  360. package/dist/utils/index.js +52 -0
  361. package/dist/utils/index.js.map +1 -0
  362. package/dist/utils/logger.d.ts +77 -0
  363. package/dist/utils/logger.js +271 -0
  364. package/dist/utils/logger.js.map +1 -0
  365. package/dist/utils/pathValidator.d.ts +40 -0
  366. package/dist/utils/pathValidator.js +98 -0
  367. package/dist/utils/pathValidator.js.map +1 -0
  368. package/{src/utils/priorityFilter.ts → dist/utils/priorityFilter.d.ts} +1 -26
  369. package/dist/utils/priorityFilter.js +54 -0
  370. package/dist/utils/priorityFilter.js.map +1 -0
  371. package/dist/utils/projectDocs.d.ts +47 -0
  372. package/dist/utils/projectDocs.js +158 -0
  373. package/dist/utils/projectDocs.js.map +1 -0
  374. package/dist/utils/promptPaths.d.ts +6 -0
  375. package/dist/utils/promptPaths.js +33 -0
  376. package/dist/utils/promptPaths.js.map +1 -0
  377. package/dist/utils/promptTemplateManager.d.ts +34 -0
  378. package/dist/utils/promptTemplateManager.js +141 -0
  379. package/dist/utils/promptTemplateManager.js.map +1 -0
  380. package/dist/utils/review/consolidateReview.d.ts +15 -0
  381. package/dist/utils/review/consolidateReview.js +481 -0
  382. package/dist/utils/review/consolidateReview.js.map +1 -0
  383. package/dist/utils/review/fixDisplay.d.ts +20 -0
  384. package/dist/utils/review/fixDisplay.js +84 -0
  385. package/dist/utils/review/fixDisplay.js.map +1 -0
  386. package/dist/utils/review/fixImplementation.d.ts +28 -0
  387. package/dist/utils/review/fixImplementation.js +60 -0
  388. package/dist/utils/review/fixImplementation.js.map +1 -0
  389. package/dist/utils/review/index.d.ts +13 -0
  390. package/dist/utils/review/index.js +50 -0
  391. package/dist/utils/review/index.js.map +1 -0
  392. package/dist/utils/review/interactiveProcessing.d.ts +25 -0
  393. package/dist/utils/review/interactiveProcessing.js +251 -0
  394. package/dist/utils/review/interactiveProcessing.js.map +1 -0
  395. package/dist/utils/review/progressTracker.d.ts +106 -0
  396. package/dist/utils/review/progressTracker.js +227 -0
  397. package/dist/utils/review/progressTracker.js.map +1 -0
  398. package/dist/utils/review/reviewExtraction.d.ts +31 -0
  399. package/dist/utils/review/reviewExtraction.js +324 -0
  400. package/dist/utils/review/reviewExtraction.js.map +1 -0
  401. package/dist/utils/review/types.d.ts +45 -0
  402. package/dist/utils/review/types.js +18 -0
  403. package/dist/utils/review/types.js.map +1 -0
  404. package/{src/utils/reviewActionHandler.ts → dist/utils/reviewActionHandler.d.ts} +0 -2
  405. package/dist/utils/reviewActionHandler.js +34 -0
  406. package/dist/utils/reviewActionHandler.js.map +1 -0
  407. package/dist/utils/reviewParser.d.ts +34 -0
  408. package/dist/utils/reviewParser.js +218 -0
  409. package/dist/utils/reviewParser.js.map +1 -0
  410. package/dist/utils/sanitizer.d.ts +82 -0
  411. package/dist/utils/sanitizer.js +239 -0
  412. package/dist/utils/sanitizer.js.map +1 -0
  413. package/dist/utils/smartFileSelector.d.ts +50 -0
  414. package/dist/utils/smartFileSelector.js +261 -0
  415. package/dist/utils/smartFileSelector.js.map +1 -0
  416. package/dist/utils/templateLoader.d.ts +44 -0
  417. package/dist/utils/templateLoader.js +431 -0
  418. package/dist/utils/templateLoader.js.map +1 -0
  419. package/dist/utils/treeGenerator.d.ts +12 -0
  420. package/dist/utils/treeGenerator.js +133 -0
  421. package/dist/utils/treeGenerator.js.map +1 -0
  422. package/package.json +5 -1
  423. package/.cr-aia.yml +0 -23
  424. package/.crignore +0 -0
  425. package/docs/opt-in-full-context.md +0 -27
  426. package/reports/cr-cr-aia-17-11-2025-20-13.md +0 -354
  427. package/src/analysis/FindingsExtractor.ts +0 -431
  428. package/src/analysis/ai-detection/analyzers/BaseAnalyzer.ts +0 -267
  429. package/src/analysis/ai-detection/analyzers/DocumentationAnalyzer.ts +0 -622
  430. package/src/analysis/ai-detection/analyzers/GitHistoryAnalyzer.ts +0 -430
  431. package/src/analysis/ai-detection/core/AIDetectionEngine.ts +0 -467
  432. package/src/analysis/ai-detection/types/DetectionTypes.ts +0 -406
  433. package/src/analysis/ai-detection/utils/SubmissionConverter.ts +0 -390
  434. package/src/analysis/context/ReviewContext.ts +0 -378
  435. package/src/analysis/tokens/TokenAnalyzer.ts +0 -747
  436. package/src/clients/base/abstractClient.ts +0 -190
  437. package/src/clients/base/httpClient.ts +0 -160
  438. package/src/clients/base/modelDetection.ts +0 -107
  439. package/src/clients/base/responseProcessor.ts +0 -586
  440. package/src/clients/factory/clientFactory.ts +0 -55
  441. package/src/clients/implementations/openRouterClient.ts +0 -413
  442. package/src/clients/openRouterClient.ts +0 -870
  443. package/src/clients/utils/directoryStructure.ts +0 -52
  444. package/src/clients/utils/languageDetection.ts +0 -44
  445. package/src/clients/utils/promptFormatter.ts +0 -182
  446. package/src/clients/utils/tokenCounter.ts +0 -297
  447. package/src/core/ApiClientSelector.ts +0 -37
  448. package/src/core/ConfigurationService.ts +0 -591
  449. package/src/core/ConsolidationService.ts +0 -423
  450. package/src/core/InteractiveDisplayManager.ts +0 -81
  451. package/src/core/OutputManager.ts +0 -275
  452. package/src/core/ReviewGenerator.ts +0 -140
  453. package/src/core/fileDiscovery.ts +0 -237
  454. package/src/core/handlers/EstimationHandler.ts +0 -104
  455. package/src/core/handlers/FileProcessingHandler.ts +0 -210
  456. package/src/core/handlers/OutputHandler.ts +0 -125
  457. package/src/core/handlers/ReviewExecutor.ts +0 -104
  458. package/src/core/reviewOrchestrator.ts +0 -333
  459. package/src/core/utils/ModelInfoUtils.ts +0 -56
  460. package/src/formatters/utils/IssueFormatters.ts +0 -83
  461. package/src/formatters/utils/JsonFormatter.ts +0 -77
  462. package/src/formatters/utils/MarkdownFormatters.ts +0 -609
  463. package/src/formatters/utils/MetadataFormatter.ts +0 -269
  464. package/src/formatters/utils/ModelInfoExtractor.ts +0 -115
  465. package/src/index.ts +0 -25
  466. package/src/plugins/PluginInterface.ts +0 -50
  467. package/src/plugins/PluginManager.ts +0 -126
  468. package/src/prompts/PromptManager.ts +0 -69
  469. package/src/prompts/cache/PromptCache.ts +0 -50
  470. package/src/prompts/promptText/common/variables/css-frameworks.json +0 -33
  471. package/src/prompts/promptText/common/variables/framework-versions.json +0 -45
  472. package/src/prompts/promptText/frameworks/react/comprehensive.hbs +0 -19
  473. package/src/prompts/promptText/languages/css/comprehensive.hbs +0 -18
  474. package/src/prompts/promptText/languages/generic/comprehensive.hbs +0 -20
  475. package/src/prompts/promptText/languages/html/comprehensive.hbs +0 -18
  476. package/src/prompts/promptText/languages/javascript/comprehensive.hbs +0 -18
  477. package/src/prompts/promptText/languages/python/comprehensive.hbs +0 -18
  478. package/src/prompts/promptText/languages/typescript/comprehensive.hbs +0 -18
  479. package/src/runtime/auth/service.ts +0 -58
  480. package/src/runtime/auth/session.ts +0 -103
  481. package/src/runtime/auth/types.ts +0 -11
  482. package/src/runtime/cliEntry.ts +0 -214
  483. package/src/runtime/debug/logManager.ts +0 -37
  484. package/src/runtime/errors.ts +0 -13
  485. package/src/runtime/fileCollector.ts +0 -495
  486. package/src/runtime/manifest.ts +0 -64
  487. package/src/runtime/openrouterProxy.ts +0 -45
  488. package/src/runtime/preprod/webCheck.ts +0 -104
  489. package/src/runtime/proxyConfig.ts +0 -94
  490. package/src/runtime/proxyEnvironment.ts +0 -71
  491. package/src/runtime/reportMerge.ts +0 -102
  492. package/src/runtime/reporting/markdownReportBuilder.ts +0 -138
  493. package/src/runtime/reporting/reportDataCollector.ts +0 -234
  494. package/src/runtime/reporting/summaryGenerator.ts +0 -86
  495. package/src/runtime/reviewPipeline.ts +0 -200
  496. package/src/runtime/runAiCodeReview.ts +0 -308
  497. package/src/runtime/runtimeConfig.ts +0 -5
  498. package/src/runtime/ui/Layout.tsx +0 -57
  499. package/src/runtime/ui/RuntimeApp.tsx +0 -262
  500. package/src/runtime/ui/inkModules.ts +0 -73
  501. package/src/runtime/ui/screens/AuthScreen.tsx +0 -128
  502. package/src/runtime/ui/screens/ModeSelection.tsx +0 -185
  503. package/src/runtime/ui/screens/ProgressScreen.tsx +0 -110
  504. package/src/runtime/ui/screens/ResultsScreen.tsx +0 -103
  505. package/src/strategies/ArchitecturalReviewStrategy.ts +0 -54
  506. package/src/strategies/CodingTestReviewStrategy.ts +0 -920
  507. package/src/strategies/ConsolidatedReviewStrategy.ts +0 -59
  508. package/src/strategies/ExtractPatternsReviewStrategy.ts +0 -64
  509. package/src/strategies/MultiPassReviewStrategy.ts +0 -785
  510. package/src/strategies/ReviewStrategy.ts +0 -64
  511. package/src/strategies/StrategyFactory.ts +0 -79
  512. package/src/tokenizers/baseTokenizer.ts +0 -61
  513. package/src/tokenizers/gptTokenizer.ts +0 -27
  514. package/src/types/apiResponses.ts +0 -40
  515. package/src/types/cli.ts +0 -24
  516. package/src/types/configuration.ts +0 -201
  517. package/src/types/handlebars.d.ts +0 -5
  518. package/src/types/patch.d.ts +0 -25
  519. package/src/types/review.ts +0 -312
  520. package/src/types/reviewContext.d.ts +0 -65
  521. package/src/types/structuredReview.ts +0 -167
  522. package/src/types/tokenAnalysis.ts +0 -56
  523. package/src/utils/FileReader.ts +0 -93
  524. package/src/utils/FileWriter.ts +0 -76
  525. package/src/utils/PathGenerator.ts +0 -97
  526. package/src/utils/api/apiUtils.ts +0 -14
  527. package/src/utils/apiErrorHandler.ts +0 -287
  528. package/src/utils/ciDataCollector.ts +0 -252
  529. package/src/utils/codingTestConfigLoader.ts +0 -466
  530. package/src/utils/dependencies/aiDependencyAnalyzer.ts +0 -454
  531. package/src/utils/detection/frameworkDetector.ts +0 -879
  532. package/src/utils/detection/projectTypeDetector.ts +0 -518
  533. package/src/utils/diagramGenerator.ts +0 -206
  534. package/src/utils/errorLogger.ts +0 -60
  535. package/src/utils/estimationUtils.ts +0 -407
  536. package/src/utils/fileFilters.ts +0 -373
  537. package/src/utils/fileSystem.ts +0 -57
  538. package/src/utils/logger.ts +0 -290
  539. package/src/utils/pathValidator.ts +0 -98
  540. package/src/utils/projectDocs.ts +0 -189
  541. package/src/utils/promptPaths.ts +0 -29
  542. package/src/utils/promptTemplateManager.ts +0 -157
  543. package/src/utils/review/consolidateReview.ts +0 -553
  544. package/src/utils/review/fixDisplay.ts +0 -100
  545. package/src/utils/review/fixImplementation.ts +0 -61
  546. package/src/utils/review/index.ts +0 -36
  547. package/src/utils/review/interactiveProcessing.ts +0 -294
  548. package/src/utils/review/progressTracker.ts +0 -296
  549. package/src/utils/review/reviewExtraction.ts +0 -382
  550. package/src/utils/review/types.ts +0 -46
  551. package/src/utils/reviewParser.ts +0 -253
  552. package/src/utils/sanitizer.ts +0 -238
  553. package/src/utils/smartFileSelector.ts +0 -255
  554. package/src/utils/templateLoader.ts +0 -514
  555. package/src/utils/treeGenerator.ts +0 -153
  556. package/tsconfig.build.json +0 -14
  557. package/tsconfig.json +0 -59
  558. /package/{src/utils/api/index.ts → dist/utils/api/index.d.ts} +0 -0
@@ -1,879 +0,0 @@
1
- /**
2
- * @fileoverview Framework detection utility for cr-aia
3
- *
4
- * This module analyzes project files to determine which framework is being used,
5
- * allowing for more specific prompts and improved review quality.
6
- */
7
-
8
- import * as fs from 'node:fs/promises';
9
- import * as path from 'node:path';
10
- import logger from '../logger';
11
-
12
- /**
13
- * Recursively count files with specific extensions in a directory
14
- * @param dirPath Directory path to search
15
- * @param extensions Array of file extensions to count (e.g., ['.ts', '.tsx'])
16
- * @returns Promise resolving to the count of matching files
17
- */
18
- async function countFilesByExtension(dirPath: string, extensions: string[]): Promise<number> {
19
- let count = 0;
20
-
21
- try {
22
- const entries = await fs.readdir(dirPath, { withFileTypes: true });
23
-
24
- for (const entry of entries) {
25
- const fullPath = path.join(dirPath, entry.name);
26
-
27
- if (entry.isDirectory()) {
28
- // Skip common directories that shouldn't be counted
29
- if (!['node_modules', '.git', 'dist', 'build', '.next', 'coverage'].includes(entry.name)) {
30
- count += await countFilesByExtension(fullPath, extensions);
31
- }
32
- } else if (entry.isFile()) {
33
- const ext = path.extname(entry.name);
34
- if (extensions.includes(ext)) {
35
- count++;
36
- }
37
- }
38
- }
39
- } catch (error) {
40
- logger.debug(`Error reading directory ${dirPath}: ${error}`);
41
- }
42
-
43
- return count;
44
- }
45
-
46
- /**
47
- * Framework detection result
48
- */
49
- export interface FrameworkDetectionResult {
50
- /** Primary programming language detected */
51
- language: string;
52
- /** Framework detected */
53
- framework: string;
54
- /** Confidence level (0-1) */
55
- confidence: number;
56
- /** Detection method used */
57
- detectionMethod: string;
58
- /** Any additional frameworks detected */
59
- additionalFrameworks?: string[];
60
- /** CSS frameworks detected */
61
- cssFrameworks?: {
62
- name: string;
63
- version?: string;
64
- confidence: number;
65
- }[];
66
- /** Detected framework version */
67
- frameworkVersion?: string;
68
- /** Framework type (ui, css, backend, etc.) */
69
- frameworkType?: string;
70
- }
71
-
72
- /**
73
- * Framework signature definition for detection
74
- */
75
- interface FrameworkSignature {
76
- /** Framework name */
77
- name: string;
78
- /** Files that indicate this framework */
79
- files: string[];
80
- /** Directories that indicate this framework */
81
- directories?: string[];
82
- /** Package.json dependencies that indicate this framework */
83
- dependencies?: string[];
84
- /** Confidence weight for this signature */
85
- weight: number;
86
- /** Framework type (ui, css, backend, etc.) */
87
- type?: 'ui' | 'css' | 'backend' | 'fullstack';
88
- }
89
-
90
- /**
91
- * Language-specific framework signatures
92
- */
93
- const FRAMEWORK_SIGNATURES: Record<string, FrameworkSignature[]> = {
94
- typescript: [
95
- {
96
- name: 'react',
97
- files: ['src/App.tsx', 'src/App.jsx', 'public/index.html'],
98
- dependencies: ['react', 'react-dom'],
99
- weight: 0.8,
100
- type: 'ui',
101
- },
102
- {
103
- name: 'nextjs',
104
- files: ['next.config.js', 'pages/_app.tsx', 'pages/index.tsx'],
105
- dependencies: ['next'],
106
- weight: 0.9,
107
- type: 'fullstack',
108
- },
109
- {
110
- name: 'angular',
111
- files: ['angular.json', 'src/app/app.module.ts'],
112
- dependencies: ['@angular/core', '@angular/common'],
113
- weight: 0.9,
114
- type: 'ui',
115
- },
116
- {
117
- name: 'vue',
118
- files: ['src/App.vue', 'vue.config.js'],
119
- dependencies: ['vue'],
120
- weight: 0.8,
121
- type: 'ui',
122
- },
123
- {
124
- name: 'express',
125
- files: ['app.js', 'server.js'],
126
- dependencies: ['express'],
127
- weight: 0.7,
128
- type: 'backend',
129
- },
130
- ],
131
- php: [
132
- {
133
- name: 'laravel',
134
- files: ['artisan', 'composer.json'],
135
- directories: ['app/Http/Controllers', 'resources/views'],
136
- weight: 0.9,
137
- type: 'fullstack',
138
- },
139
- {
140
- name: 'symfony',
141
- files: ['symfony.lock', 'composer.json', 'config/bundles.php'],
142
- dependencies: ['symfony/symfony', 'symfony/framework-bundle'],
143
- weight: 0.9,
144
- type: 'fullstack',
145
- },
146
- {
147
- name: 'wordpress',
148
- files: ['wp-config.php', 'wp-content/themes'],
149
- directories: ['wp-admin', 'wp-content'],
150
- weight: 0.8,
151
- type: 'fullstack',
152
- },
153
- ],
154
- python: [
155
- {
156
- name: 'django',
157
- files: ['manage.py', 'settings.py'],
158
- directories: ['app/migrations'],
159
- dependencies: ['django'],
160
- weight: 0.9,
161
- type: 'fullstack',
162
- },
163
- {
164
- name: 'flask',
165
- files: ['app.py', 'wsgi.py'],
166
- dependencies: ['flask'],
167
- weight: 0.8,
168
- type: 'backend',
169
- },
170
- {
171
- name: 'fastapi',
172
- files: ['main.py'],
173
- dependencies: ['fastapi'],
174
- weight: 0.7,
175
- type: 'backend',
176
- },
177
- ],
178
- ruby: [
179
- {
180
- name: 'rails',
181
- files: ['Gemfile', 'config/routes.rb', 'app/controllers/application_controller.rb'],
182
- directories: ['app/models', 'app/controllers', 'app/views'],
183
- weight: 0.9,
184
- type: 'fullstack',
185
- },
186
- {
187
- name: 'sinatra',
188
- files: ['Gemfile', 'config.ru'],
189
- dependencies: ['sinatra'],
190
- weight: 0.8,
191
- type: 'backend',
192
- },
193
- ],
194
- dart: [
195
- {
196
- name: 'flutter',
197
- files: [
198
- 'pubspec.yaml',
199
- 'lib/main.dart',
200
- 'android/app/build.gradle',
201
- 'ios/Runner.xcodeproj/project.pbxproj',
202
- ],
203
- directories: ['lib', 'android', 'ios'],
204
- dependencies: ['flutter'],
205
- weight: 0.9,
206
- type: 'ui',
207
- },
208
- ],
209
- css: [
210
- {
211
- name: 'tailwind',
212
- files: ['tailwind.config.js', 'postcss.config.js'],
213
- dependencies: ['tailwindcss'],
214
- weight: 0.9,
215
- type: 'css',
216
- },
217
- {
218
- name: 'bootstrap',
219
- files: ['bootstrap.min.css', 'bootstrap.bundle.min.js'],
220
- dependencies: ['bootstrap'],
221
- weight: 0.8,
222
- type: 'css',
223
- },
224
- {
225
- name: 'material-ui',
226
- files: [],
227
- dependencies: ['@mui/material', '@material-ui/core'],
228
- weight: 0.8,
229
- type: 'css',
230
- },
231
- {
232
- name: 'styled-components',
233
- files: [],
234
- dependencies: ['styled-components'],
235
- weight: 0.7,
236
- type: 'css',
237
- },
238
- {
239
- name: 'emotion',
240
- files: [],
241
- dependencies: ['@emotion/react', '@emotion/styled'],
242
- weight: 0.7,
243
- type: 'css',
244
- },
245
- {
246
- name: 'chakra-ui',
247
- files: [],
248
- dependencies: ['@chakra-ui/react'],
249
- weight: 0.8,
250
- type: 'css',
251
- },
252
- {
253
- name: 'bulma',
254
- dependencies: ['bulma'],
255
- files: ['bulma.min.css'],
256
- weight: 0.7,
257
- type: 'css',
258
- },
259
- ],
260
- };
261
-
262
- /**
263
- * Detect frameworks used in a project
264
- * @param projectPath Path to project root directory
265
- * @returns Promise resolving to framework detection result
266
- */
267
- export async function detectFramework(
268
- projectPath: string,
269
- ): Promise<FrameworkDetectionResult | null> {
270
- try {
271
- logger.debug(`Detecting framework for project at ${projectPath}`);
272
-
273
- // First, detect the primary language
274
- const language = await detectPrimaryLanguage(projectPath);
275
- if (!language) {
276
- logger.debug('Could not detect primary language.');
277
- return null;
278
- }
279
-
280
- logger.debug(`Detected primary language: ${language}`);
281
-
282
- // Now detect the framework based on the language
283
- if (FRAMEWORK_SIGNATURES[language]) {
284
- const frameworkResult = await detectFrameworkForLanguage(projectPath, language);
285
- if (frameworkResult) {
286
- logger.debug(
287
- `Detected framework: ${frameworkResult.framework} with confidence ${frameworkResult.confidence.toFixed(2)}`,
288
- );
289
- if (
290
- frameworkResult.additionalFrameworks &&
291
- frameworkResult.additionalFrameworks.length > 0
292
- ) {
293
- logger.debug(
294
- `Additional frameworks detected: ${frameworkResult.additionalFrameworks.join(', ')}`,
295
- );
296
- }
297
- return frameworkResult;
298
- }
299
- }
300
-
301
- // If we couldn't detect a specific framework, return just the language
302
- logger.debug(`No specific framework detected for ${language}`);
303
- return {
304
- language,
305
- framework: 'none',
306
- confidence: 0.5,
307
- detectionMethod: 'language-only',
308
- };
309
- } catch (error) {
310
- logger.error(
311
- `Error detecting framework: ${error instanceof Error ? error.message : String(error)}`,
312
- );
313
- return null;
314
- }
315
- }
316
-
317
- /**
318
- * Detect the primary programming language used in a project
319
- * @param projectPath Path to project root directory
320
- * @returns Promise resolving to language name
321
- */
322
- export async function detectPrimaryLanguage(projectPath: string): Promise<string | null> {
323
- try {
324
- // Check for language-specific files
325
- const fileExtensionMap: Record<string, string[]> = {
326
- typescript: ['.ts', '.tsx'],
327
- javascript: ['.js', '.jsx'],
328
- php: ['.php'],
329
- python: ['.py'],
330
- ruby: ['.rb'],
331
- dart: ['.dart'],
332
- };
333
-
334
- // Count files by extension
335
- const extensionCounts: Record<string, number> = {};
336
-
337
- for (const [language, extensions] of Object.entries(fileExtensionMap)) {
338
- try {
339
- const count = await countFilesByExtension(projectPath, extensions);
340
- extensionCounts[language] = count;
341
- } catch (error) {
342
- logger.debug(`Error counting ${language} files: ${error}`);
343
- extensionCounts[language] = 0;
344
- }
345
- }
346
-
347
- // Find the language with the most files
348
- let maxCount = 0;
349
- let primaryLanguage: string | null = null;
350
-
351
- for (const [language, count] of Object.entries(extensionCounts)) {
352
- if (count > maxCount) {
353
- maxCount = count;
354
- primaryLanguage = language;
355
- }
356
- }
357
-
358
- // If TypeScript and JavaScript are close, prefer TypeScript
359
- if (
360
- primaryLanguage === 'javascript' &&
361
- extensionCounts.typescript > 0 &&
362
- extensionCounts.typescript >= extensionCounts.javascript * 0.5
363
- ) {
364
- primaryLanguage = 'typescript';
365
- }
366
-
367
- // Check for special cases: package.json (Node.js), composer.json (PHP), Gemfile (Ruby), requirements.txt (Python), pubspec.yaml (Dart/Flutter)
368
- try {
369
- const packageJsonExists = await fileExists(path.join(projectPath, 'package.json'));
370
- const composerJsonExists = await fileExists(path.join(projectPath, 'composer.json'));
371
- const gemfileExists = await fileExists(path.join(projectPath, 'Gemfile'));
372
- const requirementsTxtExists = await fileExists(path.join(projectPath, 'requirements.txt'));
373
- const pubspecYamlExists = await fileExists(path.join(projectPath, 'pubspec.yaml'));
374
-
375
- // IMPORTANT: Language detection priority:
376
- // 1. Strong file evidence for non-JS/TS languages (Python, PHP, Ruby) takes absolute priority
377
- // 2. For JS/TS projects, config files can influence the decision
378
- // 3. Package.json presence suggests Node.js ecosystem
379
-
380
- // If we have strong evidence for Python, PHP, Ruby, or Dart, respect it absolutely
381
- if (primaryLanguage === 'python' && extensionCounts.python > 3) {
382
- // Keep Python if we have clear Python files
383
- logger.debug(
384
- `Strong Python evidence (${extensionCounts.python} files), keeping Python despite package.json`,
385
- );
386
- } else if (primaryLanguage === 'php' && extensionCounts.php > 3) {
387
- // Keep PHP if we have clear PHP files
388
- logger.debug(`Strong PHP evidence (${extensionCounts.php} files), keeping PHP`);
389
- } else if (primaryLanguage === 'ruby' && extensionCounts.ruby > 3) {
390
- // Keep Ruby if we have clear Ruby files
391
- logger.debug(`Strong Ruby evidence (${extensionCounts.ruby} files), keeping Ruby`);
392
- } else if (primaryLanguage === 'dart' && extensionCounts.dart > 0) {
393
- // Keep Dart if we have any Dart files - Dart projects are usually pure Dart
394
- logger.debug(`Strong Dart evidence (${extensionCounts.dart} files), keeping Dart`);
395
- } else if (packageJsonExists) {
396
- // Handle Node.js projects (package.json present)
397
- if (
398
- primaryLanguage === null ||
399
- primaryLanguage === 'javascript' ||
400
- primaryLanguage === 'typescript'
401
- ) {
402
- // Check if this is a TypeScript-oriented project
403
- const isTypescriptProject = await isTypeScriptProject(projectPath);
404
-
405
- if (isTypescriptProject || extensionCounts.typescript > 0) {
406
- primaryLanguage = 'typescript';
407
- } else if (extensionCounts.javascript > 0 || extensionCounts.typescript === 0) {
408
- // For backward compatibility with tests, default to TypeScript for Node.js projects
409
- // This maintains the existing behavior while fixing Python detection
410
- primaryLanguage = 'typescript';
411
- }
412
- }
413
- // If primaryLanguage is Python/PHP/Ruby with few files, package.json might be for tooling
414
- } else if (composerJsonExists && (primaryLanguage === null || extensionCounts.php > 0)) {
415
- primaryLanguage = 'php';
416
- } else if (gemfileExists && (primaryLanguage === null || extensionCounts.ruby > 0)) {
417
- primaryLanguage = 'ruby';
418
- } else if (
419
- requirementsTxtExists &&
420
- (primaryLanguage === null || extensionCounts.python > 0)
421
- ) {
422
- primaryLanguage = 'python';
423
- } else if (pubspecYamlExists && (primaryLanguage === null || extensionCounts.dart > 0)) {
424
- primaryLanguage = 'dart';
425
- }
426
-
427
- // Additional Python detection for projects with Python files but no requirements.txt
428
- if (primaryLanguage === null && extensionCounts.python > 0) {
429
- primaryLanguage = 'python';
430
- }
431
-
432
- // Additional Dart detection for projects with Dart files but no pubspec.yaml
433
- if (primaryLanguage === null && extensionCounts.dart > 0) {
434
- primaryLanguage = 'dart';
435
- }
436
- } catch (error) {
437
- logger.debug(`Error checking for special files: ${error}`);
438
- }
439
-
440
- return primaryLanguage;
441
- } catch (error) {
442
- logger.error(
443
- `Error detecting primary language: ${error instanceof Error ? error.message : String(error)}`,
444
- );
445
- return null;
446
- }
447
- }
448
-
449
- /**
450
- * Detect frameworks for a specific language
451
- * @param projectPath Path to project root directory
452
- * @param language Language to detect frameworks for
453
- * @returns Promise resolving to framework detection result
454
- */
455
- async function detectFrameworkForLanguage(
456
- projectPath: string,
457
- language: string,
458
- ): Promise<FrameworkDetectionResult | null> {
459
- try {
460
- const signatures = FRAMEWORK_SIGNATURES[language] || [];
461
- const scores: Record<string, number> = {};
462
- const detectionMethods: Record<string, string[]> = {};
463
-
464
- // Get all dependencies for this project
465
- const dependencies = await getDependencies(projectPath, language);
466
-
467
- // Detect CSS frameworks
468
- const cssFrameworks = await detectCssFrameworks(projectPath, dependencies);
469
-
470
- // Store framework versions
471
- let frameworkVersion: string | undefined;
472
- let frameworkType: string | undefined;
473
-
474
- // Check for each framework signature
475
- for (const signature of signatures) {
476
- let score = 0;
477
- const methods: string[] = [];
478
-
479
- // Check for files
480
- for (const file of signature.files) {
481
- if (await fileExists(path.join(projectPath, file))) {
482
- score += signature.weight;
483
- methods.push(`found file: ${file}`);
484
- }
485
- }
486
-
487
- // Check for directories
488
- if (signature.directories) {
489
- for (const dir of signature.directories) {
490
- if (await directoryExists(path.join(projectPath, dir))) {
491
- score += signature.weight * 0.8;
492
- methods.push(`found directory: ${dir}`);
493
- }
494
- }
495
- }
496
-
497
- // Check for dependencies
498
- if (signature.dependencies) {
499
- for (const dep of signature.dependencies) {
500
- if (dependencies[dep]) {
501
- score += signature.weight * 0.9;
502
- methods.push(`found dependency: ${dep}`);
503
-
504
- // Store version of the main dependency
505
- if (!frameworkVersion) {
506
- frameworkVersion = dependencies[dep];
507
- }
508
- }
509
- }
510
- }
511
-
512
- scores[signature.name] = score;
513
- detectionMethods[signature.name] = methods;
514
-
515
- // Store the framework type if this signature has a high score
516
- if (score > 0.7 && signature.type) {
517
- frameworkType = signature.type;
518
- }
519
- }
520
-
521
- // Find the framework with the highest score
522
- let maxScore = 0;
523
- let detectedFramework: string | null = null;
524
-
525
- for (const [framework, score] of Object.entries(scores)) {
526
- if (score > maxScore) {
527
- maxScore = score;
528
- detectedFramework = framework;
529
- }
530
- }
531
-
532
- // Calculate additional frameworks
533
- const additionalFrameworks: string[] = [];
534
- for (const [framework, score] of Object.entries(scores)) {
535
- if (framework !== detectedFramework && score > 0.5) {
536
- additionalFrameworks.push(framework);
537
- }
538
- }
539
-
540
- // If a framework was detected, return it
541
- if (detectedFramework) {
542
- return {
543
- language,
544
- framework: detectedFramework,
545
- confidence: Math.min(maxScore, 1),
546
- detectionMethod: detectionMethods[detectedFramework].join(', '),
547
- additionalFrameworks: additionalFrameworks.length > 0 ? additionalFrameworks : undefined,
548
- cssFrameworks: cssFrameworks.length > 0 ? cssFrameworks : undefined,
549
- frameworkVersion: frameworkVersion,
550
- frameworkType: frameworkType,
551
- };
552
- }
553
-
554
- // If no framework was detected but we have CSS frameworks, return language with CSS frameworks
555
- if (cssFrameworks.length > 0) {
556
- return {
557
- language,
558
- framework: 'none',
559
- confidence: 0.5,
560
- detectionMethod: 'css-frameworks-only',
561
- cssFrameworks: cssFrameworks,
562
- };
563
- }
564
-
565
- return null;
566
- } catch (error) {
567
- logger.error(
568
- `Error detecting framework for ${language}: ${error instanceof Error ? error.message : String(error)}`,
569
- );
570
- return null;
571
- }
572
- }
573
-
574
- /**
575
- * Check if a file exists
576
- * @param filePath Path to file
577
- * @returns Promise resolving to boolean
578
- */
579
- async function fileExists(filePath: string): Promise<boolean> {
580
- try {
581
- await fs.access(filePath);
582
- return true;
583
- } catch (_error) {
584
- return false;
585
- }
586
- }
587
-
588
- /**
589
- * Check if a directory exists
590
- * @param dirPath Path to directory
591
- * @returns Promise resolving to boolean
592
- */
593
- async function directoryExists(dirPath: string): Promise<boolean> {
594
- try {
595
- const stats = await fs.stat(dirPath);
596
- return stats.isDirectory();
597
- } catch (_error) {
598
- return false;
599
- }
600
- }
601
-
602
- /**
603
- * Check if a Node.js project should be considered a TypeScript project
604
- * @param projectPath Path to project root
605
- * @returns Promise resolving to boolean
606
- */
607
- async function isTypeScriptProject(projectPath: string): Promise<boolean> {
608
- try {
609
- // Check for TypeScript config files
610
- const tsconfigExists = await fileExists(path.join(projectPath, 'tsconfig.json'));
611
- if (tsconfigExists) {
612
- return true;
613
- }
614
-
615
- // Check package.json for TypeScript dependencies
616
- const packageJsonPath = path.join(projectPath, 'package.json');
617
- if (await fileExists(packageJsonPath)) {
618
- const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));
619
-
620
- // Check for TypeScript in dependencies or devDependencies
621
- const allDeps = {
622
- ...packageJson.dependencies,
623
- ...packageJson.devDependencies,
624
- };
625
-
626
- // Look for TypeScript-specific packages
627
- const typescriptIndicators = [
628
- 'typescript',
629
- '@types/node',
630
- 'ts-node',
631
- '@typescript-eslint/parser',
632
- '@typescript-eslint/eslint-plugin',
633
- ];
634
-
635
- return typescriptIndicators.some((indicator) => allDeps[indicator]);
636
- }
637
-
638
- return false;
639
- } catch (error) {
640
- logger.debug(`Error checking if TypeScript project: ${error}`);
641
- return false;
642
- }
643
- }
644
-
645
- /**
646
- * Get dependencies for a project
647
- * @param projectPath Path to project
648
- * @param language Language to get dependencies for
649
- * @returns Promise resolving to dependency map with versions
650
- */
651
- async function getDependencies(
652
- projectPath: string,
653
- language: string,
654
- ): Promise<Record<string, string>> {
655
- const dependencies: Record<string, string> = {};
656
-
657
- try {
658
- if (language === 'typescript' || language === 'javascript') {
659
- // Parse package.json
660
- const packageJsonPath = path.join(projectPath, 'package.json');
661
- if (await fileExists(packageJsonPath)) {
662
- const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));
663
-
664
- // Add both dependencies and devDependencies
665
- if (packageJson.dependencies) {
666
- Object.assign(dependencies, packageJson.dependencies);
667
- }
668
- if (packageJson.devDependencies) {
669
- Object.assign(dependencies, packageJson.devDependencies);
670
- }
671
- }
672
- } else if (language === 'php') {
673
- // Parse composer.json
674
- const composerJsonPath = path.join(projectPath, 'composer.json');
675
- if (await fileExists(composerJsonPath)) {
676
- const composerJson = JSON.parse(await fs.readFile(composerJsonPath, 'utf-8'));
677
-
678
- if (composerJson.require) {
679
- Object.assign(dependencies, composerJson.require);
680
- }
681
- if (composerJson['require-dev']) {
682
- Object.assign(dependencies, composerJson['require-dev']);
683
- }
684
- }
685
- } else if (language === 'ruby') {
686
- // Parse Gemfile
687
- const gemfilePath = path.join(projectPath, 'Gemfile');
688
- if (await fileExists(gemfilePath)) {
689
- const gemfile = await fs.readFile(gemfilePath, 'utf-8');
690
-
691
- // Simple regex to extract gem names
692
- const gemRegex = /gem\s+['"]([^'"]+)['"](?:,\s*['"]([^'"]+)['"])?/g;
693
- let match;
694
- while ((match = gemRegex.exec(gemfile)) !== null) {
695
- dependencies[match[1]] = match[2] || '*';
696
- }
697
- }
698
- } else if (language === 'python') {
699
- // Parse requirements.txt
700
- const requirementsPath = path.join(projectPath, 'requirements.txt');
701
- if (await fileExists(requirementsPath)) {
702
- const requirements = await fs.readFile(requirementsPath, 'utf-8');
703
-
704
- // Parse each line
705
- for (const line of requirements.split('\n')) {
706
- const trimmedLine = line.trim();
707
- if (trimmedLine && !trimmedLine.startsWith('#')) {
708
- // Extract package name and version
709
- const parts = trimmedLine.split(/([=<>!~]=?)/);
710
- if (parts.length >= 1) {
711
- const packageName = parts[0].trim().toLowerCase();
712
- const version = parts.length >= 3 ? parts[1] + parts[2] : '*';
713
- if (packageName) {
714
- dependencies[packageName] = version;
715
- }
716
- }
717
- }
718
- }
719
- }
720
- } else if (language === 'dart') {
721
- // Parse pubspec.yaml
722
- const pubspecPath = path.join(projectPath, 'pubspec.yaml');
723
- if (await fileExists(pubspecPath)) {
724
- const pubspecContent = await fs.readFile(pubspecPath, 'utf-8');
725
-
726
- // Simple YAML parsing for dependencies
727
- const lines = pubspecContent.split('\n');
728
- let inDependencies = false;
729
- let inDevDependencies = false;
730
-
731
- for (const line of lines) {
732
- const trimmedLine = line.trim();
733
-
734
- // Check for dependencies sections
735
- if (trimmedLine === 'dependencies:') {
736
- inDependencies = true;
737
- inDevDependencies = false;
738
- continue;
739
- }
740
- if (trimmedLine === 'dev_dependencies:') {
741
- inDependencies = false;
742
- inDevDependencies = true;
743
- continue;
744
- }
745
- if (trimmedLine.endsWith(':') && !trimmedLine.startsWith(' ')) {
746
- // New top-level section
747
- inDependencies = false;
748
- inDevDependencies = false;
749
- continue;
750
- }
751
-
752
- // Parse dependency lines
753
- if (
754
- (inDependencies || inDevDependencies) &&
755
- trimmedLine &&
756
- !trimmedLine.startsWith('#')
757
- ) {
758
- // Handle different dependency formats:
759
- // package_name: ^1.0.0
760
- // package_name:
761
- // sdk: flutter
762
- const colonIndex = trimmedLine.indexOf(':');
763
- if (colonIndex > 0) {
764
- const packageName = trimmedLine.substring(0, colonIndex).trim();
765
- const versionPart = trimmedLine.substring(colonIndex + 1).trim();
766
-
767
- // Skip SDK dependencies and empty values
768
- if (packageName && !versionPart.startsWith('sdk:') && packageName !== 'sdk') {
769
- const version = versionPart || '*';
770
- dependencies[packageName] = version;
771
- }
772
- }
773
- }
774
- }
775
- }
776
- }
777
- } catch (error) {
778
- logger.warn(
779
- `Error getting dependencies: ${error instanceof Error ? error.message : String(error)}`,
780
- );
781
- }
782
-
783
- return dependencies;
784
- }
785
-
786
- /**
787
- * Detect CSS frameworks used in a project
788
- * @param projectPath Path to project root directory
789
- * @param dependencies Dependencies map
790
- * @returns Promise resolving to CSS frameworks detection results
791
- */
792
- async function detectCssFrameworks(
793
- projectPath: string,
794
- dependencies: Record<string, string>,
795
- ): Promise<{ name: string; version?: string; confidence: number }[]> {
796
- const cssFrameworks: { name: string; version?: string; confidence: number }[] = [];
797
-
798
- try {
799
- // Check for CSS frameworks based on FRAMEWORK_SIGNATURES
800
- if (FRAMEWORK_SIGNATURES.css) {
801
- for (const signature of FRAMEWORK_SIGNATURES.css) {
802
- let score = 0;
803
- let foundDependency = false;
804
- let version: string | undefined;
805
-
806
- // Check for dependencies
807
- if (signature.dependencies) {
808
- for (const dep of signature.dependencies) {
809
- if (dependencies[dep]) {
810
- score += signature.weight * 0.9;
811
- foundDependency = true;
812
- version = dependencies[dep];
813
- break;
814
- }
815
- }
816
- }
817
-
818
- // Check for files
819
- if (signature.files) {
820
- for (const file of signature.files) {
821
- if (await fileExists(path.join(projectPath, file))) {
822
- score += signature.weight * 0.8;
823
- break;
824
- }
825
- }
826
- }
827
-
828
- // If we have a score, add it to the list
829
- if (score > 0.5) {
830
- cssFrameworks.push({
831
- name: signature.name,
832
- version: foundDependency ? version : undefined,
833
- confidence: Math.min(score, 1),
834
- });
835
- }
836
- }
837
- }
838
-
839
- // Look for specific CSS files in common locations
840
- const cssDirs = ['src/styles', 'src/css', 'public/css', 'assets/css', 'styles', 'css'];
841
-
842
- for (const dir of cssDirs) {
843
- const fullPath = path.join(projectPath, dir);
844
- if (await directoryExists(fullPath)) {
845
- try {
846
- const files = await fs.readdir(fullPath);
847
-
848
- // Look for common CSS framework files
849
- for (const file of files) {
850
- const lowerFile = file.toLowerCase();
851
-
852
- if (lowerFile.includes('bootstrap') && lowerFile.endsWith('.css')) {
853
- if (!cssFrameworks.some((f) => f.name === 'bootstrap')) {
854
- cssFrameworks.push({ name: 'bootstrap', confidence: 0.7 });
855
- }
856
- } else if (lowerFile.includes('bulma') && lowerFile.endsWith('.css')) {
857
- if (!cssFrameworks.some((f) => f.name === 'bulma')) {
858
- cssFrameworks.push({ name: 'bulma', confidence: 0.7 });
859
- }
860
- } else if (lowerFile.includes('tailwind') && lowerFile.endsWith('.css')) {
861
- if (!cssFrameworks.some((f) => f.name === 'tailwind')) {
862
- cssFrameworks.push({ name: 'tailwind', confidence: 0.7 });
863
- }
864
- }
865
- }
866
- } catch (_error) {
867
- // Ignore directory read errors
868
- }
869
- }
870
- }
871
-
872
- return cssFrameworks;
873
- } catch (error) {
874
- logger.warn(
875
- `Error detecting CSS frameworks: ${error instanceof Error ? error.message : String(error)}`,
876
- );
877
- return [];
878
- }
879
- }