@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.4684848

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 (451) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +6 -6
  4. package/analyzer-template/packages/ai/index.ts +7 -1
  5. package/analyzer-template/packages/ai/package.json +2 -2
  6. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +62 -18
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
  8. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
  9. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +409 -50
  10. package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +21 -6
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +992 -249
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +31 -3
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +37 -15
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +140 -14
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -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 +367 -96
  23. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +33 -15
  24. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
  25. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +315 -6
  26. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
  27. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +49 -5
  28. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  29. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +649 -142
  30. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
  31. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
  32. package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
  33. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  34. package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
  35. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  36. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
  37. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
  38. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
  39. package/analyzer-template/packages/analyze/index.ts +2 -0
  40. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  41. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  42. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  43. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  44. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  45. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  46. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  47. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  48. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +89 -9
  49. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
  50. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  51. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
  52. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  53. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  54. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
  55. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
  56. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +87 -25
  57. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
  58. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
  59. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +571 -74
  60. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  61. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  62. package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
  63. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  64. package/analyzer-template/packages/aws/package.json +1 -1
  65. package/analyzer-template/packages/database/package.json +1 -1
  66. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  67. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  68. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  69. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  70. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  71. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  72. package/analyzer-template/packages/database/src/lib/kysely/db.ts +6 -0
  73. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
  74. package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
  75. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  76. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  77. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  78. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  79. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  80. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  81. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  82. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  83. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  85. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  87. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  89. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  90. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  91. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  92. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  93. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +3 -0
  94. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  95. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
  96. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
  97. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
  98. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  99. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  100. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  102. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  103. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  104. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  105. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  106. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  107. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  108. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  109. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  110. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  111. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  112. package/analyzer-template/packages/github/package.json +1 -1
  113. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +7 -0
  114. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
  115. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  116. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  117. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  118. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  119. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  120. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  121. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  122. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  123. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +93 -2
  124. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  125. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +108 -2
  126. package/analyzer-template/project/constructMockCode.ts +90 -10
  127. package/analyzer-template/project/writeMockDataTsx.ts +181 -8
  128. package/analyzer-template/project/writeScenarioComponents.ts +60 -12
  129. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  130. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  131. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  132. package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
  133. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  134. package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
  135. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  136. package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
  137. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  138. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  139. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  140. package/codeyam-cli/scripts/apply-setup.js +180 -0
  141. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  142. package/codeyam-cli/src/cli.js +2 -0
  143. package/codeyam-cli/src/cli.js.map +1 -1
  144. package/codeyam-cli/src/codeyam-cli.js +18 -2
  145. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  146. package/codeyam-cli/src/commands/analyze.js +4 -2
  147. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  148. package/codeyam-cli/src/commands/baseline.js +2 -0
  149. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  150. package/codeyam-cli/src/commands/debug.js +9 -5
  151. package/codeyam-cli/src/commands/debug.js.map +1 -1
  152. package/codeyam-cli/src/commands/default.js +31 -20
  153. package/codeyam-cli/src/commands/default.js.map +1 -1
  154. package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
  155. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
  156. package/codeyam-cli/src/commands/init.js +49 -257
  157. package/codeyam-cli/src/commands/init.js.map +1 -1
  158. package/codeyam-cli/src/commands/memory.js +17 -26
  159. package/codeyam-cli/src/commands/memory.js.map +1 -1
  160. package/codeyam-cli/src/commands/recapture.js +2 -0
  161. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  162. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  163. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  164. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  165. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  166. package/codeyam-cli/src/commands/test-startup.js +2 -0
  167. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  168. package/codeyam-cli/src/commands/verify.js +14 -2
  169. package/codeyam-cli/src/commands/verify.js.map +1 -1
  170. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
  171. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  172. package/codeyam-cli/src/utils/analyzer.js +7 -0
  173. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  174. package/codeyam-cli/src/utils/backgroundServer.js +9 -0
  175. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  176. package/codeyam-cli/src/utils/generateReport.js +2 -2
  177. package/codeyam-cli/src/utils/install-skills.js +70 -45
  178. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  179. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  180. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  181. package/codeyam-cli/src/utils/progress.js +7 -0
  182. package/codeyam-cli/src/utils/progress.js.map +1 -1
  183. package/codeyam-cli/src/utils/queue/job.js +4 -0
  184. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  185. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  186. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  187. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  188. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  189. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
  190. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  191. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  192. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  193. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  194. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  195. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  196. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  197. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  198. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  199. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
  200. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  201. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
  202. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  203. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
  204. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  205. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  206. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  207. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  208. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  209. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  210. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  211. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  212. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  213. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  214. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  215. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  216. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  217. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  218. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  219. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  220. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  221. package/codeyam-cli/src/utils/rules/index.js +1 -0
  222. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  223. package/codeyam-cli/src/utils/rules/parser.js +2 -25
  224. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  225. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  226. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  227. package/codeyam-cli/src/utils/rules/staleness.js +16 -11
  228. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
  229. package/codeyam-cli/src/utils/serverState.js +37 -10
  230. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  231. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
  232. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  233. package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
  234. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  235. package/codeyam-cli/src/webserver/backgroundServer.js +24 -0
  236. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  237. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CQ-wF3Tv.js +1 -0
  238. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-HdckCi0m.js} +1 -1
  239. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-Dh5RJMOE.js} +1 -1
  240. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BnjjBHJu.js} +1 -1
  241. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-CUSfu6W5.js} +1 -1
  242. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-Coll1aD6.js} +2 -2
  243. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-lYMY8h-y.js} +1 -1
  244. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-ay8XeA59.js} +1 -1
  245. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Dpul1_ik.js} +1 -1
  246. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-CRBCfV2W.js} +3 -8
  247. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-DRTFDNFt.js} +1 -1
  248. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-d6PSFxhS.js} +2 -2
  249. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-DDEOQ6Iw.js} +1 -1
  250. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-CkziGg5F.js} +1 -1
  251. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-B2v1pm9w.js} +6 -11
  252. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-BXIaK8Md.js +11 -0
  253. package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
  254. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  255. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  256. package/codeyam-cli/src/webserver/build/client/assets/book-open-qbapxy6o.js +6 -0
  257. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-C-mKrwr1.js} +1 -1
  258. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-BAvUl1nT.js} +12 -12
  259. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-DlrT-SzI.js} +1 -1
  260. package/codeyam-cli/src/webserver/build/client/assets/copy-clIxnCqQ.js +11 -0
  261. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-B931Etud.js} +1 -1
  262. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-BBnGWYga.js → dev.empty-BoPM6KnE.js} +1 -1
  263. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-oVRMh9Hl.js +16 -0
  264. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-BjyzwQ7H.js} +1 -1
  265. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DxuyDmZA.js} +1 -1
  266. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-DESSZGQp.js} +1 -1
  267. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-D5Yb90Ad.js} +1 -1
  268. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DuObVYgh.js} +1 -1
  269. package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-CDfz4Y-i.js} +1 -1
  270. package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-D6jOlDQw.js} +1 -1
  271. package/codeyam-cli/src/webserver/build/client/assets/globals-CKT08Djd.css +1 -0
  272. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-DvOt1KIt.js} +1 -1
  273. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-WfQFdoWK.js} +1 -1
  274. package/codeyam-cli/src/webserver/build/client/assets/labs-BbGyC1RY.js +1 -0
  275. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-Bb7Y9k5O.js} +1 -1
  276. package/codeyam-cli/src/webserver/build/client/assets/manifest-fd06e67a.js +1 -0
  277. package/codeyam-cli/src/webserver/build/client/assets/memory-BXebUPaL.js +78 -0
  278. package/codeyam-cli/src/webserver/build/client/assets/pause-DaAHX2on.js +11 -0
  279. package/codeyam-cli/src/webserver/build/client/assets/root-CvNE9MaT.js +62 -0
  280. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-DIqAPIrO.js} +1 -1
  281. package/codeyam-cli/src/webserver/build/client/assets/settings-DCIzBZM9.js +1 -0
  282. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-C6n_fNQY.js} +1 -1
  283. package/codeyam-cli/src/webserver/build/client/assets/terminal-CmPsszJy.js +11 -0
  284. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-Beg-oV50.js} +1 -1
  285. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-D7TLbP3M.js} +1 -1
  286. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-Ce5rnai3.js} +1 -1
  287. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-B4D3wj27.js} +1 -1
  288. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-BDt_-DnY.js} +1 -1
  289. package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-DDr9Cp9M.js} +1 -1
  290. package/codeyam-cli/src/webserver/build/server/assets/server-build-DjwiujaU.js +257 -0
  291. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  292. package/codeyam-cli/src/webserver/build-info.json +5 -5
  293. package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
  294. package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
  295. package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
  296. package/codeyam-cli/templates/codeyam-memory.md +392 -0
  297. package/codeyam-cli/templates/codeyam-new-rule.md +13 -0
  298. package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
  299. package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
  300. package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
  301. package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
  302. package/codeyam-cli/templates/rule-notification-hook.py +56 -0
  303. package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
  304. package/codeyam-cli/templates/rules-instructions.md +132 -0
  305. package/package.json +10 -10
  306. package/packages/ai/index.js +3 -2
  307. package/packages/ai/index.js.map +1 -1
  308. package/packages/ai/src/lib/analyzeScope.js +50 -13
  309. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  310. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  311. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  312. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  313. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  314. package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
  315. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  316. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  317. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  318. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +763 -171
  319. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  320. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  321. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  322. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  323. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  324. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  325. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  326. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +33 -3
  327. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  328. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +36 -11
  329. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  330. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  331. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  332. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
  333. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  334. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  335. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  336. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  337. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  338. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +309 -84
  339. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  340. package/packages/ai/src/lib/dataStructureChunking.js +26 -11
  341. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  342. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  343. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  344. package/packages/ai/src/lib/generateEntityScenarioData.js +227 -4
  345. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  346. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  347. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  348. package/packages/ai/src/lib/generateExecutionFlows.js +26 -4
  349. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  350. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
  351. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  352. package/packages/ai/src/lib/isolateScopes.js +39 -3
  353. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  354. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  355. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  356. package/packages/ai/src/lib/mergeStatements.js +70 -51
  357. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  358. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  359. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  360. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  361. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  362. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  363. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  364. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  365. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  366. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  367. package/packages/analyze/index.js +1 -0
  368. package/packages/analyze/index.js.map +1 -1
  369. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  370. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  371. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  372. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  373. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  374. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  375. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  376. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  377. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  378. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  379. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  380. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  381. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  382. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  383. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  384. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  385. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +65 -7
  386. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  387. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
  388. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  389. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  390. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  391. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  392. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  393. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  394. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  395. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  396. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  397. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
  398. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  399. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
  400. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  401. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +75 -21
  402. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  403. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
  404. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  405. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  406. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  407. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +478 -54
  408. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  409. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  410. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  411. package/packages/analyze/src/lib/index.js +1 -0
  412. package/packages/analyze/src/lib/index.js.map +1 -1
  413. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  414. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  415. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  416. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  417. package/packages/database/src/lib/analysisToDb.js +1 -1
  418. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  419. package/packages/database/src/lib/branchToDb.js +1 -1
  420. package/packages/database/src/lib/branchToDb.js.map +1 -1
  421. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  422. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  423. package/packages/database/src/lib/commitToDb.js +1 -1
  424. package/packages/database/src/lib/commitToDb.js.map +1 -1
  425. package/packages/database/src/lib/fileToDb.js +1 -1
  426. package/packages/database/src/lib/fileToDb.js.map +1 -1
  427. package/packages/database/src/lib/kysely/db.js +3 -0
  428. package/packages/database/src/lib/kysely/db.js.map +1 -1
  429. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  430. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  431. package/packages/database/src/lib/projectToDb.js +1 -1
  432. package/packages/database/src/lib/projectToDb.js.map +1 -1
  433. package/packages/database/src/lib/saveFiles.js +1 -1
  434. package/packages/database/src/lib/saveFiles.js.map +1 -1
  435. package/packages/database/src/lib/scenarioToDb.js +1 -1
  436. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  437. package/packages/utils/src/lib/fs/rsyncCopy.js +93 -2
  438. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  439. package/scripts/finalize-analyzer.cjs +8 -76
  440. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
  441. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-BJUiQqZF.js +0 -23
  442. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
  443. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  444. package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +0 -1
  445. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
  446. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
  447. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  448. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
  449. package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
  450. package/codeyam-cli/templates/codeyam:memory.md +0 -462
  451. package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
@@ -101,27 +101,47 @@ export default function enrichArrayTypesFromChildSignatures(
101
101
  ): void => {
102
102
  // Group by prop name (e.g., signature[0].survey.id, signature[0].survey.name -> "survey")
103
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> = {};
104
106
 
105
107
  for (const [path, type] of Object.entries(schema)) {
106
108
  // Match signature[0].propName.field or signature[0].propName[].field patterns
107
109
  // The (?:\[\])? makes array props optional, handling both:
108
110
  // - signature[0].survey.updatedAt (object prop)
109
111
  // - signature[0].questionAnswers[].question.questionText (array prop)
110
- const match = path.match(/^signature\[0\]\.(\w+)(?:\[\])?\.(.+)$/);
111
- if (match) {
112
- const [, propName, fieldPath] = match;
112
+ const nestedMatch = path.match(/^signature\[0\]\.(\w+)(?:\[\])?\.(.+)$/);
113
+ if (nestedMatch) {
114
+ const [, propName, fieldPath] = nestedMatch;
113
115
  propGroups[propName] ||= {};
114
116
  propGroups[propName][fieldPath] = type;
117
+ continue;
118
+ }
119
+
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;
115
126
  }
116
127
  }
117
128
 
118
- // Store with the full signature path as key
129
+ // Store nested prop groups with the full signature path as key
119
130
  for (const [propName, fields] of Object.entries(propGroups)) {
120
131
  if (Object.keys(fields).length > 0) {
121
132
  const signaturePath = `${entityName}().signature[0].${propName}`;
122
133
  childSignatureFieldsByPath.set(signaturePath, { propName, fields });
123
134
  }
124
135
  }
136
+
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,
143
+ });
144
+ }
125
145
  };
126
146
 
127
147
  // Process all schemas in dependencySchemas
@@ -187,15 +207,20 @@ export default function enrichArrayTypesFromChildSignatures(
187
207
  for (const { filePath, entityName, arrayPath } of mockedArrayPaths) {
188
208
  const schema = dependencySchemas[filePath][entityName].returnValueSchema;
189
209
 
190
- // Check if this array already has element type definitions
210
+ // Check if this array already has INDEXED element type definitions (e.g., [0]: null)
191
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
192
213
  const elementPathPrefix = `${arrayPath}[`;
193
- const hasExistingElementType = Object.keys(schema).some((path) =>
194
- path.startsWith(elementPathPrefix),
195
- );
196
-
197
- if (hasExistingElementType) {
198
- // Array already has element type info (e.g., useAutoAnimate()[0]: null)
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
+ });
221
+
222
+ if (hasIndexedElementType) {
223
+ // Array already has indexed element type info (e.g., useAutoAnimate()[0]: null)
199
224
  // Don't override it with child signature fields
200
225
  continue;
201
226
  }
@@ -218,7 +243,17 @@ export default function enrichArrayTypesFromChildSignatures(
218
243
 
219
244
  // Check if this local variable could have come from this mocked function
220
245
  // Use heuristics: name matching (getSurveys -> surveys, getUsers -> users)
221
- if (!couldBeDerivedFrom(localVarName, entityName)) {
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
+ // Full-path usageEquivalencies (e.g., from same-file child components) use
250
+ // the complete call path as the local var name, which matches arrayPath exactly
251
+ const exactPathMatch = localVarName === arrayPath;
252
+ if (
253
+ !exactPathMatch &&
254
+ !couldBeDerivedFrom(localVarName, entityName) &&
255
+ !arrayEndsWithLocalVar
256
+ ) {
222
257
  continue;
223
258
  }
224
259
 
@@ -257,8 +292,21 @@ export default function enrichArrayTypesFromChildSignatures(
257
292
 
258
293
  for (const [fieldPath, type] of Object.entries(matchedFields)) {
259
294
  const fullPath = `${elementPath}.${fieldPath}`;
260
- if (!schema[fullPath]) {
295
+ const existingType = schema[fullPath];
296
+ if (!existingType) {
261
297
  schema[fullPath] = type;
298
+ } else {
299
+ // Prefer the more specific (narrower) type
300
+ const existingIsOptional =
301
+ existingType.includes('| undefined') ||
302
+ existingType.includes('| null');
303
+ const newIsOptional =
304
+ type.includes('| undefined') || type.includes('| null');
305
+ if (existingIsOptional && !newIsOptional) {
306
+ // Use the new type - it's more specific
307
+ schema[fullPath] = type;
308
+ }
309
+ // Otherwise keep existing (same specificity or existing is more specific)
262
310
  }
263
311
  }
264
312
  }
@@ -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
 
@@ -350,8 +353,6 @@ function processCall(
350
353
  // Preprocess to filter signatures and extract functionCallReturnValue
351
354
  let preprocessedSchema = preprocessSchemaForMocks(mergedSchema);
352
355
 
353
- const functionNames: string[] = [];
354
-
355
356
  const isFunctionNameWithoutFunction = (
356
357
  path: string,
357
358
  functionName: string,
@@ -436,35 +437,63 @@ function processCall(
436
437
  }
437
438
  }
438
439
 
439
- const relevantMergedDependencySchema = Object.keys(preprocessedSchema).reduce(
440
- (acc, path) => {
441
- if (path.endsWith(')')) {
442
- const pathParts = splitOutsideParenthesesAndArrays(path);
443
- const functionName = joinParenthesesAndArrays([
444
- ...pathParts.slice(0, -1),
445
- pathParts[pathParts.length - 1].split('(')[0],
446
- ]);
447
- functionNames.push(functionName);
448
- for (const existingPath in acc) {
449
- if (isFunctionNameWithoutFunction(existingPath, functionName)) {
450
- delete acc[existingPath];
451
- }
452
- }
453
- }
440
+ // Two-pass function name filtering to avoid O() retroactive deletion.
441
+ // Pass 1: Discover all unique function names from paths ending with ')'
442
+ const functionNameSet = new Set<string>();
443
+ const schemaKeys = Object.keys(preprocessedSchema);
444
+ for (const path of schemaKeys) {
445
+ if (path.endsWith(')')) {
446
+ const pathParts = splitOutsideParenthesesAndArrays(path);
447
+ const functionName = joinParenthesesAndArrays([
448
+ ...pathParts.slice(0, -1),
449
+ pathParts[pathParts.length - 1].split('(')[0],
450
+ ]);
451
+ functionNameSet.add(functionName);
452
+ }
453
+ }
454
454
 
455
- if (functionNames.some((fn) => isFunctionNameWithoutFunction(path, fn))) {
456
- return acc;
457
- }
455
+ // Index function names by first segment for O(1) bucket lookup instead of
456
+ // checking all function names for every path. Most paths only need to check
457
+ // 1-2 function names instead of all F.
458
+ const fnByFirstSegment = new Map<string, string[]>();
459
+ for (const fn of functionNameSet) {
460
+ const dotIdx = fn.indexOf('.');
461
+ const firstSeg = dotIdx >= 0 ? fn.slice(0, dotIdx) : fn;
462
+ let bucket = fnByFirstSegment.get(firstSeg);
463
+ if (!bucket) {
464
+ bucket = [];
465
+ fnByFirstSegment.set(firstSeg, bucket);
466
+ }
467
+ bucket.push(fn);
468
+ }
458
469
 
459
- acc[path] = preprocessedSchema[path];
460
- return acc;
461
- },
462
- {} as Record<string, string>,
463
- );
470
+ // Pass 2: Filter paths that match any discovered function name prefix.
471
+ // Use indexed lookup: extract path's first segment, check only matching function names.
472
+ const relevantMergedDependencySchema: Record<string, string> = {};
473
+ for (const path of schemaKeys) {
474
+ // Extract first segment of path (before first '.', '(', or '<')
475
+ const dotIdx = path.indexOf('.');
476
+ const parenIdx = path.indexOf('(');
477
+ const angleIdx = path.indexOf('<');
478
+ let minIdx = path.length;
479
+ if (dotIdx >= 0 && dotIdx < minIdx) minIdx = dotIdx;
480
+ if (parenIdx >= 0 && parenIdx < minIdx) minIdx = parenIdx;
481
+ if (angleIdx >= 0 && angleIdx < minIdx) minIdx = angleIdx;
482
+ const firstSeg = path.slice(0, minIdx);
483
+
484
+ const candidates = fnByFirstSegment.get(firstSeg);
485
+ if (
486
+ !candidates ||
487
+ !candidates.some((fn) => isFunctionNameWithoutFunction(path, fn))
488
+ ) {
489
+ relevantMergedDependencySchema[path] = preprocessedSchema[path];
490
+ }
491
+ }
464
492
 
465
493
  const filledSchema = fillInDirectSchemaGapsAndUnknowns({
466
494
  scopeName: importedExport.name,
467
495
  schema: relevantMergedDependencySchema,
496
+ prebuiltIndexes,
468
497
  });
469
498
 
470
499
  const schema = convertDotNotation(filledSchema);
@@ -568,6 +597,33 @@ export default function gatherDataForMocks(
568
597
  dependencySchemas: DataStructure['dependencySchemas'],
569
598
  options?: GatherDataForMocksOptions,
570
599
  ) {
600
+ // Build schema indexes ONCE from all dependency schemas combined.
601
+ // This avoids rebuilding indexes (~1-2 seconds for 18k keys) for each processCall.
602
+ //
603
+ // IMPORTANT: We must preprocess schemas BEFORE building indexes!
604
+ // The schemas contain .functionCallReturnValue paths that get stripped during processing.
605
+ // If we build indexes from original paths, lookups with preprocessed paths will fail.
606
+ // Example: 'hook().functionCallReturnValue.x.length' → index maps 'hook().functionCallReturnValue.x' → ['length']
607
+ // But preprocessed path 'hook().x.length' looks for 'hook().x' which doesn't exist in the index.
608
+ const allSchemaKeys: Record<string, string> = {};
609
+ if (dependencySchemas) {
610
+ for (const filePath in dependencySchemas) {
611
+ for (const entityName in dependencySchemas[filePath]) {
612
+ const schema =
613
+ dependencySchemas[filePath][entityName]?.returnValueSchema;
614
+ if (schema) {
615
+ // Preprocess each schema to remove .functionCallReturnValue before collecting
616
+ const preprocessed = preprocessSchemaForMocks(schema);
617
+ Object.assign(allSchemaKeys, preprocessed);
618
+ }
619
+ }
620
+ }
621
+ }
622
+ const prebuiltIndexes =
623
+ Object.keys(allSchemaKeys).length > 0
624
+ ? buildSchemaIndexes(allSchemaKeys)
625
+ : undefined;
626
+
571
627
  // Track the global index for each hook name across all imports
572
628
  // This enables canonical keys like EntityName::useLoaderData::0, EntityName::useFetcher::0, etc.
573
629
  const hookCallIndices: Record<string, number> = {};
@@ -653,6 +709,7 @@ export default function gatherDataForMocks(
653
709
  undefined,
654
710
  options,
655
711
  hookCallIndex,
712
+ prebuiltIndexes,
656
713
  );
657
714
 
658
715
  if (processResult) {
@@ -717,6 +774,7 @@ export default function gatherDataForMocks(
717
774
  occurrence,
718
775
  options,
719
776
  hookCallIndex,
777
+ prebuiltIndexes,
720
778
  );
721
779
  if (processResult) {
722
780
  addResultToAccumulator(acc, processResult.key, processResult.value);
@@ -749,6 +807,7 @@ export default function gatherDataForMocks(
749
807
  undefined,
750
808
  options,
751
809
  hookCallIndex,
810
+ prebuiltIndexes,
752
811
  );
753
812
 
754
813
  if (processResult) {
@@ -769,6 +828,7 @@ export default function gatherDataForMocks(
769
828
  undefined,
770
829
  options,
771
830
  hookCallIndex,
831
+ prebuiltIndexes,
772
832
  );
773
833
 
774
834
  // Check if we got a meaningful result (not empty object or null)
@@ -813,6 +873,7 @@ export default function gatherDataForMocks(
813
873
  0, // Use 0 to trigger variable-qualified lookup
814
874
  options,
815
875
  hookCallIndex,
876
+ prebuiltIndexes,
816
877
  );
817
878
  if (varQualifiedResult && varQualifiedResult.value) {
818
879
  mergedValue = mergeJsonTypeDefinitions(
@@ -849,6 +910,7 @@ export default function gatherDataForMocks(
849
910
  0, // Use 0 to trigger variable-qualified lookup
850
911
  options,
851
912
  hookCallIndex,
913
+ prebuiltIndexes,
852
914
  );
853
915
  if (varQualifiedResult && varQualifiedResult.value) {
854
916
  // Deep merge the value into the accumulated result
@@ -16,6 +16,8 @@ import { awsLog } from '~codeyam/utils';
16
16
  import gatherDataForMocks from './gatherDataForMocks';
17
17
  import enrichArrayTypesFromChildSignatures from './enrichArrayTypesFromChildSignatures';
18
18
  import enrichUnknownTypesFromSourceEquivalencies from './enrichUnknownTypesFromSourceEquivalencies';
19
+ import { transformationTracer } from './TransformationTracer';
20
+ // import propagateArrayItemSchemas from './propagateArrayItemSchemas';
19
21
  export interface GenerateDataStructureArgs {
20
22
  entity: Entity;
21
23
  dependentAnalyses: ReadonlyAnalysisMap;
@@ -162,6 +164,25 @@ export default function generateDataStructure({
162
164
  return acc;
163
165
  }, {} as ReadonlyAnalysisMap);
164
166
 
167
+ // Include same-file child components in nonMockedDependentAnalyses.
168
+ // Same-file components (e.g., AgentCard defined in the same file as AgentTranscriptsPage)
169
+ // are NOT in importedExports, so the reduce above never includes them.
170
+ // But they ARE in dependentAnalyses and their full signatureSchema (with all prop fields)
171
+ // needs to be merged into the parent's dependencySchemas for array enrichment to work.
172
+
173
+ const sameFileAnalyses = dependentAnalyses[entity.filePath];
174
+ if (sameFileAnalyses) {
175
+ for (const name in sameFileAnalyses) {
176
+ if (name === entity.name) continue;
177
+ if (nonMockedDependentAnalyses[entity.filePath]?.[name]) continue;
178
+ const childAnalysis = sameFileAnalyses[name];
179
+ if (childAnalysis?.entityType === 'visual') {
180
+ nonMockedDependentAnalyses[entity.filePath] ||= {};
181
+ nonMockedDependentAnalyses[entity.filePath][name] = childAnalysis;
182
+ }
183
+ }
184
+ }
185
+
165
186
  // For non-mocked child components (like visual components), include their mocked
166
187
  // dependencies in allImportedExports. This ensures that when a parent component
167
188
  // renders a child that uses the same hook with different destructure patterns,
@@ -440,6 +461,18 @@ export default function generateDataStructure({
440
461
 
441
462
  const { isolatedDataStructure } = entity.metadata;
442
463
 
464
+ // Transformation tracing: start entity and capture isolated data structure
465
+ transformationTracer.startEntity({
466
+ name: entity.name,
467
+ entityType: entity.entityType,
468
+ filePath: entity.filePath,
469
+ });
470
+ transformationTracer.snapshot(entity.name, 'isolated', {
471
+ signatureSchema: isolatedDataStructure.signatureSchema,
472
+ returnValueSchema: isolatedDataStructure.returnValueSchema,
473
+ dependencySchemas: isolatedDataStructure.dependencySchemas,
474
+ });
475
+
443
476
  const mergedDataStructure = mergeInDependentDataStructure({
444
477
  importedExports: allImportedExports,
445
478
  dependentAnalyses: nonMockedDependentAnalyses,
@@ -457,6 +490,13 @@ export default function generateDataStructure({
457
490
  mergedDataStructure.environmentVariables =
458
491
  isolatedDataStructure.environmentVariables || [];
459
492
 
493
+ // Transformation tracing: capture merged data structure
494
+ transformationTracer.snapshot(entity.name, 'merged', {
495
+ signatureSchema: mergedDataStructure.signatureSchema,
496
+ returnValueSchema: mergedDataStructure.returnValueSchema,
497
+ dependencySchemas: mergedDataStructure.dependencySchemas,
498
+ });
499
+
460
500
  // Merge collected child dependency schemas into mergedDataStructure.
461
501
  // This ensures that when gatherDataForMocks looks up schemas for child imports,
462
502
  // the child's schemas are available.
@@ -469,11 +509,34 @@ export default function generateDataStructure({
469
509
 
470
510
  if (existingSchema) {
471
511
  // Merge schemas - child schemas add to parent schemas
512
+ // But prefer more specific types (without | undefined) when both exist
513
+ const mergedSignatureSchema = { ...existingSchema.signatureSchema };
514
+ for (const path in childSchema.signatureSchema) {
515
+ const existingType = mergedSignatureSchema[path];
516
+ const childType = childSchema.signatureSchema[path];
517
+ if (!existingType) {
518
+ mergedSignatureSchema[path] = childType;
519
+ } else {
520
+ // Prefer the more specific (narrower) type
521
+ const existingIsOptional =
522
+ existingType.includes('| undefined') ||
523
+ existingType.includes('| null');
524
+ const childIsOptional =
525
+ childType.includes('| undefined') ||
526
+ childType.includes('| null');
527
+ if (childIsOptional && !existingIsOptional) {
528
+ // Keep existing - it's more specific
529
+ } else if (!childIsOptional && existingIsOptional) {
530
+ // Use child - it's more specific
531
+ mergedSignatureSchema[path] = childType;
532
+ } else {
533
+ // Same specificity - use child (original behavior)
534
+ mergedSignatureSchema[path] = childType;
535
+ }
536
+ }
537
+ }
472
538
  mergedDataStructure.dependencySchemas[schemaFilePath][schemaName] = {
473
- signatureSchema: {
474
- ...existingSchema.signatureSchema,
475
- ...childSchema.signatureSchema,
476
- },
539
+ signatureSchema: mergedSignatureSchema,
477
540
  returnValueSchema: mergeJsonTypeDefinitions(
478
541
  existingSchema.returnValueSchema as Record<string, unknown>,
479
542
  childSchema.returnValueSchema as Record<string, unknown>,
@@ -487,6 +550,13 @@ export default function generateDataStructure({
487
550
  }
488
551
  }
489
552
 
553
+ // Transformation tracing: capture after child schemas merged
554
+ transformationTracer.snapshot(entity.name, 'childSchemasMerged', {
555
+ signatureSchema: mergedDataStructure.signatureSchema,
556
+ returnValueSchema: mergedDataStructure.returnValueSchema,
557
+ dependencySchemas: mergedDataStructure.dependencySchemas,
558
+ });
559
+
490
560
  // console.info(
491
561
  // 'CODEYAM DEBUG: end merge',
492
562
  // JSON.stringify(
@@ -509,32 +579,111 @@ export default function generateDataStructure({
509
579
 
510
580
  // Deduplicate function schemas in the merged data structure
511
581
  // The merge process might introduce duplicates even if individual schemas were clean
582
+ // Trace deduplication of signatureSchema
583
+ const sigBefore = { ...mergedDataStructure.signatureSchema };
512
584
  mergedDataStructure.signatureSchema = deduplicateFunctionSchemas(
513
585
  mergedDataStructure.signatureSchema,
514
586
  );
587
+ transformationTracer.traceSchemaTransformResult(
588
+ entity.name,
589
+ 'deduplicateFunctionSchemas',
590
+ sigBefore,
591
+ mergedDataStructure.signatureSchema,
592
+ { schemaType: 'signature' },
593
+ );
594
+
595
+ // Trace deduplication of returnValueSchema
596
+ const rvBefore = { ...mergedDataStructure.returnValueSchema };
515
597
  mergedDataStructure.returnValueSchema = deduplicateFunctionSchemas(
516
598
  mergedDataStructure.returnValueSchema,
517
599
  );
600
+ transformationTracer.traceSchemaTransformResult(
601
+ entity.name,
602
+ 'deduplicateFunctionSchemas',
603
+ rvBefore,
604
+ mergedDataStructure.returnValueSchema,
605
+ { schemaType: 'returnValue' },
606
+ );
518
607
 
519
- // Also deduplicate dependency schemas
608
+ // Also deduplicate dependency schemas and clear known attributes
520
609
  for (const filePath in mergedDataStructure.dependencySchemas) {
521
- for (const entityName in mergedDataStructure.dependencySchemas[
610
+ for (const depEntityName in mergedDataStructure.dependencySchemas[
522
611
  filePath
523
612
  ]) {
524
613
  const depSchema =
525
- mergedDataStructure.dependencySchemas[filePath][entityName];
614
+ mergedDataStructure.dependencySchemas[filePath][depEntityName];
615
+
616
+ // Trace deduplication of dependency signatureSchema
617
+ const depSigBefore = { ...depSchema.signatureSchema };
526
618
  depSchema.signatureSchema = deduplicateFunctionSchemas(
527
619
  depSchema.signatureSchema,
528
620
  );
621
+ transformationTracer.traceSchemaTransformResult(
622
+ entity.name,
623
+ 'deduplicateFunctionSchemas',
624
+ depSigBefore,
625
+ depSchema.signatureSchema,
626
+ { filePath, dependencyName: depEntityName, schemaType: 'signature' },
627
+ );
628
+
629
+ // Trace deduplication of dependency returnValueSchema
630
+ const depRvBefore = { ...depSchema.returnValueSchema };
529
631
  depSchema.returnValueSchema = deduplicateFunctionSchemas(
530
632
  depSchema.returnValueSchema,
531
633
  );
634
+ transformationTracer.traceSchemaTransformResult(
635
+ entity.name,
636
+ 'deduplicateFunctionSchemas',
637
+ depRvBefore,
638
+ depSchema.returnValueSchema,
639
+ {
640
+ filePath,
641
+ dependencyName: depEntityName,
642
+ schemaType: 'returnValue',
643
+ },
644
+ );
532
645
 
533
- clearAttributesFromMapping(depSchema.signatureSchema);
534
- clearAttributesFromMapping(depSchema.returnValueSchema);
646
+ // Fill in type gaps BEFORE clearing attributes, so evidence like .includes()
647
+ // is used for type inference before being deleted
648
+
649
+ depSchema.signatureSchema = fillInDirectSchemaGapsAndUnknowns({
650
+ schema: depSchema.signatureSchema,
651
+ });
652
+
653
+ depSchema.returnValueSchema = fillInDirectSchemaGapsAndUnknowns({
654
+ schema: depSchema.returnValueSchema,
655
+ });
656
+
657
+ // Trace clearAttributesFromMapping on dependency schemas
658
+ transformationTracer.traceSchemaTransform(
659
+ entity.name,
660
+ 'clearAttributesFromMapping',
661
+ depSchema.signatureSchema,
662
+ clearAttributesFromMapping,
663
+ { filePath, dependencyName: depEntityName, schemaType: 'signature' },
664
+ );
665
+
666
+ transformationTracer.traceSchemaTransform(
667
+ entity.name,
668
+ 'clearAttributesFromMapping',
669
+ depSchema.returnValueSchema,
670
+ clearAttributesFromMapping,
671
+ {
672
+ filePath,
673
+ dependencyName: depEntityName,
674
+ schemaType: 'returnValue',
675
+ },
676
+ );
535
677
  }
536
678
  }
537
679
 
680
+ // Transformation tracing: capture after deduplication
681
+ transformationTracer.snapshot(entity.name, 'deduplicated', {
682
+ signatureSchema: mergedDataStructure.signatureSchema,
683
+ returnValueSchema: mergedDataStructure.returnValueSchema,
684
+ dependencySchemas: mergedDataStructure.dependencySchemas,
685
+ });
686
+
538
687
  analysis.metadata ||= {};
539
688
  analysis.metadata.mergedDataStructure = mergedDataStructure;
540
689
 
@@ -543,29 +692,70 @@ export default function generateDataStructure({
543
692
  // expects survey.updatedAt, the array element type includes updatedAt.
544
693
  // Uses usageEquivalencies to trace data flow and only enrich arrays with fields
545
694
  // from children that actually receive elements from that specific array.
546
- enrichArrayTypesFromChildSignatures(
547
- allImportedExports,
695
+ transformationTracer.traceDependencySchemaChanges(
696
+ entity.name,
697
+ 'enrichArrayTypesFromChildSignatures',
548
698
  mergedDataStructure.dependencySchemas,
549
- mergedDataStructure.usageEquivalencies,
699
+ () =>
700
+ enrichArrayTypesFromChildSignatures(
701
+ allImportedExports,
702
+ mergedDataStructure.dependencySchemas,
703
+ mergedDataStructure.usageEquivalencies,
704
+ ),
550
705
  );
551
706
 
707
+ // Transformation tracing: capture after array types enriched
708
+ transformationTracer.snapshot(entity.name, 'arrayTypesEnriched', {
709
+ signatureSchema: mergedDataStructure.signatureSchema,
710
+ returnValueSchema: mergedDataStructure.returnValueSchema,
711
+ dependencySchemas: mergedDataStructure.dependencySchemas,
712
+ });
713
+
552
714
  // Enrich mocked dependency unknown types using sourceEquivalencies
553
715
  // When a mocked dependency returns unknown, but that data flows to a child component
554
716
  // with a known type, propagate the type back to the mocked dependency.
555
717
  // This prevents fillInDirectSchemaGapsAndUnknowns from guessing incorrectly
556
718
  // (e.g., 'data' becoming 'number' because pluralize thinks it's plural)
557
- enrichUnknownTypesFromSourceEquivalencies(
558
- isolatedDataStructure.dependencySchemas || {},
719
+ transformationTracer.traceDependencySchemaChanges(
720
+ entity.name,
721
+ 'enrichUnknownTypesFromSourceEquivalencies',
559
722
  mergedDataStructure.dependencySchemas,
560
- allImportedExports,
723
+ () =>
724
+ enrichUnknownTypesFromSourceEquivalencies(
725
+ isolatedDataStructure.dependencySchemas || {},
726
+ mergedDataStructure.dependencySchemas,
727
+ allImportedExports,
728
+ ),
561
729
  );
562
730
 
731
+ // Transformation tracing: capture after unknown types enriched
732
+ transformationTracer.snapshot(entity.name, 'unknownTypesEnriched', {
733
+ signatureSchema: mergedDataStructure.signatureSchema,
734
+ returnValueSchema: mergedDataStructure.returnValueSchema,
735
+ dependencySchemas: mergedDataStructure.dependencySchemas,
736
+ });
737
+
738
+ // DISABLED: Testing if ternary fix eliminates the need for this heuristic
739
+ // Propagate array item schemas between arrays that likely have the same type.
740
+ // When one array (e.g., entities) has item schema traced but another similar array
741
+ // (e.g., currentEntities) doesn't (because it's only used in an OR expression fallback),
742
+ // copy the item schema from the rich array to the empty one.
743
+ // propagateArrayItemSchemas(mergedDataStructure.dependencySchemas);
744
+
563
745
  let dataForMocks = gatherDataForMocks(
564
746
  allImportedExports,
565
747
  mergedDataStructure.dependencySchemas,
566
748
  { entityName: entity.name },
567
749
  );
568
750
 
751
+ // Transformation tracing: capture after dataForMocks gathered
752
+ transformationTracer.snapshot(entity.name, 'dataForMocksGathered', {
753
+ signatureSchema: mergedDataStructure.signatureSchema,
754
+ returnValueSchema: mergedDataStructure.returnValueSchema,
755
+ dependencySchemas: mergedDataStructure.dependencySchemas,
756
+ dataForMocks,
757
+ });
758
+
569
759
  // Merge dataForMocks from non-mocked child analyses to include transitive dependency data.
570
760
  // This handles cases where grandchild trpc calls aren't in allImportedExports because
571
761
  // the grandchild's analysis wasn't in dependentAnalyses.
@@ -587,11 +777,25 @@ export default function generateDataStructure({
587
777
  }
588
778
  }
589
779
 
590
- const finalizedArgumentsSchema = fillInDirectSchemaGapsAndUnknowns({
591
- schema: { ...mergedDataStructure.signatureSchema },
592
- });
780
+ const finalizedArgumentsSchema = { ...mergedDataStructure.signatureSchema };
593
781
 
594
- clearAttributesFromMapping(finalizedArgumentsSchema);
782
+ // Trace fillInDirectSchemaGapsAndUnknowns
783
+ transformationTracer.traceSchemaTransform(
784
+ entity.name,
785
+ 'fillInDirectSchemaGapsAndUnknowns',
786
+ finalizedArgumentsSchema,
787
+ (schema) => fillInDirectSchemaGapsAndUnknowns({ schema }),
788
+ { stage: 'finalization' },
789
+ );
790
+
791
+ // Trace clearAttributesFromMapping
792
+ transformationTracer.traceSchemaTransform(
793
+ entity.name,
794
+ 'clearAttributesFromMapping',
795
+ finalizedArgumentsSchema,
796
+ clearAttributesFromMapping,
797
+ { stage: 'finalization' },
798
+ );
595
799
 
596
800
  const argumentsSchema = convertDotNotation(finalizedArgumentsSchema)
597
801
  .signature as JsonTypeDefinition[];
@@ -601,6 +805,12 @@ export default function generateDataStructure({
601
805
  dataForMocks,
602
806
  };
603
807
 
808
+ // Transformation tracing: capture final scenariosDataStructure
809
+ transformationTracer.snapshot(entity.name, 'finalized', {
810
+ signatureSchema: finalizedArgumentsSchema,
811
+ dataForMocks,
812
+ });
813
+
604
814
  return analysis;
605
815
  } catch (e) {
606
816
  awsLog('CodeYam Error: Error generating data structure', {