@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
@@ -17,7 +17,8 @@ import { startScenarioCapture } from './startScenarioCapture';
17
17
  import { createController } from './controller/startController';
18
18
  import { awsLog, awsLogDebugLevel } from '~codeyam/utils';
19
19
  import * as v8 from 'v8';
20
- import { initializeAIServiceMode } from '~codeyam/ai';
20
+ import * as os from 'os';
21
+ import { initializeAIServiceMode, destroyWorkerPool } from '~codeyam/ai';
21
22
  import runAnalysis, { EnvConfig, SharedContext } from './runAnalysis';
22
23
  import {
23
24
  loadOrCreateCommit,
@@ -119,28 +120,31 @@ async function main({
119
120
  // and attempted to access project/commit/branch data before it was loaded.
120
121
  const sharedContext = await loadSharedContext(envConfig);
121
122
 
122
- // Heap monitoring: pulse every 1s, log every 30s when normal, warn every 1s when high
123
+ // Memory monitoring: tracks both V8 heap and RSS (which includes worker threads)
124
+ const containerMemoryMB = process.env.ECS_CONTAINER_MEMORY_MB
125
+ ? parseInt(process.env.ECS_CONTAINER_MEMORY_MB, 10)
126
+ : Math.round(os.totalmem() / 1024 / 1024);
123
127
  let lastLogTime = 0;
124
128
  setInterval(() => {
125
129
  const mem = process.memoryUsage();
126
130
  const heap = v8.getHeapStatistics();
127
- const usagePercent = (mem.heapUsed / heap.heap_size_limit) * 100;
131
+ const heapMB = Math.round(mem.heapUsed / 1024 / 1024);
132
+ const rssMB = Math.round(mem.rss / 1024 / 1024);
133
+ const heapLimitMB = Math.round(heap.heap_size_limit / 1024 / 1024);
134
+ const rssPercent = (rssMB / containerMemoryMB) * 100;
128
135
  const now = Date.now();
129
136
 
130
- if (usagePercent >= 80) {
131
- // High usage: warn every second
137
+ if (rssPercent >= 80) {
132
138
  console.warn(
133
- `CodeYam Heap Warning: ${Math.round(mem.heapUsed / 1024 / 1024)}MB used / ${Math.round(heap.heap_size_limit / 1024 / 1024)}MB limit (${Math.round(usagePercent)}%) ⚠️ HIGH USAGE`,
139
+ `CodeYam Memory Warning: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB ⚠️ HIGH`,
134
140
  );
135
- } else if (usagePercent >= 50 && now - lastLogTime >= 5000) {
136
- // Elevated usage: log every 5 seconds
141
+ } else if (rssPercent >= 50 && now - lastLogTime >= 5000) {
137
142
  console.log(
138
- `CodeYam Heap Notice: ${Math.round(mem.heapUsed / 1024 / 1024)}MB used / ${Math.round(heap.heap_size_limit / 1024 / 1024)}MB limit (${Math.round(usagePercent)}%) ⚠️ Elevated`,
143
+ `CodeYam Memory Notice: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB ⚠️ Elevated`,
139
144
  );
140
145
  } else if (now - lastLogTime >= 30000) {
141
- // Normal usage: log every 30 seconds
142
146
  console.log(
143
- `CodeYam Heap Stats: ${Math.round(mem.heapUsed / 1024 / 1024)}MB used / ${Math.round(heap.heap_size_limit / 1024 / 1024)}MB limit (${Math.round(usagePercent)}%) 📊 OK`,
147
+ `CodeYam Memory Stats: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB 📊 OK`,
144
148
  );
145
149
  }
146
150
 
@@ -187,6 +191,11 @@ async function main({
187
191
  analyzerPid: undefined,
188
192
  capturePid: process.pid,
189
193
  },
194
+ updateCallback(metadata) {
195
+ if (metadata.currentRun?.captureCompletedAt) {
196
+ metadata.currentRun.completedAt = new Date().toISOString();
197
+ }
198
+ },
190
199
  }).catch((error) => {
191
200
  awsLog(`Warning: Failed to update commit metadata: ${error}`);
192
201
  });
@@ -219,6 +228,10 @@ async function main({
219
228
  }
220
229
  awsLog('CodeYam: Analysis producing, starting orchestration...');
221
230
 
231
+ // Worker pool is no longer needed after data structure prep phase.
232
+ // Freeing it reclaims ~2GB before capture workers ramp up.
233
+ await destroyWorkerPool();
234
+
222
235
  // Create task runner based on orchestration mode
223
236
  let taskRunner;
224
237
 
@@ -229,6 +242,17 @@ async function main({
229
242
  framework: framework,
230
243
  packageManager: packageManager,
231
244
  });
245
+
246
+ const captureCommit =
247
+ sharedContext.commit ?? sharedContext.branchCommit;
248
+ if (captureCommit) {
249
+ await updateCommitMetadata({
250
+ commitId: captureCommit.id,
251
+ runStatusUpdate: {
252
+ captureTaskArns: taskRunner.getTaskArns(),
253
+ },
254
+ });
255
+ }
232
256
  } else if (orchestrateCapture === 'local-sequential') {
233
257
  taskRunner = await SequentialCaptureTaskRunner.create(
234
258
  {
@@ -43,6 +43,108 @@ function normalizeParamsMockData(
43
43
  return result;
44
44
  }
45
45
 
46
+ /**
47
+ * Convert comma-separated string values to arrays when they look like array data.
48
+ * This handles cases where the LLM generates strings like "color,size" instead
49
+ * of arrays like ["color", "size"] due to schema type misdetection.
50
+ */
51
+ function convertCommaSeparatedStringsToArrays(
52
+ mockData: Record<string, unknown>,
53
+ ): Record<string, unknown> {
54
+ const result: Record<string, unknown> = {};
55
+
56
+ for (const [key, value] of Object.entries(mockData)) {
57
+ if (typeof value === 'string') {
58
+ const asArray = parseCommaSeparatedStringAsArray(value, key);
59
+ if (asArray !== null) {
60
+ result[key] = asArray;
61
+ console.log(
62
+ `CodeYam: Converted comma-separated string to array for key "${key}": "${value}" -> [${asArray.map((s) => `"${s}"`).join(', ')}]`,
63
+ );
64
+ } else {
65
+ result[key] = value;
66
+ }
67
+ } else if (
68
+ value !== null &&
69
+ typeof value === 'object' &&
70
+ !Array.isArray(value)
71
+ ) {
72
+ // Recursively process nested objects
73
+ result[key] = convertCommaSeparatedStringsToArrays(
74
+ value as Record<string, unknown>,
75
+ );
76
+ } else if (Array.isArray(value)) {
77
+ // Recursively process arrays (each element could be an object)
78
+ result[key] = value.map((item) => {
79
+ if (item !== null && typeof item === 'object' && !Array.isArray(item)) {
80
+ return convertCommaSeparatedStringsToArrays(
81
+ item as Record<string, unknown>,
82
+ );
83
+ }
84
+ return item;
85
+ });
86
+ } else {
87
+ result[key] = value;
88
+ }
89
+ }
90
+
91
+ return result;
92
+ }
93
+
94
+ /**
95
+ * Detect if a string looks like a comma-separated list that should be an array.
96
+ */
97
+ function parseCommaSeparatedStringAsArray(
98
+ value: string,
99
+ key: string,
100
+ ): string[] | null {
101
+ if (!value.includes(',')) {
102
+ return null;
103
+ }
104
+
105
+ // Heuristic: if the key name suggests it's an array field, convert it
106
+ // Check this FIRST before sentence detection, since "color, size" looks like
107
+ // a sentence but should be converted to ["color", "size"] for _attributes fields
108
+ const arrayFieldPatterns = [
109
+ /_attributes$/i,
110
+ /_ids$/i,
111
+ /_items$/i,
112
+ /_tags$/i,
113
+ /_values$/i,
114
+ /_types$/i,
115
+ /_names$/i,
116
+ /_keys$/i,
117
+ /^attributes$/i,
118
+ /^items$/i,
119
+ /^tags$/i,
120
+ /^values$/i,
121
+ ];
122
+
123
+ const looksLikeArrayField = arrayFieldPatterns.some((pattern) =>
124
+ pattern.test(key),
125
+ );
126
+
127
+ if (looksLikeArrayField) {
128
+ // For array-like fields, only reject if it contains newlines (likely prose)
129
+ if (value.includes('\n')) {
130
+ return null;
131
+ }
132
+ const parts = value.split(',').map((s) => s.trim());
133
+ return parts.filter((s) => s.length > 0);
134
+ }
135
+
136
+ // For non-array-named fields, apply stricter sentence detection
137
+ // Looks like a sentence: "Hello, world"
138
+ if (/,\s+[a-z]/.test(value)) {
139
+ return null;
140
+ }
141
+ if (value.includes('\n')) {
142
+ return null;
143
+ }
144
+
145
+ return null;
146
+ }
147
+
46
148
  /**
47
149
  * Return true when `markup` contains 0 or >1 meaningful
48
150
  * top-level nodes (element *or* non-blank text), so React
@@ -632,13 +734,19 @@ const jsonToCode = (
632
734
  stringValue.startsWith('Promise.') ||
633
735
  stringValue.startsWith('new Promise');
634
736
 
737
+ // Check if the string contains newlines (potential issue for string literals)
738
+ const hasNewlines = stringValue.includes('\n');
739
+
635
740
  // Handle special type indicators that need transformation
636
741
  let outputValue: string;
637
742
  if (stringValue === 'promise' || looksLikePromise) {
638
743
  // The key is a function call (e.g., "revalidate()"), so output a function
639
744
  // that returns a Promise, not the Promise itself
745
+ // Important: Escape newlines inside Promise expressions to avoid
746
+ // "unterminated string literal" errors when the Promise contains
747
+ // multi-line string arguments like Promise.resolve('line1\nline2')
640
748
  const promiseExpr = looksLikePromise
641
- ? stringValue
749
+ ? stringValue.replace(/\n/g, '\\n')
642
750
  : 'Promise.resolve()';
643
751
  outputValue = `() => ${promiseExpr}`;
644
752
  console.log(
@@ -650,7 +758,12 @@ const jsonToCode = (
650
758
  `CodeYam: Nested func transform (string->function): "${key}" -> "${funcName}": () => {}`,
651
759
  );
652
760
  } else if (looksLikeFunction) {
653
- outputValue = stringValue;
761
+ // If the function expression contains newlines inside string literals,
762
+ // we need to escape them to avoid "unterminated string literal" errors
763
+ // This handles cases like: () => Promise.resolve('line1\nline2')
764
+ outputValue = hasNewlines
765
+ ? stringValue.replace(/\n/g, '\\n')
766
+ : stringValue;
654
767
  console.log(
655
768
  `CodeYam: Nested func transform (string): "${key}" -> "${funcName}": ${stringValue.substring(0, 30)}...`,
656
769
  );
@@ -749,11 +862,16 @@ export default async function writeMockDataTsx(
749
862
 
750
863
  // Reconcile mock data keys to match expected keys from dataForMocks
751
864
  // This handles cases where LLM generated literal values instead of variable references
752
- const defaultMockData = reconcileMockDataKeys(
865
+ const reconciledMockData = reconcileMockDataKeys(
753
866
  rawDefaultMockData,
754
867
  expectedKeys,
755
868
  );
756
869
 
870
+ // Convert comma-separated strings to arrays for fields that should be arrays
871
+ // This handles cases where LLM generates "color,size" instead of ["color", "size"]
872
+ const defaultMockData =
873
+ convertCommaSeparatedStringsToArrays(reconciledMockData);
874
+
757
875
  const mockDataComment = `// This file is auto-generated by CodeYam. Do not edit this file manually.
758
876
  // This file contains mock data required for:
759
877
  // Scenario: ${mockScenario.id} - ${mockScenario.name}
@@ -791,11 +909,16 @@ import React from 'react';
791
909
  };
792
910
 
793
911
  // Reconcile scenario-specific mock data keys as well
794
- const scenarioMockData = reconcileMockDataKeys(
912
+ const reconciledScenarioMockData = reconcileMockDataKeys(
795
913
  rawScenarioMockData,
796
914
  expectedKeys,
797
915
  );
798
916
 
917
+ // Convert comma-separated strings to arrays for scenario data
918
+ const scenarioMockData = convertCommaSeparatedStringsToArrays(
919
+ reconciledScenarioMockData,
920
+ );
921
+
799
922
  const mergedArguments = defaultArguments.map((defaultArg, index) => {
800
923
  return deepMerge(defaultArg, scenarioArguments[index]);
801
924
  });
@@ -1205,6 +1205,21 @@ function addMockToContent(
1205
1205
  fileContent = fileContent.replace(importRegExp, '$1$2');
1206
1206
  }
1207
1207
 
1208
+ // Also handle namespace imports (import * as foo from '...')
1209
+ // These need to be renamed to foo__cyOriginal when the mock code spreads from the original.
1210
+ // Note: We match any path (not just escapedImportPath) because the import path may have
1211
+ // been rewritten by transitive import handling before this code runs.
1212
+ if (shouldRenameToOriginal) {
1213
+ const namespaceImportRegExp = new RegExp(
1214
+ `(import\\s+\\*\\s+as\\s+)${escapeRegExp(firstPart)}(\\s+from\\s+['"][^'"]*['"])`,
1215
+ 'm',
1216
+ );
1217
+ fileContent = fileContent.replace(
1218
+ namespaceImportRegExp,
1219
+ `$1${firstPart}__cyOriginal$2`,
1220
+ );
1221
+ }
1222
+
1208
1223
  // Remove empty imports entirely to avoid partial commenting issues with multiline imports
1209
1224
  // This handles both single-line and multiline empty imports
1210
1225
  fileContent = fileContent.replace(
@@ -1698,9 +1713,16 @@ export default async function writeScenarioComponents({
1698
1713
  });
1699
1714
 
1700
1715
  let importedExportIndex = 0;
1716
+ const loopStartTime = Date.now();
1717
+ console.log(
1718
+ `[WriteScenario] Starting import loop for ${entity.name}: ${sortedImportedExports.length} imports`,
1719
+ );
1701
1720
  for (const importedExport of sortedImportedExports) {
1702
1721
  importedExportIndex++;
1703
1722
  if (importedExportIndex % 5 === 0 || importedExportIndex === 1) {
1723
+ console.log(
1724
+ `[WriteScenario] ${entity.name} import ${importedExportIndex}/${sortedImportedExports.length}: ${importedExport.name} elapsed=${Date.now() - loopStartTime}ms`,
1725
+ );
1704
1726
  debugLog(
1705
1727
  `Processing importedExport ${importedExportIndex}/${sortedImportedExports.length}`,
1706
1728
  {
@@ -1888,6 +1910,10 @@ export default async function writeScenarioComponents({
1888
1910
  importedExport.resolvedIsDefault === true &&
1889
1911
  importedExport.isDefault === false;
1890
1912
 
1913
+ console.log(
1914
+ `[WriteScenario] RECURSE START: ${entity.name} -> ${importedExportEntity.name}`,
1915
+ );
1916
+ const recurseStartTime = Date.now();
1891
1917
  debugLog(
1892
1918
  `Recursing into writeScenarioComponents for ${importedExportEntity.name}`,
1893
1919
  {
@@ -1919,7 +1945,10 @@ export default async function writeScenarioComponents({
1919
1945
  ? importedExport.name
1920
1946
  : undefined,
1921
1947
  }),
1922
- 60000, // 1 minute timeout for recursive calls
1948
+ 180000, // 3 minute timeout for recursive calls (complex components need more time)
1949
+ );
1950
+ console.log(
1951
+ `[WriteScenario] RECURSE END: ${entity.name} -> ${importedExportEntity.name} took ${Date.now() - recurseStartTime}ms`,
1923
1952
  );
1924
1953
  debugLog(
1925
1954
  `Completed recursive writeScenarioComponents for ${importedExportEntity.name}`,
@@ -2261,6 +2290,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2261
2290
  }
2262
2291
  }
2263
2292
 
2293
+ // Track post-import-loop timing
2294
+ const postLoopStartTime = Date.now();
2295
+ console.log(`[WriteScenario] POST-LOOP START: ${entity.name}`);
2296
+
2264
2297
  // Collect universal mocks BEFORE processing nodeModuleImports
2265
2298
  // This is needed to check if a node module import is handled by a universal mock
2266
2299
  const universalMocks = project.metadata?.universalMocks ?? [];
@@ -2320,6 +2353,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2320
2353
  );
2321
2354
  }
2322
2355
 
2356
+ console.log(
2357
+ `[WriteScenario] POST-LOOP ${entity.name}: node+universal mocks took ${Date.now() - postLoopStartTime}ms`,
2358
+ );
2359
+
2323
2360
  if (
2324
2361
  rootAnalysis.entitySha === entity.sha &&
2325
2362
  entity.metadata?.notExported &&
@@ -2398,6 +2435,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2398
2435
  );
2399
2436
  debugLog('Completed rewriteRelativeModuleImports');
2400
2437
 
2438
+ console.log(
2439
+ `[WriteScenario] POST-LOOP ${entity.name}: transformations took ${Date.now() - postLoopStartTime}ms`,
2440
+ );
2441
+
2401
2442
  /**
2402
2443
  * Recursively process a file's imports to create transitive copies with server-only stripped.
2403
2444
  * This handles chains of arbitrary depth: A -> B -> C -> D where each needs server-only removed.
@@ -2418,7 +2459,7 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2418
2459
  startTime: number = Date.now(),
2419
2460
  ): Promise<string> {
2420
2461
  // Global timeout for entire transitive processing
2421
- const GLOBAL_TIMEOUT_MS = 60000; // 1 minute max for all transitive processing
2462
+ const GLOBAL_TIMEOUT_MS = 180000; // 3 minutes max for all transitive processing (complex components need more time)
2422
2463
  const elapsed = Date.now() - startTime;
2423
2464
  if (elapsed > GLOBAL_TIMEOUT_MS) {
2424
2465
  throw new Error(
@@ -2427,6 +2468,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2427
2468
  }
2428
2469
 
2429
2470
  const importPaths = extractInternalImportPaths(content);
2471
+ // Always log to help debug timeout issues
2472
+ console.log(
2473
+ `[TransitiveImports] depth=${depth} file=${path.basename(sourceFilePath)} imports=${importPaths.length} visited=${visitedPaths.size} elapsed=${Date.now() - startTime}ms`,
2474
+ );
2430
2475
  debugLog(`processTransitiveImportsRecursively depth=${depth}`, {
2431
2476
  sourceFilePath,
2432
2477
  importCount: importPaths.length,
@@ -2481,8 +2526,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2481
2526
  );
2482
2527
  const extension = importFile.name.split('.').pop();
2483
2528
  const isIndex = isIndexPath(importFile.path);
2484
- const pathHash = safeFileName(importFile.path);
2485
- const transitiveFilePath = `${PROJECT_RELATIVE_PATH}/${basePath}/${pathHash}_${isIndex ? 'index_' : ''}transitive_${safeFileName(scenario.name)}.${extension}`;
2529
+ // Limit pathHash length to prevent ENAMETOOLONG errors on macOS (255 char limit)
2530
+ const pathHash = safeFileName(importFile.path, { maxLength: 80 });
2531
+ const scenarioSlug = safeFileName(scenario.name, { maxLength: 60 });
2532
+ const transitiveFilePath = `${PROJECT_RELATIVE_PATH}/${basePath}/${pathHash}_${isIndex ? 'index_' : ''}transitive_${scenarioSlug}.${extension}`;
2486
2533
 
2487
2534
  // Check if this is a circular import (we're already processing this file)
2488
2535
  const isCircularImport = visitedPaths.has(resolvedPath);
@@ -2606,6 +2653,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2606
2653
  return modifiedContent;
2607
2654
  }
2608
2655
 
2656
+ console.log(
2657
+ `[WriteScenario] POST-LOOP ${entity.name}: before remaining imports ${Date.now() - postLoopStartTime}ms`,
2658
+ );
2659
+
2609
2660
  // Process remaining internal imports that weren't in importedExports
2610
2661
  // This handles transitive dependencies: when the file content includes code (e.g., from
2611
2662
  // other functions in the same file) that imports from files with "server-only"
@@ -2681,8 +2732,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2681
2732
  );
2682
2733
  const targetFileExtension = targetFile.name.split('.').pop();
2683
2734
  const targetFileIsIndex = isIndexPath(targetFile.path);
2684
- const filePathHash = safeFileName(targetFile.path);
2685
- const transformedFilePath = `${PROJECT_RELATIVE_PATH}/${targetFileBasePath}/${filePathHash}_${targetFileIsIndex ? 'index_' : ''}transitive_${safeFileName(scenario.name)}.${targetFileExtension}`;
2735
+ // Limit path hash length to prevent ENAMETOOLONG errors
2736
+ const filePathHash = safeFileName(targetFile.path, { maxLength: 80 });
2737
+ const targetScenarioSlug = safeFileName(scenario.name, { maxLength: 60 });
2738
+ const transformedFilePath = `${PROJECT_RELATIVE_PATH}/${targetFileBasePath}/${filePathHash}_${targetFileIsIndex ? 'index_' : ''}transitive_${targetScenarioSlug}.${targetFileExtension}`;
2686
2739
 
2687
2740
  // Check if we've already processed this file as a transitive copy
2688
2741
  // Note: __data_file_written__ is for entity-specific scenario files with different naming,
@@ -2737,8 +2790,12 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2737
2790
  );
2738
2791
  const nestedExtension = nestedFile.name.split('.').pop();
2739
2792
  const nestedIsIndex = isIndexPath(nestedFile.path);
2740
- const nestedPathHash = safeFileName(nestedFile.path);
2741
- const nestedTransformedPath = `${PROJECT_RELATIVE_PATH}/${nestedBasePath}/${nestedPathHash}_${nestedIsIndex ? 'index_' : ''}transitive_${safeFileName(scenario.name)}.${nestedExtension}`;
2793
+ // Limit path hash length to prevent ENAMETOOLONG errors
2794
+ const nestedPathHash = safeFileName(nestedFile.path, { maxLength: 80 });
2795
+ const nestedScenarioSlug = safeFileName(scenario.name, {
2796
+ maxLength: 60,
2797
+ });
2798
+ const nestedTransformedPath = `${PROJECT_RELATIVE_PATH}/${nestedBasePath}/${nestedPathHash}_${nestedIsIndex ? 'index_' : ''}transitive_${nestedScenarioSlug}.${nestedExtension}`;
2742
2799
 
2743
2800
  // Check if already processed as a transitive file (we can rewrite to point to it)
2744
2801
  // Note: __data_file_written__ is for entity-specific scenario files with different naming,
@@ -2859,6 +2916,10 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2859
2916
  fileContent = fileContent.replace(importRegex, `$1${safeRelativePath}$2`);
2860
2917
  }
2861
2918
 
2919
+ console.log(
2920
+ `[WriteScenario] POST-LOOP ${entity.name}: remaining imports loop took ${Date.now() - postLoopStartTime}ms`,
2921
+ );
2922
+
2862
2923
  const scenarioComponentComment = `// This file is auto-generated by CodeYam. Do not edit this file manually.
2863
2924
  // This file contains content for a scenario component:
2864
2925
  // Analyses being written: ${JSON.stringify(fileAnalyses?.map((a) => ({ id: a.id, entityName: a.entityName })))}
@@ -2870,6 +2931,34 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2870
2931
  // Scenario: ${scenario.id} - ${scenario.name}
2871
2932
  `;
2872
2933
 
2934
+ // Final pass: Rename any namespace imports (import * as X from '...') that have
2935
+ // corresponding mock code using ...X__cyOriginal spread pattern.
2936
+ // This handles cases where:
2937
+ // 1. The import path was rewritten by transitive import handling
2938
+ // 2. The import wasn't caught by the earlier renaming logic
2939
+ // We scan for all __cyOriginal references in the mock code and ensure the imports are renamed.
2940
+ const cyOriginalReferences = fileContent.match(/\.\.\.(\w+)__cyOriginal/g);
2941
+ if (cyOriginalReferences) {
2942
+ const uniqueNames = [
2943
+ ...new Set(
2944
+ cyOriginalReferences.map((ref) =>
2945
+ ref.replace('...', '').replace('__cyOriginal', ''),
2946
+ ),
2947
+ ),
2948
+ ];
2949
+ for (const name of uniqueNames) {
2950
+ // Match namespace imports for this name that haven't been renamed yet
2951
+ const namespaceImportRegex = new RegExp(
2952
+ `(import\\s+\\*\\s+as\\s+)${escapeRegExp(name)}(\\s+from\\s+['"][^'"]*['"])`,
2953
+ 'g',
2954
+ );
2955
+ fileContent = fileContent.replace(
2956
+ namespaceImportRegex,
2957
+ `$1${name}__cyOriginal$2`,
2958
+ );
2959
+ }
2960
+ }
2961
+
2873
2962
  // Use the directive that was extracted at the beginning of processing
2874
2963
  // This ensures it stays at the very top even after imports are prepended
2875
2964
  // NOTE: We only preserve "use client" directives, NOT "use server" directives.
@@ -2891,5 +2980,9 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2891
2980
  debugLog('Successfully wrote scenario file');
2892
2981
  scenarioComponentPaths.push(scenarioComponentPath);
2893
2982
 
2983
+ console.log(
2984
+ `[WriteScenario] POST-LOOP ${entity.name}: COMPLETE total=${Date.now() - postLoopStartTime}ms`,
2985
+ );
2986
+
2894
2987
  return { scenarioComponentPaths, writtenScenarioComponents };
2895
2988
  }