@codeyam/codeyam-cli 0.1.0-staging.036391e → 0.1.0-staging.07d8f7b

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 (532) 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 +14 -14
  4. package/analyzer-template/packages/ai/index.ts +1 -0
  5. package/analyzer-template/packages/ai/package.json +1 -1
  6. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +14 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +34 -3
  8. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +101 -0
  9. package/analyzer-template/packages/ai/src/lib/astScopes/sharedPatterns.ts +28 -0
  10. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +6 -0
  11. package/analyzer-template/packages/ai/src/lib/completionCall.ts +114 -113
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +435 -13
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +70 -19
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.ts +35 -0
  16. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +40 -13
  17. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +110 -7
  18. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +134 -2
  19. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +359 -142
  20. package/analyzer-template/packages/ai/src/lib/mergeJsonTypeDefinitions.ts +5 -0
  21. package/analyzer-template/packages/ai/src/lib/promptGenerators/collapseNullableObjects.ts +118 -0
  22. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +24 -4
  23. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +6 -0
  24. package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -0
  25. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +18 -0
  26. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +9 -1
  27. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
  28. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +12 -0
  29. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +65 -28
  30. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +50 -25
  31. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +83 -0
  32. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +176 -80
  33. package/analyzer-template/packages/aws/package.json +10 -10
  34. package/analyzer-template/packages/database/index.ts +1 -0
  35. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  36. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  37. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  38. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  39. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  40. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  41. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -0
  42. package/analyzer-template/packages/database/src/lib/kysely/tables/debugReportsTable.ts +1 -1
  43. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +62 -0
  44. package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
  45. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
  46. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  47. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  48. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  49. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +151 -135
  50. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
  51. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
  52. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  53. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
  54. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
  55. package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
  56. package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
  57. package/analyzer-template/packages/github/dist/database/index.js +1 -0
  58. package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
  59. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  60. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  61. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  62. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  63. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  64. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  65. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  66. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  67. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  68. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  69. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  70. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  71. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  72. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  73. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +5 -0
  74. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  75. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/debugReportsTable.d.ts +1 -1
  76. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +20 -0
  77. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
  78. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  79. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  80. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
  81. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  82. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  83. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
  84. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  85. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  87. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  89. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  90. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  91. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  92. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  93. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  94. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  95. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +100 -89
  96. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  97. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
  98. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  99. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  100. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  102. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  103. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
  104. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  105. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  106. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  107. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  108. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  109. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  110. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  111. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
  112. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  113. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
  114. package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
  115. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  116. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  117. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
  118. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  119. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  120. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +98 -3
  121. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  122. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +121 -3
  123. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  124. package/analyzer-template/project/constructMockCode.ts +170 -50
  125. package/analyzer-template/project/orchestrateCapture.ts +4 -1
  126. package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
  127. package/analyzer-template/project/start.ts +3 -0
  128. package/analyzer-template/project/startScenarioCapture.ts +9 -0
  129. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  130. package/analyzer-template/project/writeMockDataTsx.ts +17 -0
  131. package/analyzer-template/project/writeScenarioComponents.ts +110 -17
  132. package/analyzer-template/tsconfig.json +13 -1
  133. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  134. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  135. package/background/src/lib/virtualized/project/constructMockCode.js +145 -41
  136. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  137. package/background/src/lib/virtualized/project/orchestrateCapture.js +4 -1
  138. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  139. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
  140. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  141. package/background/src/lib/virtualized/project/start.js +2 -0
  142. package/background/src/lib/virtualized/project/start.js.map +1 -1
  143. package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
  144. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  145. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  146. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  147. package/background/src/lib/virtualized/project/writeMockDataTsx.js +12 -0
  148. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  149. package/background/src/lib/virtualized/project/writeScenarioComponents.js +83 -12
  150. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  151. package/codeyam-cli/scripts/apply-setup.js +209 -12
  152. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  153. package/codeyam-cli/src/cli.js +33 -24
  154. package/codeyam-cli/src/cli.js.map +1 -1
  155. package/codeyam-cli/src/codeyam-cli.js +18 -2
  156. package/codeyam-cli/src/codeyam-cli.js.map +1 -1
  157. package/codeyam-cli/src/commands/analyze.js +21 -9
  158. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  159. package/codeyam-cli/src/commands/baseline.js +2 -0
  160. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  161. package/codeyam-cli/src/commands/debug.js +2 -0
  162. package/codeyam-cli/src/commands/debug.js.map +1 -1
  163. package/codeyam-cli/src/commands/default.js +87 -21
  164. package/codeyam-cli/src/commands/default.js.map +1 -1
  165. package/codeyam-cli/src/commands/editor.js +697 -0
  166. package/codeyam-cli/src/commands/editor.js.map +1 -0
  167. package/codeyam-cli/src/commands/init.js +75 -259
  168. package/codeyam-cli/src/commands/init.js.map +1 -1
  169. package/codeyam-cli/src/commands/memory.js +95 -81
  170. package/codeyam-cli/src/commands/memory.js.map +1 -1
  171. package/codeyam-cli/src/commands/recapture.js +2 -0
  172. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  173. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  174. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  175. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  176. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  177. package/codeyam-cli/src/commands/test-startup.js +2 -0
  178. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  179. package/codeyam-cli/src/commands/verify.js +14 -2
  180. package/codeyam-cli/src/commands/verify.js.map +1 -1
  181. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +185 -0
  182. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -0
  183. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  184. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  185. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +154 -86
  186. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  187. package/codeyam-cli/src/utils/analyzer.js +7 -0
  188. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  189. package/codeyam-cli/src/utils/backgroundServer.js +109 -26
  190. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  191. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  192. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  193. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  194. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  195. package/codeyam-cli/src/utils/fileWatcher.js +25 -9
  196. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  197. package/codeyam-cli/src/utils/generateReport.js +2 -2
  198. package/codeyam-cli/src/utils/git.js +52 -0
  199. package/codeyam-cli/src/utils/git.js.map +1 -1
  200. package/codeyam-cli/src/utils/install-skills.js +74 -63
  201. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  202. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  203. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  204. package/codeyam-cli/src/utils/labsAutoCheck.js +0 -29
  205. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -1
  206. package/codeyam-cli/src/utils/npmVersionCheck.js +76 -0
  207. package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -0
  208. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  209. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  210. package/codeyam-cli/src/utils/progress.js +7 -0
  211. package/codeyam-cli/src/utils/progress.js.map +1 -1
  212. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  213. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  214. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  215. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  216. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  217. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  218. package/codeyam-cli/src/utils/queue/job.js +70 -1
  219. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  220. package/codeyam-cli/src/utils/queue/manager.js +7 -6
  221. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  222. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  223. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  224. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +7 -8
  225. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -1
  226. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +1 -1
  227. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -1
  228. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +0 -1
  229. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -1
  230. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +97 -6
  231. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -1
  232. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +4 -6
  233. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -1
  234. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +3 -3
  235. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -1
  236. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
  237. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
  238. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
  239. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
  240. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
  241. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
  242. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +23 -23
  243. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -1
  244. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
  245. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
  246. package/codeyam-cli/src/utils/rules/index.js +1 -0
  247. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  248. package/codeyam-cli/src/utils/rules/parser.js +19 -4
  249. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  250. package/codeyam-cli/src/utils/rules/pathMatcher.js +34 -3
  251. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -1
  252. package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
  253. package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
  254. package/codeyam-cli/src/utils/rules/ruleState.js +10 -10
  255. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -1
  256. package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
  257. package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
  258. package/codeyam-cli/src/utils/rules/staleness.js +6 -6
  259. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -1
  260. package/codeyam-cli/src/utils/serverState.js +64 -12
  261. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  262. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +61 -43
  263. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  264. package/codeyam-cli/src/utils/simulationGateMiddleware.js +159 -0
  265. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
  266. package/codeyam-cli/src/utils/syncMocksMiddleware.js +5 -24
  267. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  268. package/codeyam-cli/src/utils/testRunner.js +158 -0
  269. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  270. package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
  271. package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
  272. package/codeyam-cli/src/utils/versionInfo.js +46 -0
  273. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  274. package/codeyam-cli/src/utils/webappDetection.js +14 -2
  275. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  276. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js +66 -0
  277. package/codeyam-cli/src/webserver/__tests__/dependency-smoke.test.js.map +1 -0
  278. package/codeyam-cli/src/webserver/app/lib/database.js +55 -30
  279. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  280. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  281. package/codeyam-cli/src/webserver/backgroundServer.js +144 -25
  282. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  283. package/codeyam-cli/src/webserver/bootstrap.js +11 -0
  284. package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
  285. package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CA3JxPb7.js → CopyButton-DmJveP3T.js} +1 -1
  286. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-B86KKU7e.js → EntityItem-C76mRRiF.js} +1 -1
  287. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-B5ctlSYt.js → EntityTypeBadge-g3saevPb.js} +1 -1
  288. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BqY8gDAW.js → EntityTypeIcon-CobE682z.js} +1 -1
  289. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +1 -0
  290. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-BDhPilK7.js → InteractivePreview-DYFW3lDD.js} +3 -3
  291. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-VeqEBv9v.js → LibraryFunctionPreview-DLeucoVX.js} +1 -1
  292. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-Bs7Nn1Jr.js → LoadingDots-BU_OAEMP.js} +1 -1
  293. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-Bm3PmcCz.js → LogViewer-ceAyBX-H.js} +1 -1
  294. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-C6PKeMYR.js → ReportIssueModal-djPLI-WV.js} +2 -2
  295. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-Gq3Ocjo6.js → SafeScreenshot-BED4B6sP.js} +1 -1
  296. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-BNLaXBHR.js → ScenarioViewer-B76aig_2.js} +2 -2
  297. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +34 -0
  298. package/codeyam-cli/src/webserver/build/client/assets/Terminal-BaIiqg_w.js +41 -0
  299. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-CiwXDxLh.js → TruncatedFilePath-C8OKAR5x.js} +1 -1
  300. package/codeyam-cli/src/webserver/build/client/assets/{_index-B3TDXxnk.js → _index-C96V0n15.js} +1 -1
  301. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BtBFH820.js → activity.(_tab)-BpKzcsJz.js} +1 -1
  302. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +1 -0
  303. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-Duc5hnl7.js +1 -0
  304. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-D9hemwl6.js +22 -0
  305. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  306. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  307. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  308. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  309. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  310. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  311. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  312. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  313. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  314. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  315. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  316. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  317. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  318. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  319. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  320. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  321. package/codeyam-cli/src/webserver/build/client/assets/api.rule-path-l0sNRNKZ.js +1 -0
  322. package/codeyam-cli/src/webserver/build/client/assets/{book-open-PttOB2SF.js → book-open-D_nMCFmP.js} +1 -1
  323. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-TJp6ofnp.js → chevron-down-BH2h1Ea2.js} +1 -1
  324. package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-JE9ZIoBl.js → chunk-JZWAC4HX-C4pqxYJB.js} +9 -9
  325. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-CXhHQYrI.js → circle-check-DyIKORY6.js} +1 -1
  326. package/codeyam-cli/src/webserver/build/client/assets/{copy-6y9ALfGT.js → copy-NDbZjXao.js} +1 -1
  327. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Ca9fAY46.js → createLucideIcon-CMT1jU2q.js} +1 -1
  328. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +1 -0
  329. package/codeyam-cli/src/webserver/build/client/assets/editor-Ba0jejiv.js +7 -0
  330. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-n38keI1k.js → entity._sha._-CrjR3zZW.js} +10 -10
  331. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DloHYjtt.js +6 -0
  332. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +6 -0
  333. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +6 -0
  334. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-38yPijoD.js → entity._sha_.edit._scenarioId-BMvVHNXU.js} +2 -2
  335. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-BSHEfydn.js → entry.client-DTvKq3TY.js} +1 -1
  336. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DCPhhSMo.js → fileTableUtils-cPo8LiG3.js} +1 -1
  337. package/codeyam-cli/src/webserver/build/client/assets/{files-0N0YJQv7.js → files-DO4CZ16O.js} +1 -1
  338. package/codeyam-cli/src/webserver/build/client/assets/{git-DXnyr8uP.js → git-CFCTYk9I.js} +1 -1
  339. package/codeyam-cli/src/webserver/build/client/assets/globals-BH6uYxPM.css +1 -0
  340. package/codeyam-cli/src/webserver/build/client/assets/{index-ChN9-fAY.js → index-10oVnAAH.js} +1 -1
  341. package/codeyam-cli/src/webserver/build/client/assets/{index-CcsFv748.js → index-BcvgDzbZ.js} +1 -1
  342. package/codeyam-cli/src/webserver/build/client/assets/labs-Zk7ryIM1.js +1 -0
  343. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-CTqLEAGU.js → loader-circle-BAXYRVEO.js} +1 -1
  344. package/codeyam-cli/src/webserver/build/client/assets/manifest-dcea65f8.js +1 -0
  345. package/codeyam-cli/src/webserver/build/client/assets/memory-FweZHj5U.js +93 -0
  346. package/codeyam-cli/src/webserver/build/client/assets/{pause-D6vreykR.js → pause-DTAcYxBt.js} +1 -1
  347. package/codeyam-cli/src/webserver/build/client/assets/root-Dzn8nIkU.js +67 -0
  348. package/codeyam-cli/src/webserver/build/client/assets/{search-B8VUL8nl.js → search-fKo7v0Zo.js} +1 -1
  349. package/codeyam-cli/src/webserver/build/client/assets/settings-DfuTtcJP.js +1 -0
  350. package/codeyam-cli/src/webserver/build/client/assets/{simulations-CPoAg7Zo.js → simulations-B3aOzpCZ.js} +1 -1
  351. package/codeyam-cli/src/webserver/build/client/assets/{terminal-BrCP7uQo.js → terminal-BG4heKCG.js} +1 -1
  352. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BZz2NjYa.js → triangle-alert-DtSmdtM4.js} +1 -1
  353. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-DNwUduNu.js → useCustomSizes-ByhSyh0W.js} +1 -1
  354. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +2 -0
  355. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CpZgwliL.js → useReportContext-O-jkvSPx.js} +1 -1
  356. package/codeyam-cli/src/webserver/build/client/assets/{useToast-Bv9JFvUO.js → useToast-9FIWuYfK.js} +1 -1
  357. package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +9 -0
  358. package/codeyam-cli/src/webserver/build/server/assets/index-mE6GlU_8.js +1 -0
  359. package/codeyam-cli/src/webserver/build/server/assets/server-build-BApEk7IO.js +362 -0
  360. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  361. package/codeyam-cli/src/webserver/build-info.json +5 -5
  362. package/codeyam-cli/src/webserver/devServer.js +39 -5
  363. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  364. package/codeyam-cli/src/webserver/editorProxy.js +272 -0
  365. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  366. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +121 -0
  367. package/codeyam-cli/src/webserver/server.js +177 -1
  368. package/codeyam-cli/src/webserver/server.js.map +1 -1
  369. package/codeyam-cli/src/webserver/terminalServer.js +606 -0
  370. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  371. package/codeyam-cli/templates/{codeyam:debug.md → codeyam-debug.md} +1 -1
  372. package/codeyam-cli/templates/codeyam-dev-mode.md +237 -0
  373. package/codeyam-cli/templates/codeyam-diagnose.md +481 -0
  374. package/codeyam-cli/templates/codeyam-editor-claude.md +68 -0
  375. package/codeyam-cli/templates/codeyam-editor.md +67 -0
  376. package/codeyam-cli/templates/codeyam-memory-hook.sh +14 -14
  377. package/codeyam-cli/templates/{codeyam:memory.md → codeyam-memory.md} +16 -24
  378. package/codeyam-cli/templates/{codeyam:new-rule.md → codeyam-new-rule.md} +1 -3
  379. package/codeyam-cli/templates/{codeyam:setup.md → codeyam-setup.md} +13 -1
  380. package/codeyam-cli/templates/{codeyam:sim.md → codeyam-sim.md} +1 -1
  381. package/codeyam-cli/templates/{codeyam:test.md → codeyam-test.md} +1 -1
  382. package/codeyam-cli/templates/{codeyam:verify.md → codeyam-verify.md} +1 -1
  383. package/codeyam-cli/templates/editor-step-hook.py +143 -0
  384. package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
  385. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  386. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  387. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  388. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  389. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  390. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  391. package/codeyam-cli/templates/nextjs-prisma-sqlite/PRISMA_SETUP.md +84 -0
  392. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  393. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  394. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  395. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +19 -0
  396. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  397. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  398. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  399. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +35 -0
  400. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  401. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  402. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +37 -0
  403. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  404. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  405. package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
  406. package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
  407. package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
  408. package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
  409. package/codeyam-cli/templates/rule-notification-hook.py +44 -17
  410. package/codeyam-cli/templates/rule-reflection-hook.py +88 -31
  411. package/codeyam-cli/templates/rules-instructions.md +45 -90
  412. package/package.json +15 -13
  413. package/packages/ai/index.js +1 -1
  414. package/packages/ai/index.js.map +1 -1
  415. package/packages/ai/src/lib/analyzeScope.js +14 -0
  416. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  417. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
  418. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  419. package/packages/ai/src/lib/astScopes/processExpression.js +78 -1
  420. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  421. package/packages/ai/src/lib/astScopes/sharedPatterns.js +25 -0
  422. package/packages/ai/src/lib/astScopes/sharedPatterns.js.map +1 -1
  423. package/packages/ai/src/lib/completionCall.js +10 -7
  424. package/packages/ai/src/lib/completionCall.js.map +1 -1
  425. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +362 -10
  426. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  427. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  428. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  429. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +59 -17
  430. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  431. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  432. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  433. package/packages/ai/src/lib/dataStructureChunking.js +30 -11
  434. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  435. package/packages/ai/src/lib/generateEntityScenarioData.js +79 -5
  436. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  437. package/packages/ai/src/lib/generateExecutionFlows.js +97 -2
  438. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  439. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +242 -81
  440. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  441. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js +5 -0
  442. package/packages/ai/src/lib/mergeJsonTypeDefinitions.js.map +1 -1
  443. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js +97 -0
  444. package/packages/ai/src/lib/promptGenerators/collapseNullableObjects.js.map +1 -0
  445. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +17 -2
  446. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  447. package/packages/analyze/src/lib/ProjectAnalyzer.js +3 -0
  448. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  449. package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
  450. package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
  451. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +11 -1
  452. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  453. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +8 -1
  454. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  455. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
  456. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  457. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
  458. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  459. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +54 -27
  460. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -1
  461. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +42 -13
  462. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  463. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +65 -0
  464. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  465. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +141 -71
  466. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  467. package/packages/database/index.js +1 -0
  468. package/packages/database/index.js.map +1 -1
  469. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  470. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  471. package/packages/database/src/lib/analysisToDb.js +1 -1
  472. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  473. package/packages/database/src/lib/branchToDb.js +1 -1
  474. package/packages/database/src/lib/branchToDb.js.map +1 -1
  475. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  476. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  477. package/packages/database/src/lib/commitToDb.js +1 -1
  478. package/packages/database/src/lib/commitToDb.js.map +1 -1
  479. package/packages/database/src/lib/fileToDb.js +1 -1
  480. package/packages/database/src/lib/fileToDb.js.map +1 -1
  481. package/packages/database/src/lib/kysely/db.js +5 -0
  482. package/packages/database/src/lib/kysely/db.js.map +1 -1
  483. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  484. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  485. package/packages/database/src/lib/loadCommits.js +23 -13
  486. package/packages/database/src/lib/loadCommits.js.map +1 -1
  487. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  488. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  489. package/packages/database/src/lib/projectToDb.js +1 -1
  490. package/packages/database/src/lib/projectToDb.js.map +1 -1
  491. package/packages/database/src/lib/saveFiles.js +1 -1
  492. package/packages/database/src/lib/saveFiles.js.map +1 -1
  493. package/packages/database/src/lib/scenarioToDb.js +1 -1
  494. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  495. package/packages/database/src/lib/updateCommitMetadata.js +100 -89
  496. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  497. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  498. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  499. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  500. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  501. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  502. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  503. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  504. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  505. package/packages/utils/src/lib/fs/rsyncCopy.js +98 -3
  506. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  507. package/scripts/finalize-analyzer.cjs +8 -76
  508. package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -118
  509. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
  510. package/codeyam-cli/src/commands/list.js +0 -31
  511. package/codeyam-cli/src/commands/list.js.map +0 -1
  512. package/codeyam-cli/src/commands/webapp-info.js +0 -146
  513. package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
  514. package/codeyam-cli/src/utils/universal-mocks.js +0 -152
  515. package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
  516. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-ClaLpuOo.js +0 -34
  517. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-DfKzxuoe.js +0 -11
  518. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C5lqplTC.js +0 -1
  519. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js +0 -6
  520. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DGgZjdFg.js +0 -6
  521. package/codeyam-cli/src/webserver/build/client/assets/globals-DoeDFXZN.css +0 -1
  522. package/codeyam-cli/src/webserver/build/client/assets/labs-CmBYA0PH.js +0 -1
  523. package/codeyam-cli/src/webserver/build/client/assets/manifest-76786b8e.js +0 -1
  524. package/codeyam-cli/src/webserver/build/client/assets/memory-CrNQfdMO.js +0 -76
  525. package/codeyam-cli/src/webserver/build/client/assets/root-QAY34PIo.js +0 -62
  526. package/codeyam-cli/src/webserver/build/client/assets/settings-eBI36Yv5.js +0 -1
  527. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-COky1GVF.js +0 -2
  528. package/codeyam-cli/src/webserver/build/server/assets/index-DV1ykEI6.js +0 -1
  529. package/codeyam-cli/src/webserver/build/server/assets/server-build-BrcVrUEv.js +0 -260
  530. package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
  531. package/codeyam-cli/templates/codeyam:diagnose.md +0 -805
  532. /package/codeyam-cli/src/webserver/build/client/assets/{api.labs-survey-l0sNRNKZ.js → api.dev-mode-events-l0sNRNKZ.js} +0 -0
@@ -11,6 +11,11 @@ export default function mergeJsonTypeDefinitions(
11
11
  if (!typeDef) continue;
12
12
  if (typeof typeDef === 'string') continue;
13
13
  for (const [key, value] of Object.entries(typeDef)) {
14
+ // Preserve _nullable boolean markers set by convertDotNotation
15
+ if (key === '_nullable' && typeof value === 'boolean') {
16
+ mergedDef[key] = value;
17
+ continue;
18
+ }
14
19
  if (typeof value === 'string') {
15
20
  if (!mergedDef[key]) {
16
21
  mergedDef[key] = value;
@@ -0,0 +1,118 @@
1
+ import { JsonTypeDefinition } from '~codeyam/types';
2
+
3
+ /**
4
+ * Check whether all non-`_nullable` children of an object are simple strings.
5
+ * "Leaf-like" nullable objects (all-string children) get collapsed to
6
+ * `"object | null"` so the LLM knows the field can be null.
7
+ * Objects with nested structure (object/array children) keep their shape
8
+ * so the LLM can still generate proper data when the field is truthy.
9
+ */
10
+ function isLeafLikeObject(obj: Record<string, any>): boolean {
11
+ for (const key of Object.keys(obj)) {
12
+ if (key === '_nullable') continue;
13
+ const value = obj[key];
14
+ if (typeof value !== 'string') return false;
15
+ }
16
+ return true;
17
+ }
18
+
19
+ /**
20
+ * Collapse *leaf-like* nullable objects/arrays in the data structure to type strings.
21
+ *
22
+ * When convertDotNotation marks an object or array as `_nullable: true`
23
+ * (meaning the schema had `object | undefined`, `object | null`, etc.),
24
+ * we decide whether to collapse it:
25
+ *
26
+ * - **Leaf-like** (all children are simple strings): collapse to `"object | null"`.
27
+ * Example: `{ _nullable: true, type: "string", path: "string" }` → `"object | null"`
28
+ *
29
+ * - **Rich** (has object/array children): strip `_nullable` and keep the structure
30
+ * so the LLM can generate proper nested data when the field is truthy.
31
+ * Example: `{ _nullable: true, items: [...], name: "string" }` → `{ items: [...], name: "string" }`
32
+ *
33
+ * Non-nullable objects are recursively processed but left as nested structures.
34
+ */
35
+ export default function collapseNullableObjects(
36
+ data: JsonTypeDefinition,
37
+ ): JsonTypeDefinition {
38
+ if (typeof data !== 'object' || data === null) {
39
+ return data;
40
+ }
41
+
42
+ if (Array.isArray(data)) {
43
+ return data.map((item: any) =>
44
+ typeof item === 'object' && item !== null
45
+ ? collapseNullableObjects(item as JsonTypeDefinition)
46
+ : item,
47
+ ) as any as JsonTypeDefinition;
48
+ }
49
+
50
+ const result: JsonTypeDefinition = {};
51
+
52
+ for (const key of Object.keys(data)) {
53
+ // Skip the _nullable marker itself (shouldn't appear at top level, but be safe)
54
+ if (key === '_nullable') continue;
55
+
56
+ const value = data[key];
57
+
58
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
59
+ const hasNullable = (value as any)._nullable === true;
60
+ if (hasNullable && isLeafLikeObject(value as Record<string, any>)) {
61
+ // Leaf-like nullable object → collapse to type string
62
+ const childKeys = Object.keys(value as any).filter(
63
+ (k) => k !== '_nullable',
64
+ );
65
+ console.log(
66
+ `[collapseNullableObjects] collapsed "${key}" → "object | null" (leaf-like, children: [${childKeys.join(', ')}])`,
67
+ );
68
+ result[key] = 'object | null';
69
+ } else if (hasNullable) {
70
+ // Rich nullable object → strip _nullable, keep structure
71
+ const childKeys = Object.keys(value as any).filter(
72
+ (k) => k !== '_nullable',
73
+ );
74
+ console.log(
75
+ `[collapseNullableObjects] kept structure for nullable "${key}" (rich, children: [${childKeys.join(', ')}])`,
76
+ );
77
+ result[key] = collapseNullableObjects(value as JsonTypeDefinition);
78
+ } else {
79
+ // Non-nullable → recurse
80
+ result[key] = collapseNullableObjects(value as JsonTypeDefinition);
81
+ }
82
+ } else if (Array.isArray(value)) {
83
+ const hasNullable = (value as any)._nullable === true;
84
+ if (
85
+ hasNullable &&
86
+ value.length <= 1 &&
87
+ value.every((v) => typeof v === 'string')
88
+ ) {
89
+ // Leaf-like nullable array → collapse to type string
90
+ console.log(
91
+ `[collapseNullableObjects] collapsed "${key}" → "array | null" (leaf-like)`,
92
+ );
93
+ result[key] = 'array | null';
94
+ } else if (hasNullable) {
95
+ // Rich nullable array → strip _nullable, keep structure
96
+ console.log(
97
+ `[collapseNullableObjects] kept structure for nullable array "${key}" (${value.length} elements)`,
98
+ );
99
+ result[key] = value.map((item) =>
100
+ typeof item === 'object' && item !== null
101
+ ? collapseNullableObjects(item as JsonTypeDefinition)
102
+ : item,
103
+ ) as JsonTypeDefinition[];
104
+ } else {
105
+ // Non-nullable → recurse elements
106
+ result[key] = value.map((item) =>
107
+ typeof item === 'object' && item !== null
108
+ ? collapseNullableObjects(item as JsonTypeDefinition)
109
+ : item,
110
+ ) as JsonTypeDefinition[];
111
+ }
112
+ } else {
113
+ result[key] = value;
114
+ }
115
+ }
116
+
117
+ return result;
118
+ }
@@ -7,6 +7,7 @@ import {
7
7
  } from '~codeyam/types';
8
8
  import noErrorAttributes from './noErrorAttributes';
9
9
  import simplifyKeysForLLM from './simplifyKeysForLLM';
10
+ import collapseNullableObjects from './collapseNullableObjects';
10
11
 
11
12
  /**
12
13
  * Sort object keys by the size of their JSON-stringified values (smallest first).
@@ -99,11 +100,17 @@ ${JSON.stringify(defaultScenarioData.data, null, 2)}
99
100
  // while the reconcileMockDataKeys function will still match the simplified response back to original keys.
100
101
  // Then sort keys by size (smallest first) so small keys appear before large keys,
101
102
  // increasing the chance the LLM generates all keys for large schemas.
102
- const cleanedDataForMocks = structure.dataForMocks
103
- ? simplifyKeysForLLM(
104
- noErrorAttributes(structure.dataForMocks) as JsonTypeDefinition,
105
- )
103
+
104
+ const afterNoError = structure.dataForMocks
105
+ ? (noErrorAttributes(structure.dataForMocks) as JsonTypeDefinition)
106
+ : null;
107
+
108
+ const afterSimplify = afterNoError ? simplifyKeysForLLM(afterNoError) : null;
109
+
110
+ const cleanedDataForMocks = afterSimplify
111
+ ? collapseNullableObjects(afterSimplify)
106
112
  : null;
113
+
107
114
  const sortedDataForMocks =
108
115
  cleanedDataForMocks &&
109
116
  typeof cleanedDataForMocks === 'object' &&
@@ -111,6 +118,19 @@ ${JSON.stringify(defaultScenarioData.data, null, 2)}
111
118
  ? sortKeysBySize(cleanedDataForMocks as Record<string, any>)
112
119
  : cleanedDataForMocks;
113
120
 
121
+ // Log nullable-related content in final prompt JSON
122
+ if (sortedDataForMocks) {
123
+ const finalJson = JSON.stringify(sortedDataForMocks, null, 2);
124
+ const hasNullableMarker = finalJson.includes('_nullable');
125
+ const nullCollapsed = (finalJson.match(/"object \| null"/g) || []).length;
126
+ const arrayCollapsed = (finalJson.match(/"array \| null"/g) || []).length;
127
+ if (hasNullableMarker || nullCollapsed > 0 || arrayCollapsed > 0) {
128
+ console.log(
129
+ `[generateEntityScenarioDataGenerator] final prompt: ${nullCollapsed} "object | null", ${arrayCollapsed} "array | null"${hasNullableMarker ? ', WARNING: _nullable still present!' : ''}`,
130
+ );
131
+ }
132
+ }
133
+
114
134
  // When mockData has already been generated via chunks, skip it in the main call
115
135
  const mockDataSection = options?.mockDataAlreadyGenerated
116
136
  ? '## mockData Structure\nmockData has been pre-generated—return `{}` for mockData.'
@@ -46,6 +46,12 @@ export class ProjectAnalyzer {
46
46
  lib.asts.createProgramFromTsConfigPath(configPath, excludePatterns),
47
47
  );
48
48
 
49
+ if (this.programs.length === 0) {
50
+ throw new Error(
51
+ 'No TypeScript programs could be created — no tsconfig.json found',
52
+ );
53
+ }
54
+
49
55
  // Primary program is the first one (usually root) for backward compatibility
50
56
  this.program = this.programs[0];
51
57
  this.typeChecker = this.program.getTypeChecker();
@@ -39,6 +39,7 @@ export function getNodeType(node: ts.Node, sourceFile: ts.SourceFile) {
39
39
  case 'StringLiteral':
40
40
  case 'NumericLiteral':
41
41
  case 'ObjectLiteralExpression':
42
+ case 'ArrayLiteralExpression':
42
43
  nodeType = 'data';
43
44
  break;
44
45
  case 'TypeAliasDeclaration':
@@ -18,6 +18,7 @@ import {
18
18
  getCompoundConditionals,
19
19
  getChildBoundaryGatingConditions,
20
20
  getJsxRenderingUsages,
21
+ skipWorkerPool,
21
22
  } from '~codeyam/ai';
22
23
  import type { AnalysisOptions } from '../analyzeEntities';
23
24
 
@@ -271,6 +272,23 @@ export default async function prepareEntityDataStructures(
271
272
  };
272
273
 
273
274
  const entities = Array.from(allEntities);
275
+
276
+ // The worker thread creates its own ProjectAnalyzer (ts.Program) on first use,
277
+ // which takes 50-70s. For small entity counts the overhead far exceeds the actual
278
+ // processing time (<2s). Skip the worker and run on the main thread instead,
279
+ // reusing the existing ProjectAnalyzer.
280
+ const entitiesNeedingGeneration = entities.filter(
281
+ (e) =>
282
+ !e.metadata?.isolatedDataStructure || options.force || options.forceAll,
283
+ ).length;
284
+ const WORKER_ENTITY_THRESHOLD = 500;
285
+ if (entitiesNeedingGeneration < WORKER_ENTITY_THRESHOLD) {
286
+ console.log(
287
+ `CodeYam: Skipping worker thread for DS prep (${entitiesNeedingGeneration} entities < ${WORKER_ENTITY_THRESHOLD} threshold)`,
288
+ );
289
+ skipWorkerPool();
290
+ }
291
+
274
292
  const sequential =
275
293
  DEBUG_SEQUENTIAL_EXECUTION || options.sequentialDataStructurePrep;
276
294
 
@@ -310,7 +310,15 @@ export default async function analyzeEntities({
310
310
  );
311
311
 
312
312
  // Flush transformation trace if tracing is enabled
313
- transformationTracer.flush();
313
+ // Wrapped in try/catch because trace data can exceed V8's max string length
314
+ // for large projects, and we must not crash the analysis process over tracing.
315
+ try {
316
+ transformationTracer.flush();
317
+ } catch (e) {
318
+ console.warn(
319
+ `CodeYam Warning: Failed to flush transformation trace: ${e.message}`,
320
+ );
321
+ }
314
322
 
315
323
  return analyses;
316
324
 
@@ -100,12 +100,6 @@ export function getCandidatesReadyForCapture(
100
100
  continue;
101
101
  }
102
102
 
103
- // Skip notExported entities - they can't be imported into the simulation
104
- // environment and will always fail capture. Don't mark them as ready.
105
- if (candidate.entity?.metadata?.notExported) {
106
- continue;
107
- }
108
-
109
103
  // Get all transitive dependencies
110
104
  const candidateKey = `${candidate.filePath}:${candidate.entityName}`;
111
105
  const { missingDependencies } = getTransitiveDependencies(
@@ -138,6 +138,18 @@ export default async function findOrCreateEntity({
138
138
  break;
139
139
  }
140
140
  }
141
+
142
+ // Mark previous versions as superseded
143
+ const entitiesToSupersede = previousEntities.filter(
144
+ (e) => !e.metadata?.isSuperseded,
145
+ );
146
+ if (entitiesToSupersede.length > 0) {
147
+ for (const prev of entitiesToSupersede) {
148
+ prev.metadata = prev.metadata || {};
149
+ prev.metadata.isSuperseded = true;
150
+ }
151
+ await upsertEntities(entitiesToSupersede);
152
+ }
141
153
  }
142
154
 
143
155
  entity = {
@@ -404,22 +404,15 @@ export class TransformationTracer {
404
404
  }
405
405
 
406
406
  /**
407
- * Write the trace to the output file.
407
+ * Compute the summary data for the current traces.
408
408
  */
409
- flush(): void {
410
- if (!this.isEnabled()) return;
411
- if (this.traces.size === 0) {
412
- this.log('flush: no traces to write');
413
- return;
414
- }
415
-
416
- const entities = Array.from(this.traces.keys());
417
- const stageCounts = entities
418
- .map((e) => `${e}(${this.traces.get(e)!.stages.length})`)
419
- .join(', ');
420
- this.log(`flush: writing ${entities.length} entities: ${stageCounts}`);
421
-
422
- // Compute summary
409
+ private computeFlushSummary(): {
410
+ stageChangeCounts: Record<
411
+ string,
412
+ { added: number; removed: number; changed: number }
413
+ >;
414
+ entitiesWithMostChanges: string[];
415
+ } {
423
416
  const stageChangeCounts: Record<
424
417
  string,
425
418
  { added: number; removed: number; changed: number }
@@ -484,17 +477,39 @@ export class TransformationTracer {
484
477
  .slice(0, 10)
485
478
  .map(([name]) => name);
486
479
 
487
- const traceFile: TraceFile = {
488
- meta: {
489
- timestamp: new Date().toISOString(),
490
- projectSlug: this.projectSlug,
491
- entityCount: this.traces.size,
492
- },
493
- summary: {
494
- stageChangeCounts,
495
- entitiesWithMostChanges,
496
- },
497
- entities: Object.fromEntries(this.traces),
480
+ return { stageChangeCounts, entitiesWithMostChanges };
481
+ }
482
+
483
+ /**
484
+ * Write the trace to the output file.
485
+ * Uses streaming per-entity writes to avoid exceeding V8's max string length
486
+ * on large projects.
487
+ */
488
+ flush(): void {
489
+ if (!this.isEnabled()) return;
490
+ if (this.traces.size === 0) {
491
+ this.log('flush: no traces to write');
492
+ return;
493
+ }
494
+
495
+ const entities = Array.from(this.traces.keys());
496
+ const stageCounts = entities
497
+ .map((e) => `${e}(${this.traces.get(e)!.stages.length})`)
498
+ .join(', ');
499
+ this.log(`flush: writing ${entities.length} entities: ${stageCounts}`);
500
+
501
+ const { stageChangeCounts, entitiesWithMostChanges } =
502
+ this.computeFlushSummary();
503
+
504
+ const meta = {
505
+ timestamp: new Date().toISOString(),
506
+ projectSlug: this.projectSlug,
507
+ entityCount: this.traces.size,
508
+ };
509
+
510
+ const summary = {
511
+ stageChangeCounts,
512
+ entitiesWithMostChanges,
498
513
  };
499
514
 
500
515
  // Ensure directory exists
@@ -503,8 +518,30 @@ export class TransformationTracer {
503
518
  fs.mkdirSync(dir, { recursive: true });
504
519
  }
505
520
 
506
- fs.writeFileSync(this.outputPath, JSON.stringify(traceFile, null, 2));
507
- this.log(`flush: wrote trace to ${this.outputPath}`);
521
+ // Stream JSON per-entity to avoid exceeding V8's max string length.
522
+ // Each entity is serialized individually so no single JSON.stringify
523
+ // call needs to produce the entire trace.
524
+ const fd = fs.openSync(this.outputPath, 'w');
525
+ try {
526
+ fs.writeSync(fd, '{\n "meta": ');
527
+ fs.writeSync(fd, JSON.stringify(meta, null, 2));
528
+ fs.writeSync(fd, ',\n "summary": ');
529
+ fs.writeSync(fd, JSON.stringify(summary, null, 2));
530
+ fs.writeSync(fd, ',\n "entities": {');
531
+
532
+ let first = true;
533
+ for (const [entityName, entityTrace] of this.traces) {
534
+ if (!first) fs.writeSync(fd, ',');
535
+ fs.writeSync(fd, `\n ${JSON.stringify(entityName)}: `);
536
+ fs.writeSync(fd, JSON.stringify(entityTrace, null, 2));
537
+ first = false;
538
+ }
539
+
540
+ fs.writeSync(fd, '\n }\n}\n');
541
+ this.log(`flush: wrote trace to ${this.outputPath}`);
542
+ } finally {
543
+ fs.closeSync(fd);
544
+ }
508
545
  }
509
546
 
510
547
  /**
@@ -353,8 +353,6 @@ function processCall(
353
353
  // Preprocess to filter signatures and extract functionCallReturnValue
354
354
  let preprocessedSchema = preprocessSchemaForMocks(mergedSchema);
355
355
 
356
- const functionNames: string[] = [];
357
-
358
356
  const isFunctionNameWithoutFunction = (
359
357
  path: string,
360
358
  functionName: string,
@@ -439,31 +437,58 @@ function processCall(
439
437
  }
440
438
  }
441
439
 
442
- const relevantMergedDependencySchema = Object.keys(preprocessedSchema).reduce(
443
- (acc, path) => {
444
- if (path.endsWith(')')) {
445
- const pathParts = splitOutsideParenthesesAndArrays(path);
446
- const functionName = joinParenthesesAndArrays([
447
- ...pathParts.slice(0, -1),
448
- pathParts[pathParts.length - 1].split('(')[0],
449
- ]);
450
- functionNames.push(functionName);
451
- for (const existingPath in acc) {
452
- if (isFunctionNameWithoutFunction(existingPath, functionName)) {
453
- delete acc[existingPath];
454
- }
455
- }
456
- }
440
+ // Two-pass function name filtering to avoid O() retroactive deletion.
441
+ // Pass 1: Discover all unique function names from paths ending with ')'
442
+ const functionNameSet = new Set<string>();
443
+ const schemaKeys = Object.keys(preprocessedSchema);
444
+ for (const path of schemaKeys) {
445
+ if (path.endsWith(')')) {
446
+ const pathParts = splitOutsideParenthesesAndArrays(path);
447
+ const functionName = joinParenthesesAndArrays([
448
+ ...pathParts.slice(0, -1),
449
+ pathParts[pathParts.length - 1].split('(')[0],
450
+ ]);
451
+ functionNameSet.add(functionName);
452
+ }
453
+ }
457
454
 
458
- if (functionNames.some((fn) => isFunctionNameWithoutFunction(path, fn))) {
459
- return acc;
460
- }
455
+ // Index function names by first segment for O(1) bucket lookup instead of
456
+ // checking all function names for every path. Most paths only need to check
457
+ // 1-2 function names instead of all F.
458
+ const fnByFirstSegment = new Map<string, string[]>();
459
+ for (const fn of functionNameSet) {
460
+ const dotIdx = fn.indexOf('.');
461
+ const firstSeg = dotIdx >= 0 ? fn.slice(0, dotIdx) : fn;
462
+ let bucket = fnByFirstSegment.get(firstSeg);
463
+ if (!bucket) {
464
+ bucket = [];
465
+ fnByFirstSegment.set(firstSeg, bucket);
466
+ }
467
+ bucket.push(fn);
468
+ }
461
469
 
462
- acc[path] = preprocessedSchema[path];
463
- return acc;
464
- },
465
- {} as Record<string, string>,
466
- );
470
+ // Pass 2: Filter paths that match any discovered function name prefix.
471
+ // Use indexed lookup: extract path's first segment, check only matching function names.
472
+ const relevantMergedDependencySchema: Record<string, string> = {};
473
+ for (const path of schemaKeys) {
474
+ // Extract first segment of path (before first '.', '(', or '<')
475
+ const dotIdx = path.indexOf('.');
476
+ const parenIdx = path.indexOf('(');
477
+ const angleIdx = path.indexOf('<');
478
+ let minIdx = path.length;
479
+ if (dotIdx >= 0 && dotIdx < minIdx) minIdx = dotIdx;
480
+ if (parenIdx >= 0 && parenIdx < minIdx) minIdx = parenIdx;
481
+ if (angleIdx >= 0 && angleIdx < minIdx) minIdx = angleIdx;
482
+ const firstSeg = path.slice(0, minIdx);
483
+
484
+ const candidates = fnByFirstSegment.get(firstSeg);
485
+ if (
486
+ !candidates ||
487
+ !candidates.some((fn) => isFunctionNameWithoutFunction(path, fn))
488
+ ) {
489
+ relevantMergedDependencySchema[path] = preprocessedSchema[path];
490
+ }
491
+ }
467
492
 
468
493
  const filledSchema = fillInDirectSchemaGapsAndUnknowns({
469
494
  scopeName: importedExport.name,
@@ -461,6 +461,17 @@ export default function generateDataStructure({
461
461
 
462
462
  const { isolatedDataStructure } = entity.metadata;
463
463
 
464
+ if (!isolatedDataStructure) {
465
+ awsLog(
466
+ 'CodeYam: Skipping data structure generation — isolatedDataStructure is undefined (scope analysis may have failed)',
467
+ {
468
+ entityName: entity.name,
469
+ filePath: entity.filePath,
470
+ },
471
+ );
472
+ return analysis;
473
+ }
474
+
464
475
  // Transformation tracing: start entity and capture isolated data structure
465
476
  transformationTracer.startEntity({
466
477
  name: entity.name,
@@ -643,6 +654,78 @@ export default function generateDataStructure({
643
654
  },
644
655
  );
645
656
 
657
+ // Infer function types from child component usage BEFORE fillInSchemaGapsAndUnknowns.
658
+ // When a hook returns a property with type 'unknown' that is passed to a child
659
+ // component which calls it as a function (e.g., isEntityPending(entity)),
660
+ // promote it to 'function'. Without this, name heuristics like isLikelyBoolean
661
+ // would mistype "isEntityPending" as boolean because of the "is" prefix.
662
+ //
663
+ // sourceEquivalencies are in isolatedDataStructure.dependencySchemas (not in
664
+ // mergedDataStructure.dependencySchemas — they're dropped during the merge).
665
+ // The child's signatureSchema (with function call evidence) IS in the merged schemas.
666
+ {
667
+ const isolatedDepSchemas =
668
+ entity.metadata.isolatedDataStructure?.dependencySchemas;
669
+ if (isolatedDepSchemas) {
670
+ for (const childFilePath in isolatedDepSchemas) {
671
+ const childIsolated = isolatedDepSchemas[childFilePath];
672
+ for (const childName in childIsolated) {
673
+ const sourceEq = childIsolated[childName]?.sourceEquivalencies;
674
+ if (!sourceEq) continue;
675
+
676
+ // Get the child's signatureSchema from the MERGED schemas (richer)
677
+ const mergedChildSchema =
678
+ mergedDataStructure.dependencySchemas[childFilePath]?.[
679
+ childName
680
+ ];
681
+ const sigSchema = mergedChildSchema?.signatureSchema;
682
+ if (!sigSchema) continue;
683
+
684
+ for (const childPath in sourceEq) {
685
+ for (const source of sourceEq[childPath]) {
686
+ const fcrvSuffix = '.functionCallReturnValue.';
687
+ const fcrvIndex = source.schemaPath.indexOf(fcrvSuffix);
688
+ if (fcrvIndex === -1) continue;
689
+
690
+ const propName = source.schemaPath.slice(
691
+ fcrvIndex + fcrvSuffix.length,
692
+ );
693
+
694
+ // Find the corresponding child signature path
695
+ const entityCallPrefix = childName + '().';
696
+ const sigPathBase = childPath.startsWith(entityCallPrefix)
697
+ ? childPath.slice(entityCallPrefix.length)
698
+ : childPath;
699
+
700
+ // Check if the child's signatureSchema has a function call version
701
+ let isFunction = false;
702
+ for (const sigKey in sigSchema) {
703
+ if (
704
+ sigKey.startsWith(sigPathBase + '(') &&
705
+ sigSchema[sigKey] === 'function'
706
+ ) {
707
+ isFunction = true;
708
+ break;
709
+ }
710
+ }
711
+
712
+ if (isFunction) {
713
+ for (const rvKey in depSchema.returnValueSchema) {
714
+ if (
715
+ rvKey.endsWith('.' + propName) &&
716
+ depSchema.returnValueSchema[rvKey] === 'unknown'
717
+ ) {
718
+ depSchema.returnValueSchema[rvKey] = 'function';
719
+ }
720
+ }
721
+ }
722
+ }
723
+ }
724
+ }
725
+ }
726
+ }
727
+ }
728
+
646
729
  // Fill in type gaps BEFORE clearing attributes, so evidence like .includes()
647
730
  // is used for type inference before being deleted
648
731