@codeyam/codeyam-cli 0.1.0-staging.1669d45 → 0.1.0-staging.323686

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 (362) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +3 -3
  4. package/analyzer-template/packages/ai/index.ts +9 -1
  5. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +48 -34
  6. package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +31 -0
  8. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +139 -23
  9. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +6 -126
  10. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +277 -8
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +73 -1
  12. package/analyzer-template/packages/ai/src/lib/completionCall.ts +198 -34
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +108 -1
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +205 -0
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +10 -2
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +23 -0
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +87 -2
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +32 -7
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
  20. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
  21. package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
  22. package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
  23. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +626 -6
  24. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +26 -1
  25. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +375 -6
  26. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1003 -45
  27. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
  28. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
  29. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
  30. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +23 -6
  31. package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
  32. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +154 -32
  33. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +22 -1
  34. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
  35. package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
  36. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +10 -13
  37. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
  38. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -7
  39. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +142 -73
  40. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +42 -5
  41. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +1 -1
  42. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +77 -0
  43. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
  44. package/analyzer-template/packages/aws/package.json +1 -1
  45. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -1
  46. package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
  47. package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
  48. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
  49. package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
  50. package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
  51. package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
  52. package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
  53. package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
  54. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
  55. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  56. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +8 -1
  57. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  58. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  59. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
  60. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
  61. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
  62. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  63. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
  64. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
  65. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
  66. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
  67. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  68. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
  69. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  70. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
  71. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
  72. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
  73. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
  74. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
  75. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
  76. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  77. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +22 -1
  78. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  79. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
  80. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  81. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -4
  82. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  83. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
  85. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
  87. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
  89. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  90. package/analyzer-template/packages/github/dist/types/index.d.ts +1 -1
  91. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  92. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  93. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +25 -1
  94. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  95. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
  96. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
  97. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +51 -1
  98. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  99. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
  100. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  101. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
  102. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
  103. package/analyzer-template/packages/types/index.ts +1 -0
  104. package/analyzer-template/packages/types/src/types/Analysis.ts +25 -0
  105. package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
  106. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +64 -1
  107. package/analyzer-template/packages/utils/dist/types/index.d.ts +1 -1
  108. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  109. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  110. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +25 -1
  111. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  112. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
  113. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
  114. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +51 -1
  115. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  116. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
  117. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  118. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
  119. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
  120. package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
  121. package/analyzer-template/playwright/capture.ts +20 -8
  122. package/analyzer-template/playwright/captureStatic.ts +1 -1
  123. package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
  124. package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
  125. package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
  126. package/analyzer-template/project/constructMockCode.ts +314 -29
  127. package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
  128. package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
  129. package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
  130. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
  131. package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
  132. package/analyzer-template/project/orchestrateCapture.ts +71 -6
  133. package/analyzer-template/project/reconcileMockDataKeys.ts +152 -9
  134. package/analyzer-template/project/runAnalysis.ts +4 -0
  135. package/analyzer-template/project/start.ts +35 -11
  136. package/analyzer-template/project/writeMockDataTsx.ts +114 -2
  137. package/analyzer-template/project/writeScenarioComponents.ts +101 -8
  138. package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
  139. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
  140. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  141. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
  142. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  143. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
  144. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
  145. package/background/src/lib/virtualized/project/constructMockCode.js +255 -4
  146. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  147. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
  148. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
  149. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
  150. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  151. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
  152. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
  153. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
  154. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  155. package/background/src/lib/virtualized/project/orchestrateCapture.js +58 -6
  156. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  157. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +126 -9
  158. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  159. package/background/src/lib/virtualized/project/runAnalysis.js +3 -0
  160. package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
  161. package/background/src/lib/virtualized/project/start.js +32 -11
  162. package/background/src/lib/virtualized/project/start.js.map +1 -1
  163. package/background/src/lib/virtualized/project/writeMockDataTsx.js +89 -2
  164. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  165. package/background/src/lib/virtualized/project/writeScenarioComponents.js +57 -8
  166. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  167. package/codeyam-cli/src/cli.js +2 -0
  168. package/codeyam-cli/src/cli.js.map +1 -1
  169. package/codeyam-cli/src/commands/memory.js +273 -0
  170. package/codeyam-cli/src/commands/memory.js.map +1 -0
  171. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +4 -0
  172. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  173. package/codeyam-cli/src/utils/analysisRunner.js +21 -2
  174. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  175. package/codeyam-cli/src/utils/install-skills.js +20 -6
  176. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  177. package/codeyam-cli/src/utils/queue/job.js +1 -0
  178. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  179. package/codeyam-cli/src/utils/queue/manager.js +6 -0
  180. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  181. package/codeyam-cli/src/utils/rules/index.js +5 -0
  182. package/codeyam-cli/src/utils/rules/index.js.map +1 -0
  183. package/codeyam-cli/src/utils/rules/parser.js +106 -0
  184. package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
  185. package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
  186. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
  187. package/codeyam-cli/src/utils/rules/staleness.js +132 -0
  188. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
  189. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +2 -0
  190. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  191. package/codeyam-cli/src/webserver/app/lib/database.js +7 -3
  192. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  193. package/codeyam-cli/src/webserver/bootstrap.js +40 -0
  194. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  195. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-DsN1wKrm.js +11 -0
  196. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-COi5OvsN.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
  197. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BwdQv49w.js → EntityTypeIcon-Ba2JVPzP.js} +1 -1
  198. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CEleMv_j.js → InlineSpinner-C8lyxW9k.js} +1 -1
  199. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D68KarMg.js → InteractivePreview-aht4aafF.js} +2 -2
  200. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-L75Wvqgw.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
  201. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-C53WM8qn.js → LoadingDots-B0GLXMsr.js} +1 -1
  202. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CrNkmy4i.js → LogViewer-xgeCVgSM.js} +1 -1
  203. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-OApQuNyq.js +16 -0
  204. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CQifa1n-.js → SafeScreenshot-DuDvi0jm.js} +1 -1
  205. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CyaBFX7l.js → ScenarioViewer-DzccYyI8.js} +3 -13
  206. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D36O1rzU.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
  207. package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
  208. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BwavGCpm.js +32 -0
  209. package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
  210. package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
  211. package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
  212. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DgTPh8H-.js → chevron-down-Cx24_aWc.js} +1 -1
  213. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-DdQKK6on.js → chunk-EPOLDU6W-CXRTFQ3F.js} +1 -1
  214. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-Dmr2bb1R.js → circle-check-BOARzkeR.js} +1 -1
  215. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +6 -0
  216. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Do4ZLUYa.js → createLucideIcon-BdhJEx6B.js} +1 -1
  217. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +1 -0
  218. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CbdFyxZh.js → entity._sha._-BJUiQqZF.js} +12 -12
  219. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js → entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js} +1 -1
  220. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-wDWZZO1W.js → entity._sha_.create-scenario-D1T4TGjf.js} +1 -1
  221. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMbl7MeQ.js → entity._sha_.edit._scenarioId-CTBG2mmz.js} +1 -1
  222. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-5wRKRIH9.js → entry.client-CS2cb_eZ.js} +1 -1
  223. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +6 -0
  224. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DD3SDH7t.js → fileTableUtils-DMJ7zii9.js} +1 -1
  225. package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +1 -0
  226. package/codeyam-cli/src/webserver/build/client/assets/{git-zXjT7J0G.js → git-CPTZZ-JZ.js} +8 -8
  227. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +1 -0
  228. package/codeyam-cli/src/webserver/build/client/assets/{index-DLbXwndH.js → index-B1h680n5.js} +1 -1
  229. package/codeyam-cli/src/webserver/build/client/assets/{index-gPZ-lad1.js → index-lzqtyFU8.js} +1 -1
  230. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BsPXJ81F.js → loader-circle-B7B9V-bu.js} +1 -1
  231. package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +1 -0
  232. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +92 -0
  233. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +62 -0
  234. package/codeyam-cli/src/webserver/build/client/assets/{search-P2FKIUql.js → search-CxXUmBSd.js} +1 -1
  235. package/codeyam-cli/src/webserver/build/client/assets/{settings-B2eDuBj8.js → settings-CS5f3WzT.js} +1 -1
  236. package/codeyam-cli/src/webserver/build/client/assets/{simulations-L18M6-kN.js → simulations-DwFIBT09.js} +1 -1
  237. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BDz7kbVA.js → triangle-alert-B6LgvRJg.js} +1 -1
  238. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-29dDmbH8.js → useCustomSizes-C1v1PQzo.js} +1 -1
  239. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BUm0UVJm.js → useLastLogLine-aSv48UbS.js} +1 -1
  240. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CkIOKTrZ.js → useReportContext-DYxHZQuP.js} +1 -1
  241. package/codeyam-cli/src/webserver/build/client/assets/{useToast-KKw5kTn-.js → useToast-mBRpZPiu.js} +1 -1
  242. package/codeyam-cli/src/webserver/build/server/assets/index-DVzYx8PN.js +1 -0
  243. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +257 -0
  244. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  245. package/codeyam-cli/src/webserver/build-info.json +5 -5
  246. package/codeyam-cli/templates/codeyam-memory-hook.sh +200 -0
  247. package/codeyam-cli/templates/codeyam:debug.md +47 -3
  248. package/codeyam-cli/templates/codeyam:diagnose.md +203 -25
  249. package/codeyam-cli/templates/codeyam:memory.md +462 -0
  250. package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
  251. package/package.json +8 -5
  252. package/packages/ai/index.js +5 -2
  253. package/packages/ai/index.js.map +1 -1
  254. package/packages/ai/src/lib/analyzeScope.js +41 -17
  255. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  256. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
  257. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
  258. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +24 -0
  259. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  260. package/packages/ai/src/lib/astScopes/methodSemantics.js +109 -23
  261. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  262. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +1 -102
  263. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
  264. package/packages/ai/src/lib/astScopes/processExpression.js +228 -11
  265. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  266. package/packages/ai/src/lib/completionCall.js +161 -30
  267. package/packages/ai/src/lib/completionCall.js.map +1 -1
  268. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +86 -1
  269. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  270. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +179 -0
  271. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
  272. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +7 -1
  273. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  274. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +19 -0
  275. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  276. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +70 -2
  277. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  278. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +29 -7
  279. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  280. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
  281. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
  282. package/packages/ai/src/lib/dataStructureChunking.js +111 -0
  283. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
  284. package/packages/ai/src/lib/e2eDataTracking.js +241 -0
  285. package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
  286. package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
  287. package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
  288. package/packages/ai/src/lib/generateEntityScenarioData.js +510 -7
  289. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  290. package/packages/ai/src/lib/generateEntityScenarios.js +19 -1
  291. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  292. package/packages/ai/src/lib/generateExecutionFlows.js +273 -4
  293. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  294. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +738 -40
  295. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  296. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
  297. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
  298. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
  299. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
  300. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +15 -7
  301. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  302. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
  303. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
  304. package/packages/ai/src/lib/resolvePathToControllable.js +131 -27
  305. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  306. package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
  307. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  308. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
  309. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  310. package/packages/analyze/src/lib/analysisContext.js +30 -5
  311. package/packages/analyze/src/lib/analysisContext.js.map +1 -1
  312. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +8 -4
  313. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  314. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
  315. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  316. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -7
  317. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  318. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +116 -66
  319. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  320. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +37 -5
  321. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  322. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +1 -1
  323. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  324. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +65 -0
  325. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  326. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
  327. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
  328. package/packages/database/src/lib/kysely/db.js +8 -1
  329. package/packages/database/src/lib/kysely/db.js.map +1 -1
  330. package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
  331. package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  332. package/packages/database/src/lib/loadAnalyses.js +45 -2
  333. package/packages/database/src/lib/loadAnalyses.js.map +1 -1
  334. package/packages/database/src/lib/loadAnalysis.js +8 -0
  335. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  336. package/packages/database/src/lib/loadBranch.js +11 -1
  337. package/packages/database/src/lib/loadBranch.js.map +1 -1
  338. package/packages/database/src/lib/loadCommit.js +7 -0
  339. package/packages/database/src/lib/loadCommit.js.map +1 -1
  340. package/packages/database/src/lib/loadCommits.js +22 -1
  341. package/packages/database/src/lib/loadCommits.js.map +1 -1
  342. package/packages/database/src/lib/loadEntities.js +23 -4
  343. package/packages/database/src/lib/loadEntities.js.map +1 -1
  344. package/packages/database/src/lib/loadEntityBranches.js +9 -0
  345. package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
  346. package/packages/database/src/lib/updateCommitMetadata.js +5 -4
  347. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  348. package/packages/types/index.js.map +1 -1
  349. package/packages/utils/src/lib/safeFileName.js +29 -3
  350. package/packages/utils/src/lib/safeFileName.js.map +1 -1
  351. package/scripts/finalize-analyzer.cjs +3 -3
  352. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +0 -1
  353. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +0 -11
  354. package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +0 -11
  355. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +0 -37
  356. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +0 -1
  357. package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +0 -1
  358. package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +0 -1
  359. package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +0 -1
  360. package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +0 -57
  361. package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +0 -1
  362. package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +0 -228
@@ -1,10 +1,10 @@
1
1
  {
2
- "buildTimestamp": "2026-01-21T15:32:00.721Z",
3
- "buildTime": 1769009520721,
4
- "gitCommit": "1669d4579d4212b661c5b5f872516c46dc39c48c",
5
- "nodeVersion": "v20.19.6",
6
- "contentHash": "d47ce71ca17d37da11228a938a9ab3a41c22d9db644db0104a74089f8fd3e173",
7
- "buildNumber": 471,
8
- "semanticVersion": "0.1.471",
9
- "version": "0.1.471 (2026-01-21T15:32+d47ce71)"
2
+ "buildTimestamp": "2026-01-30T00:55:52.181Z",
3
+ "buildTime": 1769734552181,
4
+ "gitCommit": "03236865a7602ab6d30df31e0ad3bee876906fb9",
5
+ "nodeVersion": "v20.20.0",
6
+ "contentHash": "05d53efd18fbc545b72ac5e31193346a32efa60861ecfb3bf24454bef6533f43",
7
+ "buildNumber": 549,
8
+ "semanticVersion": "0.1.549",
9
+ "version": "0.1.549 (2026-01-30T00:55+05d53ef)"
10
10
  }
@@ -1,7 +1,7 @@
1
1
 
2
- [1/21/2026, 3:32:00 PM] > codeyam-combo@1.0.0 mergeDependencies
3
- [1/21/2026, 3:32:00 PM] > node ./scripts/mergePackageJsonFiles.cjs
2
+ [1/30/2026, 12:55:52 AM] > codeyam-combo@1.0.0 mergeDependencies
3
+ [1/30/2026, 12:55:52 AM] > node ./scripts/mergePackageJsonFiles.cjs
4
4
 
5
5
 
6
- [1/21/2026, 3:32:00 PM] Merged dependencies into root package.json
6
+ [1/30/2026, 12:55:52 AM] Merged dependencies into root package.json
7
7
 
@@ -16,7 +16,7 @@
16
16
  "@aws-sdk/client-ecs": "^3.956.0",
17
17
  "@aws-sdk/client-s3": "^3.940.0",
18
18
  "@aws-sdk/client-sqs": "^3.956.0",
19
- "@aws-sdk/lib-storage": "^3.940.0",
19
+ "@aws-sdk/lib-storage": "^3.975.0",
20
20
  "@aws-sdk/util-dynamodb": "^3.971.0",
21
21
  "@octokit/auth-app": "^8.1.0",
22
22
  "@octokit/rest": "^22.0.0",
@@ -36,10 +36,10 @@
36
36
  "p-retry": "^7.1.1",
37
37
  "piscina": "^5.1.4",
38
38
  "pixelmatch": "^5.3.0",
39
- "playwright": "^1.56.1",
39
+ "playwright": "1.58.0",
40
40
  "sharp": "^0.34.5",
41
41
  "simple-git": "^3.28.0",
42
- "undici": "^7.16.0",
42
+ "undici": "^7.18.2",
43
43
  "uuid": "^11.1.0",
44
44
  "pluralize": "^8.0.0",
45
45
  "yargs": "^18.0.0",
@@ -40,7 +40,10 @@ export { default as describeCodeChange } from './src/lib/describeCodeChange';
40
40
  export { default as validateTypeStructure } from './src/lib/validateTypeStructure';
41
41
  export { default as validateDataStructure } from './src/lib/validateDataStructure';
42
42
  export { default as isolateScopes } from './src/lib/isolateScopes';
43
- export { default as analyzeScope } from './src/lib/analyzeScope';
43
+ export {
44
+ default as analyzeScope,
45
+ destroyWorkerPool,
46
+ } from './src/lib/analyzeScope';
44
47
  export { default as logOrderedMap } from './src/lib/logOrderedMap';
45
48
  export {
46
49
  default as splitOutsideParentheses,
@@ -81,10 +84,15 @@ export {
81
84
  getConditionalEffects,
82
85
  getCompoundConditionals,
83
86
  getChildBoundaryGatingConditions,
87
+ getJsxRenderingUsages,
84
88
  } from './src/lib/worker/SerializableDataStructure';
85
89
  export { parseJsonSafe } from './src/lib/parsers/parseJsonSafe';
86
90
  export { default as completionCall } from './src/lib/completionCall';
87
91
 
92
+ // NOTE: E2E data tracking utilities (e2eDataTracking.ts) are NOT exported here
93
+ // because they use Node.js 'crypto' module which breaks browser builds.
94
+ // Import directly from '~codeyam/ai/src/lib/e2eDataTracking' when needed in Node.js tests.
95
+
88
96
  // Wrapper detection
89
97
  export { default as detectWrapperRequirements } from './src/lib/wrapperDetection/detectWrapperRequirements';
90
98
  export { KNOWN_LIBRARY_HOOKS } from './src/lib/wrapperDetection/knownLibraryHooks';
@@ -49,6 +49,7 @@ let workerPool: Piscina<
49
49
  AnalyzeScopeWorkerInput,
50
50
  AnalyzeScopeWorkerOutput
51
51
  > | null = null;
52
+ let workerPoolDestroyed = false;
52
53
 
53
54
  /**
54
55
  * Check if we're in Node.js main thread
@@ -65,11 +66,48 @@ function getIsMainThread(): boolean {
65
66
  return isMainThread;
66
67
  }
67
68
 
69
+ /**
70
+ * Destroy the worker pool, freeing its ~2GB heap.
71
+ * Called after data structure preparation completes (the producing phase transition).
72
+ * The worker is not needed after this point — subsequent calls to ensureWorkerPool() will throw.
73
+ */
74
+ export async function destroyWorkerPool() {
75
+ if (workerPool) {
76
+ const memBefore = process.memoryUsage();
77
+ console.log('CodeYam: Destroying worker pool...', {
78
+ rssBefore: `${Math.round(memBefore.rss / 1024 / 1024)}MB`,
79
+ heapBefore: `${Math.round(memBefore.heapUsed / 1024 / 1024)}MB`,
80
+ });
81
+
82
+ await workerPool.destroy();
83
+ workerPool = null;
84
+
85
+ // Force GC if available to reclaim worker memory faster
86
+ if (global.gc) {
87
+ global.gc();
88
+ }
89
+
90
+ const memAfter = process.memoryUsage();
91
+ console.log('CodeYam: Worker pool destroyed', {
92
+ rssAfter: `${Math.round(memAfter.rss / 1024 / 1024)}MB`,
93
+ heapAfter: `${Math.round(memAfter.heapUsed / 1024 / 1024)}MB`,
94
+ rssDelta: `${Math.round((memAfter.rss - memBefore.rss) / 1024 / 1024)}MB`,
95
+ });
96
+ }
97
+ workerPoolDestroyed = true;
98
+ }
99
+
68
100
  /**
69
101
  * Lazy initialization of worker pool.
70
102
  * Called on first use to ensure environment variables are set.
71
103
  */
72
104
  function ensureWorkerPool() {
105
+ if (workerPoolDestroyed) {
106
+ throw new Error(
107
+ 'CodeYam: Worker pool was destroyed (post-producing phase). ' +
108
+ 'analyzeScope should not be called after data structure preparation completes.',
109
+ );
110
+ }
73
111
  if (workerPool !== null) return;
74
112
 
75
113
  // Only initialize worker pool in Node.js environment
@@ -182,6 +220,9 @@ export async function analyzeScopeLocal({
182
220
  string,
183
221
  import('./astScopes/types').ConditionalUsage[]
184
222
  > = {};
223
+ // Collect JSX rendering usages (arrays via .map(), strings via interpolation)
224
+ const allJsxRenderingUsages: import('./astScopes/types').JsxRenderingUsage[] =
225
+ [];
185
226
 
186
227
  const astAnalysisResultWithStatements = statementScopes.map(
187
228
  (statementScope) => {
@@ -204,16 +245,6 @@ export async function analyzeScopeLocal({
204
245
  }
205
246
  // Collect conditional effects from AST analysis
206
247
  if (astAnalysisResult.conditionalEffects?.length > 0) {
207
- console.log(
208
- `[ConditionalEffects] analyzeScope collecting from statement "${statementScope.name}":`,
209
- astAnalysisResult.conditionalEffects.map((e) => ({
210
- setter: e.effect.setterName,
211
- value: e.effect.value,
212
- condition:
213
- e.condition?.path ||
214
- e.conditions?.map((c) => c.path).join(' && '),
215
- })),
216
- );
217
248
  allConditionalEffects.push(...astAnalysisResult.conditionalEffects);
218
249
  }
219
250
  // Collect compound conditionals from AST analysis
@@ -241,6 +272,10 @@ export async function analyzeScopeLocal({
241
272
  allChildBoundaryGatingConditions[childName].push(...usages);
242
273
  }
243
274
  }
275
+ // Collect JSX rendering usages from AST analysis
276
+ if (astAnalysisResult.jsxRenderingUsages?.length) {
277
+ allJsxRenderingUsages.push(...astAnalysisResult.jsxRenderingUsages);
278
+ }
244
279
  return {
245
280
  statementScope,
246
281
  astAnalysisResult,
@@ -561,14 +596,7 @@ export async function analyzeScopeLocal({
561
596
 
562
597
  // Add conditional effects from this scope's analysis
563
598
  if (allConditionalEffects.length > 0) {
564
- console.log(
565
- `[ConditionalEffects] analyzeScope adding ${allConditionalEffects.length} effects to scopeDataStructure for scope "${scope.name}"`,
566
- );
567
599
  scopeDataStructure.addConditionalEffects(allConditionalEffects);
568
- } else {
569
- console.log(
570
- `[ConditionalEffects] analyzeScope: no conditional effects found for scope "${scope.name}"`,
571
- );
572
600
  }
573
601
 
574
602
  // Add compound conditionals from this scope's analysis
@@ -620,13 +648,9 @@ export async function analyzeScopeLocal({
620
648
  );
621
649
  }
622
650
 
623
- // Log child scopes that will be processed
624
- const childScopeNames = Object.keys(scope.childScopes);
625
- if (childScopeNames.length > 0) {
626
- console.log(
627
- `[ConditionalEffects] analyzeScope will process ${childScopeNames.length} child scopes:`,
628
- childScopeNames,
629
- );
651
+ // Add JSX rendering usages from this scope's analysis
652
+ if (allJsxRenderingUsages.length > 0) {
653
+ scopeDataStructure.addJsxRenderingUsages(allJsxRenderingUsages);
630
654
  }
631
655
 
632
656
  await Promise.all(
@@ -719,16 +743,6 @@ export default async function analyzeScope(
719
743
  try {
720
744
  const result = await workerPool.run(workerInput);
721
745
 
722
- // Log the conditional effects from the worker result
723
- const workerConditionalEffects =
724
- result.dataStructure?.conditionalEffects || [];
725
- console.log(
726
- `[ConditionalEffects] Worker returned ${workerConditionalEffects.length} conditional effects for ${entity.name}:`,
727
- workerConditionalEffects.map(
728
- (e: any) => `${e.effect?.setterName}(${e.effect?.value})`,
729
- ),
730
- );
731
-
732
746
  // Store the serializable data structure in the scope
733
747
  scope.dataStructure = result.dataStructure as any;
734
748
  return;
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Shared utilities for detecting array-derived expressions in conditionals.
3
+ *
4
+ * These utilities detect patterns like:
5
+ * - arr.some(fn) → { sourcePath: 'arr', operation: 'arraySome' }
6
+ * - arr.every(fn) → { sourcePath: 'arr', operation: 'arrayEvery' }
7
+ * - arr.includes(x) → { sourcePath: 'arr', operation: 'arrayIncludes' }
8
+ * - arr.length → { sourcePath: 'arr', operation: 'arrayLength' }
9
+ *
10
+ * Used by both:
11
+ * - variableDeclarationHandler.ts (for variable assignments)
12
+ * - processExpression.ts (for inline conditionals)
13
+ */
14
+
15
+ import ts from 'typescript';
16
+
17
+ /** Array predicate method operations */
18
+ export type ArrayPredicateOperation =
19
+ | 'arrayIncludes'
20
+ | 'arraySome'
21
+ | 'arrayEvery';
22
+
23
+ /** Array length operation */
24
+ export type ArrayLengthOperation = 'arrayLength';
25
+
26
+ /** All array-derived operations */
27
+ export type ArrayDerivedOperation =
28
+ | ArrayPredicateOperation
29
+ | ArrayLengthOperation;
30
+
31
+ /** Result of detecting an array derivation pattern */
32
+ export interface ArrayDerivationResult {
33
+ sourcePath: string;
34
+ operation: ArrayDerivedOperation;
35
+ }
36
+
37
+ /**
38
+ * Extracts a simple path string from an expression.
39
+ * Returns the path for identifiers and property access chains.
40
+ */
41
+ export function getSimplePath(node: ts.Expression): string | null {
42
+ if (ts.isIdentifier(node)) {
43
+ return node.text;
44
+ }
45
+ if (ts.isPropertyAccessExpression(node)) {
46
+ const objectPath = getSimplePath(node.expression);
47
+ if (objectPath) {
48
+ return `${objectPath}.${node.name.text}`;
49
+ }
50
+ }
51
+ // Handle optional chaining: a?.b
52
+ if (ts.isNonNullExpression(node)) {
53
+ return getSimplePath(node.expression);
54
+ }
55
+ return null;
56
+ }
57
+
58
+ /**
59
+ * Maps array method names to derivation operation names
60
+ */
61
+ function getArrayPredicateOperation(
62
+ methodName: string,
63
+ ): ArrayPredicateOperation | null {
64
+ switch (methodName) {
65
+ case 'includes':
66
+ return 'arrayIncludes';
67
+ case 'some':
68
+ return 'arraySome';
69
+ case 'every':
70
+ return 'arrayEvery';
71
+ default:
72
+ return null;
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Detects if an expression is an array predicate call and extracts the array path.
78
+ * Patterns detected:
79
+ * - arr.includes(x) → { sourcePath: 'arr', operation: 'arrayIncludes' }
80
+ * - arr?.includes(x) → { sourcePath: 'arr', operation: 'arrayIncludes' }
81
+ * - arr.some(fn) → { sourcePath: 'arr', operation: 'arraySome' }
82
+ * - arr.every(fn) → { sourcePath: 'arr', operation: 'arrayEvery' }
83
+ * - Boolean(x && arr?.includes(y)) → { sourcePath: 'arr', operation: 'arrayIncludes' }
84
+ */
85
+ export function detectArrayPredicatePattern(
86
+ expr: ts.Expression,
87
+ ): ArrayDerivationResult | null {
88
+ // Unwrap Boolean() calls: Boolean(x) → x
89
+ if (
90
+ ts.isCallExpression(expr) &&
91
+ ts.isIdentifier(expr.expression) &&
92
+ expr.expression.text === 'Boolean' &&
93
+ expr.arguments.length === 1
94
+ ) {
95
+ return detectArrayPredicatePattern(expr.arguments[0]);
96
+ }
97
+
98
+ // Handle logical AND: a && b - check both sides for array predicates
99
+ if (
100
+ ts.isBinaryExpression(expr) &&
101
+ expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken
102
+ ) {
103
+ // Try the right side first (more likely to have the predicate)
104
+ const rightResult = detectArrayPredicatePattern(expr.right);
105
+ if (rightResult) return rightResult;
106
+ // Try the left side
107
+ const leftResult = detectArrayPredicatePattern(expr.left);
108
+ if (leftResult) return leftResult;
109
+ return null;
110
+ }
111
+
112
+ // Handle parenthesized expressions
113
+ if (ts.isParenthesizedExpression(expr)) {
114
+ return detectArrayPredicatePattern(expr.expression);
115
+ }
116
+
117
+ if (!ts.isCallExpression(expr)) {
118
+ return null;
119
+ }
120
+
121
+ const callExpr = expr.expression;
122
+
123
+ // Handle both regular property access (arr.includes) and optional chaining (arr?.includes)
124
+ let objectExpr: ts.Expression | null = null;
125
+ let methodName: string | null = null;
126
+
127
+ if (ts.isPropertyAccessExpression(callExpr)) {
128
+ objectExpr = callExpr.expression;
129
+ methodName = callExpr.name.text;
130
+ } else if (
131
+ ts.isElementAccessExpression(callExpr) &&
132
+ ts.isStringLiteral(callExpr.argumentExpression)
133
+ ) {
134
+ // Handle arr["includes"]() syntax (rare but possible)
135
+ objectExpr = callExpr.expression;
136
+ methodName = callExpr.argumentExpression.text;
137
+ }
138
+
139
+ if (!objectExpr || !methodName) {
140
+ return null;
141
+ }
142
+
143
+ const operation = getArrayPredicateOperation(methodName);
144
+ if (!operation) {
145
+ return null;
146
+ }
147
+
148
+ // Get the source path for the array
149
+ const sourcePath = getSimplePath(objectExpr);
150
+ if (!sourcePath) {
151
+ return null;
152
+ }
153
+
154
+ return { sourcePath, operation };
155
+ }
156
+
157
+ /**
158
+ * Detects if an expression is an array.length access.
159
+ * Patterns detected:
160
+ * - arr.length → { sourcePath: 'arr', operation: 'arrayLength' }
161
+ * - arr?.length → { sourcePath: 'arr', operation: 'arrayLength' }
162
+ */
163
+ export function detectArrayLengthPattern(
164
+ expr: ts.Expression,
165
+ ): ArrayDerivationResult | null {
166
+ // Handle property access: arr.length
167
+ if (ts.isPropertyAccessExpression(expr)) {
168
+ if (expr.name.text === 'length') {
169
+ const sourcePath = getSimplePath(expr.expression);
170
+ if (sourcePath) {
171
+ return { sourcePath, operation: 'arrayLength' };
172
+ }
173
+ }
174
+ }
175
+
176
+ return null;
177
+ }
178
+
179
+ /**
180
+ * Detects any array-derived pattern (predicate methods or .length).
181
+ * This is the main entry point for inline conditional detection.
182
+ */
183
+ export function detectArrayDerivedPattern(
184
+ expr: ts.Expression,
185
+ ): ArrayDerivationResult | null {
186
+ // Check for array predicate methods first (.some, .every, .includes)
187
+ const predicateResult = detectArrayPredicatePattern(expr);
188
+ if (predicateResult) {
189
+ return predicateResult;
190
+ }
191
+
192
+ // Check for .length access
193
+ const lengthResult = detectArrayLengthPattern(expr);
194
+ if (lengthResult) {
195
+ return lengthResult;
196
+ }
197
+
198
+ return null;
199
+ }
@@ -109,6 +109,7 @@ export class ASTScopeAnalyzer {
109
109
  private conditionalEffects: import('./types').ConditionalEffect[] = [];
110
110
  private childBoundaryGatingConditions: Record<string, ConditionalUsage[]> =
111
111
  {};
112
+ private jsxRenderingUsages: import('./types').JsxRenderingUsage[] = [];
112
113
  /**
113
114
  * Tracks derived boolean variables and their source expressions.
114
115
  * Maps variable name to derivation info.
@@ -219,6 +220,7 @@ export class ASTScopeAnalyzer {
219
220
  conditionalEffects: this.conditionalEffects,
220
221
  derivedVariables: this.derivedVariables,
221
222
  childBoundaryGatingConditions: this.childBoundaryGatingConditions,
223
+ jsxRenderingUsages: this.jsxRenderingUsages,
222
224
  isComplete:
223
225
  completeness.equivalences === 'full' &&
224
226
  completeness.structures === 'full',
@@ -273,6 +275,8 @@ export class ASTScopeAnalyzer {
273
275
  updateSchemaType: (path, newType) => this.updateSchemaType(path, newType),
274
276
  addConditionalEffect: (effect) => this.addConditionalEffect(effect),
275
277
  getConditionalEffects: () => this.conditionalEffects,
278
+ addJsxRenderingUsage: (usage) => this.addJsxRenderingUsage(usage),
279
+ getJsxRenderingUsages: () => this.jsxRenderingUsages,
276
280
  };
277
281
  return context;
278
282
  }
@@ -603,6 +607,17 @@ export class ASTScopeAnalyzer {
603
607
  const rightSideStr = rightSide?.toRightHandSideString();
604
608
 
605
609
  if (leftSideStr && rightSideStr && leftSideStr !== rightSideStr) {
610
+ const existingValue = this.equivalentVariables[leftSideStr];
611
+ // Don't overwrite a meaningful value with 'undefined' or 'null'.
612
+ // This is critical for ternary conditionals like `const x = cond ? func() : undefined`
613
+ // or `const x = items.find(...) || null` where we want to preserve
614
+ // the equivalency to the more meaningful value (func()'s return value, items[]).
615
+ if (
616
+ existingValue &&
617
+ (rightSideStr === 'undefined' || rightSideStr === 'null')
618
+ ) {
619
+ return;
620
+ }
606
621
  this.equivalentVariables[leftSideStr] = rightSideStr;
607
622
  }
608
623
  }
@@ -734,6 +749,22 @@ export class ASTScopeAnalyzer {
734
749
  this.conditionalEffects.push(effect);
735
750
  }
736
751
 
752
+ /**
753
+ * Add a JSX rendering usage (array.map() or text interpolation)
754
+ * Deduplicates by path and rendering type
755
+ */
756
+ private addJsxRenderingUsage(
757
+ usage: import('./types').JsxRenderingUsage,
758
+ ): void {
759
+ // Deduplicate: don't add if we already have the same path + renderingType
760
+ const exists = this.jsxRenderingUsages.some(
761
+ (u) => u.path === usage.path && u.renderingType === usage.renderingType,
762
+ );
763
+ if (!exists) {
764
+ this.jsxRenderingUsages.push(usage);
765
+ }
766
+ }
767
+
737
768
  /**
738
769
  * Updates the schema type for a path, typically used when switch statements
739
770
  * reveal the valid values for a parameter (creating a union type like "'a' | 'b' | 'c'")