@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.
Files changed (340) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/common/execAsync.ts +1 -1
  3. package/analyzer-template/log.txt +3 -3
  4. package/analyzer-template/package.json +7 -4
  5. package/analyzer-template/packages/ai/package.json +1 -1
  6. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +14 -1
  7. package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +29 -10
  8. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +120 -19
  9. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +2 -1
  10. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +91 -35
  11. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +110 -74
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +11 -0
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.ts +98 -0
  14. package/analyzer-template/packages/ai/src/lib/deepEqual.ts +30 -0
  15. package/analyzer-template/packages/ai/src/lib/findMatchingAttribute.ts +24 -17
  16. package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +214 -39
  17. package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +54 -1
  18. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +72 -6
  19. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +12 -5
  20. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +39 -23
  21. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +32 -0
  22. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +14 -0
  23. package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +1 -0
  24. package/analyzer-template/packages/analyze/src/lib/asts/nodes/isAsyncFunction.ts +67 -0
  25. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +73 -69
  26. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +6 -0
  27. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +3 -0
  28. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +22 -6
  29. package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +9 -5
  30. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +49 -11
  31. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.ts +102 -0
  32. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +399 -52
  33. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.ts +128 -2
  34. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +114 -70
  35. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +34 -129
  36. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +155 -79
  37. package/analyzer-template/packages/aws/codebuild/index.ts +1 -0
  38. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts +11 -1
  39. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts.map +1 -1
  40. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js +29 -18
  41. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js.map +1 -1
  42. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts +2 -2
  43. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts.map +1 -1
  44. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js +2 -2
  45. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js.map +1 -1
  46. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts +8 -18
  47. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts.map +1 -1
  48. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js +17 -61
  49. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js.map +1 -1
  50. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.d.ts.map +1 -1
  51. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js +8 -1
  52. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js.map +1 -1
  53. package/analyzer-template/packages/aws/package.json +1 -1
  54. package/analyzer-template/packages/aws/src/lib/codebuild/waitForBuild.ts +43 -19
  55. package/analyzer-template/packages/aws/src/lib/ecs/ecsDefineContainer.ts +3 -3
  56. package/analyzer-template/packages/aws/src/lib/ecs/ecsTaskFactory.ts +17 -69
  57. package/analyzer-template/packages/aws/src/lib/s3/uploadFileToS3.ts +8 -1
  58. package/analyzer-template/packages/generate/index.ts +3 -0
  59. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +17 -1
  60. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +193 -0
  61. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.ts +73 -0
  62. package/analyzer-template/packages/generate/src/lib/scenarioComponentForServer.ts +114 -0
  63. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts +1 -0
  64. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts.map +1 -1
  65. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +1 -0
  66. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  67. package/analyzer-template/packages/github/dist/generate/index.d.ts +3 -0
  68. package/analyzer-template/packages/github/dist/generate/index.d.ts.map +1 -1
  69. package/analyzer-template/packages/github/dist/generate/index.js +3 -0
  70. package/analyzer-template/packages/github/dist/generate/index.js.map +1 -1
  71. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
  72. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
  73. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  74. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts +9 -0
  75. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -0
  76. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +189 -0
  77. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
  78. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts +20 -0
  79. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts.map +1 -0
  80. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
  81. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
  82. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts +8 -0
  83. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts.map +1 -0
  84. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js +89 -0
  85. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js.map +1 -0
  86. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.d.ts.map +1 -1
  87. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js +10 -0
  88. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js.map +1 -1
  89. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.d.ts.map +1 -1
  90. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js +3 -0
  91. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js.map +1 -1
  92. package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts +2 -0
  93. package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts.map +1 -1
  94. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +6 -0
  95. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  96. package/analyzer-template/packages/github/src/lib/loadOrCreateCommit.ts +14 -0
  97. package/analyzer-template/packages/github/src/lib/syncPrimaryBranch.ts +2 -0
  98. package/analyzer-template/packages/process/index.ts +2 -0
  99. package/analyzer-template/packages/process/package.json +12 -0
  100. package/analyzer-template/packages/process/tsconfig.json +8 -0
  101. package/analyzer-template/packages/types/src/types/Entity.ts +2 -0
  102. package/analyzer-template/packages/types/src/types/Scenario.ts +6 -0
  103. package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts +2 -0
  104. package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts.map +1 -1
  105. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +6 -0
  106. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  107. package/analyzer-template/playwright/capture.ts +37 -18
  108. package/analyzer-template/playwright/waitForServer.ts +21 -6
  109. package/analyzer-template/project/constructMockCode.ts +781 -140
  110. package/analyzer-template/project/orchestrateCapture/KyselyAnalysisLoader.ts +3 -6
  111. package/analyzer-template/project/orchestrateCapture.ts +10 -3
  112. package/analyzer-template/project/reconcileMockDataKeys.ts +28 -100
  113. package/analyzer-template/project/runAnalysis.ts +5 -0
  114. package/analyzer-template/project/serverOnlyModules.ts +127 -2
  115. package/analyzer-template/project/start.ts +5 -3
  116. package/analyzer-template/project/startScenarioCapture.ts +6 -0
  117. package/analyzer-template/project/writeMockDataTsx.ts +50 -22
  118. package/analyzer-template/project/writeScenarioClientWrapper.ts +21 -0
  119. package/analyzer-template/project/writeScenarioComponents.ts +162 -100
  120. package/analyzer-template/project/writeScenarioFiles.ts +26 -0
  121. package/analyzer-template/project/writeSimpleRoot.ts +11 -35
  122. package/analyzer-template/scripts/comboWorkerLoop.cjs +1 -0
  123. package/analyzer-template/scripts/defaultCmd.sh +9 -0
  124. package/background/src/lib/local/createLocalAnalyzer.js +1 -29
  125. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  126. package/background/src/lib/local/execAsync.js +1 -1
  127. package/background/src/lib/local/execAsync.js.map +1 -1
  128. package/background/src/lib/virtualized/common/execAsync.js +1 -1
  129. package/background/src/lib/virtualized/common/execAsync.js.map +1 -1
  130. package/background/src/lib/virtualized/project/constructMockCode.js +718 -127
  131. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  132. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js +3 -2
  133. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js.map +1 -1
  134. package/background/src/lib/virtualized/project/orchestrateCapture.js +7 -4
  135. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  136. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +25 -61
  137. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  138. package/background/src/lib/virtualized/project/runAnalysis.js +4 -0
  139. package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
  140. package/background/src/lib/virtualized/project/serverOnlyModules.js +106 -3
  141. package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -1
  142. package/background/src/lib/virtualized/project/start.js +5 -3
  143. package/background/src/lib/virtualized/project/start.js.map +1 -1
  144. package/background/src/lib/virtualized/project/startScenarioCapture.js +7 -0
  145. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  146. package/background/src/lib/virtualized/project/writeMockDataTsx.js +52 -23
  147. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  148. package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js +15 -0
  149. package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js.map +1 -0
  150. package/background/src/lib/virtualized/project/writeScenarioComponents.js +136 -83
  151. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  152. package/background/src/lib/virtualized/project/writeScenarioFiles.js +19 -0
  153. package/background/src/lib/virtualized/project/writeScenarioFiles.js.map +1 -1
  154. package/background/src/lib/virtualized/project/writeSimpleRoot.js +11 -34
  155. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  156. package/codeyam-cli/src/cli.js +5 -1
  157. package/codeyam-cli/src/cli.js.map +1 -1
  158. package/codeyam-cli/src/commands/analyze.js +1 -1
  159. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  160. package/codeyam-cli/src/commands/baseline.js +177 -0
  161. package/codeyam-cli/src/commands/baseline.js.map +1 -0
  162. package/codeyam-cli/src/commands/status.js +23 -1
  163. package/codeyam-cli/src/commands/status.js.map +1 -1
  164. package/codeyam-cli/src/commands/test-startup.js +1 -1
  165. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  166. package/codeyam-cli/src/commands/wipe.js +108 -0
  167. package/codeyam-cli/src/commands/wipe.js.map +1 -0
  168. package/codeyam-cli/src/utils/database.js +91 -5
  169. package/codeyam-cli/src/utils/database.js.map +1 -1
  170. package/codeyam-cli/src/utils/git.js +79 -0
  171. package/codeyam-cli/src/utils/git.js.map +1 -0
  172. package/codeyam-cli/src/utils/queue/job.js +104 -0
  173. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  174. package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
  175. package/codeyam-cli/src/utils/wipe.js +128 -0
  176. package/codeyam-cli/src/utils/wipe.js.map +1 -0
  177. package/codeyam-cli/src/webserver/app/lib/database.js +66 -17
  178. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  179. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-wXL1Z2Aq.js → EntityItem-Cmysw5OP.js} +1 -1
  180. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-CzGX-miz.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
  181. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CXFKsCOD.js → EntityTypeIcon-CAneekK2.js} +1 -1
  182. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D-9pXIaY.js → InteractivePreview-Cu16OUmx.js} +2 -2
  183. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CBQPrpT0.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
  184. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-D1CdlbrV.js → LoadingDots-B0GLXMsr.js} +1 -1
  185. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-wDPcZNKx.js → LogViewer-xgeCVgSM.js} +1 -1
  186. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-4lcOlid-.js → ReportIssueModal-DcAUIpD_.js} +1 -1
  187. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-BfmDgXxG.js → SafeScreenshot-DuDvi0jm.js} +1 -1
  188. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-BMKg0SAF.js +15 -0
  189. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-6J7zDUD5.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
  190. package/codeyam-cli/src/webserver/build/client/assets/_index-DSmTpjmK.js +11 -0
  191. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BF_aK4y6.js +32 -0
  192. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BYimnrHg.js → chevron-down-Cx24_aWc.js} +1 -1
  193. package/codeyam-cli/src/webserver/build/client/assets/chunk-EPOLDU6W-CXRTFQ3F.js +51 -0
  194. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-CaVsIRxt.js → circle-check-BOARzkeR.js} +1 -1
  195. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-CgUsG7ib.js → createLucideIcon-BdhJEx6B.js} +1 -1
  196. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-DW_hdGUc.js → dev.empty-RJCf3Tvw.js} +1 -1
  197. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-zUEpfPsu.js → entity._sha._-D0-YwkBh.js} +12 -12
  198. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-EylcgScH.js +1 -0
  199. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D_3ero5o.js → entity._sha_.create-scenario-DMe7kvgo.js} +1 -1
  200. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CfLCUi9S.js → entity._sha_.edit._scenarioId-C1H_a_Y3.js} +1 -1
  201. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-DKJyZfAY.js → entry.client-CS2cb_eZ.js} +6 -6
  202. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DAtOlaWE.js → fileTableUtils-DMJ7zii9.js} +1 -1
  203. package/codeyam-cli/src/webserver/build/client/assets/{files-ClR0d32A.js → files-BW7Cyeyi.js} +1 -1
  204. package/codeyam-cli/src/webserver/build/client/assets/{git-D62Lxxmv.js → git-CZu4fif0.js} +2 -2
  205. package/codeyam-cli/src/webserver/build/client/assets/globals-wHVy_II5.css +1 -0
  206. package/codeyam-cli/src/webserver/build/client/assets/{index-CzNNiTkw.js → index-B1h680n5.js} +1 -1
  207. package/codeyam-cli/src/webserver/build/client/assets/{index-BosqDOlH.js → index-lzqtyFU8.js} +1 -1
  208. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-CNp9QFCX.js → loader-circle-B7B9V-bu.js} +1 -1
  209. package/codeyam-cli/src/webserver/build/client/assets/{manifest-09d684be.js → manifest-2d191949.js} +1 -1
  210. package/codeyam-cli/src/webserver/build/client/assets/root-FHgpM6gc.js +56 -0
  211. package/codeyam-cli/src/webserver/build/client/assets/{search-DDGjYAMJ.js → search-CxXUmBSd.js} +1 -1
  212. package/codeyam-cli/src/webserver/build/client/assets/{settings-DgTyB-Wg.js → settings-6D8k8Jp5.js} +1 -1
  213. package/codeyam-cli/src/webserver/build/client/assets/simulations-CDJZnWhN.js +1 -0
  214. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-CBc5dE1s.js → triangle-alert-B6LgvRJg.js} +1 -1
  215. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-BMIGFP-m.js → useCustomSizes-Dv18q8LD.js} +1 -1
  216. package/codeyam-cli/src/webserver/build/client/assets/{useInteractiveMode-Dk_FQqWJ.js → useInteractiveMode-0ToGk4K3.js} +1 -1
  217. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BqPPNjAl.js → useLastLogLine-aSv48UbS.js} +1 -1
  218. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DsJbgMY9.js → useReportContext-1BX144Eg.js} +1 -1
  219. package/codeyam-cli/src/webserver/build/client/assets/{useToast-DWHcCcl1.js → useToast-mBRpZPiu.js} +1 -1
  220. package/codeyam-cli/src/webserver/build/server/assets/{index-CV6i1S1A.js → index-pU0o5t1o.js} +1 -1
  221. package/codeyam-cli/src/webserver/build/server/assets/server-build-YzfkRwdn.js +178 -0
  222. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  223. package/codeyam-cli/src/webserver/build-info.json +5 -5
  224. package/codeyam-cli/templates/codeyam-setup-skill.md +138 -3
  225. package/codeyam-cli/templates/debug-codeyam.md +7 -2
  226. package/package.json +5 -5
  227. package/packages/ai/src/lib/astScopes/processExpression.js +13 -1
  228. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  229. package/packages/ai/src/lib/checkAllAttributes.js +24 -9
  230. package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
  231. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +94 -18
  232. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  233. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +2 -1
  234. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  235. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +51 -23
  236. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
  237. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +70 -54
  238. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  239. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +11 -0
  240. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  241. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js +86 -0
  242. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js.map +1 -0
  243. package/packages/ai/src/lib/deepEqual.js +32 -0
  244. package/packages/ai/src/lib/deepEqual.js.map +1 -0
  245. package/packages/ai/src/lib/findMatchingAttribute.js +20 -16
  246. package/packages/ai/src/lib/findMatchingAttribute.js.map +1 -1
  247. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +168 -41
  248. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
  249. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +42 -1
  250. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +1 -1
  251. package/packages/ai/src/lib/generateChangesEntityScenarioData.js +59 -3
  252. package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
  253. package/packages/ai/src/lib/generateChangesEntityScenarios.js +6 -6
  254. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  255. package/packages/ai/src/lib/generateEntityScenarioData.js +32 -23
  256. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  257. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +20 -1
  258. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  259. package/packages/analyze/src/lib/FileAnalyzer.js +15 -0
  260. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  261. package/packages/analyze/src/lib/asts/nodes/index.js +1 -0
  262. package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
  263. package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js +52 -0
  264. package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js.map +1 -0
  265. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +59 -50
  266. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  267. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +6 -0
  268. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  269. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +2 -0
  270. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  271. package/packages/analyze/src/lib/files/analyzeChange.js +14 -4
  272. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  273. package/packages/analyze/src/lib/files/analyzeEntity.js +7 -6
  274. package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
  275. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +44 -10
  276. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  277. package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js +85 -0
  278. package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js.map +1 -0
  279. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +314 -52
  280. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  281. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js +97 -2
  282. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js.map +1 -1
  283. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +88 -52
  284. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  285. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +26 -98
  286. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
  287. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +141 -75
  288. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  289. package/packages/aws/src/lib/ecs/ecsDefineContainer.js +2 -2
  290. package/packages/aws/src/lib/ecs/ecsDefineContainer.js.map +1 -1
  291. package/packages/aws/src/lib/ecs/ecsTaskFactory.js +17 -61
  292. package/packages/aws/src/lib/ecs/ecsTaskFactory.js.map +1 -1
  293. package/packages/generate/index.js +3 -0
  294. package/packages/generate/index.js.map +1 -1
  295. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
  296. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  297. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +189 -0
  298. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
  299. package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
  300. package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
  301. package/packages/generate/src/lib/scenarioComponentForServer.js +89 -0
  302. package/packages/generate/src/lib/scenarioComponentForServer.js.map +1 -0
  303. package/packages/github/src/lib/loadOrCreateCommit.js +10 -0
  304. package/packages/github/src/lib/loadOrCreateCommit.js.map +1 -1
  305. package/packages/github/src/lib/syncPrimaryBranch.js +3 -0
  306. package/packages/github/src/lib/syncPrimaryBranch.js.map +1 -1
  307. package/packages/process/index.js +3 -0
  308. package/packages/process/index.js.map +1 -0
  309. package/packages/process/src/GlobalProcessManager.js.map +1 -0
  310. package/{background/src/lib/process → packages/process/src}/ProcessManager.js +1 -1
  311. package/packages/process/src/ProcessManager.js.map +1 -0
  312. package/packages/process/src/index.js.map +1 -0
  313. package/packages/process/src/managedExecAsync.js.map +1 -0
  314. package/analyzer-template/process/INTEGRATION_COMPLETE.md +0 -333
  315. package/analyzer-template/process/INTEGRATION_EXAMPLE.md +0 -525
  316. package/analyzer-template/process/README.md +0 -507
  317. package/background/src/lib/process/GlobalProcessManager.js.map +0 -1
  318. package/background/src/lib/process/ProcessManager.js.map +0 -1
  319. package/background/src/lib/process/index.js.map +0 -1
  320. package/background/src/lib/process/managedExecAsync.js.map +0 -1
  321. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +0 -238
  322. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +0 -1
  323. package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js +0 -7
  324. package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js.map +0 -1
  325. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-CUxUNEEC.js +0 -15
  326. package/codeyam-cli/src/webserver/build/client/assets/_index-DHImXdXq.js +0 -11
  327. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-2mG6mjVb.js +0 -32
  328. package/codeyam-cli/src/webserver/build/client/assets/chunk-JMJ3UQ3L-BambyYE_.js +0 -51
  329. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DyB90fWk.js +0 -1
  330. package/codeyam-cli/src/webserver/build/client/assets/globals-C6vQASxy.css +0 -1
  331. package/codeyam-cli/src/webserver/build/client/assets/root-BxJUvKau.js +0 -56
  332. package/codeyam-cli/src/webserver/build/client/assets/simulations-CoNWGt0K.js +0 -1
  333. package/codeyam-cli/src/webserver/build/server/assets/server-build-BDlyhfrv.js +0 -175
  334. /package/analyzer-template/{process → packages/process/src}/GlobalProcessManager.ts +0 -0
  335. /package/analyzer-template/{process → packages/process/src}/ProcessManager.ts +0 -0
  336. /package/analyzer-template/{process → packages/process/src}/index.ts +0 -0
  337. /package/analyzer-template/{process → packages/process/src}/managedExecAsync.ts +0 -0
  338. /package/{background/src/lib/process → packages/process/src}/GlobalProcessManager.js +0 -0
  339. /package/{background/src/lib/process → packages/process/src}/index.js +0 -0
  340. /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
- const dependencySchema = dependencySchemas?.[path]?.[entityName];
82
- const signatureSchema = dependencySchema?.signatureSchema;
83
- if (!signatureSchema) return;
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
- // Build a fallback mapping from parent's usageEquivalencies
92
- // This helps when the child's sourceEquivalencies don't have a mapping
93
- // For example, if parent passes `entity` to child's `signature[0]`,
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
- // Extract signature path from schemaPath
104
- // Format can be:
105
- // 1. "functionName(args).signature[N]" or "functionName(args).signature[N].property" (real data)
106
- // 2. "signature[N]" or "signature[N].property" (simplified/test format)
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: sortedUniqueKeyAttributes,
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 === existingStructure &&
63
- scenario.metadata.keyAttributeInstructions ===
64
- existingScenario.metadata.keyAttributeInstructions
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((arg) =>
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 \`dataStructurePath\` as key. Include variable name, instruction, AND a valueOptionRef that references which validValueOption you're using:
333
+ Use \`localVariable\` as key. Include instruction AND a valueOptionRef that references which validValueOption you're using:
325
334
  \`\`\`json
326
335
  {
327
- "useStatus().status": {
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
- "useData().notifications[]": {
365
- "localVariable": "notifications[]",
372
+ "notifications[]": {
366
373
  "instruction": "Empty array [] to show empty state",
367
374
  "valueOptionRef": { "index": 1, "refType": "exact" }
368
375
  }