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