@codeyam/codeyam-cli 0.1.0-staging.036391e → 0.1.0-staging.07d8f7b
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 +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +14 -14
- package/analyzer-template/packages/ai/index.ts +1 -0
- package/analyzer-template/packages/ai/package.json +1 -1
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +14 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +34 -3
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +101 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +6 -0
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +114 -113
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +435 -13
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +70 -19
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.ts +35 -0
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +40 -13
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +110 -7
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +134 -2
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +359 -142
- package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +6 -0
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +18 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +9 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +12 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +65 -28
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +50 -25
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +83 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +176 -80
- package/analyzer-template/packages/aws/package.json +10 -10
- package/analyzer-template/packages/database/index.ts +1 -0
- package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +62 -0
- package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
- package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
- package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
- package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +151 -135
- package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
- package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
- package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
- package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/index.js +1 -0
- package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
- 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 +5 -0
- 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/debugReportsTable.d.ts +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +20 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -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 +23 -13
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
- 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 +100 -89
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +1 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
- package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +1 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +98 -3
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +121 -3
- package/analyzer-template/playwright/captureFromUrl.ts +89 -82
- package/analyzer-template/project/constructMockCode.ts +170 -50
- package/analyzer-template/project/orchestrateCapture.ts +4 -1
- package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
- package/analyzer-template/project/start.ts +3 -0
- package/analyzer-template/project/startScenarioCapture.ts +9 -0
- package/analyzer-template/project/writeClientLogRoute.ts +125 -0
- package/analyzer-template/project/writeMockDataTsx.ts +17 -0
- package/analyzer-template/project/writeScenarioComponents.ts +110 -17
- package/analyzer-template/tsconfig.json +13 -1
- package/background/src/lib/local/createLocalAnalyzer.js +1 -1
- package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +145 -41
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +4 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +2 -0
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
- package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
- package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +12 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +83 -12
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +209 -12
- package/codeyam-cli/scripts/apply-setup.js.map +1 -1
- package/codeyam-cli/src/cli.js +33 -24
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/codeyam-cli.js +18 -2
- package/codeyam-cli/src/codeyam-cli.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +21 -9
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/baseline.js +2 -0
- package/codeyam-cli/src/commands/baseline.js.map +1 -1
- package/codeyam-cli/src/commands/debug.js +2 -0
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +87 -21
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +697 -0
- package/codeyam-cli/src/commands/editor.js.map +1 -0
- package/codeyam-cli/src/commands/init.js +75 -259
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +95 -81
- package/codeyam-cli/src/commands/memory.js.map +1 -1
- package/codeyam-cli/src/commands/recapture.js +2 -0
- package/codeyam-cli/src/commands/recapture.js.map +1 -1
- package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
- package/codeyam-cli/src/commands/setup-simulations.js +284 -0
- package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
- package/codeyam-cli/src/commands/test-startup.js +2 -0
- package/codeyam-cli/src/commands/test-startup.js.map +1 -1
- package/codeyam-cli/src/commands/verify.js +14 -2
- package/codeyam-cli/src/commands/verify.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +185 -0
- package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
- package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +154 -86
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +7 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +109 -26
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/devModeEvents.js +40 -0
- package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
- package/codeyam-cli/src/utils/fileMetadata.js +5 -0
- package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
- package/codeyam-cli/src/utils/fileWatcher.js +25 -9
- package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +2 -2
- package/codeyam-cli/src/utils/git.js +52 -0
- package/codeyam-cli/src/utils/git.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +74 -63
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
- package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
- package/codeyam-cli/src/utils/labsAutoCheck.js +0 -29
- package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -1
- package/codeyam-cli/src/utils/npmVersionCheck.js +76 -0
- package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -0
- package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
- package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
- package/codeyam-cli/src/utils/progress.js +7 -0
- package/codeyam-cli/src/utils/progress.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
- package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
- package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +70 -1
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +7 -6
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/requireSimulations.js +10 -0
- package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +7 -8
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +0 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +97 -6
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +4 -6
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +3 -3
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -1
- package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
- package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
- package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
- package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +23 -23
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -1
- package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
- package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/index.js +1 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -1
- package/codeyam-cli/src/utils/rules/parser.js +19 -4
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
- package/codeyam-cli/src/utils/rules/pathMatcher.js +34 -3
- package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -1
- package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
- package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
- package/codeyam-cli/src/utils/rules/ruleState.js +10 -10
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -1
- package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
- package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +6 -6
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
- package/codeyam-cli/src/utils/serverState.js +64 -12
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +61 -43
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js +159 -0
- package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
- package/codeyam-cli/src/utils/syncMocksMiddleware.js +5 -24
- package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/testRunner.js +158 -0
- package/codeyam-cli/src/utils/testRunner.js.map +1 -0
- package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
- package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
- package/codeyam-cli/src/utils/versionInfo.js +46 -0
- package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
- package/codeyam-cli/src/utils/webappDetection.js +14 -2
- package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js +66 -0
- package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/database.js +55 -30
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
- package/codeyam-cli/src/webserver/backgroundServer.js +144 -25
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/bootstrap.js +11 -0
- package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CA3JxPb7.js → CopyButton-DmJveP3T.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-B86KKU7e.js → EntityItem-C76mRRiF.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-B5ctlSYt.js → EntityTypeBadge-g3saevPb.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BqY8gDAW.js → EntityTypeIcon-CobE682z.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-BDhPilK7.js → InteractivePreview-DYFW3lDD.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-VeqEBv9v.js → LibraryFunctionPreview-DLeucoVX.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-Bs7Nn1Jr.js → LoadingDots-BU_OAEMP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-Bm3PmcCz.js → LogViewer-ceAyBX-H.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-C6PKeMYR.js → ReportIssueModal-djPLI-WV.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-Gq3Ocjo6.js → SafeScreenshot-BED4B6sP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-BNLaXBHR.js → ScenarioViewer-B76aig_2.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/Terminal-BaIiqg_w.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-CiwXDxLh.js → TruncatedFilePath-C8OKAR5x.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-B3TDXxnk.js → _index-C96V0n15.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BtBFH820.js → activity.(_tab)-BpKzcsJz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-Duc5hnl7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-D9hemwl6.js +22 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.rule-path-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-PttOB2SF.js → book-open-D_nMCFmP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-TJp6ofnp.js → chevron-down-BH2h1Ea2.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-JE9ZIoBl.js → chunk-JZWAC4HX-C4pqxYJB.js} +9 -9
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-CXhHQYrI.js → circle-check-DyIKORY6.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{copy-6y9ALfGT.js → copy-NDbZjXao.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Ca9fAY46.js → createLucideIcon-CMT1jU2q.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor-Ba0jejiv.js +7 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-n38keI1k.js → entity._sha._-CrjR3zZW.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DloHYjtt.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-38yPijoD.js → entity._sha_.edit._scenarioId-BMvVHNXU.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-BSHEfydn.js → entry.client-DTvKq3TY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DCPhhSMo.js → fileTableUtils-cPo8LiG3.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-0N0YJQv7.js → files-DO4CZ16O.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-DXnyr8uP.js → git-CFCTYk9I.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-BH6uYxPM.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-ChN9-fAY.js → index-10oVnAAH.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-CcsFv748.js → index-BcvgDzbZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-Zk7ryIM1.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-CTqLEAGU.js → loader-circle-BAXYRVEO.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-dcea65f8.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-FweZHj5U.js +93 -0
- package/codeyam-cli/src/webserver/build/client/assets/{pause-D6vreykR.js → pause-DTAcYxBt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-Dzn8nIkU.js +67 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-B8VUL8nl.js → search-fKo7v0Zo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-DfuTtcJP.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-CPoAg7Zo.js → simulations-B3aOzpCZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-BrCP7uQo.js → terminal-BG4heKCG.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BZz2NjYa.js → triangle-alert-DtSmdtM4.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-DNwUduNu.js → useCustomSizes-ByhSyh0W.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +2 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CpZgwliL.js → useReportContext-O-jkvSPx.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-Bv9JFvUO.js → useToast-9FIWuYfK.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +9 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-mE6GlU_8.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BApEk7IO.js +362 -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/src/webserver/devServer.js +39 -5
- package/codeyam-cli/src/webserver/devServer.js.map +1 -1
- package/codeyam-cli/src/webserver/editorProxy.js +272 -0
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +121 -0
- package/codeyam-cli/src/webserver/server.js +177 -1
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +606 -0
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
- package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
- package/codeyam-cli/templates/codeyam-dev-mode.md +237 -0
- package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
- package/codeyam-cli/templates/codeyam-editor-claude.md +68 -0
- package/codeyam-cli/templates/codeyam-editor.md +67 -0
- package/codeyam-cli/templates/codeyam-memory-hook.sh +14 -14
- package/codeyam-cli/templates/{codeyam:memory.md → codeyam-memory.md} +16 -24
- package/codeyam-cli/templates/{codeyam:new-rule.md → codeyam-new-rule.md} +1 -3
- package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
- package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
- package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
- package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
- package/codeyam-cli/templates/editor-step-hook.py +143 -0
- package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
- package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
- package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
- package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
- package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
- package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
- package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/PRISMA_SETUP.md +84 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +19 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +35 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +37 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
- package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
- package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
- package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
- package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
- package/codeyam-cli/templates/rule-notification-hook.py +44 -17
- package/codeyam-cli/templates/rule-reflection-hook.py +88 -31
- package/codeyam-cli/templates/rules-instructions.md +45 -90
- package/package.json +15 -13
- package/packages/ai/index.js +1 -1
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +14 -0
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +78 -1
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
- package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +10 -7
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +362 -10
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
- package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +59 -17
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
- package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
- package/packages/ai/src/lib/dataStructureChunking.js +30 -11
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +79 -5
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +97 -2
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +242 -81
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
- package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
- package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +3 -0
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
- package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +11 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +8 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +54 -27
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +42 -13
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +65 -0
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +141 -71
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/database/index.js +1 -0
- package/packages/database/index.js.map +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js +1 -1
- package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
- package/packages/database/src/lib/analysisToDb.js +1 -1
- package/packages/database/src/lib/analysisToDb.js.map +1 -1
- package/packages/database/src/lib/branchToDb.js +1 -1
- package/packages/database/src/lib/branchToDb.js.map +1 -1
- package/packages/database/src/lib/commitBranchToDb.js +1 -1
- package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
- package/packages/database/src/lib/commitToDb.js +1 -1
- package/packages/database/src/lib/commitToDb.js.map +1 -1
- package/packages/database/src/lib/fileToDb.js +1 -1
- package/packages/database/src/lib/fileToDb.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +5 -0
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
- package/packages/database/src/lib/loadCommits.js +23 -13
- package/packages/database/src/lib/loadCommits.js.map +1 -1
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
- package/packages/database/src/lib/projectToDb.js +1 -1
- package/packages/database/src/lib/projectToDb.js.map +1 -1
- package/packages/database/src/lib/saveFiles.js +1 -1
- package/packages/database/src/lib/saveFiles.js.map +1 -1
- package/packages/database/src/lib/scenarioToDb.js +1 -1
- package/packages/database/src/lib/scenarioToDb.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +100 -89
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
- package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
- package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
- package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/packages/utils/src/lib/fs/rsyncCopy.js +98 -3
- package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +8 -76
- package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -118
- package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
- package/codeyam-cli/src/commands/list.js +0 -31
- package/codeyam-cli/src/commands/list.js.map +0 -1
- package/codeyam-cli/src/commands/webapp-info.js +0 -146
- package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
- package/codeyam-cli/src/utils/universal-mocks.js +0 -152
- package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-ClaLpuOo.js +0 -34
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-DfKzxuoe.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C5lqplTC.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DGgZjdFg.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-DoeDFXZN.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-CmBYA0PH.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-76786b8e.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-CrNQfdMO.js +0 -76
- package/codeyam-cli/src/webserver/build/client/assets/root-QAY34PIo.js +0 -62
- package/codeyam-cli/src/webserver/build/client/assets/settings-eBI36Yv5.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-COky1GVF.js +0 -2
- package/codeyam-cli/src/webserver/build/server/assets/index-DV1ykEI6.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BrcVrUEv.js +0 -260
- package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
- package/codeyam-cli/templates/codeyam:diagnose.md +0 -805
- /package/codeyam-cli/src/webserver/build/client/assets/{api.labs-survey-l0sNRNKZ.js → api.dev-mode-events-l0sNRNKZ.js} +0 -0
|
@@ -397,6 +397,7 @@ const SILENTLY_IGNORED_EQUIVALENCY_REASONS = new Set([
|
|
|
397
397
|
'transformed non-object function equivalency - implicit parent equivalency - rerouted via useCallback',
|
|
398
398
|
'transformed non-object function equivalency - Array.from() equivalency',
|
|
399
399
|
'Spread operator equivalency key update: Explicit array deconstruction equivalency value',
|
|
400
|
+
// 'transformed non-object function equivalency - Explicit array deconstruction equivalency value',
|
|
400
401
|
]);
|
|
401
402
|
|
|
402
403
|
export class ScopeDataStructure {
|
|
@@ -1107,6 +1108,33 @@ export class ScopeDataStructure {
|
|
|
1107
1108
|
return;
|
|
1108
1109
|
}
|
|
1109
1110
|
|
|
1111
|
+
// Case 3: Circular reference through scope-suffixed names (____cyScope pattern)
|
|
1112
|
+
// When a named arrow function is defined inside a scope (e.g., useEffect callback):
|
|
1113
|
+
// const identifyUser = async () => { ... };
|
|
1114
|
+
// identifyUser();
|
|
1115
|
+
// This creates a variable "identifyUser" and a scope "identifyUser____cyScope9F".
|
|
1116
|
+
// Mutual equivalencies between these cause infinite loops in Phase 2 because
|
|
1117
|
+
// processing one triggers addToSchema → followEquivalencies → addEquivalency
|
|
1118
|
+
// on the reverse, which repeats indefinitely.
|
|
1119
|
+
// Only block when the REVERSE direction already exists (creating a cycle).
|
|
1120
|
+
// The initial one-directional equivalency is necessary for scope resolution.
|
|
1121
|
+
if (
|
|
1122
|
+
path &&
|
|
1123
|
+
equivalentPath &&
|
|
1124
|
+
(equivalentPath.startsWith(path + '____') ||
|
|
1125
|
+
path.startsWith(equivalentPath + '____'))
|
|
1126
|
+
) {
|
|
1127
|
+
// Check if the reverse equivalency already exists
|
|
1128
|
+
const reverseEquivalencies =
|
|
1129
|
+
scopeNode.equivalencies[equivalentPath] || [];
|
|
1130
|
+
const reverseExists = reverseEquivalencies.some(
|
|
1131
|
+
(v) => v.schemaPath === path,
|
|
1132
|
+
);
|
|
1133
|
+
if (reverseExists) {
|
|
1134
|
+
return;
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1110
1138
|
if (!equivalentScopeName) {
|
|
1111
1139
|
console.error(
|
|
1112
1140
|
'CodeYam Error: Missing equivalent scope name - FULL CONTEXT:',
|
|
@@ -2797,6 +2825,8 @@ export class ScopeDataStructure {
|
|
|
2797
2825
|
usageEquivalency.scopeNodeName,
|
|
2798
2826
|
) as ScopeNode;
|
|
2799
2827
|
|
|
2828
|
+
if (!usageScopeNode) continue;
|
|
2829
|
+
|
|
2800
2830
|
// Guard against infinite recursion by tracking which paths we've already
|
|
2801
2831
|
// added from addComplexSourcePathVariables
|
|
2802
2832
|
if (
|
|
@@ -2876,6 +2906,8 @@ export class ScopeDataStructure {
|
|
|
2876
2906
|
usageEquivalency.scopeNodeName,
|
|
2877
2907
|
) as ScopeNode;
|
|
2878
2908
|
|
|
2909
|
+
if (!usageScopeNode) continue;
|
|
2910
|
+
|
|
2879
2911
|
// This is put in place to avoid propagating array functions like 'filter' through complex equivalencies
|
|
2880
2912
|
// but may cause problems if the funtion call is not on a known object (e.g. string or array)
|
|
2881
2913
|
if (
|
|
@@ -3355,6 +3387,22 @@ export class ScopeDataStructure {
|
|
|
3355
3387
|
* ensure all sub-paths of that variable are reflected under signature[N].
|
|
3356
3388
|
*/
|
|
3357
3389
|
private propagateParameterToSignaturePaths(scopeNode: ScopeNode) {
|
|
3390
|
+
// Helper: check if a type is a concrete scalar that cannot have sub-properties.
|
|
3391
|
+
const SCALAR_TYPES = new Set([
|
|
3392
|
+
'string',
|
|
3393
|
+
'number',
|
|
3394
|
+
'boolean',
|
|
3395
|
+
'bigint',
|
|
3396
|
+
'symbol',
|
|
3397
|
+
'void',
|
|
3398
|
+
'never',
|
|
3399
|
+
]);
|
|
3400
|
+
const isDefinitelyScalar = (type: string): boolean => {
|
|
3401
|
+
const parts = type.split('|').map((s) => s.trim());
|
|
3402
|
+
const base = parts.filter((s) => s !== 'undefined' && s !== 'null');
|
|
3403
|
+
return base.length > 0 && base.every((b) => SCALAR_TYPES.has(b));
|
|
3404
|
+
};
|
|
3405
|
+
|
|
3358
3406
|
// Find variable → signature[N] equivalencies
|
|
3359
3407
|
for (const [varName, equivalencies] of Object.entries(
|
|
3360
3408
|
scopeNode.equivalencies,
|
|
@@ -3385,7 +3433,38 @@ export class ScopeDataStructure {
|
|
|
3385
3433
|
|
|
3386
3434
|
// Only add if the signature path doesn't already exist
|
|
3387
3435
|
if (!scopeNode.schema[sigKey]) {
|
|
3388
|
-
|
|
3436
|
+
// Check if this path represents variable conflation:
|
|
3437
|
+
// When a standalone variable (e.g., showWorkoutForm from useState)
|
|
3438
|
+
// appears as a sub-property of a scalar-typed ancestor (e.g.,
|
|
3439
|
+
// activity_type = "string"), it's from scope conflation, not real
|
|
3440
|
+
// property access. Block these while allowing legitimate built-in
|
|
3441
|
+
// accesses like string.length or string.slice.
|
|
3442
|
+
let isConflatedPath = false;
|
|
3443
|
+
let checkPos = signaturePath.length;
|
|
3444
|
+
while (true) {
|
|
3445
|
+
checkPos = sigKey.indexOf('.', checkPos + 1);
|
|
3446
|
+
if (checkPos === -1) break;
|
|
3447
|
+
const ancestorPath = sigKey.substring(0, checkPos);
|
|
3448
|
+
const ancestorType = scopeNode.schema[ancestorPath];
|
|
3449
|
+
if (ancestorType && isDefinitelyScalar(ancestorType)) {
|
|
3450
|
+
// Ancestor is scalar — check if the immediate sub-property
|
|
3451
|
+
// is also a standalone variable (indicating conflation)
|
|
3452
|
+
const afterDot = sigKey.substring(checkPos + 1);
|
|
3453
|
+
const nextSep = afterDot.search(/[.\[]/);
|
|
3454
|
+
const subPropName =
|
|
3455
|
+
nextSep === -1
|
|
3456
|
+
? afterDot
|
|
3457
|
+
: afterDot.substring(0, nextSep);
|
|
3458
|
+
if (scopeNode.schema[subPropName] !== undefined) {
|
|
3459
|
+
isConflatedPath = true;
|
|
3460
|
+
break;
|
|
3461
|
+
}
|
|
3462
|
+
}
|
|
3463
|
+
}
|
|
3464
|
+
|
|
3465
|
+
if (!isConflatedPath) {
|
|
3466
|
+
scopeNode.schema[sigKey] = scopeNode.schema[key];
|
|
3467
|
+
}
|
|
3389
3468
|
}
|
|
3390
3469
|
}
|
|
3391
3470
|
}
|
|
@@ -3898,25 +3977,116 @@ export class ScopeDataStructure {
|
|
|
3898
3977
|
return [source];
|
|
3899
3978
|
};
|
|
3900
3979
|
|
|
3901
|
-
|
|
3902
|
-
(
|
|
3903
|
-
if (entry.sourceCandidates.length === 0) return
|
|
3980
|
+
const acc = entries.reduce(
|
|
3981
|
+
(result, entry) => {
|
|
3982
|
+
if (entry.sourceCandidates.length === 0) return result;
|
|
3904
3983
|
const usages = entry.usages.filter(usageMatchesScope);
|
|
3905
3984
|
for (const usage of usages) {
|
|
3906
|
-
|
|
3985
|
+
result[usage.schemaPath] ||= [];
|
|
3907
3986
|
// Resolve each source candidate through the equivalency chain
|
|
3908
3987
|
for (const source of entry.sourceCandidates) {
|
|
3909
3988
|
const resolvedSources = resolveToSignature(source, new Set());
|
|
3910
|
-
|
|
3989
|
+
result[usage.schemaPath].push(...resolvedSources);
|
|
3911
3990
|
}
|
|
3912
3991
|
}
|
|
3913
|
-
return
|
|
3992
|
+
return result;
|
|
3914
3993
|
},
|
|
3915
3994
|
{} as Record<
|
|
3916
3995
|
string,
|
|
3917
3996
|
Pick<ScopeVariable, 'scopeNodeName' | 'schemaPath'>[]
|
|
3918
3997
|
>,
|
|
3919
3998
|
);
|
|
3999
|
+
|
|
4000
|
+
// Post-processing: enrich useState-backed sources with co-located external
|
|
4001
|
+
// function calls. When a useState value resolves to a setter variable that
|
|
4002
|
+
// lives in the same scope as a fetch/API call, that fetch is a data source.
|
|
4003
|
+
this.enrichUseStateSourcesWithCoLocatedCalls(acc);
|
|
4004
|
+
|
|
4005
|
+
return acc;
|
|
4006
|
+
}
|
|
4007
|
+
|
|
4008
|
+
/**
|
|
4009
|
+
* For each source that ends at a useState path, check if the setter was called
|
|
4010
|
+
* from a scope that also contains external function calls (like fetch).
|
|
4011
|
+
* If so, add those external calls as additional source candidates.
|
|
4012
|
+
*/
|
|
4013
|
+
private enrichUseStateSourcesWithCoLocatedCalls(
|
|
4014
|
+
acc: Record<string, Pick<ScopeVariable, 'scopeNodeName' | 'schemaPath'>[]>,
|
|
4015
|
+
) {
|
|
4016
|
+
const rootScopeName = this.scopeTreeManager.getRootName();
|
|
4017
|
+
const rootScope = this.scopeNodes[rootScopeName];
|
|
4018
|
+
if (!rootScope) return;
|
|
4019
|
+
|
|
4020
|
+
// Collect all descendants for each scope node
|
|
4021
|
+
const getAllDescendants = (
|
|
4022
|
+
node: import('./helpers/ScopeTreeManager').ScopeTreeNode,
|
|
4023
|
+
): Set<string> => {
|
|
4024
|
+
const names = new Set<string>([node.name]);
|
|
4025
|
+
for (const child of node.children) {
|
|
4026
|
+
for (const name of getAllDescendants(child)) {
|
|
4027
|
+
names.add(name);
|
|
4028
|
+
}
|
|
4029
|
+
}
|
|
4030
|
+
return names;
|
|
4031
|
+
};
|
|
4032
|
+
|
|
4033
|
+
for (const [usagePath, sources] of Object.entries(acc)) {
|
|
4034
|
+
const additionalSources: Pick<
|
|
4035
|
+
ScopeVariable,
|
|
4036
|
+
'scopeNodeName' | 'schemaPath'
|
|
4037
|
+
>[] = [];
|
|
4038
|
+
|
|
4039
|
+
for (const source of sources) {
|
|
4040
|
+
// Check if this source is a useState-related terminal path
|
|
4041
|
+
// (e.g., useState(X).functionCallReturnValue[1] or useState(X).signature[0])
|
|
4042
|
+
if (!source.schemaPath.match(/^useState\([^)]*\)\./)) continue;
|
|
4043
|
+
|
|
4044
|
+
// Find the useState call from the source path
|
|
4045
|
+
const useStateCallMatch = source.schemaPath.match(
|
|
4046
|
+
/^(useState\([^)]*\))\./,
|
|
4047
|
+
);
|
|
4048
|
+
if (!useStateCallMatch) continue;
|
|
4049
|
+
const useStateCall = useStateCallMatch[1];
|
|
4050
|
+
|
|
4051
|
+
// Look in the root scope for the useState value equivalency
|
|
4052
|
+
// which tells us where the setter was called from
|
|
4053
|
+
const valuePath = `${useStateCall}.functionCallReturnValue[0]`;
|
|
4054
|
+
const valueEquivs = rootScope.equivalencies[valuePath];
|
|
4055
|
+
if (!valueEquivs) continue;
|
|
4056
|
+
|
|
4057
|
+
for (const equiv of valueEquivs) {
|
|
4058
|
+
// Find the scope where the setter was called
|
|
4059
|
+
const setterScopeName = equiv.scopeNodeName;
|
|
4060
|
+
const setterScopeTree =
|
|
4061
|
+
this.scopeTreeManager.findNode(setterScopeName);
|
|
4062
|
+
if (!setterScopeTree) continue;
|
|
4063
|
+
|
|
4064
|
+
// Get all descendant scope names from the setter scope
|
|
4065
|
+
const relatedScopes = getAllDescendants(setterScopeTree);
|
|
4066
|
+
|
|
4067
|
+
// Find external function calls in those scopes whose return values
|
|
4068
|
+
// are actually consumed (assigned to a variable). This excludes
|
|
4069
|
+
// fire-and-forget calls like analytics.track() or console.log().
|
|
4070
|
+
const coLocatedCalls = this.externalFunctionCalls.filter(
|
|
4071
|
+
(efc) =>
|
|
4072
|
+
relatedScopes.has(efc.callScope) &&
|
|
4073
|
+
efc.receivingVariableNames &&
|
|
4074
|
+
efc.receivingVariableNames.length > 0,
|
|
4075
|
+
);
|
|
4076
|
+
|
|
4077
|
+
for (const call of coLocatedCalls) {
|
|
4078
|
+
additionalSources.push({
|
|
4079
|
+
scopeNodeName: call.callScope,
|
|
4080
|
+
schemaPath: `${call.callSignature}.functionCallReturnValue`,
|
|
4081
|
+
});
|
|
4082
|
+
}
|
|
4083
|
+
}
|
|
4084
|
+
}
|
|
4085
|
+
|
|
4086
|
+
if (additionalSources.length > 0) {
|
|
4087
|
+
acc[usagePath].push(...additionalSources);
|
|
4088
|
+
}
|
|
4089
|
+
}
|
|
3920
4090
|
}
|
|
3921
4091
|
|
|
3922
4092
|
getUsageEquivalencies(functionName?: string) {
|
|
@@ -4069,6 +4239,24 @@ export class ScopeDataStructure {
|
|
|
4069
4239
|
}
|
|
4070
4240
|
}
|
|
4071
4241
|
|
|
4242
|
+
// Helper: check if a type is a concrete scalar that cannot have sub-properties.
|
|
4243
|
+
// e.g., "string", "number | undefined", "boolean | null" are scalar.
|
|
4244
|
+
// "object", "array", "function", "unknown", "Workout", etc. are NOT scalar.
|
|
4245
|
+
const SCALAR_TYPES = new Set([
|
|
4246
|
+
'string',
|
|
4247
|
+
'number',
|
|
4248
|
+
'boolean',
|
|
4249
|
+
'bigint',
|
|
4250
|
+
'symbol',
|
|
4251
|
+
'void',
|
|
4252
|
+
'never',
|
|
4253
|
+
]);
|
|
4254
|
+
const isDefinitelyScalarType = (type: string): boolean => {
|
|
4255
|
+
const parts = type.split('|').map((s) => s.trim());
|
|
4256
|
+
const base = parts.filter((s) => s !== 'undefined' && s !== 'null');
|
|
4257
|
+
return base.length > 0 && base.every((b) => SCALAR_TYPES.has(b));
|
|
4258
|
+
};
|
|
4259
|
+
|
|
4072
4260
|
// Propagate nested paths from variables to their signature equivalents
|
|
4073
4261
|
// e.g., if workouts = signature[0].workouts, then workouts[].title becomes
|
|
4074
4262
|
// signature[0].workouts[].title
|
|
@@ -4093,7 +4281,69 @@ export class ScopeDataStructure {
|
|
|
4093
4281
|
|
|
4094
4282
|
// Add to schema if not already present
|
|
4095
4283
|
if (!tempScopeNode.schema[signatureKey]) {
|
|
4096
|
-
|
|
4284
|
+
// Check if this path represents variable conflation:
|
|
4285
|
+
// When a standalone variable (e.g., showWorkoutForm from useState)
|
|
4286
|
+
// appears as a sub-property of a scalar-typed ancestor (e.g.,
|
|
4287
|
+
// activity_type = "string"), it's from scope conflation, not real
|
|
4288
|
+
// property access. Block these while allowing legitimate built-in
|
|
4289
|
+
// accesses like string.length or string.slice.
|
|
4290
|
+
let isConflatedPath = false;
|
|
4291
|
+
let checkPos = signaturePath.length;
|
|
4292
|
+
while (true) {
|
|
4293
|
+
checkPos = signatureKey.indexOf('.', checkPos + 1);
|
|
4294
|
+
if (checkPos === -1) break;
|
|
4295
|
+
const ancestorPath = signatureKey.substring(0, checkPos);
|
|
4296
|
+
const ancestorType = tempScopeNode.schema[ancestorPath];
|
|
4297
|
+
if (ancestorType && isDefinitelyScalarType(ancestorType)) {
|
|
4298
|
+
// Ancestor is scalar — check if the immediate sub-property
|
|
4299
|
+
// is also a standalone variable (indicating conflation)
|
|
4300
|
+
const afterDot = signatureKey.substring(checkPos + 1);
|
|
4301
|
+
const nextSep = afterDot.search(/[.\[]/);
|
|
4302
|
+
const subPropName =
|
|
4303
|
+
nextSep === -1 ? afterDot : afterDot.substring(0, nextSep);
|
|
4304
|
+
if (schema[subPropName] !== undefined) {
|
|
4305
|
+
isConflatedPath = true;
|
|
4306
|
+
break;
|
|
4307
|
+
}
|
|
4308
|
+
}
|
|
4309
|
+
}
|
|
4310
|
+
|
|
4311
|
+
if (!isConflatedPath) {
|
|
4312
|
+
tempScopeNode.schema[signatureKey] = schema[schemaKey];
|
|
4313
|
+
}
|
|
4314
|
+
}
|
|
4315
|
+
}
|
|
4316
|
+
}
|
|
4317
|
+
}
|
|
4318
|
+
|
|
4319
|
+
// Post-process: filter out conflated signature paths.
|
|
4320
|
+
// During phase 2 scope analysis, useState(false) conflation can create
|
|
4321
|
+
// bad paths like signature[0].mockWorkouts[].activity_type.showWorkoutForm
|
|
4322
|
+
// directly in scopeNode.schema. These flow through signatureInSchema into
|
|
4323
|
+
// tempScopeNode.schema without any guard. Filter them out here by checking:
|
|
4324
|
+
// 1. An ancestor in the path has a concrete scalar type (string, number, boolean, etc.)
|
|
4325
|
+
// 2. The immediate sub-property of that scalar ancestor is also a standalone
|
|
4326
|
+
// variable in the schema (indicating conflation, not a real property access)
|
|
4327
|
+
for (const key of Object.keys(tempScopeNode.schema)) {
|
|
4328
|
+
if (!key.startsWith('signature[')) continue;
|
|
4329
|
+
|
|
4330
|
+
// Walk through the path looking for scalar-typed ancestors
|
|
4331
|
+
let pos = 0;
|
|
4332
|
+
while (true) {
|
|
4333
|
+
pos = key.indexOf('.', pos + 1);
|
|
4334
|
+
if (pos === -1) break;
|
|
4335
|
+
const ancestorPath = key.substring(0, pos);
|
|
4336
|
+
const ancestorType = tempScopeNode.schema[ancestorPath];
|
|
4337
|
+
if (ancestorType && isDefinitelyScalarType(ancestorType)) {
|
|
4338
|
+
// Found a scalar ancestor — check if the sub-property name
|
|
4339
|
+
// is a standalone variable in the getSchema() result
|
|
4340
|
+
const afterDot = key.substring(pos + 1);
|
|
4341
|
+
const nextSep = afterDot.search(/[.\[]/);
|
|
4342
|
+
const subPropName =
|
|
4343
|
+
nextSep === -1 ? afterDot : afterDot.substring(0, nextSep);
|
|
4344
|
+
if (schema[subPropName] !== undefined) {
|
|
4345
|
+
delete tempScopeNode.schema[key];
|
|
4346
|
+
break;
|
|
4097
4347
|
}
|
|
4098
4348
|
}
|
|
4099
4349
|
}
|
|
@@ -4423,6 +4673,15 @@ export class ScopeDataStructure {
|
|
|
4423
4673
|
!equivalentValue.schemaPath.startsWith('signature[') && // not a signature path
|
|
4424
4674
|
!equivalentValue.schemaPath.endsWith('.functionCallReturnValue') // not already handled above
|
|
4425
4675
|
) {
|
|
4676
|
+
// Skip bare "returnValue" from child scopes — this is the child's return value,
|
|
4677
|
+
// not a meaningful data source path in the parent scope
|
|
4678
|
+
if (
|
|
4679
|
+
equivalentValue.schemaPath === 'returnValue' &&
|
|
4680
|
+
equivalentValue.scopeNodeName !==
|
|
4681
|
+
this.scopeTreeManager.getRootName()
|
|
4682
|
+
) {
|
|
4683
|
+
continue;
|
|
4684
|
+
}
|
|
4426
4685
|
// Add equivalency (will accumulate if multiple values for OR expressions)
|
|
4427
4686
|
addEquivalency(path, equivalentValue.schemaPath);
|
|
4428
4687
|
}
|
|
@@ -4824,9 +5083,109 @@ export class ScopeDataStructure {
|
|
|
4824
5083
|
// Replace cyScope placeholders in all external function call data
|
|
4825
5084
|
// This ensures call signatures and schema paths use actual callback text
|
|
4826
5085
|
// instead of internal cyScope names, preventing mock data merge conflicts.
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
5086
|
+
const rootScopeName = this.scopeTreeManager.getRootName();
|
|
5087
|
+
const rootSchema = this.scopeNodes[rootScopeName]?.schema ?? {};
|
|
5088
|
+
|
|
5089
|
+
return this.externalFunctionCalls.map((efc) => {
|
|
5090
|
+
const cleaned = this.cleanCyScopeFromFunctionCallInfo(efc);
|
|
5091
|
+
return this.filterConflatedExternalPaths(cleaned, rootSchema);
|
|
5092
|
+
});
|
|
5093
|
+
}
|
|
5094
|
+
|
|
5095
|
+
/**
|
|
5096
|
+
* Filters out conflated paths from external function call schemas.
|
|
5097
|
+
*
|
|
5098
|
+
* When multiple useState(false) calls create equivalency conflation during
|
|
5099
|
+
* Phase 1 analysis, standalone boolean state variables (like showWorkoutForm,
|
|
5100
|
+
* showGoalForm) can bleed into external function call schemas as sub-properties
|
|
5101
|
+
* of unrelated data fields (like data[].activity_type.showWorkoutForm).
|
|
5102
|
+
*
|
|
5103
|
+
* Detection: group sub-properties by parent path. If 2+ sub-properties of
|
|
5104
|
+
* the same parent all match standalone root scope variable names, treat them
|
|
5105
|
+
* as conflation artifacts and remove them.
|
|
5106
|
+
*/
|
|
5107
|
+
private filterConflatedExternalPaths(
|
|
5108
|
+
efc: FunctionCallInfo,
|
|
5109
|
+
rootSchema: Record<string, string>,
|
|
5110
|
+
): FunctionCallInfo {
|
|
5111
|
+
// Build a set of top-level root scope variable names (simple names, no dots/brackets)
|
|
5112
|
+
const topLevelRootVars = new Set<string>();
|
|
5113
|
+
for (const key of Object.keys(rootSchema)) {
|
|
5114
|
+
if (!key.includes('.') && !key.includes('[')) {
|
|
5115
|
+
topLevelRootVars.add(key);
|
|
5116
|
+
}
|
|
5117
|
+
}
|
|
5118
|
+
|
|
5119
|
+
if (topLevelRootVars.size === 0) return efc;
|
|
5120
|
+
|
|
5121
|
+
// Group sub-property matches by their parent path.
|
|
5122
|
+
// For a path like "...data[].activity_type.showWorkoutForm",
|
|
5123
|
+
// parent = "...data[].activity_type", child = "showWorkoutForm"
|
|
5124
|
+
const parentToConflatedKeys = new Map<string, string[]>();
|
|
5125
|
+
|
|
5126
|
+
for (const key of Object.keys(efc.schema)) {
|
|
5127
|
+
const lastDot = key.lastIndexOf('.');
|
|
5128
|
+
if (lastDot === -1) continue;
|
|
5129
|
+
|
|
5130
|
+
const parent = key.substring(0, lastDot);
|
|
5131
|
+
const child = key.substring(lastDot + 1);
|
|
5132
|
+
|
|
5133
|
+
// Skip array access or function call patterns
|
|
5134
|
+
if (child.includes('[') || child.includes('(')) continue;
|
|
5135
|
+
|
|
5136
|
+
// Only consider paths inside array element chains (contains []).
|
|
5137
|
+
// Direct children of functionCallReturnValue are legitimate destructured
|
|
5138
|
+
// return values, not conflation. Conflation happens deeper in the chain
|
|
5139
|
+
// when array element fields get corrupted sub-properties.
|
|
5140
|
+
if (!parent.includes('[')) continue;
|
|
5141
|
+
|
|
5142
|
+
if (topLevelRootVars.has(child)) {
|
|
5143
|
+
if (!parentToConflatedKeys.has(parent)) {
|
|
5144
|
+
parentToConflatedKeys.set(parent, []);
|
|
5145
|
+
}
|
|
5146
|
+
parentToConflatedKeys.get(parent)!.push(key);
|
|
5147
|
+
}
|
|
5148
|
+
}
|
|
5149
|
+
|
|
5150
|
+
// Only filter when 2+ sub-properties of the same parent match root scope vars.
|
|
5151
|
+
// This threshold avoids false positives from coincidental name matches.
|
|
5152
|
+
const keysToRemove = new Set<string>();
|
|
5153
|
+
const parentsToRestore = new Set<string>();
|
|
5154
|
+
|
|
5155
|
+
for (const [parent, conflatedKeys] of parentToConflatedKeys) {
|
|
5156
|
+
if (conflatedKeys.length >= 2) {
|
|
5157
|
+
for (const key of conflatedKeys) {
|
|
5158
|
+
keysToRemove.add(key);
|
|
5159
|
+
}
|
|
5160
|
+
parentsToRestore.add(parent);
|
|
5161
|
+
}
|
|
5162
|
+
}
|
|
5163
|
+
|
|
5164
|
+
if (keysToRemove.size === 0) return efc;
|
|
5165
|
+
|
|
5166
|
+
// Create a new schema without the conflated paths
|
|
5167
|
+
const newSchema: Record<string, string> = {};
|
|
5168
|
+
for (const [key, value] of Object.entries(efc.schema)) {
|
|
5169
|
+
if (keysToRemove.has(key)) continue;
|
|
5170
|
+
|
|
5171
|
+
// Restore parent type: if it was changed to "object" because of conflated
|
|
5172
|
+
// sub-properties, and now all those sub-properties are removed, change it
|
|
5173
|
+
// back to "unknown" (we don't know the original type)
|
|
5174
|
+
if (parentsToRestore.has(key) && value === 'object') {
|
|
5175
|
+
// Check if there are any remaining sub-properties
|
|
5176
|
+
const hasRemainingSubProps = Object.keys(efc.schema).some(
|
|
5177
|
+
(k) =>
|
|
5178
|
+
!keysToRemove.has(k) &&
|
|
5179
|
+
k !== key &&
|
|
5180
|
+
(k.startsWith(key + '.') || k.startsWith(key + '[')),
|
|
5181
|
+
);
|
|
5182
|
+
newSchema[key] = hasRemainingSubProps ? value : 'unknown';
|
|
5183
|
+
} else {
|
|
5184
|
+
newSchema[key] = value;
|
|
5185
|
+
}
|
|
5186
|
+
}
|
|
5187
|
+
|
|
5188
|
+
return { ...efc, schema: newSchema };
|
|
4830
5189
|
}
|
|
4831
5190
|
|
|
4832
5191
|
/**
|
|
@@ -5119,6 +5478,10 @@ export class ScopeDataStructure {
|
|
|
5119
5478
|
getEnrichedConditionalUsages(): Record<string, EnrichedConditionalUsage[]> {
|
|
5120
5479
|
const enriched: Record<string, EnrichedConditionalUsage[]> = {};
|
|
5121
5480
|
|
|
5481
|
+
console.log(
|
|
5482
|
+
`[getEnrichedConditionalUsages] Processing ${Object.keys(this.rawConditionalUsages).length} conditional paths: [${Object.keys(this.rawConditionalUsages).join(', ')}]`,
|
|
5483
|
+
);
|
|
5484
|
+
|
|
5122
5485
|
for (const [path, usages] of Object.entries(this.rawConditionalUsages)) {
|
|
5123
5486
|
// Try to trace this path back to a data source
|
|
5124
5487
|
// First, try the root scope
|
|
@@ -5127,10 +5490,69 @@ export class ScopeDataStructure {
|
|
|
5127
5490
|
|
|
5128
5491
|
let sourceDataPath: string | undefined;
|
|
5129
5492
|
if (explanation.source) {
|
|
5130
|
-
|
|
5131
|
-
|
|
5493
|
+
const { scope, path: sourcePath } = explanation.source;
|
|
5494
|
+
|
|
5495
|
+
// Build initial path — avoid redundant prefix when path already contains the scope call
|
|
5496
|
+
let fullPath: string;
|
|
5497
|
+
if (sourcePath.startsWith(`${scope}(`)) {
|
|
5498
|
+
fullPath = sourcePath;
|
|
5499
|
+
} else {
|
|
5500
|
+
fullPath = `${scope}.${sourcePath}`;
|
|
5501
|
+
}
|
|
5502
|
+
|
|
5503
|
+
sourceDataPath = fullPath;
|
|
5504
|
+
console.log(
|
|
5505
|
+
`[getEnrichedConditionalUsages] "${path}" explainPath → scope="${scope}", sourcePath="${sourcePath}" → sourceDataPath="${sourceDataPath}"`,
|
|
5506
|
+
);
|
|
5507
|
+
} else {
|
|
5508
|
+
console.log(
|
|
5509
|
+
`[getEnrichedConditionalUsages] "${path}" explainPath → no source found`,
|
|
5510
|
+
);
|
|
5132
5511
|
}
|
|
5133
5512
|
|
|
5513
|
+
// If explainPath didn't find a useful external source (e.g., it traced to
|
|
5514
|
+
// useState or just to the component scope itself), check sourceEquivalencies
|
|
5515
|
+
// for an external function call source like a fetch call
|
|
5516
|
+
const hasExternalSource = sourceDataPath?.includes(
|
|
5517
|
+
'.functionCallReturnValue',
|
|
5518
|
+
);
|
|
5519
|
+
if (!hasExternalSource) {
|
|
5520
|
+
console.log(
|
|
5521
|
+
`[getEnrichedConditionalUsages] "${path}" no external source (sourceDataPath="${sourceDataPath}"), checking sourceEquivalencies fallback...`,
|
|
5522
|
+
);
|
|
5523
|
+
const sourceEquiv = this.getSourceEquivalencies();
|
|
5524
|
+
const returnValueKey = `returnValue.${path}`;
|
|
5525
|
+
const sources = sourceEquiv[returnValueKey];
|
|
5526
|
+
if (sources) {
|
|
5527
|
+
console.log(
|
|
5528
|
+
`[getEnrichedConditionalUsages] "${path}" sourceEquivalencies["${returnValueKey}"] has ${sources.length} sources: [${sources.map((s: { schemaPath: string }) => s.schemaPath).join(', ')}]`,
|
|
5529
|
+
);
|
|
5530
|
+
const externalSource = sources.find(
|
|
5531
|
+
(s: { schemaPath: string }) =>
|
|
5532
|
+
s.schemaPath.includes('.functionCallReturnValue') &&
|
|
5533
|
+
!s.schemaPath.startsWith('useState('),
|
|
5534
|
+
);
|
|
5535
|
+
if (externalSource) {
|
|
5536
|
+
console.log(
|
|
5537
|
+
`[getEnrichedConditionalUsages] "${path}" sourceEquivalencies fallback found external source: "${externalSource.schemaPath}"`,
|
|
5538
|
+
);
|
|
5539
|
+
sourceDataPath = externalSource.schemaPath;
|
|
5540
|
+
} else {
|
|
5541
|
+
console.log(
|
|
5542
|
+
`[getEnrichedConditionalUsages] "${path}" sourceEquivalencies fallback found no external function call source`,
|
|
5543
|
+
);
|
|
5544
|
+
}
|
|
5545
|
+
} else {
|
|
5546
|
+
console.log(
|
|
5547
|
+
`[getEnrichedConditionalUsages] "${path}" sourceEquivalencies["${returnValueKey}"] not found`,
|
|
5548
|
+
);
|
|
5549
|
+
}
|
|
5550
|
+
}
|
|
5551
|
+
|
|
5552
|
+
console.log(
|
|
5553
|
+
`[getEnrichedConditionalUsages] "${path}" FINAL sourceDataPath="${sourceDataPath ?? '(none)'}" (${usages.length} usages)`,
|
|
5554
|
+
);
|
|
5555
|
+
|
|
5134
5556
|
enriched[path] = usages.map((usage) => ({
|
|
5135
5557
|
...usage,
|
|
5136
5558
|
sourceDataPath,
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coerces primitive values to empty arrays when the schema expects an array.
|
|
3
|
+
*
|
|
4
|
+
* The LLM sometimes generates a primitive (boolean, number, string) where the
|
|
5
|
+
* schema expects an array. For example:
|
|
6
|
+
* Schema: { webapps: [{ name: "string" }] }
|
|
7
|
+
* LLM output: { webapps: true }
|
|
8
|
+
*
|
|
9
|
+
* This causes runtime errors like `TypeError: config.webapps?.forEach is not a function`
|
|
10
|
+
* because the code expects an array but gets a boolean.
|
|
11
|
+
*
|
|
12
|
+
* Coercion rule:
|
|
13
|
+
* - primitive → array: replace with []
|
|
14
|
+
*
|
|
15
|
+
* Null and undefined values are preserved (they may be intentionally nullable).
|
|
16
|
+
*
|
|
17
|
+
* @param data The mock data object to coerce (mutated in place)
|
|
18
|
+
* @param schema The schema describing expected types
|
|
19
|
+
*/
|
|
20
|
+
export default function coercePrimitivesToArraysBySchema<T>(
|
|
21
|
+
data: T,
|
|
22
|
+
schema: unknown,
|
|
23
|
+
): T {
|
|
24
|
+
if (data === null || data === undefined) {
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (typeof data !== 'object') {
|
|
29
|
+
return data;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (Array.isArray(data)) {
|
|
33
|
+
const itemSchema = Array.isArray(schema) ? schema[0] : undefined;
|
|
34
|
+
for (let i = 0; i < data.length; i++) {
|
|
35
|
+
data[i] = coercePrimitivesToArraysBySchema(data[i], itemSchema);
|
|
36
|
+
}
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const dataObj = data as Record<string, unknown>;
|
|
41
|
+
const schemaObj = schema as Record<string, unknown> | undefined;
|
|
42
|
+
|
|
43
|
+
for (const key of Object.keys(dataObj)) {
|
|
44
|
+
const value = dataObj[key];
|
|
45
|
+
const fieldSchema = schemaObj?.[key];
|
|
46
|
+
|
|
47
|
+
if (value === null || value === undefined) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (typeof value !== 'object' && Array.isArray(fieldSchema)) {
|
|
52
|
+
// Schema expects an array but the value is a primitive.
|
|
53
|
+
// Replace with an empty array.
|
|
54
|
+
dataObj[key] = [];
|
|
55
|
+
} else if (typeof value === 'object' && value !== null) {
|
|
56
|
+
// Both value and schema are objects — recurse
|
|
57
|
+
coercePrimitivesToArraysBySchema(value, fieldSchema);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return data;
|
|
62
|
+
}
|