@codeyam/codeyam-cli 0.1.0-staging.4c0c3c9 → 0.1.0-staging.5369cbb

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 (887) 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 +24 -24
  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/astScopes/methodSemantics.ts +135 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/nodeToSource.ts +19 -0
  8. package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +11 -4
  9. package/analyzer-template/packages/ai/src/lib/completionCall.ts +114 -113
  10. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +295 -14
  11. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.ts +10 -3
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +16 -6
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.ts +35 -0
  15. package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +15 -6
  16. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +78 -2
  17. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +96 -33
  18. package/analyzer-template/packages/analyze/index.ts +4 -1
  19. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +19 -7
  20. package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
  21. package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -0
  22. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +28 -2
  23. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +14 -37
  24. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
  25. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +22 -6
  26. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +9 -12
  27. package/analyzer-template/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.ts +21 -0
  28. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +82 -10
  29. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
  30. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
  31. package/analyzer-template/packages/analyze/src/lib/files/analyzeNextRoute.ts +8 -3
  32. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +65 -28
  33. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +322 -58
  34. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
  35. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +1707 -1466
  36. package/analyzer-template/packages/aws/package.json +10 -10
  37. package/analyzer-template/packages/database/index.ts +1 -0
  38. package/analyzer-template/packages/database/package.json +4 -4
  39. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -0
  40. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +164 -0
  41. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +25 -15
  42. package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
  43. package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
  44. package/analyzer-template/packages/database/src/lib/loadEntity.ts +19 -8
  45. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
  46. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +94 -143
  47. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
  48. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
  49. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
  50. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
  51. package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
  52. package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
  53. package/analyzer-template/packages/github/dist/database/index.js +1 -0
  54. package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
  55. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  56. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  57. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +5 -0
  58. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  59. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +29 -0
  60. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
  61. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
  62. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  63. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
  64. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  65. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  66. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +7 -1
  67. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  68. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  69. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
  70. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  71. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  72. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
  73. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  74. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
  75. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
  76. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +5 -5
  77. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
  78. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  79. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  80. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  81. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  82. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +76 -90
  83. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
  85. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  86. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  87. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  89. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  90. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
  91. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  92. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  93. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  94. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  95. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  96. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  97. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  98. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
  99. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
  100. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  101. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  102. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
  103. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  104. package/analyzer-template/packages/github/package.json +1 -1
  105. package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
  106. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
  107. package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
  108. package/analyzer-template/packages/ui-components/package.json +1 -1
  109. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  110. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  111. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
  112. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
  113. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  114. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  115. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
  116. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  117. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
  118. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  119. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +28 -3
  120. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  121. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +41 -2
  122. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  123. package/analyzer-template/project/analyzeFileEntities.ts +26 -0
  124. package/analyzer-template/project/constructMockCode.ts +168 -48
  125. package/analyzer-template/project/orchestrateCapture.ts +4 -1
  126. package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
  127. package/analyzer-template/project/runMultiScenarioServer.ts +26 -3
  128. package/analyzer-template/project/start.ts +3 -0
  129. package/analyzer-template/project/startScenarioCapture.ts +9 -0
  130. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  131. package/analyzer-template/project/writeMockDataTsx.ts +17 -0
  132. package/analyzer-template/project/writeScenarioComponents.ts +110 -17
  133. package/analyzer-template/tsconfig.json +13 -1
  134. package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
  135. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  136. package/background/src/lib/virtualized/project/constructMockCode.js +143 -39
  137. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  138. package/background/src/lib/virtualized/project/orchestrateCapture.js +4 -1
  139. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  140. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
  141. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  142. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +23 -3
  143. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  144. package/background/src/lib/virtualized/project/start.js +2 -0
  145. package/background/src/lib/virtualized/project/start.js.map +1 -1
  146. package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
  147. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  148. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  149. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  150. package/background/src/lib/virtualized/project/writeMockDataTsx.js +12 -0
  151. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  152. package/background/src/lib/virtualized/project/writeScenarioComponents.js +83 -12
  153. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  154. package/codeyam-cli/scripts/apply-setup.js +208 -11
  155. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  156. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
  157. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
  158. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
  159. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
  160. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
  161. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
  162. package/codeyam-cli/src/cli.js +56 -25
  163. package/codeyam-cli/src/cli.js.map +1 -1
  164. package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js +47 -0
  165. package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js.map +1 -0
  166. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js +71 -0
  167. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js.map +1 -0
  168. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js +30 -0
  169. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js.map +1 -0
  170. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js +51 -0
  171. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js.map +1 -0
  172. package/codeyam-cli/src/commands/__tests__/editor.statePersistence.test.js +55 -0
  173. package/codeyam-cli/src/commands/__tests__/editor.statePersistence.test.js.map +1 -0
  174. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +56 -0
  175. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
  176. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +137 -47
  177. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
  178. package/codeyam-cli/src/commands/analyze.js +17 -7
  179. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  180. package/codeyam-cli/src/commands/default.js +14 -2
  181. package/codeyam-cli/src/commands/default.js.map +1 -1
  182. package/codeyam-cli/src/commands/editor.js +6311 -0
  183. package/codeyam-cli/src/commands/editor.js.map +1 -0
  184. package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js +23 -0
  185. package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js.map +1 -0
  186. package/codeyam-cli/src/commands/editorIsolateArgs.js +25 -0
  187. package/codeyam-cli/src/commands/editorIsolateArgs.js.map +1 -0
  188. package/codeyam-cli/src/commands/init.js +129 -45
  189. package/codeyam-cli/src/commands/init.js.map +1 -1
  190. package/codeyam-cli/src/commands/memory.js +89 -75
  191. package/codeyam-cli/src/commands/memory.js.map +1 -1
  192. package/codeyam-cli/src/commands/telemetry.js +37 -0
  193. package/codeyam-cli/src/commands/telemetry.js.map +1 -0
  194. package/codeyam-cli/src/data/designSystems.js +27 -0
  195. package/codeyam-cli/src/data/designSystems.js.map +1 -0
  196. package/codeyam-cli/src/data/techStacks.js +77 -0
  197. package/codeyam-cli/src/data/techStacks.js.map +1 -0
  198. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
  199. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
  200. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
  201. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
  202. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
  203. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
  204. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +181 -0
  205. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  206. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +4160 -0
  207. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  208. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
  209. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
  210. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
  211. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
  212. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
  213. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
  214. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js +100 -0
  215. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js.map +1 -0
  216. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +304 -0
  217. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  218. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +194 -0
  219. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
  220. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +381 -0
  221. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
  222. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
  223. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
  224. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
  225. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
  226. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +542 -0
  227. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  228. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +594 -0
  229. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
  230. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +435 -0
  231. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
  232. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  233. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  234. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +217 -0
  235. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  236. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +361 -0
  237. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  238. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +250 -0
  239. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
  240. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js +1108 -0
  241. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js.map +1 -0
  242. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
  243. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
  244. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +411 -0
  245. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
  246. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +1768 -0
  247. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  248. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +413 -0
  249. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
  250. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js +143 -0
  251. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js.map +1 -0
  252. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
  253. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
  254. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
  255. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
  256. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +2121 -0
  257. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
  258. package/codeyam-cli/src/utils/__tests__/envFile.test.js +125 -0
  259. package/codeyam-cli/src/utils/__tests__/envFile.test.js.map +1 -0
  260. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  261. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  262. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
  263. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
  264. package/codeyam-cli/src/utils/__tests__/handoffContext.test.js +500 -0
  265. package/codeyam-cli/src/utils/__tests__/handoffContext.test.js.map +1 -0
  266. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +122 -0
  267. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
  268. package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js +302 -0
  269. package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js.map +1 -0
  270. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js +26 -20
  271. package/codeyam-cli/src/utils/__tests__/npmVersionCheck.test.js.map +1 -1
  272. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
  273. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
  274. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  275. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  276. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  277. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  278. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
  279. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
  280. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
  281. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
  282. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +284 -0
  283. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
  284. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  285. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  286. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +672 -0
  287. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
  288. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js +84 -0
  289. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js.map +1 -0
  290. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +51 -4
  291. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  292. package/codeyam-cli/src/utils/__tests__/telemetry.test.js +159 -0
  293. package/codeyam-cli/src/utils/__tests__/telemetry.test.js.map +1 -0
  294. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
  295. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
  296. package/codeyam-cli/src/utils/__tests__/testRunner.test.js +216 -0
  297. package/codeyam-cli/src/utils/__tests__/testRunner.test.js.map +1 -0
  298. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +148 -0
  299. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
  300. package/codeyam-cli/src/utils/analysisRunner.js +39 -8
  301. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  302. package/codeyam-cli/src/utils/analyzer.js +19 -0
  303. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  304. package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
  305. package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
  306. package/codeyam-cli/src/utils/backgroundServer.js +105 -13
  307. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  308. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  309. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  310. package/codeyam-cli/src/utils/database.js +37 -2
  311. package/codeyam-cli/src/utils/database.js.map +1 -1
  312. package/codeyam-cli/src/utils/designSystemShowcase.js +810 -0
  313. package/codeyam-cli/src/utils/designSystemShowcase.js.map +1 -0
  314. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  315. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  316. package/codeyam-cli/src/utils/devServerState.js +71 -0
  317. package/codeyam-cli/src/utils/devServerState.js.map +1 -0
  318. package/codeyam-cli/src/utils/editorApi.js +95 -0
  319. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  320. package/codeyam-cli/src/utils/editorAudit.js +849 -0
  321. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  322. package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
  323. package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
  324. package/codeyam-cli/src/utils/editorCapture.js +102 -0
  325. package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
  326. package/codeyam-cli/src/utils/editorDeleteScenario.js +67 -0
  327. package/codeyam-cli/src/utils/editorDeleteScenario.js.map +1 -0
  328. package/codeyam-cli/src/utils/editorDevServer.js +197 -0
  329. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  330. package/codeyam-cli/src/utils/editorEntityChangeStatus.js +50 -0
  331. package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
  332. package/codeyam-cli/src/utils/editorEntityHelpers.js +144 -0
  333. package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
  334. package/codeyam-cli/src/utils/editorGuard.js +36 -0
  335. package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
  336. package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
  337. package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
  338. package/codeyam-cli/src/utils/editorJournal.js +225 -0
  339. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  340. package/codeyam-cli/src/utils/editorLoaderHelpers.js +152 -0
  341. package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
  342. package/codeyam-cli/src/utils/editorMigration.js +224 -0
  343. package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
  344. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  345. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  346. package/codeyam-cli/src/utils/editorPreloadHelpers.js +135 -0
  347. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  348. package/codeyam-cli/src/utils/editorPreview.js +139 -0
  349. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  350. package/codeyam-cli/src/utils/editorRecapture.js +109 -0
  351. package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
  352. package/codeyam-cli/src/utils/editorRoadmap.js +574 -0
  353. package/codeyam-cli/src/utils/editorRoadmap.js.map +1 -0
  354. package/codeyam-cli/src/utils/editorScenarioSwitch.js +149 -0
  355. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
  356. package/codeyam-cli/src/utils/editorScenarios.js +687 -0
  357. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  358. package/codeyam-cli/src/utils/editorSeedAdapter.js +475 -0
  359. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
  360. package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
  361. package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
  362. package/codeyam-cli/src/utils/entityChangeStatus.js +394 -0
  363. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
  364. package/codeyam-cli/src/utils/entityChangeStatus.server.js +227 -0
  365. package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
  366. package/codeyam-cli/src/utils/envFile.js +90 -0
  367. package/codeyam-cli/src/utils/envFile.js.map +1 -0
  368. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  369. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  370. package/codeyam-cli/src/utils/fileWatcher.js +63 -9
  371. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  372. package/codeyam-cli/src/utils/git.js +103 -0
  373. package/codeyam-cli/src/utils/git.js.map +1 -1
  374. package/codeyam-cli/src/utils/glossaryAdd.js +74 -0
  375. package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
  376. package/codeyam-cli/src/utils/handoffContext.js +257 -0
  377. package/codeyam-cli/src/utils/handoffContext.js.map +1 -0
  378. package/codeyam-cli/src/utils/install-skills.js +101 -15
  379. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  380. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  381. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  382. package/codeyam-cli/src/utils/manualEntityAnalysis.js +196 -0
  383. package/codeyam-cli/src/utils/manualEntityAnalysis.js.map +1 -0
  384. package/codeyam-cli/src/utils/npmVersionCheck.js +2 -2
  385. package/codeyam-cli/src/utils/npmVersionCheck.js.map +1 -1
  386. package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
  387. package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
  388. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  389. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  390. package/codeyam-cli/src/utils/progress.js +2 -2
  391. package/codeyam-cli/src/utils/progress.js.map +1 -1
  392. package/codeyam-cli/src/utils/project.js +15 -5
  393. package/codeyam-cli/src/utils/project.js.map +1 -1
  394. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  395. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  396. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js +159 -0
  397. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js.map +1 -0
  398. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  399. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  400. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  401. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  402. package/codeyam-cli/src/utils/queue/job.js +105 -7
  403. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  404. package/codeyam-cli/src/utils/queue/manager.js +7 -6
  405. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  406. package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
  407. package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
  408. package/codeyam-cli/src/utils/requireSimulations.js +1 -1
  409. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -1
  410. package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
  411. package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
  412. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +5 -6
  413. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -1
  414. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +1 -1
  415. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -1
  416. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +0 -1
  417. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -1
  418. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +2 -4
  419. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -1
  420. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +4 -6
  421. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -1
  422. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +1 -1
  423. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -1
  424. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js +83 -0
  425. package/codeyam-cli/src/utils/rules/__tests__/parser.test.js.map +1 -0
  426. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js +118 -0
  427. package/codeyam-cli/src/utils/rules/__tests__/pathMatcher.test.js.map +1 -0
  428. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js +72 -0
  429. package/codeyam-cli/src/utils/rules/__tests__/rulePlacement.test.js.map +1 -0
  430. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js +76 -0
  431. package/codeyam-cli/src/utils/rules/__tests__/sourceFiles.test.js.map +1 -0
  432. package/codeyam-cli/src/utils/rules/index.js +1 -0
  433. package/codeyam-cli/src/utils/rules/index.js.map +1 -1
  434. package/codeyam-cli/src/utils/rules/parser.js +14 -4
  435. package/codeyam-cli/src/utils/rules/parser.js.map +1 -1
  436. package/codeyam-cli/src/utils/rules/pathMatcher.js +34 -3
  437. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -1
  438. package/codeyam-cli/src/utils/rules/rulePlacement.js +65 -0
  439. package/codeyam-cli/src/utils/rules/rulePlacement.js.map +1 -0
  440. package/codeyam-cli/src/utils/rules/sourceFiles.js +43 -0
  441. package/codeyam-cli/src/utils/rules/sourceFiles.js.map +1 -0
  442. package/codeyam-cli/src/utils/scenarioCoverage.js +77 -0
  443. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
  444. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  445. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  446. package/codeyam-cli/src/utils/scenariosManifest.js +313 -0
  447. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  448. package/codeyam-cli/src/utils/screenshotHash.js +26 -0
  449. package/codeyam-cli/src/utils/screenshotHash.js.map +1 -0
  450. package/codeyam-cli/src/utils/serverState.js +57 -2
  451. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  452. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +83 -11
  453. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  454. package/codeyam-cli/src/utils/simulationGateMiddleware.js +175 -0
  455. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -0
  456. package/codeyam-cli/src/utils/slugUtils.js +25 -0
  457. package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
  458. package/codeyam-cli/src/utils/syncMocksMiddleware.js +7 -26
  459. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  460. package/codeyam-cli/src/utils/techStackConfig.js +38 -0
  461. package/codeyam-cli/src/utils/techStackConfig.js.map +1 -0
  462. package/codeyam-cli/src/utils/techStackConfig.test.js +85 -0
  463. package/codeyam-cli/src/utils/techStackConfig.test.js.map +1 -0
  464. package/codeyam-cli/src/utils/telemetry.js +106 -0
  465. package/codeyam-cli/src/utils/telemetry.js.map +1 -0
  466. package/codeyam-cli/src/utils/telemetryMiddleware.js +22 -0
  467. package/codeyam-cli/src/utils/telemetryMiddleware.js.map +1 -0
  468. package/codeyam-cli/src/utils/testResultCache.js +53 -0
  469. package/codeyam-cli/src/utils/testResultCache.js.map +1 -0
  470. package/codeyam-cli/src/utils/testResultCache.server.js +81 -0
  471. package/codeyam-cli/src/utils/testResultCache.server.js.map +1 -0
  472. package/codeyam-cli/src/utils/testResultCache.server.test.js +187 -0
  473. package/codeyam-cli/src/utils/testResultCache.server.test.js.map +1 -0
  474. package/codeyam-cli/src/utils/testResultCache.test.js +230 -0
  475. package/codeyam-cli/src/utils/testResultCache.test.js.map +1 -0
  476. package/codeyam-cli/src/utils/testRunner.js +350 -0
  477. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  478. package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
  479. package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
  480. package/codeyam-cli/src/utils/versionInfo.js +46 -0
  481. package/codeyam-cli/src/utils/versionInfo.js.map +1 -1
  482. package/codeyam-cli/src/utils/webappDetection.js +38 -3
  483. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  484. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +99 -0
  485. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -0
  486. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +129 -0
  487. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -0
  488. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +107 -0
  489. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
  490. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +762 -0
  491. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  492. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +315 -0
  493. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
  494. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js +135 -0
  495. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js.map +1 -0
  496. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +86 -0
  497. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
  498. package/codeyam-cli/src/webserver/app/lib/database.js +41 -27
  499. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  500. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  501. package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
  502. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  503. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js +34 -0
  504. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js.map +1 -0
  505. package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
  506. package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
  507. package/codeyam-cli/src/webserver/backgroundServer.js +141 -42
  508. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  509. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-DTBZZfSk.js +1 -0
  510. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-bwuHPyTa.js → EntityItem-BxclONWq.js} +5 -5
  511. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
  512. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BH0XDim7.js → EntityTypeIcon-BsnEOJZ_.js} +9 -9
  513. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-ByaELMbv.js +1 -0
  514. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-6WjVfhxX.js +25 -0
  515. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-ChX-Hp7W.js +3 -0
  516. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-BvMu2i-g.js → LoadingDots-By5zI316.js} +1 -1
  517. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-kgBTLoJD.js → LogViewer-C-9zQdXg.js} +3 -3
  518. package/codeyam-cli/src/webserver/build/client/assets/MiniClaudeChat-Bs2_Oua4.js +36 -0
  519. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-BzPgx-xO.js → ReportIssueModal-DQsceHVv.js} +4 -4
  520. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DThcm_9M.js +1 -0
  521. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-BX2Ny2Qj.js → ScenarioViewer-Cl4oOA3A.js} +3 -3
  522. package/codeyam-cli/src/webserver/build/client/assets/Spinner-CIil5-gb.js +34 -0
  523. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
  524. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-BqkA9zyZ.js +1 -0
  525. package/codeyam-cli/src/webserver/build/client/assets/{_index-BRx8ZGZo.js → _index-DnOgyseQ.js} +4 -4
  526. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-4S4yPfFw.js → activity.(_tab)-DqM9hbNE.js} +8 -8
  527. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  528. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  529. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-C58dYPwR.js +1 -0
  530. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  531. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-B8NCeOrm.js +22 -0
  532. package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
  533. package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
  534. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  535. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  536. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  537. package/codeyam-cli/src/webserver/build/client/assets/api.editor-database-verify-l0sNRNKZ.js +1 -0
  538. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  539. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  540. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  541. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  542. package/codeyam-cli/src/webserver/build/client/assets/api.editor-github-verify-l0sNRNKZ.js +1 -0
  543. package/codeyam-cli/src/webserver/build/client/assets/api.editor-handoff-l0sNRNKZ.js +1 -0
  544. package/codeyam-cli/src/webserver/build/client/assets/api.editor-hosting-verify-l0sNRNKZ.js +1 -0
  545. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  546. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  547. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  548. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  549. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  550. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  551. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  552. package/codeyam-cli/src/webserver/build/client/assets/api.editor-recapture-stale-l0sNRNKZ.js +1 -0
  553. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  554. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  555. package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
  556. package/codeyam-cli/src/webserver/build/client/assets/api.editor-roadmap-l0sNRNKZ.js +1 -0
  557. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
  558. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
  559. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
  560. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  561. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  562. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
  563. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
  564. package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
  565. package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
  566. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  567. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  568. package/codeyam-cli/src/webserver/build/client/assets/api.editor-verify-routes-l0sNRNKZ.js +1 -0
  569. package/codeyam-cli/src/webserver/build/client/assets/api.interactive-switch-scenario-l0sNRNKZ.js +1 -0
  570. package/codeyam-cli/src/webserver/build/client/assets/api.rule-path-l0sNRNKZ.js +1 -0
  571. package/codeyam-cli/src/webserver/build/client/assets/{book-open-D4IPYH_y.js → book-open-BFSIqZgO.js} +2 -2
  572. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-CG65viiV.js → chevron-down-B9fDzFVh.js} +2 -2
  573. package/codeyam-cli/src/webserver/build/client/assets/chunk-UVKPFVEO-Bmq2apuh.js +43 -0
  574. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-igfMr5DY.js → circle-check-DLPObLUx.js} +2 -2
  575. package/codeyam-cli/src/webserver/build/client/assets/{copy-Coc4o_8c.js → copy-DXEmO0TD.js} +3 -3
  576. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BwyFiRot.js +41 -0
  577. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-Coe5NhbS.js +1 -0
  578. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-DoA97ML3.svg} +2 -2
  579. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-iRhRIFlp.js +1 -0
  580. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-BZPBzV73.js +1 -0
  581. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DOXe0Qx7.js +161 -0
  582. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-C6fEYHrh.js +41 -0
  583. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-B0h9AqE6.js → entity._sha._-pc-vc6wO.js} +14 -13
  584. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-C8AyYgYT.js +6 -0
  585. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DziaVQX1.js +6 -0
  586. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-BTcpgIpC.js +6 -0
  587. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-PePWg17F.js → entity._sha_.edit._scenarioId-D_O_ajfZ.js} +2 -2
  588. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-I-Wo99C_.js → entry.client-j1Vi0bco.js} +6 -6
  589. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
  590. package/codeyam-cli/src/webserver/build/client/assets/files-kuny2Q_s.js +1 -0
  591. package/codeyam-cli/src/webserver/build/client/assets/git-DgCZPMie.js +1 -0
  592. package/codeyam-cli/src/webserver/build/client/assets/globals-L-aUIeux.css +1 -0
  593. package/codeyam-cli/src/webserver/build/client/assets/{index-_417gcQW.js → index-BliGSSpl.js} +1 -1
  594. package/codeyam-cli/src/webserver/build/client/assets/index-SqjQKTdH.js +15 -0
  595. package/codeyam-cli/src/webserver/build/client/assets/{index-CUM5iXwc.js → index-vyrZD2g4.js} +1 -1
  596. package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
  597. package/codeyam-cli/src/webserver/build/client/assets/labs-c3yLxSEp.js +1 -0
  598. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-TzRHMVog.js → loader-circle-D-q28GLF.js} +2 -2
  599. package/codeyam-cli/src/webserver/build/client/assets/manifest-30c44d84.js +1 -0
  600. package/codeyam-cli/src/webserver/build/client/assets/memory-CEWIUC4t.js +101 -0
  601. package/codeyam-cli/src/webserver/build/client/assets/{pause-hjzB7t2z.js → pause-BP6fitdh.js} +3 -3
  602. package/codeyam-cli/src/webserver/build/client/assets/root-CLedrjXQ.js +80 -0
  603. package/codeyam-cli/src/webserver/build/client/assets/{search-DcAwD_Ln.js → search-BooqacKS.js} +2 -2
  604. package/codeyam-cli/src/webserver/build/client/assets/settings-BM0nbryO.js +1 -0
  605. package/codeyam-cli/src/webserver/build/client/assets/simulations-ovy6FjRY.js +1 -0
  606. package/codeyam-cli/src/webserver/build/client/assets/{terminal-DbEAHMbA.js → terminal-DHemCJIs.js} +3 -3
  607. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-CAD5b1o_.js → triangle-alert-D87ekDl8.js} +2 -2
  608. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-Dk0Tciqg.js +1 -0
  609. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C8QvIe05.js +2 -0
  610. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-jkCytuYz.js +1 -0
  611. package/codeyam-cli/src/webserver/build/client/assets/useToast-BgqkixU9.js +1 -0
  612. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  613. package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
  614. package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-CuR5TvUx.js +16 -0
  615. package/codeyam-cli/src/webserver/build/server/assets/index-D4MWAsqb.js +1 -0
  616. package/codeyam-cli/src/webserver/build/server/assets/init-JObA4lXD.js +14 -0
  617. package/codeyam-cli/src/webserver/build/server/assets/progress-CHTtrxFG.js +1 -0
  618. package/codeyam-cli/src/webserver/build/server/assets/server-build-i8OXK4oL.js +765 -0
  619. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  620. package/codeyam-cli/src/webserver/build-info.json +5 -5
  621. package/codeyam-cli/src/webserver/devServer.js +39 -5
  622. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  623. package/codeyam-cli/src/webserver/editorProxy.js +1101 -0
  624. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  625. package/codeyam-cli/src/webserver/idleDetector.js +130 -0
  626. package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
  627. package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
  628. package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
  629. package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
  630. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
  631. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +283 -0
  632. package/codeyam-cli/src/webserver/server.js +446 -1
  633. package/codeyam-cli/src/webserver/server.js.map +1 -1
  634. package/codeyam-cli/src/webserver/terminalServer.js +1026 -0
  635. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  636. package/codeyam-cli/templates/__tests__/editor-step-hook.prompt-capture.test.ts +118 -0
  637. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  638. package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
  639. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  640. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  641. package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
  642. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  643. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  644. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  645. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  646. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  647. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  648. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  649. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  650. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
  651. package/codeyam-cli/templates/codeyam-editor-claude.md +149 -0
  652. package/codeyam-cli/templates/codeyam-editor-codex.md +61 -0
  653. package/codeyam-cli/templates/codeyam-editor-gemini.md +59 -0
  654. package/codeyam-cli/templates/codeyam-editor-reference.md +216 -0
  655. package/codeyam-cli/templates/design-systems/clean-dashboard-design-system.md +255 -0
  656. package/codeyam-cli/templates/design-systems/editorial-design-system.md +267 -0
  657. package/codeyam-cli/templates/design-systems/mono-brutalist-design-system.md +256 -0
  658. package/codeyam-cli/templates/design-systems/neo-brutalist-design-system.md +294 -0
  659. package/codeyam-cli/templates/editor-step-hook.py +368 -0
  660. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +288 -0
  661. package/codeyam-cli/templates/expo-react-native/README.md +41 -0
  662. package/codeyam-cli/templates/expo-react-native/__tests__/.gitkeep +0 -0
  663. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +15 -0
  664. package/codeyam-cli/templates/expo-react-native/app/index.tsx +36 -0
  665. package/codeyam-cli/templates/expo-react-native/app.json +29 -0
  666. package/codeyam-cli/templates/expo-react-native/babel.config.js +10 -0
  667. package/codeyam-cli/templates/expo-react-native/gitignore +14 -0
  668. package/codeyam-cli/templates/expo-react-native/global.css +10 -0
  669. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  670. package/codeyam-cli/templates/expo-react-native/lib/theme.ts +73 -0
  671. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  672. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  673. package/codeyam-cli/templates/expo-react-native/package.json +54 -0
  674. package/codeyam-cli/templates/expo-react-native/patches/expo-modules-autolinking+3.0.24.patch +29 -0
  675. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  676. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  677. package/codeyam-cli/templates/hooks/staleness-check.sh +43 -0
  678. package/codeyam-cli/templates/isolation-route/expo-router.tsx.template +54 -0
  679. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  680. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  681. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  682. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  683. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  684. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  685. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  686. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  687. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
  688. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  689. package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
  690. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  691. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  692. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  693. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  694. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +24 -0
  695. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  696. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  697. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  698. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +65 -0
  699. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  700. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +39 -0
  701. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  702. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  703. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +40 -0
  704. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  705. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +140 -0
  706. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  707. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  708. package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
  709. package/codeyam-cli/templates/nextjs-prisma-supabase/SUPABASE_SETUP.md +104 -0
  710. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  711. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  712. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  713. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  714. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  715. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  716. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  717. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  718. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  719. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  720. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
  721. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  722. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  723. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  724. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  725. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  726. package/codeyam-cli/templates/prompts/conversation-guidance.txt +44 -0
  727. package/codeyam-cli/templates/prompts/conversation-prompt.txt +28 -0
  728. package/codeyam-cli/templates/prompts/interruption-prompt.txt +31 -0
  729. package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +24 -0
  730. package/codeyam-cli/templates/rule-notification-hook.py +44 -17
  731. package/codeyam-cli/templates/rule-reflection-hook.py +25 -5
  732. package/codeyam-cli/templates/rules-instructions.md +34 -88
  733. package/codeyam-cli/templates/seed-adapters/supabase.ts +475 -0
  734. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +237 -0
  735. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +244 -0
  736. package/codeyam-cli/templates/{codeyam-memory.md → skills/codeyam-memory/SKILL.md} +215 -0
  737. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  738. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  739. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  740. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  741. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  742. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  743. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  744. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  745. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  746. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  747. package/codeyam-cli/templates/{codeyam-new-rule.md → skills/codeyam-new-rule/SKILL.md} +0 -2
  748. package/package.json +22 -14
  749. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
  750. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  751. package/packages/ai/src/lib/astScopes/methodSemantics.js +99 -0
  752. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  753. package/packages/ai/src/lib/astScopes/nodeToSource.js +16 -0
  754. package/packages/ai/src/lib/astScopes/nodeToSource.js.map +1 -1
  755. package/packages/ai/src/lib/astScopes/paths.js +12 -3
  756. package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
  757. package/packages/ai/src/lib/completionCall.js +10 -7
  758. package/packages/ai/src/lib/completionCall.js.map +1 -1
  759. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +261 -13
  760. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  761. package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js +9 -2
  762. package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js.map +1 -1
  763. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +14 -4
  764. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  765. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  766. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  767. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  768. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  769. package/packages/ai/src/lib/dataStructureChunking.js +9 -5
  770. package/packages/ai/src/lib/dataStructureChunking.js.map +1 -1
  771. package/packages/ai/src/lib/generateEntityScenarioData.js +57 -2
  772. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  773. package/packages/ai/src/lib/generateExecutionFlows.js +81 -11
  774. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  775. package/packages/analyze/index.js +1 -1
  776. package/packages/analyze/index.js.map +1 -1
  777. package/packages/analyze/src/lib/ProjectAnalyzer.js +13 -4
  778. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  779. package/packages/analyze/src/lib/asts/index.js +4 -2
  780. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  781. package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -0
  782. package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
  783. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +16 -2
  784. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  785. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +14 -27
  786. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  787. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
  788. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  789. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +12 -2
  790. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  791. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +9 -7
  792. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  793. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js +14 -0
  794. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
  795. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +44 -11
  796. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  797. package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
  798. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  799. package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
  800. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  801. package/packages/analyze/src/lib/files/analyzeNextRoute.js +5 -1
  802. package/packages/analyze/src/lib/files/analyzeNextRoute.js.map +1 -1
  803. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +54 -27
  804. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -1
  805. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +185 -28
  806. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  807. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
  808. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  809. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +1386 -1197
  810. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  811. package/packages/database/index.js +1 -0
  812. package/packages/database/index.js.map +1 -1
  813. package/packages/database/src/lib/kysely/db.js +5 -0
  814. package/packages/database/src/lib/kysely/db.js.map +1 -1
  815. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +149 -0
  816. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  817. package/packages/database/src/lib/loadAnalysis.js +7 -1
  818. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  819. package/packages/database/src/lib/loadCommits.js +23 -13
  820. package/packages/database/src/lib/loadCommits.js.map +1 -1
  821. package/packages/database/src/lib/loadEntities.js +0 -6
  822. package/packages/database/src/lib/loadEntities.js.map +1 -1
  823. package/packages/database/src/lib/loadEntity.js +5 -5
  824. package/packages/database/src/lib/loadEntity.js.map +1 -1
  825. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  826. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  827. package/packages/database/src/lib/updateCommitMetadata.js +76 -90
  828. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  829. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  830. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  831. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  832. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  833. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  834. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  835. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  836. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  837. package/packages/types/src/enums/ProjectFramework.js +2 -0
  838. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  839. package/packages/utils/src/lib/fs/rsyncCopy.js +28 -3
  840. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  841. package/scripts/npm-post-install.cjs +34 -0
  842. package/codeyam-cli/src/commands/detect-universal-mocks.js +0 -120
  843. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +0 -1
  844. package/codeyam-cli/src/commands/list.js +0 -31
  845. package/codeyam-cli/src/commands/list.js.map +0 -1
  846. package/codeyam-cli/src/commands/webapp-info.js +0 -146
  847. package/codeyam-cli/src/commands/webapp-info.js.map +0 -1
  848. package/codeyam-cli/src/utils/universal-mocks.js +0 -152
  849. package/codeyam-cli/src/utils/universal-mocks.js.map +0 -1
  850. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-jNYXRRNI.js +0 -1
  851. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CvzqMxcu.js +0 -1
  852. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-EhOseatT.js +0 -34
  853. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-yjIHlOGa.js +0 -25
  854. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-Cq5o8jL4.js +0 -3
  855. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-CwZrv-Ok.js +0 -1
  856. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CDpEprKa.js +0 -1
  857. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-DHKuQSmR.js +0 -17
  858. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-DB3aFuEO.js +0 -51
  859. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-D1zB-pYc.js +0 -21
  860. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
  861. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-JTAjQ54M.js +0 -1
  862. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DjLxr2JB.js +0 -6
  863. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-CtYowLOt.js +0 -6
  864. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-9sMMAiWJ.js +0 -1
  865. package/codeyam-cli/src/webserver/build/client/assets/files-Co65J0s3.js +0 -1
  866. package/codeyam-cli/src/webserver/build/client/assets/git-BdHOxVfg.js +0 -15
  867. package/codeyam-cli/src/webserver/build/client/assets/globals-CCgBKWy4.css +0 -1
  868. package/codeyam-cli/src/webserver/build/client/assets/labs-BK0C1H1T.js +0 -1
  869. package/codeyam-cli/src/webserver/build/client/assets/manifest-390cb8fa.js +0 -1
  870. package/codeyam-cli/src/webserver/build/client/assets/memory-CzZySbBE.js +0 -78
  871. package/codeyam-cli/src/webserver/build/client/assets/root-DnbDhvTU.js +0 -62
  872. package/codeyam-cli/src/webserver/build/client/assets/settings-CclxrcPK.js +0 -1
  873. package/codeyam-cli/src/webserver/build/client/assets/simulations-DVNJVQgD.js +0 -1
  874. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BqgrAzs3.js +0 -1
  875. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-DAFqfEDH.js +0 -2
  876. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-DZlYx2c4.js +0 -1
  877. package/codeyam-cli/src/webserver/build/client/assets/useToast-ihdMtlf6.js +0 -1
  878. package/codeyam-cli/src/webserver/build/server/assets/index-CxaRxKVt.js +0 -1
  879. package/codeyam-cli/src/webserver/build/server/assets/server-build-D4DT0nM_.js +0 -259
  880. package/codeyam-cli/templates/codeyam-stop-hook.sh +0 -284
  881. package/scripts/finalize-analyzer.cjs +0 -13
  882. /package/codeyam-cli/templates/{codeyam-diagnose.md → commands/codeyam-diagnose.md} +0 -0
  883. /package/codeyam-cli/templates/{codeyam-debug.md → skills/codeyam-debug/SKILL.md} +0 -0
  884. /package/codeyam-cli/templates/{codeyam-setup.md → skills/codeyam-setup/SKILL.md} +0 -0
  885. /package/codeyam-cli/templates/{codeyam-sim.md → skills/codeyam-sim/SKILL.md} +0 -0
  886. /package/codeyam-cli/templates/{codeyam-test.md → skills/codeyam-test/SKILL.md} +0 -0
  887. /package/codeyam-cli/templates/{codeyam-verify.md → skills/codeyam-verify/SKILL.md} +0 -0
@@ -0,0 +1,1026 @@
1
+ var _a, _b;
2
+ import { WebSocketServer, WebSocket } from 'ws';
3
+ import crypto from 'crypto';
4
+ import fs from 'fs';
5
+ import os from 'os';
6
+ import path from 'path';
7
+ import * as pty from 'node-pty';
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
+ }
103
+ // Use globalThis so the sessions Set is shared across module instances.
104
+ // In Vite dev mode, this file is loaded twice: once by the Vite plugin (Node.js native)
105
+ // and once by the SSR context (ssrLoadModule). Without globalThis, each instance
106
+ // gets its own empty Set — so broadcastPreviewRefresh() called from the SSR instance
107
+ // (via the /api/dev-mode-preview endpoint) would broadcast to 0 sessions.
108
+ const sessions = ((_a = globalThis).__codeyamTerminalSessions ?? (_a.__codeyamTerminalSessions = new Set()));
109
+ // Detached PTYs waiting for reconnection (keyed by sessionId).
110
+ // When a WebSocket drops, the PTY is moved here with a grace timer
111
+ // instead of being killed immediately, allowing the client to reconnect.
112
+ const detachedPtys = ((_b = globalThis).__codeyamDetachedPtys ?? (_b.__codeyamDetachedPtys = new Map()));
113
+ const PING_INTERVAL_MS = 30000;
114
+ const DETACH_GRACE_MS = 60000;
115
+ const OUTPUT_BUFFER_MAX = 8 * 1024; // 8KB
116
+ // Ping interval reference — shared so cleanup can clear it
117
+ let pingInterval = globalThis.__codeyamPingInterval ?? null;
118
+ // Keys to forward from the server env into the PTY shell.
119
+ // Keeps the env clean (no giant CODEYAM_PROJECT JSON blobs) while
120
+ // preserving everything Claude Code and the user's shell need.
121
+ const ENV_PASSTHROUGH_KEYS = [
122
+ 'PATH',
123
+ 'HOME',
124
+ 'USER',
125
+ 'LOGNAME',
126
+ 'SHELL',
127
+ 'TERM',
128
+ 'LANG',
129
+ 'LC_ALL',
130
+ 'LC_CTYPE',
131
+ 'EDITOR',
132
+ 'VISUAL',
133
+ 'TMPDIR',
134
+ 'XDG_CONFIG_HOME',
135
+ 'XDG_DATA_HOME',
136
+ 'XDG_CACHE_HOME',
137
+ // API keys Claude Code may need
138
+ 'ANTHROPIC_API_KEY',
139
+ 'OPENAI_API_KEY',
140
+ // nvm / fnm / volta node version managers
141
+ 'NVM_DIR',
142
+ 'NVM_BIN',
143
+ 'FNM_DIR',
144
+ 'VOLTA_HOME',
145
+ // Homebrew
146
+ 'HOMEBREW_PREFIX',
147
+ 'HOMEBREW_CELLAR',
148
+ 'HOMEBREW_REPOSITORY',
149
+ ];
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) {
161
+ const env = {};
162
+ const keys = process.platform === 'win32'
163
+ ? [...ENV_PASSTHROUGH_KEYS, ...WINDOWS_ENV_PASSTHROUGH_KEYS]
164
+ : ENV_PASSTHROUGH_KEYS;
165
+ for (const key of keys) {
166
+ const val = process.env[key];
167
+ if (val != null)
168
+ env[key] = val;
169
+ }
170
+ // Always set TERM for proper terminal behavior
171
+ if (!env.TERM)
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
+ }
178
+ return env;
179
+ }
180
+ /**
181
+ * Returns the shell executable and arguments for PTY spawning,
182
+ * handling platform differences (Windows uses PowerShell, Unix uses $SHELL).
183
+ */
184
+ export function getShellConfig() {
185
+ if (process.platform === 'win32') {
186
+ return { shell: 'powershell.exe', args: [] };
187
+ }
188
+ const defaultShell = process.platform === 'darwin' ? '/bin/zsh' : '/bin/sh';
189
+ return {
190
+ shell: process.env.SHELL || defaultShell,
191
+ args: ['-l'],
192
+ };
193
+ }
194
+ /**
195
+ * Returns a safe working directory for the PTY, falling back through
196
+ * CODEYAM_ROOT_PATH → cwd → HOME/USERPROFILE → os.tmpdir().
197
+ */
198
+ export function getSafeCwd() {
199
+ const cwd = process.env.CODEYAM_ROOT_PATH || process.cwd();
200
+ if (fs.existsSync(cwd))
201
+ return cwd;
202
+ const home = process.platform === 'win32'
203
+ ? process.env.USERPROFILE || process.env.HOME
204
+ : process.env.HOME;
205
+ if (home && fs.existsSync(home))
206
+ return home;
207
+ return os.tmpdir();
208
+ }
209
+ /**
210
+ * Convert a name to a safe file name matching CodeYam's convention.
211
+ * e.g. "Default Scenario" -> "Default_Scenario"
212
+ */
213
+ function safeFileName(name) {
214
+ const safe = name.replace(/[^a-zA-Z0-9_]+/g, '_').replace(/^_+|_+$/g, '');
215
+ return safe.slice(0, 1).toUpperCase() + safe.slice(1);
216
+ }
217
+ /**
218
+ * Find the actual mock data file for a scenario in the tmp project.
219
+ * Tries a fast heuristic (extract app dir from entity file path) first,
220
+ * then falls back to a shallow directory search.
221
+ */
222
+ function findMockDataFile(projectRoot, entityFilePath, scenarioName) {
223
+ const scenarioSlug = safeFileName(scenarioName);
224
+ const mockFile = `MockData_${scenarioSlug}.tsx`;
225
+ // Heuristic: the __codeyamMocks__ dir lives at the app directory level.
226
+ // Extract "app/" (or "src/", "pages/") from the entity's file path.
227
+ if (entityFilePath) {
228
+ const parts = entityFilePath.split('/');
229
+ for (let i = 0; i < parts.length; i++) {
230
+ if (['app', 'src', 'pages'].includes(parts[i])) {
231
+ const appDir = parts.slice(0, i + 1).join('/');
232
+ const candidate = path.join(projectRoot, appDir, '__codeyamMocks__', mockFile);
233
+ if (fs.existsSync(candidate))
234
+ return candidate;
235
+ }
236
+ }
237
+ }
238
+ // Fallback: search __codeyamMocks__ directories up to 5 levels deep
239
+ function searchDir(dir, depth) {
240
+ if (depth > 5)
241
+ return null;
242
+ try {
243
+ for (const entry of fs.readdirSync(dir)) {
244
+ if (entry === 'node_modules' ||
245
+ entry === '.git' ||
246
+ entry === 'coverage')
247
+ continue;
248
+ const full = path.join(dir, entry);
249
+ if (entry === '__codeyamMocks__') {
250
+ const candidate = path.join(full, mockFile);
251
+ if (fs.existsSync(candidate))
252
+ return candidate;
253
+ continue;
254
+ }
255
+ try {
256
+ if (fs.statSync(full).isDirectory()) {
257
+ const result = searchDir(full, depth + 1);
258
+ if (result)
259
+ return result;
260
+ }
261
+ }
262
+ catch {
263
+ // Permission error or broken symlink
264
+ }
265
+ }
266
+ }
267
+ catch {
268
+ // Directory unreadable
269
+ }
270
+ return null;
271
+ }
272
+ return searchDir(projectRoot, 0);
273
+ }
274
+ /**
275
+ * Write a structured context file for the codeyam-dev-mode skill.
276
+ * The skill reads this file on startup instead of receiving a long CLI argument.
277
+ * Returns true if context was written successfully, false otherwise.
278
+ */
279
+ function writeDevModeContext(ctx) {
280
+ if (!ctx.entityName)
281
+ return false;
282
+ const codeyamRoot = process.env.CODEYAM_ROOT_PATH || process.cwd();
283
+ const contextDir = path.join(codeyamRoot, '.codeyam');
284
+ const contextPath = path.join(contextDir, 'dev-mode-context.md');
285
+ try {
286
+ fs.mkdirSync(contextDir, { recursive: true });
287
+ const lines = ['# Dev Mode Context', ''];
288
+ // Entity section
289
+ lines.push('## Entity');
290
+ lines.push(`- **Name:** ${ctx.entityName}`);
291
+ if (ctx.entityType)
292
+ lines.push(`- **Type:** ${ctx.entityType}`);
293
+ if (ctx.entitySha)
294
+ lines.push(`- **SHA:** ${ctx.entitySha}`);
295
+ if (ctx.entityFilePath)
296
+ lines.push(`- **Source file:** ${ctx.entityFilePath}`);
297
+ lines.push('');
298
+ // Scenario section
299
+ if (ctx.scenarioName) {
300
+ lines.push('## Scenario');
301
+ lines.push(`- **Name:** ${ctx.scenarioName}`);
302
+ if (ctx.scenarioDescription)
303
+ lines.push(`- **Description:** ${ctx.scenarioDescription}`);
304
+ if (ctx.analysisId)
305
+ lines.push(`- **Analysis ID:** ${ctx.analysisId}`);
306
+ lines.push('');
307
+ }
308
+ // Files section
309
+ lines.push('## Files');
310
+ if (ctx.entityFilePath) {
311
+ lines.push(`- **Source file:** ${ctx.entityFilePath}`);
312
+ }
313
+ if (ctx.projectSlug && ctx.scenarioName) {
314
+ const tmpBase = `/tmp/codeyam/local-dev/${ctx.projectSlug}`;
315
+ const tmpProject = `${tmpBase}/project`;
316
+ const mockDataPath = findMockDataFile(tmpProject, ctx.entityFilePath, ctx.scenarioName);
317
+ if (mockDataPath) {
318
+ lines.push(`- **Mock data:** ${mockDataPath}`);
319
+ }
320
+ else {
321
+ const scenarioSlug = safeFileName(ctx.scenarioName);
322
+ lines.push(`- **Mock data:** search for \`MockData_${scenarioSlug}.tsx\` in \`__codeyamMocks__\` under ${tmpProject}`);
323
+ }
324
+ lines.push(`- **Dev server project:** ${tmpProject}`);
325
+ lines.push(`- **Server log:** ${tmpBase}/codeyam/log.txt`);
326
+ }
327
+ lines.push('');
328
+ // Database
329
+ lines.push('## Database');
330
+ lines.push(`- **Path:** .codeyam/db.sqlite3`);
331
+ lines.push('');
332
+ // Server
333
+ const serverPort = process.env.CODEYAM_PORT || '3111';
334
+ lines.push('## Server');
335
+ 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)`);
336
+ lines.push('');
337
+ fs.writeFileSync(contextPath, lines.join('\n'), 'utf8');
338
+ return true;
339
+ }
340
+ catch (error) {
341
+ console.error('[terminalServer] Failed to write dev-mode-context.md:', error);
342
+ return false;
343
+ }
344
+ }
345
+ /**
346
+ * Write a structured context file for the codeyam-editor skill.
347
+ * Returns true if context was written successfully, false otherwise.
348
+ */
349
+ function writeEditorModeContext(ctx) {
350
+ if (!ctx.projectSlug)
351
+ return false;
352
+ const codeyamRoot = process.env.CODEYAM_ROOT_PATH || process.cwd();
353
+ const contextDir = path.join(codeyamRoot, '.codeyam');
354
+ const contextPath = path.join(contextDir, 'editor-mode-context.md');
355
+ try {
356
+ fs.mkdirSync(contextDir, { recursive: true });
357
+ const serverPort = process.env.CODEYAM_PORT || '3111';
358
+ const proxyPort = parseInt(serverPort, 10) + 1;
359
+ const lines = [
360
+ '# Editor Mode Context',
361
+ '',
362
+ '## Project',
363
+ `- **Root:** ${codeyamRoot}`,
364
+ `- **Slug:** ${ctx.projectSlug}`,
365
+ '',
366
+ '## Server',
367
+ `- **Port:** ${serverPort}`,
368
+ `- **Dashboard:** http://localhost:${serverPort}/editor`,
369
+ `- **Proxy:** http://localhost:${proxyPort} (used by the browser iframe only — do NOT use for health checks)`,
370
+ '',
371
+ '## Workflow',
372
+ '- **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)',
373
+ '- Each feature follows 18 steps — run `codeyam editor steps` to see what to do next. Never expose `codeyam editor` commands to the user.',
374
+ '- **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.',
375
+ '- Steps 1, 5, 15, and 18 require user confirmation before proceeding',
376
+ '',
377
+ '## Preview Updates',
378
+ '- **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.',
379
+ `- **Refresh command:** \`curl -s -X POST http://localhost:${serverPort}/api/dev-mode-preview -H 'Content-Type: application/json' -d '{"dimension":"Desktop"}'\` (dimension is REQUIRED)`,
380
+ '- Aim for 4-8+ preview updates during a typical building session.',
381
+ '',
382
+ '## Verifying the Dev Server',
383
+ '- Get the dev server URL: `curl -s http://localhost:' +
384
+ serverPort +
385
+ '/api/editor-dev-server` → look at the `"url"` field (e.g., `http://localhost:3000`)',
386
+ '- Verify pages and API routes: `codeyam editor verify-routes \'{"paths":["/"],"apiRoutes":["/api/your-route"]}\'` (checks HTTP status and JSON validity)',
387
+ '- **NEVER check localhost:' +
388
+ proxyPort +
389
+ ' for health** — the proxy returns 200 even when the app is broken',
390
+ '',
391
+ '## API Endpoints',
392
+ `- **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\``,
393
+ `- **Get active scenario data:** \`curl http://localhost:${serverPort}/api/editor-scenario-data\``,
394
+ `- **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.`,
395
+ `- **Refresh config:** \`curl -X POST http://localhost:${serverPort}/api/editor-refresh\` (also starts dev server if a webapp is detected)`,
396
+ `- **Dev server status:** \`curl http://localhost:${serverPort}/api/editor-dev-server\``,
397
+ `- **Start dev server:** \`curl -X POST http://localhost:${serverPort}/api/editor-dev-server -H 'Content-Type: application/json' -d '{"action":"start"}'\``,
398
+ `- **Restart dev server:** \`curl -X POST http://localhost:${serverPort}/api/editor-dev-server -H 'Content-Type: application/json' -d '{"action":"restart"}'\``,
399
+ `- **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.`,
400
+ `- **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)`,
401
+ `- **Journal screenshot:** \`curl -X POST http://localhost:${serverPort}/api/editor-journal-screenshot -H 'Content-Type: application/json' -d '{"url":"...","filename":"..."}'\``,
402
+ `- **Journal entry:** \`curl -X POST http://localhost:${serverPort}/api/editor-journal-entry -H 'Content-Type: application/json' -d '{"title":"...","type":"feature","description":"..."}'\``,
403
+ '',
404
+ '## Scenario Data Format',
405
+ '- Use **route-keyed** mock data: keys are the API paths your app fetches',
406
+ '- Example: `{ "routes": { "/api/tasks": { "body": [...] }, "/api/users": { "body": [...] } } }`',
407
+ '- Error scenarios: `{ "routes": { "/api/tasks": { "status": 500, "body": { "error": "..." } } } }`',
408
+ '- The proxy intercepts GET requests to matching routes and returns the mock data',
409
+ '- POST/PUT/DELETE always go through to the real dev server',
410
+ '',
411
+ '## Component Isolation Routes',
412
+ '- Create isolation route dirs: `codeyam editor isolate ComponentA ComponentB ...`',
413
+ ' - This creates the layout guard and a directory per component under `app/isolated-components/`',
414
+ '- Create ONE isolation route page per component:',
415
+ ' - **Remix:** `app/routes/isolated-components.ComponentName.tsx` → `/isolated-components/ComponentName`',
416
+ ' - **Next.js:** `app/isolated-components/ComponentName/page.tsx` → `/isolated-components/ComponentName`',
417
+ ' - **Expo:** `app/isolated-components/ComponentName.tsx` → `/isolated-components/ComponentName` (use `useLocalSearchParams` from expo-router)',
418
+ '- The route defines a `scenarios` object mapping scenario names to props, reads `?s=ScenarioName` from the URL, and renders the component',
419
+ '- 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)',
420
+ '- For Expo: Wrap with `<View nativeID="codeyam-capture">` (nativeID maps to id on web for screenshot capture)',
421
+ '- **Create multiple scenarios per component** (like tests): default/happy path, edge cases (empty data, long text, max items), different visual states (loading, error, disabled)',
422
+ '- 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":[...]}}}}\'`',
423
+ '- The url is a PATH, not a full URL — the proxy appends it and intercepts API calls the component makes',
424
+ '- `mockData.routes` provides data for any API calls the component makes internally (omit if none)',
425
+ '- Isolation routes stay in the project so the editor preview can display them',
426
+ '- Ensure `.gitignore` includes `**/isolated-components*` so they are not committed',
427
+ '',
428
+ '## Files',
429
+ '- **Scenario data:** .codeyam/editor-scenarios/{scenario-id}.json',
430
+ '- **Scenario screenshots:** .codeyam/editor-scenarios/screenshots/{scenario-id}.png',
431
+ '- **Active scenario:** .codeyam/active-scenario.json',
432
+ '- **Database:** .codeyam/db.sqlite3',
433
+ '- **Journal:** .codeyam/journal/ (daily .md files + index.json + screenshots/)',
434
+ '',
435
+ ];
436
+ // Check if package.json exists to give context about project state
437
+ const hasPackageJson = fs.existsSync(path.join(codeyamRoot, 'package.json'));
438
+ if (!hasPackageJson) {
439
+ lines.push('## Status');
440
+ lines.push('- **Empty project** — no package.json found. Run `codeyam editor steps` to begin.');
441
+ lines.push('');
442
+ }
443
+ // Include handoff context if a provider switch generated one
444
+ try {
445
+ const handoffContextPath = path.join(codeyamRoot, '.codeyam', 'handoff-context.md');
446
+ if (fs.existsSync(handoffContextPath)) {
447
+ lines.push('');
448
+ lines.push(fs.readFileSync(handoffContextPath, 'utf8'));
449
+ lines.push('');
450
+ }
451
+ }
452
+ catch {
453
+ // Non-fatal
454
+ }
455
+ fs.writeFileSync(contextPath, lines.join('\n'), 'utf8');
456
+ return true;
457
+ }
458
+ catch (error) {
459
+ console.error('[terminalServer] Failed to write editor-mode-context.md:', error);
460
+ return false;
461
+ }
462
+ }
463
+ /**
464
+ * Attach a WebSocket server at /ws/terminal to an existing HTTP server.
465
+ * Each WS connection spawns a PTY running the user's shell, then auto-starts `claude`.
466
+ *
467
+ * Features:
468
+ * - Ping/pong keepalive (30s interval) to detect dead connections
469
+ * - PTY detach/reattach: on WS close the PTY survives for 60s, allowing the client
470
+ * to reconnect with ?reconnectId=<sessionId> and reattach to the same PTY
471
+ * - Session IDs sent to client on connection for reconnect tracking
472
+ */
473
+ export function attachTerminalServer(httpServer) {
474
+ const wss = new WebSocketServer({ server: httpServer, path: '/ws/terminal' });
475
+ // --- Ping/pong keepalive ---
476
+ // The browser's native WebSocket automatically responds to ping frames with pong.
477
+ if (pingInterval)
478
+ clearInterval(pingInterval);
479
+ pingInterval = setInterval(() => {
480
+ for (const session of sessions) {
481
+ if (!session.isAlive) {
482
+ // Didn't respond to last ping — terminate
483
+ console.log(`[terminalServer] Session ${session.sessionId} ping timeout, terminating`);
484
+ session.ws.terminate();
485
+ continue;
486
+ }
487
+ session.isAlive = false;
488
+ session.ws.ping();
489
+ }
490
+ }, PING_INTERVAL_MS);
491
+ globalThis.__codeyamPingInterval = pingInterval;
492
+ // Subscribe to mock state events and broadcast to all terminal clients
493
+ mockStateEventEmitter.on('event', (event) => {
494
+ if (event.type === 'data-mutation-forwarded') {
495
+ broadcastDataMutationForwarded(event.method, event.pathname);
496
+ }
497
+ });
498
+ wss.on('connection', (ws, req) => {
499
+ // Parse entity context from query params
500
+ const url = new URL(req.url || '', `http://${req.headers.host}`);
501
+ const entityName = url.searchParams.get('entityName') || '';
502
+ const entityType = url.searchParams.get('entityType') || '';
503
+ const entitySha = url.searchParams.get('entitySha') || '';
504
+ const entityFilePath = url.searchParams.get('entityFilePath') || '';
505
+ const scenarioName = url.searchParams.get('scenarioName') || '';
506
+ const scenarioDescription = url.searchParams.get('scenarioDescription') || '';
507
+ const analysisId = url.searchParams.get('analysisId') || '';
508
+ const projectSlug = url.searchParams.get('projectSlug') || '';
509
+ const editorMode = url.searchParams.get('editorMode') === 'true';
510
+ const reconnectId = url.searchParams.get('reconnectId') || '';
511
+ const claudeStartMode = url.searchParams.get('claudeStartMode') || '';
512
+ const claudeSessionId = url.searchParams.get('claudeSessionId') || '';
513
+ const editorStepLabel = url.searchParams.get('editorStepLabel') || '';
514
+ // --- Reconnection: reattach to a detached PTY ---
515
+ if (reconnectId && detachedPtys.has(reconnectId)) {
516
+ const detached = detachedPtys.get(reconnectId);
517
+ clearTimeout(detached.graceTimer);
518
+ detachedPtys.delete(reconnectId);
519
+ console.log(`[terminalServer] Reattaching session ${reconnectId}`);
520
+ const session = {
521
+ ws,
522
+ ptyProcess: detached.ptyProcess,
523
+ sessionId: detached.sessionId,
524
+ isAlive: true,
525
+ };
526
+ sessions.add(session);
527
+ // Send session ID so client can track it
528
+ ws.send(JSON.stringify({ type: 'session-id', sessionId: session.sessionId }));
529
+ // Send buffered output so client catches up
530
+ if (detached.outputBuffer) {
531
+ ws.send(JSON.stringify({ type: 'output', data: detached.outputBuffer }));
532
+ }
533
+ // Re-wire PTY output -> new WebSocket
534
+ // node-pty's onData returns a disposable; the old listener was still attached
535
+ // and was buffering output into detached.outputBuffer. We need to replace it.
536
+ // Unfortunately node-pty doesn't expose removeListener, so we use a closure flag.
537
+ let detachedFlag = false;
538
+ const reconnectPort = process.env.CODEYAM_PORT || '3111';
539
+ const reconnectTransformMarkers = createMarkerTransformer(reconnectPort);
540
+ const reconnectIdleDetector = new IdleDetector({
541
+ onIdle: () => {
542
+ if (ws.readyState === WebSocket.OPEN) {
543
+ console.log('[terminalServer] Sending claude-idle (reconnected)');
544
+ ws.send(JSON.stringify({ type: 'claude-idle' }));
545
+ }
546
+ },
547
+ onActive: () => {
548
+ if (ws.readyState === WebSocket.OPEN) {
549
+ console.log('[terminalServer] Sending claude-active (reconnected)');
550
+ ws.send(JSON.stringify({ type: 'claude-active' }));
551
+ }
552
+ },
553
+ }, { activeOutputPattern: /[✶✢·◼]/ });
554
+ detached.ptyProcess.onData((data) => {
555
+ if (detachedFlag)
556
+ return; // Superseded by a newer listener
557
+ if (ws.readyState === WebSocket.OPEN) {
558
+ if (!detached.hasClearedScreen &&
559
+ detached.hasContext &&
560
+ isBannerChunk(data)) {
561
+ detached.hasClearedScreen = true;
562
+ ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
563
+ }
564
+ const transformed = reconnectTransformMarkers(data);
565
+ if (transformed.length > 0) {
566
+ ws.send(JSON.stringify({ type: 'output', data: transformed }));
567
+ }
568
+ reconnectIdleDetector.onPtyOutput(data);
569
+ }
570
+ });
571
+ detached.ptyProcess.onExit(() => {
572
+ console.log('[terminalServer] PTY exited (reconnected), flushing idle state');
573
+ reconnectIdleDetector.disposeAndFlush();
574
+ sessions.delete(session);
575
+ if (ws.readyState === WebSocket.OPEN) {
576
+ ws.close();
577
+ }
578
+ });
579
+ // WebSocket messages -> PTY
580
+ ws.on('message', (raw) => {
581
+ try {
582
+ const msg = JSON.parse(raw.toString());
583
+ if (msg.type === 'input') {
584
+ reconnectIdleDetector.onUserInput();
585
+ detached.ptyProcess.write(msg.data);
586
+ }
587
+ else if (msg.type === 'resize' && msg.cols && msg.rows) {
588
+ detached.ptyProcess.resize(msg.cols, msg.rows);
589
+ }
590
+ }
591
+ catch {
592
+ detached.ptyProcess.write(raw.toString());
593
+ }
594
+ });
595
+ ws.on('pong', () => {
596
+ session.isAlive = true;
597
+ });
598
+ ws.on('close', () => {
599
+ detachedFlag = true;
600
+ detachSession(session, detached.hasContext, detached.hasClearedScreen);
601
+ });
602
+ return;
603
+ }
604
+ // --- New connection: spawn a fresh PTY ---
605
+ const { shell, args: shellArgs } = getShellConfig();
606
+ const safeCwd = getSafeCwd();
607
+ // Spawn PTY with a clean env (no giant JSON blobs from CODEYAM_PROJECT etc.)
608
+ let ptyProcess;
609
+ try {
610
+ ptyProcess = pty.spawn(shell, shellArgs, {
611
+ name: 'xterm-256color',
612
+ cols: 120,
613
+ rows: 30,
614
+ cwd: safeCwd,
615
+ env: buildPtyEnv({ editorMode }),
616
+ });
617
+ }
618
+ catch (error) {
619
+ console.error('[terminalServer] Failed to spawn PTY:', {
620
+ shell,
621
+ cwd: safeCwd,
622
+ error,
623
+ });
624
+ ws.send(JSON.stringify({
625
+ type: 'output',
626
+ data: `\r\nFailed to start terminal: ${error.message}\r\n`,
627
+ }));
628
+ ws.close();
629
+ return;
630
+ }
631
+ const sessionId = crypto.randomUUID();
632
+ const session = {
633
+ ws,
634
+ ptyProcess,
635
+ sessionId,
636
+ isAlive: true,
637
+ };
638
+ sessions.add(session);
639
+ // Send session ID so client can use it for reconnection
640
+ ws.send(JSON.stringify({ type: 'session-id', sessionId }));
641
+ // Write context file for the appropriate skill (dev-mode or editor)
642
+ const hasContext = editorMode
643
+ ? writeEditorModeContext({ projectSlug })
644
+ : writeDevModeContext({
645
+ entityName,
646
+ entityType,
647
+ entitySha,
648
+ entityFilePath,
649
+ scenarioName,
650
+ scenarioDescription,
651
+ analysisId,
652
+ projectSlug,
653
+ });
654
+ let hasClearedScreen = false;
655
+ const filterStartup = shouldFilterStartup({ hasContext, editorMode });
656
+ const startupFilter = filterStartup ? new StartupOutputFilter() : null;
657
+ // Safety timeout: stop suppressing output after 5s even if ╭ never arrives.
658
+ // Prevents "Starting Claude..." hanging forever if the banner format changes.
659
+ if (filterStartup) {
660
+ setTimeout(() => {
661
+ const output = startupFilter.getTimeoutOutput();
662
+ if (output !== null) {
663
+ hasClearedScreen = true;
664
+ console.log('[terminalServer] Suppression timeout — showing output');
665
+ if (ws.readyState === WebSocket.OPEN) {
666
+ // Clear the "Starting Claude..." message
667
+ ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
668
+ const transformed = transformMarkers(output);
669
+ if (transformed.length > 0) {
670
+ ws.send(JSON.stringify({ type: 'output', data: transformed }));
671
+ }
672
+ }
673
+ }
674
+ }, 5000);
675
+ }
676
+ const idleDetector = new IdleDetector({
677
+ onIdle: () => {
678
+ if (ws.readyState === WebSocket.OPEN) {
679
+ console.log('[terminalServer] Sending claude-idle');
680
+ ws.send(JSON.stringify({ type: 'claude-idle' }));
681
+ }
682
+ },
683
+ onActive: () => {
684
+ if (ws.readyState === WebSocket.OPEN) {
685
+ console.log('[terminalServer] Sending claude-active');
686
+ ws.send(JSON.stringify({ type: 'claude-active' }));
687
+ }
688
+ },
689
+ }, { activeOutputPattern: /[✶✢·◼]/ });
690
+ // PTY output -> WebSocket
691
+ const serverPort = process.env.CODEYAM_PORT || '3111';
692
+ // Stateful transformer that buffers partial {{scenario:...}} markers
693
+ // across PTY chunks so they don't appear as raw text.
694
+ const transformMarkers = createMarkerTransformer(serverPort);
695
+ ptyProcess.onData((data) => {
696
+ if (ws.readyState === WebSocket.OPEN) {
697
+ // During startup, suppress output until Claude's welcome banner (╭)
698
+ // arrives, then clear screen and strip the raw command from the chunk.
699
+ if (startupFilter && !hasClearedScreen) {
700
+ const result = startupFilter.processChunk(data);
701
+ if (result.type === 'clear-and-send') {
702
+ hasClearedScreen = true;
703
+ ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
704
+ if (result.data.length > 0) {
705
+ const transformed = transformMarkers(result.data);
706
+ if (transformed.length > 0) {
707
+ ws.send(JSON.stringify({ type: 'output', data: transformed }));
708
+ }
709
+ }
710
+ idleDetector.onPtyOutput(data);
711
+ }
712
+ // type === 'suppress': skip sending and idle detection
713
+ }
714
+ else {
715
+ // Transform {{scenario:Name:ID}} markers into OSC 8 clickable hyperlinks.
716
+ // Uses stateful buffering to handle markers split across PTY chunks.
717
+ const transformed = transformMarkers(data);
718
+ if (transformed.length > 0) {
719
+ ws.send(JSON.stringify({ type: 'output', data: transformed }));
720
+ }
721
+ idleDetector.onPtyOutput(data);
722
+ }
723
+ }
724
+ });
725
+ ptyProcess.onExit(() => {
726
+ console.log('[terminalServer] PTY exited, flushing idle state');
727
+ idleDetector.disposeAndFlush();
728
+ sessions.delete(session);
729
+ // Also clean up from detachedPtys if it was detached
730
+ if (detachedPtys.has(sessionId)) {
731
+ clearTimeout(detachedPtys.get(sessionId).graceTimer);
732
+ detachedPtys.delete(sessionId);
733
+ }
734
+ if (ws.readyState === WebSocket.OPEN) {
735
+ ws.close();
736
+ }
737
+ });
738
+ // WebSocket messages -> PTY
739
+ ws.on('message', (raw) => {
740
+ try {
741
+ const msg = JSON.parse(raw.toString());
742
+ if (msg.type === 'input') {
743
+ idleDetector.onUserInput();
744
+ ptyProcess.write(msg.data);
745
+ }
746
+ else if (msg.type === 'resize' && msg.cols && msg.rows) {
747
+ ptyProcess.resize(msg.cols, msg.rows);
748
+ }
749
+ }
750
+ catch {
751
+ // Non-JSON message, treat as raw input
752
+ ptyProcess.write(raw.toString());
753
+ }
754
+ });
755
+ ws.on('pong', () => {
756
+ session.isAlive = true;
757
+ });
758
+ ws.on('close', () => {
759
+ detachSession(session, hasContext, hasClearedScreen);
760
+ });
761
+ // Show a loading indicator while Claude Code starts up.
762
+ // PTY output is suppressed until Claude's welcome banner (╭) appears
763
+ // and triggers a screen clear, so the user never sees the raw command.
764
+ if (filterStartup) {
765
+ ws.send(JSON.stringify({
766
+ type: 'output',
767
+ data: '\x1b[2J\x1b[H\r\n\x1b[90m Starting Claude...\x1b[0m\r\n',
768
+ }));
769
+ }
770
+ // Start Claude Code with the appropriate skill.
771
+ // Using a skill avoids shell escaping issues and multi-line paste detection.
772
+ //
773
+ // Session recovery modes (editor only):
774
+ // resume + sessionId → claude --resume <uuid> (resumes exact conversation)
775
+ // resume, no sessionId → claude --continue (fallback for pre-existing sessions)
776
+ // fresh → generate UUID, write to .codeyam/claude-session-id.txt,
777
+ // launch claude --session-id <uuid> '/codeyam-editor'
778
+ //
779
+ // The UUID is generated HERE (not in printStep1) so it's available before
780
+ // Claude launches. printStep1 runs inside the session — too late.
781
+ setTimeout(() => {
782
+ if (editorMode && hasContext) {
783
+ if (claudeStartMode === 'resume' && claudeSessionId) {
784
+ const resumePrompt = editorStepLabel === 'Present'
785
+ ? 'The session was interrupted. Please rerun show-results.'
786
+ : 'The session was interrupted. Please continue where you left off.';
787
+ ptyProcess.write(`claude --resume '${claudeSessionId}' '${resumePrompt}'\r`);
788
+ }
789
+ else if (claudeStartMode === 'resume') {
790
+ // No session ID available — fall back to most recent session
791
+ const resumePrompt = editorStepLabel === 'Present'
792
+ ? 'The session was interrupted. Please rerun show-results.'
793
+ : 'The session was interrupted. Please continue where you left off.';
794
+ ptyProcess.write(`claude --continue '${resumePrompt}'\r`);
795
+ }
796
+ else {
797
+ // Fresh session: generate a trackable UUID
798
+ const newSessionId = crypto.randomUUID();
799
+ const sessionIdPath = path.join(safeCwd, '.codeyam', 'claude-session-id.txt');
800
+ try {
801
+ fs.mkdirSync(path.dirname(sessionIdPath), { recursive: true });
802
+ fs.writeFileSync(sessionIdPath, newSessionId, 'utf8');
803
+ }
804
+ catch (err) {
805
+ console.error('[terminalServer] Failed to write claude-session-id.txt:', err);
806
+ }
807
+ ptyProcess.write(`claude --session-id '${newSessionId}' '/codeyam-editor'\r`);
808
+ }
809
+ }
810
+ else if (hasContext) {
811
+ ptyProcess.write("claude '/codeyam-dev-mode'\r");
812
+ }
813
+ else {
814
+ ptyProcess.write('claude\r');
815
+ }
816
+ }, 500);
817
+ });
818
+ console.log('[terminalServer] WebSocket terminal server attached at /ws/terminal');
819
+ }
820
+ /**
821
+ * Detach a session's PTY instead of killing it, giving the client time to reconnect.
822
+ * The PTY is moved to `detachedPtys` with a grace timer; if the client reconnects
823
+ * within DETACH_GRACE_MS, the PTY is reattached. Otherwise it's killed.
824
+ */
825
+ function detachSession(session, hasContext = false, hasClearedScreen = false) {
826
+ sessions.delete(session);
827
+ const { sessionId, ptyProcess } = session;
828
+ // If already detached (shouldn't happen), skip
829
+ if (detachedPtys.has(sessionId))
830
+ return;
831
+ let outputBuffer = '';
832
+ // Buffer PTY output during detachment so the client can catch up on reconnect
833
+ ptyProcess.onData((data) => {
834
+ outputBuffer += data;
835
+ // Cap buffer size
836
+ if (outputBuffer.length > OUTPUT_BUFFER_MAX) {
837
+ outputBuffer = outputBuffer.slice(-OUTPUT_BUFFER_MAX);
838
+ }
839
+ });
840
+ const graceTimer = setTimeout(() => {
841
+ console.log(`[terminalServer] Grace period expired for session ${sessionId}, killing PTY`);
842
+ detachedPtys.delete(sessionId);
843
+ try {
844
+ ptyProcess.kill();
845
+ }
846
+ catch {
847
+ /* already dead */
848
+ }
849
+ }, DETACH_GRACE_MS);
850
+ detachedPtys.set(sessionId, {
851
+ ptyProcess,
852
+ sessionId,
853
+ graceTimer,
854
+ outputBuffer,
855
+ hasContext,
856
+ hasClearedScreen,
857
+ });
858
+ console.log(`[terminalServer] Session ${sessionId} detached, PTY kept alive for ${DETACH_GRACE_MS / 1000}s`);
859
+ }
860
+ /**
861
+ * Send a refresh-preview message to all connected terminal WebSocket clients.
862
+ * The Terminal component relays this to the parent page to reload the iframe.
863
+ */
864
+ export function broadcastPreviewRefresh(path, scenarioId) {
865
+ const msg = JSON.stringify({
866
+ type: 'refresh-preview',
867
+ ...(path && { path }),
868
+ ...(scenarioId && { scenarioId }),
869
+ });
870
+ let count = 0;
871
+ for (const session of sessions) {
872
+ try {
873
+ if (session.ws.readyState === WebSocket.OPEN) {
874
+ session.ws.send(msg);
875
+ count++;
876
+ }
877
+ }
878
+ catch {
879
+ // Ignore send errors
880
+ }
881
+ }
882
+ return count;
883
+ }
884
+ /**
885
+ * Notify all connected terminal WebSocket clients that a data mutation
886
+ * was forwarded to the real dev server (seed-based scenario).
887
+ * The Terminal component relays this to editor.tsx to show a save banner.
888
+ */
889
+ export function broadcastDataMutationForwarded(method, pathname) {
890
+ const msg = JSON.stringify({
891
+ type: 'data-mutation-forwarded',
892
+ method,
893
+ pathname,
894
+ });
895
+ let count = 0;
896
+ for (const session of sessions) {
897
+ try {
898
+ if (session.ws.readyState === WebSocket.OPEN) {
899
+ session.ws.send(msg);
900
+ count++;
901
+ }
902
+ }
903
+ catch {
904
+ // Ignore send errors
905
+ }
906
+ }
907
+ return count;
908
+ }
909
+ /**
910
+ * Show the results panel below the terminal in the Build tab.
911
+ * Triggered by Claude at end of step 12.
912
+ */
913
+ export function broadcastShowResults() {
914
+ const msg = JSON.stringify({ type: 'show-results' });
915
+ let count = 0;
916
+ for (const session of sessions) {
917
+ try {
918
+ if (session.ws.readyState === WebSocket.OPEN) {
919
+ session.ws.send(msg);
920
+ count++;
921
+ }
922
+ }
923
+ catch {
924
+ // Ignore send errors
925
+ }
926
+ }
927
+ return count;
928
+ }
929
+ /**
930
+ * Hide the results panel (e.g. after Save & Commit).
931
+ */
932
+ export function broadcastHideResults() {
933
+ const msg = JSON.stringify({ type: 'hide-results' });
934
+ let count = 0;
935
+ for (const session of sessions) {
936
+ try {
937
+ if (session.ws.readyState === WebSocket.OPEN) {
938
+ session.ws.send(msg);
939
+ count++;
940
+ }
941
+ }
942
+ catch {
943
+ // Ignore send errors
944
+ }
945
+ }
946
+ return count;
947
+ }
948
+ /**
949
+ * Notify the editor UI that the current feature is complete (after push/skip).
950
+ * The UI shows a transition overlay letting the user start fresh or continue.
951
+ */
952
+ export function broadcastFeatureComplete() {
953
+ const msg = JSON.stringify({ type: 'feature-complete' });
954
+ let count = 0;
955
+ for (const session of sessions) {
956
+ try {
957
+ if (session.ws.readyState === WebSocket.OPEN) {
958
+ session.ws.send(msg);
959
+ count++;
960
+ }
961
+ }
962
+ catch {
963
+ // Ignore send errors
964
+ }
965
+ }
966
+ return count;
967
+ }
968
+ /**
969
+ * Send a set-viewport message to all connected terminal WebSocket clients.
970
+ * The Terminal component relays this to the parent page to update the preview viewport.
971
+ */
972
+ export function broadcastSetViewport(viewport) {
973
+ const msg = JSON.stringify({ type: 'set-viewport', ...viewport });
974
+ let count = 0;
975
+ for (const session of sessions) {
976
+ try {
977
+ if (session.ws.readyState === WebSocket.OPEN) {
978
+ session.ws.send(msg);
979
+ count++;
980
+ }
981
+ }
982
+ catch {
983
+ // Ignore send errors
984
+ }
985
+ }
986
+ return count;
987
+ }
988
+ /**
989
+ * Kill all active PTY sessions and detached PTYs. Call during shutdown.
990
+ */
991
+ export function cleanupAllTerminalSessions() {
992
+ // Clear ping interval
993
+ if (pingInterval) {
994
+ clearInterval(pingInterval);
995
+ pingInterval = null;
996
+ globalThis.__codeyamPingInterval = null;
997
+ }
998
+ // Clean up active sessions
999
+ for (const session of Array.from(sessions)) {
1000
+ try {
1001
+ session.ptyProcess.kill();
1002
+ }
1003
+ catch {
1004
+ // Already dead
1005
+ }
1006
+ try {
1007
+ session.ws.close();
1008
+ }
1009
+ catch {
1010
+ // Already closed
1011
+ }
1012
+ }
1013
+ sessions.clear();
1014
+ // Clean up detached PTYs
1015
+ for (const [, detached] of detachedPtys) {
1016
+ clearTimeout(detached.graceTimer);
1017
+ try {
1018
+ detached.ptyProcess.kill();
1019
+ }
1020
+ catch {
1021
+ // Already dead
1022
+ }
1023
+ }
1024
+ detachedPtys.clear();
1025
+ }
1026
+ //# sourceMappingURL=terminalServer.js.map