@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,30 @@
|
|
|
1
|
+
const NON_PRODUCTION_SEGMENTS = new Set([
|
|
2
|
+
"__fixtures__",
|
|
3
|
+
"__mocks__",
|
|
4
|
+
"__tests__",
|
|
5
|
+
"coverage",
|
|
6
|
+
"demo",
|
|
7
|
+
"docs",
|
|
8
|
+
"example",
|
|
9
|
+
"examples",
|
|
10
|
+
"fixtures",
|
|
11
|
+
"samples",
|
|
12
|
+
"test",
|
|
13
|
+
"tests"
|
|
14
|
+
]);
|
|
15
|
+
export function isArchitectureSource(path) {
|
|
16
|
+
const normalized = path.toLowerCase();
|
|
17
|
+
const segments = normalized.split("/");
|
|
18
|
+
if (segments.some((segment) => NON_PRODUCTION_SEGMENTS.has(segment))) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return !(normalized.endsWith(".test.ts")
|
|
22
|
+
|| normalized.endsWith(".test.tsx")
|
|
23
|
+
|| normalized.endsWith(".test.js")
|
|
24
|
+
|| normalized.endsWith(".test.jsx")
|
|
25
|
+
|| normalized.endsWith(".spec.ts")
|
|
26
|
+
|| normalized.endsWith(".spec.tsx")
|
|
27
|
+
|| normalized.endsWith(".spec.js")
|
|
28
|
+
|| normalized.endsWith(".spec.jsx"));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=sourceScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceScope.js","sourceRoot":"","sources":["../../../src/analyzers/graph/sourceScope.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,cAAc;IACd,WAAW;IACX,WAAW;IACX,UAAU;IACV,MAAM;IACN,MAAM;IACN,SAAS;IACT,UAAU;IACV,UAAU;IACV,SAAS;IACT,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,CACN,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC5B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;WAChC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC/B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;WAChC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC/B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;WAChC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC/B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { EntityGraph } from "../analysis/index.js";
|
|
2
|
+
import type { CapabilityInfo } from "../detectors/index.js";
|
|
3
|
+
import type { FeatureInfo } from "../features/index.js";
|
|
4
|
+
import { type OwnershipPattern } from "./ownershipTopology.js";
|
|
5
|
+
export type DomainInferenceResult = {
|
|
6
|
+
/** e.g. "Code Snippet Manager", "E-Commerce Platform", "LMS" */
|
|
7
|
+
domain: string;
|
|
8
|
+
/** Human-readable summary of what the project does */
|
|
9
|
+
summary: string;
|
|
10
|
+
/** Domain-specific features AI inferred — tidak hardcode, truly dynamic */
|
|
11
|
+
domainFeatures: DomainFeature[];
|
|
12
|
+
confidence: number;
|
|
13
|
+
model: string;
|
|
14
|
+
/** Total tokens used — buat monitoring cost */
|
|
15
|
+
tokensUsed: number;
|
|
16
|
+
};
|
|
17
|
+
export type DomainFeature = {
|
|
18
|
+
name: string;
|
|
19
|
+
purpose: string;
|
|
20
|
+
relatedEntities: string[];
|
|
21
|
+
};
|
|
22
|
+
export type DomainInferenceInput = {
|
|
23
|
+
entityNames: string[];
|
|
24
|
+
relations: Array<{
|
|
25
|
+
from: string;
|
|
26
|
+
to: string;
|
|
27
|
+
kind: string;
|
|
28
|
+
}>;
|
|
29
|
+
capabilities: string[];
|
|
30
|
+
technicalFeatures: string[];
|
|
31
|
+
routeCount: number;
|
|
32
|
+
framework: string;
|
|
33
|
+
ownershipPattern: OwnershipPattern;
|
|
34
|
+
crossUserFields: string[];
|
|
35
|
+
absentCapabilities: string[];
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* inferDomain — kirim structured metadata ke AI, dapat domain understanding.
|
|
39
|
+
*
|
|
40
|
+
* INTENTIONALLY tidak kirim raw source code — hanya metadata terstruktur.
|
|
41
|
+
* Ini menjaga token usage minimal (~300-500 token per call) dan
|
|
42
|
+
* memastikan AI focus pada domain inference, bukan code analysis.
|
|
43
|
+
*
|
|
44
|
+
* Cache: result di-cache di .devmap/domain-cache.json berdasarkan hash input.
|
|
45
|
+
* Kalau input tidak berubah, cached result dipakai langsung (no LLM call).
|
|
46
|
+
* Ini memastikan analyze idempotent — feature names tidak berubah tiap run.
|
|
47
|
+
*
|
|
48
|
+
* Dipanggil SETELAH static analysis selesai (Step 1-4) — sebagai enhancement,
|
|
49
|
+
* bukan replacement. Kalau AI unavailable, static features tetap ada.
|
|
50
|
+
*
|
|
51
|
+
* @param input - Structured metadata dari static analysis
|
|
52
|
+
* @param callAI - Injected AI caller — decoupled dari provider specifics
|
|
53
|
+
* @param projectRoot - Root project path, untuk baca/tulis cache
|
|
54
|
+
*/
|
|
55
|
+
export declare function inferDomain(input: DomainInferenceInput, callAI: (prompt: string) => Promise<string>, projectRoot?: string): Promise<DomainInferenceResult | null>;
|
|
56
|
+
export declare function domainFeaturesToFeatureInfo(domainFeatures: DomainFeature[]): FeatureInfo[];
|
|
57
|
+
export declare function buildDomainInferenceInput(entityGraph: EntityGraph, capabilities: CapabilityInfo[], features: FeatureInfo[], framework: string, routeCount: number): DomainInferenceInput;
|
|
58
|
+
//# sourceMappingURL=domainInference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domainInference.d.ts","sourceRoot":"","sources":["../../../src/analyzers/inference/domainInference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAA6B,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1F,MAAM,MAAM,qBAAqB,GAAG;IAClC,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC;AAgFF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAC3C,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAgCvC;AA4GD,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,aAAa,EAAE,GAC9B,WAAW,EAAE,CAmBf;AAWD,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,cAAc,EAAE,EAC9B,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAuBtB"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { classifyOwnershipTopology } from "./ownershipTopology.js";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
function hashDomainInput(input) {
|
|
6
|
+
const stable = JSON.stringify({
|
|
7
|
+
v: 2,
|
|
8
|
+
entityNames: [...input.entityNames].sort(),
|
|
9
|
+
relations: [...input.relations]
|
|
10
|
+
.map((r) => `${r.from}:${r.kind}:${r.to}`)
|
|
11
|
+
.sort(),
|
|
12
|
+
capabilities: [...input.capabilities].sort(),
|
|
13
|
+
technicalFeatures: [...input.technicalFeatures].sort(),
|
|
14
|
+
routeCount: input.routeCount,
|
|
15
|
+
framework: input.framework,
|
|
16
|
+
ownershipPattern: input.ownershipPattern,
|
|
17
|
+
crossUserFields: [...input.crossUserFields].sort(),
|
|
18
|
+
absentCapabilities: [...input.absentCapabilities].sort(),
|
|
19
|
+
});
|
|
20
|
+
return createHash("sha256").update(stable).digest("hex").slice(0, 16);
|
|
21
|
+
}
|
|
22
|
+
async function readDomainCache(projectRoot, inputHash) {
|
|
23
|
+
try {
|
|
24
|
+
const cachePath = join(projectRoot, ".devmap", "domain-cache.json");
|
|
25
|
+
const raw = await readFile(cachePath, "utf-8");
|
|
26
|
+
const cache = JSON.parse(raw);
|
|
27
|
+
if (cache.inputHash !== inputHash)
|
|
28
|
+
return null; // input berubah → stale
|
|
29
|
+
return cache.result;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null; // file tidak ada atau corrupt → miss
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function writeDomainCache(projectRoot, inputHash, result) {
|
|
36
|
+
try {
|
|
37
|
+
const devmapDir = join(projectRoot, ".devmap");
|
|
38
|
+
await mkdir(devmapDir, { recursive: true });
|
|
39
|
+
const cachePath = join(devmapDir, "domain-cache.json");
|
|
40
|
+
const cache = {
|
|
41
|
+
inputHash,
|
|
42
|
+
result,
|
|
43
|
+
cachedAt: new Date().toISOString(),
|
|
44
|
+
};
|
|
45
|
+
await writeFile(cachePath, JSON.stringify(cache, null, 2) + "\n", "utf-8");
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Cache write gagal = non-fatal, lanjut tanpa cache
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Main entry
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
/**
|
|
55
|
+
* inferDomain — kirim structured metadata ke AI, dapat domain understanding.
|
|
56
|
+
*
|
|
57
|
+
* INTENTIONALLY tidak kirim raw source code — hanya metadata terstruktur.
|
|
58
|
+
* Ini menjaga token usage minimal (~300-500 token per call) dan
|
|
59
|
+
* memastikan AI focus pada domain inference, bukan code analysis.
|
|
60
|
+
*
|
|
61
|
+
* Cache: result di-cache di .devmap/domain-cache.json berdasarkan hash input.
|
|
62
|
+
* Kalau input tidak berubah, cached result dipakai langsung (no LLM call).
|
|
63
|
+
* Ini memastikan analyze idempotent — feature names tidak berubah tiap run.
|
|
64
|
+
*
|
|
65
|
+
* Dipanggil SETELAH static analysis selesai (Step 1-4) — sebagai enhancement,
|
|
66
|
+
* bukan replacement. Kalau AI unavailable, static features tetap ada.
|
|
67
|
+
*
|
|
68
|
+
* @param input - Structured metadata dari static analysis
|
|
69
|
+
* @param callAI - Injected AI caller — decoupled dari provider specifics
|
|
70
|
+
* @param projectRoot - Root project path, untuk baca/tulis cache
|
|
71
|
+
*/
|
|
72
|
+
export async function inferDomain(input, callAI, projectRoot) {
|
|
73
|
+
// Skip kalau data terlalu sedikit — AI inference gak akan meaningful
|
|
74
|
+
if (input.entityNames.length === 0 && input.capabilities.length === 0) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const inputHash = hashDomainInput(input);
|
|
78
|
+
// Cache hit → return langsung, no LLM call
|
|
79
|
+
if (projectRoot) {
|
|
80
|
+
const cached = await readDomainCache(projectRoot, inputHash);
|
|
81
|
+
if (cached)
|
|
82
|
+
return cached;
|
|
83
|
+
}
|
|
84
|
+
const prompt = buildDomainInferencePrompt(input);
|
|
85
|
+
try {
|
|
86
|
+
const raw = await callAI(prompt);
|
|
87
|
+
const result = parseDomainInferenceResponse(raw, input);
|
|
88
|
+
if (!result)
|
|
89
|
+
return null;
|
|
90
|
+
// Tulis ke cache buat run berikutnya
|
|
91
|
+
if (projectRoot) {
|
|
92
|
+
await writeDomainCache(projectRoot, inputHash, result);
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// AI inference adalah enhancement, bukan blocker
|
|
98
|
+
// Kalau gagal, return null — caller tetap punya static features
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Prompt builder
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
/**
|
|
106
|
+
* buildDomainInferencePrompt — build minimal, structured prompt.
|
|
107
|
+
*
|
|
108
|
+
* Design principles:
|
|
109
|
+
* - Compact: hanya kirim yang AI butuhkan
|
|
110
|
+
* - Structured: JSON input biar AI gak perlu parse prose
|
|
111
|
+
* - Focused: satu task, satu output format
|
|
112
|
+
* - Bounded: max_tokens 600 cukup buat domain inference
|
|
113
|
+
*/
|
|
114
|
+
function buildDomainInferencePrompt(input) {
|
|
115
|
+
const metadata = JSON.stringify({
|
|
116
|
+
framework: input.framework,
|
|
117
|
+
entities: input.entityNames,
|
|
118
|
+
relations: input.relations.map((r) => `${r.from} ${r.kind} ${r.to}`),
|
|
119
|
+
capabilities: input.capabilities,
|
|
120
|
+
technicalFeatures: input.technicalFeatures,
|
|
121
|
+
routeCount: input.routeCount,
|
|
122
|
+
ownershipPattern: input.ownershipPattern,
|
|
123
|
+
crossUserFields: input.crossUserFields,
|
|
124
|
+
absentCapabilities: input.absentCapabilities,
|
|
125
|
+
}, null, 2);
|
|
126
|
+
return `You are analyzing a software project. Given this structural metadata, infer the project domain.
|
|
127
|
+
|
|
128
|
+
${metadata}
|
|
129
|
+
|
|
130
|
+
Respond with ONLY a JSON object (no markdown, no explanation):
|
|
131
|
+
{
|
|
132
|
+
"domain": "short domain name, e.g. Code Snippet Manager",
|
|
133
|
+
"summary": "1-2 sentences describing what this project does",
|
|
134
|
+
"confidence": 0.0-1.0,
|
|
135
|
+
"domainFeatures": [
|
|
136
|
+
{
|
|
137
|
+
"name": "Feature Name",
|
|
138
|
+
"purpose": "What this feature does",
|
|
139
|
+
"relatedEntities": ["Entity1", "Entity2"]
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
Rules:
|
|
145
|
+
- domainFeatures: 3-6 features specific to this domain, not generic technical features
|
|
146
|
+
- Do not include Authentication, Database, or other infrastructure as domainFeatures
|
|
147
|
+
- Base everything on the metadata provided, not assumptions
|
|
148
|
+
- Entity names alone (e.g. 'Message', 'Room', 'User') are NOT reliable signals of application domain. The same entity name can represent a chat message, an activity log, a personal note, or a comment — depending on ownership pattern, not naming. Use ownershipPattern and absentCapabilities as primary evidence: single_user_isolated strongly suggests a personal/private tool (notes, journal, tracker), not a multi-user communication platform. Only conclude 'chat' or 'messaging' domain if ownershipPattern is shared_access or direct_messaging, or detectedCapabilities includes collaboration/social/real-time.`;
|
|
149
|
+
}
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// Response parser
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
function parseDomainInferenceResponse(raw, input) {
|
|
154
|
+
try {
|
|
155
|
+
// Strip markdown fences kalau ada
|
|
156
|
+
const cleaned = raw
|
|
157
|
+
.replace(/^```json\s*/i, "")
|
|
158
|
+
.replace(/^```\s*/i, "")
|
|
159
|
+
.replace(/```\s*$/i, "")
|
|
160
|
+
.trim();
|
|
161
|
+
const parsed = JSON.parse(cleaned);
|
|
162
|
+
if (!parsed.domain || !parsed.summary)
|
|
163
|
+
return null;
|
|
164
|
+
const domainFeatures = (parsed.domainFeatures ?? [])
|
|
165
|
+
.filter((f) => f.name && f.purpose)
|
|
166
|
+
.map((f) => ({
|
|
167
|
+
name: f.name,
|
|
168
|
+
purpose: f.purpose,
|
|
169
|
+
relatedEntities: f.relatedEntities ?? []
|
|
170
|
+
}))
|
|
171
|
+
.slice(0, 6);
|
|
172
|
+
return {
|
|
173
|
+
domain: parsed.domain,
|
|
174
|
+
summary: parsed.summary,
|
|
175
|
+
domainFeatures,
|
|
176
|
+
confidence: Math.min(1, Math.max(0, parsed.confidence ?? 0.7)),
|
|
177
|
+
model: "unknown", // diisi caller
|
|
178
|
+
tokensUsed: 0 // diisi caller
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Helper — convert DomainFeature ke FeatureInfo buat merge ke snapshot
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
export function domainFeaturesToFeatureInfo(domainFeatures) {
|
|
189
|
+
return domainFeatures.map((df) => ({
|
|
190
|
+
name: df.name,
|
|
191
|
+
purpose: df.purpose,
|
|
192
|
+
files: [],
|
|
193
|
+
entryPoints: [],
|
|
194
|
+
businessFlow: [],
|
|
195
|
+
// searchTerms include relatedEntities agar similarity engine dapat
|
|
196
|
+
// mencocokkan AI feature dengan static feature via entity overlap.
|
|
197
|
+
// Contoh: AI returns relatedEntities: ["Plan", "Subscription"]
|
|
198
|
+
// Static feature "Plan Management" punya searchTerms: ["plan", "subscription", ...]
|
|
199
|
+
// → entityOverlap / termOverlap tinggi → di-merge, bukan duplicate.
|
|
200
|
+
searchTerms: [
|
|
201
|
+
...df.relatedEntities.map((e) => e.toLowerCase()),
|
|
202
|
+
...df.name.toLowerCase().split(/\s+/).filter(Boolean)
|
|
203
|
+
].filter((v, i, arr) => arr.indexOf(v) === i).slice(0, 12),
|
|
204
|
+
confidence: "medium", // AI-inferred = medium, bukan high
|
|
205
|
+
evidence: []
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// Helper — build DomainInferenceInput dari projectMap data
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
const ALL_CAPABILITY_KINDS = [
|
|
212
|
+
"crud", "sharing", "collaboration", "discovery", "publishing",
|
|
213
|
+
"social", "file-management", "real-time", "search", "reporting",
|
|
214
|
+
];
|
|
215
|
+
export function buildDomainInferenceInput(entityGraph, capabilities, features, framework, routeCount) {
|
|
216
|
+
const detectedKinds = new Set(capabilities.map((c) => c.kind));
|
|
217
|
+
const absentCapabilities = ALL_CAPABILITY_KINDS.filter((k) => !detectedKinds.has(k));
|
|
218
|
+
const ownershipResult = classifyOwnershipTopology(entityGraph, entityGraph.relations);
|
|
219
|
+
return {
|
|
220
|
+
entityNames: entityGraph.entityNames.slice(0, 15),
|
|
221
|
+
relations: entityGraph.relations.slice(0, 10),
|
|
222
|
+
capabilities: [...detectedKinds],
|
|
223
|
+
technicalFeatures: features
|
|
224
|
+
.filter((f) => f.confidence === "high" || f.confidence === "medium")
|
|
225
|
+
.map((f) => f.name)
|
|
226
|
+
.slice(0, 10),
|
|
227
|
+
framework,
|
|
228
|
+
routeCount,
|
|
229
|
+
ownershipPattern: ownershipResult.pattern,
|
|
230
|
+
crossUserFields: ownershipResult.crossUserFields.slice(0, 5),
|
|
231
|
+
absentCapabilities: absentCapabilities.slice(0, 8),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=domainInference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domainInference.js","sourceRoot":"","sources":["../../../src/analyzers/inference/domainInference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { inferDomain, domainFeaturesToFeatureInfo, buildDomainInferenceInput, } from "./domainInference.js";
|
|
2
|
+
export type { DomainInferenceResult, DomainFeature, DomainInferenceInput, } from "./domainInference.js";
|
|
3
|
+
export { classifyOwnershipTopology, } from "./ownershipTopology.js";
|
|
4
|
+
export type { OwnershipPattern, } from "./ownershipTopology.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/inference/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,gBAAgB,GACjB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/inference/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EntityGraph, RelationInfo } from "../analysis/index.js";
|
|
2
|
+
export type OwnershipPattern = "single_user_isolated" | "shared_access" | "direct_messaging" | "unclear";
|
|
3
|
+
export declare function classifyOwnershipTopology(entityGraph: EntityGraph, relations: RelationInfo[]): {
|
|
4
|
+
pattern: OwnershipPattern;
|
|
5
|
+
crossUserFields: string[];
|
|
6
|
+
evidence: string[];
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=ownershipTopology.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownershipTopology.d.ts","sourceRoot":"","sources":["../../../src/analyzers/inference/ownershipTopology.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GACxB,sBAAsB,GACtB,eAAe,GACf,kBAAkB,GAClB,SAAS,CAAC;AAWd,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,YAAY,EAAE,GACxB;IACD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAkEA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const CROSS_USER_FIELD_NAMES = [
|
|
2
|
+
"participants", "members", "invitedby", "sharedwith", "sharedby",
|
|
3
|
+
"recipientid", "senderid", "collaborators", "inviteeid", "inviterid",
|
|
4
|
+
];
|
|
5
|
+
function normalizeFieldName(name) {
|
|
6
|
+
return name.replace(/[^a-z0-9]/g, "").toLowerCase();
|
|
7
|
+
}
|
|
8
|
+
export function classifyOwnershipTopology(entityGraph, relations) {
|
|
9
|
+
const crossUserFields = [];
|
|
10
|
+
const evidence = [];
|
|
11
|
+
const userEntityName = entityGraph.entities.find((e) => e.name.toLowerCase() === "user")?.name ?? "User";
|
|
12
|
+
for (const entity of entityGraph.entities) {
|
|
13
|
+
for (const field of entity.fields) {
|
|
14
|
+
const normalized = normalizeFieldName(field.name);
|
|
15
|
+
if (CROSS_USER_FIELD_NAMES.includes(normalized)) {
|
|
16
|
+
crossUserFields.push(`${entity.name}.${field.name}`);
|
|
17
|
+
evidence.push(`field:${entity.name}.${field.name}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const multiUserRelations = relations.filter((r) => r.kind === "many-to-many"
|
|
22
|
+
&& (r.from === userEntityName || r.to === userEntityName));
|
|
23
|
+
if (multiUserRelations.length > 0) {
|
|
24
|
+
evidence.push(`many-to-many:${userEntityName} ↔ ${multiUserRelations.map(r => r.from === userEntityName ? r.to : r.from).join(", ")}`);
|
|
25
|
+
}
|
|
26
|
+
const userFksInEntity = new Map();
|
|
27
|
+
for (const entity of entityGraph.entities) {
|
|
28
|
+
if (entity.name === userEntityName)
|
|
29
|
+
continue;
|
|
30
|
+
const userFks = entity.fields
|
|
31
|
+
.filter((f) => f.type === userEntityName || f.type === "String" || f.type === "Int")
|
|
32
|
+
.filter((f) => /(id|Id)$/.test(f.name))
|
|
33
|
+
.filter((f) => normalizeFieldName(f.name).includes(normalizeFieldName(userEntityName)));
|
|
34
|
+
if (userFks.length >= 2) {
|
|
35
|
+
userFksInEntity.set(entity.name, userFks.map(f => f.name));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const [entity, fks] of userFksInEntity) {
|
|
39
|
+
evidence.push(`multi-fk:${entity} has ${fks.length} FK to User (${fks.join(", ")})`);
|
|
40
|
+
}
|
|
41
|
+
const directMsgEntities = [...userFksInEntity.entries()]
|
|
42
|
+
.filter(([_, fks]) => {
|
|
43
|
+
const lowerFks = fks.map(f => normalizeFieldName(f));
|
|
44
|
+
return lowerFks.some(f => f.includes("sender") || f.includes("recipient"));
|
|
45
|
+
})
|
|
46
|
+
.map(([entity]) => entity);
|
|
47
|
+
if (directMsgEntities.length > 0) {
|
|
48
|
+
evidence.push(`direct_messaging:${directMsgEntities.join(", ")}`);
|
|
49
|
+
}
|
|
50
|
+
let pattern;
|
|
51
|
+
if (directMsgEntities.length > 0 && crossUserFields.length > 0) {
|
|
52
|
+
pattern = "direct_messaging";
|
|
53
|
+
}
|
|
54
|
+
else if (multiUserRelations.length > 0 || crossUserFields.length > 0) {
|
|
55
|
+
pattern = "shared_access";
|
|
56
|
+
}
|
|
57
|
+
else if (entityGraph.entities.length > 1 && multiUserRelations.length === 0 && crossUserFields.length === 0) {
|
|
58
|
+
pattern = "single_user_isolated";
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
pattern = "unclear";
|
|
62
|
+
}
|
|
63
|
+
return { pattern, crossUserFields, evidence };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ownershipTopology.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownershipTopology.js","sourceRoot":"","sources":["../../../src/analyzers/inference/ownershipTopology.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AnalyzerContext, FileAnalysis, FileAnalyzer } from "../analysis/index.js";
|
|
2
|
+
import type { ScannedFile } from "../analysis/index.js";
|
|
3
|
+
export declare class AnalyzerRegistry {
|
|
4
|
+
private readonly analyzers;
|
|
5
|
+
constructor(analyzers: FileAnalyzer[]);
|
|
6
|
+
analyze(file: ScannedFile, context: AnalyzerContext): Promise<FileAnalysis>;
|
|
7
|
+
}
|
|
8
|
+
export declare function analyzeFiles(files: ScannedFile[]): Promise<Record<string, FileAnalysis>>;
|
|
9
|
+
//# sourceMappingURL=analyzerRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzerRegistry.d.ts","sourceRoot":"","sources":["../../../src/analyzers/pipeline/analyzerRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,YAAY,EAAE;IAEhD,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CAalF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAa9F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FallbackAnalyzer, HeuristicAnalyzer } from "./heuristicAnalyzer.js";
|
|
2
|
+
import { TsMorphAnalyzer } from "../analysis/index.js";
|
|
3
|
+
export class AnalyzerRegistry {
|
|
4
|
+
analyzers;
|
|
5
|
+
constructor(analyzers) {
|
|
6
|
+
this.analyzers = analyzers;
|
|
7
|
+
}
|
|
8
|
+
async analyze(file, context) {
|
|
9
|
+
for (const analyzer of this.analyzers) {
|
|
10
|
+
if (!analyzer.supports(file))
|
|
11
|
+
continue;
|
|
12
|
+
try {
|
|
13
|
+
return await analyzer.analyze(file, context);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Continue to the next analyzer so malformed source still receives metadata.
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`No analyzer supports ${file.path}.`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function analyzeFiles(files) {
|
|
23
|
+
const registry = new AnalyzerRegistry([
|
|
24
|
+
new TsMorphAnalyzer(),
|
|
25
|
+
new HeuristicAnalyzer(),
|
|
26
|
+
new FallbackAnalyzer()
|
|
27
|
+
]);
|
|
28
|
+
const context = { files };
|
|
29
|
+
const entries = await Promise.all(files.map(async (file) => [
|
|
30
|
+
file.path,
|
|
31
|
+
await registry.analyze(file, context)
|
|
32
|
+
]));
|
|
33
|
+
return Object.fromEntries(entries);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=analyzerRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzerRegistry.js","sourceRoot":"","sources":["../../../src/analyzers/pipeline/analyzerRegistry.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,SAAyB;QAAzB,cAAS,GAAT,SAAS,CAAgB;IAAG,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,IAAiB,EAAE,OAAwB;QACvD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEvC,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,6EAA6E;YAC/E,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAoB;IACrD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC;QACpC,IAAI,eAAe,EAAE;QACrB,IAAI,iBAAiB,EAAE;QACvB,IAAI,gBAAgB,EAAE;KACvB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC,IAAI;QACT,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;KAC7B,CAAC,CAAC,CAAC;IAEb,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AnalyzerContext, FileAnalysis, FileAnalyzer, ScannedFile } from "../analysis/index.js";
|
|
2
|
+
export declare class HeuristicAnalyzer implements FileAnalyzer {
|
|
3
|
+
readonly id = "heuristic";
|
|
4
|
+
supports(file: ScannedFile): boolean;
|
|
5
|
+
analyze(file: ScannedFile, _context: AnalyzerContext): Promise<FileAnalysis>;
|
|
6
|
+
}
|
|
7
|
+
export declare class FallbackAnalyzer implements FileAnalyzer {
|
|
8
|
+
readonly id = "fallback";
|
|
9
|
+
supports(_file: ScannedFile): boolean;
|
|
10
|
+
analyze(_file: ScannedFile, _context: AnalyzerContext): Promise<FileAnalysis>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=heuristicAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heuristicAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/pipeline/heuristicAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EAGZ,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAuB9B,qBAAa,iBAAkB,YAAW,YAAY;IACpD,QAAQ,CAAC,EAAE,eAAe;IAE1B,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAI9B,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CA8BnF;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,EAAE,cAAc;IAEzB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAI/B,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CAUpF"}
|