@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
@@ -16,7 +16,6 @@ import { awsLog } from '~codeyam/utils';
16
16
  import gatherDataForMocks from './gatherDataForMocks';
17
17
  import enrichArrayTypesFromChildSignatures from './enrichArrayTypesFromChildSignatures';
18
18
  import enrichUnknownTypesFromSourceEquivalencies from './enrichUnknownTypesFromSourceEquivalencies';
19
-
20
19
  export interface GenerateDataStructureArgs {
21
20
  entity: Entity;
22
21
  dependentAnalyses: ReadonlyAnalysisMap;
@@ -256,8 +255,10 @@ export default function generateDataStructure({
256
255
  );
257
256
 
258
257
  if (existingImport) {
259
- // Merge callVariableNames if the same dependency exists with different patterns
260
- if (imported.callVariableNames && imported.calls) {
258
+ // Merge calls from child into existing import
259
+ // Note: Check length > 0 because empty array [] is truthy but has no variable names
260
+ if (imported.callVariableNames?.length && imported.calls) {
261
+ // Case 1: Both calls and callVariableNames are set - merge as pairs
261
262
  existingImport.calls = existingImport.calls || [];
262
263
  existingImport.callVariableNames =
263
264
  existingImport.callVariableNames || [];
@@ -274,6 +275,18 @@ export default function generateDataStructure({
274
275
  existingImport.callVariableNames.push(varName);
275
276
  }
276
277
  }
278
+ } else if (imported.calls) {
279
+ // Case 2: Only calls are set (no callVariableNames) - common with tRPC
280
+ // where destructuring like `const { data, isLoading } = trpc.xxx.useQuery()`
281
+ // doesn't create a variable name for the hook call itself
282
+ existingImport.calls = existingImport.calls || [];
283
+
284
+ // Add each call that doesn't already exist
285
+ for (const call of imported.calls) {
286
+ if (!existingImport.calls.includes(call)) {
287
+ existingImport.calls.push(call);
288
+ }
289
+ }
277
290
  }
278
291
  } else {
279
292
  // Add new import
@@ -527,10 +540,13 @@ export default function generateDataStructure({
527
540
 
528
541
  // Enrich mocked dependency array types with fields from child component signatures
529
542
  // This ensures that when getSurveysAction returns { data: array }, and SurveyCard
530
- // expects survey.updatedAt, the array element type includes updatedAt
543
+ // expects survey.updatedAt, the array element type includes updatedAt.
544
+ // Uses usageEquivalencies to trace data flow and only enrich arrays with fields
545
+ // from children that actually receive elements from that specific array.
531
546
  enrichArrayTypesFromChildSignatures(
532
547
  allImportedExports,
533
548
  mergedDataStructure.dependencySchemas,
549
+ mergedDataStructure.usageEquivalencies,
534
550
  );
535
551
 
536
552
  // Enrich mocked dependency unknown types using sourceEquivalencies
@@ -544,12 +560,33 @@ export default function generateDataStructure({
544
560
  allImportedExports,
545
561
  );
546
562
 
547
- const dataForMocks = gatherDataForMocks(
563
+ let dataForMocks = gatherDataForMocks(
548
564
  allImportedExports,
549
565
  mergedDataStructure.dependencySchemas,
550
566
  { entityName: entity.name },
551
567
  );
552
568
 
569
+ // Merge dataForMocks from non-mocked child analyses to include transitive dependency data.
570
+ // This handles cases where grandchild trpc calls aren't in allImportedExports because
571
+ // the grandchild's analysis wasn't in dependentAnalyses.
572
+ //
573
+ // Issue 19 fix: The child's dataForMocks already contains merged data from its
574
+ // dependencies (including grandchildren). By merging the child's dataForMocks,
575
+ // we transitively include all nested dependency data.
576
+ for (const filePath in nonMockedDependentAnalyses) {
577
+ for (const name in nonMockedDependentAnalyses[filePath]) {
578
+ const childAnalysis = nonMockedDependentAnalyses[filePath][name];
579
+ const childDataForMocks =
580
+ childAnalysis?.metadata?.scenariosDataStructure?.dataForMocks;
581
+ if (childDataForMocks && Object.keys(childDataForMocks).length > 0) {
582
+ dataForMocks = mergeJsonTypeDefinitions(
583
+ dataForMocks as Record<string, unknown>,
584
+ childDataForMocks as Record<string, unknown>,
585
+ ) as { [importAlias: string]: JsonTypeDefinition };
586
+ }
587
+ }
588
+ }
589
+
553
590
  const finalizedArgumentsSchema = fillInDirectSchemaGapsAndUnknowns({
554
591
  schema: { ...mergedDataStructure.signatureSchema },
555
592
  });
@@ -108,7 +108,7 @@ export default async function generateExecutionFlows({
108
108
  * then looks them up in importedExports to get their file paths,
109
109
  * then retrieves their metadata from dependentAnalyses.
110
110
  */
111
- function buildChildEntityMetadata(
111
+ export function buildChildEntityMetadata(
112
112
  entity: Entity,
113
113
  dependentAnalyses?: ReadonlyAnalysisMap,
114
114
  ): Record<string, Entity['metadata']> {
@@ -1134,6 +1134,83 @@ export default function mergeInDependentDataStructure({
1134
1134
  }
1135
1135
 
1136
1136
  cleanSchema(depSchema.returnValueSchema);
1137
+
1138
+ // Pull signature requirements from downstream functions into the mocked return value.
1139
+ // When a mocked function's return flows into another function's signature (via usageEquivalencies),
1140
+ // we need to include that function's signature requirements in the mock.
1141
+ //
1142
+ // Example: fromE5() returns a currency object that flows to calculateTotalPrice(price, quantity).
1143
+ // calculateTotalPrice's signatureSchema shows signature[0].multiply() is required.
1144
+ // We need to add multiply() to fromE5's mock return value.
1145
+ const usageEquivalencies = srcSchema.usageEquivalencies ?? {};
1146
+ for (const [returnPath, equivalencies] of Object.entries(
1147
+ usageEquivalencies,
1148
+ )) {
1149
+ // Only process return value paths (functionCallReturnValue)
1150
+ if (!returnPath.includes('.functionCallReturnValue')) continue;
1151
+
1152
+ for (const equiv of equivalencies) {
1153
+ // Check if this equivalency points to a signature path
1154
+ const signatureMatch = equiv.schemaPath.match(/\.signature\[(\d+)\]$/);
1155
+ if (!signatureMatch) continue;
1156
+
1157
+ const targetFunctionName = cleanFunctionName(equiv.scopeNodeName);
1158
+ const signatureIndex = signatureMatch[1];
1159
+
1160
+ // Look up the target function's analysis to get its signature requirements
1161
+ // First try dependentAnalyses, then dependencySchemas
1162
+ let targetSignatureSchema: Record<string, string> | undefined;
1163
+
1164
+ // Check dependentAnalyses first (has the full merged analysis)
1165
+ for (const depFilePath in dependentAnalyses) {
1166
+ const analysis = dependentAnalyses[depFilePath]?.[targetFunctionName];
1167
+ if (analysis?.metadata?.mergedDataStructure?.signatureSchema) {
1168
+ targetSignatureSchema =
1169
+ analysis.metadata.mergedDataStructure.signatureSchema;
1170
+ break;
1171
+ }
1172
+ }
1173
+
1174
+ // Fallback to dependencySchemas if not found
1175
+ if (!targetSignatureSchema) {
1176
+ for (const depFilePath in dependencySchemas) {
1177
+ const schema = dependencySchemas[depFilePath]?.[targetFunctionName];
1178
+ if (schema?.signatureSchema) {
1179
+ targetSignatureSchema = schema.signatureSchema;
1180
+ break;
1181
+ }
1182
+ }
1183
+ }
1184
+
1185
+ if (!targetSignatureSchema) continue;
1186
+
1187
+ // Find all paths in the target's signatureSchema that extend from signature[N]
1188
+ // e.g., signature[0].multiply(quantity) -> .multiply(quantity)
1189
+ const signaturePrefix = `signature[${signatureIndex}]`;
1190
+ for (const [sigPath, sigType] of Object.entries(
1191
+ targetSignatureSchema,
1192
+ )) {
1193
+ if (!sigPath.startsWith(signaturePrefix)) continue;
1194
+
1195
+ // Skip the base signature[N] path itself - we only want the method/property extensions
1196
+ if (sigPath === signaturePrefix) continue;
1197
+
1198
+ // Extract the suffix after signature[N] (e.g., ".multiply(quantity)")
1199
+ const suffix = sigPath.slice(signaturePrefix.length);
1200
+
1201
+ // Build the path for the mocked return value
1202
+ // e.g., fromE5(priceE5).functionCallReturnValue.multiply(quantity)
1203
+ const returnValuePath = returnPath + suffix;
1204
+
1205
+ // Add to the mocked dependency's return value schema if not already present
1206
+ if (!(returnValuePath in depSchema.returnValueSchema)) {
1207
+ depSchema.returnValueSchema[returnValuePath] = sigType;
1208
+ }
1209
+ }
1210
+ }
1211
+ }
1212
+
1213
+ cleanSchema(depSchema.returnValueSchema);
1137
1214
  }
1138
1215
 
1139
1216
  // Process the input dependencySchemas FIRST (before child dependentAnalyses).
@@ -2,6 +2,49 @@ import { splitOutsideParenthesesAndArrays } from '~codeyam/ai';
2
2
  import { JsonTypeDefinition, ReadonlyAnalysisMap } from '~codeyam/types';
3
3
  import { awsLog } from '~codeyam/utils';
4
4
 
5
+ /**
6
+ * Deep merge for JsonTypeDefinition schemas.
7
+ * Only recursively merges when BOTH sides are plain objects (not arrays, not primitives).
8
+ * This is different from the general deepMerge which is designed for data values -
9
+ * here we're merging type schemas where leaf values are strings like "boolean" or "function".
10
+ *
11
+ * When types are incompatible (e.g., array vs object), prefer keeping the base value
12
+ * since it was set first from the root entity's validatedVariables.
13
+ */
14
+ function deepMergeSchemas(
15
+ base: JsonTypeDefinition,
16
+ override: JsonTypeDefinition,
17
+ ): JsonTypeDefinition {
18
+ // If override is null/undefined, return base
19
+ if (override === null || override === undefined) return base;
20
+ // If base is null/undefined, return override
21
+ if (base === null || base === undefined) return override;
22
+
23
+ // Only recursively merge if BOTH are plain objects (not arrays, not primitives)
24
+ const baseIsPlainObject =
25
+ typeof base === 'object' && !Array.isArray(base) && base !== null;
26
+ const overrideIsPlainObject =
27
+ typeof override === 'object' &&
28
+ !Array.isArray(override) &&
29
+ override !== null;
30
+
31
+ if (baseIsPlainObject && overrideIsPlainObject) {
32
+ const result: JsonTypeDefinition = { ...base };
33
+ for (const key in override) {
34
+ result[key] = deepMergeSchemas(
35
+ base[key] as JsonTypeDefinition,
36
+ override[key] as JsonTypeDefinition,
37
+ );
38
+ }
39
+ return result;
40
+ }
41
+
42
+ // For incompatible types (array vs object, string vs object, etc.), keep base
43
+ // This ensures the root entity's structure is preserved when a dependency
44
+ // has a different view of the same mock
45
+ return base;
46
+ }
47
+
5
48
  export function mergeInStructure(
6
49
  name: string | number,
7
50
  key: string | number,
@@ -155,10 +198,10 @@ export default function mergeValidatedDataStructures({
155
198
  }
156
199
  activeValidatedParts = validatedVariables[usedName] as JsonTypeDefinition;
157
200
  }
158
- dataForMocks = {
159
- ...dataForMocks,
160
- ...validatedData,
161
- };
201
+ // Use deep merge instead of shallow spread to preserve previously merged
202
+ // dependency data. This fixes Issue #15 where multiple dependencies with
203
+ // the same top-level key (e.g., trpc) would overwrite each other.
204
+ dataForMocks = deepMergeSchemas(dataForMocks, validatedData);
162
205
  };
163
206
 
164
207
  for (const dependency of relevantDependencies) {
@@ -181,13 +224,15 @@ export default function mergeValidatedDataStructures({
181
224
  for (const mockName in dependencyDataForMocks) {
182
225
  addMockDataForEntity(mockName);
183
226
 
184
- // If addMockDataForEntity didn't find matching entries in validatedVariables,
185
- // copy the dependency's value directly. This handles cases like usePathname()
186
- // which returns a simple "string" type but isn't in the root's validatedVariables.
187
- if (dataForMocks[mockName] === undefined) {
188
- dataForMocks[mockName] = dependencyDataForMocks[
189
- mockName
190
- ] as JsonTypeDefinition;
227
+ // Always deep merge the dependency's value to preserve nested structures.
228
+ // This handles cases like usePathname() which returns a simple "string" type,
229
+ // AND cases like trpc where both root and dependency have nested data that
230
+ // needs to be combined (e.g., trpc.quote from root + trpc.fastener.getAttributeValues
231
+ // from dependency).
232
+ if (dependencyDataForMocks[mockName] !== undefined) {
233
+ dataForMocks = deepMergeSchemas(dataForMocks, {
234
+ [mockName]: dependencyDataForMocks[mockName],
235
+ } as JsonTypeDefinition);
191
236
  }
192
237
  }
193
238
  }
@@ -18,7 +18,7 @@
18
18
  "@aws-sdk/client-ecs": "^3.956.0",
19
19
  "@aws-sdk/client-s3": "^3.940.0",
20
20
  "@aws-sdk/client-sqs": "^3.956.0",
21
- "@aws-sdk/lib-storage": "^3.940.0",
21
+ "@aws-sdk/lib-storage": "^3.975.0",
22
22
  "@aws-sdk/s3-request-presigner": "^3.940.0",
23
23
  "@aws-sdk/util-dynamodb": "^3.971.0"
24
24
  }
@@ -245,7 +245,14 @@ export function getSqliteDatabase(sqlitePath?: string) {
245
245
  export function getPostgreDatabase() {
246
246
  const connectionString = getPostgresConnectionString();
247
247
  console.log(`CodeYam: Using PostgreSQL database at: ${connectionString}`);
248
- const pool = new Pool({ connectionString });
248
+ const pool = new Pool({
249
+ connectionString,
250
+ // Session pooler (required for IPv4) holds real Postgres connections,
251
+ // so keep this low: 10 ECS tasks × 3 = 30 connections max
252
+ max: 3,
253
+ // Release idle connections after 10s to free up pool slots
254
+ idleTimeoutMillis: 10000,
255
+ });
249
256
  pool.on('error', (err: Error, _client: PoolClient) => {
250
257
  console.error('CodeYam: Unexpected error on idle PostgreSQL client', err);
251
258
  });
@@ -33,6 +33,12 @@ export const CommitsTableColumns = Object.keys(
33
33
  commitsSchema,
34
34
  ) as (keyof CommitsTable)[];
35
35
 
36
+ // Lightweight columns list excluding 'files' (which can be 1MB+ for large commits)
37
+ // Use this for queries where file diff data is not needed
38
+ export const CommitsTableColumnsLite = CommitsTableColumns.filter(
39
+ (col) => col !== 'files',
40
+ ) as Exclude<keyof CommitsTable, 'files'>[];
41
+
36
42
  export async function createCommitsTable(db: Kysely<any>): Promise<void> {
37
43
  await db.schema
38
44
  .createTable('commits')
@@ -27,6 +27,7 @@ function buildAnalysesQuery({
27
27
  commitIds,
28
28
  branchCommitSha,
29
29
  limit,
30
+ excludeMetadata,
30
31
  }: LoadAnalysesArgs & {
31
32
  ids?: string[];
32
33
  fileIds?: string[];
@@ -37,7 +38,32 @@ function buildAnalysesQuery({
37
38
  const { jsonObjectFrom, jsonArrayFrom } = getJsonHelper();
38
39
 
39
40
  // Create CTE for filtering analyses
40
- let filteredAnalysisCTE = db.selectFrom('analyses').selectAll('analyses');
41
+ // When excludeMetadata is true, select specific columns to avoid loading 64MB+ of metadata
42
+ let filteredAnalysisCTE = excludeMetadata
43
+ ? db
44
+ .selectFrom('analyses')
45
+ .select([
46
+ 'analyses.id',
47
+ 'analyses.project_id',
48
+ 'analyses.file_id',
49
+ 'analyses.commit_id',
50
+ 'analyses.entity_sha',
51
+ 'analyses.entity_name',
52
+ 'analyses.entity_type',
53
+ 'analyses.file_path',
54
+ 'analyses.status',
55
+ 'analyses.created_at',
56
+ 'analyses.updated_at',
57
+ 'analyses.tree_sha',
58
+ 'analyses.analyzed_tree_sha',
59
+ 'analyses.dependency_analyzed_tree_sha',
60
+ 'analyses.previous_analysis_id',
61
+ 'analyses.branch_commit_sha',
62
+ 'analyses.indirect',
63
+ 'analyses.committed_at',
64
+ 'analyses.completed_at',
65
+ ])
66
+ : db.selectFrom('analyses').selectAll('analyses');
41
67
 
42
68
  // Apply filters
43
69
  if (projectId) {
@@ -96,6 +122,35 @@ function buildAnalysesQuery({
96
122
  }
97
123
 
98
124
  // Main query with JSON aggregations referencing the CTE
125
+ // When excludeMetadata is true, skip the entity subquery (saves loading entity metadata again)
126
+ if (excludeMetadata) {
127
+ return db
128
+ .with('filtered_analyses', () => filteredAnalysisCTE)
129
+ .selectFrom('filtered_analyses')
130
+ .selectAll('filtered_analyses')
131
+ .select((eb: ExpressionBuilder<any, any>) => [
132
+ // Skip entity subquery - not needed for list views and loads 41MB+ of entity metadata
133
+
134
+ jsonArrayFrom(
135
+ eb
136
+ .selectFrom('scenarios')
137
+ .select(aliasedTableColumns('scenarios', ScenariosTableColumns))
138
+ .whereRef('scenarios.analysis_id', '=', 'filtered_analyses.id'),
139
+ ).as('scenarios'),
140
+
141
+ jsonArrayFrom(
142
+ eb
143
+ .selectFrom('analysis_branches')
144
+ .select(['id', 'branch_id'])
145
+ .whereRef(
146
+ 'analysis_branches.analysis_id',
147
+ '=',
148
+ 'filtered_analyses.id',
149
+ ),
150
+ ).as('analysis_branches'),
151
+ ]);
152
+ }
153
+
99
154
  return db
100
155
  .with('filtered_analyses', () => filteredAnalysisCTE)
101
156
  .selectFrom('filtered_analyses')
@@ -138,6 +193,8 @@ export interface LoadAnalysesArgs {
138
193
  entityShas?: string[];
139
194
  branchCommitSha?: string;
140
195
  limit?: number;
196
+ /** Exclude large metadata columns for faster list queries */
197
+ excludeMetadata?: boolean;
141
198
  }
142
199
 
143
200
  export default async function loadAnalyses(
@@ -45,6 +45,7 @@ export default async function loadAnalysis({
45
45
  // TODO: Consider refactoring to use CTE + aliasedTableColumns pattern (Pattern 3)
46
46
  // like loadMostRecentPreviousAnalysis for more elegant single-query approach
47
47
  const db = getDatabase();
48
+ const startTime = Date.now();
48
49
 
49
50
  try {
50
51
  // Build the main query
@@ -169,6 +170,8 @@ export default async function loadAnalysis({
169
170
  });
170
171
 
171
172
  const analysis = await query.executeTakeFirst();
173
+ const queryTime = Date.now() - startTime;
174
+
172
175
  if (!analysis) {
173
176
  awsLog('CodeYam Error: Analysis not found', null, {
174
177
  id,
@@ -188,6 +191,16 @@ export default async function loadAnalysis({
188
191
  return null;
189
192
  }
190
193
 
194
+ // DEBUG: Log slow queries (when includeCommitAndBranch=true, includes files column which can be 1MB+)
195
+ if (queryTime > 100 && includeCommitAndBranch) {
196
+ const commit = (analysis as any).commit;
197
+ const filesSize = commit?.files ? JSON.stringify(commit.files).length : 0;
198
+ console.log(
199
+ `CodeYam DEBUG: [CommitFilesTiming] loadAnalysis took ${queryTime}ms (files: ${Math.round(filesSize / 1024)}KB)`,
200
+ { id: analysis.id, entityName: analysis.entity_name },
201
+ );
202
+ }
203
+
191
204
  return dbToAnalysis(analysis);
192
205
  } catch (error) {
193
206
  awsLog('CodeYam Error: Database error loading analysis', error, {
@@ -98,9 +98,10 @@ async function loadCommitsForBranch(branchId: string): Promise<DbCommit[]> {
98
98
  const db = getDatabase();
99
99
 
100
100
  const { jsonArrayFrom } = getJsonHelper();
101
+ const startTime = Date.now();
101
102
 
102
103
  try {
103
- return await db
104
+ const commits = await db
104
105
  .selectFrom('commits')
105
106
  .selectAll()
106
107
  .select((eb: ExpressionBuilder<any, any>) => [
@@ -115,6 +116,20 @@ async function loadCommitsForBranch(branchId: string): Promise<DbCommit[]> {
115
116
  .where('commits.branch_id', '=', branchId)
116
117
  .orderBy('commits.committed_at', 'desc')
117
118
  .execute();
119
+ const queryTime = Date.now() - startTime;
120
+
121
+ // DEBUG: Log slow queries (includes files column which can be 1MB+)
122
+ if (queryTime > 100) {
123
+ const totalFilesSize = commits.reduce((sum, c: any) => {
124
+ return sum + (c.files ? JSON.stringify(c.files).length : 0);
125
+ }, 0);
126
+ console.log(
127
+ `CodeYam DEBUG: [CommitFilesTiming] loadCommitsForBranch took ${queryTime}ms (${commits.length} commits, totalFiles: ${Math.round(totalFilesSize / 1024)}KB)`,
128
+ { branchId },
129
+ );
130
+ }
131
+
132
+ return commits;
118
133
  } catch (error) {
119
134
  awsLog('CodeYam Error: Loading commits for branch', error, { branchId });
120
135
  return [];
@@ -69,6 +69,7 @@ export default async function loadCommit({
69
69
  branchId,
70
70
  }: LoadCommitArgs) {
71
71
  const db = getDatabase();
72
+ const startTime = Date.now();
72
73
 
73
74
  try {
74
75
  let query = db
@@ -97,6 +98,7 @@ export default async function loadCommit({
97
98
  query = query.orderBy('committed_at', 'desc').limit(1);
98
99
 
99
100
  const commit = await query.executeTakeFirst();
101
+ const queryTime = Date.now() - startTime;
100
102
 
101
103
  if (!commit) {
102
104
  awsLog('CodeYam Error: Commit not found', null, {
@@ -108,6 +110,15 @@ export default async function loadCommit({
108
110
  return null;
109
111
  }
110
112
 
113
+ // DEBUG: Log slow queries (includes files column which can be 1MB+)
114
+ if (queryTime > 100) {
115
+ const filesSize = commit.files ? JSON.stringify(commit.files).length : 0;
116
+ console.log(
117
+ `CodeYam DEBUG: [CommitFilesTiming] loadCommit took ${queryTime}ms (files: ${Math.round(filesSize / 1024)}KB)`,
118
+ { sha: commit.sha },
119
+ );
120
+ }
121
+
111
122
  // Load branch and mergedBranch separately
112
123
  const [branch, mergedBranch, analyses] = await Promise.all([
113
124
  commit.branch_id
@@ -19,6 +19,8 @@ interface LoadCommitsArgs {
19
19
  shas?: string[];
20
20
  fileNames?: string[];
21
21
  limit?: number;
22
+ /** Skip loading related data (analyses, entities, branches) for faster queries */
23
+ skipRelations?: boolean;
22
24
  }
23
25
 
24
26
  async function loadBranchesForCommits(
@@ -137,6 +139,7 @@ export default async function loadCommits({
137
139
  shas,
138
140
  fileNames,
139
141
  limit = 10,
142
+ skipRelations = false,
140
143
  }: LoadCommitsArgs): Promise<Commit[]> {
141
144
  if (!projectId && !ids) {
142
145
  throw new Error('Must provide projectId or ids');
@@ -144,6 +147,7 @@ export default async function loadCommits({
144
147
 
145
148
  const db = getDatabase();
146
149
  const { jsonObjectFrom } = getJsonHelper();
150
+ const startTime = Date.now();
147
151
 
148
152
  try {
149
153
  let query = db
@@ -203,11 +207,35 @@ export default async function loadCommits({
203
207
  .orderBy('committed_at', 'desc')
204
208
  .limit(limit)
205
209
  .execute();
210
+ const queryTime = Date.now() - startTime;
206
211
 
207
212
  if (!commits || commits.length === 0) {
208
213
  return [];
209
214
  }
210
215
 
216
+ // DEBUG: Log slow queries (includes files column which can be 1MB+)
217
+ if (queryTime > 100) {
218
+ const totalFilesSize = commits.reduce((sum, c: any) => {
219
+ return sum + (c.files ? JSON.stringify(c.files).length : 0);
220
+ }, 0);
221
+ console.log(
222
+ `CodeYam DEBUG: [CommitFilesTiming] loadCommits took ${queryTime}ms (${commits.length} commits, totalFiles: ${Math.round(totalFilesSize / 1024)}KB)`,
223
+ );
224
+ }
225
+
226
+ // When skipRelations is true, just return commits without loading related data
227
+ // This is much faster for queries that only need commit metadata
228
+ if (skipRelations) {
229
+ const dbCommits: DbCommit[] = commits.map((commit: any) => ({
230
+ ...commit,
231
+ branch: undefined,
232
+ mergedBranch: undefined,
233
+ analyses: [],
234
+ entities: [],
235
+ }));
236
+ return dbCommits.map(dbToCommit);
237
+ }
238
+
211
239
  const commitIds = commits.map((c: any) => c.id);
212
240
 
213
241
  // Load all relations in parallel
@@ -9,6 +9,8 @@ export interface LoadEntitiesArgs {
9
9
  filePaths?: string[];
10
10
  names?: string[];
11
11
  shas?: string[];
12
+ /** Exclude large metadata column for faster list queries */
13
+ excludeMetadata?: boolean;
12
14
  }
13
15
 
14
16
  export default async function loadEntities({
@@ -18,6 +20,7 @@ export default async function loadEntities({
18
20
  filePaths,
19
21
  names,
20
22
  shas,
23
+ excludeMetadata,
21
24
  }: LoadEntitiesArgs): Promise<Entity[] | null> {
22
25
  if (
23
26
  (fileIds && fileIds.length == 0) ||
@@ -39,6 +42,7 @@ export default async function loadEntities({
39
42
  filePaths,
40
43
  names,
41
44
  shas: chunk,
45
+ excludeMetadata,
42
46
  });
43
47
 
44
48
  if (chunkEntities) {
@@ -51,9 +55,28 @@ export default async function loadEntities({
51
55
  const db = getDatabase();
52
56
 
53
57
  try {
54
- const query = db
55
- .selectFrom('entities')
56
- .selectAll('entities')
58
+ // When excludeMetadata is true, select all columns except the large metadata column
59
+ // This dramatically speeds up list queries (41MB+ of JSON avoided)
60
+ const baseQuery = excludeMetadata
61
+ ? db
62
+ .selectFrom('entities')
63
+ .select([
64
+ 'entities.project_id',
65
+ 'entities.file_id',
66
+ 'entities.commit_id',
67
+ 'entities.name',
68
+ 'entities.sha',
69
+ 'entities.entity_type',
70
+ 'entities.file_path',
71
+ 'entities.description',
72
+ 'entities.documentation',
73
+ 'entities.quality',
74
+ 'entities.created_at',
75
+ 'entities.updated_at',
76
+ ])
77
+ : db.selectFrom('entities').selectAll('entities');
78
+
79
+ const query = baseQuery
57
80
  .$if(!!branchId, (qb) =>
58
81
  qb
59
82
  .innerJoin(
@@ -121,6 +121,7 @@ async function loadCommitsForEntities(
121
121
  const db = getDatabase();
122
122
 
123
123
  const { jsonArrayFrom } = getJsonHelper();
124
+ const startTime = Date.now();
124
125
 
125
126
  try {
126
127
  const commits = await db
@@ -137,6 +138,17 @@ async function loadCommitsForEntities(
137
138
  ])
138
139
  .where('commits.id', 'in', commitIds)
139
140
  .execute();
141
+ const queryTime = Date.now() - startTime;
142
+
143
+ // DEBUG: Log slow queries (includes files column which can be 1MB+)
144
+ if (queryTime > 100) {
145
+ const totalFilesSize = commits.reduce((sum, c: any) => {
146
+ return sum + (c.files ? JSON.stringify(c.files).length : 0);
147
+ }, 0);
148
+ console.log(
149
+ `CodeYam DEBUG: [CommitFilesTiming] loadCommitsForEntities took ${queryTime}ms (${commits.length} commits, totalFiles: ${Math.round(totalFilesSize / 1024)}KB)`,
150
+ );
151
+ }
140
152
 
141
153
  return new Map(commits.map((commit) => [commit.id, commit]));
142
154
  } catch (error) {