@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
@@ -1,5 +1,6 @@
1
1
  import { splitOutsideParenthesesAndArrays, joinParenthesesAndArrays, } from "../../../../../../packages/ai/index.js";
2
2
  import { cleanKnownObjectFunctionsFromMapping } from "../../../../../../packages/ai/index.js";
3
+ import { transformationTracer } from "./TransformationTracer.js";
3
4
  function cleanFunctionName(functionName) {
4
5
  return functionName?.split('<')[0];
5
6
  }
@@ -24,6 +25,66 @@ function getTypeParameter(functionName) {
24
25
  }
25
26
  return null;
26
27
  }
28
+ /**
29
+ * Check if a schema path contains a Set/Map collection method call.
30
+ * Paths like `.has(articleId)`, `.delete(articleId)`, `.add(articleId)` represent
31
+ * membership checks on Sets/Maps, not meaningful data flow for schema generation.
32
+ * These create massive combinatorial explosions when every filter field (filterRatings,
33
+ * filterPublications, filterAuthors, etc.) × every method (has, delete, add) gets
34
+ * tracked as a separate equivalency.
35
+ */
36
+ const COLLECTION_METHOD_PATTERN = /\.(?:has|delete|add|clear|get|set)\(/;
37
+ function isCollectionMethodPath(path) {
38
+ return COLLECTION_METHOD_PATTERN.test(path);
39
+ }
40
+ // Primitive types that should not have child paths
41
+ const PRIMITIVE_TYPES = new Set([
42
+ 'number',
43
+ 'string',
44
+ 'boolean',
45
+ 'null',
46
+ 'undefined',
47
+ ]);
48
+ // Check if a type string represents a primitive type
49
+ // Handles union types like "string | undefined" or "number | null"
50
+ // Also handles string literal unions like "'suggestion' | 'warning' | 'tip'"
51
+ function isPrimitiveType(typeStr) {
52
+ if (PRIMITIVE_TYPES.has(typeStr)) {
53
+ return true;
54
+ }
55
+ // Check union types - if ALL parts of the union are primitives, it's primitive
56
+ // e.g., "string | undefined" -> ["string", "undefined"] -> both are primitive -> true
57
+ // e.g., "object | null" -> ["object", "null"] -> object is not primitive -> false
58
+ // e.g., "'suggestion' | 'warning'" -> string literal union -> true
59
+ if (typeStr.includes('|')) {
60
+ const parts = typeStr.split('|').map((p) => p.trim());
61
+ return parts.every((part) => PRIMITIVE_TYPES.has(part) ||
62
+ // String literal values like 'suggestion', 'warning' are primitives
63
+ (part.startsWith("'") && part.endsWith("'")));
64
+ }
65
+ return false;
66
+ }
67
+ // Extract signature index from a path like "signature[0]" or "signature[0].foo"
68
+ // Returns the index number or undefined if not a signature path
69
+ function extractSignatureIndex(path) {
70
+ const match = path.match(/^signature\[(\d+)\]/);
71
+ return match ? parseInt(match[1], 10) : undefined;
72
+ }
73
+ // Check if a new schema path would go through a primitive type
74
+ // e.g., if schema has 'entities[].scenarioCount': 'number', then
75
+ // 'entities[].scenarioCount.sha' would go through a primitive and should be rejected
76
+ function wouldGoThroughPrimitive(newPath, schema) {
77
+ const pathParts = splitOutsideParenthesesAndArrays(newPath);
78
+ // Check each prefix of the path (excluding the full path itself)
79
+ for (let i = 1; i < pathParts.length; i++) {
80
+ const prefixPath = joinParenthesesAndArrays(pathParts.slice(0, i));
81
+ const prefixType = schema[prefixPath];
82
+ if (prefixType && isPrimitiveType(prefixType)) {
83
+ return true;
84
+ }
85
+ }
86
+ return false;
87
+ }
27
88
  // Check if schemaPathPart matches or is a function call variant of pathPart
28
89
  // e.g., 'isEntityBeingAnalyzed(entity.sha)' matches 'isEntityBeingAnalyzed'
29
90
  function pathPartMatches(pathPart, schemaPathPart) {
@@ -38,15 +99,47 @@ function pathPartMatches(pathPart, schemaPathPart) {
38
99
  }
39
100
  function bestValueFromOptions(options) {
40
101
  options = options.filter(Boolean);
41
- const known = options.find((o) => !o.includes('unknown'));
42
- if (known)
43
- return known;
102
+ const known = options.filter((o) => !o.includes('unknown'));
103
+ if (known.length > 0) {
104
+ // Among known values, prefer string literal unions over bare primitives.
105
+ // e.g., "'draft' | 'inProgress' | 'paused' | 'completed'" is more specific than "string".
106
+ // This handles cases where a dependency schema has a bare type like "string" but the
107
+ // child entity's analysis has the actual literal union from TypeScript type resolution.
108
+ if (known.length > 1 && known.some((o) => PRIMITIVE_TYPES.has(o))) {
109
+ const literalUnion = known.find((o) => !PRIMITIVE_TYPES.has(o) && o.includes("'"));
110
+ if (literalUnion) {
111
+ return literalUnion;
112
+ }
113
+ }
114
+ return known[0];
115
+ }
44
116
  const notUnknown = options.find((o) => o !== 'unknown');
45
- if (notUnknown)
117
+ if (notUnknown) {
46
118
  return notUnknown;
119
+ }
47
120
  return options[0] ?? 'unknown';
48
121
  }
49
- export default function mergeInDependentDataStructure({ importedExports, dependentAnalyses, rootScopeName, dataStructure, dependencySchemas, }) {
122
+ /** Timeout (ms) for the merge operation. Throws DataStructureTimeoutError if exceeded.
123
+ * All successful merges complete in <300ms. Anything exceeding 2s is pathological. */
124
+ const MERGE_TIMEOUT_MS = 2000;
125
+ export class DataStructureTimeoutError extends Error {
126
+ constructor(entityName, elapsedMs) {
127
+ super(`Data structure merge timed out for ${entityName} after ${Math.round(elapsedMs / 1000)}s (limit: ${MERGE_TIMEOUT_MS / 1000}s)`);
128
+ this.name = 'DataStructureTimeoutError';
129
+ }
130
+ }
131
+ export default function mergeInDependentDataStructure({ importedExports, dependentAnalyses, rootScopeName, dataStructure, dependencySchemas, timeoutMs = MERGE_TIMEOUT_MS, }) {
132
+ const mergeStartTime = Date.now();
133
+ const mergeDeadline = timeoutMs > 0 ? mergeStartTime + timeoutMs : 0;
134
+ /** Call in hot loops. Throws DataStructureTimeoutError if deadline exceeded.
135
+ * Date.now() is ~20ns — negligible vs the ms-scale string ops in each iteration. */
136
+ const checkDeadline = () => {
137
+ if (!mergeDeadline)
138
+ return;
139
+ if (Date.now() > mergeDeadline) {
140
+ throw new DataStructureTimeoutError(rootScopeName, Date.now() - mergeStartTime);
141
+ }
142
+ };
50
143
  const mergedDataStructure = {
51
144
  signatureSchema: { ...(dataStructure.signatureSchema ?? {}) },
52
145
  returnValueSchema: { ...(dataStructure.returnValueSchema ?? {}) },
@@ -88,8 +181,32 @@ export default function mergeInDependentDataStructure({ importedExports, depende
88
181
  }
89
182
  }
90
183
  let equivalentSchemaPaths = [];
184
+ // O(1) index for findOrCreateEquivalentSchemaPathsEntry.
185
+ // Maps "(rootPath)::(normalizedFuncName)" → the entry containing that root.
186
+ // This replaces the O(E) linear search that was causing O(E²) gather performance.
187
+ const espIndex = new Map();
188
+ const espIndexKey = (path, functionName) => {
189
+ const normalized = cleanFunctionName(functionName);
190
+ const funcKey = normalized === rootScopeName ? '__self__' : normalized || '__self__';
191
+ return `${path}::${funcKey}`;
192
+ };
193
+ const updateEspIndex = (entry) => {
194
+ for (const root of entry.equivalentRoots) {
195
+ const funcName = root.function?.name ?? rootScopeName;
196
+ espIndex.set(espIndexKey(root.schemaRootPath, funcName), entry);
197
+ }
198
+ };
199
+ // Pre-build a lookup map from cleaned function name to dependency for O(1) lookups.
200
+ // This avoids O(n) linear search in findRelevantDependency which was causing O(n²) performance.
201
+ const dependencyByCleanedName = new Map();
202
+ for (const dep of importedExports) {
203
+ const cleanedName = cleanFunctionName(dep.name);
204
+ if (!dependencyByCleanedName.has(cleanedName)) {
205
+ dependencyByCleanedName.set(cleanedName, dep);
206
+ }
207
+ }
91
208
  const findRelevantDependency = (functionName) => {
92
- return importedExports.find((d) => cleanFunctionName(d.name) === cleanFunctionName(functionName));
209
+ return dependencyByCleanedName.get(cleanFunctionName(functionName));
93
210
  };
94
211
  const findRelevantDependentDataStructure = (functionName) => {
95
212
  const dependency = findRelevantDependency(functionName);
@@ -117,10 +234,19 @@ export default function mergeInDependentDataStructure({ importedExports, depende
117
234
  });
118
235
  return mergedDataStructure.dependencySchemas[filePath][name];
119
236
  };
120
- const cleanSchema = (schema) => {
121
- cleanKnownObjectFunctionsFromMapping(schema);
237
+ const cleanSchema = (schema, context) => {
238
+ transformationTracer.traceSchemaTransform(rootScopeName, 'cleanKnownObjectFunctionsFromMapping', schema, cleanKnownObjectFunctionsFromMapping, context);
122
239
  };
240
+ // Cache translatePath results — the same path is often translated multiple times
241
+ // (once per equivalency entry that references it). Avoids redundant
242
+ // splitOutsideParenthesesAndArrays calls on long paths.
243
+ const translatePathCache = new Map();
123
244
  const translatePath = (path, dependencyName) => {
245
+ const cacheKey = `${dependencyName}\0${path}`;
246
+ const cached = translatePathCache.get(cacheKey);
247
+ if (cached !== undefined)
248
+ return cached;
249
+ let result = path;
124
250
  if (path.startsWith(dependencyName)) {
125
251
  const pathParts = splitOutsideParenthesesAndArrays(path);
126
252
  if (pathParts.length > 1) {
@@ -128,36 +254,65 @@ export default function mergeInDependentDataStructure({ importedExports, depende
128
254
  // Check if this function has multiple DIFFERENT type parameters.
129
255
  // If so, DON'T normalize to returnValue - keep the full path to avoid
130
256
  // merging different type-parameterized variants together.
131
- // e.g., useFetcher<{ data: UserData }>().functionCallReturnValue.data
132
- // should NOT be merged with useFetcher<{ data: ConfigData }>().functionCallReturnValue.data
133
257
  const baseName = cleanFunctionName(pathParts[0]);
134
- if (functionsWithMultipleTypeParams.has(baseName)) {
135
- return path; // Keep the original path with type parameters
258
+ if (!functionsWithMultipleTypeParams.has(baseName)) {
259
+ // functionCallReturnValue immediately follows - normalize to returnValue
260
+ result = joinParenthesesAndArrays([
261
+ 'returnValue',
262
+ ...pathParts.slice(2),
263
+ ]);
136
264
  }
137
- // functionCallReturnValue immediately follows - normalize to returnValue
138
- // e.g., useAuth().functionCallReturnValue.user -> returnValue.user
139
- return joinParenthesesAndArrays([
140
- 'returnValue',
141
- ...pathParts.slice(2),
142
- ]);
143
265
  }
144
266
  else if (pathParts[0].endsWith(')') &&
145
267
  pathParts[1].startsWith('signature[')) {
146
- // Hook-style with signature access (e.g., BranchChangesTab().signature[0]...)
147
- // Strip the function name for signature equivalency matching
148
- return joinParenthesesAndArrays(pathParts.slice(1));
268
+ // Hook-style with signature access
269
+ result = joinParenthesesAndArrays(pathParts.slice(1));
149
270
  }
150
- // For all other cases (object-style APIs like getSupabase().auth and
151
- // direct object references like supabase.from), preserve the path as-is.
152
- // The prefix must be kept for proper schema lookups in constructMockCode
153
- // and gatherDataForMocks.
154
271
  }
155
272
  }
156
- return path;
273
+ translatePathCache.set(cacheKey, result);
274
+ return result;
157
275
  };
158
276
  const gatherAllEquivalentSchemaPaths = (functionName, sourceAndUsageEquivalencies, dataStructure) => {
277
+ checkDeadline();
159
278
  if (!sourceAndUsageEquivalencies)
160
279
  return;
280
+ const normalizedSchemaCache = new Map();
281
+ const getSchemaIndex = (schema) => {
282
+ if (!schema)
283
+ return { byFirstPart: new Map() };
284
+ const cached = normalizedSchemaCache.get(schema);
285
+ if (cached)
286
+ return cached;
287
+ const byFirstPart = new Map();
288
+ for (const path in schema) {
289
+ checkDeadline();
290
+ let parts = splitOutsideParenthesesAndArrays(path);
291
+ if (parts[0].startsWith(functionName)) {
292
+ const baseName = cleanFunctionName(parts[0]);
293
+ if (!functionsWithMultipleTypeParams.has(baseName)) {
294
+ parts =
295
+ parts[1] === 'functionCallReturnValue'
296
+ ? ['returnValue', ...parts.slice(2)]
297
+ : parts.slice(1);
298
+ }
299
+ }
300
+ const entry = { path, parts };
301
+ // Index by the base of the first part (before any function call args)
302
+ const firstPart = parts[0] ?? '';
303
+ const parenIdx = firstPart.indexOf('(');
304
+ const firstPartBase = parenIdx >= 0 ? firstPart.slice(0, parenIdx) : firstPart;
305
+ let bucket = byFirstPart.get(firstPartBase);
306
+ if (!bucket) {
307
+ bucket = [];
308
+ byFirstPart.set(firstPartBase, bucket);
309
+ }
310
+ bucket.push(entry);
311
+ }
312
+ const result = { byFirstPart };
313
+ normalizedSchemaCache.set(schema, result);
314
+ return result;
315
+ };
161
316
  const findOrCreateEquivalentSchemaPathsEntry = (allPaths) => {
162
317
  const equivalentRoots = allPaths
163
318
  .filter((p) => p.functionName === rootScopeName ||
@@ -169,19 +324,94 @@ export default function mergeInDependentDataStructure({ importedExports, depende
169
324
  : findRelevantDependency(p.functionName),
170
325
  }));
171
326
  let equivalentSchemaPathsEntry;
327
+ // Collect the signature indices from the new roots we want to add
328
+ const newRootSignatureIndices = new Set();
329
+ for (const root of equivalentRoots) {
330
+ const idx = extractSignatureIndex(root.schemaRootPath);
331
+ if (idx !== undefined) {
332
+ newRootSignatureIndices.add(idx);
333
+ }
334
+ }
335
+ // Use espIndex Map for O(1) lookup instead of O(E) linear search.
336
+ // Falls back to linear search only when Map hit has a signature index conflict.
172
337
  for (const pathInfo of allPaths) {
173
- if (!equivalentSchemaPathsEntry) {
174
- equivalentSchemaPathsEntry = equivalentSchemaPaths.find((esp) => esp.equivalentRoots.some((er) => er.schemaRootPath === pathInfo.path &&
175
- (er.function?.name ===
176
- cleanFunctionName(pathInfo.functionName) ||
177
- (!er.function &&
178
- cleanFunctionName(pathInfo.functionName) ===
179
- rootScopeName))));
338
+ checkDeadline();
339
+ if (equivalentSchemaPathsEntry)
340
+ break;
341
+ const candidate = espIndex.get(espIndexKey(pathInfo.path, pathInfo.functionName));
342
+ if (!candidate)
343
+ continue;
344
+ // Verify no signature index conflict with the candidate entry
345
+ if (newRootSignatureIndices.size > 0) {
346
+ const existingIndicesByFunction = new Map();
347
+ for (const er of candidate.equivalentRoots) {
348
+ const funcKey = er.function
349
+ ? `${er.function.name}::${er.function.filePath}`
350
+ : '__self__';
351
+ const idx = extractSignatureIndex(er.schemaRootPath);
352
+ if (idx !== undefined) {
353
+ if (!existingIndicesByFunction.has(funcKey)) {
354
+ existingIndicesByFunction.set(funcKey, new Set());
355
+ }
356
+ existingIndicesByFunction.get(funcKey).add(idx);
357
+ }
358
+ }
359
+ let hasConflict = false;
360
+ for (const newRoot of equivalentRoots) {
361
+ const funcKey = newRoot.function
362
+ ? `${newRoot.function.name}::${newRoot.function.filePath}`
363
+ : '__self__';
364
+ const newIdx = extractSignatureIndex(newRoot.schemaRootPath);
365
+ if (newIdx !== undefined) {
366
+ const existingIndices = existingIndicesByFunction.get(funcKey);
367
+ if (existingIndices && existingIndices.size > 0) {
368
+ if (!existingIndices.has(newIdx)) {
369
+ hasConflict = true;
370
+ break;
371
+ }
372
+ }
373
+ }
374
+ }
375
+ if (hasConflict)
376
+ continue;
180
377
  }
378
+ equivalentSchemaPathsEntry = candidate;
181
379
  }
182
380
  if (!equivalentSchemaPathsEntry) {
381
+ // Before creating a new entry, filter out roots that have conflicting
382
+ // signature indices from the same function. An entry should never contain
383
+ // roots with different signature indices from the same function.
384
+ // This prevents the bug where signature[1], signature[2], signature[4]
385
+ // all get merged together due to incorrect sourceEquivalencies.
386
+ let filteredRoots = equivalentRoots;
387
+ if (newRootSignatureIndices.size > 1) {
388
+ // There are multiple signature indices - we need to filter to keep only
389
+ // one consistent set. We'll keep the roots that match the PRIMARY index
390
+ // (the first signature index we encounter from self, or the lowest index).
391
+ // First, determine the primary index - prefer the self root's index
392
+ let primaryIndex;
393
+ for (const root of equivalentRoots) {
394
+ if (!root.function) {
395
+ // This is a self root
396
+ const idx = extractSignatureIndex(root.schemaRootPath);
397
+ if (idx !== undefined) {
398
+ primaryIndex = idx;
399
+ break;
400
+ }
401
+ }
402
+ }
403
+ // If no self root has a signature index, use the lowest index
404
+ if (primaryIndex === undefined) {
405
+ primaryIndex = Math.min(...newRootSignatureIndices);
406
+ }
407
+ // Filter roots: keep if no signature index OR signature index matches primary
408
+ filteredRoots = equivalentRoots.filter((root) => {
409
+ const idx = extractSignatureIndex(root.schemaRootPath);
410
+ return idx === undefined || idx === primaryIndex;
411
+ });
412
+ }
183
413
  equivalentSchemaPathsEntry = {
184
- equivalentRoots,
414
+ equivalentRoots: filteredRoots,
185
415
  equivalentPostfixes: {},
186
416
  };
187
417
  equivalentSchemaPaths.push(equivalentSchemaPathsEntry);
@@ -189,10 +419,18 @@ export default function mergeInDependentDataStructure({ importedExports, depende
189
419
  else {
190
420
  equivalentSchemaPathsEntry.equivalentRoots.push(...equivalentRoots);
191
421
  }
422
+ // Deduplicate roots using a Set for O(n) instead of O(n²)
423
+ const seenRoots = new Set();
192
424
  equivalentSchemaPathsEntry.equivalentRoots =
193
- equivalentSchemaPathsEntry.equivalentRoots.filter((er, index, self) => index ===
194
- self.findIndex((e) => e.schemaRootPath === er.schemaRootPath &&
195
- e.function?.name === er.function?.name));
425
+ equivalentSchemaPathsEntry.equivalentRoots.filter((er) => {
426
+ const key = er.schemaRootPath + '::' + (er.function?.name ?? '');
427
+ if (seenRoots.has(key))
428
+ return false;
429
+ seenRoots.add(key);
430
+ return true;
431
+ });
432
+ // Keep the espIndex in sync after adding/deduplicating roots
433
+ updateEspIndex(equivalentSchemaPathsEntry);
196
434
  return equivalentSchemaPathsEntry;
197
435
  };
198
436
  // Helper to extract function name from a path that starts with a function call.
@@ -218,18 +456,40 @@ export default function mergeInDependentDataStructure({ importedExports, depende
218
456
  for (const equivalencies of allEquivalencies) {
219
457
  const schemaPathEntries = Object.entries(equivalencies);
220
458
  for (const [schemaPath, usages] of schemaPathEntries) {
459
+ checkDeadline();
460
+ // Skip equivalency entries whose source path is a Set/Map membership operation.
461
+ // Patterns like `.has(articleId)`, `.delete(articleId)`, `.add(articleId)` on
462
+ // Sets/Maps represent membership checks, not meaningful data flow for schema generation.
463
+ // In the Margo LibraryPage case, these account for 74% of all equivalency targets
464
+ // (19,444 of 26,340) and cause a combinatorial explosion in the merge.
465
+ if (isCollectionMethodPath(schemaPath))
466
+ continue;
221
467
  // First, check if the raw schemaPath starts with a function call to a dependency.
222
468
  // If so, use that dependency name for translation (so translatePath can strip the prefix).
223
469
  const extractedFuncName = extractFunctionNameFromPath(schemaPath);
224
470
  const effectiveFunctionName = extractedFuncName || functionName;
225
471
  const translatedPath = translatePath(schemaPath, effectiveFunctionName);
226
- const allPaths = [
472
+ const allPathsRaw = [
227
473
  { path: translatedPath, functionName: effectiveFunctionName },
228
- ...usages.map((u) => ({
474
+ ...usages
475
+ .filter((u) => !isCollectionMethodPath(u.schemaPath))
476
+ .map((u) => ({
229
477
  path: translatePath(u.schemaPath, u.scopeNodeName),
230
478
  functionName: u.scopeNodeName,
231
479
  })),
232
480
  ].filter((pathInfo) => !pathInfo.path.includes('.map('));
481
+ // Deduplicate by translated path + function name.
482
+ // Multiple call variants (e.g., loadView(viewKey(null,null)) vs loadView(viewKey(newTag,newCol)))
483
+ // translate to the same path after stripping arguments. Processing duplicates
484
+ // creates O(n²) work in the schema matching loops below.
485
+ const seenPathKeys = new Set();
486
+ const allPaths = allPathsRaw.filter((p) => {
487
+ const key = `${p.functionName ?? ''}::${p.path}`;
488
+ if (seenPathKeys.has(key))
489
+ return false;
490
+ seenPathKeys.add(key);
491
+ return true;
492
+ });
233
493
  // Fix 38: Derive base paths from property access paths.
234
494
  // When we have equivalent paths like:
235
495
  // Parent: signature[0].scenarios[].name
@@ -248,8 +508,11 @@ export default function mergeInDependentDataStructure({ importedExports, depende
248
508
  p.functionName === rootScopeName ||
249
509
  p.functionName === effectiveFunctionName);
250
510
  const derivedBasePaths = [];
511
+ const allPathSet = new Set(allPaths.map((p) => p.path));
512
+ const derivedBasePathSet = new Set();
251
513
  // For each child path, find its equivalent parent path and derive bases
252
514
  for (const childPathInfo of childPaths) {
515
+ checkDeadline();
253
516
  const childParts = splitOutsideParenthesesAndArrays(childPathInfo.path);
254
517
  // Look for a parent path that shares a common suffix with this child path
255
518
  for (const parentPathInfo of parentPaths) {
@@ -296,23 +559,23 @@ export default function mergeInDependentDataStructure({ importedExports, depende
296
559
  parentHasArrayIterator &&
297
560
  !childHasArrayIterator &&
298
561
  !childBaseIsGenericSignature) {
299
- // Add child base if not already present
300
- const childBaseExists = allPaths.some((p) => p.path === childBase) ||
301
- derivedBasePaths.some((p) => p.path === childBase);
302
- if (!childBaseExists) {
562
+ // Add child base if not already present (O(1) Set lookup)
563
+ if (!allPathSet.has(childBase) &&
564
+ !derivedBasePathSet.has(childBase)) {
303
565
  derivedBasePaths.push({
304
566
  path: childBase,
305
567
  functionName: childPathInfo.functionName,
306
568
  });
569
+ derivedBasePathSet.add(childBase);
307
570
  }
308
- // Add parent base if not already present
309
- const parentBaseExists = allPaths.some((p) => p.path === parentBase) ||
310
- derivedBasePaths.some((p) => p.path === parentBase);
311
- if (!parentBaseExists) {
571
+ // Add parent base if not already present (O(1) Set lookup)
572
+ if (!allPathSet.has(parentBase) &&
573
+ !derivedBasePathSet.has(parentBase)) {
312
574
  derivedBasePaths.push({
313
575
  path: parentBase,
314
576
  functionName: parentPathInfo.functionName,
315
577
  });
578
+ derivedBasePathSet.add(parentBase);
316
579
  }
317
580
  }
318
581
  }
@@ -321,7 +584,27 @@ export default function mergeInDependentDataStructure({ importedExports, depende
321
584
  }
322
585
  allPaths.push(...derivedBasePaths);
323
586
  const entry = findOrCreateEquivalentSchemaPathsEntry(allPaths);
587
+ // Trace equivalency gathering - helps debug why paths may not be connected
588
+ if (allPaths.length > 1) {
589
+ transformationTracer.operation(rootScopeName, {
590
+ operation: 'gatherEquivalency',
591
+ stage: 'gathering',
592
+ path: translatedPath,
593
+ context: {
594
+ sourceFunction: functionName,
595
+ equivalentPaths: allPaths.map((p) => ({
596
+ path: p.path,
597
+ function: p.functionName,
598
+ })),
599
+ equivalentRoots: entry.equivalentRoots.map((r) => ({
600
+ path: r.schemaRootPath,
601
+ function: r.function?.name,
602
+ })),
603
+ },
604
+ });
605
+ }
324
606
  for (const equivalentRoot of entry.equivalentRoots) {
607
+ checkDeadline();
325
608
  const dataStructures = equivalentRoot.function &&
326
609
  equivalentRoot.function.name !== rootScopeName
327
610
  ? [
@@ -349,18 +632,17 @@ export default function mergeInDependentDataStructure({ importedExports, depende
349
632
  pathParts = pathParts.slice(1);
350
633
  }
351
634
  for (const schema of schemas) {
352
- for (const schemaPath in schema) {
353
- let schemaPathParts = splitOutsideParenthesesAndArrays(schemaPath);
354
- if (schemaPathParts[0].startsWith(functionName)) {
355
- // Only normalize if the function doesn't have multiple different type parameters
356
- const baseName = cleanFunctionName(schemaPathParts[0]);
357
- if (!functionsWithMultipleTypeParams.has(baseName)) {
358
- schemaPathParts =
359
- schemaPathParts[1] === 'functionCallReturnValue'
360
- ? ['returnValue', ...schemaPathParts.slice(2)]
361
- : schemaPathParts.slice(1);
362
- }
363
- }
635
+ // Use pre-computed index to only iterate schema entries whose
636
+ // normalized first part matches pathParts[0], instead of all entries.
637
+ const schemaIndex = getSchemaIndex(schema);
638
+ const lookupPart = pathParts[0] ?? '';
639
+ const lookupParenIdx = lookupPart.indexOf('(');
640
+ const lookupBase = lookupParenIdx >= 0
641
+ ? lookupPart.slice(0, lookupParenIdx)
642
+ : lookupPart;
643
+ const candidates = schemaIndex.byFirstPart.get(lookupBase) || [];
644
+ for (const { path: schemaPath, parts: schemaPathParts, } of candidates) {
645
+ checkDeadline();
364
646
  if (schemaPathParts.length < pathParts.length)
365
647
  continue;
366
648
  // Check if all path parts match (allowing function call variants)
@@ -419,13 +701,27 @@ export default function mergeInDependentDataStructure({ importedExports, depende
419
701
  else {
420
702
  // Regular exact match - use the standard postfix logic
421
703
  const postfix = joinParenthesesAndArrays(schemaPathParts.slice(matchedUpToIndex));
422
- entry.equivalentPostfixes[postfix] = entry
423
- .equivalentPostfixes[postfix]
424
- ? bestValueFromOptions([
425
- entry.equivalentPostfixes[postfix],
426
- schema[schemaPath],
427
- ])
428
- : schema[schemaPath];
704
+ const previousValue = entry.equivalentPostfixes[postfix];
705
+ const newValue = schema[schemaPath];
706
+ entry.equivalentPostfixes[postfix] = previousValue
707
+ ? bestValueFromOptions([previousValue, newValue])
708
+ : newValue;
709
+ // Trace postfix gathering - shows where type info comes from
710
+ if (entry.equivalentPostfixes[postfix] !== previousValue) {
711
+ transformationTracer.operation(rootScopeName, {
712
+ operation: 'gatherPostfix',
713
+ stage: 'gathering',
714
+ path: postfix || '(root)',
715
+ before: previousValue,
716
+ after: entry.equivalentPostfixes[postfix],
717
+ context: {
718
+ sourceSchemaPath: schemaPath,
719
+ sourceFunction: equivalentRoot.function?.name || rootScopeName,
720
+ equivalentRootPath: equivalentRoot.schemaRootPath,
721
+ rawValue: newValue,
722
+ },
723
+ });
724
+ }
429
725
  }
430
726
  }
431
727
  }
@@ -441,6 +737,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
441
737
  // where we want both X().functionCallReturnValue and Y().functionCallReturnValue as bases
442
738
  const allBasePaths = new Set();
443
739
  for (const path of Object.keys(dataStructure.returnValueSchema)) {
740
+ checkDeadline();
444
741
  const parts = splitOutsideParenthesesAndArrays(path);
445
742
  // Find all positions of functionCallReturnValue and create base paths for each
446
743
  for (let i = 0; i < parts.length; i++) {
@@ -457,12 +754,17 @@ export default function mergeInDependentDataStructure({ importedExports, depende
457
754
  const entry = findOrCreateEquivalentSchemaPathsEntry([
458
755
  { path: translatedBasePath, functionName: functionName },
459
756
  ]);
460
- entry.equivalentRoots.push({
757
+ const newRoot = {
461
758
  schemaRootPath: translatedBasePath,
462
759
  function: findRelevantDependency(functionName),
463
- });
760
+ };
761
+ entry.equivalentRoots.push(newRoot);
762
+ // Update index for the newly added root
763
+ const newRootFuncName = newRoot.function?.name ?? rootScopeName;
764
+ espIndex.set(espIndexKey(newRoot.schemaRootPath, newRootFuncName), entry);
464
765
  const basePathParts = splitOutsideParenthesesAndArrays(basePath);
465
766
  for (const schemaPath in dataStructure.returnValueSchema) {
767
+ checkDeadline();
466
768
  const schemaPathParts = splitOutsideParenthesesAndArrays(schemaPath);
467
769
  if (schemaPathParts.length < basePathParts.length)
468
770
  continue;
@@ -474,12 +776,13 @@ export default function mergeInDependentDataStructure({ importedExports, depende
474
776
  continue;
475
777
  }
476
778
  const postfix = joinParenthesesAndArrays(schemaPathParts.slice(basePathParts.length));
477
- entry.equivalentPostfixes[postfix] = entry.equivalentPostfixes[postfix]
779
+ const newValue = entry.equivalentPostfixes[postfix]
478
780
  ? bestValueFromOptions([
479
781
  entry.equivalentPostfixes[postfix],
480
782
  dataStructure.returnValueSchema[schemaPath],
481
783
  ])
482
784
  : dataStructure.returnValueSchema[schemaPath];
785
+ entry.equivalentPostfixes[postfix] = newValue;
483
786
  }
484
787
  }
485
788
  }
@@ -494,6 +797,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
494
797
  // We do this before the main merge to ensure the connection happens regardless
495
798
  // of processing order.
496
799
  for (const esp of equivalentSchemaPaths) {
800
+ checkDeadline();
497
801
  for (const root of esp.equivalentRoots) {
498
802
  if (root.schemaRootPath.endsWith('[]')) {
499
803
  // Find a matching parent entry with the base array path
@@ -506,6 +810,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
506
810
  // Add transformed postfixes from child (array element) to parent (array)
507
811
  // so they can be applied with [] prefix to parent paths
508
812
  for (const [postfixPath, postfixValue] of Object.entries(esp.equivalentPostfixes)) {
813
+ checkDeadline();
509
814
  const transformedPostfix = joinParenthesesAndArrays(['[]', postfixPath].filter(Boolean));
510
815
  if (!(transformedPostfix in parentEntry.equivalentPostfixes)) {
511
816
  parentEntry.equivalentPostfixes[transformedPostfix] =
@@ -518,6 +823,8 @@ export default function mergeInDependentDataStructure({ importedExports, depende
518
823
  }
519
824
  const findEquivalentSchemaPathEntry = (schemaSubPath, equivalentRootFunction) => {
520
825
  let postfix;
826
+ // Get the signature index we're looking for (if any)
827
+ const lookingForSignatureIndex = extractSignatureIndex(schemaSubPath);
521
828
  const equivalentEntry = mergedEquivalentSchemaPaths.find((esp) => esp.equivalentRoots.some((er) => {
522
829
  if ((schemaSubPath.startsWith('returnValue') ||
523
830
  schemaSubPath.startsWith('signature[')) &&
@@ -526,6 +833,26 @@ export default function mergeInDependentDataStructure({ importedExports, depende
526
833
  return false;
527
834
  }
528
835
  if (schemaSubPath === er.schemaRootPath) {
836
+ // Additional check: if we're looking for a signature path, make sure
837
+ // the entry doesn't already have DIFFERENT signature indices.
838
+ // This prevents entries with signature[1], signature[2], signature[4]
839
+ // from all being merged together.
840
+ if (lookingForSignatureIndex !== undefined) {
841
+ const hasConflictingSignatureIndex = esp.equivalentRoots.some((otherRoot) => {
842
+ // Only check roots from the same function
843
+ if (otherRoot.function?.name !== equivalentRootFunction?.name ||
844
+ otherRoot.function?.filePath !==
845
+ equivalentRootFunction?.filePath) {
846
+ return false;
847
+ }
848
+ const otherIndex = extractSignatureIndex(otherRoot.schemaRootPath);
849
+ return (otherIndex !== undefined &&
850
+ otherIndex !== lookingForSignatureIndex);
851
+ });
852
+ if (hasConflictingSignatureIndex) {
853
+ return false;
854
+ }
855
+ }
529
856
  postfix = er.postfix;
530
857
  return true;
531
858
  }
@@ -536,6 +863,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
536
863
  const sortedEquivalentSchemaPaths = equivalentSchemaPaths.sort((a, b) => Math.max(...a.equivalentRoots.map((er) => splitOutsideParenthesesAndArrays(er.schemaRootPath).length)) -
537
864
  Math.max(...b.equivalentRoots.map((er) => splitOutsideParenthesesAndArrays(er.schemaRootPath).length)));
538
865
  for (const esp of sortedEquivalentSchemaPaths) {
866
+ checkDeadline();
539
867
  if (esp.equivalentRoots.length === 0)
540
868
  continue;
541
869
  let bestCandidateLength;
@@ -595,6 +923,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
595
923
  // dependencySchemas contains usage information (how dependencies are called),
596
924
  // not internal implementation, so we want this for mocked dependencies too
597
925
  for (const dependency of importedExports) {
926
+ checkDeadline();
598
927
  const dependentDataStructure = dependencySchemas?.[dependency.filePath]?.[dependency.name];
599
928
  if (!dependentDataStructure)
600
929
  continue;
@@ -610,9 +939,65 @@ export default function mergeInDependentDataStructure({ importedExports, depende
610
939
  gatherAllEquivalentSchemaPaths(name, childMergedDataStructure);
611
940
  }
612
941
  }
942
+ const gatherElapsed = Date.now() - mergeStartTime;
613
943
  equivalentSchemaPaths = mergeAllEquivalentSchemaPaths();
944
+ const mergeEspElapsed = Date.now() - mergeStartTime;
945
+ // Collect schemas that need cleaning — batch the calls for the end instead of
946
+ // calling cleanSchema inside the inner root loop (which was O(roots * schemaSize)).
947
+ const schemasToClean = new Set();
614
948
  for (const esp of equivalentSchemaPaths) {
615
- for (const equivalentRoot of esp.equivalentRoots) {
949
+ checkDeadline();
950
+ // Pre-compute which postfixes have children to avoid O(n²) lookups in the inner loop.
951
+ // A postfix "has children" if there are other postfixes that extend it.
952
+ const postfixesWithChildren = new Set();
953
+ const postfixKeys = Object.keys(esp.equivalentPostfixes);
954
+ // Pre-parse ALL postfix paths once. These parsed parts are reused in:
955
+ // 1. The children detection loop below
956
+ // 2. The inner postfix application loop (lines that split postfixPath and equivalentRoot.postfix)
957
+ // This eliminates thousands of redundant splitOutsideParenthesesAndArrays calls.
958
+ const postfixPartsCache = new Map();
959
+ for (const postfixPath of postfixKeys) {
960
+ if (!postfixPath)
961
+ continue;
962
+ postfixPartsCache.set(postfixPath, splitOutsideParenthesesAndArrays(postfixPath));
963
+ }
964
+ // Check for empty postfix having children (any other postfixes exist)
965
+ if (postfixKeys.length > 1 && '' in esp.equivalentPostfixes) {
966
+ postfixesWithChildren.add('');
967
+ }
968
+ // Check for array element postfixes having children using a prefix set.
969
+ // This avoids O(n²) scans across large postfix lists.
970
+ // e.g., 'currentEntities[]' has children if a path like 'currentEntities[].sha' exists.
971
+ const postfixPrefixSet = new Set();
972
+ for (const postfixPath of postfixKeys) {
973
+ if (!postfixPath)
974
+ continue;
975
+ const parts = postfixPartsCache.get(postfixPath);
976
+ for (let i = 1; i < parts.length; i++) {
977
+ postfixPrefixSet.add(joinParenthesesAndArrays(parts.slice(0, i)));
978
+ }
979
+ }
980
+ for (const postfixPath of postfixKeys) {
981
+ if (postfixPath.endsWith('[]') && postfixPrefixSet.has(postfixPath)) {
982
+ postfixesWithChildren.add(postfixPath);
983
+ }
984
+ }
985
+ // Deduplicate equivalentRoots that would write to the same schema paths.
986
+ // Roots with the same (function, schemaRootPath, postfix) are redundant.
987
+ const seenRootKeys = new Set();
988
+ const uniqueRoots = esp.equivalentRoots.filter((root) => {
989
+ const key = `${root.function?.filePath ?? ''}::${root.function?.name ?? ''}::${root.schemaRootPath}::${root.postfix ?? ''}`;
990
+ if (seenRootKeys.has(key))
991
+ return false;
992
+ seenRootKeys.add(key);
993
+ return true;
994
+ });
995
+ // Cap schema size to prevent combinatorial explosion.
996
+ // Successful merges produce <3K ret keys. Beyond 5K, further postfixes
997
+ // add noise but no useful data — they're cross-products of unrelated equivalencies.
998
+ const SCHEMA_KEY_CAP = 5000;
999
+ for (const equivalentRoot of uniqueRoots) {
1000
+ checkDeadline();
616
1001
  let merged;
617
1002
  if (equivalentRoot.function) {
618
1003
  merged = findOrCreateDependentSchemas(equivalentRoot.function);
@@ -625,25 +1010,124 @@ export default function mergeInDependentDataStructure({ importedExports, depende
625
1010
  const schema = equivalentRoot.schemaRootPath.startsWith('signature[')
626
1011
  ? merged.signatureSchema
627
1012
  : merged.returnValueSchema;
1013
+ // Skip if this schema has already grown past the cap
1014
+ if (Object.keys(schema).length > SCHEMA_KEY_CAP)
1015
+ continue;
628
1016
  for (const [postfixPath, postfixValue] of Object.entries(esp.equivalentPostfixes)) {
1017
+ checkDeadline();
629
1018
  let relevantPostfix = postfixPath;
630
1019
  if (equivalentRoot.postfix) {
1020
+ // Check if postfixPath starts with equivalentRoot.postfix at a path boundary.
1021
+ // Must ensure exact path part match - "entityCode" should NOT match "entity" prefix.
1022
+ // Valid: "entity.foo" starts with "entity" (boundary at '.')
1023
+ // Valid: "entity[0]" starts with "entity" (boundary at '[')
1024
+ // Invalid: "entityCode" starts with "entity" (no boundary, different property)
631
1025
  if (!postfixPath.startsWith(equivalentRoot.postfix)) {
632
1026
  continue;
633
1027
  }
634
- const postFixPathParts = splitOutsideParenthesesAndArrays(postfixPath);
635
- const equivalentRootPostFixParts = splitOutsideParenthesesAndArrays(equivalentRoot.postfix);
1028
+ // Additional check: ensure the match is at a path boundary
1029
+ const nextChar = postfixPath[equivalentRoot.postfix.length];
1030
+ if (nextChar !== undefined && nextChar !== '.' && nextChar !== '[') {
1031
+ // The postfixPath continues with more characters that aren't a path separator.
1032
+ // This means "entity" matched "entityCode" which is wrong - they're different properties.
1033
+ continue;
1034
+ }
1035
+ const postFixPathParts = postfixPartsCache.get(postfixPath) ??
1036
+ splitOutsideParenthesesAndArrays(postfixPath);
1037
+ // Cache equivalentRoot.postfix parts — same root reused across all postfixes
1038
+ if (!postfixPartsCache.has(equivalentRoot.postfix)) {
1039
+ postfixPartsCache.set(equivalentRoot.postfix, splitOutsideParenthesesAndArrays(equivalentRoot.postfix));
1040
+ }
1041
+ const equivalentRootPostFixParts = postfixPartsCache.get(equivalentRoot.postfix);
636
1042
  relevantPostfix = joinParenthesesAndArrays(postFixPathParts.slice(equivalentRootPostFixParts.length));
637
1043
  }
638
1044
  const newSchemaPath = joinParenthesesAndArrays([
639
1045
  equivalentRoot.schemaRootPath,
640
1046
  relevantPostfix,
641
1047
  ]);
1048
+ // Skip paths that would go through a primitive type
1049
+ // e.g., if schema has 'entities[].scenarioCount': 'number', skip 'entities[].scenarioCount.sha'
1050
+ if (wouldGoThroughPrimitive(newSchemaPath, schema)) {
1051
+ transformationTracer.operation(rootScopeName, {
1052
+ operation: 'skipPrimitivePath',
1053
+ stage: 'merged',
1054
+ path: newSchemaPath,
1055
+ context: {
1056
+ reason: 'would go through primitive type',
1057
+ postfixValue,
1058
+ },
1059
+ });
1060
+ continue;
1061
+ }
1062
+ // Skip setting primitive type when there are child postfixes that indicate structure.
1063
+ // This prevents downgrading an object/array element to a primitive type.
1064
+ // Uses pre-computed postfixesWithChildren Set for O(1) lookup instead of O(n) iteration.
1065
+ const hasChildPostfixes = (relevantPostfix === '' || relevantPostfix.endsWith('[]')) &&
1066
+ postfixesWithChildren.has(postfixPath);
1067
+ if (PRIMITIVE_TYPES.has(postfixValue) && hasChildPostfixes) {
1068
+ continue;
1069
+ }
1070
+ // Don't overwrite a more specific type with a less specific one
1071
+ // This can happen when nested roots share entries with their parent roots
1072
+ const existingType = schema[newSchemaPath];
1073
+ if (existingType) {
1074
+ // Don't overwrite a primitive type with 'object' or 'array'
1075
+ // e.g., if schema has 'entities[].scenarioCount': 'number', don't overwrite with 'object'
1076
+ if (PRIMITIVE_TYPES.has(existingType) &&
1077
+ (postfixValue === 'object' || postfixValue === 'array')) {
1078
+ transformationTracer.operation(rootScopeName, {
1079
+ operation: 'skipTypeDowngrade',
1080
+ stage: 'merged',
1081
+ path: newSchemaPath,
1082
+ context: {
1083
+ reason: 'would overwrite primitive with object/array',
1084
+ existingType,
1085
+ newType: postfixValue,
1086
+ },
1087
+ });
1088
+ continue;
1089
+ }
1090
+ // Don't overwrite a complex/union type with a primitive
1091
+ // e.g., if schema has 'scenarios[]': 'Scenario | null', don't overwrite with 'string'
1092
+ if (!PRIMITIVE_TYPES.has(existingType) &&
1093
+ PRIMITIVE_TYPES.has(postfixValue)) {
1094
+ transformationTracer.operation(rootScopeName, {
1095
+ operation: 'skipTypeDowngrade',
1096
+ stage: 'merged',
1097
+ path: newSchemaPath,
1098
+ context: {
1099
+ reason: 'would overwrite complex type with primitive',
1100
+ existingType,
1101
+ newType: postfixValue,
1102
+ },
1103
+ });
1104
+ continue;
1105
+ }
1106
+ }
1107
+ // Log the successful postfix merge
1108
+ transformationTracer.operation(rootScopeName, {
1109
+ operation: 'mergePostfix',
1110
+ stage: 'merged',
1111
+ path: newSchemaPath,
1112
+ before: existingType,
1113
+ after: postfixValue,
1114
+ context: {
1115
+ schemaRootPath: equivalentRoot.schemaRootPath,
1116
+ postfix: relevantPostfix,
1117
+ dependency: equivalentRoot.function?.name,
1118
+ },
1119
+ });
642
1120
  schema[newSchemaPath] = postfixValue;
643
1121
  }
644
- cleanSchema(schema);
1122
+ schemasToClean.add(schema);
645
1123
  }
646
1124
  }
1125
+ const postfixElapsed = Date.now() - mergeStartTime;
1126
+ // Batch-clean all modified schemas once (instead of once per root per ESP entry)
1127
+ for (const schema of schemasToClean) {
1128
+ cleanSchema(schema, { stage: 'afterMergePostfix' });
1129
+ }
1130
+ const cleanElapsed = Date.now() - mergeStartTime;
647
1131
  // Propagate equivalency-derived attributes to generic function call variants.
648
1132
  // When attributes are traced via equivalencies (e.g., fileComparisons from buildDataMap.signature[2]),
649
1133
  // they get written to non-generic paths (returnValue.data.x or funcName().functionCallReturnValue.data.x).
@@ -662,6 +1146,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
662
1146
  const genericVariants = new Set();
663
1147
  const genericRegex = new RegExp(`^${depName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}<[^>]+>\\(\\)`);
664
1148
  for (const path in schemaToSearchForGenericVariants) {
1149
+ checkDeadline();
665
1150
  const match = path.match(genericRegex);
666
1151
  if (match) {
667
1152
  genericVariants.add(match[0]);
@@ -673,6 +1158,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
673
1158
  // create corresponding paths for each generic variant
674
1159
  const pathsToAdd = [];
675
1160
  for (const path in returnValueSchema) {
1161
+ checkDeadline();
676
1162
  const value = returnValueSchema[path];
677
1163
  // Handle returnValue. paths
678
1164
  if (path.startsWith('returnValue.')) {
@@ -719,6 +1205,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
719
1205
  // This includes both returnValue. (dot) and returnValue[ (array) paths.
720
1206
  const pathsToNormalize = [];
721
1207
  for (const path in depSchema.returnValueSchema) {
1208
+ checkDeadline();
722
1209
  if (path === 'returnValue' ||
723
1210
  path.startsWith('returnValue.') ||
724
1211
  path.startsWith('returnValue[')) {
@@ -740,10 +1227,19 @@ export default function mergeInDependentDataStructure({ importedExports, depende
740
1227
  // e.g., returnValue[].label -> getOptions().functionCallReturnValue[].label
741
1228
  normalizedPath = path.replace(/^returnValue/, `${dependency.name}().functionCallReturnValue`);
742
1229
  }
1230
+ transformationTracer.operation(rootScopeName, {
1231
+ operation: 'normalizeReturnValuePath',
1232
+ stage: 'merged',
1233
+ path: normalizedPath,
1234
+ before: path,
1235
+ after: normalizedPath,
1236
+ context: { dependency: dependency.name, value },
1237
+ });
743
1238
  depSchema.returnValueSchema[normalizedPath] = value;
744
1239
  }
745
1240
  // Now copy paths from the source schema (dependencySchemas)
746
1241
  for (const path in srcSchema.returnValueSchema) {
1242
+ checkDeadline();
747
1243
  const value = srcSchema.returnValueSchema[path];
748
1244
  // Normalize paths starting with 'returnValue' to use the standard format:
749
1245
  // 'returnValue.foo' -> 'dependencyName().functionCallReturnValue.foo'
@@ -806,7 +1302,10 @@ export default function mergeInDependentDataStructure({ importedExports, depende
806
1302
  }
807
1303
  }
808
1304
  }
809
- cleanSchema(depSchema.returnValueSchema);
1305
+ cleanSchema(depSchema.returnValueSchema, {
1306
+ stage: 'afterMockedDependencyMerge',
1307
+ dependency: dependency.name,
1308
+ });
810
1309
  // Pull signature requirements from downstream functions into the mocked return value.
811
1310
  // When a mocked function's return flows into another function's signature (via usageEquivalencies),
812
1311
  // we need to include that function's signature requirements in the mock.
@@ -871,7 +1370,10 @@ export default function mergeInDependentDataStructure({ importedExports, depende
871
1370
  }
872
1371
  }
873
1372
  }
874
- cleanSchema(depSchema.returnValueSchema);
1373
+ cleanSchema(depSchema.returnValueSchema, {
1374
+ stage: 'afterSignatureRequirementsMerge',
1375
+ dependency: dependency.name,
1376
+ });
875
1377
  }
876
1378
  // Process the input dependencySchemas FIRST (before child dependentAnalyses).
877
1379
  // This ensures the parent entity's direct usage of dependencies takes precedence.
@@ -898,16 +1400,50 @@ export default function mergeInDependentDataStructure({ importedExports, depende
898
1400
  if (!existingSchema) {
899
1401
  const depSchema = findOrCreateDependentSchemas({ filePath, name });
900
1402
  for (const path in srcSchema.returnValueSchema) {
1403
+ checkDeadline();
901
1404
  depSchema.returnValueSchema[path] = srcSchema.returnValueSchema[path];
902
1405
  }
903
1406
  for (const path in srcSchema.signatureSchema) {
1407
+ checkDeadline();
904
1408
  depSchema.signatureSchema[path] = srcSchema.signatureSchema[path];
905
1409
  }
906
1410
  // Clean known object functions (like String.prototype.replace, Array.prototype.map)
907
1411
  // from the copied schema. Without this, method call paths on primitives like
908
1412
  // "projectSlug.replace(...)" would cause convertDotNotation to create nested
909
1413
  // object structures instead of preserving the primitive type.
910
- cleanSchema(depSchema.returnValueSchema);
1414
+ cleanSchema(depSchema.returnValueSchema, {
1415
+ stage: 'afterDependencySchemaCopy',
1416
+ filePath,
1417
+ dependency: name,
1418
+ });
1419
+ }
1420
+ // TYPE REFINEMENT: Check if dependentAnalyses has a more specific type for this dependency.
1421
+ // When a parent passes `entity.filePath` (string | undefined) to a child component
1422
+ // that requires `filePath: string`, we should use the child's more specific type.
1423
+ // This prevents mock data from having undefined values for required props.
1424
+ //
1425
+ // This runs REGARDLESS of whether equivalencies already processed the schema,
1426
+ // because equivalencies copy the parent's type (string | undefined), not the child's
1427
+ // required type (string).
1428
+ const depSchema = findOrCreateDependentSchemas({ filePath, name });
1429
+ const childAnalysis = dependentAnalyses[filePath]?.[name];
1430
+ const childSignatureSchema = childAnalysis?.metadata?.mergedDataStructure?.signatureSchema;
1431
+ if (childSignatureSchema) {
1432
+ for (const path in depSchema.signatureSchema) {
1433
+ checkDeadline();
1434
+ const parentType = depSchema.signatureSchema[path];
1435
+ const childType = childSignatureSchema[path];
1436
+ if (parentType && childType) {
1437
+ // Check if parent has optional type and child has required type
1438
+ const parentIsOptional = parentType.includes('| undefined') ||
1439
+ parentType.includes('| null');
1440
+ const childIsOptional = childType.includes('| undefined') || childType.includes('| null');
1441
+ // If child requires a more specific type (not optional), use it
1442
+ if (parentIsOptional && !childIsOptional) {
1443
+ depSchema.signatureSchema[path] = childType;
1444
+ }
1445
+ }
1446
+ }
911
1447
  }
912
1448
  // For functions with multiple different type parameters, also create separate entries
913
1449
  // for each type-parameterized variant. This allows gatherDataForMocks to look up
@@ -934,12 +1470,18 @@ export default function mergeInDependentDataStructure({ importedExports, depende
934
1470
  });
935
1471
  // Copy only paths that belong to this variant
936
1472
  for (const path in srcSchema.returnValueSchema) {
1473
+ checkDeadline();
937
1474
  if (path.startsWith(variant)) {
938
1475
  variantSchema.returnValueSchema[path] =
939
1476
  srcSchema.returnValueSchema[path];
940
1477
  }
941
1478
  }
942
- cleanSchema(variantSchema.returnValueSchema);
1479
+ cleanSchema(variantSchema.returnValueSchema, {
1480
+ stage: 'afterTypeVariantCopy',
1481
+ filePath,
1482
+ dependency: name,
1483
+ variant,
1484
+ });
943
1485
  }
944
1486
  }
945
1487
  }
@@ -950,6 +1492,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
950
1492
  // EXCEPT: Skip mocked dependencies - we don't want their internal implementation details.
951
1493
  for (const filePath in dependentAnalyses) {
952
1494
  for (const name in dependentAnalyses[filePath]) {
1495
+ checkDeadline();
953
1496
  const dependentMergedDataStructure = dependentAnalyses[filePath][name].metadata?.mergedDataStructure;
954
1497
  if (!dependentMergedDataStructure)
955
1498
  continue;
@@ -962,6 +1505,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
962
1505
  // Copy over all paths from the dependent's returnValueSchema
963
1506
  // Only add paths that don't already exist (don't overwrite values set by equivalencies)
964
1507
  for (const path in dependentMergedDataStructure.returnValueSchema) {
1508
+ checkDeadline();
965
1509
  const translatedPath = translatePath(path, name);
966
1510
  if (!(translatedPath in depSchema.returnValueSchema)) {
967
1511
  depSchema.returnValueSchema[translatedPath] =
@@ -970,6 +1514,7 @@ export default function mergeInDependentDataStructure({ importedExports, depende
970
1514
  }
971
1515
  // Copy over signature schema as well
972
1516
  for (const path in dependentMergedDataStructure.signatureSchema) {
1517
+ checkDeadline();
973
1518
  const translatedPath = translatePath(path, name);
974
1519
  if (!(translatedPath in depSchema.signatureSchema)) {
975
1520
  depSchema.signatureSchema[translatedPath] =
@@ -989,12 +1534,14 @@ export default function mergeInDependentDataStructure({ importedExports, depende
989
1534
  });
990
1535
  // Merge in the nested dependency schemas
991
1536
  for (const path in nestedDepSchema.returnValueSchema) {
1537
+ checkDeadline();
992
1538
  if (!(path in targetDepSchema.returnValueSchema)) {
993
- targetDepSchema.returnValueSchema[path] =
994
- nestedDepSchema.returnValueSchema[path];
1539
+ const value = nestedDepSchema.returnValueSchema[path];
1540
+ targetDepSchema.returnValueSchema[path] = value;
995
1541
  }
996
1542
  }
997
1543
  for (const path in nestedDepSchema.signatureSchema) {
1544
+ checkDeadline();
998
1545
  if (!(path in targetDepSchema.signatureSchema)) {
999
1546
  targetDepSchema.signatureSchema[path] =
1000
1547
  nestedDepSchema.signatureSchema[path];
@@ -1005,6 +1552,12 @@ export default function mergeInDependentDataStructure({ importedExports, depende
1005
1552
  }
1006
1553
  }
1007
1554
  }
1555
+ const totalElapsed = Date.now() - mergeStartTime;
1556
+ const retKeys = Object.keys(mergedDataStructure.returnValueSchema).length;
1557
+ // Only log phase breakdown for slow merges (>2s)
1558
+ if (totalElapsed > 2000) {
1559
+ console.log(`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}`);
1560
+ }
1008
1561
  return mergedDataStructure;
1009
1562
  }
1010
1563
  //# sourceMappingURL=mergeInDependentDataStructure.js.map