@codeyam/codeyam-cli 0.1.0-staging.b8a55ba → 0.1.0-staging.d0ad4ae
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/common/execAsync.ts +1 -1
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +7 -4
- package/analyzer-template/packages/ai/package.json +1 -1
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +14 -1
- package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +29 -10
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +120 -19
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +2 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +91 -35
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +110 -74
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +11 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.ts +98 -0
- package/analyzer-template/packages/ai/src/lib/deepEqual.ts +30 -0
- package/analyzer-template/packages/ai/src/lib/findMatchingAttribute.ts +24 -17
- package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +214 -39
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +54 -1
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +72 -6
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +12 -5
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +39 -23
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +32 -0
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +14 -0
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/isAsyncFunction.ts +67 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +73 -69
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +6 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +3 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +22 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +9 -5
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +49 -11
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.ts +102 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +399 -52
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.ts +128 -2
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +114 -70
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +34 -129
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +155 -79
- package/analyzer-template/packages/aws/codebuild/index.ts +1 -0
- package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts +11 -1
- package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts.map +1 -1
- package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js +29 -18
- package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js.map +1 -1
- package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts +2 -2
- package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts.map +1 -1
- package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js +2 -2
- package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js.map +1 -1
- package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts +8 -18
- package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts.map +1 -1
- package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js +17 -61
- package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js.map +1 -1
- package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.d.ts.map +1 -1
- package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js +8 -1
- package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js.map +1 -1
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/aws/src/lib/codebuild/waitForBuild.ts +43 -19
- package/analyzer-template/packages/aws/src/lib/ecs/ecsDefineContainer.ts +3 -3
- package/analyzer-template/packages/aws/src/lib/ecs/ecsTaskFactory.ts +17 -69
- package/analyzer-template/packages/aws/src/lib/s3/uploadFileToS3.ts +8 -1
- package/analyzer-template/packages/generate/index.ts +3 -0
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +17 -1
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +193 -0
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.ts +73 -0
- package/analyzer-template/packages/generate/src/lib/scenarioComponentForServer.ts +114 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/index.d.ts +3 -0
- package/analyzer-template/packages/github/dist/generate/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/index.js +3 -0
- package/analyzer-template/packages/github/dist/generate/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts +9 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +189 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts +20 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts +8 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js +89 -0
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js.map +1 -0
- package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js +10 -0
- package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js.map +1 -1
- package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js +3 -0
- package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +6 -0
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/github/src/lib/loadOrCreateCommit.ts +14 -0
- package/analyzer-template/packages/github/src/lib/syncPrimaryBranch.ts +2 -0
- package/analyzer-template/packages/process/index.ts +2 -0
- package/analyzer-template/packages/process/package.json +12 -0
- package/analyzer-template/packages/process/tsconfig.json +8 -0
- package/analyzer-template/packages/types/src/types/Entity.ts +2 -0
- package/analyzer-template/packages/types/src/types/Scenario.ts +6 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +6 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/playwright/capture.ts +37 -18
- package/analyzer-template/playwright/waitForServer.ts +21 -6
- package/analyzer-template/project/constructMockCode.ts +781 -140
- package/analyzer-template/project/orchestrateCapture/KyselyAnalysisLoader.ts +3 -6
- package/analyzer-template/project/orchestrateCapture.ts +10 -3
- package/analyzer-template/project/reconcileMockDataKeys.ts +28 -100
- package/analyzer-template/project/runAnalysis.ts +5 -0
- package/analyzer-template/project/serverOnlyModules.ts +127 -2
- package/analyzer-template/project/start.ts +5 -3
- package/analyzer-template/project/startScenarioCapture.ts +6 -0
- package/analyzer-template/project/writeMockDataTsx.ts +50 -22
- package/analyzer-template/project/writeScenarioClientWrapper.ts +21 -0
- package/analyzer-template/project/writeScenarioComponents.ts +162 -100
- package/analyzer-template/project/writeScenarioFiles.ts +26 -0
- package/analyzer-template/project/writeSimpleRoot.ts +11 -35
- package/analyzer-template/scripts/comboWorkerLoop.cjs +1 -0
- package/analyzer-template/scripts/defaultCmd.sh +9 -0
- package/background/src/lib/local/createLocalAnalyzer.js +1 -29
- package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
- package/background/src/lib/local/execAsync.js +1 -1
- package/background/src/lib/local/execAsync.js.map +1 -1
- package/background/src/lib/virtualized/common/execAsync.js +1 -1
- package/background/src/lib/virtualized/common/execAsync.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +718 -127
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js +3 -2
- package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +7 -4
- package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +25 -61
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runAnalysis.js +4 -0
- package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
- package/background/src/lib/virtualized/project/serverOnlyModules.js +106 -3
- package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +5 -3
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/startScenarioCapture.js +7 -0
- package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +52 -23
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js +15 -0
- package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js.map +1 -0
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +136 -83
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioFiles.js +19 -0
- package/background/src/lib/virtualized/project/writeScenarioFiles.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +11 -34
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/codeyam-cli/src/cli.js +5 -1
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +1 -1
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/baseline.js +177 -0
- package/codeyam-cli/src/commands/baseline.js.map +1 -0
- package/codeyam-cli/src/commands/status.js +23 -1
- package/codeyam-cli/src/commands/status.js.map +1 -1
- package/codeyam-cli/src/commands/test-startup.js +1 -1
- package/codeyam-cli/src/commands/test-startup.js.map +1 -1
- package/codeyam-cli/src/commands/wipe.js +108 -0
- package/codeyam-cli/src/commands/wipe.js.map +1 -0
- package/codeyam-cli/src/utils/database.js +91 -5
- package/codeyam-cli/src/utils/database.js.map +1 -1
- package/codeyam-cli/src/utils/git.js +79 -0
- package/codeyam-cli/src/utils/git.js.map +1 -0
- package/codeyam-cli/src/utils/queue/job.js +104 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
- package/codeyam-cli/src/utils/wipe.js +128 -0
- package/codeyam-cli/src/utils/wipe.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/database.js +66 -17
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-wXL1Z2Aq.js → EntityItem-Cmysw5OP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-CzGX-miz.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CXFKsCOD.js → EntityTypeIcon-CAneekK2.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D-9pXIaY.js → InteractivePreview-Cu16OUmx.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CBQPrpT0.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-D1CdlbrV.js → LoadingDots-B0GLXMsr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-wDPcZNKx.js → LogViewer-xgeCVgSM.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-4lcOlid-.js → ReportIssueModal-DcAUIpD_.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-BfmDgXxG.js → SafeScreenshot-DuDvi0jm.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-BMKg0SAF.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-6J7zDUD5.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-DSmTpjmK.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BF_aK4y6.js +32 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BYimnrHg.js → chevron-down-Cx24_aWc.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/chunk-EPOLDU6W-CXRTFQ3F.js +51 -0
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-CaVsIRxt.js → circle-check-BOARzkeR.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-CgUsG7ib.js → createLucideIcon-BdhJEx6B.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-DW_hdGUc.js → dev.empty-RJCf3Tvw.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-zUEpfPsu.js → entity._sha._-D0-YwkBh.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-EylcgScH.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D_3ero5o.js → entity._sha_.create-scenario-DMe7kvgo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CfLCUi9S.js → entity._sha_.edit._scenarioId-C1H_a_Y3.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-DKJyZfAY.js → entry.client-CS2cb_eZ.js} +6 -6
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DAtOlaWE.js → fileTableUtils-DMJ7zii9.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-ClR0d32A.js → files-BW7Cyeyi.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-D62Lxxmv.js → git-CZu4fif0.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/globals-wHVy_II5.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-CzNNiTkw.js → index-B1h680n5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-BosqDOlH.js → index-lzqtyFU8.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-CNp9QFCX.js → loader-circle-B7B9V-bu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{manifest-09d684be.js → manifest-2d191949.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-FHgpM6gc.js +56 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-DDGjYAMJ.js → search-CxXUmBSd.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-DgTyB-Wg.js → settings-6D8k8Jp5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-CDJZnWhN.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-CBc5dE1s.js → triangle-alert-B6LgvRJg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-BMIGFP-m.js → useCustomSizes-Dv18q8LD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useInteractiveMode-Dk_FQqWJ.js → useInteractiveMode-0ToGk4K3.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BqPPNjAl.js → useLastLogLine-aSv48UbS.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DsJbgMY9.js → useReportContext-1BX144Eg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-DWHcCcl1.js → useToast-mBRpZPiu.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{index-CV6i1S1A.js → index-pU0o5t1o.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-YzfkRwdn.js +178 -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-setup-skill.md +138 -3
- package/codeyam-cli/templates/debug-codeyam.md +7 -2
- package/package.json +5 -5
- package/packages/ai/src/lib/astScopes/processExpression.js +13 -1
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/checkAllAttributes.js +24 -9
- package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +94 -18
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +2 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +51 -23
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +70 -54
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +11 -0
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js +86 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js.map +1 -0
- package/packages/ai/src/lib/deepEqual.js +32 -0
- package/packages/ai/src/lib/deepEqual.js.map +1 -0
- package/packages/ai/src/lib/findMatchingAttribute.js +20 -16
- package/packages/ai/src/lib/findMatchingAttribute.js.map +1 -1
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +168 -41
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +42 -1
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js +59 -3
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityScenarios.js +6 -6
- package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +32 -23
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +20 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +15 -0
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/nodes/index.js +1 -0
- package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
- package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js +52 -0
- package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js.map +1 -0
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +59 -50
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +6 -0
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +2 -0
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeChange.js +14 -4
- package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeEntity.js +7 -6
- package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +44 -10
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js +85 -0
- package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +314 -52
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js +97 -2
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +88 -52
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +26 -98
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +141 -75
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/aws/src/lib/ecs/ecsDefineContainer.js +2 -2
- package/packages/aws/src/lib/ecs/ecsDefineContainer.js.map +1 -1
- package/packages/aws/src/lib/ecs/ecsTaskFactory.js +17 -61
- package/packages/aws/src/lib/ecs/ecsTaskFactory.js.map +1 -1
- package/packages/generate/index.js +3 -0
- package/packages/generate/index.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
- package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +189 -0
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
- package/packages/generate/src/lib/scenarioComponentForServer.js +89 -0
- package/packages/generate/src/lib/scenarioComponentForServer.js.map +1 -0
- package/packages/github/src/lib/loadOrCreateCommit.js +10 -0
- package/packages/github/src/lib/loadOrCreateCommit.js.map +1 -1
- package/packages/github/src/lib/syncPrimaryBranch.js +3 -0
- package/packages/github/src/lib/syncPrimaryBranch.js.map +1 -1
- package/packages/process/index.js +3 -0
- package/packages/process/index.js.map +1 -0
- package/packages/process/src/GlobalProcessManager.js.map +1 -0
- package/{background/src/lib/process → packages/process/src}/ProcessManager.js +1 -1
- package/packages/process/src/ProcessManager.js.map +1 -0
- package/packages/process/src/index.js.map +1 -0
- package/packages/process/src/managedExecAsync.js.map +1 -0
- package/analyzer-template/process/INTEGRATION_COMPLETE.md +0 -333
- package/analyzer-template/process/INTEGRATION_EXAMPLE.md +0 -525
- package/analyzer-template/process/README.md +0 -507
- package/background/src/lib/process/GlobalProcessManager.js.map +0 -1
- package/background/src/lib/process/ProcessManager.js.map +0 -1
- package/background/src/lib/process/index.js.map +0 -1
- package/background/src/lib/process/managedExecAsync.js.map +0 -1
- package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +0 -238
- package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +0 -1
- package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js +0 -7
- package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js.map +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-CUxUNEEC.js +0 -15
- package/codeyam-cli/src/webserver/build/client/assets/_index-DHImXdXq.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-2mG6mjVb.js +0 -32
- package/codeyam-cli/src/webserver/build/client/assets/chunk-JMJ3UQ3L-BambyYE_.js +0 -51
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DyB90fWk.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-C6vQASxy.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-BxJUvKau.js +0 -56
- package/codeyam-cli/src/webserver/build/client/assets/simulations-CoNWGt0K.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BDlyhfrv.js +0 -175
- /package/analyzer-template/{process → packages/process/src}/GlobalProcessManager.ts +0 -0
- /package/analyzer-template/{process → packages/process/src}/ProcessManager.ts +0 -0
- /package/analyzer-template/{process → packages/process/src}/index.ts +0 -0
- /package/analyzer-template/{process → packages/process/src}/managedExecAsync.ts +0 -0
- /package/{background/src/lib/process → packages/process/src}/GlobalProcessManager.js +0 -0
- /package/{background/src/lib/process → packages/process/src}/index.js +0 -0
- /package/{background/src/lib/process → packages/process/src}/managedExecAsync.js +0 -0
|
@@ -14,7 +14,11 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
14
14
|
entity: Pick<Entity, 'name' | 'metadata'>,
|
|
15
15
|
mergedDataStructure: Omit<DataStructure, 'equivalentSignatureVariables'>,
|
|
16
16
|
dependentAnalyses: ReadonlyAnalysisMap,
|
|
17
|
+
debug = false,
|
|
17
18
|
) {
|
|
19
|
+
const log = (...args: any[]) => {
|
|
20
|
+
if (debug) console.log('[gatherRelevantDependentKeyAttributes]', ...args);
|
|
21
|
+
};
|
|
18
22
|
// console.info(
|
|
19
23
|
// 'CODEYAM DEBUG: gatherRelevantDependentKeyAttributes inputs',
|
|
20
24
|
// entity.name,
|
|
@@ -78,9 +82,11 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
78
82
|
if (!dependentKeyAtttributes || dependentKeyAtttributes.length === 0)
|
|
79
83
|
return;
|
|
80
84
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
85
|
+
log(`Processing dependent entity: ${entityName} from ${path}`);
|
|
86
|
+
log(` Key attributes count: ${dependentKeyAtttributes.length}`);
|
|
87
|
+
log(
|
|
88
|
+
` Key attribute paths: ${dependentKeyAtttributes.map((ka: any) => ka.internalPath).join(', ')}`,
|
|
89
|
+
);
|
|
84
90
|
|
|
85
91
|
// Get sourceEquivalencies from the dependent analysis's mergedDataStructure,
|
|
86
92
|
// not from dependencySchemas (which doesn't store them)
|
|
@@ -88,43 +94,14 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
88
94
|
dependentAnalysis?.metadata?.mergedDataStructure?.sourceEquivalencies ??
|
|
89
95
|
{};
|
|
90
96
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
// usageEquivalencies might have: entity -> [{schemaPath: 'signature[0]', scopeNodeName: entityName}]
|
|
95
|
-
const usageEquivalencies = mergedDataStructure?.usageEquivalencies ?? {};
|
|
96
|
-
const signatureToParentPath: Record<string, string> = {};
|
|
97
|
-
|
|
98
|
-
for (const parentPath in usageEquivalencies) {
|
|
99
|
-
const usages = usageEquivalencies[parentPath];
|
|
100
|
-
for (const usage of usages) {
|
|
101
|
-
if (usage.scopeNodeName !== entityName) continue;
|
|
97
|
+
log(
|
|
98
|
+
` sourceEquivalencies keys: ${Object.keys(sourceEquivalencies).join(', ')}`,
|
|
99
|
+
);
|
|
102
100
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
let signaturePath: string;
|
|
108
|
-
const signatureIndex = usage.schemaPath.indexOf('.signature[');
|
|
109
|
-
if (signatureIndex !== -1) {
|
|
110
|
-
// Full format: extract "signature[N]" or "signature[N].property" after the dot
|
|
111
|
-
signaturePath = usage.schemaPath.slice(signatureIndex + 1);
|
|
112
|
-
} else if (usage.schemaPath.startsWith('signature[')) {
|
|
113
|
-
// Simplified format: already starts with signature[
|
|
114
|
-
signaturePath = usage.schemaPath;
|
|
115
|
-
} else {
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Map child's signature path to parent's path
|
|
120
|
-
// e.g., 'signature[0]' -> 'entity'
|
|
121
|
-
signatureToParentPath[signaturePath] = parentPath;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// If sourceEquivalencies is empty but the child has mocked imports,
|
|
126
|
-
// only propagate key attributes that come from mocked data sources
|
|
127
|
-
// (not props that the parent passes to the child)
|
|
101
|
+
// FIRST: Check for mocked imports and process those key attributes.
|
|
102
|
+
// Mocked-source key attributes are ALWAYS controllable (we control the mock data)
|
|
103
|
+
// regardless of whether the parent passes data to the child via props.
|
|
104
|
+
// This must happen BEFORE the signatureSchema check.
|
|
128
105
|
if (Object.keys(sourceEquivalencies).length === 0) {
|
|
129
106
|
// Collect names of mocked imports
|
|
130
107
|
const importedExports =
|
|
@@ -179,17 +156,75 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
179
156
|
(externalPath.match(/\./g) || []).length >= 2;
|
|
180
157
|
|
|
181
158
|
if (comesFromMockedSource || comesFromArgument) {
|
|
159
|
+
// Compute internalPath if not already present
|
|
160
|
+
// For signature paths, strip the signature[N]. prefix
|
|
161
|
+
let internalPath = dependentKeyAttribute.internalPath;
|
|
162
|
+
if (!internalPath && externalPath.startsWith('signature[')) {
|
|
163
|
+
internalPath = externalPath.replace(/^signature\[\d+\]\./, '');
|
|
164
|
+
}
|
|
165
|
+
// If still no internalPath, use dataStructurePath or externalPath as fallback
|
|
166
|
+
if (!internalPath) {
|
|
167
|
+
internalPath = dataStructurePath || externalPath;
|
|
168
|
+
}
|
|
169
|
+
|
|
182
170
|
relevantDependentKeyAttributes.push({
|
|
183
171
|
...dependentKeyAttribute,
|
|
184
172
|
dependentEntityName: entityName,
|
|
185
173
|
originalEntityName: entityName,
|
|
186
174
|
filePath: path,
|
|
175
|
+
internalPath,
|
|
176
|
+
dataStructurePath: internalPath,
|
|
187
177
|
} as any);
|
|
188
178
|
}
|
|
189
179
|
}
|
|
190
180
|
return;
|
|
191
181
|
}
|
|
182
|
+
}
|
|
192
183
|
|
|
184
|
+
// SECOND: For signature-based key attributes, require that the parent has
|
|
185
|
+
// the child in its dependencySchemas. This ensures we only include key attributes
|
|
186
|
+
// that are controllable via props the parent passes to the child.
|
|
187
|
+
const dependencySchema = dependencySchemas?.[path]?.[entityName];
|
|
188
|
+
const signatureSchema = dependencySchema?.signatureSchema;
|
|
189
|
+
if (!signatureSchema) return;
|
|
190
|
+
|
|
191
|
+
// Build a fallback mapping from parent's usageEquivalencies
|
|
192
|
+
// This helps when the child's sourceEquivalencies don't have a mapping
|
|
193
|
+
// For example, if parent passes `entity` to child's `signature[0]`,
|
|
194
|
+
// usageEquivalencies might have: entity -> [{schemaPath: 'signature[0]', scopeNodeName: entityName}]
|
|
195
|
+
const usageEquivalencies = mergedDataStructure?.usageEquivalencies ?? {};
|
|
196
|
+
const signatureToParentPath: Record<string, string> = {};
|
|
197
|
+
|
|
198
|
+
for (const parentPath in usageEquivalencies) {
|
|
199
|
+
const usages = usageEquivalencies[parentPath];
|
|
200
|
+
for (const usage of usages) {
|
|
201
|
+
if (usage.scopeNodeName !== entityName) continue;
|
|
202
|
+
|
|
203
|
+
// Extract signature path from schemaPath
|
|
204
|
+
// Format can be:
|
|
205
|
+
// 1. "functionName(args).signature[N]" or "functionName(args).signature[N].property" (real data)
|
|
206
|
+
// 2. "signature[N]" or "signature[N].property" (simplified/test format)
|
|
207
|
+
let signaturePath: string;
|
|
208
|
+
const signatureIndex = usage.schemaPath.indexOf('.signature[');
|
|
209
|
+
if (signatureIndex !== -1) {
|
|
210
|
+
// Full format: extract "signature[N]" or "signature[N].property" after the dot
|
|
211
|
+
signaturePath = usage.schemaPath.slice(signatureIndex + 1);
|
|
212
|
+
} else if (usage.schemaPath.startsWith('signature[')) {
|
|
213
|
+
// Simplified format: already starts with signature[
|
|
214
|
+
signaturePath = usage.schemaPath;
|
|
215
|
+
} else {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Map child's signature path to parent's path
|
|
220
|
+
// e.g., 'signature[0]' -> 'entity'
|
|
221
|
+
signatureToParentPath[signaturePath] = parentPath;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Handle sourceEquivalencies empty case with no mocked imports
|
|
226
|
+
// Try usageEquivalencies fallback for direct argument usage
|
|
227
|
+
if (Object.keys(sourceEquivalencies).length === 0) {
|
|
193
228
|
// No mocked imports, try usageEquivalencies fallback for direct argument usage
|
|
194
229
|
if (Object.keys(signatureToParentPath).length > 0) {
|
|
195
230
|
for (const dependentKeyAttribute of dependentKeyAtttributes) {
|
|
@@ -263,6 +298,14 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
263
298
|
const dependentKeyAttributeExternalPathParts =
|
|
264
299
|
splitOutsideParenthesesAndArrays(dependentKeyAttribute.externalPath);
|
|
265
300
|
|
|
301
|
+
log(
|
|
302
|
+
` Processing key attribute: ${dependentKeyAttribute.internalPath}`,
|
|
303
|
+
);
|
|
304
|
+
log(` externalPath: ${dependentKeyAttribute.externalPath}`);
|
|
305
|
+
log(
|
|
306
|
+
` externalPathParts: ${JSON.stringify(dependentKeyAttributeExternalPathParts)}`,
|
|
307
|
+
);
|
|
308
|
+
|
|
266
309
|
let matchFound = false;
|
|
267
310
|
|
|
268
311
|
// First, try to match using child's sourceEquivalencies
|
|
@@ -281,12 +324,115 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
281
324
|
sourceEquivalencyPath,
|
|
282
325
|
);
|
|
283
326
|
|
|
327
|
+
// Check if this sourceEquivalency is for a callback (first part starts with '(')
|
|
328
|
+
// Callback sourceEquivalencies have format: "(param) => ...).signature[0]"
|
|
329
|
+
// These map callback parameters, NOT direct component props.
|
|
330
|
+
// We should NOT match direct prop paths like "signature[0].queueJobs[]"
|
|
331
|
+
// against callback parameter paths.
|
|
332
|
+
const isCallbackSourceEquivalency =
|
|
333
|
+
sourceEquivalencyPathParts[0]?.startsWith('(');
|
|
334
|
+
|
|
284
335
|
const relevantSourceEquivalencyPath = joinParenthesesAndArrays(
|
|
285
336
|
sourceEquivalencyPathParts.slice(1),
|
|
286
337
|
);
|
|
287
338
|
|
|
288
339
|
if (relevantSourceEquivalencyPath !== subExternalPath) continue;
|
|
289
340
|
|
|
341
|
+
// If this is a callback sourceEquivalency and we're matching against
|
|
342
|
+
// a simple signature path, skip it. The callback's "signature[0]" refers
|
|
343
|
+
// to the callback's parameter, not the component's props.
|
|
344
|
+
// We should only use callback sourceEquivalencies when the key attribute
|
|
345
|
+
// is actually about data that flows through that callback.
|
|
346
|
+
if (
|
|
347
|
+
isCallbackSourceEquivalency &&
|
|
348
|
+
subExternalPath.startsWith('signature[')
|
|
349
|
+
) {
|
|
350
|
+
// The callback's signature[0] maps to specific paths in the parent
|
|
351
|
+
// (e.g., currentlyExecuting.entities[]). Only match if the remaining
|
|
352
|
+
// path of the key attribute is a valid continuation of data that
|
|
353
|
+
// flows through the callback.
|
|
354
|
+
//
|
|
355
|
+
// For example, if callback maps to currentlyExecuting.entities[],
|
|
356
|
+
// then key attribute signature[0].entityType would be valid (entity.entityType)
|
|
357
|
+
// but signature[0].queueJobs[] would NOT be valid (queueJobs is not entity)
|
|
358
|
+
const mappedPaths = sourceEquivalencies[sourceEquivalencyPath];
|
|
359
|
+
const remainingPath =
|
|
360
|
+
i < dependentKeyAttributeExternalPathParts.length
|
|
361
|
+
? dependentKeyAttributeExternalPathParts.slice(i)
|
|
362
|
+
: [];
|
|
363
|
+
|
|
364
|
+
// If there's remaining path after the match, check if it makes sense
|
|
365
|
+
// for the callback's data flow. The mapped paths tell us where the
|
|
366
|
+
// callback parameter comes FROM - we should only include key attributes
|
|
367
|
+
// that are about properties OF that parameter, not unrelated props.
|
|
368
|
+
if (remainingPath.length > 0) {
|
|
369
|
+
// The remaining path should be a property of the callback's parameter.
|
|
370
|
+
// The mapped paths show where the parameter COMES FROM, ending with
|
|
371
|
+
// the array element (e.g., entities[]). Valid remaining paths would be
|
|
372
|
+
// properties of that element.
|
|
373
|
+
//
|
|
374
|
+
// For example:
|
|
375
|
+
// - Mapped paths: currentlyExecuting.entities[], queueJobs[].entities[]
|
|
376
|
+
// - These all end with entities[], so callback receives entity objects
|
|
377
|
+
// - Valid remaining: entityType, sha (properties of entity)
|
|
378
|
+
// - Invalid remaining: queueJobs[] (sibling prop, not entity property)
|
|
379
|
+
//
|
|
380
|
+
// Key insight: if the remaining path appears as a CONTAINER in any
|
|
381
|
+
// mapped path (before the final []), it's a sibling prop, not a
|
|
382
|
+
// property of the callback parameter.
|
|
383
|
+
const firstRemainingPart = remainingPath[0];
|
|
384
|
+
const firstRemainingWithoutBrackets =
|
|
385
|
+
firstRemainingPart.replace(/\[\]$/, '');
|
|
386
|
+
|
|
387
|
+
// Check if this remaining path appears as a container in mapped paths
|
|
388
|
+
// e.g., "queueJobs" appears in "signature[0].queueJobs[].entities[]"
|
|
389
|
+
// This means queueJobs is a container that HOLDS entities, not a
|
|
390
|
+
// property OF an entity
|
|
391
|
+
const isContainerInMappedPaths = mappedPaths.some((mp) => {
|
|
392
|
+
const mpPath = mp.schemaPath || '';
|
|
393
|
+
// Check if the path contains this as a container segment
|
|
394
|
+
// e.g., ".queueJobs[]." or ".queueJobs." in the middle of the path
|
|
395
|
+
return (
|
|
396
|
+
mpPath.includes(`.${firstRemainingWithoutBrackets}[].`) ||
|
|
397
|
+
mpPath.includes(`.${firstRemainingWithoutBrackets}.`)
|
|
398
|
+
);
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
if (isContainerInMappedPaths) {
|
|
402
|
+
log(
|
|
403
|
+
` SKIP callback match: ${subExternalPath} -> ${sourceEquivalencyPath} (${firstRemainingPart} is a container in mapped paths, not a property of callback param)`,
|
|
404
|
+
);
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Also check: if the remaining path doesn't appear ANYWHERE in the
|
|
409
|
+
// mapped paths, it's likely a sibling prop that has nothing to do
|
|
410
|
+
// with the callback. For example, if mapped paths are all like
|
|
411
|
+
// "currentlyExecuting.entities[]" and the remaining is "currentRun",
|
|
412
|
+
// currentRun doesn't appear in any mapped path, so it's a sibling.
|
|
413
|
+
const remainingAppearsInMappedPaths = mappedPaths.some((mp) => {
|
|
414
|
+
const mpPath = mp.schemaPath || '';
|
|
415
|
+
// Check if remaining path or its base appears anywhere in mapped path
|
|
416
|
+
return (
|
|
417
|
+
mpPath.includes(`.${firstRemainingWithoutBrackets}`) ||
|
|
418
|
+
mpPath.includes(`${firstRemainingWithoutBrackets}.`) ||
|
|
419
|
+
mpPath.includes(`${firstRemainingWithoutBrackets}[`)
|
|
420
|
+
);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
if (!remainingAppearsInMappedPaths) {
|
|
424
|
+
log(
|
|
425
|
+
` SKIP callback match: ${subExternalPath} -> ${sourceEquivalencyPath} (${firstRemainingPart} not found in any mapped path, likely a sibling prop)`,
|
|
426
|
+
);
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
log(
|
|
433
|
+
` MATCH via sourceEquivalencies: ${subExternalPath} -> ${sourceEquivalencyPath}`,
|
|
434
|
+
);
|
|
435
|
+
|
|
290
436
|
const sourcePath =
|
|
291
437
|
sourceEquivalencies[sourceEquivalencyPath][0]?.schemaPath;
|
|
292
438
|
|
|
@@ -311,6 +457,16 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
311
457
|
}
|
|
312
458
|
}
|
|
313
459
|
|
|
460
|
+
// Fallback: compute internalPath if not found in associationMap
|
|
461
|
+
// For signature paths, strip the signature[N]. prefix
|
|
462
|
+
if (!internalPath && externalPath.startsWith('signature[')) {
|
|
463
|
+
internalPath = externalPath.replace(/^signature\[\d+\]\./, '');
|
|
464
|
+
}
|
|
465
|
+
// If still no internalPath, use externalPath as fallback
|
|
466
|
+
if (!internalPath) {
|
|
467
|
+
internalPath = externalPath;
|
|
468
|
+
}
|
|
469
|
+
|
|
314
470
|
const dependentEntityName =
|
|
315
471
|
dependentKeyAttribute.dependentEntityName
|
|
316
472
|
? `${dependentKeyAttribute.dependentEntityName} (through ${entityName})`
|
|
@@ -327,6 +483,9 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
327
483
|
dataStructurePath: internalPath,
|
|
328
484
|
} as any);
|
|
329
485
|
|
|
486
|
+
log(
|
|
487
|
+
` INCLUDED via sourceEquivalencies: ${dependentKeyAttribute.internalPath} -> ${internalPath}`,
|
|
488
|
+
);
|
|
330
489
|
matchFound = true;
|
|
331
490
|
break;
|
|
332
491
|
}
|
|
@@ -396,14 +555,30 @@ export default function gatherRelevantDependentKeyAttributes(
|
|
|
396
555
|
dataStructurePath: internalPath,
|
|
397
556
|
} as any);
|
|
398
557
|
|
|
558
|
+
log(
|
|
559
|
+
` INCLUDED via usageEquivalencies: ${dependentKeyAttribute.internalPath} -> ${internalPath}`,
|
|
560
|
+
);
|
|
399
561
|
matchFound = true;
|
|
400
562
|
break;
|
|
401
563
|
}
|
|
402
564
|
}
|
|
403
565
|
}
|
|
566
|
+
|
|
567
|
+
if (!matchFound) {
|
|
568
|
+
log(
|
|
569
|
+
` NOT INCLUDED: ${dependentKeyAttribute.internalPath} - no match found`,
|
|
570
|
+
);
|
|
571
|
+
}
|
|
404
572
|
}
|
|
405
573
|
});
|
|
406
574
|
});
|
|
407
575
|
|
|
576
|
+
log(
|
|
577
|
+
`Result: ${relevantDependentKeyAttributes.length} key attributes gathered`,
|
|
578
|
+
);
|
|
579
|
+
log(
|
|
580
|
+
` Paths: ${relevantDependentKeyAttributes.map((ka: any) => ka.internalPath).join(', ')}`,
|
|
581
|
+
);
|
|
582
|
+
|
|
408
583
|
return relevantDependentKeyAttributes;
|
|
409
584
|
}
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
CompoundConditional,
|
|
6
6
|
ConditionalUsage,
|
|
7
7
|
Entity,
|
|
8
|
+
SourceLocation,
|
|
8
9
|
} from '~codeyam/types';
|
|
9
10
|
import generateEntityKeyAttributesGenerator from './promptGenerators/generateEntityKeyAttributesGenerator';
|
|
10
11
|
import { awsLog } from '~codeyam/utils';
|
|
@@ -161,8 +162,60 @@ export default async function generateChangesEntityKeyAttributes({
|
|
|
161
162
|
)
|
|
162
163
|
.filter((keyAttribute) => attributesMap[keyAttribute.internalPath]);
|
|
163
164
|
|
|
165
|
+
// Helper to extract source locations from conditional usages for a given path
|
|
166
|
+
const getSourceLocationsForPath = (path: string): SourceLocation[] => {
|
|
167
|
+
const usages = conditionalUsages[path] || [];
|
|
168
|
+
const locations: SourceLocation[] = [];
|
|
169
|
+
|
|
170
|
+
for (const usage of usages.slice(0, 5)) {
|
|
171
|
+
// Limit to 5 locations
|
|
172
|
+
if (usage.sourceLocation) {
|
|
173
|
+
locations.push({
|
|
174
|
+
entityName: entity.name,
|
|
175
|
+
filePath: entity.filePath,
|
|
176
|
+
lineNumber: usage.sourceLocation.lineNumber,
|
|
177
|
+
column: usage.sourceLocation.column,
|
|
178
|
+
codeSnippet: usage.sourceLocation.codeSnippet,
|
|
179
|
+
usageType: 'conditional',
|
|
180
|
+
description: `Used in ${usage.location} statement (${usage.conditionType} check)`,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return locations;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// Update sourceLocations for all key attributes based on current conditionalUsages
|
|
189
|
+
// This ensures new usages are picked up even for existing key attributes
|
|
190
|
+
const keyAttributesWithUpdatedSourceLocations = sortedUniqueKeyAttributes.map(
|
|
191
|
+
(keyAttribute) => {
|
|
192
|
+
// Skip sourceLocations update for dependent key attributes
|
|
193
|
+
// They should keep their original sourceLocations from the dependent entity's analysis
|
|
194
|
+
// Otherwise they'd get overwritten with the parent entity's conditional usages,
|
|
195
|
+
// causing them to incorrectly show up in "Key Attributes with New Usages"
|
|
196
|
+
if ((keyAttribute as any).dependentEntityName) {
|
|
197
|
+
return keyAttribute;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const sourceLocations = getSourceLocationsForPath(
|
|
201
|
+
keyAttribute.internalPath,
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// If we found source locations from conditional usages, use them
|
|
205
|
+
// Otherwise keep the existing sourceLocations (e.g., from dependent entities)
|
|
206
|
+
if (sourceLocations.length > 0) {
|
|
207
|
+
return {
|
|
208
|
+
...keyAttribute,
|
|
209
|
+
sourceLocations,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return keyAttribute;
|
|
214
|
+
},
|
|
215
|
+
);
|
|
216
|
+
|
|
164
217
|
return {
|
|
165
|
-
keyAttributes:
|
|
218
|
+
keyAttributes: keyAttributesWithUpdatedSourceLocations,
|
|
166
219
|
llmCall,
|
|
167
220
|
};
|
|
168
221
|
}
|
|
@@ -16,6 +16,8 @@ import type {
|
|
|
16
16
|
import { LlmCall } from '~codeyam/types';
|
|
17
17
|
import validateJson from './validateJson';
|
|
18
18
|
import checkAllAttributes from './checkAllAttributes';
|
|
19
|
+
import convertNullToUndefinedBySchema from './dataStructure/helpers/convertNullToUndefinedBySchema';
|
|
20
|
+
import deepEqual from './deepEqual';
|
|
19
21
|
import { awsLog } from '~codeyam/utils';
|
|
20
22
|
import { AI, parseJsonSafe } from '~codeyam/ai';
|
|
21
23
|
|
|
@@ -59,9 +61,11 @@ async function generateChangesDataForScenario({
|
|
|
59
61
|
llmCalls: LlmCall[];
|
|
60
62
|
}> {
|
|
61
63
|
if (
|
|
62
|
-
structure
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
deepEqual(structure, existingStructure) &&
|
|
65
|
+
deepEqual(
|
|
66
|
+
scenario.metadata.keyAttributeInstructions,
|
|
67
|
+
existingScenario.metadata.keyAttributeInstructions,
|
|
68
|
+
)
|
|
65
69
|
) {
|
|
66
70
|
console.log(
|
|
67
71
|
"CodeYam: No changes in scenario's structure or keyAttributeInstructions - returning existing scenario data",
|
|
@@ -219,8 +223,8 @@ async function generateChangesDataForScenario({
|
|
|
219
223
|
if (!Array.isArray(argumentsData)) {
|
|
220
224
|
argumentsData = [];
|
|
221
225
|
}
|
|
222
|
-
fullScenarioData.data.argumentsData = argumentsData.map(
|
|
223
|
-
checkAllAttributes(arg),
|
|
226
|
+
fullScenarioData.data.argumentsData = argumentsData.map(
|
|
227
|
+
(arg) => checkAllAttributes(arg) as { [key: string]: unknown },
|
|
224
228
|
);
|
|
225
229
|
|
|
226
230
|
if (structure.dataForMocks && !fullScenarioData.data.mockData) {
|
|
@@ -232,7 +236,28 @@ async function generateChangesDataForScenario({
|
|
|
232
236
|
}
|
|
233
237
|
fullScenarioData.data.mockData = checkAllAttributes(
|
|
234
238
|
fullScenarioData.data.mockData,
|
|
235
|
-
);
|
|
239
|
+
) as { [key: string]: unknown };
|
|
240
|
+
|
|
241
|
+
// Convert null values to undefined based on schema type constraints.
|
|
242
|
+
// LLM uses null for "no value" (JSON doesn't support undefined), but TypeScript
|
|
243
|
+
// types like "string | undefined" don't accept null. This converts null→undefined
|
|
244
|
+
// for fields typed as "T | undefined" (but preserves null for "T | null").
|
|
245
|
+
if (structure.dataForMocks && fullScenarioData.data.mockData) {
|
|
246
|
+
convertNullToUndefinedBySchema(
|
|
247
|
+
fullScenarioData.data.mockData,
|
|
248
|
+
structure.dataForMocks,
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
if (structure.arguments && fullScenarioData.data.argumentsData) {
|
|
252
|
+
for (let i = 0; i < fullScenarioData.data.argumentsData.length; i++) {
|
|
253
|
+
if (structure.arguments[i]) {
|
|
254
|
+
convertNullToUndefinedBySchema(
|
|
255
|
+
fullScenarioData.data.argumentsData[i],
|
|
256
|
+
structure.arguments[i],
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
236
261
|
|
|
237
262
|
return {
|
|
238
263
|
llmCalls: [{ name: scenario.name, id: llmCall.id }],
|
|
@@ -346,6 +371,47 @@ NEVER include "error" fields in responses. Skip them entirely.
|
|
|
346
371
|
- If structure has \`{ data: {...}, error: {...} }\`, only fill \`data\`
|
|
347
372
|
- Leave out any attribute named "error"—do not set to null, omit entirely
|
|
348
373
|
|
|
374
|
+
## CRITICAL: Preserve Exact Structure
|
|
375
|
+
Your response MUST mirror the EXACT nested structure provided in mockData Structure.
|
|
376
|
+
- Do NOT reorganize, split, or create duplicate keys
|
|
377
|
+
- The hierarchy of nested objects must match exactly what was provided
|
|
378
|
+
- Only change the leaf VALUES (replacing type descriptions like "string" with actual data like "hello")
|
|
379
|
+
- Arrays should have 3-5 items to provide realistic test data variety
|
|
380
|
+
|
|
381
|
+
**Example** - if given this structure:
|
|
382
|
+
\`\`\`json
|
|
383
|
+
{
|
|
384
|
+
"createClient()": {
|
|
385
|
+
"from(\\"users\\")": {
|
|
386
|
+
"select(\\"*\\")": { "data": [{ "id": "string", "name": "string" }] },
|
|
387
|
+
"delete()": { "eq(\\"id\\", id)": {} }
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
\`\`\`
|
|
392
|
+
|
|
393
|
+
Return ONE \`from("users")\` key containing BOTH \`select("*")\` and \`delete()\`:
|
|
394
|
+
\`\`\`json
|
|
395
|
+
{
|
|
396
|
+
"createClient()": {
|
|
397
|
+
"from(\\"users\\")": {
|
|
398
|
+
"select(\\"*\\")": { "data": [{ "id": "user-1", "name": "Alice" }, { "id": "user-2", "name": "Bob" }] },
|
|
399
|
+
"delete()": { "eq(\\"id\\", \\"user-1\\")": {} }
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
\`\`\`
|
|
404
|
+
|
|
405
|
+
**WRONG** - do NOT create duplicate keys like this:
|
|
406
|
+
\`\`\`json
|
|
407
|
+
{
|
|
408
|
+
"createClient()": {
|
|
409
|
+
"from(\\"users\\")": { "select(\\"*\\")": { ... } },
|
|
410
|
+
"from(\\"users\\")": { "delete()": { ... } }
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
\`\`\`
|
|
414
|
+
|
|
349
415
|
## Special Markers
|
|
350
416
|
|
|
351
417
|
### Dynamic Dates (\`~~codeyam-code~~\`)
|
|
@@ -15,11 +15,17 @@ import { sanitizePlaywrightInstructions } from './validatePlaywrightInstructions
|
|
|
15
15
|
import gatherRelevantDependentKeyAttributes from './gatherRelevantDependentKeyAttributes';
|
|
16
16
|
import { AI, DEFAULT_LARGER_MODEL, parseJsonSafe } from '~codeyam/ai';
|
|
17
17
|
|
|
18
|
+
interface ModifiedKeyAttribute {
|
|
19
|
+
keyAttribute: Analysis['metadata']['keyAttributes'][0];
|
|
20
|
+
newSourceLocations: Analysis['metadata']['keyAttributes'][0]['sourceLocations'];
|
|
21
|
+
}
|
|
22
|
+
|
|
18
23
|
interface GenerateChangesEntityScenariosArgs {
|
|
19
24
|
entity: Entity;
|
|
20
25
|
keyAttributes: Analysis['metadata']['keyAttributes'];
|
|
21
26
|
addedKeyAttributes: Analysis['metadata']['keyAttributes'];
|
|
22
27
|
removedKeyAttributes: Analysis['metadata']['keyAttributes'];
|
|
28
|
+
modifiedKeyAttributes?: ModifiedKeyAttribute[];
|
|
23
29
|
dependentAnalyses?: ReadonlyAnalysisMap;
|
|
24
30
|
existingScenarios: Scenario[];
|
|
25
31
|
commitDiff: string;
|
|
@@ -36,6 +42,7 @@ export default async function generateChangesEntityScenarios({
|
|
|
36
42
|
keyAttributes,
|
|
37
43
|
addedKeyAttributes,
|
|
38
44
|
removedKeyAttributes,
|
|
45
|
+
modifiedKeyAttributes,
|
|
39
46
|
dependentAnalyses,
|
|
40
47
|
existingScenarios,
|
|
41
48
|
commitDiff,
|
|
@@ -76,6 +83,7 @@ export default async function generateChangesEntityScenarios({
|
|
|
76
83
|
keyAttributes,
|
|
77
84
|
addedKeyAttributes,
|
|
78
85
|
removedKeyAttributes,
|
|
86
|
+
modifiedKeyAttributes,
|
|
79
87
|
dependentAnalyses,
|
|
80
88
|
existingScenarios,
|
|
81
89
|
commitDiff,
|
|
@@ -234,6 +242,7 @@ export default async function generateChangesEntityScenarios({
|
|
|
234
242
|
keyAttributeInstructions: useScenarioData
|
|
235
243
|
? Object.keys(scenarioInfo.keyAttributeInstructions).reduce(
|
|
236
244
|
(acc: any, key) => {
|
|
245
|
+
// LLM is instructed to use localVariable (internalPath) as key
|
|
237
246
|
const attributesList = keyAttributes.map(
|
|
238
247
|
(attr) => attr.internalPath,
|
|
239
248
|
);
|
|
@@ -321,11 +330,10 @@ Your primary goal is to MAXIMIZE coverage of key attributes across all scenarios
|
|
|
321
330
|
- Must include all current key attributes with valid values from their validValueOptions
|
|
322
331
|
|
|
323
332
|
## keyAttributeInstructions Format
|
|
324
|
-
Use \`
|
|
333
|
+
Use \`localVariable\` as key. Include instruction AND a valueOptionRef that references which validValueOption you're using:
|
|
325
334
|
\`\`\`json
|
|
326
335
|
{
|
|
327
|
-
"
|
|
328
|
-
"localVariable": "status",
|
|
336
|
+
"status": {
|
|
329
337
|
"instruction": "Set to 'active' mode",
|
|
330
338
|
"valueOptionRef": { "index": 0, "refType": "exact" }
|
|
331
339
|
}
|
|
@@ -361,8 +369,7 @@ Otherwise:
|
|
|
361
369
|
"testName": "it(\\"shows empty message when no notifications\\")",
|
|
362
370
|
"description": "User has no notifications.",
|
|
363
371
|
"keyAttributeInstructions": {
|
|
364
|
-
"
|
|
365
|
-
"localVariable": "notifications[]",
|
|
372
|
+
"notifications[]": {
|
|
366
373
|
"instruction": "Empty array [] to show empty state",
|
|
367
374
|
"valueOptionRef": { "index": 1, "refType": "exact" }
|
|
368
375
|
}
|