@codeyam/codeyam-cli 0.1.0-staging.1669d45 → 0.1.0-staging.2a88920
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/analyzer-template/.build-info.json +8 -8
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +5 -5
- package/analyzer-template/packages/ai/index.ts +15 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +87 -51
- package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +98 -9
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +139 -23
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +6 -126
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +555 -28
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +88 -7
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +198 -34
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +772 -243
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +205 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +10 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +43 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +122 -15
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +160 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +319 -88
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
- package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
- package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +642 -7
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +35 -6
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +383 -6
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1299 -51
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +23 -6
- package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +179 -45
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +26 -4
- package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
- package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +30 -19
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +14 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -10
- package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +189 -76
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +29 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +77 -9
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +118 -10
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +276 -17
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
- package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
- package/analyzer-template/packages/aws/package.json +2 -2
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
- package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
- package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
- package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
- package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
- package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
- package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +8 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +22 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -4
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +25 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +56 -6
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
- package/analyzer-template/packages/github/package.json +1 -1
- package/analyzer-template/packages/types/index.ts +1 -0
- package/analyzer-template/packages/types/src/types/Analysis.ts +25 -0
- package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +70 -6
- package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts +1 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +25 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +56 -6
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
- package/analyzer-template/playwright/capture.ts +20 -8
- package/analyzer-template/playwright/captureStatic.ts +1 -1
- package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
- package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
- package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
- package/analyzer-template/project/constructMockCode.ts +367 -37
- package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
- package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
- package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
- package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
- package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
- package/analyzer-template/project/orchestrateCapture.ts +71 -6
- package/analyzer-template/project/reconcileMockDataKeys.ts +152 -9
- package/analyzer-template/project/runAnalysis.ts +4 -0
- package/analyzer-template/project/start.ts +35 -11
- package/analyzer-template/project/writeMockDataTsx.ts +127 -4
- package/analyzer-template/project/writeScenarioComponents.ts +101 -8
- package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
- package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +300 -7
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
- package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
- package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +58 -6
- package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +126 -9
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runAnalysis.js +3 -0
- package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +32 -11
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +101 -4
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +57 -8
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/codeyam-cli/src/cli.js +2 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +7 -5
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +273 -0
- package/codeyam-cli/src/commands/memory.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +4 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analysisRunner.js +21 -2
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +42 -6
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +1 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +6 -0
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/rules/index.js +5 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -0
- package/codeyam-cli/src/utils/rules/parser.js +106 -0
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +132 -0
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +2 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +7 -3
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/bootstrap.js +40 -0
- package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-DsN1wKrm.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-COi5OvsN.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BwdQv49w.js → EntityTypeIcon-Ba2JVPzP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CEleMv_j.js → InlineSpinner-C8lyxW9k.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D68KarMg.js → InteractivePreview-aht4aafF.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-L75Wvqgw.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-C53WM8qn.js → LoadingDots-B0GLXMsr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CrNkmy4i.js → LogViewer-xgeCVgSM.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-OApQuNyq.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CQifa1n-.js → SafeScreenshot-DuDvi0jm.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CyaBFX7l.js → ScenarioViewer-DzccYyI8.js} +3 -13
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D36O1rzU.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BwavGCpm.js +32 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DgTPh8H-.js → chevron-down-Cx24_aWc.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-DdQKK6on.js → chunk-EPOLDU6W-CXRTFQ3F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-Dmr2bb1R.js → circle-check-BOARzkeR.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Do4ZLUYa.js → createLucideIcon-BdhJEx6B.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CbdFyxZh.js → entity._sha._-BJUiQqZF.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js → entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-wDWZZO1W.js → entity._sha_.create-scenario-D1T4TGjf.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMbl7MeQ.js → entity._sha_.edit._scenarioId-CTBG2mmz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-5wRKRIH9.js → entry.client-CS2cb_eZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DD3SDH7t.js → fileTableUtils-DMJ7zii9.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{git-zXjT7J0G.js → git-CPTZZ-JZ.js} +8 -8
- package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-DLbXwndH.js → index-B1h680n5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-gPZ-lad1.js → index-lzqtyFU8.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BsPXJ81F.js → loader-circle-B7B9V-bu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-a78b90a2.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory--GCbFsBE.js +92 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-P2FKIUql.js → search-CxXUmBSd.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-B2eDuBj8.js → settings-CS5f3WzT.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-L18M6-kN.js → simulations-DwFIBT09.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BDz7kbVA.js → triangle-alert-B6LgvRJg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-29dDmbH8.js → useCustomSizes-C1v1PQzo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BUm0UVJm.js → useLastLogLine-aSv48UbS.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CkIOKTrZ.js → useReportContext-DYxHZQuP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-KKw5kTn-.js → useToast-mBRpZPiu.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-BM6TDT1Y.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-dYC34MHw.js +257 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/templates/codeyam-memory-hook.sh +200 -0
- package/codeyam-cli/templates/codeyam:debug.md +47 -3
- package/codeyam-cli/templates/codeyam:diagnose.md +203 -25
- package/codeyam-cli/templates/codeyam:memory.md +341 -0
- package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
- package/codeyam-cli/templates/rule-reflection-hook.py +160 -0
- package/codeyam-cli/templates/rules-instructions.md +93 -0
- package/package.json +8 -5
- package/packages/ai/index.js +7 -3
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +70 -29
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
- package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +78 -8
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/methodSemantics.js +109 -23
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +1 -102
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +440 -27
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +161 -30
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +589 -166
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +179 -0
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +7 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +41 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +104 -11
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +159 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +265 -79
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
- package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructureChunking.js +111 -0
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
- package/packages/ai/src/lib/e2eDataTracking.js +241 -0
- package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
- package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
- package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
- package/packages/ai/src/lib/generateEntityScenarioData.js +525 -8
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +26 -2
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +281 -4
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +946 -42
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
- package/packages/ai/src/lib/mergeStatements.js +70 -51
- package/packages/ai/src/lib/mergeStatements.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
- package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +15 -7
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
- package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
- package/packages/ai/src/lib/resolvePathToControllable.js +155 -41
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/analysisContext.js +30 -5
- package/packages/analyze/src/lib/analysisContext.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +21 -9
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +14 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -10
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
- package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +160 -68
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +25 -8
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +71 -9
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +57 -9
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +233 -9
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
- package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
- package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
- package/packages/database/src/lib/kysely/db.js +8 -1
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
- package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
- package/packages/database/src/lib/loadAnalyses.js +45 -2
- package/packages/database/src/lib/loadAnalyses.js.map +1 -1
- package/packages/database/src/lib/loadAnalysis.js +8 -0
- package/packages/database/src/lib/loadAnalysis.js.map +1 -1
- package/packages/database/src/lib/loadBranch.js +11 -1
- package/packages/database/src/lib/loadBranch.js.map +1 -1
- package/packages/database/src/lib/loadCommit.js +7 -0
- package/packages/database/src/lib/loadCommit.js.map +1 -1
- package/packages/database/src/lib/loadCommits.js +22 -1
- package/packages/database/src/lib/loadCommits.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +23 -4
- package/packages/database/src/lib/loadEntities.js.map +1 -1
- package/packages/database/src/lib/loadEntityBranches.js +9 -0
- package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +5 -4
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/types/index.js.map +1 -1
- package/packages/utils/src/lib/safeFileName.js +29 -3
- package/packages/utils/src/lib/safeFileName.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +0 -37
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +0 -57
- package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +0 -228
|
@@ -17,7 +17,8 @@ import { startScenarioCapture } from './startScenarioCapture';
|
|
|
17
17
|
import { createController } from './controller/startController';
|
|
18
18
|
import { awsLog, awsLogDebugLevel } from '~codeyam/utils';
|
|
19
19
|
import * as v8 from 'v8';
|
|
20
|
-
import
|
|
20
|
+
import * as os from 'os';
|
|
21
|
+
import { initializeAIServiceMode, destroyWorkerPool } from '~codeyam/ai';
|
|
21
22
|
import runAnalysis, { EnvConfig, SharedContext } from './runAnalysis';
|
|
22
23
|
import {
|
|
23
24
|
loadOrCreateCommit,
|
|
@@ -119,28 +120,31 @@ async function main({
|
|
|
119
120
|
// and attempted to access project/commit/branch data before it was loaded.
|
|
120
121
|
const sharedContext = await loadSharedContext(envConfig);
|
|
121
122
|
|
|
122
|
-
//
|
|
123
|
+
// Memory monitoring: tracks both V8 heap and RSS (which includes worker threads)
|
|
124
|
+
const containerMemoryMB = process.env.ECS_CONTAINER_MEMORY_MB
|
|
125
|
+
? parseInt(process.env.ECS_CONTAINER_MEMORY_MB, 10)
|
|
126
|
+
: Math.round(os.totalmem() / 1024 / 1024);
|
|
123
127
|
let lastLogTime = 0;
|
|
124
128
|
setInterval(() => {
|
|
125
129
|
const mem = process.memoryUsage();
|
|
126
130
|
const heap = v8.getHeapStatistics();
|
|
127
|
-
const
|
|
131
|
+
const heapMB = Math.round(mem.heapUsed / 1024 / 1024);
|
|
132
|
+
const rssMB = Math.round(mem.rss / 1024 / 1024);
|
|
133
|
+
const heapLimitMB = Math.round(heap.heap_size_limit / 1024 / 1024);
|
|
134
|
+
const rssPercent = (rssMB / containerMemoryMB) * 100;
|
|
128
135
|
const now = Date.now();
|
|
129
136
|
|
|
130
|
-
if (
|
|
131
|
-
// High usage: warn every second
|
|
137
|
+
if (rssPercent >= 80) {
|
|
132
138
|
console.warn(
|
|
133
|
-
`CodeYam
|
|
139
|
+
`CodeYam Memory Warning: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB ⚠️ HIGH`,
|
|
134
140
|
);
|
|
135
|
-
} else if (
|
|
136
|
-
// Elevated usage: log every 5 seconds
|
|
141
|
+
} else if (rssPercent >= 50 && now - lastLogTime >= 5000) {
|
|
137
142
|
console.log(
|
|
138
|
-
`CodeYam
|
|
143
|
+
`CodeYam Memory Notice: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB ⚠️ Elevated`,
|
|
139
144
|
);
|
|
140
145
|
} else if (now - lastLogTime >= 30000) {
|
|
141
|
-
// Normal usage: log every 30 seconds
|
|
142
146
|
console.log(
|
|
143
|
-
`CodeYam
|
|
147
|
+
`CodeYam Memory Stats: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB 📊 OK`,
|
|
144
148
|
);
|
|
145
149
|
}
|
|
146
150
|
|
|
@@ -187,6 +191,11 @@ async function main({
|
|
|
187
191
|
analyzerPid: undefined,
|
|
188
192
|
capturePid: process.pid,
|
|
189
193
|
},
|
|
194
|
+
updateCallback(metadata) {
|
|
195
|
+
if (metadata.currentRun?.captureCompletedAt) {
|
|
196
|
+
metadata.currentRun.completedAt = new Date().toISOString();
|
|
197
|
+
}
|
|
198
|
+
},
|
|
190
199
|
}).catch((error) => {
|
|
191
200
|
awsLog(`Warning: Failed to update commit metadata: ${error}`);
|
|
192
201
|
});
|
|
@@ -219,6 +228,10 @@ async function main({
|
|
|
219
228
|
}
|
|
220
229
|
awsLog('CodeYam: Analysis producing, starting orchestration...');
|
|
221
230
|
|
|
231
|
+
// Worker pool is no longer needed after data structure prep phase.
|
|
232
|
+
// Freeing it reclaims ~2GB before capture workers ramp up.
|
|
233
|
+
await destroyWorkerPool();
|
|
234
|
+
|
|
222
235
|
// Create task runner based on orchestration mode
|
|
223
236
|
let taskRunner;
|
|
224
237
|
|
|
@@ -229,6 +242,17 @@ async function main({
|
|
|
229
242
|
framework: framework,
|
|
230
243
|
packageManager: packageManager,
|
|
231
244
|
});
|
|
245
|
+
|
|
246
|
+
const captureCommit =
|
|
247
|
+
sharedContext.commit ?? sharedContext.branchCommit;
|
|
248
|
+
if (captureCommit) {
|
|
249
|
+
await updateCommitMetadata({
|
|
250
|
+
commitId: captureCommit.id,
|
|
251
|
+
runStatusUpdate: {
|
|
252
|
+
captureTaskArns: taskRunner.getTaskArns(),
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
}
|
|
232
256
|
} else if (orchestrateCapture === 'local-sequential') {
|
|
233
257
|
taskRunner = await SequentialCaptureTaskRunner.create(
|
|
234
258
|
{
|
|
@@ -43,6 +43,108 @@ function normalizeParamsMockData(
|
|
|
43
43
|
return result;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
/**
|
|
47
|
+
* Convert comma-separated string values to arrays when they look like array data.
|
|
48
|
+
* This handles cases where the LLM generates strings like "color,size" instead
|
|
49
|
+
* of arrays like ["color", "size"] due to schema type misdetection.
|
|
50
|
+
*/
|
|
51
|
+
function convertCommaSeparatedStringsToArrays(
|
|
52
|
+
mockData: Record<string, unknown>,
|
|
53
|
+
): Record<string, unknown> {
|
|
54
|
+
const result: Record<string, unknown> = {};
|
|
55
|
+
|
|
56
|
+
for (const [key, value] of Object.entries(mockData)) {
|
|
57
|
+
if (typeof value === 'string') {
|
|
58
|
+
const asArray = parseCommaSeparatedStringAsArray(value, key);
|
|
59
|
+
if (asArray !== null) {
|
|
60
|
+
result[key] = asArray;
|
|
61
|
+
console.log(
|
|
62
|
+
`CodeYam: Converted comma-separated string to array for key "${key}": "${value}" -> [${asArray.map((s) => `"${s}"`).join(', ')}]`,
|
|
63
|
+
);
|
|
64
|
+
} else {
|
|
65
|
+
result[key] = value;
|
|
66
|
+
}
|
|
67
|
+
} else if (
|
|
68
|
+
value !== null &&
|
|
69
|
+
typeof value === 'object' &&
|
|
70
|
+
!Array.isArray(value)
|
|
71
|
+
) {
|
|
72
|
+
// Recursively process nested objects
|
|
73
|
+
result[key] = convertCommaSeparatedStringsToArrays(
|
|
74
|
+
value as Record<string, unknown>,
|
|
75
|
+
);
|
|
76
|
+
} else if (Array.isArray(value)) {
|
|
77
|
+
// Recursively process arrays (each element could be an object)
|
|
78
|
+
result[key] = value.map((item) => {
|
|
79
|
+
if (item !== null && typeof item === 'object' && !Array.isArray(item)) {
|
|
80
|
+
return convertCommaSeparatedStringsToArrays(
|
|
81
|
+
item as Record<string, unknown>,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
return item;
|
|
85
|
+
});
|
|
86
|
+
} else {
|
|
87
|
+
result[key] = value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Detect if a string looks like a comma-separated list that should be an array.
|
|
96
|
+
*/
|
|
97
|
+
function parseCommaSeparatedStringAsArray(
|
|
98
|
+
value: string,
|
|
99
|
+
key: string,
|
|
100
|
+
): string[] | null {
|
|
101
|
+
if (!value.includes(',')) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Heuristic: if the key name suggests it's an array field, convert it
|
|
106
|
+
// Check this FIRST before sentence detection, since "color, size" looks like
|
|
107
|
+
// a sentence but should be converted to ["color", "size"] for _attributes fields
|
|
108
|
+
const arrayFieldPatterns = [
|
|
109
|
+
/_attributes$/i,
|
|
110
|
+
/_ids$/i,
|
|
111
|
+
/_items$/i,
|
|
112
|
+
/_tags$/i,
|
|
113
|
+
/_values$/i,
|
|
114
|
+
/_types$/i,
|
|
115
|
+
/_names$/i,
|
|
116
|
+
/_keys$/i,
|
|
117
|
+
/^attributes$/i,
|
|
118
|
+
/^items$/i,
|
|
119
|
+
/^tags$/i,
|
|
120
|
+
/^values$/i,
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
const looksLikeArrayField = arrayFieldPatterns.some((pattern) =>
|
|
124
|
+
pattern.test(key),
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
if (looksLikeArrayField) {
|
|
128
|
+
// For array-like fields, only reject if it contains newlines (likely prose)
|
|
129
|
+
if (value.includes('\n')) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const parts = value.split(',').map((s) => s.trim());
|
|
133
|
+
return parts.filter((s) => s.length > 0);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// For non-array-named fields, apply stricter sentence detection
|
|
137
|
+
// Looks like a sentence: "Hello, world"
|
|
138
|
+
if (/,\s+[a-z]/.test(value)) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
if (value.includes('\n')) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
46
148
|
/**
|
|
47
149
|
* Return true when `markup` contains 0 or >1 meaningful
|
|
48
150
|
* top-level nodes (element *or* non-blank text), so React
|
|
@@ -632,13 +734,19 @@ const jsonToCode = (
|
|
|
632
734
|
stringValue.startsWith('Promise.') ||
|
|
633
735
|
stringValue.startsWith('new Promise');
|
|
634
736
|
|
|
737
|
+
// Check if the string contains newlines (potential issue for string literals)
|
|
738
|
+
const hasNewlines = stringValue.includes('\n');
|
|
739
|
+
|
|
635
740
|
// Handle special type indicators that need transformation
|
|
636
741
|
let outputValue: string;
|
|
637
742
|
if (stringValue === 'promise' || looksLikePromise) {
|
|
638
743
|
// The key is a function call (e.g., "revalidate()"), so output a function
|
|
639
744
|
// that returns a Promise, not the Promise itself
|
|
745
|
+
// Important: Escape newlines inside Promise expressions to avoid
|
|
746
|
+
// "unterminated string literal" errors when the Promise contains
|
|
747
|
+
// multi-line string arguments like Promise.resolve('line1\nline2')
|
|
640
748
|
const promiseExpr = looksLikePromise
|
|
641
|
-
? stringValue
|
|
749
|
+
? stringValue.replace(/\n/g, '\\n')
|
|
642
750
|
: 'Promise.resolve()';
|
|
643
751
|
outputValue = `() => ${promiseExpr}`;
|
|
644
752
|
console.log(
|
|
@@ -650,7 +758,12 @@ const jsonToCode = (
|
|
|
650
758
|
`CodeYam: Nested func transform (string->function): "${key}" -> "${funcName}": () => {}`,
|
|
651
759
|
);
|
|
652
760
|
} else if (looksLikeFunction) {
|
|
653
|
-
|
|
761
|
+
// If the function expression contains newlines inside string literals,
|
|
762
|
+
// we need to escape them to avoid "unterminated string literal" errors
|
|
763
|
+
// This handles cases like: () => Promise.resolve('line1\nline2')
|
|
764
|
+
outputValue = hasNewlines
|
|
765
|
+
? stringValue.replace(/\n/g, '\\n')
|
|
766
|
+
: stringValue;
|
|
654
767
|
console.log(
|
|
655
768
|
`CodeYam: Nested func transform (string): "${key}" -> "${funcName}": ${stringValue.substring(0, 30)}...`,
|
|
656
769
|
);
|
|
@@ -749,11 +862,16 @@ export default async function writeMockDataTsx(
|
|
|
749
862
|
|
|
750
863
|
// Reconcile mock data keys to match expected keys from dataForMocks
|
|
751
864
|
// This handles cases where LLM generated literal values instead of variable references
|
|
752
|
-
const
|
|
865
|
+
const reconciledMockData = reconcileMockDataKeys(
|
|
753
866
|
rawDefaultMockData,
|
|
754
867
|
expectedKeys,
|
|
755
868
|
);
|
|
756
869
|
|
|
870
|
+
// Convert comma-separated strings to arrays for fields that should be arrays
|
|
871
|
+
// This handles cases where LLM generates "color,size" instead of ["color", "size"]
|
|
872
|
+
const defaultMockData =
|
|
873
|
+
convertCommaSeparatedStringsToArrays(reconciledMockData);
|
|
874
|
+
|
|
757
875
|
const mockDataComment = `// This file is auto-generated by CodeYam. Do not edit this file manually.
|
|
758
876
|
// This file contains mock data required for:
|
|
759
877
|
// Scenario: ${mockScenario.id} - ${mockScenario.name}
|
|
@@ -791,11 +909,16 @@ import React from 'react';
|
|
|
791
909
|
};
|
|
792
910
|
|
|
793
911
|
// Reconcile scenario-specific mock data keys as well
|
|
794
|
-
const
|
|
912
|
+
const reconciledScenarioMockData = reconcileMockDataKeys(
|
|
795
913
|
rawScenarioMockData,
|
|
796
914
|
expectedKeys,
|
|
797
915
|
);
|
|
798
916
|
|
|
917
|
+
// Convert comma-separated strings to arrays for scenario data
|
|
918
|
+
const scenarioMockData = convertCommaSeparatedStringsToArrays(
|
|
919
|
+
reconciledScenarioMockData,
|
|
920
|
+
);
|
|
921
|
+
|
|
799
922
|
const mergedArguments = defaultArguments.map((defaultArg, index) => {
|
|
800
923
|
return deepMerge(defaultArg, scenarioArguments[index]);
|
|
801
924
|
});
|
|
@@ -1205,6 +1205,21 @@ function addMockToContent(
|
|
|
1205
1205
|
fileContent = fileContent.replace(importRegExp, '$1$2');
|
|
1206
1206
|
}
|
|
1207
1207
|
|
|
1208
|
+
// Also handle namespace imports (import * as foo from '...')
|
|
1209
|
+
// These need to be renamed to foo__cyOriginal when the mock code spreads from the original.
|
|
1210
|
+
// Note: We match any path (not just escapedImportPath) because the import path may have
|
|
1211
|
+
// been rewritten by transitive import handling before this code runs.
|
|
1212
|
+
if (shouldRenameToOriginal) {
|
|
1213
|
+
const namespaceImportRegExp = new RegExp(
|
|
1214
|
+
`(import\\s+\\*\\s+as\\s+)${escapeRegExp(firstPart)}(\\s+from\\s+['"][^'"]*['"])`,
|
|
1215
|
+
'm',
|
|
1216
|
+
);
|
|
1217
|
+
fileContent = fileContent.replace(
|
|
1218
|
+
namespaceImportRegExp,
|
|
1219
|
+
`$1${firstPart}__cyOriginal$2`,
|
|
1220
|
+
);
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1208
1223
|
// Remove empty imports entirely to avoid partial commenting issues with multiline imports
|
|
1209
1224
|
// This handles both single-line and multiline empty imports
|
|
1210
1225
|
fileContent = fileContent.replace(
|
|
@@ -1698,9 +1713,16 @@ export default async function writeScenarioComponents({
|
|
|
1698
1713
|
});
|
|
1699
1714
|
|
|
1700
1715
|
let importedExportIndex = 0;
|
|
1716
|
+
const loopStartTime = Date.now();
|
|
1717
|
+
console.log(
|
|
1718
|
+
`[WriteScenario] Starting import loop for ${entity.name}: ${sortedImportedExports.length} imports`,
|
|
1719
|
+
);
|
|
1701
1720
|
for (const importedExport of sortedImportedExports) {
|
|
1702
1721
|
importedExportIndex++;
|
|
1703
1722
|
if (importedExportIndex % 5 === 0 || importedExportIndex === 1) {
|
|
1723
|
+
console.log(
|
|
1724
|
+
`[WriteScenario] ${entity.name} import ${importedExportIndex}/${sortedImportedExports.length}: ${importedExport.name} elapsed=${Date.now() - loopStartTime}ms`,
|
|
1725
|
+
);
|
|
1704
1726
|
debugLog(
|
|
1705
1727
|
`Processing importedExport ${importedExportIndex}/${sortedImportedExports.length}`,
|
|
1706
1728
|
{
|
|
@@ -1888,6 +1910,10 @@ export default async function writeScenarioComponents({
|
|
|
1888
1910
|
importedExport.resolvedIsDefault === true &&
|
|
1889
1911
|
importedExport.isDefault === false;
|
|
1890
1912
|
|
|
1913
|
+
console.log(
|
|
1914
|
+
`[WriteScenario] RECURSE START: ${entity.name} -> ${importedExportEntity.name}`,
|
|
1915
|
+
);
|
|
1916
|
+
const recurseStartTime = Date.now();
|
|
1891
1917
|
debugLog(
|
|
1892
1918
|
`Recursing into writeScenarioComponents for ${importedExportEntity.name}`,
|
|
1893
1919
|
{
|
|
@@ -1919,7 +1945,10 @@ export default async function writeScenarioComponents({
|
|
|
1919
1945
|
? importedExport.name
|
|
1920
1946
|
: undefined,
|
|
1921
1947
|
}),
|
|
1922
|
-
|
|
1948
|
+
180000, // 3 minute timeout for recursive calls (complex components need more time)
|
|
1949
|
+
);
|
|
1950
|
+
console.log(
|
|
1951
|
+
`[WriteScenario] RECURSE END: ${entity.name} -> ${importedExportEntity.name} took ${Date.now() - recurseStartTime}ms`,
|
|
1923
1952
|
);
|
|
1924
1953
|
debugLog(
|
|
1925
1954
|
`Completed recursive writeScenarioComponents for ${importedExportEntity.name}`,
|
|
@@ -2261,6 +2290,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2261
2290
|
}
|
|
2262
2291
|
}
|
|
2263
2292
|
|
|
2293
|
+
// Track post-import-loop timing
|
|
2294
|
+
const postLoopStartTime = Date.now();
|
|
2295
|
+
console.log(`[WriteScenario] POST-LOOP START: ${entity.name}`);
|
|
2296
|
+
|
|
2264
2297
|
// Collect universal mocks BEFORE processing nodeModuleImports
|
|
2265
2298
|
// This is needed to check if a node module import is handled by a universal mock
|
|
2266
2299
|
const universalMocks = project.metadata?.universalMocks ?? [];
|
|
@@ -2320,6 +2353,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2320
2353
|
);
|
|
2321
2354
|
}
|
|
2322
2355
|
|
|
2356
|
+
console.log(
|
|
2357
|
+
`[WriteScenario] POST-LOOP ${entity.name}: node+universal mocks took ${Date.now() - postLoopStartTime}ms`,
|
|
2358
|
+
);
|
|
2359
|
+
|
|
2323
2360
|
if (
|
|
2324
2361
|
rootAnalysis.entitySha === entity.sha &&
|
|
2325
2362
|
entity.metadata?.notExported &&
|
|
@@ -2398,6 +2435,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2398
2435
|
);
|
|
2399
2436
|
debugLog('Completed rewriteRelativeModuleImports');
|
|
2400
2437
|
|
|
2438
|
+
console.log(
|
|
2439
|
+
`[WriteScenario] POST-LOOP ${entity.name}: transformations took ${Date.now() - postLoopStartTime}ms`,
|
|
2440
|
+
);
|
|
2441
|
+
|
|
2401
2442
|
/**
|
|
2402
2443
|
* Recursively process a file's imports to create transitive copies with server-only stripped.
|
|
2403
2444
|
* This handles chains of arbitrary depth: A -> B -> C -> D where each needs server-only removed.
|
|
@@ -2418,7 +2459,7 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2418
2459
|
startTime: number = Date.now(),
|
|
2419
2460
|
): Promise<string> {
|
|
2420
2461
|
// Global timeout for entire transitive processing
|
|
2421
|
-
const GLOBAL_TIMEOUT_MS =
|
|
2462
|
+
const GLOBAL_TIMEOUT_MS = 180000; // 3 minutes max for all transitive processing (complex components need more time)
|
|
2422
2463
|
const elapsed = Date.now() - startTime;
|
|
2423
2464
|
if (elapsed > GLOBAL_TIMEOUT_MS) {
|
|
2424
2465
|
throw new Error(
|
|
@@ -2427,6 +2468,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2427
2468
|
}
|
|
2428
2469
|
|
|
2429
2470
|
const importPaths = extractInternalImportPaths(content);
|
|
2471
|
+
// Always log to help debug timeout issues
|
|
2472
|
+
console.log(
|
|
2473
|
+
`[TransitiveImports] depth=${depth} file=${path.basename(sourceFilePath)} imports=${importPaths.length} visited=${visitedPaths.size} elapsed=${Date.now() - startTime}ms`,
|
|
2474
|
+
);
|
|
2430
2475
|
debugLog(`processTransitiveImportsRecursively depth=${depth}`, {
|
|
2431
2476
|
sourceFilePath,
|
|
2432
2477
|
importCount: importPaths.length,
|
|
@@ -2481,8 +2526,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2481
2526
|
);
|
|
2482
2527
|
const extension = importFile.name.split('.').pop();
|
|
2483
2528
|
const isIndex = isIndexPath(importFile.path);
|
|
2484
|
-
|
|
2485
|
-
const
|
|
2529
|
+
// Limit pathHash length to prevent ENAMETOOLONG errors on macOS (255 char limit)
|
|
2530
|
+
const pathHash = safeFileName(importFile.path, { maxLength: 80 });
|
|
2531
|
+
const scenarioSlug = safeFileName(scenario.name, { maxLength: 60 });
|
|
2532
|
+
const transitiveFilePath = `${PROJECT_RELATIVE_PATH}/${basePath}/${pathHash}_${isIndex ? 'index_' : ''}transitive_${scenarioSlug}.${extension}`;
|
|
2486
2533
|
|
|
2487
2534
|
// Check if this is a circular import (we're already processing this file)
|
|
2488
2535
|
const isCircularImport = visitedPaths.has(resolvedPath);
|
|
@@ -2606,6 +2653,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2606
2653
|
return modifiedContent;
|
|
2607
2654
|
}
|
|
2608
2655
|
|
|
2656
|
+
console.log(
|
|
2657
|
+
`[WriteScenario] POST-LOOP ${entity.name}: before remaining imports ${Date.now() - postLoopStartTime}ms`,
|
|
2658
|
+
);
|
|
2659
|
+
|
|
2609
2660
|
// Process remaining internal imports that weren't in importedExports
|
|
2610
2661
|
// This handles transitive dependencies: when the file content includes code (e.g., from
|
|
2611
2662
|
// other functions in the same file) that imports from files with "server-only"
|
|
@@ -2681,8 +2732,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2681
2732
|
);
|
|
2682
2733
|
const targetFileExtension = targetFile.name.split('.').pop();
|
|
2683
2734
|
const targetFileIsIndex = isIndexPath(targetFile.path);
|
|
2684
|
-
|
|
2685
|
-
const
|
|
2735
|
+
// Limit path hash length to prevent ENAMETOOLONG errors
|
|
2736
|
+
const filePathHash = safeFileName(targetFile.path, { maxLength: 80 });
|
|
2737
|
+
const targetScenarioSlug = safeFileName(scenario.name, { maxLength: 60 });
|
|
2738
|
+
const transformedFilePath = `${PROJECT_RELATIVE_PATH}/${targetFileBasePath}/${filePathHash}_${targetFileIsIndex ? 'index_' : ''}transitive_${targetScenarioSlug}.${targetFileExtension}`;
|
|
2686
2739
|
|
|
2687
2740
|
// Check if we've already processed this file as a transitive copy
|
|
2688
2741
|
// Note: __data_file_written__ is for entity-specific scenario files with different naming,
|
|
@@ -2737,8 +2790,12 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2737
2790
|
);
|
|
2738
2791
|
const nestedExtension = nestedFile.name.split('.').pop();
|
|
2739
2792
|
const nestedIsIndex = isIndexPath(nestedFile.path);
|
|
2740
|
-
|
|
2741
|
-
const
|
|
2793
|
+
// Limit path hash length to prevent ENAMETOOLONG errors
|
|
2794
|
+
const nestedPathHash = safeFileName(nestedFile.path, { maxLength: 80 });
|
|
2795
|
+
const nestedScenarioSlug = safeFileName(scenario.name, {
|
|
2796
|
+
maxLength: 60,
|
|
2797
|
+
});
|
|
2798
|
+
const nestedTransformedPath = `${PROJECT_RELATIVE_PATH}/${nestedBasePath}/${nestedPathHash}_${nestedIsIndex ? 'index_' : ''}transitive_${nestedScenarioSlug}.${nestedExtension}`;
|
|
2742
2799
|
|
|
2743
2800
|
// Check if already processed as a transitive file (we can rewrite to point to it)
|
|
2744
2801
|
// Note: __data_file_written__ is for entity-specific scenario files with different naming,
|
|
@@ -2859,6 +2916,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2859
2916
|
fileContent = fileContent.replace(importRegex, `$1${safeRelativePath}$2`);
|
|
2860
2917
|
}
|
|
2861
2918
|
|
|
2919
|
+
console.log(
|
|
2920
|
+
`[WriteScenario] POST-LOOP ${entity.name}: remaining imports loop took ${Date.now() - postLoopStartTime}ms`,
|
|
2921
|
+
);
|
|
2922
|
+
|
|
2862
2923
|
const scenarioComponentComment = `// This file is auto-generated by CodeYam. Do not edit this file manually.
|
|
2863
2924
|
// This file contains content for a scenario component:
|
|
2864
2925
|
// Analyses being written: ${JSON.stringify(fileAnalyses?.map((a) => ({ id: a.id, entityName: a.entityName })))}
|
|
@@ -2870,6 +2931,34 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2870
2931
|
// Scenario: ${scenario.id} - ${scenario.name}
|
|
2871
2932
|
`;
|
|
2872
2933
|
|
|
2934
|
+
// Final pass: Rename any namespace imports (import * as X from '...') that have
|
|
2935
|
+
// corresponding mock code using ...X__cyOriginal spread pattern.
|
|
2936
|
+
// This handles cases where:
|
|
2937
|
+
// 1. The import path was rewritten by transitive import handling
|
|
2938
|
+
// 2. The import wasn't caught by the earlier renaming logic
|
|
2939
|
+
// We scan for all __cyOriginal references in the mock code and ensure the imports are renamed.
|
|
2940
|
+
const cyOriginalReferences = fileContent.match(/\.\.\.(\w+)__cyOriginal/g);
|
|
2941
|
+
if (cyOriginalReferences) {
|
|
2942
|
+
const uniqueNames = [
|
|
2943
|
+
...new Set(
|
|
2944
|
+
cyOriginalReferences.map((ref) =>
|
|
2945
|
+
ref.replace('...', '').replace('__cyOriginal', ''),
|
|
2946
|
+
),
|
|
2947
|
+
),
|
|
2948
|
+
];
|
|
2949
|
+
for (const name of uniqueNames) {
|
|
2950
|
+
// Match namespace imports for this name that haven't been renamed yet
|
|
2951
|
+
const namespaceImportRegex = new RegExp(
|
|
2952
|
+
`(import\\s+\\*\\s+as\\s+)${escapeRegExp(name)}(\\s+from\\s+['"][^'"]*['"])`,
|
|
2953
|
+
'g',
|
|
2954
|
+
);
|
|
2955
|
+
fileContent = fileContent.replace(
|
|
2956
|
+
namespaceImportRegex,
|
|
2957
|
+
`$1${name}__cyOriginal$2`,
|
|
2958
|
+
);
|
|
2959
|
+
}
|
|
2960
|
+
}
|
|
2961
|
+
|
|
2873
2962
|
// Use the directive that was extracted at the beginning of processing
|
|
2874
2963
|
// This ensures it stays at the very top even after imports are prepended
|
|
2875
2964
|
// NOTE: We only preserve "use client" directives, NOT "use server" directives.
|
|
@@ -2891,5 +2980,9 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
|
|
|
2891
2980
|
debugLog('Successfully wrote scenario file');
|
|
2892
2981
|
scenarioComponentPaths.push(scenarioComponentPath);
|
|
2893
2982
|
|
|
2983
|
+
console.log(
|
|
2984
|
+
`[WriteScenario] POST-LOOP ${entity.name}: COMPLETE total=${Date.now() - postLoopStartTime}ms`,
|
|
2985
|
+
);
|
|
2986
|
+
|
|
2894
2987
|
return { scenarioComponentPaths, writtenScenarioComponents };
|
|
2895
2988
|
}
|