@codeyam/codeyam-cli 0.1.0-staging.6e699e5 → 0.1.0-staging.73a4bf4

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 (563) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +8 -8
  4. package/analyzer-template/packages/ai/index.ts +11 -2
  5. package/analyzer-template/packages/ai/package.json +2 -2
  6. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +100 -18
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
  8. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +41 -17
  9. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
  10. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +409 -50
  11. package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
  12. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +21 -6
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1007 -249
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +54 -3
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +60 -15
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +140 -14
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +393 -97
  24. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +33 -15
  25. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
  26. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +315 -6
  27. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
  28. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +49 -5
  29. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  30. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +649 -142
  31. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
  32. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
  33. package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
  34. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  35. package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
  36. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  37. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
  38. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
  39. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
  40. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
  41. package/analyzer-template/packages/analyze/index.ts +2 -0
  42. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  43. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  44. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  45. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  46. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  47. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  48. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  49. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  50. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +89 -9
  51. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
  52. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
  53. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  54. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
  55. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  56. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  57. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
  58. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
  59. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +87 -25
  60. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
  61. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
  62. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +571 -74
  63. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  64. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  65. package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
  66. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  67. package/analyzer-template/packages/aws/package.json +1 -1
  68. package/analyzer-template/packages/database/package.json +1 -1
  69. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  70. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  71. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  72. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  73. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  74. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  75. package/analyzer-template/packages/database/src/lib/kysely/db.ts +14 -1
  76. package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
  77. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
  78. package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
  79. package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
  80. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
  81. package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
  82. package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
  83. package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
  84. package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
  85. package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
  86. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  87. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  88. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  89. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
  90. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  91. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  92. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  93. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  94. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  95. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  96. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  97. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  98. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  99. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  100. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  102. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  103. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  104. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  105. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +11 -1
  106. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  107. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
  108. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
  109. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
  110. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  111. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
  112. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
  113. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
  114. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  115. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  116. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
  117. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
  118. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
  119. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
  120. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  121. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
  122. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  123. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
  124. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
  125. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
  126. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
  127. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
  128. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -1
  129. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  130. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +22 -1
  131. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  132. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts +3 -1
  133. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  134. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +23 -4
  135. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  136. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
  137. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
  138. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
  139. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  140. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  141. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  142. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  143. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  144. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  145. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
  146. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  147. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
  148. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  149. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
  150. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
  151. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  152. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  153. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  154. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  155. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  156. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  157. package/analyzer-template/packages/github/package.json +1 -1
  158. package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
  159. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +7 -0
  160. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
  161. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  162. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
  163. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
  164. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  165. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  166. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  167. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  168. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  169. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  170. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  171. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +93 -2
  172. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  173. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +108 -2
  174. package/analyzer-template/playwright/capture.ts +20 -8
  175. package/analyzer-template/playwright/captureStatic.ts +1 -1
  176. package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
  177. package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
  178. package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
  179. package/analyzer-template/project/constructMockCode.ts +92 -12
  180. package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
  181. package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
  182. package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
  183. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +11 -6
  184. package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
  185. package/analyzer-template/project/orchestrateCapture.ts +45 -6
  186. package/analyzer-template/project/start.ts +35 -11
  187. package/analyzer-template/project/writeMockDataTsx.ts +181 -8
  188. package/analyzer-template/project/writeScenarioComponents.ts +103 -12
  189. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  190. package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
  191. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  192. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  193. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
  194. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  195. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
  196. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  197. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
  198. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
  199. package/background/src/lib/virtualized/project/constructMockCode.js +77 -6
  200. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  201. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
  202. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
  203. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
  204. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  205. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
  206. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
  207. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +4 -4
  208. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  209. package/background/src/lib/virtualized/project/orchestrateCapture.js +38 -6
  210. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  211. package/background/src/lib/virtualized/project/start.js +32 -11
  212. package/background/src/lib/virtualized/project/start.js.map +1 -1
  213. package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
  214. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  215. package/background/src/lib/virtualized/project/writeScenarioComponents.js +85 -15
  216. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  217. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  218. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  219. package/codeyam-cli/scripts/apply-setup.js +180 -0
  220. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  221. package/codeyam-cli/src/cli.js +4 -0
  222. package/codeyam-cli/src/cli.js.map +1 -1
  223. package/codeyam-cli/src/codeyam-cli.js +18 -2
  224. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  225. package/codeyam-cli/src/commands/analyze.js +4 -2
  226. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  227. package/codeyam-cli/src/commands/baseline.js +2 -0
  228. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  229. package/codeyam-cli/src/commands/debug.js +9 -5
  230. package/codeyam-cli/src/commands/debug.js.map +1 -1
  231. package/codeyam-cli/src/commands/default.js +31 -20
  232. package/codeyam-cli/src/commands/default.js.map +1 -1
  233. package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
  234. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
  235. package/codeyam-cli/src/commands/init.js +49 -257
  236. package/codeyam-cli/src/commands/init.js.map +1 -1
  237. package/codeyam-cli/src/commands/memory.js +264 -0
  238. package/codeyam-cli/src/commands/memory.js.map +1 -0
  239. package/codeyam-cli/src/commands/recapture.js +2 -0
  240. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  241. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  242. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  243. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  244. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  245. package/codeyam-cli/src/commands/test-startup.js +2 -0
  246. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  247. package/codeyam-cli/src/commands/verify.js +14 -2
  248. package/codeyam-cli/src/commands/verify.js.map +1 -1
  249. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
  250. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  251. package/codeyam-cli/src/utils/analysisRunner.js +21 -2
  252. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  253. package/codeyam-cli/src/utils/analyzer.js +7 -0
  254. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  255. package/codeyam-cli/src/utils/backgroundServer.js +107 -19
  256. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  257. package/codeyam-cli/src/utils/generateReport.js +2 -2
  258. package/codeyam-cli/src/utils/install-skills.js +72 -47
  259. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  260. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  261. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  262. package/codeyam-cli/src/utils/progress.js +7 -0
  263. package/codeyam-cli/src/utils/progress.js.map +1 -1
  264. package/codeyam-cli/src/utils/queue/job.js +4 -0
  265. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  266. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  267. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  268. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  269. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  270. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
  271. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  272. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  273. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  274. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  275. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  276. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  277. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  278. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  279. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  280. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
  281. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  282. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
  283. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  284. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
  285. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  286. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  287. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  288. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  289. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  290. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  291. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  292. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  293. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  294. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  295. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  296. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  297. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  298. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  299. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  300. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  301. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  302. package/codeyam-cli/src/utils/rules/index.js +6 -0
  303. package/codeyam-cli/src/utils/rules/index.js.map +1 -0
  304. package/codeyam-cli/src/utils/rules/parser.js +83 -0
  305. package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
  306. package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
  307. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
  308. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  309. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  310. package/codeyam-cli/src/utils/rules/staleness.js +137 -0
  311. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
  312. package/codeyam-cli/src/utils/serverState.js +37 -10
  313. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  314. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +21 -44
  315. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  316. package/codeyam-cli/src/webserver/app/lib/database.js +21 -6
  317. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  318. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  319. package/codeyam-cli/src/webserver/backgroundServer.js +50 -0
  320. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  321. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-D9i_zSlY.js +1 -0
  322. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-BLlhOa3C.js +11 -0
  323. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-De5b5pC7.js} +1 -1
  324. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-CzdG5I7z.js} +1 -1
  325. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-Bclf8Hka.js} +1 -1
  326. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-Ce-byqKl.js} +2 -2
  327. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-DEMHrl7v.js} +1 -1
  328. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-B1LNGboS.js} +1 -1
  329. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-B0Ll1DjK.js} +1 -1
  330. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-D4TZhLuw.js → ReportIssueModal-CVOvmCKb.js} +3 -13
  331. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-L0DWHa_L.js} +1 -1
  332. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DEx02QDa.js → ScenarioViewer-D54Mmpwi.js} +3 -3
  333. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-C7PFQfXy.js} +1 -1
  334. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-CKTtYlBU.js} +1 -1
  335. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DoLIqZX2.js → activity.(_tab)-CdziRIWU.js} +6 -16
  336. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-CPXtdaWm.js +17 -0
  337. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  338. package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
  339. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  340. package/codeyam-cli/src/webserver/build/client/assets/book-open-Ch8b7GyQ.js +6 -0
  341. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-vJHJExlT.js} +1 -1
  342. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-BEyX4X6_.js} +12 -12
  343. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-rwynPZTW.js} +1 -1
  344. package/codeyam-cli/src/webserver/build/client/assets/copy-BBSpeBYf.js +11 -0
  345. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-DHVDauuc.js} +1 -1
  346. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-B9_ZqelV.js +1 -0
  347. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-BOPComvD.js +16 -0
  348. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-Cfw__yQa.js} +1 -1
  349. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-BIDUUrI3.js} +1 -1
  350. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-BEqewwtZ.js} +1 -1
  351. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-Dxqz8ygt.js} +1 -1
  352. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-CYnF5KWN.js} +1 -1
  353. package/codeyam-cli/src/webserver/build/client/assets/files-B_dAq2PQ.js +1 -0
  354. package/codeyam-cli/src/webserver/build/client/assets/{git-B4RJRvYB.js → git-BHPqH3Ch.js} +8 -8
  355. package/codeyam-cli/src/webserver/build/client/assets/globals-BJGhRykz.css +1 -0
  356. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-DgAAopZk.js} +1 -1
  357. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-viijWaN6.js} +1 -1
  358. package/codeyam-cli/src/webserver/build/client/assets/labs-ChoAe3xq.js +1 -0
  359. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-LGi2eKI5.js} +1 -1
  360. package/codeyam-cli/src/webserver/build/client/assets/manifest-87493a32.js +1 -0
  361. package/codeyam-cli/src/webserver/build/client/assets/memory-D9eA6kTo.js +78 -0
  362. package/codeyam-cli/src/webserver/build/client/assets/pause-DxJFmMsK.js +11 -0
  363. package/codeyam-cli/src/webserver/build/client/assets/root-C3r0p_7H.js +62 -0
  364. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-Cu3QE9E5.js} +1 -1
  365. package/codeyam-cli/src/webserver/build/client/assets/settings-KH9TdArD.js +1 -0
  366. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-D9Fkx0-d.js} +1 -1
  367. package/codeyam-cli/src/webserver/build/client/assets/terminal-dAhIBEcd.js +11 -0
  368. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-C4CYTEeP.js} +1 -1
  369. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-CLPnITMB.js} +1 -1
  370. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-DmGI38Et.js} +1 -1
  371. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-BK0S88PB.js} +1 -1
  372. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-CJ-JqR0l.js} +1 -1
  373. package/codeyam-cli/src/webserver/build/server/assets/index-CkkmL6r5.js +1 -0
  374. package/codeyam-cli/src/webserver/build/server/assets/server-build-iBGjHYtO.js +259 -0
  375. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  376. package/codeyam-cli/src/webserver/build-info.json +5 -5
  377. package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
  378. package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
  379. package/codeyam-cli/templates/{codeyam-power-rules-hook.sh → codeyam-memory-hook.sh} +22 -23
  380. package/codeyam-cli/templates/codeyam-memory.md +396 -0
  381. package/codeyam-cli/templates/codeyam-new-rule.md +13 -0
  382. package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
  383. package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
  384. package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
  385. package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
  386. package/codeyam-cli/templates/rule-notification-hook.py +56 -0
  387. package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
  388. package/codeyam-cli/templates/rules-instructions.md +132 -0
  389. package/package.json +15 -13
  390. package/packages/ai/index.js +3 -2
  391. package/packages/ai/index.js.map +1 -1
  392. package/packages/ai/src/lib/analyzeScope.js +82 -13
  393. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  394. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  395. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  396. package/packages/ai/src/lib/astScopes/methodSemantics.js +41 -17
  397. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  398. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  399. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  400. package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
  401. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  402. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  403. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  404. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +776 -171
  405. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  406. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  407. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  408. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  409. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  410. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  411. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  412. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +52 -3
  413. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  414. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +55 -11
  415. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  416. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  417. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  418. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
  419. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  420. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  421. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  422. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  423. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  424. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +333 -86
  425. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  426. package/packages/ai/src/lib/dataStructureChunking.js +26 -11
  427. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  428. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  429. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  430. package/packages/ai/src/lib/generateEntityScenarioData.js +227 -4
  431. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  432. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  433. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  434. package/packages/ai/src/lib/generateExecutionFlows.js +26 -4
  435. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  436. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
  437. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  438. package/packages/ai/src/lib/isolateScopes.js +39 -3
  439. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  440. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  441. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  442. package/packages/ai/src/lib/mergeStatements.js +70 -51
  443. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  444. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  445. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  446. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  447. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  448. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  449. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  450. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  451. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  452. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  453. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
  454. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  455. package/packages/analyze/index.js +1 -0
  456. package/packages/analyze/index.js.map +1 -1
  457. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  458. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  459. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  460. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  461. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  462. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  463. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  464. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  465. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  466. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  467. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  468. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  469. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  470. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  471. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  472. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  473. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +65 -7
  474. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  475. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
  476. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  477. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
  478. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  479. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  480. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  481. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  482. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  483. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  484. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  485. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  486. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  487. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
  488. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  489. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
  490. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  491. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +75 -21
  492. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  493. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
  494. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  495. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  496. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  497. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +478 -54
  498. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  499. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  500. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  501. package/packages/analyze/src/lib/index.js +1 -0
  502. package/packages/analyze/src/lib/index.js.map +1 -1
  503. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  504. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  505. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  506. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  507. package/packages/database/src/lib/analysisToDb.js +1 -1
  508. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  509. package/packages/database/src/lib/branchToDb.js +1 -1
  510. package/packages/database/src/lib/branchToDb.js.map +1 -1
  511. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  512. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  513. package/packages/database/src/lib/commitToDb.js +1 -1
  514. package/packages/database/src/lib/commitToDb.js.map +1 -1
  515. package/packages/database/src/lib/fileToDb.js +1 -1
  516. package/packages/database/src/lib/fileToDb.js.map +1 -1
  517. package/packages/database/src/lib/kysely/db.js +11 -1
  518. package/packages/database/src/lib/kysely/db.js.map +1 -1
  519. package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
  520. package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  521. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  522. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  523. package/packages/database/src/lib/loadAnalyses.js +45 -2
  524. package/packages/database/src/lib/loadAnalyses.js.map +1 -1
  525. package/packages/database/src/lib/loadAnalysis.js +8 -0
  526. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  527. package/packages/database/src/lib/loadBranch.js +11 -1
  528. package/packages/database/src/lib/loadBranch.js.map +1 -1
  529. package/packages/database/src/lib/loadCommit.js +7 -0
  530. package/packages/database/src/lib/loadCommit.js.map +1 -1
  531. package/packages/database/src/lib/loadCommits.js +22 -1
  532. package/packages/database/src/lib/loadCommits.js.map +1 -1
  533. package/packages/database/src/lib/loadEntities.js +23 -4
  534. package/packages/database/src/lib/loadEntities.js.map +1 -1
  535. package/packages/database/src/lib/loadEntityBranches.js +9 -0
  536. package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
  537. package/packages/database/src/lib/projectToDb.js +1 -1
  538. package/packages/database/src/lib/projectToDb.js.map +1 -1
  539. package/packages/database/src/lib/saveFiles.js +1 -1
  540. package/packages/database/src/lib/saveFiles.js.map +1 -1
  541. package/packages/database/src/lib/scenarioToDb.js +1 -1
  542. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  543. package/packages/database/src/lib/updateCommitMetadata.js +5 -4
  544. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  545. package/packages/utils/src/lib/fs/rsyncCopy.js +93 -2
  546. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  547. package/scripts/finalize-analyzer.cjs +8 -76
  548. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-BXhEawa3.js +0 -1
  549. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BRb-0kQl.js +0 -1
  550. package/codeyam-cli/src/webserver/build/client/assets/entity._sha._-C2N4Op8e.js +0 -23
  551. package/codeyam-cli/src/webserver/build/client/assets/files-Cs4MdYtv.js +0 -1
  552. package/codeyam-cli/src/webserver/build/client/assets/git-commit-horizontal-CysbcZxi.js +0 -6
  553. package/codeyam-cli/src/webserver/build/client/assets/globals-DMUaGAqV.css +0 -1
  554. package/codeyam-cli/src/webserver/build/client/assets/manifest-f874c610.js +0 -1
  555. package/codeyam-cli/src/webserver/build/client/assets/root-Bz5TunQg.js +0 -57
  556. package/codeyam-cli/src/webserver/build/client/assets/rules-hEkvVw2-.js +0 -97
  557. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  558. package/codeyam-cli/src/webserver/build/server/assets/index-967OuJoF.js +0 -1
  559. package/codeyam-cli/src/webserver/build/server/assets/server-build-DRTmerg9.js +0 -257
  560. package/codeyam-cli/templates/codeyam:diagnose.md +0 -650
  561. package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
  562. package/codeyam-cli/templates/codeyam:power-rules.md +0 -447
  563. /package/codeyam-cli/src/webserver/build/client/assets/{api.rules-l0sNRNKZ.js → api.agent-transcripts-l0sNRNKZ.js} +0 -0
@@ -192,6 +192,36 @@ const safeString = (s: string, level: number) => {
192
192
  return s?.replace ? s.replace(/"/g, "'").replace(/\n/g, '\\n') : s;
193
193
  };
194
194
 
195
+ /**
196
+ * Clean up malformed LLM-generated function values.
197
+ * The LLM sometimes generates function values with an invalid "(function)" prefix like:
198
+ * - "(function)() => {}"
199
+ * - "(function)(event) => {}"
200
+ * - "(function)(id) => {}"
201
+ *
202
+ * This strips the prefix and adds TypeScript `any` type annotations to parameters.
203
+ * Returns null if the value doesn't match the malformed pattern.
204
+ */
205
+ const cleanMalformedFunctionValue = (value: string): string | null => {
206
+ // Match "(function)" followed by optional params in parens, then "=>"
207
+ const match = value.match(/^\(function\)(\([^)]*\))\s*=>\s*(.*)$/);
208
+ if (!match) return null;
209
+
210
+ const [, paramsWithParens, body] = match;
211
+
212
+ // Extract parameter names and add `: any` type annotation
213
+ // e.g., "(event)" -> "(event: any)", "()" -> "()"
214
+ const params = paramsWithParens.slice(1, -1).trim(); // Remove outer parens
215
+ const typedParams = params
216
+ ? params
217
+ .split(',')
218
+ .map((p) => `${p.trim()}: any`)
219
+ .join(', ')
220
+ : '';
221
+
222
+ return `(${typedParams}) => ${body}`;
223
+ };
224
+
195
225
  /**
196
226
  * Check if a mock key's schema indicates it should be instantiated as a Map.
197
227
  * A Map is indicated by:
@@ -310,6 +340,38 @@ function extractAllKeys(obj: JsonTypeDefinition | undefined): string[] {
310
340
  */
311
341
  const BARE_TYPE_MARKERS = ['function', 'async-function'];
312
342
 
343
+ /**
344
+ * Check if a string is a TypeScript arrow function type annotation rather than
345
+ * a valid JavaScript arrow function expression.
346
+ *
347
+ * TypeScript arrow types look like function expressions (they contain '=>') but
348
+ * their "body" is a type name, not a JS expression:
349
+ * - "() => void"
350
+ * - "(event: MouseEvent) => void"
351
+ * - "() => string"
352
+ * - "() => Promise<void>"
353
+ * - "(id: string, name: string) => boolean"
354
+ *
355
+ * Valid JS arrow functions have actual expression bodies:
356
+ * - "() => {}"
357
+ * - "() => 'hello'"
358
+ * - "(x) => x + 1"
359
+ * - "() => { console.log('hi'); }"
360
+ */
361
+ const ARROW_TYPE_RETURN_TYPES =
362
+ /^(void|string|number|boolean|any|unknown|never|null|undefined|object|Date|Promise<\w+>)$/i;
363
+
364
+ const isArrowFunctionTypeAnnotation = (value: string): boolean => {
365
+ const arrowIndex = value.indexOf('=>');
366
+ if (arrowIndex === -1) return false;
367
+
368
+ const body = value.slice(arrowIndex + 2).trim();
369
+
370
+ // A real JS function would have {}, an expression, a string literal, etc.
371
+ // A type annotation has a bare type keyword as the "body".
372
+ return ARROW_TYPE_RETURN_TYPES.test(body);
373
+ };
374
+
313
375
  /**
314
376
  * Check if a value is a bare function type marker that should be filtered out.
315
377
  * These markers indicate the LLM detected a function but couldn't generate meaningful mock data.
@@ -336,6 +398,59 @@ const isBareTypeMarker = (value: unknown): boolean => {
336
398
  return false;
337
399
  };
338
400
 
401
+ /**
402
+ * Escape newlines that appear inside string literals within a code string,
403
+ * while preserving structural newlines (those between statements/lines of code).
404
+ *
405
+ * This handles cases where LLM generates function bodies like:
406
+ * - "() => { console.log('line1\nline2'); }" - escape the \n inside the string
407
+ * - "() => {\n console.log('x');\n}" - preserve structural \n between statements
408
+ * - "() => Promise.resolve('a\nb')" - escape the \n inside the string argument
409
+ *
410
+ * The algorithm tracks whether we're inside a string literal (single, double, or
411
+ * backtick quotes) and only escapes newlines that appear within quotes.
412
+ */
413
+ const escapeNewlinesInStringLiterals = (code: string): string => {
414
+ let result = '';
415
+ let inString = false;
416
+ let stringChar = ''; // The quote character that started the current string
417
+
418
+ for (let i = 0; i < code.length; i++) {
419
+ const char = code[i];
420
+ const prevChar = i > 0 ? code[i - 1] : '';
421
+
422
+ // Check for string literal boundaries (single, double, or backtick quotes)
423
+ // Skip escaped quotes (preceded by backslash)
424
+ if ((char === '"' || char === "'" || char === '`') && prevChar !== '\\') {
425
+ if (!inString) {
426
+ // Starting a string literal
427
+ inString = true;
428
+ stringChar = char;
429
+ } else if (char === stringChar) {
430
+ // Ending the current string literal
431
+ inString = false;
432
+ stringChar = '';
433
+ }
434
+ // If char is a different quote type while in a string, it's just a character
435
+ }
436
+
437
+ // Escape newlines only when inside a string literal
438
+ if (char === '\n') {
439
+ if (inString) {
440
+ // Inside a string literal - escape the newline
441
+ result += '\\n';
442
+ } else {
443
+ // Outside string - keep the structural newline
444
+ result += char;
445
+ }
446
+ } else {
447
+ result += char;
448
+ }
449
+ }
450
+
451
+ return result;
452
+ };
453
+
339
454
  /**
340
455
  * Normalize mock data by merging entries that have the same normalized function name.
341
456
  * e.g., "useLastLogLine(projectSlug, !!simulatingEntitySha)" and
@@ -734,13 +849,19 @@ const jsonToCode = (
734
849
  stringValue.startsWith('Promise.') ||
735
850
  stringValue.startsWith('new Promise');
736
851
 
852
+ // Check if the string contains newlines (potential issue for string literals)
853
+ const hasNewlines = stringValue.includes('\n');
854
+
737
855
  // Handle special type indicators that need transformation
738
856
  let outputValue: string;
739
857
  if (stringValue === 'promise' || looksLikePromise) {
740
858
  // The key is a function call (e.g., "revalidate()"), so output a function
741
859
  // that returns a Promise, not the Promise itself
860
+ // Important: Escape newlines inside Promise expressions to avoid
861
+ // "unterminated string literal" errors when the Promise contains
862
+ // multi-line string arguments like Promise.resolve('line1\nline2')
742
863
  const promiseExpr = looksLikePromise
743
- ? stringValue
864
+ ? stringValue.replace(/\n/g, '\\n')
744
865
  : 'Promise.resolve()';
745
866
  outputValue = `() => ${promiseExpr}`;
746
867
  console.log(
@@ -752,10 +873,49 @@ const jsonToCode = (
752
873
  `CodeYam: Nested func transform (string->function): "${key}" -> "${funcName}": () => {}`,
753
874
  );
754
875
  } else if (looksLikeFunction) {
755
- outputValue = stringValue;
756
- console.log(
757
- `CodeYam: Nested func transform (string): "${key}" -> "${funcName}": ${stringValue.substring(0, 30)}...`,
758
- );
876
+ // Check for "[native code]" in function body — this is what
877
+ // Function.prototype.toString() returns for built-in functions.
878
+ // The LLM sometimes generates "function () { [native code] }" which
879
+ // is not valid JavaScript (the "[" is parsed as array destructuring).
880
+ if (stringValue.includes('[native code]')) {
881
+ outputValue = '() => {}';
882
+ console.log(
883
+ `CodeYam: Nested func transform (native-code->noop): "${key}" -> "${funcName}": () => {}`,
884
+ );
885
+ } else if (cleanMalformedFunctionValue(stringValue)) {
886
+ // Check for malformed LLM-generated function values like "(function)() => {}"
887
+ // These have an invalid "(function)" prefix that must be stripped
888
+ outputValue = cleanMalformedFunctionValue(stringValue)!;
889
+ console.log(
890
+ `CodeYam: Nested func transform (malformed->clean): "${key}" -> "${funcName}": ${outputValue}`,
891
+ );
892
+ } else if (isArrowFunctionTypeAnnotation(stringValue)) {
893
+ // TypeScript arrow function type annotations like "() => void",
894
+ // "(event: MouseEvent) => void", "() => Promise<void>" contain '=>'
895
+ // so they pass the looksLikeFunction check, but they are TYPE syntax,
896
+ // not valid JavaScript expressions. Convert to a no-op function.
897
+ outputValue = '() => {}';
898
+ console.log(
899
+ `CodeYam: Nested func transform (type-annotation->function): "${key}" -> "${funcName}": () => {}`,
900
+ );
901
+ } else {
902
+ // Handle newlines in function expressions:
903
+ // - Newlines inside string literals must be escaped to avoid
904
+ // "unterminated string literal" errors
905
+ // - Structural newlines (between statements) should be kept as-is
906
+ // to produce valid multi-line JavaScript
907
+ //
908
+ // We escape ONLY newlines that appear inside string literals (single,
909
+ // double, or template quotes). Structural newlines are preserved.
910
+ if (hasNewlines) {
911
+ outputValue = escapeNewlinesInStringLiterals(stringValue);
912
+ } else {
913
+ outputValue = stringValue;
914
+ }
915
+ console.log(
916
+ `CodeYam: Nested func transform (string): "${key}" -> "${funcName}": ${stringValue.substring(0, 30)}...`,
917
+ );
918
+ }
759
919
  } else {
760
920
  // Plain string value - must be quoted
761
921
  outputValue = `"${safeString(stringValue, level)}"`;
@@ -783,9 +943,22 @@ const jsonToCode = (
783
943
  if (isBareTypeMarker(stringValue)) {
784
944
  continue;
785
945
  }
786
- keyStrings.push(
787
- `${levelSpacing}"${safeString(key, level)}": "${safeString(stringValue, level)}"`,
788
- );
946
+ // Check for malformed LLM-generated function values like "(function)(id) => {}"
947
+ // These can appear on plain keys (e.g., "closeToast") and need to be output as
948
+ // actual functions, not quoted strings
949
+ const cleanedPlainKeyFn = cleanMalformedFunctionValue(stringValue);
950
+ if (cleanedPlainKeyFn) {
951
+ keyStrings.push(
952
+ `${levelSpacing}"${safeString(key, level)}": ${cleanedPlainKeyFn}`,
953
+ );
954
+ console.log(
955
+ `CodeYam: Plain key func transform (malformed->clean): "${key}": ${cleanedPlainKeyFn}`,
956
+ );
957
+ } else {
958
+ keyStrings.push(
959
+ `${levelSpacing}"${safeString(key, level)}": "${safeString(stringValue, level)}"`,
960
+ );
961
+ }
789
962
  }
790
963
  } else {
791
964
  // Skip plain keys that have function-call versions (at the same nesting level where
@@ -987,10 +987,19 @@ function addMockToContent(
987
987
  /[.*+?^${}()|[\]\\]/g,
988
988
  '\\$&',
989
989
  );
990
- // Create regex that matches the call (with optional whitespace variations)
990
+ // Create regex that matches the call (with optional whitespace variations).
991
+ // TypeScript formatters commonly break type parameters across lines, e.g.:
992
+ // useLoaderData<
993
+ // typeof loader
994
+ // >()
995
+ // So we allow optional whitespace around < and > delimiters, not just
996
+ // where whitespace already exists in the call signature string.
991
997
  const callRegex = new RegExp(
992
- escapedCallSignature.replace(/\s+/g, '\\s*'),
993
- 'g',
998
+ escapedCallSignature
999
+ .replace(/\s+/g, '\\s*')
1000
+ .replace(/</g, '\\s*<\\s*')
1001
+ .replace(/>/g, '\\s*>\\s*'),
1002
+ 'gs',
994
1003
  );
995
1004
  fileContent = fileContent.replace(callRegex, `${mockFunctionName}()`);
996
1005
  }
@@ -1012,15 +1021,29 @@ function addMockToContent(
1012
1021
  rootAnalysis.metadata?.scenariosDataStructure?.dataForMocks;
1013
1022
 
1014
1023
  // Find matching call signature key in dataForMocks
1024
+ // IMPORTANT: First try exact match with type parameters (e.g., "useLoaderData<LoaderData>()")
1025
+ // to avoid picking the wrong variant (e.g., "useLoaderData<typeof loader>()" which may
1026
+ // have different properties). Fall back to base name matching only if exact match fails.
1015
1027
  const hookBaseName = importedExport.name.split(/[<(]/)[0];
1016
- const callSignatureKey = dataForMocks
1017
- ? Object.keys(dataForMocks).find((key) => {
1028
+ const expectedKey = importedExport.calls?.[0];
1029
+ let callSignatureKey: string | undefined;
1030
+
1031
+ if (dataForMocks) {
1032
+ const keys = Object.keys(dataForMocks);
1033
+
1034
+ // First try exact match with the expected call signature
1035
+ if (expectedKey && keys.includes(expectedKey)) {
1036
+ callSignatureKey = expectedKey;
1037
+ } else {
1038
+ // Fall back to base name matching
1039
+ callSignatureKey = keys.find((key) => {
1018
1040
  // Split on ., <, or ( to get the true base name
1019
1041
  // This handles both "useFlags()" -> "useFlags" and "trpc.useUtils()" -> "trpc"
1020
1042
  const keyBaseName = key.split(/[.<(]/)[0];
1021
1043
  return keyBaseName === hookBaseName;
1022
- })
1023
- : undefined;
1044
+ });
1045
+ }
1046
+ }
1024
1047
 
1025
1048
  // Use the call signature if found, otherwise construct it
1026
1049
  const dataKey =
@@ -1061,18 +1084,36 @@ function addMockToContent(
1061
1084
  // IMPORTANT: We inline scenarios().data() inside the function rather than
1062
1085
  // storing in a const - see comment in constructMockCode.ts for why.
1063
1086
  if (!mockCode) {
1064
- mockCode = `function ${importedExport.name}(...args) {
1065
- return scenarios().data()?.["${dataKey}"];
1087
+ mockCode = `// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)
1088
+ const _${importedExport.name}Ref = {
1089
+ current: null,
1090
+ };
1091
+ function ${importedExport.name}(...args) {
1092
+ if (!_${importedExport.name}Ref.current) {
1093
+ _${importedExport.name}Ref.current = scenarios().data()?.["${dataKey}"];
1094
+ }
1095
+ return _${importedExport.name}Ref.current;
1066
1096
  }`;
1067
1097
  }
1068
1098
  } else {
1069
1099
  // Helper to find matching call signature key from dataForMocks
1100
+ // IMPORTANT: First try exact match with type parameters (e.g., "useLoaderData<LoaderData>()")
1101
+ // to avoid picking the wrong variant. Fall back to base name matching only if needed.
1070
1102
  const hookBaseName = importedExport.name.split(/[<(]/)[0];
1103
+ const expectedKey = importedExport.calls?.[0];
1071
1104
  const findMatchingKey = (
1072
1105
  dataForMocks: Record<string, unknown> | undefined,
1073
1106
  ): string | undefined => {
1074
1107
  if (!dataForMocks) return undefined;
1075
- return Object.keys(dataForMocks).find((key) => {
1108
+ const keys = Object.keys(dataForMocks);
1109
+
1110
+ // First try exact match with the expected call signature
1111
+ if (expectedKey && keys.includes(expectedKey)) {
1112
+ return expectedKey;
1113
+ }
1114
+
1115
+ // Fall back to base name matching
1116
+ return keys.find((key) => {
1076
1117
  // Split on ., <, or ( to get the true base name
1077
1118
  // This handles both "useFlags()" -> "useFlags" and "trpc.useUtils()" -> "trpc"
1078
1119
  const keyBaseName = key.split(/[.<(]/)[0];
@@ -1131,8 +1172,15 @@ function addMockToContent(
1131
1172
  // IMPORTANT: We inline scenarios().data() inside the function rather than
1132
1173
  // storing in a const - see comment in constructMockCode.ts for why.
1133
1174
  if (!mockCode && dataKey) {
1134
- mockCode = `function ${importedExport.name}(...args) {
1135
- return scenarios().data()?.["${dataKey}"];
1175
+ mockCode = `// PATCHED: memoize to return stable reference (prevents infinite useEffect re-triggers)
1176
+ const _${importedExport.name}Ref = {
1177
+ current: null,
1178
+ };
1179
+ function ${importedExport.name}(...args) {
1180
+ if (!_${importedExport.name}Ref.current) {
1181
+ _${importedExport.name}Ref.current = scenarios().data()?.["${dataKey}"];
1182
+ }
1183
+ return _${importedExport.name}Ref.current;
1136
1184
  }`;
1137
1185
  }
1138
1186
  }
@@ -1205,6 +1253,21 @@ function addMockToContent(
1205
1253
  fileContent = fileContent.replace(importRegExp, '$1$2');
1206
1254
  }
1207
1255
 
1256
+ // Also handle namespace imports (import * as foo from '...')
1257
+ // These need to be renamed to foo__cyOriginal when the mock code spreads from the original.
1258
+ // Note: We match any path (not just escapedImportPath) because the import path may have
1259
+ // been rewritten by transitive import handling before this code runs.
1260
+ if (shouldRenameToOriginal) {
1261
+ const namespaceImportRegExp = new RegExp(
1262
+ `(import\\s+\\*\\s+as\\s+)${escapeRegExp(firstPart)}(\\s+from\\s+['"][^'"]*['"])`,
1263
+ 'm',
1264
+ );
1265
+ fileContent = fileContent.replace(
1266
+ namespaceImportRegExp,
1267
+ `$1${firstPart}__cyOriginal$2`,
1268
+ );
1269
+ }
1270
+
1208
1271
  // Remove empty imports entirely to avoid partial commenting issues with multiline imports
1209
1272
  // This handles both single-line and multiline empty imports
1210
1273
  fileContent = fileContent.replace(
@@ -2916,6 +2979,34 @@ ${exportKeyword}const ${functionName} = new Proxy(() => scenarios().data()?.["${
2916
2979
  // Scenario: ${scenario.id} - ${scenario.name}
2917
2980
  `;
2918
2981
 
2982
+ // Final pass: Rename any namespace imports (import * as X from '...') that have
2983
+ // corresponding mock code using ...X__cyOriginal spread pattern.
2984
+ // This handles cases where:
2985
+ // 1. The import path was rewritten by transitive import handling
2986
+ // 2. The import wasn't caught by the earlier renaming logic
2987
+ // We scan for all __cyOriginal references in the mock code and ensure the imports are renamed.
2988
+ const cyOriginalReferences = fileContent.match(/\.\.\.(\w+)__cyOriginal/g);
2989
+ if (cyOriginalReferences) {
2990
+ const uniqueNames = [
2991
+ ...new Set(
2992
+ cyOriginalReferences.map((ref) =>
2993
+ ref.replace('...', '').replace('__cyOriginal', ''),
2994
+ ),
2995
+ ),
2996
+ ];
2997
+ for (const name of uniqueNames) {
2998
+ // Match namespace imports for this name that haven't been renamed yet
2999
+ const namespaceImportRegex = new RegExp(
3000
+ `(import\\s+\\*\\s+as\\s+)${escapeRegExp(name)}(\\s+from\\s+['"][^'"]*['"])`,
3001
+ 'g',
3002
+ );
3003
+ fileContent = fileContent.replace(
3004
+ namespaceImportRegex,
3005
+ `$1${name}__cyOriginal$2`,
3006
+ );
3007
+ }
3008
+ }
3009
+
2919
3010
  // Use the directive that was extracted at the beginning of processing
2920
3011
  // This ensures it stays at the very top even after imports are prepended
2921
3012
  // NOTE: We only preserve "use client" directives, NOT "use server" directives.
@@ -277,16 +277,17 @@ export default async function writeSimpleRoot(
277
277
  let mockKey: string | undefined;
278
278
 
279
279
  if (matchingKeys.length > 1) {
280
- // Parse root.tsx to find how this hook is used
281
- // Look for patterns like: const { prop1, prop2 } = useLoaderData()
282
- // or: const result = useLoaderData()
280
+ // Parse root.tsx to find how this hook is used, INCLUDING type parameters
281
+ // Look for patterns like: const { prop1, prop2 } = useLoaderData<LoaderData>()
282
+ // or: const result = useLoaderData<typeof loader>()
283
283
  const hookUsageRegex = new RegExp(
284
- `(?:const|let|var)\\s+(?:\\{([^}]+)\\}|([a-zA-Z_][a-zA-Z0-9_]*))\\s*=\\s*${entityName}(?:<[^>]*>)?\\s*\\(`,
284
+ `(?:const|let|var)\\s+(?:\\{([^}]+)\\}|([a-zA-Z_][a-zA-Z0-9_]*))\\s*=\\s*${entityName}(<[^>]+>)?\\s*\\(`,
285
285
  'g',
286
286
  );
287
287
 
288
288
  const matches = [...newContent.matchAll(hookUsageRegex)];
289
289
  const rootPropertyNames: string[] = [];
290
+ const typeParamsUsed: Set<string> = new Set();
290
291
 
291
292
  for (const match of matches) {
292
293
  if (match[1]) {
@@ -300,17 +301,26 @@ export default async function writeSimpleRoot(
300
301
  // Simple assignment: const result = ...
301
302
  rootPropertyNames.push(match[2]);
302
303
  }
304
+ // Capture type parameters used (e.g., "<LoaderData>", "<typeof loader>")
305
+ if (match[3]) {
306
+ typeParamsUsed.add(match[3]);
307
+ }
303
308
  }
304
309
 
305
- // Find a key that matches by call signature
306
- // For call signature format (e.g., "useLoaderData()"), just use the first match
307
- mockKey = matchingKeys[0];
310
+ // First, try to find a key that matches the exact type parameters used in the source
311
+ // e.g., if source has useLoaderData<LoaderData>(), prefer "useLoaderData<LoaderData>()" key
312
+ if (typeParamsUsed.size > 0) {
313
+ for (const typeParam of typeParamsUsed) {
314
+ const exactKey = `${entityName}${typeParam}()`;
315
+ if (matchingKeys.includes(exactKey)) {
316
+ mockKey = exactKey;
317
+ break;
318
+ }
319
+ }
320
+ }
308
321
 
309
- // Fallback: if no match found but there are multiple keys,
310
- // exclude the route's key (which we can identify from mockedImports variable names)
322
+ // Fallback: if no exact type parameter match, use the first match
311
323
  if (!mockKey) {
312
- // The route's variable names would be in its own analysis
313
- // For simplicity, just use the first key that's different from the most common pattern
314
324
  mockKey = matchingKeys[0];
315
325
  }
316
326
  } else if (matchingKeys.length === 1) {