@codeyam/codeyam-cli 0.1.0-staging.596f0eb → 0.1.0-staging.6e699e5

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 (696) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/common/execAsync.ts +1 -1
  3. package/analyzer-template/log.txt +3 -3
  4. package/analyzer-template/package.json +10 -6
  5. package/analyzer-template/packages/ai/index.ts +10 -3
  6. package/analyzer-template/packages/ai/package.json +1 -1
  7. package/analyzer-template/packages/ai/src/lib/__mocks__/completionCall.ts +122 -0
  8. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +128 -6
  9. package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
  10. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +138 -1
  11. package/analyzer-template/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.ts +644 -0
  12. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +140 -6
  13. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.ts +18 -0
  14. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.ts +38 -1
  15. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +181 -1
  16. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +1239 -104
  17. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +304 -0
  18. package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +29 -10
  19. package/analyzer-template/packages/ai/src/lib/completionCall.ts +216 -36
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1501 -138
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +2 -1
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +976 -0
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +243 -77
  24. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +19 -1
  25. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +103 -6
  26. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +23 -0
  27. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.ts +98 -0
  28. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +42 -2
  29. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
  30. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
  31. package/analyzer-template/packages/ai/src/lib/deepEqual.ts +30 -0
  32. package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
  33. package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
  34. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +74 -7
  35. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +89 -112
  36. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +6 -0
  37. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +1111 -91
  38. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +207 -104
  39. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +570 -0
  40. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +528 -0
  41. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1977 -0
  42. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
  43. package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +143 -31
  44. package/analyzer-template/packages/ai/src/lib/guessScenarioDataFromDescription.ts +8 -2
  45. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +276 -3
  46. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +33 -3
  47. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +7 -0
  48. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.ts +1 -1
  49. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +32 -102
  50. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
  51. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
  52. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +90 -6
  53. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +14 -53
  54. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.ts +58 -0
  55. package/analyzer-template/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.ts +28 -2
  56. package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
  57. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +812 -0
  58. package/analyzer-template/packages/ai/src/lib/splitOutsideParentheses.ts +5 -1
  59. package/analyzer-template/packages/ai/src/lib/validateExecutionFlowPaths.ts +531 -0
  60. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +123 -0
  61. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +8 -1
  62. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +14 -0
  63. package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
  64. package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +1 -0
  65. package/analyzer-template/packages/analyze/src/lib/asts/nodes/isAsyncFunction.ts +67 -0
  66. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +455 -267
  67. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +18 -0
  68. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +3 -0
  69. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -7
  70. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +31 -15
  71. package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +11 -7
  72. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +11 -12
  73. package/analyzer-template/packages/analyze/src/lib/files/enums/steps.ts +1 -1
  74. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +265 -0
  75. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.ts +102 -0
  76. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +588 -52
  77. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.ts +1 -1
  78. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.ts +28 -62
  79. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +336 -133
  80. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +156 -0
  81. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +78 -83
  82. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +4 -8
  83. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +461 -94
  84. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
  85. package/analyzer-template/packages/aws/codebuild/index.ts +1 -0
  86. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts +11 -1
  87. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts.map +1 -1
  88. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js +29 -18
  89. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js.map +1 -1
  90. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts +2 -2
  91. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts.map +1 -1
  92. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js +2 -2
  93. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js.map +1 -1
  94. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts +8 -18
  95. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts.map +1 -1
  96. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js +17 -61
  97. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js.map +1 -1
  98. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts +15 -0
  99. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.d.ts.map +1 -0
  100. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js +31 -0
  101. package/analyzer-template/packages/aws/dist/src/lib/s3/checkS3ObjectExists.js.map +1 -0
  102. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.d.ts.map +1 -1
  103. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js +8 -1
  104. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js.map +1 -1
  105. package/analyzer-template/packages/aws/package.json +3 -3
  106. package/analyzer-template/packages/aws/s3/index.ts +1 -0
  107. package/analyzer-template/packages/aws/src/lib/codebuild/waitForBuild.ts +43 -19
  108. package/analyzer-template/packages/aws/src/lib/ecs/ecsDefineContainer.ts +3 -3
  109. package/analyzer-template/packages/aws/src/lib/ecs/ecsTaskFactory.ts +17 -69
  110. package/analyzer-template/packages/aws/src/lib/s3/checkS3ObjectExists.ts +47 -0
  111. package/analyzer-template/packages/aws/src/lib/s3/uploadFileToS3.ts +8 -1
  112. package/analyzer-template/packages/database/src/lib/kysely/db.ts +4 -4
  113. package/analyzer-template/packages/database/src/lib/kysely/tableRelations.ts +2 -2
  114. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +36 -9
  115. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +7 -3
  116. package/analyzer-template/packages/generate/index.ts +3 -0
  117. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +17 -1
  118. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +193 -0
  119. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.ts +73 -0
  120. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +9 -4
  121. package/analyzer-template/packages/generate/src/lib/deepMerge.ts +26 -1
  122. package/analyzer-template/packages/generate/src/lib/scenarioComponentForServer.ts +114 -0
  123. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -2
  124. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +2 -2
  125. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tableRelations.d.ts +2 -2
  126. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts +1 -11
  127. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  128. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +30 -7
  129. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -1
  130. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
  131. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  132. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts +1 -0
  133. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts.map +1 -1
  134. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +2 -6
  135. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  136. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  137. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +7 -4
  138. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  139. package/analyzer-template/packages/github/dist/generate/index.d.ts +3 -0
  140. package/analyzer-template/packages/github/dist/generate/index.d.ts.map +1 -1
  141. package/analyzer-template/packages/github/dist/generate/index.js +3 -0
  142. package/analyzer-template/packages/github/dist/generate/index.js.map +1 -1
  143. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
  144. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
  145. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  146. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts +9 -0
  147. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -0
  148. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +189 -0
  149. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
  150. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts +20 -0
  151. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts.map +1 -0
  152. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
  153. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
  154. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  155. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
  156. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  157. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.d.ts.map +1 -1
  158. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js +27 -1
  159. package/analyzer-template/packages/github/dist/generate/src/lib/deepMerge.js.map +1 -1
  160. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts +8 -0
  161. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts.map +1 -0
  162. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js +89 -0
  163. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js.map +1 -0
  164. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.d.ts.map +1 -1
  165. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js +10 -0
  166. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js.map +1 -1
  167. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.d.ts.map +1 -1
  168. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js +3 -0
  169. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js.map +1 -1
  170. package/analyzer-template/packages/github/dist/types/index.d.ts +2 -2
  171. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  172. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  173. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +87 -13
  174. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  175. package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts +2 -0
  176. package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts.map +1 -1
  177. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +11 -6
  178. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  179. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +196 -0
  180. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  181. package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.d.ts +2 -0
  182. package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.d.ts.map +1 -1
  183. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  184. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
  185. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  186. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
  187. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  188. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
  189. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
  190. package/analyzer-template/packages/github/src/lib/loadOrCreateCommit.ts +14 -0
  191. package/analyzer-template/packages/github/src/lib/syncPrimaryBranch.ts +2 -0
  192. package/analyzer-template/packages/process/index.ts +2 -0
  193. package/analyzer-template/packages/process/package.json +12 -0
  194. package/analyzer-template/packages/process/tsconfig.json +8 -0
  195. package/analyzer-template/packages/types/index.ts +5 -0
  196. package/analyzer-template/packages/types/src/types/Analysis.ts +104 -13
  197. package/analyzer-template/packages/types/src/types/Entity.ts +2 -0
  198. package/analyzer-template/packages/types/src/types/Scenario.ts +11 -10
  199. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +224 -0
  200. package/analyzer-template/packages/types/src/types/StatementInfo.ts +2 -0
  201. package/analyzer-template/packages/ui-components/src/components/ScenarioDetailInteractiveView.tsx +23 -7
  202. package/analyzer-template/packages/utils/dist/types/index.d.ts +2 -2
  203. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  204. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  205. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +87 -13
  206. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  207. package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts +2 -0
  208. package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts.map +1 -1
  209. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +11 -6
  210. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  211. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +196 -0
  212. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  213. package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts +2 -0
  214. package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts.map +1 -1
  215. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  216. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js +25 -0
  217. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  218. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
  219. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  220. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
  221. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
  222. package/analyzer-template/packages/utils/src/lib/lightweightEntityExtractor.ts +27 -0
  223. package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
  224. package/analyzer-template/playwright/capture.ts +37 -18
  225. package/analyzer-template/playwright/getCodeYamInfo.ts +12 -7
  226. package/analyzer-template/playwright/takeElementScreenshot.ts +26 -11
  227. package/analyzer-template/playwright/takeScreenshot.ts +9 -7
  228. package/analyzer-template/playwright/waitForServer.ts +21 -6
  229. package/analyzer-template/project/analyzeBaselineCommit.ts +4 -0
  230. package/analyzer-template/project/analyzeBranchCommit.ts +4 -0
  231. package/analyzer-template/project/analyzeFileEntities.ts +4 -0
  232. package/analyzer-template/project/analyzeRegularCommit.ts +4 -0
  233. package/analyzer-template/project/constructMockCode.ts +1181 -160
  234. package/analyzer-template/project/controller/startController.ts +16 -1
  235. package/analyzer-template/project/executeLibraryFunctionDirect.ts +7 -3
  236. package/analyzer-template/project/mocks/analyzeFileMock.ts +8 -7
  237. package/analyzer-template/project/orchestrateCapture/KyselyAnalysisLoader.ts +3 -6
  238. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +82 -36
  239. package/analyzer-template/project/orchestrateCapture.ts +36 -3
  240. package/analyzer-template/project/reconcileMockDataKeys.ts +245 -2
  241. package/analyzer-template/project/runAnalysis.ts +11 -0
  242. package/analyzer-template/project/runMultiScenarioServer.ts +11 -10
  243. package/analyzer-template/project/serverOnlyModules.ts +194 -21
  244. package/analyzer-template/project/start.ts +26 -4
  245. package/analyzer-template/project/startScenarioCapture.ts +79 -41
  246. package/analyzer-template/project/writeMockDataTsx.ts +232 -57
  247. package/analyzer-template/project/writeScenarioClientWrapper.ts +21 -0
  248. package/analyzer-template/project/writeScenarioComponents.ts +769 -181
  249. package/analyzer-template/project/writeScenarioFiles.ts +26 -0
  250. package/analyzer-template/project/writeSimpleRoot.ts +13 -15
  251. package/analyzer-template/scripts/comboWorkerLoop.cjs +1 -0
  252. package/analyzer-template/scripts/defaultCmd.sh +9 -0
  253. package/analyzer-template/tsconfig.json +2 -1
  254. package/background/src/lib/local/createLocalAnalyzer.js +1 -29
  255. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  256. package/background/src/lib/local/execAsync.js +1 -1
  257. package/background/src/lib/local/execAsync.js.map +1 -1
  258. package/background/src/lib/virtualized/common/execAsync.js +1 -1
  259. package/background/src/lib/virtualized/common/execAsync.js.map +1 -1
  260. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +2 -1
  261. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  262. package/background/src/lib/virtualized/project/analyzeBranchCommit.js +2 -1
  263. package/background/src/lib/virtualized/project/analyzeBranchCommit.js.map +1 -1
  264. package/background/src/lib/virtualized/project/analyzeFileEntities.js +2 -1
  265. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  266. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +2 -1
  267. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  268. package/background/src/lib/virtualized/project/constructMockCode.js +1053 -124
  269. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  270. package/background/src/lib/virtualized/project/controller/startController.js +11 -1
  271. package/background/src/lib/virtualized/project/controller/startController.js.map +1 -1
  272. package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.js +6 -3
  273. package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.js.map +1 -1
  274. package/background/src/lib/virtualized/project/mocks/analyzeFileMock.js +7 -7
  275. package/background/src/lib/virtualized/project/mocks/analyzeFileMock.js.map +1 -1
  276. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js +3 -2
  277. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js.map +1 -1
  278. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +69 -32
  279. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  280. package/background/src/lib/virtualized/project/orchestrateCapture.js +27 -4
  281. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  282. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +204 -2
  283. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  284. package/background/src/lib/virtualized/project/runAnalysis.js +9 -0
  285. package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
  286. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +11 -9
  287. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  288. package/background/src/lib/virtualized/project/serverOnlyModules.js +163 -23
  289. package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -1
  290. package/background/src/lib/virtualized/project/start.js +21 -4
  291. package/background/src/lib/virtualized/project/start.js.map +1 -1
  292. package/background/src/lib/virtualized/project/startScenarioCapture.js +61 -31
  293. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  294. package/background/src/lib/virtualized/project/writeMockDataTsx.js +199 -50
  295. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  296. package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js +15 -0
  297. package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js.map +1 -0
  298. package/background/src/lib/virtualized/project/writeScenarioComponents.js +552 -125
  299. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  300. package/background/src/lib/virtualized/project/writeScenarioFiles.js +19 -0
  301. package/background/src/lib/virtualized/project/writeScenarioFiles.js.map +1 -1
  302. package/background/src/lib/virtualized/project/writeSimpleRoot.js +13 -13
  303. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  304. package/codeyam-cli/src/cli.js +7 -1
  305. package/codeyam-cli/src/cli.js.map +1 -1
  306. package/codeyam-cli/src/commands/analyze.js +1 -1
  307. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  308. package/codeyam-cli/src/commands/baseline.js +174 -0
  309. package/codeyam-cli/src/commands/baseline.js.map +1 -0
  310. package/codeyam-cli/src/commands/debug.js +40 -18
  311. package/codeyam-cli/src/commands/debug.js.map +1 -1
  312. package/codeyam-cli/src/commands/default.js +0 -15
  313. package/codeyam-cli/src/commands/default.js.map +1 -1
  314. package/codeyam-cli/src/commands/recapture.js +226 -0
  315. package/codeyam-cli/src/commands/recapture.js.map +1 -0
  316. package/codeyam-cli/src/commands/report.js +72 -24
  317. package/codeyam-cli/src/commands/report.js.map +1 -1
  318. package/codeyam-cli/src/commands/start.js +8 -12
  319. package/codeyam-cli/src/commands/start.js.map +1 -1
  320. package/codeyam-cli/src/commands/status.js +23 -1
  321. package/codeyam-cli/src/commands/status.js.map +1 -1
  322. package/codeyam-cli/src/commands/test-startup.js +1 -1
  323. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  324. package/codeyam-cli/src/commands/wipe.js +108 -0
  325. package/codeyam-cli/src/commands/wipe.js.map +1 -0
  326. package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js +81 -0
  327. package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js.map +1 -0
  328. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +31 -27
  329. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  330. package/codeyam-cli/src/utils/analysisRunner.js +8 -13
  331. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  332. package/codeyam-cli/src/utils/backgroundServer.js +14 -4
  333. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  334. package/codeyam-cli/src/utils/database.js +91 -5
  335. package/codeyam-cli/src/utils/database.js.map +1 -1
  336. package/codeyam-cli/src/utils/generateReport.js +253 -106
  337. package/codeyam-cli/src/utils/generateReport.js.map +1 -1
  338. package/codeyam-cli/src/utils/git.js +79 -0
  339. package/codeyam-cli/src/utils/git.js.map +1 -0
  340. package/codeyam-cli/src/utils/install-skills.js +31 -17
  341. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  342. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +38 -0
  343. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  344. package/codeyam-cli/src/utils/queue/job.js +245 -16
  345. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  346. package/codeyam-cli/src/utils/queue/manager.js +25 -7
  347. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  348. package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
  349. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  350. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +7 -5
  351. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  352. package/codeyam-cli/src/utils/versionInfo.js +25 -19
  353. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  354. package/codeyam-cli/src/utils/wipe.js +128 -0
  355. package/codeyam-cli/src/utils/wipe.js.map +1 -0
  356. package/codeyam-cli/src/webserver/app/lib/database.js +98 -1
  357. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  358. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  359. package/codeyam-cli/src/webserver/backgroundServer.js +5 -10
  360. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  361. package/codeyam-cli/src/webserver/bootstrap.js +49 -0
  362. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -0
  363. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-BXhEawa3.js +1 -0
  364. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-efWKDYMr.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
  365. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-Ba2JVPzP.js +41 -0
  366. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-C8lyxW9k.js +34 -0
  367. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-aht4aafF.js +25 -0
  368. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CVtiBnY5.js +3 -0
  369. package/codeyam-cli/src/webserver/build/client/assets/LoadingDots-B0GLXMsr.js +6 -0
  370. package/codeyam-cli/src/webserver/build/client/assets/LogViewer-xgeCVgSM.js +3 -0
  371. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-D4TZhLuw.js +21 -0
  372. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DuDvi0jm.js +1 -0
  373. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-DEx02QDa.js +10 -0
  374. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-COPstp9J.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
  375. package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
  376. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-DoLIqZX2.js +37 -0
  377. package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
  378. package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
  379. package/codeyam-cli/src/webserver/build/client/assets/api.rules-l0sNRNKZ.js +1 -0
  380. package/codeyam-cli/src/webserver/build/client/assets/chevron-down-Cx24_aWc.js +6 -0
  381. package/codeyam-cli/src/webserver/build/client/assets/chunk-EPOLDU6W-CXRTFQ3F.js +51 -0
  382. package/codeyam-cli/src/webserver/build/client/assets/circle-check-BOARzkeR.js +6 -0
  383. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BdhJEx6B.js +21 -0
  384. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-C1gnJVOL.svg → cy-logo-cli-CCKUIm0S.svg} +2 -2
  385. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +1 -0
  386. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BRb-0kQl.js +1 -0
  387. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-C2N4Op8e.js +23 -0
  388. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js +6 -0
  389. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D1T4TGjf.js +6 -0
  390. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-CTBG2mmz.js +5 -0
  391. package/codeyam-cli/src/webserver/build/client/assets/entry.client-CS2cb_eZ.js +29 -0
  392. package/codeyam-cli/src/webserver/build/client/assets/executionFlowCoverage-BWhdfn70.js +1 -0
  393. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DMJ7zii9.js +1 -0
  394. package/codeyam-cli/src/webserver/build/client/assets/files-Cs4MdYtv.js +1 -0
  395. package/codeyam-cli/src/webserver/build/client/assets/git-B4RJRvYB.js +15 -0
  396. package/codeyam-cli/src/webserver/build/client/assets/git-commit-horizontal-CysbcZxi.js +6 -0
  397. package/codeyam-cli/src/webserver/build/client/assets/globals-DMUaGAqV.css +1 -0
  398. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-fmIEn3Bc.js +9 -0
  399. package/codeyam-cli/src/webserver/build/client/assets/index-B1h680n5.js +9 -0
  400. package/codeyam-cli/src/webserver/build/client/assets/index-lzqtyFU8.js +3 -0
  401. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-B7B9V-bu.js +6 -0
  402. package/codeyam-cli/src/webserver/build/client/assets/manifest-f874c610.js +1 -0
  403. package/codeyam-cli/src/webserver/build/client/assets/preload-helper-ckwbz45p.js +1 -0
  404. package/codeyam-cli/src/webserver/build/client/assets/root-Bz5TunQg.js +57 -0
  405. package/codeyam-cli/src/webserver/build/client/assets/rules-hEkvVw2-.js +97 -0
  406. package/codeyam-cli/src/webserver/build/client/assets/scenarioStatus-B_8jpV3e.js +1 -0
  407. package/codeyam-cli/src/webserver/build/client/assets/search-CxXUmBSd.js +6 -0
  408. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +1 -0
  409. package/codeyam-cli/src/webserver/build/client/assets/simulations-DwFIBT09.js +1 -0
  410. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-B6LgvRJg.js +6 -0
  411. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-C1v1PQzo.js +1 -0
  412. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-3pmpUQB-.js → useLastLogLine-aSv48UbS.js} +1 -1
  413. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DYxHZQuP.js +1 -0
  414. package/codeyam-cli/src/webserver/build/client/assets/{useToast-DEyawJ8r.js → useToast-mBRpZPiu.js} +1 -1
  415. package/codeyam-cli/src/webserver/build/server/assets/index-967OuJoF.js +1 -0
  416. package/codeyam-cli/src/webserver/build/server/assets/server-build-DRTmerg9.js +257 -0
  417. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  418. package/codeyam-cli/src/webserver/build-info.json +5 -5
  419. package/codeyam-cli/src/webserver/devServer.js +1 -3
  420. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  421. package/codeyam-cli/src/webserver/server.js +35 -25
  422. package/codeyam-cli/src/webserver/server.js.map +1 -1
  423. package/codeyam-cli/templates/codeyam-power-rules-hook.sh +200 -0
  424. package/codeyam-cli/templates/{codeyam-debug-skill.md → codeyam:debug.md} +48 -4
  425. package/codeyam-cli/templates/codeyam:diagnose.md +650 -0
  426. package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
  427. package/codeyam-cli/templates/codeyam:power-rules.md +447 -0
  428. package/codeyam-cli/templates/{codeyam-setup-skill.md → codeyam:setup.md} +139 -4
  429. package/codeyam-cli/templates/{codeyam-sim-skill.md → codeyam:sim.md} +1 -1
  430. package/codeyam-cli/templates/{codeyam-test-skill.md → codeyam:test.md} +1 -1
  431. package/codeyam-cli/templates/{codeyam-verify-skill.md → codeyam:verify.md} +1 -1
  432. package/package.json +17 -16
  433. package/packages/ai/index.js +5 -4
  434. package/packages/ai/index.js.map +1 -1
  435. package/packages/ai/src/lib/analyzeScope.js +99 -0
  436. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  437. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
  438. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
  439. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +100 -1
  440. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  441. package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js +435 -0
  442. package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js.map +1 -0
  443. package/packages/ai/src/lib/astScopes/methodSemantics.js +97 -6
  444. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  445. package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js +8 -0
  446. package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js.map +1 -1
  447. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js +23 -0
  448. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js.map +1 -1
  449. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +138 -1
  450. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
  451. package/packages/ai/src/lib/astScopes/processExpression.js +945 -87
  452. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  453. package/packages/ai/src/lib/checkAllAttributes.js +24 -9
  454. package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
  455. package/packages/ai/src/lib/completionCall.js +178 -31
  456. package/packages/ai/src/lib/completionCall.js.map +1 -1
  457. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1198 -82
  458. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  459. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +2 -1
  460. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  461. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +661 -0
  462. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -0
  463. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +180 -56
  464. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  465. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +16 -1
  466. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  467. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +86 -4
  468. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  469. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +20 -0
  470. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  471. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js +86 -0
  472. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js.map +1 -0
  473. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +34 -3
  474. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  475. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
  476. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
  477. package/packages/ai/src/lib/dataStructureChunking.js +111 -0
  478. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
  479. package/packages/ai/src/lib/deepEqual.js +32 -0
  480. package/packages/ai/src/lib/deepEqual.js.map +1 -0
  481. package/packages/ai/src/lib/e2eDataTracking.js +241 -0
  482. package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
  483. package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
  484. package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
  485. package/packages/ai/src/lib/generateChangesEntityScenarioData.js +62 -5
  486. package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
  487. package/packages/ai/src/lib/generateChangesEntityScenarios.js +81 -90
  488. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  489. package/packages/ai/src/lib/generateEntityDataStructure.js +5 -0
  490. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  491. package/packages/ai/src/lib/generateEntityScenarioData.js +904 -84
  492. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  493. package/packages/ai/src/lib/generateEntityScenarios.js +186 -82
  494. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  495. package/packages/ai/src/lib/generateExecutionFlows.js +392 -0
  496. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -0
  497. package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js +380 -0
  498. package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js.map +1 -0
  499. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +1440 -0
  500. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -0
  501. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
  502. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
  503. package/packages/ai/src/lib/getConditionalUsagesFromCode.js +84 -14
  504. package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
  505. package/packages/ai/src/lib/guessScenarioDataFromDescription.js +2 -1
  506. package/packages/ai/src/lib/guessScenarioDataFromDescription.js.map +1 -1
  507. package/packages/ai/src/lib/isolateScopes.js +231 -4
  508. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  509. package/packages/ai/src/lib/mergeStatements.js +26 -3
  510. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  511. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +6 -0
  512. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  513. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +1 -1
  514. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
  515. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +21 -64
  516. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  517. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
  518. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
  519. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +68 -6
  520. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  521. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +10 -34
  522. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
  523. package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js +45 -0
  524. package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js.map +1 -0
  525. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js +16 -3
  526. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js.map +1 -1
  527. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
  528. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
  529. package/packages/ai/src/lib/resolvePathToControllable.js +667 -0
  530. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -0
  531. package/packages/ai/src/lib/splitOutsideParentheses.js +3 -1
  532. package/packages/ai/src/lib/splitOutsideParentheses.js.map +1 -1
  533. package/packages/ai/src/lib/worker/SerializableDataStructure.js +29 -0
  534. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  535. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +4 -0
  536. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  537. package/packages/analyze/src/lib/FileAnalyzer.js +15 -0
  538. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  539. package/packages/analyze/src/lib/analysisContext.js +30 -5
  540. package/packages/analyze/src/lib/analysisContext.js.map +1 -1
  541. package/packages/analyze/src/lib/asts/nodes/index.js +1 -0
  542. package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
  543. package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js +52 -0
  544. package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js.map +1 -0
  545. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +218 -50
  546. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  547. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +10 -0
  548. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  549. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +2 -0
  550. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  551. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -7
  552. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  553. package/packages/analyze/src/lib/files/analyzeChange.js +21 -11
  554. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  555. package/packages/analyze/src/lib/files/analyzeEntity.js +9 -8
  556. package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
  557. package/packages/analyze/src/lib/files/analyzeInitial.js +9 -10
  558. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  559. package/packages/analyze/src/lib/files/enums/steps.js +1 -1
  560. package/packages/analyze/src/lib/files/enums/steps.js.map +1 -1
  561. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +209 -0
  562. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -0
  563. package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js +85 -0
  564. package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js.map +1 -0
  565. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +458 -48
  566. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  567. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js +1 -1
  568. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarioData.js.map +1 -1
  569. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js +29 -34
  570. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js.map +1 -1
  571. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +264 -78
  572. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  573. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +96 -0
  574. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -0
  575. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +56 -69
  576. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
  577. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +4 -8
  578. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
  579. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +372 -89
  580. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  581. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
  582. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
  583. package/packages/aws/src/lib/ecs/ecsDefineContainer.js +2 -2
  584. package/packages/aws/src/lib/ecs/ecsDefineContainer.js.map +1 -1
  585. package/packages/aws/src/lib/ecs/ecsTaskFactory.js +17 -61
  586. package/packages/aws/src/lib/ecs/ecsTaskFactory.js.map +1 -1
  587. package/packages/database/src/lib/kysely/db.js +2 -2
  588. package/packages/database/src/lib/kysely/tables/debugReportsTable.js +9 -3
  589. package/packages/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  590. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +7 -4
  591. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  592. package/packages/generate/index.js +3 -0
  593. package/packages/generate/index.js.map +1 -1
  594. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
  595. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  596. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +189 -0
  597. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
  598. package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
  599. package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
  600. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +8 -4
  601. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  602. package/packages/generate/src/lib/deepMerge.js +27 -1
  603. package/packages/generate/src/lib/deepMerge.js.map +1 -1
  604. package/packages/generate/src/lib/scenarioComponentForServer.js +89 -0
  605. package/packages/generate/src/lib/scenarioComponentForServer.js.map +1 -0
  606. package/packages/github/src/lib/loadOrCreateCommit.js +10 -0
  607. package/packages/github/src/lib/loadOrCreateCommit.js.map +1 -1
  608. package/packages/github/src/lib/syncPrimaryBranch.js +3 -0
  609. package/packages/github/src/lib/syncPrimaryBranch.js.map +1 -1
  610. package/packages/process/index.js +3 -0
  611. package/packages/process/index.js.map +1 -0
  612. package/packages/process/src/GlobalProcessManager.js.map +1 -0
  613. package/{background/src/lib/process → packages/process/src}/ProcessManager.js +1 -1
  614. package/packages/process/src/ProcessManager.js.map +1 -0
  615. package/packages/process/src/index.js.map +1 -0
  616. package/packages/process/src/managedExecAsync.js.map +1 -0
  617. package/packages/types/index.js.map +1 -1
  618. package/packages/utils/src/lib/lightweightEntityExtractor.js +25 -0
  619. package/packages/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  620. package/packages/utils/src/lib/safeFileName.js +29 -3
  621. package/packages/utils/src/lib/safeFileName.js.map +1 -1
  622. package/scripts/finalize-analyzer.cjs +6 -4
  623. package/analyzer-template/packages/ai/src/lib/findMatchingAttribute.ts +0 -102
  624. package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +0 -197
  625. package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +0 -271
  626. package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +0 -294
  627. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.ts +0 -67
  628. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +0 -115
  629. package/analyzer-template/process/INTEGRATION_COMPLETE.md +0 -333
  630. package/analyzer-template/process/INTEGRATION_EXAMPLE.md +0 -525
  631. package/analyzer-template/process/README.md +0 -507
  632. package/background/src/lib/process/GlobalProcessManager.js.map +0 -1
  633. package/background/src/lib/process/ProcessManager.js.map +0 -1
  634. package/background/src/lib/process/index.js.map +0 -1
  635. package/background/src/lib/process/managedExecAsync.js.map +0 -1
  636. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +0 -238
  637. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +0 -1
  638. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-CVbSvOjo.js +0 -1
  639. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-DcwcHyl5.js +0 -1
  640. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-WgwC1GfJ.js +0 -26
  641. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-IEKom9O2.js +0 -3
  642. package/codeyam-cli/src/webserver/build/client/assets/LogViewer-BYnfxbUG.js +0 -3
  643. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-_lBPJCzG.js +0 -1
  644. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-lHVhvsu_.js +0 -1
  645. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-d_TBk4GQ.js +0 -5
  646. package/codeyam-cli/src/webserver/build/client/assets/_index-kGT7VUqj.js +0 -1
  647. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-DDGmhu7P.js +0 -7
  648. package/codeyam-cli/src/webserver/build/client/assets/chevron-down-n_HPRfM_.js +0 -1
  649. package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-CbVoyx1U.js +0 -26
  650. package/codeyam-cli/src/webserver/build/client/assets/circle-check-D1VOYveA.js +0 -1
  651. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-YR8jjAlu.js +0 -1
  652. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-B8vP3V_s.js +0 -1
  653. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-CN6aLCT1.js +0 -16
  654. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DA5Jeu2P.js +0 -1
  655. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-BTeitalf.js +0 -5
  656. package/codeyam-cli/src/webserver/build/client/assets/entry.client-du6UEYD-.js +0 -13
  657. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-BpjkhMoi.js +0 -1
  658. package/codeyam-cli/src/webserver/build/client/assets/files-BQGvk4lJ.js +0 -1
  659. package/codeyam-cli/src/webserver/build/client/assets/git-DVdYRT-I.js +0 -12
  660. package/codeyam-cli/src/webserver/build/client/assets/globals-CO-U8Bpo.css +0 -1
  661. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +0 -5
  662. package/codeyam-cli/src/webserver/build/client/assets/index-DCG-vks0.js +0 -1
  663. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-GazdNeLl.js +0 -1
  664. package/codeyam-cli/src/webserver/build/client/assets/manifest-0b694d28.js +0 -1
  665. package/codeyam-cli/src/webserver/build/client/assets/root-D3tQP7hx.js +0 -16
  666. package/codeyam-cli/src/webserver/build/client/assets/search-CIY6XmtE.js +0 -1
  667. package/codeyam-cli/src/webserver/build/client/assets/server-build-CMKNK2uU.css +0 -1
  668. package/codeyam-cli/src/webserver/build/client/assets/settings-CoMDgElu.js +0 -1
  669. package/codeyam-cli/src/webserver/build/client/assets/simulations-agkniXp2.js +0 -1
  670. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-B2VUcygF.js +0 -1
  671. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-EvdK-zXP.js +0 -1
  672. package/codeyam-cli/src/webserver/build/server/assets/index-DGVHQEXD.js +0 -1
  673. package/codeyam-cli/src/webserver/build/server/assets/server-build-CghkTkIL.js +0 -166
  674. package/codeyam-cli/templates/debug-command.md +0 -303
  675. package/packages/ai/src/lib/findMatchingAttribute.js +0 -77
  676. package/packages/ai/src/lib/findMatchingAttribute.js.map +0 -1
  677. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +0 -136
  678. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +0 -1
  679. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +0 -220
  680. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +0 -1
  681. package/packages/ai/src/lib/generateEntityKeyAttributes.js +0 -241
  682. package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +0 -1
  683. package/packages/ai/src/lib/isFrontend.js +0 -5
  684. package/packages/ai/src/lib/isFrontend.js.map +0 -1
  685. package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js +0 -40
  686. package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js.map +0 -1
  687. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +0 -72
  688. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +0 -1
  689. /package/analyzer-template/{process → packages/process/src}/GlobalProcessManager.ts +0 -0
  690. /package/analyzer-template/{process → packages/process/src}/ProcessManager.ts +0 -0
  691. /package/analyzer-template/{process → packages/process/src}/index.ts +0 -0
  692. /package/analyzer-template/{process → packages/process/src}/managedExecAsync.ts +0 -0
  693. /package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CMKNK2uU.css → styles-CMKNK2uU.css} +0 -0
  694. /package/{background/src/lib/process → packages/process/src}/GlobalProcessManager.js +0 -0
  695. /package/{background/src/lib/process → packages/process/src}/index.js +0 -0
  696. /package/{background/src/lib/process → packages/process/src}/managedExecAsync.js +0 -0
@@ -0,0 +1,812 @@
1
+ /**
2
+ * Resolves a local variable path to a controllable data source path.
3
+ *
4
+ * This is used for deterministic execution flow generation from static analysis.
5
+ * A path is "controllable" if it maps to an entry in attributesMap, meaning
6
+ * we can mock that data during scenario simulation.
7
+ *
8
+ * Resolution strategy:
9
+ * 1. Direct match in attributesMap
10
+ * 2. Normalized match (array indices [N] → [])
11
+ * 3. Full-to-short map lookup
12
+ * 4. Equivalent variable resolution (trace local vars to data sources)
13
+ */
14
+
15
+ import {
16
+ splitOutsideParenthesesAndArrays,
17
+ joinParenthesesAndArrays,
18
+ } from './splitOutsideParentheses';
19
+ import cleanPathOfNonTransformingFunctions from './dataStructure/helpers/cleanPathOfNonTransformingFunctions';
20
+
21
+ export interface PathResolutionResult {
22
+ /** The resolved controllable path, or null if not controllable */
23
+ resolvedPath: string | null;
24
+ /** Chain showing how the path was resolved (for debugging) */
25
+ resolutionChain: string[];
26
+ /** Whether this path is controllable (can be mocked) */
27
+ isControllable: boolean;
28
+ }
29
+
30
+ /**
31
+ * Extract the local variable name from a path.
32
+ *
33
+ * Handles patterns like:
34
+ * - "debugFetcher.state" → "debugFetcher"
35
+ * - "EntityDetail.showModal" → "showModal" (strips component prefix)
36
+ * - "isLoading" → "isLoading"
37
+ */
38
+ function extractLocalVariableName(path: string): string {
39
+ const parts = path.split('.');
40
+
41
+ if (parts.length >= 2) {
42
+ // Check if first part looks like a component name (PascalCase)
43
+ const firstPart = parts[0];
44
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(firstPart)) {
45
+ // Return the second part as the variable name
46
+ return parts[1];
47
+ }
48
+ }
49
+
50
+ // Otherwise return the first part
51
+ return parts[0];
52
+ }
53
+
54
+ /**
55
+ * Resolve a compound path by replacing the local variable with its data source.
56
+ *
57
+ * When the data source is a function call (ends with `()`), we insert
58
+ * `.functionCallReturnValue.` to match how paths are stored in the data structure.
59
+ *
60
+ * Examples:
61
+ * - ("debugFetcher.state", "debugFetcher", "useFetcher<...>()")
62
+ * → "useFetcher<...>().functionCallReturnValue.state"
63
+ * - ("debugFetcher.data.success", "debugFetcher", "useFetcher<...>()")
64
+ * → "useFetcher<...>().functionCallReturnValue.data.success"
65
+ */
66
+ function resolveCompoundPath(
67
+ originalPath: string,
68
+ localVarName: string,
69
+ dataSourceBase: string,
70
+ ): string {
71
+ // Find where the local variable appears in the path
72
+ const varIndex = originalPath.indexOf(localVarName);
73
+ if (varIndex === -1) {
74
+ // If the data source is a function call, we need .functionCallReturnValue
75
+ if (dataSourceBase.endsWith('()')) {
76
+ return dataSourceBase + '.functionCallReturnValue';
77
+ }
78
+ return dataSourceBase;
79
+ }
80
+
81
+ // Get the suffix after the local variable name
82
+ const afterVar = originalPath.slice(varIndex + localVarName.length);
83
+
84
+ // If the data source is a function call, insert .functionCallReturnValue
85
+ if (dataSourceBase.endsWith('()')) {
86
+ return dataSourceBase + '.functionCallReturnValue' + afterVar;
87
+ }
88
+
89
+ // If there's no suffix, just return the data source
90
+ if (!afterVar || afterVar === '') {
91
+ return dataSourceBase;
92
+ }
93
+
94
+ // Otherwise just combine them directly
95
+ return dataSourceBase + afterVar;
96
+ }
97
+
98
+ /**
99
+ * Check if a type indicates an array.
100
+ * Returns true for "array", "Array", or types ending with "[]" like "User[]"
101
+ */
102
+ function isArrayType(type: string): boolean {
103
+ return (
104
+ type === 'array' ||
105
+ type === 'Array' ||
106
+ type.endsWith('[]') ||
107
+ type.startsWith('Array<')
108
+ );
109
+ }
110
+
111
+ /**
112
+ * Check if a path is an array.length access and return the base array path if so.
113
+ * Returns null if not an array.length pattern.
114
+ *
115
+ * Fix 27: Also checks via fullToShortPathMap for translated child paths.
116
+ * Uses path splitting utilities instead of string matching for robustness.
117
+ */
118
+ function getArrayBaseIfLengthAccess(
119
+ path: string,
120
+ attributesMap: Record<string, string>,
121
+ fullToShortPathMap?: Record<string, string>,
122
+ ): string | null {
123
+ // Use path splitting to detect .length access properly
124
+ const pathParts = splitOutsideParenthesesAndArrays(path);
125
+ if (pathParts.length === 0 || pathParts[pathParts.length - 1] !== 'length') {
126
+ return null;
127
+ }
128
+
129
+ // Get the base path (everything except the last 'length' part)
130
+ const basePath = joinParenthesesAndArrays(pathParts.slice(0, -1));
131
+
132
+ // Clean the base path of non-transforming functions (e.g., .filter())
133
+ // This handles cases like scenarios.filter(cyScope()).length
134
+ const cleanedBasePath = cleanPathOfNonTransformingFunctions(basePath);
135
+
136
+ // Helper to check if a path is in attributesMap with array type
137
+ const checkArrayInAttributesMap = (pathToCheck: string): string | null => {
138
+ // Direct match
139
+ if (pathToCheck in attributesMap) {
140
+ const type = attributesMap[pathToCheck];
141
+ if (isArrayType(type)) {
142
+ return pathToCheck;
143
+ }
144
+ }
145
+ // Normalized match (array indices [N] → [])
146
+ const normalizedPath = pathToCheck.replace(/\[\d+\]/g, '[]');
147
+ if (normalizedPath !== pathToCheck && normalizedPath in attributesMap) {
148
+ const type = attributesMap[normalizedPath];
149
+ if (isArrayType(type)) {
150
+ return normalizedPath;
151
+ }
152
+ }
153
+ // Try with [] suffix (for filter/sort/etc methods that operate on arrays)
154
+ // cleanPathOfNonTransformingFunctions may strip the method but not add []
155
+ if (!pathToCheck.endsWith('[]')) {
156
+ const pathWithArray = pathToCheck + '[]';
157
+ if (pathWithArray in attributesMap) {
158
+ const type = attributesMap[pathWithArray];
159
+ if (isArrayType(type)) {
160
+ return pathWithArray;
161
+ }
162
+ }
163
+ }
164
+ return null;
165
+ };
166
+
167
+ // Check base path directly
168
+ const directResult = checkArrayInAttributesMap(basePath);
169
+ if (directResult) return directResult;
170
+
171
+ // Check cleaned path (with non-transforming functions removed)
172
+ if (cleanedBasePath !== basePath) {
173
+ const cleanedResult = checkArrayInAttributesMap(cleanedBasePath);
174
+ if (cleanedResult) return cleanedResult;
175
+ }
176
+
177
+ // Fix 27: Check via fullToShortPathMap
178
+ if (fullToShortPathMap) {
179
+ // Try both basePath and cleanedBasePath
180
+ const pathsToTry = [basePath];
181
+ if (cleanedBasePath !== basePath) {
182
+ pathsToTry.push(cleanedBasePath);
183
+ }
184
+
185
+ for (const pathToCheck of pathsToTry) {
186
+ // Direct match in fullToShortPathMap
187
+ if (pathToCheck in fullToShortPathMap) {
188
+ const shortPath = fullToShortPathMap[pathToCheck];
189
+ const shortResult = checkArrayInAttributesMap(shortPath);
190
+ if (shortResult) return basePath; // Return original basePath for context
191
+ }
192
+
193
+ // Fix 30: Find prefix match in fullToShortPathMap
194
+ const fullPathKeys = Object.keys(fullToShortPathMap);
195
+ for (const fullPath of fullPathKeys) {
196
+ if (pathToCheck.startsWith(fullPath + '.')) {
197
+ const suffix = pathToCheck.slice(fullPath.length);
198
+ const shortBase = fullToShortPathMap[fullPath];
199
+ const shortPath = shortBase + suffix;
200
+
201
+ const shortResult = checkArrayInAttributesMap(shortPath);
202
+ if (shortResult) return basePath; // Return original basePath for context
203
+ }
204
+ }
205
+ }
206
+ }
207
+
208
+ return null;
209
+ }
210
+
211
+ /**
212
+ * Check if a path exists in the attributes map (directly or normalized).
213
+ */
214
+ function findInAttributesMap(
215
+ path: string,
216
+ attributesMap: Record<string, string>,
217
+ ): string | null {
218
+ // Direct match
219
+ if (path in attributesMap) {
220
+ return path;
221
+ }
222
+
223
+ // Normalized match (array indices [N] → [])
224
+ const normalizedPath = path.replace(/\[\d+\]/g, '[]');
225
+ if (normalizedPath !== path && normalizedPath in attributesMap) {
226
+ return normalizedPath;
227
+ }
228
+
229
+ // Fix 33: If path ends with [] (array element access), check if base path is an array
230
+ // This handles cases like `segments[]` where `segments` is in attributesMap as an array
231
+ if (path.endsWith('[]')) {
232
+ const basePath = path.slice(0, -2); // Remove trailing []
233
+ if (basePath in attributesMap) {
234
+ const type = attributesMap[basePath];
235
+ // Check if the base is an array type
236
+ if (isArrayType(type) || type === 'unknown' || type === 'string') {
237
+ // For arrays/strings, element access is controllable
238
+ return path;
239
+ }
240
+ }
241
+ }
242
+
243
+ // Fix 33: If path ends with [N] (specific array index), check if base path is an array
244
+ // This handles cases like `segments[0]` where `segments` is in attributesMap as an array
245
+ const arrayIndexMatch = path.match(/^(.+)\[\d+\]$/);
246
+ if (arrayIndexMatch) {
247
+ const basePath = arrayIndexMatch[1];
248
+ if (basePath in attributesMap) {
249
+ const type = attributesMap[basePath];
250
+ // Check if the base is an array type
251
+ if (isArrayType(type) || type === 'unknown' || type === 'string') {
252
+ // For arrays/strings, element access is controllable
253
+ // Return the normalized path for consistency
254
+ return normalizedPath;
255
+ }
256
+ }
257
+ }
258
+
259
+ return null;
260
+ }
261
+
262
+ /**
263
+ * Fix 35: Check if a path is controllable because a PREFIX of it is controllable.
264
+ *
265
+ * When child components access nested properties on a prop passed from parent,
266
+ * the parent's attributesMap might only contain the base path (e.g., "scenarios[]")
267
+ * but the child uses a nested path (e.g., "scenarios[].metadata.screenshotPaths[]").
268
+ *
269
+ * Since nested properties of controllable objects are also controllable,
270
+ * we should recognize that "scenarios[].metadata.screenshotPaths[]" is controllable
271
+ * if "scenarios[]" is controllable with an object/array type.
272
+ *
273
+ * @param path - The full path to check (e.g., "scenarios[].metadata.screenshotPaths[]")
274
+ * @param attributesMap - Map of controllable paths to their types
275
+ * @param fullToShortPathMap - Map from full paths to short paths
276
+ * @returns The full path if controllable via prefix, null otherwise
277
+ */
278
+ function findControllablePrefix(
279
+ path: string,
280
+ attributesMap: Record<string, string>,
281
+ fullToShortPathMap?: Record<string, string>,
282
+ ): string | null {
283
+ // Normalize array indices for matching
284
+ const normalizedPath = path.replace(/\[\d+\]/g, '[]');
285
+
286
+ // First, try to find a short version of the path using fullToShortPathMap
287
+ // The path might be "useLoaderData...scenarios[].metadata.screenshotPaths[]"
288
+ // We need to find "currentEntityAnalysis.scenarios[]" in attributesMap
289
+
290
+ // Try to find the longest matching prefix in fullToShortPathMap
291
+ let shortenedPath = normalizedPath;
292
+ if (fullToShortPathMap) {
293
+ for (const [fullPath, shortPath] of Object.entries(fullToShortPathMap)) {
294
+ // Check if normalizedPath starts with this fullPath
295
+ if (normalizedPath.startsWith(fullPath)) {
296
+ // Replace the prefix with the short version
297
+ const suffix = normalizedPath.slice(fullPath.length);
298
+ shortenedPath = shortPath + suffix;
299
+ break;
300
+ }
301
+ }
302
+ }
303
+
304
+ // Now check prefixes on the shortened path
305
+ const pathToCheck = shortenedPath;
306
+
307
+ // Split the path into parts by . and []
308
+ // e.g., "scenarios[].metadata.screenshotPaths[]" → ["scenarios[]", "metadata", "screenshotPaths[]"]
309
+ const parts: string[] = [];
310
+ let current = '';
311
+ for (let i = 0; i < pathToCheck.length; i++) {
312
+ const char = pathToCheck[i];
313
+ if (char === '.') {
314
+ if (current) parts.push(current);
315
+ current = '';
316
+ } else if (char === '[') {
317
+ // Include the bracket notation in the current part
318
+ const bracketEnd = pathToCheck.indexOf(']', i);
319
+ if (bracketEnd !== -1) {
320
+ current += pathToCheck.slice(i, bracketEnd + 1);
321
+ i = bracketEnd;
322
+ } else {
323
+ current += char;
324
+ }
325
+ } else {
326
+ current += char;
327
+ }
328
+ }
329
+ if (current) parts.push(current);
330
+
331
+ // Try progressively shorter prefixes
332
+ // e.g., "scenarios[].metadata.screenshotPaths[]" → "scenarios[].metadata" → "scenarios[]"
333
+ for (let i = parts.length - 1; i >= 1; i--) {
334
+ const prefix = parts.slice(0, i).join('.');
335
+
336
+ // Check direct match in attributesMap
337
+ if (prefix in attributesMap) {
338
+ const type = attributesMap[prefix];
339
+
340
+ // For objects, arrays, or unknown types, nested property access is controllable
341
+ if (
342
+ isArrayType(type) ||
343
+ type === 'object' ||
344
+ type === 'unknown' ||
345
+ type.endsWith('[]') ||
346
+ type.includes('<') // Generic types like Scenario[] or Record<...>
347
+ ) {
348
+ return path; // Return the original path (not normalized) as controllable
349
+ }
350
+ }
351
+ }
352
+
353
+ return null;
354
+ }
355
+
356
+ /**
357
+ * Fix 34: Find a controllable base path for derived paths.
358
+ *
359
+ * Paths like "useParams().functionCallReturnValue.*.split('/').filter(Boolean)[0]"
360
+ * are derived from "useParams().functionCallReturnValue.*" via string methods.
361
+ * This function strips string method calls to find the controllable base.
362
+ *
363
+ * String methods that create derived paths:
364
+ * - .split(...) → returns array of strings
365
+ * - .filter(...) → returns filtered array
366
+ * - .slice(...) → returns sliced array/string
367
+ * - .map(...) → returns transformed array
368
+ * - .find(...) → returns single element
369
+ * - .trim(), .toLowerCase(), .toUpperCase() → returns modified string
370
+ *
371
+ * @param path - The full derived path
372
+ * @param attributesMap - Map of controllable paths
373
+ * @returns The controllable base path if found, null otherwise
374
+ */
375
+ function findControllableBaseForDerivedPath(
376
+ path: string,
377
+ attributesMap: Record<string, string>,
378
+ ): string | null {
379
+ // Helper to check if a path is in attributesMap
380
+ const checkInAttributesMap = (pathToCheck: string): string | null => {
381
+ // Direct match
382
+ if (pathToCheck in attributesMap) {
383
+ return pathToCheck;
384
+ }
385
+
386
+ // Normalized match (array indices [N] → [])
387
+ const normalizedPath = pathToCheck.replace(/\[\d+\]/g, '[]');
388
+ if (normalizedPath !== pathToCheck && normalizedPath in attributesMap) {
389
+ return normalizedPath;
390
+ }
391
+
392
+ return null;
393
+ };
394
+
395
+ // Use cleanPathOfNonTransformingFunctions to strip non-transforming methods
396
+ // like .filter(), .sort(), .slice() etc. This handles all method calls generically
397
+ // without hardcoding specific method names.
398
+ const cleanedPath = cleanPathOfNonTransformingFunctions(path);
399
+
400
+ // Check the cleaned path directly (even if unchanged, later steps may find something)
401
+ const directResult = checkInAttributesMap(cleanedPath);
402
+ if (directResult) {
403
+ return directResult;
404
+ }
405
+
406
+ // Fix 38: For controllability purposes, strip ALL derivation operations
407
+ // including transforming methods like .split(...) and array indices.
408
+ // The key insight is: if we control the base, we control all derived values.
409
+ //
410
+ // Pattern: base.split('...').filter(...)[N] → find base
411
+ // We progressively strip: [N] → filter(...) → split(...) → until we find something controllable
412
+
413
+ // Methods that derive new values (should be stripped for controllability)
414
+ const derivingMethods = [
415
+ 'split',
416
+ 'match',
417
+ 'filter',
418
+ 'map',
419
+ 'find',
420
+ 'findIndex',
421
+ 'slice',
422
+ 'substring',
423
+ 'substr',
424
+ 'trim',
425
+ 'trimStart',
426
+ 'trimEnd',
427
+ 'toLowerCase',
428
+ 'toUpperCase',
429
+ 'replace',
430
+ 'replaceAll',
431
+ 'sort',
432
+ 'reverse',
433
+ 'flat',
434
+ 'flatMap',
435
+ ];
436
+
437
+ // Build regex to match method calls: .methodName(...)
438
+ // Use a simpler approach: progressively strip trailing derivations
439
+ let workingPath = cleanedPath;
440
+
441
+ // Keep stripping derivations until we find something controllable or can't strip anymore
442
+ // Max 20 iterations to prevent infinite loops
443
+ for (let iteration = 0; iteration < 20; iteration++) {
444
+ // Try current path
445
+ const result = checkInAttributesMap(workingPath);
446
+ if (result) {
447
+ return result;
448
+ }
449
+
450
+ // Also check via functionCallReturnValue extraction
451
+ // Note: We return workingPath (the FULL path) if the short path is found,
452
+ // because the full path is more meaningful for execution flows
453
+ const functionReturnMatch = workingPath.match(
454
+ /\.functionCallReturnValue\.(.+)$/,
455
+ );
456
+ if (functionReturnMatch) {
457
+ const shortPath = functionReturnMatch[1];
458
+ const shortResult = checkInAttributesMap(shortPath);
459
+ if (shortResult) {
460
+ // Return the full path, not just the short result
461
+ // This ensures execution flows have meaningful paths like
462
+ // "useParams().functionCallReturnValue.*" instead of just "*"
463
+ return workingPath;
464
+ }
465
+ }
466
+
467
+ // Try to strip trailing array index: path[0] → path
468
+ const arrayIndexMatch = workingPath.match(/^(.+)\[\d+\]$/);
469
+ if (arrayIndexMatch) {
470
+ workingPath = arrayIndexMatch[1];
471
+ continue;
472
+ }
473
+
474
+ // Try to strip trailing method call: path.method(...) → path
475
+ let strippedMethod = false;
476
+ for (const method of derivingMethods) {
477
+ // Match .method(...) at the end, handling nested parentheses
478
+ const methodRegex = new RegExp(
479
+ `\\.${method}\\([^()]*(?:\\([^()]*\\)[^()]*)*\\)$`,
480
+ );
481
+ if (methodRegex.test(workingPath)) {
482
+ workingPath = workingPath.replace(methodRegex, '');
483
+ strippedMethod = true;
484
+ break;
485
+ }
486
+ }
487
+
488
+ if (!strippedMethod) {
489
+ // Can't strip anymore
490
+ break;
491
+ }
492
+ }
493
+
494
+ // Final check after stripping
495
+ const finalResult = checkInAttributesMap(workingPath);
496
+ if (finalResult) {
497
+ return finalResult;
498
+ }
499
+
500
+ // Also check via functionCallReturnValue extraction for final path
501
+ const finalFunctionReturnMatch = workingPath.match(
502
+ /\.functionCallReturnValue\.(.+)$/,
503
+ );
504
+ if (finalFunctionReturnMatch) {
505
+ const shortPath = finalFunctionReturnMatch[1];
506
+ const shortResult = checkInAttributesMap(shortPath);
507
+ if (shortResult) {
508
+ // Return the full path, not just the short result
509
+ return workingPath;
510
+ }
511
+ }
512
+
513
+ return null;
514
+ }
515
+
516
+ /**
517
+ * Resolve a local variable path to a controllable data source path.
518
+ *
519
+ * @param localPath - The path to resolve (e.g., "isLoading", "debugFetcher.state")
520
+ * @param attributesMap - Map of controllable paths to their types
521
+ * @param equivalentSignatureVariables - Map from local variable names to data sources
522
+ * @param fullToShortPathMap - Map from full paths to short paths (for hooks)
523
+ * @returns Resolution result with the controllable path or null
524
+ */
525
+ export default function resolvePathToControllable(
526
+ localPath: string,
527
+ attributesMap: Record<string, string>,
528
+ equivalentSignatureVariables: Record<string, string>,
529
+ fullToShortPathMap: Record<string, string>,
530
+ ): PathResolutionResult {
531
+ const chain: string[] = [localPath];
532
+
533
+ // 1. Direct match in attributesMap
534
+ const directMatch = findInAttributesMap(localPath, attributesMap);
535
+ if (directMatch) {
536
+ chain.push(`direct match: ${directMatch}`);
537
+ return {
538
+ resolvedPath: directMatch,
539
+ resolutionChain: chain,
540
+ isControllable: true,
541
+ };
542
+ }
543
+
544
+ // 2. Array.length resolution (direct)
545
+ // If path ends with .length and base is an array, the .length is controllable
546
+ // Fix 27: Pass fullToShortPathMap for child path resolution
547
+ const arrayBase = getArrayBaseIfLengthAccess(
548
+ localPath,
549
+ attributesMap,
550
+ fullToShortPathMap,
551
+ );
552
+ if (arrayBase) {
553
+ chain.push(`array.length: base ${arrayBase} is array type`);
554
+ return {
555
+ resolvedPath: localPath,
556
+ resolutionChain: chain,
557
+ isControllable: true,
558
+ };
559
+ }
560
+
561
+ // 3. Full-to-short map lookup
562
+ if (localPath in fullToShortPathMap) {
563
+ const shortPath = fullToShortPathMap[localPath];
564
+ chain.push(`fullToShort: ${shortPath}`);
565
+ const shortMatch = findInAttributesMap(shortPath, attributesMap);
566
+ if (shortMatch) {
567
+ chain.push(`short match: ${shortMatch}`);
568
+ return {
569
+ resolvedPath: localPath, // Return the full path since that's what we'll use
570
+ resolutionChain: chain,
571
+ isControllable: true,
572
+ };
573
+ }
574
+ }
575
+
576
+ // 3b. Array element notation resolution (Fix 29)
577
+ // When a path ends with [] (array element access), the fullToShortPathMap
578
+ // may only have the base path (without []). Check if the base is mapped
579
+ // and then verify the short path with [] is in attributesMap.
580
+ if (localPath.endsWith('[]')) {
581
+ const basePath = localPath.slice(0, -2); // Remove trailing []
582
+ if (basePath in fullToShortPathMap) {
583
+ const baseShortPath = fullToShortPathMap[basePath];
584
+ const shortPathWithBrackets = baseShortPath + '[]';
585
+ chain.push(`fullToShort (base): ${basePath} → ${baseShortPath}`);
586
+ const shortMatch = findInAttributesMap(
587
+ shortPathWithBrackets,
588
+ attributesMap,
589
+ );
590
+ if (shortMatch) {
591
+ chain.push(`short match with []: ${shortMatch}`);
592
+ return {
593
+ resolvedPath: localPath,
594
+ resolutionChain: chain,
595
+ isControllable: true,
596
+ };
597
+ }
598
+ }
599
+ }
600
+
601
+ // 4. Equivalent variable resolution
602
+ const localVarName = extractLocalVariableName(localPath);
603
+ const dataSourceBase = equivalentSignatureVariables[localVarName];
604
+
605
+ if (dataSourceBase) {
606
+ chain.push(`equivalent var: ${localVarName} → ${dataSourceBase}`);
607
+
608
+ // Build the full resolved path
609
+ let fullResolvedPath = resolveCompoundPath(
610
+ localPath,
611
+ localVarName,
612
+ dataSourceBase,
613
+ );
614
+ chain.push(`resolved: ${fullResolvedPath}`);
615
+
616
+ // Fix 33: Handle transitive resolution for array access patterns
617
+ // When dataSourceBase is like "segments[0]" or "segments[]", we need to resolve "segments" first
618
+ // Then combine with the array access: segments -> useParams()... + [0] or []
619
+ const arrayMatch = fullResolvedPath.match(
620
+ /^([a-zA-Z_$][a-zA-Z0-9_$]*)(\[\d*\].*)$/,
621
+ );
622
+ if (arrayMatch) {
623
+ const baseVarName = arrayMatch[1]; // e.g., "segments"
624
+ const accessSuffix = arrayMatch[2]; // e.g., "[0]" or "[0].property"
625
+ if (
626
+ baseVarName in equivalentSignatureVariables &&
627
+ baseVarName !== localVarName
628
+ ) {
629
+ const baseDataSource = equivalentSignatureVariables[baseVarName];
630
+ chain.push(`transitive resolution: ${baseVarName} → ${baseDataSource}`);
631
+ // Append the array access suffix to the resolved base
632
+ if (baseDataSource.endsWith('()')) {
633
+ fullResolvedPath =
634
+ baseDataSource + '.functionCallReturnValue' + accessSuffix;
635
+ } else if (baseDataSource.endsWith('.functionCallReturnValue')) {
636
+ fullResolvedPath = baseDataSource + accessSuffix;
637
+ } else {
638
+ fullResolvedPath = baseDataSource + accessSuffix;
639
+ }
640
+ chain.push(`transitively resolved: ${fullResolvedPath}`);
641
+ }
642
+ }
643
+
644
+ // Check if resolved path is controllable
645
+ const resolvedMatch = findInAttributesMap(fullResolvedPath, attributesMap);
646
+ if (resolvedMatch) {
647
+ chain.push(`resolved match: ${resolvedMatch}`);
648
+ return {
649
+ resolvedPath: fullResolvedPath,
650
+ resolutionChain: chain,
651
+ isControllable: true,
652
+ };
653
+ }
654
+
655
+ // Check via fullToShortMap
656
+ if (fullResolvedPath in fullToShortPathMap) {
657
+ const shortPath = fullToShortPathMap[fullResolvedPath];
658
+ chain.push(`resolved fullToShort: ${shortPath}`);
659
+ const shortMatch = findInAttributesMap(shortPath, attributesMap);
660
+ if (shortMatch) {
661
+ chain.push(`short resolved match: ${shortMatch}`);
662
+ return {
663
+ resolvedPath: fullResolvedPath,
664
+ resolutionChain: chain,
665
+ isControllable: true,
666
+ };
667
+ }
668
+ }
669
+
670
+ // Array.length resolution (after equivalent variable resolution)
671
+ // If the resolved path ends with .length and base is an array, the .length is controllable
672
+ // Fix 27: Pass fullToShortPathMap for child path resolution
673
+ const resolvedArrayBase = getArrayBaseIfLengthAccess(
674
+ fullResolvedPath,
675
+ attributesMap,
676
+ fullToShortPathMap,
677
+ );
678
+ if (resolvedArrayBase) {
679
+ chain.push(`array.length: base ${resolvedArrayBase} is array type`);
680
+ return {
681
+ resolvedPath: fullResolvedPath,
682
+ resolutionChain: chain,
683
+ isControllable: true,
684
+ };
685
+ }
686
+
687
+ // Fix 34/38: Handle derived paths from controllable bases
688
+ // Paths like "useParams().functionCallReturnValue.*.split('/').filter(Boolean)[0]"
689
+ // are derived from "useParams().functionCallReturnValue.*" via string methods.
690
+ // If the base path is controllable, return the BASE path (not the derived path)
691
+ // because that's what we need to mock in the data structure.
692
+ const derivedBaseResult = findControllableBaseForDerivedPath(
693
+ fullResolvedPath,
694
+ attributesMap,
695
+ );
696
+ if (derivedBaseResult) {
697
+ chain.push(`derived from controllable base: ${derivedBaseResult}`);
698
+ return {
699
+ // Return the controllable BASE path, not the derived path
700
+ // This ensures execution flows contain paths that exist in attributesMap
701
+ resolvedPath: derivedBaseResult,
702
+ resolutionChain: chain,
703
+ isControllable: true,
704
+ };
705
+ }
706
+
707
+ // Fix 35: Handle nested property access on controllable paths
708
+ // When child components access nested properties like "scenarios[].metadata.screenshotPaths[]"
709
+ // but parent only has "scenarios[]" in attributesMap, the nested path should still be
710
+ // controllable since nested properties of controllable objects are also controllable.
711
+ const prefixResult = findControllablePrefix(
712
+ fullResolvedPath,
713
+ attributesMap,
714
+ fullToShortPathMap,
715
+ );
716
+ if (prefixResult) {
717
+ chain.push(`nested property of controllable prefix`);
718
+ return {
719
+ resolvedPath: fullResolvedPath,
720
+ resolutionChain: chain,
721
+ isControllable: true,
722
+ };
723
+ }
724
+ }
725
+
726
+ // 5. Fix 35: Check for controllable prefix on the local path directly
727
+ // This handles cases where the localPath itself (before any resolution)
728
+ // has a controllable prefix in attributesMap
729
+ //
730
+ // IMPORTANT: Only do prefix matching if:
731
+ // a) The root variable is known in equivalentSignatureVariables, OR
732
+ // b) The path looks like an already-translated path (contains .functionCallReturnValue.)
733
+ //
734
+ // If the root variable is NOT known AND it's not an already-translated path, it's likely
735
+ // from an internal scope (callback, async function) and shouldn't be matched
736
+ // against similarly-named variables from different scopes.
737
+ // For example, "data.status" from inside `await response.json()` should NOT
738
+ // match the "data" from a useFetcher hook.
739
+ const localVarNameForPrefix = extractLocalVariableName(localPath);
740
+ const isKnownVariable = localVarNameForPrefix in equivalentSignatureVariables;
741
+
742
+ // Fix 35b: Also allow prefix matching for already-translated paths from child components
743
+ // These paths start with hook patterns like useLoaderData<...>().functionCallReturnValue
744
+ // and should be checked for controllable prefixes even if the hook itself isn't
745
+ // in equivalentSignatureVariables (because it's a fully resolved path, not a local variable)
746
+ const isAlreadyTranslatedPath = localPath.includes(
747
+ '.functionCallReturnValue.',
748
+ );
749
+
750
+ if (isKnownVariable || isAlreadyTranslatedPath) {
751
+ const localPrefixResult = findControllablePrefix(
752
+ localPath,
753
+ attributesMap,
754
+ fullToShortPathMap,
755
+ );
756
+ if (localPrefixResult) {
757
+ chain.push(`nested property of controllable prefix (direct)`);
758
+ return {
759
+ resolvedPath: localPath,
760
+ resolutionChain: chain,
761
+ isControllable: true,
762
+ };
763
+ }
764
+ } else {
765
+ chain.push(
766
+ `root variable '${localVarNameForPrefix}' not in equivalentSignatureVariables - skipping prefix match`,
767
+ );
768
+ }
769
+
770
+ // 5b. Fix 36/38: Check for derived paths on localPath directly
771
+ // When localPath contains derivation methods like .filter(cyScope()), check if
772
+ // the base path (before .filter()) is controllable
773
+ const localDerivedResult = findControllableBaseForDerivedPath(
774
+ localPath,
775
+ attributesMap,
776
+ );
777
+ if (localDerivedResult) {
778
+ chain.push(
779
+ `derived from controllable base (direct): ${localDerivedResult}`,
780
+ );
781
+ return {
782
+ // Return the controllable BASE path, not the derived path
783
+ resolvedPath: localDerivedResult,
784
+ resolutionChain: chain,
785
+ isControllable: true,
786
+ };
787
+ }
788
+
789
+ // 5c. Fix 36: Also check .length on derived paths directly
790
+ // E.g., scenarios.filter(cyScope()).length where scenarios[] is controllable
791
+ const localArrayBase = getArrayBaseIfLengthAccess(
792
+ localPath,
793
+ attributesMap,
794
+ fullToShortPathMap,
795
+ );
796
+ if (localArrayBase) {
797
+ chain.push(`array.length on derived path: base ${localArrayBase}`);
798
+ return {
799
+ resolvedPath: localPath,
800
+ resolutionChain: chain,
801
+ isControllable: true,
802
+ };
803
+ }
804
+
805
+ // 6. Not controllable
806
+ chain.push('not controllable');
807
+ return {
808
+ resolvedPath: null,
809
+ resolutionChain: chain,
810
+ isControllable: false,
811
+ };
812
+ }