@codeyam/codeyam-cli 0.1.0-staging.a890816 → 0.1.0-staging.ad88eeb

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 (317) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +9 -9
  4. package/analyzer-template/packages/ai/package.json +1 -1
  5. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +0 -33
  6. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +13 -7
  7. package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
  8. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
  9. package/analyzer-template/packages/aws/package.json +2 -2
  10. package/analyzer-template/packages/database/package.json +3 -3
  11. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +20 -0
  12. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +4 -0
  13. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -1
  14. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +20 -0
  15. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
  16. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  17. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  18. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
  19. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
  20. package/analyzer-template/packages/github/package.json +1 -1
  21. package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
  22. package/analyzer-template/packages/ui-components/package.json +1 -1
  23. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  24. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  25. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
  26. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
  27. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
  28. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
  29. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
  30. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
  31. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
  32. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
  33. package/codeyam-cli/src/commands/default.js +3 -46
  34. package/codeyam-cli/src/commands/default.js.map +1 -1
  35. package/codeyam-cli/src/commands/editor.js +1893 -215
  36. package/codeyam-cli/src/commands/editor.js.map +1 -1
  37. package/codeyam-cli/src/commands/init.js +6 -1
  38. package/codeyam-cli/src/commands/init.js.map +1 -1
  39. package/codeyam-cli/src/data/techStacks.js +82 -0
  40. package/codeyam-cli/src/data/techStacks.js.map +1 -0
  41. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
  42. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
  43. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +127 -0
  44. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  45. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +635 -0
  46. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  47. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
  48. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
  49. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +279 -0
  50. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  51. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +121 -0
  52. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
  53. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
  54. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
  55. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +542 -0
  56. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  57. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +393 -0
  58. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
  59. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  60. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  61. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +217 -0
  62. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  63. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +266 -0
  64. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  65. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +107 -0
  66. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
  67. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
  68. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
  69. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +221 -0
  70. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
  71. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +221 -0
  72. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  73. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +213 -0
  74. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
  75. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +1737 -0
  76. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
  77. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  78. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  79. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +107 -0
  80. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
  81. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +101 -0
  82. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
  83. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  84. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  85. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  86. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  87. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +246 -0
  88. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
  89. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +25 -5
  90. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  91. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
  92. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
  93. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
  94. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
  95. package/codeyam-cli/src/utils/backgroundServer.js +2 -2
  96. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  97. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  98. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  99. package/codeyam-cli/src/utils/devServerState.js +71 -0
  100. package/codeyam-cli/src/utils/devServerState.js.map +1 -0
  101. package/codeyam-cli/src/utils/editorApi.js +73 -0
  102. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  103. package/codeyam-cli/src/utils/editorAudit.js +159 -0
  104. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  105. package/codeyam-cli/src/utils/editorCapture.js +102 -0
  106. package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
  107. package/codeyam-cli/src/utils/editorDevServer.js +193 -0
  108. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  109. package/codeyam-cli/src/utils/editorEntityChangeStatus.js +44 -0
  110. package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
  111. package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
  112. package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
  113. package/codeyam-cli/src/utils/editorJournal.js +225 -0
  114. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  115. package/codeyam-cli/src/utils/editorLoaderHelpers.js +81 -0
  116. package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
  117. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  118. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  119. package/codeyam-cli/src/utils/editorPreloadHelpers.js +135 -0
  120. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  121. package/codeyam-cli/src/utils/editorPreview.js +106 -0
  122. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  123. package/codeyam-cli/src/utils/editorScenarioSwitch.js +112 -0
  124. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
  125. package/codeyam-cli/src/utils/editorScenarios.js +96 -0
  126. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  127. package/codeyam-cli/src/utils/editorSeedAdapter.js +173 -0
  128. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
  129. package/codeyam-cli/src/utils/entityChangeStatus.js +347 -0
  130. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
  131. package/codeyam-cli/src/utils/entityChangeStatus.server.js +158 -0
  132. package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
  133. package/codeyam-cli/src/utils/git.js +51 -0
  134. package/codeyam-cli/src/utils/git.js.map +1 -1
  135. package/codeyam-cli/src/utils/install-skills.js +28 -17
  136. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  137. package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
  138. package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
  139. package/codeyam-cli/src/utils/project.js +15 -5
  140. package/codeyam-cli/src/utils/project.js.map +1 -1
  141. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  142. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  143. package/codeyam-cli/src/utils/scenariosManifest.js +112 -0
  144. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  145. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +46 -16
  146. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  147. package/codeyam-cli/src/utils/testRunner.js +1 -1
  148. package/codeyam-cli/src/utils/testRunner.js.map +1 -1
  149. package/codeyam-cli/src/utils/webappDetection.js +21 -0
  150. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  151. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +178 -0
  152. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  153. package/codeyam-cli/src/webserver/app/lib/git.js +396 -0
  154. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  155. package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-DmJveP3T.js → CopyButton-BPXZwM4t.js} +1 -1
  156. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BcgbViKV.js} +3 -3
  157. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-CQIG2qda.js} +9 -9
  158. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-BzHcG7SE.js} +3 -3
  159. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-B76aig_2.js → ScenarioViewer-0DY_NKil.js} +3 -3
  160. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-oAf2Kqsf.js +1 -0
  161. package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-DLxKhri3.js} +3 -3
  162. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-BcY3q6nt.js} +6 -6
  163. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  164. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  165. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  166. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-Bni3iiUj.js} +5 -5
  167. package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
  168. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  169. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  170. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  171. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  172. package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-BYOypzCa.js} +2 -2
  173. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-C_Pmso5S.js} +2 -2
  174. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-BVMi9VA5.js} +2 -2
  175. package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-n2FB0_Sw.js} +3 -3
  176. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CC6AbExI.js +41 -0
  177. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Csi0_PMl.js +1 -0
  178. package/codeyam-cli/src/webserver/build/client/assets/editor-BuT_Huj0.js +10 -0
  179. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-B7ztwLut.js +41 -0
  180. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-BF4oLwaE.js} +3 -3
  181. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D5rYBT5x.js +6 -0
  182. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CF164ouH.js +6 -0
  183. package/codeyam-cli/src/webserver/build/client/assets/{files-DO4CZ16O.js → files-BZrlFE1F.js} +1 -1
  184. package/codeyam-cli/src/webserver/build/client/assets/git-DdZcvjGh.js +1 -0
  185. package/codeyam-cli/src/webserver/build/client/assets/globals-BkWJ_UNc.css +1 -0
  186. package/codeyam-cli/src/webserver/build/client/assets/index-yHOVb4rc.js +15 -0
  187. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-DaAZ_H2w.js} +2 -2
  188. package/codeyam-cli/src/webserver/build/client/assets/manifest-b0f1372e.js +1 -0
  189. package/codeyam-cli/src/webserver/build/client/assets/{memory-FweZHj5U.js → memory-Bl2rpw8u.js} +13 -10
  190. package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-f5-1lKBt.js} +3 -3
  191. package/codeyam-cli/src/webserver/build/client/assets/{root-DiRdBreB.js → root-B_X8HS1x.js} +18 -18
  192. package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-Di64LWVb.js} +2 -2
  193. package/codeyam-cli/src/webserver/build/client/assets/{settings-DfuTtcJP.js → settings-0OrEMU6J.js} +1 -1
  194. package/codeyam-cli/src/webserver/build/client/assets/{simulations-B3aOzpCZ.js → simulations-DWT-CvLy.js} +1 -1
  195. package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-Br7MOqts.js} +3 -3
  196. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-BLdiCuG-.js} +2 -2
  197. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-CrAK28Bc.js +1 -0
  198. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  199. package/codeyam-cli/src/webserver/build/server/assets/{index-BzAbACSx.js → index-CbF6h3dj.js} +1 -1
  200. package/codeyam-cli/src/webserver/build/server/assets/server-build-DRFwTJqO.js +367 -0
  201. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  202. package/codeyam-cli/src/webserver/build-info.json +5 -5
  203. package/codeyam-cli/src/webserver/editorProxy.js +383 -50
  204. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
  205. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
  206. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +94 -4
  207. package/codeyam-cli/src/webserver/server.js +93 -12
  208. package/codeyam-cli/src/webserver/server.js.map +1 -1
  209. package/codeyam-cli/src/webserver/terminalServer.js +65 -112
  210. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  211. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  212. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  213. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  214. package/codeyam-cli/templates/chrome-extension-react/package.json +26 -0
  215. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  216. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  217. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  218. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  219. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  220. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  221. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  222. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  223. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +35 -0
  224. package/codeyam-cli/templates/editor-step-hook.py +95 -9
  225. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
  226. package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
  227. package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
  228. package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
  229. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
  230. package/codeyam-cli/templates/expo-react-native/app.json +18 -0
  231. package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
  232. package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
  233. package/codeyam-cli/templates/expo-react-native/global.css +3 -0
  234. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  235. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  236. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  237. package/codeyam-cli/templates/expo-react-native/package.json +37 -0
  238. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  239. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  240. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  241. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  242. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +112 -0
  243. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  244. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  245. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +9 -4
  246. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  247. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +21 -0
  248. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +4 -1
  249. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +4 -1
  250. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +92 -0
  251. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  252. package/codeyam-cli/templates/{nextjs-prisma-sqlite/PRISMA_SETUP.md → nextjs-prisma-supabase/SUPABASE_SETUP.md} +37 -17
  253. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  254. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  255. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  256. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  257. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  258. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  259. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  260. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  261. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  262. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  263. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +36 -0
  264. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  265. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  266. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  267. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  268. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  269. package/codeyam-cli/templates/{codeyam-dev-mode.md → skills/codeyam-dev-mode/SKILL.md} +2 -2
  270. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +145 -0
  271. package/codeyam-cli/templates/{codeyam-memory.md → skills/codeyam-memory/SKILL.md} +215 -0
  272. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  273. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  274. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  275. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  276. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  277. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  278. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  279. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  280. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  281. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  282. package/package.json +15 -10
  283. package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
  284. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  285. package/packages/analyze/src/lib/ProjectAnalyzer.js +10 -4
  286. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  287. package/packages/analyze/src/lib/asts/index.js +4 -2
  288. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  289. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
  290. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  291. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +20 -0
  292. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
  293. package/packages/types/src/enums/ProjectFramework.js +2 -0
  294. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  295. package/scripts/npm-post-install.cjs +34 -0
  296. package/codeyam-cli/src/webserver/build/client/assets/Terminal-CcG8YTLx.js +0 -41
  297. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +0 -1
  298. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CMT1jU2q.js +0 -21
  299. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +0 -1
  300. package/codeyam-cli/src/webserver/build/client/assets/editor-W_IGJ2Kd.js +0 -7
  301. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D6SEzMCu.js +0 -6
  302. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +0 -6
  303. package/codeyam-cli/src/webserver/build/client/assets/git-CFCTYk9I.js +0 -15
  304. package/codeyam-cli/src/webserver/build/client/assets/globals-BZB_H1w2.css +0 -1
  305. package/codeyam-cli/src/webserver/build/client/assets/manifest-8daa4147.js +0 -1
  306. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
  307. package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +0 -9
  308. package/codeyam-cli/src/webserver/build/server/assets/server-build-OdUocH6P.js +0 -362
  309. package/codeyam-cli/templates/codeyam-editor.md +0 -68
  310. package/scripts/finalize-analyzer.cjs +0 -13
  311. /package/codeyam-cli/templates/{codeyam-diagnose.md → commands/codeyam-diagnose.md} +0 -0
  312. /package/codeyam-cli/templates/{codeyam-debug.md → skills/codeyam-debug/SKILL.md} +0 -0
  313. /package/codeyam-cli/templates/{codeyam-new-rule.md → skills/codeyam-new-rule/SKILL.md} +0 -0
  314. /package/codeyam-cli/templates/{codeyam-setup.md → skills/codeyam-setup/SKILL.md} +0 -0
  315. /package/codeyam-cli/templates/{codeyam-sim.md → skills/codeyam-sim/SKILL.md} +0 -0
  316. /package/codeyam-cli/templates/{codeyam-test.md → skills/codeyam-test/SKILL.md} +0 -0
  317. /package/codeyam-cli/templates/{codeyam-verify.md → skills/codeyam-verify/SKILL.md} +0 -0
@@ -22,6 +22,10 @@ function detectFrameworkFromPackageJson(packageJsonPath) {
22
22
  return ProjectFramework.Remix;
23
23
  if (deps['react-scripts'])
24
24
  return ProjectFramework.CRA;
25
+ if (deps.expo)
26
+ return ProjectFramework.Expo;
27
+ if (deps.vite)
28
+ return ProjectFramework.Vite;
25
29
  return ProjectFramework.Unknown;
26
30
  }
27
31
  catch (error) {
@@ -98,6 +102,7 @@ function isWebAppDirectory(dirPath) {
98
102
  'react-scripts',
99
103
  'webpack-dev-server',
100
104
  'parcel',
105
+ 'expo',
101
106
  ];
102
107
  const possibleStartAndBuildScripts = Object.keys(scripts).filter((script) => ['dev', 'start', 'serve', 'build'].some((keyword) => script.includes(keyword)));
103
108
  const scriptsWithWebappPattern = possibleStartAndBuildScripts.filter((scriptName) => webappPatterns.some((pattern) => scripts[scriptName].includes(pattern)));
@@ -239,6 +244,22 @@ export function getDefaultStartScript(webappPath, projectRoot) {
239
244
  return null;
240
245
  }
241
246
  }
247
+ /**
248
+ * Merge detected webapps with existing config webapps.
249
+ * Detected webapps take precedence, but manually-configured webapps
250
+ * (those with a startCommand that aren't in the detected set) are preserved.
251
+ */
252
+ export function mergeWebApps(detected, existing) {
253
+ const detectedPaths = new Set(detected.map((w) => w.path));
254
+ const merged = [...detected];
255
+ for (const existingWebapp of existing) {
256
+ if (!detectedPaths.has(existingWebapp.path)) {
257
+ // Preserve manually-configured webapps not found by detection
258
+ merged.push(existingWebapp);
259
+ }
260
+ }
261
+ return merged;
262
+ }
242
263
  /**
243
264
  * Find which webapp a component belongs to based on its file path
244
265
  * Returns the webapp that contains the component, or the first webapp as fallback
@@ -1 +1 @@
1
- {"version":3,"file":"webappDetection.js","sourceRoot":"","sources":["../../../../src/utils/webappDetection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webappDetection.js","sourceRoot":"","sources":["../../../../src/utils/webappDetection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,178 @@
1
+ import http from 'http';
2
+ describe('editorProxy', () => {
3
+ describe('normalizeTargetUrl', () => {
4
+ it('should leave localhost as-is (no longer normalizes to 127.0.0.1)', () => {
5
+ const { normalizeTargetUrl } = require('../editorProxy');
6
+ expect(normalizeTargetUrl('http://localhost:3112')).toBe('http://localhost:3112');
7
+ });
8
+ it('should leave 127.0.0.1 unchanged', () => {
9
+ const { normalizeTargetUrl } = require('../editorProxy');
10
+ expect(normalizeTargetUrl('http://127.0.0.1:3112')).toBe('http://127.0.0.1:3112');
11
+ });
12
+ it('should leave other hostnames unchanged', () => {
13
+ const { normalizeTargetUrl } = require('../editorProxy');
14
+ expect(normalizeTargetUrl('http://myhost:3112')).toBe('http://myhost:3112');
15
+ });
16
+ it('should strip trailing slash', () => {
17
+ const { normalizeTargetUrl } = require('../editorProxy');
18
+ expect(normalizeTargetUrl('http://localhost:3112/')).toBe('http://localhost:3112');
19
+ });
20
+ });
21
+ describe('resolveLoopbackAddress', () => {
22
+ let server;
23
+ afterEach((done) => {
24
+ if (server?.listening) {
25
+ server.close(done);
26
+ }
27
+ else {
28
+ done();
29
+ }
30
+ });
31
+ it('should resolve to 127.0.0.1 when server binds to IPv4', async () => {
32
+ const { resolveLoopbackAddress } = require('../editorProxy');
33
+ server = http.createServer((_req, res) => res.end('ok'));
34
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', () => resolve()));
35
+ const port = server.address().port;
36
+ const host = await resolveLoopbackAddress(port);
37
+ expect(host).toBe('127.0.0.1');
38
+ });
39
+ it('should resolve to ::1 when server binds to IPv6 only', async () => {
40
+ const { resolveLoopbackAddress } = require('../editorProxy');
41
+ server = http.createServer((_req, res) => res.end('ok'));
42
+ await new Promise((resolve) => server.listen(0, '::1', () => resolve()));
43
+ const port = server.address().port;
44
+ const host = await resolveLoopbackAddress(port);
45
+ expect(host).toBe('::1');
46
+ });
47
+ it('should return null when no server is listening', async () => {
48
+ const { resolveLoopbackAddress } = require('../editorProxy');
49
+ const host = await resolveLoopbackAddress(19876);
50
+ expect(host).toBeNull();
51
+ });
52
+ });
53
+ describe('proxy forwarding uses 127.0.0.1', () => {
54
+ let targetServer;
55
+ let targetPort;
56
+ afterEach((done) => {
57
+ if (targetServer?.listening) {
58
+ targetServer.close(done);
59
+ }
60
+ else {
61
+ done();
62
+ }
63
+ });
64
+ it('should forward requests to target and return correct response', async () => {
65
+ const { startEditorProxy, stopEditorProxy } = require('../editorProxy');
66
+ // Start a target server that returns 200
67
+ targetServer = http.createServer((_req, res) => {
68
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
69
+ res.end('OK from target');
70
+ });
71
+ await new Promise((resolve) => targetServer.listen(0, '127.0.0.1', () => resolve()));
72
+ targetPort = targetServer.address().port;
73
+ // Start proxy pointing to the target using localhost URL
74
+ const result = await startEditorProxy({
75
+ port: 0, // let OS pick
76
+ targetUrl: `http://localhost:${targetPort}`,
77
+ });
78
+ expect(result).not.toBeNull();
79
+ // Make a request through the proxy
80
+ const response = await fetch(`http://127.0.0.1:${result.port}/`);
81
+ expect(response.status).toBe(200);
82
+ const body = await response.text();
83
+ expect(body).toBe('OK from target');
84
+ await stopEditorProxy();
85
+ });
86
+ it('should log when target returns non-2xx status', async () => {
87
+ const { startEditorProxy, stopEditorProxy } = require('../editorProxy');
88
+ // Start a target that returns 404
89
+ targetServer = http.createServer((_req, res) => {
90
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
91
+ res.end('Not Found');
92
+ });
93
+ await new Promise((resolve) => targetServer.listen(0, '127.0.0.1', () => resolve()));
94
+ targetPort = targetServer.address().port;
95
+ const warnSpy = jest.spyOn(console, 'warn').mockImplementation();
96
+ const result = await startEditorProxy({
97
+ port: 0,
98
+ targetUrl: `http://localhost:${targetPort}`,
99
+ });
100
+ const response = await fetch(`http://127.0.0.1:${result.port}/test-path`);
101
+ expect(response.status).toBe(404);
102
+ // Verify a warning was logged about the non-2xx response
103
+ expect(warnSpy.mock.calls.some((call) => String(call[0]).includes('[editorProxy]') &&
104
+ String(call[0]).includes('404') &&
105
+ String(call[0]).includes('/test-path'))).toBe(true);
106
+ warnSpy.mockRestore();
107
+ await stopEditorProxy();
108
+ });
109
+ it('should verify forwarding works after start via self-test', async () => {
110
+ const { startEditorProxy, stopEditorProxy, verifyProxyForwarding, } = require('../editorProxy');
111
+ // Start a target that returns 200
112
+ targetServer = http.createServer((_req, res) => {
113
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
114
+ res.end('healthy');
115
+ });
116
+ await new Promise((resolve) => targetServer.listen(0, '127.0.0.1', () => resolve()));
117
+ targetPort = targetServer.address().port;
118
+ const result = await startEditorProxy({
119
+ port: 0,
120
+ targetUrl: `http://localhost:${targetPort}`,
121
+ });
122
+ const verified = await verifyProxyForwarding();
123
+ expect(verified).toBe(true);
124
+ await stopEditorProxy();
125
+ });
126
+ it('should report verification failure when target is down', async () => {
127
+ const { startEditorProxy, stopEditorProxy, verifyProxyForwarding, } = require('../editorProxy');
128
+ const result = await startEditorProxy({
129
+ port: 0,
130
+ targetUrl: 'http://127.0.0.1:19876',
131
+ });
132
+ const verified = await verifyProxyForwarding();
133
+ expect(verified).toBe(false);
134
+ await stopEditorProxy();
135
+ });
136
+ it('should return false for verification when proxy is not running', async () => {
137
+ const { verifyProxyForwarding, stopEditorProxy, } = require('../editorProxy');
138
+ await stopEditorProxy();
139
+ const verified = await verifyProxyForwarding();
140
+ expect(verified).toBe(false);
141
+ });
142
+ it('should return 502 when target is unreachable', async () => {
143
+ const { startEditorProxy, stopEditorProxy } = require('../editorProxy');
144
+ // Start proxy pointing to a port with nothing listening
145
+ const result = await startEditorProxy({
146
+ port: 0,
147
+ targetUrl: 'http://localhost:19876',
148
+ });
149
+ expect(result).not.toBeNull();
150
+ const response = await fetch(`http://127.0.0.1:${result.port}/`);
151
+ expect(response.status).toBe(502);
152
+ await stopEditorProxy();
153
+ });
154
+ it('should forward requests to an IPv6-only target server', async () => {
155
+ const { startEditorProxy, stopEditorProxy } = require('../editorProxy');
156
+ // Start a target server bound to IPv6 only (::1) — this is what Vite 6 does on macOS
157
+ targetServer = http.createServer((_req, res) => {
158
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
159
+ res.end('OK from IPv6 target');
160
+ });
161
+ await new Promise((resolve) => targetServer.listen(0, '::1', () => resolve()));
162
+ targetPort = targetServer.address().port;
163
+ // Start proxy with a localhost URL (simulating Vite's "Local: http://localhost:PORT")
164
+ const result = await startEditorProxy({
165
+ port: 0,
166
+ targetUrl: `http://localhost:${targetPort}`,
167
+ });
168
+ expect(result).not.toBeNull();
169
+ // The proxy should successfully forward to the IPv6-only target
170
+ const response = await fetch(`http://127.0.0.1:${result.port}/`);
171
+ expect(response.status).toBe(200);
172
+ const body = await response.text();
173
+ expect(body).toBe('OK from IPv6 target');
174
+ await stopEditorProxy();
175
+ });
176
+ });
177
+ });
178
+ //# sourceMappingURL=editorProxy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editorProxy.test.js","sourceRoot":"","sources":["../../../../../src/webserver/__tests__/editorProxy.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACzD,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CACtD,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACzD,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CACtD,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACzD,MAAM,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CACnD,oBAAoB,CACrB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACzD,MAAM,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CACvD,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,IAAI,MAAmB,CAAC;QAExB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE7D,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAC/C,CAAC;YACF,MAAM,IAAI,GAAI,MAAM,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAE5C,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE7D,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACzC,CAAC;YACF,MAAM,IAAI,GAAI,MAAM,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAE5C,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE7D,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,IAAI,YAAyB,CAAC;QAC9B,IAAI,UAAkB,CAAC;QAEvB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,IAAI,YAAY,EAAE,SAAS,EAAE,CAAC;gBAC5B,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAExE,yCAAyC;YACzC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACrD,CAAC;YACF,UAAU,GAAI,YAAY,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAElD,yDAAyD;YACzD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC,EAAE,cAAc;gBACvB,SAAS,EAAE,oBAAoB,UAAU,EAAE;aAC5C,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE9B,mCAAmC;YACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,MAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAEpC,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAExE,kCAAkC;YAClC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACrD,CAAC;YACF,UAAU,GAAI,YAAY,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAElD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,oBAAoB,UAAU,EAAE;aAC5C,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,oBAAoB,MAAO,CAAC,IAAI,YAAY,CAC7C,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAElC,yDAAyD;YACzD,MAAM,CACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CACrB,CAAC,IAAI,EAAE,EAAE,CACP,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CACzC,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,EACJ,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE9B,kCAAkC;YAClC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACrD,CAAC;YACF,UAAU,GAAI,YAAY,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAElD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,oBAAoB,UAAU,EAAE;aAC5C,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE5B,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,EACJ,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE9B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,wBAAwB;aACpC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE7B,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,EACJ,qBAAqB,EACrB,eAAe,GAChB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC9B,MAAM,eAAe,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAExE,wDAAwD;YACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,wBAAwB;aACpC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,MAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAElC,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAExE,qFAAqF;YACrF,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAC/C,CAAC;YACF,UAAU,GAAI,YAAY,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAElD,sFAAsF;YACtF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,oBAAoB,UAAU,EAAE;aAC5C,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE9B,gEAAgE;YAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,MAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAEzC,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,396 @@
1
+ import { execSync } from 'child_process';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import { getProjectRoot as getProjectRootFromState } from "../../../state.js";
5
+ export function getGitStatus(rootPath) {
6
+ const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
7
+ try {
8
+ // Get git status with porcelain format for easy parsing
9
+ const output = execSync('git status --porcelain', {
10
+ cwd: workingDir,
11
+ encoding: 'utf8',
12
+ stdio: ['pipe', 'pipe', 'ignore'], // Suppress stderr
13
+ });
14
+ return parseGitStatus(output);
15
+ }
16
+ catch (error) {
17
+ console.error('Failed to get git status:', error);
18
+ return [];
19
+ }
20
+ }
21
+ function parseGitStatus(output) {
22
+ const lines = output
23
+ .trim()
24
+ .split('\n')
25
+ .filter((line) => line.length > 0);
26
+ const results = [];
27
+ for (const line of lines) {
28
+ // Git status format: XY filename
29
+ // X = staged status, Y = unstaged status
30
+ const staged = line[0];
31
+ const unstaged = line[1];
32
+ // Skip the two status characters and any following space
33
+ let filePath = line.slice(2).replace(/^[ \t]+/, '');
34
+ // Determine the primary status
35
+ let status;
36
+ let isStaged = false;
37
+ let oldPath;
38
+ if (staged === 'A' || unstaged === 'A') {
39
+ status = 'added';
40
+ isStaged = staged === 'A';
41
+ }
42
+ else if (staged === 'M' || unstaged === 'M') {
43
+ status = 'modified';
44
+ isStaged = staged === 'M';
45
+ }
46
+ else if (staged === 'D' || unstaged === 'D') {
47
+ status = 'deleted';
48
+ isStaged = staged === 'D';
49
+ }
50
+ else if (staged === 'R' || unstaged === 'R') {
51
+ status = 'renamed';
52
+ isStaged = staged === 'R';
53
+ // For renamed files, git shows: "oldfile.txt -> newfile.txt"
54
+ // Extract both the old and new filenames
55
+ const arrowIndex = filePath.indexOf(' -> ');
56
+ if (arrowIndex !== -1) {
57
+ oldPath = filePath.slice(0, arrowIndex).trim();
58
+ filePath = filePath.slice(arrowIndex + 4).trim();
59
+ }
60
+ }
61
+ else if (unstaged === '?') {
62
+ status = 'untracked';
63
+ isStaged = false;
64
+ }
65
+ else {
66
+ status = 'modified'; // Default fallback
67
+ isStaged = staged !== ' ' && staged !== '?';
68
+ }
69
+ // If it's a directory (ends with /), expand to show individual files
70
+ if (filePath.endsWith('/')) {
71
+ const workingDir = process.env.CODEYAM_ROOT_PATH || process.cwd();
72
+ const fullDirPath = path.join(workingDir, filePath);
73
+ try {
74
+ // Recursively find all files in the directory
75
+ const findFiles = (dir, baseDir) => {
76
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
77
+ const files = [];
78
+ for (const entry of entries) {
79
+ const fullPath = path.join(dir, entry.name);
80
+ const relativePath = path.relative(workingDir, fullPath);
81
+ if (entry.isDirectory()) {
82
+ files.push(...findFiles(fullPath, baseDir));
83
+ }
84
+ else if (entry.isFile()) {
85
+ files.push(relativePath);
86
+ }
87
+ }
88
+ return files;
89
+ };
90
+ const filesInDir = findFiles(fullDirPath, workingDir);
91
+ for (const file of filesInDir) {
92
+ results.push({
93
+ path: file,
94
+ status,
95
+ staged: isStaged,
96
+ ...(oldPath && { oldPath }),
97
+ });
98
+ }
99
+ }
100
+ catch (error) {
101
+ console.error(`Failed to expand directory ${filePath}:`, error);
102
+ // If we can't expand the directory, just skip it
103
+ }
104
+ }
105
+ else {
106
+ results.push({
107
+ path: filePath,
108
+ status,
109
+ staged: isStaged,
110
+ ...(oldPath && { oldPath }),
111
+ });
112
+ }
113
+ }
114
+ return results;
115
+ }
116
+ export function getFileModificationTime(filePath, rootPath) {
117
+ const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
118
+ const fullPath = path.join(workingDir, filePath);
119
+ try {
120
+ // Get the last commit time for this file
121
+ const output = execSync(`git log -1 --format=%ci "${filePath}"`, {
122
+ cwd: workingDir,
123
+ encoding: 'utf8',
124
+ stdio: ['pipe', 'pipe', 'ignore'],
125
+ });
126
+ return new Date(output.trim());
127
+ }
128
+ catch (error) {
129
+ // If git log fails, try to get file system modification time
130
+ try {
131
+ const stats = fs.statSync(fullPath);
132
+ return stats.mtime;
133
+ }
134
+ catch (fsError) {
135
+ console.error(`Failed to get modification time for ${filePath}:`, error);
136
+ return null;
137
+ }
138
+ }
139
+ }
140
+ export function isFileUncommitted(filePath, rootPath) {
141
+ const gitStatus = getGitStatus(rootPath);
142
+ return gitStatus.some((file) => file.path === filePath);
143
+ }
144
+ export function getCurrentBranch(rootPath) {
145
+ const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
146
+ try {
147
+ const output = execSync('git branch --show-current', {
148
+ cwd: workingDir,
149
+ encoding: 'utf8',
150
+ stdio: ['pipe', 'pipe', 'ignore'],
151
+ });
152
+ return output.trim() || null;
153
+ }
154
+ catch (error) {
155
+ console.error('Failed to get current branch:', error);
156
+ return null;
157
+ }
158
+ }
159
+ export function getDefaultBranch(rootPath) {
160
+ const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
161
+ try {
162
+ // Try to get the default branch from remote
163
+ const output = execSync('git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo ""', {
164
+ cwd: workingDir,
165
+ encoding: 'utf8',
166
+ stdio: ['pipe', 'pipe', 'ignore'],
167
+ });
168
+ const match = output.trim().match(/refs\/remotes\/origin\/(.+)/);
169
+ if (match) {
170
+ return match[1];
171
+ }
172
+ // Fallback: check if main or master exists locally
173
+ try {
174
+ execSync('git show-ref --verify --quiet refs/heads/main', {
175
+ cwd: workingDir,
176
+ stdio: ['pipe', 'pipe', 'ignore'],
177
+ });
178
+ return 'main';
179
+ }
180
+ catch {
181
+ // Try master
182
+ try {
183
+ execSync('git show-ref --verify --quiet refs/heads/master', {
184
+ cwd: workingDir,
185
+ stdio: ['pipe', 'pipe', 'ignore'],
186
+ });
187
+ return 'master';
188
+ }
189
+ catch {
190
+ // Default to main
191
+ return 'main';
192
+ }
193
+ }
194
+ }
195
+ catch (error) {
196
+ console.error('Failed to get default branch:', error);
197
+ return 'main';
198
+ }
199
+ }
200
+ export function getAllBranches(rootPath) {
201
+ const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
202
+ try {
203
+ const output = execSync('git branch --format="%(refname:short)"', {
204
+ cwd: workingDir,
205
+ encoding: 'utf8',
206
+ stdio: ['pipe', 'pipe', 'ignore'],
207
+ });
208
+ return output
209
+ .trim()
210
+ .split('\n')
211
+ .filter((branch) => branch.length > 0);
212
+ }
213
+ catch (error) {
214
+ console.error('Failed to get branches:', error);
215
+ return [];
216
+ }
217
+ }
218
+ // Helper functions that use getProjectRoot internally
219
+ // These are safe to call from route loaders
220
+ export function getGitStatusForProject() {
221
+ const rootPath = getProjectRootFromState();
222
+ return rootPath ? getGitStatus(rootPath) : [];
223
+ }
224
+ export function getCurrentBranchForProject() {
225
+ const rootPath = getProjectRootFromState();
226
+ return rootPath ? getCurrentBranch(rootPath) : null;
227
+ }
228
+ export function getDefaultBranchForProject() {
229
+ const rootPath = getProjectRootFromState();
230
+ return rootPath ? getDefaultBranch(rootPath) : 'main';
231
+ }
232
+ export function getAllBranchesForProject() {
233
+ const rootPath = getProjectRootFromState();
234
+ return rootPath ? getAllBranches(rootPath) : [];
235
+ }
236
+ export function getBranchDiffForProject(baseBranch, compareBranch) {
237
+ const rootPath = getProjectRootFromState();
238
+ return rootPath ? getBranchDiff(baseBranch, compareBranch, rootPath) : [];
239
+ }
240
+ export function getBranchDiff(baseBranch, compareBranch, rootPath) {
241
+ const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
242
+ try {
243
+ // Use three-dot syntax to get changes in compareBranch since it diverged from baseBranch
244
+ const output = execSync(`git diff --name-status ${baseBranch}...${compareBranch}`, {
245
+ cwd: workingDir,
246
+ encoding: 'utf8',
247
+ stdio: ['pipe', 'pipe', 'ignore'],
248
+ });
249
+ const lines = output
250
+ .trim()
251
+ .split('\n')
252
+ .filter((line) => line.length > 0);
253
+ return lines.map((line) => {
254
+ const parts = line.split('\t');
255
+ const statusCode = parts[0];
256
+ let filePath = parts[1];
257
+ let oldPath;
258
+ let status;
259
+ if (statusCode === 'A') {
260
+ status = 'added';
261
+ }
262
+ else if (statusCode === 'M') {
263
+ status = 'modified';
264
+ }
265
+ else if (statusCode === 'D') {
266
+ status = 'deleted';
267
+ }
268
+ else if (statusCode.startsWith('R')) {
269
+ status = 'renamed';
270
+ // For renamed files, git diff --name-status shows: "R100\told/path.ts\tnew/path.ts"
271
+ // parts[1] is old path, parts[2] is new path
272
+ oldPath = parts[1];
273
+ filePath = parts[2];
274
+ }
275
+ else {
276
+ status = 'modified'; // Default fallback
277
+ }
278
+ return { path: filePath, status, ...(oldPath && { oldPath }) };
279
+ });
280
+ }
281
+ catch (error) {
282
+ console.error('Failed to get branch diff:', error);
283
+ return [];
284
+ }
285
+ }
286
+ export function getFileDiff(filePath, rootPath) {
287
+ const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
288
+ try {
289
+ // Get the committed version (HEAD)
290
+ let oldContent = '';
291
+ try {
292
+ oldContent = execSync(`git show HEAD:"${filePath}"`, {
293
+ cwd: workingDir,
294
+ encoding: 'utf8',
295
+ stdio: ['pipe', 'pipe', 'ignore'],
296
+ maxBuffer: 1024 * 1024 * 10,
297
+ });
298
+ }
299
+ catch {
300
+ // File might be new
301
+ oldContent = '';
302
+ }
303
+ // Get the current working version
304
+ let newContent = '';
305
+ try {
306
+ newContent = fs.readFileSync(path.join(workingDir, filePath), 'utf8');
307
+ }
308
+ catch (error) {
309
+ // File might be deleted
310
+ console.error(`Failed to read current file ${filePath}:`, error);
311
+ newContent = '';
312
+ }
313
+ return {
314
+ oldContent,
315
+ newContent,
316
+ fileName: filePath,
317
+ };
318
+ }
319
+ catch (error) {
320
+ console.error(`Failed to get diff for ${filePath}:`, error);
321
+ return {
322
+ oldContent: 'Error loading old content',
323
+ newContent: 'Error loading new content',
324
+ fileName: filePath,
325
+ };
326
+ }
327
+ }
328
+ export function getFileDiffForProject(filePath) {
329
+ const rootPath = getProjectRootFromState();
330
+ if (!rootPath) {
331
+ return {
332
+ oldContent: 'Error: No project root',
333
+ newContent: 'Error: No project root',
334
+ fileName: filePath,
335
+ };
336
+ }
337
+ return getFileDiff(filePath, rootPath);
338
+ }
339
+ export function getBranchFileDiff(filePath, baseBranch, compareBranch, rootPath) {
340
+ const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
341
+ try {
342
+ // Get the file content from base branch
343
+ let oldContent = '';
344
+ try {
345
+ oldContent = execSync(`git show ${baseBranch}:"${filePath}"`, {
346
+ cwd: workingDir,
347
+ encoding: 'utf8',
348
+ stdio: ['pipe', 'pipe', 'ignore'],
349
+ maxBuffer: 1024 * 1024 * 10,
350
+ });
351
+ }
352
+ catch {
353
+ // File might not exist in base branch
354
+ oldContent = '';
355
+ }
356
+ // Get the file content from compare branch
357
+ let newContent = '';
358
+ try {
359
+ newContent = execSync(`git show ${compareBranch}:"${filePath}"`, {
360
+ cwd: workingDir,
361
+ encoding: 'utf8',
362
+ stdio: ['pipe', 'pipe', 'ignore'],
363
+ maxBuffer: 1024 * 1024 * 10,
364
+ });
365
+ }
366
+ catch {
367
+ // File might not exist in compare branch
368
+ newContent = '';
369
+ }
370
+ return {
371
+ oldContent,
372
+ newContent,
373
+ fileName: filePath,
374
+ };
375
+ }
376
+ catch (error) {
377
+ console.error(`Failed to get branch diff for ${filePath}:`, error);
378
+ return {
379
+ oldContent: 'Error loading old content',
380
+ newContent: 'Error loading new content',
381
+ fileName: filePath,
382
+ };
383
+ }
384
+ }
385
+ export function getBranchFileDiffForProject(filePath, baseBranch, compareBranch) {
386
+ const rootPath = getProjectRootFromState();
387
+ if (!rootPath) {
388
+ return {
389
+ oldContent: 'Error: No project root',
390
+ newContent: 'Error: No project root',
391
+ fileName: filePath,
392
+ };
393
+ }
394
+ return getBranchFileDiff(filePath, baseBranch, compareBranch, rootPath);
395
+ }
396
+ //# sourceMappingURL=git.js.map