@codeyam/codeyam-cli 0.1.8 → 0.1.9

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 (335) 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 +31 -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 +5 -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 +31 -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 +1619 -243
  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 +144 -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 +127 -0
  57. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  58. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +610 -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 +195 -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 +781 -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 +101 -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 +300 -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 +96 -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 +73 -0
  113. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  114. package/codeyam-cli/src/utils/editorAudit.js +101 -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 +67 -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 +276 -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/scenarioCoverage.js +75 -0
  148. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
  149. package/codeyam-cli/src/utils/scenariosManifest.js +159 -0
  150. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  151. package/codeyam-cli/src/utils/serverState.js +30 -0
  152. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  153. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +46 -16
  154. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  155. package/codeyam-cli/src/utils/simulationGateMiddleware.js +8 -1
  156. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
  157. package/codeyam-cli/src/utils/slugUtils.js +25 -0
  158. package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
  159. package/codeyam-cli/src/utils/syncMocksMiddleware.js +2 -2
  160. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  161. package/codeyam-cli/src/utils/webappDetection.js +21 -0
  162. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  163. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +40 -0
  164. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
  165. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +567 -0
  166. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  167. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +65 -0
  168. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
  169. package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
  170. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  171. package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-DmJveP3T.js → CopyButton-BPXZwM4t.js} +1 -1
  172. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BcgbViKV.js} +3 -3
  173. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-CQIG2qda.js} +9 -9
  174. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-BzHcG7SE.js} +3 -3
  175. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-B76aig_2.js → ScenarioViewer-Bd-hxofb.js} +3 -3
  176. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-oAf2Kqsf.js +1 -0
  177. package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-DLxKhri3.js} +3 -3
  178. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-BcY3q6nt.js} +6 -6
  179. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  180. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  181. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  182. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-Bni3iiUj.js} +5 -5
  183. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  184. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  185. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  186. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
  187. package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-BYOypzCa.js} +2 -2
  188. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-C_Pmso5S.js} +2 -2
  189. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-BVMi9VA5.js} +2 -2
  190. package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-n2FB0_Sw.js} +3 -3
  191. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CC6AbExI.js +41 -0
  192. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BsDh6TSF.js +1 -0
  193. package/codeyam-cli/src/webserver/build/client/assets/editor-PBc_6L9R.js +10 -0
  194. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-4FzHlcNn.js +41 -0
  195. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-BsDXNp45.js} +3 -3
  196. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-BgAqUtTZ.js +6 -0
  197. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-Bmshgrij.js +6 -0
  198. package/codeyam-cli/src/webserver/build/client/assets/{files-DO4CZ16O.js → files-BZrlFE1F.js} +1 -1
  199. package/codeyam-cli/src/webserver/build/client/assets/git-DdZcvjGh.js +1 -0
  200. package/codeyam-cli/src/webserver/build/client/assets/globals-B8vTTNy2.css +1 -0
  201. package/codeyam-cli/src/webserver/build/client/assets/index-yHOVb4rc.js +15 -0
  202. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-DaAZ_H2w.js} +2 -2
  203. package/codeyam-cli/src/webserver/build/client/assets/manifest-65850841.js +1 -0
  204. package/codeyam-cli/src/webserver/build/client/assets/memory-9gnxSZlb.js +101 -0
  205. package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-f5-1lKBt.js} +3 -3
  206. package/codeyam-cli/src/webserver/build/client/assets/root-BwX8YgFb.js +67 -0
  207. package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-Di64LWVb.js} +2 -2
  208. package/codeyam-cli/src/webserver/build/client/assets/{settings-DfuTtcJP.js → settings-0OrEMU6J.js} +1 -1
  209. package/codeyam-cli/src/webserver/build/client/assets/{simulations-B3aOzpCZ.js → simulations-DWT-CvLy.js} +1 -1
  210. package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-Br7MOqts.js} +3 -3
  211. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-BLdiCuG-.js} +2 -2
  212. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BE43Hjti.js +1 -0
  213. package/codeyam-cli/src/webserver/build/server/assets/index-DEEQf4pi.js +1 -0
  214. package/codeyam-cli/src/webserver/build/server/assets/init-CkWmyFY2.js +10 -0
  215. package/codeyam-cli/src/webserver/build/server/assets/server-build-BHi-9O8W.js +439 -0
  216. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  217. package/codeyam-cli/src/webserver/build-info.json +5 -5
  218. package/codeyam-cli/src/webserver/editorProxy.js +487 -50
  219. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
  220. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +242 -3
  221. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +94 -4
  222. package/codeyam-cli/src/webserver/server.js +46 -14
  223. package/codeyam-cli/src/webserver/server.js.map +1 -1
  224. package/codeyam-cli/src/webserver/terminalServer.js +39 -11
  225. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  226. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  227. package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
  228. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  229. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  230. package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
  231. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  232. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  233. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  234. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  235. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  236. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  237. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  238. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  239. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
  240. package/codeyam-cli/templates/codeyam-editor-claude.md +84 -5
  241. package/codeyam-cli/templates/editor-step-hook.py +97 -8
  242. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
  243. package/codeyam-cli/templates/expo-react-native/README.md +41 -0
  244. package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
  245. package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
  246. package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
  247. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
  248. package/codeyam-cli/templates/expo-react-native/app.json +18 -0
  249. package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
  250. package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
  251. package/codeyam-cli/templates/expo-react-native/global.css +3 -0
  252. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  253. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  254. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  255. package/codeyam-cli/templates/expo-react-native/package.json +38 -0
  256. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  257. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  258. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  259. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  260. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
  261. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  262. package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
  263. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  264. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +9 -4
  265. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  266. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +21 -0
  267. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +5 -1
  268. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +4 -1
  269. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +92 -0
  270. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  271. package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
  272. package/codeyam-cli/templates/{nextjs-prisma-sqlite/PRISMA_SETUP.md → nextjs-prisma-supabase/SUPABASE_SETUP.md} +37 -17
  273. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  274. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  275. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  276. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  277. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  278. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  279. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  280. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  281. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  282. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  283. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
  284. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  285. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  286. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  287. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  288. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  289. package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +2 -2
  290. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +96 -17
  291. package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +10 -10
  292. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  293. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  294. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  295. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  296. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  297. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  298. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  299. package/package.json +14 -9
  300. package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
  301. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  302. package/packages/analyze/src/lib/ProjectAnalyzer.js +10 -4
  303. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  304. package/packages/analyze/src/lib/asts/index.js +4 -2
  305. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  306. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
  307. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  308. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +31 -0
  309. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
  310. package/packages/database/src/lib/loadEntities.js +0 -6
  311. package/packages/database/src/lib/loadEntities.js.map +1 -1
  312. package/packages/database/src/lib/updateCommitMetadata.js +0 -25
  313. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  314. package/packages/types/src/enums/ProjectFramework.js +2 -0
  315. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  316. package/codeyam-cli/src/webserver/build/client/assets/Terminal-Dnj5CY9R.js +0 -41
  317. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +0 -1
  318. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CMT1jU2q.js +0 -21
  319. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +0 -1
  320. package/codeyam-cli/src/webserver/build/client/assets/editor-D1DAKXtT.js +0 -8
  321. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DkzqFzFj.js +0 -6
  322. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +0 -6
  323. package/codeyam-cli/src/webserver/build/client/assets/git-CFCTYk9I.js +0 -15
  324. package/codeyam-cli/src/webserver/build/client/assets/globals-B17TBSS6.css +0 -1
  325. package/codeyam-cli/src/webserver/build/client/assets/manifest-a632de18.js +0 -1
  326. package/codeyam-cli/src/webserver/build/client/assets/memory-Dg0mvYrI.js +0 -96
  327. package/codeyam-cli/src/webserver/build/client/assets/root-DUKqhFlb.js +0 -67
  328. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
  329. package/codeyam-cli/src/webserver/build/server/assets/index-HfLydfDq.js +0 -1
  330. package/codeyam-cli/src/webserver/build/server/assets/server-build-CUu_F-oo.js +0 -366
  331. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh +0 -108
  332. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh +0 -69
  333. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.sh +0 -12
  334. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter.jq +0 -45
  335. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.sh +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
+ }
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+ // Session log filter — replaces filter.jq.
3
+ // Strips progress/system/queue records, compresses tool inputs to 300 chars,
4
+ // tool results to 500 chars, thinking to 1000 chars. Output is compact JSONL.
5
+
6
+ import { createReadStream } from 'node:fs';
7
+ import { createInterface } from 'node:readline';
8
+
9
+ /**
10
+ * Filter a single parsed session log object.
11
+ * Returns the filtered object, or null if it should be skipped.
12
+ */
13
+ export function filterSessionLine(obj) {
14
+ if (obj.type === 'assistant') {
15
+ const contentItems = obj.message?.content;
16
+ if (!Array.isArray(contentItems)) return null;
17
+
18
+ const filtered = [];
19
+ for (const item of contentItems) {
20
+ if (item.type === 'text') {
21
+ filtered.push({ t: 'text', text: item.text });
22
+ } else if (item.type === 'thinking') {
23
+ const thinking = item.thinking ?? '';
24
+ filtered.push({
25
+ t: 'think',
26
+ thinking: thinking.length > 1000 ? thinking.slice(0, 1000) + '...[truncated]' : thinking,
27
+ });
28
+ } else if (item.type === 'tool_use') {
29
+ const inputStr = typeof item.input === 'string' ? item.input : JSON.stringify(item.input);
30
+ filtered.push({
31
+ t: 'tool',
32
+ name: item.name,
33
+ input: inputStr.length > 300 ? inputStr.slice(0, 300) + '...' : inputStr,
34
+ });
35
+ }
36
+ }
37
+
38
+ return { type: 'assistant', ts: obj.timestamp, content: filtered };
39
+ }
40
+
41
+ if (obj.type === 'user') {
42
+ const msgContent = obj.message?.content;
43
+
44
+ if (typeof msgContent === 'string') {
45
+ return { type: 'user', ts: obj.timestamp, content: msgContent };
46
+ }
47
+
48
+ if (Array.isArray(msgContent)) {
49
+ const items = [];
50
+ for (const item of msgContent) {
51
+ if (item.type === 'tool_result') {
52
+ const contentStr = typeof item.content === 'string' ? item.content : JSON.stringify(item.content);
53
+ items.push({
54
+ t: 'result',
55
+ id: item.tool_use_id,
56
+ err: item.is_error ?? false,
57
+ content: contentStr.length > 500 ? contentStr.slice(0, 500) + '...[truncated]' : contentStr,
58
+ });
59
+ } else {
60
+ const text = typeof item === 'string' ? item : JSON.stringify(item);
61
+ items.push({
62
+ t: 'msg',
63
+ text: text.length > 500 ? text.slice(0, 500) + '...[truncated]' : text,
64
+ });
65
+ }
66
+ }
67
+ return { type: 'user', ts: obj.timestamp, content: items };
68
+ }
69
+
70
+ // Fallback: stringify whatever content is
71
+ const fallback = typeof msgContent === 'string' ? msgContent : JSON.stringify(msgContent);
72
+ return {
73
+ type: 'user',
74
+ ts: obj.timestamp,
75
+ content: fallback.length > 500 ? fallback.slice(0, 500) + '...[truncated]' : fallback,
76
+ };
77
+ }
78
+
79
+ return null;
80
+ }
81
+
82
+ // Standalone mode: node filter-session.mjs input.jsonl → filtered JSONL to stdout
83
+ const inputFile = process.argv[2];
84
+ if (inputFile) {
85
+ const rl = createInterface({ input: createReadStream(inputFile) });
86
+ for await (const line of rl) {
87
+ try {
88
+ const obj = JSON.parse(line);
89
+ const result = filterSessionLine(obj);
90
+ if (result) console.log(JSON.stringify(result));
91
+ } catch {
92
+ // Skip malformed lines (matching jq's silent-skip behavior)
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env node
2
+ // Preprocesses Claude Code session logs for the codeyam-memory skill.
3
+ // Replaces preprocess.sh — no jq or platform-specific stat required.
4
+ //
5
+ // - Finds JSONL session files (>=10KB, last 30 days)
6
+ // - Excludes the current active session
7
+ // - Runs JS filter for 5-50x compression
8
+ // - Caches results in /tmp/cc-session-analysis/
9
+ // - Prints filtered file paths to stdout (one per line)
10
+
11
+ import { readdir, stat, mkdir, readFile, rm } from 'node:fs/promises';
12
+ import { createReadStream, createWriteStream } from 'node:fs';
13
+ import { createInterface } from 'node:readline';
14
+ import { join, basename } from 'node:path';
15
+ import { homedir } from 'node:os';
16
+ import { filterSessionLine } from './filter-session.mjs';
17
+
18
+ const OUTPUT_DIR = '/tmp/cc-session-analysis';
19
+ const MIN_SIZE = 10240; // 10KB
20
+ const MAX_AGE_DAYS = 30;
21
+ const MAX_SESSIONS = 30;
22
+ const FILTER_TIMEOUT = 30_000; // 30s per file
23
+
24
+ // Compute Claude project directory (mirrors Claude Code's path hashing)
25
+ const projectDir = process.cwd();
26
+ const projectHash = projectDir.replace(/[/.]/g, '-');
27
+ const sessionDir = join(homedir(), '.claude', 'projects', projectHash);
28
+
29
+ // Check session directory exists
30
+ try {
31
+ await stat(sessionDir);
32
+ } catch {
33
+ process.stderr.write(`No Claude session directory found at ${sessionDir}\n`);
34
+ process.stderr.write('This project may not have any Claude Code session history.\n');
35
+ process.exit(0);
36
+ }
37
+
38
+ // Find eligible session files
39
+ await mkdir(OUTPUT_DIR, { recursive: true });
40
+
41
+ const entries = await readdir(sessionDir);
42
+ const now = Date.now();
43
+ const maxAgeMs = MAX_AGE_DAYS * 24 * 60 * 60 * 1000;
44
+
45
+ const sessionFiles = [];
46
+ for (const name of entries) {
47
+ if (!name.endsWith('.jsonl')) continue;
48
+ const fullPath = join(sessionDir, name);
49
+ try {
50
+ const st = await stat(fullPath);
51
+ if (!st.isFile()) continue;
52
+ if (st.size < MIN_SIZE) continue;
53
+ if (now - st.mtimeMs > maxAgeMs) continue;
54
+ sessionFiles.push({ path: fullPath, mtimeMs: st.mtimeMs });
55
+ } catch {
56
+ continue;
57
+ }
58
+ }
59
+
60
+ if (sessionFiles.length === 0) process.exit(0);
61
+
62
+ // Sort newest first, cap to MAX_SESSIONS
63
+ sessionFiles.sort((a, b) => b.mtimeMs - a.mtimeMs);
64
+ if (sessionFiles.length > MAX_SESSIONS) {
65
+ process.stderr.write(`Note: ${sessionFiles.length} sessions found, capping to ${MAX_SESSIONS} most recent\n`);
66
+ }
67
+ const sessions = sessionFiles.slice(0, MAX_SESSIONS);
68
+
69
+ // Determine active session to exclude
70
+ let activeSession = '';
71
+ const claudeSessionId = process.env.CLAUDE_SESSION_ID;
72
+ if (claudeSessionId) {
73
+ const match = sessions.find((s) => basename(s.path, '.jsonl') === claudeSessionId);
74
+ if (match) activeSession = match.path;
75
+ }
76
+ if (!activeSession && sessions.length > 0) {
77
+ activeSession = sessions[0].path; // newest = likely active
78
+ }
79
+
80
+ // Process each session
81
+ for (const session of sessions) {
82
+ if (session.path === activeSession) continue;
83
+
84
+ const uuid = basename(session.path, '.jsonl');
85
+ const filtered = join(OUTPUT_DIR, `${uuid}.filtered.jsonl`);
86
+
87
+ // Check cache: skip if filtered file has a valid sentinel
88
+ try {
89
+ const firstLine = (await readFile(filtered, 'utf-8')).split('\n')[0];
90
+ const sentinel = JSON.parse(firstLine);
91
+ if (sentinel.processed_at) {
92
+ console.log(filtered);
93
+ continue;
94
+ }
95
+ } catch {
96
+ // No cache or invalid — reprocess
97
+ }
98
+
99
+ // Filter with timeout
100
+ try {
101
+ await filterFile(session.path, filtered);
102
+ console.log(filtered);
103
+ } catch (err) {
104
+ if (err.name === 'AbortError') {
105
+ process.stderr.write(`Warning: filter timed out after ${FILTER_TIMEOUT / 1000}s on ${basename(session.path)} — skipping\n`);
106
+ await rm(filtered, { force: true });
107
+ } else {
108
+ process.stderr.write(`Warning: error processing ${basename(session.path)}: ${err.message}\n`);
109
+ await rm(filtered, { force: true });
110
+ }
111
+ }
112
+ }
113
+
114
+ async function filterFile(inputPath, outputPath) {
115
+ const ac = new AbortController();
116
+ const timer = setTimeout(() => ac.abort(), FILTER_TIMEOUT);
117
+
118
+ try {
119
+ const st = await stat(inputPath);
120
+ const sentinel = JSON.stringify({
121
+ processed_at: new Date().toISOString(),
122
+ source_size: st.size,
123
+ });
124
+
125
+ const output = createWriteStream(outputPath);
126
+ output.write(sentinel + '\n');
127
+
128
+ const rl = createInterface({
129
+ input: createReadStream(inputPath),
130
+ signal: ac.signal,
131
+ });
132
+
133
+ let lineCount = 0;
134
+ for await (const line of rl) {
135
+ try {
136
+ const obj = JSON.parse(line);
137
+ const result = filterSessionLine(obj);
138
+ if (result) {
139
+ output.write(JSON.stringify(result) + '\n');
140
+ lineCount++;
141
+ }
142
+ } catch {
143
+ // Skip malformed lines
144
+ }
145
+ }
146
+
147
+ output.end();
148
+ await new Promise((resolve, reject) => {
149
+ output.on('finish', resolve);
150
+ output.on('error', reject);
151
+ });
152
+
153
+ // Remove files with no content beyond the sentinel
154
+ if (lineCount === 0) {
155
+ await rm(outputPath, { force: true });
156
+ }
157
+ } finally {
158
+ clearTimeout(timer);
159
+ }
160
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codeyam/codeyam-cli",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "Local development CLI for CodeYam analysis",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,20 +11,20 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@anthropic-ai/claude-code": "^2.1.7",
14
- "@anthropic-ai/sdk": "^0.74.0",
14
+ "@anthropic-ai/sdk": "^0.78.0",
15
15
  "@aws-sdk/client-dynamodb": "^3.990.0",
16
16
  "@aws-sdk/s3-request-presigner": "^3.990.0",
17
17
  "@aws-sdk/util-dynamodb": "^3.990.0",
18
18
  "@modelcontextprotocol/sdk": "^1.26.0",
19
- "@octokit/auth-app": "^8.1.0",
19
+ "@octokit/auth-app": "^8.2.0",
20
20
  "@octokit/request": "^10.0.3",
21
21
  "@octokit/rest": "^22.0.0",
22
22
  "@react-router/express": "^7.13.0",
23
- "@react-router/node": "^7.11.0",
23
+ "@react-router/node": "^7.13.1",
24
24
  "react-router": "^7.13.0",
25
25
  "@sendgrid/mail": "^8.1.4",
26
26
  "@supabase/supabase-js": "2.88.0",
27
- "better-sqlite3": "^12.4.1",
27
+ "better-sqlite3": "^12.6.2",
28
28
  "chalk": "^5.6.2",
29
29
  "chokidar": "^4.0.3",
30
30
  "cli-spinners": "^3.4.0",
@@ -41,11 +41,11 @@
41
41
  "kysely": "^0.28.11",
42
42
  "lru-cache": "^11.2.5",
43
43
  "lucide-react": "^0.556.0",
44
- "minimatch": "^10.0.1",
44
+ "minimatch": "^10.2.3",
45
45
  "openai": "^6.16.0",
46
- "p-queue": "^8.1.0",
46
+ "p-queue": "^9.1.0",
47
47
  "p-retry": "^7.1.1",
48
- "pg": "^8.16.3",
48
+ "pg": "^8.19.0",
49
49
  "piscina": "^5.1.4",
50
50
  "pixelmatch": "^5.3.0",
51
51
  "playwright": "1.58.0",
@@ -61,7 +61,12 @@
61
61
  "node-pty": "^1.0.0",
62
62
  "sharp": "^0.34.5",
63
63
  "ws": "^8.18.3",
64
- "simple-git": "^3.28.0",
64
+ "@xterm/xterm": "^6.0.0",
65
+ "@xterm/addon-fit": "^0.11.0",
66
+ "@xterm/addon-web-links": "^0.11.0",
67
+ "@xterm/addon-webgl": "^0.18.0",
68
+ "@xterm/addon-canvas": "^0.7.0",
69
+ "simple-git": "^3.32.2",
65
70
  "typescript": "^5.9.3",
66
71
  "uuid": "^11.1.0",
67
72
  "yargs": "^18.0.0",
@@ -75,10 +75,6 @@ export default function generateExecutionFlows({ entity, mergedDataStructure, ch
75
75
  for (const [shortPath, fullPath] of Object.entries(associationMap)) {
76
76
  fullToShortPathMap[fullPath] = shortPath;
77
77
  }
78
- console.log(`[generateExecutionFlows] ${entity.name}: attributesMap has ${Object.keys(resolvedAttributesMap).length} keys, fullToShortPathMap has ${Object.keys(fullToShortPathMap).length} entries`);
79
- console.log(`[generateExecutionFlows] ${entity.name}: attributesMap keys: [${Object.keys(resolvedAttributesMap).join(', ')}]`);
80
- console.log(`[generateExecutionFlows] ${entity.name}: fullToShortPathMap: ${JSON.stringify(fullToShortPathMap)}`);
81
- console.log(`[generateExecutionFlows] ${entity.name}: equivalentSignatureVariables: ${JSON.stringify(equivalentSignatureVariables)}`);
82
78
  // Get pre-computed conditional data from metadata
83
79
  const conditionalUsages = entity.metadata?.isolatedDataStructure?.conditionalUsages ?? {};
84
80
  const compoundConditionals = entity.metadata?.isolatedDataStructure?.compoundConditionals ?? [];
@@ -111,13 +107,6 @@ export default function generateExecutionFlows({ entity, mergedDataStructure, ch
111
107
  }
112
108
  }
113
109
  }
114
- console.log(`[generateExecutionFlows] ${entity.name}: conditionalUsages keys: [${Object.keys(conditionalUsages).join(', ')}]`);
115
- console.log(`[generateExecutionFlows] ${entity.name}: conditionalUsages sourceDataPaths: ${JSON.stringify(Object.fromEntries(Object.entries(conditionalUsages).map(([k, v]) => [
116
- k,
117
- v.map((u) => u.sourceDataPath ?? '(none)'),
118
- ])))}`);
119
- console.log(`[generateExecutionFlows] ${entity.name}: compoundConditionals count: ${compoundConditionals.length}`);
120
- console.log(`[generateExecutionFlows] ${entity.name}: sourceEquivalencies keys count: ${Object.keys(mergedDataStructure.sourceEquivalencies ?? {}).length}`);
121
110
  const conditionalsBasedFlows = generateExecutionFlowsFromConditionals({
122
111
  conditionalUsages,
123
112
  compoundConditionals,