@codeyam/codeyam-cli 0.1.0-staging.15d0f46 → 0.1.0-staging.1669d45
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 +9 -5
- package/analyzer-template/packages/ai/index.ts +5 -3
- package/analyzer-template/packages/ai/package.json +1 -1
- package/analyzer-template/packages/ai/src/lib/__mocks__/completionCall.ts +122 -0
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +152 -6
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +107 -1
- package/analyzer-template/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.ts +644 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +42 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.ts +18 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.ts +38 -1
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +301 -1
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +972 -106
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +232 -0
- package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +29 -10
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +18 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1409 -138
- 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 +771 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +233 -75
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +19 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +39 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +23 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.ts +98 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +42 -2
- package/analyzer-template/packages/ai/src/lib/deepEqual.ts +30 -0
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +74 -7
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +89 -112
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +6 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +486 -86
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +182 -104
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +201 -0
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +528 -0
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1019 -0
- package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +143 -31
- package/analyzer-template/packages/ai/src/lib/guessScenarioDataFromDescription.ts +8 -2
- package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +276 -3
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +33 -3
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +7 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +32 -102
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +71 -4
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +14 -53
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.ts +58 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.ts +28 -2
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +690 -0
- package/analyzer-template/packages/ai/src/lib/splitOutsideParentheses.ts +5 -1
- package/analyzer-template/packages/ai/src/lib/validateExecutionFlowPaths.ts +531 -0
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +102 -0
- package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +8 -1
- 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 +458 -267
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +18 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +3 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +31 -15
- package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +11 -7
- package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +11 -12
- package/analyzer-template/packages/analyze/src/lib/files/enums/steps.ts +1 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +196 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.ts +102 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +588 -52
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.ts +1 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.ts +28 -62
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +299 -133
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +156 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +78 -83
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +4 -8
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +384 -94
- 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/checkS3ObjectExists.d.ts +15 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts.map +1 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js +31 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js.map +1 -0
- 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 +2 -2
- package/analyzer-template/packages/aws/s3/index.ts +1 -0
- 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/checkS3ObjectExists.ts +47 -0
- package/analyzer-template/packages/aws/src/lib/s3/uploadFileToS3.ts +8 -1
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +4 -4
- package/analyzer-template/packages/database/src/lib/kysely/tableRelations.ts +2 -2
- package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +36 -9
- package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +7 -3
- 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/componentScenarioPage/getIFrameMessageListenerCode.ts +9 -4
- package/analyzer-template/packages/generate/src/lib/deepMerge.ts +26 -1
- package/analyzer-template/packages/generate/src/lib/scenarioComponentForServer.ts +114 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tableRelations.d.ts +2 -2
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts +1 -11
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +30 -7
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
- 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 +2 -6
- 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/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +7 -4
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.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/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js +27 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js.map +1 -1
- 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/index.d.ts +2 -2
- package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +63 -13
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.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 +11 -6
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +146 -0
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.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/index.ts +4 -0
- package/analyzer-template/packages/types/src/types/Analysis.ts +79 -13
- package/analyzer-template/packages/types/src/types/Entity.ts +2 -0
- package/analyzer-template/packages/types/src/types/Scenario.ts +11 -10
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +161 -0
- package/analyzer-template/packages/types/src/types/StatementInfo.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/index.d.ts +2 -2
- package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +63 -13
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
- 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 +11 -6
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +146 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts.map +1 -1
- package/analyzer-template/playwright/capture.ts +37 -18
- package/analyzer-template/playwright/getCodeYamInfo.ts +12 -7
- package/analyzer-template/playwright/takeElementScreenshot.ts +26 -11
- package/analyzer-template/playwright/waitForServer.ts +21 -6
- package/analyzer-template/project/analyzeBaselineCommit.ts +4 -0
- package/analyzer-template/project/analyzeBranchCommit.ts +4 -0
- package/analyzer-template/project/analyzeFileEntities.ts +4 -0
- package/analyzer-template/project/analyzeRegularCommit.ts +4 -0
- package/analyzer-template/project/constructMockCode.ts +868 -132
- package/analyzer-template/project/controller/startController.ts +16 -1
- package/analyzer-template/project/executeLibraryFunctionDirect.ts +7 -3
- package/analyzer-template/project/mocks/analyzeFileMock.ts +8 -7
- package/analyzer-template/project/orchestrateCapture/KyselyAnalysisLoader.ts +3 -6
- package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +49 -33
- package/analyzer-template/project/orchestrateCapture.ts +10 -3
- package/analyzer-template/project/reconcileMockDataKeys.ts +102 -2
- package/analyzer-template/project/runAnalysis.ts +7 -0
- package/analyzer-template/project/serverOnlyModules.ts +127 -2
- package/analyzer-template/project/start.ts +26 -4
- package/analyzer-template/project/startScenarioCapture.ts +72 -40
- package/analyzer-template/project/writeMockDataTsx.ts +118 -55
- package/analyzer-template/project/writeScenarioClientWrapper.ts +21 -0
- package/analyzer-template/project/writeScenarioComponents.ts +263 -92
- package/analyzer-template/project/writeScenarioFiles.ts +26 -0
- package/analyzer-template/project/writeSimpleRoot.ts +13 -15
- package/analyzer-template/scripts/comboWorkerLoop.cjs +1 -0
- package/analyzer-template/scripts/defaultCmd.sh +9 -0
- package/analyzer-template/tsconfig.json +2 -1
- 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/analyzeBaselineCommit.js +2 -1
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeBranchCommit.js +2 -1
- package/background/src/lib/virtualized/project/analyzeBranchCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeFileEntities.js +2 -1
- package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js +2 -1
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +799 -121
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/controller/startController.js +11 -1
- package/background/src/lib/virtualized/project/controller/startController.js.map +1 -1
- package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.js +6 -3
- package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.js.map +1 -1
- package/background/src/lib/virtualized/project/mocks/analyzeFileMock.js +7 -7
- package/background/src/lib/virtualized/project/mocks/analyzeFileMock.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/SequentialCaptureTaskRunner.js +42 -28
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.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 +87 -2
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runAnalysis.js +6 -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 +21 -4
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/startScenarioCapture.js +56 -30
- package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +110 -48
- 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 +211 -75
- 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 +13 -13
- 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 +174 -0
- package/codeyam-cli/src/commands/baseline.js.map +1 -0
- package/codeyam-cli/src/commands/debug.js +28 -18
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +0 -15
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/recapture.js +44 -23
- package/codeyam-cli/src/commands/recapture.js.map +1 -1
- package/codeyam-cli/src/commands/report.js +72 -24
- package/codeyam-cli/src/commands/report.js.map +1 -1
- package/codeyam-cli/src/commands/start.js +8 -12
- package/codeyam-cli/src/commands/start.js.map +1 -1
- 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/__tests__/serverVersionStaleness.test.js +81 -0
- package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +27 -27
- package/codeyam-cli/src/utils/analysisRunner.js +8 -13
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +12 -2
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/database.js +91 -5
- package/codeyam-cli/src/utils/database.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +253 -106
- package/codeyam-cli/src/utils/generateReport.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/install-skills.js +11 -11
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +38 -0
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +239 -16
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +19 -7
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +5 -5
- package/codeyam-cli/src/utils/versionInfo.js +25 -19
- package/codeyam-cli/src/utils/versionInfo.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 +96 -0
- 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 +2 -5
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DKdsUF7Y.js → EntityTypeBadge-COi5OvsN.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-BwdQv49w.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-CEleMv_j.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-D68KarMg.js +25 -0
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-L75Wvqgw.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/LoadingDots-C53WM8qn.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/LogViewer-CrNkmy4i.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-CQifa1n-.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-CyaBFX7l.js +20 -0
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-CWjSsLqY.js → TruncatedFilePath-D36O1rzU.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +37 -0
- package/codeyam-cli/src/webserver/build/client/assets/chevron-down-DgTPh8H-.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/chunk-EPOLDU6W-DdQKK6on.js +51 -0
- package/codeyam-cli/src/webserver/build/client/assets/circle-check-Dmr2bb1R.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-Do4ZLUYa.js +21 -0
- package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-C1gnJVOL.svg → cy-logo-cli-CCKUIm0S.svg} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-CbdFyxZh.js +23 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-wDWZZO1W.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-BMbl7MeQ.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-5wRKRIH9.js +29 -0
- package/codeyam-cli/src/webserver/build/client/assets/executionFlowCoverage-BWhdfn70.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DD3SDH7t.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/git-zXjT7J0G.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-fmIEn3Bc.js +9 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-DLbXwndH.js +9 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-gPZ-lad1.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-BsPXJ81F.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/preload-helper-ckwbz45p.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +57 -0
- package/codeyam-cli/src/webserver/build/client/assets/scenarioStatus-B_8jpV3e.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/search-P2FKIUql.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/settings-B2eDuBj8.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/simulations-L18M6-kN.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-BDz7kbVA.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-29dDmbH8.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-CmrTPlIB.js → useLastLogLine-BUm0UVJm.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-CkIOKTrZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-C1ig_BmP.js → useToast-KKw5kTn-.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +228 -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 +1 -3
- package/codeyam-cli/src/webserver/devServer.js.map +1 -1
- package/codeyam-cli/src/webserver/server.js +35 -25
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/templates/{codeyam-debug-skill.md → codeyam:debug.md} +1 -1
- package/codeyam-cli/templates/codeyam:diagnose.md +625 -0
- package/codeyam-cli/templates/{codeyam-setup-skill.md → codeyam:setup.md} +139 -4
- package/codeyam-cli/templates/{codeyam-sim-skill.md → codeyam:sim.md} +1 -1
- package/codeyam-cli/templates/{codeyam-test-skill.md → codeyam:test.md} +1 -1
- package/codeyam-cli/templates/{codeyam-verify-skill.md → codeyam:verify.md} +1 -1
- package/package.json +8 -8
- package/packages/ai/index.js +2 -4
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +107 -0
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +76 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js +435 -0
- package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js.map +1 -0
- package/packages/ai/src/lib/astScopes/methodSemantics.js +29 -0
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js +8 -0
- package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js +23 -0
- package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +239 -1
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +728 -87
- 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/completionCall.js +17 -1
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1126 -82
- 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 +482 -0
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +173 -55
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +16 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +35 -2
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +20 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.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/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +34 -3
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/deepEqual.js +32 -0
- package/packages/ai/src/lib/deepEqual.js.map +1 -0
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js +62 -5
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityScenarios.js +81 -90
- package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDataStructure.js +5 -0
- package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +398 -81
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +168 -82
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +123 -0
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js +380 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js.map +1 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +742 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -0
- package/packages/ai/src/lib/getConditionalUsagesFromCode.js +84 -14
- package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
- package/packages/ai/src/lib/guessScenarioDataFromDescription.js +2 -1
- package/packages/ai/src/lib/guessScenarioDataFromDescription.js.map +1 -1
- package/packages/ai/src/lib/isolateScopes.js +231 -4
- package/packages/ai/src/lib/isolateScopes.js.map +1 -1
- package/packages/ai/src/lib/mergeStatements.js +26 -3
- package/packages/ai/src/lib/mergeStatements.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +6 -0
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +21 -64
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +58 -4
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +10 -34
- package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js +45 -0
- package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js +16 -3
- package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js.map +1 -1
- package/packages/ai/src/lib/resolvePathToControllable.js +563 -0
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -0
- package/packages/ai/src/lib/splitOutsideParentheses.js +3 -1
- package/packages/ai/src/lib/splitOutsideParentheses.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js +22 -0
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js +4 -0
- package/packages/ai/src/lib/worker/analyzeScopeWorker.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 +214 -50
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +10 -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 +21 -11
- package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeEntity.js +9 -8
- package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeInitial.js +9 -10
- package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
- package/packages/analyze/src/lib/files/enums/steps.js +1 -1
- package/packages/analyze/src/lib/files/enums/steps.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +159 -0
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -0
- 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 +458 -48
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js +29 -34
- package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +235 -81
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +96 -0
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +56 -69
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +4 -8
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +307 -89
- 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/database/src/lib/kysely/db.js +2 -2
- package/packages/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
- package/packages/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +7 -4
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.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/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/packages/generate/src/lib/deepMerge.js +27 -1
- package/packages/generate/src/lib/deepMerge.js.map +1 -1
- 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/packages/types/index.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +3 -1
- package/analyzer-template/packages/ai/src/lib/findMatchingAttribute.ts +0 -102
- package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +0 -197
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +0 -271
- package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +0 -294
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.ts +0 -67
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +0 -115
- 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/src/webserver/build/client/assets/EntityItem-D0VW1-W7.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-BAk4S4pI.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-Y756iZxZ.js +0 -25
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-zzrrjW1p.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/LogViewer-QMn7bJg6.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DmP5mRxX.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BXwvsbLw.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-DAmUX_1y.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/_index-Df-nk4J5.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-_ZUyFdie.js +0 -7
- package/codeyam-cli/src/webserver/build/client/assets/chevron-down-Eoh0PhcW.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-CZgPLy5i.js +0 -26
- package/codeyam-cli/src/webserver/build/client/assets/circle-check-DI-p9ZLZ.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-DvyV2x6y.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DURu2qlF.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-DDobn9Xh.js +0 -16
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-CGdWnLD_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-DgMmzrKs.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-DEVXuhkn.js +0 -13
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-WPRQyc68.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-B9u3lJer.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-YGnKIuHU.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/globals-28lrWTTo.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/index-CJ0uPJjV.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/index-CfqeA2XG.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-DIjSvh6B.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-8125c15c.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/preload-helper-BXl3LOEh.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-C-g286WP.js +0 -16
- package/codeyam-cli/src/webserver/build/client/assets/search-xBKWfOxd.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-DVY_wGOx.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-Be1pJo5A.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-CR-FkSvx.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DABetnSj.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-DcR7DH9q.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BDBrfp7e.js +0 -175
- package/codeyam-cli/templates/debug-codeyam.md +0 -527
- package/packages/ai/src/lib/findMatchingAttribute.js +0 -77
- package/packages/ai/src/lib/findMatchingAttribute.js.map +0 -1
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +0 -136
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +0 -1
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +0 -220
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +0 -1
- package/packages/ai/src/lib/generateEntityKeyAttributes.js +0 -241
- package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +0 -1
- package/packages/ai/src/lib/isFrontend.js +0 -5
- package/packages/ai/src/lib/isFrontend.js.map +0 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js +0 -40
- package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js.map +0 -1
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +0 -72
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +0 -1
- /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
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import completionCall from './completionCall';
|
|
2
2
|
import generateEntityScenarioDataGenerator from './promptGenerators/generateEntityScenarioDataGenerator';
|
|
3
|
+
import generateMissingKeysPrompt from './promptGenerators/generateMissingKeysPrompt';
|
|
3
4
|
import { saveLlmCall } from '~codeyam/aws/dynamodb';
|
|
4
5
|
import type {
|
|
5
6
|
Analysis,
|
|
6
7
|
Entity,
|
|
8
|
+
ExecutionFlow,
|
|
7
9
|
Scenario,
|
|
8
10
|
ScenarioData,
|
|
9
11
|
ScenariosDataStructure,
|
|
@@ -11,6 +13,109 @@ import type {
|
|
|
11
13
|
import validateJson from './validateJson';
|
|
12
14
|
import { awsLog, awsLogDebugLevel } from '~codeyam/utils';
|
|
13
15
|
import { AI, parseJsonSafe } from '~codeyam/ai';
|
|
16
|
+
import convertNullToUndefinedBySchema from './dataStructure/helpers/convertNullToUndefinedBySchema';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Check if any of the scenario's covered flows require error data.
|
|
20
|
+
* Returns true if any requiredValue has an error path with truthy comparison.
|
|
21
|
+
*/
|
|
22
|
+
function scenarioRequiresErrorData(
|
|
23
|
+
scenario: Scenario,
|
|
24
|
+
executionFlows: ExecutionFlow[] | undefined,
|
|
25
|
+
): boolean {
|
|
26
|
+
const coveredFlowIds = scenario.metadata?.coveredFlows || [];
|
|
27
|
+
for (const flowId of coveredFlowIds) {
|
|
28
|
+
const flow = executionFlows?.find((f) => f.id === flowId);
|
|
29
|
+
if (!flow?.requiredValues) continue;
|
|
30
|
+
for (const rv of flow.requiredValues) {
|
|
31
|
+
// Check if any requiredValue has an error path and requires it to be truthy
|
|
32
|
+
if (
|
|
33
|
+
rv.attributePath?.toLowerCase().includes('.error') &&
|
|
34
|
+
rv.comparison === 'truthy'
|
|
35
|
+
) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Deep merge scenario data with default scenario data.
|
|
45
|
+
* The scenario-specific data takes precedence, with default filling in missing fields.
|
|
46
|
+
*
|
|
47
|
+
* IMPORTANT: null values are PRESERVED (not removed) in the result.
|
|
48
|
+
* This is critical because writeMockDataTsx.ts does another deepMerge with default data,
|
|
49
|
+
* and it needs null values to prevent defaults from being filled back in.
|
|
50
|
+
* If we removed null here, the second merge would restore the defaults,
|
|
51
|
+
* making scenarios identical to the default scenario.
|
|
52
|
+
*/
|
|
53
|
+
function deepMergeScenarioData(
|
|
54
|
+
defaultData: Record<string, any>,
|
|
55
|
+
scenarioData: Record<string, any>,
|
|
56
|
+
): Record<string, any> {
|
|
57
|
+
// Guard against non-object inputs (LLM sometimes returns primitives)
|
|
58
|
+
if (
|
|
59
|
+
typeof scenarioData !== 'object' ||
|
|
60
|
+
scenarioData === null ||
|
|
61
|
+
Array.isArray(scenarioData)
|
|
62
|
+
) {
|
|
63
|
+
// Return scenario value directly if it's not a mergeable object
|
|
64
|
+
return scenarioData;
|
|
65
|
+
}
|
|
66
|
+
if (
|
|
67
|
+
typeof defaultData !== 'object' ||
|
|
68
|
+
defaultData === null ||
|
|
69
|
+
Array.isArray(defaultData)
|
|
70
|
+
) {
|
|
71
|
+
// Return scenario value if default isn't mergeable
|
|
72
|
+
return scenarioData;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const result: Record<string, any> = {};
|
|
76
|
+
|
|
77
|
+
// Start with all keys from default
|
|
78
|
+
for (const key of Object.keys(defaultData)) {
|
|
79
|
+
if (key in scenarioData) {
|
|
80
|
+
const scenarioValue = scenarioData[key];
|
|
81
|
+
const defaultValue = defaultData[key];
|
|
82
|
+
|
|
83
|
+
// null means explicitly override with null (falsy value)
|
|
84
|
+
// IMPORTANT: We preserve null instead of removing the key
|
|
85
|
+
// This ensures writeMockDataTsx's deepMerge won't fill in defaults
|
|
86
|
+
if (scenarioValue === null) {
|
|
87
|
+
result[key] = null;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Deep merge objects (but not arrays)
|
|
92
|
+
if (
|
|
93
|
+
typeof scenarioValue === 'object' &&
|
|
94
|
+
!Array.isArray(scenarioValue) &&
|
|
95
|
+
typeof defaultValue === 'object' &&
|
|
96
|
+
!Array.isArray(defaultValue) &&
|
|
97
|
+
defaultValue !== null
|
|
98
|
+
) {
|
|
99
|
+
result[key] = deepMergeScenarioData(defaultValue, scenarioValue);
|
|
100
|
+
} else {
|
|
101
|
+
// Use scenario value (overrides default)
|
|
102
|
+
result[key] = scenarioValue;
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
// Key not in scenario, use default
|
|
106
|
+
result[key] = defaultData[key];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Add any keys that are only in scenario data (including null values)
|
|
111
|
+
for (const key of Object.keys(scenarioData)) {
|
|
112
|
+
if (!(key in defaultData)) {
|
|
113
|
+
result[key] = scenarioData[key];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
14
119
|
|
|
15
120
|
const DEFAULT_SCENARIO_NAME = 'Default Scenario';
|
|
16
121
|
|
|
@@ -20,6 +125,7 @@ interface GenerateEntityScenarioDataArgs {
|
|
|
20
125
|
entity: Pick<Entity, 'name' | 'filePath' | 'metadata'>;
|
|
21
126
|
structure: ScenariosDataStructure;
|
|
22
127
|
scenarios: Scenario[];
|
|
128
|
+
executionFlows?: ExecutionFlow[];
|
|
23
129
|
incompleteResponse?: string;
|
|
24
130
|
analysis: Analysis;
|
|
25
131
|
model?: AI.Model;
|
|
@@ -33,10 +139,96 @@ type GenerateDataForScenarioArgs = Omit<
|
|
|
33
139
|
defaultScenarioData?: ScenarioData;
|
|
34
140
|
};
|
|
35
141
|
|
|
142
|
+
interface FillMissingMockDataKeysArgs {
|
|
143
|
+
structure: ScenariosDataStructure;
|
|
144
|
+
scenario: Scenario;
|
|
145
|
+
executionFlows: ExecutionFlow[] | undefined;
|
|
146
|
+
fullScenarioData: ScenarioData;
|
|
147
|
+
model: AI.Model | undefined;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* For Default Scenario only: detect missing mockData keys and make a follow-up
|
|
152
|
+
* LLM call to fill them in. This handles cases where the LLM completes normally
|
|
153
|
+
* but misses some keys (often small/simple ones when the schema is large).
|
|
154
|
+
*/
|
|
155
|
+
async function fillMissingMockDataKeys({
|
|
156
|
+
structure,
|
|
157
|
+
scenario,
|
|
158
|
+
executionFlows,
|
|
159
|
+
fullScenarioData,
|
|
160
|
+
model,
|
|
161
|
+
}: FillMissingMockDataKeysArgs): Promise<void> {
|
|
162
|
+
if (
|
|
163
|
+
!structure.dataForMocks ||
|
|
164
|
+
typeof structure.dataForMocks !== 'object' ||
|
|
165
|
+
Array.isArray(structure.dataForMocks)
|
|
166
|
+
) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const expectedKeys = Object.keys(structure.dataForMocks);
|
|
171
|
+
const generatedKeys = Object.keys(fullScenarioData.data.mockData || {});
|
|
172
|
+
const missingKeys = expectedKeys.filter((k) => !generatedKeys.includes(k));
|
|
173
|
+
|
|
174
|
+
if (missingKeys.length === 0) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
awsLog(
|
|
179
|
+
`Default Scenario missing ${missingKeys.length} keys, making follow-up call`,
|
|
180
|
+
{ missingKeys },
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
// Build subset schema with only missing keys
|
|
184
|
+
const missingSchema: Record<string, any> = {};
|
|
185
|
+
for (const key of missingKeys) {
|
|
186
|
+
missingSchema[key] = (structure.dataForMocks as Record<string, any>)[key];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const followUpPrompt = generateMissingKeysPrompt({
|
|
190
|
+
scenario,
|
|
191
|
+
executionFlows,
|
|
192
|
+
generatedMockData: fullScenarioData.data.mockData || {},
|
|
193
|
+
missingSchema,
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
const followUpResponse = await completionCall({
|
|
197
|
+
type: 'generateMissingMockData',
|
|
198
|
+
systemMessage: generateMissingKeysSystemMessage(),
|
|
199
|
+
prompt: followUpPrompt,
|
|
200
|
+
model,
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
if (!followUpResponse.completion) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const followUpJson = validateJson(followUpResponse.completion);
|
|
208
|
+
const followUpParsed = parseJsonSafe(followUpJson);
|
|
209
|
+
|
|
210
|
+
if (
|
|
211
|
+
!followUpParsed ||
|
|
212
|
+
typeof followUpParsed !== 'object' ||
|
|
213
|
+
!('mockData' in followUpParsed)
|
|
214
|
+
) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const followUpMockData = (followUpParsed as any).mockData;
|
|
219
|
+
if (followUpMockData && typeof followUpMockData === 'object') {
|
|
220
|
+
fullScenarioData.data.mockData = {
|
|
221
|
+
...fullScenarioData.data.mockData,
|
|
222
|
+
...followUpMockData,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
36
227
|
export async function generateDataForScenario({
|
|
37
228
|
entity,
|
|
38
229
|
structure,
|
|
39
230
|
scenario,
|
|
231
|
+
executionFlows,
|
|
40
232
|
defaultScenarioData,
|
|
41
233
|
incompleteResponse,
|
|
42
234
|
analysis,
|
|
@@ -47,6 +239,7 @@ export async function generateDataForScenario({
|
|
|
47
239
|
const prompt = generateEntityScenarioDataGenerator(
|
|
48
240
|
structure,
|
|
49
241
|
scenario,
|
|
242
|
+
executionFlows,
|
|
50
243
|
defaultScenarioData,
|
|
51
244
|
incompleteResponse,
|
|
52
245
|
);
|
|
@@ -91,7 +284,7 @@ export async function generateDataForScenario({
|
|
|
91
284
|
...response.stats,
|
|
92
285
|
});
|
|
93
286
|
|
|
94
|
-
|
|
287
|
+
let { completion, finishReason } = response;
|
|
95
288
|
|
|
96
289
|
if (!completion) {
|
|
97
290
|
console.log(
|
|
@@ -100,42 +293,80 @@ export async function generateDataForScenario({
|
|
|
100
293
|
return null;
|
|
101
294
|
}
|
|
102
295
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
{
|
|
106
|
-
finishReason,
|
|
107
|
-
completion,
|
|
108
|
-
},
|
|
296
|
+
awsLogDebugLevel(
|
|
297
|
+
1,
|
|
298
|
+
`LLMCall ${llmCall ? llmCall.id : 'N/A'}: ${entity.filePath} ${entity.metadata?.exportAlias ?? entity.name} finishReason: ${finishReason}`,
|
|
109
299
|
);
|
|
110
300
|
|
|
301
|
+
// If response was truncated due to token limit, make a continuation call
|
|
302
|
+
if (finishReason === 'length') {
|
|
303
|
+
awsLogDebugLevel(1, 'Response truncated, making continuation call');
|
|
304
|
+
|
|
305
|
+
const continuationResponse = await completionCall({
|
|
306
|
+
type: 'generateEntityScenarioData',
|
|
307
|
+
systemMessage: generateIncompleteSystemMessage(scenario.name, isDefault),
|
|
308
|
+
prompt: completion, // Pass the incomplete response as the prompt
|
|
309
|
+
model,
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
if (continuationResponse.completion) {
|
|
313
|
+
completion = completion + continuationResponse.completion;
|
|
314
|
+
finishReason = continuationResponse.finishReason;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
111
318
|
const validJson = validateJson(completion);
|
|
112
319
|
|
|
113
320
|
const parsed = parseJsonSafe(validJson);
|
|
114
321
|
if (!parsed || typeof parsed !== 'object' || !('scenarioData' in parsed)) {
|
|
115
|
-
|
|
116
|
-
entityName: entity.name,
|
|
117
|
-
scenarioName: scenario.name,
|
|
118
|
-
hasParsed: !!parsed,
|
|
119
|
-
parsedType: typeof parsed,
|
|
120
|
-
hasScenarioData: parsed && 'scenarioData' in parsed,
|
|
121
|
-
completionPreview: completion.substring(0, 200),
|
|
122
|
-
});
|
|
322
|
+
awsLog(`Failed to parse scenario data for ${entity.name}/${scenario.name}`);
|
|
123
323
|
return null;
|
|
124
324
|
}
|
|
125
325
|
|
|
126
|
-
|
|
326
|
+
let { scenarioData: scenarioDataWithoutDescription } = parsed as {
|
|
127
327
|
scenarioData: ScenarioDataWithoutDescription;
|
|
128
328
|
};
|
|
129
329
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
330
|
+
// FIX: LLM sometimes puts mock data keys directly under scenarioData instead of
|
|
331
|
+
// under scenarioData.data.mockData. Detect and fix this structural issue.
|
|
332
|
+
if (structure.dataForMocks) {
|
|
333
|
+
const scenarioDataAsAny = scenarioDataWithoutDescription as any;
|
|
334
|
+
const reservedKeys = new Set([
|
|
335
|
+
'scenarioName',
|
|
336
|
+
'data',
|
|
337
|
+
'scenarioDescription',
|
|
338
|
+
]);
|
|
339
|
+
const misplacedKeys: string[] = [];
|
|
340
|
+
|
|
341
|
+
// Find keys that are directly under scenarioData but should be in mockData
|
|
342
|
+
for (const key of Object.keys(scenarioDataAsAny)) {
|
|
343
|
+
if (reservedKeys.has(key)) continue;
|
|
344
|
+
// If this key exists in the dataForMocks schema, it's misplaced
|
|
345
|
+
if (key in structure.dataForMocks) {
|
|
346
|
+
misplacedKeys.push(key);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (misplacedKeys.length > 0) {
|
|
351
|
+
// Ensure data.mockData exists
|
|
352
|
+
if (!scenarioDataAsAny.data) {
|
|
353
|
+
scenarioDataAsAny.data = {};
|
|
354
|
+
}
|
|
355
|
+
if (!scenarioDataAsAny.data.mockData) {
|
|
356
|
+
scenarioDataAsAny.data.mockData = {};
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Move misplaced keys to mockData
|
|
360
|
+
for (const key of misplacedKeys) {
|
|
361
|
+
scenarioDataAsAny.data.mockData[key] = scenarioDataAsAny[key];
|
|
362
|
+
delete scenarioDataAsAny[key];
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Update the reference
|
|
366
|
+
scenarioDataWithoutDescription =
|
|
367
|
+
scenarioDataAsAny as ScenarioDataWithoutDescription;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
139
370
|
|
|
140
371
|
const fullScenarioData: ScenarioData = {
|
|
141
372
|
...scenarioDataWithoutDescription,
|
|
@@ -144,8 +375,9 @@ export async function generateDataForScenario({
|
|
|
144
375
|
|
|
145
376
|
if (structure.dataForMocks && !fullScenarioData.data.argumentsData) {
|
|
146
377
|
fullScenarioData.data.argumentsData = [];
|
|
147
|
-
|
|
148
|
-
|
|
378
|
+
// Populate argumentsData from structure.arguments using top-level data values
|
|
379
|
+
// Bug fix: removed redundant !argumentsData check that was always false after setting to []
|
|
380
|
+
if (structure.arguments) {
|
|
149
381
|
for (let i = 0; i < structure.arguments.length; ++i) {
|
|
150
382
|
if (!fullScenarioData.data.argumentsData[i]) {
|
|
151
383
|
fullScenarioData.data.argumentsData[i] = {};
|
|
@@ -166,6 +398,38 @@ export async function generateDataForScenario({
|
|
|
166
398
|
}
|
|
167
399
|
}
|
|
168
400
|
|
|
401
|
+
// Convert null values to undefined based on schema type constraints.
|
|
402
|
+
// LLM uses null for "no value" (JSON doesn't support undefined), but TypeScript
|
|
403
|
+
// types like "string | undefined" don't accept null. This converts null→undefined
|
|
404
|
+
// for fields typed as "T | undefined" (but preserves null for "T | null").
|
|
405
|
+
if (structure.dataForMocks && fullScenarioData.data.mockData) {
|
|
406
|
+
convertNullToUndefinedBySchema(
|
|
407
|
+
fullScenarioData.data.mockData,
|
|
408
|
+
structure.dataForMocks,
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
if (structure.arguments && fullScenarioData.data.argumentsData) {
|
|
412
|
+
for (let i = 0; i < fullScenarioData.data.argumentsData.length; i++) {
|
|
413
|
+
if (structure.arguments[i]) {
|
|
414
|
+
convertNullToUndefinedBySchema(
|
|
415
|
+
fullScenarioData.data.argumentsData[i],
|
|
416
|
+
structure.arguments[i],
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// For Default Scenario only: check for missing keys and make follow-up call if needed
|
|
423
|
+
if (isDefault) {
|
|
424
|
+
await fillMissingMockDataKeys({
|
|
425
|
+
structure,
|
|
426
|
+
scenario,
|
|
427
|
+
executionFlows,
|
|
428
|
+
fullScenarioData,
|
|
429
|
+
model,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
|
|
169
433
|
return {
|
|
170
434
|
scenarioData: fullScenarioData,
|
|
171
435
|
llmCall: { name: scenario.name, id: llmCall.id },
|
|
@@ -176,6 +440,7 @@ export default async function generateEntityScenarioData({
|
|
|
176
440
|
entity,
|
|
177
441
|
structure,
|
|
178
442
|
scenarios,
|
|
443
|
+
executionFlows,
|
|
179
444
|
incompleteResponse,
|
|
180
445
|
analysis,
|
|
181
446
|
model,
|
|
@@ -196,6 +461,7 @@ export default async function generateEntityScenarioData({
|
|
|
196
461
|
entity,
|
|
197
462
|
structure,
|
|
198
463
|
scenario: defaultScenario,
|
|
464
|
+
executionFlows,
|
|
199
465
|
incompleteResponse,
|
|
200
466
|
analysis,
|
|
201
467
|
model,
|
|
@@ -218,6 +484,7 @@ export default async function generateEntityScenarioData({
|
|
|
218
484
|
entity,
|
|
219
485
|
structure,
|
|
220
486
|
scenario,
|
|
487
|
+
executionFlows,
|
|
221
488
|
defaultScenarioData,
|
|
222
489
|
incompleteResponse,
|
|
223
490
|
analysis,
|
|
@@ -238,37 +505,77 @@ export default async function generateEntityScenarioData({
|
|
|
238
505
|
);
|
|
239
506
|
}
|
|
240
507
|
|
|
241
|
-
|
|
242
|
-
|
|
508
|
+
// Merge non-default scenario data with default scenario data
|
|
509
|
+
// The LLM generates partial data (only differences), we need to merge with default
|
|
510
|
+
const mergedScenarioDatas = validResults.map((result) => {
|
|
511
|
+
const scenarioData = result.scenarioData;
|
|
512
|
+
|
|
513
|
+
// Merge mockData with default mockData
|
|
514
|
+
if (defaultScenarioData.data?.mockData && scenarioData.data?.mockData) {
|
|
515
|
+
scenarioData.data.mockData = deepMergeScenarioData(
|
|
516
|
+
defaultScenarioData.data.mockData,
|
|
517
|
+
scenarioData.data.mockData,
|
|
518
|
+
);
|
|
519
|
+
} else if (
|
|
520
|
+
defaultScenarioData.data?.mockData &&
|
|
521
|
+
!scenarioData.data?.mockData
|
|
522
|
+
) {
|
|
523
|
+
// Use default mockData if scenario has none
|
|
524
|
+
scenarioData.data.mockData = { ...defaultScenarioData.data.mockData };
|
|
525
|
+
}
|
|
243
526
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
527
|
+
// Merge argumentsData with default argumentsData
|
|
528
|
+
if (
|
|
529
|
+
defaultScenarioData.data?.argumentsData &&
|
|
530
|
+
Array.isArray(defaultScenarioData.data.argumentsData) &&
|
|
531
|
+
scenarioData.data?.argumentsData &&
|
|
532
|
+
Array.isArray(scenarioData.data.argumentsData)
|
|
533
|
+
) {
|
|
534
|
+
for (
|
|
535
|
+
let i = 0;
|
|
536
|
+
i < defaultScenarioData.data.argumentsData.length;
|
|
537
|
+
i++
|
|
538
|
+
) {
|
|
539
|
+
const scenarioArg = scenarioData.data.argumentsData[i];
|
|
540
|
+
const defaultArg = defaultScenarioData.data.argumentsData[i];
|
|
541
|
+
|
|
542
|
+
// Only merge if both are objects (LLM sometimes returns primitives)
|
|
543
|
+
if (
|
|
544
|
+
scenarioArg &&
|
|
545
|
+
typeof scenarioArg === 'object' &&
|
|
546
|
+
!Array.isArray(scenarioArg) &&
|
|
547
|
+
defaultArg &&
|
|
548
|
+
typeof defaultArg === 'object' &&
|
|
549
|
+
!Array.isArray(defaultArg)
|
|
550
|
+
) {
|
|
551
|
+
scenarioData.data.argumentsData[i] = deepMergeScenarioData(
|
|
552
|
+
defaultArg,
|
|
553
|
+
scenarioArg,
|
|
554
|
+
);
|
|
555
|
+
} else if (scenarioArg !== undefined) {
|
|
556
|
+
// Keep the scenario value as-is (even if primitive)
|
|
557
|
+
scenarioData.data.argumentsData[i] = scenarioArg;
|
|
558
|
+
} else if (defaultArg && typeof defaultArg === 'object') {
|
|
559
|
+
// Use default if scenario is undefined and default is an object
|
|
560
|
+
scenarioData.data.argumentsData[i] = { ...defaultArg };
|
|
561
|
+
} else {
|
|
562
|
+
scenarioData.data.argumentsData[i] = defaultArg;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
} else if (
|
|
566
|
+
defaultScenarioData.data?.argumentsData &&
|
|
567
|
+
!scenarioData.data?.argumentsData
|
|
568
|
+
) {
|
|
569
|
+
// Use default argumentsData if scenario has none
|
|
570
|
+
scenarioData.data.argumentsData =
|
|
571
|
+
defaultScenarioData.data.argumentsData.map((arg) => ({ ...arg }));
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
return scenarioData;
|
|
254
575
|
});
|
|
255
576
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
JSON.stringify(
|
|
259
|
-
{
|
|
260
|
-
filePath: entity.filePath,
|
|
261
|
-
entityName: entity.name,
|
|
262
|
-
scenarioDatas: scenarioDatas.map((sd) => ({
|
|
263
|
-
scenarioName: sd.scenarioName,
|
|
264
|
-
hasData: !!sd.data,
|
|
265
|
-
dataKeys: sd.data ? Object.keys(sd.data) : [],
|
|
266
|
-
})),
|
|
267
|
-
},
|
|
268
|
-
null,
|
|
269
|
-
2,
|
|
270
|
-
),
|
|
271
|
-
);
|
|
577
|
+
scenarioDatas.push(...mergedScenarioDatas);
|
|
578
|
+
llmCalls.push(...validResults.map((result) => result.llmCall));
|
|
272
579
|
|
|
273
580
|
return { scenarioDatas, llmCalls };
|
|
274
581
|
} catch (error) {
|
|
@@ -280,13 +587,15 @@ export default async function generateEntityScenarioData({
|
|
|
280
587
|
export const generateSystemMessage = (
|
|
281
588
|
scenarioName: string,
|
|
282
589
|
defaultScenario: boolean,
|
|
590
|
+
requiresErrorData: boolean = false,
|
|
283
591
|
) => {
|
|
284
592
|
const scenarioType = defaultScenario
|
|
285
593
|
? `## Default Scenario
|
|
286
594
|
Generate COMPLETE, robust data for the entire data structure.
|
|
287
|
-
- Fill ALL fields with realistic values (except error attributes
|
|
288
|
-
-
|
|
289
|
-
-
|
|
595
|
+
- Fill ALL fields with realistic values (except error attributes)
|
|
596
|
+
- Do not skip any keys, even simple or small entries
|
|
597
|
+
- Arrays should have 3-5 items to provide realistic test data variety
|
|
598
|
+
- Don't skip nested attributes unless the execution flow requirements specify a parent attribute should be null or undefined
|
|
290
599
|
- This provides the baseline data for all other scenarios`
|
|
291
600
|
: `## Non-Default Scenario
|
|
292
601
|
Generate ONLY the differences from the default scenario.
|
|
@@ -294,14 +603,57 @@ Generate ONLY the differences from the default scenario.
|
|
|
294
603
|
- Set to \`null\` to remove data
|
|
295
604
|
- Omit unchanged fields—they merge from default`;
|
|
296
605
|
|
|
606
|
+
// Only include the "NO ERROR DATA" instruction when the scenario doesn't require error data
|
|
607
|
+
const noErrorDataInstruction = requiresErrorData
|
|
608
|
+
? `## IMPORTANT: ERROR DATA REQUIRED
|
|
609
|
+
This scenario tests error handling. You MUST include "error" fields with realistic error messages.
|
|
610
|
+
- Set error fields to truthy values (e.g., "Error: Operation failed" or "Something went wrong")
|
|
611
|
+
- The error data is REQUIRED to trigger the correct error UI state`
|
|
612
|
+
: `## CRITICAL: NO ERROR DATA
|
|
613
|
+
NEVER include "error" fields in responses. Skip them entirely.
|
|
614
|
+
- If structure has \`{ data: {...}, error: {...} }\`, only fill \`data\`
|
|
615
|
+
- Leave out any attribute named "error"—do not set to null, omit entirely`;
|
|
616
|
+
|
|
297
617
|
return `You are a test data generator. Create mock data matching a data structure and scenario requirements.
|
|
298
618
|
|
|
619
|
+
## Execution Flow Requirements
|
|
620
|
+
Each scenario has \`coveredFlows\` which lists the execution flows (distinct outcomes/behaviors) this scenario should demonstrate.
|
|
621
|
+
Each flow has \`requiredValues\` - the attribute values that MUST be set to produce that outcome.
|
|
622
|
+
|
|
623
|
+
**Your job**: Generate mock data that satisfies ALL the requiredValues from ALL coveredFlows.
|
|
624
|
+
|
|
625
|
+
For example, if a flow requires:
|
|
626
|
+
\`\`\`json
|
|
627
|
+
{
|
|
628
|
+
"attributePath": "signature[0].isLoading",
|
|
629
|
+
"value": "false",
|
|
630
|
+
"comparison": "equals",
|
|
631
|
+
"valueType": "boolean"
|
|
632
|
+
}
|
|
633
|
+
\`\`\`
|
|
634
|
+
Then set \`isLoading: false\` in the mockData.
|
|
635
|
+
|
|
636
|
+
## CRITICAL: Blocking Flows to Avoid
|
|
637
|
+
If the scenario includes \`blockingFlowsToAvoid\`, these are flows (like modals, overlays) that would BLOCK the expected UI.
|
|
638
|
+
You MUST generate mock data that PREVENTS these flows from triggering:
|
|
639
|
+
|
|
640
|
+
- For \`comparison: "truthy"\` requirements → set the value to \`false\`, \`null\`, \`undefined\`, or \`0\`
|
|
641
|
+
- For \`comparison: "exists"\` requirements → set the value to \`null\` or omit it entirely
|
|
642
|
+
- For \`comparison: "equals"\` requirements → set a DIFFERENT value than what's required
|
|
643
|
+
|
|
644
|
+
For example, if a blocking flow has:
|
|
645
|
+
\`\`\`json
|
|
646
|
+
{
|
|
647
|
+
"attributePath": "useFetcher().data.success",
|
|
648
|
+
"value": "true",
|
|
649
|
+
"comparison": "truthy"
|
|
650
|
+
}
|
|
651
|
+
\`\`\`
|
|
652
|
+
Then you MUST set \`useFetcher().data\` to \`null\` or \`{ success: false }\` to prevent the modal from appearing.
|
|
653
|
+
|
|
299
654
|
${scenarioType}
|
|
300
655
|
|
|
301
|
-
|
|
302
|
-
NEVER include "error" fields in responses. Skip them entirely.
|
|
303
|
-
- If structure has \`{ data: {...}, error: {...} }\`, only fill \`data\`
|
|
304
|
-
- Leave out any attribute named "error"—do not set to null, omit entirely
|
|
656
|
+
${noErrorDataInstruction}
|
|
305
657
|
|
|
306
658
|
## Special Markers
|
|
307
659
|
|
|
@@ -317,30 +669,19 @@ Use for relative dates. Code runs in Node (no browser APIs, no external librarie
|
|
|
317
669
|
\`\`\`
|
|
318
670
|
Use simple elements only (\`<div>\`, \`<span>\`). No custom components.
|
|
319
671
|
|
|
320
|
-
|
|
321
|
-
|
|
672
|
+
### Arrays
|
|
673
|
+
- Arrays should have many items (at least 4) unless specified otherwise
|
|
674
|
+
- Each item must follow the exact structure provided
|
|
675
|
+
- In general we want robust data, not minimal data unless specified otherwise
|
|
322
676
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
\`\`\`
|
|
332
|
-
|
|
333
|
-
### Variable-qualified calls (for multiple calls to the same function)
|
|
334
|
-
When the same function is called multiple times with results stored in different variables, keys use the format \`variableName <- functionName\`:
|
|
335
|
-
\`\`\`json
|
|
336
|
-
{
|
|
337
|
-
"mockData": {
|
|
338
|
-
"entityDiffFetcher <- useFetcher": { "data": null, "state": "idle" },
|
|
339
|
-
"reportFetcher <- useFetcher": { "data": { "reportId": "abc123" }, "state": "idle" }
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
\`\`\`
|
|
343
|
-
This reads as "entityDiffFetcher receives from useFetcher". Each variable gets its own distinct mock data.
|
|
677
|
+
## CRITICAL: Preserve Exact Structure
|
|
678
|
+
Your response MUST mirror the EXACT nested structure provided in mockData Structure.
|
|
679
|
+
- Do NOT reorganize, split, or create duplicate keys
|
|
680
|
+
- The hierarchy of nested objects must match exactly what was provided unless overridden by scenario rules
|
|
681
|
+
- Only change the leaf VALUES (replacing type descriptions like "string" with actual data like "hello")
|
|
682
|
+
- Copy the key strings EXACTLY from the structure
|
|
683
|
+
- Do NOT modify type parameters, arguments, or any part of the key
|
|
684
|
+
- The keys preserve the exact function call as written in the original code
|
|
344
685
|
|
|
345
686
|
## Response Format
|
|
346
687
|
\`\`\`json
|
|
@@ -358,9 +699,15 @@ This reads as "entityDiffFetcher receives from useFetcher". Each variable gets i
|
|
|
358
699
|
## Rules
|
|
359
700
|
- Valid JSON only—no raw code outside markers
|
|
360
701
|
- No \`undefined\`—use \`null\` or omit
|
|
361
|
-
- No data references (can't use \`posts[0]\` elsewhere—duplicate the value)
|
|
702
|
+
- No data references (can't use \`posts[0]\` elsewhere — duplicate the value)
|
|
362
703
|
- Scenario name must match exactly: "${scenarioName}"
|
|
363
704
|
- Empty mockData: \`{}\`, empty argumentsData: \`[]\`
|
|
705
|
+
|
|
706
|
+
## IMPORTANT: Avoid Identifier Collisions
|
|
707
|
+
When generating identifier values (SHA hashes, entity IDs, etc.):
|
|
708
|
+
- Use DISTINCT values for different identifier fields
|
|
709
|
+
- Avoid matching: if \`entity.sha\` is "abc123", arrays like \`jobs[].entityShas\` or \`currentlyExecuting.entityShas\` should NOT contain "abc123"
|
|
710
|
+
- This prevents accidental blocking of UI conditionals that check if IDs are in/not-in arrays
|
|
364
711
|
`;
|
|
365
712
|
};
|
|
366
713
|
|
|
@@ -376,3 +723,56 @@ Here is the original system message as well:
|
|
|
376
723
|
${generateSystemMessage(scenarioName, isDefault)}
|
|
377
724
|
\`\`\`
|
|
378
725
|
`;
|
|
726
|
+
|
|
727
|
+
/**
|
|
728
|
+
* System message for follow-up calls to generate missing mockData keys.
|
|
729
|
+
* Includes the same rules as the main system message but with a simpler response format.
|
|
730
|
+
*/
|
|
731
|
+
export const generateMissingKeysSystemMessage =
|
|
732
|
+
() => `You are completing mock data generation for the Default Scenario. The initial response was missing some keys.
|
|
733
|
+
|
|
734
|
+
Generate data ONLY for the missing keys provided in the prompt. Do not skip any of them.
|
|
735
|
+
|
|
736
|
+
## Special Markers
|
|
737
|
+
|
|
738
|
+
### Dynamic Dates (\`~~codeyam-code~~\`)
|
|
739
|
+
\`\`\`json
|
|
740
|
+
{ "createdAt": { "~~codeyam-code~~": "new Date(Date.now() - 24*60*60*1000)" } }
|
|
741
|
+
\`\`\`
|
|
742
|
+
Use for relative dates. Code runs in Node (no browser APIs, no external libraries).
|
|
743
|
+
|
|
744
|
+
### JSX Children (\`~~codeyam-jsx~~\`)
|
|
745
|
+
\`\`\`json
|
|
746
|
+
{ "children": { "~~codeyam-jsx~~": "<div>Hello</div>" } }
|
|
747
|
+
\`\`\`
|
|
748
|
+
Use simple elements only (\`<div>\`, \`<span>\`). No custom components.
|
|
749
|
+
|
|
750
|
+
### Arrays
|
|
751
|
+
- Arrays should have many items (at least 4) unless specified otherwise
|
|
752
|
+
- Each item must follow the exact structure provided
|
|
753
|
+
|
|
754
|
+
## CRITICAL: Preserve Exact Structure
|
|
755
|
+
Your response MUST mirror the EXACT nested structure provided for the missing keys.
|
|
756
|
+
- Only change the leaf VALUES (replacing type descriptions like "string" with actual data)
|
|
757
|
+
- Copy the key strings EXACTLY from the structure
|
|
758
|
+
- Do NOT modify type parameters, arguments, or any part of the key
|
|
759
|
+
|
|
760
|
+
## CRITICAL: NO ERROR DATA
|
|
761
|
+
NEVER include "error" fields in responses. Skip them entirely.
|
|
762
|
+
- If structure has \`{ data: {...}, error: {...} }\`, only fill \`data\`
|
|
763
|
+
- Leave out any attribute named "error"—do not set to null, omit entirely
|
|
764
|
+
|
|
765
|
+
## Response Format
|
|
766
|
+
\`\`\`json
|
|
767
|
+
{
|
|
768
|
+
"mockData": {
|
|
769
|
+
// fill in ONLY the missing keys
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
\`\`\`
|
|
773
|
+
|
|
774
|
+
## Rules
|
|
775
|
+
- Valid JSON only—no raw code outside markers
|
|
776
|
+
- No \`undefined\`—use \`null\` or omit
|
|
777
|
+
- No data references (can't use \`posts[0]\` elsewhere — duplicate the value)
|
|
778
|
+
`;
|