memor-code-cli 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 +109 -0
- package/dist/IntentionalStructure/index.d.ts +13 -0
- package/dist/IntentionalStructure/index.d.ts.map +1 -0
- package/dist/IntentionalStructure/index.js +46 -0
- package/dist/IntentionalStructure/index.js.map +1 -0
- package/dist/IntentionalStructure/parseCompose.d.ts +13 -0
- package/dist/IntentionalStructure/parseCompose.d.ts.map +1 -0
- package/dist/IntentionalStructure/parseCompose.js +234 -0
- package/dist/IntentionalStructure/parseCompose.js.map +1 -0
- package/dist/IntentionalStructure/parseDeployConfigs.d.ts +7 -0
- package/dist/IntentionalStructure/parseDeployConfigs.d.ts.map +1 -0
- package/dist/IntentionalStructure/parseDeployConfigs.js +168 -0
- package/dist/IntentionalStructure/parseDeployConfigs.js.map +1 -0
- package/dist/IntentionalStructure/parseEnvWiring.d.ts +7 -0
- package/dist/IntentionalStructure/parseEnvWiring.d.ts.map +1 -0
- package/dist/IntentionalStructure/parseEnvWiring.js +159 -0
- package/dist/IntentionalStructure/parseEnvWiring.js.map +1 -0
- package/dist/IntentionalStructure/parseWorkspaces.d.ts +8 -0
- package/dist/IntentionalStructure/parseWorkspaces.d.ts.map +1 -0
- package/dist/IntentionalStructure/parseWorkspaces.js +179 -0
- package/dist/IntentionalStructure/parseWorkspaces.js.map +1 -0
- package/dist/IntentionalStructure/types.d.ts +34 -0
- package/dist/IntentionalStructure/types.d.ts.map +1 -0
- package/dist/IntentionalStructure/types.js +8 -0
- package/dist/IntentionalStructure/types.js.map +1 -0
- package/dist/RepoTypeDetection/applyRepoModeConsistency.d.ts +11 -0
- package/dist/RepoTypeDetection/applyRepoModeConsistency.d.ts.map +1 -0
- package/dist/RepoTypeDetection/applyRepoModeConsistency.js +53 -0
- package/dist/RepoTypeDetection/applyRepoModeConsistency.js.map +1 -0
- package/dist/RepoTypeDetection/detectAppArchetype.d.ts +12 -0
- package/dist/RepoTypeDetection/detectAppArchetype.d.ts.map +1 -0
- package/dist/RepoTypeDetection/detectAppArchetype.js +162 -0
- package/dist/RepoTypeDetection/detectAppArchetype.js.map +1 -0
- package/dist/RepoTypeDetection/detectPackageArchetype.d.ts +10 -0
- package/dist/RepoTypeDetection/detectPackageArchetype.d.ts.map +1 -0
- package/dist/RepoTypeDetection/detectPackageArchetype.js +149 -0
- package/dist/RepoTypeDetection/detectPackageArchetype.js.map +1 -0
- package/dist/RepoTypeDetection/detectRepoCenterSystems.d.ts +11 -0
- package/dist/RepoTypeDetection/detectRepoCenterSystems.d.ts.map +1 -0
- package/dist/RepoTypeDetection/detectRepoCenterSystems.js +123 -0
- package/dist/RepoTypeDetection/detectRepoCenterSystems.js.map +1 -0
- package/dist/RepoTypeDetection/detectRepoMode.d.ts +16 -0
- package/dist/RepoTypeDetection/detectRepoMode.d.ts.map +1 -0
- package/dist/RepoTypeDetection/detectRepoMode.js +338 -0
- package/dist/RepoTypeDetection/detectRepoMode.js.map +1 -0
- package/dist/RepoTypeDetection/detectRepoSignals.d.ts +13 -0
- package/dist/RepoTypeDetection/detectRepoSignals.d.ts.map +1 -0
- package/dist/RepoTypeDetection/detectRepoSignals.js +451 -0
- package/dist/RepoTypeDetection/detectRepoSignals.js.map +1 -0
- package/dist/RepoTypeDetection/inferSupportRole.d.ts +8 -0
- package/dist/RepoTypeDetection/inferSupportRole.d.ts.map +1 -0
- package/dist/RepoTypeDetection/inferSupportRole.js +177 -0
- package/dist/RepoTypeDetection/inferSupportRole.js.map +1 -0
- package/dist/RuntimeInference/detectEnvConsumers.d.ts +7 -0
- package/dist/RuntimeInference/detectEnvConsumers.d.ts.map +1 -0
- package/dist/RuntimeInference/detectEnvConsumers.js +108 -0
- package/dist/RuntimeInference/detectEnvConsumers.js.map +1 -0
- package/dist/RuntimeInference/detectHttpEdges.d.ts +4 -0
- package/dist/RuntimeInference/detectHttpEdges.d.ts.map +1 -0
- package/dist/RuntimeInference/detectHttpEdges.js +146 -0
- package/dist/RuntimeInference/detectHttpEdges.js.map +1 -0
- package/dist/RuntimeInference/detectOrmConsumers.d.ts +5 -0
- package/dist/RuntimeInference/detectOrmConsumers.d.ts.map +1 -0
- package/dist/RuntimeInference/detectOrmConsumers.js +117 -0
- package/dist/RuntimeInference/detectOrmConsumers.js.map +1 -0
- package/dist/RuntimeInference/detectProxyRewrites.d.ts +5 -0
- package/dist/RuntimeInference/detectProxyRewrites.d.ts.map +1 -0
- package/dist/RuntimeInference/detectProxyRewrites.js +137 -0
- package/dist/RuntimeInference/detectProxyRewrites.js.map +1 -0
- package/dist/RuntimeInference/detectTrpcEdges.d.ts +4 -0
- package/dist/RuntimeInference/detectTrpcEdges.d.ts.map +1 -0
- package/dist/RuntimeInference/detectTrpcEdges.js +137 -0
- package/dist/RuntimeInference/detectTrpcEdges.js.map +1 -0
- package/dist/RuntimeInference/index.d.ts +17 -0
- package/dist/RuntimeInference/index.d.ts.map +1 -0
- package/dist/RuntimeInference/index.js +32 -0
- package/dist/RuntimeInference/index.js.map +1 -0
- package/dist/RuntimeInference/types.d.ts +8 -0
- package/dist/RuntimeInference/types.d.ts.map +1 -0
- package/dist/RuntimeInference/types.js +3 -0
- package/dist/RuntimeInference/types.js.map +1 -0
- package/dist/SystemSynthesis/index.d.ts +27 -0
- package/dist/SystemSynthesis/index.d.ts.map +1 -0
- package/dist/SystemSynthesis/index.js +31 -0
- package/dist/SystemSynthesis/index.js.map +1 -0
- package/dist/SystemSynthesis/mergeLayerOutputs.d.ts +13 -0
- package/dist/SystemSynthesis/mergeLayerOutputs.d.ts.map +1 -0
- package/dist/SystemSynthesis/mergeLayerOutputs.js +220 -0
- package/dist/SystemSynthesis/mergeLayerOutputs.js.map +1 -0
- package/dist/SystemSynthesis/stampDeterministic.d.ts +11 -0
- package/dist/SystemSynthesis/stampDeterministic.d.ts.map +1 -0
- package/dist/SystemSynthesis/stampDeterministic.js +177 -0
- package/dist/SystemSynthesis/stampDeterministic.js.map +1 -0
- package/dist/SystemSynthesis/synthesize.d.ts +15 -0
- package/dist/SystemSynthesis/synthesize.d.ts.map +1 -0
- package/dist/SystemSynthesis/synthesize.js +258 -0
- package/dist/SystemSynthesis/synthesize.js.map +1 -0
- package/dist/SystemSynthesis/types.d.ts +110 -0
- package/dist/SystemSynthesis/types.d.ts.map +1 -0
- package/dist/SystemSynthesis/types.js +12 -0
- package/dist/SystemSynthesis/types.js.map +1 -0
- package/dist/amGeneration/buildFlowGraph.d.ts +39 -0
- package/dist/amGeneration/buildFlowGraph.d.ts.map +1 -0
- package/dist/amGeneration/buildFlowGraph.js +643 -0
- package/dist/amGeneration/buildFlowGraph.js.map +1 -0
- package/dist/amGeneration/enrichAMEdges.d.ts +16 -0
- package/dist/amGeneration/enrichAMEdges.d.ts.map +1 -0
- package/dist/amGeneration/enrichAMEdges.js +291 -0
- package/dist/amGeneration/enrichAMEdges.js.map +1 -0
- package/dist/amGeneration/generateAM.d.ts +23 -0
- package/dist/amGeneration/generateAM.d.ts.map +1 -0
- package/dist/amGeneration/generateAM.js +131 -0
- package/dist/amGeneration/generateAM.js.map +1 -0
- package/dist/amGeneration/generateAMForRepo.d.ts +6 -0
- package/dist/amGeneration/generateAMForRepo.d.ts.map +1 -0
- package/dist/amGeneration/generateAMForRepo.js +130 -0
- package/dist/amGeneration/generateAMForRepo.js.map +1 -0
- package/dist/amGeneration/generateFlows.d.ts +27 -0
- package/dist/amGeneration/generateFlows.d.ts.map +1 -0
- package/dist/amGeneration/generateFlows.js +320 -0
- package/dist/amGeneration/generateFlows.js.map +1 -0
- package/dist/amGeneration/promptBuilder.d.ts +24 -0
- package/dist/amGeneration/promptBuilder.d.ts.map +1 -0
- package/dist/amGeneration/promptBuilder.js +299 -0
- package/dist/amGeneration/promptBuilder.js.map +1 -0
- package/dist/amGeneration/selectStrategicFiles.d.ts +42 -0
- package/dist/amGeneration/selectStrategicFiles.d.ts.map +1 -0
- package/dist/amGeneration/selectStrategicFiles.js +672 -0
- package/dist/amGeneration/selectStrategicFiles.js.map +1 -0
- package/dist/amGeneration/types.d.ts +83 -0
- package/dist/amGeneration/types.d.ts.map +1 -0
- package/dist/amGeneration/types.js +9 -0
- package/dist/amGeneration/types.js.map +1 -0
- package/dist/amSections.d.ts +29 -0
- package/dist/amSections.d.ts.map +1 -0
- package/dist/amSections.js +424 -0
- package/dist/amSections.js.map +1 -0
- package/dist/analysis/analysisCache.d.ts +4 -0
- package/dist/analysis/analysisCache.d.ts.map +1 -0
- package/dist/analysis/analysisCache.js +92 -0
- package/dist/analysis/analysisCache.js.map +1 -0
- package/dist/analysis/buildBranchStory.d.ts +95 -0
- package/dist/analysis/buildBranchStory.d.ts.map +1 -0
- package/dist/analysis/buildBranchStory.js +1264 -0
- package/dist/analysis/buildBranchStory.js.map +1 -0
- package/dist/analysis/buildDetailedFileXRay.d.ts +49 -0
- package/dist/analysis/buildDetailedFileXRay.d.ts.map +1 -0
- package/dist/analysis/buildDetailedFileXRay.js +607 -0
- package/dist/analysis/buildDetailedFileXRay.js.map +1 -0
- package/dist/analysis/buildFileXRay.d.ts +35 -0
- package/dist/analysis/buildFileXRay.d.ts.map +1 -0
- package/dist/analysis/buildFileXRay.js +305 -0
- package/dist/analysis/buildFileXRay.js.map +1 -0
- package/dist/analysis/classifySilentKiller.d.ts +14 -0
- package/dist/analysis/classifySilentKiller.d.ts.map +1 -0
- package/dist/analysis/classifySilentKiller.js +235 -0
- package/dist/analysis/classifySilentKiller.js.map +1 -0
- package/dist/analysis/diffChunks.d.ts +21 -0
- package/dist/analysis/diffChunks.d.ts.map +1 -0
- package/dist/analysis/diffChunks.js +302 -0
- package/dist/analysis/diffChunks.js.map +1 -0
- package/dist/analysis/extractRouteMap.d.ts +49 -0
- package/dist/analysis/extractRouteMap.d.ts.map +1 -0
- package/dist/analysis/extractRouteMap.js +354 -0
- package/dist/analysis/extractRouteMap.js.map +1 -0
- package/dist/analysis/generateFileInsight.d.ts +19 -0
- package/dist/analysis/generateFileInsight.d.ts.map +1 -0
- package/dist/analysis/generateFileInsight.js +103 -0
- package/dist/analysis/generateFileInsight.js.map +1 -0
- package/dist/analysis/llmXRay.d.ts +39 -0
- package/dist/analysis/llmXRay.d.ts.map +1 -0
- package/dist/analysis/llmXRay.js +208 -0
- package/dist/analysis/llmXRay.js.map +1 -0
- package/dist/analysis/simulateFailure.d.ts +44 -0
- package/dist/analysis/simulateFailure.d.ts.map +1 -0
- package/dist/analysis/simulateFailure.js +407 -0
- package/dist/analysis/simulateFailure.js.map +1 -0
- package/dist/anthropic.d.ts +3 -0
- package/dist/anthropic.d.ts.map +1 -0
- package/dist/anthropic.js +16 -0
- package/dist/anthropic.js.map +1 -0
- package/dist/app/buildAppPage.d.ts +34 -0
- package/dist/app/buildAppPage.d.ts.map +1 -0
- package/dist/app/buildAppPage.js +3085 -0
- package/dist/app/buildAppPage.js.map +1 -0
- package/dist/app-bundle.js +122 -0
- package/dist/buildAppData.d.ts +3 -0
- package/dist/buildAppData.d.ts.map +1 -0
- package/dist/buildAppData.js +207 -0
- package/dist/buildAppData.js.map +1 -0
- package/dist/builders/analyzeRepo.d.ts +25 -0
- package/dist/builders/analyzeRepo.d.ts.map +1 -0
- package/dist/builders/analyzeRepo.js +873 -0
- package/dist/builders/analyzeRepo.js.map +1 -0
- package/dist/builders/buildSystemConnections.d.ts +3 -0
- package/dist/builders/buildSystemConnections.d.ts.map +1 -0
- package/dist/builders/buildSystemConnections.js +388 -0
- package/dist/builders/buildSystemConnections.js.map +1 -0
- package/dist/builders/buildTextSummary.d.ts +61 -0
- package/dist/builders/buildTextSummary.d.ts.map +1 -0
- package/dist/builders/buildTextSummary.js +178 -0
- package/dist/builders/buildTextSummary.js.map +1 -0
- package/dist/builders/deriveRecommendedStartPath.d.ts +11 -0
- package/dist/builders/deriveRecommendedStartPath.d.ts.map +1 -0
- package/dist/builders/deriveRecommendedStartPath.js +140 -0
- package/dist/builders/deriveRecommendedStartPath.js.map +1 -0
- package/dist/builders/deriveRuntimeRole.d.ts +4 -0
- package/dist/builders/deriveRuntimeRole.d.ts.map +1 -0
- package/dist/builders/deriveRuntimeRole.js +30 -0
- package/dist/builders/deriveRuntimeRole.js.map +1 -0
- package/dist/builders/detectRunCommands.d.ts +16 -0
- package/dist/builders/detectRunCommands.d.ts.map +1 -0
- package/dist/builders/detectRunCommands.js +285 -0
- package/dist/builders/detectRunCommands.js.map +1 -0
- package/dist/builders/generateSystemNarrative.d.ts +12 -0
- package/dist/builders/generateSystemNarrative.d.ts.map +1 -0
- package/dist/builders/generateSystemNarrative.js +474 -0
- package/dist/builders/generateSystemNarrative.js.map +1 -0
- package/dist/builders/gitLogParser.d.ts +15 -0
- package/dist/builders/gitLogParser.d.ts.map +1 -0
- package/dist/builders/gitLogParser.js +116 -0
- package/dist/builders/gitLogParser.js.map +1 -0
- package/dist/builders/readRepoContext.d.ts +30 -0
- package/dist/builders/readRepoContext.d.ts.map +1 -0
- package/dist/builders/readRepoContext.js +323 -0
- package/dist/builders/readRepoContext.js.map +1 -0
- package/dist/builders/readSystemReadme.d.ts +39 -0
- package/dist/builders/readSystemReadme.d.ts.map +1 -0
- package/dist/builders/readSystemReadme.js +133 -0
- package/dist/builders/readSystemReadme.js.map +1 -0
- package/dist/builders/systemRanking.d.ts +24 -0
- package/dist/builders/systemRanking.d.ts.map +1 -0
- package/dist/builders/systemRanking.js +153 -0
- package/dist/builders/systemRanking.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +170 -0
- package/dist/cli.js.map +1 -0
- package/dist/detectors/applyRunnableConfidenceGate.d.ts +8 -0
- package/dist/detectors/applyRunnableConfidenceGate.d.ts.map +1 -0
- package/dist/detectors/applyRunnableConfidenceGate.js +166 -0
- package/dist/detectors/applyRunnableConfidenceGate.js.map +1 -0
- package/dist/detectors/classifySystemType.d.ts +17 -0
- package/dist/detectors/classifySystemType.d.ts.map +1 -0
- package/dist/detectors/classifySystemType.js +460 -0
- package/dist/detectors/classifySystemType.js.map +1 -0
- package/dist/detectors/detectAppInternalUnits.d.ts +20 -0
- package/dist/detectors/detectAppInternalUnits.d.ts.map +1 -0
- package/dist/detectors/detectAppInternalUnits.js +454 -0
- package/dist/detectors/detectAppInternalUnits.js.map +1 -0
- package/dist/detectors/detectBlocks.d.ts +6 -0
- package/dist/detectors/detectBlocks.d.ts.map +1 -0
- package/dist/detectors/detectBlocks.js +354 -0
- package/dist/detectors/detectBlocks.js.map +1 -0
- package/dist/detectors/detectComposeServices.d.ts +23 -0
- package/dist/detectors/detectComposeServices.d.ts.map +1 -0
- package/dist/detectors/detectComposeServices.js +255 -0
- package/dist/detectors/detectComposeServices.js.map +1 -0
- package/dist/detectors/detectEntryPoints.d.ts +6 -0
- package/dist/detectors/detectEntryPoints.d.ts.map +1 -0
- package/dist/detectors/detectEntryPoints.js +376 -0
- package/dist/detectors/detectEntryPoints.js.map +1 -0
- package/dist/detectors/detectSubsystems.d.ts +6 -0
- package/dist/detectors/detectSubsystems.d.ts.map +1 -0
- package/dist/detectors/detectSubsystems.js +376 -0
- package/dist/detectors/detectSubsystems.js.map +1 -0
- package/dist/detectors/detectSystemCandidates.d.ts +3 -0
- package/dist/detectors/detectSystemCandidates.d.ts.map +1 -0
- package/dist/detectors/detectSystemCandidates.js +577 -0
- package/dist/detectors/detectSystemCandidates.js.map +1 -0
- package/dist/devWatcher.d.ts +14 -0
- package/dist/devWatcher.d.ts.map +1 -0
- package/dist/devWatcher.js +96 -0
- package/dist/devWatcher.js.map +1 -0
- package/dist/graph/buildCodebaseGraph.d.ts +3 -0
- package/dist/graph/buildCodebaseGraph.d.ts.map +1 -0
- package/dist/graph/buildCodebaseGraph.js +602 -0
- package/dist/graph/buildCodebaseGraph.js.map +1 -0
- package/dist/graph/buildLLMPayload.d.ts +89 -0
- package/dist/graph/buildLLMPayload.d.ts.map +1 -0
- package/dist/graph/buildLLMPayload.js +715 -0
- package/dist/graph/buildLLMPayload.js.map +1 -0
- package/dist/graph/callLLM.d.ts +16 -0
- package/dist/graph/callLLM.d.ts.map +1 -0
- package/dist/graph/callLLM.js +274 -0
- package/dist/graph/callLLM.js.map +1 -0
- package/dist/graph/types.d.ts +76 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +5 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/graph/walkExports.d.ts +2 -0
- package/dist/graph/walkExports.d.ts.map +1 -0
- package/dist/graph/walkExports.js +172 -0
- package/dist/graph/walkExports.js.map +1 -0
- package/dist/heuristics/file-patterns.json +325 -0
- package/dist/heuristics/known-packages.json +1022 -0
- package/dist/heuristics/loader.d.ts +121 -0
- package/dist/heuristics/loader.d.ts.map +1 -0
- package/dist/heuristics/loader.js +196 -0
- package/dist/heuristics/loader.js.map +1 -0
- package/dist/heuristics/repo-mode-signals.json +248 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +356 -0
- package/dist/mcp.js.map +1 -0
- package/dist/scanner/buildImportGraph.d.ts +23 -0
- package/dist/scanner/buildImportGraph.d.ts.map +1 -0
- package/dist/scanner/buildImportGraph.js +186 -0
- package/dist/scanner/buildImportGraph.js.map +1 -0
- package/dist/scanner/detectDBOps.d.ts +21 -0
- package/dist/scanner/detectDBOps.d.ts.map +1 -0
- package/dist/scanner/detectDBOps.js +346 -0
- package/dist/scanner/detectDBOps.js.map +1 -0
- package/dist/scanner/detectOutbound.d.ts +6 -0
- package/dist/scanner/detectOutbound.d.ts.map +1 -0
- package/dist/scanner/detectOutbound.js +101 -0
- package/dist/scanner/detectOutbound.js.map +1 -0
- package/dist/scanner/detectRepoPurpose.d.ts +19 -0
- package/dist/scanner/detectRepoPurpose.d.ts.map +1 -0
- package/dist/scanner/detectRepoPurpose.js +335 -0
- package/dist/scanner/detectRepoPurpose.js.map +1 -0
- package/dist/scanner/detectRoutes.d.ts +22 -0
- package/dist/scanner/detectRoutes.d.ts.map +1 -0
- package/dist/scanner/detectRoutes.js +406 -0
- package/dist/scanner/detectRoutes.js.map +1 -0
- package/dist/scanner/filterNoise.d.ts +4 -0
- package/dist/scanner/filterNoise.d.ts.map +1 -0
- package/dist/scanner/filterNoise.js +95 -0
- package/dist/scanner/filterNoise.js.map +1 -0
- package/dist/scanner/loadTsAliases.d.ts +20 -0
- package/dist/scanner/loadTsAliases.d.ts.map +1 -0
- package/dist/scanner/loadTsAliases.js +135 -0
- package/dist/scanner/loadTsAliases.js.map +1 -0
- package/dist/scanner/routeHandlers.d.ts +15 -0
- package/dist/scanner/routeHandlers.d.ts.map +1 -0
- package/dist/scanner/routeHandlers.js +154 -0
- package/dist/scanner/routeHandlers.js.map +1 -0
- package/dist/scanner/scanRepo.d.ts +10 -0
- package/dist/scanner/scanRepo.d.ts.map +1 -0
- package/dist/scanner/scanRepo.js +165 -0
- package/dist/scanner/scanRepo.js.map +1 -0
- package/dist/scanner/walkImports.d.ts +14 -0
- package/dist/scanner/walkImports.d.ts.map +1 -0
- package/dist/scanner/walkImports.js +162 -0
- package/dist/scanner/walkImports.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +956 -0
- package/dist/server.js.map +1 -0
- package/dist/session/diff.d.ts +4 -0
- package/dist/session/diff.d.ts.map +1 -0
- package/dist/session/diff.js +150 -0
- package/dist/session/diff.js.map +1 -0
- package/dist/session/snapshot.d.ts +5 -0
- package/dist/session/snapshot.d.ts.map +1 -0
- package/dist/session/snapshot.js +114 -0
- package/dist/session/snapshot.js.map +1 -0
- package/dist/session/store.d.ts +8 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +101 -0
- package/dist/session/store.js.map +1 -0
- package/dist/session/types.d.ts +46 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +4 -0
- package/dist/session/types.js.map +1 -0
- package/dist/types.d.ts +350 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file.d.ts +5 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +76 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/path.d.ts +7 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +62 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/text.d.ts +5 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +29 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/viewBuilders/buildSystemFolders.d.ts +39 -0
- package/dist/viewBuilders/buildSystemFolders.d.ts.map +1 -0
- package/dist/viewBuilders/buildSystemFolders.js +198 -0
- package/dist/viewBuilders/buildSystemFolders.js.map +1 -0
- package/dist/watcher/repoWatcher.d.ts +17 -0
- package/dist/watcher/repoWatcher.d.ts.map +1 -0
- package/dist/watcher/repoWatcher.js +87 -0
- package/dist/watcher/repoWatcher.js.map +1 -0
- package/package.json +102 -0
- package/public/memor_logo.svg +18 -0
- package/public/memor_transparent_logo.svg +25 -0
- package/public/tIcons/bun.svg +1 -0
- package/public/tIcons/css.svg +1 -0
- package/public/tIcons/docker.svg +3 -0
- package/public/tIcons/expressjs.svg +1 -0
- package/public/tIcons/html5.svg +6 -0
- package/public/tIcons/javascript.svg +1 -0
- package/public/tIcons/jest.svg +4 -0
- package/public/tIcons/json.svg +1 -0
- package/public/tIcons/markdown-light.svg +1 -0
- package/public/tIcons/nestjs.svg +1 -0
- package/public/tIcons/nextjs_icon_dark.svg +1 -0
- package/public/tIcons/npm.svg +1 -0
- package/public/tIcons/pnpm.svg +1 -0
- package/public/tIcons/prisma.svg +1 -0
- package/public/tIcons/react_dark.svg +11 -0
- package/public/tIcons/supabase.svg +15 -0
- package/public/tIcons/tailwindcss.svg +1 -0
- package/public/tIcons/turborepo-icon-light.svg +1 -0
- package/public/tIcons/typescript.svg +1 -0
- package/public/tIcons/vite.svg +1 -0
- package/public/tIcons/yarn.svg +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Mukur Panchal
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Memor
|
|
2
|
+
|
|
3
|
+
**Instant codebase understanding for any TS/JS project.**
|
|
4
|
+
|
|
5
|
+
Memor analyzes your repository and generates an interactive architectural briefing — structure, runtime flows, and change impact — all in your browser, in seconds.
|
|
6
|
+
|
|
7
|
+
No cloud. No AI API calls. Everything runs locally on your machine.
|
|
8
|
+
|
|
9
|
+
## Quick Start
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx memor
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
That's it. Memor analyzes your codebase and opens an interactive app at `http://localhost:4173`.
|
|
16
|
+
|
|
17
|
+
## Install (optional)
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g memor-cli
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Then run `memor` from any TS/JS project directory.
|
|
24
|
+
|
|
25
|
+
### Options
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
memor # Analyze current directory
|
|
29
|
+
memor /path/to/project # Analyze a specific project
|
|
30
|
+
memor --port 3000 # Use a custom port
|
|
31
|
+
memor --open # Auto-open browser after analysis
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## What You Get
|
|
35
|
+
|
|
36
|
+
### Overview
|
|
37
|
+
A snapshot of what the project is — identity, tech stack, architecture zones, entry point, and a flow preview. One card, instant context.
|
|
38
|
+
|
|
39
|
+
### Structure
|
|
40
|
+
An interactive radial map of the codebase architecture. Navigate zones, drill into systems, see connections and relationships. Progressive disclosure — zones first, then systems inside each zone.
|
|
41
|
+
|
|
42
|
+
### Flow
|
|
43
|
+
Animated storytelling of how the system actually works at runtime. Detects architectural patterns (request pipelines, data flows, dev loops) and presents them as step-by-step timelines with system context, file paths, and fused impact intelligence.
|
|
44
|
+
|
|
45
|
+
### Impact
|
|
46
|
+
"If I change THIS, what breaks?" Select any system and see a directional ripple graph showing direct and indirect downstream impact, risk levels, blast radius, and affected areas.
|
|
47
|
+
|
|
48
|
+
## How It Works
|
|
49
|
+
|
|
50
|
+
Memor scans your project structure and source files to detect:
|
|
51
|
+
|
|
52
|
+
- **Systems** — logical modules, packages, or architectural boundaries
|
|
53
|
+
- **Zones** — groups of related systems (e.g., "Core Runtime", "API Layer", "Testing")
|
|
54
|
+
- **Connections** — import relationships, extensions, and coupling between systems
|
|
55
|
+
- **Flows** — runtime behavior patterns based on detected archetypes
|
|
56
|
+
- **Impact** — change propagation paths using the connection graph
|
|
57
|
+
|
|
58
|
+
Everything is deterministic. Same codebase, same result.
|
|
59
|
+
|
|
60
|
+
## MCP Integration
|
|
61
|
+
|
|
62
|
+
Memor can run as an [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server, letting your AI assistant query the architecture directly from your editor.
|
|
63
|
+
|
|
64
|
+
### Setup
|
|
65
|
+
|
|
66
|
+
Add to your Cursor/VS Code MCP config:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"memor": {
|
|
71
|
+
"command": "memor-mcp",
|
|
72
|
+
"args": ["/path/to/your/project"]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Available Tools
|
|
78
|
+
|
|
79
|
+
| Tool | Description |
|
|
80
|
+
|------|-------------|
|
|
81
|
+
| `get_architecture` | High-level architecture overview — repo mode, zones, couplings |
|
|
82
|
+
| `list_systems` | All detected systems with type, tier, and description |
|
|
83
|
+
| `get_system_detail` | Deep dive into a specific system — connections, blocks, internal structure |
|
|
84
|
+
| `get_impact` | Change impact analysis — blast radius, risk levels, affected systems |
|
|
85
|
+
| `get_flows` | Runtime flows — how the system actually works step by step |
|
|
86
|
+
| `get_zones` | Architectural zones and their member systems |
|
|
87
|
+
| `search_systems` | Keyword search across system names, types, tech stacks |
|
|
88
|
+
| `get_reading_order` | Recommended order for reading the codebase |
|
|
89
|
+
| `get_couplings` | System coupling relationships ranked by strength |
|
|
90
|
+
|
|
91
|
+
### Available Prompts
|
|
92
|
+
|
|
93
|
+
| Prompt | Description |
|
|
94
|
+
|--------|-------------|
|
|
95
|
+
| `understand-codebase` | Architecture-aware understanding prompt |
|
|
96
|
+
| `plan-change` | Impact-aware change planning for a specific system |
|
|
97
|
+
|
|
98
|
+
## Requirements
|
|
99
|
+
|
|
100
|
+
- Node.js >= 18
|
|
101
|
+
- Works on any TS/JS codebase (monorepos, frameworks, libraries, web apps, APIs)
|
|
102
|
+
|
|
103
|
+
## Contributing
|
|
104
|
+
|
|
105
|
+
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
|
|
106
|
+
|
|
107
|
+
## License
|
|
108
|
+
|
|
109
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 1 — Intentional Structure Detection
|
|
3
|
+
*
|
|
4
|
+
* Parses files that developers explicitly wrote to declare their architecture:
|
|
5
|
+
* docker-compose, workspace configs, env files, deploy configs.
|
|
6
|
+
*
|
|
7
|
+
* Output is the highest-authority input to AM building — confidence 1.0 throughout.
|
|
8
|
+
* Later layers (import graph, LLM) supplement but never override these facts.
|
|
9
|
+
*/
|
|
10
|
+
import type { IntentionalStructure } from "./types";
|
|
11
|
+
export type { IntentionalStructure, IntentionalSystem, IntentionalEdge, EnvWiring } from "./types";
|
|
12
|
+
export declare function detectIntentionalStructure(repoRoot: string): Promise<IntentionalStructure>;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/IntentionalStructure/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAMpD,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEnG,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2ChG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectIntentionalStructure = detectIntentionalStructure;
|
|
4
|
+
const parseCompose_1 = require("./parseCompose");
|
|
5
|
+
const parseWorkspaces_1 = require("./parseWorkspaces");
|
|
6
|
+
const parseEnvWiring_1 = require("./parseEnvWiring");
|
|
7
|
+
const parseDeployConfigs_1 = require("./parseDeployConfigs");
|
|
8
|
+
async function detectIntentionalStructure(repoRoot) {
|
|
9
|
+
// Run all parsers in parallel — they are independent reads
|
|
10
|
+
const [compose, workspaces, deployConfigs] = await Promise.all([
|
|
11
|
+
(0, parseCompose_1.parseCompose)(repoRoot),
|
|
12
|
+
(0, parseWorkspaces_1.parseWorkspaces)(repoRoot),
|
|
13
|
+
(0, parseDeployConfigs_1.parseDeployConfigs)(repoRoot),
|
|
14
|
+
]);
|
|
15
|
+
// Merge all declared systems, deduplicated by name
|
|
16
|
+
const allSystems = [...compose.systems, ...workspaces.systems, ...deployConfigs.systems];
|
|
17
|
+
const seenNames = new Set();
|
|
18
|
+
const systems = allSystems.filter((s) => {
|
|
19
|
+
if (seenNames.has(s.name))
|
|
20
|
+
return false;
|
|
21
|
+
seenNames.add(s.name);
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
// Build the known system name set for env wiring inference
|
|
25
|
+
const knownSystemNames = new Set(systems.map((s) => s.name));
|
|
26
|
+
// Package paths for sub-directory env scanning (monorepos keep .env in sub-packages)
|
|
27
|
+
const packagePaths = workspaces.systems
|
|
28
|
+
.filter((s) => s.path !== null)
|
|
29
|
+
.map((s) => s.path);
|
|
30
|
+
// Env wiring: scan root + all workspace package dirs
|
|
31
|
+
const envResult = await (0, parseEnvWiring_1.parseEnvWiring)(repoRoot, knownSystemNames, packagePaths);
|
|
32
|
+
const edges = [...compose.edges, ...workspaces.edges];
|
|
33
|
+
const sources = [
|
|
34
|
+
...compose.sources,
|
|
35
|
+
...workspaces.sources,
|
|
36
|
+
...deployConfigs.sources,
|
|
37
|
+
...envResult.sources,
|
|
38
|
+
];
|
|
39
|
+
return {
|
|
40
|
+
systems,
|
|
41
|
+
edges,
|
|
42
|
+
envWiring: envResult.envWiring,
|
|
43
|
+
sources: [...new Set(sources)],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/IntentionalStructure/index.ts"],"names":[],"mappings":";;AAiBA,gEA2CC;AAlDD,iDAA8C;AAC9C,uDAAoD;AACpD,qDAAkD;AAClD,6DAA0D;AAInD,KAAK,UAAU,0BAA0B,CAAC,QAAgB;IAC/D,2DAA2D;IAC3D,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7D,IAAA,2BAAY,EAAC,QAAQ,CAAC;QACtB,IAAA,iCAAe,EAAC,QAAQ,CAAC;QACzB,IAAA,uCAAkB,EAAC,QAAQ,CAAC;KAC7B,CAAC,CAAC;IAEH,mDAAmD;IACnD,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,2DAA2D;IAC3D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7D,qFAAqF;IACrF,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC;IAEhC,qDAAqD;IACrD,MAAM,SAAS,GAAG,MAAM,IAAA,+BAAc,EAAC,QAAQ,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAEjF,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,OAAO,GAAG;QACd,GAAG,OAAO,CAAC,OAAO;QAClB,GAAG,UAAU,CAAC,OAAO;QACrB,GAAG,aAAa,CAAC,OAAO;QACxB,GAAG,SAAS,CAAC,OAAO;KACrB,CAAC;IAEF,OAAO;QACL,OAAO;QACP,KAAK;QACL,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IntentionalSystem, IntentionalEdge } from "./types";
|
|
2
|
+
export type ComposeParseResult = {
|
|
3
|
+
systems: IntentionalSystem[];
|
|
4
|
+
edges: IntentionalEdge[];
|
|
5
|
+
envVars: Array<{
|
|
6
|
+
serviceName: string;
|
|
7
|
+
key: string;
|
|
8
|
+
value: string;
|
|
9
|
+
}>;
|
|
10
|
+
sources: string[];
|
|
11
|
+
};
|
|
12
|
+
export declare function parseCompose(repoRoot: string): Promise<ComposeParseResult>;
|
|
13
|
+
//# sourceMappingURL=parseCompose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseCompose.d.ts","sourceRoot":"","sources":["../../src/IntentionalStructure/parseCompose.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAkMlE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8BhF"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseCompose = parseCompose;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const DB_IMAGES = new Set(["postgres", "postgresql", "mysql", "mariadb", "mongo", "mongodb", "sqlite", "mssql", "cockroachdb"]);
|
|
40
|
+
const CACHE_IMAGES = new Set(["redis", "memcached", "dragonfly", "keydb"]);
|
|
41
|
+
const QUEUE_IMAGES = new Set(["rabbitmq", "kafka", "nats", "activemq", "pulsar", "zookeeper"]);
|
|
42
|
+
const PROXY_IMAGES = new Set(["nginx", "traefik", "haproxy", "caddy", "envoy"]);
|
|
43
|
+
function inferType(buildPath, image) {
|
|
44
|
+
if (buildPath)
|
|
45
|
+
return "app";
|
|
46
|
+
const img = (image ?? "").toLowerCase().split(":")[0].split("/").pop() ?? "";
|
|
47
|
+
if (DB_IMAGES.has(img))
|
|
48
|
+
return "database";
|
|
49
|
+
if (CACHE_IMAGES.has(img))
|
|
50
|
+
return "cache";
|
|
51
|
+
if (QUEUE_IMAGES.has(img))
|
|
52
|
+
return "queue";
|
|
53
|
+
if (PROXY_IMAGES.has(img))
|
|
54
|
+
return "proxy";
|
|
55
|
+
if (img)
|
|
56
|
+
return "infra";
|
|
57
|
+
return "infra";
|
|
58
|
+
}
|
|
59
|
+
function parseSimpleYaml(content) {
|
|
60
|
+
const lines = content.split("\n");
|
|
61
|
+
const root = {};
|
|
62
|
+
const stack = [{ indent: -1, obj: root }];
|
|
63
|
+
for (const rawLine of lines) {
|
|
64
|
+
if (rawLine.trimStart().startsWith("#"))
|
|
65
|
+
continue;
|
|
66
|
+
const trimmed = rawLine.trimEnd();
|
|
67
|
+
if (!trimmed.trim())
|
|
68
|
+
continue;
|
|
69
|
+
const indent = rawLine.length - rawLine.trimStart().length;
|
|
70
|
+
const line = trimmed.trim();
|
|
71
|
+
while (stack.length > 1 && stack[stack.length - 1].indent >= indent)
|
|
72
|
+
stack.pop();
|
|
73
|
+
const parent = stack[stack.length - 1].obj;
|
|
74
|
+
if (line.startsWith("- ")) {
|
|
75
|
+
const val = line.slice(2).trim();
|
|
76
|
+
const key = Object.keys(parent).pop() ?? "";
|
|
77
|
+
if (key && !Array.isArray(parent[key]))
|
|
78
|
+
parent[key] = [];
|
|
79
|
+
if (key && Array.isArray(parent[key]))
|
|
80
|
+
parent[key].push(val);
|
|
81
|
+
}
|
|
82
|
+
else if (line.includes(":")) {
|
|
83
|
+
const colonIdx = line.indexOf(":");
|
|
84
|
+
const key = line.slice(0, colonIdx).trim();
|
|
85
|
+
const rest = line.slice(colonIdx + 1).trim();
|
|
86
|
+
if (rest === "" || rest === "|" || rest === ">") {
|
|
87
|
+
const child = {};
|
|
88
|
+
parent[key] = child;
|
|
89
|
+
stack.push({ indent, obj: child });
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
parent[key] = rest.replace(/#.*$/, "").trim().replace(/^["']|["']$/g, "");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return root;
|
|
97
|
+
}
|
|
98
|
+
function parseFile(content, filePath, repoRoot) {
|
|
99
|
+
const yaml = parseSimpleYaml(content);
|
|
100
|
+
const servicesBlock = yaml["services"];
|
|
101
|
+
if (!servicesBlock || typeof servicesBlock !== "object") {
|
|
102
|
+
return { systems: [], edges: [], envVars: [] };
|
|
103
|
+
}
|
|
104
|
+
const services = [];
|
|
105
|
+
for (const [name, rawSvc] of Object.entries(servicesBlock)) {
|
|
106
|
+
if (typeof rawSvc !== "object" || !rawSvc)
|
|
107
|
+
continue;
|
|
108
|
+
const svc = rawSvc;
|
|
109
|
+
let buildPath = null;
|
|
110
|
+
const buildVal = svc["build"];
|
|
111
|
+
if (typeof buildVal === "string" && buildVal) {
|
|
112
|
+
buildPath = path.resolve(path.dirname(filePath), buildVal);
|
|
113
|
+
}
|
|
114
|
+
else if (typeof buildVal === "object" && buildVal) {
|
|
115
|
+
const ctx = buildVal["context"];
|
|
116
|
+
if (typeof ctx === "string")
|
|
117
|
+
buildPath = path.resolve(path.dirname(filePath), ctx);
|
|
118
|
+
}
|
|
119
|
+
const image = typeof svc["image"] === "string" ? svc["image"] : null;
|
|
120
|
+
const portsRaw = svc["ports"];
|
|
121
|
+
const ports = Array.isArray(portsRaw) ? portsRaw.map(String) : [];
|
|
122
|
+
const envVars = {};
|
|
123
|
+
const envRaw = svc["environment"];
|
|
124
|
+
if (typeof envRaw === "object" && envRaw && !Array.isArray(envRaw)) {
|
|
125
|
+
for (const [k, v] of Object.entries(envRaw)) {
|
|
126
|
+
if (typeof v === "string")
|
|
127
|
+
envVars[k] = v;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (Array.isArray(envRaw)) {
|
|
131
|
+
for (const entry of envRaw) {
|
|
132
|
+
const str = String(entry);
|
|
133
|
+
const eq = str.indexOf("=");
|
|
134
|
+
if (eq > -1)
|
|
135
|
+
envVars[str.slice(0, eq)] = str.slice(eq + 1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const dependsRaw = svc["depends_on"];
|
|
139
|
+
const dependsOn = Array.isArray(dependsRaw)
|
|
140
|
+
? dependsRaw.map(String)
|
|
141
|
+
: typeof dependsRaw === "object" && dependsRaw
|
|
142
|
+
? Object.keys(dependsRaw)
|
|
143
|
+
: [];
|
|
144
|
+
services.push({ name, buildPath, image, ports, envVars, dependsOn, inferredType: inferType(buildPath, image) });
|
|
145
|
+
}
|
|
146
|
+
const serviceNames = new Set(services.map((s) => s.name));
|
|
147
|
+
const relFile = path.relative(repoRoot, filePath);
|
|
148
|
+
const systems = services.map((s) => ({
|
|
149
|
+
name: s.name,
|
|
150
|
+
path: s.buildPath,
|
|
151
|
+
type: s.inferredType === "infra" ? "infra" : s.inferredType,
|
|
152
|
+
source: "compose",
|
|
153
|
+
confidence: 1.0,
|
|
154
|
+
}));
|
|
155
|
+
const edges = [];
|
|
156
|
+
for (const svc of services) {
|
|
157
|
+
for (const dep of svc.dependsOn) {
|
|
158
|
+
if (!serviceNames.has(dep))
|
|
159
|
+
continue;
|
|
160
|
+
const target = services.find((s) => s.name === dep);
|
|
161
|
+
const type = target?.inferredType === "database" ? "DB" :
|
|
162
|
+
target?.inferredType === "cache" ? "CACHE" :
|
|
163
|
+
target?.inferredType === "queue" ? "QUEUE" :
|
|
164
|
+
target?.inferredType === "proxy" ? "PROXY" :
|
|
165
|
+
"DEPENDS_ON";
|
|
166
|
+
edges.push({
|
|
167
|
+
from: svc.name, to: dep,
|
|
168
|
+
type: type,
|
|
169
|
+
evidence: `${relFile}: ${svc.name}.depends_on.${dep}`,
|
|
170
|
+
confidence: 1.0,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
for (const [key, val] of Object.entries(svc.envVars)) {
|
|
174
|
+
for (const other of services) {
|
|
175
|
+
if (other.name === svc.name)
|
|
176
|
+
continue;
|
|
177
|
+
if (val.includes(`//${other.name}`) ||
|
|
178
|
+
val.includes(`://${other.name}:`) ||
|
|
179
|
+
val === other.name ||
|
|
180
|
+
val.startsWith(`${other.name}:`)) {
|
|
181
|
+
const already = edges.some((e) => e.from === svc.name && e.to === other.name);
|
|
182
|
+
if (!already) {
|
|
183
|
+
edges.push({
|
|
184
|
+
from: svc.name, to: other.name,
|
|
185
|
+
type: "DEPENDS_ON",
|
|
186
|
+
evidence: `${relFile}: ${svc.name}.environment.${key}=${val}`,
|
|
187
|
+
confidence: 1.0,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const envVarsOut = services.flatMap((s) => Object.entries(s.envVars).map(([key, value]) => ({ serviceName: s.name, key, value })));
|
|
195
|
+
return { systems, edges, envVars: envVarsOut };
|
|
196
|
+
}
|
|
197
|
+
const COMPOSE_FILENAMES = [
|
|
198
|
+
"docker-compose.yml", "docker-compose.yaml",
|
|
199
|
+
"docker-compose.override.yml", "docker-compose.override.yaml",
|
|
200
|
+
"docker-compose.dev.yml", "docker-compose.dev.yaml",
|
|
201
|
+
"docker-compose.prod.yml", "docker-compose.prod.yaml",
|
|
202
|
+
"compose.yml", "compose.yaml",
|
|
203
|
+
];
|
|
204
|
+
async function parseCompose(repoRoot) {
|
|
205
|
+
const result = { systems: [], edges: [], envVars: [], sources: [] };
|
|
206
|
+
const searchDirs = [repoRoot];
|
|
207
|
+
try {
|
|
208
|
+
const entries = await fs.readdir(repoRoot, { withFileTypes: true });
|
|
209
|
+
for (const e of entries) {
|
|
210
|
+
if (e.isDirectory() && !e.name.startsWith(".") && e.name !== "node_modules") {
|
|
211
|
+
searchDirs.push(path.join(repoRoot, e.name));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch { }
|
|
216
|
+
for (const dir of searchDirs) {
|
|
217
|
+
for (const filename of COMPOSE_FILENAMES) {
|
|
218
|
+
const filePath = path.join(dir, filename);
|
|
219
|
+
try {
|
|
220
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
221
|
+
const parsed = parseFile(content, filePath, repoRoot);
|
|
222
|
+
if (parsed.systems.length > 0) {
|
|
223
|
+
result.systems.push(...parsed.systems);
|
|
224
|
+
result.edges.push(...parsed.edges);
|
|
225
|
+
result.envVars.push(...parsed.envVars);
|
|
226
|
+
result.sources.push(path.relative(repoRoot, filePath));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch { }
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=parseCompose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseCompose.js","sourceRoot":"","sources":["../../src/IntentionalStructure/parseCompose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IntentionalSystem } from "./types";
|
|
2
|
+
export type DeployParseResult = {
|
|
3
|
+
systems: IntentionalSystem[];
|
|
4
|
+
sources: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare function parseDeployConfigs(repoRoot: string): Promise<DeployParseResult>;
|
|
7
|
+
//# sourceMappingURL=parseDeployConfigs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseDeployConfigs.d.ts","sourceRoot":"","sources":["../../src/IntentionalStructure/parseDeployConfigs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AA6GF,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsBrF"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseDeployConfigs = parseDeployConfigs;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
// ── vercel.json ───────────────────────────────────────────────────────────
|
|
40
|
+
async function parseVercel(repoRoot) {
|
|
41
|
+
try {
|
|
42
|
+
const raw = await fs.readFile(path.join(repoRoot, "vercel.json"), "utf-8");
|
|
43
|
+
const json = JSON.parse(raw);
|
|
44
|
+
// vercel.json doesn't have an explicit "name" field — use repo dir name
|
|
45
|
+
const name = typeof json["name"] === "string" ? json["name"] : path.basename(repoRoot);
|
|
46
|
+
return {
|
|
47
|
+
system: { name, path: repoRoot, type: "app", source: "deploy-config", confidence: 1.0 },
|
|
48
|
+
source: "vercel.json",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ── fly.toml ──────────────────────────────────────────────────────────────
|
|
56
|
+
// Only reads "app = ..." — no full TOML parser needed.
|
|
57
|
+
async function parseFly(repoRoot) {
|
|
58
|
+
try {
|
|
59
|
+
const raw = await fs.readFile(path.join(repoRoot, "fly.toml"), "utf-8");
|
|
60
|
+
for (const line of raw.split("\n")) {
|
|
61
|
+
const m = line.match(/^app\s*=\s*["']?([^"'\s]+)["']?/);
|
|
62
|
+
if (m) {
|
|
63
|
+
return {
|
|
64
|
+
system: { name: m[1], path: repoRoot, type: "app", source: "deploy-config", confidence: 1.0 },
|
|
65
|
+
source: "fly.toml",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ── railway.json / railway.toml ───────────────────────────────────────────
|
|
76
|
+
async function parseRailway(repoRoot) {
|
|
77
|
+
// railway.json
|
|
78
|
+
try {
|
|
79
|
+
const raw = await fs.readFile(path.join(repoRoot, "railway.json"), "utf-8");
|
|
80
|
+
const json = JSON.parse(raw);
|
|
81
|
+
const name = typeof json["name"] === "string"
|
|
82
|
+
? json["name"]
|
|
83
|
+
: path.basename(repoRoot);
|
|
84
|
+
return {
|
|
85
|
+
system: { name, path: repoRoot, type: "app", source: "deploy-config", confidence: 1.0 },
|
|
86
|
+
source: "railway.json",
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
// railway.toml
|
|
91
|
+
try {
|
|
92
|
+
const raw = await fs.readFile(path.join(repoRoot, "railway.toml"), "utf-8");
|
|
93
|
+
for (const line of raw.split("\n")) {
|
|
94
|
+
const m = line.match(/^name\s*=\s*["']?([^"'\s]+)["']?/);
|
|
95
|
+
if (m) {
|
|
96
|
+
return {
|
|
97
|
+
system: { name: m[1], path: repoRoot, type: "app", source: "deploy-config", confidence: 1.0 },
|
|
98
|
+
source: "railway.toml",
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// ── render.yaml ───────────────────────────────────────────────────────────
|
|
109
|
+
// Reads service names from the services: list.
|
|
110
|
+
async function parseRender(repoRoot) {
|
|
111
|
+
try {
|
|
112
|
+
const raw = await fs.readFile(path.join(repoRoot, "render.yaml"), "utf-8");
|
|
113
|
+
const systems = [];
|
|
114
|
+
let inServices = false;
|
|
115
|
+
let currentName = null;
|
|
116
|
+
for (const line of raw.split("\n")) {
|
|
117
|
+
const trimmed = line.trim();
|
|
118
|
+
if (trimmed.startsWith("services:")) {
|
|
119
|
+
inServices = true;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (!inServices)
|
|
123
|
+
continue;
|
|
124
|
+
if (trimmed.startsWith("- name:") || trimmed.startsWith("- name :")) {
|
|
125
|
+
const m = trimmed.match(/^-\s*name\s*:\s*(.+)/);
|
|
126
|
+
if (m)
|
|
127
|
+
currentName = m[1].trim().replace(/^["']|["']$/g, "");
|
|
128
|
+
}
|
|
129
|
+
else if (trimmed.startsWith("name:") && currentName === null) {
|
|
130
|
+
const m = trimmed.match(/^name\s*:\s*(.+)/);
|
|
131
|
+
if (m)
|
|
132
|
+
currentName = m[1].trim().replace(/^["']|["']$/g, "");
|
|
133
|
+
}
|
|
134
|
+
if (currentName) {
|
|
135
|
+
systems.push({ name: currentName, path: repoRoot, type: "app", source: "deploy-config", confidence: 1.0 });
|
|
136
|
+
currentName = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (systems.length > 0)
|
|
140
|
+
return { systems, source: "render.yaml" };
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ── Entry point ───────────────────────────────────────────────────────────
|
|
148
|
+
async function parseDeployConfigs(repoRoot) {
|
|
149
|
+
const result = { systems: [], sources: [] };
|
|
150
|
+
const [vercel, fly, railway, render] = await Promise.all([
|
|
151
|
+
parseVercel(repoRoot),
|
|
152
|
+
parseFly(repoRoot),
|
|
153
|
+
parseRailway(repoRoot),
|
|
154
|
+
parseRender(repoRoot),
|
|
155
|
+
]);
|
|
156
|
+
for (const r of [vercel, fly, railway]) {
|
|
157
|
+
if (r) {
|
|
158
|
+
result.systems.push(r.system);
|
|
159
|
+
result.sources.push(r.source);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (render) {
|
|
163
|
+
result.systems.push(...render.systems);
|
|
164
|
+
result.sources.push(render.source);
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=parseDeployConfigs.js.map
|