@codeyam/codeyam-cli 0.1.0-staging.03e0fb2 → 0.1.0-staging.07d8f7b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +34 -3
  4. package/analyzer-template/packages/ai/src/lib/completionCall.ts +14 -2
  5. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +27 -0
  6. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
  7. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +78 -2
  8. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +6 -0
  9. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +9 -1
  10. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
  11. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +12 -0
  12. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +65 -28
  13. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +83 -0
  14. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +23 -4
  15. package/analyzer-template/packages/database/index.ts +1 -0
  16. package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -0
  17. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +62 -0
  18. package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
  19. package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
  20. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +151 -135
  21. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
  22. package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
  23. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
  24. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
  25. package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
  26. package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
  27. package/analyzer-template/packages/github/dist/database/index.js +1 -0
  28. package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
  29. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  30. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  31. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +5 -0
  32. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  33. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +20 -0
  34. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
  35. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  36. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  37. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
  38. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
  39. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  40. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
  41. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  42. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
  43. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  44. package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  45. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  46. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +100 -89
  47. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  48. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
  49. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  50. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  51. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
  52. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  53. package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  54. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
  55. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  56. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  57. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
  58. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  59. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  60. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  61. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  62. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
  63. package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
  64. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
  65. package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
  66. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +1 -0
  67. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  68. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
  69. package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
  70. package/analyzer-template/playwright/captureFromUrl.ts +89 -82
  71. package/analyzer-template/project/constructMockCode.ts +136 -43
  72. package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
  73. package/analyzer-template/project/start.ts +3 -0
  74. package/analyzer-template/project/startScenarioCapture.ts +9 -0
  75. package/analyzer-template/project/writeClientLogRoute.ts +125 -0
  76. package/analyzer-template/project/writeMockDataTsx.ts +17 -0
  77. package/analyzer-template/project/writeScenarioComponents.ts +36 -7
  78. package/analyzer-template/tsconfig.json +13 -1
  79. package/background/src/lib/virtualized/project/constructMockCode.js +115 -34
  80. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  81. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
  82. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  83. package/background/src/lib/virtualized/project/start.js +2 -0
  84. package/background/src/lib/virtualized/project/start.js.map +1 -1
  85. package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
  86. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  87. package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
  88. package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
  89. package/background/src/lib/virtualized/project/writeMockDataTsx.js +12 -0
  90. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  91. package/background/src/lib/virtualized/project/writeScenarioComponents.js +29 -7
  92. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  93. package/codeyam-cli/scripts/apply-setup.js +208 -11
  94. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  95. package/codeyam-cli/src/cli.js +2 -0
  96. package/codeyam-cli/src/cli.js.map +1 -1
  97. package/codeyam-cli/src/commands/analyze.js +17 -7
  98. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  99. package/codeyam-cli/src/commands/default.js +58 -3
  100. package/codeyam-cli/src/commands/default.js.map +1 -1
  101. package/codeyam-cli/src/commands/editor.js +697 -0
  102. package/codeyam-cli/src/commands/editor.js.map +1 -0
  103. package/codeyam-cli/src/commands/init.js +34 -10
  104. package/codeyam-cli/src/commands/init.js.map +1 -1
  105. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
  106. package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
  107. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +26 -0
  108. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  109. package/codeyam-cli/src/utils/backgroundServer.js +19 -3
  110. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  111. package/codeyam-cli/src/utils/devModeEvents.js +40 -0
  112. package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
  113. package/codeyam-cli/src/utils/fileMetadata.js +5 -0
  114. package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
  115. package/codeyam-cli/src/utils/fileWatcher.js +25 -9
  116. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  117. package/codeyam-cli/src/utils/git.js +52 -0
  118. package/codeyam-cli/src/utils/git.js.map +1 -1
  119. package/codeyam-cli/src/utils/install-skills.js +31 -0
  120. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  121. package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
  122. package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
  123. package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
  124. package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
  125. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
  126. package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
  127. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
  128. package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
  129. package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
  130. package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
  131. package/codeyam-cli/src/utils/queue/job.js +70 -1
  132. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  133. package/codeyam-cli/src/utils/queue/manager.js +7 -6
  134. package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
  135. package/codeyam-cli/src/utils/serverState.js +27 -2
  136. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  137. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +45 -4
  138. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  139. package/codeyam-cli/src/utils/testRunner.js +158 -0
  140. package/codeyam-cli/src/utils/testRunner.js.map +1 -0
  141. package/codeyam-cli/src/utils/webappDetection.js +14 -2
  142. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  143. package/codeyam-cli/src/webserver/app/lib/database.js +41 -27
  144. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  145. package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
  146. package/codeyam-cli/src/webserver/backgroundServer.js +108 -18
  147. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  148. package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CtmbP4Gl.js → CopyButton-DmJveP3T.js} +1 -1
  149. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DlMph_Hm.js → EntityItem-C76mRRiF.js} +1 -1
  150. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-B-0PjGOU.js → EntityTypeBadge-g3saevPb.js} +1 -1
  151. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-DN9eiJAO.js → EntityTypeIcon-CobE682z.js} +1 -1
  152. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +1 -0
  153. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-rE_fI2h2.js → InteractivePreview-DYFW3lDD.js} +3 -3
  154. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CnatsCw2.js → LibraryFunctionPreview-DLeucoVX.js} +1 -1
  155. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-CSP6DZrh.js → LoadingDots-BU_OAEMP.js} +1 -1
  156. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CMK8Q7yk.js → LogViewer-ceAyBX-H.js} +1 -1
  157. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-TCV_HBjy.js → ReportIssueModal-djPLI-WV.js} +1 -1
  158. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CG2uh31y.js → SafeScreenshot-BED4B6sP.js} +1 -1
  159. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CU_TDYd8.js → ScenarioViewer-B76aig_2.js} +1 -1
  160. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +34 -0
  161. package/codeyam-cli/src/webserver/build/client/assets/Terminal-BaIiqg_w.js +41 -0
  162. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D7IoaWUW.js → TruncatedFilePath-C8OKAR5x.js} +1 -1
  163. package/codeyam-cli/src/webserver/build/client/assets/{_index-B8z7mjR-.js → _index-C96V0n15.js} +1 -1
  164. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DZu78RI1.js → activity.(_tab)-BpKzcsJz.js} +1 -1
  165. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +1 -0
  166. package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-Duc5hnl7.js +1 -0
  167. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-Dm5RS9il.js → agent-transcripts-D9hemwl6.js} +1 -1
  168. package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
  169. package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
  170. package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
  171. package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
  172. package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
  173. package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
  174. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
  175. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
  176. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
  177. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
  178. package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
  179. package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
  180. package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
  181. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
  182. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
  183. package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
  184. package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
  185. package/codeyam-cli/src/webserver/build/client/assets/{book-open-Bp5FLkd4.js → book-open-D_nMCFmP.js} +1 -1
  186. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DQJA9f4o.js → chevron-down-BH2h1Ea2.js} +1 -1
  187. package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-7VptmeIr.js → chunk-JZWAC4HX-C4pqxYJB.js} +1 -1
  188. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-B6C4LY9o.js → circle-check-DyIKORY6.js} +1 -1
  189. package/codeyam-cli/src/webserver/build/client/assets/{copy-6nzYCu0G.js → copy-NDbZjXao.js} +1 -1
  190. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-D-QUFOwe.js → createLucideIcon-CMT1jU2q.js} +1 -1
  191. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +1 -0
  192. package/codeyam-cli/src/webserver/build/client/assets/editor-Ba0jejiv.js +7 -0
  193. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-C6PQhwY5.js → entity._sha._-CrjR3zZW.js} +8 -8
  194. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DloHYjtt.js +6 -0
  195. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +6 -0
  196. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +6 -0
  197. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-C7ysA4Jq.js → entity._sha_.edit._scenarioId-BMvVHNXU.js} +2 -2
  198. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CU6EUArK.js → entry.client-DTvKq3TY.js} +1 -1
  199. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-EWpfFU4X.js → fileTableUtils-cPo8LiG3.js} +1 -1
  200. package/codeyam-cli/src/webserver/build/client/assets/{files-CrxAoWIL.js → files-DO4CZ16O.js} +1 -1
  201. package/codeyam-cli/src/webserver/build/client/assets/{git-BldHtKeW.js → git-CFCTYk9I.js} +1 -1
  202. package/codeyam-cli/src/webserver/build/client/assets/globals-BH6uYxPM.css +1 -0
  203. package/codeyam-cli/src/webserver/build/client/assets/{index-7-1FmlHo.js → index-10oVnAAH.js} +1 -1
  204. package/codeyam-cli/src/webserver/build/client/assets/{index-DuYcwYp_.js → index-BcvgDzbZ.js} +1 -1
  205. package/codeyam-cli/src/webserver/build/client/assets/{labs-CPPVOSWB.js → labs-Zk7ryIM1.js} +1 -1
  206. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BnDcD54R.js → loader-circle-BAXYRVEO.js} +1 -1
  207. package/codeyam-cli/src/webserver/build/client/assets/manifest-dcea65f8.js +1 -0
  208. package/codeyam-cli/src/webserver/build/client/assets/{memory-0wMU4KXe.js → memory-FweZHj5U.js} +1 -1
  209. package/codeyam-cli/src/webserver/build/client/assets/{pause-DhQX2g22.js → pause-DTAcYxBt.js} +1 -1
  210. package/codeyam-cli/src/webserver/build/client/assets/root-Dzn8nIkU.js +67 -0
  211. package/codeyam-cli/src/webserver/build/client/assets/{search-DborVoKD.js → search-fKo7v0Zo.js} +1 -1
  212. package/codeyam-cli/src/webserver/build/client/assets/{settings-BWunYSXt.js → settings-DfuTtcJP.js} +1 -1
  213. package/codeyam-cli/src/webserver/build/client/assets/{simulations-BtrtCYJg.js → simulations-B3aOzpCZ.js} +1 -1
  214. package/codeyam-cli/src/webserver/build/client/assets/{terminal-Bs4NC-VZ.js → terminal-BG4heKCG.js} +1 -1
  215. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DTf3Jojp.js → triangle-alert-DtSmdtM4.js} +1 -1
  216. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-D_bDZyDU.js → useCustomSizes-ByhSyh0W.js} +1 -1
  217. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +2 -0
  218. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-BsQb6rFd.js → useReportContext-O-jkvSPx.js} +1 -1
  219. package/codeyam-cli/src/webserver/build/client/assets/{useToast-BOur3mUv.js → useToast-9FIWuYfK.js} +1 -1
  220. package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +9 -0
  221. package/codeyam-cli/src/webserver/build/server/assets/index-mE6GlU_8.js +1 -0
  222. package/codeyam-cli/src/webserver/build/server/assets/server-build-BApEk7IO.js +362 -0
  223. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  224. package/codeyam-cli/src/webserver/build-info.json +5 -5
  225. package/codeyam-cli/src/webserver/devServer.js +39 -5
  226. package/codeyam-cli/src/webserver/devServer.js.map +1 -1
  227. package/codeyam-cli/src/webserver/editorProxy.js +272 -0
  228. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
  229. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +121 -0
  230. package/codeyam-cli/src/webserver/server.js +177 -1
  231. package/codeyam-cli/src/webserver/server.js.map +1 -1
  232. package/codeyam-cli/src/webserver/terminalServer.js +606 -0
  233. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
  234. package/codeyam-cli/templates/codeyam-dev-mode.md +237 -0
  235. package/codeyam-cli/templates/codeyam-editor-claude.md +68 -0
  236. package/codeyam-cli/templates/codeyam-editor.md +67 -0
  237. package/codeyam-cli/templates/editor-step-hook.py +143 -0
  238. package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
  239. package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
  240. package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
  241. package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
  242. package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
  243. package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
  244. package/codeyam-cli/templates/nextjs-prisma-sqlite/PRISMA_SETUP.md +84 -0
  245. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
  246. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
  247. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
  248. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +19 -0
  249. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
  250. package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
  251. package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
  252. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +35 -0
  253. package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
  254. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
  255. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +37 -0
  256. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
  257. package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
  258. package/package.json +4 -2
  259. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
  260. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  261. package/packages/ai/src/lib/completionCall.js +10 -2
  262. package/packages/ai/src/lib/completionCall.js.map +1 -1
  263. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +21 -0
  264. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  265. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
  266. package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
  267. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
  268. package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
  269. package/packages/ai/src/lib/generateEntityScenarioData.js +57 -2
  270. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  271. package/packages/analyze/src/lib/ProjectAnalyzer.js +3 -0
  272. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  273. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +8 -1
  274. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  275. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
  276. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  277. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
  278. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  279. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +54 -27
  280. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -1
  281. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +65 -0
  282. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  283. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +18 -4
  284. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  285. package/packages/database/index.js +1 -0
  286. package/packages/database/index.js.map +1 -1
  287. package/packages/database/src/lib/kysely/db.js +5 -0
  288. package/packages/database/src/lib/kysely/db.js.map +1 -1
  289. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
  290. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
  291. package/packages/database/src/lib/loadCommits.js +23 -13
  292. package/packages/database/src/lib/loadCommits.js.map +1 -1
  293. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
  294. package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
  295. package/packages/database/src/lib/updateCommitMetadata.js +100 -89
  296. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  297. package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
  298. package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
  299. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
  300. package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
  301. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
  302. package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
  303. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
  304. package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
  305. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-C1rIyZdV.js +0 -34
  306. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DmzSmblj.js +0 -1
  307. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DVTcUnur.js +0 -6
  308. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-BVgNO76F.js +0 -6
  309. package/codeyam-cli/src/webserver/build/client/assets/globals-CLmFdUae.css +0 -1
  310. package/codeyam-cli/src/webserver/build/client/assets/manifest-717e346a.js +0 -1
  311. package/codeyam-cli/src/webserver/build/client/assets/root-DqfSDjyQ.js +0 -62
  312. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-DZp6rrQD.js +0 -2
  313. package/codeyam-cli/src/webserver/build/server/assets/index-B8jmgmn2.js +0 -1
  314. package/codeyam-cli/src/webserver/build/server/assets/server-build-9OU4lmvL.js +0 -285
@@ -0,0 +1,606 @@
1
+ var _a, _b;
2
+ import { WebSocketServer, WebSocket } from 'ws';
3
+ import crypto from 'crypto';
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import * as pty from 'node-pty';
7
+ // Use globalThis so the sessions Set is shared across module instances.
8
+ // In Vite dev mode, this file is loaded twice: once by the Vite plugin (Node.js native)
9
+ // and once by the SSR context (ssrLoadModule). Without globalThis, each instance
10
+ // gets its own empty Set — so broadcastPreviewRefresh() called from the SSR instance
11
+ // (via the /api/dev-mode-refresh endpoint) would broadcast to 0 sessions.
12
+ const sessions = ((_a = globalThis).__codeyamTerminalSessions ?? (_a.__codeyamTerminalSessions = new Set()));
13
+ // Detached PTYs waiting for reconnection (keyed by sessionId).
14
+ // When a WebSocket drops, the PTY is moved here with a grace timer
15
+ // instead of being killed immediately, allowing the client to reconnect.
16
+ const detachedPtys = ((_b = globalThis).__codeyamDetachedPtys ?? (_b.__codeyamDetachedPtys = new Map()));
17
+ const PING_INTERVAL_MS = 30000;
18
+ const DETACH_GRACE_MS = 60000;
19
+ const OUTPUT_BUFFER_MAX = 8 * 1024; // 8KB
20
+ // Ping interval reference — shared so cleanup can clear it
21
+ let pingInterval = globalThis.__codeyamPingInterval ?? null;
22
+ // Keys to forward from the server env into the PTY shell.
23
+ // Keeps the env clean (no giant CODEYAM_PROJECT JSON blobs) while
24
+ // preserving everything Claude Code and the user's shell need.
25
+ const ENV_PASSTHROUGH_KEYS = [
26
+ 'PATH',
27
+ 'HOME',
28
+ 'USER',
29
+ 'LOGNAME',
30
+ 'SHELL',
31
+ 'TERM',
32
+ 'LANG',
33
+ 'LC_ALL',
34
+ 'LC_CTYPE',
35
+ 'EDITOR',
36
+ 'VISUAL',
37
+ 'TMPDIR',
38
+ 'XDG_CONFIG_HOME',
39
+ 'XDG_DATA_HOME',
40
+ 'XDG_CACHE_HOME',
41
+ // API keys Claude Code may need
42
+ 'ANTHROPIC_API_KEY',
43
+ 'OPENAI_API_KEY',
44
+ // nvm / fnm / volta node version managers
45
+ 'NVM_DIR',
46
+ 'NVM_BIN',
47
+ 'FNM_DIR',
48
+ 'VOLTA_HOME',
49
+ // Homebrew
50
+ 'HOMEBREW_PREFIX',
51
+ 'HOMEBREW_CELLAR',
52
+ 'HOMEBREW_REPOSITORY',
53
+ ];
54
+ function buildPtyEnv() {
55
+ const env = {};
56
+ for (const key of ENV_PASSTHROUGH_KEYS) {
57
+ const val = process.env[key];
58
+ if (val != null)
59
+ env[key] = val;
60
+ }
61
+ // Always set TERM for proper terminal behavior
62
+ if (!env.TERM)
63
+ env.TERM = 'xterm-256color';
64
+ return env;
65
+ }
66
+ /**
67
+ * Convert a name to a safe file name matching CodeYam's convention.
68
+ * e.g. "Default Scenario" -> "Default_Scenario"
69
+ */
70
+ function safeFileName(name) {
71
+ const safe = name.replace(/[^a-zA-Z0-9_]+/g, '_').replace(/^_+|_+$/g, '');
72
+ return safe.slice(0, 1).toUpperCase() + safe.slice(1);
73
+ }
74
+ /**
75
+ * Find the actual mock data file for a scenario in the tmp project.
76
+ * Tries a fast heuristic (extract app dir from entity file path) first,
77
+ * then falls back to a shallow directory search.
78
+ */
79
+ function findMockDataFile(projectRoot, entityFilePath, scenarioName) {
80
+ const scenarioSlug = safeFileName(scenarioName);
81
+ const mockFile = `MockData_${scenarioSlug}.tsx`;
82
+ // Heuristic: the __codeyamMocks__ dir lives at the app directory level.
83
+ // Extract "app/" (or "src/", "pages/") from the entity's file path.
84
+ if (entityFilePath) {
85
+ const parts = entityFilePath.split('/');
86
+ for (let i = 0; i < parts.length; i++) {
87
+ if (['app', 'src', 'pages'].includes(parts[i])) {
88
+ const appDir = parts.slice(0, i + 1).join('/');
89
+ const candidate = path.join(projectRoot, appDir, '__codeyamMocks__', mockFile);
90
+ if (fs.existsSync(candidate))
91
+ return candidate;
92
+ }
93
+ }
94
+ }
95
+ // Fallback: search __codeyamMocks__ directories up to 5 levels deep
96
+ function searchDir(dir, depth) {
97
+ if (depth > 5)
98
+ return null;
99
+ try {
100
+ for (const entry of fs.readdirSync(dir)) {
101
+ if (entry === 'node_modules' ||
102
+ entry === '.git' ||
103
+ entry === 'coverage')
104
+ continue;
105
+ const full = path.join(dir, entry);
106
+ if (entry === '__codeyamMocks__') {
107
+ const candidate = path.join(full, mockFile);
108
+ if (fs.existsSync(candidate))
109
+ return candidate;
110
+ continue;
111
+ }
112
+ try {
113
+ if (fs.statSync(full).isDirectory()) {
114
+ const result = searchDir(full, depth + 1);
115
+ if (result)
116
+ return result;
117
+ }
118
+ }
119
+ catch {
120
+ // Permission error or broken symlink
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // Directory unreadable
126
+ }
127
+ return null;
128
+ }
129
+ return searchDir(projectRoot, 0);
130
+ }
131
+ /**
132
+ * Write a structured context file for the codeyam-dev-mode skill.
133
+ * The skill reads this file on startup instead of receiving a long CLI argument.
134
+ * Returns true if context was written successfully, false otherwise.
135
+ */
136
+ function writeDevModeContext(ctx) {
137
+ if (!ctx.entityName)
138
+ return false;
139
+ const codeyamRoot = process.env.CODEYAM_ROOT_PATH || process.cwd();
140
+ const contextDir = path.join(codeyamRoot, '.codeyam');
141
+ const contextPath = path.join(contextDir, 'dev-mode-context.md');
142
+ try {
143
+ fs.mkdirSync(contextDir, { recursive: true });
144
+ const lines = ['# Dev Mode Context', ''];
145
+ // Entity section
146
+ lines.push('## Entity');
147
+ lines.push(`- **Name:** ${ctx.entityName}`);
148
+ if (ctx.entityType)
149
+ lines.push(`- **Type:** ${ctx.entityType}`);
150
+ if (ctx.entitySha)
151
+ lines.push(`- **SHA:** ${ctx.entitySha}`);
152
+ if (ctx.entityFilePath)
153
+ lines.push(`- **Source file:** ${ctx.entityFilePath}`);
154
+ lines.push('');
155
+ // Scenario section
156
+ if (ctx.scenarioName) {
157
+ lines.push('## Scenario');
158
+ lines.push(`- **Name:** ${ctx.scenarioName}`);
159
+ if (ctx.scenarioDescription)
160
+ lines.push(`- **Description:** ${ctx.scenarioDescription}`);
161
+ if (ctx.analysisId)
162
+ lines.push(`- **Analysis ID:** ${ctx.analysisId}`);
163
+ lines.push('');
164
+ }
165
+ // Files section
166
+ lines.push('## Files');
167
+ if (ctx.entityFilePath) {
168
+ lines.push(`- **Source file:** ${ctx.entityFilePath}`);
169
+ }
170
+ if (ctx.projectSlug && ctx.scenarioName) {
171
+ const tmpBase = `/tmp/codeyam/local-dev/${ctx.projectSlug}`;
172
+ const tmpProject = `${tmpBase}/project`;
173
+ const mockDataPath = findMockDataFile(tmpProject, ctx.entityFilePath, ctx.scenarioName);
174
+ if (mockDataPath) {
175
+ lines.push(`- **Mock data:** ${mockDataPath}`);
176
+ }
177
+ else {
178
+ const scenarioSlug = safeFileName(ctx.scenarioName);
179
+ lines.push(`- **Mock data:** search for \`MockData_${scenarioSlug}.tsx\` in \`__codeyamMocks__\` under ${tmpProject}`);
180
+ }
181
+ lines.push(`- **Dev server project:** ${tmpProject}`);
182
+ lines.push(`- **Server log:** ${tmpBase}/codeyam/log.txt`);
183
+ }
184
+ lines.push('');
185
+ // Database
186
+ lines.push('## Database');
187
+ lines.push(`- **Path:** .codeyam/db.sqlite3`);
188
+ lines.push('');
189
+ // Server
190
+ const serverPort = process.env.CODEYAM_PORT || '3111';
191
+ lines.push('## Server');
192
+ lines.push(`- **Refresh preview:** \`curl -X POST http://localhost:${serverPort}/api/dev-mode-refresh\``);
193
+ lines.push('');
194
+ fs.writeFileSync(contextPath, lines.join('\n'), 'utf8');
195
+ return true;
196
+ }
197
+ catch (error) {
198
+ console.error('[terminalServer] Failed to write dev-mode-context.md:', error);
199
+ return false;
200
+ }
201
+ }
202
+ /**
203
+ * Write a structured context file for the codeyam-editor skill.
204
+ * Returns true if context was written successfully, false otherwise.
205
+ */
206
+ function writeEditorModeContext(ctx) {
207
+ if (!ctx.projectSlug)
208
+ return false;
209
+ const codeyamRoot = process.env.CODEYAM_ROOT_PATH || process.cwd();
210
+ const contextDir = path.join(codeyamRoot, '.codeyam');
211
+ const contextPath = path.join(contextDir, 'editor-mode-context.md');
212
+ try {
213
+ fs.mkdirSync(contextDir, { recursive: true });
214
+ const serverPort = process.env.CODEYAM_PORT || '3111';
215
+ const proxyPort = parseInt(serverPort, 10) + 1;
216
+ const lines = [
217
+ '# Editor Mode Context',
218
+ '',
219
+ '## Project',
220
+ `- **Root:** ${codeyamRoot}`,
221
+ `- **Slug:** ${ctx.projectSlug}`,
222
+ '',
223
+ '## Server',
224
+ `- **Port:** ${serverPort}`,
225
+ `- **Dashboard:** http://localhost:${serverPort}/editor`,
226
+ `- **Proxy:** http://localhost:${proxyPort} (used by the browser iframe only — do NOT use for health checks)`,
227
+ '',
228
+ '## Workflow',
229
+ '- **Guided steps:** Run `codeyam editor` for the next step (plan → prototype → confirm → deconstruct → glossary → analyze → app scenarios → user scenarios → verify → review)',
230
+ '- Each feature follows 10 steps: `codeyam editor 1` through `codeyam editor 10`',
231
+ '- Steps 1, 3, and 10 require user confirmation before proceeding',
232
+ '',
233
+ '## Verifying the Dev Server',
234
+ '- Get the dev server URL: `curl -s http://localhost:' +
235
+ serverPort +
236
+ '/api/editor-dev-server` → look at the `"url"` field (e.g., `http://localhost:3000`)',
237
+ '- Check the page loads: `curl -s -o /dev/null -w "%{http_code}" http://localhost:3000` (use the actual dev server URL, NOT the proxy)',
238
+ '- Check API routes work: `curl -s http://localhost:3000/api/your-route` (should return JSON, not "Internal Server Error")',
239
+ '- **NEVER check localhost:' +
240
+ proxyPort +
241
+ ' for health** — the proxy returns 200 even when the app is broken',
242
+ '',
243
+ '## API Endpoints',
244
+ `- **Register scenario (auto-captures screenshot):** \`curl -X POST http://localhost:${serverPort}/api/editor-register-scenario -H 'Content-Type: application/json' -d '{"name":"...","description":"...","mockData":{"routes":{"/api/tasks":{"body":[...]}}}}\``,
245
+ `- **Get active scenario data:** \`curl http://localhost:${serverPort}/api/editor-scenario-data\``,
246
+ `- **Refresh preview:** \`curl -X POST http://localhost:${serverPort}/api/dev-mode-refresh\``,
247
+ `- **Refresh config:** \`curl -X POST http://localhost:${serverPort}/api/editor-refresh\` (also starts dev server if a webapp is detected)`,
248
+ `- **Dev server status:** \`curl http://localhost:${serverPort}/api/editor-dev-server\``,
249
+ `- **Start dev server:** \`curl -X POST http://localhost:${serverPort}/api/editor-dev-server -H 'Content-Type: application/json' -d '{"action":"start"}'\``,
250
+ `- **Restart dev server:** \`curl -X POST http://localhost:${serverPort}/api/editor-dev-server -H 'Content-Type: application/json' -d '{"action":"restart"}'\``,
251
+ `- **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)`,
252
+ `- **Journal screenshot:** \`curl -X POST http://localhost:${serverPort}/api/editor-journal-screenshot -H 'Content-Type: application/json' -d '{"url":"...","filename":"..."}'\``,
253
+ `- **Journal entry:** \`curl -X POST http://localhost:${serverPort}/api/editor-journal-entry -H 'Content-Type: application/json' -d '{"title":"...","type":"feature","description":"..."}'\``,
254
+ '',
255
+ '## Scenario Data Format',
256
+ '- Use **route-keyed** mock data: keys are the API paths your app fetches',
257
+ '- Example: `{ "routes": { "/api/tasks": { "body": [...] }, "/api/users": { "body": [...] } } }`',
258
+ '- Error scenarios: `{ "routes": { "/api/tasks": { "status": 500, "body": { "error": "..." } } } }`',
259
+ '- The proxy intercepts GET requests to matching routes and returns the mock data',
260
+ '- POST/PUT/DELETE always go through to the real dev server',
261
+ '',
262
+ '## Files',
263
+ '- **Scenario data:** .codeyam/editor-scenarios/{scenario-id}.json',
264
+ '- **Scenario screenshots:** .codeyam/editor-scenarios/screenshots/{scenario-id}.png',
265
+ '- **Active scenario:** .codeyam/active-scenario.json',
266
+ '- **Database:** .codeyam/db.sqlite3',
267
+ '- **Journal:** .codeyam/journal/ (daily .md files + index.json + screenshots/)',
268
+ '',
269
+ ];
270
+ // Check if package.json exists to give context about project state
271
+ const hasPackageJson = fs.existsSync(path.join(codeyamRoot, 'package.json'));
272
+ if (!hasPackageJson) {
273
+ lines.push('## Status');
274
+ lines.push('- **Empty project** — no package.json found. Ask the user what they want to build.');
275
+ lines.push('');
276
+ }
277
+ fs.writeFileSync(contextPath, lines.join('\n'), 'utf8');
278
+ return true;
279
+ }
280
+ catch (error) {
281
+ console.error('[terminalServer] Failed to write editor-mode-context.md:', error);
282
+ return false;
283
+ }
284
+ }
285
+ /**
286
+ * Attach a WebSocket server at /ws/terminal to an existing HTTP server.
287
+ * Each WS connection spawns a PTY running the user's shell, then auto-starts `claude`.
288
+ *
289
+ * Features:
290
+ * - Ping/pong keepalive (30s interval) to detect dead connections
291
+ * - PTY detach/reattach: on WS close the PTY survives for 60s, allowing the client
292
+ * to reconnect with ?reconnectId=<sessionId> and reattach to the same PTY
293
+ * - Session IDs sent to client on connection for reconnect tracking
294
+ */
295
+ export function attachTerminalServer(httpServer) {
296
+ const wss = new WebSocketServer({ server: httpServer, path: '/ws/terminal' });
297
+ // --- Ping/pong keepalive ---
298
+ // The browser's native WebSocket automatically responds to ping frames with pong.
299
+ if (pingInterval)
300
+ clearInterval(pingInterval);
301
+ pingInterval = setInterval(() => {
302
+ for (const session of sessions) {
303
+ if (!session.isAlive) {
304
+ // Didn't respond to last ping — terminate
305
+ console.log(`[terminalServer] Session ${session.sessionId} ping timeout, terminating`);
306
+ session.ws.terminate();
307
+ continue;
308
+ }
309
+ session.isAlive = false;
310
+ session.ws.ping();
311
+ }
312
+ }, PING_INTERVAL_MS);
313
+ globalThis.__codeyamPingInterval = pingInterval;
314
+ wss.on('connection', (ws, req) => {
315
+ // Parse entity context from query params
316
+ const url = new URL(req.url || '', `http://${req.headers.host}`);
317
+ const entityName = url.searchParams.get('entityName') || '';
318
+ const entityType = url.searchParams.get('entityType') || '';
319
+ const entitySha = url.searchParams.get('entitySha') || '';
320
+ const entityFilePath = url.searchParams.get('entityFilePath') || '';
321
+ const scenarioName = url.searchParams.get('scenarioName') || '';
322
+ const scenarioDescription = url.searchParams.get('scenarioDescription') || '';
323
+ const analysisId = url.searchParams.get('analysisId') || '';
324
+ const projectSlug = url.searchParams.get('projectSlug') || '';
325
+ const editorMode = url.searchParams.get('editorMode') === 'true';
326
+ const reconnectId = url.searchParams.get('reconnectId') || '';
327
+ // --- Reconnection: reattach to a detached PTY ---
328
+ if (reconnectId && detachedPtys.has(reconnectId)) {
329
+ const detached = detachedPtys.get(reconnectId);
330
+ clearTimeout(detached.graceTimer);
331
+ detachedPtys.delete(reconnectId);
332
+ console.log(`[terminalServer] Reattaching session ${reconnectId}`);
333
+ const session = {
334
+ ws,
335
+ ptyProcess: detached.ptyProcess,
336
+ sessionId: detached.sessionId,
337
+ isAlive: true,
338
+ };
339
+ sessions.add(session);
340
+ // Send session ID so client can track it
341
+ ws.send(JSON.stringify({ type: 'session-id', sessionId: session.sessionId }));
342
+ // Send buffered output so client catches up
343
+ if (detached.outputBuffer) {
344
+ ws.send(JSON.stringify({ type: 'output', data: detached.outputBuffer }));
345
+ }
346
+ // Re-wire PTY output -> new WebSocket
347
+ // node-pty's onData returns a disposable; the old listener was still attached
348
+ // and was buffering output into detached.outputBuffer. We need to replace it.
349
+ // Unfortunately node-pty doesn't expose removeListener, so we use a closure flag.
350
+ let detachedFlag = false;
351
+ detached.ptyProcess.onData((data) => {
352
+ if (detachedFlag)
353
+ return; // Superseded by a newer listener
354
+ if (ws.readyState === WebSocket.OPEN) {
355
+ if (!detached.hasClearedScreen &&
356
+ detached.hasContext &&
357
+ data.includes('╭')) {
358
+ detached.hasClearedScreen = true;
359
+ ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
360
+ }
361
+ ws.send(JSON.stringify({ type: 'output', data }));
362
+ }
363
+ });
364
+ detached.ptyProcess.onExit(() => {
365
+ sessions.delete(session);
366
+ if (ws.readyState === WebSocket.OPEN) {
367
+ ws.close();
368
+ }
369
+ });
370
+ // WebSocket messages -> PTY
371
+ ws.on('message', (raw) => {
372
+ try {
373
+ const msg = JSON.parse(raw.toString());
374
+ if (msg.type === 'input') {
375
+ detached.ptyProcess.write(msg.data);
376
+ }
377
+ else if (msg.type === 'resize' && msg.cols && msg.rows) {
378
+ detached.ptyProcess.resize(msg.cols, msg.rows);
379
+ }
380
+ }
381
+ catch {
382
+ detached.ptyProcess.write(raw.toString());
383
+ }
384
+ });
385
+ ws.on('pong', () => {
386
+ session.isAlive = true;
387
+ });
388
+ ws.on('close', () => {
389
+ detachedFlag = true;
390
+ detachSession(session, detached.hasContext, detached.hasClearedScreen);
391
+ });
392
+ return;
393
+ }
394
+ // --- New connection: spawn a fresh PTY ---
395
+ const shell = process.env.SHELL || '/bin/zsh';
396
+ const cwd = process.env.CODEYAM_ROOT_PATH || process.cwd();
397
+ // Verify cwd exists, fall back to HOME
398
+ const safeCwd = fs.existsSync(cwd) ? cwd : process.env.HOME || '/tmp';
399
+ // Spawn PTY with a clean env (no giant JSON blobs from CODEYAM_PROJECT etc.)
400
+ let ptyProcess;
401
+ try {
402
+ ptyProcess = pty.spawn(shell, ['-l'], {
403
+ name: 'xterm-256color',
404
+ cols: 120,
405
+ rows: 30,
406
+ cwd: safeCwd,
407
+ env: buildPtyEnv(),
408
+ });
409
+ }
410
+ catch (error) {
411
+ console.error('[terminalServer] Failed to spawn PTY:', {
412
+ shell,
413
+ cwd: safeCwd,
414
+ error,
415
+ });
416
+ ws.send(JSON.stringify({
417
+ type: 'output',
418
+ data: `\r\nFailed to start terminal: ${error.message}\r\n`,
419
+ }));
420
+ ws.close();
421
+ return;
422
+ }
423
+ const sessionId = crypto.randomUUID();
424
+ const session = {
425
+ ws,
426
+ ptyProcess,
427
+ sessionId,
428
+ isAlive: true,
429
+ };
430
+ sessions.add(session);
431
+ // Send session ID so client can use it for reconnection
432
+ ws.send(JSON.stringify({ type: 'session-id', sessionId }));
433
+ // Write context file for the appropriate skill (dev-mode or editor)
434
+ const hasContext = editorMode
435
+ ? writeEditorModeContext({ projectSlug })
436
+ : writeDevModeContext({
437
+ entityName,
438
+ entityType,
439
+ entitySha,
440
+ entityFilePath,
441
+ scenarioName,
442
+ scenarioDescription,
443
+ analysisId,
444
+ projectSlug,
445
+ });
446
+ let hasClearedScreen = false;
447
+ // PTY output -> WebSocket
448
+ ptyProcess.onData((data) => {
449
+ if (ws.readyState === WebSocket.OPEN) {
450
+ // When Claude Code starts (indicated by its box-drawing welcome banner),
451
+ // clear the screen to hide the raw shell command.
452
+ if (!hasClearedScreen && hasContext && data.includes('╭')) {
453
+ hasClearedScreen = true;
454
+ ws.send(JSON.stringify({ type: 'output', data: '\x1b[2J\x1b[H' }));
455
+ }
456
+ ws.send(JSON.stringify({ type: 'output', data }));
457
+ }
458
+ });
459
+ ptyProcess.onExit(() => {
460
+ sessions.delete(session);
461
+ // Also clean up from detachedPtys if it was detached
462
+ if (detachedPtys.has(sessionId)) {
463
+ clearTimeout(detachedPtys.get(sessionId).graceTimer);
464
+ detachedPtys.delete(sessionId);
465
+ }
466
+ if (ws.readyState === WebSocket.OPEN) {
467
+ ws.close();
468
+ }
469
+ });
470
+ // WebSocket messages -> PTY
471
+ ws.on('message', (raw) => {
472
+ try {
473
+ const msg = JSON.parse(raw.toString());
474
+ if (msg.type === 'input') {
475
+ ptyProcess.write(msg.data);
476
+ }
477
+ else if (msg.type === 'resize' && msg.cols && msg.rows) {
478
+ ptyProcess.resize(msg.cols, msg.rows);
479
+ }
480
+ }
481
+ catch {
482
+ // Non-JSON message, treat as raw input
483
+ ptyProcess.write(raw.toString());
484
+ }
485
+ });
486
+ ws.on('pong', () => {
487
+ session.isAlive = true;
488
+ });
489
+ ws.on('close', () => {
490
+ detachSession(session, hasContext, hasClearedScreen);
491
+ });
492
+ // Start Claude Code with the appropriate skill.
493
+ // Using a skill avoids shell escaping issues and multi-line paste detection.
494
+ setTimeout(() => {
495
+ if (editorMode && hasContext) {
496
+ ptyProcess.write("claude '/codeyam-editor'\r");
497
+ }
498
+ else if (hasContext) {
499
+ ptyProcess.write("claude '/codeyam-dev-mode'\r");
500
+ }
501
+ else {
502
+ ptyProcess.write('claude\r');
503
+ }
504
+ }, 500);
505
+ });
506
+ console.log('[terminalServer] WebSocket terminal server attached at /ws/terminal');
507
+ }
508
+ /**
509
+ * Detach a session's PTY instead of killing it, giving the client time to reconnect.
510
+ * The PTY is moved to `detachedPtys` with a grace timer; if the client reconnects
511
+ * within DETACH_GRACE_MS, the PTY is reattached. Otherwise it's killed.
512
+ */
513
+ function detachSession(session, hasContext = false, hasClearedScreen = false) {
514
+ sessions.delete(session);
515
+ const { sessionId, ptyProcess } = session;
516
+ // If already detached (shouldn't happen), skip
517
+ if (detachedPtys.has(sessionId))
518
+ return;
519
+ let outputBuffer = '';
520
+ // Buffer PTY output during detachment so the client can catch up on reconnect
521
+ ptyProcess.onData((data) => {
522
+ outputBuffer += data;
523
+ // Cap buffer size
524
+ if (outputBuffer.length > OUTPUT_BUFFER_MAX) {
525
+ outputBuffer = outputBuffer.slice(-OUTPUT_BUFFER_MAX);
526
+ }
527
+ });
528
+ const graceTimer = setTimeout(() => {
529
+ console.log(`[terminalServer] Grace period expired for session ${sessionId}, killing PTY`);
530
+ detachedPtys.delete(sessionId);
531
+ try {
532
+ ptyProcess.kill();
533
+ }
534
+ catch {
535
+ /* already dead */
536
+ }
537
+ }, DETACH_GRACE_MS);
538
+ detachedPtys.set(sessionId, {
539
+ ptyProcess,
540
+ sessionId,
541
+ graceTimer,
542
+ outputBuffer,
543
+ hasContext,
544
+ hasClearedScreen,
545
+ });
546
+ console.log(`[terminalServer] Session ${sessionId} detached, PTY kept alive for ${DETACH_GRACE_MS / 1000}s`);
547
+ }
548
+ /**
549
+ * Send a refresh-preview message to all connected terminal WebSocket clients.
550
+ * The Terminal component relays this to the parent page to reload the iframe.
551
+ */
552
+ export function broadcastPreviewRefresh() {
553
+ const msg = JSON.stringify({ type: 'refresh-preview' });
554
+ let count = 0;
555
+ for (const session of sessions) {
556
+ try {
557
+ if (session.ws.readyState === WebSocket.OPEN) {
558
+ session.ws.send(msg);
559
+ count++;
560
+ }
561
+ }
562
+ catch {
563
+ // Ignore send errors
564
+ }
565
+ }
566
+ return count;
567
+ }
568
+ /**
569
+ * Kill all active PTY sessions and detached PTYs. Call during shutdown.
570
+ */
571
+ export function cleanupAllTerminalSessions() {
572
+ // Clear ping interval
573
+ if (pingInterval) {
574
+ clearInterval(pingInterval);
575
+ pingInterval = null;
576
+ globalThis.__codeyamPingInterval = null;
577
+ }
578
+ // Clean up active sessions
579
+ for (const session of Array.from(sessions)) {
580
+ try {
581
+ session.ptyProcess.kill();
582
+ }
583
+ catch {
584
+ // Already dead
585
+ }
586
+ try {
587
+ session.ws.close();
588
+ }
589
+ catch {
590
+ // Already closed
591
+ }
592
+ }
593
+ sessions.clear();
594
+ // Clean up detached PTYs
595
+ for (const [, detached] of detachedPtys) {
596
+ clearTimeout(detached.graceTimer);
597
+ try {
598
+ detached.ptyProcess.kill();
599
+ }
600
+ catch {
601
+ // Already dead
602
+ }
603
+ }
604
+ detachedPtys.clear();
605
+ }
606
+ //# sourceMappingURL=terminalServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalServer.js","sourceRoot":"","sources":["../../../../src/webserver/terminalServer.ts"],"names":[],"mappings":"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"}