@codeyam/codeyam-cli 0.1.7 → 0.1.8

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 (382) 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 +6 -6
  4. package/analyzer-template/packages/ai/package.json +1 -1
  5. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +34 -3
  6. package/analyzer-template/packages/ai/src/lib/completionCall.ts +14 -2
  7. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +27 -0
  8. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
  9. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +78 -2
  10. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +6 -0
  11. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +9 -1
  12. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
  13. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +12 -0
  14. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +65 -28
  15. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +83 -0
  16. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +23 -4
  17. package/analyzer-template/packages/aws/package.json +1 -1
  18. package/analyzer-template/packages/database/index.ts +1 -0
  19. package/analyzer-template/packages/database/package.json +3 -3
  20. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -0
  21. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +62 -0
  22. package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
  23. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
  24. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +151 -135
  25. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
  26. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
  27. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
  28. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
  29. package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
  30. package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
  31. package/analyzer-template/packages/github/dist/database/index.js +1 -0
  32. package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
  33. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  34. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  35. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +5 -0
  36. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  37. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +20 -0
  38. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
  39. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  40. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  41. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
  42. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  43. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  44. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
  45. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  46. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  47. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  48. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  49. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  50. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +100 -89
  51. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  52. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
  53. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  54. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  55. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
  56. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  57. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  58. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
  59. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  60. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  61. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  62. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  63. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  64. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  65. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  66. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
  67. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  68. package/analyzer-template/packages/github/package.json +1 -1
  69. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
  70. package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
  71. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  72. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  73. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
  74. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  75. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  76. package/analyzer-template/project/constructMockCode.ts +136 -43
  77. package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
  78. package/analyzer-template/project/start.ts +3 -0
  79. package/analyzer-template/project/startScenarioCapture.ts +9 -0
  80. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  81. package/analyzer-template/project/writeMockDataTsx.ts +17 -0
  82. package/analyzer-template/project/writeScenarioComponents.ts +36 -7
  83. package/analyzer-template/tsconfig.json +13 -1
  84. package/background/src/lib/virtualized/project/constructMockCode.js +115 -34
  85. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  86. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
  87. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  88. package/background/src/lib/virtualized/project/start.js +2 -0
  89. package/background/src/lib/virtualized/project/start.js.map +1 -1
  90. package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
  91. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  92. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  93. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  94. package/background/src/lib/virtualized/project/writeMockDataTsx.js +12 -0
  95. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  96. package/background/src/lib/virtualized/project/writeScenarioComponents.js +29 -7
  97. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  98. package/codeyam-cli/scripts/apply-setup.js +208 -11
  99. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  100. package/codeyam-cli/src/cli.js +2 -0
  101. package/codeyam-cli/src/cli.js.map +1 -1
  102. package/codeyam-cli/src/commands/analyze.js +17 -7
  103. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  104. package/codeyam-cli/src/commands/default.js +58 -3
  105. package/codeyam-cli/src/commands/default.js.map +1 -1
  106. package/codeyam-cli/src/commands/editor.js +1839 -0
  107. package/codeyam-cli/src/commands/editor.js.map +1 -0
  108. package/codeyam-cli/src/commands/init.js +40 -11
  109. package/codeyam-cli/src/commands/init.js.map +1 -1
  110. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +246 -0
  111. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  112. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +126 -0
  113. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  114. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +295 -0
  115. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  116. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  117. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  118. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +100 -0
  119. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  120. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +147 -0
  121. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  122. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +76 -0
  123. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  124. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  125. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  126. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  127. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  128. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  129. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  130. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  131. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  132. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +26 -0
  133. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  134. package/codeyam-cli/src/utils/backgroundServer.js +19 -3
  135. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  136. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  137. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  138. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  139. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  140. package/codeyam-cli/src/utils/editorAudit.js +82 -0
  141. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  142. package/codeyam-cli/src/utils/editorDevServer.js +98 -0
  143. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  144. package/codeyam-cli/src/utils/editorJournal.js +137 -0
  145. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  146. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  147. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  148. package/codeyam-cli/src/utils/editorPreloadHelpers.js +64 -0
  149. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  150. package/codeyam-cli/src/utils/editorPreview.js +66 -0
  151. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  152. package/codeyam-cli/src/utils/editorScenarios.js +56 -0
  153. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  154. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  155. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  156. package/codeyam-cli/src/utils/fileWatcher.js +25 -9
  157. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  158. package/codeyam-cli/src/utils/git.js +103 -0
  159. package/codeyam-cli/src/utils/git.js.map +1 -1
  160. package/codeyam-cli/src/utils/install-skills.js +55 -13
  161. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  162. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  163. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  164. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  165. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  166. package/codeyam-cli/src/utils/project.js +15 -5
  167. package/codeyam-cli/src/utils/project.js.map +1 -1
  168. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  169. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  170. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  171. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  172. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  173. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  174. package/codeyam-cli/src/utils/queue/job.js +70 -1
  175. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  176. package/codeyam-cli/src/utils/queue/manager.js +7 -6
  177. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  178. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  179. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  180. package/codeyam-cli/src/utils/serverState.js +27 -2
  181. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  182. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +45 -4
  183. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  184. package/codeyam-cli/src/utils/testRunner.js +158 -0
  185. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  186. package/codeyam-cli/src/utils/webappDetection.js +14 -2
  187. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  188. package/codeyam-cli/src/webserver/app/lib/database.js +41 -27
  189. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  190. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  191. package/codeyam-cli/src/webserver/backgroundServer.js +108 -18
  192. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  193. package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CtmbP4Gl.js → CopyButton-DmJveP3T.js} +1 -1
  194. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DlMph_Hm.js → EntityItem-C76mRRiF.js} +1 -1
  195. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-B-0PjGOU.js → EntityTypeBadge-g3saevPb.js} +1 -1
  196. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-DN9eiJAO.js → EntityTypeIcon-CobE682z.js} +1 -1
  197. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +1 -0
  198. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-rE_fI2h2.js → InteractivePreview-DYFW3lDD.js} +3 -3
  199. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CnatsCw2.js → LibraryFunctionPreview-DLeucoVX.js} +1 -1
  200. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-CSP6DZrh.js → LoadingDots-BU_OAEMP.js} +1 -1
  201. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CMK8Q7yk.js → LogViewer-ceAyBX-H.js} +1 -1
  202. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-TCV_HBjy.js → ReportIssueModal-djPLI-WV.js} +1 -1
  203. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CG2uh31y.js → SafeScreenshot-BED4B6sP.js} +1 -1
  204. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CU_TDYd8.js → ScenarioViewer-B76aig_2.js} +1 -1
  205. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +34 -0
  206. package/codeyam-cli/src/webserver/build/client/assets/Terminal-Dnj5CY9R.js +41 -0
  207. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D7IoaWUW.js → TruncatedFilePath-C8OKAR5x.js} +1 -1
  208. package/codeyam-cli/src/webserver/build/client/assets/{_index-B8z7mjR-.js → _index-C96V0n15.js} +1 -1
  209. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DZu78RI1.js → activity.(_tab)-BpKzcsJz.js} +1 -1
  210. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +1 -0
  211. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-Duc5hnl7.js +1 -0
  212. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-Dm5RS9il.js → agent-transcripts-D9hemwl6.js} +1 -1
  213. package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
  214. package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
  215. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  216. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  217. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  218. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  219. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  220. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  221. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  222. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  223. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  224. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  225. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  226. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  227. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  228. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  229. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  230. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
  231. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  232. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  233. package/codeyam-cli/src/webserver/build/client/assets/{book-open-Bp5FLkd4.js → book-open-D_nMCFmP.js} +1 -1
  234. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DQJA9f4o.js → chevron-down-BH2h1Ea2.js} +1 -1
  235. package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-7VptmeIr.js → chunk-JZWAC4HX-C4pqxYJB.js} +1 -1
  236. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-B6C4LY9o.js → circle-check-DyIKORY6.js} +1 -1
  237. package/codeyam-cli/src/webserver/build/client/assets/{copy-6nzYCu0G.js → copy-NDbZjXao.js} +1 -1
  238. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-D-QUFOwe.js → createLucideIcon-CMT1jU2q.js} +1 -1
  239. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +1 -0
  240. package/codeyam-cli/src/webserver/build/client/assets/editor-D1DAKXtT.js +8 -0
  241. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-C6PQhwY5.js → entity._sha._-CrjR3zZW.js} +8 -8
  242. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DkzqFzFj.js +6 -0
  243. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +6 -0
  244. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +6 -0
  245. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-C7ysA4Jq.js → entity._sha_.edit._scenarioId-BMvVHNXU.js} +2 -2
  246. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CU6EUArK.js → entry.client-DTvKq3TY.js} +1 -1
  247. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-EWpfFU4X.js → fileTableUtils-cPo8LiG3.js} +1 -1
  248. package/codeyam-cli/src/webserver/build/client/assets/{files-CrxAoWIL.js → files-DO4CZ16O.js} +1 -1
  249. package/codeyam-cli/src/webserver/build/client/assets/{git-BldHtKeW.js → git-CFCTYk9I.js} +1 -1
  250. package/codeyam-cli/src/webserver/build/client/assets/globals-B17TBSS6.css +1 -0
  251. package/codeyam-cli/src/webserver/build/client/assets/{index-7-1FmlHo.js → index-10oVnAAH.js} +1 -1
  252. package/codeyam-cli/src/webserver/build/client/assets/{index-DuYcwYp_.js → index-BcvgDzbZ.js} +1 -1
  253. package/codeyam-cli/src/webserver/build/client/assets/{labs-CPPVOSWB.js → labs-Zk7ryIM1.js} +1 -1
  254. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BnDcD54R.js → loader-circle-BAXYRVEO.js} +1 -1
  255. package/codeyam-cli/src/webserver/build/client/assets/manifest-a632de18.js +1 -0
  256. package/codeyam-cli/src/webserver/build/client/assets/{memory-0wMU4KXe.js → memory-Dg0mvYrI.js} +5 -2
  257. package/codeyam-cli/src/webserver/build/client/assets/{pause-DhQX2g22.js → pause-DTAcYxBt.js} +1 -1
  258. package/codeyam-cli/src/webserver/build/client/assets/root-DUKqhFlb.js +67 -0
  259. package/codeyam-cli/src/webserver/build/client/assets/{search-DborVoKD.js → search-fKo7v0Zo.js} +1 -1
  260. package/codeyam-cli/src/webserver/build/client/assets/{settings-BWunYSXt.js → settings-DfuTtcJP.js} +1 -1
  261. package/codeyam-cli/src/webserver/build/client/assets/{simulations-BtrtCYJg.js → simulations-B3aOzpCZ.js} +1 -1
  262. package/codeyam-cli/src/webserver/build/client/assets/{terminal-Bs4NC-VZ.js → terminal-BG4heKCG.js} +1 -1
  263. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DTf3Jojp.js → triangle-alert-DtSmdtM4.js} +1 -1
  264. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-D_bDZyDU.js → useCustomSizes-ByhSyh0W.js} +1 -1
  265. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +2 -0
  266. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-BsQb6rFd.js → useReportContext-O-jkvSPx.js} +1 -1
  267. package/codeyam-cli/src/webserver/build/client/assets/{useToast-BOur3mUv.js → useToast-9FIWuYfK.js} +1 -1
  268. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  269. package/codeyam-cli/src/webserver/build/server/assets/index-HfLydfDq.js +1 -0
  270. package/codeyam-cli/src/webserver/build/server/assets/server-build-CUu_F-oo.js +366 -0
  271. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  272. package/codeyam-cli/src/webserver/build-info.json +5 -5
  273. package/codeyam-cli/src/webserver/devServer.js +39 -5
  274. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  275. package/codeyam-cli/src/webserver/editorProxy.js +440 -0
  276. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  277. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +175 -0
  278. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +140 -0
  279. package/codeyam-cli/src/webserver/server.js +226 -1
  280. package/codeyam-cli/src/webserver/server.js.map +1 -1
  281. package/codeyam-cli/src/webserver/terminalServer.js +698 -0
  282. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  283. package/codeyam-cli/templates/codeyam-editor-claude.md +68 -0
  284. package/codeyam-cli/templates/editor-step-hook.py +147 -0
  285. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  286. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  287. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  288. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  289. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  290. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  291. package/codeyam-cli/templates/nextjs-prisma-sqlite/PRISMA_SETUP.md +84 -0
  292. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  293. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  294. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  295. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +19 -0
  296. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  297. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  298. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +43 -0
  299. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  300. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +35 -0
  301. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  302. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  303. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +37 -0
  304. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  305. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  306. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +237 -0
  307. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +69 -0
  308. package/codeyam-cli/templates/{codeyam-memory.md → skills/codeyam-memory/SKILL.md} +215 -0
  309. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  310. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh +108 -0
  311. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh +69 -0
  312. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  313. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  314. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.sh +12 -0
  315. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter.jq +45 -0
  316. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.sh +139 -0
  317. package/package.json +4 -2
  318. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
  319. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  320. package/packages/ai/src/lib/completionCall.js +10 -2
  321. package/packages/ai/src/lib/completionCall.js.map +1 -1
  322. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +21 -0
  323. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  324. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  325. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  326. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  327. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  328. package/packages/ai/src/lib/generateEntityScenarioData.js +57 -2
  329. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  330. package/packages/analyze/src/lib/ProjectAnalyzer.js +3 -0
  331. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  332. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +8 -1
  333. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  334. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
  335. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  336. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
  337. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  338. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +54 -27
  339. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -1
  340. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +65 -0
  341. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  342. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +18 -4
  343. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  344. package/packages/database/index.js +1 -0
  345. package/packages/database/index.js.map +1 -1
  346. package/packages/database/src/lib/kysely/db.js +5 -0
  347. package/packages/database/src/lib/kysely/db.js.map +1 -1
  348. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  349. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  350. package/packages/database/src/lib/loadCommits.js +23 -13
  351. package/packages/database/src/lib/loadCommits.js.map +1 -1
  352. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  353. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  354. package/packages/database/src/lib/updateCommitMetadata.js +100 -89
  355. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  356. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  357. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  358. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  359. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  360. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  361. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  362. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  363. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  364. package/scripts/npm-post-install.cjs +34 -0
  365. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-C1rIyZdV.js +0 -34
  366. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DmzSmblj.js +0 -1
  367. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DVTcUnur.js +0 -6
  368. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-BVgNO76F.js +0 -6
  369. package/codeyam-cli/src/webserver/build/client/assets/globals-CLmFdUae.css +0 -1
  370. package/codeyam-cli/src/webserver/build/client/assets/manifest-717e346a.js +0 -1
  371. package/codeyam-cli/src/webserver/build/client/assets/root-DqfSDjyQ.js +0 -62
  372. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-DZp6rrQD.js +0 -2
  373. package/codeyam-cli/src/webserver/build/server/assets/index-B8jmgmn2.js +0 -1
  374. package/codeyam-cli/src/webserver/build/server/assets/server-build-9OU4lmvL.js +0 -285
  375. package/scripts/finalize-analyzer.cjs +0 -13
  376. /package/codeyam-cli/templates/{codeyam-diagnose.md → commands/codeyam-diagnose.md} +0 -0
  377. /package/codeyam-cli/templates/{codeyam-debug.md → skills/codeyam-debug/SKILL.md} +0 -0
  378. /package/codeyam-cli/templates/{codeyam-new-rule.md → skills/codeyam-new-rule/SKILL.md} +0 -0
  379. /package/codeyam-cli/templates/{codeyam-setup.md → skills/codeyam-setup/SKILL.md} +0 -0
  380. /package/codeyam-cli/templates/{codeyam-sim.md → skills/codeyam-sim/SKILL.md} +0 -0
  381. /package/codeyam-cli/templates/{codeyam-test.md → skills/codeyam-test/SKILL.md} +0 -0
  382. /package/codeyam-cli/templates/{codeyam-verify.md → skills/codeyam-verify/SKILL.md} +0 -0
@@ -52,6 +52,7 @@ const PRIMITIVE_TYPES = new Set([
52
52
 
53
53
  // Check if a type string represents a primitive type
54
54
  // Handles union types like "string | undefined" or "number | null"
55
+ // Also handles string literal unions like "'suggestion' | 'warning' | 'tip'"
55
56
  function isPrimitiveType(typeStr: string): boolean {
56
57
  if (PRIMITIVE_TYPES.has(typeStr)) {
57
58
  return true;
@@ -59,9 +60,15 @@ function isPrimitiveType(typeStr: string): boolean {
59
60
  // Check union types - if ALL parts of the union are primitives, it's primitive
60
61
  // e.g., "string | undefined" -> ["string", "undefined"] -> both are primitive -> true
61
62
  // e.g., "object | null" -> ["object", "null"] -> object is not primitive -> false
63
+ // e.g., "'suggestion' | 'warning'" -> string literal union -> true
62
64
  if (typeStr.includes('|')) {
63
65
  const parts = typeStr.split('|').map((p) => p.trim());
64
- return parts.every((part) => PRIMITIVE_TYPES.has(part));
66
+ return parts.every(
67
+ (part) =>
68
+ PRIMITIVE_TYPES.has(part) ||
69
+ // String literal values like 'suggestion', 'warning' are primitives
70
+ (part.startsWith("'") && part.endsWith("'")),
71
+ );
65
72
  }
66
73
  return false;
67
74
  }
@@ -110,9 +117,21 @@ function pathPartMatches(pathPart: string, schemaPathPart: string): boolean {
110
117
  function bestValueFromOptions(options: Array<string | undefined>) {
111
118
  options = options.filter(Boolean) as string[];
112
119
 
113
- const known = options.find((o) => !o.includes('unknown'));
114
- if (known) {
115
- return known;
120
+ const known = options.filter((o) => !o.includes('unknown'));
121
+ if (known.length > 0) {
122
+ // Among known values, prefer string literal unions over bare primitives.
123
+ // e.g., "'draft' | 'inProgress' | 'paused' | 'completed'" is more specific than "string".
124
+ // This handles cases where a dependency schema has a bare type like "string" but the
125
+ // child entity's analysis has the actual literal union from TypeScript type resolution.
126
+ if (known.length > 1 && known.some((o) => PRIMITIVE_TYPES.has(o))) {
127
+ const literalUnion = known.find(
128
+ (o) => !PRIMITIVE_TYPES.has(o) && o.includes("'"),
129
+ );
130
+ if (literalUnion) {
131
+ return literalUnion;
132
+ }
133
+ }
134
+ return known[0];
116
135
  }
117
136
 
118
137
  const notUnknown = options.find((o) => o !== 'unknown');
@@ -11,7 +11,7 @@
11
11
  "author": "",
12
12
  "license": "ISC",
13
13
  "dependencies": {
14
- "@aws-sdk/client-codebuild": "^3.995.0",
14
+ "@aws-sdk/client-codebuild": "^3.1000.0",
15
15
  "@aws-sdk/client-cloudwatch-logs": "^3.990.0",
16
16
  "@aws-sdk/client-dynamodb": "^3.990.0",
17
17
  "@aws-sdk/client-ecr": "^3.990.0",
@@ -75,6 +75,7 @@ export * from './src/lib/kysely/tables/backgroundJobsTable';
75
75
  export * from './src/lib/kysely/tables/branchesTable';
76
76
  export * from './src/lib/kysely/tables/commitBranchesTable';
77
77
  export * from './src/lib/kysely/tables/commitsTable';
78
+ export * from './src/lib/kysely/tables/editorScenariosTable';
78
79
  export * from './src/lib/kysely/tables/entitiesTable';
79
80
  export * from './src/lib/kysely/tables/entityBranchesTable';
80
81
  export * from './src/lib/kysely/tables/entityStatementsTable';
@@ -13,10 +13,10 @@
13
13
  "license": "ISC",
14
14
  "dependencies": {
15
15
  "@supabase/supabase-js": "2.88.0",
16
- "better-sqlite3": "^12.4.1",
16
+ "better-sqlite3": "^12.6.2",
17
17
  "fetch-retry": "^6.0.0",
18
18
  "kysely": "^0.28.11",
19
- "pg": "^8.16.3"
19
+ "pg": "^8.19.0"
20
20
  },
21
21
  "jest": {
22
22
  "preset": "ts-jest",
@@ -25,7 +25,7 @@
25
25
  "devDependencies": {
26
26
  "@types/better-sqlite3": "^7.6.13",
27
27
  "@types/jest": "^30.0.0",
28
- "@types/pg": "^8.15.5",
28
+ "@types/pg": "^8.18.0",
29
29
  "@types/ws": "^8.18.1"
30
30
  }
31
31
  }
@@ -62,6 +62,10 @@ import {
62
62
  createScenarioCommentsTable,
63
63
  ScenarioCommentsTable,
64
64
  } from './tables/scenarioCommentsTable';
65
+ import {
66
+ createEditorScenariosTable,
67
+ EditorScenariosTable,
68
+ } from './tables/editorScenariosTable';
65
69
  import { createScenariosTable, ScenariosTable } from './tables/scenariosTable';
66
70
  import {
67
71
  createStatementsTable,
@@ -106,6 +110,7 @@ const databaseSchema = {
106
110
  commit_branches: schemaField<CommitBranchesTable>(),
107
111
  commits: schemaField<CommitsTable>(),
108
112
  debug_reports: schemaField<DebugBundlesTable>(),
113
+ editor_scenarios: schemaField<EditorScenariosTable>(),
109
114
  entities: schemaField<EntitiesTable>(),
110
115
  entity_branches: schemaField<EntityBranchesTable>(),
111
116
  entity_statements: schemaField<EntityStatementsTable>(),
@@ -210,6 +215,7 @@ export function getSqliteDatabase(sqlitePath?: string) {
210
215
  fileMustExist: false,
211
216
  });
212
217
  sqlite.pragma('journal_mode = WAL');
218
+ sqlite.pragma('busy_timeout = 5000');
213
219
  sqlite.pragma('synchronous = FULL');
214
220
 
215
221
  // Verify the database has the expected schema
@@ -305,6 +311,7 @@ export async function getDatabaseForTesting(
305
311
  // Standard SQLite testing path
306
312
  const sqlite = new SQLiteDatabase(dbPath);
307
313
  sqlite.pragma('journal_mode = WAL');
314
+ sqlite.pragma('busy_timeout = 5000');
308
315
  sqlite.pragma('synchronous = FULL');
309
316
  const kyselyDb = new Kysely<Database>({
310
317
  dialect: new SqliteDialect({ database: sqlite }),
@@ -390,6 +397,7 @@ export async function createSqliteSchema(db: Kysely<Database>): Promise<void> {
390
397
  await createCommitBranchesTable(db);
391
398
  await createCommitsTable(db);
392
399
  await createDebugBundlesTable(db);
400
+ await createEditorScenariosTable(db);
393
401
  await createEntitiesTable(db);
394
402
  await createEntityBranchesTable(db);
395
403
  await createEntityStatementsTable(db);
@@ -0,0 +1,62 @@
1
+ import { Kysely, ColumnDefinitionBuilder } from 'kysely';
2
+ import type { Generated } from 'kysely';
3
+
4
+ import { schemaField, defaultNow } from '../schemaHelpers';
5
+
6
+ const editorScenariosSchema = {
7
+ id: schemaField<Generated<string>>(),
8
+ project_id: schemaField<string>(),
9
+ name: schemaField<string>(),
10
+ description: schemaField<string | null>(),
11
+ component_name: schemaField<string | null>(),
12
+ component_path: schemaField<string | null>(),
13
+ screenshot_path: schemaField<string | null>(),
14
+ created_at: schemaField<Generated<string>>(),
15
+ updated_at: schemaField<Generated<string>>(),
16
+ } as const;
17
+
18
+ export type EditorScenariosTable = {
19
+ [K in keyof typeof editorScenariosSchema]: (typeof editorScenariosSchema)[K];
20
+ };
21
+
22
+ export const EditorScenariosTableColumns = Object.keys(
23
+ editorScenariosSchema,
24
+ ) as (keyof EditorScenariosTable)[];
25
+
26
+ export async function createEditorScenariosTable(
27
+ db: Kysely<any>,
28
+ ): Promise<void> {
29
+ await db.schema
30
+ .createTable('editor_scenarios')
31
+ .addColumn('id', 'uuid', (col: ColumnDefinitionBuilder) => col.primaryKey())
32
+ .addColumn('project_id', 'uuid', (col: ColumnDefinitionBuilder) =>
33
+ col.notNull(),
34
+ )
35
+ .addColumn('name', 'varchar', (col: ColumnDefinitionBuilder) =>
36
+ col.notNull(),
37
+ )
38
+ .addColumn('description', 'text')
39
+ .addColumn('component_name', 'varchar')
40
+ .addColumn('component_path', 'varchar')
41
+ .addColumn('screenshot_path', 'varchar')
42
+ .addColumn('created_at', 'datetime', defaultNow(true))
43
+ .addColumn('updated_at', 'datetime', defaultNow(true))
44
+ .ifNotExists()
45
+ .execute();
46
+
47
+ // Add columns to existing tables (ALTER TABLE has no IF NOT EXISTS in SQLite)
48
+ for (const col of [
49
+ 'component_name',
50
+ 'component_path',
51
+ 'screenshot_path',
52
+ ] as const) {
53
+ try {
54
+ await db.schema
55
+ .alterTable('editor_scenarios')
56
+ .addColumn(col, 'varchar')
57
+ .execute();
58
+ } catch {
59
+ // Column already exists — expected for fresh databases
60
+ }
61
+ }
62
+ }
@@ -9,6 +9,7 @@ import {
9
9
  import { awsLog } from '~codeyam/utils';
10
10
  import { Commit } from '~codeyam/types';
11
11
  import { ScenariosTableColumns } from './kysely/tables/scenariosTable';
12
+ import { CommitsTableColumnsLite } from './kysely/tables/commitsTable';
12
13
  import { sql, ExpressionBuilder } from 'kysely';
13
14
 
14
15
  interface LoadCommitsArgs {
@@ -150,25 +151,35 @@ export default async function loadCommits({
150
151
  const startTime = Date.now();
151
152
 
152
153
  try {
153
- let query = db
154
- .selectFrom('commits')
155
- .selectAll('commits')
156
- .select((eb: ExpressionBuilder<any, any>) => [
157
- jsonObjectFrom(
158
- eb
159
- .selectFrom('github_users')
160
- .select([
161
- 'username',
162
- 'preferred_username as preferredUsername',
163
- 'avatar_url as avatarUrl',
164
- ])
165
- .where(
166
- 'github_users.username',
167
- '=',
168
- eb.ref('commits.author_github_username'),
169
- ),
170
- ).as('author'),
171
- ]);
154
+ // When skipRelations is true, use lite columns (excludes 'files' which can be 1MB+ per commit)
155
+ // and skip the author subquery for maximum efficiency
156
+ let query: any;
157
+ if (skipRelations) {
158
+ const liteColumns = CommitsTableColumnsLite.map(
159
+ (col) => `commits.${col}` as any,
160
+ );
161
+ query = db.selectFrom('commits').select(liteColumns);
162
+ } else {
163
+ query = db
164
+ .selectFrom('commits')
165
+ .selectAll('commits')
166
+ .select((eb: ExpressionBuilder<any, any>) => [
167
+ jsonObjectFrom(
168
+ eb
169
+ .selectFrom('github_users')
170
+ .select([
171
+ 'username',
172
+ 'preferred_username as preferredUsername',
173
+ 'avatar_url as avatarUrl',
174
+ ])
175
+ .where(
176
+ 'github_users.username',
177
+ '=',
178
+ eb.ref('commits.author_github_username'),
179
+ ),
180
+ ).as('author'),
181
+ ]);
182
+ }
172
183
 
173
184
  if (projectId) {
174
185
  query = query.where('project_id', '=', projectId);
@@ -215,7 +226,7 @@ export default async function loadCommits({
215
226
 
216
227
  // DEBUG: Log slow queries (includes files column which can be 1MB+)
217
228
  if (queryTime > 100) {
218
- const totalFilesSize = commits.reduce((sum, c: any) => {
229
+ const totalFilesSize = commits.reduce((sum: number, c: any) => {
219
230
  return sum + (c.files ? JSON.stringify(c.files).length : 0);
220
231
  }, 0);
221
232
  console.log(
@@ -48,11 +48,6 @@ export default async function loadReadyToBeCapturedAnalyses(
48
48
  sql<string>`${sql.ref('analyses.status')} -> 'readyToBeCaptured'`,
49
49
  '=',
50
50
  'true',
51
- )
52
- // Exclude entities that are not exported - they cannot be captured because they can't be imported
53
- // Use -> operator for cross-database boolean comparison
54
- .where(
55
- sql<boolean>`(${sql.ref('entities.metadata')} -> 'notExported') IS NULL OR (${sql.ref('entities.metadata')} -> 'notExported') != 'true'`,
56
51
  );
57
52
 
58
53
  if (projectId) {
@@ -24,157 +24,173 @@ export default async function updateCommitMetadata({
24
24
  archiveCurrentRun,
25
25
  updateCallback,
26
26
  }: UpdateCommitMetadataArgs): Promise<CommitMetadata | null> {
27
- try {
28
- return await getDatabase()
29
- .transaction()
30
- .execute(async (trx) => {
31
- // Only select what we need - the files column can be 1MB+ and kills performance
32
- // If updateCallback is provided, it might need the full commit, so use selectAll
33
- const commit = await trx
34
- .selectFrom('commits')
35
- .select(['id', 'metadata'])
36
- .$if(!!commitId, (qb: any) => qb.where('id', '=', commitId))
37
- .$if(!!commitSha, (qb: any) => qb.where('sha', '=', commitSha))
38
- .executeTakeFirst();
39
-
40
- if (!commit) {
41
- awsLog(
42
- `CodeYam Error: updateCommitMetadata(): Commit ${commitId} not found`,
43
- );
44
- return null;
45
- }
46
-
47
- // Initialize metadata if it doesn't exist (metadata is already parsed from DB)
48
- const currentMetadata: CommitMetadata = commit.metadata || {};
49
-
50
- // if the convenience parameter for latest run was supplied, merge it in
51
- if (runStatusUpdate) {
52
- runStatusUpdate.lastUpdatedAt ??= new Date().toISOString();
53
-
54
- if (runStatusUpdate.currentEntityShas !== undefined) {
27
+ const MAX_RETRIES = 4;
28
+ const BASE_DELAY_MS = 250;
29
+
30
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
31
+ try {
32
+ return await getDatabase()
33
+ .transaction()
34
+ .execute(async (trx) => {
35
+ // Only select what we need - the files column can be 1MB+ and kills performance
36
+ // If updateCallback is provided, it might need the full commit, so use selectAll
37
+ const commit = await trx
38
+ .selectFrom('commits')
39
+ .select(['id', 'metadata'])
40
+ .$if(!!commitId, (qb: any) => qb.where('id', '=', commitId))
41
+ .$if(!!commitSha, (qb: any) => qb.where('sha', '=', commitSha))
42
+ .executeTakeFirst();
43
+
44
+ if (!commit) {
45
+ awsLog(
46
+ `CodeYam Error: updateCommitMetadata(): Commit ${commitId} not found`,
47
+ );
48
+ return null;
49
+ }
50
+
51
+ // Initialize metadata if it doesn't exist (metadata is already parsed from DB)
52
+ const currentMetadata: CommitMetadata = commit.metadata || {};
53
+
54
+ // if the convenience parameter for latest run was supplied, merge it in
55
+ if (runStatusUpdate) {
56
+ runStatusUpdate.lastUpdatedAt ??= new Date().toISOString();
57
+
58
+ if (runStatusUpdate.currentEntityShas !== undefined) {
59
+ console.log(
60
+ `[updateCommitMetadata] Updating currentRun.currentEntityShas`,
61
+ );
62
+ console.log(`[updateCommitMetadata] Commit SHA: ${commitSha}`);
63
+ console.log(
64
+ `[updateCommitMetadata] Previous entity SHAs:`,
65
+ currentMetadata.currentRun?.currentEntityShas,
66
+ );
67
+ console.log(
68
+ `[updateCommitMetadata] New entity SHAs:`,
69
+ runStatusUpdate.currentEntityShas,
70
+ );
71
+ console.log(
72
+ `[updateCommitMetadata] Archive flag:`,
73
+ archiveCurrentRun,
74
+ );
75
+ }
76
+
77
+ metadataUpdate = deepMerge(metadataUpdate ?? {}, {
78
+ currentRun: runStatusUpdate,
79
+ });
80
+ } else if (!metadataUpdate && !updateCallback) {
81
+ return currentMetadata; // nothing to update
82
+ }
83
+
84
+ // Deep merge the baseline status updates
85
+ const updatedMetadata: CommitMetadata = metadataUpdate
86
+ ? deepMerge(currentMetadata, metadataUpdate)
87
+ : currentMetadata;
88
+
89
+ // Archive current run if requested
90
+ if (archiveCurrentRun && updatedMetadata.currentRun) {
55
91
  console.log(
56
- `[updateCommitMetadata] Updating currentRun.currentEntityShas`,
92
+ `[updateCommitMetadata] ========================================`,
57
93
  );
94
+ console.log(`[updateCommitMetadata] ARCHIVING CURRENT RUN`);
58
95
  console.log(`[updateCommitMetadata] Commit SHA: ${commitSha}`);
59
96
  console.log(
60
- `[updateCommitMetadata] Previous entity SHAs:`,
61
- currentMetadata.currentRun?.currentEntityShas,
97
+ `[updateCommitMetadata] Current run entity SHAs:`,
98
+ updatedMetadata.currentRun.currentEntityShas,
99
+ );
100
+ console.log(
101
+ `[updateCommitMetadata] Current run PIDs: analyzer=${updatedMetadata.currentRun.analyzerPid}, capture=${updatedMetadata.currentRun.capturePid}`,
62
102
  );
63
103
  console.log(
64
- `[updateCommitMetadata] New entity SHAs:`,
65
- runStatusUpdate.currentEntityShas,
104
+ `[updateCommitMetadata] Current run completed: analyses=${updatedMetadata.currentRun.analysesCompleted}, captures=${updatedMetadata.currentRun.capturesCompleted}`,
66
105
  );
67
106
  console.log(
68
- `[updateCommitMetadata] Archive flag:`,
69
- archiveCurrentRun,
107
+ `[updateCommitMetadata] Historical runs before archiving: ${updatedMetadata.historicalRuns?.length || 0}`,
108
+ );
109
+
110
+ const runToArchive: CommitRunStatus = {
111
+ ...updatedMetadata.currentRun,
112
+ archivedAt: new Date().toISOString(),
113
+ };
114
+
115
+ console.log(
116
+ `[updateCommitMetadata] Run to archive:`,
117
+ JSON.stringify(runToArchive, null, 2),
118
+ );
119
+
120
+ updatedMetadata.historicalRuns = [
121
+ ...(updatedMetadata.historicalRuns || []),
122
+ runToArchive,
123
+ ];
124
+
125
+ console.log(
126
+ `[updateCommitMetadata] Historical runs after archiving: ${updatedMetadata.historicalRuns.length}`,
127
+ );
128
+ console.log(
129
+ `[updateCommitMetadata] All historical runs:`,
130
+ JSON.stringify(
131
+ updatedMetadata.historicalRuns.map((r) => ({
132
+ entityShas: r.currentEntityShas,
133
+ archivedAt: r.archivedAt,
134
+ completed: {
135
+ analyses: r.analysesCompleted,
136
+ captures: r.capturesCompleted,
137
+ },
138
+ })),
139
+ null,
140
+ 2,
141
+ ),
142
+ );
143
+ console.log(
144
+ `[updateCommitMetadata] ========================================`,
70
145
  );
71
146
  }
72
147
 
73
- metadataUpdate = deepMerge(metadataUpdate ?? {}, {
74
- currentRun: runStatusUpdate,
75
- });
76
- } else if (!metadataUpdate && !updateCallback) {
77
- return currentMetadata; // nothing to update
78
- }
79
-
80
- // Deep merge the baseline status updates
81
- const updatedMetadata: CommitMetadata = metadataUpdate
82
- ? deepMerge(currentMetadata, metadataUpdate)
83
- : currentMetadata;
84
-
85
- // Archive current run if requested
86
- if (archiveCurrentRun && updatedMetadata.currentRun) {
87
- console.log(
88
- `[updateCommitMetadata] ========================================`,
89
- );
90
- console.log(`[updateCommitMetadata] ARCHIVING CURRENT RUN`);
91
- console.log(`[updateCommitMetadata] Commit SHA: ${commitSha}`);
92
- console.log(
93
- `[updateCommitMetadata] Current run entity SHAs:`,
94
- updatedMetadata.currentRun.currentEntityShas,
95
- );
96
- console.log(
97
- `[updateCommitMetadata] Current run PIDs: analyzer=${updatedMetadata.currentRun.analyzerPid}, capture=${updatedMetadata.currentRun.capturePid}`,
98
- );
99
- console.log(
100
- `[updateCommitMetadata] Current run completed: analyses=${updatedMetadata.currentRun.analysesCompleted}, captures=${updatedMetadata.currentRun.capturesCompleted}`,
101
- );
102
- console.log(
103
- `[updateCommitMetadata] Historical runs before archiving: ${updatedMetadata.historicalRuns?.length || 0}`,
104
- );
105
-
106
- const runToArchive: CommitRunStatus = {
107
- ...updatedMetadata.currentRun,
108
- archivedAt: new Date().toISOString(),
109
- };
110
-
111
- console.log(
112
- `[updateCommitMetadata] Run to archive:`,
113
- JSON.stringify(runToArchive, null, 2),
114
- );
115
-
116
- updatedMetadata.historicalRuns = [
117
- ...(updatedMetadata.historicalRuns || []),
118
- runToArchive,
119
- ];
120
-
121
- console.log(
122
- `[updateCommitMetadata] Historical runs after archiving: ${updatedMetadata.historicalRuns.length}`,
123
- );
124
- console.log(
125
- `[updateCommitMetadata] All historical runs:`,
126
- JSON.stringify(
127
- updatedMetadata.historicalRuns.map((r) => ({
128
- entityShas: r.currentEntityShas,
129
- archivedAt: r.archivedAt,
130
- completed: {
131
- analyses: r.analysesCompleted,
132
- captures: r.capturesCompleted,
133
- },
134
- })),
135
- null,
136
- 2,
137
- ),
138
- );
139
- console.log(
140
- `[updateCommitMetadata] ========================================`,
141
- );
142
- }
143
-
144
- // Allow callback to perform complex atomic updates
145
- if (updateCallback) {
146
- await updateCallback(updatedMetadata);
147
- }
148
-
149
- try {
150
- const result = await trx
151
- .updateTable('commits')
152
- .set({ metadata: JSON.stringify(updatedMetadata) })
153
- .where('id', '=', commit.id)
154
- .returning(['id']) // Don't return all columns - files can be 1MB+
155
- .executeTakeFirst();
148
+ // Allow callback to perform complex atomic updates
149
+ if (updateCallback) {
150
+ await updateCallback(updatedMetadata);
151
+ }
156
152
 
157
- if (!result) {
153
+ try {
154
+ const result = await trx
155
+ .updateTable('commits')
156
+ .set({ metadata: JSON.stringify(updatedMetadata) })
157
+ .where('id', '=', commit.id)
158
+ .returning(['id']) // Don't return all columns - files can be 1MB+
159
+ .executeTakeFirst();
160
+
161
+ if (!result) {
162
+ awsLog(
163
+ `CodeYam Error: updateCommitMetadata(): Failed to update commit ${commitId}`,
164
+ );
165
+ return currentMetadata;
166
+ }
167
+
168
+ return updatedMetadata;
169
+ } catch (error) {
158
170
  awsLog(
159
171
  `CodeYam Error: updateCommitMetadata(): Failed to update commit ${commitId}`,
172
+ error,
160
173
  );
161
174
  return currentMetadata;
162
175
  }
163
-
164
- return updatedMetadata;
165
- } catch (error) {
166
- awsLog(
167
- `CodeYam Error: updateCommitMetadata(): Failed to update commit ${commitId}`,
168
- error,
169
- );
170
- return currentMetadata;
171
- }
172
- });
173
- } catch (error) {
174
- awsLog(
175
- `CodeYam Error: updateCommitMetadata(): Transaction failed for commit ${commitId}`,
176
- error,
177
- );
178
- return null;
176
+ });
177
+ } catch (error) {
178
+ const isBusy =
179
+ error instanceof Error && error.message.includes('database is locked');
180
+
181
+ if (isBusy && attempt < MAX_RETRIES) {
182
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt);
183
+ await new Promise((resolve) => setTimeout(resolve, delay));
184
+ continue;
185
+ }
186
+
187
+ awsLog(
188
+ `CodeYam Error: updateCommitMetadata(): Transaction failed for commit ${commitId}${isBusy ? ` after ${attempt + 1} attempts` : ''}`,
189
+ error,
190
+ );
191
+ return null;
192
+ }
179
193
  }
194
+
195
+ return null;
180
196
  }