@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.39719f5

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 (1063) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +25 -25
  4. package/analyzer-template/packages/ai/index.ts +7 -1
  5. package/analyzer-template/packages/ai/package.json +3 -3
  6. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +62 -18
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +101 -12
  8. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
  9. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +409 -50
  10. package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +21 -6
  12. package/analyzer-template/packages/ai/src/lib/completionCall.ts +114 -113
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1286 -262
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.ts +10 -3
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +47 -9
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +37 -15
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +140 -14
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
  24. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  25. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +367 -96
  26. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.ts +35 -0
  27. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +40 -13
  28. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
  29. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +393 -8
  30. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
  31. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +112 -5
  32. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  33. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +649 -142
  34. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
  35. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
  36. package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
  37. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  38. package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
  39. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  40. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
  41. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
  42. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
  43. package/analyzer-template/packages/analyze/index.ts +6 -1
  44. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  45. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +132 -33
  46. package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
  47. package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -0
  48. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  49. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  50. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  51. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  52. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  53. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  54. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +117 -11
  55. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +32 -40
  56. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
  57. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +22 -6
  58. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +13 -14
  59. package/analyzer-template/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.ts +21 -0
  60. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +82 -13
  61. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
  62. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
  63. package/analyzer-template/packages/analyze/src/lib/files/analyzeNextRoute.ts +8 -3
  64. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  65. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  66. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1352 -0
  67. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
  68. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +87 -25
  69. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +498 -28
  70. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +19 -9
  71. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +760 -100
  72. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  73. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  74. package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
  75. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  76. package/analyzer-template/packages/aws/package.json +10 -10
  77. package/analyzer-template/packages/database/index.ts +1 -0
  78. package/analyzer-template/packages/database/package.json +4 -4
  79. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  80. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  81. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  82. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  83. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  84. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  85. package/analyzer-template/packages/database/src/lib/kysely/db.ts +14 -0
  86. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
  87. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +164 -0
  88. package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
  89. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +19 -15
  90. package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
  91. package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
  92. package/analyzer-template/packages/database/src/lib/loadEntity.ts +19 -8
  93. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
  94. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  95. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  96. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  97. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +94 -143
  98. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
  99. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
  100. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  101. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
  102. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
  103. package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
  104. package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
  105. package/analyzer-template/packages/github/dist/database/index.js +1 -0
  106. package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
  107. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  108. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  109. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  110. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  111. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  112. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  113. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  114. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  115. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  116. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  117. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  118. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  119. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +4 -0
  120. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  121. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +8 -0
  122. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  123. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
  124. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +29 -0
  125. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
  126. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
  127. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  128. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
  129. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
  130. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  131. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  132. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
  133. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  134. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  135. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +1 -1
  136. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  137. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  138. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
  139. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  140. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  141. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
  142. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  143. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
  144. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
  145. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +5 -5
  146. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
  147. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  148. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  149. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  150. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  151. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  152. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  153. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  154. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  155. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  156. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  157. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +76 -90
  158. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  159. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
  160. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  161. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  162. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
  163. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  164. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  165. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
  166. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  167. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  168. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  169. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  170. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  171. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  172. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  173. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
  174. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
  175. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +8 -0
  176. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  177. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
  178. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  179. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  180. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  181. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  182. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  183. package/analyzer-template/packages/github/package.json +2 -2
  184. package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
  185. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +8 -0
  186. package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
  187. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
  188. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  189. package/analyzer-template/packages/ui-components/package.json +1 -1
  190. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  191. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  192. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
  193. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
  194. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +8 -0
  195. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  196. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
  197. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  198. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  199. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  200. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  201. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  202. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
  203. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  204. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +120 -4
  205. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  206. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +148 -3
  207. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  208. package/analyzer-template/project/analyzeFileEntities.ts +26 -0
  209. package/analyzer-template/project/constructMockCode.ts +260 -60
  210. package/analyzer-template/project/orchestrateCapture.ts +4 -1
  211. package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
  212. package/analyzer-template/project/start.ts +3 -0
  213. package/analyzer-template/project/startScenarioCapture.ts +9 -0
  214. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  215. package/analyzer-template/project/writeMockDataTsx.ts +198 -8
  216. package/analyzer-template/project/writeScenarioComponents.ts +170 -29
  217. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  218. package/analyzer-template/tsconfig.json +13 -1
  219. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  220. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  221. package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
  222. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  223. package/background/src/lib/virtualized/project/constructMockCode.js +220 -45
  224. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  225. package/background/src/lib/virtualized/project/orchestrateCapture.js +4 -1
  226. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  227. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
  228. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  229. package/background/src/lib/virtualized/project/start.js +2 -0
  230. package/background/src/lib/virtualized/project/start.js.map +1 -1
  231. package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
  232. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  233. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  234. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  235. package/background/src/lib/virtualized/project/writeMockDataTsx.js +174 -4
  236. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  237. package/background/src/lib/virtualized/project/writeScenarioComponents.js +143 -27
  238. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  239. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  240. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  241. package/codeyam-cli/scripts/apply-setup.js +386 -9
  242. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  243. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
  244. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
  245. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
  246. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
  247. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
  248. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
  249. package/codeyam-cli/src/cli.js +57 -24
  250. package/codeyam-cli/src/cli.js.map +1 -1
  251. package/codeyam-cli/src/codeyam-cli.js +18 -2
  252. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  253. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js +63 -0
  254. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js.map +1 -0
  255. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js +51 -0
  256. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js.map +1 -0
  257. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +56 -0
  258. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
  259. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +101 -47
  260. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
  261. package/codeyam-cli/src/commands/analyze.js +21 -9
  262. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  263. package/codeyam-cli/src/commands/baseline.js +2 -0
  264. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  265. package/codeyam-cli/src/commands/debug.js +9 -5
  266. package/codeyam-cli/src/commands/debug.js.map +1 -1
  267. package/codeyam-cli/src/commands/default.js +44 -21
  268. package/codeyam-cli/src/commands/default.js.map +1 -1
  269. package/codeyam-cli/src/commands/editor.js +5540 -0
  270. package/codeyam-cli/src/commands/editor.js.map +1 -0
  271. package/codeyam-cli/src/commands/editorIsolateArgs.js +25 -0
  272. package/codeyam-cli/src/commands/editorIsolateArgs.js.map +1 -0
  273. package/codeyam-cli/src/commands/init.js +148 -292
  274. package/codeyam-cli/src/commands/init.js.map +1 -1
  275. package/codeyam-cli/src/commands/memory.js +97 -92
  276. package/codeyam-cli/src/commands/memory.js.map +1 -1
  277. package/codeyam-cli/src/commands/recapture.js +2 -0
  278. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  279. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  280. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  281. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  282. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  283. package/codeyam-cli/src/commands/telemetry.js +37 -0
  284. package/codeyam-cli/src/commands/telemetry.js.map +1 -0
  285. package/codeyam-cli/src/commands/test-startup.js +2 -0
  286. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  287. package/codeyam-cli/src/commands/verify.js +14 -2
  288. package/codeyam-cli/src/commands/verify.js.map +1 -1
  289. package/codeyam-cli/src/data/techStacks.js +77 -0
  290. package/codeyam-cli/src/data/techStacks.js.map +1 -0
  291. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
  292. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
  293. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
  294. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
  295. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
  296. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
  297. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +137 -0
  298. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  299. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +3912 -0
  300. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  301. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
  302. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
  303. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
  304. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
  305. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
  306. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
  307. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js +100 -0
  308. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js.map +1 -0
  309. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +304 -0
  310. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  311. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +194 -0
  312. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
  313. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +381 -0
  314. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
  315. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
  316. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
  317. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
  318. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
  319. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +542 -0
  320. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  321. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +594 -0
  322. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
  323. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +435 -0
  324. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
  325. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  326. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  327. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +217 -0
  328. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  329. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +361 -0
  330. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  331. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +153 -0
  332. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
  333. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
  334. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
  335. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +291 -0
  336. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
  337. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +1629 -0
  338. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  339. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +280 -0
  340. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
  341. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js +143 -0
  342. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js.map +1 -0
  343. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
  344. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
  345. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
  346. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
  347. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +2121 -0
  348. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
  349. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  350. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  351. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
  352. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
  353. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +122 -0
  354. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
  355. package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js +302 -0
  356. package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js.map +1 -0
  357. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +185 -0
  358. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -0
  359. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
  360. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
  361. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  362. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  363. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  364. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  365. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
  366. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
  367. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
  368. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
  369. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +284 -0
  370. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
  371. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  372. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  373. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +672 -0
  374. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
  375. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js +84 -0
  376. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js.map +1 -0
  377. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +175 -86
  378. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  379. package/codeyam-cli/src/utils/__tests__/telemetry.test.js +159 -0
  380. package/codeyam-cli/src/utils/__tests__/telemetry.test.js.map +1 -0
  381. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
  382. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
  383. package/codeyam-cli/src/utils/__tests__/testRunner.test.js +217 -0
  384. package/codeyam-cli/src/utils/__tests__/testRunner.test.js.map +1 -0
  385. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
  386. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
  387. package/codeyam-cli/src/utils/analysisRunner.js +39 -8
  388. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  389. package/codeyam-cli/src/utils/analyzer.js +26 -0
  390. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  391. package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
  392. package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
  393. package/codeyam-cli/src/utils/backgroundServer.js +193 -30
  394. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  395. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  396. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  397. package/codeyam-cli/src/utils/database.js +37 -2
  398. package/codeyam-cli/src/utils/database.js.map +1 -1
  399. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  400. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  401. package/codeyam-cli/src/utils/devServerState.js +71 -0
  402. package/codeyam-cli/src/utils/devServerState.js.map +1 -0
  403. package/codeyam-cli/src/utils/editorApi.js +79 -0
  404. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  405. package/codeyam-cli/src/utils/editorAudit.js +791 -0
  406. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  407. package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
  408. package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
  409. package/codeyam-cli/src/utils/editorCapture.js +102 -0
  410. package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
  411. package/codeyam-cli/src/utils/editorDeleteScenario.js +67 -0
  412. package/codeyam-cli/src/utils/editorDeleteScenario.js.map +1 -0
  413. package/codeyam-cli/src/utils/editorDevServer.js +197 -0
  414. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  415. package/codeyam-cli/src/utils/editorEntityChangeStatus.js +50 -0
  416. package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
  417. package/codeyam-cli/src/utils/editorEntityHelpers.js +144 -0
  418. package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
  419. package/codeyam-cli/src/utils/editorGuard.js +36 -0
  420. package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
  421. package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
  422. package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
  423. package/codeyam-cli/src/utils/editorJournal.js +225 -0
  424. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  425. package/codeyam-cli/src/utils/editorLoaderHelpers.js +152 -0
  426. package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
  427. package/codeyam-cli/src/utils/editorMigration.js +224 -0
  428. package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
  429. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  430. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  431. package/codeyam-cli/src/utils/editorPreloadHelpers.js +135 -0
  432. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  433. package/codeyam-cli/src/utils/editorPreview.js +139 -0
  434. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  435. package/codeyam-cli/src/utils/editorRecapture.js +109 -0
  436. package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
  437. package/codeyam-cli/src/utils/editorScenarioSwitch.js +134 -0
  438. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
  439. package/codeyam-cli/src/utils/editorScenarios.js +616 -0
  440. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  441. package/codeyam-cli/src/utils/editorSeedAdapter.js +422 -0
  442. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
  443. package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
  444. package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
  445. package/codeyam-cli/src/utils/entityChangeStatus.js +394 -0
  446. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
  447. package/codeyam-cli/src/utils/entityChangeStatus.server.js +212 -0
  448. package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
  449. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  450. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  451. package/codeyam-cli/src/utils/fileWatcher.js +63 -9
  452. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  453. package/codeyam-cli/src/utils/generateReport.js +2 -2
  454. package/codeyam-cli/src/utils/git.js +103 -0
  455. package/codeyam-cli/src/utils/git.js.map +1 -1
  456. package/codeyam-cli/src/utils/glossaryAdd.js +74 -0
  457. package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
  458. package/codeyam-cli/src/utils/install-skills.js +128 -47
  459. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  460. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  461. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  462. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  463. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  464. package/codeyam-cli/src/utils/manualEntityAnalysis.js +196 -0
  465. package/codeyam-cli/src/utils/manualEntityAnalysis.js.map +1 -0
  466. package/codeyam-cli/src/utils/npmVersionCheck.js +76 -0
  467. package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -0
  468. package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
  469. package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
  470. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  471. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  472. package/codeyam-cli/src/utils/progress.js +8 -1
  473. package/codeyam-cli/src/utils/progress.js.map +1 -1
  474. package/codeyam-cli/src/utils/project.js +15 -5
  475. package/codeyam-cli/src/utils/project.js.map +1 -1
  476. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  477. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  478. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  479. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  480. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  481. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  482. package/codeyam-cli/src/utils/queue/job.js +100 -6
  483. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  484. package/codeyam-cli/src/utils/queue/manager.js +7 -6
  485. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  486. package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
  487. package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
  488. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  489. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  490. package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
  491. package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
  492. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  493. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  494. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +229 -0
  495. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  496. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  497. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  498. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  499. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  500. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  501. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  502. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  503. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  504. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +74 -0
  505. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  506. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +376 -0
  507. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  508. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +113 -0
  509. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  510. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  511. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  512. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  513. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  514. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  515. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  516. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  517. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  518. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  519. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  520. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  521. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  522. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  523. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  524. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
  525. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
  526. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
  527. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
  528. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
  529. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
  530. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  531. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  532. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
  533. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
  534. package/codeyam-cli/src/utils/rules/index.js +2 -0
  535. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  536. package/codeyam-cli/src/utils/rules/parser.js +16 -29
  537. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  538. package/codeyam-cli/src/utils/rules/pathMatcher.js +34 -3
  539. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -1
  540. package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
  541. package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
  542. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  543. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  544. package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
  545. package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
  546. package/codeyam-cli/src/utils/rules/staleness.js +16 -11
  547. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
  548. package/codeyam-cli/src/utils/scenarioCoverage.js +77 -0
  549. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
  550. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  551. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  552. package/codeyam-cli/src/utils/scenariosManifest.js +307 -0
  553. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  554. package/codeyam-cli/src/utils/screenshotHash.js +26 -0
  555. package/codeyam-cli/src/utils/screenshotHash.js.map +1 -0
  556. package/codeyam-cli/src/utils/serverState.js +94 -12
  557. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  558. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +96 -47
  559. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  560. package/codeyam-cli/src/utils/simulationGateMiddleware.js +175 -0
  561. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
  562. package/codeyam-cli/src/utils/slugUtils.js +25 -0
  563. package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
  564. package/codeyam-cli/src/utils/syncMocksMiddleware.js +7 -26
  565. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  566. package/codeyam-cli/src/utils/telemetry.js +106 -0
  567. package/codeyam-cli/src/utils/telemetry.js.map +1 -0
  568. package/codeyam-cli/src/utils/telemetryMiddleware.js +22 -0
  569. package/codeyam-cli/src/utils/telemetryMiddleware.js.map +1 -0
  570. package/codeyam-cli/src/utils/testRunner.js +356 -0
  571. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  572. package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
  573. package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
  574. package/codeyam-cli/src/utils/versionInfo.js +46 -0
  575. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  576. package/codeyam-cli/src/utils/webappDetection.js +35 -2
  577. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  578. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +35 -0
  579. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -0
  580. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +107 -0
  581. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
  582. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js +66 -0
  583. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js.map +1 -0
  584. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +628 -0
  585. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  586. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +283 -0
  587. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
  588. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js +135 -0
  589. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js.map +1 -0
  590. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +86 -0
  591. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
  592. package/codeyam-cli/src/webserver/app/lib/database.js +56 -30
  593. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  594. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  595. package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
  596. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  597. package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
  598. package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
  599. package/codeyam-cli/src/webserver/backgroundServer.js +186 -37
  600. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  601. package/codeyam-cli/src/webserver/bootstrap.js +11 -0
  602. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  603. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CLe80MMu.js +1 -0
  604. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-Crt_KN_U.js} +5 -5
  605. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
  606. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-CD7lGABo.js} +9 -9
  607. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-CgTNOhnu.js +1 -0
  608. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-CKeQT5Ty.js +25 -0
  609. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-D3s1MFkb.js +3 -0
  610. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-By5zI316.js} +1 -1
  611. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-CM5zg40N.js} +3 -3
  612. package/codeyam-cli/src/webserver/build/client/assets/MiniClaudeChat-CQENLSrF.js +36 -0
  613. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-C2PLkej3.js} +5 -10
  614. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DanvyBPb.js +1 -0
  615. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-DUMfcNVK.js} +3 -3
  616. package/codeyam-cli/src/webserver/build/client/assets/Spinner-D0LgAaSa.js +34 -0
  617. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
  618. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-BA_Ry-rs.js +1 -0
  619. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-BAWd-Xjf.js} +4 -4
  620. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-BOARiB-g.js} +10 -15
  621. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  622. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  623. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-CHx25PAe.js +1 -0
  624. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  625. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-Bg3e7q4S.js +22 -0
  626. package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
  627. package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
  628. package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
  629. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  630. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  631. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  632. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  633. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  634. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  635. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  636. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  637. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  638. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  639. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  640. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  641. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  642. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  643. package/codeyam-cli/src/webserver/build/client/assets/api.editor-recapture-stale-l0sNRNKZ.js +1 -0
  644. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  645. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  646. package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
  647. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
  648. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
  649. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
  650. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  651. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  652. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
  653. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
  654. package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
  655. package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
  656. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  657. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  658. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  659. package/codeyam-cli/src/webserver/build/client/assets/api.rule-path-l0sNRNKZ.js +1 -0
  660. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  661. package/codeyam-cli/src/webserver/build/client/assets/book-open-CL-lMgHh.js +6 -0
  662. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-GmAjGS9-.js} +2 -2
  663. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-BAdwhyCx.js +43 -0
  664. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-DFcQkN5j.js} +2 -2
  665. package/codeyam-cli/src/webserver/build/client/assets/copy-C6iF61Xs.js +11 -0
  666. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-4ImjHTVC.js +41 -0
  667. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-Coe5NhbS.js +1 -0
  668. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-DoA97ML3.svg} +2 -2
  669. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C8y4mmyv.js +1 -0
  670. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-Gbk_i5Js.js +1 -0
  671. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-aIHKLB-m.js +96 -0
  672. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-CluPkvXJ.js +41 -0
  673. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BJUiQqZF.js → entity._sha._-ByHz6rAQ.js} +14 -13
  674. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-CmLO432x.js +6 -0
  675. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-Bz9sCUF_.js +6 -0
  676. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DQM8E7L4.js +6 -0
  677. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-CAoXLsQr.js} +2 -2
  678. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-SuW9syRS.js} +6 -6
  679. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
  680. package/codeyam-cli/src/webserver/build/client/assets/files-D-xGrg29.js +1 -0
  681. package/codeyam-cli/src/webserver/build/client/assets/git-Bq_fbXP5.js +1 -0
  682. package/codeyam-cli/src/webserver/build/client/assets/globals-oyPmV37k.css +1 -0
  683. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-Bp1l4hSv.js} +1 -1
  684. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-CWV9XZiG.js} +1 -1
  685. package/codeyam-cli/src/webserver/build/client/assets/index-DE3jI_dv.js +15 -0
  686. package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
  687. package/codeyam-cli/src/webserver/build/client/assets/labs-B_IX45ih.js +1 -0
  688. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-De-7qQ2u.js} +2 -2
  689. package/codeyam-cli/src/webserver/build/client/assets/manifest-bcbb3d49.js +1 -0
  690. package/codeyam-cli/src/webserver/build/client/assets/memory-Cx2xEx7s.js +101 -0
  691. package/codeyam-cli/src/webserver/build/client/assets/pause-CFxEKL1u.js +11 -0
  692. package/codeyam-cli/src/webserver/build/client/assets/root-D2_tktnk.js +80 -0
  693. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-BdBb5aqc.js} +2 -2
  694. package/codeyam-cli/src/webserver/build/client/assets/settings-DdE-Untf.js +1 -0
  695. package/codeyam-cli/src/webserver/build/client/assets/simulations-DSCdE99u.js +1 -0
  696. package/codeyam-cli/src/webserver/build/client/assets/terminal-CrplD4b1.js +11 -0
  697. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-DqJ0j69l.js} +2 -2
  698. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-DhXHbEjP.js +1 -0
  699. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-BNd5hYuW.js +2 -0
  700. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-Cy5Qg_UR.js +1 -0
  701. package/codeyam-cli/src/webserver/build/client/assets/useToast-5HR2j9ZE.js +1 -0
  702. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  703. package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
  704. package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-DjF-soOH.js +16 -0
  705. package/codeyam-cli/src/webserver/build/server/assets/index-nAvHGWbz.js +1 -0
  706. package/codeyam-cli/src/webserver/build/server/assets/init-XhpIt-OT.js +10 -0
  707. package/codeyam-cli/src/webserver/build/server/assets/progress-CHTtrxFG.js +1 -0
  708. package/codeyam-cli/src/webserver/build/server/assets/server-build-DVwiibFu.js +644 -0
  709. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  710. package/codeyam-cli/src/webserver/build-info.json +5 -5
  711. package/codeyam-cli/src/webserver/devServer.js +39 -5
  712. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  713. package/codeyam-cli/src/webserver/editorProxy.js +976 -0
  714. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  715. package/codeyam-cli/src/webserver/idleDetector.js +121 -0
  716. package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
  717. package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
  718. package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
  719. package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
  720. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
  721. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +283 -0
  722. package/codeyam-cli/src/webserver/server.js +379 -1
  723. package/codeyam-cli/src/webserver/server.js.map +1 -1
  724. package/codeyam-cli/src/webserver/terminalServer.js +951 -0
  725. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  726. package/codeyam-cli/templates/__tests__/editor-step-hook.prompt-capture.test.ts +118 -0
  727. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  728. package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
  729. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  730. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  731. package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
  732. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  733. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  734. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  735. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  736. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  737. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  738. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  739. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  740. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
  741. package/codeyam-cli/templates/codeyam-editor-claude.md +149 -0
  742. package/codeyam-cli/templates/codeyam-editor-reference.md +214 -0
  743. package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
  744. package/codeyam-cli/templates/commands/codeyam-diagnose.md +481 -0
  745. package/codeyam-cli/templates/editor-step-hook.py +368 -0
  746. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
  747. package/codeyam-cli/templates/expo-react-native/README.md +41 -0
  748. package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
  749. package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
  750. package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
  751. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
  752. package/codeyam-cli/templates/expo-react-native/app.json +18 -0
  753. package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
  754. package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
  755. package/codeyam-cli/templates/expo-react-native/global.css +3 -0
  756. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  757. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  758. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  759. package/codeyam-cli/templates/expo-react-native/package.json +38 -0
  760. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  761. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  762. package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
  763. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  764. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  765. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  766. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  767. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  768. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  769. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  770. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  771. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
  772. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  773. package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
  774. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  775. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  776. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  777. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  778. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +24 -0
  779. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  780. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  781. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  782. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +64 -0
  783. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  784. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +39 -0
  785. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  786. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  787. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +40 -0
  788. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  789. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +127 -0
  790. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  791. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  792. package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
  793. package/codeyam-cli/templates/nextjs-prisma-supabase/SUPABASE_SETUP.md +104 -0
  794. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  795. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  796. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  797. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  798. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  799. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  800. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  801. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  802. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  803. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  804. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
  805. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  806. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  807. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  808. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  809. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  810. package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
  811. package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
  812. package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
  813. package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
  814. package/codeyam-cli/templates/rule-notification-hook.py +83 -0
  815. package/codeyam-cli/templates/rule-reflection-hook.py +647 -0
  816. package/codeyam-cli/templates/rules-instructions.md +78 -0
  817. package/codeyam-cli/templates/seed-adapters/supabase.ts +282 -0
  818. package/codeyam-cli/templates/{codeyam:debug.md → skills/codeyam-debug/SKILL.md} +1 -1
  819. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +237 -0
  820. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +229 -0
  821. package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +611 -0
  822. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  823. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  824. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  825. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  826. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  827. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  828. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  829. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  830. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  831. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  832. package/codeyam-cli/templates/skills/codeyam-new-rule/SKILL.md +11 -0
  833. package/codeyam-cli/templates/{codeyam:setup.md → skills/codeyam-setup/SKILL.md} +13 -1
  834. package/codeyam-cli/templates/{codeyam:sim.md → skills/codeyam-sim/SKILL.md} +1 -1
  835. package/codeyam-cli/templates/{codeyam:test.md → skills/codeyam-test/SKILL.md} +1 -1
  836. package/codeyam-cli/templates/{codeyam:verify.md → skills/codeyam-verify/SKILL.md} +1 -1
  837. package/package.json +29 -21
  838. package/packages/ai/index.js +3 -2
  839. package/packages/ai/index.js.map +1 -1
  840. package/packages/ai/src/lib/analyzeScope.js +50 -13
  841. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  842. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +76 -12
  843. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  844. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  845. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  846. package/packages/ai/src/lib/astScopes/processExpression.js +317 -44
  847. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  848. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  849. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  850. package/packages/ai/src/lib/completionCall.js +10 -7
  851. package/packages/ai/src/lib/completionCall.js.map +1 -1
  852. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1023 -183
  853. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  854. package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js +9 -2
  855. package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js.map +1 -1
  856. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  857. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  858. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  859. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  860. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  861. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  862. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +47 -7
  863. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  864. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +36 -11
  865. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  866. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  867. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  868. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  869. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  870. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
  871. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  872. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  873. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  874. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  875. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  876. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +309 -84
  877. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  878. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  879. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  880. package/packages/ai/src/lib/dataStructureChunking.js +30 -11
  881. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  882. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  883. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  884. package/packages/ai/src/lib/generateEntityScenarioData.js +284 -6
  885. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  886. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  887. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  888. package/packages/ai/src/lib/generateExecutionFlows.js +96 -4
  889. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  890. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +447 -80
  891. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  892. package/packages/ai/src/lib/isolateScopes.js +39 -3
  893. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  894. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  895. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  896. package/packages/ai/src/lib/mergeStatements.js +70 -51
  897. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  898. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  899. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  900. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  901. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  902. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  903. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  904. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  905. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  906. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  907. package/packages/analyze/index.js +2 -1
  908. package/packages/analyze/index.js.map +1 -1
  909. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  910. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  911. package/packages/analyze/src/lib/ProjectAnalyzer.js +109 -30
  912. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  913. package/packages/analyze/src/lib/asts/index.js +4 -2
  914. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  915. package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
  916. package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
  917. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  918. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  919. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  920. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  921. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  922. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  923. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  924. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  925. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  926. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  927. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  928. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  929. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +81 -9
  930. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  931. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +30 -30
  932. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  933. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
  934. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  935. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +12 -2
  936. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  937. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +11 -8
  938. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  939. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js +14 -0
  940. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
  941. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +44 -14
  942. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  943. package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
  944. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  945. package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
  946. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  947. package/packages/analyze/src/lib/files/analyzeNextRoute.js +5 -1
  948. package/packages/analyze/src/lib/files/analyzeNextRoute.js.map +1 -1
  949. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  950. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  951. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  952. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  953. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +907 -0
  954. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  955. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
  956. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  957. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +75 -21
  958. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  959. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +309 -23
  960. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  961. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +16 -8
  962. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  963. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +632 -79
  964. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  965. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  966. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  967. package/packages/analyze/src/lib/index.js +1 -0
  968. package/packages/analyze/src/lib/index.js.map +1 -1
  969. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  970. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  971. package/packages/database/index.js +1 -0
  972. package/packages/database/index.js.map +1 -1
  973. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  974. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  975. package/packages/database/src/lib/analysisToDb.js +1 -1
  976. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  977. package/packages/database/src/lib/branchToDb.js +1 -1
  978. package/packages/database/src/lib/branchToDb.js.map +1 -1
  979. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  980. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  981. package/packages/database/src/lib/commitToDb.js +1 -1
  982. package/packages/database/src/lib/commitToDb.js.map +1 -1
  983. package/packages/database/src/lib/fileToDb.js +1 -1
  984. package/packages/database/src/lib/fileToDb.js.map +1 -1
  985. package/packages/database/src/lib/kysely/db.js +8 -0
  986. package/packages/database/src/lib/kysely/db.js.map +1 -1
  987. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
  988. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  989. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  990. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  991. package/packages/database/src/lib/loadAnalysis.js +1 -1
  992. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  993. package/packages/database/src/lib/loadCommits.js +23 -13
  994. package/packages/database/src/lib/loadCommits.js.map +1 -1
  995. package/packages/database/src/lib/loadEntities.js +0 -6
  996. package/packages/database/src/lib/loadEntities.js.map +1 -1
  997. package/packages/database/src/lib/loadEntity.js +5 -5
  998. package/packages/database/src/lib/loadEntity.js.map +1 -1
  999. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  1000. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  1001. package/packages/database/src/lib/projectToDb.js +1 -1
  1002. package/packages/database/src/lib/projectToDb.js.map +1 -1
  1003. package/packages/database/src/lib/saveFiles.js +1 -1
  1004. package/packages/database/src/lib/saveFiles.js.map +1 -1
  1005. package/packages/database/src/lib/scenarioToDb.js +1 -1
  1006. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  1007. package/packages/database/src/lib/updateCommitMetadata.js +76 -90
  1008. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  1009. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  1010. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  1011. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  1012. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  1013. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  1014. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  1015. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  1016. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  1017. package/packages/types/src/enums/ProjectFramework.js +2 -0
  1018. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  1019. package/packages/utils/src/lib/fs/rsyncCopy.js +120 -4
  1020. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  1021. package/scripts/npm-post-install.cjs +34 -0
  1022. package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -118
  1023. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
  1024. package/codeyam-cli/src/commands/list.js +0 -31
  1025. package/codeyam-cli/src/commands/list.js.map +0 -1
  1026. package/codeyam-cli/src/commands/webapp-info.js +0 -146
  1027. package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
  1028. package/codeyam-cli/src/utils/universal-mocks.js +0 -152
  1029. package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
  1030. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-DLqD3qNt.js +0 -1
  1031. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-C8lyxW9k.js +0 -34
  1032. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-aht4aafF.js +0 -25
  1033. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CVtiBnY5.js +0 -3
  1034. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DuDvi0jm.js +0 -1
  1035. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-DyFZkK0l.js +0 -1
  1036. package/codeyam-cli/src/webserver/build/client/assets/chunk-EPOLDU6W-CXRTFQ3F.js +0 -51
  1037. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
  1038. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BdhJEx6B.js +0 -21
  1039. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
  1040. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +0 -1
  1041. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js +0 -6
  1042. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D1T4TGjf.js +0 -6
  1043. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
  1044. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-DMJ7zii9.js +0 -1
  1045. package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +0 -1
  1046. package/codeyam-cli/src/webserver/build/client/assets/git-CPTZZ-JZ.js +0 -15
  1047. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  1048. package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +0 -1
  1049. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
  1050. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
  1051. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  1052. package/codeyam-cli/src/webserver/build/client/assets/simulations-DwFIBT09.js +0 -1
  1053. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-C1v1PQzo.js +0 -1
  1054. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-aSv48UbS.js +0 -2
  1055. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DYxHZQuP.js +0 -1
  1056. package/codeyam-cli/src/webserver/build/client/assets/useToast-mBRpZPiu.js +0 -1
  1057. package/codeyam-cli/src/webserver/build/server/assets/index-DVzYx8PN.js +0 -1
  1058. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
  1059. package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
  1060. package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
  1061. package/codeyam-cli/templates/codeyam:memory.md +0 -462
  1062. package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
  1063. package/scripts/finalize-analyzer.cjs +0 -81
@@ -4,6 +4,7 @@ import {
4
4
  } from '~codeyam/ai';
5
5
  import { cleanKnownObjectFunctionsFromMapping } from '~codeyam/ai';
6
6
  import { DataStructure, Entity, ReadonlyAnalysis } from '~codeyam/types';
7
+ import { transformationTracer } from './TransformationTracer';
7
8
 
8
9
  export interface DataStructureInfo {
9
10
  signatureSchema: { [key: string]: string };
@@ -40,6 +41,79 @@ function getTypeParameter(functionName: string): string | null {
40
41
  return null;
41
42
  }
42
43
 
44
+ /**
45
+ * Check if a schema path contains a Set/Map collection method call.
46
+ * Paths like `.has(articleId)`, `.delete(articleId)`, `.add(articleId)` represent
47
+ * membership checks on Sets/Maps, not meaningful data flow for schema generation.
48
+ * These create massive combinatorial explosions when every filter field (filterRatings,
49
+ * filterPublications, filterAuthors, etc.) × every method (has, delete, add) gets
50
+ * tracked as a separate equivalency.
51
+ */
52
+ const COLLECTION_METHOD_PATTERN = /\.(?:has|delete|add|clear|get|set)\(/;
53
+ function isCollectionMethodPath(path: string): boolean {
54
+ return COLLECTION_METHOD_PATTERN.test(path);
55
+ }
56
+
57
+ // Primitive types that should not have child paths
58
+ const PRIMITIVE_TYPES = new Set([
59
+ 'number',
60
+ 'string',
61
+ 'boolean',
62
+ 'null',
63
+ 'undefined',
64
+ ]);
65
+
66
+ // Check if a type string represents a primitive type
67
+ // Handles union types like "string | undefined" or "number | null"
68
+ // Also handles string literal unions like "'suggestion' | 'warning' | 'tip'"
69
+ function isPrimitiveType(typeStr: string): boolean {
70
+ if (PRIMITIVE_TYPES.has(typeStr)) {
71
+ return true;
72
+ }
73
+ // Check union types - if ALL parts of the union are primitives, it's primitive
74
+ // e.g., "string | undefined" -> ["string", "undefined"] -> both are primitive -> true
75
+ // e.g., "object | null" -> ["object", "null"] -> object is not primitive -> false
76
+ // e.g., "'suggestion' | 'warning'" -> string literal union -> true
77
+ if (typeStr.includes('|')) {
78
+ const parts = typeStr.split('|').map((p) => p.trim());
79
+ return parts.every(
80
+ (part) =>
81
+ PRIMITIVE_TYPES.has(part) ||
82
+ // String literal values like 'suggestion', 'warning' are primitives
83
+ (part.startsWith("'") && part.endsWith("'")),
84
+ );
85
+ }
86
+ return false;
87
+ }
88
+
89
+ // Extract signature index from a path like "signature[0]" or "signature[0].foo"
90
+ // Returns the index number or undefined if not a signature path
91
+ function extractSignatureIndex(path: string): number | undefined {
92
+ const match = path.match(/^signature\[(\d+)\]/);
93
+ return match ? parseInt(match[1], 10) : undefined;
94
+ }
95
+
96
+ // Check if a new schema path would go through a primitive type
97
+ // e.g., if schema has 'entities[].scenarioCount': 'number', then
98
+ // 'entities[].scenarioCount.sha' would go through a primitive and should be rejected
99
+ function wouldGoThroughPrimitive(
100
+ newPath: string,
101
+ schema: { [key: string]: string },
102
+ ): boolean {
103
+ const pathParts = splitOutsideParenthesesAndArrays(newPath);
104
+
105
+ // Check each prefix of the path (excluding the full path itself)
106
+ for (let i = 1; i < pathParts.length; i++) {
107
+ const prefixPath = joinParenthesesAndArrays(pathParts.slice(0, i));
108
+ const prefixType = schema[prefixPath];
109
+ if (prefixType && isPrimitiveType(prefixType)) {
110
+ return true;
111
+ }
112
+ }
113
+
114
+ return false;
115
+ }
116
+
43
117
  // Check if schemaPathPart matches or is a function call variant of pathPart
44
118
  // e.g., 'isEntityBeingAnalyzed(entity.sha)' matches 'isEntityBeingAnalyzed'
45
119
  function pathPartMatches(pathPart: string, schemaPathPart: string): boolean {
@@ -56,21 +130,51 @@ function pathPartMatches(pathPart: string, schemaPathPart: string): boolean {
56
130
  function bestValueFromOptions(options: Array<string | undefined>) {
57
131
  options = options.filter(Boolean) as string[];
58
132
 
59
- const known = options.find((o) => !o.includes('unknown'));
60
- if (known) return known;
133
+ const known = options.filter((o) => !o.includes('unknown'));
134
+ if (known.length > 0) {
135
+ // Among known values, prefer string literal unions over bare primitives.
136
+ // e.g., "'draft' | 'inProgress' | 'paused' | 'completed'" is more specific than "string".
137
+ // This handles cases where a dependency schema has a bare type like "string" but the
138
+ // child entity's analysis has the actual literal union from TypeScript type resolution.
139
+ if (known.length > 1 && known.some((o) => PRIMITIVE_TYPES.has(o))) {
140
+ const literalUnion = known.find(
141
+ (o) => !PRIMITIVE_TYPES.has(o) && o.includes("'"),
142
+ );
143
+ if (literalUnion) {
144
+ return literalUnion;
145
+ }
146
+ }
147
+ return known[0];
148
+ }
61
149
 
62
150
  const notUnknown = options.find((o) => o !== 'unknown');
63
- if (notUnknown) return notUnknown;
151
+ if (notUnknown) {
152
+ return notUnknown;
153
+ }
64
154
 
65
155
  return options[0] ?? 'unknown';
66
156
  }
67
157
 
158
+ /** Timeout (ms) for the merge operation. Throws DataStructureTimeoutError if exceeded.
159
+ * All successful merges complete in <300ms. Anything exceeding 2s is pathological. */
160
+ const MERGE_TIMEOUT_MS = 2_000;
161
+
162
+ export class DataStructureTimeoutError extends Error {
163
+ constructor(entityName: string, elapsedMs: number) {
164
+ super(
165
+ `Data structure merge timed out for ${entityName} after ${Math.round(elapsedMs / 1000)}s (limit: ${MERGE_TIMEOUT_MS / 1000}s)`,
166
+ );
167
+ this.name = 'DataStructureTimeoutError';
168
+ }
169
+ }
170
+
68
171
  export default function mergeInDependentDataStructure({
69
172
  importedExports,
70
173
  dependentAnalyses,
71
174
  rootScopeName,
72
175
  dataStructure,
73
176
  dependencySchemas,
177
+ timeoutMs = MERGE_TIMEOUT_MS,
74
178
  }: {
75
179
  importedExports: Pick<
76
180
  Entity['metadata']['importedExports'][0],
@@ -92,7 +196,23 @@ export default function mergeInDependentDataStructure({
92
196
  [name: string]: DataStructureInfo;
93
197
  };
94
198
  };
199
+ /** Override the default timeout (ms). Set to 0 to disable. */
200
+ timeoutMs?: number;
95
201
  }) {
202
+ const mergeStartTime = Date.now();
203
+ const mergeDeadline = timeoutMs > 0 ? mergeStartTime + timeoutMs : 0;
204
+
205
+ /** Call in hot loops. Throws DataStructureTimeoutError if deadline exceeded.
206
+ * Date.now() is ~20ns — negligible vs the ms-scale string ops in each iteration. */
207
+ const checkDeadline = () => {
208
+ if (!mergeDeadline) return;
209
+ if (Date.now() > mergeDeadline) {
210
+ throw new DataStructureTimeoutError(
211
+ rootScopeName,
212
+ Date.now() - mergeStartTime,
213
+ );
214
+ }
215
+ };
96
216
  const mergedDataStructure: Omit<
97
217
  DataStructure,
98
218
  'equivalentSignatureVariables'
@@ -152,10 +272,38 @@ export default function mergeInDependentDataStructure({
152
272
  equivalentPostfixes: Record<string, string>;
153
273
  }[] = [];
154
274
 
275
+ // O(1) index for findOrCreateEquivalentSchemaPathsEntry.
276
+ // Maps "(rootPath)::(normalizedFuncName)" → the entry containing that root.
277
+ // This replaces the O(E) linear search that was causing O(E²) gather performance.
278
+ const espIndex = new Map<string, (typeof equivalentSchemaPaths)[0]>();
279
+ const espIndexKey = (path: string, functionName: string | undefined) => {
280
+ const normalized = cleanFunctionName(functionName);
281
+ const funcKey =
282
+ normalized === rootScopeName ? '__self__' : normalized || '__self__';
283
+ return `${path}::${funcKey}`;
284
+ };
285
+ const updateEspIndex = (entry: (typeof equivalentSchemaPaths)[0]) => {
286
+ for (const root of entry.equivalentRoots) {
287
+ const funcName = root.function?.name ?? rootScopeName;
288
+ espIndex.set(espIndexKey(root.schemaRootPath, funcName), entry);
289
+ }
290
+ };
291
+
292
+ // Pre-build a lookup map from cleaned function name to dependency for O(1) lookups.
293
+ // This avoids O(n) linear search in findRelevantDependency which was causing O(n²) performance.
294
+ const dependencyByCleanedName = new Map<
295
+ string,
296
+ (typeof importedExports)[0]
297
+ >();
298
+ for (const dep of importedExports) {
299
+ const cleanedName = cleanFunctionName(dep.name);
300
+ if (!dependencyByCleanedName.has(cleanedName)) {
301
+ dependencyByCleanedName.set(cleanedName, dep);
302
+ }
303
+ }
304
+
155
305
  const findRelevantDependency = (functionName: any) => {
156
- return importedExports.find(
157
- (d) => cleanFunctionName(d.name) === cleanFunctionName(functionName),
158
- );
306
+ return dependencyByCleanedName.get(cleanFunctionName(functionName));
159
307
  };
160
308
 
161
309
  const findRelevantDependentDataStructure = (functionName: any) => {
@@ -192,11 +340,30 @@ export default function mergeInDependentDataStructure({
192
340
  return mergedDataStructure.dependencySchemas[filePath][name];
193
341
  };
194
342
 
195
- const cleanSchema = (schema: { [key: string]: string }) => {
196
- cleanKnownObjectFunctionsFromMapping(schema);
343
+ const cleanSchema = (
344
+ schema: { [key: string]: string },
345
+ context?: Record<string, any>,
346
+ ) => {
347
+ transformationTracer.traceSchemaTransform(
348
+ rootScopeName,
349
+ 'cleanKnownObjectFunctionsFromMapping',
350
+ schema,
351
+ cleanKnownObjectFunctionsFromMapping,
352
+ context,
353
+ );
197
354
  };
198
355
 
356
+ // Cache translatePath results — the same path is often translated multiple times
357
+ // (once per equivalency entry that references it). Avoids redundant
358
+ // splitOutsideParenthesesAndArrays calls on long paths.
359
+ const translatePathCache = new Map<string, string>();
360
+
199
361
  const translatePath = (path: string, dependencyName: string) => {
362
+ const cacheKey = `${dependencyName}\0${path}`;
363
+ const cached = translatePathCache.get(cacheKey);
364
+ if (cached !== undefined) return cached;
365
+
366
+ let result = path;
200
367
  if (path.startsWith(dependencyName)) {
201
368
  const pathParts = splitOutsideParenthesesAndArrays(path);
202
369
  if (pathParts.length > 1) {
@@ -204,33 +371,26 @@ export default function mergeInDependentDataStructure({
204
371
  // Check if this function has multiple DIFFERENT type parameters.
205
372
  // If so, DON'T normalize to returnValue - keep the full path to avoid
206
373
  // merging different type-parameterized variants together.
207
- // e.g., useFetcher<{ data: UserData }>().functionCallReturnValue.data
208
- // should NOT be merged with useFetcher<{ data: ConfigData }>().functionCallReturnValue.data
209
374
  const baseName = cleanFunctionName(pathParts[0]);
210
- if (functionsWithMultipleTypeParams.has(baseName)) {
211
- return path; // Keep the original path with type parameters
375
+ if (!functionsWithMultipleTypeParams.has(baseName)) {
376
+ // functionCallReturnValue immediately follows - normalize to returnValue
377
+ result = joinParenthesesAndArrays([
378
+ 'returnValue',
379
+ ...pathParts.slice(2),
380
+ ]);
212
381
  }
213
- // functionCallReturnValue immediately follows - normalize to returnValue
214
- // e.g., useAuth().functionCallReturnValue.user -> returnValue.user
215
- return joinParenthesesAndArrays([
216
- 'returnValue',
217
- ...pathParts.slice(2),
218
- ]);
219
382
  } else if (
220
383
  pathParts[0].endsWith(')') &&
221
384
  pathParts[1].startsWith('signature[')
222
385
  ) {
223
- // Hook-style with signature access (e.g., BranchChangesTab().signature[0]...)
224
- // Strip the function name for signature equivalency matching
225
- return joinParenthesesAndArrays(pathParts.slice(1));
386
+ // Hook-style with signature access
387
+ result = joinParenthesesAndArrays(pathParts.slice(1));
226
388
  }
227
- // For all other cases (object-style APIs like getSupabase().auth and
228
- // direct object references like supabase.from), preserve the path as-is.
229
- // The prefix must be kept for proper schema lookups in constructMockCode
230
- // and gatherDataForMocks.
231
389
  }
232
390
  }
233
- return path;
391
+
392
+ translatePathCache.set(cacheKey, result);
393
+ return result;
234
394
  };
235
395
 
236
396
  const gatherAllEquivalentSchemaPaths = (
@@ -244,8 +404,58 @@ export default function mergeInDependentDataStructure({
244
404
  'signatureSchema' | 'returnValueSchema'
245
405
  >,
246
406
  ) => {
407
+ checkDeadline();
247
408
  if (!sourceAndUsageEquivalencies) return;
248
409
 
410
+ // Pre-computed normalized schema index cache.
411
+ // Avoids repeated splitOutsideParenthesesAndArrays calls and function-name
412
+ // normalization for the same schema paths across multiple equivalency iterations.
413
+ // The normalization depends on `functionName` (constant per gatherAllEquivalentSchemaPaths call),
414
+ // so this cache is scoped to this call.
415
+ type NormalizedEntry = { path: string; parts: string[] };
416
+ const normalizedSchemaCache = new Map<
417
+ object,
418
+ {
419
+ byFirstPart: Map<string, NormalizedEntry[]>;
420
+ }
421
+ >();
422
+ const getSchemaIndex = (
423
+ schema: Record<string, string> | undefined,
424
+ ): { byFirstPart: Map<string, NormalizedEntry[]> } => {
425
+ if (!schema) return { byFirstPart: new Map() };
426
+ const cached = normalizedSchemaCache.get(schema);
427
+ if (cached) return cached;
428
+ const byFirstPart = new Map<string, NormalizedEntry[]>();
429
+ for (const path in schema) {
430
+ checkDeadline();
431
+ let parts = splitOutsideParenthesesAndArrays(path);
432
+ if (parts[0].startsWith(functionName)) {
433
+ const baseName = cleanFunctionName(parts[0]);
434
+ if (!functionsWithMultipleTypeParams.has(baseName)) {
435
+ parts =
436
+ parts[1] === 'functionCallReturnValue'
437
+ ? ['returnValue', ...parts.slice(2)]
438
+ : parts.slice(1);
439
+ }
440
+ }
441
+ const entry: NormalizedEntry = { path, parts };
442
+ // Index by the base of the first part (before any function call args)
443
+ const firstPart = parts[0] ?? '';
444
+ const parenIdx = firstPart.indexOf('(');
445
+ const firstPartBase =
446
+ parenIdx >= 0 ? firstPart.slice(0, parenIdx) : firstPart;
447
+ let bucket = byFirstPart.get(firstPartBase);
448
+ if (!bucket) {
449
+ bucket = [];
450
+ byFirstPart.set(firstPartBase, bucket);
451
+ }
452
+ bucket.push(entry);
453
+ }
454
+ const result = { byFirstPart };
455
+ normalizedSchemaCache.set(schema, result);
456
+ return result;
457
+ };
458
+
249
459
  const findOrCreateEquivalentSchemaPathsEntry = (
250
460
  allPaths: { path: string; functionName?: string }[],
251
461
  ) => {
@@ -266,41 +476,122 @@ export default function mergeInDependentDataStructure({
266
476
  let equivalentSchemaPathsEntry:
267
477
  | (typeof equivalentSchemaPaths)[0]
268
478
  | undefined;
479
+
480
+ // Collect the signature indices from the new roots we want to add
481
+ const newRootSignatureIndices = new Set<number>();
482
+ for (const root of equivalentRoots) {
483
+ const idx = extractSignatureIndex(root.schemaRootPath);
484
+ if (idx !== undefined) {
485
+ newRootSignatureIndices.add(idx);
486
+ }
487
+ }
488
+
489
+ // Use espIndex Map for O(1) lookup instead of O(E) linear search.
490
+ // Falls back to linear search only when Map hit has a signature index conflict.
269
491
  for (const pathInfo of allPaths) {
270
- if (!equivalentSchemaPathsEntry) {
271
- equivalentSchemaPathsEntry = equivalentSchemaPaths.find((esp) =>
272
- esp.equivalentRoots.some(
273
- (er) =>
274
- er.schemaRootPath === pathInfo.path &&
275
- (er.function?.name ===
276
- cleanFunctionName(pathInfo.functionName) ||
277
- (!er.function &&
278
- cleanFunctionName(pathInfo.functionName) ===
279
- rootScopeName)),
280
- ),
281
- );
492
+ checkDeadline();
493
+ if (equivalentSchemaPathsEntry) break;
494
+ const candidate = espIndex.get(
495
+ espIndexKey(pathInfo.path, pathInfo.functionName),
496
+ );
497
+ if (!candidate) continue;
498
+
499
+ // Verify no signature index conflict with the candidate entry
500
+ if (newRootSignatureIndices.size > 0) {
501
+ const existingIndicesByFunction = new Map<string, Set<number>>();
502
+ for (const er of candidate.equivalentRoots) {
503
+ const funcKey = er.function
504
+ ? `${er.function.name}::${er.function.filePath}`
505
+ : '__self__';
506
+ const idx = extractSignatureIndex(er.schemaRootPath);
507
+ if (idx !== undefined) {
508
+ if (!existingIndicesByFunction.has(funcKey)) {
509
+ existingIndicesByFunction.set(funcKey, new Set());
510
+ }
511
+ existingIndicesByFunction.get(funcKey)!.add(idx);
512
+ }
513
+ }
514
+
515
+ let hasConflict = false;
516
+ for (const newRoot of equivalentRoots) {
517
+ const funcKey = newRoot.function
518
+ ? `${newRoot.function.name}::${newRoot.function.filePath}`
519
+ : '__self__';
520
+ const newIdx = extractSignatureIndex(newRoot.schemaRootPath);
521
+ if (newIdx !== undefined) {
522
+ const existingIndices = existingIndicesByFunction.get(funcKey);
523
+ if (existingIndices && existingIndices.size > 0) {
524
+ if (!existingIndices.has(newIdx)) {
525
+ hasConflict = true;
526
+ break;
527
+ }
528
+ }
529
+ }
530
+ }
531
+
532
+ if (hasConflict) continue;
282
533
  }
534
+
535
+ equivalentSchemaPathsEntry = candidate;
283
536
  }
284
537
 
285
538
  if (!equivalentSchemaPathsEntry) {
539
+ // Before creating a new entry, filter out roots that have conflicting
540
+ // signature indices from the same function. An entry should never contain
541
+ // roots with different signature indices from the same function.
542
+ // This prevents the bug where signature[1], signature[2], signature[4]
543
+ // all get merged together due to incorrect sourceEquivalencies.
544
+ let filteredRoots = equivalentRoots;
545
+ if (newRootSignatureIndices.size > 1) {
546
+ // There are multiple signature indices - we need to filter to keep only
547
+ // one consistent set. We'll keep the roots that match the PRIMARY index
548
+ // (the first signature index we encounter from self, or the lowest index).
549
+
550
+ // First, determine the primary index - prefer the self root's index
551
+ let primaryIndex: number | undefined;
552
+ for (const root of equivalentRoots) {
553
+ if (!root.function) {
554
+ // This is a self root
555
+ const idx = extractSignatureIndex(root.schemaRootPath);
556
+ if (idx !== undefined) {
557
+ primaryIndex = idx;
558
+ break;
559
+ }
560
+ }
561
+ }
562
+ // If no self root has a signature index, use the lowest index
563
+ if (primaryIndex === undefined) {
564
+ primaryIndex = Math.min(...newRootSignatureIndices);
565
+ }
566
+
567
+ // Filter roots: keep if no signature index OR signature index matches primary
568
+ filteredRoots = equivalentRoots.filter((root) => {
569
+ const idx = extractSignatureIndex(root.schemaRootPath);
570
+ return idx === undefined || idx === primaryIndex;
571
+ });
572
+ }
573
+
286
574
  equivalentSchemaPathsEntry = {
287
- equivalentRoots,
575
+ equivalentRoots: filteredRoots,
288
576
  equivalentPostfixes: {},
289
577
  };
290
578
  equivalentSchemaPaths.push(equivalentSchemaPathsEntry);
291
579
  } else {
292
580
  equivalentSchemaPathsEntry.equivalentRoots.push(...equivalentRoots);
293
581
  }
582
+
583
+ // Deduplicate roots using a Set for O(n) instead of O(n²)
584
+ const seenRoots = new Set<string>();
294
585
  equivalentSchemaPathsEntry.equivalentRoots =
295
- equivalentSchemaPathsEntry.equivalentRoots.filter(
296
- (er, index, self) =>
297
- index ===
298
- self.findIndex(
299
- (e) =>
300
- e.schemaRootPath === er.schemaRootPath &&
301
- e.function?.name === er.function?.name,
302
- ),
303
- );
586
+ equivalentSchemaPathsEntry.equivalentRoots.filter((er) => {
587
+ const key = er.schemaRootPath + '::' + (er.function?.name ?? '');
588
+ if (seenRoots.has(key)) return false;
589
+ seenRoots.add(key);
590
+ return true;
591
+ });
592
+
593
+ // Keep the espIndex in sync after adding/deduplicating roots
594
+ updateEspIndex(equivalentSchemaPathsEntry);
304
595
 
305
596
  return equivalentSchemaPathsEntry;
306
597
  };
@@ -330,20 +621,43 @@ export default function mergeInDependentDataStructure({
330
621
  for (const equivalencies of allEquivalencies) {
331
622
  const schemaPathEntries = Object.entries(equivalencies);
332
623
  for (const [schemaPath, usages] of schemaPathEntries) {
624
+ checkDeadline();
625
+
626
+ // Skip equivalency entries whose source path is a Set/Map membership operation.
627
+ // Patterns like `.has(articleId)`, `.delete(articleId)`, `.add(articleId)` on
628
+ // Sets/Maps represent membership checks, not meaningful data flow for schema generation.
629
+ // In the Margo LibraryPage case, these account for 74% of all equivalency targets
630
+ // (19,444 of 26,340) and cause a combinatorial explosion in the merge.
631
+ if (isCollectionMethodPath(schemaPath)) continue;
632
+
333
633
  // First, check if the raw schemaPath starts with a function call to a dependency.
334
634
  // If so, use that dependency name for translation (so translatePath can strip the prefix).
335
635
  const extractedFuncName = extractFunctionNameFromPath(schemaPath);
336
636
  const effectiveFunctionName = extractedFuncName || functionName;
337
637
  const translatedPath = translatePath(schemaPath, effectiveFunctionName);
338
638
 
339
- const allPaths: { path: string; functionName?: string }[] = [
639
+ const allPathsRaw: { path: string; functionName?: string }[] = [
340
640
  { path: translatedPath, functionName: effectiveFunctionName },
341
- ...usages.map((u) => ({
342
- path: translatePath(u.schemaPath, u.scopeNodeName),
343
- functionName: u.scopeNodeName,
344
- })),
641
+ ...usages
642
+ .filter((u) => !isCollectionMethodPath(u.schemaPath))
643
+ .map((u) => ({
644
+ path: translatePath(u.schemaPath, u.scopeNodeName),
645
+ functionName: u.scopeNodeName,
646
+ })),
345
647
  ].filter((pathInfo) => !pathInfo.path.includes('.map('));
346
648
 
649
+ // Deduplicate by translated path + function name.
650
+ // Multiple call variants (e.g., loadView(viewKey(null,null)) vs loadView(viewKey(newTag,newCol)))
651
+ // translate to the same path after stripping arguments. Processing duplicates
652
+ // creates O(n²) work in the schema matching loops below.
653
+ const seenPathKeys = new Set<string>();
654
+ const allPaths = allPathsRaw.filter((p) => {
655
+ const key = `${p.functionName ?? ''}::${p.path}`;
656
+ if (seenPathKeys.has(key)) return false;
657
+ seenPathKeys.add(key);
658
+ return true;
659
+ });
660
+
347
661
  // Fix 38: Derive base paths from property access paths.
348
662
  // When we have equivalent paths like:
349
663
  // Parent: signature[0].scenarios[].name
@@ -370,9 +684,12 @@ export default function mergeInDependentDataStructure({
370
684
  );
371
685
 
372
686
  const derivedBasePaths: { path: string; functionName?: string }[] = [];
687
+ const allPathSet = new Set(allPaths.map((p) => p.path));
688
+ const derivedBasePathSet = new Set<string>();
373
689
 
374
690
  // For each child path, find its equivalent parent path and derive bases
375
691
  for (const childPathInfo of childPaths) {
692
+ checkDeadline();
376
693
  const childParts = splitOutsideParenthesesAndArrays(
377
694
  childPathInfo.path,
378
695
  );
@@ -446,26 +763,28 @@ export default function mergeInDependentDataStructure({
446
763
  !childHasArrayIterator &&
447
764
  !childBaseIsGenericSignature
448
765
  ) {
449
- // Add child base if not already present
450
- const childBaseExists =
451
- allPaths.some((p) => p.path === childBase) ||
452
- derivedBasePaths.some((p) => p.path === childBase);
453
- if (!childBaseExists) {
766
+ // Add child base if not already present (O(1) Set lookup)
767
+ if (
768
+ !allPathSet.has(childBase) &&
769
+ !derivedBasePathSet.has(childBase)
770
+ ) {
454
771
  derivedBasePaths.push({
455
772
  path: childBase,
456
773
  functionName: childPathInfo.functionName,
457
774
  });
775
+ derivedBasePathSet.add(childBase);
458
776
  }
459
777
 
460
- // Add parent base if not already present
461
- const parentBaseExists =
462
- allPaths.some((p) => p.path === parentBase) ||
463
- derivedBasePaths.some((p) => p.path === parentBase);
464
- if (!parentBaseExists) {
778
+ // Add parent base if not already present (O(1) Set lookup)
779
+ if (
780
+ !allPathSet.has(parentBase) &&
781
+ !derivedBasePathSet.has(parentBase)
782
+ ) {
465
783
  derivedBasePaths.push({
466
784
  path: parentBase,
467
785
  functionName: parentPathInfo.functionName,
468
786
  });
787
+ derivedBasePathSet.add(parentBase);
469
788
  }
470
789
  }
471
790
  }
@@ -476,7 +795,28 @@ export default function mergeInDependentDataStructure({
476
795
  allPaths.push(...derivedBasePaths);
477
796
 
478
797
  const entry = findOrCreateEquivalentSchemaPathsEntry(allPaths);
798
+
799
+ // Trace equivalency gathering - helps debug why paths may not be connected
800
+ if (allPaths.length > 1) {
801
+ transformationTracer.operation(rootScopeName, {
802
+ operation: 'gatherEquivalency',
803
+ stage: 'gathering',
804
+ path: translatedPath,
805
+ context: {
806
+ sourceFunction: functionName,
807
+ equivalentPaths: allPaths.map((p) => ({
808
+ path: p.path,
809
+ function: p.functionName,
810
+ })),
811
+ equivalentRoots: entry.equivalentRoots.map((r) => ({
812
+ path: r.schemaRootPath,
813
+ function: r.function?.name,
814
+ })),
815
+ },
816
+ });
817
+ }
479
818
  for (const equivalentRoot of entry.equivalentRoots) {
819
+ checkDeadline();
480
820
  const dataStructures =
481
821
  equivalentRoot.function &&
482
822
  equivalentRoot.function.name !== rootScopeName
@@ -523,21 +863,21 @@ export default function mergeInDependentDataStructure({
523
863
  }
524
864
 
525
865
  for (const schema of schemas) {
526
- for (const schemaPath in schema) {
527
- let schemaPathParts =
528
- splitOutsideParenthesesAndArrays(schemaPath);
529
-
530
- if (schemaPathParts[0].startsWith(functionName)) {
531
- // Only normalize if the function doesn't have multiple different type parameters
532
- const baseName = cleanFunctionName(schemaPathParts[0]);
533
- if (!functionsWithMultipleTypeParams.has(baseName)) {
534
- schemaPathParts =
535
- schemaPathParts[1] === 'functionCallReturnValue'
536
- ? ['returnValue', ...schemaPathParts.slice(2)]
537
- : schemaPathParts.slice(1);
538
- }
539
- }
540
-
866
+ // Use pre-computed index to only iterate schema entries whose
867
+ // normalized first part matches pathParts[0], instead of all entries.
868
+ const schemaIndex = getSchemaIndex(schema);
869
+ const lookupPart = pathParts[0] ?? '';
870
+ const lookupParenIdx = lookupPart.indexOf('(');
871
+ const lookupBase =
872
+ lookupParenIdx >= 0
873
+ ? lookupPart.slice(0, lookupParenIdx)
874
+ : lookupPart;
875
+ const candidates = schemaIndex.byFirstPart.get(lookupBase) || [];
876
+ for (const {
877
+ path: schemaPath,
878
+ parts: schemaPathParts,
879
+ } of candidates) {
880
+ checkDeadline();
541
881
  if (schemaPathParts.length < pathParts.length) continue;
542
882
 
543
883
  // Check if all path parts match (allowing function call variants)
@@ -606,13 +946,29 @@ export default function mergeInDependentDataStructure({
606
946
  schemaPathParts.slice(matchedUpToIndex),
607
947
  );
608
948
 
609
- entry.equivalentPostfixes[postfix] = entry
610
- .equivalentPostfixes[postfix]
611
- ? bestValueFromOptions([
612
- entry.equivalentPostfixes[postfix],
613
- schema[schemaPath],
614
- ])
615
- : schema[schemaPath];
949
+ const previousValue = entry.equivalentPostfixes[postfix];
950
+ const newValue = schema[schemaPath];
951
+ entry.equivalentPostfixes[postfix] = previousValue
952
+ ? bestValueFromOptions([previousValue, newValue])
953
+ : newValue;
954
+
955
+ // Trace postfix gathering - shows where type info comes from
956
+ if (entry.equivalentPostfixes[postfix] !== previousValue) {
957
+ transformationTracer.operation(rootScopeName, {
958
+ operation: 'gatherPostfix',
959
+ stage: 'gathering',
960
+ path: postfix || '(root)',
961
+ before: previousValue,
962
+ after: entry.equivalentPostfixes[postfix],
963
+ context: {
964
+ sourceSchemaPath: schemaPath,
965
+ sourceFunction:
966
+ equivalentRoot.function?.name || rootScopeName,
967
+ equivalentRootPath: equivalentRoot.schemaRootPath,
968
+ rawValue: newValue,
969
+ },
970
+ });
971
+ }
616
972
  }
617
973
  }
618
974
  }
@@ -629,6 +985,7 @@ export default function mergeInDependentDataStructure({
629
985
  // where we want both X().functionCallReturnValue and Y().functionCallReturnValue as bases
630
986
  const allBasePaths = new Set<string>();
631
987
  for (const path of Object.keys(dataStructure.returnValueSchema)) {
988
+ checkDeadline();
632
989
  const parts = splitOutsideParenthesesAndArrays(path);
633
990
  // Find all positions of functionCallReturnValue and create base paths for each
634
991
  for (let i = 0; i < parts.length; i++) {
@@ -649,13 +1006,21 @@ export default function mergeInDependentDataStructure({
649
1006
  const entry = findOrCreateEquivalentSchemaPathsEntry([
650
1007
  { path: translatedBasePath, functionName: functionName },
651
1008
  ]);
652
- entry.equivalentRoots.push({
1009
+ const newRoot = {
653
1010
  schemaRootPath: translatedBasePath,
654
1011
  function: findRelevantDependency(functionName),
655
- });
1012
+ };
1013
+ entry.equivalentRoots.push(newRoot);
1014
+ // Update index for the newly added root
1015
+ const newRootFuncName = newRoot.function?.name ?? rootScopeName;
1016
+ espIndex.set(
1017
+ espIndexKey(newRoot.schemaRootPath, newRootFuncName),
1018
+ entry,
1019
+ );
656
1020
 
657
1021
  const basePathParts = splitOutsideParenthesesAndArrays(basePath);
658
1022
  for (const schemaPath in dataStructure.returnValueSchema) {
1023
+ checkDeadline();
659
1024
  const schemaPathParts = splitOutsideParenthesesAndArrays(schemaPath);
660
1025
  if (schemaPathParts.length < basePathParts.length) continue;
661
1026
 
@@ -672,14 +1037,14 @@ export default function mergeInDependentDataStructure({
672
1037
  const postfix = joinParenthesesAndArrays(
673
1038
  schemaPathParts.slice(basePathParts.length),
674
1039
  );
675
- entry.equivalentPostfixes[postfix] = entry.equivalentPostfixes[
676
- postfix
677
- ]
1040
+ const newValue = entry.equivalentPostfixes[postfix]
678
1041
  ? bestValueFromOptions([
679
1042
  entry.equivalentPostfixes[postfix],
680
1043
  dataStructure.returnValueSchema[schemaPath],
681
1044
  ])
682
1045
  : dataStructure.returnValueSchema[schemaPath];
1046
+
1047
+ entry.equivalentPostfixes[postfix] = newValue;
683
1048
  }
684
1049
  }
685
1050
  }
@@ -696,6 +1061,7 @@ export default function mergeInDependentDataStructure({
696
1061
  // We do this before the main merge to ensure the connection happens regardless
697
1062
  // of processing order.
698
1063
  for (const esp of equivalentSchemaPaths) {
1064
+ checkDeadline();
699
1065
  for (const root of esp.equivalentRoots) {
700
1066
  if (root.schemaRootPath.endsWith('[]')) {
701
1067
  // Find a matching parent entry with the base array path
@@ -716,6 +1082,7 @@ export default function mergeInDependentDataStructure({
716
1082
  for (const [postfixPath, postfixValue] of Object.entries(
717
1083
  esp.equivalentPostfixes,
718
1084
  )) {
1085
+ checkDeadline();
719
1086
  const transformedPostfix = joinParenthesesAndArrays(
720
1087
  ['[]', postfixPath].filter(Boolean),
721
1088
  );
@@ -734,6 +1101,10 @@ export default function mergeInDependentDataStructure({
734
1101
  equivalentRootFunction: (typeof equivalentSchemaPaths)[0]['equivalentRoots'][0]['function'],
735
1102
  ) => {
736
1103
  let postfix: string | undefined;
1104
+
1105
+ // Get the signature index we're looking for (if any)
1106
+ const lookingForSignatureIndex = extractSignatureIndex(schemaSubPath);
1107
+
737
1108
  const equivalentEntry = mergedEquivalentSchemaPaths.find((esp) =>
738
1109
  esp.equivalentRoots.some((er) => {
739
1110
  if (
@@ -746,6 +1117,35 @@ export default function mergeInDependentDataStructure({
746
1117
  }
747
1118
 
748
1119
  if (schemaSubPath === er.schemaRootPath) {
1120
+ // Additional check: if we're looking for a signature path, make sure
1121
+ // the entry doesn't already have DIFFERENT signature indices.
1122
+ // This prevents entries with signature[1], signature[2], signature[4]
1123
+ // from all being merged together.
1124
+ if (lookingForSignatureIndex !== undefined) {
1125
+ const hasConflictingSignatureIndex = esp.equivalentRoots.some(
1126
+ (otherRoot) => {
1127
+ // Only check roots from the same function
1128
+ if (
1129
+ otherRoot.function?.name !== equivalentRootFunction?.name ||
1130
+ otherRoot.function?.filePath !==
1131
+ equivalentRootFunction?.filePath
1132
+ ) {
1133
+ return false;
1134
+ }
1135
+ const otherIndex = extractSignatureIndex(
1136
+ otherRoot.schemaRootPath,
1137
+ );
1138
+ return (
1139
+ otherIndex !== undefined &&
1140
+ otherIndex !== lookingForSignatureIndex
1141
+ );
1142
+ },
1143
+ );
1144
+ if (hasConflictingSignatureIndex) {
1145
+ return false;
1146
+ }
1147
+ }
1148
+
749
1149
  postfix = er.postfix;
750
1150
  return true;
751
1151
  }
@@ -772,6 +1172,7 @@ export default function mergeInDependentDataStructure({
772
1172
  );
773
1173
 
774
1174
  for (const esp of sortedEquivalentSchemaPaths) {
1175
+ checkDeadline();
775
1176
  if (esp.equivalentRoots.length === 0) continue;
776
1177
  let bestCandidateLength: number | undefined;
777
1178
  let bestCandidate: (typeof equivalentSchemaPaths)[0] | undefined;
@@ -853,6 +1254,7 @@ export default function mergeInDependentDataStructure({
853
1254
  // dependencySchemas contains usage information (how dependencies are called),
854
1255
  // not internal implementation, so we want this for mocked dependencies too
855
1256
  for (const dependency of importedExports) {
1257
+ checkDeadline();
856
1258
  const dependentDataStructure =
857
1259
  dependencySchemas?.[dependency.filePath]?.[dependency.name];
858
1260
  if (!dependentDataStructure) continue;
@@ -877,10 +1279,75 @@ export default function mergeInDependentDataStructure({
877
1279
  }
878
1280
  }
879
1281
 
1282
+ const gatherElapsed = Date.now() - mergeStartTime;
1283
+
880
1284
  equivalentSchemaPaths = mergeAllEquivalentSchemaPaths();
881
1285
 
1286
+ const mergeEspElapsed = Date.now() - mergeStartTime;
1287
+
1288
+ // Collect schemas that need cleaning — batch the calls for the end instead of
1289
+ // calling cleanSchema inside the inner root loop (which was O(roots * schemaSize)).
1290
+ const schemasToClean = new Set<{ [key: string]: string }>();
1291
+
882
1292
  for (const esp of equivalentSchemaPaths) {
883
- for (const equivalentRoot of esp.equivalentRoots) {
1293
+ checkDeadline();
1294
+ // Pre-compute which postfixes have children to avoid O(n²) lookups in the inner loop.
1295
+ // A postfix "has children" if there are other postfixes that extend it.
1296
+ const postfixesWithChildren = new Set<string>();
1297
+ const postfixKeys = Object.keys(esp.equivalentPostfixes);
1298
+
1299
+ // Pre-parse ALL postfix paths once. These parsed parts are reused in:
1300
+ // 1. The children detection loop below
1301
+ // 2. The inner postfix application loop (lines that split postfixPath and equivalentRoot.postfix)
1302
+ // This eliminates thousands of redundant splitOutsideParenthesesAndArrays calls.
1303
+ const postfixPartsCache = new Map<string, string[]>();
1304
+ for (const postfixPath of postfixKeys) {
1305
+ if (!postfixPath) continue;
1306
+ postfixPartsCache.set(
1307
+ postfixPath,
1308
+ splitOutsideParenthesesAndArrays(postfixPath),
1309
+ );
1310
+ }
1311
+
1312
+ // Check for empty postfix having children (any other postfixes exist)
1313
+ if (postfixKeys.length > 1 && '' in esp.equivalentPostfixes) {
1314
+ postfixesWithChildren.add('');
1315
+ }
1316
+
1317
+ // Check for array element postfixes having children using a prefix set.
1318
+ // This avoids O(n²) scans across large postfix lists.
1319
+ // e.g., 'currentEntities[]' has children if a path like 'currentEntities[].sha' exists.
1320
+ const postfixPrefixSet = new Set<string>();
1321
+ for (const postfixPath of postfixKeys) {
1322
+ if (!postfixPath) continue;
1323
+ const parts = postfixPartsCache.get(postfixPath)!;
1324
+ for (let i = 1; i < parts.length; i++) {
1325
+ postfixPrefixSet.add(joinParenthesesAndArrays(parts.slice(0, i)));
1326
+ }
1327
+ }
1328
+ for (const postfixPath of postfixKeys) {
1329
+ if (postfixPath.endsWith('[]') && postfixPrefixSet.has(postfixPath)) {
1330
+ postfixesWithChildren.add(postfixPath);
1331
+ }
1332
+ }
1333
+
1334
+ // Deduplicate equivalentRoots that would write to the same schema paths.
1335
+ // Roots with the same (function, schemaRootPath, postfix) are redundant.
1336
+ const seenRootKeys = new Set<string>();
1337
+ const uniqueRoots = esp.equivalentRoots.filter((root) => {
1338
+ const key = `${root.function?.filePath ?? ''}::${root.function?.name ?? ''}::${root.schemaRootPath}::${root.postfix ?? ''}`;
1339
+ if (seenRootKeys.has(key)) return false;
1340
+ seenRootKeys.add(key);
1341
+ return true;
1342
+ });
1343
+
1344
+ // Cap schema size to prevent combinatorial explosion.
1345
+ // Successful merges produce <3K ret keys. Beyond 5K, further postfixes
1346
+ // add noise but no useful data — they're cross-products of unrelated equivalencies.
1347
+ const SCHEMA_KEY_CAP = 5_000;
1348
+
1349
+ for (const equivalentRoot of uniqueRoots) {
1350
+ checkDeadline();
884
1351
  let merged:
885
1352
  | {
886
1353
  signatureSchema: { [key: string]: string };
@@ -900,20 +1367,44 @@ export default function mergeInDependentDataStructure({
900
1367
  ? merged.signatureSchema
901
1368
  : merged.returnValueSchema;
902
1369
 
1370
+ // Skip if this schema has already grown past the cap
1371
+ if (Object.keys(schema).length > SCHEMA_KEY_CAP) continue;
1372
+
903
1373
  for (const [postfixPath, postfixValue] of Object.entries(
904
1374
  esp.equivalentPostfixes,
905
1375
  )) {
1376
+ checkDeadline();
906
1377
  let relevantPostfix = postfixPath;
907
1378
  if (equivalentRoot.postfix) {
1379
+ // Check if postfixPath starts with equivalentRoot.postfix at a path boundary.
1380
+ // Must ensure exact path part match - "entityCode" should NOT match "entity" prefix.
1381
+ // Valid: "entity.foo" starts with "entity" (boundary at '.')
1382
+ // Valid: "entity[0]" starts with "entity" (boundary at '[')
1383
+ // Invalid: "entityCode" starts with "entity" (no boundary, different property)
908
1384
  if (!postfixPath.startsWith(equivalentRoot.postfix)) {
909
1385
  continue;
910
1386
  }
1387
+ // Additional check: ensure the match is at a path boundary
1388
+ const nextChar = postfixPath[equivalentRoot.postfix.length];
1389
+ if (nextChar !== undefined && nextChar !== '.' && nextChar !== '[') {
1390
+ // The postfixPath continues with more characters that aren't a path separator.
1391
+ // This means "entity" matched "entityCode" which is wrong - they're different properties.
1392
+ continue;
1393
+ }
911
1394
 
912
1395
  const postFixPathParts =
1396
+ postfixPartsCache.get(postfixPath) ??
913
1397
  splitOutsideParenthesesAndArrays(postfixPath);
914
- const equivalentRootPostFixParts = splitOutsideParenthesesAndArrays(
1398
+ // Cache equivalentRoot.postfix parts — same root reused across all postfixes
1399
+ if (!postfixPartsCache.has(equivalentRoot.postfix)) {
1400
+ postfixPartsCache.set(
1401
+ equivalentRoot.postfix,
1402
+ splitOutsideParenthesesAndArrays(equivalentRoot.postfix),
1403
+ );
1404
+ }
1405
+ const equivalentRootPostFixParts = postfixPartsCache.get(
915
1406
  equivalentRoot.postfix,
916
- );
1407
+ )!;
917
1408
  relevantPostfix = joinParenthesesAndArrays(
918
1409
  postFixPathParts.slice(equivalentRootPostFixParts.length),
919
1410
  );
@@ -924,13 +1415,102 @@ export default function mergeInDependentDataStructure({
924
1415
  relevantPostfix,
925
1416
  ]);
926
1417
 
1418
+ // Skip paths that would go through a primitive type
1419
+ // e.g., if schema has 'entities[].scenarioCount': 'number', skip 'entities[].scenarioCount.sha'
1420
+ if (wouldGoThroughPrimitive(newSchemaPath, schema)) {
1421
+ transformationTracer.operation(rootScopeName, {
1422
+ operation: 'skipPrimitivePath',
1423
+ stage: 'merged',
1424
+ path: newSchemaPath,
1425
+ context: {
1426
+ reason: 'would go through primitive type',
1427
+ postfixValue,
1428
+ },
1429
+ });
1430
+ continue;
1431
+ }
1432
+
1433
+ // Skip setting primitive type when there are child postfixes that indicate structure.
1434
+ // This prevents downgrading an object/array element to a primitive type.
1435
+ // Uses pre-computed postfixesWithChildren Set for O(1) lookup instead of O(n) iteration.
1436
+ const hasChildPostfixes =
1437
+ (relevantPostfix === '' || relevantPostfix.endsWith('[]')) &&
1438
+ postfixesWithChildren.has(postfixPath);
1439
+ if (PRIMITIVE_TYPES.has(postfixValue) && hasChildPostfixes) {
1440
+ continue;
1441
+ }
1442
+
1443
+ // Don't overwrite a more specific type with a less specific one
1444
+ // This can happen when nested roots share entries with their parent roots
1445
+ const existingType = schema[newSchemaPath];
1446
+ if (existingType) {
1447
+ // Don't overwrite a primitive type with 'object' or 'array'
1448
+ // e.g., if schema has 'entities[].scenarioCount': 'number', don't overwrite with 'object'
1449
+ if (
1450
+ PRIMITIVE_TYPES.has(existingType) &&
1451
+ (postfixValue === 'object' || postfixValue === 'array')
1452
+ ) {
1453
+ transformationTracer.operation(rootScopeName, {
1454
+ operation: 'skipTypeDowngrade',
1455
+ stage: 'merged',
1456
+ path: newSchemaPath,
1457
+ context: {
1458
+ reason: 'would overwrite primitive with object/array',
1459
+ existingType,
1460
+ newType: postfixValue,
1461
+ },
1462
+ });
1463
+ continue;
1464
+ }
1465
+ // Don't overwrite a complex/union type with a primitive
1466
+ // e.g., if schema has 'scenarios[]': 'Scenario | null', don't overwrite with 'string'
1467
+ if (
1468
+ !PRIMITIVE_TYPES.has(existingType) &&
1469
+ PRIMITIVE_TYPES.has(postfixValue)
1470
+ ) {
1471
+ transformationTracer.operation(rootScopeName, {
1472
+ operation: 'skipTypeDowngrade',
1473
+ stage: 'merged',
1474
+ path: newSchemaPath,
1475
+ context: {
1476
+ reason: 'would overwrite complex type with primitive',
1477
+ existingType,
1478
+ newType: postfixValue,
1479
+ },
1480
+ });
1481
+ continue;
1482
+ }
1483
+ }
1484
+
1485
+ // Log the successful postfix merge
1486
+ transformationTracer.operation(rootScopeName, {
1487
+ operation: 'mergePostfix',
1488
+ stage: 'merged',
1489
+ path: newSchemaPath,
1490
+ before: existingType,
1491
+ after: postfixValue,
1492
+ context: {
1493
+ schemaRootPath: equivalentRoot.schemaRootPath,
1494
+ postfix: relevantPostfix,
1495
+ dependency: equivalentRoot.function?.name,
1496
+ },
1497
+ });
927
1498
  schema[newSchemaPath] = postfixValue;
928
1499
  }
929
1500
 
930
- cleanSchema(schema);
1501
+ schemasToClean.add(schema);
931
1502
  }
932
1503
  }
933
1504
 
1505
+ const postfixElapsed = Date.now() - mergeStartTime;
1506
+
1507
+ // Batch-clean all modified schemas once (instead of once per root per ESP entry)
1508
+ for (const schema of schemasToClean) {
1509
+ cleanSchema(schema, { stage: 'afterMergePostfix' });
1510
+ }
1511
+
1512
+ const cleanElapsed = Date.now() - mergeStartTime;
1513
+
934
1514
  // Propagate equivalency-derived attributes to generic function call variants.
935
1515
  // When attributes are traced via equivalencies (e.g., fileComparisons from buildDataMap.signature[2]),
936
1516
  // they get written to non-generic paths (returnValue.data.x or funcName().functionCallReturnValue.data.x).
@@ -956,6 +1536,7 @@ export default function mergeInDependentDataStructure({
956
1536
  );
957
1537
 
958
1538
  for (const path in schemaToSearchForGenericVariants) {
1539
+ checkDeadline();
959
1540
  const match = path.match(genericRegex);
960
1541
  if (match) {
961
1542
  genericVariants.add(match[0]);
@@ -969,6 +1550,7 @@ export default function mergeInDependentDataStructure({
969
1550
  const pathsToAdd: [string, string][] = [];
970
1551
 
971
1552
  for (const path in returnValueSchema) {
1553
+ checkDeadline();
972
1554
  const value = returnValueSchema[path];
973
1555
 
974
1556
  // Handle returnValue. paths
@@ -1022,6 +1604,7 @@ export default function mergeInDependentDataStructure({
1022
1604
  // This includes both returnValue. (dot) and returnValue[ (array) paths.
1023
1605
  const pathsToNormalize: [string, string][] = [];
1024
1606
  for (const path in depSchema.returnValueSchema) {
1607
+ checkDeadline();
1025
1608
  if (
1026
1609
  path === 'returnValue' ||
1027
1610
  path.startsWith('returnValue.') ||
@@ -1049,11 +1632,20 @@ export default function mergeInDependentDataStructure({
1049
1632
  `${dependency.name}().functionCallReturnValue`,
1050
1633
  );
1051
1634
  }
1635
+ transformationTracer.operation(rootScopeName, {
1636
+ operation: 'normalizeReturnValuePath',
1637
+ stage: 'merged',
1638
+ path: normalizedPath,
1639
+ before: path,
1640
+ after: normalizedPath,
1641
+ context: { dependency: dependency.name, value },
1642
+ });
1052
1643
  depSchema.returnValueSchema[normalizedPath] = value;
1053
1644
  }
1054
1645
 
1055
1646
  // Now copy paths from the source schema (dependencySchemas)
1056
1647
  for (const path in srcSchema.returnValueSchema) {
1648
+ checkDeadline();
1057
1649
  const value = srcSchema.returnValueSchema[path];
1058
1650
 
1059
1651
  // Normalize paths starting with 'returnValue' to use the standard format:
@@ -1133,7 +1725,10 @@ export default function mergeInDependentDataStructure({
1133
1725
  }
1134
1726
  }
1135
1727
 
1136
- cleanSchema(depSchema.returnValueSchema);
1728
+ cleanSchema(depSchema.returnValueSchema, {
1729
+ stage: 'afterMockedDependencyMerge',
1730
+ dependency: dependency.name,
1731
+ });
1137
1732
 
1138
1733
  // Pull signature requirements from downstream functions into the mocked return value.
1139
1734
  // When a mocked function's return flows into another function's signature (via usageEquivalencies),
@@ -1210,7 +1805,10 @@ export default function mergeInDependentDataStructure({
1210
1805
  }
1211
1806
  }
1212
1807
 
1213
- cleanSchema(depSchema.returnValueSchema);
1808
+ cleanSchema(depSchema.returnValueSchema, {
1809
+ stage: 'afterSignatureRequirementsMerge',
1810
+ dependency: dependency.name,
1811
+ });
1214
1812
  }
1215
1813
 
1216
1814
  // Process the input dependencySchemas FIRST (before child dependentAnalyses).
@@ -1241,9 +1839,11 @@ export default function mergeInDependentDataStructure({
1241
1839
  if (!existingSchema) {
1242
1840
  const depSchema = findOrCreateDependentSchemas({ filePath, name });
1243
1841
  for (const path in srcSchema.returnValueSchema) {
1842
+ checkDeadline();
1244
1843
  depSchema.returnValueSchema[path] = srcSchema.returnValueSchema[path];
1245
1844
  }
1246
1845
  for (const path in srcSchema.signatureSchema) {
1846
+ checkDeadline();
1247
1847
  depSchema.signatureSchema[path] = srcSchema.signatureSchema[path];
1248
1848
  }
1249
1849
 
@@ -1251,7 +1851,46 @@ export default function mergeInDependentDataStructure({
1251
1851
  // from the copied schema. Without this, method call paths on primitives like
1252
1852
  // "projectSlug.replace(...)" would cause convertDotNotation to create nested
1253
1853
  // object structures instead of preserving the primitive type.
1254
- cleanSchema(depSchema.returnValueSchema);
1854
+ cleanSchema(depSchema.returnValueSchema, {
1855
+ stage: 'afterDependencySchemaCopy',
1856
+ filePath,
1857
+ dependency: name,
1858
+ });
1859
+ }
1860
+
1861
+ // TYPE REFINEMENT: Check if dependentAnalyses has a more specific type for this dependency.
1862
+ // When a parent passes `entity.filePath` (string | undefined) to a child component
1863
+ // that requires `filePath: string`, we should use the child's more specific type.
1864
+ // This prevents mock data from having undefined values for required props.
1865
+ //
1866
+ // This runs REGARDLESS of whether equivalencies already processed the schema,
1867
+ // because equivalencies copy the parent's type (string | undefined), not the child's
1868
+ // required type (string).
1869
+ const depSchema = findOrCreateDependentSchemas({ filePath, name });
1870
+ const childAnalysis = dependentAnalyses[filePath]?.[name];
1871
+ const childSignatureSchema =
1872
+ childAnalysis?.metadata?.mergedDataStructure?.signatureSchema;
1873
+
1874
+ if (childSignatureSchema) {
1875
+ for (const path in depSchema.signatureSchema) {
1876
+ checkDeadline();
1877
+ const parentType = depSchema.signatureSchema[path];
1878
+ const childType = childSignatureSchema[path];
1879
+
1880
+ if (parentType && childType) {
1881
+ // Check if parent has optional type and child has required type
1882
+ const parentIsOptional =
1883
+ parentType.includes('| undefined') ||
1884
+ parentType.includes('| null');
1885
+ const childIsOptional =
1886
+ childType.includes('| undefined') || childType.includes('| null');
1887
+
1888
+ // If child requires a more specific type (not optional), use it
1889
+ if (parentIsOptional && !childIsOptional) {
1890
+ depSchema.signatureSchema[path] = childType;
1891
+ }
1892
+ }
1893
+ }
1255
1894
  }
1256
1895
 
1257
1896
  // For functions with multiple different type parameters, also create separate entries
@@ -1283,12 +1922,18 @@ export default function mergeInDependentDataStructure({
1283
1922
 
1284
1923
  // Copy only paths that belong to this variant
1285
1924
  for (const path in srcSchema.returnValueSchema) {
1925
+ checkDeadline();
1286
1926
  if (path.startsWith(variant)) {
1287
1927
  variantSchema.returnValueSchema[path] =
1288
1928
  srcSchema.returnValueSchema[path];
1289
1929
  }
1290
1930
  }
1291
- cleanSchema(variantSchema.returnValueSchema);
1931
+ cleanSchema(variantSchema.returnValueSchema, {
1932
+ stage: 'afterTypeVariantCopy',
1933
+ filePath,
1934
+ dependency: name,
1935
+ variant,
1936
+ });
1292
1937
  }
1293
1938
  }
1294
1939
  }
@@ -1300,6 +1945,7 @@ export default function mergeInDependentDataStructure({
1300
1945
  // EXCEPT: Skip mocked dependencies - we don't want their internal implementation details.
1301
1946
  for (const filePath in dependentAnalyses) {
1302
1947
  for (const name in dependentAnalyses[filePath]) {
1948
+ checkDeadline();
1303
1949
  const dependentMergedDataStructure =
1304
1950
  dependentAnalyses[filePath][name].metadata?.mergedDataStructure;
1305
1951
 
@@ -1316,6 +1962,7 @@ export default function mergeInDependentDataStructure({
1316
1962
  // Copy over all paths from the dependent's returnValueSchema
1317
1963
  // Only add paths that don't already exist (don't overwrite values set by equivalencies)
1318
1964
  for (const path in dependentMergedDataStructure.returnValueSchema) {
1965
+ checkDeadline();
1319
1966
  const translatedPath = translatePath(path, name);
1320
1967
  if (!(translatedPath in depSchema.returnValueSchema)) {
1321
1968
  depSchema.returnValueSchema[translatedPath] =
@@ -1325,6 +1972,7 @@ export default function mergeInDependentDataStructure({
1325
1972
 
1326
1973
  // Copy over signature schema as well
1327
1974
  for (const path in dependentMergedDataStructure.signatureSchema) {
1975
+ checkDeadline();
1328
1976
  const translatedPath = translatePath(path, name);
1329
1977
  if (!(translatedPath in depSchema.signatureSchema)) {
1330
1978
  depSchema.signatureSchema[translatedPath] =
@@ -1351,13 +1999,15 @@ export default function mergeInDependentDataStructure({
1351
1999
 
1352
2000
  // Merge in the nested dependency schemas
1353
2001
  for (const path in nestedDepSchema.returnValueSchema) {
2002
+ checkDeadline();
1354
2003
  if (!(path in targetDepSchema.returnValueSchema)) {
1355
- targetDepSchema.returnValueSchema[path] =
1356
- nestedDepSchema.returnValueSchema[path];
2004
+ const value = nestedDepSchema.returnValueSchema[path];
2005
+ targetDepSchema.returnValueSchema[path] = value;
1357
2006
  }
1358
2007
  }
1359
2008
 
1360
2009
  for (const path in nestedDepSchema.signatureSchema) {
2010
+ checkDeadline();
1361
2011
  if (!(path in targetDepSchema.signatureSchema)) {
1362
2012
  targetDepSchema.signatureSchema[path] =
1363
2013
  nestedDepSchema.signatureSchema[path];
@@ -1369,5 +2019,15 @@ export default function mergeInDependentDataStructure({
1369
2019
  }
1370
2020
  }
1371
2021
 
2022
+ const totalElapsed = Date.now() - mergeStartTime;
2023
+ const retKeys = Object.keys(mergedDataStructure.returnValueSchema).length;
2024
+
2025
+ // Only log phase breakdown for slow merges (>2s)
2026
+ if (totalElapsed > 2000) {
2027
+ console.log(
2028
+ `CodeYam Log Level 2: ${rootScopeName} merge phases: gather=${gatherElapsed}ms mergeESP=${mergeEspElapsed - gatherElapsed}ms postfix=${postfixElapsed - mergeEspElapsed}ms clean=${cleanElapsed - postfixElapsed}ms depCopy=${totalElapsed - cleanElapsed}ms total=${totalElapsed}ms ret=${retKeys}`,
2029
+ );
2030
+ }
2031
+
1372
2032
  return mergedDataStructure;
1373
2033
  }