@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 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,EAAE,CAkCtE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,CAwBtE;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,eAAe,GACvB,SAAS,EAAE,CA6Bb"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export function buildAnalyzeMessages(snapshot) {
|
|
2
|
+
const analysisData = {
|
|
3
|
+
project: snapshot.project,
|
|
4
|
+
stats: snapshot.stats,
|
|
5
|
+
entryPoints: snapshot.entryPoints,
|
|
6
|
+
criticalFiles: snapshot.criticalFiles,
|
|
7
|
+
routes: snapshot.routes,
|
|
8
|
+
externalServices: snapshot.externalServices,
|
|
9
|
+
database: snapshot.database,
|
|
10
|
+
features: snapshot.features,
|
|
11
|
+
dependencies: snapshot.dependencies
|
|
12
|
+
};
|
|
13
|
+
return [
|
|
14
|
+
{
|
|
15
|
+
role: "system",
|
|
16
|
+
content: [
|
|
17
|
+
"You are DevMap, a codebase architecture interpreter.",
|
|
18
|
+
"Explain only facts supported by the supplied static analysis snapshot.",
|
|
19
|
+
"Do not invent modules, flows, frameworks, or services.",
|
|
20
|
+
"Clearly separate confirmed structure from reasonable interpretation.",
|
|
21
|
+
"Provide a concise architecture overview, main entry points, and important relationships.",
|
|
22
|
+
"Mention relevant file paths.",
|
|
23
|
+
"Use clear Markdown."
|
|
24
|
+
].join(" ")
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
role: "user",
|
|
28
|
+
content: [
|
|
29
|
+
"Interpret this DevMap static analysis snapshot:",
|
|
30
|
+
JSON.stringify(analysisData, null, 2)
|
|
31
|
+
].join("\n\n")
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
export function buildFlowNarrationMessages(flow) {
|
|
36
|
+
const flowData = {
|
|
37
|
+
name: flow.name,
|
|
38
|
+
purpose: flow.purpose,
|
|
39
|
+
type: flow.type,
|
|
40
|
+
entryPoint: flow.entryPoint,
|
|
41
|
+
steps: flow.steps
|
|
42
|
+
};
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
role: "system",
|
|
46
|
+
content: [
|
|
47
|
+
"You are DevMap, a codebase architecture interpreter.",
|
|
48
|
+
"Turn the given ordered list of structural steps into ONE short flowing paragraph (3-5 sentences).",
|
|
49
|
+
"Only restate facts already present in the steps below — do not invent files, modules, services, or behavior not listed.",
|
|
50
|
+
"Do not add a heading. Plain prose only."
|
|
51
|
+
].join(" ")
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
role: "user",
|
|
55
|
+
content: ["Narrate this flow:", JSON.stringify(flowData, null, 2)].join("\n\n")
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
export function buildExplainMessages(targetLabel, context) {
|
|
60
|
+
const payload = context.files.map(f => ({
|
|
61
|
+
path: f.path,
|
|
62
|
+
purpose: f.purpose,
|
|
63
|
+
exports: f.exports,
|
|
64
|
+
reasons: f.reasons,
|
|
65
|
+
content: f.content
|
|
66
|
+
}));
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
role: "system",
|
|
70
|
+
content: [
|
|
71
|
+
"You are DevMap, a codebase architecture interpreter.",
|
|
72
|
+
"Explain only what is shown in the provided file excerpts below.",
|
|
73
|
+
"Do not invent behavior, files, or dependencies not shown.",
|
|
74
|
+
"Cover: what it does, what calls/imports it, what it depends on, why it matters if that's evident from the excerpts.",
|
|
75
|
+
"3-6 sentences of plain prose, then file paths mentioned inline with backticks. No headings."
|
|
76
|
+
].join(" ")
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
role: "user",
|
|
80
|
+
content: [
|
|
81
|
+
`Explain: ${targetLabel}`,
|
|
82
|
+
"Relevant file excerpts:",
|
|
83
|
+
JSON.stringify(payload, null, 2)
|
|
84
|
+
].join("\n\n")
|
|
85
|
+
}
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,oBAAoB,CAAC,QAAoB;IACvD,MAAM,YAAY,GAAG;QACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;QAC3C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;KACpC,CAAC;IAEF,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,sDAAsD;gBACtD,wEAAwE;gBACxE,wDAAwD;gBACxD,sEAAsE;gBACtE,0FAA0F;gBAC1F,8BAA8B;gBAC9B,qBAAqB;aACtB,CAAC,IAAI,CAAC,GAAG,CAAC;SACZ;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE;gBACP,iDAAiD;gBACjD,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC,CAAC,IAAI,CAAC,MAAM,CAAC;SACf;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAc;IACvD,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;IAEF,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,sDAAsD;gBACtD,mGAAmG;gBACnG,yHAAyH;gBACzH,yCAAyC;aAC1C,CAAC,IAAI,CAAC,GAAG,CAAC;SACZ;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;SAChF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,OAAwB;IAExB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,sDAAsD;gBACtD,iEAAiE;gBACjE,2DAA2D;gBAC3D,qHAAqH;gBACrH,6FAA6F;aAC9F,CAAC,IAAI,CAAC,GAAG,CAAC;SACZ;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE;gBACP,YAAY,WAAW,EAAE;gBACzB,yBAAyB;gBACzB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACjC,CAAC,IAAI,CAAC,MAAM,CAAC;SACf;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DevmapConfig } from "../utils/config.js";
|
|
2
|
+
import type { AiClient } from "./types.js";
|
|
3
|
+
export type AiTask = "analyze" | "flowNarration" | "explain";
|
|
4
|
+
export type ProviderInspection = {
|
|
5
|
+
reachable: true;
|
|
6
|
+
modelAvailable: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function createAiClient(config: DevmapConfig): AiClient;
|
|
9
|
+
export declare function resolveAiRouting(config: DevmapConfig, task: AiTask): {
|
|
10
|
+
model: string;
|
|
11
|
+
fallbackModels: readonly string[];
|
|
12
|
+
};
|
|
13
|
+
export declare function providerDisplayName(provider: DevmapConfig["provider"]): string;
|
|
14
|
+
export declare function inspectAiProvider(provider: DevmapConfig["provider"], apiKey: string, model: string): Promise<ProviderInspection>;
|
|
15
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAa3C,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAAC;AAC7D,MAAM,MAAM,kBAAkB,GAAG;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9E,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAI7D;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAatD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,MAAM,CAE9E;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DEFAULT_AI_FALLBACKS, DEFAULT_AI_MODELS, GroqClient, inspectGroqProvider } from "./groq.js";
|
|
2
|
+
import { inspectOpenRouterProvider, OpenRouterClient, OPENROUTER_FREE_MODEL } from "./openrouter.js";
|
|
3
|
+
export function createAiClient(config) {
|
|
4
|
+
return config.provider === "openrouter"
|
|
5
|
+
? new OpenRouterClient(config.apiKey ?? "")
|
|
6
|
+
: new GroqClient(config.apiKey ?? "");
|
|
7
|
+
}
|
|
8
|
+
export function resolveAiRouting(config, task) {
|
|
9
|
+
if (config.model !== "auto") {
|
|
10
|
+
return { model: config.model, fallbackModels: [] };
|
|
11
|
+
}
|
|
12
|
+
if (config.provider === "openrouter") {
|
|
13
|
+
return { model: OPENROUTER_FREE_MODEL, fallbackModels: [] };
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
model: DEFAULT_AI_MODELS[task],
|
|
17
|
+
fallbackModels: DEFAULT_AI_FALLBACKS[task]
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function providerDisplayName(provider) {
|
|
21
|
+
return provider === "openrouter" ? "OpenRouter" : "Groq";
|
|
22
|
+
}
|
|
23
|
+
export function inspectAiProvider(provider, apiKey, model) {
|
|
24
|
+
return provider === "openrouter"
|
|
25
|
+
? inspectOpenRouterProvider(apiKey, model)
|
|
26
|
+
: inspectGroqProvider(apiKey, model);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAKzB,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,MAAM,CAAC,QAAQ,KAAK,YAAY;QACrC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAC3C,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAoB,EACpB,IAAY;IAEZ,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC;QAC9B,cAAc,EAAE,oBAAoB,CAAC,IAAI,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAkC;IACpE,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAkC,EAClC,MAAc,EACd,KAAa;IAEb,OAAO,QAAQ,KAAK,YAAY;QAC9B,CAAC,CAAC,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC;QAC1C,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ProjectMap } from "../analyzers/pipeline/index.js";
|
|
2
|
+
import type { AiClient } from "./types.js";
|
|
3
|
+
export declare function enrichSnapshotWithAi(snapshot: ProjectMap, client: AiClient, model: string, fallbackModels: readonly string[] | string): Promise<ProjectMap>;
|
|
4
|
+
//# sourceMappingURL=snapshotEnrichment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshotEnrichment.d.ts","sourceRoot":"","sources":["../../src/ai/snapshotEnrichment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAa,MAAM,YAAY,CAAC;AAKtD,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GACzC,OAAO,CAAC,UAAU,CAAC,CAmCrB"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
const FILE_BATCH_SIZE = 20;
|
|
2
|
+
const MAX_SEARCH_TERMS = 8;
|
|
3
|
+
export async function enrichSnapshotWithAi(snapshot, client, model, fallbackModels) {
|
|
4
|
+
let enriched = snapshot;
|
|
5
|
+
const modelFallbacks = typeof fallbackModels === "string"
|
|
6
|
+
? [fallbackModels]
|
|
7
|
+
: fallbackModels;
|
|
8
|
+
for (const batch of chunk(selectEligibleFiles(enriched), FILE_BATCH_SIZE)) {
|
|
9
|
+
const updates = await completeJsonArray(client, buildFilePurposeMessages(batch), model, modelFallbacks);
|
|
10
|
+
if (updates.length === 0) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
enriched = applyFilePurposeUpdates(enriched, updates);
|
|
14
|
+
}
|
|
15
|
+
if (enriched.features.length > 0) {
|
|
16
|
+
const featureUpdates = await completeJsonArray(client, buildFeatureTermsMessages(enriched), model, modelFallbacks);
|
|
17
|
+
if (featureUpdates.length > 0) {
|
|
18
|
+
enriched = applyFeatureUpdates(enriched, featureUpdates);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return enriched;
|
|
22
|
+
}
|
|
23
|
+
function selectEligibleFiles(snapshot) {
|
|
24
|
+
const criticalPaths = new Set(snapshot.criticalFiles.map((file) => file.path));
|
|
25
|
+
return Object.entries(snapshot.fileIndex)
|
|
26
|
+
.filter(([path, file]) => file.scope !== "test"
|
|
27
|
+
&& file.scope !== "docs"
|
|
28
|
+
&& (criticalPaths.has(path)
|
|
29
|
+
|| file.importance >= 20
|
|
30
|
+
|| file.featureRefs.length > 0
|
|
31
|
+
|| isSemanticEnrichmentCandidate(path, file)))
|
|
32
|
+
.map(([path, file]) => ({
|
|
33
|
+
path,
|
|
34
|
+
scope: file.scope,
|
|
35
|
+
exports: file.exportedSymbols.slice(0, 8),
|
|
36
|
+
imports: file.imports.slice(0, 8),
|
|
37
|
+
featureRefs: file.featureRefs.slice(0, 5),
|
|
38
|
+
importance: file.importance
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
function buildFilePurposeMessages(files) {
|
|
42
|
+
return [
|
|
43
|
+
{
|
|
44
|
+
role: "system",
|
|
45
|
+
content: [
|
|
46
|
+
"You summarize codebase files for a compact DevMap snapshot.",
|
|
47
|
+
"Return a JSON array only.",
|
|
48
|
+
"Each item must have path, purpose, and searchTerms.",
|
|
49
|
+
"purpose must be one sentence maximum.",
|
|
50
|
+
"Use this purpose shape when possible: '[what this file exports] used by [what consumes it] to [accomplish what]'.",
|
|
51
|
+
"Prefer specific semantics such as auth provider config, middleware guard, session provider, route handler, or UI consumer.",
|
|
52
|
+
"searchTerms must be max 8 concrete retrieval terms.",
|
|
53
|
+
"Avoid vague terms: data, logic, handler, service, feature, app, page.",
|
|
54
|
+
"Do not invent files, frameworks, or behavior not supported by the input."
|
|
55
|
+
].join(" ")
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
role: "user",
|
|
59
|
+
content: JSON.stringify(files, null, 2)
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
function isSemanticEnrichmentCandidate(path, file) {
|
|
64
|
+
const normalizedPath = path.toLowerCase();
|
|
65
|
+
const text = `${normalizedPath} ${file.exportedSymbols.join(" ")} ${file.imports.join(" ")}`.toLowerCase();
|
|
66
|
+
return /(^|\/)(src\/)?(auth|proxy|middleware)\.[cm]?[jt]sx?$/.test(normalizedPath)
|
|
67
|
+
|| /providers?\.[cm]?[jt]sx?$/.test(normalizedPath) && text.includes("next-auth")
|
|
68
|
+
|| /(app-shell|layout)\.[cm]?[jt]sx?$/.test(normalizedPath) && /\b(signout|usesession|sessionprovider)\b/.test(text);
|
|
69
|
+
}
|
|
70
|
+
function buildFeatureTermsMessages(snapshot) {
|
|
71
|
+
const features = snapshot.features.map((feature) => ({
|
|
72
|
+
name: feature.name,
|
|
73
|
+
files: feature.files,
|
|
74
|
+
entryPoints: feature.entryPoints,
|
|
75
|
+
currentSearchTerms: feature.searchTerms
|
|
76
|
+
}));
|
|
77
|
+
return [
|
|
78
|
+
{
|
|
79
|
+
role: "system",
|
|
80
|
+
content: [
|
|
81
|
+
"You improve feature metadata for a compact repository snapshot.",
|
|
82
|
+
"Return a JSON array only.",
|
|
83
|
+
"Each item must have name, purpose, and searchTerms.",
|
|
84
|
+
"purpose must be one sentence maximum.",
|
|
85
|
+
"searchTerms must be max 8 concrete retrieval terms.",
|
|
86
|
+
"Avoid vague terms: data, logic, handler, service, feature, app, page.",
|
|
87
|
+
"Do not invent files or project-specific paths."
|
|
88
|
+
].join(" ")
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
role: "user",
|
|
92
|
+
content: JSON.stringify(features, null, 2)
|
|
93
|
+
}
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
async function completeJsonArray(client, messages, model, fallbackModels) {
|
|
97
|
+
try {
|
|
98
|
+
const response = await client.complete({
|
|
99
|
+
messages,
|
|
100
|
+
model,
|
|
101
|
+
fallbackModels,
|
|
102
|
+
maxCompletionTokens: 900,
|
|
103
|
+
temperature: 0
|
|
104
|
+
});
|
|
105
|
+
const parsed = JSON.parse(response.content);
|
|
106
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function applyFilePurposeUpdates(snapshot, updates) {
|
|
113
|
+
const fileIndex = { ...snapshot.fileIndex };
|
|
114
|
+
for (const update of updates) {
|
|
115
|
+
if (typeof update.path !== "string" || !fileIndex[update.path]) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const purpose = normalizePurpose(update.purpose);
|
|
119
|
+
const searchTerms = normalizeSearchTerms(update.searchTerms);
|
|
120
|
+
fileIndex[update.path] = {
|
|
121
|
+
...fileIndex[update.path],
|
|
122
|
+
...(purpose ? { purpose } : {}),
|
|
123
|
+
searchTerms: mergeTerms(fileIndex[update.path].searchTerms, searchTerms)
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return { ...snapshot, fileIndex };
|
|
127
|
+
}
|
|
128
|
+
function applyFeatureUpdates(snapshot, updates) {
|
|
129
|
+
return {
|
|
130
|
+
...snapshot,
|
|
131
|
+
features: snapshot.features.map((feature) => {
|
|
132
|
+
const update = updates.find((item) => item.name === feature.name);
|
|
133
|
+
if (!update) {
|
|
134
|
+
return feature;
|
|
135
|
+
}
|
|
136
|
+
const purpose = normalizePurpose(update.purpose);
|
|
137
|
+
const searchTerms = normalizeSearchTerms(update.searchTerms);
|
|
138
|
+
return {
|
|
139
|
+
...feature,
|
|
140
|
+
...(purpose ? { purpose } : {}),
|
|
141
|
+
searchTerms: mergeTerms(feature.searchTerms, searchTerms)
|
|
142
|
+
};
|
|
143
|
+
})
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function normalizePurpose(value) {
|
|
147
|
+
if (typeof value !== "string") {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
const trimmed = value.replace(/\s+/g, " ").trim();
|
|
151
|
+
if (!trimmed) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
return trimmed.split(/(?<=[.!?])\s+/)[0]?.slice(0, 180) ?? null;
|
|
155
|
+
}
|
|
156
|
+
function normalizeSearchTerms(value) {
|
|
157
|
+
if (!Array.isArray(value)) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
return value
|
|
161
|
+
.filter((item) => typeof item === "string")
|
|
162
|
+
.map((item) => item.toLowerCase().replace(/[^a-z0-9\s-]+/g, " ").replace(/\s+/g, " ").trim())
|
|
163
|
+
.filter((item) => item.length > 1 && item.split(/\s+/).length <= 3 && !isVagueTerm(item))
|
|
164
|
+
.slice(0, MAX_SEARCH_TERMS);
|
|
165
|
+
}
|
|
166
|
+
function mergeTerms(left, right) {
|
|
167
|
+
return [...new Set([...left, ...right])].slice(0, 12);
|
|
168
|
+
}
|
|
169
|
+
function isVagueTerm(term) {
|
|
170
|
+
return new Set([
|
|
171
|
+
"app",
|
|
172
|
+
"data",
|
|
173
|
+
"feature",
|
|
174
|
+
"logic",
|
|
175
|
+
"handler",
|
|
176
|
+
"page",
|
|
177
|
+
"service",
|
|
178
|
+
"system"
|
|
179
|
+
]).has(term);
|
|
180
|
+
}
|
|
181
|
+
function chunk(items, size) {
|
|
182
|
+
const chunks = [];
|
|
183
|
+
for (let index = 0; index < items.length; index += size) {
|
|
184
|
+
chunks.push(items.slice(index, index + size));
|
|
185
|
+
}
|
|
186
|
+
return chunks;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=snapshotEnrichment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshotEnrichment.js","sourceRoot":"","sources":["../../src/ai/snapshotEnrichment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type AiMessage = {
|
|
2
|
+
role: "system" | "user" | "assistant";
|
|
3
|
+
content: string;
|
|
4
|
+
};
|
|
5
|
+
export type AiCompletionRequest = {
|
|
6
|
+
messages: AiMessage[];
|
|
7
|
+
model: string;
|
|
8
|
+
fallbackModels?: readonly string[];
|
|
9
|
+
/** @deprecated Use fallbackModels for ordered multi-model failover. */
|
|
10
|
+
fallbackModel?: string;
|
|
11
|
+
maxCompletionTokens?: number;
|
|
12
|
+
temperature?: number;
|
|
13
|
+
};
|
|
14
|
+
export type AiTokenUsage = {
|
|
15
|
+
promptTokens: number;
|
|
16
|
+
completionTokens: number;
|
|
17
|
+
totalTokens: number;
|
|
18
|
+
};
|
|
19
|
+
export type AiCompletionResult = {
|
|
20
|
+
content: string;
|
|
21
|
+
model: string;
|
|
22
|
+
usage?: AiTokenUsage;
|
|
23
|
+
};
|
|
24
|
+
export type AiDeltaHandler = (delta: string) => void;
|
|
25
|
+
export interface AiClient {
|
|
26
|
+
complete(request: AiCompletionRequest): Promise<AiCompletionResult>;
|
|
27
|
+
stream?(request: AiCompletionRequest, onDelta: AiDeltaHandler): Promise<AiCompletionResult>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAErD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpE,MAAM,CAAC,CACL,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAChC"}
|
package/dist/ai/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RouteInfo } from "../../detectors/index.js";
|
|
2
|
+
import type { EntityInfo, IRouteFallbackExtractor } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* RouteFallbackExtractor — derive entity names dari URL segments sebagai
|
|
5
|
+
* best-effort fallback kalau tidak ada schema source yang ditemukan.
|
|
6
|
+
*
|
|
7
|
+
* Confidence: low — hanya dapat names, zero field/relation data.
|
|
8
|
+
* Tapi tetap berguna buat capabilityDetector dan domain inference.
|
|
9
|
+
*
|
|
10
|
+
* Contoh:
|
|
11
|
+
* /api/snippets → "Snippet"
|
|
12
|
+
* /api/workspaces/[id] → "Workspace"
|
|
13
|
+
* /api/collections → "Collection"
|
|
14
|
+
*/
|
|
15
|
+
export declare class RouteFallbackExtractor implements IRouteFallbackExtractor {
|
|
16
|
+
readonly name = "route-fallback";
|
|
17
|
+
extract(routes: RouteInfo[]): EntityInfo[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* singularize — simple English singularization untuk route segments.
|
|
21
|
+
* Cukup buat common REST conventions, bukan full NLP.
|
|
22
|
+
*
|
|
23
|
+
* "snippets" → "Snippet"
|
|
24
|
+
* "categories" → "Category"
|
|
25
|
+
* "replies" → "Reply"
|
|
26
|
+
* "workspaces" → "Workspace"
|
|
27
|
+
* "media" → "Media" (irregular, tidak diubah)
|
|
28
|
+
*/
|
|
29
|
+
export declare function singularize(word: string): string;
|
|
30
|
+
//# sourceMappingURL=fallbackExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallbackExtractor.d.ts","sourceRoot":"","sources":["../../../../src/analyzers/analysis/extractors/fallbackExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAsCtE;;;;;;;;;;;GAWG;AACH,qBAAa,sBAAuB,YAAW,uBAAuB;IACpE,QAAQ,CAAC,IAAI,oBAAoB;IAEjC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE;CAyB3C;AAMD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4BhD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Constants
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Segments yang sering muncul di URL tapi bukan entity name.
|
|
6
|
+
* Difilter biar gak muncul sebagai entity hint.
|
|
7
|
+
*/
|
|
8
|
+
const ROUTE_NON_ENTITY_SEGMENTS = new Set([
|
|
9
|
+
"api", "v1", "v2", "v3",
|
|
10
|
+
"public", "internal", "private",
|
|
11
|
+
"auth", "oauth", "callback",
|
|
12
|
+
"health", "ping", "status",
|
|
13
|
+
"static", "assets", "files",
|
|
14
|
+
"me", "self",
|
|
15
|
+
]);
|
|
16
|
+
/**
|
|
17
|
+
* Kata irregular yang singularization-nya tidak bisa di-derive dari suffix rules.
|
|
18
|
+
* Key = lowercase plural, value = singular yang benar.
|
|
19
|
+
*/
|
|
20
|
+
const IRREGULAR_SINGULAR = new Map([
|
|
21
|
+
["media", "media"],
|
|
22
|
+
["data", "data"],
|
|
23
|
+
["people", "person"],
|
|
24
|
+
["children", "child"],
|
|
25
|
+
["teeth", "tooth"],
|
|
26
|
+
["feet", "foot"],
|
|
27
|
+
["mice", "mouse"],
|
|
28
|
+
["geese", "goose"],
|
|
29
|
+
]);
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Extractor
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* RouteFallbackExtractor — derive entity names dari URL segments sebagai
|
|
35
|
+
* best-effort fallback kalau tidak ada schema source yang ditemukan.
|
|
36
|
+
*
|
|
37
|
+
* Confidence: low — hanya dapat names, zero field/relation data.
|
|
38
|
+
* Tapi tetap berguna buat capabilityDetector dan domain inference.
|
|
39
|
+
*
|
|
40
|
+
* Contoh:
|
|
41
|
+
* /api/snippets → "Snippet"
|
|
42
|
+
* /api/workspaces/[id] → "Workspace"
|
|
43
|
+
* /api/collections → "Collection"
|
|
44
|
+
*/
|
|
45
|
+
export class RouteFallbackExtractor {
|
|
46
|
+
name = "route-fallback";
|
|
47
|
+
extract(routes) {
|
|
48
|
+
const entityNames = new Set();
|
|
49
|
+
for (const route of routes.filter((r) => r.kind === "api")) {
|
|
50
|
+
const segments = route.path.split("/").filter(Boolean);
|
|
51
|
+
for (const segment of segments) {
|
|
52
|
+
// Skip dynamic segments: [id], [slug], [...catchall]
|
|
53
|
+
if (segment.startsWith("["))
|
|
54
|
+
continue;
|
|
55
|
+
// Skip short segments: "v1", "id", dll
|
|
56
|
+
if (segment.length <= 2)
|
|
57
|
+
continue;
|
|
58
|
+
// Skip common non-entity prefixes
|
|
59
|
+
if (ROUTE_NON_ENTITY_SEGMENTS.has(segment.toLowerCase()))
|
|
60
|
+
continue;
|
|
61
|
+
entityNames.add(singularize(segment));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return [...entityNames].map((name) => ({
|
|
65
|
+
name,
|
|
66
|
+
fields: [],
|
|
67
|
+
relations: [],
|
|
68
|
+
source: "route-hint",
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Singularization
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
/**
|
|
76
|
+
* singularize — simple English singularization untuk route segments.
|
|
77
|
+
* Cukup buat common REST conventions, bukan full NLP.
|
|
78
|
+
*
|
|
79
|
+
* "snippets" → "Snippet"
|
|
80
|
+
* "categories" → "Category"
|
|
81
|
+
* "replies" → "Reply"
|
|
82
|
+
* "workspaces" → "Workspace"
|
|
83
|
+
* "media" → "Media" (irregular, tidak diubah)
|
|
84
|
+
*/
|
|
85
|
+
export function singularize(word) {
|
|
86
|
+
const lower = word.toLowerCase();
|
|
87
|
+
// Irregular — cek duluan sebelum suffix rules
|
|
88
|
+
if (IRREGULAR_SINGULAR.has(lower)) {
|
|
89
|
+
return capitalize(IRREGULAR_SINGULAR.get(lower) ?? lower);
|
|
90
|
+
}
|
|
91
|
+
// "categories" → "category", "replies" → "reply"
|
|
92
|
+
if (lower.endsWith("ies")) {
|
|
93
|
+
return capitalize(lower.slice(0, -3) + "y");
|
|
94
|
+
}
|
|
95
|
+
// "addresses" → "address", "churches" → "church", "boxes" → "box"
|
|
96
|
+
// (stem itself ends in a hard consonant cluster that takes "-es")
|
|
97
|
+
if (lower.endsWith("sses") || lower.endsWith("xes") || lower.endsWith("ches") || lower.endsWith("shes")) {
|
|
98
|
+
return capitalize(lower.slice(0, -2));
|
|
99
|
+
}
|
|
100
|
+
// "verses" → "verse", "houses" → "house", "cases" → "case", "responses" → "response"
|
|
101
|
+
// (singular already ends in a silent "e" before the "s" — plural just adds "s", not "es")
|
|
102
|
+
if (lower.endsWith("ses")) {
|
|
103
|
+
return capitalize(lower.slice(0, -1));
|
|
104
|
+
}
|
|
105
|
+
// "workspaces", "snippets", "collections" — trailing -s yang umum
|
|
106
|
+
if (lower.endsWith("s") && !lower.endsWith("ss")) {
|
|
107
|
+
return capitalize(lower.slice(0, -1));
|
|
108
|
+
}
|
|
109
|
+
return capitalize(lower);
|
|
110
|
+
}
|
|
111
|
+
function capitalize(str) {
|
|
112
|
+
return str.length === 0 ? str : str[0].toUpperCase() + str.slice(1);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=fallbackExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallbackExtractor.js","sourceRoot":"","sources":["../../../../src/analyzers/analysis/extractors/fallbackExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ScannedFile } from "../index.js";
|
|
2
|
+
import type { RouteInfo } from "../../detectors/index.js";
|
|
3
|
+
import type { EntityGraph } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* extractEntities — scan files dan build entity graph.
|
|
6
|
+
*
|
|
7
|
+
* Fallback chain:
|
|
8
|
+
* 1. Iterate EXTRACTORS — stop di hasil pertama yang non-empty
|
|
9
|
+
* 2. Kalau semua kosong dan ada routes → route-hint fallback
|
|
10
|
+
* 3. Kalau routes juga kosong → return empty graph
|
|
11
|
+
*
|
|
12
|
+
* Relation graph di-build dari entity fields setelah semua entities terkumpul.
|
|
13
|
+
* Dedup entity dilakukan di sini (bukan di extractor) untuk handle Prisma multi-file schema.
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractEntities(files: ScannedFile[], routes?: RouteInfo[]): EntityGraph;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/analyzers/analysis/extractors/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAA8C,MAAM,YAAY,CAAC;AAsC1F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAAE,EACpB,MAAM,GAAE,SAAS,EAAO,GACvB,WAAW,CAiCb"}
|