@flaid/devmap 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.
- package/LICENSE +21 -0
- package/README.md +168 -0
- package/dist/ai/completion.d.ts +7 -0
- package/dist/ai/completion.d.ts.map +1 -0
- package/dist/ai/completion.js +27 -0
- package/dist/ai/completion.js.map +1 -0
- package/dist/ai/contextBuilder.d.ts +42 -0
- package/dist/ai/contextBuilder.d.ts.map +1 -0
- package/dist/ai/contextBuilder.js +632 -0
- package/dist/ai/contextBuilder.js.map +1 -0
- package/dist/ai/groq.d.ts +36 -0
- package/dist/ai/groq.d.ts.map +1 -0
- package/dist/ai/groq.js +368 -0
- package/dist/ai/groq.js.map +1 -0
- package/dist/ai/openrouter.d.ts +20 -0
- package/dist/ai/openrouter.d.ts.map +1 -0
- package/dist/ai/openrouter.js +187 -0
- package/dist/ai/openrouter.js.map +1 -0
- package/dist/ai/prompts.d.ts +7 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +88 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/provider.d.ts +15 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +28 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/snapshotEnrichment.d.ts +4 -0
- package/dist/ai/snapshotEnrichment.d.ts.map +1 -0
- package/dist/ai/snapshotEnrichment.js +188 -0
- package/dist/ai/snapshotEnrichment.js.map +1 -0
- package/dist/ai/types.d.ts +29 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/analyzers/analysis/extractors/fallbackExtractor.d.ts +30 -0
- package/dist/analyzers/analysis/extractors/fallbackExtractor.d.ts.map +1 -0
- package/dist/analyzers/analysis/extractors/fallbackExtractor.js +114 -0
- package/dist/analyzers/analysis/extractors/fallbackExtractor.js.map +1 -0
- package/dist/analyzers/analysis/extractors/index.d.ts +16 -0
- package/dist/analyzers/analysis/extractors/index.d.ts.map +1 -0
- package/dist/analyzers/analysis/extractors/index.js +135 -0
- package/dist/analyzers/analysis/extractors/index.js.map +1 -0
- package/dist/analyzers/analysis/extractors/prismaExtractor.d.ts +15 -0
- package/dist/analyzers/analysis/extractors/prismaExtractor.d.ts.map +1 -0
- package/dist/analyzers/analysis/extractors/prismaExtractor.js +183 -0
- package/dist/analyzers/analysis/extractors/prismaExtractor.js.map +1 -0
- package/dist/analyzers/analysis/extractors/sqlExtractor.d.ts +14 -0
- package/dist/analyzers/analysis/extractors/sqlExtractor.d.ts.map +1 -0
- package/dist/analyzers/analysis/extractors/sqlExtractor.js +163 -0
- package/dist/analyzers/analysis/extractors/sqlExtractor.js.map +1 -0
- package/dist/analyzers/analysis/extractors/types.d.ts +76 -0
- package/dist/analyzers/analysis/extractors/types.d.ts.map +1 -0
- package/dist/analyzers/analysis/extractors/types.js +2 -0
- package/dist/analyzers/analysis/extractors/types.js.map +1 -0
- package/dist/analyzers/analysis/fileAnalysis.d.ts +36 -0
- package/dist/analyzers/analysis/fileAnalysis.d.ts.map +1 -0
- package/dist/analyzers/analysis/fileAnalysis.js +2 -0
- package/dist/analyzers/analysis/fileAnalysis.js.map +1 -0
- package/dist/analyzers/analysis/fileRole.d.ts +30 -0
- package/dist/analyzers/analysis/fileRole.d.ts.map +1 -0
- package/dist/analyzers/analysis/fileRole.js +242 -0
- package/dist/analyzers/analysis/fileRole.js.map +1 -0
- package/dist/analyzers/analysis/fileScanner.d.ts +10 -0
- package/dist/analyzers/analysis/fileScanner.d.ts.map +1 -0
- package/dist/analyzers/analysis/fileScanner.js +44 -0
- package/dist/analyzers/analysis/fileScanner.js.map +1 -0
- package/dist/analyzers/analysis/filterEngine.d.ts +2 -0
- package/dist/analyzers/analysis/filterEngine.d.ts.map +1 -0
- package/dist/analyzers/analysis/filterEngine.js +110 -0
- package/dist/analyzers/analysis/filterEngine.js.map +1 -0
- package/dist/analyzers/analysis/index.d.ts +12 -0
- package/dist/analyzers/analysis/index.d.ts.map +1 -0
- package/dist/analyzers/analysis/index.js +8 -0
- package/dist/analyzers/analysis/index.js.map +1 -0
- package/dist/analyzers/analysis/preprocessors/astroPreprocessor.d.ts +23 -0
- package/dist/analyzers/analysis/preprocessors/astroPreprocessor.d.ts.map +1 -0
- package/dist/analyzers/analysis/preprocessors/astroPreprocessor.js +40 -0
- package/dist/analyzers/analysis/preprocessors/astroPreprocessor.js.map +1 -0
- package/dist/analyzers/analysis/preprocessors/index.d.ts +5 -0
- package/dist/analyzers/analysis/preprocessors/index.d.ts.map +1 -0
- package/dist/analyzers/analysis/preprocessors/index.js +4 -0
- package/dist/analyzers/analysis/preprocessors/index.js.map +1 -0
- package/dist/analyzers/analysis/preprocessors/sveltePreprocessor.d.ts +27 -0
- package/dist/analyzers/analysis/preprocessors/sveltePreprocessor.d.ts.map +1 -0
- package/dist/analyzers/analysis/preprocessors/sveltePreprocessor.js +50 -0
- package/dist/analyzers/analysis/preprocessors/sveltePreprocessor.js.map +1 -0
- package/dist/analyzers/analysis/preprocessors/types.d.ts +45 -0
- package/dist/analyzers/analysis/preprocessors/types.d.ts.map +1 -0
- package/dist/analyzers/analysis/preprocessors/types.js +2 -0
- package/dist/analyzers/analysis/preprocessors/types.js.map +1 -0
- package/dist/analyzers/analysis/preprocessors/vuePreprocessor.d.ts +21 -0
- package/dist/analyzers/analysis/preprocessors/vuePreprocessor.d.ts.map +1 -0
- package/dist/analyzers/analysis/preprocessors/vuePreprocessor.js +44 -0
- package/dist/analyzers/analysis/preprocessors/vuePreprocessor.js.map +1 -0
- package/dist/analyzers/analysis/tsMorphAnalyzer.d.ts +10 -0
- package/dist/analyzers/analysis/tsMorphAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/analysis/tsMorphAnalyzer.js +190 -0
- package/dist/analyzers/analysis/tsMorphAnalyzer.js.map +1 -0
- package/dist/analyzers/detectors/capabilityDetector.d.ts +28 -0
- package/dist/analyzers/detectors/capabilityDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/capabilityDetector.js +288 -0
- package/dist/analyzers/detectors/capabilityDetector.js.map +1 -0
- package/dist/analyzers/detectors/databaseDetector.d.ts +7 -0
- package/dist/analyzers/detectors/databaseDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/databaseDetector.js +71 -0
- package/dist/analyzers/detectors/databaseDetector.js.map +1 -0
- package/dist/analyzers/detectors/frameworkDetector.d.ts +22 -0
- package/dist/analyzers/detectors/frameworkDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/frameworkDetector.js +160 -0
- package/dist/analyzers/detectors/frameworkDetector.js.map +1 -0
- package/dist/analyzers/detectors/frontendFeatureDetector.d.ts +26 -0
- package/dist/analyzers/detectors/frontendFeatureDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/frontendFeatureDetector.js +269 -0
- package/dist/analyzers/detectors/frontendFeatureDetector.js.map +1 -0
- package/dist/analyzers/detectors/index.d.ts +11 -0
- package/dist/analyzers/detectors/index.d.ts.map +1 -0
- package/dist/analyzers/detectors/index.js +7 -0
- package/dist/analyzers/detectors/index.js.map +1 -0
- package/dist/analyzers/detectors/nestRouteDetector.d.ts +13 -0
- package/dist/analyzers/detectors/nestRouteDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/nestRouteDetector.js +69 -0
- package/dist/analyzers/detectors/nestRouteDetector.js.map +1 -0
- package/dist/analyzers/detectors/routeDetector.d.ts +22 -0
- package/dist/analyzers/detectors/routeDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/routeDetector.js +368 -0
- package/dist/analyzers/detectors/routeDetector.js.map +1 -0
- package/dist/analyzers/detectors/serviceDetector.d.ts +3 -0
- package/dist/analyzers/detectors/serviceDetector.d.ts.map +1 -0
- package/dist/analyzers/detectors/serviceDetector.js +81 -0
- package/dist/analyzers/detectors/serviceDetector.js.map +1 -0
- package/dist/analyzers/features/featureDetector.d.ts +22 -0
- package/dist/analyzers/features/featureDetector.d.ts.map +1 -0
- package/dist/analyzers/features/featureDetector.js +821 -0
- package/dist/analyzers/features/featureDetector.js.map +1 -0
- package/dist/analyzers/features/featureMerge.d.ts +65 -0
- package/dist/analyzers/features/featureMerge.d.ts.map +1 -0
- package/dist/analyzers/features/featureMerge.js +168 -0
- package/dist/analyzers/features/featureMerge.js.map +1 -0
- package/dist/analyzers/features/featureSimilarity.d.ts +152 -0
- package/dist/analyzers/features/featureSimilarity.d.ts.map +1 -0
- package/dist/analyzers/features/featureSimilarity.js +264 -0
- package/dist/analyzers/features/featureSimilarity.js.map +1 -0
- package/dist/analyzers/features/index.d.ts +6 -0
- package/dist/analyzers/features/index.d.ts.map +1 -0
- package/dist/analyzers/features/index.js +4 -0
- package/dist/analyzers/features/index.js.map +1 -0
- package/dist/analyzers/graph/dependencyGraph.d.ts +5 -0
- package/dist/analyzers/graph/dependencyGraph.d.ts.map +1 -0
- package/dist/analyzers/graph/dependencyGraph.js +88 -0
- package/dist/analyzers/graph/dependencyGraph.js.map +1 -0
- package/dist/analyzers/graph/dependencyMap.d.ts +43 -0
- package/dist/analyzers/graph/dependencyMap.d.ts.map +1 -0
- package/dist/analyzers/graph/dependencyMap.js +85 -0
- package/dist/analyzers/graph/dependencyMap.js.map +1 -0
- package/dist/analyzers/graph/entryPoints.d.ts +3 -0
- package/dist/analyzers/graph/entryPoints.d.ts.map +1 -0
- package/dist/analyzers/graph/entryPoints.js +21 -0
- package/dist/analyzers/graph/entryPoints.js.map +1 -0
- package/dist/analyzers/graph/index.d.ts +7 -0
- package/dist/analyzers/graph/index.d.ts.map +1 -0
- package/dist/analyzers/graph/index.js +5 -0
- package/dist/analyzers/graph/index.js.map +1 -0
- package/dist/analyzers/graph/sourceScope.d.ts +2 -0
- package/dist/analyzers/graph/sourceScope.d.ts.map +1 -0
- package/dist/analyzers/graph/sourceScope.js +30 -0
- package/dist/analyzers/graph/sourceScope.js.map +1 -0
- package/dist/analyzers/inference/domainInference.d.ts +58 -0
- package/dist/analyzers/inference/domainInference.d.ts.map +1 -0
- package/dist/analyzers/inference/domainInference.js +234 -0
- package/dist/analyzers/inference/domainInference.js.map +1 -0
- package/dist/analyzers/inference/index.d.ts +5 -0
- package/dist/analyzers/inference/index.d.ts.map +1 -0
- package/dist/analyzers/inference/index.js +3 -0
- package/dist/analyzers/inference/index.js.map +1 -0
- package/dist/analyzers/inference/ownershipTopology.d.ts +8 -0
- package/dist/analyzers/inference/ownershipTopology.d.ts.map +1 -0
- package/dist/analyzers/inference/ownershipTopology.js +65 -0
- package/dist/analyzers/inference/ownershipTopology.js.map +1 -0
- package/dist/analyzers/pipeline/analyzerRegistry.d.ts +9 -0
- package/dist/analyzers/pipeline/analyzerRegistry.d.ts.map +1 -0
- package/dist/analyzers/pipeline/analyzerRegistry.js +35 -0
- package/dist/analyzers/pipeline/analyzerRegistry.js.map +1 -0
- package/dist/analyzers/pipeline/heuristicAnalyzer.d.ts +12 -0
- package/dist/analyzers/pipeline/heuristicAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/pipeline/heuristicAnalyzer.js +150 -0
- package/dist/analyzers/pipeline/heuristicAnalyzer.js.map +1 -0
- package/dist/analyzers/pipeline/index.d.ts +7 -0
- package/dist/analyzers/pipeline/index.d.ts.map +1 -0
- package/dist/analyzers/pipeline/index.js +5 -0
- package/dist/analyzers/pipeline/index.js.map +1 -0
- package/dist/analyzers/pipeline/projectMap.d.ts +120 -0
- package/dist/analyzers/pipeline/projectMap.d.ts.map +1 -0
- package/dist/analyzers/pipeline/projectMap.js +726 -0
- package/dist/analyzers/pipeline/projectMap.js.map +1 -0
- package/dist/analyzers/pipeline/projectMetadata.d.ts +19 -0
- package/dist/analyzers/pipeline/projectMetadata.d.ts.map +1 -0
- package/dist/analyzers/pipeline/projectMetadata.js +149 -0
- package/dist/analyzers/pipeline/projectMetadata.js.map +1 -0
- package/dist/analyzers/pipeline/reasonTags.d.ts +6 -0
- package/dist/analyzers/pipeline/reasonTags.d.ts.map +1 -0
- package/dist/analyzers/pipeline/reasonTags.js +6 -0
- package/dist/analyzers/pipeline/reasonTags.js.map +1 -0
- package/dist/analyzers/registry/ai-providers.d.ts +3 -0
- package/dist/analyzers/registry/ai-providers.d.ts.map +1 -0
- package/dist/analyzers/registry/ai-providers.js +94 -0
- package/dist/analyzers/registry/ai-providers.js.map +1 -0
- package/dist/analyzers/registry/analytics.d.ts +3 -0
- package/dist/analyzers/registry/analytics.d.ts.map +1 -0
- package/dist/analyzers/registry/analytics.js +15 -0
- package/dist/analyzers/registry/analytics.js.map +1 -0
- package/dist/analyzers/registry/auth.d.ts +3 -0
- package/dist/analyzers/registry/auth.d.ts.map +1 -0
- package/dist/analyzers/registry/auth.js +18 -0
- package/dist/analyzers/registry/auth.js.map +1 -0
- package/dist/analyzers/registry/background-jobs.d.ts +3 -0
- package/dist/analyzers/registry/background-jobs.d.ts.map +1 -0
- package/dist/analyzers/registry/background-jobs.js +14 -0
- package/dist/analyzers/registry/background-jobs.js.map +1 -0
- package/dist/analyzers/registry/caching.d.ts +3 -0
- package/dist/analyzers/registry/caching.d.ts.map +1 -0
- package/dist/analyzers/registry/caching.js +13 -0
- package/dist/analyzers/registry/caching.js.map +1 -0
- package/dist/analyzers/registry/cms-content.d.ts +3 -0
- package/dist/analyzers/registry/cms-content.d.ts.map +1 -0
- package/dist/analyzers/registry/cms-content.js +15 -0
- package/dist/analyzers/registry/cms-content.js.map +1 -0
- package/dist/analyzers/registry/database.d.ts +3 -0
- package/dist/analyzers/registry/database.d.ts.map +1 -0
- package/dist/analyzers/registry/database.js +13 -0
- package/dist/analyzers/registry/database.js.map +1 -0
- package/dist/analyzers/registry/email.d.ts +3 -0
- package/dist/analyzers/registry/email.d.ts.map +1 -0
- package/dist/analyzers/registry/email.js +19 -0
- package/dist/analyzers/registry/email.js.map +1 -0
- package/dist/analyzers/registry/file-upload.d.ts +3 -0
- package/dist/analyzers/registry/file-upload.d.ts.map +1 -0
- package/dist/analyzers/registry/file-upload.js +19 -0
- package/dist/analyzers/registry/file-upload.js.map +1 -0
- package/dist/analyzers/registry/firebase.d.ts +3 -0
- package/dist/analyzers/registry/firebase.d.ts.map +1 -0
- package/dist/analyzers/registry/firebase.js +8 -0
- package/dist/analyzers/registry/firebase.js.map +1 -0
- package/dist/analyzers/registry/index.d.ts +16 -0
- package/dist/analyzers/registry/index.d.ts.map +1 -0
- package/dist/analyzers/registry/index.js +88 -0
- package/dist/analyzers/registry/index.js.map +1 -0
- package/dist/analyzers/registry/internationalization.d.ts +3 -0
- package/dist/analyzers/registry/internationalization.d.ts.map +1 -0
- package/dist/analyzers/registry/internationalization.js +13 -0
- package/dist/analyzers/registry/internationalization.js.map +1 -0
- package/dist/analyzers/registry/logging-monitoring.d.ts +3 -0
- package/dist/analyzers/registry/logging-monitoring.d.ts.map +1 -0
- package/dist/analyzers/registry/logging-monitoring.js +14 -0
- package/dist/analyzers/registry/logging-monitoring.js.map +1 -0
- package/dist/analyzers/registry/notifications.d.ts +3 -0
- package/dist/analyzers/registry/notifications.d.ts.map +1 -0
- package/dist/analyzers/registry/notifications.js +14 -0
- package/dist/analyzers/registry/notifications.js.map +1 -0
- package/dist/analyzers/registry/payments.d.ts +3 -0
- package/dist/analyzers/registry/payments.d.ts.map +1 -0
- package/dist/analyzers/registry/payments.js +23 -0
- package/dist/analyzers/registry/payments.js.map +1 -0
- package/dist/analyzers/registry/rate-limiting.d.ts +3 -0
- package/dist/analyzers/registry/rate-limiting.d.ts.map +1 -0
- package/dist/analyzers/registry/rate-limiting.js +13 -0
- package/dist/analyzers/registry/rate-limiting.js.map +1 -0
- package/dist/analyzers/registry/search.d.ts +3 -0
- package/dist/analyzers/registry/search.d.ts.map +1 -0
- package/dist/analyzers/registry/search.js +15 -0
- package/dist/analyzers/registry/search.js.map +1 -0
- package/dist/analyzers/registry/testing.d.ts +3 -0
- package/dist/analyzers/registry/testing.d.ts.map +1 -0
- package/dist/analyzers/registry/testing.js +13 -0
- package/dist/analyzers/registry/testing.js.map +1 -0
- package/dist/analyzers/registry/types.d.ts +14 -0
- package/dist/analyzers/registry/types.d.ts.map +1 -0
- package/dist/analyzers/registry/types.js +2 -0
- package/dist/analyzers/registry/types.js.map +1 -0
- package/dist/cache/agentNavigation.d.ts +7 -0
- package/dist/cache/agentNavigation.d.ts.map +1 -0
- package/dist/cache/agentNavigation.js +253 -0
- package/dist/cache/agentNavigation.js.map +1 -0
- package/dist/cache/fileHash.d.ts +2 -0
- package/dist/cache/fileHash.d.ts.map +1 -0
- package/dist/cache/fileHash.js +5 -0
- package/dist/cache/fileHash.js.map +1 -0
- package/dist/cache/snapshot.d.ts +20 -0
- package/dist/cache/snapshot.d.ts.map +1 -0
- package/dist/cache/snapshot.js +184 -0
- package/dist/cache/snapshot.js.map +1 -0
- package/dist/commands/analyze.d.ts +12 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +201 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +65 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +141 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explain.d.ts +37 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +101 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/flow.d.ts +34 -0
- package/dist/commands/flow.d.ts.map +1 -0
- package/dist/commands/flow.js +151 -0
- package/dist/commands/flow.js.map +1 -0
- package/dist/commands/init.d.ts +16 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +197 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/map.d.ts +24 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +282 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/onboarding.d.ts +36 -0
- package/dist/commands/onboarding.d.ts.map +1 -0
- package/dist/commands/onboarding.js +226 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +104 -0
- package/dist/index.js.map +1 -0
- package/dist/onboarding/model.d.ts +27 -0
- package/dist/onboarding/model.d.ts.map +1 -0
- package/dist/onboarding/model.js +2 -0
- package/dist/onboarding/model.js.map +1 -0
- package/dist/onboarding/modelBuilder.d.ts +4 -0
- package/dist/onboarding/modelBuilder.d.ts.map +1 -0
- package/dist/onboarding/modelBuilder.js +330 -0
- package/dist/onboarding/modelBuilder.js.map +1 -0
- package/dist/utils/agentsFile.d.ts +6 -0
- package/dist/utils/agentsFile.d.ts.map +1 -0
- package/dist/utils/agentsFile.js +85 -0
- package/dist/utils/agentsFile.js.map +1 -0
- package/dist/utils/config.d.ts +20 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +88 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/devmapFile.d.ts +3 -0
- package/dist/utils/devmapFile.d.ts.map +1 -0
- package/dist/utils/devmapFile.js +43 -0
- package/dist/utils/devmapFile.js.map +1 -0
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +92 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gitignore.d.ts +2 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +22 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/help.d.ts +3 -0
- package/dist/utils/help.d.ts.map +1 -0
- package/dist/utils/help.js +19 -0
- package/dist/utils/help.js.map +1 -0
- package/dist/utils/mapRenderer.d.ts +39 -0
- package/dist/utils/mapRenderer.d.ts.map +1 -0
- package/dist/utils/mapRenderer.js +90 -0
- package/dist/utils/mapRenderer.js.map +1 -0
- package/dist/utils/markdownTerminal.d.ts +6 -0
- package/dist/utils/markdownTerminal.d.ts.map +1 -0
- package/dist/utils/markdownTerminal.js +153 -0
- package/dist/utils/markdownTerminal.js.map +1 -0
- package/dist/utils/output.d.ts +29 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +108 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/packageMetadata.d.ts +2 -0
- package/dist/utils/packageMetadata.d.ts.map +1 -0
- package/dist/utils/packageMetadata.js +5 -0
- package/dist/utils/packageMetadata.js.map +1 -0
- package/dist/utils/prompt.d.ts +11 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +81 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/slug.d.ts +2 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +8 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/targetResolver.d.ts +7 -0
- package/dist/utils/targetResolver.d.ts.map +1 -0
- package/dist/utils/targetResolver.js +15 -0
- package/dist/utils/targetResolver.js.map +1 -0
- package/dist/utils/welcome.d.ts +10 -0
- package/dist/utils/welcome.d.ts.map +1 -0
- package/dist/utils/welcome.js +80 -0
- package/dist/utils/welcome.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Main entry
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* detectCapabilities — derive capabilities dari route patterns + entity graph.
|
|
6
|
+
*
|
|
7
|
+
* Berbeda dari featureDetector yang detect *library* yang dipakai (Stripe, Redis, dll),
|
|
8
|
+
* capabilityDetector detect *perilaku* yang di-expose project via routes.
|
|
9
|
+
*
|
|
10
|
+
* Contoh:
|
|
11
|
+
* GET+POST+PUT+DELETE /snippets → crud capability pada entity "Snippet"
|
|
12
|
+
* POST /snippets/[id]/share → sharing capability
|
|
13
|
+
* POST /workspaces/[id]/members → collaboration capability
|
|
14
|
+
*
|
|
15
|
+
* Input: RouteInfo[] + EntityGraph (untuk entity name mapping)
|
|
16
|
+
* Output: CapabilityInfo[]
|
|
17
|
+
*/
|
|
18
|
+
export function detectCapabilities(routes, entityGraph) {
|
|
19
|
+
if (routes.length === 0)
|
|
20
|
+
return [];
|
|
21
|
+
const capabilities = [];
|
|
22
|
+
const apiRoutes = routes.filter((r) => r.kind === "api");
|
|
23
|
+
const pageRoutes = routes.filter((r) => r.kind === "page");
|
|
24
|
+
// --- CRUD detection ---
|
|
25
|
+
const crudCapabilities = detectCrudCapabilities(apiRoutes, entityGraph);
|
|
26
|
+
capabilities.push(...crudCapabilities);
|
|
27
|
+
// --- Behavioral capabilities dari route patterns ---
|
|
28
|
+
// Only use API routes for behavioral detection — page routes produce too many
|
|
29
|
+
// false positives because page paths often contain domain keywords that
|
|
30
|
+
// don't represent actual capabilities (e.g. /search page = UI, not search infra)
|
|
31
|
+
const behavioral = detectBehavioralCapabilities(apiRoutes, entityGraph);
|
|
32
|
+
capabilities.push(...behavioral);
|
|
33
|
+
return deduplicateCapabilities(capabilities);
|
|
34
|
+
}
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// CRUD detection
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
function detectCrudCapabilities(apiRoutes, entityGraph) {
|
|
39
|
+
const resourceMap = new Map();
|
|
40
|
+
for (const route of apiRoutes) {
|
|
41
|
+
const resource = extractResourceName(route.path);
|
|
42
|
+
if (!resource)
|
|
43
|
+
continue;
|
|
44
|
+
const existing = resourceMap.get(resource) ?? {
|
|
45
|
+
methods: new Set(),
|
|
46
|
+
files: new Set()
|
|
47
|
+
};
|
|
48
|
+
for (const method of route.methods ?? []) {
|
|
49
|
+
existing.methods.add(method);
|
|
50
|
+
}
|
|
51
|
+
existing.files.add(route.file);
|
|
52
|
+
resourceMap.set(resource, existing);
|
|
53
|
+
}
|
|
54
|
+
const capabilities = [];
|
|
55
|
+
for (const [resource, { methods, files }] of resourceMap) {
|
|
56
|
+
const hasRead = methods.has("GET");
|
|
57
|
+
const hasWrite = methods.has("POST") || methods.has("PUT") || methods.has("PATCH");
|
|
58
|
+
const hasDelete = methods.has("DELETE");
|
|
59
|
+
if (!hasRead && !hasWrite)
|
|
60
|
+
continue;
|
|
61
|
+
const entityName = resolveEntityName(resource, entityGraph);
|
|
62
|
+
const isFull = hasRead && hasWrite && hasDelete;
|
|
63
|
+
capabilities.push({
|
|
64
|
+
kind: "crud",
|
|
65
|
+
name: `${entityName} Management`,
|
|
66
|
+
entities: [entityName],
|
|
67
|
+
evidence: [...files],
|
|
68
|
+
confidence: isFull ? "high" : "medium"
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return capabilities;
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Behavioral capabilities
|
|
75
|
+
//
|
|
76
|
+
// Threshold design rationale:
|
|
77
|
+
//
|
|
78
|
+
// highConfidenceAt = 1 was too aggressive — a single route match on a
|
|
79
|
+
// generic path like /search or /stats was enough to create a "high"
|
|
80
|
+
// confidence feature, even when that route was just a UI page.
|
|
81
|
+
//
|
|
82
|
+
// New thresholds:
|
|
83
|
+
// - Search: 2 — one /search page is a UI pattern, not a search infrastructure
|
|
84
|
+
// - Reporting: 2 — one /stats or /dashboard page doesn't mean reporting infra
|
|
85
|
+
// - Social: 3 — needs multiple social signals (likes AND comments, etc.)
|
|
86
|
+
// - All others: 1 or 2 depending on signal specificity
|
|
87
|
+
//
|
|
88
|
+
// Additionally: behavioral detection now only runs on API routes (not page
|
|
89
|
+
// routes) to avoid UI pages being confused with backend capabilities.
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
const BEHAVIORAL_SIGNALS = [
|
|
92
|
+
// Sharing — specific enough that 1 match is fine
|
|
93
|
+
{
|
|
94
|
+
kind: "sharing",
|
|
95
|
+
name: "Content Sharing",
|
|
96
|
+
pathPatterns: [/\/(share|shares|shareId|shared)(\/|$)/i],
|
|
97
|
+
highConfidenceAt: 2,
|
|
98
|
+
minimumMatches: 1,
|
|
99
|
+
},
|
|
100
|
+
// Publishing
|
|
101
|
+
{
|
|
102
|
+
kind: "publishing",
|
|
103
|
+
name: "Content Publishing",
|
|
104
|
+
pathPatterns: [/\/(publish|unpublish|draft|drafts)(\/|$)/i],
|
|
105
|
+
highConfidenceAt: 1,
|
|
106
|
+
minimumMatches: 1,
|
|
107
|
+
},
|
|
108
|
+
// Collaboration — workspace/member/invite are strong signals
|
|
109
|
+
{
|
|
110
|
+
kind: "collaboration",
|
|
111
|
+
name: "Team Collaboration",
|
|
112
|
+
pathPatterns: [
|
|
113
|
+
/\/(workspace|workspaces)(\/|$)/i,
|
|
114
|
+
/\/(member|members|membership)(\/|$)/i,
|
|
115
|
+
/\/(invite|invites?|join)(\/|$)/i,
|
|
116
|
+
/\/(team|teams)(\/|$)/i,
|
|
117
|
+
],
|
|
118
|
+
highConfidenceAt: 2,
|
|
119
|
+
minimumMatches: 1,
|
|
120
|
+
},
|
|
121
|
+
// Discovery
|
|
122
|
+
{
|
|
123
|
+
kind: "discovery",
|
|
124
|
+
name: "Public Discovery",
|
|
125
|
+
pathPatterns: [
|
|
126
|
+
/\/(explore|discover|browse)(\/|$)/i,
|
|
127
|
+
/\/(feed|trending|featured)(\/|$)/i,
|
|
128
|
+
],
|
|
129
|
+
highConfidenceAt: 1,
|
|
130
|
+
minimumMatches: 1,
|
|
131
|
+
},
|
|
132
|
+
// Social — needs multiple signals to avoid false positives
|
|
133
|
+
// e.g. a single /comments route could be anything
|
|
134
|
+
{
|
|
135
|
+
kind: "social",
|
|
136
|
+
name: "Social Interactions",
|
|
137
|
+
pathPatterns: [
|
|
138
|
+
/\/(like|likes|favorite|favorites)(\/|$)/i,
|
|
139
|
+
/\/(reaction|reactions|upvote|downvote)(\/|$)/i,
|
|
140
|
+
/\/(comment|comments|reply|replies)(\/|$)/i,
|
|
141
|
+
/\/(follow|followers|following)(\/|$)/i,
|
|
142
|
+
],
|
|
143
|
+
highConfidenceAt: 3,
|
|
144
|
+
minimumMatches: 2, // needs at least 2 distinct social routes to surface
|
|
145
|
+
},
|
|
146
|
+
// File management
|
|
147
|
+
{
|
|
148
|
+
kind: "file-management",
|
|
149
|
+
name: "File Management",
|
|
150
|
+
pathPatterns: [
|
|
151
|
+
/\/(upload|uploads)(\/|$)/i,
|
|
152
|
+
/\/(attachment|attachments)(\/|$)/i,
|
|
153
|
+
/\/(media|asset|assets)(\/|$)/i,
|
|
154
|
+
],
|
|
155
|
+
highConfidenceAt: 1,
|
|
156
|
+
minimumMatches: 1,
|
|
157
|
+
},
|
|
158
|
+
// Real-time — transport-level signals only, very specific
|
|
159
|
+
{
|
|
160
|
+
kind: "real-time",
|
|
161
|
+
name: "Real-time Features",
|
|
162
|
+
pathPatterns: [
|
|
163
|
+
/\/(ws|websocket|socket)(\/|$)/i,
|
|
164
|
+
/\/(live|stream|streaming)(\/|$)/i,
|
|
165
|
+
/\/(sse|server-sent)(\/|$)/i,
|
|
166
|
+
],
|
|
167
|
+
highConfidenceAt: 1,
|
|
168
|
+
minimumMatches: 1,
|
|
169
|
+
},
|
|
170
|
+
// Search — needs at least 2 API routes to surface
|
|
171
|
+
// A single /api/search could be a simple filter, not search infrastructure
|
|
172
|
+
{
|
|
173
|
+
kind: "search",
|
|
174
|
+
name: "Search",
|
|
175
|
+
pathPatterns: [/\/(search|find|query|lookup)(\/|$)/i],
|
|
176
|
+
highConfidenceAt: 2,
|
|
177
|
+
minimumMatches: 2, // must have at least 2 distinct search API routes
|
|
178
|
+
},
|
|
179
|
+
// Reporting — dashboard alone is not enough (many apps have a /dashboard page)
|
|
180
|
+
{
|
|
181
|
+
kind: "reporting",
|
|
182
|
+
name: "Statistics & Reporting",
|
|
183
|
+
pathPatterns: [
|
|
184
|
+
/\/(stats?|analytics?|metric|metrics)(\/|$)/i,
|
|
185
|
+
/\/(report|reports)(\/|$)/i,
|
|
186
|
+
],
|
|
187
|
+
highConfidenceAt: 2,
|
|
188
|
+
minimumMatches: 1,
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
function detectBehavioralCapabilities(
|
|
192
|
+
// Only API routes now — page routes removed to cut false positives
|
|
193
|
+
apiRoutes, entityGraph) {
|
|
194
|
+
const capabilities = [];
|
|
195
|
+
for (const signal of BEHAVIORAL_SIGNALS) {
|
|
196
|
+
const matched = apiRoutes.filter((route) => signal.pathPatterns.some((pattern) => pattern.test(route.path)));
|
|
197
|
+
const minimum = signal.minimumMatches ?? 1;
|
|
198
|
+
if (matched.length < minimum)
|
|
199
|
+
continue;
|
|
200
|
+
const entities = [...new Set(matched
|
|
201
|
+
.map((r) => extractResourceName(r.path))
|
|
202
|
+
.filter((r) => r !== null)
|
|
203
|
+
.map((r) => resolveEntityName(r, entityGraph)))];
|
|
204
|
+
const threshold = signal.highConfidenceAt ?? 1;
|
|
205
|
+
const confidence = matched.length >= threshold ? "high" : "medium";
|
|
206
|
+
capabilities.push({
|
|
207
|
+
kind: signal.kind,
|
|
208
|
+
name: signal.name,
|
|
209
|
+
entities,
|
|
210
|
+
evidence: [...new Set(matched.map((r) => r.file))].slice(0, 5),
|
|
211
|
+
confidence
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return capabilities;
|
|
215
|
+
}
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
// Helpers
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
function extractResourceName(path) {
|
|
220
|
+
const segments = path
|
|
221
|
+
.split("/")
|
|
222
|
+
.filter(Boolean)
|
|
223
|
+
.filter((s) => !s.startsWith("["))
|
|
224
|
+
.filter((s) => !["api", "v1", "v2", "v3"].includes(s.toLowerCase()));
|
|
225
|
+
if (segments.length === 0)
|
|
226
|
+
return null;
|
|
227
|
+
const segment = segments[0].toLowerCase();
|
|
228
|
+
if (segment.length <= 2)
|
|
229
|
+
return null;
|
|
230
|
+
if (NON_RESOURCE_SEGMENTS.has(segment))
|
|
231
|
+
return null;
|
|
232
|
+
return segment;
|
|
233
|
+
}
|
|
234
|
+
function resolveEntityName(resource, entityGraph) {
|
|
235
|
+
const lower = resource.toLowerCase();
|
|
236
|
+
const direct = entityGraph.entityNames.find((name) => name.toLowerCase() === lower);
|
|
237
|
+
if (direct)
|
|
238
|
+
return direct;
|
|
239
|
+
const singular = singularize(lower);
|
|
240
|
+
const singularMatch = entityGraph.entityNames.find((name) => name.toLowerCase() === singular.toLowerCase());
|
|
241
|
+
if (singularMatch)
|
|
242
|
+
return singularMatch;
|
|
243
|
+
return singular.length === 0 ? singular : singular[0].toUpperCase() + singular.slice(1);
|
|
244
|
+
}
|
|
245
|
+
function singularize(word) {
|
|
246
|
+
if (word.endsWith("ies"))
|
|
247
|
+
return word.slice(0, -3) + "y";
|
|
248
|
+
if (word.endsWith("sses") ||
|
|
249
|
+
word.endsWith("xes") ||
|
|
250
|
+
word.endsWith("ches") ||
|
|
251
|
+
word.endsWith("ses")) {
|
|
252
|
+
return word.slice(0, -2);
|
|
253
|
+
}
|
|
254
|
+
if (word.endsWith("s") && !word.endsWith("ss"))
|
|
255
|
+
return word.slice(0, -1);
|
|
256
|
+
return word;
|
|
257
|
+
}
|
|
258
|
+
function deduplicateCapabilities(capabilities) {
|
|
259
|
+
const seen = new Map();
|
|
260
|
+
for (const cap of capabilities) {
|
|
261
|
+
const existing = seen.get(cap.kind);
|
|
262
|
+
if (!existing) {
|
|
263
|
+
seen.set(cap.kind, cap);
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
seen.set(cap.kind, {
|
|
267
|
+
...existing,
|
|
268
|
+
entities: [...new Set([...existing.entities, ...cap.entities])],
|
|
269
|
+
evidence: [...new Set([...existing.evidence, ...cap.evidence])].slice(0, 5),
|
|
270
|
+
confidence: higherConfidence(existing.confidence, cap.confidence)
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return [...seen.values()];
|
|
274
|
+
}
|
|
275
|
+
function higherConfidence(a, b) {
|
|
276
|
+
const rank = { high: 2, medium: 1, low: 0 };
|
|
277
|
+
return rank[a] >= rank[b] ? a : b;
|
|
278
|
+
}
|
|
279
|
+
// NON_RESOURCE_SEGMENTS — path segments yang bukan nama resource.
|
|
280
|
+
const NON_RESOURCE_SEGMENTS = new Set([
|
|
281
|
+
"auth", "oauth", "callback", "health",
|
|
282
|
+
"ping", "status", "public", "internal",
|
|
283
|
+
"static", "assets", "files", "me", "self",
|
|
284
|
+
"history", "session", "sessions",
|
|
285
|
+
// tambahan: common Next.js/UI page paths yang bukan API resource
|
|
286
|
+
"dashboard", "settings", "profile", "search",
|
|
287
|
+
]);
|
|
288
|
+
//# sourceMappingURL=capabilityDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilityDetector.js","sourceRoot":"","sources":["../../../src/analyzers/detectors/capabilityDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ScannedFile } from "../analysis/index.js";
|
|
2
|
+
export type DatabaseInfo = {
|
|
3
|
+
provider: string;
|
|
4
|
+
files: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare function detectDatabase(files: ScannedFile[]): DatabaseInfo | undefined;
|
|
7
|
+
//# sourceMappingURL=databaseDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databaseDetector.d.ts","sourceRoot":"","sources":["../../../src/analyzers/detectors/databaseDetector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AA4CF,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,YAAY,GAAG,SAAS,CAoB7E"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { isArchitectureSource } from "../graph/index.js";
|
|
2
|
+
const DATABASE_SIGNALS = [
|
|
3
|
+
{
|
|
4
|
+
provider: "Prisma",
|
|
5
|
+
dependencies: ["@prisma/client", "prisma"],
|
|
6
|
+
paths: [/(^|\/)schema\.prisma$/, /(^|\/)prisma\//]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
provider: "Drizzle",
|
|
10
|
+
dependencies: ["drizzle-orm"],
|
|
11
|
+
paths: [/(^|\/)drizzle\.config\.[cm]?[jt]s$/, /(^|\/)drizzle\//]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
provider: "Mongoose",
|
|
15
|
+
dependencies: ["mongoose"],
|
|
16
|
+
paths: [/(^|\/)(models?|schemas?)\//]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
provider: "Supabase",
|
|
20
|
+
dependencies: ["@supabase/supabase-js"],
|
|
21
|
+
paths: [/(^|\/)supabase\//]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
provider: "PostgreSQL (raw SQL)",
|
|
25
|
+
dependencies: ["pg", "pg-promise"],
|
|
26
|
+
paths: []
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
provider: "MySQL (raw SQL)",
|
|
30
|
+
dependencies: ["mysql2", "mysql"],
|
|
31
|
+
paths: []
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
provider: "SQLite (raw SQL)",
|
|
35
|
+
dependencies: ["better-sqlite3", "sqlite3"],
|
|
36
|
+
paths: []
|
|
37
|
+
}
|
|
38
|
+
];
|
|
39
|
+
export function detectDatabase(files) {
|
|
40
|
+
const scopedFiles = files.filter((file) => isArchitectureSource(file.path));
|
|
41
|
+
const dependencies = readDependencies(scopedFiles);
|
|
42
|
+
for (const signal of DATABASE_SIGNALS) {
|
|
43
|
+
const matchedFiles = scopedFiles
|
|
44
|
+
.filter((file) => signal.paths.some((pattern) => pattern.test(file.path)))
|
|
45
|
+
.map((file) => file.path)
|
|
46
|
+
.sort();
|
|
47
|
+
const dependencyMatch = signal.dependencies.some((dependency) => dependencies.has(dependency));
|
|
48
|
+
if (dependencyMatch || matchedFiles.length > 0) {
|
|
49
|
+
return {
|
|
50
|
+
provider: signal.provider,
|
|
51
|
+
files: matchedFiles
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
function readDependencies(files) {
|
|
58
|
+
const dependencies = new Set();
|
|
59
|
+
for (const file of files.filter((item) => item.path.endsWith("package.json"))) {
|
|
60
|
+
try {
|
|
61
|
+
const parsed = JSON.parse(file.content);
|
|
62
|
+
Object.keys(parsed.dependencies ?? {}).forEach((name) => dependencies.add(name.toLowerCase()));
|
|
63
|
+
Object.keys(parsed.devDependencies ?? {}).forEach((name) => dependencies.add(name.toLowerCase()));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return dependencies;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=databaseDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databaseDetector.js","sourceRoot":"","sources":["../../../src/analyzers/detectors/databaseDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ScannedFile } from "../analysis/index.js";
|
|
2
|
+
export declare const FRONTEND_FRAMEWORKS: readonly ["nextjs", "nuxt", "sveltekit", "astro", "react", "vue", "svelte"];
|
|
3
|
+
export declare const BACKEND_FRAMEWORKS: readonly ["nestjs", "fastify", "express", "koa"];
|
|
4
|
+
export type FrontendFramework = typeof FRONTEND_FRAMEWORKS[number];
|
|
5
|
+
export type BackendFramework = typeof BACKEND_FRAMEWORKS[number];
|
|
6
|
+
export type Framework = FrontendFramework | BackendFramework | "unknown";
|
|
7
|
+
export type DetectedFramework = Exclude<Framework, "unknown">;
|
|
8
|
+
export declare const FRONTEND_FRAMEWORK_SET: Set<string>;
|
|
9
|
+
export declare const BACKEND_FRAMEWORK_SET: Set<string>;
|
|
10
|
+
export declare function detectFramework(files: ScannedFile[]): Framework;
|
|
11
|
+
/**
|
|
12
|
+
* detectFrameworks — detect every framework signal, then return AT MOST one
|
|
13
|
+
* winner per category (frontend, backend). Frontend-first for display.
|
|
14
|
+
*
|
|
15
|
+
* A project with both a Next.js frontend and an Express backend (single
|
|
16
|
+
* package or monorepo scan) returns two entries instead of the single
|
|
17
|
+
* first-match-wins value the old flat order produced. `nextjs` still beats
|
|
18
|
+
* `astro` within the frontend category — the same first-match-wins rule is
|
|
19
|
+
* simply scoped per category now.
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectFrameworks(files: ScannedFile[]): DetectedFramework[];
|
|
22
|
+
//# sourceMappingURL=frameworkDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameworkDetector.d.ts","sourceRoot":"","sources":["../../../src/analyzers/detectors/frameworkDetector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,eAAO,MAAM,mBAAmB,6EAEtB,CAAC;AACX,eAAO,MAAM,kBAAkB,kDAErB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACnE,MAAM,MAAM,gBAAgB,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAAC;AACzE,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB,aAAuC,CAAC;AAC3E,eAAO,MAAM,qBAAqB,aAAsC,CAAC;AAEzE,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAG/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CA2H1E"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { isArchitectureSource } from "../graph/index.js";
|
|
2
|
+
export const FRONTEND_FRAMEWORKS = [
|
|
3
|
+
"nextjs", "nuxt", "sveltekit", "astro", "react", "vue", "svelte"
|
|
4
|
+
];
|
|
5
|
+
export const BACKEND_FRAMEWORKS = [
|
|
6
|
+
"nestjs", "fastify", "express", "koa"
|
|
7
|
+
];
|
|
8
|
+
export const FRONTEND_FRAMEWORK_SET = new Set(FRONTEND_FRAMEWORKS);
|
|
9
|
+
export const BACKEND_FRAMEWORK_SET = new Set(BACKEND_FRAMEWORKS);
|
|
10
|
+
export function detectFramework(files) {
|
|
11
|
+
const [frontendWinner, backendWinner] = detectFrameworks(files);
|
|
12
|
+
return frontendWinner ?? backendWinner ?? "unknown";
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* detectFrameworks — detect every framework signal, then return AT MOST one
|
|
16
|
+
* winner per category (frontend, backend). Frontend-first for display.
|
|
17
|
+
*
|
|
18
|
+
* A project with both a Next.js frontend and an Express backend (single
|
|
19
|
+
* package or monorepo scan) returns two entries instead of the single
|
|
20
|
+
* first-match-wins value the old flat order produced. `nextjs` still beats
|
|
21
|
+
* `astro` within the frontend category — the same first-match-wins rule is
|
|
22
|
+
* simply scoped per category now.
|
|
23
|
+
*/
|
|
24
|
+
export function detectFrameworks(files) {
|
|
25
|
+
const detected = new Set();
|
|
26
|
+
// Phase 1: dependency manifest — highest confidence signal.
|
|
27
|
+
// package.json is the canonical source of truth for what frameworks are installed.
|
|
28
|
+
for (const dependencies of readManifestDependencies(files)) {
|
|
29
|
+
if ("next" in dependencies)
|
|
30
|
+
detected.add("nextjs");
|
|
31
|
+
if ("express" in dependencies)
|
|
32
|
+
detected.add("express");
|
|
33
|
+
if ("astro" in dependencies)
|
|
34
|
+
detected.add("astro");
|
|
35
|
+
if ("nuxt" in dependencies)
|
|
36
|
+
detected.add("nuxt");
|
|
37
|
+
if ("fastify" in dependencies)
|
|
38
|
+
detected.add("fastify");
|
|
39
|
+
if ("@nestjs/core" in dependencies || "@nestjs/common" in dependencies) {
|
|
40
|
+
detected.add("nestjs");
|
|
41
|
+
}
|
|
42
|
+
if ("@sveltejs/kit" in dependencies)
|
|
43
|
+
detected.add("sveltekit");
|
|
44
|
+
const hasReactRuntime = "react-dom" in dependencies
|
|
45
|
+
|| "react-scripts" in dependencies
|
|
46
|
+
|| "@vitejs/plugin-react" in dependencies
|
|
47
|
+
|| "@vitejs/plugin-react-swc" in dependencies;
|
|
48
|
+
if (!("next" in dependencies)
|
|
49
|
+
&& !("astro" in dependencies)
|
|
50
|
+
&& "react" in dependencies
|
|
51
|
+
&& hasReactRuntime) {
|
|
52
|
+
detected.add("react");
|
|
53
|
+
}
|
|
54
|
+
// Nuxt apps ship App.vue too, so vue must exclude when nuxt is present —
|
|
55
|
+
// same mirror of the react-vs-next exclusion. The runtime gate prevents a
|
|
56
|
+
// Vue UI library (vue only in peerDependencies) from being labeled an app.
|
|
57
|
+
const hasVueRuntime = "@vitejs/plugin-vue" in dependencies
|
|
58
|
+
|| "@vitejs/plugin-vue2" in dependencies
|
|
59
|
+
|| "vue-cli-service" in dependencies;
|
|
60
|
+
if (!("nuxt" in dependencies) && "vue" in dependencies && hasVueRuntime) {
|
|
61
|
+
detected.add("vue");
|
|
62
|
+
}
|
|
63
|
+
const hasSvelteRuntime = "@sveltejs/vite-plugin-svelte" in dependencies;
|
|
64
|
+
if (!("@sveltejs/kit" in dependencies) && "svelte" in dependencies && hasSvelteRuntime) {
|
|
65
|
+
detected.add("svelte");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Phase 2: file structure heuristics — secondary signal.
|
|
69
|
+
// Only used when package.json is absent or incomplete (e.g. monorepo root without deps).
|
|
70
|
+
const sourceFiles = files.filter((file) => isArchitectureSource(file.path));
|
|
71
|
+
// Next.js: next.config.* or App Router / Pages Router file conventions.
|
|
72
|
+
// _app and _document are Next.js-unique; a bare src/pages/api/ folder is NOT
|
|
73
|
+
// (Astro uses the same folder for endpoints), so it is deliberately excluded
|
|
74
|
+
// from the Pages Router signal here.
|
|
75
|
+
if (files.some((file) => /(^|\/)next\.config\.[cm]?[jt]s$/.test(file.path))
|
|
76
|
+
|| sourceFiles.some((file) => /(^|\/)(?:src\/)?app\/(?:.+\/)?(?:page|layout|route)\.[jt]sx?$/.test(file.path)
|
|
77
|
+
|| /(^|\/)(?:src\/)?pages\/(?:_app|_document)/.test(file.path))) {
|
|
78
|
+
detected.add("nextjs");
|
|
79
|
+
}
|
|
80
|
+
// Express: primarily via package.json dependency (see below for the file-only path).
|
|
81
|
+
const hasReliableManifest = files.some((file) => file.path.endsWith("package.json") && isArchitectureSource(file.path) && isParseableJson(file.content));
|
|
82
|
+
// Express: ONLY add via file heuristic if express was already confirmed in package.json,
|
|
83
|
+
// OR — narrow fallback — if package.json is missing/unparseable entirely.
|
|
84
|
+
//
|
|
85
|
+
// Rationale: `server.ts` and `app.ts` are common filenames in Next.js, NestJS, and vanilla
|
|
86
|
+
// Node projects. Without the dependency gate, a Next.js project with a custom `app.ts`
|
|
87
|
+
// utility file would be misclassified as Express. The dep check is the authoritative signal;
|
|
88
|
+
// the filename pattern alone is intentionally never used as a standalone trigger.
|
|
89
|
+
//
|
|
90
|
+
// When there's no reliable manifest to check at all, that filename ambiguity is still a
|
|
91
|
+
// real risk, so instead of trusting the filename we scan file *content* for an actual
|
|
92
|
+
// `express()` call or `require("express")`/`from "express"` — evidence specific enough
|
|
93
|
+
// that a Next.js app.ts utility file won't produce a false positive.
|
|
94
|
+
if (detected.has("express")
|
|
95
|
+
&& sourceFiles.some((file) => /(^|\/)(?:src\/)?(?:server|app)\.[cm]?[jt]s$/.test(file.path))) {
|
|
96
|
+
// Already added via deps — this block intentionally left as documentation of the gate.
|
|
97
|
+
// The detected.add("express") already happened above; we don't re-add.
|
|
98
|
+
}
|
|
99
|
+
else if (!hasReliableManifest && sourceFiles.some((file) => hasExpressCallSite(file.content))) {
|
|
100
|
+
detected.add("express");
|
|
101
|
+
}
|
|
102
|
+
// Astro: src/pages/*.astro is specific enough to be safe as a standalone signal.
|
|
103
|
+
if (sourceFiles.some((file) => /(^|\/)src\/pages\/.+\.astro$/.test(file.path))) {
|
|
104
|
+
detected.add("astro");
|
|
105
|
+
}
|
|
106
|
+
// Nuxt: nuxt.config.* is as specific as next.config.* today.
|
|
107
|
+
if (files.some((file) => /(^|\/)nuxt\.config\.[cm]?[jt]s$/.test(file.path))) {
|
|
108
|
+
detected.add("nuxt");
|
|
109
|
+
}
|
|
110
|
+
// Vue: App.vue at the project root (or src/) is specific enough to stand alone.
|
|
111
|
+
if (sourceFiles.some((file) => /(^|\/)(?:src\/)?App\.vue$/.test(file.path))) {
|
|
112
|
+
detected.add("vue");
|
|
113
|
+
}
|
|
114
|
+
// SvelteKit: +page.svelte under src/routes/ is unique to SvelteKit — the "+"
|
|
115
|
+
// prefix is not used by any other framework. svelte.config.js is NOT used as a
|
|
116
|
+
// signal because non-SvelteKit Svelte projects have it too.
|
|
117
|
+
if (sourceFiles.some((file) => /(^|\/)src\/routes\/.+\+page\.svelte$/.test(file.path))) {
|
|
118
|
+
detected.add("sveltekit");
|
|
119
|
+
}
|
|
120
|
+
// NestJS: nest-cli.json is as specific as next.config.* / nuxt.config.*.
|
|
121
|
+
if (files.some((file) => /(^|\/)nest-cli\.json$/.test(file.path))) {
|
|
122
|
+
detected.add("nestjs");
|
|
123
|
+
}
|
|
124
|
+
return [
|
|
125
|
+
FRONTEND_FRAMEWORKS.find((framework) => detected.has(framework)),
|
|
126
|
+
BACKEND_FRAMEWORKS.find((framework) => detected.has(framework)),
|
|
127
|
+
].filter((framework) => Boolean(framework));
|
|
128
|
+
}
|
|
129
|
+
function isParseableJson(content) {
|
|
130
|
+
try {
|
|
131
|
+
JSON.parse(content);
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function hasExpressCallSite(content) {
|
|
139
|
+
return /\bexpress\s*\(\s*\)/.test(content)
|
|
140
|
+
|| /require\(\s*["']express["']\s*\)/.test(content)
|
|
141
|
+
|| /from\s+["']express["']/.test(content);
|
|
142
|
+
}
|
|
143
|
+
function readManifestDependencies(files) {
|
|
144
|
+
return files
|
|
145
|
+
.filter((file) => file.path.endsWith("package.json") && isArchitectureSource(file.path))
|
|
146
|
+
.map((file) => readDependencies(file.content));
|
|
147
|
+
}
|
|
148
|
+
function readDependencies(content) {
|
|
149
|
+
try {
|
|
150
|
+
const parsed = JSON.parse(content);
|
|
151
|
+
return {
|
|
152
|
+
...parsed.dependencies,
|
|
153
|
+
...parsed.devDependencies
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=frameworkDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameworkDetector.js","sourceRoot":"","sources":["../../../src/analyzers/detectors/frameworkDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RouteInfo } from "./routeDetector.js";
|
|
2
|
+
import type { ScannedFile } from "../analysis/index.js";
|
|
3
|
+
import type { FileGraph } from "../graph/dependencyGraph.js";
|
|
4
|
+
import type { FeatureInfo } from "../features/featureDetector.js";
|
|
5
|
+
/**
|
|
6
|
+
* detectFrontendPageFeatures — turn Next.js App/Pages Router page routes into
|
|
7
|
+
* features, independent of whether any database entity was found.
|
|
8
|
+
*
|
|
9
|
+
* Why this needs to be independent: entity-derived features (Prisma/SQL/
|
|
10
|
+
* route-hint) only run as a fallback chain that stops at the first non-empty
|
|
11
|
+
* source. A project with even one Prisma model (e.g. a NextAuth Session
|
|
12
|
+
* table) never reaches route-hint fallback, so page-only features like
|
|
13
|
+
* "Quran" or "Dzikir" — which have zero database presence — never surfaced
|
|
14
|
+
* at all. This runs unconditionally and merges alongside whatever else was
|
|
15
|
+
* found, so a mostly-frontend project doesn't get its features dominated by
|
|
16
|
+
* whatever thin backend evidence happens to exist.
|
|
17
|
+
*/
|
|
18
|
+
export declare function detectFrontendPageFeatures(routes: RouteInfo[], fileGraph: FileGraph): FeatureInfo[];
|
|
19
|
+
/**
|
|
20
|
+
* detectClientRouteFeatures — same purpose and output shape as
|
|
21
|
+
* detectFrontendPageFeatures, for SPAs with no file-based routing (Vite +
|
|
22
|
+
* React Router). Route paths come from parsing route definitions instead of
|
|
23
|
+
* folder conventions; ownership uses the exact same reverse-graph rule.
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectClientRouteFeatures(files: ScannedFile[], fileGraph: FileGraph): FeatureInfo[];
|
|
26
|
+
//# sourceMappingURL=frontendFeatureDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontendFeatureDetector.d.ts","sourceRoot":"","sources":["../../../src/analyzers/detectors/frontendFeatureDetector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAuBlE;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EAAE,EACnB,SAAS,EAAE,SAAS,GACnB,WAAW,EAAE,CA2Bf;AA+JD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,EAAE,EACpB,SAAS,EAAE,SAAS,GACnB,WAAW,EAAE,CA2Cf"}
|