@codeyam/codeyam-cli 0.1.0-staging.1a2737b → 0.1.0-staging.26dc674

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 (770) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +12 -12
  4. package/analyzer-template/packages/ai/package.json +3 -3
  5. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +34 -3
  6. package/analyzer-template/packages/ai/src/lib/completionCall.ts +114 -113
  7. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +32 -1
  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/ai/src/lib/generateExecutionFlows.ts +0 -33
  11. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +19 -7
  12. package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
  13. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +9 -1
  14. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
  15. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +22 -6
  16. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +9 -12
  17. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
  18. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
  19. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +65 -28
  20. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +83 -0
  21. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
  22. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +23 -4
  23. package/analyzer-template/packages/aws/package.json +2 -2
  24. package/analyzer-template/packages/database/index.ts +1 -0
  25. package/analyzer-template/packages/database/package.json +4 -4
  26. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -0
  27. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +164 -0
  28. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +19 -15
  29. package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
  30. package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
  31. package/analyzer-template/packages/database/src/lib/loadEntity.ts +19 -8
  32. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
  33. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +94 -143
  34. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
  35. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
  36. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
  37. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
  38. package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
  39. package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
  40. package/analyzer-template/packages/github/dist/database/index.js +1 -0
  41. package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
  42. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  43. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  44. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +5 -0
  45. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  46. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +29 -0
  47. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
  48. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
  49. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  50. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
  51. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  52. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  53. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +1 -1
  54. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  55. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  56. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
  57. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  58. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  59. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
  60. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  61. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
  62. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
  63. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +5 -5
  64. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
  65. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  66. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  67. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  68. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  69. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +76 -90
  70. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  71. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
  72. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  73. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  74. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
  75. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  76. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  77. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
  78. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  79. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  80. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  81. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  82. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  83. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  84. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  85. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
  86. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
  87. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  88. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  89. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
  90. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  91. package/analyzer-template/packages/github/package.json +1 -1
  92. package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
  93. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
  94. package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
  95. package/analyzer-template/packages/ui-components/package.json +1 -1
  96. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  97. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  98. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
  99. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
  100. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  101. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  102. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
  103. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  104. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
  105. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  106. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +28 -3
  107. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  108. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +41 -2
  109. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  110. package/analyzer-template/project/analyzeFileEntities.ts +26 -0
  111. package/analyzer-template/project/constructMockCode.ts +136 -43
  112. package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
  113. package/analyzer-template/project/start.ts +3 -0
  114. package/analyzer-template/project/startScenarioCapture.ts +9 -0
  115. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  116. package/analyzer-template/project/writeMockDataTsx.ts +17 -0
  117. package/analyzer-template/project/writeScenarioComponents.ts +36 -7
  118. package/analyzer-template/tsconfig.json +13 -1
  119. package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
  120. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  121. package/background/src/lib/virtualized/project/constructMockCode.js +115 -34
  122. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  123. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
  124. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  125. package/background/src/lib/virtualized/project/start.js +2 -0
  126. package/background/src/lib/virtualized/project/start.js.map +1 -1
  127. package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
  128. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  129. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  130. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  131. package/background/src/lib/virtualized/project/writeMockDataTsx.js +12 -0
  132. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  133. package/background/src/lib/virtualized/project/writeScenarioComponents.js +29 -7
  134. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  135. package/codeyam-cli/scripts/apply-setup.js +208 -11
  136. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  137. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
  138. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
  139. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
  140. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
  141. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
  142. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
  143. package/codeyam-cli/src/cli.js +33 -12
  144. package/codeyam-cli/src/cli.js.map +1 -1
  145. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js +51 -0
  146. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js.map +1 -0
  147. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +56 -0
  148. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
  149. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +101 -47
  150. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
  151. package/codeyam-cli/src/commands/analyze.js +17 -7
  152. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  153. package/codeyam-cli/src/commands/default.js +14 -2
  154. package/codeyam-cli/src/commands/default.js.map +1 -1
  155. package/codeyam-cli/src/commands/editor.js +5206 -0
  156. package/codeyam-cli/src/commands/editor.js.map +1 -0
  157. package/codeyam-cli/src/commands/editorIsolateArgs.js +25 -0
  158. package/codeyam-cli/src/commands/editorIsolateArgs.js.map +1 -0
  159. package/codeyam-cli/src/commands/init.js +109 -45
  160. package/codeyam-cli/src/commands/init.js.map +1 -1
  161. package/codeyam-cli/src/commands/memory.js +29 -58
  162. package/codeyam-cli/src/commands/memory.js.map +1 -1
  163. package/codeyam-cli/src/commands/telemetry.js +37 -0
  164. package/codeyam-cli/src/commands/telemetry.js.map +1 -0
  165. package/codeyam-cli/src/data/techStacks.js +77 -0
  166. package/codeyam-cli/src/data/techStacks.js.map +1 -0
  167. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
  168. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
  169. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
  170. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
  171. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
  172. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
  173. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +137 -0
  174. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  175. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +3559 -0
  176. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  177. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
  178. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
  179. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
  180. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
  181. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
  182. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
  183. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js +100 -0
  184. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js.map +1 -0
  185. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +304 -0
  186. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  187. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +194 -0
  188. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
  189. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +381 -0
  190. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
  191. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
  192. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
  193. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
  194. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
  195. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +542 -0
  196. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  197. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +594 -0
  198. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
  199. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +435 -0
  200. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
  201. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  202. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  203. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +217 -0
  204. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  205. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +353 -0
  206. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  207. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +153 -0
  208. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
  209. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
  210. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
  211. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +291 -0
  212. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
  213. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +1629 -0
  214. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  215. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +280 -0
  216. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
  217. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js +143 -0
  218. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js.map +1 -0
  219. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
  220. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
  221. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
  222. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
  223. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +2089 -0
  224. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
  225. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  226. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  227. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
  228. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
  229. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +122 -0
  230. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
  231. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +6 -0
  232. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -1
  233. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
  234. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
  235. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  236. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  237. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  238. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  239. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
  240. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
  241. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
  242. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
  243. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +284 -0
  244. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
  245. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  246. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  247. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +672 -0
  248. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
  249. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js +84 -0
  250. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js.map +1 -0
  251. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +51 -4
  252. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  253. package/codeyam-cli/src/utils/__tests__/telemetry.test.js +159 -0
  254. package/codeyam-cli/src/utils/__tests__/telemetry.test.js.map +1 -0
  255. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
  256. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
  257. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
  258. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
  259. package/codeyam-cli/src/utils/analysisRunner.js +11 -7
  260. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  261. package/codeyam-cli/src/utils/analyzer.js +17 -0
  262. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  263. package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
  264. package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
  265. package/codeyam-cli/src/utils/backgroundServer.js +105 -13
  266. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  267. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  268. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  269. package/codeyam-cli/src/utils/database.js +37 -2
  270. package/codeyam-cli/src/utils/database.js.map +1 -1
  271. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  272. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  273. package/codeyam-cli/src/utils/devServerState.js +71 -0
  274. package/codeyam-cli/src/utils/devServerState.js.map +1 -0
  275. package/codeyam-cli/src/utils/editorApi.js +79 -0
  276. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  277. package/codeyam-cli/src/utils/editorAudit.js +696 -0
  278. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  279. package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
  280. package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
  281. package/codeyam-cli/src/utils/editorCapture.js +102 -0
  282. package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
  283. package/codeyam-cli/src/utils/editorDeleteScenario.js +67 -0
  284. package/codeyam-cli/src/utils/editorDeleteScenario.js.map +1 -0
  285. package/codeyam-cli/src/utils/editorDevServer.js +197 -0
  286. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  287. package/codeyam-cli/src/utils/editorEntityChangeStatus.js +50 -0
  288. package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
  289. package/codeyam-cli/src/utils/editorEntityHelpers.js +144 -0
  290. package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
  291. package/codeyam-cli/src/utils/editorGuard.js +36 -0
  292. package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
  293. package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
  294. package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
  295. package/codeyam-cli/src/utils/editorJournal.js +225 -0
  296. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  297. package/codeyam-cli/src/utils/editorLoaderHelpers.js +152 -0
  298. package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
  299. package/codeyam-cli/src/utils/editorMigration.js +224 -0
  300. package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
  301. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  302. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  303. package/codeyam-cli/src/utils/editorPreloadHelpers.js +135 -0
  304. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  305. package/codeyam-cli/src/utils/editorPreview.js +137 -0
  306. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  307. package/codeyam-cli/src/utils/editorRecapture.js +109 -0
  308. package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
  309. package/codeyam-cli/src/utils/editorScenarioSwitch.js +134 -0
  310. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
  311. package/codeyam-cli/src/utils/editorScenarios.js +616 -0
  312. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  313. package/codeyam-cli/src/utils/editorSeedAdapter.js +422 -0
  314. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
  315. package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
  316. package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
  317. package/codeyam-cli/src/utils/entityChangeStatus.js +394 -0
  318. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
  319. package/codeyam-cli/src/utils/entityChangeStatus.server.js +196 -0
  320. package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
  321. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  322. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  323. package/codeyam-cli/src/utils/fileWatcher.js +63 -9
  324. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  325. package/codeyam-cli/src/utils/git.js +103 -0
  326. package/codeyam-cli/src/utils/git.js.map +1 -1
  327. package/codeyam-cli/src/utils/glossaryAdd.js +74 -0
  328. package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
  329. package/codeyam-cli/src/utils/install-skills.js +71 -15
  330. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  331. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  332. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  333. package/codeyam-cli/src/utils/npmVersionCheck.js +2 -2
  334. package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -1
  335. package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
  336. package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
  337. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  338. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  339. package/codeyam-cli/src/utils/progress.js +2 -2
  340. package/codeyam-cli/src/utils/progress.js.map +1 -1
  341. package/codeyam-cli/src/utils/project.js +15 -5
  342. package/codeyam-cli/src/utils/project.js.map +1 -1
  343. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  344. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  345. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  346. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  347. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  348. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  349. package/codeyam-cli/src/utils/queue/job.js +76 -4
  350. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  351. package/codeyam-cli/src/utils/queue/manager.js +7 -6
  352. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  353. package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
  354. package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
  355. package/codeyam-cli/src/utils/requireSimulations.js +1 -1
  356. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -1
  357. package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
  358. package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
  359. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +5 -6
  360. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -1
  361. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +2 -5
  362. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -1
  363. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
  364. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
  365. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
  366. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
  367. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
  368. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
  369. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
  370. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
  371. package/codeyam-cli/src/utils/rules/index.js +1 -0
  372. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  373. package/codeyam-cli/src/utils/rules/parser.js +14 -4
  374. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  375. package/codeyam-cli/src/utils/rules/pathMatcher.js +34 -3
  376. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -1
  377. package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
  378. package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
  379. package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
  380. package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
  381. package/codeyam-cli/src/utils/scenarioCoverage.js +77 -0
  382. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
  383. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  384. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  385. package/codeyam-cli/src/utils/scenariosManifest.js +307 -0
  386. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  387. package/codeyam-cli/src/utils/screenshotHash.js +26 -0
  388. package/codeyam-cli/src/utils/screenshotHash.js.map +1 -0
  389. package/codeyam-cli/src/utils/serverState.js +57 -2
  390. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  391. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +83 -11
  392. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  393. package/codeyam-cli/src/utils/simulationGateMiddleware.js +80 -43
  394. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
  395. package/codeyam-cli/src/utils/slugUtils.js +25 -0
  396. package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
  397. package/codeyam-cli/src/utils/syncMocksMiddleware.js +2 -2
  398. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  399. package/codeyam-cli/src/utils/telemetry.js +106 -0
  400. package/codeyam-cli/src/utils/telemetry.js.map +1 -0
  401. package/codeyam-cli/src/utils/telemetryMiddleware.js +22 -0
  402. package/codeyam-cli/src/utils/telemetryMiddleware.js.map +1 -0
  403. package/codeyam-cli/src/utils/testRunner.js +158 -0
  404. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  405. package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
  406. package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
  407. package/codeyam-cli/src/utils/versionInfo.js +21 -0
  408. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  409. package/codeyam-cli/src/utils/webappDetection.js +35 -2
  410. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  411. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +35 -0
  412. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -0
  413. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +107 -0
  414. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
  415. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +628 -0
  416. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  417. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +248 -0
  418. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
  419. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js +135 -0
  420. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js.map +1 -0
  421. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +86 -0
  422. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
  423. package/codeyam-cli/src/webserver/app/lib/database.js +41 -27
  424. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  425. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  426. package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
  427. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  428. package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
  429. package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
  430. package/codeyam-cli/src/webserver/backgroundServer.js +141 -42
  431. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  432. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CLe80MMu.js +1 -0
  433. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-bwuHPyTa.js → EntityItem-Crt_KN_U.js} +5 -5
  434. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
  435. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BH0XDim7.js → EntityTypeIcon-CD7lGABo.js} +9 -9
  436. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-CgTNOhnu.js +1 -0
  437. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-CKeQT5Ty.js +25 -0
  438. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-D3s1MFkb.js +3 -0
  439. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-BvMu2i-g.js → LoadingDots-By5zI316.js} +1 -1
  440. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-kgBTLoJD.js → LogViewer-CM5zg40N.js} +3 -3
  441. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-BzPgx-xO.js → ReportIssueModal-C2PLkej3.js} +4 -4
  442. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DanvyBPb.js +1 -0
  443. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-BX2Ny2Qj.js → ScenarioViewer-DUMfcNVK.js} +3 -3
  444. package/codeyam-cli/src/webserver/build/client/assets/Spinner-D0LgAaSa.js +34 -0
  445. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
  446. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-BA_Ry-rs.js +1 -0
  447. package/codeyam-cli/src/webserver/build/client/assets/{_index-BRx8ZGZo.js → _index-BAWd-Xjf.js} +4 -4
  448. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-4S4yPfFw.js → activity.(_tab)-BOARiB-g.js} +8 -8
  449. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  450. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  451. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-CHx25PAe.js +1 -0
  452. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  453. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-Bg3e7q4S.js +22 -0
  454. package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
  455. package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
  456. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  457. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  458. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  459. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  460. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  461. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  462. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  463. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  464. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  465. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  466. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  467. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  468. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  469. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  470. package/codeyam-cli/src/webserver/build/client/assets/api.editor-recapture-stale-l0sNRNKZ.js +1 -0
  471. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  472. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  473. package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
  474. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
  475. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
  476. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
  477. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  478. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  479. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
  480. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
  481. package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
  482. package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
  483. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  484. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  485. package/codeyam-cli/src/webserver/build/client/assets/api.rule-path-l0sNRNKZ.js +1 -0
  486. package/codeyam-cli/src/webserver/build/client/assets/{book-open-D4IPYH_y.js → book-open-CL-lMgHh.js} +2 -2
  487. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-CG65viiV.js → chevron-down-GmAjGS9-.js} +2 -2
  488. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-BAdwhyCx.js +43 -0
  489. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-igfMr5DY.js → circle-check-DFcQkN5j.js} +2 -2
  490. package/codeyam-cli/src/webserver/build/client/assets/{copy-Coc4o_8c.js → copy-C6iF61Xs.js} +3 -3
  491. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-4ImjHTVC.js +41 -0
  492. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-CJzc4vOH.svg} +2 -2
  493. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DODLxLcw.js +1 -0
  494. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C8y4mmyv.js +1 -0
  495. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-Gbk_i5Js.js +1 -0
  496. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-Dx-h1rJK.js +130 -0
  497. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-NTuLi4Xg.js +41 -0
  498. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-B0h9AqE6.js → entity._sha._-Blfy9UlN.js} +11 -11
  499. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-BA5L8bU-.js +6 -0
  500. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-D4dmRgvO.js +6 -0
  501. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DQM8E7L4.js +6 -0
  502. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-PePWg17F.js → entity._sha_.edit._scenarioId-CAoXLsQr.js} +2 -2
  503. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-I-Wo99C_.js → entry.client-SuW9syRS.js} +6 -6
  504. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
  505. package/codeyam-cli/src/webserver/build/client/assets/files-D-xGrg29.js +1 -0
  506. package/codeyam-cli/src/webserver/build/client/assets/git-Bq_fbXP5.js +1 -0
  507. package/codeyam-cli/src/webserver/build/client/assets/globals-BrPXT1iR.css +1 -0
  508. package/codeyam-cli/src/webserver/build/client/assets/{index-_417gcQW.js → index-Bp1l4hSv.js} +1 -1
  509. package/codeyam-cli/src/webserver/build/client/assets/{index-CUM5iXwc.js → index-CWV9XZiG.js} +1 -1
  510. package/codeyam-cli/src/webserver/build/client/assets/index-DE3jI_dv.js +15 -0
  511. package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
  512. package/codeyam-cli/src/webserver/build/client/assets/labs-B_IX45ih.js +1 -0
  513. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-TzRHMVog.js → loader-circle-De-7qQ2u.js} +2 -2
  514. package/codeyam-cli/src/webserver/build/client/assets/manifest-5025e428.js +1 -0
  515. package/codeyam-cli/src/webserver/build/client/assets/memory-Cx2xEx7s.js +101 -0
  516. package/codeyam-cli/src/webserver/build/client/assets/{pause-hjzB7t2z.js → pause-CFxEKL1u.js} +3 -3
  517. package/codeyam-cli/src/webserver/build/client/assets/root-BCx1S8Z3.js +80 -0
  518. package/codeyam-cli/src/webserver/build/client/assets/{search-DcAwD_Ln.js → search-BdBb5aqc.js} +2 -2
  519. package/codeyam-cli/src/webserver/build/client/assets/settings-DdE-Untf.js +1 -0
  520. package/codeyam-cli/src/webserver/build/client/assets/simulations-DSCdE99u.js +1 -0
  521. package/codeyam-cli/src/webserver/build/client/assets/{terminal-DbEAHMbA.js → terminal-CrplD4b1.js} +3 -3
  522. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-CAD5b1o_.js → triangle-alert-DqJ0j69l.js} +2 -2
  523. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-DhXHbEjP.js +1 -0
  524. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-BNd5hYuW.js +2 -0
  525. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-Cy5Qg_UR.js +1 -0
  526. package/codeyam-cli/src/webserver/build/client/assets/useToast-5HR2j9ZE.js +1 -0
  527. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  528. package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
  529. package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-C1kjC9UJ.js +13 -0
  530. package/codeyam-cli/src/webserver/build/server/assets/index-C91yWWCI.js +1 -0
  531. package/codeyam-cli/src/webserver/build/server/assets/init-Dkas-RUS.js +10 -0
  532. package/codeyam-cli/src/webserver/build/server/assets/progress-CHTtrxFG.js +1 -0
  533. package/codeyam-cli/src/webserver/build/server/assets/server-build-pulXLTrG.js +640 -0
  534. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  535. package/codeyam-cli/src/webserver/build-info.json +5 -5
  536. package/codeyam-cli/src/webserver/devServer.js +39 -5
  537. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  538. package/codeyam-cli/src/webserver/editorProxy.js +976 -0
  539. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  540. package/codeyam-cli/src/webserver/idleDetector.js +106 -0
  541. package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
  542. package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
  543. package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
  544. package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
  545. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
  546. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +283 -0
  547. package/codeyam-cli/src/webserver/server.js +379 -1
  548. package/codeyam-cli/src/webserver/server.js.map +1 -1
  549. package/codeyam-cli/src/webserver/terminalServer.js +945 -0
  550. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  551. package/codeyam-cli/templates/__tests__/editor-step-hook.prompt-capture.test.ts +118 -0
  552. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  553. package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
  554. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  555. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  556. package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
  557. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  558. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  559. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  560. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  561. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  562. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  563. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  564. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  565. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
  566. package/codeyam-cli/templates/codeyam-editor-claude.md +149 -0
  567. package/codeyam-cli/templates/codeyam-editor-reference.md +214 -0
  568. package/codeyam-cli/templates/editor-step-hook.py +368 -0
  569. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
  570. package/codeyam-cli/templates/expo-react-native/README.md +41 -0
  571. package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
  572. package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
  573. package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
  574. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
  575. package/codeyam-cli/templates/expo-react-native/app.json +18 -0
  576. package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
  577. package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
  578. package/codeyam-cli/templates/expo-react-native/global.css +3 -0
  579. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  580. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  581. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  582. package/codeyam-cli/templates/expo-react-native/package.json +38 -0
  583. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  584. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  585. package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
  586. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  587. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  588. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  589. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  590. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  591. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  592. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  593. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  594. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
  595. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  596. package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
  597. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  598. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  599. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  600. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  601. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +24 -0
  602. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  603. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  604. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  605. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +64 -0
  606. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  607. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +39 -0
  608. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  609. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  610. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +40 -0
  611. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  612. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +127 -0
  613. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  614. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  615. package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
  616. package/codeyam-cli/templates/nextjs-prisma-supabase/SUPABASE_SETUP.md +104 -0
  617. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  618. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  619. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  620. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  621. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  622. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  623. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  624. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  625. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  626. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  627. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
  628. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  629. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  630. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  631. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  632. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  633. package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
  634. package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
  635. package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
  636. package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
  637. package/codeyam-cli/templates/rule-notification-hook.py +44 -17
  638. package/codeyam-cli/templates/rule-reflection-hook.py +24 -4
  639. package/codeyam-cli/templates/rules-instructions.md +34 -88
  640. package/codeyam-cli/templates/seed-adapters/supabase.ts +282 -0
  641. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +237 -0
  642. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +229 -0
  643. package/codeyam-cli/templates/{codeyam-memory.md → skills/codeyam-memory/SKILL.md} +215 -0
  644. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  645. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  646. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  647. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  648. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  649. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  650. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  651. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  652. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  653. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  654. package/codeyam-cli/templates/{codeyam-new-rule.md → skills/codeyam-new-rule/SKILL.md} +0 -2
  655. package/package.json +18 -10
  656. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
  657. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  658. package/packages/ai/src/lib/completionCall.js +10 -7
  659. package/packages/ai/src/lib/completionCall.js.map +1 -1
  660. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +25 -1
  661. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  662. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  663. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  664. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  665. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  666. package/packages/ai/src/lib/generateEntityScenarioData.js +57 -2
  667. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  668. package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
  669. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  670. package/packages/analyze/src/lib/ProjectAnalyzer.js +13 -4
  671. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  672. package/packages/analyze/src/lib/asts/index.js +4 -2
  673. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  674. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +8 -1
  675. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  676. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
  677. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  678. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +12 -2
  679. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  680. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +9 -7
  681. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  682. package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
  683. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  684. package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
  685. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  686. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +54 -27
  687. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -1
  688. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +65 -0
  689. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  690. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
  691. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  692. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +18 -4
  693. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  694. package/packages/database/index.js +1 -0
  695. package/packages/database/index.js.map +1 -1
  696. package/packages/database/src/lib/kysely/db.js +5 -0
  697. package/packages/database/src/lib/kysely/db.js.map +1 -1
  698. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
  699. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  700. package/packages/database/src/lib/loadAnalysis.js +1 -1
  701. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  702. package/packages/database/src/lib/loadCommits.js +23 -13
  703. package/packages/database/src/lib/loadCommits.js.map +1 -1
  704. package/packages/database/src/lib/loadEntities.js +0 -6
  705. package/packages/database/src/lib/loadEntities.js.map +1 -1
  706. package/packages/database/src/lib/loadEntity.js +5 -5
  707. package/packages/database/src/lib/loadEntity.js.map +1 -1
  708. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  709. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  710. package/packages/database/src/lib/updateCommitMetadata.js +76 -90
  711. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  712. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  713. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  714. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  715. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  716. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  717. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  718. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  719. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  720. package/packages/types/src/enums/ProjectFramework.js +2 -0
  721. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  722. package/packages/utils/src/lib/fs/rsyncCopy.js +28 -3
  723. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  724. package/scripts/npm-post-install.cjs +34 -0
  725. package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -120
  726. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
  727. package/codeyam-cli/src/commands/list.js +0 -31
  728. package/codeyam-cli/src/commands/list.js.map +0 -1
  729. package/codeyam-cli/src/commands/webapp-info.js +0 -146
  730. package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
  731. package/codeyam-cli/src/utils/universal-mocks.js +0 -152
  732. package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
  733. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-jNYXRRNI.js +0 -1
  734. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CvzqMxcu.js +0 -1
  735. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-EhOseatT.js +0 -34
  736. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-yjIHlOGa.js +0 -25
  737. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-Cq5o8jL4.js +0 -3
  738. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-CwZrv-Ok.js +0 -1
  739. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CDpEprKa.js +0 -1
  740. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-DHKuQSmR.js +0 -17
  741. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-DB3aFuEO.js +0 -51
  742. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-D1zB-pYc.js +0 -21
  743. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
  744. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-JTAjQ54M.js +0 -1
  745. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DjLxr2JB.js +0 -6
  746. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-CtYowLOt.js +0 -6
  747. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-9sMMAiWJ.js +0 -1
  748. package/codeyam-cli/src/webserver/build/client/assets/files-Co65J0s3.js +0 -1
  749. package/codeyam-cli/src/webserver/build/client/assets/git-BdHOxVfg.js +0 -15
  750. package/codeyam-cli/src/webserver/build/client/assets/globals-BSZfYCkU.css +0 -1
  751. package/codeyam-cli/src/webserver/build/client/assets/labs-BK0C1H1T.js +0 -1
  752. package/codeyam-cli/src/webserver/build/client/assets/manifest-040dab1c.js +0 -1
  753. package/codeyam-cli/src/webserver/build/client/assets/memory-UIDVz141.js +0 -92
  754. package/codeyam-cli/src/webserver/build/client/assets/root-D1WadSdf.js +0 -62
  755. package/codeyam-cli/src/webserver/build/client/assets/settings-CclxrcPK.js +0 -1
  756. package/codeyam-cli/src/webserver/build/client/assets/simulations-DVNJVQgD.js +0 -1
  757. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BqgrAzs3.js +0 -1
  758. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-DAFqfEDH.js +0 -2
  759. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DZlYx2c4.js +0 -1
  760. package/codeyam-cli/src/webserver/build/client/assets/useToast-ihdMtlf6.js +0 -1
  761. package/codeyam-cli/src/webserver/build/server/assets/index-B3dE0r28.js +0 -1
  762. package/codeyam-cli/src/webserver/build/server/assets/server-build-DYbfdxa3.js +0 -273
  763. package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
  764. package/scripts/finalize-analyzer.cjs +0 -13
  765. /package/codeyam-cli/templates/{codeyam-diagnose.md → commands/codeyam-diagnose.md} +0 -0
  766. /package/codeyam-cli/templates/{codeyam-debug.md → skills/codeyam-debug/SKILL.md} +0 -0
  767. /package/codeyam-cli/templates/{codeyam-setup.md → skills/codeyam-setup/SKILL.md} +0 -0
  768. /package/codeyam-cli/templates/{codeyam-sim.md → skills/codeyam-sim/SKILL.md} +0 -0
  769. /package/codeyam-cli/templates/{codeyam-test.md → skills/codeyam-test/SKILL.md} +0 -0
  770. /package/codeyam-cli/templates/{codeyam-verify.md → skills/codeyam-verify/SKILL.md} +0 -0
@@ -0,0 +1,696 @@
1
+ /**
2
+ * Pure logic for `codeyam editor audit` — zero I/O, fully testable.
3
+ *
4
+ * Cross-references glossary entries against registered scenarios (components)
5
+ * and test files (functions) to detect gaps Claude may have missed.
6
+ */
7
+ import { isIsolationUrl, } from "./entityChangeStatus.js";
8
+ // ─── Logic ───────────────────────────────────────────────────────────
9
+ const COMPONENT_RETURN_PATTERNS = ['JSX', 'React', 'Element', 'ReactNode'];
10
+ /**
11
+ * Returns true when the entry's returnType indicates a React component
12
+ * (contains "JSX", "React", "Element", or "ReactNode").
13
+ */
14
+ export function isComponent(entry) {
15
+ if (!entry.returnType)
16
+ return false;
17
+ return COMPONENT_RETURN_PATTERNS.some((pat) => entry.returnType.includes(pat));
18
+ }
19
+ /**
20
+ * Split glossary entries into components (JSX-returning) and functions (everything else).
21
+ */
22
+ export function classifyGlossaryEntries(entries) {
23
+ const components = [];
24
+ const functions = [];
25
+ for (const entry of entries) {
26
+ if (isComponent(entry)) {
27
+ components.push(entry);
28
+ }
29
+ else {
30
+ functions.push(entry);
31
+ }
32
+ }
33
+ return { components, functions };
34
+ }
35
+ /**
36
+ * Given classified entries and coverage data, produce a structured audit result.
37
+ *
38
+ * @param components - Glossary entries classified as components
39
+ * @param functions - Glossary entries classified as functions
40
+ * @param scenarioCounts - Map of component_name → number of registered scenarios
41
+ * @param testFileExistence - Map of testFile path → whether the file exists on disk
42
+ */
43
+ export function computeAudit({ components, functions, scenarioCounts, testFileExistence, testResults, clientErrors, totalScenarioCounts, entityChangeStatus, }) {
44
+ const componentResults = components.map((c) => {
45
+ const count = scenarioCounts[c.name] || 0;
46
+ const totalCount = totalScenarioCounts?.[c.name] || 0;
47
+ const changeStatus = entityChangeStatus?.[c.name];
48
+ const errors = clientErrors?.[c.name];
49
+ const hasErrors = count > 0 && errors && errors.length > 0;
50
+ let status;
51
+ if (count === 0) {
52
+ // Entities with existing scenarios from prior sessions don't need
53
+ // new scenarios — they need recapture. This applies to both "edited"
54
+ // and "impacted" entities: an edited page may not have been re-registered
55
+ // this session, and an impacted page's dependency changed.
56
+ if (changeStatus && totalCount > 0) {
57
+ status = 'needs_recapture';
58
+ }
59
+ else {
60
+ status = 'missing';
61
+ }
62
+ }
63
+ else if (hasErrors) {
64
+ status = 'has_errors';
65
+ }
66
+ else {
67
+ status = 'ok';
68
+ }
69
+ // Generate actionable hint for missing components
70
+ let hint;
71
+ if (status === 'missing') {
72
+ const fileName = c.filePath.split('/').pop() || '';
73
+ if (fileName === 'layout.tsx' || fileName === 'layout.ts') {
74
+ hint = `This is a layout file — register an app-level scenario with pageFilePath instead of componentName: codeyam editor register '{"name":"${c.name} - Default","pageFilePath":"${c.filePath}","url":"/<route>","dimensions":["Desktop"]}'`;
75
+ }
76
+ else if (fileName === 'page.tsx' || fileName === 'page.ts') {
77
+ hint = `This is a page file — register an app-level scenario with pageFilePath: codeyam editor register '{"name":"${c.name} - Default","pageFilePath":"${c.filePath}","url":"/<route>","dimensions":["Desktop"]}'`;
78
+ }
79
+ else {
80
+ hint = `Register a component scenario via an isolation route: codeyam editor isolate ${c.name} then codeyam editor register '{"name":"${c.name} - Default","componentName":"${c.name}","url":"/isolated-components/${c.name}?s=Default","dimensions":["Desktop"]}'`;
81
+ }
82
+ }
83
+ return {
84
+ name: c.name,
85
+ filePath: c.filePath,
86
+ scenarioCount: status === 'needs_recapture' ? totalCount : count,
87
+ status,
88
+ ...(hasErrors ? { clientErrors: errors } : {}),
89
+ ...(hint ? { hint } : {}),
90
+ };
91
+ });
92
+ const functionResults = functions.map((f) => {
93
+ const exists = f.testFile
94
+ ? (testFileExistence[f.testFile] ?? false)
95
+ : false;
96
+ if (!exists) {
97
+ // Suggest conventional test file path when testFile isn't in the glossary
98
+ const suggestedTestFile = !f.testFile
99
+ ? f.filePath.replace(/\.tsx?$/, '.test.ts')
100
+ : undefined;
101
+ return {
102
+ name: f.name,
103
+ filePath: f.filePath,
104
+ testFile: f.testFile,
105
+ testFileExists: false,
106
+ status: 'missing',
107
+ ...(suggestedTestFile ? { suggestedTestFile } : {}),
108
+ };
109
+ }
110
+ // If we have test results for this file, use them for deeper status
111
+ const tr = f.testFile && testResults ? testResults[f.testFile] : undefined;
112
+ if (!tr) {
113
+ // No test results available — fall back to existence-only check
114
+ return {
115
+ name: f.name,
116
+ filePath: f.filePath,
117
+ testFile: f.testFile,
118
+ testFileExists: true,
119
+ status: 'ok',
120
+ };
121
+ }
122
+ let status;
123
+ if (!tr.passing && tr.errorMessage) {
124
+ status = 'runner_error';
125
+ }
126
+ else if (!tr.passing) {
127
+ status = 'failing';
128
+ }
129
+ else if (!tr.hasEntityNameDescribe) {
130
+ status = 'name_mismatch';
131
+ }
132
+ else {
133
+ status = 'ok';
134
+ }
135
+ return {
136
+ name: f.name,
137
+ filePath: f.filePath,
138
+ testFile: f.testFile,
139
+ testFileExists: true,
140
+ testsPassing: tr.passing,
141
+ testsVisibleInUi: tr.hasEntityNameDescribe,
142
+ status,
143
+ ...(tr.errorMessage ? { errorMessage: tr.errorMessage } : {}),
144
+ };
145
+ });
146
+ const componentsOk = componentResults.filter((c) => c.status === 'ok' || c.status === 'needs_recapture').length;
147
+ const componentsWithErrors = componentResults.filter((c) => c.status === 'has_errors').length;
148
+ const componentsMissing = componentResults.filter((c) => c.status === 'missing').length;
149
+ const componentsNeedingRecapture = componentResults.filter((c) => c.status === 'needs_recapture').length;
150
+ const functionsOk = functionResults.filter((f) => f.status === 'ok').length;
151
+ const functionsFailing = functionResults.filter((f) => f.status === 'failing').length;
152
+ const functionsRunnerError = functionResults.filter((f) => f.status === 'runner_error').length;
153
+ const functionsNameMismatch = functionResults.filter((f) => f.status === 'name_mismatch').length;
154
+ const functionsMissing = functionResults.filter((f) => f.status === 'missing').length;
155
+ return {
156
+ components: componentResults,
157
+ functions: functionResults,
158
+ summary: {
159
+ totalComponents: componentResults.length,
160
+ componentsOk,
161
+ componentsMissing,
162
+ componentsWithErrors,
163
+ componentsNeedingRecapture,
164
+ totalFunctions: functionResults.length,
165
+ functionsOk,
166
+ functionsMissing,
167
+ functionsFailing,
168
+ functionsRunnerError,
169
+ functionsNameMismatch,
170
+ allPassing: componentsMissing === 0 &&
171
+ componentsWithErrors === 0 &&
172
+ functionsFailing === 0 &&
173
+ functionsRunnerError === 0 &&
174
+ functionsNameMismatch === 0 &&
175
+ functionsMissing === 0,
176
+ },
177
+ };
178
+ }
179
+ /**
180
+ * Returns true when the audit failure can be auto-fixed inline.
181
+ *
182
+ * Always returns false — full analyze-imports takes minutes on large projects
183
+ * and must never run as part of the audit. The audit only does lightweight
184
+ * entity SHA backfill. Users should run `codeyam editor analyze-imports`
185
+ * separately if incomplete entities persist.
186
+ */
187
+ export function isAutoRemediable(_summary, _alreadyAttempted) {
188
+ return false;
189
+ }
190
+ /**
191
+ * Generate clear, actionable guidance for an incomplete entity.
192
+ *
193
+ * Tells Claude exactly what's wrong, whether it's pre-existing, and
194
+ * the exact command to fix it — no guessing required.
195
+ */
196
+ export function formatIncompleteEntityGuidance(entity) {
197
+ const parts = [];
198
+ if (entity.preExisting) {
199
+ parts.push(`${entity.name}: ${entity.scenarioCount} scenario(s) without import graph (pre-existing issue, not from this session).`);
200
+ parts.push(`This is non-blocking — the entity had scenarios before this session but analyze-imports was never run for it.`);
201
+ }
202
+ else {
203
+ parts.push(`${entity.name}: ${entity.scenarioCount} scenario(s) without import graph — analyze-imports has not been run for this entity.`);
204
+ parts.push(`The entity has scenarios registered but its import graph is not built, so the editor cannot track its dependencies.`);
205
+ }
206
+ parts.push(`Fix: Run \`codeyam editor analyze-imports\` to build the import graph for all entities.`);
207
+ return parts.join(' ');
208
+ }
209
+ /**
210
+ * Resolve incomplete entity SHAs to their source file paths.
211
+ *
212
+ * Used by the audit to run targeted analysis on just the files that need it,
213
+ * instead of scanning all 117+ project files. Returns deduplicated file paths.
214
+ */
215
+ export async function getIncompleteEntityFilePaths(db, incompleteEntities) {
216
+ if (incompleteEntities.length === 0)
217
+ return [];
218
+ const shas = incompleteEntities.map((e) => e.entitySha);
219
+ const rows = await db
220
+ .selectFrom('entities')
221
+ .select('file_path')
222
+ .where('sha', 'in', shas)
223
+ .execute();
224
+ const paths = new Set();
225
+ for (const row of rows) {
226
+ if (row.file_path)
227
+ paths.add(row.file_path);
228
+ }
229
+ return [...paths];
230
+ }
231
+ /**
232
+ * Returns true when the only audit failures are auto-fixable entity issues
233
+ * (incompleteEntities and/or unassociatedScenarios) — all other failure
234
+ * counts are zero. Used to decide whether auto-running analyze-imports +
235
+ * entity SHA sync can fix the audit without manual intervention.
236
+ */
237
+ export function isOnlyIncompleteEntities(summary) {
238
+ return ((summary.componentsMissing ?? 0) === 0 &&
239
+ (summary.componentsWithErrors ?? 0) === 0 &&
240
+ (summary.functionsFailing ?? 0) === 0 &&
241
+ (summary.functionsNameMismatch ?? 0) === 0 &&
242
+ (summary.functionsMissing ?? 0) === 0 &&
243
+ (summary.missingFromGlossary ?? 0) === 0 &&
244
+ (summary.miscategorizedScenarios ?? 0) === 0 &&
245
+ (summary.scenariosNeedingRecapture ?? 0) === 0);
246
+ }
247
+ /**
248
+ * Returns true when the only audit failures are incomplete entities that ALL
249
+ * existed before the current session. Used by the step gate to avoid blocking
250
+ * progress on pre-existing issues the user didn't cause.
251
+ *
252
+ * Requires both the summary (to confirm no other failure types) and the
253
+ * incompleteEntities array (to verify every entry is pre-existing).
254
+ */
255
+ export function isOnlyPreExistingIncomplete(summary, incompleteEntities) {
256
+ // Must have at least one incomplete entity to be relevant
257
+ if (!incompleteEntities || incompleteEntities.length === 0)
258
+ return false;
259
+ // All other failure types must be zero
260
+ if (!isOnlyIncompleteEntities(summary))
261
+ return false;
262
+ // Every incomplete entity must be pre-existing
263
+ return incompleteEntities.every((e) => e.preExisting);
264
+ }
265
+ /**
266
+ * Filter a list of file paths to only those that need analysis.
267
+ *
268
+ * A file is excluded if ANY entity at that file path has an analysis
269
+ * record (direct or inherited from a sibling version with the same
270
+ * name+filePath). Everything else passes through.
271
+ *
272
+ * Used by handleAnalyzeImports to avoid re-analyzing ~120 files when
273
+ * only a few need it.
274
+ */
275
+ export async function filterToIncompleteFilePaths(db, _projectId, allFilePaths) {
276
+ if (allFilePaths.length === 0)
277
+ return [];
278
+ // Single query: find all file paths that have at least one entity
279
+ // with an analysis record. These are already analyzed and can be skipped.
280
+ const analyzedRows = await db
281
+ .selectFrom('entities')
282
+ .innerJoin('analyses', 'analyses.entity_sha', 'entities.sha')
283
+ .select('entities.file_path')
284
+ .where('entities.file_path', 'in', allFilePaths)
285
+ .groupBy('entities.file_path')
286
+ .execute();
287
+ const analyzedFilePaths = new Set(analyzedRows.map((r) => r.file_path));
288
+ return allFilePaths.filter((fp) => !analyzedFilePaths.has(fp));
289
+ }
290
+ /**
291
+ * Ensures the two audit filters — glossary scoping and scenario-count scoping —
292
+ * are consistent. When entityChangeStatus is empty/undefined (meaning the glossary
293
+ * will fall back to "audit all entries"), we must also drop the featureStartedAt
294
+ * filter so scenario counts include ALL scenarios, not just the current session.
295
+ *
296
+ * Without this, Feature 1 components get audited but their scenarios (created before
297
+ * the current feature session) aren't counted, causing false "no scenarios" failures.
298
+ */
299
+ export function resolveAuditSessionScope({ featureStartedAt, entityChangeStatus, }) {
300
+ const hasChangeStatus = entityChangeStatus && Object.keys(entityChangeStatus).length > 0;
301
+ if (!hasChangeStatus) {
302
+ // Glossary will include all entries — scenario counts must also include all
303
+ return { featureStartedAt: null, entityChangeStatus };
304
+ }
305
+ return { featureStartedAt, entityChangeStatus };
306
+ }
307
+ /**
308
+ * Filter glossary entries to only those whose entities are new, edited, or impacted
309
+ * in the current working session. When entityChangeStatus is empty or undefined,
310
+ * falls back to returning all entries (no filtering).
311
+ *
312
+ * Matches by entity name first, then by filePath as a fallback.
313
+ */
314
+ export function filterGlossaryByChangeStatus(entries, entityChangeStatus) {
315
+ if (!entityChangeStatus || Object.keys(entityChangeStatus).length === 0) {
316
+ return entries;
317
+ }
318
+ return entries.filter((entry) => {
319
+ // Match by entity name
320
+ if (entityChangeStatus[entry.name])
321
+ return true;
322
+ // Match by file path (entity names in changeStatus may be file-path keyed)
323
+ if (entityChangeStatus[entry.filePath])
324
+ return true;
325
+ return false;
326
+ });
327
+ }
328
+ /**
329
+ * Find entities that have scenarios but no analysis records.
330
+ * These entities need `codeyam editor analyze-imports` to run.
331
+ *
332
+ * Optionally scoped to the current feature session via featureStartedAt.
333
+ */
334
+ export async function queryIncompleteEntities(db, projectId, featureStartedAt) {
335
+ // Step 1: Get distinct entity SHAs from scenarios (with counts)
336
+ // No time filter — we check ALL scenarios to catch entities whose
337
+ // scenario SHAs were updated mid-session without touching updated_at.
338
+ const scenarioQuery = db
339
+ .selectFrom('editor_scenarios')
340
+ .select(['entity_sha'])
341
+ .select(db.fn.count('id').as('count'))
342
+ .where('project_id', '=', projectId)
343
+ .where('entity_sha', 'is not', null)
344
+ .groupBy('entity_sha');
345
+ const scenarioRows = await scenarioQuery.execute();
346
+ if (scenarioRows.length === 0)
347
+ return [];
348
+ const scenarioShas = scenarioRows.map((r) => r.entity_sha);
349
+ // Step 2: Get entity SHAs that have analyses
350
+ const analysisRows = await db
351
+ .selectFrom('analyses')
352
+ .select('entity_sha')
353
+ .where('entity_sha', 'in', scenarioShas)
354
+ .groupBy('entity_sha')
355
+ .execute();
356
+ const analyzedShas = new Set(analysisRows.map((r) => r.entity_sha));
357
+ // Step 3: Find scenario entity SHAs without direct analyses
358
+ const incompleteShas = scenarioRows.filter((r) => !analyzedShas.has(r.entity_sha));
359
+ if (incompleteShas.length === 0)
360
+ return [];
361
+ // Step 4: Look up entity names for incomplete SHAs
362
+ const incompleteShalist = incompleteShas.map((r) => r.entity_sha);
363
+ const entityRows = await db
364
+ .selectFrom('entities')
365
+ .select(['sha', 'name', 'file_path'])
366
+ .where('sha', 'in', incompleteShalist)
367
+ .execute();
368
+ const entityNameMap = new Map(entityRows.map((r) => [r.sha, r.name]));
369
+ // Step 4.5: Check for inherited analyses from sibling entity versions.
370
+ // A new entity version (created by the file watcher) may not have direct
371
+ // analyses, but an older version (same name+filePath) might. This matches
372
+ // getAllEntities() behavior which inherits analyses across versions.
373
+ // IMPORTANT: Must match by name+filePath, not name alone. When a component
374
+ // is extracted to a new file, the old version (different filePath) may have
375
+ // analyses but getAllEntities() won't inherit across different file paths.
376
+ const entityFilePathMap = new Map(entityRows.map((r) => [r.sha, r.file_path]));
377
+ const entityKeys = [
378
+ ...new Set(entityRows
379
+ .map((r) => `${r.name}::${r.file_path}`)
380
+ .filter((k) => !k.startsWith('::') && !k.endsWith('::'))),
381
+ ];
382
+ let keysWithInheritedAnalyses = new Set();
383
+ if (entityKeys.length > 0) {
384
+ // We need to find entities that share name+filePath AND have analyses.
385
+ // Since Kysely doesn't support WHERE (name || '::' || file_path) IN (...),
386
+ // query by the entity names and filter by filePath in JS.
387
+ const entityNames = [
388
+ ...new Set(entityRows.map((r) => r.name).filter(Boolean)),
389
+ ];
390
+ const siblingRows = await db
391
+ .selectFrom('entities')
392
+ .innerJoin('analyses', 'analyses.entity_sha', 'entities.sha')
393
+ .select(['entities.name', 'entities.file_path'])
394
+ .where('entities.name', 'in', entityNames)
395
+ .groupBy(['entities.name', 'entities.file_path'])
396
+ .execute();
397
+ keysWithInheritedAnalyses = new Set(siblingRows.map((r) => `${r.name}::${r.file_path}`));
398
+ }
399
+ // Filter out entities that have inherited analyses (same name+filePath)
400
+ const trulyIncompleteShas = incompleteShas.filter((r) => {
401
+ const sha = r.entity_sha;
402
+ const name = entityNameMap.get(sha);
403
+ const filePath = entityFilePathMap.get(sha);
404
+ if (!name)
405
+ return false; // No entity record (phantom SHA) — skip, not fixable by analysis
406
+ const key = `${name}::${filePath}`;
407
+ return !keysWithInheritedAnalyses.has(key);
408
+ });
409
+ if (trulyIncompleteShas.length === 0)
410
+ return [];
411
+ const trulyIncompleteShalist = trulyIncompleteShas.map((r) => r.entity_sha);
412
+ // Step 5: Also get component_name from scenarios as fallback for name
413
+ const scenarioNameRows = await db
414
+ .selectFrom('editor_scenarios')
415
+ .select(['entity_sha', 'component_name'])
416
+ .where('project_id', '=', projectId)
417
+ .where('entity_sha', 'in', trulyIncompleteShalist)
418
+ .where('component_name', 'is not', null)
419
+ .groupBy('entity_sha')
420
+ .execute();
421
+ const scenarioNameMap = new Map(scenarioNameRows.map((r) => [
422
+ r.entity_sha,
423
+ r.component_name,
424
+ ]));
425
+ // Step 6: Determine preExisting flag — if featureStartedAt is provided,
426
+ // check which entity SHAs have at least one scenario created/updated
427
+ // during the session. Those without any are pre-existing issues.
428
+ let sessionShas = new Set();
429
+ if (featureStartedAt) {
430
+ const sqliteTimestamp = featureStartedAt
431
+ .replace('T', ' ')
432
+ .replace(/\.\d{3}Z$/, '');
433
+ const sessionRows = await db
434
+ .selectFrom('editor_scenarios')
435
+ .select('entity_sha')
436
+ .where('project_id', '=', projectId)
437
+ .where('entity_sha', 'in', trulyIncompleteShalist)
438
+ .where((eb) => eb.or([
439
+ eb('created_at', '>=', sqliteTimestamp),
440
+ eb('updated_at', '>=', sqliteTimestamp),
441
+ ]))
442
+ .groupBy('entity_sha')
443
+ .execute();
444
+ sessionShas = new Set(sessionRows.map((r) => r.entity_sha));
445
+ }
446
+ return trulyIncompleteShas.map((r) => {
447
+ const sha = r.entity_sha;
448
+ return {
449
+ entitySha: sha,
450
+ name: entityNameMap.get(sha) || scenarioNameMap.get(sha) || 'Unknown',
451
+ scenarioCount: Number(r.count),
452
+ preExisting: featureStartedAt ? !sessionShas.has(sha) : false,
453
+ };
454
+ });
455
+ }
456
+ /**
457
+ * Find component scenarios that use non-isolation URLs.
458
+ *
459
+ * Component scenarios should always use `/isolated-components/...` URLs.
460
+ * When a component scenario points at a real page URL (e.g., `/library`),
461
+ * it's miscategorized — it should either be an application scenario
462
+ * (no componentName, with pageFilePath) or use an isolation route.
463
+ *
464
+ * Optionally scoped to the current feature session via featureStartedAt.
465
+ */
466
+ export async function queryMiscategorizedScenarios(db, projectId, featureStartedAt) {
467
+ let query = db
468
+ .selectFrom('editor_scenarios')
469
+ .select(['component_name', 'name', 'url'])
470
+ .where('project_id', '=', projectId)
471
+ .where('component_name', 'is not', null)
472
+ .where('url', 'is not', null);
473
+ if (featureStartedAt) {
474
+ const sqliteTimestamp = featureStartedAt
475
+ .replace('T', ' ')
476
+ .replace(/\.\d{3}Z$/, '');
477
+ query = query.where((eb) => eb.or([
478
+ eb('created_at', '>=', sqliteTimestamp),
479
+ eb('updated_at', '>=', sqliteTimestamp),
480
+ ]));
481
+ }
482
+ const rows = await query.execute();
483
+ // Filter to only rows where URL is NOT an isolation route
484
+ const miscategorized = rows.filter((r) => r.url && !isIsolationUrl(r.url));
485
+ if (miscategorized.length === 0)
486
+ return [];
487
+ // Group by (component_name, url)
488
+ const groups = new Map();
489
+ for (const row of miscategorized) {
490
+ const key = `${row.component_name}::${row.url}`;
491
+ const existing = groups.get(key);
492
+ if (existing) {
493
+ existing.scenarioNames.push(row.name);
494
+ }
495
+ else {
496
+ groups.set(key, {
497
+ componentName: row.component_name,
498
+ scenarioNames: [row.name],
499
+ url: row.url,
500
+ });
501
+ }
502
+ }
503
+ return [...groups.values()];
504
+ }
505
+ /**
506
+ * Query scenario counts per component, optionally scoped to the current
507
+ * feature session via featureStartedAt.
508
+ *
509
+ * A scenario belongs to the current session if it was created OR updated
510
+ * after featureStartedAt — re-registering a scenario during a new feature
511
+ * session updates `updated_at` but preserves the original `created_at`.
512
+ */
513
+ export async function queryScenarioCounts(db, projectId, featureStartedAt) {
514
+ let query = db
515
+ .selectFrom('editor_scenarios')
516
+ .select(['component_name'])
517
+ .select(db.fn.count('id').as('count'))
518
+ .where('project_id', '=', projectId)
519
+ .where('component_name', 'is not', null)
520
+ .groupBy('component_name');
521
+ if (featureStartedAt) {
522
+ const sqliteTimestamp = featureStartedAt
523
+ .replace('T', ' ')
524
+ .replace(/\.\d{3}Z$/, '');
525
+ query = query.where((eb) => eb.or([
526
+ eb('created_at', '>=', sqliteTimestamp),
527
+ eb('updated_at', '>=', sqliteTimestamp),
528
+ ]));
529
+ }
530
+ const rows = await query.execute();
531
+ const counts = {};
532
+ for (const row of rows) {
533
+ if (row.component_name) {
534
+ counts[row.component_name] = Number(row.count);
535
+ }
536
+ }
537
+ return counts;
538
+ }
539
+ /**
540
+ * Query scenario counts per page file path for app-level scenarios.
541
+ *
542
+ * App-level scenarios have `component_name = null` and are linked to pages
543
+ * via `page_file_path`. This mirrors `queryScenarioCounts` but groups by
544
+ * `page_file_path` instead of `component_name`.
545
+ */
546
+ export async function queryPageScenarioCounts(db, projectId, featureStartedAt) {
547
+ let query = db
548
+ .selectFrom('editor_scenarios')
549
+ .select(['page_file_path'])
550
+ .select(db.fn.count('id').as('count'))
551
+ .where('project_id', '=', projectId)
552
+ .where('component_name', 'is', null)
553
+ .where('page_file_path', 'is not', null)
554
+ .groupBy('page_file_path');
555
+ if (featureStartedAt) {
556
+ const sqliteTimestamp = featureStartedAt
557
+ .replace('T', ' ')
558
+ .replace(/\.\d{3}Z$/, '');
559
+ query = query.where((eb) => eb.or([
560
+ eb('created_at', '>=', sqliteTimestamp),
561
+ eb('updated_at', '>=', sqliteTimestamp),
562
+ ]));
563
+ }
564
+ const rows = await query.execute();
565
+ const counts = {};
566
+ for (const row of rows) {
567
+ if (row.page_file_path) {
568
+ counts[row.page_file_path] = Number(row.count);
569
+ }
570
+ }
571
+ return counts;
572
+ }
573
+ // ─── Unassociated Scenarios ───────────────────────────────────────────
574
+ /**
575
+ * Find scenarios with NULL entity_sha that have a file path
576
+ * (component_path or page_file_path). These scenarios were registered
577
+ * before entity records existed in the DB — typically because a subagent
578
+ * registered scenarios without running analyze-imports first.
579
+ *
580
+ * Fix: run `codeyam editor analyze-imports` to create entity records,
581
+ * then entity_sha backfill will associate them automatically.
582
+ *
583
+ * Optionally scoped to the current feature session via featureStartedAt.
584
+ */
585
+ export async function queryUnassociatedScenarios(db, projectId, featureStartedAt) {
586
+ let query = db
587
+ .selectFrom('editor_scenarios')
588
+ .select(['component_name', 'component_path', 'page_file_path', 'name'])
589
+ .where('project_id', '=', projectId)
590
+ .where('entity_sha', 'is', null)
591
+ .where((eb) => eb.or([
592
+ eb('component_path', 'is not', null),
593
+ eb('page_file_path', 'is not', null),
594
+ ]));
595
+ if (featureStartedAt) {
596
+ const sqliteTimestamp = featureStartedAt
597
+ .replace('T', ' ')
598
+ .replace(/\.\d{3}Z$/, '');
599
+ query = query.where((eb) => eb.or([
600
+ eb('created_at', '>=', sqliteTimestamp),
601
+ eb('updated_at', '>=', sqliteTimestamp),
602
+ ]));
603
+ }
604
+ const rows = await query.execute();
605
+ if (rows.length === 0)
606
+ return [];
607
+ // Group by file path (component_path or page_file_path)
608
+ const groups = new Map();
609
+ for (const row of rows) {
610
+ const r = row;
611
+ const filePath = r.component_path || r.page_file_path;
612
+ const existing = groups.get(filePath);
613
+ if (existing) {
614
+ existing.scenarioNames.push(r.name);
615
+ }
616
+ else {
617
+ // Derive a display name: use component_name if available,
618
+ // otherwise extract from file path (e.g., "src/lib/LibraryApp.tsx" → "LibraryApp")
619
+ const displayName = r.component_name ||
620
+ filePath
621
+ .split('/')
622
+ .pop()
623
+ ?.replace(/\.\w+$/, '') ||
624
+ filePath;
625
+ groups.set(filePath, {
626
+ name: displayName,
627
+ filePath,
628
+ scenarioNames: [r.name],
629
+ });
630
+ }
631
+ }
632
+ return [...groups.values()].map((g) => ({
633
+ name: g.name,
634
+ filePath: g.filePath,
635
+ scenarioCount: g.scenarioNames.length,
636
+ scenarioNames: g.scenarioNames,
637
+ }));
638
+ }
639
+ // ─── Duplicate Name Detection ─────────────────────────────────────────
640
+ /**
641
+ * Detect glossary entries that share the same `name`.
642
+ *
643
+ * Returns a Map of name → entries[] for names that appear more than once.
644
+ * Single-occurrence names are excluded. Used to warn Claude that ambiguous
645
+ * names will make audit output confusing (e.g., three entries all named "Page").
646
+ */
647
+ export function detectDuplicateNames(entries) {
648
+ const groups = new Map();
649
+ for (const entry of entries) {
650
+ const existing = groups.get(entry.name);
651
+ if (existing)
652
+ existing.push(entry);
653
+ else
654
+ groups.set(entry.name, [entry]);
655
+ }
656
+ // Only return groups with duplicates
657
+ for (const [name, group] of groups) {
658
+ if (group.length <= 1)
659
+ groups.delete(name);
660
+ }
661
+ return groups;
662
+ }
663
+ /**
664
+ * Identify scenarios that need recapture because their entity (or an entity
665
+ * in their dependency tree) has changed.
666
+ *
667
+ * Each scenario's entity name is resolved from its entity_sha (which points
668
+ * to the default export for app-level scenarios). The caller joins
669
+ * editor_scenarios.entity_sha → entities.name before calling this function.
670
+ *
671
+ * A scenario needs recapture when its entity has status 'edited' or 'impacted'
672
+ * AND the scenario was NOT re-registered in the current feature session.
673
+ */
674
+ export function identifyScenariosNeedingRecapture(params) {
675
+ const { scenarios, entityChangeStatus } = params;
676
+ if (!entityChangeStatus || Object.keys(entityChangeStatus).length === 0) {
677
+ return [];
678
+ }
679
+ const result = [];
680
+ for (const scenario of scenarios) {
681
+ if (scenario.updatedInSession)
682
+ continue;
683
+ if (!scenario.entityName)
684
+ continue;
685
+ const changeStatus = entityChangeStatus[scenario.entityName];
686
+ if (!changeStatus)
687
+ continue;
688
+ result.push({
689
+ scenarioName: scenario.name,
690
+ entityName: scenario.entityName,
691
+ status: changeStatus,
692
+ });
693
+ }
694
+ return result;
695
+ }
696
+ //# sourceMappingURL=editorAudit.js.map