@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.4813bf3

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 (444) 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 +5 -5
  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 +126 -11
  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 +37 -0
  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 +459 -39
  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/project/constructMockCode.ts +90 -10
  123. package/analyzer-template/project/writeMockDataTsx.ts +181 -8
  124. package/analyzer-template/project/writeScenarioComponents.ts +60 -12
  125. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  126. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  127. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  128. package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
  129. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  130. package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
  131. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  132. package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
  133. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  134. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  135. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  136. package/codeyam-cli/scripts/apply-setup.js +180 -0
  137. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  138. package/codeyam-cli/src/cli.js +2 -0
  139. package/codeyam-cli/src/cli.js.map +1 -1
  140. package/codeyam-cli/src/codeyam-cli.js +18 -2
  141. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  142. package/codeyam-cli/src/commands/analyze.js +4 -2
  143. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  144. package/codeyam-cli/src/commands/baseline.js +2 -0
  145. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  146. package/codeyam-cli/src/commands/debug.js +9 -5
  147. package/codeyam-cli/src/commands/debug.js.map +1 -1
  148. package/codeyam-cli/src/commands/default.js +31 -20
  149. package/codeyam-cli/src/commands/default.js.map +1 -1
  150. package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
  151. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
  152. package/codeyam-cli/src/commands/init.js +49 -257
  153. package/codeyam-cli/src/commands/init.js.map +1 -1
  154. package/codeyam-cli/src/commands/memory.js +17 -26
  155. package/codeyam-cli/src/commands/memory.js.map +1 -1
  156. package/codeyam-cli/src/commands/recapture.js +2 -0
  157. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  158. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  159. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  160. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  161. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  162. package/codeyam-cli/src/commands/test-startup.js +2 -0
  163. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  164. package/codeyam-cli/src/commands/verify.js +14 -2
  165. package/codeyam-cli/src/commands/verify.js.map +1 -1
  166. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
  167. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  168. package/codeyam-cli/src/utils/analyzer.js +7 -0
  169. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  170. package/codeyam-cli/src/utils/backgroundServer.js +5 -0
  171. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  172. package/codeyam-cli/src/utils/generateReport.js +2 -2
  173. package/codeyam-cli/src/utils/install-skills.js +70 -45
  174. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  175. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  176. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  177. package/codeyam-cli/src/utils/progress.js +7 -0
  178. package/codeyam-cli/src/utils/progress.js.map +1 -1
  179. package/codeyam-cli/src/utils/queue/job.js +4 -0
  180. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  181. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  182. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  183. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  184. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  185. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
  186. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  187. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  188. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  189. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  190. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  191. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  192. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  193. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  194. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  195. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
  196. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  197. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
  198. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  199. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
  200. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  201. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  202. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  203. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  204. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  205. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  206. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  207. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  208. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  209. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  210. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  211. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  212. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  213. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  214. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  215. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  216. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  217. package/codeyam-cli/src/utils/rules/index.js +1 -0
  218. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  219. package/codeyam-cli/src/utils/rules/parser.js +2 -25
  220. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  221. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  222. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  223. package/codeyam-cli/src/utils/rules/staleness.js +16 -11
  224. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
  225. package/codeyam-cli/src/utils/serverState.js +37 -10
  226. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  227. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
  228. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  229. package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
  230. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  231. package/codeyam-cli/src/webserver/backgroundServer.js +24 -0
  232. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  233. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
  234. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-B86KKU7e.js} +1 -1
  235. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
  236. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
  237. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
  238. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
  239. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
  240. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
  241. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
  242. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-CgMEzchJ.js} +3 -8
  243. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
  244. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-CBui0id_.js} +2 -2
  245. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
  246. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
  247. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-BtBFH820.js} +6 -11
  248. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-CN61MOMa.js +11 -0
  249. package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
  250. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  251. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  252. package/codeyam-cli/src/webserver/build/client/assets/book-open-PttOB2SF.js +6 -0
  253. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
  254. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
  255. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
  256. package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
  257. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
  258. package/codeyam-cli/src/webserver/build/client/assets/{dev.empty-BBnGWYga.js → dev.empty-C0epRiVn.js} +1 -1
  259. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BJUiQqZF.js → entity._sha._-BVnB8a9L.js} +10 -10
  260. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
  261. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
  262. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
  263. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
  264. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
  265. package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-0N0YJQv7.js} +1 -1
  266. package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-DXnyr8uP.js} +1 -1
  267. package/codeyam-cli/src/webserver/build/client/assets/globals-CKT08Djd.css +1 -0
  268. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
  269. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
  270. package/codeyam-cli/src/webserver/build/client/assets/labs-BLJ7HxOC.js +1 -0
  271. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
  272. package/codeyam-cli/src/webserver/build/client/assets/manifest-b171b9d3.js +1 -0
  273. package/codeyam-cli/src/webserver/build/client/assets/memory-CCQd4aZA.js +78 -0
  274. package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
  275. package/codeyam-cli/src/webserver/build/client/assets/root-CHhiHoo_.js +62 -0
  276. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
  277. package/codeyam-cli/src/webserver/build/client/assets/settings-BejnUJ6R.js +1 -0
  278. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
  279. package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
  280. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
  281. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
  282. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
  283. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
  284. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
  285. package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-8Fv-lH1-.js} +1 -1
  286. package/codeyam-cli/src/webserver/build/server/assets/server-build-Akn3iYFP.js +257 -0
  287. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  288. package/codeyam-cli/src/webserver/build-info.json +5 -5
  289. package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
  290. package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
  291. package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
  292. package/codeyam-cli/templates/codeyam-memory.md +392 -0
  293. package/codeyam-cli/templates/codeyam-new-rule.md +13 -0
  294. package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
  295. package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
  296. package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
  297. package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
  298. package/codeyam-cli/templates/rule-notification-hook.py +56 -0
  299. package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
  300. package/codeyam-cli/templates/rules-instructions.md +132 -0
  301. package/package.json +2 -2
  302. package/packages/ai/index.js +3 -2
  303. package/packages/ai/index.js.map +1 -1
  304. package/packages/ai/src/lib/analyzeScope.js +50 -13
  305. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  306. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  307. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  308. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  309. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  310. package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
  311. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  312. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  313. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  314. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +763 -171
  315. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  316. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  317. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  318. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  319. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  320. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  321. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  322. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +33 -3
  323. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  324. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +36 -11
  325. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  326. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  327. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  328. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +113 -11
  329. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  330. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  331. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  332. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  333. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  334. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +309 -84
  335. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  336. package/packages/ai/src/lib/dataStructureChunking.js +26 -11
  337. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  338. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  339. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  340. package/packages/ai/src/lib/generateEntityScenarioData.js +227 -4
  341. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  342. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  343. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  344. package/packages/ai/src/lib/generateExecutionFlows.js +26 -4
  345. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  346. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
  347. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  348. package/packages/ai/src/lib/isolateScopes.js +39 -3
  349. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  350. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  351. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  352. package/packages/ai/src/lib/mergeStatements.js +70 -51
  353. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  354. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  355. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  356. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  357. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  358. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  359. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  360. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  361. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  362. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  363. package/packages/analyze/index.js +1 -0
  364. package/packages/analyze/index.js.map +1 -1
  365. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  366. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  367. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  368. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  369. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  370. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  371. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  372. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  373. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  374. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  375. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  376. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  377. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  378. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  379. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  380. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  381. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +65 -7
  382. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  383. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
  384. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  385. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  386. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  387. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  388. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  389. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  390. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  391. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  392. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  393. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
  394. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  395. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
  396. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  397. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +33 -8
  398. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  399. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
  400. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  401. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  402. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  403. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +399 -31
  404. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  405. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  406. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  407. package/packages/analyze/src/lib/index.js +1 -0
  408. package/packages/analyze/src/lib/index.js.map +1 -1
  409. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  410. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  411. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  412. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  413. package/packages/database/src/lib/analysisToDb.js +1 -1
  414. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  415. package/packages/database/src/lib/branchToDb.js +1 -1
  416. package/packages/database/src/lib/branchToDb.js.map +1 -1
  417. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  418. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  419. package/packages/database/src/lib/commitToDb.js +1 -1
  420. package/packages/database/src/lib/commitToDb.js.map +1 -1
  421. package/packages/database/src/lib/fileToDb.js +1 -1
  422. package/packages/database/src/lib/fileToDb.js.map +1 -1
  423. package/packages/database/src/lib/kysely/db.js +3 -0
  424. package/packages/database/src/lib/kysely/db.js.map +1 -1
  425. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  426. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  427. package/packages/database/src/lib/projectToDb.js +1 -1
  428. package/packages/database/src/lib/projectToDb.js.map +1 -1
  429. package/packages/database/src/lib/saveFiles.js +1 -1
  430. package/packages/database/src/lib/saveFiles.js.map +1 -1
  431. package/packages/database/src/lib/scenarioToDb.js +1 -1
  432. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  433. package/scripts/finalize-analyzer.cjs +8 -76
  434. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
  435. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
  436. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  437. package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +0 -1
  438. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
  439. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
  440. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  441. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
  442. package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
  443. package/codeyam-cli/templates/codeyam:memory.md +0 -462
  444. 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
 
@@ -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,33 @@ 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
+ //
578
+ // IMPORTANT: We must preprocess schemas BEFORE building indexes!
579
+ // The schemas contain .functionCallReturnValue paths that get stripped during processing.
580
+ // If we build indexes from original paths, lookups with preprocessed paths will fail.
581
+ // Example: 'hook().functionCallReturnValue.x.length' → index maps 'hook().functionCallReturnValue.x' → ['length']
582
+ // But preprocessed path 'hook().x.length' looks for 'hook().x' which doesn't exist in the index.
583
+ const allSchemaKeys: Record<string, string> = {};
584
+ if (dependencySchemas) {
585
+ for (const filePath in dependencySchemas) {
586
+ for (const entityName in dependencySchemas[filePath]) {
587
+ const schema =
588
+ dependencySchemas[filePath][entityName]?.returnValueSchema;
589
+ if (schema) {
590
+ // Preprocess each schema to remove .functionCallReturnValue before collecting
591
+ const preprocessed = preprocessSchemaForMocks(schema);
592
+ Object.assign(allSchemaKeys, preprocessed);
593
+ }
594
+ }
595
+ }
596
+ }
597
+ const prebuiltIndexes =
598
+ Object.keys(allSchemaKeys).length > 0
599
+ ? buildSchemaIndexes(allSchemaKeys)
600
+ : undefined;
601
+
571
602
  // Track the global index for each hook name across all imports
572
603
  // This enables canonical keys like EntityName::useLoaderData::0, EntityName::useFetcher::0, etc.
573
604
  const hookCallIndices: Record<string, number> = {};
@@ -653,6 +684,7 @@ export default function gatherDataForMocks(
653
684
  undefined,
654
685
  options,
655
686
  hookCallIndex,
687
+ prebuiltIndexes,
656
688
  );
657
689
 
658
690
  if (processResult) {
@@ -717,6 +749,7 @@ export default function gatherDataForMocks(
717
749
  occurrence,
718
750
  options,
719
751
  hookCallIndex,
752
+ prebuiltIndexes,
720
753
  );
721
754
  if (processResult) {
722
755
  addResultToAccumulator(acc, processResult.key, processResult.value);
@@ -749,6 +782,7 @@ export default function gatherDataForMocks(
749
782
  undefined,
750
783
  options,
751
784
  hookCallIndex,
785
+ prebuiltIndexes,
752
786
  );
753
787
 
754
788
  if (processResult) {
@@ -769,6 +803,7 @@ export default function gatherDataForMocks(
769
803
  undefined,
770
804
  options,
771
805
  hookCallIndex,
806
+ prebuiltIndexes,
772
807
  );
773
808
 
774
809
  // Check if we got a meaningful result (not empty object or null)
@@ -813,6 +848,7 @@ export default function gatherDataForMocks(
813
848
  0, // Use 0 to trigger variable-qualified lookup
814
849
  options,
815
850
  hookCallIndex,
851
+ prebuiltIndexes,
816
852
  );
817
853
  if (varQualifiedResult && varQualifiedResult.value) {
818
854
  mergedValue = mergeJsonTypeDefinitions(
@@ -849,6 +885,7 @@ export default function gatherDataForMocks(
849
885
  0, // Use 0 to trigger variable-qualified lookup
850
886
  options,
851
887
  hookCallIndex,
888
+ prebuiltIndexes,
852
889
  );
853
890
  if (varQualifiedResult && varQualifiedResult.value) {
854
891
  // 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', {