@codeyam/codeyam-cli 0.1.0-staging.2a88920 → 0.1.0-staging.4057bd2

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 (659) 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 +21 -21
  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 +4 -4
  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/github/package.json +1 -1
  132. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +8 -0
  133. package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
  134. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +8 -0
  135. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  136. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
  137. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  138. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  139. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +98 -3
  140. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  141. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +121 -3
  142. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  143. package/analyzer-template/project/constructMockCode.ts +206 -51
  144. package/analyzer-template/project/orchestrateCapture.ts +4 -1
  145. package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
  146. package/analyzer-template/project/start.ts +3 -0
  147. package/analyzer-template/project/startScenarioCapture.ts +9 -0
  148. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  149. package/analyzer-template/project/writeMockDataTsx.ts +191 -12
  150. package/analyzer-template/project/writeScenarioComponents.ts +170 -29
  151. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  152. package/analyzer-template/tsconfig.json +13 -1
  153. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  154. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  155. package/background/src/lib/virtualized/project/constructMockCode.js +175 -42
  156. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  157. package/background/src/lib/virtualized/project/orchestrateCapture.js +4 -1
  158. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  159. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
  160. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  161. package/background/src/lib/virtualized/project/start.js +2 -0
  162. package/background/src/lib/virtualized/project/start.js.map +1 -1
  163. package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
  164. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  165. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  166. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  167. package/background/src/lib/virtualized/project/writeMockDataTsx.js +168 -8
  168. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  169. package/background/src/lib/virtualized/project/writeScenarioComponents.js +143 -27
  170. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  171. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  172. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  173. package/codeyam-cli/scripts/apply-setup.js +386 -9
  174. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  175. package/codeyam-cli/src/cli.js +33 -24
  176. package/codeyam-cli/src/cli.js.map +1 -1
  177. package/codeyam-cli/src/codeyam-cli.js +18 -2
  178. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  179. package/codeyam-cli/src/commands/analyze.js +21 -9
  180. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  181. package/codeyam-cli/src/commands/baseline.js +2 -0
  182. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  183. package/codeyam-cli/src/commands/debug.js +2 -0
  184. package/codeyam-cli/src/commands/debug.js.map +1 -1
  185. package/codeyam-cli/src/commands/default.js +87 -21
  186. package/codeyam-cli/src/commands/default.js.map +1 -1
  187. package/codeyam-cli/src/commands/editor.js +1839 -0
  188. package/codeyam-cli/src/commands/editor.js.map +1 -0
  189. package/codeyam-cli/src/commands/init.js +81 -260
  190. package/codeyam-cli/src/commands/init.js.map +1 -1
  191. package/codeyam-cli/src/commands/memory.js +97 -92
  192. package/codeyam-cli/src/commands/memory.js.map +1 -1
  193. package/codeyam-cli/src/commands/recapture.js +2 -0
  194. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  195. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  196. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  197. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  198. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  199. package/codeyam-cli/src/commands/test-startup.js +2 -0
  200. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  201. package/codeyam-cli/src/commands/verify.js +14 -2
  202. package/codeyam-cli/src/commands/verify.js.map +1 -1
  203. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +246 -0
  204. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  205. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +126 -0
  206. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  207. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +295 -0
  208. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  209. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  210. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  211. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +100 -0
  212. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  213. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +147 -0
  214. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  215. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +76 -0
  216. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  217. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  218. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  219. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +185 -0
  220. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -0
  221. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  222. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  223. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  224. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  225. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  226. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  227. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +154 -86
  228. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  229. package/codeyam-cli/src/utils/analyzer.js +7 -0
  230. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  231. package/codeyam-cli/src/utils/backgroundServer.js +109 -22
  232. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  233. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  234. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  235. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  236. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  237. package/codeyam-cli/src/utils/editorAudit.js +82 -0
  238. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  239. package/codeyam-cli/src/utils/editorDevServer.js +98 -0
  240. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  241. package/codeyam-cli/src/utils/editorJournal.js +137 -0
  242. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  243. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  244. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  245. package/codeyam-cli/src/utils/editorPreloadHelpers.js +64 -0
  246. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  247. package/codeyam-cli/src/utils/editorPreview.js +66 -0
  248. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  249. package/codeyam-cli/src/utils/editorScenarios.js +56 -0
  250. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  251. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  252. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  253. package/codeyam-cli/src/utils/fileWatcher.js +25 -9
  254. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  255. package/codeyam-cli/src/utils/generateReport.js +2 -2
  256. package/codeyam-cli/src/utils/git.js +103 -0
  257. package/codeyam-cli/src/utils/git.js.map +1 -1
  258. package/codeyam-cli/src/utils/install-skills.js +101 -56
  259. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  260. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  261. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  262. package/codeyam-cli/src/utils/labsAutoCheck.js +19 -0
  263. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  264. package/codeyam-cli/src/utils/npmVersionCheck.js +76 -0
  265. package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -0
  266. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  267. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  268. package/codeyam-cli/src/utils/progress.js +7 -0
  269. package/codeyam-cli/src/utils/progress.js.map +1 -1
  270. package/codeyam-cli/src/utils/project.js +15 -5
  271. package/codeyam-cli/src/utils/project.js.map +1 -1
  272. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  273. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  274. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  275. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  276. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  277. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  278. package/codeyam-cli/src/utils/queue/job.js +74 -1
  279. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  280. package/codeyam-cli/src/utils/queue/manager.js +7 -6
  281. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  282. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  283. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  284. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  285. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  286. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +229 -0
  287. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  288. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  289. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  290. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  291. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  292. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  293. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  294. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  295. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  296. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +74 -0
  297. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  298. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +376 -0
  299. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  300. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +113 -0
  301. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  302. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  303. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  304. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  305. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  306. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  307. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  308. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  309. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  310. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  311. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  312. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  313. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  314. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  315. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  316. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
  317. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
  318. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
  319. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
  320. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
  321. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
  322. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  323. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  324. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
  325. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
  326. package/codeyam-cli/src/utils/rules/index.js +2 -0
  327. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  328. package/codeyam-cli/src/utils/rules/parser.js +16 -29
  329. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  330. package/codeyam-cli/src/utils/rules/pathMatcher.js +34 -3
  331. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -1
  332. package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
  333. package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
  334. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  335. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  336. package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
  337. package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
  338. package/codeyam-cli/src/utils/rules/staleness.js +16 -11
  339. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
  340. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  341. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  342. package/codeyam-cli/src/utils/serverState.js +64 -12
  343. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  344. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +61 -43
  345. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  346. package/codeyam-cli/src/utils/simulationGateMiddleware.js +159 -0
  347. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
  348. package/codeyam-cli/src/utils/syncMocksMiddleware.js +5 -24
  349. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  350. package/codeyam-cli/src/utils/testRunner.js +158 -0
  351. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  352. package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
  353. package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
  354. package/codeyam-cli/src/utils/versionInfo.js +46 -0
  355. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  356. package/codeyam-cli/src/utils/webappDetection.js +14 -2
  357. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  358. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js +66 -0
  359. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js.map +1 -0
  360. package/codeyam-cli/src/webserver/app/lib/database.js +56 -30
  361. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  362. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  363. package/codeyam-cli/src/webserver/backgroundServer.js +166 -16
  364. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  365. package/codeyam-cli/src/webserver/bootstrap.js +11 -0
  366. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  367. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-DmJveP3T.js +1 -0
  368. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DsN1wKrm.js → EntityItem-C76mRRiF.js} +1 -1
  369. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-g3saevPb.js} +1 -1
  370. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-CobE682z.js} +1 -1
  371. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +1 -0
  372. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-DYFW3lDD.js} +3 -3
  373. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-DLeucoVX.js} +1 -1
  374. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-BU_OAEMP.js} +1 -1
  375. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-ceAyBX-H.js} +1 -1
  376. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-OApQuNyq.js → ReportIssueModal-djPLI-WV.js} +3 -8
  377. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-BED4B6sP.js} +1 -1
  378. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DzccYyI8.js → ScenarioViewer-B76aig_2.js} +2 -2
  379. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +34 -0
  380. package/codeyam-cli/src/webserver/build/client/assets/Terminal-Dnj5CY9R.js +41 -0
  381. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-C8OKAR5x.js} +1 -1
  382. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-C96V0n15.js} +1 -1
  383. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BwavGCpm.js → activity.(_tab)-BpKzcsJz.js} +6 -11
  384. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +1 -0
  385. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-Duc5hnl7.js +1 -0
  386. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-D9hemwl6.js +22 -0
  387. package/codeyam-cli/src/webserver/build/client/assets/api.agent-transcripts-l0sNRNKZ.js +1 -0
  388. package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
  389. package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
  390. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  391. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  392. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  393. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  394. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  395. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  396. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  397. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  398. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  399. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  400. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  401. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  402. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  403. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  404. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  405. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
  406. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  407. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  408. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  409. package/codeyam-cli/src/webserver/build/client/assets/api.rule-path-l0sNRNKZ.js +1 -0
  410. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  411. package/codeyam-cli/src/webserver/build/client/assets/book-open-D_nMCFmP.js +6 -0
  412. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-BH2h1Ea2.js} +1 -1
  413. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-C4pqxYJB.js} +12 -12
  414. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-DyIKORY6.js} +1 -1
  415. package/codeyam-cli/src/webserver/build/client/assets/copy-NDbZjXao.js +11 -0
  416. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-CMT1jU2q.js} +1 -1
  417. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +1 -0
  418. package/codeyam-cli/src/webserver/build/client/assets/editor-D1DAKXtT.js +8 -0
  419. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BJUiQqZF.js → entity._sha._-CrjR3zZW.js} +11 -11
  420. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DkzqFzFj.js +6 -0
  421. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +6 -0
  422. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +6 -0
  423. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-BMvVHNXU.js} +2 -2
  424. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-DTvKq3TY.js} +1 -1
  425. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-cPo8LiG3.js} +1 -1
  426. package/codeyam-cli/src/webserver/build/client/assets/{files-CJ6lTdTA.js → files-DO4CZ16O.js} +1 -1
  427. package/codeyam-cli/src/webserver/build/client/assets/{git-CPTZZ-JZ.js → git-CFCTYk9I.js} +1 -1
  428. package/codeyam-cli/src/webserver/build/client/assets/globals-B17TBSS6.css +1 -0
  429. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-10oVnAAH.js} +1 -1
  430. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-BcvgDzbZ.js} +1 -1
  431. package/codeyam-cli/src/webserver/build/client/assets/labs-Zk7ryIM1.js +1 -0
  432. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-BAXYRVEO.js} +1 -1
  433. package/codeyam-cli/src/webserver/build/client/assets/manifest-a632de18.js +1 -0
  434. package/codeyam-cli/src/webserver/build/client/assets/memory-Dg0mvYrI.js +96 -0
  435. package/codeyam-cli/src/webserver/build/client/assets/pause-DTAcYxBt.js +11 -0
  436. package/codeyam-cli/src/webserver/build/client/assets/root-DUKqhFlb.js +67 -0
  437. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-fKo7v0Zo.js} +1 -1
  438. package/codeyam-cli/src/webserver/build/client/assets/settings-DfuTtcJP.js +1 -0
  439. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-B3aOzpCZ.js} +1 -1
  440. package/codeyam-cli/src/webserver/build/client/assets/terminal-BG4heKCG.js +11 -0
  441. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-DtSmdtM4.js} +1 -1
  442. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-ByhSyh0W.js} +1 -1
  443. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +2 -0
  444. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-O-jkvSPx.js} +1 -1
  445. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-9FIWuYfK.js} +1 -1
  446. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  447. package/codeyam-cli/src/webserver/build/server/assets/index-HfLydfDq.js +1 -0
  448. package/codeyam-cli/src/webserver/build/server/assets/server-build-CUu_F-oo.js +366 -0
  449. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  450. package/codeyam-cli/src/webserver/build-info.json +5 -5
  451. package/codeyam-cli/src/webserver/devServer.js +39 -5
  452. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  453. package/codeyam-cli/src/webserver/editorProxy.js +440 -0
  454. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  455. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +175 -0
  456. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +140 -0
  457. package/codeyam-cli/src/webserver/server.js +226 -1
  458. package/codeyam-cli/src/webserver/server.js.map +1 -1
  459. package/codeyam-cli/src/webserver/terminalServer.js +698 -0
  460. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  461. package/codeyam-cli/templates/codeyam-editor-claude.md +68 -0
  462. package/codeyam-cli/templates/codeyam-memory-hook.sh +19 -20
  463. package/codeyam-cli/templates/commands/codeyam-diagnose.md +481 -0
  464. package/codeyam-cli/templates/editor-step-hook.py +147 -0
  465. package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
  466. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  467. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  468. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  469. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  470. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  471. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  472. package/codeyam-cli/templates/nextjs-prisma-sqlite/PRISMA_SETUP.md +84 -0
  473. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  474. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  475. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  476. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +19 -0
  477. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  478. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  479. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +43 -0
  480. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  481. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +35 -0
  482. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  483. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  484. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +37 -0
  485. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  486. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  487. package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
  488. package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
  489. package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
  490. package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
  491. package/codeyam-cli/templates/rule-notification-hook.py +83 -0
  492. package/codeyam-cli/templates/rule-reflection-hook.py +574 -87
  493. package/codeyam-cli/templates/rules-instructions.md +45 -60
  494. package/codeyam-cli/templates/{codeyam:debug.md → skills/codeyam-debug/SKILL.md} +1 -1
  495. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +237 -0
  496. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +69 -0
  497. package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +611 -0
  498. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  499. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh +108 -0
  500. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh +69 -0
  501. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  502. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  503. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.sh +12 -0
  504. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter.jq +45 -0
  505. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.sh +139 -0
  506. package/codeyam-cli/templates/skills/codeyam-new-rule/SKILL.md +11 -0
  507. package/codeyam-cli/templates/{codeyam:setup.md → skills/codeyam-setup/SKILL.md} +13 -1
  508. package/codeyam-cli/templates/{codeyam:sim.md → skills/codeyam-sim/SKILL.md} +1 -1
  509. package/codeyam-cli/templates/{codeyam:test.md → skills/codeyam-test/SKILL.md} +1 -1
  510. package/codeyam-cli/templates/{codeyam:verify.md → skills/codeyam-verify/SKILL.md} +1 -1
  511. package/package.json +16 -14
  512. package/packages/ai/index.js +1 -1
  513. package/packages/ai/index.js.map +1 -1
  514. package/packages/ai/src/lib/analyzeScope.js +21 -1
  515. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  516. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
  517. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  518. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  519. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  520. package/packages/ai/src/lib/astScopes/processExpression.js +78 -1
  521. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  522. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  523. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  524. package/packages/ai/src/lib/completionCall.js +10 -7
  525. package/packages/ai/src/lib/completionCall.js.map +1 -1
  526. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +495 -10
  527. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  528. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  529. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  530. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +11 -2
  531. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  532. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +2 -2
  533. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  534. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  535. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  536. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  537. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  538. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +122 -12
  539. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  540. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +15 -1
  541. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -1
  542. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +78 -17
  543. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  544. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  545. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  546. package/packages/ai/src/lib/dataStructureChunking.js +30 -11
  547. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  548. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  549. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  550. package/packages/ai/src/lib/generateEntityScenarioData.js +269 -5
  551. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  552. package/packages/ai/src/lib/generateExecutionFlows.js +97 -2
  553. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  554. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +242 -81
  555. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  556. package/packages/ai/src/lib/isolateScopes.js +39 -3
  557. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  558. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  559. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  560. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  561. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  562. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  563. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  564. package/packages/analyze/index.js +1 -0
  565. package/packages/analyze/index.js.map +1 -1
  566. package/packages/analyze/src/lib/ProjectAnalyzer.js +3 -0
  567. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  568. package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
  569. package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
  570. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +52 -2
  571. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  572. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +10 -0
  573. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  574. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
  575. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  576. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
  577. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  578. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +907 -0
  579. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  580. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +5 -1
  581. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  582. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +51 -14
  583. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  584. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +181 -13
  585. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  586. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +328 -49
  587. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  588. package/packages/analyze/src/lib/index.js +1 -0
  589. package/packages/analyze/src/lib/index.js.map +1 -1
  590. package/packages/database/index.js +1 -0
  591. package/packages/database/index.js.map +1 -1
  592. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  593. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  594. package/packages/database/src/lib/analysisToDb.js +1 -1
  595. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  596. package/packages/database/src/lib/branchToDb.js +1 -1
  597. package/packages/database/src/lib/branchToDb.js.map +1 -1
  598. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  599. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  600. package/packages/database/src/lib/commitToDb.js +1 -1
  601. package/packages/database/src/lib/commitToDb.js.map +1 -1
  602. package/packages/database/src/lib/fileToDb.js +1 -1
  603. package/packages/database/src/lib/fileToDb.js.map +1 -1
  604. package/packages/database/src/lib/kysely/db.js +8 -0
  605. package/packages/database/src/lib/kysely/db.js.map +1 -1
  606. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  607. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  608. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  609. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  610. package/packages/database/src/lib/loadCommits.js +23 -13
  611. package/packages/database/src/lib/loadCommits.js.map +1 -1
  612. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  613. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  614. package/packages/database/src/lib/projectToDb.js +1 -1
  615. package/packages/database/src/lib/projectToDb.js.map +1 -1
  616. package/packages/database/src/lib/saveFiles.js +1 -1
  617. package/packages/database/src/lib/saveFiles.js.map +1 -1
  618. package/packages/database/src/lib/scenarioToDb.js +1 -1
  619. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  620. package/packages/database/src/lib/updateCommitMetadata.js +100 -89
  621. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  622. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  623. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  624. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  625. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  626. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  627. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  628. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  629. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  630. package/packages/utils/src/lib/fs/rsyncCopy.js +98 -3
  631. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  632. package/scripts/npm-post-install.cjs +34 -0
  633. package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -118
  634. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
  635. package/codeyam-cli/src/commands/list.js +0 -31
  636. package/codeyam-cli/src/commands/list.js.map +0 -1
  637. package/codeyam-cli/src/commands/webapp-info.js +0 -146
  638. package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
  639. package/codeyam-cli/src/utils/universal-mocks.js +0 -152
  640. package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
  641. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-C8lyxW9k.js +0 -34
  642. package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +0 -6
  643. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +0 -1
  644. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js +0 -6
  645. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-D1T4TGjf.js +0 -6
  646. package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +0 -6
  647. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  648. package/codeyam-cli/src/webserver/build/client/assets/manifest-a78b90a2.js +0 -1
  649. package/codeyam-cli/src/webserver/build/client/assets/memory--GCbFsBE.js +0 -92
  650. package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +0 -62
  651. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  652. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-aSv48UbS.js +0 -2
  653. package/codeyam-cli/src/webserver/build/server/assets/index-BM6TDT1Y.js +0 -1
  654. package/codeyam-cli/src/webserver/build/server/assets/server-build-dYC34MHw.js +0 -257
  655. package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
  656. package/codeyam-cli/templates/codeyam:diagnose.md +0 -803
  657. package/codeyam-cli/templates/codeyam:memory.md +0 -341
  658. package/codeyam-cli/templates/codeyam:new-rule.md +0 -13
  659. package/scripts/finalize-analyzer.cjs +0 -81
@@ -3,9 +3,11 @@ import type { ExecutionFlow, ScenariosDataStructure } from '~codeyam/types';
3
3
  // Type for a single required value from ExecutionFlow
4
4
  type RequiredValue = NonNullable<ExecutionFlow['requiredValues']>[number];
5
5
 
6
- const DEFAULT_MAX_KEYS_PER_CHUNK = 8;
6
+ const DEFAULT_MAX_CHUNK_SIZE = 10_000; // ~10K chars per chunk
7
+ const DEFAULT_MAX_KEYS_PER_CHUNK = 20;
7
8
 
8
9
  export interface ChunkOptions {
10
+ maxChunkSize?: number;
9
11
  maxKeysPerChunk?: number;
10
12
  }
11
13
 
@@ -15,8 +17,12 @@ export interface ChunkOptions {
15
17
  * Large schemas overwhelm LLMs, causing them to make mistakes on some keys.
16
18
  * By processing smaller chunks, each key gets more focused attention.
17
19
  *
20
+ * Uses cumulative JSON size to decide chunk boundaries rather than a fixed
21
+ * key count, so a single oversized key gets its own chunk while many small
22
+ * keys are grouped together efficiently.
23
+ *
18
24
  * @param dataForMocks - The full data structure schema
19
- * @param options - Chunking options (maxKeysPerChunk defaults to 8)
25
+ * @param options - Chunking options (maxChunkSize defaults to 10_000)
20
26
  * @returns Array of smaller data structure chunks
21
27
  */
22
28
  export function chunkDataStructure(
@@ -27,27 +33,48 @@ export function chunkDataStructure(
27
33
  return [dataForMocks];
28
34
  }
29
35
 
30
- const { maxKeysPerChunk = DEFAULT_MAX_KEYS_PER_CHUNK } = options;
36
+ const {
37
+ maxChunkSize = DEFAULT_MAX_CHUNK_SIZE,
38
+ maxKeysPerChunk = DEFAULT_MAX_KEYS_PER_CHUNK,
39
+ } = options;
31
40
  const keys = Object.keys(dataForMocks);
32
41
 
33
- // Don't chunk if already small enough
34
- if (keys.length <= maxKeysPerChunk) {
42
+ // Calculate total size to see if chunking is needed
43
+ const totalSize = JSON.stringify(dataForMocks).length;
44
+ if (totalSize <= maxChunkSize && keys.length <= maxKeysPerChunk) {
35
45
  return [dataForMocks];
36
46
  }
37
47
 
48
+ // Greedily pack keys into chunks by cumulative size and key count
38
49
  const chunks: Array<ScenariosDataStructure['dataForMocks']> = [];
50
+ let currentChunk: Record<string, unknown> = {};
51
+ let currentSize = 0;
52
+
53
+ for (const key of keys) {
54
+ const keySize = JSON.stringify(
55
+ (dataForMocks as Record<string, unknown>)[key],
56
+ ).length;
39
57
 
40
- for (let i = 0; i < keys.length; i += maxKeysPerChunk) {
41
- const chunkKeys = keys.slice(i, i + maxKeysPerChunk);
42
- const chunk: ScenariosDataStructure['dataForMocks'] = {};
58
+ const currentKeyCount = Object.keys(currentChunk).length;
43
59
 
44
- for (const key of chunkKeys) {
45
- (chunk as Record<string, unknown>)[key] = (
46
- dataForMocks as Record<string, unknown>
47
- )[key];
60
+ // If adding this key would exceed size or key count limit AND chunk isn't empty, start a new chunk
61
+ if (
62
+ currentSize > 0 &&
63
+ (currentSize + keySize > maxChunkSize ||
64
+ currentKeyCount >= maxKeysPerChunk)
65
+ ) {
66
+ chunks.push(currentChunk as ScenariosDataStructure['dataForMocks']);
67
+ currentChunk = {};
68
+ currentSize = 0;
48
69
  }
49
70
 
50
- chunks.push(chunk);
71
+ currentChunk[key] = (dataForMocks as Record<string, unknown>)[key];
72
+ currentSize += keySize;
73
+ }
74
+
75
+ // Push the last chunk
76
+ if (Object.keys(currentChunk).length > 0) {
77
+ chunks.push(currentChunk as ScenariosDataStructure['dataForMocks']);
51
78
  }
52
79
 
53
80
  return chunks;
@@ -1,9 +1,12 @@
1
1
  import { Entity } from '~codeyam/types';
2
2
  import isolateScopes from './isolateScopes';
3
3
  import analyzeScope from './analyzeScope';
4
- import { FileAnalyzer } from '~codeyam/analyze';
4
+ import { FileAnalyzer, transformationTracer } from '~codeyam/analyze';
5
5
  import { AI, SerializableDataStructure } from '~codeyam/ai';
6
- import { resetScopeDataStructureMetrics } from './dataStructure/ScopeDataStructure';
6
+ import {
7
+ resetScopeDataStructureMetrics,
8
+ ScopeDataStructure,
9
+ } from './dataStructure/ScopeDataStructure';
7
10
 
8
11
  // import { awsLog } from '~codeyam/utils';
9
12
 
@@ -91,8 +94,60 @@ export default async function generateEntityDataStructure({
91
94
  }
92
95
 
93
96
  // Inspect the runtime type of dataStructure to see if it must be serialized
97
+ // Note: When worker threads are used, dataStructure is already serialized (no toSerializable).
98
+ // Workers are disabled when CODEYAM_TRACE_TRANSFORMS=1 to enable full tracing.
94
99
  if ('toSerializable' in entityScope.dataStructure) {
95
- return entityScope.dataStructure.toSerializable();
100
+ const scopeDataStructure =
101
+ entityScope.dataStructure as unknown as ScopeDataStructure;
102
+
103
+ // Trace the internal state BEFORE serialization - captures what methods return
104
+ if (transformationTracer.isEnabled()) {
105
+ transformationTracer.startEntity({
106
+ name: entity.name,
107
+ entityType: entity.entityType ?? 'unknown',
108
+ filePath: entity.filePath,
109
+ });
110
+
111
+ // Capture internal state - this is what getReturnValue/getFunctionSignature return
112
+ transformationTracer.snapshot(entity.name, 'scopeDataStructure', {
113
+ signatureSchema: scopeDataStructure.getFunctionSignature({
114
+ fillInUnknowns: true,
115
+ }),
116
+ returnValueSchema: scopeDataStructure.getReturnValue({
117
+ fillInUnknowns: true,
118
+ }),
119
+ });
120
+ }
121
+
122
+ const serialized = scopeDataStructure.toSerializable();
123
+
124
+ // Trace AFTER serialization - shows what gets output
125
+ if (transformationTracer.isEnabled()) {
126
+ // Build schema from external function calls for comparison
127
+ const externalSchemas: Record<string, string> = {};
128
+ for (const efc of serialized.externalFunctionCalls ?? []) {
129
+ for (const [path, type] of Object.entries(efc.schema ?? {})) {
130
+ externalSchemas[path] = type;
131
+ }
132
+ }
133
+
134
+ transformationTracer.snapshot(entity.name, 'serialized', {
135
+ signatureSchema:
136
+ serialized.functionResults?.[entity.name]?.signatureWithUnknowns,
137
+ returnValueSchema:
138
+ serialized.functionResults?.[entity.name]?.returnValueWithUnknowns,
139
+ // Include external function schemas to detect serialization gaps
140
+ dependencySchemas: {
141
+ externalFunctions: {
142
+ combined: {
143
+ returnValueSchema: externalSchemas,
144
+ },
145
+ },
146
+ },
147
+ });
148
+ }
149
+
150
+ return serialized;
96
151
  }
97
152
  return entityScope.dataStructure;
98
153
  }
@@ -18,6 +18,9 @@ import { AI, parseJsonSafe } from '~codeyam/ai';
18
18
  import convertNullToUndefinedBySchema from './dataStructure/helpers/convertNullToUndefinedBySchema';
19
19
  import convertTypeAnnotationsToValues from './dataStructure/helpers/convertTypeAnnotationsToValues';
20
20
  import fixNullIdsBySchema from './dataStructure/helpers/fixNullIdsBySchema';
21
+ import coerceObjectsToPrimitivesBySchema from './dataStructure/helpers/coerceObjectsToPrimitivesBySchema';
22
+ import coercePrimitivesToArraysBySchema from './dataStructure/helpers/coercePrimitivesToArraysBySchema';
23
+ import stripNullableMarkers from './dataStructure/helpers/stripNullableMarkers';
21
24
  import { JsonTypeDefinition } from '~codeyam/types';
22
25
  import { deepMerge } from '~codeyam/generate';
23
26
  import {
@@ -171,6 +174,46 @@ function findKeyPath(
171
174
  return null;
172
175
  }
173
176
 
177
+ /**
178
+ * Strip primitive values from `source` when the `destination` already has an
179
+ * array or object at the same key. Returns a cleaned copy of source (or null
180
+ * if nothing remains after stripping).
181
+ *
182
+ * This prevents misplaced LLM data (e.g., `{ webapps: true }`) from
183
+ * overwriting correct complex values (e.g., `{ webapps: [...] }`) during
184
+ * deep merge in relocateMisplacedNestedKeys.
185
+ */
186
+ function stripPrimitivesOverwritingComplexValues(
187
+ destination: Record<string, unknown>,
188
+ source: unknown,
189
+ ): Record<string, unknown> | null {
190
+ if (typeof source !== 'object' || source === null || Array.isArray(source)) {
191
+ return null;
192
+ }
193
+
194
+ const result: Record<string, unknown> = {};
195
+ let hasKeys = false;
196
+
197
+ for (const key of Object.keys(source as Record<string, unknown>)) {
198
+ const srcVal = (source as Record<string, unknown>)[key];
199
+ const dstVal = destination[key];
200
+
201
+ // If destination has an array or object but source has a primitive, skip it
202
+ if (
203
+ typeof dstVal === 'object' &&
204
+ dstVal !== null &&
205
+ typeof srcVal !== 'object'
206
+ ) {
207
+ continue;
208
+ }
209
+
210
+ result[key] = srcVal;
211
+ hasKeys = true;
212
+ }
213
+
214
+ return hasKeys ? result : null;
215
+ }
216
+
174
217
  /**
175
218
  * Relocate misplaced nested keys in mockData to their correct position
176
219
  * based on the dataForMocks structure.
@@ -232,12 +275,22 @@ function relocateMisplacedNestedKeys(
232
275
  }
233
276
 
234
277
  // Deep merge the value into the correct location
235
- // Use deep merge to preserve existing data at that location
278
+ // Use deep merge to preserve existing data at that location.
279
+ // Before merging, strip primitives from the misplaced value that would
280
+ // overwrite arrays/objects at the destination. The misplaced data is lower
281
+ // quality — the LLM put it in the wrong place — so primitives like `true`
282
+ // should not overwrite correct complex values like arrays.
236
283
  if (current[key] !== undefined && typeof current[key] === 'object') {
237
- current[key] = deepMerge(
284
+ const safeValue = stripPrimitivesOverwritingComplexValues(
238
285
  current[key] as Record<string, unknown>,
239
286
  value as Record<string, unknown>,
240
287
  );
288
+ if (safeValue !== null) {
289
+ current[key] = deepMerge(
290
+ current[key] as Record<string, unknown>,
291
+ safeValue,
292
+ );
293
+ }
241
294
  } else {
242
295
  current[key] = value;
243
296
  }
@@ -293,11 +346,13 @@ function generateDefaultForSchemaType(schemaType: unknown): unknown {
293
346
  if (schemaType.includes('| null')) return null;
294
347
  return schemaType; // Return the type as a string placeholder
295
348
  }
296
- if (
297
- typeof schemaType === 'object' &&
298
- schemaType !== null &&
299
- !Array.isArray(schemaType)
300
- ) {
349
+ if (Array.isArray(schemaType)) {
350
+ if (schemaType.length === 0) return [];
351
+ // Generate a single default element based on the first element's schema
352
+ const elementDefault = generateDefaultForSchemaType(schemaType[0]);
353
+ return elementDefault !== undefined ? [elementDefault] : [];
354
+ }
355
+ if (typeof schemaType === 'object' && schemaType !== null) {
301
356
  // Recursively generate defaults for nested objects
302
357
  const result: Record<string, unknown> = {};
303
358
  for (const [key, value] of Object.entries(schemaType)) {
@@ -425,6 +480,8 @@ function fillMissingMockDataKeysWithDefaults(
425
480
  const missingKeys: string[] = [];
426
481
 
427
482
  for (const key of Object.keys(dataForMocks)) {
483
+ if (key === '_nullable') continue; // Internal marker, not a data key
484
+
428
485
  const fullPath = pathPrefix ? `${pathPrefix}.${key}` : key;
429
486
 
430
487
  if (mockData[key] === undefined) {
@@ -460,6 +517,193 @@ function fillMissingMockDataKeysWithDefaults(
460
517
  }
461
518
  }
462
519
 
520
+ /**
521
+ * Enforce execution flow requiredValues by setting falsy paths to null.
522
+ *
523
+ * The LLM doesn't reliably generate null for `comparison: 'falsy'` requirements.
524
+ * For example, a flow like "diffView: falsy" should hide a modal, but the LLM
525
+ * might generate a truthy object, causing the modal to show in all screenshots.
526
+ *
527
+ * This function:
528
+ * 1. Gets requiredValues from covered flows
529
+ * 2. For 'falsy' comparisons: sets the value to null
530
+ * 3. For 'truthy' comparisons with falsy values: generates a default truthy value
531
+ */
532
+ function enforceRequiredValues(
533
+ mockData: Record<string, unknown>,
534
+ coveredFlowIds: string[],
535
+ executionFlows: ExecutionFlow[],
536
+ ): void {
537
+ if (!coveredFlowIds.length || !executionFlows.length) {
538
+ return;
539
+ }
540
+
541
+ // Get all requiredValues from covered flows
542
+ const coveredFlows = executionFlows.filter((flow) =>
543
+ coveredFlowIds.includes(flow.id),
544
+ );
545
+
546
+ for (const flow of coveredFlows) {
547
+ if (!flow.requiredValues) continue;
548
+
549
+ for (const rv of flow.requiredValues) {
550
+ if (!rv.attributePath) continue;
551
+
552
+ // Find the value in mockData - the path could be nested
553
+ // e.g., attributePath: "diffView" could be at mockData['useDiffModal()'].diffView
554
+ const result = findAndSetValueInMockData(
555
+ mockData,
556
+ rv.attributePath,
557
+ rv.comparison,
558
+ rv.valueType,
559
+ );
560
+
561
+ if (result.found) {
562
+ awsLog(
563
+ `CodeYam: Enforced ${rv.comparison} for ${rv.attributePath} (set to ${result.newValue === null ? 'null' : typeof result.newValue})`,
564
+ );
565
+ }
566
+ }
567
+ }
568
+ }
569
+
570
+ /**
571
+ * Find a value in mockData by attributePath and enforce the comparison.
572
+ * The attributePath could be a simple key or a nested path.
573
+ *
574
+ * Returns { found: boolean, newValue: unknown }
575
+ */
576
+ function findAndSetValueInMockData(
577
+ mockData: Record<string, unknown>,
578
+ attributePath: string,
579
+ comparison: string,
580
+ valueType?: string,
581
+ ): { found: boolean; newValue?: unknown } {
582
+ // Try to find the path at various nesting levels
583
+ // The attributePath might be "diffView" but the actual location is
584
+ // mockData['useDiffModal()'].diffView
585
+
586
+ // Strategy 1: Direct path (e.g., mockData[attributePath])
587
+ if (attributePath in mockData) {
588
+ const currentValue = mockData[attributePath];
589
+ const { shouldChange, newValue } = getEnforcedValue(
590
+ currentValue,
591
+ comparison,
592
+ valueType,
593
+ );
594
+ if (shouldChange) {
595
+ mockData[attributePath] = newValue;
596
+ return { found: true, newValue };
597
+ }
598
+ return { found: true, newValue: currentValue };
599
+ }
600
+
601
+ // Strategy 2: Search in nested objects
602
+ for (const [key, value] of Object.entries(mockData)) {
603
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
604
+ const nestedObj = value as Record<string, unknown>;
605
+
606
+ // Check if attributePath exists in this nested object
607
+ if (attributePath in nestedObj) {
608
+ const currentValue = nestedObj[attributePath];
609
+ const { shouldChange, newValue } = getEnforcedValue(
610
+ currentValue,
611
+ comparison,
612
+ valueType,
613
+ );
614
+ if (shouldChange) {
615
+ nestedObj[attributePath] = newValue;
616
+ return { found: true, newValue };
617
+ }
618
+ return { found: true, newValue: currentValue };
619
+ }
620
+
621
+ // Also check dot-notation paths (e.g., "diffView.type")
622
+ if (attributePath.includes('.')) {
623
+ const parts = attributePath.split('.');
624
+ const firstPart = parts[0];
625
+ if (firstPart in nestedObj) {
626
+ // Recurse with the rest of the path
627
+ const result = findAndSetValueInMockData(
628
+ nestedObj,
629
+ attributePath,
630
+ comparison,
631
+ valueType,
632
+ );
633
+ if (result.found) return result;
634
+ }
635
+ }
636
+
637
+ // Recursively search deeper
638
+ const result = findAndSetValueInMockData(
639
+ nestedObj,
640
+ attributePath,
641
+ comparison,
642
+ valueType,
643
+ );
644
+ if (result.found) return result;
645
+ }
646
+ }
647
+
648
+ return { found: false };
649
+ }
650
+
651
+ /**
652
+ * Determine if a value should be changed to match a comparison requirement.
653
+ *
654
+ * For 'falsy' comparison: truthy values should become null
655
+ * For 'truthy' comparison: falsy values should become a default truthy value
656
+ */
657
+ function getEnforcedValue(
658
+ currentValue: unknown,
659
+ comparison: string,
660
+ valueType?: string,
661
+ ): { shouldChange: boolean; newValue: unknown } {
662
+ const isTruthy = Boolean(currentValue);
663
+
664
+ if (comparison === 'falsy') {
665
+ // Value should be falsy
666
+ if (isTruthy) {
667
+ return { shouldChange: true, newValue: null };
668
+ }
669
+ return { shouldChange: false, newValue: currentValue };
670
+ }
671
+
672
+ if (comparison === 'truthy') {
673
+ // Value should be truthy
674
+ if (!isTruthy) {
675
+ // Generate a default truthy value based on valueType
676
+ const defaultValue = generateDefaultTruthyValue(valueType);
677
+ return { shouldChange: true, newValue: defaultValue };
678
+ }
679
+ return { shouldChange: false, newValue: currentValue };
680
+ }
681
+
682
+ // For other comparisons (equals, exists, etc.), don't auto-enforce
683
+ return { shouldChange: false, newValue: currentValue };
684
+ }
685
+
686
+ /**
687
+ * Generate a default truthy value for a given type.
688
+ */
689
+ function generateDefaultTruthyValue(valueType?: string): unknown {
690
+ if (!valueType) return { _placeholder: true };
691
+
692
+ switch (valueType.toLowerCase()) {
693
+ case 'string':
694
+ return 'default-value';
695
+ case 'number':
696
+ return 1;
697
+ case 'boolean':
698
+ return true;
699
+ case 'array':
700
+ return [{ _placeholder: true }];
701
+ case 'object':
702
+ default:
703
+ return { _placeholder: true };
704
+ }
705
+ }
706
+
463
707
  type ScenarioDataWithoutDescription = Omit<ScenarioData, 'scenarioDescription'>;
464
708
 
465
709
  interface GenerateEntityScenarioDataArgs {
@@ -653,6 +897,29 @@ export async function generateDataForScenario({
653
897
  }
654
898
  }
655
899
 
900
+ // Detect keys that were lost from failed or partial chunk responses
901
+ // and fill them with schema-based defaults so they aren't permanently lost.
902
+ const allChunkedKeys = chunks.flatMap((c) => Object.keys(c || {}));
903
+ const returnedKeys = new Set(Object.keys(chunkedMockData));
904
+ const missingChunkKeys = allChunkedKeys.filter(
905
+ (k) => !returnedKeys.has(k),
906
+ );
907
+
908
+ if (missingChunkKeys.length > 0) {
909
+ awsLog(
910
+ `Chunked processing: ${missingChunkKeys.length} key(s) missing from chunk results, filling with defaults: ${missingChunkKeys.join(', ')}`,
911
+ );
912
+ const dataForMocksRecord = structure.dataForMocks as Record<
913
+ string,
914
+ unknown
915
+ >;
916
+ for (const key of missingChunkKeys) {
917
+ chunkedMockData[key] = generateDefaultForSchemaType(
918
+ dataForMocksRecord[key],
919
+ );
920
+ }
921
+ }
922
+
656
923
  awsLog(
657
924
  `Chunked processing complete. Generated ${Object.keys(chunkedMockData).length} keys total`,
658
925
  );
@@ -848,6 +1115,18 @@ export async function generateDataForScenario({
848
1115
  );
849
1116
  }
850
1117
 
1118
+ // Strip _nullable markers from LLM-generated mock data.
1119
+ // The _nullable marker is an internal CodeYam concept used in type definitions
1120
+ // to indicate that a field can be null/undefined. The LLM sometimes includes
1121
+ // these markers in its generated data, which causes runtime errors when code
1122
+ // iterates over object keys (e.g., Object.keys(importedBy) picks up "_nullable",
1123
+ // then Object.keys(importedBy["_nullable"]) calls Object.keys(null) and throws).
1124
+ if (fullScenarioData.data.mockData) {
1125
+ stripNullableMarkers(
1126
+ fullScenarioData.data.mockData as Record<string, unknown>,
1127
+ );
1128
+ }
1129
+
851
1130
  // Relocate misplaced nested keys to their correct position.
852
1131
  // The LLM sometimes places nested keys at root level instead of inside their
853
1132
  // parent object (e.g., 'fastener' at root instead of inside 'trpc').
@@ -870,6 +1149,31 @@ export async function generateDataForScenario({
870
1149
  );
871
1150
  }
872
1151
 
1152
+ // Coerce objects/arrays to primitives when the schema expects a primitive type.
1153
+ // The LLM sometimes generates an object where the schema expects "string",
1154
+ // e.g., { body: { "env": "production" } } instead of { body: "some string" }.
1155
+ // This causes runtime errors like "TypeError: body.match is not a function".
1156
+ // Must run BEFORE convertCommaSeparatedStringsToArrays, which intentionally
1157
+ // overrides schema types for array-like field names.
1158
+ if (structure.dataForMocks && fullScenarioData.data.mockData) {
1159
+ coerceObjectsToPrimitivesBySchema(
1160
+ fullScenarioData.data.mockData,
1161
+ structure.dataForMocks,
1162
+ );
1163
+ }
1164
+
1165
+ // Coerce primitives to empty arrays when the schema expects an array.
1166
+ // The LLM sometimes generates a primitive (e.g., `webapps: true`) where the
1167
+ // schema expects an array (e.g., `webapps: [{ name: "string" }]`).
1168
+ // This causes runtime errors like "TypeError: config.webapps?.forEach is not a function".
1169
+ // Must run AFTER coerceObjectsToPrimitivesBySchema and BEFORE convertCommaSeparatedStringsToArrays.
1170
+ if (structure.dataForMocks && fullScenarioData.data.mockData) {
1171
+ coercePrimitivesToArraysBySchema(
1172
+ fullScenarioData.data.mockData,
1173
+ structure.dataForMocks,
1174
+ );
1175
+ }
1176
+
873
1177
  // Convert comma-separated strings to arrays when appropriate.
874
1178
  // The LLM sometimes generates strings like "color,size" instead of arrays
875
1179
  // like ["color", "size"] when the schema type is incorrectly inferred as
@@ -897,6 +1201,18 @@ export async function generateDataForScenario({
897
1201
  fixNullIdsBySchema(fullScenarioData.data.mockData, structure.dataForMocks);
898
1202
  }
899
1203
 
1204
+ // Enforce execution flow requiredValues by setting falsy paths to null.
1205
+ // The LLM doesn't reliably generate null for falsy requirements (e.g., diffView: falsy
1206
+ // to hide a modal). This post-processing ensures that scenarios match their
1207
+ // covered flows' requiredValues.
1208
+ if (fullScenarioData.data.mockData && executionFlows) {
1209
+ enforceRequiredValues(
1210
+ fullScenarioData.data.mockData,
1211
+ scenario.metadata?.coveredFlows || [],
1212
+ executionFlows,
1213
+ );
1214
+ }
1215
+
900
1216
  if (structure.arguments && fullScenarioData.data.argumentsData) {
901
1217
  for (let i = 0; i < fullScenarioData.data.argumentsData.length; i++) {
902
1218
  if (structure.arguments[i]) {
@@ -1086,6 +1402,60 @@ export default async function generateEntityScenarioData({
1086
1402
  defaultScenarioData.data.argumentsData.map((arg) => ({ ...arg }));
1087
1403
  }
1088
1404
 
1405
+ // Enforce requiredValues AFTER merge for non-default scenarios
1406
+ // This ensures that if a non-default scenario doesn't cover a certain flow,
1407
+ // it inherits the enforcement from the default scenario
1408
+ if (scenarioData.data?.mockData && executionFlows) {
1409
+ // Get the flows covered by this scenario
1410
+ const scenarioCoveredFlows =
1411
+ nonDefaultScenarios.find(
1412
+ (s) => s.name === result.scenarioData.scenarioDescription,
1413
+ )?.metadata?.coveredFlows || [];
1414
+
1415
+ // Get the paths that the scenario's flows affect
1416
+ const scenarioAffectedPaths = new Set<string>();
1417
+ for (const flowId of scenarioCoveredFlows) {
1418
+ const flow = executionFlows.find((f) => f.id === flowId);
1419
+ if (flow?.requiredValues) {
1420
+ for (const rv of flow.requiredValues) {
1421
+ if (rv.attributePath) {
1422
+ // Extract base path (e.g., "diffView" from "diffView.type")
1423
+ const basePath = rv.attributePath.split('.')[0];
1424
+ scenarioAffectedPaths.add(basePath);
1425
+ }
1426
+ }
1427
+ }
1428
+ }
1429
+
1430
+ // Get the default scenario's flows
1431
+ const defaultCoveredFlows =
1432
+ defaultScenario.metadata?.coveredFlows || [];
1433
+
1434
+ // For paths NOT affected by the scenario, apply default's enforcement
1435
+ const defaultFlowsForUnaffectedPaths = defaultCoveredFlows.filter(
1436
+ (flowId) => {
1437
+ const flow = executionFlows.find((f) => f.id === flowId);
1438
+ if (!flow?.requiredValues) return false;
1439
+
1440
+ // Check if this flow affects a path that the scenario doesn't cover
1441
+ return flow.requiredValues.some((rv) => {
1442
+ if (!rv.attributePath) return false;
1443
+ const basePath = rv.attributePath.split('.')[0];
1444
+ return !scenarioAffectedPaths.has(basePath);
1445
+ });
1446
+ },
1447
+ );
1448
+
1449
+ // Apply enforcement from default scenario for unaffected paths
1450
+ if (defaultFlowsForUnaffectedPaths.length > 0) {
1451
+ enforceRequiredValues(
1452
+ scenarioData.data.mockData,
1453
+ defaultFlowsForUnaffectedPaths,
1454
+ executionFlows,
1455
+ );
1456
+ }
1457
+ }
1458
+
1089
1459
  return scenarioData;
1090
1460
  });
1091
1461