@codeyam/codeyam-cli 0.1.0-staging.4057bd2 → 0.1.0-staging.40645bb

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 (628) 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 +9 -9
  4. package/analyzer-template/packages/ai/package.json +1 -1
  5. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +135 -0
  6. package/analyzer-template/packages/ai/src/lib/astScopes/nodeToSource.ts +19 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +11 -4
  8. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +36 -9
  9. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.ts +10 -3
  10. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +16 -6
  11. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +0 -33
  12. package/analyzer-template/packages/analyze/index.ts +4 -1
  13. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +13 -7
  14. package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
  15. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +28 -2
  16. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +5 -36
  17. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +10 -6
  18. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +9 -12
  19. package/analyzer-template/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.ts +21 -0
  20. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +82 -10
  21. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
  22. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
  23. package/analyzer-template/packages/analyze/src/lib/files/analyzeNextRoute.ts +8 -3
  24. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +239 -58
  25. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
  26. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +1684 -1462
  27. package/analyzer-template/packages/aws/package.json +7 -7
  28. package/analyzer-template/packages/database/package.json +3 -3
  29. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +102 -0
  30. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +25 -15
  31. package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
  32. package/analyzer-template/packages/database/src/lib/loadEntity.ts +19 -8
  33. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +0 -65
  34. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +9 -0
  35. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -1
  36. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +104 -0
  37. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
  38. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  39. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +7 -1
  40. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  41. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  42. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
  43. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  44. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
  45. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
  46. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +5 -5
  47. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
  48. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  49. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +0 -25
  50. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  51. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  52. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  53. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
  54. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
  55. package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
  56. package/analyzer-template/packages/ui-components/package.json +1 -1
  57. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  58. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  59. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
  60. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
  61. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
  62. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  63. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +22 -1
  64. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  65. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +27 -0
  66. package/analyzer-template/project/analyzeFileEntities.ts +26 -0
  67. package/analyzer-template/project/runMultiScenarioServer.ts +26 -3
  68. package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
  69. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  70. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +23 -3
  71. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  72. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
  73. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
  74. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
  75. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
  76. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
  77. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
  78. package/codeyam-cli/src/cli.js +24 -0
  79. package/codeyam-cli/src/cli.js.map +1 -1
  80. package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js +47 -0
  81. package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js.map +1 -0
  82. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js +71 -0
  83. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js.map +1 -0
  84. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js +30 -0
  85. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js.map +1 -0
  86. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js +51 -0
  87. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js.map +1 -0
  88. package/codeyam-cli/src/commands/__tests__/editor.statePersistence.test.js +55 -0
  89. package/codeyam-cli/src/commands/__tests__/editor.statePersistence.test.js.map +1 -0
  90. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +56 -0
  91. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
  92. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +137 -47
  93. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
  94. package/codeyam-cli/src/commands/default.js +3 -46
  95. package/codeyam-cli/src/commands/default.js.map +1 -1
  96. package/codeyam-cli/src/commands/editor.js +5268 -794
  97. package/codeyam-cli/src/commands/editor.js.map +1 -1
  98. package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js +23 -0
  99. package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js.map +1 -0
  100. package/codeyam-cli/src/commands/editorIsolateArgs.js +25 -0
  101. package/codeyam-cli/src/commands/editorIsolateArgs.js.map +1 -0
  102. package/codeyam-cli/src/commands/init.js +89 -34
  103. package/codeyam-cli/src/commands/init.js.map +1 -1
  104. package/codeyam-cli/src/commands/telemetry.js +37 -0
  105. package/codeyam-cli/src/commands/telemetry.js.map +1 -0
  106. package/codeyam-cli/src/data/designSystems.js +27 -0
  107. package/codeyam-cli/src/data/designSystems.js.map +1 -0
  108. package/codeyam-cli/src/data/techStacks.js +77 -0
  109. package/codeyam-cli/src/data/techStacks.js.map +1 -0
  110. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
  111. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
  112. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
  113. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
  114. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
  115. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
  116. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +181 -0
  117. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  118. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +3915 -1
  119. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
  120. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
  121. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
  122. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
  123. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
  124. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
  125. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
  126. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js +100 -0
  127. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js.map +1 -0
  128. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +181 -3
  129. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -1
  130. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +194 -0
  131. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
  132. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +381 -0
  133. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
  134. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
  135. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
  136. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
  137. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
  138. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +249 -2
  139. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -1
  140. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +594 -0
  141. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
  142. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +435 -0
  143. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
  144. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +118 -1
  145. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -1
  146. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +217 -3
  147. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -1
  148. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +250 -0
  149. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
  150. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js +1108 -0
  151. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js.map +1 -0
  152. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
  153. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
  154. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +411 -0
  155. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
  156. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +1694 -2
  157. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
  158. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +413 -0
  159. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
  160. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js +143 -0
  161. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js.map +1 -0
  162. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
  163. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
  164. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
  165. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
  166. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +2121 -0
  167. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
  168. package/codeyam-cli/src/utils/__tests__/envFile.test.js +125 -0
  169. package/codeyam-cli/src/utils/__tests__/envFile.test.js.map +1 -0
  170. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
  171. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
  172. package/codeyam-cli/src/utils/__tests__/handoffContext.test.js +500 -0
  173. package/codeyam-cli/src/utils/__tests__/handoffContext.test.js.map +1 -0
  174. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +122 -0
  175. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
  176. package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js +302 -0
  177. package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js.map +1 -0
  178. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
  179. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
  180. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
  181. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
  182. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
  183. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
  184. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +284 -0
  185. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
  186. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +672 -0
  187. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
  188. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js +84 -0
  189. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js.map +1 -0
  190. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +26 -5
  191. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  192. package/codeyam-cli/src/utils/__tests__/telemetry.test.js +159 -0
  193. package/codeyam-cli/src/utils/__tests__/telemetry.test.js.map +1 -0
  194. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
  195. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
  196. package/codeyam-cli/src/utils/__tests__/testRunner.test.js +216 -0
  197. package/codeyam-cli/src/utils/__tests__/testRunner.test.js.map +1 -0
  198. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +148 -0
  199. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
  200. package/codeyam-cli/src/utils/analysisRunner.js +39 -8
  201. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  202. package/codeyam-cli/src/utils/analyzer.js +19 -0
  203. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  204. package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
  205. package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
  206. package/codeyam-cli/src/utils/backgroundServer.js +95 -19
  207. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  208. package/codeyam-cli/src/utils/database.js +37 -2
  209. package/codeyam-cli/src/utils/database.js.map +1 -1
  210. package/codeyam-cli/src/utils/designSystemShowcase.js +810 -0
  211. package/codeyam-cli/src/utils/designSystemShowcase.js.map +1 -0
  212. package/codeyam-cli/src/utils/devServerState.js +71 -0
  213. package/codeyam-cli/src/utils/devServerState.js.map +1 -0
  214. package/codeyam-cli/src/utils/editorApi.js +95 -0
  215. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  216. package/codeyam-cli/src/utils/editorAudit.js +780 -13
  217. package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
  218. package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
  219. package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
  220. package/codeyam-cli/src/utils/editorCapture.js +102 -0
  221. package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
  222. package/codeyam-cli/src/utils/editorDeleteScenario.js +67 -0
  223. package/codeyam-cli/src/utils/editorDeleteScenario.js.map +1 -0
  224. package/codeyam-cli/src/utils/editorDevServer.js +100 -1
  225. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -1
  226. package/codeyam-cli/src/utils/editorEntityChangeStatus.js +50 -0
  227. package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
  228. package/codeyam-cli/src/utils/editorEntityHelpers.js +144 -0
  229. package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
  230. package/codeyam-cli/src/utils/editorGuard.js +36 -0
  231. package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
  232. package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
  233. package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
  234. package/codeyam-cli/src/utils/editorJournal.js +92 -4
  235. package/codeyam-cli/src/utils/editorJournal.js.map +1 -1
  236. package/codeyam-cli/src/utils/editorLoaderHelpers.js +152 -0
  237. package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
  238. package/codeyam-cli/src/utils/editorMigration.js +224 -0
  239. package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
  240. package/codeyam-cli/src/utils/editorMockState.js +1 -1
  241. package/codeyam-cli/src/utils/editorPreloadHelpers.js +72 -1
  242. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -1
  243. package/codeyam-cli/src/utils/editorPreview.js +74 -1
  244. package/codeyam-cli/src/utils/editorPreview.js.map +1 -1
  245. package/codeyam-cli/src/utils/editorRecapture.js +109 -0
  246. package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
  247. package/codeyam-cli/src/utils/editorRoadmap.js +574 -0
  248. package/codeyam-cli/src/utils/editorRoadmap.js.map +1 -0
  249. package/codeyam-cli/src/utils/editorScenarioSwitch.js +149 -0
  250. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
  251. package/codeyam-cli/src/utils/editorScenarios.js +631 -0
  252. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
  253. package/codeyam-cli/src/utils/editorSeedAdapter.js +475 -0
  254. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
  255. package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
  256. package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
  257. package/codeyam-cli/src/utils/entityChangeStatus.js +394 -0
  258. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
  259. package/codeyam-cli/src/utils/entityChangeStatus.server.js +227 -0
  260. package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
  261. package/codeyam-cli/src/utils/envFile.js +90 -0
  262. package/codeyam-cli/src/utils/envFile.js.map +1 -0
  263. package/codeyam-cli/src/utils/fileWatcher.js +38 -0
  264. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  265. package/codeyam-cli/src/utils/glossaryAdd.js +74 -0
  266. package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
  267. package/codeyam-cli/src/utils/handoffContext.js +257 -0
  268. package/codeyam-cli/src/utils/handoffContext.js.map +1 -0
  269. package/codeyam-cli/src/utils/install-skills.js +51 -7
  270. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  271. package/codeyam-cli/src/utils/manualEntityAnalysis.js +196 -0
  272. package/codeyam-cli/src/utils/manualEntityAnalysis.js.map +1 -0
  273. package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
  274. package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
  275. package/codeyam-cli/src/utils/progress.js +2 -2
  276. package/codeyam-cli/src/utils/progress.js.map +1 -1
  277. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js +159 -0
  278. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js.map +1 -0
  279. package/codeyam-cli/src/utils/queue/job.js +35 -6
  280. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  281. package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
  282. package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
  283. package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
  284. package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
  285. package/codeyam-cli/src/utils/scenarioCoverage.js +77 -0
  286. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
  287. package/codeyam-cli/src/utils/scenariosManifest.js +313 -0
  288. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  289. package/codeyam-cli/src/utils/screenshotHash.js +26 -0
  290. package/codeyam-cli/src/utils/screenshotHash.js.map +1 -0
  291. package/codeyam-cli/src/utils/serverState.js +30 -0
  292. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  293. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +47 -16
  294. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  295. package/codeyam-cli/src/utils/simulationGateMiddleware.js +17 -1
  296. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
  297. package/codeyam-cli/src/utils/slugUtils.js +25 -0
  298. package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
  299. package/codeyam-cli/src/utils/syncMocksMiddleware.js +2 -2
  300. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  301. package/codeyam-cli/src/utils/techStackConfig.js +38 -0
  302. package/codeyam-cli/src/utils/techStackConfig.js.map +1 -0
  303. package/codeyam-cli/src/utils/techStackConfig.test.js +85 -0
  304. package/codeyam-cli/src/utils/techStackConfig.test.js.map +1 -0
  305. package/codeyam-cli/src/utils/telemetry.js +106 -0
  306. package/codeyam-cli/src/utils/telemetry.js.map +1 -0
  307. package/codeyam-cli/src/utils/telemetryMiddleware.js +22 -0
  308. package/codeyam-cli/src/utils/telemetryMiddleware.js.map +1 -0
  309. package/codeyam-cli/src/utils/testResultCache.js +53 -0
  310. package/codeyam-cli/src/utils/testResultCache.js.map +1 -0
  311. package/codeyam-cli/src/utils/testResultCache.server.js +81 -0
  312. package/codeyam-cli/src/utils/testResultCache.server.js.map +1 -0
  313. package/codeyam-cli/src/utils/testResultCache.server.test.js +187 -0
  314. package/codeyam-cli/src/utils/testResultCache.server.test.js.map +1 -0
  315. package/codeyam-cli/src/utils/testResultCache.test.js +230 -0
  316. package/codeyam-cli/src/utils/testResultCache.test.js.map +1 -0
  317. package/codeyam-cli/src/utils/testRunner.js +193 -1
  318. package/codeyam-cli/src/utils/testRunner.js.map +1 -1
  319. package/codeyam-cli/src/utils/webappDetection.js +25 -2
  320. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  321. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +99 -0
  322. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -0
  323. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +153 -0
  324. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -0
  325. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +107 -0
  326. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
  327. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +762 -0
  328. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  329. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +315 -0
  330. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
  331. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js +135 -0
  332. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js.map +1 -0
  333. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +86 -0
  334. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
  335. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  336. package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
  337. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  338. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js +34 -0
  339. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js.map +1 -0
  340. package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
  341. package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
  342. package/codeyam-cli/src/webserver/backgroundServer.js +60 -61
  343. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  344. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-DTBZZfSk.js +1 -0
  345. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BxclONWq.js} +5 -5
  346. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
  347. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-BsnEOJZ_.js} +9 -9
  348. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-ByaELMbv.js +1 -0
  349. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-6WjVfhxX.js +25 -0
  350. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-ChX-Hp7W.js +3 -0
  351. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-BU_OAEMP.js → LoadingDots-By5zI316.js} +1 -1
  352. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-ceAyBX-H.js → LogViewer-C-9zQdXg.js} +3 -3
  353. package/codeyam-cli/src/webserver/build/client/assets/MiniClaudeChat-Bs2_Oua4.js +36 -0
  354. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-DQsceHVv.js} +4 -4
  355. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DThcm_9M.js +1 -0
  356. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-B76aig_2.js → ScenarioViewer-Cl4oOA3A.js} +3 -3
  357. package/codeyam-cli/src/webserver/build/client/assets/Spinner-CIil5-gb.js +34 -0
  358. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
  359. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-BqkA9zyZ.js +1 -0
  360. package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-DnOgyseQ.js} +4 -4
  361. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-DqM9hbNE.js} +8 -8
  362. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  363. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  364. package/codeyam-cli/src/webserver/build/client/assets/{addon-web-links-Duc5hnl7.js → addon-web-links-C58dYPwR.js} +1 -1
  365. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  366. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-B8NCeOrm.js} +7 -7
  367. package/codeyam-cli/src/webserver/build/client/assets/api.editor-database-verify-l0sNRNKZ.js +1 -0
  368. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  369. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  370. package/codeyam-cli/src/webserver/build/client/assets/api.editor-github-verify-l0sNRNKZ.js +1 -0
  371. package/codeyam-cli/src/webserver/build/client/assets/api.editor-handoff-l0sNRNKZ.js +1 -0
  372. package/codeyam-cli/src/webserver/build/client/assets/api.editor-hosting-verify-l0sNRNKZ.js +1 -0
  373. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  374. package/codeyam-cli/src/webserver/build/client/assets/api.editor-recapture-stale-l0sNRNKZ.js +1 -0
  375. package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
  376. package/codeyam-cli/src/webserver/build/client/assets/api.editor-roadmap-l0sNRNKZ.js +1 -0
  377. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
  378. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
  379. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
  380. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
  381. package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
  382. package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
  383. package/codeyam-cli/src/webserver/build/client/assets/api.editor-verify-routes-l0sNRNKZ.js +1 -0
  384. package/codeyam-cli/src/webserver/build/client/assets/api.interactive-switch-scenario-l0sNRNKZ.js +1 -0
  385. package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-BFSIqZgO.js} +2 -2
  386. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-B9fDzFVh.js} +2 -2
  387. package/codeyam-cli/src/webserver/build/client/assets/chunk-UVKPFVEO-Bmq2apuh.js +43 -0
  388. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-DLPObLUx.js} +2 -2
  389. package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-DXEmO0TD.js} +3 -3
  390. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BwyFiRot.js +41 -0
  391. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-Coe5NhbS.js +1 -0
  392. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-DoA97ML3.svg} +2 -2
  393. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-iRhRIFlp.js +1 -0
  394. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-BZPBzV73.js +1 -0
  395. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DOXe0Qx7.js +161 -0
  396. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-C6fEYHrh.js +41 -0
  397. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-pc-vc6wO.js} +14 -13
  398. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-C8AyYgYT.js +6 -0
  399. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DziaVQX1.js +6 -0
  400. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-BTcpgIpC.js +6 -0
  401. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMvVHNXU.js → entity._sha_.edit._scenarioId-D_O_ajfZ.js} +2 -2
  402. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-DTvKq3TY.js → entry.client-j1Vi0bco.js} +6 -6
  403. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
  404. package/codeyam-cli/src/webserver/build/client/assets/files-kuny2Q_s.js +1 -0
  405. package/codeyam-cli/src/webserver/build/client/assets/git-DgCZPMie.js +1 -0
  406. package/codeyam-cli/src/webserver/build/client/assets/globals-L-aUIeux.css +1 -0
  407. package/codeyam-cli/src/webserver/build/client/assets/{index-BcvgDzbZ.js → index-BliGSSpl.js} +1 -1
  408. package/codeyam-cli/src/webserver/build/client/assets/index-SqjQKTdH.js +15 -0
  409. package/codeyam-cli/src/webserver/build/client/assets/{index-10oVnAAH.js → index-vyrZD2g4.js} +1 -1
  410. package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
  411. package/codeyam-cli/src/webserver/build/client/assets/labs-c3yLxSEp.js +1 -0
  412. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-D-q28GLF.js} +2 -2
  413. package/codeyam-cli/src/webserver/build/client/assets/manifest-30c44d84.js +1 -0
  414. package/codeyam-cli/src/webserver/build/client/assets/memory-CEWIUC4t.js +101 -0
  415. package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-BP6fitdh.js} +3 -3
  416. package/codeyam-cli/src/webserver/build/client/assets/root-CLedrjXQ.js +80 -0
  417. package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-BooqacKS.js} +2 -2
  418. package/codeyam-cli/src/webserver/build/client/assets/settings-BM0nbryO.js +1 -0
  419. package/codeyam-cli/src/webserver/build/client/assets/simulations-ovy6FjRY.js +1 -0
  420. package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-DHemCJIs.js} +3 -3
  421. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-D87ekDl8.js} +2 -2
  422. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-Dk0Tciqg.js +1 -0
  423. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C8QvIe05.js +2 -0
  424. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-jkCytuYz.js +1 -0
  425. package/codeyam-cli/src/webserver/build/client/assets/useToast-BgqkixU9.js +1 -0
  426. package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
  427. package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-CuR5TvUx.js +16 -0
  428. package/codeyam-cli/src/webserver/build/server/assets/index-D4MWAsqb.js +1 -0
  429. package/codeyam-cli/src/webserver/build/server/assets/init-JObA4lXD.js +14 -0
  430. package/codeyam-cli/src/webserver/build/server/assets/progress-CHTtrxFG.js +1 -0
  431. package/codeyam-cli/src/webserver/build/server/assets/server-build-i8OXK4oL.js +765 -0
  432. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  433. package/codeyam-cli/src/webserver/build-info.json +5 -5
  434. package/codeyam-cli/src/webserver/editorProxy.js +711 -50
  435. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
  436. package/codeyam-cli/src/webserver/idleDetector.js +130 -0
  437. package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
  438. package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
  439. package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
  440. package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
  441. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +242 -3
  442. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +147 -4
  443. package/codeyam-cli/src/webserver/server.js +236 -16
  444. package/codeyam-cli/src/webserver/server.js.map +1 -1
  445. package/codeyam-cli/src/webserver/terminalServer.js +400 -58
  446. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  447. package/codeyam-cli/templates/__tests__/editor-step-hook.prompt-capture.test.ts +118 -0
  448. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  449. package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
  450. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  451. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  452. package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
  453. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  454. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  455. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  456. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  457. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  458. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  459. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  460. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  461. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
  462. package/codeyam-cli/templates/codeyam-editor-claude.md +86 -5
  463. package/codeyam-cli/templates/codeyam-editor-codex.md +61 -0
  464. package/codeyam-cli/templates/codeyam-editor-gemini.md +59 -0
  465. package/codeyam-cli/templates/codeyam-editor-reference.md +216 -0
  466. package/codeyam-cli/templates/design-systems/clean-dashboard-design-system.md +255 -0
  467. package/codeyam-cli/templates/design-systems/editorial-design-system.md +267 -0
  468. package/codeyam-cli/templates/design-systems/mono-brutalist-design-system.md +256 -0
  469. package/codeyam-cli/templates/design-systems/neo-brutalist-design-system.md +294 -0
  470. package/codeyam-cli/templates/editor-step-hook.py +262 -41
  471. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +288 -0
  472. package/codeyam-cli/templates/expo-react-native/README.md +41 -0
  473. package/codeyam-cli/templates/expo-react-native/__tests__/.gitkeep +0 -0
  474. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +15 -0
  475. package/codeyam-cli/templates/expo-react-native/app/index.tsx +36 -0
  476. package/codeyam-cli/templates/expo-react-native/app.json +29 -0
  477. package/codeyam-cli/templates/expo-react-native/babel.config.js +10 -0
  478. package/codeyam-cli/templates/expo-react-native/gitignore +14 -0
  479. package/codeyam-cli/templates/expo-react-native/global.css +10 -0
  480. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  481. package/codeyam-cli/templates/expo-react-native/lib/theme.ts +73 -0
  482. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  483. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  484. package/codeyam-cli/templates/expo-react-native/package.json +54 -0
  485. package/codeyam-cli/templates/expo-react-native/patches/expo-modules-autolinking+3.0.24.patch +29 -0
  486. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  487. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  488. package/codeyam-cli/templates/isolation-route/expo-router.tsx.template +54 -0
  489. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  490. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  491. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
  492. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  493. package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
  494. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  495. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +9 -4
  496. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  497. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +22 -0
  498. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +6 -2
  499. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +4 -1
  500. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +140 -0
  501. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  502. package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
  503. package/codeyam-cli/templates/{nextjs-prisma-sqlite/PRISMA_SETUP.md → nextjs-prisma-supabase/SUPABASE_SETUP.md} +37 -17
  504. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  505. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  506. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  507. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  508. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  509. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  510. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  511. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  512. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  513. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  514. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
  515. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  516. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  517. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  518. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  519. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  520. package/codeyam-cli/templates/seed-adapters/supabase.ts +475 -0
  521. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +2 -2
  522. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +192 -17
  523. package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +10 -10
  524. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  525. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  526. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  527. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  528. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  529. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  530. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  531. package/package.json +15 -9
  532. package/packages/ai/src/lib/astScopes/methodSemantics.js +99 -0
  533. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  534. package/packages/ai/src/lib/astScopes/nodeToSource.js +16 -0
  535. package/packages/ai/src/lib/astScopes/nodeToSource.js.map +1 -1
  536. package/packages/ai/src/lib/astScopes/paths.js +12 -3
  537. package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
  538. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +27 -10
  539. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  540. package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js +9 -2
  541. package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js.map +1 -1
  542. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +14 -4
  543. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  544. package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
  545. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  546. package/packages/analyze/index.js +1 -1
  547. package/packages/analyze/index.js.map +1 -1
  548. package/packages/analyze/src/lib/ProjectAnalyzer.js +10 -4
  549. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  550. package/packages/analyze/src/lib/asts/index.js +4 -2
  551. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  552. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +16 -2
  553. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  554. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +6 -26
  555. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  556. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +3 -2
  557. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  558. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +9 -7
  559. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  560. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js +14 -0
  561. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
  562. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +44 -11
  563. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  564. package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
  565. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  566. package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
  567. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  568. package/packages/analyze/src/lib/files/analyzeNextRoute.js +5 -1
  569. package/packages/analyze/src/lib/files/analyzeNextRoute.js.map +1 -1
  570. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +120 -28
  571. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  572. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
  573. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  574. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +1368 -1193
  575. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  576. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +104 -0
  577. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
  578. package/packages/database/src/lib/loadAnalysis.js +7 -1
  579. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  580. package/packages/database/src/lib/loadEntities.js +0 -6
  581. package/packages/database/src/lib/loadEntities.js.map +1 -1
  582. package/packages/database/src/lib/loadEntity.js +5 -5
  583. package/packages/database/src/lib/loadEntity.js.map +1 -1
  584. package/packages/database/src/lib/updateCommitMetadata.js +0 -25
  585. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  586. package/packages/types/src/enums/ProjectFramework.js +2 -0
  587. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  588. package/packages/utils/src/lib/fs/rsyncCopy.js +22 -1
  589. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  590. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-DmJveP3T.js +0 -1
  591. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-g3saevPb.js +0 -1
  592. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +0 -1
  593. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-DYFW3lDD.js +0 -25
  594. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DLeucoVX.js +0 -3
  595. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BED4B6sP.js +0 -1
  596. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +0 -34
  597. package/codeyam-cli/src/webserver/build/client/assets/Terminal-Dnj5CY9R.js +0 -41
  598. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-C8OKAR5x.js +0 -1
  599. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +0 -1
  600. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-C4pqxYJB.js +0 -51
  601. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CMT1jU2q.js +0 -21
  602. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
  603. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +0 -1
  604. package/codeyam-cli/src/webserver/build/client/assets/editor-D1DAKXtT.js +0 -8
  605. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DkzqFzFj.js +0 -6
  606. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +0 -6
  607. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +0 -6
  608. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-cPo8LiG3.js +0 -1
  609. package/codeyam-cli/src/webserver/build/client/assets/files-DO4CZ16O.js +0 -1
  610. package/codeyam-cli/src/webserver/build/client/assets/git-CFCTYk9I.js +0 -15
  611. package/codeyam-cli/src/webserver/build/client/assets/globals-B17TBSS6.css +0 -1
  612. package/codeyam-cli/src/webserver/build/client/assets/labs-Zk7ryIM1.js +0 -1
  613. package/codeyam-cli/src/webserver/build/client/assets/manifest-a632de18.js +0 -1
  614. package/codeyam-cli/src/webserver/build/client/assets/memory-Dg0mvYrI.js +0 -96
  615. package/codeyam-cli/src/webserver/build/client/assets/root-DUKqhFlb.js +0 -67
  616. package/codeyam-cli/src/webserver/build/client/assets/settings-DfuTtcJP.js +0 -1
  617. package/codeyam-cli/src/webserver/build/client/assets/simulations-B3aOzpCZ.js +0 -1
  618. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
  619. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +0 -2
  620. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-O-jkvSPx.js +0 -1
  621. package/codeyam-cli/src/webserver/build/client/assets/useToast-9FIWuYfK.js +0 -1
  622. package/codeyam-cli/src/webserver/build/server/assets/index-HfLydfDq.js +0 -1
  623. package/codeyam-cli/src/webserver/build/server/assets/server-build-CUu_F-oo.js +0 -366
  624. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh +0 -108
  625. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh +0 -69
  626. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.sh +0 -12
  627. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter.jq +0 -45
  628. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.sh +0 -139
@@ -2,9 +2,104 @@ var _a, _b;
2
2
  import { WebSocketServer, WebSocket } from 'ws';
3
3
  import crypto from 'crypto';
4
4
  import fs from 'fs';
5
+ import os from 'os';
5
6
  import path from 'path';
6
7
  import * as pty from 'node-pty';
7
8
  import { createMarkerTransformer } from "../utils/scenarioMarkers.js";
9
+ import { IdleDetector } from "./idleDetector.js";
10
+ import { mockStateEventEmitter } from "./mockStateEvents.js";
11
+ /**
12
+ * Strip the raw `claude ...` shell command from suppressed PTY output
13
+ * so it doesn't leak to the user in the fallback timeout path.
14
+ */
15
+ export function stripClaudeCommand(output) {
16
+ // Find the line containing the claude command and strip everything before
17
+ // and including it (shell prompt, ANSI codes, command echo). Preserve any
18
+ // real output that follows.
19
+ const idx = output.indexOf('claude ');
20
+ if (idx === -1)
21
+ return output;
22
+ // Find the end of the command line (\r or \n after "claude")
23
+ let end = idx;
24
+ while (end < output.length && output[end] !== '\r' && output[end] !== '\n') {
25
+ end++;
26
+ }
27
+ // Skip past trailing \r\n
28
+ while (end < output.length &&
29
+ (output[end] === '\r' || output[end] === '\n')) {
30
+ end++;
31
+ }
32
+ // Strip leading ANSI escape sequences from the remainder
33
+ // (e.g. bracketed paste mode toggles like \x1b[?2004l)
34
+ let rest = output.slice(end);
35
+ rest = rest.replace(/^(\x1b\[[\x20-\x3f]*[\x40-\x7e]|\x1b[()][A-Z0-9])*/, '');
36
+ return rest;
37
+ }
38
+ /**
39
+ * Detect whether a PTY output chunk contains Claude Code's welcome banner.
40
+ * Supports both the old box-drawing format (`╭─── Claude Code ───╮`)
41
+ * and the new block-art format (`▐▛███▜▌ Claude Code`).
42
+ */
43
+ export function isBannerChunk(data) {
44
+ // Strip ANSI escape sequences before checking — Claude Code's Ink renderer
45
+ // inserts SGR color codes between the banner characters (e.g. ▐\x1b[48;5;16m▛).
46
+ const plain = data.replace(/\x1b\[[0-9;?]*[A-Za-z]|\x1b\][^\x07]*\x07|\x1b[()][A-Z0-9]/g, '');
47
+ return plain.includes('╭') || plain.includes('▐▛');
48
+ }
49
+ /**
50
+ * Determine whether the startup output filter should be active.
51
+ * The filter strips the raw `claude --session-id ...` command from the
52
+ * terminal so the user never sees it.
53
+ */
54
+ export function shouldFilterStartup(opts) {
55
+ return opts.hasContext || opts.editorMode;
56
+ }
57
+ /**
58
+ * Manages PTY output suppression during Claude startup.
59
+ *
60
+ * Suppresses all output until the welcome banner arrives, then clears
61
+ * the screen. The claude command is stripped from any chunk that is forwarded
62
+ * (both the banner chunk on the normal path and the buffered output on the
63
+ * fallback timeout path).
64
+ */
65
+ export class StartupOutputFilter {
66
+ constructor() {
67
+ this.hasClearedScreen = false;
68
+ this.suppressedOutput = '';
69
+ }
70
+ /**
71
+ * Process a PTY data chunk. Returns an object describing what action to take:
72
+ * - `type: 'suppress'` — buffer the chunk, send nothing
73
+ * - `type: 'clear-and-send'` — clear screen, then send `data`
74
+ * - `type: 'send'` — send `data` as-is (post-startup)
75
+ */
76
+ processChunk(data) {
77
+ if (!this.hasClearedScreen && isBannerChunk(data)) {
78
+ this.hasClearedScreen = true;
79
+ const cleaned = stripClaudeCommand(data);
80
+ return { type: 'clear-and-send', data: cleaned };
81
+ }
82
+ if (!this.hasClearedScreen) {
83
+ this.suppressedOutput += data;
84
+ return { type: 'suppress' };
85
+ }
86
+ return { type: 'send', data };
87
+ }
88
+ /**
89
+ * Called when the fallback timeout fires (╭ never arrived).
90
+ * Returns the buffered output with the command stripped, or null if
91
+ * the screen was already cleared.
92
+ */
93
+ getTimeoutOutput() {
94
+ if (this.hasClearedScreen)
95
+ return null;
96
+ this.hasClearedScreen = true;
97
+ if (this.suppressedOutput.length === 0)
98
+ return null;
99
+ const cleaned = stripClaudeCommand(this.suppressedOutput);
100
+ return cleaned.length > 0 ? cleaned : null;
101
+ }
102
+ }
8
103
  // Use globalThis so the sessions Set is shared across module instances.
9
104
  // In Vite dev mode, this file is loaded twice: once by the Vite plugin (Node.js native)
10
105
  // and once by the SSR context (ssrLoadModule). Without globalThis, each instance
@@ -52,9 +147,22 @@ const ENV_PASSTHROUGH_KEYS = [
52
147
  'HOMEBREW_CELLAR',
53
148
  'HOMEBREW_REPOSITORY',
54
149
  ];
55
- function buildPtyEnv() {
150
+ // Additional env vars needed on Windows
151
+ const WINDOWS_ENV_PASSTHROUGH_KEYS = [
152
+ 'USERPROFILE',
153
+ 'APPDATA',
154
+ 'LOCALAPPDATA',
155
+ 'COMSPEC',
156
+ 'SystemRoot',
157
+ 'TEMP',
158
+ 'TMP',
159
+ ];
160
+ export function buildPtyEnv(options) {
56
161
  const env = {};
57
- for (const key of ENV_PASSTHROUGH_KEYS) {
162
+ const keys = process.platform === 'win32'
163
+ ? [...ENV_PASSTHROUGH_KEYS, ...WINDOWS_ENV_PASSTHROUGH_KEYS]
164
+ : ENV_PASSTHROUGH_KEYS;
165
+ for (const key of keys) {
58
166
  const val = process.env[key];
59
167
  if (val != null)
60
168
  env[key] = val;
@@ -62,8 +170,56 @@ function buildPtyEnv() {
62
170
  // Always set TERM for proper terminal behavior
63
171
  if (!env.TERM)
64
172
  env.TERM = 'xterm-256color';
173
+ // Signal to hooks that this is an editor Build session.
174
+ // Without this, editor hooks fire in ALL Claude sessions in the project.
175
+ if (options?.editorMode) {
176
+ env.CODEYAM_EDITOR_ACTIVE = '1';
177
+ }
65
178
  return env;
66
179
  }
180
+ /**
181
+ * Returns the shell executable and arguments for PTY spawning,
182
+ * handling platform differences (Windows uses cmd.exe, Unix uses $SHELL).
183
+ * cmd.exe is preferred over PowerShell on Windows because:
184
+ * - .cmd shims run in-process (no window flash from subprocess spawning)
185
+ * - No execution policy restrictions blocking .ps1 scripts
186
+ * - Faster startup (no profile loading)
187
+ */
188
+ export function getShellConfig() {
189
+ if (process.platform === 'win32') {
190
+ return { shell: 'cmd.exe', args: [] };
191
+ }
192
+ const defaultShell = process.platform === 'darwin' ? '/bin/zsh' : '/bin/sh';
193
+ return {
194
+ shell: process.env.SHELL || defaultShell,
195
+ args: ['-l'],
196
+ };
197
+ }
198
+ /**
199
+ * Quote a shell argument for the current platform.
200
+ * Unix shells use single quotes; cmd.exe uses double quotes.
201
+ */
202
+ export function shellQuote(arg) {
203
+ if (process.platform === 'win32') {
204
+ return `"${arg.replace(/"/g, '""')}"`;
205
+ }
206
+ return `'${arg}'`;
207
+ }
208
+ /**
209
+ * Returns a safe working directory for the PTY, falling back through
210
+ * CODEYAM_ROOT_PATH → cwd → HOME/USERPROFILE → os.tmpdir().
211
+ */
212
+ export function getSafeCwd() {
213
+ const cwd = process.env.CODEYAM_ROOT_PATH || process.cwd();
214
+ if (fs.existsSync(cwd))
215
+ return cwd;
216
+ const home = process.platform === 'win32'
217
+ ? process.env.USERPROFILE || process.env.HOME
218
+ : process.env.HOME;
219
+ if (home && fs.existsSync(home))
220
+ return home;
221
+ return os.tmpdir();
222
+ }
67
223
  /**
68
224
  * Convert a name to a safe file name matching CodeYam's convention.
69
225
  * e.g. "Default Scenario" -> "Default_Scenario"
@@ -190,7 +346,7 @@ function writeDevModeContext(ctx) {
190
346
  // Server
191
347
  const serverPort = process.env.CODEYAM_PORT || '3111';
192
348
  lines.push('## Server');
193
- lines.push(`- **Refresh preview:** \`curl -X POST http://localhost:${serverPort}/api/dev-mode-preview\``);
349
+ lines.push(`- **Refresh preview:** \`curl -X POST http://localhost:${serverPort}/api/dev-mode-preview -H 'Content-Type: application/json' -d '{"dimension":"Desktop"}'\` (dimension is REQUIRED)`);
194
350
  lines.push('');
195
351
  fs.writeFileSync(contextPath, lines.join('\n'), 'utf8');
196
352
  return true;
@@ -227,28 +383,34 @@ function writeEditorModeContext(ctx) {
227
383
  `- **Proxy:** http://localhost:${proxyPort} (used by the browser iframe only — do NOT use for health checks)`,
228
384
  '',
229
385
  '## Workflow',
230
- '- **Guided steps:** Run `codeyam editor` for the next step (plan → prototype → confirm → deconstruct → extract → glossary → analyze → app scenarios → user scenarios → verify → journal → review)',
231
- '- Each feature follows 12 steps: `codeyam editor 1` through `codeyam editor 12`',
232
- '- Steps 1, 3, and 12 require user confirmation before proceeding',
386
+ '- **Guided steps:** Run `codeyam editor steps` for the next step (plan → prepare → prototype → verify prototype → confirm → deconstruct → extract → glossary → analyze → app scenarios → user scenarios → verify → journal → review → present → commit → finalize → push)',
387
+ '- Each feature follows 18 steps — run `codeyam editor steps` to see what to do next. Never expose `codeyam editor` commands to the user.',
388
+ '- **Run ONE step at a time.** Read the FULL output, complete every checklist item, then advance. NEVER batch-run steps in a loop or delegate them to a subagent.',
389
+ '- Steps 1, 5, 15, and 18 require user confirmation before proceeding',
390
+ '',
391
+ '## Preview Updates',
392
+ '- **Refresh the preview frequently** — the user watches the preview as you work. Refresh after every meaningful change (new page, UI section, data seeding, styling), not just at the end.',
393
+ `- **Refresh command:** \`curl -s -X POST http://localhost:${serverPort}/api/dev-mode-preview -H 'Content-Type: application/json' -d '{"dimension":"Desktop"}'\` (dimension is REQUIRED)`,
394
+ '- Aim for 4-8+ preview updates during a typical building session.',
233
395
  '',
234
396
  '## Verifying the Dev Server',
235
397
  '- Get the dev server URL: `curl -s http://localhost:' +
236
398
  serverPort +
237
399
  '/api/editor-dev-server` → look at the `"url"` field (e.g., `http://localhost:3000`)',
238
- '- Check the page loads: `curl -s -o /dev/null -w "%{http_code}" http://localhost:3000` (use the actual dev server URL, NOT the proxy)',
239
- '- Check API routes work: `curl -s http://localhost:3000/api/your-route` (should return JSON, not "Internal Server Error")',
400
+ '- Verify pages and API routes: `codeyam editor verify-routes \'{"paths":["/"],"apiRoutes":["/api/your-route"]}\'` (checks HTTP status and JSON validity)',
240
401
  '- **NEVER check localhost:' +
241
402
  proxyPort +
242
403
  ' for health** — the proxy returns 200 even when the app is broken',
243
404
  '',
244
405
  '## API Endpoints',
245
- `- **Register scenario (auto-captures screenshot):** \`codeyam editor register '{"name":"...","description":"...","mockData":{"routes":{"/api/tasks":{"body":[...]}}}}'\``,
406
+ `- **Register scenario (auto-captures screenshot):** \`codeyam editor register '{"name":"...","url":"/page-to-screenshot","type":"application","seed":{...}}'\` — ALWAYS include "url" for the page to screenshot. For large payloads, write JSON to a file and use @ prefix: \`codeyam editor register @/tmp/scenario.json\``,
246
407
  `- **Get active scenario data:** \`curl http://localhost:${serverPort}/api/editor-scenario-data\``,
247
- `- **Refresh/navigate preview:** \`curl -X POST http://localhost:${serverPort}/api/dev-mode-preview\` (no body = refresh; with \`{"path":"/route"}\` = navigate; with \`{"scenarioSlug":"..."}\` = switch scenario). Clears logs, waits for HMR, checks SSR health.`,
408
+ `- **Refresh/navigate/switch preview:** \`curl -X POST http://localhost:${serverPort}/api/dev-mode-preview -H 'Content-Type: application/json' -d '{"dimension":"Desktop"}'\` (dimension is REQUIRED in every call; add \`"path":"/route"\` to navigate; add \`"scenarioId":"..."\` to switch scenario). Clears logs, waits for HMR, checks SSR health.`,
248
409
  `- **Refresh config:** \`curl -X POST http://localhost:${serverPort}/api/editor-refresh\` (also starts dev server if a webapp is detected)`,
249
410
  `- **Dev server status:** \`curl http://localhost:${serverPort}/api/editor-dev-server\``,
250
411
  `- **Start dev server:** \`curl -X POST http://localhost:${serverPort}/api/editor-dev-server -H 'Content-Type: application/json' -d '{"action":"start"}'\``,
251
412
  `- **Restart dev server:** \`curl -X POST http://localhost:${serverPort}/api/editor-dev-server -H 'Content-Type: application/json' -d '{"action":"restart"}'\``,
413
+ `- **Feature complete (after push):** \`curl -s -X POST http://localhost:${serverPort}/api/editor-feature-complete\` — signals the UI that the feature is done. Call this after step 18 push/skip, then STOP.`,
252
414
  `- **Re-capture scenario screenshot:** \`curl -X POST http://localhost:${serverPort}/api/editor-capture-scenario -H 'Content-Type: application/json' -d '{"scenarioId":"...","url":"..."}'\` (for manual re-capture; register auto-captures)`,
253
415
  `- **Journal screenshot:** \`curl -X POST http://localhost:${serverPort}/api/editor-journal-screenshot -H 'Content-Type: application/json' -d '{"url":"...","filename":"..."}'\``,
254
416
  `- **Journal entry:** \`curl -X POST http://localhost:${serverPort}/api/editor-journal-entry -H 'Content-Type: application/json' -d '{"title":"...","type":"feature","description":"..."}'\``,
@@ -261,17 +423,21 @@ function writeEditorModeContext(ctx) {
261
423
  '- POST/PUT/DELETE always go through to the real dev server',
262
424
  '',
263
425
  '## Component Isolation Routes',
264
- '- To screenshot individual components, create ONE isolation route per component:',
265
- ' - **Remix:** `app/routes/codeyam-isolate.ComponentName.tsx` → `/codeyam-isolate/ComponentName`',
266
- ' - **Next.js:** `app/codeyam-isolate/ComponentName/page.tsx` `/codeyam-isolate/ComponentName`',
426
+ '- Create isolation route dirs: `codeyam editor isolate ComponentA ComponentB ...`',
427
+ ' - This creates the layout guard and a directory per component under `app/isolated-components/`',
428
+ '- Create ONE isolation route page per component:',
429
+ ' - **Remix:** `app/routes/isolated-components.ComponentName.tsx` → `/isolated-components/ComponentName`',
430
+ ' - **Next.js:** `app/isolated-components/ComponentName/page.tsx` → `/isolated-components/ComponentName`',
431
+ ' - **Expo:** `app/isolated-components/ComponentName.tsx` → `/isolated-components/ComponentName` (use `useLocalSearchParams` from expo-router)',
267
432
  '- The route defines a `scenarios` object mapping scenario names to props, reads `?s=ScenarioName` from the URL, and renders the component',
268
- '- Wrap the component in a centered container: `<div style="display:flex;justify-content:center;align-items:center;min-height:100vh;padding:20px"><div style="width:100%;max-width:...">` — set max-width to match the component\'s real container (e.g. card in 3-col grid → 24rem)',
433
+ '- For web apps: Wrap the component in a centered container: `<div style="display:flex;justify-content:center;align-items:center;min-height:100vh"><div style="width:100%;max-width:...">` — set max-width to match the component\'s real container (e.g. card in 3-col grid → 24rem)',
434
+ '- For Expo: Wrap with `<View nativeID="codeyam-capture">` (nativeID maps to id on web for screenshot capture)',
269
435
  '- **Create multiple scenarios per component** (like tests): default/happy path, edge cases (empty data, long text, max items), different visual states (loading, error, disabled)',
270
- '- Register each scenario: `codeyam editor register \'{"name":"ComponentName - Scenario","componentName":"ComponentName","componentPath":"path/to/file.tsx","url":"/codeyam-isolate/ComponentName?s=Scenario","mockData":{"routes":{"/api/...":{"body":[...]}}}}\'`',
436
+ '- Register each scenario: `codeyam editor register \'{"name":"ComponentName - Scenario","componentName":"ComponentName","componentPath":"path/to/file.tsx","url":"/isolated-components/ComponentName?s=Scenario","mockData":{"routes":{"/api/...":{"body":[...]}}}}\'`',
271
437
  '- The url is a PATH, not a full URL — the proxy appends it and intercepts API calls the component makes',
272
438
  '- `mockData.routes` provides data for any API calls the component makes internally (omit if none)',
273
439
  '- Isolation routes stay in the project so the editor preview can display them',
274
- '- Ensure `.gitignore` includes `**/codeyam-isolate*` so they are not committed',
440
+ '- Ensure `.gitignore` includes `**/isolated-components*` so they are not committed',
275
441
  '',
276
442
  '## Files',
277
443
  '- **Scenario data:** .codeyam/editor-scenarios/{scenario-id}.json',
@@ -285,9 +451,21 @@ function writeEditorModeContext(ctx) {
285
451
  const hasPackageJson = fs.existsSync(path.join(codeyamRoot, 'package.json'));
286
452
  if (!hasPackageJson) {
287
453
  lines.push('## Status');
288
- lines.push('- **Empty project** — no package.json found. Ask the user what they want to build.');
454
+ lines.push('- **Empty project** — no package.json found. Run `codeyam editor steps` to begin.');
289
455
  lines.push('');
290
456
  }
457
+ // Include handoff context if a provider switch generated one
458
+ try {
459
+ const handoffContextPath = path.join(codeyamRoot, '.codeyam', 'handoff-context.md');
460
+ if (fs.existsSync(handoffContextPath)) {
461
+ lines.push('');
462
+ lines.push(fs.readFileSync(handoffContextPath, 'utf8'));
463
+ lines.push('');
464
+ }
465
+ }
466
+ catch {
467
+ // Non-fatal
468
+ }
291
469
  fs.writeFileSync(contextPath, lines.join('\n'), 'utf8');
292
470
  return true;
293
471
  }
@@ -325,6 +503,12 @@ export function attachTerminalServer(httpServer) {
325
503
  }
326
504
  }, PING_INTERVAL_MS);
327
505
  globalThis.__codeyamPingInterval = pingInterval;
506
+ // Subscribe to mock state events and broadcast to all terminal clients
507
+ mockStateEventEmitter.on('event', (event) => {
508
+ if (event.type === 'data-mutation-forwarded') {
509
+ broadcastDataMutationForwarded(event.method, event.pathname);
510
+ }
511
+ });
328
512
  wss.on('connection', (ws, req) => {
329
513
  // Parse entity context from query params
330
514
  const url = new URL(req.url || '', `http://${req.headers.host}`);
@@ -338,6 +522,9 @@ export function attachTerminalServer(httpServer) {
338
522
  const projectSlug = url.searchParams.get('projectSlug') || '';
339
523
  const editorMode = url.searchParams.get('editorMode') === 'true';
340
524
  const reconnectId = url.searchParams.get('reconnectId') || '';
525
+ const claudeStartMode = url.searchParams.get('claudeStartMode') || '';
526
+ const claudeSessionId = url.searchParams.get('claudeSessionId') || '';
527
+ const editorStepLabel = url.searchParams.get('editorStepLabel') || '';
341
528
  // --- Reconnection: reattach to a detached PTY ---
342
529
  if (reconnectId && detachedPtys.has(reconnectId)) {
343
530
  const detached = detachedPtys.get(reconnectId);
@@ -364,13 +551,27 @@ export function attachTerminalServer(httpServer) {
364
551
  let detachedFlag = false;
365
552
  const reconnectPort = process.env.CODEYAM_PORT || '3111';
366
553
  const reconnectTransformMarkers = createMarkerTransformer(reconnectPort);
554
+ const reconnectIdleDetector = new IdleDetector({
555
+ onIdle: () => {
556
+ if (ws.readyState === WebSocket.OPEN) {
557
+ console.log('[terminalServer] Sending claude-idle (reconnected)');
558
+ ws.send(JSON.stringify({ type: 'claude-idle' }));
559
+ }
560
+ },
561
+ onActive: () => {
562
+ if (ws.readyState === WebSocket.OPEN) {
563
+ console.log('[terminalServer] Sending claude-active (reconnected)');
564
+ ws.send(JSON.stringify({ type: 'claude-active' }));
565
+ }
566
+ },
567
+ }, { activeOutputPattern: /[✶✢·◼]/ });
367
568
  detached.ptyProcess.onData((data) => {
368
569
  if (detachedFlag)
369
570
  return; // Superseded by a newer listener
370
571
  if (ws.readyState === WebSocket.OPEN) {
371
572
  if (!detached.hasClearedScreen &&
372
573
  detached.hasContext &&
373
- data.includes('╭')) {
574
+ isBannerChunk(data)) {
374
575
  detached.hasClearedScreen = true;
375
576
  ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
376
577
  }
@@ -378,14 +579,12 @@ export function attachTerminalServer(httpServer) {
378
579
  if (transformed.length > 0) {
379
580
  ws.send(JSON.stringify({ type: 'output', data: transformed }));
380
581
  }
381
- const stripped = data.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
382
- if (stripped.includes('Editor Mode \u2014')) {
383
- console.log('[terminalServer] Detected claude-idle signal (reconnect)');
384
- ws.send(JSON.stringify({ type: 'claude-idle' }));
385
- }
582
+ reconnectIdleDetector.onPtyOutput(data);
386
583
  }
387
584
  });
388
585
  detached.ptyProcess.onExit(() => {
586
+ console.log('[terminalServer] PTY exited (reconnected), flushing idle state');
587
+ reconnectIdleDetector.disposeAndFlush();
389
588
  sessions.delete(session);
390
589
  if (ws.readyState === WebSocket.OPEN) {
391
590
  ws.close();
@@ -396,6 +595,7 @@ export function attachTerminalServer(httpServer) {
396
595
  try {
397
596
  const msg = JSON.parse(raw.toString());
398
597
  if (msg.type === 'input') {
598
+ reconnectIdleDetector.onUserInput();
399
599
  detached.ptyProcess.write(msg.data);
400
600
  }
401
601
  else if (msg.type === 'resize' && msg.cols && msg.rows) {
@@ -416,19 +616,17 @@ export function attachTerminalServer(httpServer) {
416
616
  return;
417
617
  }
418
618
  // --- New connection: spawn a fresh PTY ---
419
- const shell = process.env.SHELL || '/bin/zsh';
420
- const cwd = process.env.CODEYAM_ROOT_PATH || process.cwd();
421
- // Verify cwd exists, fall back to HOME
422
- const safeCwd = fs.existsSync(cwd) ? cwd : process.env.HOME || '/tmp';
619
+ const { shell, args: shellArgs } = getShellConfig();
620
+ const safeCwd = getSafeCwd();
423
621
  // Spawn PTY with a clean env (no giant JSON blobs from CODEYAM_PROJECT etc.)
424
622
  let ptyProcess;
425
623
  try {
426
- ptyProcess = pty.spawn(shell, ['-l'], {
624
+ ptyProcess = pty.spawn(shell, shellArgs, {
427
625
  name: 'xterm-256color',
428
626
  cols: 120,
429
627
  rows: 30,
430
628
  cwd: safeCwd,
431
- env: buildPtyEnv(),
629
+ env: buildPtyEnv({ editorMode }),
432
630
  });
433
631
  }
434
632
  catch (error) {
@@ -468,9 +666,41 @@ export function attachTerminalServer(httpServer) {
468
666
  projectSlug,
469
667
  });
470
668
  let hasClearedScreen = false;
471
- // Rolling buffer of trailing text to detect "Editor Mode —" across PTY chunks.
472
- let idleDetectBuffer = '';
473
- const IDLE_MARKER = 'Editor Mode \u2014';
669
+ const filterStartup = shouldFilterStartup({ hasContext, editorMode });
670
+ const startupFilter = filterStartup ? new StartupOutputFilter() : null;
671
+ // Safety timeout: stop suppressing output after 5s even if ╭ never arrives.
672
+ // Prevents "Starting Claude..." hanging forever if the banner format changes.
673
+ if (filterStartup) {
674
+ setTimeout(() => {
675
+ const output = startupFilter.getTimeoutOutput();
676
+ if (output !== null) {
677
+ hasClearedScreen = true;
678
+ console.log('[terminalServer] Suppression timeout — showing output');
679
+ if (ws.readyState === WebSocket.OPEN) {
680
+ // Clear the "Starting Claude..." message
681
+ ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
682
+ const transformed = transformMarkers(output);
683
+ if (transformed.length > 0) {
684
+ ws.send(JSON.stringify({ type: 'output', data: transformed }));
685
+ }
686
+ }
687
+ }
688
+ }, 5000);
689
+ }
690
+ const idleDetector = new IdleDetector({
691
+ onIdle: () => {
692
+ if (ws.readyState === WebSocket.OPEN) {
693
+ console.log('[terminalServer] Sending claude-idle');
694
+ ws.send(JSON.stringify({ type: 'claude-idle' }));
695
+ }
696
+ },
697
+ onActive: () => {
698
+ if (ws.readyState === WebSocket.OPEN) {
699
+ console.log('[terminalServer] Sending claude-active');
700
+ ws.send(JSON.stringify({ type: 'claude-active' }));
701
+ }
702
+ },
703
+ }, { activeOutputPattern: /[✶✢·◼]/ });
474
704
  // PTY output -> WebSocket
475
705
  const serverPort = process.env.CODEYAM_PORT || '3111';
476
706
  // Stateful transformer that buffers partial {{scenario:...}} markers
@@ -478,35 +708,37 @@ export function attachTerminalServer(httpServer) {
478
708
  const transformMarkers = createMarkerTransformer(serverPort);
479
709
  ptyProcess.onData((data) => {
480
710
  if (ws.readyState === WebSocket.OPEN) {
481
- // When Claude Code starts (indicated by its box-drawing welcome banner),
482
- // clear the screen to hide the raw shell command.
483
- if (!hasClearedScreen && hasContext && data.includes('╭')) {
484
- hasClearedScreen = true;
485
- ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
486
- }
487
- // Transform {{scenario:Name:ID}} markers into OSC 8 clickable hyperlinks.
488
- // Uses stateful buffering to handle markers split across PTY chunks.
489
- const transformed = transformMarkers(data);
490
- if (transformed.length > 0) {
491
- ws.send(JSON.stringify({ type: 'output', data: transformed }));
492
- }
493
- // Detect the Stop hook output — signals Claude is waiting for user input.
494
- // The hook outputs "Editor Mode —" when Claude finishes a turn.
495
- // Strip ANSI escape codes and check buffer+current to handle cross-chunk splits.
496
- const stripped = data.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
497
- const combined = idleDetectBuffer + stripped;
498
- if (combined.includes(IDLE_MARKER)) {
499
- console.log('[terminalServer] Detected claude-idle signal');
500
- ws.send(JSON.stringify({ type: 'claude-idle' }));
501
- idleDetectBuffer = '';
711
+ // During startup, suppress output until Claude's welcome banner (╭)
712
+ // arrives, then clear screen and strip the raw command from the chunk.
713
+ if (startupFilter && !hasClearedScreen) {
714
+ const result = startupFilter.processChunk(data);
715
+ if (result.type === 'clear-and-send') {
716
+ hasClearedScreen = true;
717
+ ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
718
+ if (result.data.length > 0) {
719
+ const transformed = transformMarkers(result.data);
720
+ if (transformed.length > 0) {
721
+ ws.send(JSON.stringify({ type: 'output', data: transformed }));
722
+ }
723
+ }
724
+ idleDetector.onPtyOutput(data);
725
+ }
726
+ // type === 'suppress': skip sending and idle detection
502
727
  }
503
728
  else {
504
- // Keep trailing chars in case the marker spans two chunks
505
- idleDetectBuffer = stripped.slice(-(IDLE_MARKER.length - 1));
729
+ // Transform {{scenario:Name:ID}} markers into OSC 8 clickable hyperlinks.
730
+ // Uses stateful buffering to handle markers split across PTY chunks.
731
+ const transformed = transformMarkers(data);
732
+ if (transformed.length > 0) {
733
+ ws.send(JSON.stringify({ type: 'output', data: transformed }));
734
+ }
735
+ idleDetector.onPtyOutput(data);
506
736
  }
507
737
  }
508
738
  });
509
739
  ptyProcess.onExit(() => {
740
+ console.log('[terminalServer] PTY exited, flushing idle state');
741
+ idleDetector.disposeAndFlush();
510
742
  sessions.delete(session);
511
743
  // Also clean up from detachedPtys if it was detached
512
744
  if (detachedPtys.has(sessionId)) {
@@ -522,6 +754,7 @@ export function attachTerminalServer(httpServer) {
522
754
  try {
523
755
  const msg = JSON.parse(raw.toString());
524
756
  if (msg.type === 'input') {
757
+ idleDetector.onUserInput();
525
758
  ptyProcess.write(msg.data);
526
759
  }
527
760
  else if (msg.type === 'resize' && msg.cols && msg.rows) {
@@ -539,14 +772,57 @@ export function attachTerminalServer(httpServer) {
539
772
  ws.on('close', () => {
540
773
  detachSession(session, hasContext, hasClearedScreen);
541
774
  });
775
+ // Show a loading indicator while Claude Code starts up.
776
+ // PTY output is suppressed until Claude's welcome banner (╭) appears
777
+ // and triggers a screen clear, so the user never sees the raw command.
778
+ if (filterStartup) {
779
+ ws.send(JSON.stringify({
780
+ type: 'output',
781
+ data: '\x1b[2J\x1b[H\r\n\x1b[90m Starting Claude...\x1b[0m\r\n',
782
+ }));
783
+ }
542
784
  // Start Claude Code with the appropriate skill.
543
785
  // Using a skill avoids shell escaping issues and multi-line paste detection.
786
+ //
787
+ // Session recovery modes (editor only):
788
+ // resume + sessionId → claude --resume <uuid> (resumes exact conversation)
789
+ // resume, no sessionId → claude --continue (fallback for pre-existing sessions)
790
+ // fresh → generate UUID, write to .codeyam/claude-session-id.txt,
791
+ // launch claude --session-id <uuid> '/codeyam-editor'
792
+ //
793
+ // The UUID is generated HERE (not in printStep1) so it's available before
794
+ // Claude launches. printStep1 runs inside the session — too late.
544
795
  setTimeout(() => {
545
796
  if (editorMode && hasContext) {
546
- ptyProcess.write("claude '/codeyam-editor'\r");
797
+ if (claudeStartMode === 'resume' && claudeSessionId) {
798
+ const resumePrompt = editorStepLabel === 'Present'
799
+ ? 'The session was interrupted. Please rerun show-results.'
800
+ : 'The session was interrupted. Please continue where you left off.';
801
+ ptyProcess.write(`claude --resume ${shellQuote(claudeSessionId)} ${shellQuote(resumePrompt)}\r`);
802
+ }
803
+ else if (claudeStartMode === 'resume') {
804
+ // No session ID available — fall back to most recent session
805
+ const resumePrompt = editorStepLabel === 'Present'
806
+ ? 'The session was interrupted. Please rerun show-results.'
807
+ : 'The session was interrupted. Please continue where you left off.';
808
+ ptyProcess.write(`claude --continue ${shellQuote(resumePrompt)}\r`);
809
+ }
810
+ else {
811
+ // Fresh session: generate a trackable UUID
812
+ const newSessionId = crypto.randomUUID();
813
+ const sessionIdPath = path.join(safeCwd, '.codeyam', 'claude-session-id.txt');
814
+ try {
815
+ fs.mkdirSync(path.dirname(sessionIdPath), { recursive: true });
816
+ fs.writeFileSync(sessionIdPath, newSessionId, 'utf8');
817
+ }
818
+ catch (err) {
819
+ console.error('[terminalServer] Failed to write claude-session-id.txt:', err);
820
+ }
821
+ ptyProcess.write(`claude --session-id ${shellQuote(newSessionId)} ${shellQuote('/codeyam-editor')}\r`);
822
+ }
547
823
  }
548
824
  else if (hasContext) {
549
- ptyProcess.write("claude '/codeyam-dev-mode'\r");
825
+ ptyProcess.write(`claude ${shellQuote('/codeyam-dev-mode')}\r`);
550
826
  }
551
827
  else {
552
828
  ptyProcess.write('claude\r');
@@ -599,10 +875,36 @@ function detachSession(session, hasContext = false, hasClearedScreen = false) {
599
875
  * Send a refresh-preview message to all connected terminal WebSocket clients.
600
876
  * The Terminal component relays this to the parent page to reload the iframe.
601
877
  */
602
- export function broadcastPreviewRefresh(path) {
878
+ export function broadcastPreviewRefresh(path, scenarioId) {
603
879
  const msg = JSON.stringify({
604
880
  type: 'refresh-preview',
605
881
  ...(path && { path }),
882
+ ...(scenarioId && { scenarioId }),
883
+ });
884
+ let count = 0;
885
+ for (const session of sessions) {
886
+ try {
887
+ if (session.ws.readyState === WebSocket.OPEN) {
888
+ session.ws.send(msg);
889
+ count++;
890
+ }
891
+ }
892
+ catch {
893
+ // Ignore send errors
894
+ }
895
+ }
896
+ return count;
897
+ }
898
+ /**
899
+ * Notify all connected terminal WebSocket clients that a data mutation
900
+ * was forwarded to the real dev server (seed-based scenario).
901
+ * The Terminal component relays this to editor.tsx to show a save banner.
902
+ */
903
+ export function broadcastDataMutationForwarded(method, pathname) {
904
+ const msg = JSON.stringify({
905
+ type: 'data-mutation-forwarded',
906
+ method,
907
+ pathname,
606
908
  });
607
909
  let count = 0;
608
910
  for (const session of sessions) {
@@ -657,6 +959,46 @@ export function broadcastHideResults() {
657
959
  }
658
960
  return count;
659
961
  }
962
+ /**
963
+ * Notify the editor UI that the current feature is complete (after push/skip).
964
+ * The UI shows a transition overlay letting the user start fresh or continue.
965
+ */
966
+ export function broadcastFeatureComplete() {
967
+ const msg = JSON.stringify({ type: 'feature-complete' });
968
+ let count = 0;
969
+ for (const session of sessions) {
970
+ try {
971
+ if (session.ws.readyState === WebSocket.OPEN) {
972
+ session.ws.send(msg);
973
+ count++;
974
+ }
975
+ }
976
+ catch {
977
+ // Ignore send errors
978
+ }
979
+ }
980
+ return count;
981
+ }
982
+ /**
983
+ * Send a set-viewport message to all connected terminal WebSocket clients.
984
+ * The Terminal component relays this to the parent page to update the preview viewport.
985
+ */
986
+ export function broadcastSetViewport(viewport) {
987
+ const msg = JSON.stringify({ type: 'set-viewport', ...viewport });
988
+ let count = 0;
989
+ for (const session of sessions) {
990
+ try {
991
+ if (session.ws.readyState === WebSocket.OPEN) {
992
+ session.ws.send(msg);
993
+ count++;
994
+ }
995
+ }
996
+ catch {
997
+ // Ignore send errors
998
+ }
999
+ }
1000
+ return count;
1001
+ }
660
1002
  /**
661
1003
  * Kill all active PTY sessions and detached PTYs. Call during shutdown.
662
1004
  */