@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
@@ -1,6 +1,7 @@
1
1
  import completionCall from './completionCall';
2
2
  import { saveLlmCall } from '~codeyam/aws/dynamodb';
3
3
  import generateEntityScenariosGenerator from './promptGenerators/generateEntityScenariosGenerator';
4
+ import { getFlowsForScenarioGeneration } from './generateExecutionFlows';
4
5
 
5
6
  import {
6
7
  Analysis,
@@ -13,6 +14,13 @@ import { awsLog } from '~codeyam/utils';
13
14
  import { sanitizePlaywrightInstructions } from './validatePlaywrightInstructions';
14
15
  import { AI, DEFAULT_LARGER_MODEL, parseJsonSafe } from '~codeyam/ai';
15
16
 
17
+ /**
18
+ * Maximum number of execution flows to send to the LLM for scenario generation.
19
+ * When there are more flows than this threshold, we filter to the top N
20
+ * highest priority flows to avoid overwhelming the LLM and wasting tokens.
21
+ */
22
+ const MAX_FLOWS_FOR_SCENARIO_GENERATION = 30;
23
+
16
24
  export interface ScenarioResult {
17
25
  name: string;
18
26
  testName: string;
@@ -75,9 +83,26 @@ export default async function generateEntityScenarios({
75
83
  };
76
84
  }
77
85
 
86
+ // Filter execution flows to top N highest priority when there are many flows
87
+ // This prevents overwhelming the LLM and wasting tokens on low-priority flows
88
+ let filteredFlows = executionFlows;
89
+ if (
90
+ executionFlows &&
91
+ executionFlows.length > MAX_FLOWS_FOR_SCENARIO_GENERATION
92
+ ) {
93
+ filteredFlows = getFlowsForScenarioGeneration(executionFlows, {
94
+ maxFlows: MAX_FLOWS_FOR_SCENARIO_GENERATION,
95
+ ensureGroupDiversity: true,
96
+ }) as ExecutionFlow[];
97
+
98
+ console.log(
99
+ `CodeYam: Filtered ${executionFlows.length} flows to ${filteredFlows.length} for scenario generation`,
100
+ );
101
+ }
102
+
78
103
  const prompt = generateEntityScenariosGenerator({
79
104
  entity,
80
- executionFlows,
105
+ executionFlows: filteredFlows,
81
106
  error,
82
107
  });
83
108
 
@@ -151,11 +176,15 @@ export default async function generateEntityScenarios({
151
176
  return { scenarios: [], llmCall };
152
177
  }
153
178
 
154
- const scenarios = (
155
- result[
156
- `${error ? 'errorD' : 'd'}ataScenarios`
157
- ] as unknown as ScenarioResult[]
158
- ).map(
179
+ const dataScenarios = result[`${error ? 'errorD' : 'd'}ataScenarios`];
180
+
181
+ // Gracefully handle missing dataScenarios (e.g., when LLM returns unexpected format
182
+ // or when test fixtures don't include the expected key)
183
+ if (!Array.isArray(dataScenarios)) {
184
+ return { scenarios: [], llmCall };
185
+ }
186
+
187
+ const scenarios = (dataScenarios as unknown as ScenarioResult[]).map(
159
188
  (scenarioInfo) =>
160
189
  ({
161
190
  projectId: entity.projectId,
@@ -5,6 +5,7 @@
5
5
  * instead of LLM calls. Flows are derived from:
6
6
  * 1. conditionalUsages - variables used in if/ternary/&&/switch
7
7
  * 2. conditionalEffects - setter calls inside conditionals
8
+ * 3. jsxRenderingUsages - arrays rendered via .map() and strings interpolated in JSX
8
9
  *
9
10
  * Only paths that resolve to controllable data sources produce flows,
10
11
  * eliminating the problem of invalid paths like useState variables.
@@ -20,13 +21,16 @@ import { awsLog } from '~codeyam/utils';
20
21
  import { gatherAttributesMap } from './promptGenerators/gatherAttributesMap';
21
22
  import { fillInDirectSchemaGapsAndUnknowns } from './dataStructure/helpers/fillInSchemaGapsAndUnknowns';
22
23
  import { clearAttributesFromMapping } from './dataStructure/helpers/cleanNonObjectFunctions';
23
- import type { CompoundConditional, ConditionalUsage } from '~codeyam/types';
24
+ import type { CompoundConditional } from '~codeyam/types';
24
25
  import { LlmCall } from '~codeyam/types';
25
26
  import generateExecutionFlowsFromConditionalEffects from './generateExecutionFlowsFromConditionalEffects';
26
27
  import generateExecutionFlowsFromConditionals, {
27
28
  ChildComponentConditionalData,
28
29
  } from './generateExecutionFlowsFromConditionals';
30
+ import generateExecutionFlowsFromJsxUsages from './generateExecutionFlowsFromJsxUsages';
31
+ import resolvePathToControllable from './resolvePathToControllable';
29
32
  import { AI } from '~codeyam/ai';
33
+ import type { JsxRenderingUsage, ConditionalUsage } from './astScopes/types';
30
34
 
31
35
  interface GenerateExecutionFlowsArgs {
32
36
  entity: Pick<Entity, 'sha' | 'name' | 'filePath' | 'code' | 'metadata'>;
@@ -55,6 +59,7 @@ export default function generateExecutionFlows({
55
59
  });
56
60
 
57
61
  const isolatedDataStructure = entity.metadata?.isolatedDataStructure;
62
+
58
63
  const equivalentSignatureVariables =
59
64
  isolatedDataStructure?.equivalentSignatureVariables ?? {};
60
65
  const { attributesMap, associationMap } = gatherAttributesMap(
@@ -92,10 +97,11 @@ export default function generateExecutionFlows({
92
97
  });
93
98
 
94
99
  // Build fullToShortPathMap from associationMap
95
- // associationMap maps full paths short paths (e.g., "useFetcher<...>().functionCallReturnValue.state" "state")
96
- // fullToShortPathMap is the same mapping (we just use associationMap directly)
100
+ // When reverse=true (which is what we pass), associationMap maps shortfull
101
+ // (e.g., "state" "useFetcher<...>().functionCallReturnValue.state")
102
+ // We need full→short for path resolution lookups
97
103
  const fullToShortPathMap: Record<string, string> = {};
98
- for (const [fullPath, shortPath] of Object.entries(associationMap)) {
104
+ for (const [shortPath, fullPath] of Object.entries(associationMap)) {
99
105
  fullToShortPathMap[fullPath] = shortPath;
100
106
  }
101
107
 
@@ -106,6 +112,11 @@ export default function generateExecutionFlows({
106
112
  entity.metadata?.isolatedDataStructure?.compoundConditionals ?? [];
107
113
  const conditionalEffects: ConditionalEffect[] =
108
114
  entity.metadata?.isolatedDataStructure?.conditionalEffects ?? [];
115
+ // Get derivedVariables for multi-level derivation tracing
116
+ // This allows tracing through intermediate derived variables that aren't directly
117
+ // used in conditionals (e.g., isInCurrentRun that feeds into isAnalyzing)
118
+ const derivedVariables =
119
+ entity.metadata?.isolatedDataStructure?.derivedVariables;
109
120
 
110
121
  // Build child component data for merging child flows into parent
111
122
  // This requires:
@@ -132,6 +143,7 @@ export default function generateExecutionFlows({
132
143
  childIsolated.equivalentSignatureVariables ?? {},
133
144
  compoundConditionals: childIsolated.compoundConditionals ?? [],
134
145
  gatingConditions,
146
+ jsxRenderingUsages: childIsolated.jsxRenderingUsages ?? [],
135
147
  };
136
148
  }
137
149
  }
@@ -147,6 +159,8 @@ export default function generateExecutionFlows({
147
159
  Object.keys(childComponentData).length > 0
148
160
  ? childComponentData
149
161
  : undefined,
162
+ derivedVariables,
163
+ sourceEquivalencies: mergedDataStructure.sourceEquivalencies,
150
164
  });
151
165
 
152
166
  console.log(
@@ -169,8 +183,22 @@ export default function generateExecutionFlows({
169
183
  `CodeYam: Generated ${effectsBasedFlows.length} flows from conditional effects`,
170
184
  );
171
185
 
186
+ // Generate flows from JSX rendering usages (array.map, text interpolation)
187
+ const jsxRenderingUsages: JsxRenderingUsage[] =
188
+ entity.metadata?.isolatedDataStructure?.jsxRenderingUsages ?? [];
189
+
190
+ const jsxBasedFlows = generateExecutionFlowsFromJsxUsages({
191
+ jsxRenderingUsages,
192
+ attributesMap: resolvedAttributesMap,
193
+ equivalentSignatureVariables,
194
+ fullToShortPathMap,
195
+ structure: isolatedDataStructure?.structure ?? {},
196
+ });
197
+
172
198
  // Merge all flows, deduplicating by ID
173
199
  // Effects-based flows take precedence as they have precise data source paths
200
+ // Conditionals-based flows second
201
+ // JSX-based flows last (lower priority as they're variation flows)
174
202
  const allFlows: ExecutionFlow[] = [];
175
203
  const seenIds = new Set<string>();
176
204
 
@@ -190,12 +218,361 @@ export default function generateExecutionFlows({
190
218
  }
191
219
  }
192
220
 
193
- console.log(
194
- `CodeYam: Total execution flows for ${entity.name}: ${allFlows.length}`,
221
+ // Add JSX-based flows (lowest priority - variation flows)
222
+ for (const flow of jsxBasedFlows) {
223
+ if (!seenIds.has(flow.id)) {
224
+ seenIds.add(flow.id);
225
+ allFlows.push(flow);
226
+ }
227
+ }
228
+
229
+ // Build a map of gating paths → child components they gate
230
+ // This allows us to identify which flows control child component rendering
231
+ const gatingPathToChildren = buildGatingPathToChildrenMap(
232
+ childBoundaryGatingConditions,
233
+ equivalentSignatureVariables,
234
+ resolvedAttributesMap,
235
+ fullToShortPathMap,
195
236
  );
196
237
 
238
+ // Calculate priority and childComponentsControlled for each flow
239
+ for (const flow of allFlows) {
240
+ calculateFlowPriority(flow, gatingPathToChildren);
241
+ }
242
+
243
+ // Sort flows by priority (highest first)
244
+ allFlows.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
245
+
197
246
  return {
198
247
  executionFlows: allFlows,
199
248
  llmCall: null as LlmCall | null, // No LLM calls in static analysis mode
200
249
  };
201
250
  }
251
+
252
+ /**
253
+ * Build a map of gating paths to the child components they gate.
254
+ * This is used to identify which flows control child component rendering.
255
+ */
256
+ function buildGatingPathToChildrenMap(
257
+ childBoundaryGatingConditions: Record<string, ConditionalUsage[]>,
258
+ equivalentSignatureVariables: Record<string, string | string[]>,
259
+ attributesMap: Record<string, string>,
260
+ fullToShortPathMap: Record<string, string>,
261
+ ): Map<string, string[]> {
262
+ const gatingPathToChildren = new Map<string, string[]>();
263
+
264
+ for (const [childName, gatingConditions] of Object.entries(
265
+ childBoundaryGatingConditions,
266
+ )) {
267
+ for (const condition of gatingConditions) {
268
+ // Get the path that gates this child
269
+ let gatingPath = condition.path;
270
+
271
+ // If there's a derivedFrom sourcePath, use that
272
+ if (condition.derivedFrom?.sourcePath) {
273
+ gatingPath = condition.derivedFrom.sourcePath;
274
+ }
275
+
276
+ // Try to resolve to a controllable path
277
+ const resolution = resolvePathToControllable(
278
+ gatingPath,
279
+ attributesMap,
280
+ equivalentSignatureVariables,
281
+ fullToShortPathMap,
282
+ );
283
+
284
+ // Get the equivalent, handling array case (use first element if array)
285
+ const equiv = equivalentSignatureVariables[gatingPath];
286
+ const equivPath = Array.isArray(equiv) ? equiv[0] : equiv;
287
+ const finalPath =
288
+ resolution.isControllable && resolution.resolvedPath
289
+ ? resolution.resolvedPath
290
+ : (equivPath ?? gatingPath);
291
+
292
+ // Add this child to the list of children gated by this path
293
+ const existing = gatingPathToChildren.get(finalPath) ?? [];
294
+ if (!existing.includes(childName)) {
295
+ existing.push(childName);
296
+ gatingPathToChildren.set(finalPath, existing);
297
+ }
298
+
299
+ // Also handle comparison conditions like "activeTab === 'scenarios'"
300
+ const comparisonMatch = gatingPath.match(
301
+ /^([a-zA-Z_][a-zA-Z0-9_]*)\s*(===?|!==?)\s*['"]?([^'"]+)['"]?$/,
302
+ );
303
+ if (comparisonMatch) {
304
+ const [, varName] = comparisonMatch;
305
+ const varResolution = resolvePathToControllable(
306
+ varName,
307
+ attributesMap,
308
+ equivalentSignatureVariables,
309
+ fullToShortPathMap,
310
+ );
311
+ // Get the equivalent, handling array case (use first element if array)
312
+ const varEquiv = equivalentSignatureVariables[varName];
313
+ const varEquivPath = Array.isArray(varEquiv) ? varEquiv[0] : varEquiv;
314
+ const resolvedVarPath =
315
+ varResolution.isControllable && varResolution.resolvedPath
316
+ ? varResolution.resolvedPath
317
+ : (varEquivPath ?? varName);
318
+
319
+ const varExisting = gatingPathToChildren.get(resolvedVarPath) ?? [];
320
+ if (!varExisting.includes(childName)) {
321
+ varExisting.push(childName);
322
+ gatingPathToChildren.set(resolvedVarPath, varExisting);
323
+ }
324
+ }
325
+ }
326
+ }
327
+
328
+ return gatingPathToChildren;
329
+ }
330
+
331
+ /**
332
+ * Calculate priority and childComponentsControlled for a flow.
333
+ *
334
+ * Priority factors (in order of importance):
335
+ * 1. Controls rendering of child components (more components = higher priority)
336
+ * 2. Controls JSX rendering (impact = 'high')
337
+ * 3. Number of conditions required
338
+ */
339
+ function calculateFlowPriority(
340
+ flow: ExecutionFlow,
341
+ gatingPathToChildren: Map<string, string[]>,
342
+ ): void {
343
+ // Find which child components this flow controls
344
+ const childComponentsControlled = new Set<string>();
345
+
346
+ for (const rv of flow.requiredValues) {
347
+ // Check if this required value's path gates any child components
348
+ const children = gatingPathToChildren.get(rv.attributePath);
349
+ if (children) {
350
+ // Only count truthy values as "enabling" the child component
351
+ // Falsy values would hide the child, not enable it
352
+ if (rv.comparison === 'truthy' || rv.comparison === 'equals') {
353
+ for (const child of children) {
354
+ childComponentsControlled.add(child);
355
+ }
356
+ }
357
+ }
358
+
359
+ // Also check without function call markers for broader matching
360
+ const simplifiedPath = rv.attributePath
361
+ .replace(/\(\)/g, '')
362
+ .replace(/\.functionCallReturnValue/g, '');
363
+ const childrenSimplified = gatingPathToChildren.get(simplifiedPath);
364
+ if (childrenSimplified) {
365
+ if (rv.comparison === 'truthy' || rv.comparison === 'equals') {
366
+ for (const child of childrenSimplified) {
367
+ childComponentsControlled.add(child);
368
+ }
369
+ }
370
+ }
371
+ }
372
+
373
+ // Set childComponentsControlled if any were found
374
+ if (childComponentsControlled.size > 0) {
375
+ flow.childComponentsControlled = Array.from(childComponentsControlled);
376
+
377
+ // Upgrade impact to 'high' if this flow controls child components
378
+ // A flow that controls which child components render DOES impact JSX rendering,
379
+ // even if the condition itself isn't directly in the JSX tree.
380
+ // This ensures flows like viewMode === 'screenshot' (which controls SafeScreenshot
381
+ // rendering via ScenarioViewer) get proper prioritization.
382
+ if (flow.impact !== 'high') {
383
+ flow.impact = 'high';
384
+ }
385
+ }
386
+
387
+ // Calculate priority score
388
+ let priority = 0;
389
+
390
+ // Base priority by impact level
391
+ if (flow.impact === 'high') {
392
+ priority += 100;
393
+ } else if (flow.impact === 'medium') {
394
+ priority += 50;
395
+ } else {
396
+ priority += 25;
397
+ }
398
+
399
+ // Add priority for each child component controlled
400
+ // Each child component adds significant priority
401
+ priority += (flow.childComponentsControlled?.length ?? 0) * 75;
402
+
403
+ // Add small bonus for number of required values (more specific = slightly higher priority)
404
+ priority += Math.min(flow.requiredValues.length * 5, 25);
405
+
406
+ flow.priority = priority;
407
+ }
408
+
409
+ /**
410
+ * Get execution flows suitable for LLM scenario generation.
411
+ *
412
+ * Filters and sorts flows based on priority, ensuring diversity
413
+ * across exclusive groups and respecting min/max thresholds.
414
+ */
415
+ export function getFlowsForScenarioGeneration(
416
+ flows: ExecutionFlow[],
417
+ options: {
418
+ /** Maximum number of flows to return (default: 20) */
419
+ maxFlows?: number;
420
+ /** Minimum priority threshold (default: 0) */
421
+ minPriority?: number;
422
+ /** Ensure at least one flow per exclusive group (default: false) */
423
+ ensureGroupDiversity?: boolean;
424
+ /** Return both included and excluded flows (default: false) */
425
+ includeExcludedFlows?: boolean;
426
+ } = {},
427
+ ):
428
+ | ExecutionFlow[]
429
+ | { includedFlows: ExecutionFlow[]; excludedFlows: ExecutionFlow[] } {
430
+ const {
431
+ maxFlows = 20,
432
+ minPriority = 0,
433
+ ensureGroupDiversity = false,
434
+ includeExcludedFlows = false,
435
+ } = options;
436
+
437
+ // Filter by minimum priority
438
+ let eligibleFlows = flows.filter((f) => (f.priority ?? 0) >= minPriority);
439
+
440
+ // Flows should already be sorted by priority, but ensure it
441
+ eligibleFlows = [...eligibleFlows].sort(
442
+ (a, b) => (b.priority ?? 0) - (a.priority ?? 0),
443
+ );
444
+
445
+ let includedFlows: ExecutionFlow[];
446
+
447
+ if (ensureGroupDiversity) {
448
+ // Ensure diversity across exclusive groups
449
+ includedFlows = selectFlowsWithGroupDiversity(eligibleFlows, maxFlows);
450
+ } else {
451
+ // Simple top-N selection
452
+ includedFlows = eligibleFlows.slice(0, maxFlows);
453
+ }
454
+
455
+ if (includeExcludedFlows) {
456
+ const includedIds = new Set(includedFlows.map((f) => f.id));
457
+ const excludedFlows = flows.filter((f) => !includedIds.has(f.id));
458
+ return { includedFlows, excludedFlows };
459
+ }
460
+
461
+ return includedFlows;
462
+ }
463
+
464
+ /**
465
+ * Build a map of attribute-value pairs to help identify related flows.
466
+ * Flows with the same attributePath but different values are considered "value siblings".
467
+ * For example, viewMode='interactive' and viewMode='screenshot' are value siblings.
468
+ */
469
+ function buildValueGroupMap(flows: ExecutionFlow[]): Map<string, string[]> {
470
+ // Map from attributePath to array of (flowId, value) pairs
471
+ const pathToValues = new Map<
472
+ string,
473
+ Array<{ flowId: string; value: string }>
474
+ >();
475
+
476
+ for (const flow of flows) {
477
+ for (const rv of flow.requiredValues) {
478
+ // Only consider equals comparisons with specific values (not truthy/falsy)
479
+ if (
480
+ rv.comparison === 'equals' &&
481
+ rv.value &&
482
+ rv.value !== 'truthy' &&
483
+ rv.value !== 'falsy'
484
+ ) {
485
+ // Normalize the attributePath for comparison
486
+ const normalizedPath = rv.attributePath
487
+ .toLowerCase()
488
+ .replace(/[^a-z0-9]/g, '');
489
+
490
+ if (!pathToValues.has(normalizedPath)) {
491
+ pathToValues.set(normalizedPath, []);
492
+ }
493
+ pathToValues
494
+ .get(normalizedPath)!
495
+ .push({ flowId: flow.id, value: rv.value });
496
+ }
497
+ }
498
+ }
499
+
500
+ // Now create the value group map: flowId -> list of sibling flowIds
501
+ const valueGroupMap = new Map<string, string[]>();
502
+
503
+ for (const [, flowValues] of pathToValues) {
504
+ // Only create groups if there are multiple different values for the same path
505
+ const uniqueValues = new Set(flowValues.map((fv) => fv.value));
506
+ if (uniqueValues.size > 1) {
507
+ // This attribute has multiple values, so all flows are siblings
508
+ const siblingIds = flowValues.map((fv) => fv.flowId);
509
+ for (const fv of flowValues) {
510
+ valueGroupMap.set(
511
+ fv.flowId,
512
+ siblingIds.filter((id) => id !== fv.flowId),
513
+ );
514
+ }
515
+ }
516
+ }
517
+
518
+ return valueGroupMap;
519
+ }
520
+
521
+ /**
522
+ * Select flows ensuring diversity across exclusive groups AND attribute values.
523
+ * Guarantees:
524
+ * 1. At least one flow per exclusive group
525
+ * 2. When a flow with a specific attribute value is selected, include sibling values too
526
+ */
527
+ function selectFlowsWithGroupDiversity(
528
+ flows: ExecutionFlow[],
529
+ maxFlows: number,
530
+ ): ExecutionFlow[] {
531
+ const selected: ExecutionFlow[] = [];
532
+ const selectedIds = new Set<string>();
533
+ const groupsRepresented = new Set<string>();
534
+
535
+ // Build value group map to identify sibling flows
536
+ const valueGroupMap = buildValueGroupMap(flows);
537
+
538
+ // First pass: ensure at least one flow per exclusive group
539
+ for (const flow of flows) {
540
+ if (selectedIds.has(flow.id)) continue;
541
+ if (selected.length >= maxFlows) break;
542
+
543
+ if (flow.exclusiveGroup && !groupsRepresented.has(flow.exclusiveGroup)) {
544
+ selected.push(flow);
545
+ selectedIds.add(flow.id);
546
+ groupsRepresented.add(flow.exclusiveGroup);
547
+ }
548
+ }
549
+
550
+ // Second pass: fill remaining slots with highest priority flows
551
+ // But also include sibling value flows when we select a flow with a specific value
552
+ for (const flow of flows) {
553
+ if (selectedIds.has(flow.id)) continue;
554
+ if (selected.length >= maxFlows) break;
555
+
556
+ selected.push(flow);
557
+ selectedIds.add(flow.id);
558
+
559
+ // Check if this flow has sibling value flows that should also be included
560
+ const siblingIds = valueGroupMap.get(flow.id);
561
+ if (siblingIds && siblingIds.length > 0) {
562
+ // Try to include sibling flows (different values of the same attribute)
563
+ for (const siblingId of siblingIds) {
564
+ if (selectedIds.has(siblingId)) continue;
565
+ if (selected.length >= maxFlows) break;
566
+
567
+ const siblingFlow = flows.find((f) => f.id === siblingId);
568
+ if (siblingFlow) {
569
+ selected.push(siblingFlow);
570
+ selectedIds.add(siblingId);
571
+ }
572
+ }
573
+ }
574
+ }
575
+
576
+ // Re-sort by priority to maintain consistent ordering
577
+ return selected.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
578
+ }
@@ -18,7 +18,7 @@ export interface GenerateExecutionFlowsOptions {
18
18
  /** Map of controllable paths to their types (for path resolution) */
19
19
  attributesMap?: Record<string, string>;
20
20
  /** Map from local variable names to data sources */
21
- equivalentSignatureVariables?: Record<string, string>;
21
+ equivalentSignatureVariables?: Record<string, string | string[]>;
22
22
  /** Map from full paths to short paths */
23
23
  fullToShortPathMap?: Record<string, string>;
24
24
  /**