@codeyam/codeyam-cli 0.1.0-staging.2a88920 → 0.1.0-staging.415103

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 (604) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +17 -17
  4. package/analyzer-template/packages/ai/index.ts +1 -0
  5. package/analyzer-template/packages/ai/package.json +3 -3
  6. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +23 -1
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +34 -3
  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 +101 -0
  10. package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +6 -0
  12. package/analyzer-template/packages/ai/src/lib/completionCall.ts +114 -113
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +588 -13
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +11 -2
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +2 -2
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +140 -14
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +20 -1
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +84 -19
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.ts +35 -0
  23. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +40 -13
  24. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
  25. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +377 -7
  26. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +134 -2
  27. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +359 -142
  28. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
  29. package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
  30. package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
  31. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
  32. package/analyzer-template/packages/analyze/index.ts +2 -0
  33. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +6 -0
  34. package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -0
  35. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +69 -3
  36. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +13 -0
  37. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
  38. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +12 -0
  39. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1352 -0
  40. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +4 -0
  41. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +59 -26
  42. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +277 -15
  43. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +395 -61
  44. package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
  45. package/analyzer-template/packages/aws/package.json +10 -10
  46. package/analyzer-template/packages/database/index.ts +1 -0
  47. package/analyzer-template/packages/database/package.json +1 -1
  48. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  49. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  50. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  51. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  52. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  53. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  54. package/analyzer-template/packages/database/src/lib/kysely/db.ts +14 -0
  55. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
  56. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +62 -0
  57. package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
  58. package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
  59. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
  60. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  61. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  62. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  63. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +151 -135
  64. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
  65. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
  66. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  67. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
  68. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
  69. package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
  70. package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
  71. package/analyzer-template/packages/github/dist/database/index.js +1 -0
  72. package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
  73. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  74. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  75. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  76. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  77. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  78. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  79. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  80. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  81. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  82. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  83. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  85. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +4 -0
  86. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  87. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +8 -0
  88. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  89. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
  90. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +20 -0
  91. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
  92. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  93. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  94. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
  95. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
  96. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  97. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  98. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
  99. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  100. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
  102. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  103. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  104. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  105. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  106. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  107. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  108. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  109. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  110. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  111. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  112. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  113. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +100 -89
  114. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  115. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
  116. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  117. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  118. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
  119. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  120. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  121. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
  122. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  123. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  124. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  125. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  126. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  127. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +8 -0
  128. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  129. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
  130. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  131. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +8 -0
  132. package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
  133. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +8 -0
  134. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  135. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
  136. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  137. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  138. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +98 -3
  139. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  140. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +121 -3
  141. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  142. package/analyzer-template/project/constructMockCode.ts +206 -51
  143. package/analyzer-template/project/orchestrateCapture.ts +4 -1
  144. package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
  145. package/analyzer-template/project/start.ts +3 -0
  146. package/analyzer-template/project/startScenarioCapture.ts +9 -0
  147. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  148. package/analyzer-template/project/writeMockDataTsx.ts +191 -12
  149. package/analyzer-template/project/writeScenarioComponents.ts +170 -29
  150. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  151. package/analyzer-template/tsconfig.json +13 -1
  152. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  153. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  154. package/background/src/lib/virtualized/project/constructMockCode.js +175 -42
  155. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  156. package/background/src/lib/virtualized/project/orchestrateCapture.js +4 -1
  157. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  158. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
  159. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  160. package/background/src/lib/virtualized/project/start.js +2 -0
  161. package/background/src/lib/virtualized/project/start.js.map +1 -1
  162. package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
  163. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  164. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  165. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  166. package/background/src/lib/virtualized/project/writeMockDataTsx.js +168 -8
  167. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  168. package/background/src/lib/virtualized/project/writeScenarioComponents.js +143 -27
  169. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  170. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  171. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  172. package/codeyam-cli/scripts/apply-setup.js +386 -9
  173. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  174. package/codeyam-cli/src/cli.js +33 -24
  175. package/codeyam-cli/src/cli.js.map +1 -1
  176. package/codeyam-cli/src/codeyam-cli.js +18 -2
  177. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  178. package/codeyam-cli/src/commands/analyze.js +21 -9
  179. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  180. package/codeyam-cli/src/commands/baseline.js +2 -0
  181. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  182. package/codeyam-cli/src/commands/debug.js +2 -0
  183. package/codeyam-cli/src/commands/debug.js.map +1 -1
  184. package/codeyam-cli/src/commands/default.js +87 -21
  185. package/codeyam-cli/src/commands/default.js.map +1 -1
  186. package/codeyam-cli/src/commands/editor.js +696 -0
  187. package/codeyam-cli/src/commands/editor.js.map +1 -0
  188. package/codeyam-cli/src/commands/init.js +75 -259
  189. package/codeyam-cli/src/commands/init.js.map +1 -1
  190. package/codeyam-cli/src/commands/memory.js +97 -92
  191. package/codeyam-cli/src/commands/memory.js.map +1 -1
  192. package/codeyam-cli/src/commands/recapture.js +2 -0
  193. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  194. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  195. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  196. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  197. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  198. package/codeyam-cli/src/commands/test-startup.js +2 -0
  199. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  200. package/codeyam-cli/src/commands/verify.js +14 -2
  201. package/codeyam-cli/src/commands/verify.js.map +1 -1
  202. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +185 -0
  203. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -0
  204. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  205. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  206. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +154 -86
  207. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  208. package/codeyam-cli/src/utils/analyzer.js +7 -0
  209. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  210. package/codeyam-cli/src/utils/backgroundServer.js +109 -22
  211. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  212. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  213. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  214. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  215. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  216. package/codeyam-cli/src/utils/fileWatcher.js +25 -9
  217. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  218. package/codeyam-cli/src/utils/generateReport.js +2 -2
  219. package/codeyam-cli/src/utils/git.js +52 -0
  220. package/codeyam-cli/src/utils/git.js.map +1 -1
  221. package/codeyam-cli/src/utils/install-skills.js +88 -54
  222. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  223. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  224. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  225. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  226. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  227. package/codeyam-cli/src/utils/npmVersionCheck.js +76 -0
  228. package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -0
  229. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  230. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  231. package/codeyam-cli/src/utils/progress.js +7 -0
  232. package/codeyam-cli/src/utils/progress.js.map +1 -1
  233. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  234. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  235. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  236. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  237. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  238. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  239. package/codeyam-cli/src/utils/queue/job.js +74 -1
  240. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  241. package/codeyam-cli/src/utils/queue/manager.js +7 -6
  242. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  243. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  244. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  245. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  246. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  247. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +229 -0
  248. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  249. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  250. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  251. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  252. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  253. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  254. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  255. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  256. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  257. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +74 -0
  258. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  259. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +376 -0
  260. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  261. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +113 -0
  262. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  263. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  264. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  265. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  266. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  267. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  268. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  269. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  270. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  271. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  272. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  273. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  274. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  275. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  276. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  277. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
  278. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
  279. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
  280. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
  281. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
  282. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
  283. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  284. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  285. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
  286. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
  287. package/codeyam-cli/src/utils/rules/index.js +2 -0
  288. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  289. package/codeyam-cli/src/utils/rules/parser.js +16 -29
  290. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  291. package/codeyam-cli/src/utils/rules/pathMatcher.js +34 -3
  292. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -1
  293. package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
  294. package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
  295. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  296. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  297. package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
  298. package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
  299. package/codeyam-cli/src/utils/rules/staleness.js +16 -11
  300. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
  301. package/codeyam-cli/src/utils/serverState.js +64 -12
  302. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  303. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +61 -43
  304. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  305. package/codeyam-cli/src/utils/simulationGateMiddleware.js +159 -0
  306. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
  307. package/codeyam-cli/src/utils/syncMocksMiddleware.js +5 -24
  308. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  309. package/codeyam-cli/src/utils/testRunner.js +158 -0
  310. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  311. package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
  312. package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
  313. package/codeyam-cli/src/utils/versionInfo.js +46 -0
  314. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  315. package/codeyam-cli/src/utils/webappDetection.js +14 -2
  316. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  317. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js +66 -0
  318. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js.map +1 -0
  319. package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
  320. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  321. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  322. package/codeyam-cli/src/webserver/backgroundServer.js +166 -16
  323. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  324. package/codeyam-cli/src/webserver/bootstrap.js +11 -0
  325. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  326. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-DmJveP3T.js +1 -0
  327. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-C76mRRiF.js} +1 -1
  328. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-g3saevPb.js} +1 -1
  329. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-CobE682z.js} +1 -1
  330. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +1 -0
  331. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-DYFW3lDD.js} +3 -3
  332. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-DLeucoVX.js} +1 -1
  333. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-BU_OAEMP.js} +1 -1
  334. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-ceAyBX-H.js} +1 -1
  335. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-djPLI-WV.js} +3 -8
  336. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-BED4B6sP.js} +1 -1
  337. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-B76aig_2.js} +2 -2
  338. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +34 -0
  339. package/codeyam-cli/src/webserver/build/client/assets/Terminal-BaIiqg_w.js +41 -0
  340. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-C8OKAR5x.js} +1 -1
  341. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-C96V0n15.js} +1 -1
  342. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-BpKzcsJz.js} +6 -11
  343. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +1 -0
  344. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-Duc5hnl7.js +1 -0
  345. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-D9hemwl6.js +22 -0
  346. package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
  347. package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
  348. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  349. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  350. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  351. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  352. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  353. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  354. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  355. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  356. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  357. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  358. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  359. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  360. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  361. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  362. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  363. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  364. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  365. package/codeyam-cli/src/webserver/build/client/assets/api.rule-path-l0sNRNKZ.js +1 -0
  366. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  367. package/codeyam-cli/src/webserver/build/client/assets/book-open-D_nMCFmP.js +6 -0
  368. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-BH2h1Ea2.js} +1 -1
  369. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-C4pqxYJB.js} +12 -12
  370. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-DyIKORY6.js} +1 -1
  371. package/codeyam-cli/src/webserver/build/client/assets/copy-NDbZjXao.js +11 -0
  372. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-CMT1jU2q.js} +1 -1
  373. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +1 -0
  374. package/codeyam-cli/src/webserver/build/client/assets/editor-BaC8lHDG.js +7 -0
  375. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BJUiQqZF.js → entity._sha._-CrjR3zZW.js} +11 -11
  376. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DloHYjtt.js +6 -0
  377. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +6 -0
  378. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +6 -0
  379. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-BMvVHNXU.js} +2 -2
  380. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-DTvKq3TY.js} +1 -1
  381. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-cPo8LiG3.js} +1 -1
  382. package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-DO4CZ16O.js} +1 -1
  383. package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-CFCTYk9I.js} +1 -1
  384. package/codeyam-cli/src/webserver/build/client/assets/globals-BH6uYxPM.css +1 -0
  385. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-10oVnAAH.js} +1 -1
  386. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-BcvgDzbZ.js} +1 -1
  387. package/codeyam-cli/src/webserver/build/client/assets/labs-Zk7ryIM1.js +1 -0
  388. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-BAXYRVEO.js} +1 -1
  389. package/codeyam-cli/src/webserver/build/client/assets/manifest-fb3128c3.js +1 -0
  390. package/codeyam-cli/src/webserver/build/client/assets/memory-FweZHj5U.js +93 -0
  391. package/codeyam-cli/src/webserver/build/client/assets/pause-DTAcYxBt.js +11 -0
  392. package/codeyam-cli/src/webserver/build/client/assets/root-Dzn8nIkU.js +67 -0
  393. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-fKo7v0Zo.js} +1 -1
  394. package/codeyam-cli/src/webserver/build/client/assets/settings-DfuTtcJP.js +1 -0
  395. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-B3aOzpCZ.js} +1 -1
  396. package/codeyam-cli/src/webserver/build/client/assets/terminal-BG4heKCG.js +11 -0
  397. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-DtSmdtM4.js} +1 -1
  398. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-ByhSyh0W.js} +1 -1
  399. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +2 -0
  400. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-O-jkvSPx.js} +1 -1
  401. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-9FIWuYfK.js} +1 -1
  402. package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +9 -0
  403. package/codeyam-cli/src/webserver/build/server/assets/index-DeSuKbSF.js +1 -0
  404. package/codeyam-cli/src/webserver/build/server/assets/server-build-BbQ8YBP-.js +362 -0
  405. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  406. package/codeyam-cli/src/webserver/build-info.json +5 -5
  407. package/codeyam-cli/src/webserver/devServer.js +39 -5
  408. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  409. package/codeyam-cli/src/webserver/editorProxy.js +272 -0
  410. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  411. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +121 -0
  412. package/codeyam-cli/src/webserver/server.js +177 -1
  413. package/codeyam-cli/src/webserver/server.js.map +1 -1
  414. package/codeyam-cli/src/webserver/terminalServer.js +606 -0
  415. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  416. package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
  417. package/codeyam-cli/templates/codeyam-dev-mode.md +237 -0
  418. package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
  419. package/codeyam-cli/templates/codeyam-editor-claude.md +68 -0
  420. package/codeyam-cli/templates/codeyam-editor.md +67 -0
  421. package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
  422. package/codeyam-cli/templates/codeyam-memory.md +396 -0
  423. package/codeyam-cli/templates/codeyam-new-rule.md +11 -0
  424. package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
  425. package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
  426. package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
  427. package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
  428. package/codeyam-cli/templates/editor-step-hook.py +143 -0
  429. package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
  430. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  431. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  432. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  433. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  434. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  435. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  436. package/codeyam-cli/templates/nextjs-prisma-sqlite/PRISMA_SETUP.md +84 -0
  437. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  438. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  439. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  440. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +19 -0
  441. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  442. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  443. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  444. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +35 -0
  445. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  446. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  447. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +37 -0
  448. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  449. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  450. package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
  451. package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
  452. package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
  453. package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
  454. package/codeyam-cli/templates/rule-notification-hook.py +83 -0
  455. package/codeyam-cli/templates/rule-reflection-hook.py +574 -87
  456. package/codeyam-cli/templates/rules-instructions.md +45 -60
  457. package/package.json +16 -14
  458. package/packages/ai/index.js +1 -1
  459. package/packages/ai/index.js.map +1 -1
  460. package/packages/ai/src/lib/analyzeScope.js +21 -1
  461. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  462. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
  463. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  464. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  465. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  466. package/packages/ai/src/lib/astScopes/processExpression.js +78 -1
  467. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  468. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  469. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  470. package/packages/ai/src/lib/completionCall.js +10 -7
  471. package/packages/ai/src/lib/completionCall.js.map +1 -1
  472. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +495 -10
  473. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  474. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  475. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  476. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +11 -2
  477. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  478. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +2 -2
  479. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  480. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  481. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  482. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  483. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  484. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
  485. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  486. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +15 -1
  487. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -1
  488. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +78 -17
  489. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  490. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  491. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  492. package/packages/ai/src/lib/dataStructureChunking.js +30 -11
  493. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  494. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  495. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  496. package/packages/ai/src/lib/generateEntityScenarioData.js +269 -5
  497. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  498. package/packages/ai/src/lib/generateExecutionFlows.js +97 -2
  499. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  500. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +242 -81
  501. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  502. package/packages/ai/src/lib/isolateScopes.js +39 -3
  503. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  504. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  505. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  506. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  507. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  508. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  509. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  510. package/packages/analyze/index.js +1 -0
  511. package/packages/analyze/index.js.map +1 -1
  512. package/packages/analyze/src/lib/ProjectAnalyzer.js +3 -0
  513. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  514. package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
  515. package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
  516. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +52 -2
  517. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  518. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +10 -0
  519. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  520. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
  521. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  522. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
  523. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  524. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +907 -0
  525. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  526. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +5 -1
  527. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  528. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +51 -14
  529. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  530. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +181 -13
  531. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  532. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +328 -49
  533. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  534. package/packages/analyze/src/lib/index.js +1 -0
  535. package/packages/analyze/src/lib/index.js.map +1 -1
  536. package/packages/database/index.js +1 -0
  537. package/packages/database/index.js.map +1 -1
  538. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  539. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  540. package/packages/database/src/lib/analysisToDb.js +1 -1
  541. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  542. package/packages/database/src/lib/branchToDb.js +1 -1
  543. package/packages/database/src/lib/branchToDb.js.map +1 -1
  544. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  545. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  546. package/packages/database/src/lib/commitToDb.js +1 -1
  547. package/packages/database/src/lib/commitToDb.js.map +1 -1
  548. package/packages/database/src/lib/fileToDb.js +1 -1
  549. package/packages/database/src/lib/fileToDb.js.map +1 -1
  550. package/packages/database/src/lib/kysely/db.js +8 -0
  551. package/packages/database/src/lib/kysely/db.js.map +1 -1
  552. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  553. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  554. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  555. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  556. package/packages/database/src/lib/loadCommits.js +23 -13
  557. package/packages/database/src/lib/loadCommits.js.map +1 -1
  558. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  559. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  560. package/packages/database/src/lib/projectToDb.js +1 -1
  561. package/packages/database/src/lib/projectToDb.js.map +1 -1
  562. package/packages/database/src/lib/saveFiles.js +1 -1
  563. package/packages/database/src/lib/saveFiles.js.map +1 -1
  564. package/packages/database/src/lib/scenarioToDb.js +1 -1
  565. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  566. package/packages/database/src/lib/updateCommitMetadata.js +100 -89
  567. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  568. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  569. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  570. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  571. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  572. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  573. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  574. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  575. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  576. package/packages/utils/src/lib/fs/rsyncCopy.js +98 -3
  577. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  578. package/scripts/finalize-analyzer.cjs +8 -76
  579. package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -118
  580. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
  581. package/codeyam-cli/src/commands/list.js +0 -31
  582. package/codeyam-cli/src/commands/list.js.map +0 -1
  583. package/codeyam-cli/src/commands/webapp-info.js +0 -146
  584. package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
  585. package/codeyam-cli/src/utils/universal-mocks.js +0 -152
  586. package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
  587. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-C8lyxW9k.js +0 -34
  588. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
  589. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +0 -1
  590. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js +0 -6
  591. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D1T4TGjf.js +0 -6
  592. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
  593. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  594. package/codeyam-cli/src/webserver/build/client/assets/manifest-a78b90a2.js +0 -1
  595. package/codeyam-cli/src/webserver/build/client/assets/memory--GCbFsBE.js +0 -92
  596. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
  597. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  598. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-aSv48UbS.js +0 -2
  599. package/codeyam-cli/src/webserver/build/server/assets/index-BM6TDT1Y.js +0 -1
  600. package/codeyam-cli/src/webserver/build/server/assets/server-build-dYC34MHw.js +0 -257
  601. package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
  602. package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
  603. package/codeyam-cli/templates/codeyam:memory.md +0 -341
  604. package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
@@ -0,0 +1,907 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ // ============================================================================
4
+ // Utility Functions
5
+ // ============================================================================
6
+ /**
7
+ * Compute the diff between two schema objects.
8
+ */
9
+ export function computeSchemaDiff(before, after) {
10
+ const diff = {
11
+ added: {},
12
+ removed: {},
13
+ changed: {},
14
+ };
15
+ const beforeKeys = new Set(Object.keys(before ?? {}));
16
+ const afterKeys = new Set(Object.keys(after ?? {}));
17
+ // Find added keys
18
+ for (const key of afterKeys) {
19
+ if (!beforeKeys.has(key)) {
20
+ diff.added[key] = after[key];
21
+ }
22
+ }
23
+ // Find removed keys
24
+ for (const key of beforeKeys) {
25
+ if (!afterKeys.has(key)) {
26
+ diff.removed[key] = before[key];
27
+ }
28
+ }
29
+ // Find changed keys
30
+ for (const key of beforeKeys) {
31
+ if (afterKeys.has(key) && before[key] !== after[key]) {
32
+ diff.changed[key] = { from: before[key], to: after[key] };
33
+ }
34
+ }
35
+ return diff;
36
+ }
37
+ /**
38
+ * Check if a diff has any changes.
39
+ */
40
+ export function hasDiffChanges(diff) {
41
+ return (Object.keys(diff.added).length > 0 ||
42
+ Object.keys(diff.removed).length > 0 ||
43
+ Object.keys(diff.changed).length > 0);
44
+ }
45
+ /**
46
+ * Count total changes in a diff.
47
+ */
48
+ export function countDiffChanges(diff) {
49
+ return (Object.keys(diff.added).length +
50
+ Object.keys(diff.removed).length +
51
+ Object.keys(diff.changed).length);
52
+ }
53
+ // ============================================================================
54
+ // TransformationTracer Class
55
+ // ============================================================================
56
+ // Global counter to identify tracer instances
57
+ let tracerInstanceCounter = 0;
58
+ export class TransformationTracer {
59
+ constructor(options) {
60
+ this.traces = new Map();
61
+ this.currentEntity = null;
62
+ this.currentStage = null;
63
+ this.tracerId = ++tracerInstanceCounter;
64
+ this.enabled = options?.enabled ?? false;
65
+ this.outputPath =
66
+ options?.outputPath ?? '/tmp/codeyam/transform-trace.json';
67
+ if (this.enabled) {
68
+ console.log(`[Tracer] Initialized (id=${this.tracerId}, output=${this.outputPath})`);
69
+ }
70
+ }
71
+ /**
72
+ * Log a message (only when tracing is enabled).
73
+ */
74
+ log(message) {
75
+ if (this.isEnabled()) {
76
+ console.log(`[Tracer] ${message}`);
77
+ }
78
+ }
79
+ /**
80
+ * Check if tracing is enabled.
81
+ * Dynamically checks environment variable so it works even if set after module load.
82
+ */
83
+ isEnabled() {
84
+ // Check environment variable dynamically - allows setting after module load
85
+ const envValue = process.env.CODEYAM_TRACE_TRANSFORMS;
86
+ if (envValue === '1' || envValue === 'true') {
87
+ return true;
88
+ }
89
+ return this.enabled;
90
+ }
91
+ /**
92
+ * Enable tracing.
93
+ */
94
+ enable() {
95
+ this.enabled = true;
96
+ }
97
+ /**
98
+ * Disable tracing.
99
+ */
100
+ disable() {
101
+ this.enabled = false;
102
+ }
103
+ /**
104
+ * Set the output path for the trace file.
105
+ */
106
+ setOutputPath(outputPath) {
107
+ this.outputPath = outputPath;
108
+ }
109
+ /**
110
+ * Set the project slug for metadata.
111
+ */
112
+ setProjectSlug(slug) {
113
+ this.projectSlug = slug;
114
+ }
115
+ /**
116
+ * Start tracing a new entity.
117
+ * If the entity already exists, preserves its existing stages and operations.
118
+ */
119
+ startEntity(entity) {
120
+ if (!this.isEnabled())
121
+ return;
122
+ this.currentEntity = entity.name;
123
+ // Preserve existing trace data if entity was already started
124
+ // (e.g., early stages from generateEntityDataStructure.ts)
125
+ const existing = this.traces.get(entity.name);
126
+ if (existing) {
127
+ this.log(`startEntity: ${entity.name} already exists, preserving ${existing.stages.length} stages`);
128
+ return; // Keep existing trace data
129
+ }
130
+ this.log(`startEntity: ${entity.name}`);
131
+ this.traces.set(entity.name, {
132
+ entityName: entity.name,
133
+ entityType: entity.entityType,
134
+ filePath: entity.filePath,
135
+ stages: [],
136
+ operations: [],
137
+ });
138
+ }
139
+ /**
140
+ * Take a coarse-grained snapshot at a transformation stage.
141
+ */
142
+ snapshot(entityName, stage, data) {
143
+ if (!this.isEnabled())
144
+ return;
145
+ const trace = this.traces.get(entityName);
146
+ if (!trace) {
147
+ this.log(`snapshot: no trace for ${entityName}, creating one`);
148
+ this.startEntity({
149
+ name: entityName,
150
+ entityType: 'unknown',
151
+ filePath: 'unknown',
152
+ });
153
+ return this.snapshot(entityName, stage, data);
154
+ }
155
+ this.log(`snapshot: ${entityName} → ${stage}`);
156
+ this.currentStage = stage;
157
+ // Deep clone the data to avoid capturing references that change later
158
+ const clonedData = JSON.parse(JSON.stringify(data));
159
+ const snapshot = {
160
+ stage,
161
+ timestamp: Date.now(),
162
+ data: clonedData,
163
+ };
164
+ // Compute diff from previous stage if there is one
165
+ const previousSnapshot = trace.stages[trace.stages.length - 1];
166
+ if (previousSnapshot) {
167
+ snapshot.diffFromPrevious = {
168
+ signatureSchema: computeSchemaDiff(previousSnapshot.data.signatureSchema, clonedData.signatureSchema),
169
+ returnValueSchema: computeSchemaDiff(previousSnapshot.data.returnValueSchema, clonedData.returnValueSchema),
170
+ };
171
+ // Compute diffs for dependency schemas
172
+ if (clonedData.dependencySchemas ||
173
+ previousSnapshot.data.dependencySchemas) {
174
+ snapshot.diffFromPrevious.dependencySchemas = {};
175
+ const allDepKeys = new Set([
176
+ ...Object.keys(clonedData.dependencySchemas ?? {}),
177
+ ...Object.keys(previousSnapshot.data.dependencySchemas ?? {}),
178
+ ]);
179
+ for (const depKey of allDepKeys) {
180
+ const prevDep = previousSnapshot.data.dependencySchemas?.[depKey];
181
+ const currDep = clonedData.dependencySchemas?.[depKey];
182
+ // Compare returnValueSchema for each dependency
183
+ for (const entityKey of new Set([
184
+ ...Object.keys(prevDep ?? {}),
185
+ ...Object.keys(currDep ?? {}),
186
+ ])) {
187
+ const fullKey = `${depKey}::${entityKey}`;
188
+ const prevSchema = prevDep?.[entityKey]?.returnValueSchema;
189
+ const currSchema = currDep?.[entityKey]?.returnValueSchema;
190
+ const depDiff = computeSchemaDiff(prevSchema, currSchema);
191
+ if (hasDiffChanges(depDiff)) {
192
+ snapshot.diffFromPrevious.dependencySchemas[fullKey] = depDiff;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+ trace.stages.push(snapshot);
199
+ }
200
+ /**
201
+ * Log a fine-grained operation within the current stage.
202
+ */
203
+ operation(entityName, op) {
204
+ if (!this.isEnabled())
205
+ return;
206
+ const trace = this.traces.get(entityName);
207
+ if (!trace)
208
+ return;
209
+ trace.operations.push({
210
+ ...op,
211
+ stage: op.stage ?? this.currentStage ?? undefined,
212
+ timestamp: Date.now(),
213
+ });
214
+ }
215
+ /**
216
+ * Compute the summary data for the current traces.
217
+ */
218
+ computeFlushSummary() {
219
+ const stageChangeCounts = {};
220
+ const entityChangeCounts = new Map();
221
+ for (const [entityName, trace] of this.traces) {
222
+ let entityTotal = 0;
223
+ for (const snapshot of trace.stages) {
224
+ if (!snapshot.diffFromPrevious)
225
+ continue;
226
+ const previousStage = trace.stages[trace.stages.indexOf(snapshot) - 1]?.stage ?? 'start';
227
+ const transitionKey = `${previousStage}→${snapshot.stage}`;
228
+ if (!stageChangeCounts[transitionKey]) {
229
+ stageChangeCounts[transitionKey] = {
230
+ added: 0,
231
+ removed: 0,
232
+ changed: 0,
233
+ };
234
+ }
235
+ // Count signature schema changes
236
+ if (snapshot.diffFromPrevious.signatureSchema) {
237
+ const diff = snapshot.diffFromPrevious.signatureSchema;
238
+ stageChangeCounts[transitionKey].added += Object.keys(diff.added).length;
239
+ stageChangeCounts[transitionKey].removed += Object.keys(diff.removed).length;
240
+ stageChangeCounts[transitionKey].changed += Object.keys(diff.changed).length;
241
+ entityTotal += countDiffChanges(diff);
242
+ }
243
+ // Count return value schema changes
244
+ if (snapshot.diffFromPrevious.returnValueSchema) {
245
+ const diff = snapshot.diffFromPrevious.returnValueSchema;
246
+ stageChangeCounts[transitionKey].added += Object.keys(diff.added).length;
247
+ stageChangeCounts[transitionKey].removed += Object.keys(diff.removed).length;
248
+ stageChangeCounts[transitionKey].changed += Object.keys(diff.changed).length;
249
+ entityTotal += countDiffChanges(diff);
250
+ }
251
+ }
252
+ entityChangeCounts.set(entityName, entityTotal);
253
+ }
254
+ // Get top 10 entities with most changes
255
+ const entitiesWithMostChanges = [...entityChangeCounts.entries()]
256
+ .sort((a, b) => b[1] - a[1])
257
+ .slice(0, 10)
258
+ .map(([name]) => name);
259
+ return { stageChangeCounts, entitiesWithMostChanges };
260
+ }
261
+ /**
262
+ * Write the trace to the output file.
263
+ * Uses streaming per-entity writes to avoid exceeding V8's max string length
264
+ * on large projects.
265
+ */
266
+ flush() {
267
+ if (!this.isEnabled())
268
+ return;
269
+ if (this.traces.size === 0) {
270
+ this.log('flush: no traces to write');
271
+ return;
272
+ }
273
+ const entities = Array.from(this.traces.keys());
274
+ const stageCounts = entities
275
+ .map((e) => `${e}(${this.traces.get(e).stages.length})`)
276
+ .join(', ');
277
+ this.log(`flush: writing ${entities.length} entities: ${stageCounts}`);
278
+ const { stageChangeCounts, entitiesWithMostChanges } = this.computeFlushSummary();
279
+ const meta = {
280
+ timestamp: new Date().toISOString(),
281
+ projectSlug: this.projectSlug,
282
+ entityCount: this.traces.size,
283
+ };
284
+ const summary = {
285
+ stageChangeCounts,
286
+ entitiesWithMostChanges,
287
+ };
288
+ // Ensure directory exists
289
+ const dir = path.dirname(this.outputPath);
290
+ if (!fs.existsSync(dir)) {
291
+ fs.mkdirSync(dir, { recursive: true });
292
+ }
293
+ // Stream JSON per-entity to avoid exceeding V8's max string length.
294
+ // Each entity is serialized individually so no single JSON.stringify
295
+ // call needs to produce the entire trace.
296
+ const fd = fs.openSync(this.outputPath, 'w');
297
+ try {
298
+ fs.writeSync(fd, '{\n "meta": ');
299
+ fs.writeSync(fd, JSON.stringify(meta, null, 2));
300
+ fs.writeSync(fd, ',\n "summary": ');
301
+ fs.writeSync(fd, JSON.stringify(summary, null, 2));
302
+ fs.writeSync(fd, ',\n "entities": {');
303
+ let first = true;
304
+ for (const [entityName, entityTrace] of this.traces) {
305
+ if (!first)
306
+ fs.writeSync(fd, ',');
307
+ fs.writeSync(fd, `\n ${JSON.stringify(entityName)}: `);
308
+ fs.writeSync(fd, JSON.stringify(entityTrace, null, 2));
309
+ first = false;
310
+ }
311
+ fs.writeSync(fd, '\n }\n}\n');
312
+ this.log(`flush: wrote trace to ${this.outputPath}`);
313
+ }
314
+ finally {
315
+ fs.closeSync(fd);
316
+ }
317
+ }
318
+ /**
319
+ * Clear all traces (useful for testing).
320
+ */
321
+ clear() {
322
+ this.traces.clear();
323
+ this.currentEntity = null;
324
+ this.currentStage = null;
325
+ }
326
+ // ============================================================================
327
+ // Analysis Utilities
328
+ // ============================================================================
329
+ /**
330
+ * Load a trace from a file.
331
+ */
332
+ static loadTrace(tracePath) {
333
+ const content = fs.readFileSync(tracePath, 'utf-8');
334
+ const traceFile = JSON.parse(content);
335
+ const tracer = new TransformationTracer({ enabled: false });
336
+ tracer.projectSlug = traceFile.meta.projectSlug;
337
+ for (const [entityName, entityTrace] of Object.entries(traceFile.entities)) {
338
+ tracer.traces.set(entityName, entityTrace);
339
+ }
340
+ return tracer;
341
+ }
342
+ /**
343
+ * Get a high-level summary of the trace.
344
+ */
345
+ getSummary() {
346
+ const stageChangeCounts = {};
347
+ const entityChangeCounts = new Map();
348
+ for (const [entityName, trace] of this.traces) {
349
+ let entityTotal = 0;
350
+ for (let i = 1; i < trace.stages.length; i++) {
351
+ const snapshot = trace.stages[i];
352
+ const previousStage = trace.stages[i - 1]?.stage ?? 'start';
353
+ const transitionKey = `${previousStage}→${snapshot.stage}`;
354
+ if (!stageChangeCounts[transitionKey]) {
355
+ stageChangeCounts[transitionKey] = {
356
+ added: 0,
357
+ removed: 0,
358
+ changed: 0,
359
+ };
360
+ }
361
+ if (snapshot.diffFromPrevious?.signatureSchema) {
362
+ const diff = snapshot.diffFromPrevious.signatureSchema;
363
+ stageChangeCounts[transitionKey].added += Object.keys(diff.added).length;
364
+ stageChangeCounts[transitionKey].removed += Object.keys(diff.removed).length;
365
+ stageChangeCounts[transitionKey].changed += Object.keys(diff.changed).length;
366
+ entityTotal += countDiffChanges(diff);
367
+ }
368
+ if (snapshot.diffFromPrevious?.returnValueSchema) {
369
+ const diff = snapshot.diffFromPrevious.returnValueSchema;
370
+ stageChangeCounts[transitionKey].added += Object.keys(diff.added).length;
371
+ stageChangeCounts[transitionKey].removed += Object.keys(diff.removed).length;
372
+ stageChangeCounts[transitionKey].changed += Object.keys(diff.changed).length;
373
+ entityTotal += countDiffChanges(diff);
374
+ }
375
+ }
376
+ entityChangeCounts.set(entityName, entityTotal);
377
+ }
378
+ const entitiesWithMostChanges = [...entityChangeCounts.entries()]
379
+ .sort((a, b) => b[1] - a[1])
380
+ .slice(0, 10)
381
+ .map(([name, totalChanges]) => ({ name, totalChanges }));
382
+ return {
383
+ entityCount: this.traces.size,
384
+ stageChangeCounts,
385
+ entitiesWithMostChanges,
386
+ };
387
+ }
388
+ /**
389
+ * Get a summary of stages for a specific entity.
390
+ */
391
+ getEntitySummary(entityName) {
392
+ const trace = this.traces.get(entityName);
393
+ if (!trace)
394
+ return null;
395
+ return {
396
+ entityName,
397
+ stages: trace.stages.map((s) => ({
398
+ stage: s.stage,
399
+ diffFromPrevious: s.diffFromPrevious
400
+ ? {
401
+ signatureSchema: s.diffFromPrevious.signatureSchema,
402
+ returnValueSchema: s.diffFromPrevious.returnValueSchema,
403
+ }
404
+ : undefined,
405
+ })),
406
+ };
407
+ }
408
+ /**
409
+ * Get operations for an entity, optionally filtered by path pattern.
410
+ */
411
+ getOperations(entityName, pathPattern) {
412
+ const trace = this.traces.get(entityName);
413
+ if (!trace)
414
+ return [];
415
+ if (!pathPattern)
416
+ return trace.operations;
417
+ return trace.operations.filter((op) => op.path && pathPattern.test(op.path));
418
+ }
419
+ /**
420
+ * Trace the full history of a specific path through all transformations.
421
+ */
422
+ tracePath(entityName, targetPath) {
423
+ const trace = this.traces.get(entityName);
424
+ const history = [];
425
+ if (!trace) {
426
+ return { entityName, path: targetPath, history };
427
+ }
428
+ // Track value through stages
429
+ for (const snapshot of trace.stages) {
430
+ const sigValue = snapshot.data.signatureSchema?.[targetPath];
431
+ const retValue = snapshot.data.returnValueSchema?.[targetPath];
432
+ const value = sigValue ?? retValue;
433
+ if (value !== undefined) {
434
+ history.push({
435
+ stage: snapshot.stage,
436
+ value,
437
+ });
438
+ }
439
+ }
440
+ // Track value through operations
441
+ for (const op of trace.operations) {
442
+ if (op.path === targetPath) {
443
+ history.push({
444
+ operation: op.operation,
445
+ stage: op.stage,
446
+ value: op.after ?? op.before,
447
+ context: op.context,
448
+ });
449
+ }
450
+ }
451
+ return { entityName, path: targetPath, history };
452
+ }
453
+ /**
454
+ * Get the raw entity trace for direct inspection.
455
+ */
456
+ getEntityTrace(entityName) {
457
+ return this.traces.get(entityName);
458
+ }
459
+ /**
460
+ * Get all entity names in the trace.
461
+ */
462
+ getEntityNames() {
463
+ return [...this.traces.keys()];
464
+ }
465
+ // ============================================================================
466
+ // Debugging Utilities
467
+ // ============================================================================
468
+ /**
469
+ * Find all paths containing a property name across all stages.
470
+ * Useful for debugging: "where does 'analyses' appear in the schema?"
471
+ */
472
+ findProperty(entityName, propertyName) {
473
+ const trace = this.traces.get(entityName);
474
+ if (!trace)
475
+ return [];
476
+ const results = [];
477
+ const pattern = new RegExp(`(^|\\.)${propertyName}(\\.|\\[|$)`);
478
+ for (const snapshot of trace.stages) {
479
+ // Search signature schema
480
+ for (const [path, type] of Object.entries(snapshot.data.signatureSchema ?? {})) {
481
+ if (pattern.test(path)) {
482
+ results.push({
483
+ stage: snapshot.stage,
484
+ path,
485
+ type,
486
+ schemaType: 'signature',
487
+ });
488
+ }
489
+ }
490
+ // Search return value schema
491
+ for (const [path, type] of Object.entries(snapshot.data.returnValueSchema ?? {})) {
492
+ if (pattern.test(path)) {
493
+ results.push({
494
+ stage: snapshot.stage,
495
+ path,
496
+ type,
497
+ schemaType: 'returnValue',
498
+ });
499
+ }
500
+ }
501
+ // Search dependency schemas
502
+ for (const [depPath, depEntities] of Object.entries(snapshot.data.dependencySchemas ?? {})) {
503
+ for (const [depName, depData] of Object.entries(depEntities)) {
504
+ for (const [path, type] of Object.entries(depData.returnValueSchema ?? {})) {
505
+ if (pattern.test(path)) {
506
+ results.push({
507
+ stage: snapshot.stage,
508
+ path: `${depPath}/${depName}::${path}`,
509
+ type,
510
+ schemaType: 'dependency',
511
+ });
512
+ }
513
+ }
514
+ }
515
+ }
516
+ }
517
+ return results;
518
+ }
519
+ /**
520
+ * Find properties that have inconsistent types across different paths.
521
+ * Useful for debugging: "why does 'analyses' have different types?"
522
+ *
523
+ * Only compares paths that end with the same pattern (e.g., both end in `.analyses`
524
+ * or both end in `.analyses[]`). Ignores built-in properties like `.length`.
525
+ */
526
+ findTypeInconsistencies(entityName) {
527
+ const trace = this.traces.get(entityName);
528
+ if (!trace)
529
+ return [];
530
+ // Find the best stage for comparison (last one with dependency schemas)
531
+ let targetStage = trace.stages[trace.stages.length - 1];
532
+ for (let i = trace.stages.length - 1; i >= 0; i--) {
533
+ if (Object.keys(trace.stages[i].data.dependencySchemas ?? {}).length > 0) {
534
+ targetStage = trace.stages[i];
535
+ break;
536
+ }
537
+ }
538
+ if (!targetStage)
539
+ return [];
540
+ // Built-in properties to ignore
541
+ const builtIns = new Set(['length', 'toString', 'valueOf', 'constructor']);
542
+ // Group paths by their terminal pattern (e.g., ".analyses" or ".analyses[]")
543
+ const propertyGroups = new Map();
544
+ const addToGroup = (path, type) => {
545
+ // Extract terminal property pattern (e.g., "foo.bar.analyses[]" -> "analyses[]")
546
+ const match = path.match(/\.([a-zA-Z_][a-zA-Z0-9_]*)(\[\])?$/);
547
+ if (!match)
548
+ return;
549
+ const propName = match[1];
550
+ const isArray = match[2] === '[]';
551
+ // Skip built-in properties
552
+ if (builtIns.has(propName))
553
+ return;
554
+ // Use pattern as key (includes [] suffix)
555
+ const pattern = propName + (isArray ? '[]' : '');
556
+ if (!propertyGroups.has(pattern)) {
557
+ propertyGroups.set(pattern, []);
558
+ }
559
+ propertyGroups.get(pattern).push({ path, type });
560
+ };
561
+ // Collect from dependency schemas (where inconsistencies usually appear)
562
+ for (const [, depEntities] of Object.entries(targetStage.data.dependencySchemas ?? {})) {
563
+ for (const [, depData] of Object.entries(depEntities)) {
564
+ for (const [path, type] of Object.entries(depData.returnValueSchema ?? {})) {
565
+ addToGroup(path, type);
566
+ }
567
+ }
568
+ }
569
+ // Find inconsistencies (same terminal pattern, different types)
570
+ const inconsistencies = [];
571
+ for (const [pattern, paths] of propertyGroups) {
572
+ // Normalize types for comparison (treat "unknown | undefined" and "unknown" as similar)
573
+ const normalizedTypes = new Set(paths.map((p) => p.type.replace(/ \| undefined/g, '').replace(/ \| null/g, '')));
574
+ if (normalizedTypes.size > 1) {
575
+ inconsistencies.push({
576
+ propertyName: pattern,
577
+ paths: paths.map((p) => ({ ...p, stage: targetStage.stage })),
578
+ });
579
+ }
580
+ }
581
+ // Sort by number of different types (most inconsistent first)
582
+ inconsistencies.sort((a, b) => {
583
+ const aTypes = new Set(a.paths.map((p) => p.type)).size;
584
+ const bTypes = new Set(b.paths.map((p) => p.type)).size;
585
+ return bTypes - aTypes;
586
+ });
587
+ return inconsistencies;
588
+ }
589
+ /**
590
+ * Get a human-readable summary of changes between two stages.
591
+ */
592
+ getStageDiffSummary(entityName, fromStage, toStage) {
593
+ const trace = this.traces.get(entityName);
594
+ if (!trace)
595
+ return null;
596
+ const from = trace.stages.find((s) => s.stage === fromStage);
597
+ const to = trace.stages.find((s) => s.stage === toStage);
598
+ if (!from || !to)
599
+ return null;
600
+ const result = {
601
+ added: [],
602
+ removed: [],
603
+ typeChanged: [],
604
+ };
605
+ // Compare return value schemas (most common)
606
+ const fromSchema = from.data.returnValueSchema ?? {};
607
+ const toSchema = to.data.returnValueSchema ?? {};
608
+ const fromKeys = new Set(Object.keys(fromSchema));
609
+ const toKeys = new Set(Object.keys(toSchema));
610
+ for (const key of toKeys) {
611
+ if (!fromKeys.has(key)) {
612
+ result.added.push(`${key}: ${toSchema[key]}`);
613
+ }
614
+ else if (fromSchema[key] !== toSchema[key]) {
615
+ result.typeChanged.push({
616
+ path: key,
617
+ from: fromSchema[key],
618
+ to: toSchema[key],
619
+ });
620
+ }
621
+ }
622
+ for (const key of fromKeys) {
623
+ if (!toKeys.has(key)) {
624
+ result.removed.push(`${key}: ${fromSchema[key]}`);
625
+ }
626
+ }
627
+ return result;
628
+ }
629
+ /**
630
+ * Trace a schema transformation by capturing before/after and logging operations for all changes.
631
+ *
632
+ * This is a helper to wrap transformative functions like:
633
+ * - cleanKnownObjectFunctionsFromMapping
634
+ * - clearAttributesFromMapping
635
+ * - fillInDirectSchemaGapsAndUnknowns
636
+ * - deduplicateFunctionSchemas
637
+ *
638
+ * @param entityName - The entity being traced
639
+ * @param operationName - Name of the transformation (e.g., 'cleanKnownObjectFunctions')
640
+ * @param schema - The schema to transform (will be mutated)
641
+ * @param transformFn - The transformation function to run
642
+ * @param context - Optional context to include in operation logs
643
+ * @returns The schema (same reference, mutated)
644
+ */
645
+ traceSchemaTransform(entityName, operationName, schema, transformFn, context) {
646
+ if (!this.enabled) {
647
+ transformFn(schema);
648
+ return schema;
649
+ }
650
+ // Capture before state
651
+ const before = { ...schema };
652
+ // Run the transformation
653
+ transformFn(schema);
654
+ // Compute diff and log operations
655
+ const diff = computeSchemaDiff(before, schema);
656
+ // Log added paths
657
+ for (const [path, value] of Object.entries(diff.added)) {
658
+ this.operation(entityName, {
659
+ operation: operationName,
660
+ path,
661
+ before: undefined,
662
+ after: value,
663
+ context: { ...context, changeType: 'added' },
664
+ });
665
+ }
666
+ // Log removed paths
667
+ for (const [path, value] of Object.entries(diff.removed)) {
668
+ this.operation(entityName, {
669
+ operation: operationName,
670
+ path,
671
+ before: value,
672
+ after: undefined,
673
+ context: { ...context, changeType: 'removed' },
674
+ });
675
+ }
676
+ // Log changed paths
677
+ for (const [path, { from, to }] of Object.entries(diff.changed)) {
678
+ this.operation(entityName, {
679
+ operation: operationName,
680
+ path,
681
+ before: from,
682
+ after: to,
683
+ context: { ...context, changeType: 'changed' },
684
+ });
685
+ }
686
+ return schema;
687
+ }
688
+ /**
689
+ * Trace a schema transformation where the function returns a new schema (non-mutating).
690
+ *
691
+ * Use this for functions like deduplicateFunctionSchemas that return a new object
692
+ * rather than mutating the input.
693
+ *
694
+ * @param entityName - The entity being traced
695
+ * @param operationName - Name of the transformation
696
+ * @param before - The schema before transformation
697
+ * @param after - The schema after transformation
698
+ * @param context - Optional context to include in operation logs
699
+ */
700
+ traceSchemaTransformResult(entityName, operationName, before, after, context) {
701
+ if (!this.enabled)
702
+ return;
703
+ // Compute diff and log operations
704
+ const diff = computeSchemaDiff(before, after);
705
+ // Log added paths
706
+ for (const [path, value] of Object.entries(diff.added)) {
707
+ this.operation(entityName, {
708
+ operation: operationName,
709
+ path,
710
+ before: undefined,
711
+ after: value,
712
+ context: { ...context, changeType: 'added' },
713
+ });
714
+ }
715
+ // Log removed paths
716
+ for (const [path, value] of Object.entries(diff.removed)) {
717
+ this.operation(entityName, {
718
+ operation: operationName,
719
+ path,
720
+ before: value,
721
+ after: undefined,
722
+ context: { ...context, changeType: 'removed' },
723
+ });
724
+ }
725
+ // Log changed paths
726
+ for (const [path, { from, to }] of Object.entries(diff.changed)) {
727
+ this.operation(entityName, {
728
+ operation: operationName,
729
+ path,
730
+ before: from,
731
+ after: to,
732
+ context: { ...context, changeType: 'changed' },
733
+ });
734
+ }
735
+ }
736
+ /**
737
+ * Trace multiple schemas in a dependency schemas structure.
738
+ * Useful for tracing transformations that apply to all dependency schemas.
739
+ *
740
+ * @param entityName - The entity being traced
741
+ * @param operationName - Name of the transformation
742
+ * @param dependencySchemas - The dependency schemas structure
743
+ * @param transformFn - Function to apply to each schema (signature or returnValue)
744
+ * @param schemaType - Which schema to transform: 'signature', 'returnValue', or 'both'
745
+ */
746
+ traceDependencySchemaTransform(entityName, operationName, dependencySchemas, transformFn, schemaType = 'both') {
747
+ if (!this.enabled) {
748
+ // Still run the transform even if not tracing
749
+ for (const filePath in dependencySchemas) {
750
+ for (const depName in dependencySchemas[filePath]) {
751
+ const depSchema = dependencySchemas[filePath][depName];
752
+ if ((schemaType === 'signature' || schemaType === 'both') &&
753
+ depSchema.signatureSchema) {
754
+ transformFn(depSchema.signatureSchema);
755
+ }
756
+ if ((schemaType === 'returnValue' || schemaType === 'both') &&
757
+ depSchema.returnValueSchema) {
758
+ transformFn(depSchema.returnValueSchema);
759
+ }
760
+ }
761
+ }
762
+ return;
763
+ }
764
+ for (const filePath in dependencySchemas) {
765
+ for (const depName in dependencySchemas[filePath]) {
766
+ const depSchema = dependencySchemas[filePath][depName];
767
+ const depContext = { filePath, dependencyName: depName };
768
+ if ((schemaType === 'signature' || schemaType === 'both') &&
769
+ depSchema.signatureSchema) {
770
+ this.traceSchemaTransform(entityName, operationName, depSchema.signatureSchema, transformFn, { ...depContext, schemaType: 'signature' });
771
+ }
772
+ if ((schemaType === 'returnValue' || schemaType === 'both') &&
773
+ depSchema.returnValueSchema) {
774
+ this.traceSchemaTransform(entityName, operationName, depSchema.returnValueSchema, transformFn, { ...depContext, schemaType: 'returnValue' });
775
+ }
776
+ }
777
+ }
778
+ }
779
+ /**
780
+ * Trace changes to dependency schemas before/after a function call.
781
+ *
782
+ * Use this for functions like enrichArrayTypesFromChildSignatures or
783
+ * enrichUnknownTypesFromSourceEquivalencies that modify dependency schemas in place.
784
+ *
785
+ * @param entityName - The entity being traced
786
+ * @param operationName - Name of the transformation
787
+ * @param dependencySchemas - The dependency schemas to track
788
+ * @param transformFn - The function to run (should mutate dependencySchemas)
789
+ */
790
+ traceDependencySchemaChanges(entityName, operationName, dependencySchemas, transformFn) {
791
+ if (!this.enabled) {
792
+ transformFn();
793
+ return;
794
+ }
795
+ // Capture before state (deep copy of all schemas)
796
+ const beforeState = {};
797
+ for (const filePath in dependencySchemas) {
798
+ beforeState[filePath] = {};
799
+ for (const depName in dependencySchemas[filePath]) {
800
+ const depSchema = dependencySchemas[filePath][depName];
801
+ beforeState[filePath][depName] = {
802
+ sig: { ...(depSchema.signatureSchema || {}) },
803
+ rv: { ...(depSchema.returnValueSchema || {}) },
804
+ };
805
+ }
806
+ }
807
+ // Run the transformation
808
+ transformFn();
809
+ // Compare and log changes
810
+ for (const filePath in dependencySchemas) {
811
+ for (const depName in dependencySchemas[filePath]) {
812
+ const depSchema = dependencySchemas[filePath][depName];
813
+ const before = beforeState[filePath]?.[depName];
814
+ const context = { filePath, dependencyName: depName };
815
+ // Check signature schema changes
816
+ if (depSchema.signatureSchema) {
817
+ const sigBefore = before?.sig || {};
818
+ const diff = computeSchemaDiff(sigBefore, depSchema.signatureSchema);
819
+ for (const [path, value] of Object.entries(diff.added)) {
820
+ this.operation(entityName, {
821
+ operation: operationName,
822
+ path,
823
+ before: undefined,
824
+ after: value,
825
+ context: {
826
+ ...context,
827
+ schemaType: 'signature',
828
+ changeType: 'added',
829
+ },
830
+ });
831
+ }
832
+ for (const [path, { from, to }] of Object.entries(diff.changed)) {
833
+ this.operation(entityName, {
834
+ operation: operationName,
835
+ path,
836
+ before: from,
837
+ after: to,
838
+ context: {
839
+ ...context,
840
+ schemaType: 'signature',
841
+ changeType: 'changed',
842
+ },
843
+ });
844
+ }
845
+ }
846
+ // Check return value schema changes
847
+ if (depSchema.returnValueSchema) {
848
+ const rvBefore = before?.rv || {};
849
+ const diff = computeSchemaDiff(rvBefore, depSchema.returnValueSchema);
850
+ for (const [path, value] of Object.entries(diff.added)) {
851
+ this.operation(entityName, {
852
+ operation: operationName,
853
+ path,
854
+ before: undefined,
855
+ after: value,
856
+ context: {
857
+ ...context,
858
+ schemaType: 'returnValue',
859
+ changeType: 'added',
860
+ },
861
+ });
862
+ }
863
+ for (const [path, { from, to }] of Object.entries(diff.changed)) {
864
+ this.operation(entityName, {
865
+ operation: operationName,
866
+ path,
867
+ before: from,
868
+ after: to,
869
+ context: {
870
+ ...context,
871
+ schemaType: 'returnValue',
872
+ changeType: 'changed',
873
+ },
874
+ });
875
+ }
876
+ }
877
+ }
878
+ }
879
+ }
880
+ }
881
+ // ============================================================================
882
+ // Global Instance
883
+ // ============================================================================
884
+ /**
885
+ * Check if tracing is enabled via environment variable.
886
+ */
887
+ function isTracingEnabled() {
888
+ const envValue = process.env.CODEYAM_TRACE_TRANSFORMS;
889
+ return envValue === '1' || envValue === 'true';
890
+ }
891
+ /**
892
+ * Global tracer instance.
893
+ * Enabled via CODEYAM_TRACE_TRANSFORMS=1 environment variable.
894
+ * Output is always written to /tmp/codeyam/transform-trace.json
895
+ */
896
+ export const transformationTracer = new TransformationTracer({
897
+ enabled: isTracingEnabled(),
898
+ outputPath: '/tmp/codeyam/transform-trace.json',
899
+ });
900
+ // Auto-flush on process exit if tracing is enabled and there's data
901
+ process.on('beforeExit', () => {
902
+ if (transformationTracer.isEnabled()) {
903
+ transformationTracer.flush();
904
+ }
905
+ });
906
+ export default transformationTracer;
907
+ //# sourceMappingURL=TransformationTracer.js.map