@codeyam/codeyam-cli 0.1.0-staging.b8a55ba → 0.1.0-staging.b8b17a5

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 (1404) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/common/execAsync.ts +1 -1
  3. package/analyzer-template/log.txt +3 -3
  4. package/analyzer-template/package.json +32 -29
  5. package/analyzer-template/packages/ai/index.ts +21 -5
  6. package/analyzer-template/packages/ai/package.json +4 -4
  7. package/analyzer-template/packages/ai/src/lib/__mocks__/completionCall.ts +122 -0
  8. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +226 -24
  9. package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
  10. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +217 -13
  11. package/analyzer-template/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.ts +644 -0
  12. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +181 -23
  13. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
  14. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.ts +18 -0
  15. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.ts +15 -0
  16. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +181 -1
  17. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +1229 -30
  18. package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
  19. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +265 -6
  20. package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +29 -10
  21. package/analyzer-template/packages/ai/src/lib/completionCall.ts +247 -66
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +2136 -349
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +7 -2
  24. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +296 -35
  25. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +120 -76
  26. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  27. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  28. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +54 -3
  29. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +140 -20
  30. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
  31. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
  32. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +140 -14
  33. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.ts +98 -0
  34. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
  35. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  36. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +393 -90
  37. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
  38. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.ts +35 -0
  39. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +183 -0
  40. package/analyzer-template/packages/ai/src/lib/deepEqual.ts +30 -0
  41. package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
  42. package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
  43. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +74 -7
  44. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +86 -142
  45. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +59 -3
  46. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +1497 -88
  47. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +200 -196
  48. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +677 -0
  49. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +528 -0
  50. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +2484 -0
  51. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
  52. package/analyzer-template/packages/ai/src/lib/guessScenarioDataFromDescription.ts +5 -5
  53. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +328 -7
  54. package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
  55. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +111 -87
  56. package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
  57. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  58. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.ts +1 -1
  59. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +32 -142
  60. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
  61. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
  62. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +110 -6
  63. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +14 -89
  64. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.ts +58 -0
  65. package/analyzer-template/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.ts +11 -11
  66. package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
  67. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +824 -0
  68. package/analyzer-template/packages/ai/src/lib/splitOutsideParentheses.ts +5 -1
  69. package/analyzer-template/packages/ai/src/lib/validateExecutionFlowPaths.ts +531 -0
  70. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +122 -3
  71. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
  72. package/analyzer-template/packages/analyze/index.ts +2 -0
  73. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +79 -59
  74. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +132 -33
  75. package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
  76. package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
  77. package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -0
  78. package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +1 -0
  79. package/analyzer-template/packages/analyze/src/lib/asts/nodes/isAsyncFunction.ts +67 -0
  80. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  81. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  82. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  83. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  84. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  85. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  86. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +466 -270
  87. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +42 -1
  88. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +15 -0
  89. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  90. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -10
  91. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +31 -15
  92. package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +11 -7
  93. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +11 -12
  94. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  95. package/analyzer-template/packages/analyze/src/lib/files/enums/steps.ts +1 -1
  96. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  97. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1352 -0
  98. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +201 -46
  99. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.ts +102 -0
  100. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +593 -84
  101. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.ts +28 -62
  102. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +460 -84
  103. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +166 -0
  104. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +35 -129
  105. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +2 -3
  106. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +990 -141
  107. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
  108. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  109. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  110. package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
  111. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  112. package/analyzer-template/packages/aws/codebuild/index.ts +1 -0
  113. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts +11 -1
  114. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.d.ts.map +1 -1
  115. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js +29 -18
  116. package/analyzer-template/packages/aws/dist/src/lib/codebuild/waitForBuild.js.map +1 -1
  117. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts +2 -2
  118. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.d.ts.map +1 -1
  119. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js +2 -2
  120. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsDefineContainer.js.map +1 -1
  121. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts +8 -18
  122. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.d.ts.map +1 -1
  123. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js +17 -61
  124. package/analyzer-template/packages/aws/dist/src/lib/ecs/ecsTaskFactory.js.map +1 -1
  125. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.d.ts.map +1 -1
  126. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js +8 -1
  127. package/analyzer-template/packages/aws/dist/src/lib/s3/uploadFileToS3.js.map +1 -1
  128. package/analyzer-template/packages/aws/package.json +10 -10
  129. package/analyzer-template/packages/aws/src/lib/codebuild/waitForBuild.ts +43 -19
  130. package/analyzer-template/packages/aws/src/lib/ecs/ecsDefineContainer.ts +3 -3
  131. package/analyzer-template/packages/aws/src/lib/ecs/ecsTaskFactory.ts +17 -69
  132. package/analyzer-template/packages/aws/src/lib/s3/uploadFileToS3.ts +8 -1
  133. package/analyzer-template/packages/database/index.ts +1 -0
  134. package/analyzer-template/packages/database/package.json +4 -4
  135. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  136. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  137. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  138. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  139. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  140. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  141. package/analyzer-template/packages/database/src/lib/kysely/db.ts +22 -1
  142. package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
  143. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +17 -1
  144. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +164 -0
  145. package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
  146. package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
  147. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
  148. package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
  149. package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
  150. package/analyzer-template/packages/database/src/lib/loadCommits.ts +58 -19
  151. package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -9
  152. package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
  153. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +5 -6
  154. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  155. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  156. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  157. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +96 -152
  158. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
  159. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
  160. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  161. package/analyzer-template/packages/generate/index.ts +3 -0
  162. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +17 -1
  163. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +221 -0
  164. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.ts +73 -0
  165. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
  166. package/analyzer-template/packages/generate/src/lib/scenarioComponentForServer.ts +114 -0
  167. package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
  168. package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
  169. package/analyzer-template/packages/github/dist/database/index.js +1 -0
  170. package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
  171. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  172. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  173. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  174. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  175. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  176. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  177. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  178. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  179. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  180. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  181. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  182. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  183. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +4 -0
  184. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  185. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +16 -1
  186. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  187. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts +1 -18
  188. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/analysesTable.d.ts.map +1 -1
  189. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
  190. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
  191. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
  192. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  193. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +17 -1
  194. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -1
  195. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  196. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +29 -0
  197. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
  198. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
  199. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  200. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts +1 -0
  201. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/entitiesTable.d.ts.map +1 -1
  202. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
  203. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
  204. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  205. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  206. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +7 -6
  207. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  208. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
  209. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
  210. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
  211. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
  212. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  213. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
  214. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  215. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
  216. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
  217. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
  218. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
  219. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
  220. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
  221. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  222. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +45 -14
  223. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  224. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
  225. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  226. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -10
  227. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  228. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
  229. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
  230. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
  231. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  232. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +5 -5
  233. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  234. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  235. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  236. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  237. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  238. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  239. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  240. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
  241. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  242. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +76 -89
  243. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  244. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
  245. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  246. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  247. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
  248. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  249. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  250. package/analyzer-template/packages/github/dist/generate/index.d.ts +3 -0
  251. package/analyzer-template/packages/github/dist/generate/index.d.ts.map +1 -1
  252. package/analyzer-template/packages/github/dist/generate/index.js +3 -0
  253. package/analyzer-template/packages/github/dist/generate/index.js.map +1 -1
  254. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
  255. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
  256. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  257. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts +9 -0
  258. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -0
  259. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +217 -0
  260. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
  261. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts +20 -0
  262. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.d.ts.map +1 -0
  263. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
  264. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
  265. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  266. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  267. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  268. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts +8 -0
  269. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.d.ts.map +1 -0
  270. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js +89 -0
  271. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponentForServer.js.map +1 -0
  272. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.d.ts.map +1 -1
  273. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js +10 -0
  274. package/analyzer-template/packages/github/dist/github/src/lib/loadOrCreateCommit.js.map +1 -1
  275. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.d.ts.map +1 -1
  276. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js +3 -0
  277. package/analyzer-template/packages/github/dist/github/src/lib/syncPrimaryBranch.js.map +1 -1
  278. package/analyzer-template/packages/github/dist/types/index.d.ts +3 -4
  279. package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
  280. package/analyzer-template/packages/github/dist/types/index.js +0 -1
  281. package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
  282. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  283. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  284. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
  285. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
  286. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +71 -27
  287. package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
  288. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
  289. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
  290. package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts +2 -0
  291. package/analyzer-template/packages/github/dist/types/src/types/Entity.d.ts.map +1 -1
  292. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +8 -0
  293. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  294. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +19 -54
  295. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  296. package/analyzer-template/packages/github/dist/types/src/types/Scenario.js +1 -21
  297. package/analyzer-template/packages/github/dist/types/src/types/Scenario.js.map +1 -1
  298. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +153 -5
  299. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  300. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  301. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  302. package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.d.ts +2 -0
  303. package/analyzer-template/packages/github/dist/types/src/types/StatementInfo.d.ts.map +1 -1
  304. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
  305. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  306. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
  307. package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
  308. package/analyzer-template/packages/github/package.json +2 -2
  309. package/analyzer-template/packages/github/src/lib/loadOrCreateCommit.ts +14 -0
  310. package/analyzer-template/packages/github/src/lib/syncPrimaryBranch.ts +2 -0
  311. package/analyzer-template/packages/process/index.ts +2 -0
  312. package/analyzer-template/packages/process/package.json +12 -0
  313. package/analyzer-template/packages/process/tsconfig.json +8 -0
  314. package/analyzer-template/packages/types/index.ts +3 -6
  315. package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
  316. package/analyzer-template/packages/types/src/types/Analysis.ts +87 -27
  317. package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
  318. package/analyzer-template/packages/types/src/types/Entity.ts +2 -0
  319. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +8 -0
  320. package/analyzer-template/packages/types/src/types/Scenario.ts +19 -77
  321. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +181 -5
  322. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  323. package/analyzer-template/packages/types/src/types/StatementInfo.ts +2 -0
  324. package/analyzer-template/packages/ui-components/package.json +1 -1
  325. package/analyzer-template/packages/utils/dist/types/index.d.ts +3 -4
  326. package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
  327. package/analyzer-template/packages/utils/dist/types/index.js +0 -1
  328. package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
  329. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  330. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  331. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
  332. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
  333. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +71 -27
  334. package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
  335. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
  336. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
  337. package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts +2 -0
  338. package/analyzer-template/packages/utils/dist/types/src/types/Entity.d.ts.map +1 -1
  339. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +8 -0
  340. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  341. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +19 -54
  342. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  343. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.js +1 -21
  344. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.js.map +1 -1
  345. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +153 -5
  346. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  347. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  348. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  349. package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts +2 -0
  350. package/analyzer-template/packages/utils/dist/types/src/types/StatementInfo.d.ts.map +1 -1
  351. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  352. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +98 -3
  353. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  354. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
  355. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
  356. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
  357. package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
  358. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +121 -3
  359. package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
  360. package/analyzer-template/playwright/capture.ts +57 -26
  361. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  362. package/analyzer-template/playwright/captureStatic.ts +1 -1
  363. package/analyzer-template/playwright/getCodeYamInfo.ts +12 -7
  364. package/analyzer-template/playwright/waitForServer.ts +21 -6
  365. package/analyzer-template/project/analyzeBaselineCommit.ts +9 -0
  366. package/analyzer-template/project/analyzeBranchCommit.ts +4 -0
  367. package/analyzer-template/project/analyzeFileEntities.ts +4 -0
  368. package/analyzer-template/project/analyzeRegularCommit.ts +9 -0
  369. package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
  370. package/analyzer-template/project/constructMockCode.ts +1341 -198
  371. package/analyzer-template/project/controller/startController.ts +16 -1
  372. package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
  373. package/analyzer-template/project/executeLibraryFunctionDirect.ts +7 -3
  374. package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
  375. package/analyzer-template/project/mocks/analyzeFileMock.ts +8 -7
  376. package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
  377. package/analyzer-template/project/orchestrateCapture/KyselyAnalysisLoader.ts +3 -6
  378. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
  379. package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
  380. package/analyzer-template/project/orchestrateCapture.ts +85 -10
  381. package/analyzer-template/project/reconcileMockDataKeys.ts +231 -84
  382. package/analyzer-template/project/runAnalysis.ts +11 -0
  383. package/analyzer-template/project/serverOnlyModules.ts +127 -2
  384. package/analyzer-template/project/start.ts +54 -15
  385. package/analyzer-template/project/startScenarioCapture.ts +15 -0
  386. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  387. package/analyzer-template/project/writeMockDataTsx.ts +362 -32
  388. package/analyzer-template/project/writeScenarioClientWrapper.ts +21 -0
  389. package/analyzer-template/project/writeScenarioComponents.ts +466 -133
  390. package/analyzer-template/project/writeScenarioFiles.ts +26 -0
  391. package/analyzer-template/project/writeSimpleRoot.ts +28 -42
  392. package/analyzer-template/scripts/comboWorkerLoop.cjs +99 -50
  393. package/analyzer-template/scripts/defaultCmd.sh +9 -0
  394. package/analyzer-template/tsconfig.json +14 -1
  395. package/background/src/lib/local/createLocalAnalyzer.js +2 -30
  396. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  397. package/background/src/lib/local/execAsync.js +1 -1
  398. package/background/src/lib/local/execAsync.js.map +1 -1
  399. package/background/src/lib/virtualized/common/execAsync.js +1 -1
  400. package/background/src/lib/virtualized/common/execAsync.js.map +1 -1
  401. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +7 -1
  402. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  403. package/background/src/lib/virtualized/project/analyzeBranchCommit.js +2 -1
  404. package/background/src/lib/virtualized/project/analyzeBranchCommit.js.map +1 -1
  405. package/background/src/lib/virtualized/project/analyzeFileEntities.js +2 -1
  406. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  407. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +7 -1
  408. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  409. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
  410. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
  411. package/background/src/lib/virtualized/project/constructMockCode.js +1179 -147
  412. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  413. package/background/src/lib/virtualized/project/controller/startController.js +11 -1
  414. package/background/src/lib/virtualized/project/controller/startController.js.map +1 -1
  415. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
  416. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
  417. package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.js +6 -3
  418. package/background/src/lib/virtualized/project/executeLibraryFunctionDirect.js.map +1 -1
  419. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
  420. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  421. package/background/src/lib/virtualized/project/mocks/analyzeFileMock.js +7 -7
  422. package/background/src/lib/virtualized/project/mocks/analyzeFileMock.js.map +1 -1
  423. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
  424. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
  425. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js +3 -2
  426. package/background/src/lib/virtualized/project/orchestrateCapture/KyselyAnalysisLoader.js.map +1 -1
  427. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
  428. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  429. package/background/src/lib/virtualized/project/orchestrateCapture.js +69 -11
  430. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  431. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +198 -51
  432. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  433. package/background/src/lib/virtualized/project/runAnalysis.js +9 -0
  434. package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
  435. package/background/src/lib/virtualized/project/serverOnlyModules.js +106 -3
  436. package/background/src/lib/virtualized/project/serverOnlyModules.js.map +1 -1
  437. package/background/src/lib/virtualized/project/start.js +49 -15
  438. package/background/src/lib/virtualized/project/start.js.map +1 -1
  439. package/background/src/lib/virtualized/project/startScenarioCapture.js +12 -0
  440. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  441. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  442. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  443. package/background/src/lib/virtualized/project/writeMockDataTsx.js +313 -27
  444. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  445. package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js +15 -0
  446. package/background/src/lib/virtualized/project/writeScenarioClientWrapper.js.map +1 -0
  447. package/background/src/lib/virtualized/project/writeScenarioComponents.js +359 -110
  448. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  449. package/background/src/lib/virtualized/project/writeScenarioFiles.js +19 -0
  450. package/background/src/lib/virtualized/project/writeScenarioFiles.js.map +1 -1
  451. package/background/src/lib/virtualized/project/writeSimpleRoot.js +28 -41
  452. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  453. package/codeyam-cli/scripts/apply-setup.js +386 -9
  454. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  455. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
  456. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
  457. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
  458. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
  459. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
  460. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
  461. package/codeyam-cli/src/cli.js +47 -23
  462. package/codeyam-cli/src/cli.js.map +1 -1
  463. package/codeyam-cli/src/codeyam-cli.js +18 -2
  464. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  465. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js +51 -0
  466. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js.map +1 -0
  467. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +56 -0
  468. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
  469. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +101 -47
  470. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
  471. package/codeyam-cli/src/commands/analyze.js +22 -10
  472. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  473. package/codeyam-cli/src/commands/baseline.js +176 -0
  474. package/codeyam-cli/src/commands/baseline.js.map +1 -0
  475. package/codeyam-cli/src/commands/debug.js +37 -23
  476. package/codeyam-cli/src/commands/debug.js.map +1 -1
  477. package/codeyam-cli/src/commands/default.js +43 -35
  478. package/codeyam-cli/src/commands/default.js.map +1 -1
  479. package/codeyam-cli/src/commands/editor.js +4534 -0
  480. package/codeyam-cli/src/commands/editor.js.map +1 -0
  481. package/codeyam-cli/src/commands/editorIsolateArgs.js +25 -0
  482. package/codeyam-cli/src/commands/editorIsolateArgs.js.map +1 -0
  483. package/codeyam-cli/src/commands/init.js +147 -292
  484. package/codeyam-cli/src/commands/init.js.map +1 -1
  485. package/codeyam-cli/src/commands/memory.js +278 -0
  486. package/codeyam-cli/src/commands/memory.js.map +1 -0
  487. package/codeyam-cli/src/commands/recapture.js +31 -18
  488. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  489. package/codeyam-cli/src/commands/report.js +46 -1
  490. package/codeyam-cli/src/commands/report.js.map +1 -1
  491. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  492. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  493. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  494. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  495. package/codeyam-cli/src/commands/start.js +8 -12
  496. package/codeyam-cli/src/commands/start.js.map +1 -1
  497. package/codeyam-cli/src/commands/status.js +23 -1
  498. package/codeyam-cli/src/commands/status.js.map +1 -1
  499. package/codeyam-cli/src/commands/telemetry.js +37 -0
  500. package/codeyam-cli/src/commands/telemetry.js.map +1 -0
  501. package/codeyam-cli/src/commands/test-startup.js +3 -1
  502. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  503. package/codeyam-cli/src/commands/verify.js +14 -2
  504. package/codeyam-cli/src/commands/verify.js.map +1 -1
  505. package/codeyam-cli/src/commands/wipe.js +108 -0
  506. package/codeyam-cli/src/commands/wipe.js.map +1 -0
  507. package/codeyam-cli/src/data/techStacks.js +77 -0
  508. package/codeyam-cli/src/data/techStacks.js.map +1 -0
  509. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
  510. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
  511. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
  512. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
  513. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
  514. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
  515. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +137 -0
  516. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  517. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +1980 -0
  518. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  519. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
  520. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
  521. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
  522. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
  523. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js +100 -0
  524. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js.map +1 -0
  525. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +304 -0
  526. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  527. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +194 -0
  528. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
  529. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +315 -0
  530. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
  531. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
  532. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
  533. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +542 -0
  534. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  535. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +594 -0
  536. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
  537. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +435 -0
  538. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
  539. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  540. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  541. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +217 -0
  542. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  543. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +353 -0
  544. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  545. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +153 -0
  546. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
  547. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
  548. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
  549. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +221 -0
  550. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
  551. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +1520 -0
  552. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  553. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +280 -0
  554. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
  555. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js +143 -0
  556. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js.map +1 -0
  557. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
  558. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
  559. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
  560. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
  561. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +1857 -0
  562. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
  563. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  564. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  565. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +107 -0
  566. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
  567. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +185 -0
  568. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -0
  569. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
  570. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
  571. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  572. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  573. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  574. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  575. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
  576. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
  577. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +227 -0
  578. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
  579. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  580. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  581. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +493 -0
  582. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
  583. package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js +81 -0
  584. package/codeyam-cli/src/utils/__tests__/serverVersionStaleness.test.js.map +1 -0
  585. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +175 -82
  586. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  587. package/codeyam-cli/src/utils/__tests__/telemetry.test.js +159 -0
  588. package/codeyam-cli/src/utils/__tests__/telemetry.test.js.map +1 -0
  589. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
  590. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
  591. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
  592. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
  593. package/codeyam-cli/src/utils/analysisRunner.js +32 -16
  594. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  595. package/codeyam-cli/src/utils/analyzer.js +16 -0
  596. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  597. package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
  598. package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
  599. package/codeyam-cli/src/utils/backgroundServer.js +202 -29
  600. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  601. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  602. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  603. package/codeyam-cli/src/utils/database.js +128 -7
  604. package/codeyam-cli/src/utils/database.js.map +1 -1
  605. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  606. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  607. package/codeyam-cli/src/utils/devServerState.js +71 -0
  608. package/codeyam-cli/src/utils/devServerState.js.map +1 -0
  609. package/codeyam-cli/src/utils/editorApi.js +79 -0
  610. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  611. package/codeyam-cli/src/utils/editorAudit.js +388 -0
  612. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  613. package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
  614. package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
  615. package/codeyam-cli/src/utils/editorCapture.js +102 -0
  616. package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
  617. package/codeyam-cli/src/utils/editorDeleteScenario.js +67 -0
  618. package/codeyam-cli/src/utils/editorDeleteScenario.js.map +1 -0
  619. package/codeyam-cli/src/utils/editorDevServer.js +197 -0
  620. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  621. package/codeyam-cli/src/utils/editorEntityChangeStatus.js +50 -0
  622. package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
  623. package/codeyam-cli/src/utils/editorEntityHelpers.js +144 -0
  624. package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
  625. package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
  626. package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
  627. package/codeyam-cli/src/utils/editorJournal.js +225 -0
  628. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  629. package/codeyam-cli/src/utils/editorLoaderHelpers.js +152 -0
  630. package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
  631. package/codeyam-cli/src/utils/editorMigration.js +224 -0
  632. package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
  633. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  634. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  635. package/codeyam-cli/src/utils/editorPreloadHelpers.js +135 -0
  636. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  637. package/codeyam-cli/src/utils/editorPreview.js +137 -0
  638. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  639. package/codeyam-cli/src/utils/editorScenarioSwitch.js +112 -0
  640. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
  641. package/codeyam-cli/src/utils/editorScenarios.js +553 -0
  642. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  643. package/codeyam-cli/src/utils/editorSeedAdapter.js +422 -0
  644. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
  645. package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
  646. package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
  647. package/codeyam-cli/src/utils/entityChangeStatus.js +366 -0
  648. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
  649. package/codeyam-cli/src/utils/entityChangeStatus.server.js +196 -0
  650. package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
  651. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  652. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  653. package/codeyam-cli/src/utils/fileWatcher.js +63 -9
  654. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  655. package/codeyam-cli/src/utils/generateReport.js +4 -3
  656. package/codeyam-cli/src/utils/generateReport.js.map +1 -1
  657. package/codeyam-cli/src/utils/git.js +182 -0
  658. package/codeyam-cli/src/utils/git.js.map +1 -0
  659. package/codeyam-cli/src/utils/install-skills.js +129 -39
  660. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  661. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  662. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  663. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  664. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  665. package/codeyam-cli/src/utils/npmVersionCheck.js +76 -0
  666. package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -0
  667. package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
  668. package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
  669. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  670. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  671. package/codeyam-cli/src/utils/progress.js +8 -1
  672. package/codeyam-cli/src/utils/progress.js.map +1 -1
  673. package/codeyam-cli/src/utils/project.js +15 -5
  674. package/codeyam-cli/src/utils/project.js.map +1 -1
  675. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  676. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  677. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  678. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  679. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  680. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  681. package/codeyam-cli/src/utils/queue/job.js +179 -1
  682. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  683. package/codeyam-cli/src/utils/queue/manager.js +7 -0
  684. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  685. package/codeyam-cli/src/utils/queue/persistence.js.map +1 -1
  686. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  687. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  688. package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
  689. package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
  690. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  691. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  692. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +229 -0
  693. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  694. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  695. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  696. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  697. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  698. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  699. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  700. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  701. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  702. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +74 -0
  703. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  704. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +376 -0
  705. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  706. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +113 -0
  707. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  708. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  709. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  710. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  711. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  712. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  713. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  714. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  715. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  716. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  717. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  718. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  719. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  720. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  721. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  722. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
  723. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
  724. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
  725. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
  726. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
  727. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
  728. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  729. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  730. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
  731. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
  732. package/codeyam-cli/src/utils/rules/index.js +7 -0
  733. package/codeyam-cli/src/utils/rules/index.js.map +1 -0
  734. package/codeyam-cli/src/utils/rules/parser.js +93 -0
  735. package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
  736. package/codeyam-cli/src/utils/rules/pathMatcher.js +49 -0
  737. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
  738. package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
  739. package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
  740. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  741. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  742. package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
  743. package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
  744. package/codeyam-cli/src/utils/rules/staleness.js +137 -0
  745. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
  746. package/codeyam-cli/src/utils/scenarioCoverage.js +74 -0
  747. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
  748. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  749. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  750. package/codeyam-cli/src/utils/scenariosManifest.js +249 -0
  751. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  752. package/codeyam-cli/src/utils/serverState.js +94 -12
  753. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  754. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +96 -45
  755. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  756. package/codeyam-cli/src/utils/simulationGateMiddleware.js +166 -0
  757. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
  758. package/codeyam-cli/src/utils/slugUtils.js +25 -0
  759. package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
  760. package/codeyam-cli/src/utils/syncMocksMiddleware.js +7 -26
  761. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  762. package/codeyam-cli/src/utils/telemetry.js +106 -0
  763. package/codeyam-cli/src/utils/telemetry.js.map +1 -0
  764. package/codeyam-cli/src/utils/telemetryMiddleware.js +22 -0
  765. package/codeyam-cli/src/utils/telemetryMiddleware.js.map +1 -0
  766. package/codeyam-cli/src/utils/testRunner.js +158 -0
  767. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  768. package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
  769. package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
  770. package/codeyam-cli/src/utils/versionInfo.js +67 -15
  771. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  772. package/codeyam-cli/src/utils/webappDetection.js +35 -2
  773. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  774. package/codeyam-cli/src/utils/wipe.js +128 -0
  775. package/codeyam-cli/src/utils/wipe.js.map +1 -0
  776. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +35 -0
  777. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -0
  778. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +40 -0
  779. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
  780. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js +66 -0
  781. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js.map +1 -0
  782. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +628 -0
  783. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  784. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +146 -0
  785. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
  786. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +65 -0
  787. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
  788. package/codeyam-cli/src/webserver/app/lib/database.js +129 -50
  789. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  790. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  791. package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
  792. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  793. package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
  794. package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
  795. package/codeyam-cli/src/webserver/backgroundServer.js +182 -18
  796. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  797. package/codeyam-cli/src/webserver/bootstrap.js +51 -0
  798. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  799. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CzTDWkF2.js +1 -0
  800. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-BFbq6iFk.js +11 -0
  801. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
  802. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-B6OMi58N.js +41 -0
  803. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-DuYodzo1.js +1 -0
  804. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-CXo9EeCl.js +25 -0
  805. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DYCNb2It.js +3 -0
  806. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-D1CdlbrV.js → LoadingDots-By5zI316.js} +1 -1
  807. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-wDPcZNKx.js → LogViewer-CZgY3sxX.js} +3 -3
  808. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-CnYYwRDw.js +11 -0
  809. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-CDoF7ZpU.js +1 -0
  810. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-DrnfvaLL.js +10 -0
  811. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Df3UCi8k.js +34 -0
  812. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
  813. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-DRKR9T0U.js +1 -0
  814. package/codeyam-cli/src/webserver/build/client/assets/_index-ClR-g3tY.js +11 -0
  815. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-DTH6ydEA.js +27 -0
  816. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  817. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  818. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-74hnHF59.js +1 -0
  819. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  820. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-B8CYhCO9.js +22 -0
  821. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  822. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  823. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  824. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  825. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  826. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  827. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  828. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  829. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  830. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  831. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  832. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  833. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  834. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  835. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  836. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  837. package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
  838. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
  839. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
  840. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  841. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  842. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
  843. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
  844. package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
  845. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  846. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  847. package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
  848. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  849. package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
  850. package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
  851. package/codeyam-cli/src/webserver/build/client/assets/api.rule-path-l0sNRNKZ.js +1 -0
  852. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  853. package/codeyam-cli/src/webserver/build/client/assets/book-open-CLaoh4ac.js +6 -0
  854. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BYimnrHg.js → chevron-down-BZ2DZxbW.js} +2 -2
  855. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-BBXArFPl.js +43 -0
  856. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-CaVsIRxt.js → circle-check-CT4unAk-.js} +2 -2
  857. package/codeyam-cli/src/webserver/build/client/assets/copy-zK0B6Nu-.js +11 -0
  858. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-DJB0YQJL.js +41 -0
  859. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-C1gnJVOL.svg → cy-logo-cli-CCKUIm0S.svg} +2 -2
  860. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +1 -0
  861. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-CkXFP_i-.js +1 -0
  862. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-DPw7NZHc.js +1 -0
  863. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DYqG1D_d.js +58 -0
  864. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-DggyRwOr.js +41 -0
  865. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-zUEpfPsu.js → entity._sha._-BqAN7hyG.js} +13 -13
  866. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D1eikpe1.js +6 -0
  867. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-Dg1NhIms.js +6 -0
  868. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-CJX6kkkV.js +6 -0
  869. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CfLCUi9S.js → entity._sha_.edit._scenarioId-BhVjZhKg.js} +2 -2
  870. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-DKJyZfAY.js → entry.client-_gzKltPN.js} +6 -6
  871. package/codeyam-cli/src/webserver/build/client/assets/executionFlowCoverage-BWhdfn70.js +1 -0
  872. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
  873. package/codeyam-cli/src/webserver/build/client/assets/files-CV_17tZS.js +1 -0
  874. package/codeyam-cli/src/webserver/build/client/assets/git-D-YXmMbR.js +1 -0
  875. package/codeyam-cli/src/webserver/build/client/assets/globals-DRvOjyO3.css +1 -0
  876. package/codeyam-cli/src/webserver/build/client/assets/index-Blo6EK8G.js +15 -0
  877. package/codeyam-cli/src/webserver/build/client/assets/{index-CzNNiTkw.js → index-BsX0F-9C.js} +1 -1
  878. package/codeyam-cli/src/webserver/build/client/assets/{index-BosqDOlH.js → index-CCrgCshv.js} +1 -1
  879. package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
  880. package/codeyam-cli/src/webserver/build/client/assets/labs-Byazq8Pv.js +1 -0
  881. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-CNp9QFCX.js → loader-circle-DVQ0oHR7.js} +2 -2
  882. package/codeyam-cli/src/webserver/build/client/assets/manifest-f4212c17.js +1 -0
  883. package/codeyam-cli/src/webserver/build/client/assets/memory-b-VmA2Vj.js +101 -0
  884. package/codeyam-cli/src/webserver/build/client/assets/pause-DGcndCAa.js +11 -0
  885. package/codeyam-cli/src/webserver/build/client/assets/root-F-k2uYj5.js +67 -0
  886. package/codeyam-cli/src/webserver/build/client/assets/{search-DDGjYAMJ.js → search-C0Uw0bcK.js} +2 -2
  887. package/codeyam-cli/src/webserver/build/client/assets/settings-OoNgHIfW.js +1 -0
  888. package/codeyam-cli/src/webserver/build/client/assets/simulations-Bcemfu8a.js +1 -0
  889. package/codeyam-cli/src/webserver/build/client/assets/terminal-BgMmG7R9.js +11 -0
  890. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-CBc5dE1s.js → triangle-alert-Cs87hJYK.js} +2 -2
  891. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BR3Rs7JY.js +1 -0
  892. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-BxxP_XF9.js +2 -0
  893. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-BermyNU5.js +1 -0
  894. package/codeyam-cli/src/webserver/build/client/assets/useToast-a_QN_W9_.js +1 -0
  895. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  896. package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
  897. package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-if8kM_1Q.js +13 -0
  898. package/codeyam-cli/src/webserver/build/server/assets/index-CHymws6l.js +1 -0
  899. package/codeyam-cli/src/webserver/build/server/assets/init-D3HkMDbI.js +10 -0
  900. package/codeyam-cli/src/webserver/build/server/assets/progress-CHTtrxFG.js +1 -0
  901. package/codeyam-cli/src/webserver/build/server/assets/server-build-DTCzJQiH.js +551 -0
  902. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  903. package/codeyam-cli/src/webserver/build-info.json +5 -5
  904. package/codeyam-cli/src/webserver/devServer.js +39 -5
  905. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  906. package/codeyam-cli/src/webserver/editorProxy.js +976 -0
  907. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  908. package/codeyam-cli/src/webserver/idleDetector.js +73 -0
  909. package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
  910. package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
  911. package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
  912. package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
  913. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
  914. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +230 -0
  915. package/codeyam-cli/src/webserver/server.js +376 -26
  916. package/codeyam-cli/src/webserver/server.js.map +1 -1
  917. package/codeyam-cli/src/webserver/terminalServer.js +831 -0
  918. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  919. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  920. package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
  921. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  922. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  923. package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
  924. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  925. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  926. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  927. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  928. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  929. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  930. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  931. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  932. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
  933. package/codeyam-cli/templates/codeyam-editor-claude.md +147 -0
  934. package/codeyam-cli/templates/codeyam-memory-hook.sh +199 -0
  935. package/codeyam-cli/templates/commands/codeyam-diagnose.md +481 -0
  936. package/codeyam-cli/templates/editor-step-hook.py +321 -0
  937. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
  938. package/codeyam-cli/templates/expo-react-native/README.md +41 -0
  939. package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
  940. package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
  941. package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
  942. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
  943. package/codeyam-cli/templates/expo-react-native/app.json +18 -0
  944. package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
  945. package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
  946. package/codeyam-cli/templates/expo-react-native/global.css +3 -0
  947. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  948. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  949. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  950. package/codeyam-cli/templates/expo-react-native/package.json +38 -0
  951. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  952. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  953. package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
  954. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  955. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  956. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  957. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  958. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  959. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  960. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  961. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  962. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
  963. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  964. package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
  965. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  966. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  967. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  968. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  969. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +24 -0
  970. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  971. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  972. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  973. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +64 -0
  974. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  975. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +39 -0
  976. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  977. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  978. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +40 -0
  979. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  980. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +127 -0
  981. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  982. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  983. package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
  984. package/codeyam-cli/templates/nextjs-prisma-supabase/SUPABASE_SETUP.md +104 -0
  985. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  986. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  987. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  988. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  989. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  990. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  991. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  992. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  993. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  994. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  995. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
  996. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  997. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  998. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  999. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  1000. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  1001. package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
  1002. package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
  1003. package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
  1004. package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
  1005. package/codeyam-cli/templates/rule-notification-hook.py +83 -0
  1006. package/codeyam-cli/templates/rule-reflection-hook.py +647 -0
  1007. package/codeyam-cli/templates/rules-instructions.md +78 -0
  1008. package/codeyam-cli/templates/seed-adapters/supabase.ts +282 -0
  1009. package/codeyam-cli/templates/{codeyam-debug-skill.md → skills/codeyam-debug/SKILL.md} +48 -4
  1010. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +237 -0
  1011. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +211 -0
  1012. package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +611 -0
  1013. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  1014. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  1015. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  1016. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  1017. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  1018. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  1019. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  1020. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  1021. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  1022. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  1023. package/codeyam-cli/templates/skills/codeyam-new-rule/SKILL.md +11 -0
  1024. package/codeyam-cli/templates/{codeyam-setup-skill.md → skills/codeyam-setup/SKILL.md} +151 -4
  1025. package/codeyam-cli/templates/{codeyam-sim-skill.md → skills/codeyam-sim/SKILL.md} +1 -1
  1026. package/codeyam-cli/templates/{codeyam-test-skill.md → skills/codeyam-test/SKILL.md} +1 -1
  1027. package/codeyam-cli/templates/{codeyam-verify-skill.md → skills/codeyam-verify/SKILL.md} +1 -1
  1028. package/package.json +35 -24
  1029. package/packages/ai/index.js +8 -6
  1030. package/packages/ai/index.js.map +1 -1
  1031. package/packages/ai/src/lib/analyzeScope.js +179 -13
  1032. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  1033. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
  1034. package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
  1035. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +160 -13
  1036. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  1037. package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js +435 -0
  1038. package/packages/ai/src/lib/astScopes/conditionalEffectsExtractor.js.map +1 -0
  1039. package/packages/ai/src/lib/astScopes/methodSemantics.js +138 -23
  1040. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  1041. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  1042. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  1043. package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js +8 -0
  1044. package/packages/ai/src/lib/astScopes/patterns/ifStatementHandler.js.map +1 -1
  1045. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js +7 -0
  1046. package/packages/ai/src/lib/astScopes/patterns/switchStatementHandler.js.map +1 -1
  1047. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +138 -1
  1048. package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
  1049. package/packages/ai/src/lib/astScopes/processExpression.js +944 -30
  1050. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  1051. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  1052. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  1053. package/packages/ai/src/lib/checkAllAttributes.js +24 -9
  1054. package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
  1055. package/packages/ai/src/lib/completionCall.js +188 -38
  1056. package/packages/ai/src/lib/completionCall.js.map +1 -1
  1057. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1693 -206
  1058. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  1059. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +7 -2
  1060. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  1061. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +230 -23
  1062. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
  1063. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +77 -55
  1064. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  1065. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  1066. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  1067. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  1068. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  1069. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +52 -3
  1070. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  1071. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +122 -14
  1072. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  1073. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  1074. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  1075. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  1076. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  1077. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
  1078. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  1079. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js +86 -0
  1080. package/packages/ai/src/lib/dataStructure/helpers/convertNullToUndefinedBySchema.js.map +1 -0
  1081. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  1082. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  1083. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  1084. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  1085. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +333 -81
  1086. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  1087. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
  1088. package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
  1089. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  1090. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  1091. package/packages/ai/src/lib/dataStructureChunking.js +130 -0
  1092. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
  1093. package/packages/ai/src/lib/deepEqual.js +32 -0
  1094. package/packages/ai/src/lib/deepEqual.js.map +1 -0
  1095. package/packages/ai/src/lib/e2eDataTracking.js +241 -0
  1096. package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
  1097. package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
  1098. package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
  1099. package/packages/ai/src/lib/generateChangesEntityScenarioData.js +62 -5
  1100. package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
  1101. package/packages/ai/src/lib/generateChangesEntityScenarios.js +78 -120
  1102. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  1103. package/packages/ai/src/lib/generateEntityDataStructure.js +47 -2
  1104. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  1105. package/packages/ai/src/lib/generateEntityScenarioData.js +1185 -83
  1106. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  1107. package/packages/ai/src/lib/generateEntityScenarios.js +177 -163
  1108. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  1109. package/packages/ai/src/lib/generateExecutionFlows.js +484 -0
  1110. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -0
  1111. package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js +380 -0
  1112. package/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.js.map +1 -0
  1113. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +1807 -0
  1114. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -0
  1115. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
  1116. package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
  1117. package/packages/ai/src/lib/guessScenarioDataFromDescription.js +2 -2
  1118. package/packages/ai/src/lib/guessScenarioDataFromDescription.js.map +1 -1
  1119. package/packages/ai/src/lib/isolateScopes.js +270 -7
  1120. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  1121. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  1122. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  1123. package/packages/ai/src/lib/mergeStatements.js +88 -46
  1124. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  1125. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  1126. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  1127. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  1128. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  1129. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +1 -1
  1130. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
  1131. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +21 -100
  1132. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  1133. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
  1134. package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
  1135. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +83 -6
  1136. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  1137. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +10 -70
  1138. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
  1139. package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js +45 -0
  1140. package/packages/ai/src/lib/promptGenerators/generateMissingKeysPrompt.js.map +1 -0
  1141. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js +9 -9
  1142. package/packages/ai/src/lib/promptGenerators/guessNewScenarioDataFromDescriptionGenerator.js.map +1 -1
  1143. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
  1144. package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
  1145. package/packages/ai/src/lib/resolvePathToControllable.js +677 -0
  1146. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -0
  1147. package/packages/ai/src/lib/splitOutsideParentheses.js +3 -1
  1148. package/packages/ai/src/lib/splitOutsideParentheses.js.map +1 -1
  1149. package/packages/ai/src/lib/worker/SerializableDataStructure.js +29 -0
  1150. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  1151. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
  1152. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  1153. package/packages/analyze/index.js +1 -0
  1154. package/packages/analyze/index.js.map +1 -1
  1155. package/packages/analyze/src/lib/FileAnalyzer.js +75 -36
  1156. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  1157. package/packages/analyze/src/lib/ProjectAnalyzer.js +109 -30
  1158. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  1159. package/packages/analyze/src/lib/analysisContext.js +30 -5
  1160. package/packages/analyze/src/lib/analysisContext.js.map +1 -1
  1161. package/packages/analyze/src/lib/asts/index.js +4 -2
  1162. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  1163. package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
  1164. package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
  1165. package/packages/analyze/src/lib/asts/nodes/index.js +1 -0
  1166. package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
  1167. package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js +52 -0
  1168. package/packages/analyze/src/lib/asts/nodes/isAsyncFunction.js.map +1 -0
  1169. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  1170. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  1171. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  1172. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  1173. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  1174. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  1175. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  1176. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  1177. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  1178. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  1179. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  1180. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  1181. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +211 -54
  1182. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  1183. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +31 -1
  1184. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  1185. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +11 -0
  1186. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  1187. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  1188. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  1189. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -10
  1190. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  1191. package/packages/analyze/src/lib/files/analyzeChange.js +21 -11
  1192. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  1193. package/packages/analyze/src/lib/files/analyzeEntity.js +9 -8
  1194. package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
  1195. package/packages/analyze/src/lib/files/analyzeInitial.js +9 -10
  1196. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  1197. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  1198. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  1199. package/packages/analyze/src/lib/files/enums/steps.js +1 -1
  1200. package/packages/analyze/src/lib/files/enums/steps.js.map +1 -1
  1201. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  1202. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  1203. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +907 -0
  1204. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  1205. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +170 -40
  1206. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  1207. package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js +85 -0
  1208. package/packages/analyze/src/lib/files/scenarios/enrichUnknownTypesFromSourceEquivalencies.js.map +1 -0
  1209. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +480 -71
  1210. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  1211. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js +29 -34
  1212. package/packages/analyze/src/lib/files/scenarios/generateChangesScenarios.js.map +1 -1
  1213. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +333 -66
  1214. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  1215. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +104 -0
  1216. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -0
  1217. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +27 -98
  1218. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
  1219. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +2 -3
  1220. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
  1221. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +817 -120
  1222. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  1223. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
  1224. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
  1225. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  1226. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  1227. package/packages/analyze/src/lib/index.js +1 -0
  1228. package/packages/analyze/src/lib/index.js.map +1 -1
  1229. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  1230. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  1231. package/packages/aws/src/lib/ecs/ecsDefineContainer.js +2 -2
  1232. package/packages/aws/src/lib/ecs/ecsDefineContainer.js.map +1 -1
  1233. package/packages/aws/src/lib/ecs/ecsTaskFactory.js +17 -61
  1234. package/packages/aws/src/lib/ecs/ecsTaskFactory.js.map +1 -1
  1235. package/packages/database/index.js +1 -0
  1236. package/packages/database/index.js.map +1 -1
  1237. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  1238. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  1239. package/packages/database/src/lib/analysisToDb.js +1 -1
  1240. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  1241. package/packages/database/src/lib/branchToDb.js +1 -1
  1242. package/packages/database/src/lib/branchToDb.js.map +1 -1
  1243. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  1244. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  1245. package/packages/database/src/lib/commitToDb.js +1 -1
  1246. package/packages/database/src/lib/commitToDb.js.map +1 -1
  1247. package/packages/database/src/lib/fileToDb.js +1 -1
  1248. package/packages/database/src/lib/fileToDb.js.map +1 -1
  1249. package/packages/database/src/lib/kysely/db.js +16 -1
  1250. package/packages/database/src/lib/kysely/db.js.map +1 -1
  1251. package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
  1252. package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  1253. package/packages/database/src/lib/kysely/tables/debugReportsTable.js.map +1 -1
  1254. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
  1255. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  1256. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  1257. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  1258. package/packages/database/src/lib/loadAnalyses.js +45 -2
  1259. package/packages/database/src/lib/loadAnalyses.js.map +1 -1
  1260. package/packages/database/src/lib/loadAnalysis.js +8 -0
  1261. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  1262. package/packages/database/src/lib/loadBranch.js +11 -1
  1263. package/packages/database/src/lib/loadBranch.js.map +1 -1
  1264. package/packages/database/src/lib/loadCommit.js +7 -0
  1265. package/packages/database/src/lib/loadCommit.js.map +1 -1
  1266. package/packages/database/src/lib/loadCommits.js +45 -14
  1267. package/packages/database/src/lib/loadCommits.js.map +1 -1
  1268. package/packages/database/src/lib/loadEntities.js +23 -10
  1269. package/packages/database/src/lib/loadEntities.js.map +1 -1
  1270. package/packages/database/src/lib/loadEntityBranches.js +9 -0
  1271. package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
  1272. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +5 -5
  1273. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  1274. package/packages/database/src/lib/projectToDb.js +1 -1
  1275. package/packages/database/src/lib/projectToDb.js.map +1 -1
  1276. package/packages/database/src/lib/saveFiles.js +1 -1
  1277. package/packages/database/src/lib/saveFiles.js.map +1 -1
  1278. package/packages/database/src/lib/scenarioToDb.js +1 -1
  1279. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  1280. package/packages/database/src/lib/updateCommitMetadata.js +76 -89
  1281. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  1282. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  1283. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  1284. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  1285. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  1286. package/packages/generate/index.js +3 -0
  1287. package/packages/generate/index.js.map +1 -1
  1288. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +16 -1
  1289. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  1290. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +217 -0
  1291. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -0
  1292. package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js +53 -0
  1293. package/packages/generate/src/lib/componentScenarioPage/generateScenarioServerComponent.js.map +1 -0
  1294. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  1295. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  1296. package/packages/generate/src/lib/scenarioComponentForServer.js +89 -0
  1297. package/packages/generate/src/lib/scenarioComponentForServer.js.map +1 -0
  1298. package/packages/github/src/lib/loadOrCreateCommit.js +10 -0
  1299. package/packages/github/src/lib/loadOrCreateCommit.js.map +1 -1
  1300. package/packages/github/src/lib/syncPrimaryBranch.js +3 -0
  1301. package/packages/github/src/lib/syncPrimaryBranch.js.map +1 -1
  1302. package/packages/process/index.js +3 -0
  1303. package/packages/process/index.js.map +1 -0
  1304. package/packages/process/src/GlobalProcessManager.js.map +1 -0
  1305. package/{background/src/lib/process → packages/process/src}/ProcessManager.js +1 -1
  1306. package/packages/process/src/ProcessManager.js.map +1 -0
  1307. package/packages/process/src/index.js.map +1 -0
  1308. package/packages/process/src/managedExecAsync.js.map +1 -0
  1309. package/packages/types/index.js +0 -1
  1310. package/packages/types/index.js.map +1 -1
  1311. package/packages/types/src/enums/ProjectFramework.js +2 -0
  1312. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  1313. package/packages/types/src/types/Scenario.js +1 -21
  1314. package/packages/types/src/types/Scenario.js.map +1 -1
  1315. package/packages/utils/src/lib/fs/rsyncCopy.js +98 -3
  1316. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  1317. package/packages/utils/src/lib/safeFileName.js +29 -3
  1318. package/packages/utils/src/lib/safeFileName.js.map +1 -1
  1319. package/scripts/npm-post-install.cjs +34 -0
  1320. package/analyzer-template/packages/ai/src/lib/findMatchingAttribute.ts +0 -102
  1321. package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +0 -409
  1322. package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +0 -288
  1323. package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +0 -495
  1324. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.ts +0 -67
  1325. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +0 -120
  1326. package/analyzer-template/process/INTEGRATION_COMPLETE.md +0 -333
  1327. package/analyzer-template/process/INTEGRATION_EXAMPLE.md +0 -525
  1328. package/analyzer-template/process/README.md +0 -507
  1329. package/background/src/lib/process/GlobalProcessManager.js.map +0 -1
  1330. package/background/src/lib/process/ProcessManager.js.map +0 -1
  1331. package/background/src/lib/process/index.js.map +0 -1
  1332. package/background/src/lib/process/managedExecAsync.js.map +0 -1
  1333. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +0 -238
  1334. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +0 -1
  1335. package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js +0 -7
  1336. package/codeyam-cli/scripts/fixtures/formbricks/universal-mocks/apps/web/lib/instance/service.js.map +0 -1
  1337. package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -118
  1338. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
  1339. package/codeyam-cli/src/commands/list.js +0 -31
  1340. package/codeyam-cli/src/commands/list.js.map +0 -1
  1341. package/codeyam-cli/src/commands/webapp-info.js +0 -146
  1342. package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
  1343. package/codeyam-cli/src/utils/universal-mocks.js +0 -152
  1344. package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
  1345. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-wXL1Z2Aq.js +0 -1
  1346. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CzGX-miz.js +0 -1
  1347. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-CXFKsCOD.js +0 -41
  1348. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-D-9pXIaY.js +0 -25
  1349. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CBQPrpT0.js +0 -3
  1350. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-4lcOlid-.js +0 -11
  1351. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BfmDgXxG.js +0 -1
  1352. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-CUxUNEEC.js +0 -15
  1353. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-6J7zDUD5.js +0 -1
  1354. package/codeyam-cli/src/webserver/build/client/assets/_index-DHImXdXq.js +0 -11
  1355. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-2mG6mjVb.js +0 -32
  1356. package/codeyam-cli/src/webserver/build/client/assets/chunk-JMJ3UQ3L-BambyYE_.js +0 -51
  1357. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CgUsG7ib.js +0 -21
  1358. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-CKnwPCDr.js +0 -1
  1359. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DW_hdGUc.js +0 -1
  1360. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DyB90fWk.js +0 -1
  1361. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D_3ero5o.js +0 -1
  1362. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DAtOlaWE.js +0 -1
  1363. package/codeyam-cli/src/webserver/build/client/assets/files-ClR0d32A.js +0 -1
  1364. package/codeyam-cli/src/webserver/build/client/assets/git-D62Lxxmv.js +0 -15
  1365. package/codeyam-cli/src/webserver/build/client/assets/globals-C6vQASxy.css +0 -1
  1366. package/codeyam-cli/src/webserver/build/client/assets/keyAttributeCoverage-CTlFMihX.js +0 -1
  1367. package/codeyam-cli/src/webserver/build/client/assets/manifest-09d684be.js +0 -1
  1368. package/codeyam-cli/src/webserver/build/client/assets/root-BxJUvKau.js +0 -56
  1369. package/codeyam-cli/src/webserver/build/client/assets/settings-DgTyB-Wg.js +0 -1
  1370. package/codeyam-cli/src/webserver/build/client/assets/simulations-CoNWGt0K.js +0 -1
  1371. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BMIGFP-m.js +0 -1
  1372. package/codeyam-cli/src/webserver/build/client/assets/useInteractiveMode-Dk_FQqWJ.js +0 -1
  1373. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-BqPPNjAl.js +0 -2
  1374. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DsJbgMY9.js +0 -1
  1375. package/codeyam-cli/src/webserver/build/client/assets/useToast-DWHcCcl1.js +0 -1
  1376. package/codeyam-cli/src/webserver/build/server/assets/index-CV6i1S1A.js +0 -1
  1377. package/codeyam-cli/src/webserver/build/server/assets/server-build-BDlyhfrv.js +0 -175
  1378. package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
  1379. package/codeyam-cli/templates/debug-codeyam.md +0 -620
  1380. package/packages/ai/src/lib/findMatchingAttribute.js +0 -77
  1381. package/packages/ai/src/lib/findMatchingAttribute.js.map +0 -1
  1382. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +0 -298
  1383. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +0 -1
  1384. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +0 -226
  1385. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +0 -1
  1386. package/packages/ai/src/lib/generateEntityKeyAttributes.js +0 -408
  1387. package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +0 -1
  1388. package/packages/ai/src/lib/isFrontend.js +0 -5
  1389. package/packages/ai/src/lib/isFrontend.js.map +0 -1
  1390. package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js +0 -40
  1391. package/packages/ai/src/lib/promptGenerators/generateEntityKeyAttributesGenerator.js.map +0 -1
  1392. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +0 -77
  1393. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +0 -1
  1394. package/scripts/finalize-analyzer.cjs +0 -81
  1395. /package/analyzer-template/{process → packages/process/src}/GlobalProcessManager.ts +0 -0
  1396. /package/analyzer-template/{process → packages/process/src}/ProcessManager.ts +0 -0
  1397. /package/analyzer-template/{process → packages/process/src}/index.ts +0 -0
  1398. /package/analyzer-template/{process → packages/process/src}/managedExecAsync.ts +0 -0
  1399. /package/codeyam-cli/src/webserver/build/client/assets/{api.link-scenario-value-l0sNRNKZ.js → api.agent-transcripts-l0sNRNKZ.js} +0 -0
  1400. /package/codeyam-cli/src/webserver/build/client/assets/{api.update-key-attributes-l0sNRNKZ.js → api.dev-mode-events-l0sNRNKZ.js} +0 -0
  1401. /package/codeyam-cli/src/webserver/build/client/assets/{api.update-valid-values-l0sNRNKZ.js → api.editor-audit-l0sNRNKZ.js} +0 -0
  1402. /package/{background/src/lib/process → packages/process/src}/GlobalProcessManager.js +0 -0
  1403. /package/{background/src/lib/process → packages/process/src}/index.js +0 -0
  1404. /package/{background/src/lib/process → packages/process/src}/managedExecAsync.js +0 -0
@@ -1,12 +1,93 @@
1
1
  import { joinParenthesesAndArrays, splitOutsideParenthesesAndArrays, functionArguments, cleanOutBoundary, fillInDirectSchemaGapsAndUnknowns, removeDuplicateFunctionCalls, } from "../../../../../packages/ai/index.js";
2
2
  /**
3
- * Converts a variable qualifier to a safe identifier for use in function/const names.
4
- * Handles indexed format like "data[1]" -> "data_1"
3
+ * Converts a call signature to a valid JavaScript identifier (function name).
4
+ * The original signature is preserved for data access - this only creates the function name.
5
+ *
6
+ * Examples:
7
+ * - "useAuth()" → "useAuth"
8
+ * - "db.select(usersQuery)" → "db_select_usersQuery"
9
+ * - "db.select(postsQuery)" → "db_select_postsQuery"
10
+ * - "useFetcher<User>()" → "useFetcher_User"
11
+ * - "useFetcher<{ data: UserData | null }>()" → "useFetcher_data_UserData_null"
12
+ * - "eq('user_id', value)" → "eq_user_id_value"
13
+ * - "from('workouts')" → "from_workouts"
5
14
  */
6
- function safeVariableQualifier(qualifier) {
7
- // Replace brackets with underscores for valid JS identifier
8
- // "data[1]" -> "data_1"
9
- return qualifier.replace(/\[(\d+)\]/g, '_$1');
15
+ function callSignatureToFunctionName(signature) {
16
+ // Extract components from the signature
17
+ const components = [];
18
+ // 1. Extract function path (parts separated by dots outside parens/brackets)
19
+ const pathMatch = signature.match(/^([^<(]+)/);
20
+ if (pathMatch) {
21
+ const path = pathMatch[1];
22
+ // Split on dots but preserve the parts
23
+ components.push(...path.split('.').filter(Boolean));
24
+ }
25
+ // 2. Extract generic type parameters (content between < and >)
26
+ const genericMatch = signature.match(/<([^>]+)>/);
27
+ if (genericMatch) {
28
+ const genericContent = genericMatch[1];
29
+ // Extract meaningful identifiers from generic type
30
+ // Handle complex types like "{ data: UserData | null }"
31
+ const typeIdentifiers = genericContent
32
+ .replace(/[{}:;,]/g, ' ') // Remove structural chars
33
+ .replace(/\|/g, ' ') // Handle union types
34
+ .split(/\s+/)
35
+ .filter(Boolean)
36
+ .filter((s) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(s)) // Only valid identifiers
37
+ .filter((s) => ![
38
+ 'null',
39
+ 'undefined',
40
+ 'void',
41
+ 'never',
42
+ 'any',
43
+ 'unknown',
44
+ 'data',
45
+ 'typeof',
46
+ ].includes(s)); // Skip common non-meaningful keywords
47
+ if (typeIdentifiers.length > 0) {
48
+ components.push(...typeIdentifiers.slice(0, 2)); // Limit to first 2 for reasonable length
49
+ }
50
+ }
51
+ // 3. Extract function arguments (first 2 for disambiguation)
52
+ const argsMatch = signature.match(/\(([^)]*)\)/);
53
+ if (argsMatch && argsMatch[1]) {
54
+ const argsContent = argsMatch[1].trim();
55
+ if (argsContent) {
56
+ const args = argsContent.split(',').map((arg) => arg.trim());
57
+ for (const arg of args.slice(0, 2)) {
58
+ // For quoted strings, extract the content
59
+ const stringMatch = arg.match(/^['"`](.+)['"`]$/);
60
+ if (stringMatch) {
61
+ // Split on dots for string paths like 'users.id'
62
+ const parts = stringMatch[1].split('.').filter(Boolean);
63
+ components.push(...parts);
64
+ }
65
+ else if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(arg)) {
66
+ // Valid identifier - use as-is
67
+ components.push(arg);
68
+ }
69
+ else if (/^\d+$/.test(arg)) {
70
+ // Number - use as-is
71
+ components.push(arg);
72
+ }
73
+ // Skip complex expressions
74
+ }
75
+ }
76
+ }
77
+ // Build the function name from components
78
+ const functionName = components
79
+ .join('_')
80
+ .replace(/[^a-zA-Z0-9_]/g, '_') // Sanitize special chars
81
+ .replace(/_+/g, '_') // Collapse multiple underscores
82
+ .replace(/^_|_$/g, ''); // Trim underscores
83
+ return functionName || 'mock';
84
+ }
85
+ /**
86
+ * Check if a mock name is a call signature (e.g., "useFetcher<User>()", "db.select(query)")
87
+ */
88
+ function isCallSignature(mockName) {
89
+ // Call signatures contain parentheses (function calls)
90
+ return mockName.includes('(');
10
91
  }
11
92
  /**
12
93
  * Extract property names that are jsx-components and should be preserved from original.
@@ -134,51 +215,54 @@ function funcArgs(functionSignature) {
134
215
  }
135
216
  // isValidKey ensures that the key does not contain any characters that would make it invalid in a JavaScript object.
136
217
  // For example, it should not contain spaces, special characters, or start with a number.
218
+ // Also rejects keys that are pure function calls like "()" or "(args)" - these aren't property names.
137
219
  function isValidKey(key) {
138
220
  if (!key || key.length === 0)
139
221
  return false;
140
222
  const keyWithOutArguments = key.split('(')[0];
223
+ // Reject empty keys (happens when key is "()" or "(args)") - these are function calls, not property names
224
+ if (!keyWithOutArguments || keyWithOutArguments.length === 0)
225
+ return false;
141
226
  return !/\s/.test(keyWithOutArguments);
142
227
  }
143
- export default function constructMockCode(mockName, dependencySchemas, entityType, canonicalKey, options) {
144
- // Check for variable-qualified mock name (e.g., "entityDiffFetcher <- useFetcher")
145
- // Format: "variableName <- functionName" which reads naturally as "variableName receives from functionName"
146
- // Also handles indexed format: "data[1] <- useFetch" for disambiguating reused variable names
147
- const variableQualifierMatch = mockName.match(/^([a-zA-Z_][a-zA-Z0-9_]*(?:\[\d+\])?)\s*<-\s*/);
148
- let variableQualifier = variableQualifierMatch
149
- ? variableQualifierMatch[1]
228
+ /**
229
+ * Known hooks that return tuples [value, setter] instead of arrays.
230
+ * These should NOT use the .map() pattern even when the schema has generic array access ([]).
231
+ * Instead, they should return [data, () => {}] where data is from scenarios().
232
+ */
233
+ const TUPLE_RETURNING_HOOKS = new Set([
234
+ 'useAtom', // Jotai
235
+ 'useState', // React
236
+ 'useReducer', // React
237
+ 'useRecoilState', // Recoil
238
+ 'useImmerAtom', // Jotai with Immer
239
+ ]);
240
+ export default function constructMockCode(mockName, dependencySchemas, entityType, _canonicalKey, // DEPRECATED: No longer used, kept for API compatibility
241
+ options) {
242
+ // Check if mockName is a call signature (e.g., "useFetcher<User>()", "db.select(query)")
243
+ const mockNameIsCallSignature = isCallSignature(mockName);
244
+ // For call signatures, use the original signature for data access but generate
245
+ // a valid JS function name from it
246
+ const derivedFunctionName = mockNameIsCallSignature
247
+ ? callSignatureToFunctionName(mockName)
150
248
  : null;
151
- const baseMockName = variableQualifier
152
- ? mockName.slice(variableQualifierMatch[0].length)
153
- : mockName;
249
+ // The baseMockName is the function name without type params and args
250
+ // e.g., "useFetcher<User>()" -> "useFetcher", "db.select(query)" -> "db"
251
+ const baseMockName = mockName.split(/[<(]/)[0];
252
+ // The data key is the mockName (call signature) for data access
253
+ let dataKey;
154
254
  const mockNameParts = splitOutsideParenthesesAndArrays(baseMockName);
155
255
  let relevantReturnValueSchema;
156
256
  let dataStructurePath;
157
257
  let dataStructureValue;
158
258
  let foundEntityWithSignature = false;
159
259
  let signatureSchema;
160
- for (const filePath in dependencySchemas) {
260
+ let baseSchemaHasMethodCalls = false;
261
+ entitySearch: for (const filePath in dependencySchemas) {
161
262
  for (const entityName in dependencySchemas[filePath]) {
162
- // For variable-qualified mocks, look for the full qualified name first
163
- // Format: "variableName <- functionName" (e.g., "entityDiffFetcher <- useFetcher")
164
- const targetEntityName = variableQualifier
165
- ? `${variableQualifier} <- ${baseMockName}`
166
- : mockNameParts[0];
167
- // Check for direct match
168
- let matches = entityName === targetEntityName || entityName === mockNameParts[0];
169
- // If no direct match and no qualifier was provided, check if the entity
170
- // is stored under a variable-qualified key (e.g., "stateBadge <- getStateBadge")
171
- // This handles the case where gatherDataForMocks stored the entity with a variable
172
- // qualifier but writeScenarioComponents called constructMockCode without one.
173
- if (!matches && !variableQualifier) {
174
- const qualifiedKeyMatch = entityName.match(new RegExp(`^([a-zA-Z_][a-zA-Z0-9_]*)\\s*<-\\s*${mockNameParts[0]}$`));
175
- if (qualifiedKeyMatch) {
176
- matches = true;
177
- // Extract the variable qualifier from the entity name so we can use
178
- // it for the data lookup key later
179
- variableQualifier = qualifiedKeyMatch[1];
180
- }
181
- }
263
+ // Match entity by base name (without generics/args)
264
+ const entityBaseName = entityName.split(/[<(]/)[0];
265
+ const matches = entityBaseName === baseMockName || entityName === mockNameParts[0];
182
266
  if (!matches)
183
267
  continue;
184
268
  // Track if we found the entity and it has a signature (is a function)
@@ -198,18 +282,87 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
198
282
  pathParts[mockNameParts.length - 1].startsWith(mockNameParts[mockNameParts.length - 1]));
199
283
  });
200
284
  if (dataStructurePath) {
285
+ // Start with the base entity's return value schema
286
+ const baseReturnValueSchema = dependencySchemas[filePath][entityName]?.returnValueSchema;
287
+ const mergedSchema = {
288
+ ...baseReturnValueSchema,
289
+ };
290
+ // Check if the base schema has method-call entries (e.g., .map().functionCallReturnValue)
291
+ // When it does, the scenario data is stored as an object with method keys, and
292
+ // array prototype methods need mock implementations. When it doesn't, the data
293
+ // is a raw array and native methods like .includes() work directly.
294
+ if (baseReturnValueSchema) {
295
+ baseSchemaHasMethodCalls = Object.keys(baseReturnValueSchema).some((k) => k.startsWith(baseMockName + '.') &&
296
+ k.includes('(') &&
297
+ k.includes('.functionCallReturnValue'));
298
+ }
299
+ // Merge in method-call dependencies that are separate entries.
300
+ // e.g., "activityTypes.find((a) => a.value === type)" is a separate dependency
301
+ // for a .find() call on activityTypes. We need to include these with a
302
+ // .functionCallReturnValue path so constructMockCode generates callable mock methods.
303
+ for (const otherEntityName in dependencySchemas[filePath]) {
304
+ if (otherEntityName === entityName)
305
+ continue;
306
+ if (otherEntityName.startsWith(baseMockName + '.') &&
307
+ otherEntityName.includes('(')) {
308
+ // Add a functionCallReturnValue entry for this method call.
309
+ // This ensures constructMockCode treats it as a function that returns data,
310
+ // generating a proper mock method with data lookup.
311
+ const fcrvPath = `${otherEntityName}.functionCallReturnValue`;
312
+ if (!mergedSchema[fcrvPath]) {
313
+ // Infer the return type from the method-call dependency's schema
314
+ const otherSchema = dependencySchemas[filePath][otherEntityName]?.returnValueSchema;
315
+ // Look for element type (baseMockName[]) or fall back to 'unknown'
316
+ const elementType = otherSchema?.[`${baseMockName}[]`];
317
+ mergedSchema[fcrvPath] = elementType || 'unknown';
318
+ }
319
+ }
320
+ }
201
321
  relevantReturnValueSchema = fillInDirectSchemaGapsAndUnknowns({
202
- schema: dependencySchemas[filePath][entityName]?.returnValueSchema,
322
+ schema: mergedSchema,
203
323
  });
204
324
  // NOTE: clearAttributesFromMapping is disabled because it deletes
205
325
  // method calls on arrays (like .eq() after functionCallReturnValue: 'array')
206
326
  // However, we still need to remove duplicate function calls that create invalid syntax
207
327
  removeDuplicateFunctionCalls(relevantReturnValueSchema);
208
328
  dataStructureValue = relevantReturnValueSchema?.[dataStructurePath];
209
- break;
329
+ break entitySearch;
210
330
  }
211
331
  }
212
332
  }
333
+ // Check if the entity is used as a function (called with ()) vs an object/namespace.
334
+ // Look for paths in the schema that start with "baseMockName(" or "baseMockName<" indicating function calls.
335
+ // The "<" handles generic type parameters like useLoaderData<T>().
336
+ // Also check dataStructurePath === 'returnValue' which indicates a function return value.
337
+ const entityIsFunction = foundEntityWithSignature ||
338
+ dataStructurePath === 'returnValue' ||
339
+ Object.keys(relevantReturnValueSchema ?? {}).some((key) => key.startsWith(`${baseMockName}(`) ||
340
+ key.startsWith(`${baseMockName}<`));
341
+ // Calculate the data key - use the call signature (mockName) for data access
342
+ // For simple names without parentheses:
343
+ // - Append () ONLY if the entity is a function/hook (detected above)
344
+ // - Don't append () for object/namespace mocks like "supabase"
345
+ if (mockNameIsCallSignature || mockName.includes('(')) {
346
+ dataKey = mockName;
347
+ }
348
+ else if (entityIsFunction) {
349
+ // Entity is a function/hook - append () to match call signature format
350
+ dataKey = `${mockName}()`;
351
+ }
352
+ else {
353
+ // Entity is an object/namespace - use bare name as key
354
+ dataKey = mockName;
355
+ }
356
+ // Helper to wrap key in appropriate quotes for computed property access
357
+ // Use single quotes when key contains double quotes to avoid syntax errors
358
+ const quotePropertyKey = (key) => {
359
+ const escaped = key.replace(/\n/g, '\\n');
360
+ if (escaped.includes('"')) {
361
+ // Use single quotes, escaping any single quotes in the key
362
+ return `['${escaped.replace(/'/g, "\\'")}']`;
363
+ }
364
+ return `["${escaped}"]`;
365
+ };
213
366
  // Check if the return value schema only contains function type markers
214
367
  // (e.g., "validateInputs()": "function") without actual return data
215
368
  // (no functionCallReturnValue entries)
@@ -232,9 +385,14 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
232
385
  // Count the number of arguments from signature schema
233
386
  const argCount = Object.keys(signatureSchema).filter((key) => key.startsWith('signature[')).length;
234
387
  const args = Array.from({ length: argCount }, (_, i) => `arg${i + 1}`);
388
+ // Always add ...rest to accept extra arguments beyond the signature
389
+ args.push('...rest');
235
390
  const argsString = args.join(', ');
236
391
  // Generate empty mock function
237
- return `function ${mockName}(${argsString}) {
392
+ // Use baseMockName (not mockName) because mockName may contain a full call
393
+ // signature with argument expressions (e.g., "logSignOutAction(sessionUser.id, ...)")
394
+ // which would produce invalid syntax as function parameter names.
395
+ return `function ${baseMockName}(${argsString}) {
238
396
  // Empty mock - original function mocked out
239
397
  }`;
240
398
  }
@@ -250,9 +408,35 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
250
408
  !hasMeaningfulReturnData(relevantReturnValueSchema)) {
251
409
  const argCount = Object.keys(signatureSchema).filter((key) => key.startsWith('signature[')).length;
252
410
  const args = Array.from({ length: argCount }, (_, i) => `arg${i + 1}`);
411
+ // Always add ...rest to accept extra arguments beyond the signature
412
+ args.push('...rest');
253
413
  const argsString = args.join(', ');
414
+ // Check for Higher-Order Component (HOC) pattern:
415
+ // - First argument is a function (component) or unknown (couldn't trace type)
416
+ // - Returns a function
417
+ // HOCs like memo, forwardRef, createContext should return their first argument
418
+ //
419
+ // The return value key can be either:
420
+ // - 'memo()' (clean format)
421
+ // - 'memo(({ value, width }: Props) => { ... })' (full component code format)
422
+ const firstArgIsFunctionOrUnknown = signatureSchema['signature[0]'] === 'function' ||
423
+ signatureSchema['signature[0]'] === 'unknown';
424
+ const returnsFunction = relevantReturnValueSchema
425
+ ? Object.entries(relevantReturnValueSchema).some(([key, value]) => {
426
+ // Check if key represents a function call that returns a function
427
+ // Key should start with the mock name, contain '(', end with ')', and have value 'function'
428
+ const isFunctionCall = key.startsWith(mockName + '(') && key.endsWith(')');
429
+ return isFunctionCall && value === 'function';
430
+ })
431
+ : false;
432
+ if (firstArgIsFunctionOrUnknown && returnsFunction) {
433
+ // HOC pattern detected - return the first argument
434
+ return `function ${baseMockName}(${argsString}) {
435
+ return arg1;
436
+ }`;
437
+ }
254
438
  // Generate empty mock function
255
- return `function ${mockName}(${argsString}) {
439
+ return `function ${baseMockName}(${argsString}) {
256
440
  // Empty mock - original function mocked out
257
441
  }`;
258
442
  }
@@ -267,6 +451,87 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
267
451
  const pathDepth = splitOutsideParenthesesAndArrays(dataStructurePath).length;
268
452
  const isRootArray = dataStructureValue === 'array' &&
269
453
  (dataStructurePath === 'returnValue' || pathDepth <= mockNameParts.length);
454
+ // OPTIMIZATION: Early return for tuple-returning hooks (useAtom, useState, etc.)
455
+ // These hooks have simple [value, setter] return patterns that don't need the full
456
+ // 9216-key schema processing. Check if this is a tuple-returning hook and generate
457
+ // the mock code directly without iterating over all schema keys.
458
+ if (TUPLE_RETURNING_HOOKS.has(baseMockName) && isFunction) {
459
+ // Check if schema has generic array pattern (indicates tuple return like [value, setter])
460
+ const schemaKeys = Object.keys(relevantReturnValueSchema ?? {});
461
+ const hasGenericArrayInSchema = schemaKeys.some((k) => k.includes('.functionCallReturnValue[]') ||
462
+ k === `${dataKey}.functionCallReturnValue[]` ||
463
+ k === 'returnValue[]');
464
+ // Check for differentiated tuple indices (e.g., functionCallReturnValue[2], [3]) which would NOT be a standard tuple
465
+ // We only check indices immediately after functionCallReturnValue, not nested indices like signature[2]
466
+ const tupleHasDifferentiatedIndices = schemaKeys.some((k) => {
467
+ // Look for .functionCallReturnValue[N] where N >= 2
468
+ const match = k.match(/\.functionCallReturnValue\[(\d+)\]/);
469
+ if (!match)
470
+ return false;
471
+ const idx = parseInt(match[1], 10);
472
+ return idx >= 2;
473
+ });
474
+ const isTupleReturningHook = hasGenericArrayInSchema && !tupleHasDifferentiatedIndices;
475
+ if (isTupleReturningHook) {
476
+ // Find all call patterns for this hook (e.g., useAtom(quoteFilterAtom), useAtom(supplierAtom))
477
+ const hookCallPatterns = Object.keys(relevantReturnValueSchema ?? {})
478
+ .filter((k) => {
479
+ const regex = new RegExp(`^${baseMockName}\\([^)]+\\)$`);
480
+ return regex.test(k);
481
+ })
482
+ .map((k) => {
483
+ const match = k.match(/\(([^)]+)\)/);
484
+ return { key: k, arg: match?.[1] ?? '' };
485
+ });
486
+ let tupleReturnCode;
487
+ if (hookCallPatterns.length > 1) {
488
+ // Multiple patterns - generate conditional dispatch
489
+ const conditions = hookCallPatterns
490
+ .map(({ key, arg }) => `if (argLabel === '${arg}' || argStr.includes('${arg}')) {\n return [scenarios().data()?.["${key}"]?.[0] ?? [], () => {}];\n }`)
491
+ .join('\n ');
492
+ const fallbackKey = hookCallPatterns[0]?.key ?? dataKey;
493
+ tupleReturnCode = `(() => {
494
+ // Dynamic dispatch for tuple-returning hook with multiple argument patterns
495
+ const argLabel = args[0]?.debugLabel ?? '';
496
+ const argStr = args[0]?.toString?.() ?? String(args[0] ?? '');
497
+ ${conditions}
498
+ return [scenarios().data()?.["${fallbackKey}"]?.[0] ?? [], () => {}];
499
+ })()`;
500
+ }
501
+ else {
502
+ // Single or no patterns - use dynamic dispatch
503
+ const fallbackKey = hookCallPatterns[0]?.key ?? `${baseMockName}()`;
504
+ tupleReturnCode = `(() => {
505
+ // Dynamic dispatch for tuple-returning hook
506
+ const argLabel = args[0]?.debugLabel ?? '';
507
+ const argStr = args[0]?.toString?.() ?? '';
508
+ const allData = scenarios().data() ?? {};
509
+ if (argLabel) {
510
+ const labelKey = '${baseMockName}(' + argLabel + ')';
511
+ if (allData[labelKey]) {
512
+ return [allData[labelKey]?.[0] ?? [], () => {}];
513
+ }
514
+ }
515
+ const keys = Object.keys(allData).filter(k => k.startsWith('${baseMockName}('));
516
+ for (const key of keys) {
517
+ const keyArg = key.slice(${baseMockName.length + 1}, -1);
518
+ if (argStr.includes(keyArg)) {
519
+ return [allData[key]?.[0] ?? [], () => {}];
520
+ }
521
+ }
522
+ return [allData[keys[0] ?? '${fallbackKey}']?.[0] ?? [], () => {}];
523
+ })()`;
524
+ }
525
+ const safeFunctionName = options?.uniqueFunctionSuffix
526
+ ? `${baseMockName}_${options.uniqueFunctionSuffix}`
527
+ : options?.keepOriginalFunctionName
528
+ ? baseMockName
529
+ : mockNameIsCallSignature && derivedFunctionName
530
+ ? derivedFunctionName
531
+ : baseMockName;
532
+ return `function ${safeFunctionName}(...args) {\n return ${tupleReturnCode};\n}`;
533
+ }
534
+ }
270
535
  const returnValueParts = {
271
536
  name: dataStructureName,
272
537
  isArray: isRootArray,
@@ -287,23 +552,19 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
287
552
  // Strip type parameters like <typeof loader> from function names
288
553
  // so "useLoaderData<typeof loader>()" becomes "useLoaderData()"
289
554
  name = cleanOutTypes(name);
290
- // For root data access, use the canonical key if provided
291
- // Canonical keys use format: EntityName::hookName::index (e.g., "Dashboard::useLoaderData::0")
292
- if (isRootAccess && canonicalKey) {
293
- return `?.["${canonicalKey}"]`;
294
- }
295
- // Fallback for variable-qualified mocks when no canonical key provided
296
- // Format: "variableName <- functionName" (legacy format)
297
- if (isRootAccess && variableQualifier) {
298
- const baseName = name.replace(/\(\)$/, '');
299
- name = `${variableQualifier} <- ${baseName}`;
555
+ // For root data access, use the dataKey (original call signature or canonical key)
556
+ // This preserves the original call signature for LLM clarity
557
+ if (isRootAccess) {
558
+ // For call signature format, use the original mockName as the data key
559
+ // e.g., scenarios().data()?.["useFetcher<User>()"]
560
+ // e.g., scenarios().data()?.["db.select(usersQuery)"]
561
+ return `?.${quotePropertyKey(dataKey)}`;
300
562
  }
301
563
  // Only use unquoted array access syntax for pure array indices like [0], [1]
302
- // NOT for variable-qualified names like "fetcher[1] <- useFetcher" which need quotes
303
- if (name.match(/^\[\d+\]$/) && !name.includes(' <- ')) {
564
+ if (name.match(/^\[\d+\]$/)) {
304
565
  return `?.${name}`;
305
566
  }
306
- return `?.["${name.replace(/\n/g, '\\n')}"]`;
567
+ return `?.${quotePropertyKey(name)}`;
307
568
  };
308
569
  const constructDataPaths = () => {
309
570
  // For structural elements, return modified base paths for children
@@ -315,17 +576,23 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
315
576
  return [];
316
577
  }
317
578
  const addReturnValueFunctionAccessor = (dataPath) => {
318
- // Add function call accessor if:
319
- // - There are actual arguments, OR
320
- // - This is a callable (not a method that returns an array directly)
321
- // For methods like getAll() that return arrays, the data is at ["getAll()"] not ["getAll()"]["()"]
322
579
  if (returnValue.returnsFunctionArgs &&
323
580
  (returnValue.returnsFunctionArgs.length > 0 ||
324
581
  !returnValue.returnsFunctionArray)) {
325
582
  if (returnValue.isArray) {
326
583
  dataPath = `${dataPath}${optionalAccess('[0]')}`;
327
584
  }
328
- dataPath = `${dataPath}${optionalAccess(`(${safeString(returnValue.returnsFunctionArgs.join(', '))})`)}`;
585
+ // Only add the function call accessor ?.["(args)"] when there are actual
586
+ // arguments. When returnsFunctionArgs is empty [] (function-returns-function
587
+ // with no specific arg patterns), skip the ?.["()"] because:
588
+ // 1. preprocessSchemaForMocks collapses nested functionCallReturnValue chains
589
+ // into flat entries (e.g., getTranslate() = string, not {(): string})
590
+ // 2. The mock data is a flat value, so ?.["()"] on a string returns undefined
591
+ // 3. constructContent still wraps the return in a function (via returnsFunctionArgs)
592
+ // so the function-returns-function behavior is preserved without data nesting
593
+ if (returnValue.returnsFunctionArgs.length > 0) {
594
+ dataPath = `${dataPath}${optionalAccess(`(${safeString(returnValue.returnsFunctionArgs.join(', '))})`)}`;
595
+ }
329
596
  }
330
597
  return dataPath;
331
598
  };
@@ -351,10 +618,6 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
351
618
  };
352
619
  const constructContent = (dataPaths) => {
353
620
  const { name, args, nested, isArray, isGenericArray, returnsFunctionArgs, returnsFunctionArray, isAsyncFunction, hasNoReturnData, } = returnValue;
354
- const nestedContent = (nested ?? []).map((nestedItem) => {
355
- const nestedContent = constructReturnValueString(nestedItem, dataPaths);
356
- return nestedContent;
357
- });
358
621
  // Array prototype methods that should be ignored when building mocks
359
622
  // (these work on any array - we don't need to mock them)
360
623
  const ARRAY_PROTOTYPE_METHODS = new Set([
@@ -398,6 +661,36 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
398
661
  'with',
399
662
  'length',
400
663
  ]);
664
+ // When an array has differentiated indices ([0], [1], etc.), filter out any
665
+ // non-index items from nested. These non-index items come from generic [] paths
666
+ // like [].filter or [].sort, which describe element properties, not array elements.
667
+ // Including them would generate invalid syntax like "sort: ..." inside an array literal.
668
+ const hasDifferentiatedIndices = isArray &&
669
+ nested &&
670
+ nested.some((n) => n.name.match(/^\[\d+\]$/) && n.name !== '[0]');
671
+ let filteredNested = hasDifferentiatedIndices && nested
672
+ ? nested.filter((n) => n.name.match(/^\[\d+\]$/))
673
+ : nested;
674
+ // When a variable IS an array (not a function returning an array),
675
+ // filter out array prototype methods like .includes(), .filter(), etc.
676
+ // ONLY when the base schema has no method-call entries. When the base
677
+ // schema has methods (e.g., .map().functionCallReturnValue), the scenario
678
+ // data is stored as an object with method-call keys, and ALL methods
679
+ // need mock implementations. When the base schema has no methods, the
680
+ // data is a raw array and native methods like .includes() work directly.
681
+ if (isArray &&
682
+ !returnsFunctionArray &&
683
+ !baseSchemaHasMethodCalls &&
684
+ filteredNested) {
685
+ filteredNested = filteredNested.filter((n) => {
686
+ const methodName = n.name.replace(/[<(].*$/, '');
687
+ return !ARRAY_PROTOTYPE_METHODS.has(methodName);
688
+ });
689
+ }
690
+ const nestedContent = (filteredNested ?? []).map((nestedItem) => {
691
+ const nestedContent = constructReturnValueString(nestedItem, dataPaths);
692
+ return nestedContent;
693
+ });
401
694
  const levelContentItems = [];
402
695
  // Add spread for data paths when:
403
696
  // - Not a function returning an array, OR function returns array with custom methods
@@ -425,52 +718,110 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
425
718
  (!returnValue.isStructural || isStructuralArrayElementWithNested)) {
426
719
  levelContentItems.push(...dataPaths.map((path) => `...${path}`));
427
720
  }
428
- levelContentItems.push(...nestedContent);
721
+ // Filter out nested content that would be invalid as object properties
722
+ // (e.g., bare arrow functions like "() => {...}" without a property name)
723
+ // Only apply this filter when building object content, not array content.
724
+ // Bare arrow functions ARE valid as array elements (like [0] = {...}, [1] = () => {...})
725
+ // Check both isArray (item IS an array) and returnsFunctionArray (item returns an array)
726
+ const inArrayContext = isArray || returnsFunctionArray;
727
+ const validNestedContent = nestedContent.filter((content) => {
728
+ if (!content)
729
+ return false;
730
+ // Only filter bare arrow functions when NOT in array context
731
+ // In arrays, bare arrow functions are valid elements
732
+ if (!inArrayContext && content.match(/^\s*\([^)]*\)\s*=>/)) {
733
+ return false;
734
+ }
735
+ return true;
736
+ });
737
+ levelContentItems.push(...validNestedContent);
429
738
  let levelContents = levelContentItems.filter(Boolean).join(',\n');
430
739
  if (returnsFunctionArgs) {
431
- const argsString = returnsFunctionArgs
432
- .map((_, index) => `arg${index + 1}`)
433
- .join(', ');
434
- let funcContents = '';
435
- if (returnsFunctionArray) {
436
- if (hasNoReturnData) {
437
- // Function has no return data (only signatures) - return empty array
438
- funcContents = 'return []';
439
- }
440
- else if (levelContents.length === 0 && dataPaths.length === 1) {
441
- // When returning an array with no nested content, return the data path directly
442
- // (the data path points to the array in scenario data)
443
- funcContents = `return ${dataPaths[0]}`;
444
- }
445
- else if (levelContents.length === 0) {
446
- funcContents = 'return []';
447
- }
448
- else {
449
- funcContents = `return [\n${indent(levelContents)}\n]`;
740
+ // When returnsFunctionArgs is empty [] OR has a single literal string argument,
741
+ // the function returns a callable function (e.g., getTranslate() returns t,
742
+ // where t('key') looks up translations)
743
+ // Generate a dispatch function that looks up keys based on the argument
744
+ //
745
+ // Detect translation-like pattern:
746
+ // - Data path ends with ["('some.literal')"] - a literal string key
747
+ // - This means the mock data has keys like "('common.surveys')": "Surveys"
748
+ // - Exclude ["()"] which is an empty function call (not a translation pattern)
749
+ const dataPath = dataPaths[0];
750
+ // Pattern matches ?.["('...')"] at end of path, but NOT ?.["()"] (empty args)
751
+ const literalKeyPattern = dataPath?.match(/\?\.\["\('.+'\)"\]$/);
752
+ if (!returnsFunctionArray &&
753
+ dataPaths.length === 1 &&
754
+ literalKeyPattern // Only dispatch when there's a literal key pattern
755
+ ) {
756
+ // Function returns a function - generate dispatch function
757
+ // Strip the literal key from the path and use dynamic lookup
758
+ const dataPathBase = literalKeyPattern
759
+ ? dataPath.replace(/\?\.\["\('.+'\)"\]$/, '')
760
+ : dataPath;
761
+ const funcContents = `return ${dataPathBase}?.[\`('\${arg1}')\`]`;
762
+ levelContents = `(arg1) => {\n${indent(funcContents)}\n}`;
763
+ if (!isArray) {
764
+ return levelContents;
450
765
  }
451
766
  }
452
767
  else {
453
- // Check if function has no actual return data (only signatures)
454
- const hasNestedItems = nested && nested.length > 0;
455
- const hasActualNestedContent = nestedContent.filter(Boolean).length > 0;
456
- if (levelContentItems.length === 1 && dataPaths.length === 1) {
457
- if (hasNoReturnData ||
458
- (hasNestedItems && !hasActualNestedContent)) {
768
+ const argsString = returnsFunctionArgs
769
+ .map((_, index) => `arg${index + 1}`)
770
+ .join(', ');
771
+ let funcContents = '';
772
+ if (returnsFunctionArray) {
773
+ if (hasNoReturnData) {
459
774
  // Function has no return data (only signatures) - return empty array
460
775
  funcContents = 'return []';
461
776
  }
462
- else {
463
- // Has return data - return data path
777
+ else if (levelContents.length === 0 && dataPaths.length === 1) {
778
+ // When returning an array with no nested content, return the data path directly
779
+ // (the data path points to the array in scenario data)
464
780
  funcContents = `return ${dataPaths[0]}`;
465
781
  }
782
+ else if (levelContents.length === 0) {
783
+ funcContents = 'return []';
784
+ }
785
+ else {
786
+ funcContents = `return [\n${indent(levelContents)}\n]`;
787
+ }
466
788
  }
467
789
  else {
468
- funcContents = `return {\n${indent(levelContents)}\n}`;
790
+ // Check if function has no actual return data (only signatures)
791
+ const hasNestedItems = nested && nested.length > 0;
792
+ const hasActualNestedContent = nestedContent.filter(Boolean).length > 0;
793
+ if (levelContentItems.length === 1 && dataPaths.length === 1) {
794
+ if (hasNoReturnData ||
795
+ (hasNestedItems && !hasActualNestedContent)) {
796
+ // Function has no return data (only signatures) - return empty array
797
+ funcContents = 'return []';
798
+ }
799
+ else {
800
+ // Has return data - return data path
801
+ funcContents = `return ${dataPaths[0]}`;
802
+ }
803
+ }
804
+ else {
805
+ funcContents = `return {\n${indent(levelContents)}\n}`;
806
+ }
807
+ }
808
+ levelContents = `(${argsString}) => {\n${indent(funcContents)}\n}`;
809
+ if (!isArray) {
810
+ return levelContents;
469
811
  }
470
812
  }
471
- levelContents = `(${argsString}) => {\n${indent(funcContents)}\n}`;
472
- if (!isArray) {
473
- return levelContents;
813
+ // For generic arrays of functions WITH nested properties (e.g., functionCallReturnValue[] = "function"
814
+ // with nested .filter, .sort, etc.), the levelContents would be a bare arrow function "() => {...}"
815
+ // that wraps object content. Using this in a .map(({...})) creates invalid syntax like "({ () => {...} })".
816
+ // When isGenericArray is true AND there are nested properties, we're accessing data from the elements,
817
+ // not calling them - so skip the function wrapping.
818
+ // But if there are NO nested properties, keep the wrapper because callers may want to call the elements.
819
+ const hasNonStructuralNestedItems = nested &&
820
+ nested.length > 0 &&
821
+ nested.some((n) => !n.name.match(/^\[\d*\]$/));
822
+ if (isGenericArray && hasNonStructuralNestedItems) {
823
+ // Skip the arrow function wrapper - just use the nested content directly
824
+ levelContents = levelContentItems.filter(Boolean).join(',\n');
474
825
  }
475
826
  }
476
827
  // Check if all nested items are array prototype methods
@@ -483,7 +834,102 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
483
834
  return ARRAY_PROTOTYPE_METHODS.has(methodName);
484
835
  });
485
836
  let returnValueContents = '';
486
- if (!returnsFunctionArgs &&
837
+ // Check if this is a known tuple-returning hook (useAtom, useState, etc.)
838
+ // These should return [value, setter] tuples, not arrays or data paths
839
+ // Check isGenericArray from current context OR from schema for root level calls
840
+ // (at root level, isGenericArray might not be set yet but the schema contains [] pattern)
841
+ const hasGenericArrayInSchema = root &&
842
+ TUPLE_RETURNING_HOOKS.has(baseMockName) &&
843
+ Object.keys(relevantReturnValueSchema ?? {}).some((k) => k.includes('.functionCallReturnValue[]'));
844
+ // Check if there are array indices beyond what a standard 2-element tuple would have
845
+ // For tuple-returning hooks, [0] and [1] are expected (value and setter)
846
+ // Only consider it "differentiated" if there are indices >= 2 (e.g., [2], [3])
847
+ const tupleHasDifferentiatedIndices = nested?.some((n) => {
848
+ const indexMatch = n.name.match(/^\[(\d+)\]$/);
849
+ if (!indexMatch)
850
+ return false;
851
+ const index = parseInt(indexMatch[1], 10);
852
+ return index >= 2;
853
+ });
854
+ const isTupleReturningHook = TUPLE_RETURNING_HOOKS.has(baseMockName) &&
855
+ (isGenericArray || hasGenericArrayInSchema) &&
856
+ !tupleHasDifferentiatedIndices;
857
+ // Debug logging for tuple-returning hooks
858
+ if (TUPLE_RETURNING_HOOKS.has(baseMockName) && root) {
859
+ const schemaKeys = Object.keys(relevantReturnValueSchema ?? {});
860
+ const hasArrayPattern = schemaKeys.some((k) => k.includes('.functionCallReturnValue[]'));
861
+ console.log(`CodeYam: Tuple hook check for ${baseMockName} (root):`, `hasGenericArrayInSchema=${hasGenericArrayInSchema}`, `hasArrayPattern=${hasArrayPattern}`, `tupleHasDifferentiatedIndices=${tupleHasDifferentiatedIndices}`, `isTupleReturningHook=${isTupleReturningHook}`, `schemaKeysSample=${schemaKeys.slice(0, 5).join(', ')}`);
862
+ }
863
+ if (isTupleReturningHook) {
864
+ // Tuple-returning hooks should return [value, setter] tuple
865
+ // The value is the first element from scenarios data, setter is a no-op
866
+ // Default to [] when data is undefined to prevent errors like ".includes is not a function"
867
+ // Check if there are multiple call patterns for this hook in the schema
868
+ // (e.g., useAtom(quoteFilterAtom) and useAtom(supplierAtom))
869
+ const hookCallPatterns = Object.keys(relevantReturnValueSchema ?? {})
870
+ .filter((k) => {
871
+ // Match patterns like "useAtom(someArg)" but not nested paths like "useAtom(x).foo"
872
+ const regex = new RegExp(`^${baseMockName}\\([^)]+\\)$`);
873
+ return regex.test(k);
874
+ })
875
+ .map((k) => {
876
+ // Extract the argument from the key like "useAtom(quoteFilterAtom)" -> "quoteFilterAtom"
877
+ const match = k.match(/\(([^)]+)\)/);
878
+ return { key: k, arg: match?.[1] ?? '' };
879
+ });
880
+ if (hookCallPatterns.length > 1) {
881
+ // Multiple patterns - generate conditional dispatch based on first argument
882
+ // For Jotai atoms, we use debugLabel; for others, we try to match the argument string
883
+ const conditions = hookCallPatterns
884
+ .map(({ key, arg }) => `if (argLabel === '${arg}' || argStr.includes('${arg}')) {\n return [scenarios().data()?.["${key}"]?.[0] ?? [], () => {}];\n }`)
885
+ .join('\n ');
886
+ // Use the first pattern as fallback
887
+ const fallbackKey = hookCallPatterns[0]?.key ?? dataKey;
888
+ returnValueContents = `(() => {
889
+ // Dynamic dispatch for tuple-returning hook with multiple argument patterns
890
+ const argLabel = args[0]?.debugLabel ?? '';
891
+ const argStr = args[0]?.toString?.() ?? String(args[0] ?? '');
892
+ ${conditions}
893
+ // Fallback to first pattern
894
+ return [scenarios().data()?.["${fallbackKey}"]?.[0] ?? [], () => {}];
895
+ })()`;
896
+ }
897
+ else {
898
+ // Single pattern or no patterns - use dynamic dispatch to handle case where
899
+ // the mock is used with different atoms than what was captured in the schema.
900
+ // Use the first argument to construct the data key dynamically.
901
+ const fallbackKey = hookCallPatterns[0]?.key ?? `${baseMockName}()`;
902
+ returnValueContents = `(() => {
903
+ // Dynamic dispatch for tuple-returning hook
904
+ // Try to construct key from argument's debugLabel (Jotai atoms) or toString
905
+ const argLabel = args[0]?.debugLabel ?? '';
906
+ const argStr = args[0]?.toString?.() ?? '';
907
+ const allData = scenarios().data() ?? {};
908
+
909
+ // Try to find a matching key using debugLabel first
910
+ if (argLabel) {
911
+ const labelKey = '${baseMockName}(' + argLabel + ')';
912
+ if (allData[labelKey]) {
913
+ return [allData[labelKey]?.[0] ?? [], () => {}];
914
+ }
915
+ }
916
+
917
+ // Try to find any matching key that contains part of the argument string
918
+ const keys = Object.keys(allData).filter(k => k.startsWith('${baseMockName}('));
919
+ for (const key of keys) {
920
+ const keyArg = key.slice(${baseMockName.length + 1}, -1);
921
+ if (argStr.includes(keyArg)) {
922
+ return [allData[key]?.[0] ?? [], () => {}];
923
+ }
924
+ }
925
+
926
+ // Fallback to first matching key or default
927
+ const fallback = keys[0] ?? '${fallbackKey}';
928
+ return [allData[fallback]?.[0] ?? [], () => {}];
929
+ })()`;
930
+ }
931
+ }
932
+ else if (!returnsFunctionArgs &&
487
933
  nestedContent.length === 0 &&
488
934
  dataPaths.length === 1) {
489
935
  returnValueContents = dataPaths[0];
@@ -516,14 +962,354 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
516
962
  // Get the array base path (without the [0])
517
963
  const arrayBasePath = dataPaths[0].replace(/\?\.\[0\]$/, '');
518
964
  // Replace [0] references with [__idx__] in level contents
519
- const mappedContents = levelContents.replace(/\?\.\[0\]/g, '?.[__idx__]');
965
+ let mappedContents = levelContents.replace(/\?\.\[0\]/g, '?.[__idx__]');
520
966
  // levelContents may already be wrapped in {...} from structural [0] element,
521
967
  // so check if we need to add the wrapper or not
522
968
  const needsWrapper = !mappedContents.trim().startsWith('{');
969
+ // Helper to check if a position is inside a string literal
970
+ // Returns the end position of the string if inside one, -1 otherwise
971
+ // Defined here so it's accessible in both needsWrapper branches
972
+ const skipStringLiteral = (content, pos) => {
973
+ const char = content[pos];
974
+ if (char !== '"' && char !== "'" && char !== '`')
975
+ return -1;
976
+ // Find the matching closing quote
977
+ let j = pos + 1;
978
+ while (j < content.length) {
979
+ if (content[j] === '\\') {
980
+ j += 2; // Skip escaped character
981
+ continue;
982
+ }
983
+ if (content[j] === char) {
984
+ return j + 1; // Return position after closing quote
985
+ }
986
+ j++;
987
+ }
988
+ return content.length; // Unclosed string, skip to end
989
+ };
990
+ // Filter out bare arrow functions which are invalid as object properties.
991
+ // Arrow functions can be multi-line, so we need to match the entire function body, not just the first line.
992
+ // Pattern: starts with "(args) =>", followed by either:
993
+ // - A single-line body: "() => expression"
994
+ // - A multi-line body: "() => { ... }" (with matching braces)
995
+ // IMPORTANT: Only filter BARE arrow functions (without property names).
996
+ // "() => {...}" is invalid, but "get: (arg1) => {...}" is valid.
997
+ // We use a function to properly handle nested braces.
998
+ // Defined here so it's accessible in both needsWrapper branches
999
+ const filterOutArrowFunctions = (content) => {
1000
+ const result = [];
1001
+ let i = 0;
1002
+ while (i < content.length) {
1003
+ // Skip over string literals entirely
1004
+ const stringEnd = skipStringLiteral(content, i);
1005
+ if (stringEnd !== -1) {
1006
+ result.push(content.slice(i, stringEnd));
1007
+ i = stringEnd;
1008
+ continue;
1009
+ }
1010
+ // Check if we're at the start of an arrow function (with optional leading whitespace)
1011
+ const arrowMatch = content
1012
+ .slice(i)
1013
+ .match(/^(\s*)\([^)]*\)\s*=>\s*/);
1014
+ if (arrowMatch) {
1015
+ // Check if this is a bare arrow function or a named property with arrow function value
1016
+ // Look back to see if there's a "key:" pattern before this position
1017
+ const before = content.slice(0, i);
1018
+ const beforeTrimmed = before.trim();
1019
+ // Valid patterns where arrow function is NOT bare:
1020
+ // 1. Property value: "key: (arg) => ..." - ends with ':'
1021
+ // 2. Function argument: ".map((arg) => ..." - ends with '('
1022
+ // 3. Method call: "?.map" followed directly by the arrow function
1023
+ // In this case, the '(' is consumed by the arrow function regex match,
1024
+ // so beforeTrimmed ends with the method name (e.g., 'map'), not '('.
1025
+ // We detect this by checking if beforeTrimmed ends with an identifier
1026
+ // that could be a method name (preceded by '.' or '?.').
1027
+ // NOTE: We don't include ',' because "{ prop, () => {} }" is invalid
1028
+ // (can't distinguish function argument from object property context)
1029
+ const isPropertyValue = beforeTrimmed.endsWith(':');
1030
+ const isFunctionArg = beforeTrimmed.endsWith('(');
1031
+ // Check if before ends with a method call pattern like ".map" or "?.map"
1032
+ // The '(' after the method name is consumed by the arrow function regex
1033
+ const isMethodCallArg = /\??\.\w+$/.test(beforeTrimmed);
1034
+ const hasPropertyName = isPropertyValue || isFunctionArg || isMethodCallArg;
1035
+ if (!hasPropertyName) {
1036
+ // This is a bare arrow function - filter it out
1037
+ // Found arrow function start, need to find its end
1038
+ const afterArrow = i + arrowMatch[0].length;
1039
+ if (content[afterArrow] === '{') {
1040
+ // Multi-line arrow function - find matching closing brace
1041
+ // Must respect string literals when counting braces
1042
+ let braceCount = 1;
1043
+ let j = afterArrow + 1;
1044
+ while (j < content.length && braceCount > 0) {
1045
+ const strEnd = skipStringLiteral(content, j);
1046
+ if (strEnd !== -1) {
1047
+ j = strEnd;
1048
+ continue;
1049
+ }
1050
+ if (content[j] === '{')
1051
+ braceCount++;
1052
+ if (content[j] === '}')
1053
+ braceCount--;
1054
+ j++;
1055
+ }
1056
+ // Skip past the arrow function
1057
+ i = j;
1058
+ // Only skip trailing comma, keep newlines
1059
+ while (i < content.length && content[i] === ' ') {
1060
+ i++;
1061
+ }
1062
+ if (content[i] === ',') {
1063
+ i++; // Skip the comma after the arrow function
1064
+ }
1065
+ }
1066
+ else {
1067
+ // Single expression arrow function - skip to next comma or newline
1068
+ let j = afterArrow;
1069
+ while (j < content.length &&
1070
+ content[j] !== ',' &&
1071
+ content[j] !== '\n') {
1072
+ j++;
1073
+ }
1074
+ i = j;
1075
+ if (content[i] === ',')
1076
+ i++; // Skip the comma
1077
+ }
1078
+ continue;
1079
+ }
1080
+ }
1081
+ // Not a bare arrow function, keep this character
1082
+ result.push(content[i]);
1083
+ i++;
1084
+ }
1085
+ return result.join('');
1086
+ };
1087
+ // Filter out bare object blocks (e.g., "{ ...spread, props }," without a property name)
1088
+ // These are invalid in object literal context - you need "key: { ... }" not just "{ ... }"
1089
+ // Defined here so it's accessible in both needsWrapper branches
1090
+ // The skipFirstBrace parameter allows the else branch to preserve the outer object
1091
+ const filterOutBareObjects = (content, skipFirstBrace = false) => {
1092
+ const result = [];
1093
+ let i = 0;
1094
+ let firstBraceSkipped = false;
1095
+ while (i < content.length) {
1096
+ // Skip over string literals entirely - braces inside strings should not be processed
1097
+ const stringEnd = skipStringLiteral(content, i);
1098
+ if (stringEnd !== -1) {
1099
+ result.push(content.slice(i, stringEnd));
1100
+ i = stringEnd;
1101
+ continue;
1102
+ }
1103
+ // Check if we're at a bare object start (newline/comma followed by { without : before it)
1104
+ // Look back to see if there's a colon (property assignment) before this brace
1105
+ const isStartOfLine = i === 0 ||
1106
+ content[i - 1] === '\n' ||
1107
+ content.slice(0, i).trim().endsWith(',');
1108
+ if (content[i] === '{' && isStartOfLine) {
1109
+ // Check if this is actually a bare object (not "key: {")
1110
+ const beforeTrimmed = content.slice(0, i).trim();
1111
+ const isBareObject = beforeTrimmed.endsWith(',') ||
1112
+ beforeTrimmed === '' ||
1113
+ beforeTrimmed.endsWith('(');
1114
+ if (isBareObject) {
1115
+ // If skipFirstBrace is true and this is the first bare brace at position 0,
1116
+ // don't filter it - it's the intentional outer object wrapper
1117
+ if (skipFirstBrace && !firstBraceSkipped && i === 0) {
1118
+ firstBraceSkipped = true;
1119
+ result.push(content[i]);
1120
+ i++;
1121
+ continue;
1122
+ }
1123
+ // Find matching closing brace, respecting string literals
1124
+ let braceCount = 1;
1125
+ let j = i + 1;
1126
+ while (j < content.length && braceCount > 0) {
1127
+ const strEnd = skipStringLiteral(content, j);
1128
+ if (strEnd !== -1) {
1129
+ j = strEnd;
1130
+ continue;
1131
+ }
1132
+ if (content[j] === '{')
1133
+ braceCount++;
1134
+ if (content[j] === '}')
1135
+ braceCount--;
1136
+ j++;
1137
+ }
1138
+ // Skip past the object
1139
+ i = j;
1140
+ // Skip trailing comma
1141
+ while (i < content.length && content[i] === ' ') {
1142
+ i++;
1143
+ }
1144
+ if (content[i] === ',') {
1145
+ i++;
1146
+ }
1147
+ continue;
1148
+ }
1149
+ }
1150
+ result.push(content[i]);
1151
+ i++;
1152
+ }
1153
+ return result.join('');
1154
+ };
1155
+ // Helper to clean up formatting issues after filtering
1156
+ const cleanupContent = (content) => {
1157
+ return (content
1158
+ .replace(/,\s*,/g, ',') // Double commas
1159
+ .replace(/,(\s*\n\s*\})/g, '$1') // Trailing comma before closing brace
1160
+ .replace(/\{\s*\n\s*,/g, '{\n') // Leading comma after opening brace
1161
+ // Remove incomplete .map calls where callback was filtered out
1162
+ // Pattern: ".map" followed by newline/whitespace without "(" for args
1163
+ .replace(/\?\.map(?=\s*[\n\r,}\]])/g, '')
1164
+ .replace(/\.map(?=\s*[\n\r,}\]])/g, '')
1165
+ // Clean up orphan })) sequences (from nested filtered map callbacks)
1166
+ .replace(/\s*\}\)\)\s*\n\s*\}/g, '\n}')
1167
+ .replace(/^\s*\n/gm, '') // Empty lines
1168
+ .trim());
1169
+ };
523
1170
  if (needsWrapper) {
524
- returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => ({\n${indent(mappedContents)}\n}))`;
1171
+ // Apply filters to remove invalid content
1172
+ mappedContents = filterOutArrowFunctions(mappedContents);
1173
+ mappedContents = filterOutBareObjects(mappedContents);
1174
+ mappedContents = cleanupContent(mappedContents);
1175
+ // If mappedContents is empty after filtering, don't generate .map() at all
1176
+ // Just use the array path directly with spread or as-is
1177
+ // This prevents orphan )) from empty .map() callbacks
1178
+ const cleanedForEmptyCheck = mappedContents
1179
+ .replace(/\s+/g, '')
1180
+ .replace(/,+/g, '');
1181
+ if (cleanedForEmptyCheck.length === 0) {
1182
+ // Content is empty - just return the array directly
1183
+ returnValueContents = arrayBasePath;
1184
+ }
1185
+ else {
1186
+ // Check if mappedContents is just a bare expression (no property names)
1187
+ // A bare expression like "scenarios().data()?.["key"]?.[__idx__]," cannot be
1188
+ // wrapped in ({ }) because it's not a valid object property.
1189
+ // Pattern: content has no ":" that's not inside brackets/parens/strings
1190
+ const hasBareExpression = (() => {
1191
+ const trimmed = mappedContents.trim().replace(/,\s*$/, ''); // Remove trailing comma
1192
+ let depth = 0;
1193
+ let inString = false;
1194
+ let stringChar = '';
1195
+ for (let i = 0; i < trimmed.length; i++) {
1196
+ const char = trimmed[i];
1197
+ if (inString) {
1198
+ if (char === '\\') {
1199
+ i++; // Skip escaped char
1200
+ continue;
1201
+ }
1202
+ if (char === stringChar) {
1203
+ inString = false;
1204
+ }
1205
+ continue;
1206
+ }
1207
+ if (char === '"' || char === "'" || char === '`') {
1208
+ inString = true;
1209
+ stringChar = char;
1210
+ continue;
1211
+ }
1212
+ if (char === '(' || char === '[' || char === '{') {
1213
+ depth++;
1214
+ continue;
1215
+ }
1216
+ if (char === ')' || char === ']' || char === '}') {
1217
+ depth--;
1218
+ continue;
1219
+ }
1220
+ // Found a colon at depth 0 = has property name
1221
+ if (char === ':' && depth === 0) {
1222
+ return false;
1223
+ }
1224
+ }
1225
+ return true;
1226
+ })();
1227
+ if (hasBareExpression) {
1228
+ // Content is just an expression - return it directly without object wrapper
1229
+ const trimmedContent = mappedContents
1230
+ .trim()
1231
+ .replace(/,\s*$/, '');
1232
+ returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => (\n${indent(trimmedContent)}\n))`;
1233
+ }
1234
+ else {
1235
+ // When generating object-wrapped .map(), ensure original item data is preserved.
1236
+ // If no data spread was included (e.g., because this is a plain array property,
1237
+ // not a function return), add ...__item__ to spread the original item properties.
1238
+ // Without this, the .map() would create new objects with only nested function
1239
+ // properties, losing data like filePath, frontmatter, body, etc.
1240
+ const hasDataSpread = mappedContents.includes('...scenarios()') ||
1241
+ mappedContents.includes('...__item__');
1242
+ if (!hasDataSpread) {
1243
+ mappedContents = `...__item__,\n${mappedContents}`;
1244
+ }
1245
+ returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => ({\n${indent(mappedContents)}\n}))`;
1246
+ }
1247
+ } // Close the empty content check else block
525
1248
  }
526
1249
  else {
1250
+ // Content already starts with '{'. Check if there are additional properties after the inner object.
1251
+ // If so, we need to merge them INTO the object, not leave them outside.
1252
+ // Pattern: "{ ...spread, props },\nfilter: ...,\nsort: ..."
1253
+ // Should become: "{ ...spread, props, filter: ..., sort: ... }"
1254
+ const trimmed = mappedContents.trim();
1255
+ // Find first }, at depth 0 that is NOT inside a string literal
1256
+ // This prevents splitting keys like ?.["useQuery({ id }, { enabled })"]
1257
+ // and also prevents finding }, inside nested arrow functions
1258
+ const findBraceCommaOutsideStrings = (content) => {
1259
+ let i = 0;
1260
+ let depth = 0; // Track brace depth to find the outer object's },
1261
+ while (i < content.length - 1) {
1262
+ // Skip over string literals
1263
+ const strEnd = skipStringLiteral(content, i);
1264
+ if (strEnd !== -1) {
1265
+ i = strEnd;
1266
+ continue;
1267
+ }
1268
+ // Track brace depth
1269
+ if (content[i] === '{') {
1270
+ depth++;
1271
+ i++;
1272
+ continue;
1273
+ }
1274
+ // Check for }, pattern at depth 1 (the outer object level)
1275
+ // We're looking for the outer object's closing brace, which is at depth 1
1276
+ // (we started at depth 0, opened { at depth 0 -> 1)
1277
+ if (content[i] === '}') {
1278
+ depth--;
1279
+ if (depth === 0 &&
1280
+ i + 1 < content.length &&
1281
+ content[i + 1] === ',') {
1282
+ return i;
1283
+ }
1284
+ }
1285
+ i++;
1286
+ }
1287
+ return -1;
1288
+ };
1289
+ const firstBraceEnd = findBraceCommaOutsideStrings(trimmed);
1290
+ if (firstBraceEnd !== -1) {
1291
+ // Found pattern "{ ... }," followed by more content
1292
+ // Extract the inner object and the trailing properties
1293
+ const innerObject = trimmed.slice(0, firstBraceEnd);
1294
+ const trailingContent = trimmed.slice(firstBraceEnd + 2).trim();
1295
+ if (trailingContent) {
1296
+ // Merge trailing properties into the inner object
1297
+ mappedContents = `${innerObject},\n${trailingContent}\n}`;
1298
+ }
1299
+ }
1300
+ // Even when content starts with {, we need to filter out invalid properties inside
1301
+ // (arrow functions and bare objects that were generated from the schema)
1302
+ // Pass skipFirstBrace=true because the content's outer { is the intentional wrapper
1303
+ mappedContents = filterOutArrowFunctions(mappedContents);
1304
+ mappedContents = filterOutBareObjects(mappedContents, true);
1305
+ mappedContents = cleanupContent(mappedContents);
1306
+ // Same as needsWrapper branch: ensure item data is preserved in .map()
1307
+ const hasDataSpreadInner = mappedContents.includes('...scenarios()') ||
1308
+ mappedContents.includes('...__item__');
1309
+ if (!hasDataSpreadInner && mappedContents.trim().length > 0) {
1310
+ // Insert ...__item__ after the opening brace
1311
+ mappedContents = mappedContents.replace(/^\s*\{/, '{\n...__item__,');
1312
+ }
527
1313
  returnValueContents = `${arrayBasePath}?.map((__item__, __idx__) => (\n${indent(mappedContents)}\n))`;
528
1314
  }
529
1315
  }
@@ -532,7 +1318,36 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
532
1318
  }
533
1319
  }
534
1320
  else {
535
- returnValueContents = `{\n${indent(levelContents)}\n}`;
1321
+ // When we have a single data path and nested content that creates an object structure,
1322
+ // and we're NOT at the root level, we need to handle the case where the parent data
1323
+ // value is null or undefined. Without this check, `{ ...null, prop: null?.["prop"] }`
1324
+ // creates `{ prop: undefined }` instead of `null`, causing errors like
1325
+ // "Cannot read properties of undefined (reading 'some')" when code does
1326
+ // data?.prop.some(...) because data is an object with prop: undefined, not null.
1327
+ // We only apply this to non-root cases because root-level mocks are expected to exist.
1328
+ // We also skip structural elements (like [0] inside arrays) because the null check
1329
+ // syntax doesn't work inside .map() callbacks where structural elements are used.
1330
+ // We also skip array index elements ([0], [1], etc.) because they represent tuple/array
1331
+ // elements, not properties that could be null.
1332
+ // We also only apply this when we're inside a function return value context - i.e.,
1333
+ // when the data path contains a function call pattern like ?.["someFunction(...)"].
1334
+ // This prevents adding null checks to intermediate objects in chains like supabase.auth.
1335
+ const hasNestedContent = nestedContent.filter(Boolean).length > 0;
1336
+ const isArrayIndexElement = name.match(/^\[\d*\]$/);
1337
+ // Check if data path contains a function call pattern, indicating we're inside a function return value
1338
+ const isInsideFunctionReturnValue = dataPaths.length === 1 &&
1339
+ dataPaths[0].match(/\?\.\["\w+\([^"]*\)"\]/);
1340
+ if (!root &&
1341
+ !returnValue.isStructural &&
1342
+ !isArrayIndexElement &&
1343
+ isInsideFunctionReturnValue &&
1344
+ hasNestedContent) {
1345
+ // Wrap with null check: if parent is null/undefined, return it directly; otherwise create object
1346
+ returnValueContents = `${dataPaths[0]} == null ? ${dataPaths[0]} : {\n${indent(levelContents)}\n}`;
1347
+ }
1348
+ else {
1349
+ returnValueContents = `{\n${indent(levelContents)}\n}`;
1350
+ }
536
1351
  }
537
1352
  }
538
1353
  if (root) {
@@ -607,9 +1422,39 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
607
1422
  content = `${cleanOutTypes(name)}: ${isAsyncFunction ? 'async ' : ''}(${argsString}) => {\n${indent(funcContents)}\n}`;
608
1423
  }
609
1424
  else {
610
- // No argument variants - use existing behavior
611
- const funcContents = `return ${returnValueContents}`;
612
- content = `${cleanOutTypes(name)}: ${isAsyncFunction ? 'async ' : ''}(${argsString}) => {\n${indent(funcContents)}\n}`;
1425
+ // No argument variants
1426
+ // Check if this is an array method callback containing JSX.
1427
+ // JSX can't be serialized to JSON, so the LLM generates [{}] as data.
1428
+ // Instead of returning that unusable data, generate a passthrough that
1429
+ // calls the real callback on the best available array data from siblings.
1430
+ const containsJsx = dataPaths.some((p) => /<[A-Z]/.test(p));
1431
+ const isArrayMethod = ARRAY_PROTOTYPE_METHODS.has(name);
1432
+ if (containsJsx && isArrayMethod && dataPaths.length > 0) {
1433
+ // Extract parent data path by removing the last ?.["..."] segment
1434
+ const parentPath = dataPaths[0].replace(/\?\.\["[^"]*"\]$/, '');
1435
+ const funcLines = [
1436
+ `const _d = ${parentPath};`,
1437
+ `const _a = Object.values(_d || {}).filter(v => Array.isArray(v) && v.length > 0 && v.some(i => i && typeof i === "object" && Object.keys(i).length > 0)).sort((a, b) => b.length - a.length);`,
1438
+ `return _a[0] ? _a[0].${name}(${argsString}) : []`,
1439
+ ];
1440
+ const funcContents = funcLines.join('\n');
1441
+ content = `${cleanOutTypes(name)}: ${isAsyncFunction ? 'async ' : ''}(${argsString}) => {\n${indent(funcContents)}\n}`;
1442
+ }
1443
+ else {
1444
+ // But if there's nested content, we need to include it in the return object
1445
+ // (similar to how argument variant branches handle this at line 1070-1072)
1446
+ const hasNestedContent = validNestedContent.length > 0;
1447
+ let funcReturnContents;
1448
+ if (hasNestedContent && levelContentItems.length > 1) {
1449
+ // Include both spread and nested content in the return
1450
+ funcReturnContents = `{\n${indent(levelContents)}\n}`;
1451
+ }
1452
+ else {
1453
+ funcReturnContents = returnValueContents;
1454
+ }
1455
+ const funcContents = `return ${funcReturnContents}`;
1456
+ content = `${cleanOutTypes(name)}: ${isAsyncFunction ? 'async ' : ''}(${argsString}) => {\n${indent(funcContents)}\n}`;
1457
+ }
613
1458
  }
614
1459
  }
615
1460
  else {
@@ -617,8 +1462,14 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
617
1462
  return;
618
1463
  }
619
1464
  else if (name.match(/\[\d*\]/)) {
1465
+ // Numeric array index like [0], [1] - can be used as computed property
620
1466
  content = returnValueContents;
621
1467
  }
1468
+ else if (name.match(/^\[[a-zA-Z_]\w*\]$/)) {
1469
+ // Variable-based index like [currentItemIndex] - must be quoted string key
1470
+ // Otherwise JavaScript would try to evaluate the variable name
1471
+ content = `"${safeString(name)}": ${returnValueContents}`;
1472
+ }
622
1473
  else {
623
1474
  content = `${safeString(name)}: ${returnValueContents}`;
624
1475
  }
@@ -630,7 +1481,31 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
630
1481
  return content;
631
1482
  };
632
1483
  // Create the return value structure
633
- const sortedKeys = Object.keys(relevantReturnValueSchema ?? {}).sort((a, b) => {
1484
+ // OPTIMIZATION: Filter keys to only those starting with baseMockName before sorting.
1485
+ // This dramatically reduces processing time for large schemas (e.g., 9216 keys -> ~100 relevant keys).
1486
+ // Without this filter, the loop would call splitOutsideParenthesesAndArrays on every key
1487
+ // even though most are filtered out later by the baseMockName check.
1488
+ const allSchemaKeys = Object.keys(relevantReturnValueSchema ?? {});
1489
+ const relevantKeys = allSchemaKeys.filter((key) => {
1490
+ // Fast prefix check - key must start with baseMockName followed by ( or < or .
1491
+ // This matches: "useAtom()", "useAtom<T>()", "useAtom.something", but not "useAtomValue()"
1492
+ if (key === baseMockName)
1493
+ return true;
1494
+ if (key.startsWith(baseMockName + '('))
1495
+ return true;
1496
+ if (key.startsWith(baseMockName + '<'))
1497
+ return true;
1498
+ if (key.startsWith(baseMockName + '.'))
1499
+ return true;
1500
+ // Also include 'returnValue' paths which are normalized later
1501
+ if (key === 'returnValue' ||
1502
+ key.startsWith('returnValue.') ||
1503
+ key.startsWith('returnValue['))
1504
+ return true;
1505
+ return false;
1506
+ });
1507
+ const schemaKeyCount = relevantKeys.length;
1508
+ const sortedKeys = relevantKeys.sort((a, b) => {
634
1509
  const aParts = splitOutsideParenthesesAndArrays(a);
635
1510
  const bParts = splitOutsideParenthesesAndArrays(b);
636
1511
  const maxLength = Math.max(aParts.length, bParts.length);
@@ -654,6 +1529,36 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
654
1529
  }
655
1530
  return 0;
656
1531
  });
1532
+ // OPTIMIZATION: Pre-compute prefix indexes for O(1) lookups instead of O(n) scans.
1533
+ // This reduces complexity from O(n²) to O(n) for large schemas (9k+ keys).
1534
+ //
1535
+ // 1. extendedReturnValuePrefixes: Set of all path prefixes that have a .functionCallReturnValue extension
1536
+ // Used by hasExtendedFunctionCallReturnValue check at line ~1754
1537
+ // 2. functionCallsWithReturnValue: Set of function call paths where .functionCallReturnValue IMMEDIATELY follows
1538
+ // Used by hasProperFunctionCallPath check at line ~1787
1539
+ // IMPORTANT: Only includes paths where the function call is directly followed by .functionCallReturnValue
1540
+ // e.g., "a.b().functionCallReturnValue" -> adds "a.b()" but NOT "a" even if "a" ends with ")"
1541
+ const extendedReturnValuePrefixes = new Set();
1542
+ const functionCallsWithReturnValue = new Set();
1543
+ for (const k of relevantKeys) {
1544
+ const parts = splitOutsideParenthesesAndArrays(k);
1545
+ const returnValueIndex = parts.findIndex((part) => part.startsWith(RETURN_VALUE));
1546
+ if (returnValueIndex !== -1) {
1547
+ // Add all prefixes of k up to (but not including) functionCallReturnValue
1548
+ const prefix = joinParenthesesAndArrays(parts.slice(0, returnValueIndex));
1549
+ extendedReturnValuePrefixes.add(prefix);
1550
+ // ONLY add to functionCallsWithReturnValue if functionCallReturnValue IMMEDIATELY follows
1551
+ if (prefix.endsWith(')')) {
1552
+ functionCallsWithReturnValue.add(prefix);
1553
+ }
1554
+ // Also add intermediate prefixes for nested paths to extendedReturnValuePrefixes
1555
+ // This helps hasExtendedFunctionCallReturnValue which checks key + '.'
1556
+ for (let i = 1; i < returnValueIndex; i++) {
1557
+ const partialPrefix = joinParenthesesAndArrays(parts.slice(0, i));
1558
+ extendedReturnValuePrefixes.add(partialPrefix);
1559
+ }
1560
+ }
1561
+ }
657
1562
  for (const key of sortedKeys) {
658
1563
  const value = relevantReturnValueSchema[key];
659
1564
  const parts = splitOutsideParenthesesAndArrays(key);
@@ -681,8 +1586,8 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
681
1586
  parts.splice(i, 1);
682
1587
  }
683
1588
  }
684
- // For variable-qualified mocks like "revalidator <- useRevalidator",
685
- // compare against baseMockName ("useRevalidator"), not the full mockName
1589
+ // Compare against baseMockName (without generics/args), not the full mockName
1590
+ // e.g., for "useFetcher<User>()", baseMockName is "useFetcher"
686
1591
  if (parts[0].split('(')[0] !== baseMockName)
687
1592
  continue;
688
1593
  // Include paths with functionCallReturnValue OR function-typed paths that need mocking
@@ -699,7 +1604,9 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
699
1604
  // nested inside (e.g., methods on array elements passed as arguments).
700
1605
  if (hasSignaturePath)
701
1606
  continue;
702
- const hasExtendedFunctionCallReturnValue = Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(key + '.') && k.includes(`.${RETURN_VALUE}`));
1607
+ // OPTIMIZATION: Use pre-computed index instead of O(n) scan
1608
+ // Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(key + '.') && k.includes('.functionCallReturnValue'))
1609
+ const hasExtendedFunctionCallReturnValue = extendedReturnValuePrefixes.has(key);
703
1610
  // Skip JSX components - they look like function calls (e.g., Context.Provider())
704
1611
  // but they're React components used in JSX, not functions that need mocking
705
1612
  // Check both the value type and whether the functionCallReturnValue is jsx-component
@@ -724,7 +1631,9 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
724
1631
  // This part is a function call, and the next part is NOT .functionCallReturnValue
725
1632
  // Check if there's any path with .functionCallReturnValue for this function call
726
1633
  const functionCallPath = joinParenthesesAndArrays(parts.slice(0, i + 1));
727
- const hasProperFunctionCallPath = Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(functionCallPath + '.functionCallReturnValue'));
1634
+ // OPTIMIZATION: Use pre-computed index instead of O(n) scan
1635
+ // Old code: Object.keys(relevantReturnValueSchema).some((k) => k.startsWith(functionCallPath + '.functionCallReturnValue'))
1636
+ const hasProperFunctionCallPath = functionCallsWithReturnValue.has(functionCallPath);
728
1637
  if (hasProperFunctionCallPath) {
729
1638
  // Skip this path - the .functionCallReturnValue path will handle it correctly
730
1639
  shouldSkipKey = true;
@@ -778,6 +1687,16 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
778
1687
  const nextIsArray = !!nextPart?.match(/^\[\d*\]/);
779
1688
  const isDifferentiatedArray = !!part?.match(/^\[\d+\]/);
780
1689
  const nextIsDifferentiatedArray = !!nextPart?.match(/^\[\d+\]/);
1690
+ // Variable index patterns like [currentItemIndex] or [targetIndex] indicate array access
1691
+ // but don't represent actual data structure - they're markers from variable-based index tracking.
1692
+ // Skip them AND all remaining parts to avoid creating spurious nested structure that breaks array iteration.
1693
+ // The remaining parts (e.g., .missing_attributes) describe properties of array elements, which are
1694
+ // already handled by the generic [] accessor path.
1695
+ const isVariableIndex = !!part?.match(/^\[[a-zA-Z_]\w*\]$/);
1696
+ if (isVariableIndex) {
1697
+ // Break out of the loop entirely - don't process any remaining parts
1698
+ break;
1699
+ }
781
1700
  // Find the correct value for the current part being processed
782
1701
  let partValue = value; // default to the final value
783
1702
  if (isFunctionCallReturnValue(part) && nextIsArray) {
@@ -869,7 +1788,35 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
869
1788
  }
870
1789
  }
871
1790
  else {
872
- returnValueSection.returnsFunctionArgs = [];
1791
+ // Before setting returnsFunctionArgs on the parent (for generic [] = function),
1792
+ // check if there are specific array indices (like [0], [1]) that are NOT functions.
1793
+ // If so, don't set returnsFunctionArgs because those specific indices take precedence.
1794
+ // This prevents adding ["()"] to paths like [0] when [0] is 'unknown' but [] is 'function'.
1795
+ //
1796
+ // Use parts.slice(0, i + 1) to get the current path INCLUDING functionCallReturnValue.
1797
+ // For example, if parts = ['useAtom()','functionCallReturnValue','[]']
1798
+ // and i = 1, we want to check 'useAtom().functionCallReturnValue[0]' etc.
1799
+ const arrayContainerPath = joinParenthesesAndArrays(parts.slice(0, i + 1));
1800
+ const hasNonFunctionSpecificIndices = Object.entries(relevantReturnValueSchema).some(([k, v]) => {
1801
+ // Look for paths like "arrayContainerPath[0]", "arrayContainerPath[1]" etc.
1802
+ const indexMatch = k.match(new RegExp(`^${arrayContainerPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\[(\\d+)\\]$`));
1803
+ // If found and it's NOT a function type, we have a conflict
1804
+ return (indexMatch &&
1805
+ !['function', 'async-function'].includes(v));
1806
+ });
1807
+ // Also check if [] has nested object properties (like [].filter, [].name)
1808
+ // If so, [] items are objects with properties, not pure functions to be called
1809
+ // This handles cases where the schema shows [].filter = object but doesn't
1810
+ // have explicit [0] entries
1811
+ const genericArrayPath = `${arrayContainerPath}[]`;
1812
+ const hasNestedProperties = Object.keys(relevantReturnValueSchema).some((k) => {
1813
+ // Check for paths like "arrayContainerPath[].propertyName" (not [].())
1814
+ return (k.startsWith(genericArrayPath + '.') &&
1815
+ !k.startsWith(genericArrayPath + '.('));
1816
+ });
1817
+ if (!hasNonFunctionSpecificIndices && !hasNestedProperties) {
1818
+ returnValueSection.returnsFunctionArgs = [];
1819
+ }
873
1820
  }
874
1821
  }
875
1822
  }
@@ -890,7 +1837,8 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
890
1837
  }
891
1838
  // If the next part is an object with nested content, continue processing
892
1839
  // This handles paths like functionCallReturnValue.selectedOptions.elementOptions[]
893
- if (nextValue === 'object' || nextValue === 'array') {
1840
+ // Also handles union types like 'array | undefined' or 'object | undefined'
1841
+ if (nextValue?.includes('object') || nextValue?.includes('array')) {
894
1842
  continue;
895
1843
  }
896
1844
  }
@@ -1020,7 +1968,12 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
1020
1968
  relevantPart.isArray = true;
1021
1969
  relevantPart.isGenericArray = true;
1022
1970
  }
1023
- if (!hasNestedFunction) {
1971
+ // Check if there are remaining parts after functionCallReturnValue that need processing
1972
+ // (e.g., data properties like useQuery().functionCallReturnValue.data)
1973
+ const hasRemainingPartsAfterReturnValue = nextPart &&
1974
+ (isFunctionCallReturnValue(nextPart) ||
1975
+ (isFunctionCallReturnValue(parts[i]) && i < parts.length - 1));
1976
+ if (!hasNestedFunction && !hasRemainingPartsAfterReturnValue) {
1024
1977
  // Before breaking, check if this function returns an array
1025
1978
  // by looking for a functionCallReturnValue: 'array' entry in the schema
1026
1979
  if (relevantPart && part.endsWith(')')) {
@@ -1045,9 +1998,24 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
1045
1998
  returnValueSection = relevantPart;
1046
1999
  }
1047
2000
  }
2001
+ // Post-processing: When the root functionCallReturnValue is typed as "function" but the
2002
+ // return value also has nested properties (methods like .from(), .auth, etc.), it's actually
2003
+ // an object, not a function to be called. Clear returnsFunctionArgs to prevent double-wrapping
2004
+ // (adding an extra () => { return { ... } } wrapper and ["()"] data paths).
2005
+ // This handles cases like Supabase's createClient() which returns an object with methods.
2006
+ // Only applied to the root level - nested parts that are functions with methods (like
2007
+ // useSearchParams()[1] which is a setter function with .set() and .delete()) should keep
2008
+ // their returnsFunctionArgs since they genuinely ARE functions.
2009
+ if (returnValueParts.returnsFunctionArgs &&
2010
+ returnValueParts.returnsFunctionArgs.length === 0 &&
2011
+ returnValueParts.nested &&
2012
+ returnValueParts.nested.length > 0) {
2013
+ returnValueParts.returnsFunctionArgs = undefined;
2014
+ }
1048
2015
  const contents = constructReturnValueString(returnValueParts);
1049
2016
  if (mockNameParts.length > 1) {
1050
2017
  const originalLib = `${mockNameParts[0]}__cyOriginal`;
2018
+ const skipOriginalSpread = options?.skipOriginalSpread;
1051
2019
  const subPart = (parts, originalLib) => {
1052
2020
  const part = parts.shift();
1053
2021
  if (!isValidKey(part))
@@ -1055,7 +2023,9 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
1055
2023
  const isLast = parts.length === 0;
1056
2024
  const partContents = isLast
1057
2025
  ? contents
1058
- : `...${originalLib}.${part},\n${subPart(parts, originalLib)}`;
2026
+ : skipOriginalSpread
2027
+ ? subPart(parts, originalLib)
2028
+ : `...${originalLib}.${part},\n${subPart(parts, originalLib)}`;
1059
2029
  let code = `${part}: {\n${indent(partContents)}\n}`;
1060
2030
  if (part.includes('(') || (isFunction && isLast)) {
1061
2031
  const args = funcArgs(part)
@@ -1065,28 +2035,30 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
1065
2035
  }
1066
2036
  return code;
1067
2037
  };
1068
- const returnParts = [
1069
- `...${mockNameParts[0]}__cyOriginal`,
1070
- subPart(mockNameParts.slice(1), originalLib),
1071
- ].filter(Boolean);
1072
- return `const ${mockNameParts[0]} = {\n${indent(returnParts.join(',\n'))}\n};`;
2038
+ const returnParts = skipOriginalSpread
2039
+ ? [subPart(mockNameParts.slice(1), originalLib)]
2040
+ : [
2041
+ `...${mockNameParts[0]}__cyOriginal`,
2042
+ subPart(mockNameParts.slice(1), originalLib),
2043
+ ];
2044
+ return `const ${mockNameParts[0]} = {\n${indent(returnParts.filter(Boolean).join(',\n'))}\n};`;
1073
2045
  }
1074
2046
  else if (isFunction) {
1075
2047
  // For headers() and cookies() from next/headers, add common iterator methods
1076
2048
  // These are needed when the mock is passed to functions that use .entries(), .keys(), etc.
1077
2049
  // (e.g., Object.fromEntries(headers.entries()) in buildLegacyHeaders)
1078
- const needsIteratorMethods = mockName === 'headers' || mockName === 'cookies';
2050
+ const needsIteratorMethods = baseMockName === 'headers' || baseMockName === 'cookies';
1079
2051
  let enhancedContents = contents;
1080
2052
  if (needsIteratorMethods && contents.trim().startsWith('{')) {
1081
2053
  // Add iterator methods that operate on the scenario data
1082
- // Use canonical key if provided, otherwise fall back to legacy format
1083
- const dataKey = canonicalKey || `${mockName}()`;
2054
+ // Use the dataKey (original call signature or canonical key)
2055
+ const quotedDataKey = quotePropertyKey(dataKey);
1084
2056
  const iteratorMethods = `,
1085
- entries: () => Object.entries(scenarios().data()?.["${dataKey}"] || {}),
1086
- keys: () => Object.keys(scenarios().data()?.["${dataKey}"] || {}),
1087
- values: () => Object.values(scenarios().data()?.["${dataKey}"] || {}),
1088
- forEach: (fn) => Object.entries(scenarios().data()?.["${dataKey}"] || {}).forEach(([k, v]) => fn(v, k)),
1089
- has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${dataKey}"] || {}, key)`;
2057
+ entries: () => Object.entries(scenarios().data()?.${quotedDataKey} || {}),
2058
+ keys: () => Object.keys(scenarios().data()?.${quotedDataKey} || {}),
2059
+ values: () => Object.values(scenarios().data()?.${quotedDataKey} || {}),
2060
+ forEach: (fn) => Object.entries(scenarios().data()?.${quotedDataKey} || {}).forEach(([k, v]) => fn(v, k)),
2061
+ has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.${quotedDataKey} || {}, key)`;
1090
2062
  // Insert before the closing brace (handle trailing whitespace)
1091
2063
  enhancedContents = contents.replace(/\}\s*$/, iteratorMethods + '\n}');
1092
2064
  }
@@ -1096,29 +2068,52 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
1096
2068
  // `new ClassName("arg")` wouldn't create the expected instance.
1097
2069
  // For Error subclasses (detected by name ending in "Error"), extend Error for proper error handling.
1098
2070
  if (entityType === 'class') {
1099
- const isErrorSubclass = mockName.endsWith('Error');
1100
- const baseClass = isErrorSubclass ? 'Error' : 'Object';
2071
+ const isErrorSubclass = baseMockName.endsWith('Error');
1101
2072
  const superCall = isErrorSubclass ? 'super(message);' : '';
1102
2073
  const nameAssignment = isErrorSubclass
1103
- ? `this.name = '${mockName}';`
2074
+ ? `this.name = '${baseMockName}';`
1104
2075
  : '';
1105
- // Use canonical key if provided, otherwise fall back to legacy format
1106
- const dataKey = canonicalKey || `${mockName}()`;
1107
- return `class ${mockName}${isErrorSubclass ? ' extends Error' : ''} {
2076
+ // Use the base class name for the class definition, not the call-signature-derived name.
2077
+ // When mockName is "StatsCalculator(supabase)", baseMockName is "StatsCalculator"
2078
+ // and derivedFunctionName would be "StatsCalculator_supabase" which is wrong.
2079
+ // Classes are instantiated with `new ClassName(args)` so the name must match the original.
2080
+ const className = baseMockName;
2081
+ // Use the already-generated contents (which has proper function wrappers for methods)
2082
+ // instead of raw scenarios().data() which would create non-callable string-keyed properties.
2083
+ // For classes with methods like calculateStats(), the contents will have:
2084
+ // { calculateStats: (...args) => scenarios().data()?.["key"]?.["calculateStats(...)"], ... }
2085
+ // which makes methods callable on the instance.
2086
+ const classContents = enhancedContents.trim().startsWith('{')
2087
+ ? enhancedContents
2088
+ : `scenarios().data()?.${quotePropertyKey(dataKey)} || {}`;
2089
+ return `class ${className}${isErrorSubclass ? ' extends Error' : ''} {
1108
2090
  constructor(message) {
1109
2091
  ${superCall}
1110
2092
  ${nameAssignment}
1111
- Object.assign(this, scenarios().data()?.["${dataKey}"] || {});
2093
+ Object.assign(this, ${classContents});
1112
2094
  }
1113
2095
  }`;
1114
2096
  }
1115
- // For variable-qualified mocks, use underscore separator in the function name
1116
- // e.g., "entityDiffFetcher <- useFetcher" becomes "useFetcher_entityDiffFetcher"
1117
- // For indexed qualifiers like "data[1]", convert to safe identifier: "useFetcher_data_1"
1118
- // EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
1119
- const safeFunctionName = variableQualifier && !options?.keepOriginalFunctionName
1120
- ? `${baseMockName}_${safeVariableQualifier(variableQualifier)}`
1121
- : baseMockName;
2097
+ // Generate safe function name:
2098
+ // 1. For call signatures: use derivedFunctionName
2099
+ // e.g., "useFetcher<User>()" becomes "useFetcher_User"
2100
+ // e.g., "db.select(usersQuery)" becomes "db_select_usersQuery"
2101
+ // 2. With uniqueFunctionSuffix option: append suffix for unique naming
2102
+ // e.g., baseMockName = "useFetcher", suffix = "entityDiffFetcher" -> "useFetcher_entityDiffFetcher"
2103
+ // 3. EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
2104
+ let safeFunctionName;
2105
+ if (options?.keepOriginalFunctionName) {
2106
+ safeFunctionName = baseMockName;
2107
+ }
2108
+ else if (options?.uniqueFunctionSuffix) {
2109
+ safeFunctionName = `${baseMockName}_${options.uniqueFunctionSuffix}`;
2110
+ }
2111
+ else if (mockNameIsCallSignature && derivedFunctionName) {
2112
+ safeFunctionName = derivedFunctionName;
2113
+ }
2114
+ else {
2115
+ safeFunctionName = baseMockName;
2116
+ }
1122
2117
  // Check if this function returns a function (detected by double-call pattern: mockName(args)())
1123
2118
  // This happens when the schema has keys like "wrapThrows(() => JSON.parse(savedFilters))()"
1124
2119
  // where the function call is immediately followed by another call.
@@ -1154,20 +2149,57 @@ export default function constructMockCode(mockName, dependencySchemas, entityTyp
1154
2149
  return true;
1155
2150
  return false;
1156
2151
  });
2152
+ // Use ...args to accept any number of arguments - prevents TypeScript errors
2153
+ // like "Expected 0 arguments, but got X" when caller passes arguments
1157
2154
  // For higher-order functions, wrap the return in an arrow function
1158
2155
  // so that mockFunc(arg)() works correctly (outer call returns a function, inner call gets the data)
1159
2156
  const returnValue = isHigherOrderFunction
1160
- ? `() => ${safeFunctionName}ReturnValue`
1161
- : `${safeFunctionName}ReturnValue`;
1162
- return `const ${safeFunctionName}ReturnValue = ${enhancedContents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${safeFunctionName}() {\n${indent(`return ${returnValue};`)}\n}`;
2157
+ ? `() => (${enhancedContents})`
2158
+ : enhancedContents;
2159
+ // Inline the return value directly in the function to avoid module-level const
2160
+ // that would be evaluated before scenario context is ready
2161
+ // Add fallback for simple data path returns to prevent undefined errors (e.g., createTheme)
2162
+ // Only add fallback if returnValue is a simple data accessor (starts with scenarios().data())
2163
+ // and doesn't already have nested structure (object literal, array, or method chains like .map())
2164
+ const isSimpleDataPath = returnValue.startsWith('scenarios().data()') &&
2165
+ !returnValue.trim().startsWith('{') &&
2166
+ !returnValue.trim().startsWith('[') &&
2167
+ !returnValue.includes('.map('); // Exclude method chains
2168
+ const safeReturnValue = isSimpleDataPath
2169
+ ? `${returnValue} ?? {}`
2170
+ : returnValue;
2171
+ const refName = `_${safeFunctionName}Ref`;
2172
+ const assignment = `${refName}.current = ${safeReturnValue};`;
2173
+ const ifBlock = `if (!${refName}.current) {\n${indent(assignment)}\n}`;
2174
+ const body = `${ifBlock}\nreturn ${refName}.current;`;
2175
+ return [
2176
+ `// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)`,
2177
+ `const ${refName} = {`,
2178
+ ` current: null,`,
2179
+ `};`,
2180
+ `${isRootAsyncFunction ? 'async ' : ''}function ${safeFunctionName}(...args) {`,
2181
+ indent(body),
2182
+ `}`,
2183
+ ].join('\n');
1163
2184
  }
1164
2185
  else {
1165
- // For variable-qualified mocks, use underscore separator in the const name
1166
- // For indexed qualifiers like "data[1]", convert to safe identifier: "useFetcher_data_1"
1167
- // EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
1168
- const safeName = variableQualifier && !options?.keepOriginalFunctionName
1169
- ? `${baseMockName}_${safeVariableQualifier(variableQualifier)}`
1170
- : baseMockName;
2186
+ // Generate safe const name:
2187
+ // 1. For call signatures: use derivedFunctionName
2188
+ // 2. With uniqueFunctionSuffix option: append suffix for unique naming
2189
+ // 3. EXCEPTION: When keepOriginalFunctionName is true (for single-call cases), use the base name
2190
+ let safeName;
2191
+ if (options?.keepOriginalFunctionName) {
2192
+ safeName = baseMockName;
2193
+ }
2194
+ else if (options?.uniqueFunctionSuffix) {
2195
+ safeName = `${baseMockName}_${options.uniqueFunctionSuffix}`;
2196
+ }
2197
+ else if (mockNameIsCallSignature && derivedFunctionName) {
2198
+ safeName = derivedFunctionName;
2199
+ }
2200
+ else {
2201
+ safeName = baseMockName;
2202
+ }
1171
2203
  // Get any jsx-component properties that need to be preserved from the original
1172
2204
  const jsxProperties = getJsxComponentProperties(mockName, relevantReturnValueSchema);
1173
2205
  // If there are jsx-component properties, add them as references to the original