@codeyam/codeyam-cli 0.1.8 → 0.1.10

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 (343) hide show
  1. package/analyzer-template/.build-info.json +8 -8
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +4 -4
  4. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +0 -33
  5. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +13 -7
  6. package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
  7. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
  8. package/analyzer-template/packages/aws/package.json +1 -1
  9. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +76 -0
  10. package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
  11. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +0 -65
  12. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +7 -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 +76 -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/database/src/lib/loadEntities.d.ts.map +1 -1
  17. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
  18. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  19. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  20. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +0 -25
  21. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  22. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  23. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  24. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
  25. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
  26. package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
  27. package/analyzer-template/packages/ui-components/package.json +1 -1
  28. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  29. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  30. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
  31. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
  32. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
  33. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
  34. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
  35. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
  36. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
  37. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
  38. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +45 -0
  39. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
  40. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +101 -47
  41. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
  42. package/codeyam-cli/src/commands/default.js +3 -46
  43. package/codeyam-cli/src/commands/default.js.map +1 -1
  44. package/codeyam-cli/src/commands/editor.js +1793 -257
  45. package/codeyam-cli/src/commands/editor.js.map +1 -1
  46. package/codeyam-cli/src/commands/init.js +67 -34
  47. package/codeyam-cli/src/commands/init.js.map +1 -1
  48. package/codeyam-cli/src/data/techStacks.js +77 -0
  49. package/codeyam-cli/src/data/techStacks.js.map +1 -0
  50. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
  51. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
  52. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
  53. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
  54. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
  55. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
  56. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +137 -0
  57. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  58. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +742 -1
  59. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
  60. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
  61. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
  62. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +181 -3
  63. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -1
  64. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +121 -0
  65. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
  66. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
  67. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
  68. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +249 -2
  69. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -1
  70. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +520 -0
  71. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
  72. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +118 -1
  73. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -1
  74. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +209 -3
  75. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -1
  76. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +153 -0
  77. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
  78. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
  79. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
  80. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +221 -0
  81. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
  82. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +985 -2
  83. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
  84. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +213 -0
  85. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
  86. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +1742 -0
  87. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
  88. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +107 -0
  89. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
  90. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
  91. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
  92. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +227 -0
  93. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
  94. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +454 -0
  95. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
  96. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +25 -5
  97. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  98. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
  99. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
  100. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
  101. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
  102. package/codeyam-cli/src/utils/analyzer.js +9 -0
  103. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  104. package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
  105. package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
  106. package/codeyam-cli/src/utils/backgroundServer.js +94 -18
  107. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  108. package/codeyam-cli/src/utils/database.js +37 -2
  109. package/codeyam-cli/src/utils/database.js.map +1 -1
  110. package/codeyam-cli/src/utils/devServerState.js +71 -0
  111. package/codeyam-cli/src/utils/devServerState.js.map +1 -0
  112. package/codeyam-cli/src/utils/editorApi.js +79 -0
  113. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  114. package/codeyam-cli/src/utils/editorAudit.js +135 -7
  115. package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
  116. package/codeyam-cli/src/utils/editorCapture.js +102 -0
  117. package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
  118. package/codeyam-cli/src/utils/editorDevServer.js +100 -1
  119. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -1
  120. package/codeyam-cli/src/utils/editorEntityChangeStatus.js +44 -0
  121. package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
  122. package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
  123. package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
  124. package/codeyam-cli/src/utils/editorJournal.js +92 -4
  125. package/codeyam-cli/src/utils/editorJournal.js.map +1 -1
  126. package/codeyam-cli/src/utils/editorLoaderHelpers.js +113 -0
  127. package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
  128. package/codeyam-cli/src/utils/editorMockState.js +1 -1
  129. package/codeyam-cli/src/utils/editorPreloadHelpers.js +72 -1
  130. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -1
  131. package/codeyam-cli/src/utils/editorPreview.js +72 -1
  132. package/codeyam-cli/src/utils/editorPreview.js.map +1 -1
  133. package/codeyam-cli/src/utils/editorScenarioSwitch.js +112 -0
  134. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
  135. package/codeyam-cli/src/utils/editorScenarios.js +331 -0
  136. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
  137. package/codeyam-cli/src/utils/editorSeedAdapter.js +173 -0
  138. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
  139. package/codeyam-cli/src/utils/entityChangeStatus.js +349 -0
  140. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
  141. package/codeyam-cli/src/utils/entityChangeStatus.server.js +158 -0
  142. package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
  143. package/codeyam-cli/src/utils/install-skills.js +1 -1
  144. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  145. package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
  146. package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
  147. package/codeyam-cli/src/utils/progress.js +2 -2
  148. package/codeyam-cli/src/utils/progress.js.map +1 -1
  149. package/codeyam-cli/src/utils/scenarioCoverage.js +75 -0
  150. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
  151. package/codeyam-cli/src/utils/scenariosManifest.js +241 -0
  152. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  153. package/codeyam-cli/src/utils/serverState.js +30 -0
  154. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  155. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +46 -16
  156. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  157. package/codeyam-cli/src/utils/simulationGateMiddleware.js +8 -1
  158. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
  159. package/codeyam-cli/src/utils/slugUtils.js +25 -0
  160. package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
  161. package/codeyam-cli/src/utils/syncMocksMiddleware.js +2 -2
  162. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  163. package/codeyam-cli/src/utils/webappDetection.js +21 -0
  164. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  165. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +40 -0
  166. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
  167. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +567 -0
  168. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  169. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +146 -0
  170. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
  171. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +65 -0
  172. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
  173. package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
  174. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  175. package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-DmJveP3T.js → CopyButton-BPXZwM4t.js} +1 -1
  176. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BcgbViKV.js} +3 -3
  177. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-CQIG2qda.js} +9 -9
  178. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-BzHcG7SE.js} +3 -3
  179. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-B76aig_2.js → ScenarioViewer-TSD3C211.js} +3 -3
  180. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-oAf2Kqsf.js +1 -0
  181. package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-DLxKhri3.js} +3 -3
  182. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-BcY3q6nt.js} +6 -6
  183. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  184. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  185. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  186. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-Bni3iiUj.js} +5 -5
  187. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  188. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  189. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  190. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
  191. package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-BYOypzCa.js} +2 -2
  192. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-C_Pmso5S.js} +2 -2
  193. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-BVMi9VA5.js} +2 -2
  194. package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-n2FB0_Sw.js} +3 -3
  195. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CC6AbExI.js +41 -0
  196. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Ii3inc0_.js +1 -0
  197. package/codeyam-cli/src/webserver/build/client/assets/editor-COWCNVyV.js +10 -0
  198. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-CNB06EIa.js +41 -0
  199. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-DwCV5__E.js} +3 -3
  200. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-CXSi2aeZ.js +6 -0
  201. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CHMiAog3.js +6 -0
  202. package/codeyam-cli/src/webserver/build/client/assets/{files-DO4CZ16O.js → files-BZrlFE1F.js} +1 -1
  203. package/codeyam-cli/src/webserver/build/client/assets/git-DdZcvjGh.js +1 -0
  204. package/codeyam-cli/src/webserver/build/client/assets/globals-phvmGvat.css +1 -0
  205. package/codeyam-cli/src/webserver/build/client/assets/index-yHOVb4rc.js +15 -0
  206. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-DaAZ_H2w.js} +2 -2
  207. package/codeyam-cli/src/webserver/build/client/assets/manifest-6134dc40.js +1 -0
  208. package/codeyam-cli/src/webserver/build/client/assets/memory-9gnxSZlb.js +101 -0
  209. package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-f5-1lKBt.js} +3 -3
  210. package/codeyam-cli/src/webserver/build/client/assets/root-BWAyuj0r.js +67 -0
  211. package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-Di64LWVb.js} +2 -2
  212. package/codeyam-cli/src/webserver/build/client/assets/{settings-DfuTtcJP.js → settings-0OrEMU6J.js} +1 -1
  213. package/codeyam-cli/src/webserver/build/client/assets/{simulations-B3aOzpCZ.js → simulations-DWT-CvLy.js} +1 -1
  214. package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-Br7MOqts.js} +3 -3
  215. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-BLdiCuG-.js} +2 -2
  216. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-C-_hOl_g.js +1 -0
  217. package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
  218. package/codeyam-cli/src/webserver/build/server/assets/index-ChX0hPcu.js +1 -0
  219. package/codeyam-cli/src/webserver/build/server/assets/init-kSNsMjj8.js +10 -0
  220. package/codeyam-cli/src/webserver/build/server/assets/server-build-Bm2xIhmh.js +439 -0
  221. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  222. package/codeyam-cli/src/webserver/build-info.json +5 -5
  223. package/codeyam-cli/src/webserver/editorProxy.js +487 -50
  224. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
  225. package/codeyam-cli/src/webserver/idleDetector.js +73 -0
  226. package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
  227. package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
  228. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +242 -3
  229. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +94 -4
  230. package/codeyam-cli/src/webserver/server.js +90 -16
  231. package/codeyam-cli/src/webserver/server.js.map +1 -1
  232. package/codeyam-cli/src/webserver/terminalServer.js +71 -34
  233. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  234. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  235. package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
  236. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  237. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  238. package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
  239. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  240. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  241. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  242. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  243. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  244. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  245. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  246. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  247. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
  248. package/codeyam-cli/templates/codeyam-editor-claude.md +84 -5
  249. package/codeyam-cli/templates/editor-step-hook.py +98 -8
  250. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
  251. package/codeyam-cli/templates/expo-react-native/README.md +41 -0
  252. package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
  253. package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
  254. package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
  255. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
  256. package/codeyam-cli/templates/expo-react-native/app.json +18 -0
  257. package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
  258. package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
  259. package/codeyam-cli/templates/expo-react-native/global.css +3 -0
  260. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  261. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  262. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  263. package/codeyam-cli/templates/expo-react-native/package.json +38 -0
  264. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  265. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  266. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  267. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  268. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
  269. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  270. package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
  271. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  272. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +9 -4
  273. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  274. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +21 -0
  275. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +5 -1
  276. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +4 -1
  277. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +92 -0
  278. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  279. package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
  280. package/codeyam-cli/templates/{nextjs-prisma-sqlite/PRISMA_SETUP.md → nextjs-prisma-supabase/SUPABASE_SETUP.md} +37 -17
  281. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  282. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  283. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  284. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  285. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  286. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  287. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  288. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  289. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  290. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  291. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
  292. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  293. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  294. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  295. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  296. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  297. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +2 -2
  298. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +97 -17
  299. package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +10 -10
  300. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  301. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  302. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  303. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  304. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  305. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  306. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  307. package/package.json +14 -9
  308. package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
  309. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  310. package/packages/analyze/src/lib/ProjectAnalyzer.js +10 -4
  311. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  312. package/packages/analyze/src/lib/asts/index.js +4 -2
  313. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  314. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
  315. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  316. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +76 -0
  317. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
  318. package/packages/database/src/lib/loadEntities.js +0 -6
  319. package/packages/database/src/lib/loadEntities.js.map +1 -1
  320. package/packages/database/src/lib/updateCommitMetadata.js +0 -25
  321. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  322. package/packages/types/src/enums/ProjectFramework.js +2 -0
  323. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  324. package/codeyam-cli/src/webserver/build/client/assets/Terminal-Dnj5CY9R.js +0 -41
  325. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +0 -1
  326. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CMT1jU2q.js +0 -21
  327. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +0 -1
  328. package/codeyam-cli/src/webserver/build/client/assets/editor-D1DAKXtT.js +0 -8
  329. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DkzqFzFj.js +0 -6
  330. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +0 -6
  331. package/codeyam-cli/src/webserver/build/client/assets/git-CFCTYk9I.js +0 -15
  332. package/codeyam-cli/src/webserver/build/client/assets/globals-B17TBSS6.css +0 -1
  333. package/codeyam-cli/src/webserver/build/client/assets/manifest-a632de18.js +0 -1
  334. package/codeyam-cli/src/webserver/build/client/assets/memory-Dg0mvYrI.js +0 -96
  335. package/codeyam-cli/src/webserver/build/client/assets/root-DUKqhFlb.js +0 -67
  336. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
  337. package/codeyam-cli/src/webserver/build/server/assets/index-HfLydfDq.js +0 -1
  338. package/codeyam-cli/src/webserver/build/server/assets/server-build-CUu_F-oo.js +0 -366
  339. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh +0 -108
  340. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh +0 -69
  341. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.sh +0 -12
  342. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter.jq +0 -45
  343. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.sh +0 -139
@@ -12,16 +12,16 @@ You are in **Editor Mode**. The user sees a split-screen: this terminal on the l
12
12
 
13
13
  You MUST follow a step-by-step workflow driven by `codeyam editor` commands. Each command tells you exactly what to do next. **You do NOT have all the instructions upfront** — the commands provide them incrementally.
14
14
 
15
- **Your first action:** Run `codeyam editor`.
15
+ **Your first action:** Run `codeyam editor steps`.
16
16
 
17
17
  **The rule:** After completing what a command tells you to do, run the NEXT command it specifies. The commands are your instructions — follow them one at a time.
18
18
 
19
19
  ## The Cycle
20
20
 
21
- Every feature follows 12 gated steps:
21
+ Every feature follows 13 gated steps:
22
22
 
23
23
  ```
24
- codeyam editor → Setup (if new) or cycle overview
24
+ codeyam editor steps → Setup (if new) or cycle overview
25
25
  codeyam editor 1 → Plan the feature (confirm with user)
26
26
  codeyam editor 2 → Build a working prototype fast
27
27
  codeyam editor 3 → Confirm prototype with user
@@ -33,10 +33,24 @@ codeyam editor 8 → Create app-level scenarios
33
33
  codeyam editor 9 → Create user-persona scenarios
34
34
  codeyam editor 10 → Verify screenshots and check for errors
35
35
  codeyam editor 11 → Create/update journal entry
36
- codeyam editor 12 → Present summary, get final approval
36
+ codeyam editor 12 → Verify screenshots and audit
37
+ codeyam editor 13 → Present summary, get final approval
37
38
  ```
38
39
 
39
- **You MUST run each command and follow its checklist before moving to the next.** Steps 1, 3, and 12 require user confirmation. After step 12, loop back to step 1.
40
+ **You MUST run each command and follow its checklist before moving to the next.** Steps 1, 3, and 13 require user confirmation. After step 13, loop back to step 1.
41
+
42
+ ## Handling User Feedback / Changes
43
+
44
+ When the user asks for changes — whether through the menu, a direct request, or even a question that implies a change (e.g., "Can the cards have images?") — you MUST run `codeyam editor change` **before** making any modifications. This includes:
45
+
46
+ - Code changes (components, routes, lib functions, styles)
47
+ - Scenario data updates (seed data, localStorage data, mock data)
48
+ - Style adjustments (CSS, Tailwind classes, layout tweaks)
49
+ - Even small fixes (typos, color tweaks, spacing)
50
+
51
+ This command gives you the post-change checklist (re-register scenarios, re-run tests, update journal, etc.). Never make changes without running the change workflow first.
52
+
53
+ **CRITICAL:** The change workflow MUST end with `codeyam editor 13`, which shows Working Session Results to the user. Skipping this step is a broken experience — the user will not see what changed and cannot approve or request further changes. Every change, no matter how small, must conclude with results being shown.
40
54
 
41
55
  ## Key Rules
42
56
 
@@ -45,25 +59,91 @@ codeyam editor 12 → Present summary, get final approval
45
59
  - **Always scaffold with a database** (Prisma + SQLite)
46
60
  - **Build real API routes** — the proxy handles scenario data transparently
47
61
  - **Start the dev server via the CodeYam API** — it handles proxy setup automatically
48
- - **Verify the preview after changes** — check the dev server URL, not the proxy
62
+ - **Keep the preview moving** — the user watches the preview panel as you work. Refresh it frequently so they see progress, not a static screen. See below.
63
+
64
+ ## Keep the Preview Moving
65
+
66
+ The user is watching the live preview panel while you work. A static preview makes it feel like nothing is happening. **Refresh the preview after every meaningful change** — not just at the end of a step.
67
+
68
+ **During prototyping (step 2):**
69
+
70
+ - Refresh after creating the first visible page, even if it's bare
71
+ - Refresh after adding each major UI section (header, list, form, etc.)
72
+ - Refresh after seeding data so the user sees real content appear
73
+ - Refresh after styling changes so the user sees the visual progress
74
+
75
+ **During extraction (step 5):**
76
+
77
+ - Refresh after extracting each batch of components to confirm nothing broke
78
+
79
+ **During changes:**
80
+
81
+ - Refresh after each individual change, not after all changes are done
82
+
83
+ **How to refresh:**
84
+
85
+ ```
86
+ codeyam editor preview '{"dimension":"<name from screenSizes>"}'
87
+ ```
88
+
89
+ Navigate to a specific path or switch scenario:
90
+
91
+ ```
92
+ codeyam editor preview '{"path":"/drinks/1","dimension":"<name from screenSizes>"}'
93
+ codeyam editor preview '{"scenarioId":"abc-123"}'
94
+ ```
95
+
96
+ The goal: the user should see the preview update 4-8+ times during a typical building session, not just once at the end.
97
+
98
+ ## Collaboration
99
+
100
+ Isolation routes are committed to git (not gitignored). They are protected by a layout guard at `app/isolated-components/layout.tsx` that returns `notFound()` in production, so they are safe to commit. Scenarios, screenshots, journal entries, and the glossary are also committed. Only the local database and secrets are gitignored.
101
+
102
+ When a collaborator clones the repo and runs `codeyam editor`, scenarios are auto-imported from `scenarios-manifest.json`. Run `codeyam editor sync` to manually re-sync after pulling new changes.
49
103
 
50
104
  ## Quick Reference
51
105
 
52
106
  ```bash
53
- # Register scenario (auto-captures screenshot)
54
- curl -s -X POST http://localhost:${CODEYAM_PORT:-3111}/api/editor-register-scenario \
55
- -H 'Content-Type: application/json' \
56
- -d '{"name":"...","description":"...","mockData":{"routes":{"/api/...":{"body":[...]}}}}'
107
+ # Register component scenario (auto-captures screenshot)
108
+ # ALWAYS include "dimensions" — use the project's default screen size name from setup
109
+ codeyam editor register '{"name":"DrinkCard - Default","componentName":"DrinkCard","componentPath":"app/components/DrinkCard.tsx","url":"/isolated-components/DrinkCard?s=Default","dimensions":["<name from screenSizes>"],"mockData":{"routes":{"/api/...":{"body":[...]}}}}'
110
+
111
+ # Register app scenario with seed data (ALWAYS include "url" and "dimensions")
112
+ codeyam editor register '{"name":"Full Catalog","type":"application","url":"/","dimensions":["<name from screenSizes>"],"seed":{"drinks":[...]}}'
113
+
114
+ # Register app scenario with localStorage (for apps using client-side storage instead of a database)
115
+ codeyam editor register '{"name":"Full Library","type":"application","url":"/","dimensions":["<name from screenSizes>"],"localStorage":{"articles":[...],"collections":[...]}}'
116
+
117
+ # For large seed/localStorage data, write JSON to a temp file and use @ prefix:
118
+ codeyam editor register @/tmp/scenario-data.json
57
119
 
58
120
  # Journal entry (one per feature, references scenario names)
59
- curl -s -X POST http://localhost:${CODEYAM_PORT:-3111}/api/editor-journal-entry \
60
- -H 'Content-Type: application/json' \
61
- -d '{"title":"...","type":"feature","description":"...","scenarios":["..."]}'
121
+ codeyam editor journal '{"title":"...","type":"feature","description":"..."}'
122
+
123
+ # Update journal with commit info
124
+ codeyam editor journal-update '{"time":"...","commitSha":"...","commitMessage":"..."}'
125
+
126
+ # Refresh preview / navigate / switch scenario (ALWAYS include "dimension")
127
+ codeyam editor preview '{"dimension":"<name from screenSizes>"}'
128
+ codeyam editor preview '{"path":"/drinks/1","dimension":"<name from screenSizes>"}'
129
+ codeyam editor preview '{"scenarioId":"abc-123"}'
62
130
 
63
- # Refresh preview
64
- curl -s -X POST http://localhost:${CODEYAM_PORT:-3111}/api/dev-mode-preview
131
+ # Show/hide results panel
132
+ codeyam editor show-results
133
+ codeyam editor hide-results
134
+
135
+ # Commit feature
136
+ codeyam editor commit '{"message":"feat: Add drinks page"}'
65
137
 
66
138
  # Restart dev server (only for config/dependency changes)
67
- curl -s -X POST http://localhost:${CODEYAM_PORT:-3111}/api/editor-dev-server \
68
- -H 'Content-Type: application/json' -d '{"action":"restart"}'
139
+ codeyam editor dev-server '{"action":"restart"}'
140
+
141
+ # Check for client-side errors
142
+ codeyam editor client-errors
143
+
144
+ # Verify all images load (extracts URLs from pages, HTTP-checks each one)
145
+ codeyam editor verify-images '{"paths":["/","/drinks/1"]}'
146
+
147
+ # Sync scenarios from manifest (after pulling collaborator changes)
148
+ codeyam editor sync
69
149
  ```
@@ -225,31 +225,31 @@ rm -rf /tmp/codeyam-memory/ /tmp/cc-session-analysis/
225
225
  ```
226
226
 
227
227
  ```bash
228
- bash .claude/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh
228
+ node .claude/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs
229
229
  ```
230
230
 
231
231
  ```bash
232
- bash .claude/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh
232
+ node .claude/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs
233
233
  ```
234
234
 
235
235
  ```bash
236
- bash .claude/skills/codeyam-memory/scripts/session-mining/preprocess.sh 2>/dev/null
236
+ node .claude/skills/codeyam-memory/scripts/session-mining/preprocess.mjs 2>/dev/null
237
237
  ```
238
238
 
239
- Capture the stdout of `preprocess.sh` — each line is a path to a filtered session file.
239
+ Capture the stdout of `preprocess.mjs` — each line is a path to a filtered session file.
240
240
 
241
241
  ### Step 2: Extract sizing metrics
242
242
 
243
- Use quick `jq` one-liners to extract counts — do NOT read the full JSON files into the main context:
243
+ Use quick one-liners to extract counts — do NOT read the full JSON files into the main context:
244
244
 
245
245
  ```bash
246
- jq '.dependencies | length' /tmp/codeyam-memory/deprecated-scan.json
247
- jq '.explicit_markers | length' /tmp/codeyam-memory/deprecated-scan.json
248
- jq '.stats.total_exports' /tmp/codeyam-memory/exports-scan.json
249
- jq '.stats.total_files' /tmp/codeyam-memory/exports-scan.json
246
+ node .claude/skills/codeyam-memory/scripts/lib/read-json-field.mjs /tmp/codeyam-memory/deprecated-scan.json '.dependencies | length'
247
+ node .claude/skills/codeyam-memory/scripts/lib/read-json-field.mjs /tmp/codeyam-memory/deprecated-scan.json '.explicit_markers | length'
248
+ node .claude/skills/codeyam-memory/scripts/lib/read-json-field.mjs /tmp/codeyam-memory/exports-scan.json '.stats.total_exports'
249
+ node .claude/skills/codeyam-memory/scripts/lib/read-json-field.mjs /tmp/codeyam-memory/exports-scan.json '.stats.total_files'
250
250
  ```
251
251
 
252
- The session count is the number of lines from `preprocess.sh` stdout.
252
+ The session count is the number of lines from `preprocess.mjs` stdout.
253
253
 
254
254
  **Time estimate formulas:**
255
255
 
@@ -0,0 +1,139 @@
1
+ #!/usr/bin/env node
2
+ // Gathers deprecation signals from package.json, source markers, and git history.
3
+ // Outputs structured JSON to /tmp/codeyam-memory/deprecated-scan.json
4
+
5
+ import { readdir, readFile, mkdir, writeFile } from 'node:fs/promises';
6
+ import { execFileSync } from 'node:child_process';
7
+ import { join } from 'node:path';
8
+ import { ripgrepSearch } from '../lib/ripgrep-fallback.mjs';
9
+
10
+ const OUTPUT_DIR = '/tmp/codeyam-memory';
11
+ const OUTPUT_FILE = join(OUTPUT_DIR, 'deprecated-scan.json');
12
+ await mkdir(OUTPUT_DIR, { recursive: true });
13
+
14
+ // --- Dependency scan ---
15
+ // Collect all dependency names from package.json files
16
+ const allDeps = new Set();
17
+ const packageFiles = await findFiles('.', 'package.json', ['node_modules', 'dist', '.next']);
18
+
19
+ for (const pkgPath of packageFiles) {
20
+ try {
21
+ const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
22
+ for (const key of ['dependencies', 'devDependencies']) {
23
+ if (pkg[key] && typeof pkg[key] === 'object') {
24
+ for (const dep of Object.keys(pkg[key])) allDeps.add(dep);
25
+ }
26
+ }
27
+ } catch {
28
+ // Skip unparseable package.json
29
+ }
30
+ }
31
+
32
+ const dependencies = [...allDeps].sort();
33
+
34
+ // --- Explicit marker scan ---
35
+ let explicitMarkers = [];
36
+
37
+ const markerOutput = await ripgrepSearch(
38
+ '@deprecated|// legacy|// deprecated|// old approach|TODO.*deprecat|FIXME.*deprecat',
39
+ {
40
+ types: ['ts', 'js'],
41
+ globs: ['!node_modules', '!dist', '!build', '!.next'],
42
+ context: 2,
43
+ lineNumbers: true,
44
+ },
45
+ );
46
+
47
+ if (markerOutput.trim()) {
48
+ // Parse ripgrep output into structured entries
49
+ for (const line of markerOutput.split('\n')) {
50
+ // Match "file:line:text" (colons in file path unlikely for these repos)
51
+ const match = line.match(/^([^:]+):(\d+):(.*)$/);
52
+ if (match) {
53
+ explicitMarkers.push({
54
+ file: match[1],
55
+ line: parseInt(match[2], 10),
56
+ text: match[3].trim(),
57
+ });
58
+ }
59
+ }
60
+ }
61
+
62
+ // --- Git recency comparison ---
63
+ const gitRecency = {};
64
+
65
+ if (dependencies.length > 0) {
66
+ const recentImports = gitImports('3 months ago', undefined);
67
+ const oldImports = gitImports('12 months ago', '3 months ago');
68
+
69
+ for (const dep of dependencies) {
70
+ if (dep.length < 3) continue; // Skip short names that match too broadly
71
+
72
+ const pattern = `from ['"]${dep}`;
73
+ const recent = countMatches(recentImports, pattern);
74
+ const old = countMatches(oldImports, pattern);
75
+
76
+ if (recent > 0 || old > 0) {
77
+ gitRecency[dep] = { recent_imports: recent, old_imports: old };
78
+ }
79
+ }
80
+ }
81
+
82
+ // --- Assemble final output ---
83
+ const output = {
84
+ dependencies,
85
+ explicit_markers: explicitMarkers,
86
+ git_recency: gitRecency,
87
+ };
88
+
89
+ await writeFile(OUTPUT_FILE, JSON.stringify(output, null, 2));
90
+
91
+ console.log(`Deprecated pattern scan complete: ${OUTPUT_FILE}`);
92
+ console.log(` Dependencies found: ${dependencies.length}`);
93
+ console.log(` Explicit markers found: ${explicitMarkers.length}`);
94
+ console.log(` Deps with git activity: ${Object.keys(gitRecency).length}`);
95
+
96
+ // --- Helpers ---
97
+
98
+ async function findFiles(dir, filename, ignoreDirs) {
99
+ const results = [];
100
+ const ignoreSet = new Set(ignoreDirs);
101
+
102
+ let entries;
103
+ try {
104
+ entries = await readdir(dir, { recursive: true, withFileTypes: true });
105
+ } catch {
106
+ return results;
107
+ }
108
+
109
+ for (const entry of entries) {
110
+ if (!entry.isFile() || entry.name !== filename) continue;
111
+ const parentPath = entry.parentPath ?? entry.path; // parentPath in Node 22+
112
+ const parts = parentPath.split('/');
113
+ if (parts.some((p) => ignoreSet.has(p))) continue;
114
+ results.push(join(parentPath, entry.name));
115
+ }
116
+ return results;
117
+ }
118
+
119
+ function gitImports(since, until) {
120
+ const args = ['log', `--since=${since}`, '-p', '--', '*.ts', '*.tsx', '*.js', '*.jsx'];
121
+ if (until) args.splice(2, 0, `--until=${until}`);
122
+
123
+ try {
124
+ const output = execFileSync('git', args, {
125
+ maxBuffer: 100 * 1024 * 1024,
126
+ encoding: 'utf-8',
127
+ stdio: ['pipe', 'pipe', 'pipe'],
128
+ });
129
+ return output;
130
+ } catch {
131
+ return '';
132
+ }
133
+ }
134
+
135
+ function countMatches(text, pattern) {
136
+ const regex = new RegExp(pattern, 'g');
137
+ const matches = text.match(regex);
138
+ return matches ? matches.length : 0;
139
+ }
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ // Indexes the project's public API surface by finding all exports.
3
+ // Outputs structured JSON to /tmp/codeyam-memory/exports-scan.json
4
+
5
+ import { mkdir, writeFile } from 'node:fs/promises';
6
+ import { join } from 'node:path';
7
+ import { ripgrepSearch } from '../lib/ripgrep-fallback.mjs';
8
+
9
+ const OUTPUT_DIR = '/tmp/codeyam-memory';
10
+ const OUTPUT_FILE = join(OUTPUT_DIR, 'exports-scan.json');
11
+ await mkdir(OUTPUT_DIR, { recursive: true });
12
+
13
+ const exportOutput = await ripgrepSearch(
14
+ '^export (function|const|class|default|async function|type|interface|enum)',
15
+ {
16
+ types: ['ts', 'js'],
17
+ globs: ['!node_modules', '!dist', '!build', '!.next', '!*.d.ts', '!*.map'],
18
+ lineNumbers: true,
19
+ },
20
+ );
21
+
22
+ if (!exportOutput.trim()) {
23
+ const empty = { files: {}, stats: { total_files: 0, total_exports: 0 } };
24
+ await writeFile(OUTPUT_FILE, JSON.stringify(empty, null, 2));
25
+ console.log(`Export scan complete: ${OUTPUT_FILE} (no exports found)`);
26
+ process.exit(0);
27
+ }
28
+
29
+ // Parse ripgrep output and group by file
30
+ const files = {};
31
+ for (const line of exportOutput.split('\n')) {
32
+ const match = line.match(/^([^:]+):(\d+):(.*)$/);
33
+ if (!match) continue;
34
+
35
+ const [, file, lineNum, text] = match;
36
+ if (!files[file]) files[file] = [];
37
+ files[file].push({ line: parseInt(lineNum, 10), text: text.trim() });
38
+ }
39
+
40
+ const totalFiles = Object.keys(files).length;
41
+ const totalExports = Object.values(files).reduce((sum, arr) => sum + arr.length, 0);
42
+
43
+ const output = {
44
+ files,
45
+ stats: { total_files: totalFiles, total_exports: totalExports },
46
+ };
47
+
48
+ await writeFile(OUTPUT_FILE, JSON.stringify(output, null, 2));
49
+
50
+ console.log(`Export scan complete: ${OUTPUT_FILE}`);
51
+ console.log(` Files with exports: ${totalFiles}`);
52
+ console.log(` Total exports: ${totalExports}`);
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ // Lightweight jq replacement for simple field lookups.
3
+ // Usage: node read-json-field.mjs <file> '<expression>'
4
+ // Supports: .field.subfield, .field | length
5
+
6
+ import { readFile } from 'node:fs/promises';
7
+
8
+ const [, , filePath, expression] = process.argv;
9
+
10
+ if (!filePath || !expression) {
11
+ console.error('Usage: node read-json-field.mjs <file> <expression>');
12
+ process.exit(1);
13
+ }
14
+
15
+ try {
16
+ const raw = await readFile(filePath, 'utf-8');
17
+ const data = JSON.parse(raw);
18
+ const result = evaluate(data, expression);
19
+ console.log(typeof result === 'string' ? result : JSON.stringify(result));
20
+ } catch (err) {
21
+ console.error(err.message);
22
+ process.exit(1);
23
+ }
24
+
25
+ function evaluate(data, expr) {
26
+ const trimmed = expr.trim();
27
+
28
+ // Handle pipe: ".field | length"
29
+ const pipeIdx = trimmed.indexOf('|');
30
+ if (pipeIdx !== -1) {
31
+ const left = trimmed.slice(0, pipeIdx).trim();
32
+ const right = trimmed.slice(pipeIdx + 1).trim();
33
+ const intermediate = resolvePath(data, left);
34
+
35
+ if (right === 'length') {
36
+ if (Array.isArray(intermediate)) return intermediate.length;
37
+ if (typeof intermediate === 'object' && intermediate !== null) return Object.keys(intermediate).length;
38
+ if (typeof intermediate === 'string') return intermediate.length;
39
+ throw new Error(`Cannot get length of ${typeof intermediate}`);
40
+ }
41
+ throw new Error(`Unsupported pipe function: ${right}`);
42
+ }
43
+
44
+ return resolvePath(data, trimmed);
45
+ }
46
+
47
+ function resolvePath(data, pathExpr) {
48
+ // Strip leading dot: ".foo.bar" -> "foo.bar"
49
+ const cleaned = pathExpr.startsWith('.') ? pathExpr.slice(1) : pathExpr;
50
+ if (cleaned === '') return data;
51
+
52
+ const keys = cleaned.split('.');
53
+ let current = data;
54
+ for (const key of keys) {
55
+ if (current == null || typeof current !== 'object') {
56
+ throw new Error(`Cannot access '${key}' on ${JSON.stringify(current)}`);
57
+ }
58
+ current = current[key];
59
+ }
60
+ return current;
61
+ }
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env node
2
+ // Shared ripgrep wrapper with pure-Node fallback when rg is not installed.
3
+
4
+ import { execFile } from 'node:child_process';
5
+ import { readdir, readFile } from 'node:fs/promises';
6
+ import { join } from 'node:path';
7
+
8
+ /**
9
+ * @param {string} pattern - Regex pattern to search for
10
+ * @param {object} [opts]
11
+ * @param {string[]} [opts.types] - File type filters, e.g. ['ts', 'js']
12
+ * @param {string[]} [opts.globs] - Glob filters, e.g. ['!node_modules']
13
+ * @param {number} [opts.context] - Lines of context around matches (-C)
14
+ * @param {boolean} [opts.lineNumbers] - Include line numbers (-n)
15
+ * @param {string} [opts.cwd] - Working directory (defaults to process.cwd())
16
+ * @returns {Promise<string>} ripgrep-compatible output: "file:line:text\n" lines
17
+ */
18
+ export async function ripgrepSearch(pattern, opts = {}) {
19
+ const { types = [], globs = [], context, lineNumbers = true, cwd = process.cwd() } = opts;
20
+
21
+ try {
22
+ return await runRipgrep(pattern, { types, globs, context, lineNumbers, cwd });
23
+ } catch (err) {
24
+ if (err.code === 'ENOENT') {
25
+ // rg not installed — use Node fallback
26
+ return nodeFallback(pattern, { types, globs, context, lineNumbers, cwd });
27
+ }
28
+ throw err;
29
+ }
30
+ }
31
+
32
+ function runRipgrep(pattern, { types, globs, context, lineNumbers, cwd }) {
33
+ return new Promise((resolve, reject) => {
34
+ const args = [];
35
+ if (lineNumbers) args.push('-n');
36
+ if (context != null) args.push('-C', String(context));
37
+ for (const t of types) args.push('--type', t);
38
+ for (const g of globs) args.push('--glob', g);
39
+ args.push(pattern, '.'); // Explicit path prevents rg from reading stdin
40
+
41
+ execFile('rg', args, { cwd, maxBuffer: 50 * 1024 * 1024 }, (err, stdout) => {
42
+ if (err) {
43
+ // Exit code 1 = no matches, 2 = error (e.g. no files searched)
44
+ if (err.code === 1 || err.code === 2) return resolve('');
45
+ // ENOENT = rg binary not found
46
+ if (err.code === 'ENOENT') {
47
+ const e = new Error('rg not found');
48
+ e.code = 'ENOENT';
49
+ return reject(e);
50
+ }
51
+ return reject(err);
52
+ }
53
+ resolve(stdout);
54
+ });
55
+ });
56
+ }
57
+
58
+ const TYPE_EXTENSIONS = {
59
+ ts: ['.ts', '.tsx', '.mts', '.cts'],
60
+ js: ['.js', '.jsx', '.mjs', '.cjs'],
61
+ };
62
+
63
+ const DEFAULT_IGNORE = ['node_modules', 'dist', 'build', '.next', '.git'];
64
+
65
+ async function nodeFallback(pattern, { types = [], globs = [], context, lineNumbers = true, cwd = process.cwd() } = {}) {
66
+ // Build file extension filter from types
67
+ const extensions = new Set();
68
+ for (const t of types) {
69
+ const exts = TYPE_EXTENSIONS[t];
70
+ if (exts) exts.forEach((e) => extensions.add(e));
71
+ }
72
+
73
+ // Parse globs for negative patterns (simple heuristic: "!dirname")
74
+ const ignoreDirs = new Set(DEFAULT_IGNORE);
75
+ for (const g of globs) {
76
+ if (g.startsWith('!')) ignoreDirs.add(g.slice(1));
77
+ }
78
+ // Also handle glob patterns like "!*.d.ts" and "!*.map"
79
+ const ignoreExtensions = new Set();
80
+ for (const g of globs) {
81
+ const m = g.match(/^!\*(\.\w+(?:\.\w+)*)$/);
82
+ if (m) ignoreExtensions.add(m[1]);
83
+ }
84
+
85
+ const regex = new RegExp(pattern);
86
+ const contextLines = context ?? 0;
87
+ const results = [];
88
+
89
+ let entries;
90
+ try {
91
+ entries = await readdir(cwd, { recursive: true });
92
+ } catch {
93
+ return '';
94
+ }
95
+
96
+ for (const relPath of entries) {
97
+ // Skip ignored directories
98
+ const parts = relPath.split('/');
99
+ if (parts.some((p) => ignoreDirs.has(p))) continue;
100
+
101
+ // Check extension filters
102
+ if (extensions.size > 0) {
103
+ const hasMatchingExt = [...extensions].some((ext) => relPath.endsWith(ext));
104
+ if (!hasMatchingExt) continue;
105
+ }
106
+
107
+ // Check ignore extensions
108
+ if ([...ignoreExtensions].some((ext) => relPath.endsWith(ext))) continue;
109
+
110
+ const fullPath = join(cwd, relPath);
111
+ let content;
112
+ try {
113
+ content = await readFile(fullPath, 'utf-8');
114
+ } catch {
115
+ continue;
116
+ }
117
+
118
+ const lines = content.split('\n');
119
+ const matchIndices = [];
120
+ for (let i = 0; i < lines.length; i++) {
121
+ if (regex.test(lines[i])) matchIndices.push(i);
122
+ }
123
+
124
+ if (matchIndices.length === 0) continue;
125
+
126
+ if (contextLines === 0) {
127
+ for (const idx of matchIndices) {
128
+ const lineNum = idx + 1;
129
+ const prefix = lineNumbers ? `${relPath}:${lineNum}:` : `${relPath}:`;
130
+ results.push(`${prefix}${lines[idx]}`);
131
+ }
132
+ } else {
133
+ // With context: output blocks separated by "--"
134
+ const emitted = new Set();
135
+ for (const idx of matchIndices) {
136
+ const start = Math.max(0, idx - contextLines);
137
+ const end = Math.min(lines.length - 1, idx + contextLines);
138
+ for (let i = start; i <= end; i++) {
139
+ if (!emitted.has(i)) {
140
+ emitted.add(i);
141
+ const lineNum = i + 1;
142
+ const sep = i === idx ? ':' : '-';
143
+ const prefix = lineNumbers ? `${relPath}${sep}${lineNum}${sep}` : `${relPath}${sep}`;
144
+ results.push(`${prefix}${lines[i]}`);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+
151
+ return results.join('\n') + (results.length > 0 ? '\n' : '');
152
+ }
153
+
154
+ // Exported for testing — not part of the public API.
155
+ export { nodeFallback as _nodeFallback };
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ // Removes cached preprocessed session files.
3
+
4
+ import { rm } from 'node:fs/promises';
5
+
6
+ const OUTPUT_DIR = '/tmp/cc-session-analysis';
7
+
8
+ try {
9
+ await rm(OUTPUT_DIR, { recursive: true, force: true });
10
+ console.log(`Cleaned up ${OUTPUT_DIR}`);
11
+ } catch {
12
+ console.log(`Nothing to clean up (${OUTPUT_DIR} does not exist)`);
13
+ }