@codeyam/codeyam-cli 0.1.0-staging.1669d45 → 0.1.0-staging.2a88920

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 (437) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +5 -5
  4. package/analyzer-template/packages/ai/index.ts +15 -2
  5. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +87 -51
  6. package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +98 -9
  8. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +139 -23
  9. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +6 -126
  10. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +555 -28
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +88 -7
  12. package/analyzer-template/packages/ai/src/lib/completionCall.ts +198 -34
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +772 -243
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +205 -0
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +10 -2
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +43 -1
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +122 -15
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +160 -0
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +319 -88
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
  24. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
  25. package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
  26. package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
  27. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +642 -7
  28. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +35 -6
  29. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +383 -6
  30. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  31. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1299 -51
  32. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
  33. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  34. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  35. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
  36. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
  37. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +23 -6
  38. package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
  39. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +179 -45
  40. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +26 -4
  41. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
  42. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  43. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  44. package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
  45. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  46. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  47. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  48. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  49. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  50. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  51. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +30 -19
  52. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +14 -4
  53. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
  54. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  55. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -10
  56. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  57. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  58. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +189 -76
  59. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +29 -0
  60. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +77 -9
  61. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +118 -10
  62. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +276 -17
  63. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
  64. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  65. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  66. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  67. package/analyzer-template/packages/aws/package.json +2 -2
  68. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -1
  69. package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
  70. package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
  71. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
  72. package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
  73. package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
  74. package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
  75. package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
  76. package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
  77. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
  78. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  79. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +8 -1
  80. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  81. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  82. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
  83. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
  85. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
  87. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
  89. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
  90. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  91. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
  92. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  93. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
  94. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
  95. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
  96. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
  97. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
  98. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
  99. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  100. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +22 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  102. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
  103. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  104. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -4
  105. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  106. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
  107. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
  108. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
  109. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
  110. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  111. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
  112. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  113. package/analyzer-template/packages/github/dist/types/index.d.ts +1 -1
  114. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  115. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  116. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +25 -1
  117. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  118. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
  119. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
  120. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +56 -6
  121. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  122. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  123. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  124. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
  125. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  126. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
  127. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
  128. package/analyzer-template/packages/github/package.json +1 -1
  129. package/analyzer-template/packages/types/index.ts +1 -0
  130. package/analyzer-template/packages/types/src/types/Analysis.ts +25 -0
  131. package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
  132. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +70 -6
  133. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  134. package/analyzer-template/packages/utils/dist/types/index.d.ts +1 -1
  135. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  136. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  137. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +25 -1
  138. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  139. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
  140. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
  141. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +56 -6
  142. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  143. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  144. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  145. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
  146. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  147. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
  148. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
  149. package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
  150. package/analyzer-template/playwright/capture.ts +20 -8
  151. package/analyzer-template/playwright/captureStatic.ts +1 -1
  152. package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
  153. package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
  154. package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
  155. package/analyzer-template/project/constructMockCode.ts +367 -37
  156. package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
  157. package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
  158. package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
  159. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
  160. package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
  161. package/analyzer-template/project/orchestrateCapture.ts +71 -6
  162. package/analyzer-template/project/reconcileMockDataKeys.ts +152 -9
  163. package/analyzer-template/project/runAnalysis.ts +4 -0
  164. package/analyzer-template/project/start.ts +35 -11
  165. package/analyzer-template/project/writeMockDataTsx.ts +127 -4
  166. package/analyzer-template/project/writeScenarioComponents.ts +101 -8
  167. package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
  168. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
  169. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  170. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
  171. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  172. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
  173. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
  174. package/background/src/lib/virtualized/project/constructMockCode.js +300 -7
  175. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  176. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
  177. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
  178. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
  179. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  180. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
  181. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
  182. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
  183. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  184. package/background/src/lib/virtualized/project/orchestrateCapture.js +58 -6
  185. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  186. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +126 -9
  187. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  188. package/background/src/lib/virtualized/project/runAnalysis.js +3 -0
  189. package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
  190. package/background/src/lib/virtualized/project/start.js +32 -11
  191. package/background/src/lib/virtualized/project/start.js.map +1 -1
  192. package/background/src/lib/virtualized/project/writeMockDataTsx.js +101 -4
  193. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  194. package/background/src/lib/virtualized/project/writeScenarioComponents.js +57 -8
  195. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  196. package/codeyam-cli/src/cli.js +2 -0
  197. package/codeyam-cli/src/cli.js.map +1 -1
  198. package/codeyam-cli/src/commands/debug.js +7 -5
  199. package/codeyam-cli/src/commands/debug.js.map +1 -1
  200. package/codeyam-cli/src/commands/memory.js +273 -0
  201. package/codeyam-cli/src/commands/memory.js.map +1 -0
  202. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +4 -0
  203. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  204. package/codeyam-cli/src/utils/analysisRunner.js +21 -2
  205. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  206. package/codeyam-cli/src/utils/install-skills.js +42 -6
  207. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  208. package/codeyam-cli/src/utils/queue/job.js +1 -0
  209. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  210. package/codeyam-cli/src/utils/queue/manager.js +6 -0
  211. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  212. package/codeyam-cli/src/utils/rules/index.js +5 -0
  213. package/codeyam-cli/src/utils/rules/index.js.map +1 -0
  214. package/codeyam-cli/src/utils/rules/parser.js +106 -0
  215. package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
  216. package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
  217. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
  218. package/codeyam-cli/src/utils/rules/staleness.js +132 -0
  219. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
  220. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +2 -0
  221. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  222. package/codeyam-cli/src/webserver/app/lib/database.js +7 -3
  223. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  224. package/codeyam-cli/src/webserver/bootstrap.js +40 -0
  225. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  226. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-DsN1wKrm.js +11 -0
  227. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-COi5OvsN.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
  228. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BwdQv49w.js → EntityTypeIcon-Ba2JVPzP.js} +1 -1
  229. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CEleMv_j.js → InlineSpinner-C8lyxW9k.js} +1 -1
  230. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D68KarMg.js → InteractivePreview-aht4aafF.js} +2 -2
  231. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-L75Wvqgw.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
  232. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-C53WM8qn.js → LoadingDots-B0GLXMsr.js} +1 -1
  233. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CrNkmy4i.js → LogViewer-xgeCVgSM.js} +1 -1
  234. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-OApQuNyq.js +16 -0
  235. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CQifa1n-.js → SafeScreenshot-DuDvi0jm.js} +1 -1
  236. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CyaBFX7l.js → ScenarioViewer-DzccYyI8.js} +3 -13
  237. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D36O1rzU.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
  238. package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
  239. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BwavGCpm.js +32 -0
  240. package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
  241. package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
  242. package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
  243. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DgTPh8H-.js → chevron-down-Cx24_aWc.js} +1 -1
  244. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-DdQKK6on.js → chunk-EPOLDU6W-CXRTFQ3F.js} +1 -1
  245. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-Dmr2bb1R.js → circle-check-BOARzkeR.js} +1 -1
  246. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +6 -0
  247. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Do4ZLUYa.js → createLucideIcon-BdhJEx6B.js} +1 -1
  248. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +1 -0
  249. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CbdFyxZh.js → entity._sha._-BJUiQqZF.js} +12 -12
  250. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js → entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js} +1 -1
  251. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-wDWZZO1W.js → entity._sha_.create-scenario-D1T4TGjf.js} +1 -1
  252. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMbl7MeQ.js → entity._sha_.edit._scenarioId-CTBG2mmz.js} +1 -1
  253. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-5wRKRIH9.js → entry.client-CS2cb_eZ.js} +1 -1
  254. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +6 -0
  255. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DD3SDH7t.js → fileTableUtils-DMJ7zii9.js} +1 -1
  256. package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +1 -0
  257. package/codeyam-cli/src/webserver/build/client/assets/{git-zXjT7J0G.js → git-CPTZZ-JZ.js} +8 -8
  258. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +1 -0
  259. package/codeyam-cli/src/webserver/build/client/assets/{index-DLbXwndH.js → index-B1h680n5.js} +1 -1
  260. package/codeyam-cli/src/webserver/build/client/assets/{index-gPZ-lad1.js → index-lzqtyFU8.js} +1 -1
  261. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BsPXJ81F.js → loader-circle-B7B9V-bu.js} +1 -1
  262. package/codeyam-cli/src/webserver/build/client/assets/manifest-a78b90a2.js +1 -0
  263. package/codeyam-cli/src/webserver/build/client/assets/memory--GCbFsBE.js +92 -0
  264. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +62 -0
  265. package/codeyam-cli/src/webserver/build/client/assets/{search-P2FKIUql.js → search-CxXUmBSd.js} +1 -1
  266. package/codeyam-cli/src/webserver/build/client/assets/{settings-B2eDuBj8.js → settings-CS5f3WzT.js} +1 -1
  267. package/codeyam-cli/src/webserver/build/client/assets/{simulations-L18M6-kN.js → simulations-DwFIBT09.js} +1 -1
  268. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BDz7kbVA.js → triangle-alert-B6LgvRJg.js} +1 -1
  269. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-29dDmbH8.js → useCustomSizes-C1v1PQzo.js} +1 -1
  270. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BUm0UVJm.js → useLastLogLine-aSv48UbS.js} +1 -1
  271. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CkIOKTrZ.js → useReportContext-DYxHZQuP.js} +1 -1
  272. package/codeyam-cli/src/webserver/build/client/assets/{useToast-KKw5kTn-.js → useToast-mBRpZPiu.js} +1 -1
  273. package/codeyam-cli/src/webserver/build/server/assets/index-BM6TDT1Y.js +1 -0
  274. package/codeyam-cli/src/webserver/build/server/assets/server-build-dYC34MHw.js +257 -0
  275. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  276. package/codeyam-cli/src/webserver/build-info.json +5 -5
  277. package/codeyam-cli/templates/codeyam-memory-hook.sh +200 -0
  278. package/codeyam-cli/templates/codeyam:debug.md +47 -3
  279. package/codeyam-cli/templates/codeyam:diagnose.md +203 -25
  280. package/codeyam-cli/templates/codeyam:memory.md +341 -0
  281. package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
  282. package/codeyam-cli/templates/rule-reflection-hook.py +160 -0
  283. package/codeyam-cli/templates/rules-instructions.md +93 -0
  284. package/package.json +8 -5
  285. package/packages/ai/index.js +7 -3
  286. package/packages/ai/index.js.map +1 -1
  287. package/packages/ai/src/lib/analyzeScope.js +70 -29
  288. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  289. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
  290. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
  291. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +78 -8
  292. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  293. package/packages/ai/src/lib/astScopes/methodSemantics.js +109 -23
  294. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  295. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +1 -102
  296. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
  297. package/packages/ai/src/lib/astScopes/processExpression.js +440 -27
  298. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  299. package/packages/ai/src/lib/completionCall.js +161 -30
  300. package/packages/ai/src/lib/completionCall.js.map +1 -1
  301. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +589 -166
  302. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  303. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +179 -0
  304. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
  305. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +7 -1
  306. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  307. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  308. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  309. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  310. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  311. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +41 -1
  312. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  313. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +104 -11
  314. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  315. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +159 -0
  316. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  317. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  318. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  319. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +265 -79
  320. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  321. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
  322. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
  323. package/packages/ai/src/lib/dataStructureChunking.js +111 -0
  324. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
  325. package/packages/ai/src/lib/e2eDataTracking.js +241 -0
  326. package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
  327. package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
  328. package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
  329. package/packages/ai/src/lib/generateEntityScenarioData.js +525 -8
  330. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  331. package/packages/ai/src/lib/generateEntityScenarios.js +26 -2
  332. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  333. package/packages/ai/src/lib/generateExecutionFlows.js +281 -4
  334. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  335. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +946 -42
  336. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  337. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
  338. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
  339. package/packages/ai/src/lib/mergeStatements.js +70 -51
  340. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  341. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  342. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  343. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
  344. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
  345. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +15 -7
  346. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  347. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
  348. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
  349. package/packages/ai/src/lib/resolvePathToControllable.js +155 -41
  350. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  351. package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
  352. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  353. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
  354. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  355. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  356. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  357. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  358. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  359. package/packages/analyze/src/lib/analysisContext.js +30 -5
  360. package/packages/analyze/src/lib/analysisContext.js.map +1 -1
  361. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  362. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  363. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  364. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  365. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  366. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  367. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  368. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  369. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  370. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  371. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  372. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  373. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +21 -9
  374. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  375. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +14 -4
  376. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  377. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
  378. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  379. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  380. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  381. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -10
  382. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  383. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  384. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  385. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  386. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  387. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +160 -68
  388. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  389. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +25 -8
  390. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  391. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +71 -9
  392. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  393. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +57 -9
  394. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  395. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +233 -9
  396. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  397. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
  398. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
  399. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  400. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  401. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  402. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  403. package/packages/database/src/lib/kysely/db.js +8 -1
  404. package/packages/database/src/lib/kysely/db.js.map +1 -1
  405. package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
  406. package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  407. package/packages/database/src/lib/loadAnalyses.js +45 -2
  408. package/packages/database/src/lib/loadAnalyses.js.map +1 -1
  409. package/packages/database/src/lib/loadAnalysis.js +8 -0
  410. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  411. package/packages/database/src/lib/loadBranch.js +11 -1
  412. package/packages/database/src/lib/loadBranch.js.map +1 -1
  413. package/packages/database/src/lib/loadCommit.js +7 -0
  414. package/packages/database/src/lib/loadCommit.js.map +1 -1
  415. package/packages/database/src/lib/loadCommits.js +22 -1
  416. package/packages/database/src/lib/loadCommits.js.map +1 -1
  417. package/packages/database/src/lib/loadEntities.js +23 -4
  418. package/packages/database/src/lib/loadEntities.js.map +1 -1
  419. package/packages/database/src/lib/loadEntityBranches.js +9 -0
  420. package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
  421. package/packages/database/src/lib/updateCommitMetadata.js +5 -4
  422. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  423. package/packages/types/index.js.map +1 -1
  424. package/packages/utils/src/lib/safeFileName.js +29 -3
  425. package/packages/utils/src/lib/safeFileName.js.map +1 -1
  426. package/scripts/finalize-analyzer.cjs +3 -3
  427. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +0 -1
  428. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +0 -11
  429. package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +0 -11
  430. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +0 -37
  431. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +0 -1
  432. package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +0 -1
  433. package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +0 -1
  434. package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +0 -1
  435. package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +0 -57
  436. package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +0 -1
  437. package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +0 -228
@@ -9,8 +9,12 @@ import { DataStructure } from '~codeyam/types';
9
9
  * enriches the mocked dependency's returnValueSchema so the LLM knows what fields
10
10
  * to generate for array elements.
11
11
  *
12
+ * Uses usageEquivalencies to trace data flow and ONLY enrich arrays with fields
13
+ * from children that actually receive elements from that array.
14
+ *
12
15
  * Example:
13
16
  * - getSurveysAction returns { data: array }
17
+ * - usageEquivalencies shows: surveys[] -> SurveyCard().signature[0].survey
14
18
  * - SurveyCard expects signature[0].survey.updatedAt: date
15
19
  * - After enrichment: getSurveysAction().data[]: object, data[].updatedAt: date
16
20
  */
@@ -21,6 +25,7 @@ export default function enrichArrayTypesFromChildSignatures(
21
25
  isMocked?: boolean;
22
26
  }[],
23
27
  dependencySchemas: DataStructure['dependencySchemas'],
28
+ usageEquivalencies?: DataStructure['usageEquivalencies'],
24
29
  ): void {
25
30
  // Find all mocked dependencies with array return types
26
31
  const mockedArrayPaths: {
@@ -43,7 +48,8 @@ export default function enrichArrayTypesFromChildSignatures(
43
48
  // - wrapThrows().data.createdBy (deeply nested)
44
49
  // - getStatusOptions().functionCallReturnValue (direct array return - usually options/primitives)
45
50
  for (const [path, type] of Object.entries(schema)) {
46
- if (type !== 'array') continue;
51
+ // Check if type is array (including nullable/optional variants like 'array | undefined')
52
+ if (!type.startsWith('array')) continue;
47
53
 
48
54
  // Skip paths with computed property patterns like [key], [i], [0], etc.
49
55
  // These represent dynamic access patterns, not simple data arrays
@@ -81,115 +87,222 @@ export default function enrichArrayTypesFromChildSignatures(
81
87
 
82
88
  if (mockedArrayPaths.length === 0) return;
83
89
 
84
- // Find all non-mocked child components and extract their signature fields
85
- // We check both direct imports AND all schemas in dependencySchemas because
86
- // transitive dependencies (e.g., SurveyCard imported by SurveysList imported by SurveysPage)
87
- // may have signature schemas that we need to use for enrichment.
88
- const childSignatureFields: {
89
- filePath: string;
90
- entityName: string;
91
- // Map of prop paths to types, e.g., { "survey.id": "string", "survey.updatedAt": "date" }
92
- propFields: Record<string, string>;
93
- }[] = [];
90
+ // Build a map from child component signature paths to their prop fields
91
+ // e.g., "SurveyCard().signature[0].survey" -> { "id": "string", "updatedAt": "date" }
92
+ const childSignatureFieldsByPath: Map<
93
+ string,
94
+ { propName: string; fields: Record<string, string> }
95
+ > = new Map();
94
96
 
95
- // Helper to extract prop fields from a signature schema
96
- const extractPropFields = (
97
+ // Helper to extract prop name and fields from a signature schema
98
+ const extractSignatureInfo = (
99
+ entityName: string,
97
100
  schema: Record<string, string>,
98
- ): Record<string, string> => {
99
- const propFields: Record<string, string> = {};
101
+ ): void => {
102
+ // Group by prop name (e.g., signature[0].survey.id, signature[0].survey.name -> "survey")
103
+ const propGroups: Record<string, Record<string, string>> = {};
104
+ // Also collect direct fields on signature[0] (e.g., signature[0].filePath -> "filePath")
105
+ const directFields: Record<string, string> = {};
106
+
100
107
  for (const [path, type] of Object.entries(schema)) {
101
- // Match signature[0].propName.field patterns
102
- const match = path.match(/^signature\[0\]\.(\w+)\.(.+)$/);
103
- if (match) {
104
- const [, , fieldPath] = match;
105
- // Store as "fieldPath" without the prop name prefix
106
- // e.g., signature[0].survey.updatedAt -> updatedAt
107
- propFields[fieldPath] = type;
108
+ // Match signature[0].propName.field or signature[0].propName[].field patterns
109
+ // The (?:\[\])? makes array props optional, handling both:
110
+ // - signature[0].survey.updatedAt (object prop)
111
+ // - signature[0].questionAnswers[].question.questionText (array prop)
112
+ const nestedMatch = path.match(/^signature\[0\]\.(\w+)(?:\[\])?\.(.+)$/);
113
+ if (nestedMatch) {
114
+ const [, propName, fieldPath] = nestedMatch;
115
+ propGroups[propName] ||= {};
116
+ propGroups[propName][fieldPath] = type;
117
+ continue;
108
118
  }
109
- }
110
- return propFields;
111
- };
112
-
113
- // First, check direct imports (non-mocked)
114
- const processedSchemas = new Set<string>();
115
- for (const importedExport of importedExports) {
116
- // Skip mocked dependencies - we want child components
117
- if (importedExport.isMocked || !importedExport.filePath) continue;
118
119
 
119
- const schemaKey = `${importedExport.filePath}::${importedExport.name}`;
120
- processedSchemas.add(schemaKey);
120
+ // Also match direct fields: signature[0].fieldName (single level, no nested path)
121
+ // This handles cases like TruncatedFilePath where filePath is passed directly
122
+ const directMatch = path.match(/^signature\[0\]\.(\w+)$/);
123
+ if (directMatch) {
124
+ const [, fieldName] = directMatch;
125
+ directFields[fieldName] = type;
126
+ }
127
+ }
121
128
 
122
- const schema =
123
- dependencySchemas?.[importedExport.filePath]?.[importedExport.name]
124
- ?.signatureSchema;
125
- if (!schema) continue;
129
+ // Store nested prop groups with the full signature path as key
130
+ for (const [propName, fields] of Object.entries(propGroups)) {
131
+ if (Object.keys(fields).length > 0) {
132
+ const signaturePath = `${entityName}().signature[0].${propName}`;
133
+ childSignatureFieldsByPath.set(signaturePath, { propName, fields });
134
+ }
135
+ }
126
136
 
127
- const propFields = extractPropFields(schema);
128
- if (Object.keys(propFields).length > 0) {
129
- childSignatureFields.push({
130
- filePath: importedExport.filePath,
131
- entityName: importedExport.name,
132
- propFields,
137
+ // Store direct fields with signature[0] as key (for when entire object is passed)
138
+ if (Object.keys(directFields).length > 0) {
139
+ const signaturePath = `${entityName}().signature[0]`;
140
+ childSignatureFieldsByPath.set(signaturePath, {
141
+ propName: '',
142
+ fields: directFields,
133
143
  });
134
144
  }
135
- }
145
+ };
136
146
 
137
- // Also check all schemas in dependencySchemas for transitive child components
138
- // that may not be in importedExports but have signature schemas with prop fields
147
+ // Process all schemas in dependencySchemas
139
148
  if (dependencySchemas) {
140
- for (const [filePath, entities] of Object.entries(dependencySchemas)) {
149
+ for (const [, entities] of Object.entries(dependencySchemas)) {
141
150
  for (const [entityName, schemas] of Object.entries(entities)) {
142
- const schemaKey = `${filePath}::${entityName}`;
143
- // Skip already processed schemas
144
- if (processedSchemas.has(schemaKey)) continue;
145
-
146
151
  const signatureSchema = schemas?.signatureSchema;
147
- if (!signatureSchema) continue;
148
-
149
- const propFields = extractPropFields(signatureSchema);
150
- if (Object.keys(propFields).length > 0) {
151
- childSignatureFields.push({
152
- filePath,
153
- entityName,
154
- propFields,
155
- });
152
+ if (signatureSchema) {
153
+ extractSignatureInfo(entityName, signatureSchema);
156
154
  }
157
155
  }
158
156
  }
159
157
  }
160
158
 
161
- if (childSignatureFields.length === 0) return;
159
+ if (childSignatureFieldsByPath.size === 0) return;
160
+
161
+ // Helper to check if a local variable name could be derived from a mocked function name
162
+ // e.g., "getSurveys" -> "surveys", "fetchUsers" -> "users", "loadData" -> "data"
163
+ // e.g., "getSurveysAction" -> "surveys" (removes "Action" suffix too)
164
+ const couldBeDerivedFrom = (
165
+ localVarName: string,
166
+ mockedFunctionName: string,
167
+ ): boolean => {
168
+ const normalizedVar = localVarName.toLowerCase().replace(/\[\]$/, '');
169
+ let normalizedFunc = mockedFunctionName.toLowerCase();
162
170
 
163
- // Enrich mocked dependency arrays with child signature fields
164
- // Only enrich arrays that don't already have element types defined
165
- // A more sophisticated approach would trace the data flow to match specific arrays to specific children
171
+ // Direct match (e.g., "surveys" from function "surveys")
172
+ if (normalizedFunc === normalizedVar) return true;
173
+
174
+ // Remove common prefixes like "get", "fetch", "load", "use"
175
+ const prefixPattern = /^(get|fetch|load|use)/i;
176
+ normalizedFunc = normalizedFunc.replace(prefixPattern, '');
177
+
178
+ // Remove common suffixes like "Action", "Query", "Mutation", "Handler"
179
+ const suffixPattern = /(action|query|mutation|handler)$/i;
180
+ normalizedFunc = normalizedFunc.replace(suffixPattern, '');
181
+
182
+ // Check if function name (without prefix/suffix) matches the variable name
183
+ if (normalizedFunc === normalizedVar) return true;
184
+
185
+ // Check for singular/plural relationship
186
+ // e.g., "survey" from "getSurveys" or "surveys" from "getSurvey"
187
+ if (
188
+ normalizedFunc.endsWith('s') &&
189
+ normalizedFunc.slice(0, -1) === normalizedVar
190
+ )
191
+ return true;
192
+ if (
193
+ normalizedVar.endsWith('s') &&
194
+ normalizedVar.slice(0, -1) === normalizedFunc
195
+ )
196
+ return true;
197
+
198
+ // Check if the array property name (like "data") is in the variable
199
+ // This handles cases like "const { data: surveys } = getSurveys()" where
200
+ // the local var might be the renamed destructured property
201
+ // Skip this for now as it's too loose
202
+
203
+ return false;
204
+ };
205
+
206
+ // For each mocked array, find which child signatures it flows to via usageEquivalencies
166
207
  for (const { filePath, entityName, arrayPath } of mockedArrayPaths) {
167
208
  const schema = dependencySchemas[filePath][entityName].returnValueSchema;
168
209
 
169
- // Check if this array already has element type definitions
210
+ // Check if this array already has INDEXED element type definitions (e.g., [0]: null)
170
211
  // If so, skip it - it's likely a specialized array like [null] for refs
212
+ // But DON'T skip if it only has general [] element types - those can be enriched
171
213
  const elementPathPrefix = `${arrayPath}[`;
172
- const hasExistingElementType = Object.keys(schema).some((path) =>
173
- path.startsWith(elementPathPrefix),
174
- );
214
+ const hasIndexedElementType = Object.keys(schema).some((path) => {
215
+ if (!path.startsWith(elementPathPrefix)) return false;
216
+ // Check if it's an indexed type like [0], [1], etc. vs general []
217
+ const afterPrefix = path.slice(elementPathPrefix.length);
218
+ // Indexed types start with a digit: [0], [1], etc.
219
+ return /^\d/.test(afterPrefix);
220
+ });
175
221
 
176
- if (hasExistingElementType) {
177
- // Array already has element type info (e.g., useAutoAnimate()[0]: null)
222
+ if (hasIndexedElementType) {
223
+ // Array already has indexed element type info (e.g., useAutoAnimate()[0]: null)
178
224
  // Don't override it with child signature fields
179
225
  continue;
180
226
  }
181
227
 
182
- // Add array element type
228
+ // Find matching child signatures via usageEquivalencies
229
+ // Look for equivalencies where this array (or local variables derived from it)
230
+ // flows to a child component's signature
231
+ const matchedFields: Record<string, string> = {};
232
+
233
+ if (usageEquivalencies) {
234
+ // Check all equivalency entries for paths that could be derived from this array
235
+ for (const [sourcePath, targets] of Object.entries(usageEquivalencies)) {
236
+ // Check if this source path relates to our mocked array
237
+ // Direct match: "getSurveysAction().functionCallReturnValue.data[]"
238
+ // Indirect match: local variable like "surveys[]" that comes from the array
239
+ if (!sourcePath.endsWith('[]')) continue;
240
+
241
+ // Get the local variable name from the source path (e.g., "surveys[]" -> "surveys")
242
+ const localVarName = sourcePath.replace(/\[\]$/, '');
243
+
244
+ // Check if this local variable could have come from this mocked function
245
+ // Use heuristics: name matching (getSurveys -> surveys, getUsers -> users)
246
+ // Also check if the array path ends with the local variable name
247
+ // e.g., useLoaderData().functionCallReturnValue.entities ends with .entities
248
+ const arrayEndsWithLocalVar = arrayPath.endsWith(`.${localVarName}`);
249
+ if (
250
+ !couldBeDerivedFrom(localVarName, entityName) &&
251
+ !arrayEndsWithLocalVar
252
+ ) {
253
+ continue;
254
+ }
255
+
256
+ for (const target of targets) {
257
+ // Target should be something like "SurveyCard().signature[0].survey"
258
+ // or "SurveyCard().signature[0].surveys[]"
259
+ const { schemaPath } = target;
260
+
261
+ // Look for signature fields that match this target
262
+ // Handle both singular (survey) and plural (surveys[]) forms
263
+ const normalizedTarget = schemaPath.replace(/\[\]$/, '');
264
+
265
+ for (const [signaturePath, info] of childSignatureFieldsByPath) {
266
+ if (normalizedTarget === signaturePath) {
267
+ // Found a match! Add all fields from this child signature
268
+ for (const [fieldPath, type] of Object.entries(info.fields)) {
269
+ if (!matchedFields[fieldPath]) {
270
+ matchedFields[fieldPath] = type;
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+
279
+ // If no equivalencies matched, skip this array entirely
280
+ // This prevents the bug where ALL child signatures get merged into ALL arrays
281
+ if (Object.keys(matchedFields).length === 0) {
282
+ continue;
283
+ }
284
+
285
+ // Add array element type and matched fields
183
286
  const elementPath = `${arrayPath}[]`;
184
287
  schema[elementPath] = 'object';
185
288
 
186
- // Add fields from all child signatures to the array element
187
- for (const { propFields } of childSignatureFields) {
188
- for (const [fieldPath, type] of Object.entries(propFields)) {
189
- const fullPath = `${elementPath}.${fieldPath}`;
190
- if (!schema[fullPath]) {
289
+ for (const [fieldPath, type] of Object.entries(matchedFields)) {
290
+ const fullPath = `${elementPath}.${fieldPath}`;
291
+ const existingType = schema[fullPath];
292
+ if (!existingType) {
293
+ schema[fullPath] = type;
294
+ } else {
295
+ // Prefer the more specific (narrower) type
296
+ const existingIsOptional =
297
+ existingType.includes('| undefined') ||
298
+ existingType.includes('| null');
299
+ const newIsOptional =
300
+ type.includes('| undefined') || type.includes('| null');
301
+ if (existingIsOptional && !newIsOptional) {
302
+ // Use the new type - it's more specific
191
303
  schema[fullPath] = type;
192
304
  }
305
+ // Otherwise keep existing (same specificity or existing is more specific)
193
306
  }
194
307
  }
195
308
  }
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  convertDotNotation,
3
3
  fillInDirectSchemaGapsAndUnknowns,
4
+ buildSchemaIndexes,
5
+ type SchemaIndexes,
4
6
  joinParenthesesAndArrays,
5
7
  mergeJsonTypeDefinitions,
6
8
  splitOutsideParenthesesAndArrays,
@@ -165,6 +167,7 @@ function processCall(
165
167
  variableNameOccurrence: number | undefined,
166
168
  options: GatherDataForMocksOptions | undefined,
167
169
  hookCallIndex: number,
170
+ prebuiltIndexes?: SchemaIndexes,
168
171
  ): { key: string; value: JsonTypeDefinition } | null {
169
172
  const callName = importedExport.calls?.[callIndex] ?? importedExport.name;
170
173
 
@@ -465,6 +468,7 @@ function processCall(
465
468
  const filledSchema = fillInDirectSchemaGapsAndUnknowns({
466
469
  scopeName: importedExport.name,
467
470
  schema: relevantMergedDependencySchema,
471
+ prebuiltIndexes,
468
472
  });
469
473
 
470
474
  const schema = convertDotNotation(filledSchema);
@@ -568,6 +572,25 @@ export default function gatherDataForMocks(
568
572
  dependencySchemas: DataStructure['dependencySchemas'],
569
573
  options?: GatherDataForMocksOptions,
570
574
  ) {
575
+ // Build schema indexes ONCE from all dependency schemas combined.
576
+ // This avoids rebuilding indexes (~1-2 seconds for 18k keys) for each processCall.
577
+ const allSchemaKeys: Record<string, string> = {};
578
+ if (dependencySchemas) {
579
+ for (const filePath in dependencySchemas) {
580
+ for (const entityName in dependencySchemas[filePath]) {
581
+ const schema =
582
+ dependencySchemas[filePath][entityName]?.returnValueSchema;
583
+ if (schema) {
584
+ Object.assign(allSchemaKeys, schema);
585
+ }
586
+ }
587
+ }
588
+ }
589
+ const prebuiltIndexes =
590
+ Object.keys(allSchemaKeys).length > 0
591
+ ? buildSchemaIndexes(allSchemaKeys)
592
+ : undefined;
593
+
571
594
  // Track the global index for each hook name across all imports
572
595
  // This enables canonical keys like EntityName::useLoaderData::0, EntityName::useFetcher::0, etc.
573
596
  const hookCallIndices: Record<string, number> = {};
@@ -653,6 +676,7 @@ export default function gatherDataForMocks(
653
676
  undefined,
654
677
  options,
655
678
  hookCallIndex,
679
+ prebuiltIndexes,
656
680
  );
657
681
 
658
682
  if (processResult) {
@@ -717,6 +741,7 @@ export default function gatherDataForMocks(
717
741
  occurrence,
718
742
  options,
719
743
  hookCallIndex,
744
+ prebuiltIndexes,
720
745
  );
721
746
  if (processResult) {
722
747
  addResultToAccumulator(acc, processResult.key, processResult.value);
@@ -749,6 +774,7 @@ export default function gatherDataForMocks(
749
774
  undefined,
750
775
  options,
751
776
  hookCallIndex,
777
+ prebuiltIndexes,
752
778
  );
753
779
 
754
780
  if (processResult) {
@@ -769,6 +795,7 @@ export default function gatherDataForMocks(
769
795
  undefined,
770
796
  options,
771
797
  hookCallIndex,
798
+ prebuiltIndexes,
772
799
  );
773
800
 
774
801
  // Check if we got a meaningful result (not empty object or null)
@@ -813,6 +840,7 @@ export default function gatherDataForMocks(
813
840
  0, // Use 0 to trigger variable-qualified lookup
814
841
  options,
815
842
  hookCallIndex,
843
+ prebuiltIndexes,
816
844
  );
817
845
  if (varQualifiedResult && varQualifiedResult.value) {
818
846
  mergedValue = mergeJsonTypeDefinitions(
@@ -849,6 +877,7 @@ export default function gatherDataForMocks(
849
877
  0, // Use 0 to trigger variable-qualified lookup
850
878
  options,
851
879
  hookCallIndex,
880
+ prebuiltIndexes,
852
881
  );
853
882
  if (varQualifiedResult && varQualifiedResult.value) {
854
883
  // Deep merge the value into the accumulated result
@@ -16,7 +16,7 @@ import { awsLog } from '~codeyam/utils';
16
16
  import gatherDataForMocks from './gatherDataForMocks';
17
17
  import enrichArrayTypesFromChildSignatures from './enrichArrayTypesFromChildSignatures';
18
18
  import enrichUnknownTypesFromSourceEquivalencies from './enrichUnknownTypesFromSourceEquivalencies';
19
-
19
+ // import propagateArrayItemSchemas from './propagateArrayItemSchemas';
20
20
  export interface GenerateDataStructureArgs {
21
21
  entity: Entity;
22
22
  dependentAnalyses: ReadonlyAnalysisMap;
@@ -256,8 +256,10 @@ export default function generateDataStructure({
256
256
  );
257
257
 
258
258
  if (existingImport) {
259
- // Merge callVariableNames if the same dependency exists with different patterns
260
- if (imported.callVariableNames && imported.calls) {
259
+ // Merge calls from child into existing import
260
+ // Note: Check length > 0 because empty array [] is truthy but has no variable names
261
+ if (imported.callVariableNames?.length && imported.calls) {
262
+ // Case 1: Both calls and callVariableNames are set - merge as pairs
261
263
  existingImport.calls = existingImport.calls || [];
262
264
  existingImport.callVariableNames =
263
265
  existingImport.callVariableNames || [];
@@ -274,6 +276,18 @@ export default function generateDataStructure({
274
276
  existingImport.callVariableNames.push(varName);
275
277
  }
276
278
  }
279
+ } else if (imported.calls) {
280
+ // Case 2: Only calls are set (no callVariableNames) - common with tRPC
281
+ // where destructuring like `const { data, isLoading } = trpc.xxx.useQuery()`
282
+ // doesn't create a variable name for the hook call itself
283
+ existingImport.calls = existingImport.calls || [];
284
+
285
+ // Add each call that doesn't already exist
286
+ for (const call of imported.calls) {
287
+ if (!existingImport.calls.includes(call)) {
288
+ existingImport.calls.push(call);
289
+ }
290
+ }
277
291
  }
278
292
  } else {
279
293
  // Add new import
@@ -456,11 +470,34 @@ export default function generateDataStructure({
456
470
 
457
471
  if (existingSchema) {
458
472
  // Merge schemas - child schemas add to parent schemas
473
+ // But prefer more specific types (without | undefined) when both exist
474
+ const mergedSignatureSchema = { ...existingSchema.signatureSchema };
475
+ for (const path in childSchema.signatureSchema) {
476
+ const existingType = mergedSignatureSchema[path];
477
+ const childType = childSchema.signatureSchema[path];
478
+ if (!existingType) {
479
+ mergedSignatureSchema[path] = childType;
480
+ } else {
481
+ // Prefer the more specific (narrower) type
482
+ const existingIsOptional =
483
+ existingType.includes('| undefined') ||
484
+ existingType.includes('| null');
485
+ const childIsOptional =
486
+ childType.includes('| undefined') ||
487
+ childType.includes('| null');
488
+ if (childIsOptional && !existingIsOptional) {
489
+ // Keep existing - it's more specific
490
+ } else if (!childIsOptional && existingIsOptional) {
491
+ // Use child - it's more specific
492
+ mergedSignatureSchema[path] = childType;
493
+ } else {
494
+ // Same specificity - use child (original behavior)
495
+ mergedSignatureSchema[path] = childType;
496
+ }
497
+ }
498
+ }
459
499
  mergedDataStructure.dependencySchemas[schemaFilePath][schemaName] = {
460
- signatureSchema: {
461
- ...existingSchema.signatureSchema,
462
- ...childSchema.signatureSchema,
463
- },
500
+ signatureSchema: mergedSignatureSchema,
464
501
  returnValueSchema: mergeJsonTypeDefinitions(
465
502
  existingSchema.returnValueSchema as Record<string, unknown>,
466
503
  childSchema.returnValueSchema as Record<string, unknown>,
@@ -527,10 +564,13 @@ export default function generateDataStructure({
527
564
 
528
565
  // Enrich mocked dependency array types with fields from child component signatures
529
566
  // This ensures that when getSurveysAction returns { data: array }, and SurveyCard
530
- // expects survey.updatedAt, the array element type includes updatedAt
567
+ // expects survey.updatedAt, the array element type includes updatedAt.
568
+ // Uses usageEquivalencies to trace data flow and only enrich arrays with fields
569
+ // from children that actually receive elements from that specific array.
531
570
  enrichArrayTypesFromChildSignatures(
532
571
  allImportedExports,
533
572
  mergedDataStructure.dependencySchemas,
573
+ mergedDataStructure.usageEquivalencies,
534
574
  );
535
575
 
536
576
  // Enrich mocked dependency unknown types using sourceEquivalencies
@@ -544,12 +584,40 @@ export default function generateDataStructure({
544
584
  allImportedExports,
545
585
  );
546
586
 
547
- const dataForMocks = gatherDataForMocks(
587
+ // DISABLED: Testing if ternary fix eliminates the need for this heuristic
588
+ // Propagate array item schemas between arrays that likely have the same type.
589
+ // When one array (e.g., entities) has item schema traced but another similar array
590
+ // (e.g., currentEntities) doesn't (because it's only used in an OR expression fallback),
591
+ // copy the item schema from the rich array to the empty one.
592
+ // propagateArrayItemSchemas(mergedDataStructure.dependencySchemas);
593
+
594
+ let dataForMocks = gatherDataForMocks(
548
595
  allImportedExports,
549
596
  mergedDataStructure.dependencySchemas,
550
597
  { entityName: entity.name },
551
598
  );
552
599
 
600
+ // Merge dataForMocks from non-mocked child analyses to include transitive dependency data.
601
+ // This handles cases where grandchild trpc calls aren't in allImportedExports because
602
+ // the grandchild's analysis wasn't in dependentAnalyses.
603
+ //
604
+ // Issue 19 fix: The child's dataForMocks already contains merged data from its
605
+ // dependencies (including grandchildren). By merging the child's dataForMocks,
606
+ // we transitively include all nested dependency data.
607
+ for (const filePath in nonMockedDependentAnalyses) {
608
+ for (const name in nonMockedDependentAnalyses[filePath]) {
609
+ const childAnalysis = nonMockedDependentAnalyses[filePath][name];
610
+ const childDataForMocks =
611
+ childAnalysis?.metadata?.scenariosDataStructure?.dataForMocks;
612
+ if (childDataForMocks && Object.keys(childDataForMocks).length > 0) {
613
+ dataForMocks = mergeJsonTypeDefinitions(
614
+ dataForMocks as Record<string, unknown>,
615
+ childDataForMocks as Record<string, unknown>,
616
+ ) as { [importAlias: string]: JsonTypeDefinition };
617
+ }
618
+ }
619
+ }
620
+
553
621
  const finalizedArgumentsSchema = fillInDirectSchemaGapsAndUnknowns({
554
622
  schema: { ...mergedDataStructure.signatureSchema },
555
623
  });