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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +5 -5
  4. package/analyzer-template/packages/ai/index.ts +15 -2
  5. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +87 -51
  6. package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +98 -9
  8. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +139 -23
  9. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +6 -126
  10. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +555 -28
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +88 -7
  12. package/analyzer-template/packages/ai/src/lib/completionCall.ts +198 -34
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +772 -243
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +205 -0
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +10 -2
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +43 -1
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +122 -15
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +160 -0
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +319 -88
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
  24. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
  25. package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
  26. package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
  27. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +642 -7
  28. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +35 -6
  29. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +383 -6
  30. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  31. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1299 -51
  32. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
  33. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  34. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  35. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
  36. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
  37. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +23 -6
  38. package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
  39. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +179 -45
  40. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +26 -4
  41. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
  42. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  43. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  44. package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
  45. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  46. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  47. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  48. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  49. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  50. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  51. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +30 -19
  52. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +14 -4
  53. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
  54. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  55. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -10
  56. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  57. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  58. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +189 -76
  59. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +29 -0
  60. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +77 -9
  61. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +118 -10
  62. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +276 -17
  63. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
  64. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  65. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  66. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  67. package/analyzer-template/packages/aws/package.json +2 -2
  68. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -1
  69. package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
  70. package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
  71. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
  72. package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
  73. package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
  74. package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
  75. package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
  76. package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
  77. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
  78. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  79. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +8 -1
  80. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  81. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  82. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
  83. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
  85. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
  87. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
  89. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
  90. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  91. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
  92. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  93. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
  94. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
  95. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
  96. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
  97. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
  98. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
  99. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  100. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +22 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  102. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
  103. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  104. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -4
  105. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  106. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
  107. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
  108. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
  109. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
  110. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  111. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
  112. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  113. package/analyzer-template/packages/github/dist/types/index.d.ts +1 -1
  114. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  115. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  116. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +25 -1
  117. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  118. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
  119. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
  120. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +56 -6
  121. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  122. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  123. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  124. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
  125. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  126. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
  127. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
  128. package/analyzer-template/packages/github/package.json +1 -1
  129. package/analyzer-template/packages/types/index.ts +1 -0
  130. package/analyzer-template/packages/types/src/types/Analysis.ts +25 -0
  131. package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
  132. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +70 -6
  133. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  134. package/analyzer-template/packages/utils/dist/types/index.d.ts +1 -1
  135. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  136. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  137. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +25 -1
  138. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  139. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
  140. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
  141. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +56 -6
  142. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  143. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  144. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  145. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
  146. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  147. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
  148. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
  149. package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
  150. package/analyzer-template/playwright/capture.ts +20 -8
  151. package/analyzer-template/playwright/captureStatic.ts +1 -1
  152. package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
  153. package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
  154. package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
  155. package/analyzer-template/project/constructMockCode.ts +367 -37
  156. package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
  157. package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
  158. package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
  159. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
  160. package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
  161. package/analyzer-template/project/orchestrateCapture.ts +71 -6
  162. package/analyzer-template/project/reconcileMockDataKeys.ts +152 -9
  163. package/analyzer-template/project/runAnalysis.ts +4 -0
  164. package/analyzer-template/project/start.ts +35 -11
  165. package/analyzer-template/project/writeMockDataTsx.ts +127 -4
  166. package/analyzer-template/project/writeScenarioComponents.ts +101 -8
  167. package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
  168. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
  169. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  170. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
  171. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  172. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
  173. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
  174. package/background/src/lib/virtualized/project/constructMockCode.js +300 -7
  175. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  176. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
  177. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
  178. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
  179. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  180. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
  181. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
  182. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
  183. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  184. package/background/src/lib/virtualized/project/orchestrateCapture.js +58 -6
  185. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  186. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +126 -9
  187. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  188. package/background/src/lib/virtualized/project/runAnalysis.js +3 -0
  189. package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
  190. package/background/src/lib/virtualized/project/start.js +32 -11
  191. package/background/src/lib/virtualized/project/start.js.map +1 -1
  192. package/background/src/lib/virtualized/project/writeMockDataTsx.js +101 -4
  193. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  194. package/background/src/lib/virtualized/project/writeScenarioComponents.js +57 -8
  195. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  196. package/codeyam-cli/src/cli.js +2 -0
  197. package/codeyam-cli/src/cli.js.map +1 -1
  198. package/codeyam-cli/src/commands/debug.js +7 -5
  199. package/codeyam-cli/src/commands/debug.js.map +1 -1
  200. package/codeyam-cli/src/commands/memory.js +273 -0
  201. package/codeyam-cli/src/commands/memory.js.map +1 -0
  202. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +4 -0
  203. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  204. package/codeyam-cli/src/utils/analysisRunner.js +21 -2
  205. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  206. package/codeyam-cli/src/utils/install-skills.js +42 -6
  207. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  208. package/codeyam-cli/src/utils/queue/job.js +1 -0
  209. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  210. package/codeyam-cli/src/utils/queue/manager.js +6 -0
  211. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  212. package/codeyam-cli/src/utils/rules/index.js +5 -0
  213. package/codeyam-cli/src/utils/rules/index.js.map +1 -0
  214. package/codeyam-cli/src/utils/rules/parser.js +106 -0
  215. package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
  216. package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
  217. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
  218. package/codeyam-cli/src/utils/rules/staleness.js +132 -0
  219. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
  220. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +2 -0
  221. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  222. package/codeyam-cli/src/webserver/app/lib/database.js +7 -3
  223. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  224. package/codeyam-cli/src/webserver/bootstrap.js +40 -0
  225. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  226. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-DsN1wKrm.js +11 -0
  227. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-COi5OvsN.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
  228. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BwdQv49w.js → EntityTypeIcon-Ba2JVPzP.js} +1 -1
  229. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CEleMv_j.js → InlineSpinner-C8lyxW9k.js} +1 -1
  230. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D68KarMg.js → InteractivePreview-aht4aafF.js} +2 -2
  231. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-L75Wvqgw.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
  232. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-C53WM8qn.js → LoadingDots-B0GLXMsr.js} +1 -1
  233. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CrNkmy4i.js → LogViewer-xgeCVgSM.js} +1 -1
  234. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-OApQuNyq.js +16 -0
  235. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CQifa1n-.js → SafeScreenshot-DuDvi0jm.js} +1 -1
  236. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CyaBFX7l.js → ScenarioViewer-DzccYyI8.js} +3 -13
  237. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D36O1rzU.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
  238. package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
  239. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BwavGCpm.js +32 -0
  240. package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
  241. package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
  242. package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
  243. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DgTPh8H-.js → chevron-down-Cx24_aWc.js} +1 -1
  244. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-DdQKK6on.js → chunk-EPOLDU6W-CXRTFQ3F.js} +1 -1
  245. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-Dmr2bb1R.js → circle-check-BOARzkeR.js} +1 -1
  246. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +6 -0
  247. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Do4ZLUYa.js → createLucideIcon-BdhJEx6B.js} +1 -1
  248. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +1 -0
  249. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CbdFyxZh.js → entity._sha._-BJUiQqZF.js} +12 -12
  250. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js → entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js} +1 -1
  251. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-wDWZZO1W.js → entity._sha_.create-scenario-D1T4TGjf.js} +1 -1
  252. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMbl7MeQ.js → entity._sha_.edit._scenarioId-CTBG2mmz.js} +1 -1
  253. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-5wRKRIH9.js → entry.client-CS2cb_eZ.js} +1 -1
  254. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +6 -0
  255. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DD3SDH7t.js → fileTableUtils-DMJ7zii9.js} +1 -1
  256. package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +1 -0
  257. package/codeyam-cli/src/webserver/build/client/assets/{git-zXjT7J0G.js → git-CPTZZ-JZ.js} +8 -8
  258. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +1 -0
  259. package/codeyam-cli/src/webserver/build/client/assets/{index-DLbXwndH.js → index-B1h680n5.js} +1 -1
  260. package/codeyam-cli/src/webserver/build/client/assets/{index-gPZ-lad1.js → index-lzqtyFU8.js} +1 -1
  261. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BsPXJ81F.js → loader-circle-B7B9V-bu.js} +1 -1
  262. package/codeyam-cli/src/webserver/build/client/assets/manifest-a78b90a2.js +1 -0
  263. package/codeyam-cli/src/webserver/build/client/assets/memory--GCbFsBE.js +92 -0
  264. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +62 -0
  265. package/codeyam-cli/src/webserver/build/client/assets/{search-P2FKIUql.js → search-CxXUmBSd.js} +1 -1
  266. package/codeyam-cli/src/webserver/build/client/assets/{settings-B2eDuBj8.js → settings-CS5f3WzT.js} +1 -1
  267. package/codeyam-cli/src/webserver/build/client/assets/{simulations-L18M6-kN.js → simulations-DwFIBT09.js} +1 -1
  268. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BDz7kbVA.js → triangle-alert-B6LgvRJg.js} +1 -1
  269. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-29dDmbH8.js → useCustomSizes-C1v1PQzo.js} +1 -1
  270. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BUm0UVJm.js → useLastLogLine-aSv48UbS.js} +1 -1
  271. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CkIOKTrZ.js → useReportContext-DYxHZQuP.js} +1 -1
  272. package/codeyam-cli/src/webserver/build/client/assets/{useToast-KKw5kTn-.js → useToast-mBRpZPiu.js} +1 -1
  273. package/codeyam-cli/src/webserver/build/server/assets/index-BM6TDT1Y.js +1 -0
  274. package/codeyam-cli/src/webserver/build/server/assets/server-build-dYC34MHw.js +257 -0
  275. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  276. package/codeyam-cli/src/webserver/build-info.json +5 -5
  277. package/codeyam-cli/templates/codeyam-memory-hook.sh +200 -0
  278. package/codeyam-cli/templates/codeyam:debug.md +47 -3
  279. package/codeyam-cli/templates/codeyam:diagnose.md +203 -25
  280. package/codeyam-cli/templates/codeyam:memory.md +341 -0
  281. package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
  282. package/codeyam-cli/templates/rule-reflection-hook.py +160 -0
  283. package/codeyam-cli/templates/rules-instructions.md +93 -0
  284. package/package.json +8 -5
  285. package/packages/ai/index.js +7 -3
  286. package/packages/ai/index.js.map +1 -1
  287. package/packages/ai/src/lib/analyzeScope.js +70 -29
  288. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  289. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
  290. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
  291. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +78 -8
  292. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  293. package/packages/ai/src/lib/astScopes/methodSemantics.js +109 -23
  294. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  295. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +1 -102
  296. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
  297. package/packages/ai/src/lib/astScopes/processExpression.js +440 -27
  298. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  299. package/packages/ai/src/lib/completionCall.js +161 -30
  300. package/packages/ai/src/lib/completionCall.js.map +1 -1
  301. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +589 -166
  302. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  303. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +179 -0
  304. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
  305. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +7 -1
  306. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  307. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  308. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  309. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  310. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  311. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +41 -1
  312. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  313. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +104 -11
  314. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  315. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +159 -0
  316. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  317. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  318. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  319. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +265 -79
  320. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  321. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
  322. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
  323. package/packages/ai/src/lib/dataStructureChunking.js +111 -0
  324. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
  325. package/packages/ai/src/lib/e2eDataTracking.js +241 -0
  326. package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
  327. package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
  328. package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
  329. package/packages/ai/src/lib/generateEntityScenarioData.js +525 -8
  330. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  331. package/packages/ai/src/lib/generateEntityScenarios.js +26 -2
  332. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  333. package/packages/ai/src/lib/generateExecutionFlows.js +281 -4
  334. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  335. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +946 -42
  336. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  337. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
  338. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
  339. package/packages/ai/src/lib/mergeStatements.js +70 -51
  340. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  341. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  342. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  343. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
  344. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
  345. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +15 -7
  346. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  347. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
  348. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
  349. package/packages/ai/src/lib/resolvePathToControllable.js +155 -41
  350. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  351. package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
  352. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  353. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
  354. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  355. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  356. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  357. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  358. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  359. package/packages/analyze/src/lib/analysisContext.js +30 -5
  360. package/packages/analyze/src/lib/analysisContext.js.map +1 -1
  361. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  362. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  363. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  364. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  365. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  366. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  367. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  368. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  369. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  370. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  371. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  372. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  373. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +21 -9
  374. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  375. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +14 -4
  376. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  377. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
  378. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  379. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  380. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  381. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -10
  382. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  383. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  384. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  385. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  386. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  387. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +160 -68
  388. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  389. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +25 -8
  390. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  391. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +71 -9
  392. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  393. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +57 -9
  394. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  395. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +233 -9
  396. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  397. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
  398. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
  399. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  400. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  401. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  402. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  403. package/packages/database/src/lib/kysely/db.js +8 -1
  404. package/packages/database/src/lib/kysely/db.js.map +1 -1
  405. package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
  406. package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  407. package/packages/database/src/lib/loadAnalyses.js +45 -2
  408. package/packages/database/src/lib/loadAnalyses.js.map +1 -1
  409. package/packages/database/src/lib/loadAnalysis.js +8 -0
  410. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  411. package/packages/database/src/lib/loadBranch.js +11 -1
  412. package/packages/database/src/lib/loadBranch.js.map +1 -1
  413. package/packages/database/src/lib/loadCommit.js +7 -0
  414. package/packages/database/src/lib/loadCommit.js.map +1 -1
  415. package/packages/database/src/lib/loadCommits.js +22 -1
  416. package/packages/database/src/lib/loadCommits.js.map +1 -1
  417. package/packages/database/src/lib/loadEntities.js +23 -4
  418. package/packages/database/src/lib/loadEntities.js.map +1 -1
  419. package/packages/database/src/lib/loadEntityBranches.js +9 -0
  420. package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
  421. package/packages/database/src/lib/updateCommitMetadata.js +5 -4
  422. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  423. package/packages/types/index.js.map +1 -1
  424. package/packages/utils/src/lib/safeFileName.js +29 -3
  425. package/packages/utils/src/lib/safeFileName.js.map +1 -1
  426. package/scripts/finalize-analyzer.cjs +3 -3
  427. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +0 -1
  428. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +0 -11
  429. package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +0 -11
  430. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +0 -37
  431. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +0 -1
  432. package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +0 -1
  433. package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +0 -1
  434. package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +0 -1
  435. package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +0 -57
  436. package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +0 -1
  437. package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +0 -228
@@ -7,6 +7,28 @@ import {
7
7
  import { Analysis, Project } from '~codeyam/types';
8
8
  import { LazyFileStore } from './LazyFileStore';
9
9
 
10
+ const DB_CONCURRENCY = 1;
11
+
12
+ async function mapWithConcurrency<T, R>(
13
+ items: T[],
14
+ fn: (item: T) => Promise<R>,
15
+ concurrency: number,
16
+ ): Promise<R[]> {
17
+ const results: R[] = new Array(items.length);
18
+ let index = 0;
19
+ const workers = Array.from(
20
+ { length: Math.min(concurrency, items.length) },
21
+ async () => {
22
+ while (index < items.length) {
23
+ const i = index++;
24
+ results[i] = await fn(items[i]);
25
+ }
26
+ },
27
+ );
28
+ await Promise.all(workers);
29
+ return results;
30
+ }
31
+
10
32
  interface LoadReadyToBeCapturedArgs {
11
33
  project: Project;
12
34
  branchCommitSha?: string;
@@ -77,8 +99,9 @@ async function gatherAllReferencedEntities(
77
99
  byFilePath.get(filePath)!.push(name);
78
100
  }
79
101
 
80
- // Batch load entities by file path
81
- const loadPromises = Array.from(byFilePath.entries()).map(
102
+ // Batch load entities by file path (concurrency-limited to avoid exhausting DB connections)
103
+ const results = await mapWithConcurrency(
104
+ Array.from(byFilePath.entries()),
82
105
  async ([filePath, names]) => {
83
106
  const entities = await loadEntities({
84
107
  projectId: project.id,
@@ -106,9 +129,8 @@ async function gatherAllReferencedEntities(
106
129
  return false;
107
130
  });
108
131
  },
132
+ DB_CONCURRENCY,
109
133
  );
110
-
111
- const results = await Promise.all(loadPromises);
112
134
  const loadedEntities = results.flat();
113
135
 
114
136
  // Add loaded entities to context
@@ -198,48 +220,50 @@ export default async function loadReadyToBeCaptured({
198
220
  foundNewDependencies = false;
199
221
  const currentBatch = Array.from(stillNeeded);
200
222
 
201
- // Load analyses for current batch
202
- const loadPromises = currentBatch.map(async (keyString) => {
203
- const [filePath, entityName] = keyString.split(':');
204
-
205
- // Find the file ID for this file path - use fileStore for O(1) lookup when available
206
- const file = fileStore
207
- ? fileStore.getByPath(filePath)
208
- : project.files.find((f) => f.path === filePath);
209
- if (!file) {
210
- console.log(
211
- `CodeYam Warning: File not found in project: ${filePath} for key ${keyString}`,
212
- );
213
- return null;
214
- }
215
-
216
- try {
217
- const analysis = await loadAnalysis({
218
- projectId: project.id,
219
- fileId: file.id,
220
- entityName,
221
- includeScenarios: isFirstBatch, // Only include scenarios for the root analyses
222
- });
223
-
224
- if (analysis) {
225
- console.log(`CodeYam: Loaded analysis ${filePath}:${entityName}`);
226
- return { key: keyString, analysis };
227
- } else {
223
+ // Load analyses for current batch (concurrency-limited to avoid exhausting DB connections)
224
+ const results = await mapWithConcurrency(
225
+ currentBatch,
226
+ async (keyString) => {
227
+ const [filePath, entityName] = keyString.split(':');
228
+
229
+ // Find the file ID for this file path - use fileStore for O(1) lookup when available
230
+ const file = fileStore
231
+ ? fileStore.getByPath(filePath)
232
+ : project.files.find((f) => f.path === filePath);
233
+ if (!file) {
228
234
  console.log(
229
- `CodeYam Warning: Analysis not found: ${filePath}:${entityName}`,
235
+ `CodeYam Warning: File not found in project: ${filePath} for key ${keyString}`,
230
236
  );
231
237
  return null;
232
238
  }
233
- } catch (error) {
234
- console.log(
235
- `CodeYam Error loading analysis ${filePath}:${entityName}:`,
236
- error,
237
- );
238
- return null;
239
- }
240
- });
241
239
 
242
- const results = await Promise.all(loadPromises);
240
+ try {
241
+ const analysis = await loadAnalysis({
242
+ projectId: project.id,
243
+ fileId: file.id,
244
+ entityName,
245
+ includeScenarios: isFirstBatch, // Only include scenarios for the root analyses
246
+ });
247
+
248
+ if (analysis) {
249
+ console.log(`CodeYam: Loaded analysis ${filePath}:${entityName}`);
250
+ return { key: keyString, analysis };
251
+ } else {
252
+ console.log(
253
+ `CodeYam Warning: Analysis not found: ${filePath}:${entityName}`,
254
+ );
255
+ return null;
256
+ }
257
+ } catch (error) {
258
+ console.log(
259
+ `CodeYam Error loading analysis ${filePath}:${entityName}:`,
260
+ error,
261
+ );
262
+ return null;
263
+ }
264
+ },
265
+ DB_CONCURRENCY,
266
+ );
243
267
 
244
268
  // Process loaded analyses and find new dependencies
245
269
  for (const result of results) {
@@ -35,7 +35,10 @@ export default class AwsCaptureTaskRunner implements CaptureTaskRunner {
35
35
  private sqs: SQSClient;
36
36
  private queueInfo: QueueInfo;
37
37
  private taskArns: string[];
38
- private batchCompletedCallback?: (analysisIds: string[]) => void;
38
+ private batchCompletedCallback?: (
39
+ analysisIds: string[],
40
+ success: boolean,
41
+ ) => void;
39
42
  private controlPollingInterval?: NodeJS.Timeout;
40
43
  private lastTaskHealthCheck = Date.now();
41
44
  private isCleanedUp = false;
@@ -213,7 +216,9 @@ export default class AwsCaptureTaskRunner implements CaptureTaskRunner {
213
216
  }
214
217
  }
215
218
 
216
- onBatchCompleted(callback: (analysisIds: string[]) => void): void {
219
+ onBatchCompleted(
220
+ callback: (analysisIds: string[], success: boolean) => void,
221
+ ): void {
217
222
  this.batchCompletedCallback = callback;
218
223
  }
219
224
 
@@ -255,9 +260,12 @@ export default class AwsCaptureTaskRunner implements CaptureTaskRunner {
255
260
  body.analysisIds &&
256
261
  Array.isArray(body.analysisIds)
257
262
  ) {
258
- // Notify callback
263
+ // Notify callback with success status (default false for backwards compatibility)
259
264
  if (this.batchCompletedCallback) {
260
- this.batchCompletedCallback(body.analysisIds);
265
+ this.batchCompletedCallback(
266
+ body.analysisIds,
267
+ body.success ?? false,
268
+ );
261
269
  }
262
270
  }
263
271
 
@@ -49,7 +49,10 @@ export interface SequentialCaptureTaskRunnerContext {
49
49
 
50
50
  export default class SequentialCaptureTaskRunner implements CaptureTaskRunner {
51
51
  private queue: string[][] = [];
52
- private batchCompletedCallback?: (analysisIds: string[]) => void;
52
+ private batchCompletedCallback?: (
53
+ analysisIds: string[],
54
+ success: boolean,
55
+ ) => void;
53
56
  private isProcessing = false;
54
57
  private isCleanedUp = false;
55
58
  private processingLoop: Promise<void> | null = null;
@@ -94,7 +97,13 @@ export default class SequentialCaptureTaskRunner implements CaptureTaskRunner {
94
97
 
95
98
  // In CAPTURE_ONLY mode, run directly from the main project folder (skip rsync)
96
99
  // This preserves any manual edits made to generated files
97
- const captureOnly = process.env.CAPTURE_ONLY === 'true';
100
+ const captureOnlyEnvValue = process.env.CAPTURE_ONLY;
101
+ const captureOnly = captureOnlyEnvValue === 'true';
102
+
103
+ console.log(
104
+ `CodeYam: CAPTURE_ONLY env = ${captureOnlyEnvValue === undefined ? 'undefined' : `"${captureOnlyEnvValue}"`}`,
105
+ );
106
+
98
107
  const capturerPath = captureOnly
99
108
  ? parentDir
100
109
  : path.normalize(path.join(parentDir, 'capturer-1'));
@@ -191,15 +200,15 @@ export default class SequentialCaptureTaskRunner implements CaptureTaskRunner {
191
200
  try {
192
201
  await this.processBatch(batch);
193
202
 
194
- // Notify callback of completion
203
+ // Notify callback of successful completion
195
204
  if (this.batchCompletedCallback) {
196
- this.batchCompletedCallback(batch);
205
+ this.batchCompletedCallback(batch, true);
197
206
  }
198
207
  } catch (error) {
199
208
  console.error('CodeYam: Error processing batch:', error);
200
- // Still notify callback so orchestration can track failures
209
+ // Notify callback of failure so orchestration can track retries
201
210
  if (this.batchCompletedCallback) {
202
- this.batchCompletedCallback(batch);
211
+ this.batchCompletedCallback(batch, false);
203
212
  }
204
213
  } finally {
205
214
  this.isProcessing = false;
@@ -393,7 +402,9 @@ export default class SequentialCaptureTaskRunner implements CaptureTaskRunner {
393
402
  console.log('CodeYam: Sequential task runner cleanup complete');
394
403
  }
395
404
 
396
- onBatchCompleted(callback: (analysisIds: string[]) => void): void {
405
+ onBatchCompleted(
406
+ callback: (analysisIds: string[], success: boolean) => void,
407
+ ): void {
397
408
  this.batchCompletedCallback = callback;
398
409
  }
399
410
  }
@@ -115,7 +115,9 @@ export interface CaptureTaskRunner {
115
115
  * Register callback for when workers complete batch processing.
116
116
  *
117
117
  * Critical for retry logic and progress tracking in orchestration.
118
- * Callback receives the analysis IDs that were completed.
118
+ * Callback receives the analysis IDs and whether the batch succeeded.
119
119
  */
120
- onBatchCompleted(callback: (analysisIds: string[]) => void): void;
120
+ onBatchCompleted(
121
+ callback: (analysisIds: string[], success: boolean) => void,
122
+ ): void;
121
123
  }
@@ -99,15 +99,20 @@ export default async function orchestrateCapture({
99
99
  const attemptCount = new Map<string, number>();
100
100
  const maxAttempts = 2;
101
101
 
102
+ // Track which analyses had a worker report success — only these can be "captured"
103
+ const confirmedSuccessAnalyses = new Set<string>();
104
+
102
105
  // Register batch completion callback with task runner
103
- taskRunner.onBatchCompleted((analysisIds: string[]) => {
106
+ taskRunner.onBatchCompleted((analysisIds: string[], success: boolean) => {
104
107
  console.log(
105
- `CodeYam Capture: Received batch completion for ${analysisIds.length} analyses: ${analysisIds.join(', ')}`,
108
+ `CodeYam Capture: Received batch completion (success=${success}) for ${analysisIds.length} analyses: ${analysisIds.join(', ')}`,
106
109
  );
107
- // Remove from inFlight and increment attempt count for each analysis
108
110
  for (const analysisId of analysisIds) {
109
111
  inFlight.delete(analysisId);
110
112
  attemptCount.set(analysisId, (attemptCount.get(analysisId) || 0) + 1);
113
+ if (success) {
114
+ confirmedSuccessAnalyses.add(analysisId);
115
+ }
111
116
  }
112
117
  });
113
118
 
@@ -195,9 +200,13 @@ export default async function orchestrateCapture({
195
200
  knownAnalyses.add(id);
196
201
  }
197
202
 
198
- // an analysis we've seen, but is no longer "ready to be captured", is captured!
203
+ // An analysis is "captured" only if:
204
+ // 1. A worker reported success for its batch (in confirmedSuccessAnalyses)
205
+ // 2. It no longer appears in the ready-to-be-captured list (DB confirms)
206
+ // This prevents transient empty DB results from inflating the captured count.
199
207
  const capturedAnalysisIds = Array.from(knownAnalyses).filter(
200
- (id) => !allReadyAnalysisIds.includes(id),
208
+ (id) =>
209
+ confirmedSuccessAnalyses.has(id) && !allReadyAnalysisIds.includes(id),
201
210
  );
202
211
 
203
212
  // Remove captured analyses from inFlight tracking
@@ -355,6 +364,32 @@ export default async function orchestrateCapture({
355
364
  }
356
365
  }
357
366
 
367
+ // Early exit when all enqueued work is settled (captured or abandoned)
368
+ // This avoids waiting for the 20-minute ANALYSIS_TIMEOUT when capture is complete
369
+ // IMPORTANT: Only check this when isDraining (analysis phase complete) to avoid
370
+ // exiting while slow-running analyses are still in progress
371
+ if (
372
+ isDraining &&
373
+ !firstLoop &&
374
+ enqueuedAnalyses.size > 0 &&
375
+ inFlight.size === 0 &&
376
+ remaining.length === 0 &&
377
+ toRetry.length === 0
378
+ ) {
379
+ const allAnalysesSettled = Array.from(enqueuedAnalyses).every((id) => {
380
+ const captured = !allReadyAnalysisIds.includes(id);
381
+ const abandoned = (attemptCount.get(id) || 0) >= maxAttempts;
382
+ return captured || abandoned;
383
+ });
384
+
385
+ if (allAnalysesSettled) {
386
+ console.log(
387
+ 'CodeYam Capture: All enqueued analyses settled (captured or abandoned), exiting early',
388
+ );
389
+ break;
390
+ }
391
+ }
392
+
358
393
  if (isDraining) {
359
394
  // Exit if analysis complete but no entities ready for capture
360
395
  // Only check this after at least one poll (not firstLoop) to ensure we've
@@ -371,7 +406,9 @@ export default async function orchestrateCapture({
371
406
  // check if all enqueued analyses have been either captured or abandoned
372
407
  const allAnalysesSettled = Array.from(enqueuedAnalyses).every(
373
408
  (id) => {
374
- const captured = !allReadyAnalysisIds.includes(id);
409
+ const captured =
410
+ confirmedSuccessAnalyses.has(id) &&
411
+ !allReadyAnalysisIds.includes(id);
375
412
  const abandoned = (attemptCount.get(id) || 0) >= maxAttempts;
376
413
  return captured || abandoned;
377
414
  },
@@ -411,5 +448,33 @@ export default async function orchestrateCapture({
411
448
  } finally {
412
449
  // Always clean up task runner resources in finally block
413
450
  await taskRunner.cleanup();
451
+
452
+ const trackingCommit = metadataCommit ?? commit;
453
+ if (trackingCommit?.id) {
454
+ const captureCompletedAt = new Date().toISOString();
455
+
456
+ await updateCommitMetadata({
457
+ commitId: trackingCommit.id,
458
+ runStatusUpdate: {
459
+ captureCompletedAt,
460
+ capturePid: undefined,
461
+ },
462
+ // completedAt = max(analysisCompletedAt, captureCompletedAt)
463
+ // Normally capture finishes after analysis, but using max means illogical
464
+ // orderings leave a detectable signal (completedAt !== captureCompletedAt).
465
+ updateCallback(metadata) {
466
+ const run = metadata.currentRun!;
467
+ run.completedAt =
468
+ run.analysisCompletedAt &&
469
+ run.analysisCompletedAt > captureCompletedAt
470
+ ? run.analysisCompletedAt
471
+ : captureCompletedAt;
472
+ },
473
+ }).catch((error) => {
474
+ console.log(
475
+ `Warning: Failed to update capture completion metadata: ${error}`,
476
+ );
477
+ });
478
+ }
414
479
  }
415
480
  }
@@ -7,6 +7,9 @@
7
7
  *
8
8
  * Keys are now original call signatures (e.g., "useFetcher<User>()", "db.select(query)").
9
9
  *
10
+ * Also handles flat dotted keys (e.g., "trpc.fastener.getAttributeValues.useQuery(...)")
11
+ * by converting them to nested structure.
12
+ *
10
13
  * @param mockData The mock data object to reconcile
11
14
  * @param expectedKeys The expected keys from the structure
12
15
  */
@@ -29,6 +32,26 @@ export function reconcileMockDataKeys(
29
32
  continue;
30
33
  }
31
34
 
35
+ // Check if this is a flat dotted key that should be converted to nested structure
36
+ // e.g., "trpc.fastener.getAttributeValues.useQuery({ ... })"
37
+ const flatKeyParts = parseFlatDottedKey(key);
38
+ if (flatKeyParts && flatKeyParts.length > 1) {
39
+ // Check if the parts match expected keys (indicating this should be nested)
40
+ const partsMatchExpected = flatKeyParts.some((part) =>
41
+ expectedKeys.includes(part),
42
+ );
43
+ if (partsMatchExpected) {
44
+ // Convert flat key to nested structure and merge
45
+ deepMergeIntoResult(
46
+ result,
47
+ flatKeyParts,
48
+ reconciledValue,
49
+ expectedKeys,
50
+ );
51
+ continue;
52
+ }
53
+ }
54
+
32
55
  // Try to find closest match using existing logic
33
56
  const closestKey = findClosestKey(key, expectedKeys);
34
57
  if (closestKey) {
@@ -42,6 +65,94 @@ export function reconcileMockDataKeys(
42
65
  return result;
43
66
  }
44
67
 
68
+ /**
69
+ * Parse a flat dotted key into path segments.
70
+ * Handles keys like "trpc.fastener.getAttributeValues.useQuery({ ... })"
71
+ * where the last part might contain parentheses with function arguments.
72
+ *
73
+ * Returns null if the key doesn't look like a dotted path.
74
+ */
75
+ function parseFlatDottedKey(key: string): string[] | null {
76
+ // Don't treat keys that start with a function call as dotted paths
77
+ // e.g., "useQuery({ id: 123 })" should not be parsed
78
+ if (key.match(/^[a-zA-Z_][a-zA-Z0-9_]*\s*\(/)) {
79
+ // Check if there's a dot BEFORE the first parenthesis
80
+ const parenIndex = key.indexOf('(');
81
+ const dotBeforeParen = key.slice(0, parenIndex).includes('.');
82
+ if (!dotBeforeParen) {
83
+ return null;
84
+ }
85
+ }
86
+
87
+ // Must contain a dot to be a dotted path
88
+ if (!key.includes('.')) {
89
+ return null;
90
+ }
91
+
92
+ const parts: string[] = [];
93
+ let current = '';
94
+ let depth = 0;
95
+
96
+ for (let i = 0; i < key.length; i++) {
97
+ const char = key[i];
98
+
99
+ if (char === '(' || char === '{' || char === '[') {
100
+ depth++;
101
+ current += char;
102
+ } else if (char === ')' || char === '}' || char === ']') {
103
+ depth--;
104
+ current += char;
105
+ } else if (char === '.' && depth === 0) {
106
+ if (current) {
107
+ parts.push(current);
108
+ }
109
+ current = '';
110
+ } else {
111
+ current += char;
112
+ }
113
+ }
114
+
115
+ if (current) {
116
+ parts.push(current);
117
+ }
118
+
119
+ // Need at least 2 parts for it to be a meaningful dotted path
120
+ return parts.length >= 2 ? parts : null;
121
+ }
122
+
123
+ /**
124
+ * Deep merge a value into the result object following the path segments.
125
+ * Reconciles the leaf key against expected keys.
126
+ */
127
+ function deepMergeIntoResult(
128
+ result: Record<string, unknown>,
129
+ parts: string[],
130
+ value: unknown,
131
+ expectedKeys: string[],
132
+ ): void {
133
+ let current = result;
134
+
135
+ // Navigate/create path for all but the last part
136
+ for (let i = 0; i < parts.length - 1; i++) {
137
+ const part = parts[i];
138
+ if (!(part in current)) {
139
+ current[part] = {};
140
+ }
141
+ const next = current[part];
142
+ if (next && typeof next === 'object' && !Array.isArray(next)) {
143
+ current = next as Record<string, unknown>;
144
+ } else {
145
+ // Can't traverse further, structure mismatch
146
+ return;
147
+ }
148
+ }
149
+
150
+ // Handle the leaf key
151
+ const leafKey = parts[parts.length - 1];
152
+ const closestLeafKey = findClosestKey(leafKey, expectedKeys) || leafKey;
153
+ current[closestLeafKey] = value;
154
+ }
155
+
45
156
  /**
46
157
  * Find the closest matching key from expectedKeys for a given key.
47
158
  *
@@ -100,38 +211,70 @@ function findClosestKey(key: string, expectedKeys: string[]): string | null {
100
211
  }
101
212
 
102
213
  // If key has object literal arguments (like "useQuery({ id: 123, ... })"),
103
- // try matching expected keys with the same function name and object arguments.
214
+ // try matching expected keys with the same function path AND first object property.
104
215
  // This handles cases where LLM generates literal values but expected keys have variable references.
105
- // e.g., "useQuery({ id: 123 })" matches "useQuery({ id: Number(id) })"
216
+ // e.g., "useQuery({ attributes: ['a', 'b'] })" matches "useQuery({ attributes: items || [] })"
106
217
  // e.g., "trpc.users.getById.useQuery({ userId: 'user-123' })" matches "trpc.users.getById.useQuery({ userId })"
218
+ // Uses first property matching when multiple candidates exist for disambiguation.
107
219
  const objectArgMatch = key.match(/^([a-zA-Z_][a-zA-Z0-9_.]*)\s*\(\s*\{/);
108
220
  if (objectArgMatch) {
109
221
  const funcPath = objectArgMatch[1]; // Can be "funcName" or "path.to.funcName"
222
+ // Extract the first property name from the object argument
223
+ const firstPropMatch = key.match(
224
+ /\(\s*\{\s*\n?\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*:/,
225
+ );
226
+ const firstProp = firstPropMatch ? firstPropMatch[1] : null;
227
+
228
+ // Collect all matching candidates
229
+ const candidates: string[] = [];
110
230
  for (const expected of expectedKeys) {
111
231
  // Match if expected key has the same function path and starts with object argument
112
232
  const expectedObjArgMatch = expected.match(
113
233
  new RegExp(`^${escapeRegExp(funcPath)}\\s*\\(\\s*\\{`),
114
234
  );
115
235
  if (expectedObjArgMatch) {
116
- return expected;
236
+ candidates.push(expected);
117
237
  }
118
238
  }
239
+
240
+ // If we have a first property, prefer matching by property name
241
+ if (firstProp && candidates.length > 1) {
242
+ // Look for a candidate with the same first property
243
+ const propRegex = new RegExp(
244
+ `\\(\\s*\\{[\\s\\n]*${escapeRegExp(firstProp)}\\s*:`,
245
+ );
246
+ const propMatch = candidates.find((c) => propRegex.test(c));
247
+ if (propMatch) {
248
+ return propMatch;
249
+ }
250
+ }
251
+
252
+ // Fall back to first candidate if no property match found
253
+ if (candidates.length > 0) {
254
+ return candidates[0];
255
+ }
119
256
  }
120
257
 
121
- // If key has a single argument with a literal value (string, number, etc.),
258
+ // If key has a single argument (literal value OR variable reference),
122
259
  // try matching expected keys with the same function name but different argument.
123
- // This handles cases where LLM generates "useCustomSizes('example-slug')" but expected
124
- // key is "useCustomSizes(projectSlug)" with a variable reference.
125
- // e.g., "useCustomSizes('example-slug')" matches "useCustomSizes(projectSlug)"
260
+ // This handles cases where:
261
+ // - LLM generates "useCustomSizes('example-slug')" but expected key is "useCustomSizes(projectSlug)"
262
+ // - LLM generates "useCustomSizes(someProjectSlug)" but expected key is "useCustomSizes(projectSlug)"
263
+ //
264
+ // The second case is important because when LLM generates multiple keys with different
265
+ // variable names (e.g., "useCustomSizes(someProjectSlug)" and "useCustomSizes(projectSlug)"),
266
+ // without reconciliation, normalizeMockData merges them into "useCustomSizes()" which
267
+ // doesn't match the expected key "useCustomSizes(projectSlug)", causing undefined data access.
126
268
  const singleArgMatch = key.match(
127
269
  /^([a-zA-Z_][a-zA-Z0-9_.]*)\s*\(([^,)]+)\)$/,
128
270
  );
129
271
  if (singleArgMatch) {
130
272
  const funcPath = singleArgMatch[1];
131
273
  const arg = singleArgMatch[2].trim();
132
- // Only apply this matching if the argument looks like a literal (quoted string or number)
274
+ // Apply this matching if the argument is a literal OR a simple variable reference
133
275
  const isLiteralArg = /^['"`].*['"`]$/.test(arg) || /^\d+$/.test(arg);
134
- if (isLiteralArg) {
276
+ const isVariableRef = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(arg);
277
+ if (isLiteralArg || isVariableRef) {
135
278
  for (const expected of expectedKeys) {
136
279
  // Match if expected key has the same function path with a single argument
137
280
  const expectedSingleArgMatch = expected.match(
@@ -313,6 +313,10 @@ export default async function runAnalysis({
313
313
  // Route to appropriate analyzer
314
314
  try {
315
315
  if (runReadyToBeCapturedPath) {
316
+ // Signal that analysis can produce captures immediately since analyses are already ready.
317
+ // This is needed for recapture to work - orchestration waits for the 'analysisProducing' event.
318
+ controller?.setAnalysisProducingPhase();
319
+
316
320
  return await analyzeReadyToBeCaptured({
317
321
  project,
318
322
  projectAnalyzer,