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

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 (658) 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 +12 -12
  4. package/analyzer-template/packages/ai/package.json +2 -2
  5. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +135 -0
  6. package/analyzer-template/packages/ai/src/lib/astScopes/nodeToSource.ts +19 -0
  7. package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +11 -4
  8. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +36 -9
  9. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.ts +10 -3
  10. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +16 -6
  11. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +0 -33
  12. package/analyzer-template/packages/analyze/index.ts +4 -1
  13. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +13 -7
  14. package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
  15. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +28 -2
  16. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +5 -36
  17. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +10 -6
  18. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +9 -12
  19. package/analyzer-template/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.ts +21 -0
  20. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +82 -10
  21. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
  22. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
  23. package/analyzer-template/packages/analyze/src/lib/files/analyzeNextRoute.ts +8 -3
  24. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +239 -58
  25. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
  26. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +1684 -1462
  27. package/analyzer-template/packages/aws/package.json +7 -7
  28. package/analyzer-template/packages/database/package.json +4 -4
  29. package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +102 -0
  30. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +25 -15
  31. package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
  32. package/analyzer-template/packages/database/src/lib/loadEntity.ts +19 -8
  33. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +0 -65
  34. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +9 -0
  35. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -1
  36. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +104 -0
  37. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
  38. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  39. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +7 -1
  40. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  41. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
  42. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
  43. package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
  44. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
  45. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
  46. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +5 -5
  47. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
  48. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  49. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +0 -25
  50. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  51. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  52. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  53. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
  54. package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
  55. package/analyzer-template/packages/github/package.json +1 -1
  56. package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
  57. package/analyzer-template/packages/ui-components/package.json +1 -1
  58. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
  59. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
  60. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
  61. package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
  62. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
  63. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  64. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +22 -1
  65. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  66. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +27 -0
  67. package/analyzer-template/project/analyzeFileEntities.ts +26 -0
  68. package/analyzer-template/project/runMultiScenarioServer.ts +26 -3
  69. package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
  70. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  71. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +23 -3
  72. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  73. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
  74. package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
  75. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
  76. package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
  77. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
  78. package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
  79. package/codeyam-cli/src/cli.js +24 -0
  80. package/codeyam-cli/src/cli.js.map +1 -1
  81. package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js +47 -0
  82. package/codeyam-cli/src/commands/__tests__/editor.analyzeImportsArgs.test.js.map +1 -0
  83. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js +71 -0
  84. package/codeyam-cli/src/commands/__tests__/editor.auditNoAutoAnalysis.test.js.map +1 -0
  85. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js +30 -0
  86. package/codeyam-cli/src/commands/__tests__/editor.designSystem.test.js.map +1 -0
  87. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js +51 -0
  88. package/codeyam-cli/src/commands/__tests__/editor.isolateArgs.test.js.map +1 -0
  89. package/codeyam-cli/src/commands/__tests__/editor.statePersistence.test.js +55 -0
  90. package/codeyam-cli/src/commands/__tests__/editor.statePersistence.test.js.map +1 -0
  91. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +56 -0
  92. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
  93. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +137 -47
  94. package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
  95. package/codeyam-cli/src/commands/default.js +3 -46
  96. package/codeyam-cli/src/commands/default.js.map +1 -1
  97. package/codeyam-cli/src/commands/editor.js +5802 -526
  98. package/codeyam-cli/src/commands/editor.js.map +1 -1
  99. package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js +23 -0
  100. package/codeyam-cli/src/commands/editorAnalyzeImportsArgs.js.map +1 -0
  101. package/codeyam-cli/src/commands/editorIsolateArgs.js +25 -0
  102. package/codeyam-cli/src/commands/editorIsolateArgs.js.map +1 -0
  103. package/codeyam-cli/src/commands/init.js +95 -35
  104. package/codeyam-cli/src/commands/init.js.map +1 -1
  105. package/codeyam-cli/src/commands/telemetry.js +37 -0
  106. package/codeyam-cli/src/commands/telemetry.js.map +1 -0
  107. package/codeyam-cli/src/data/designSystems.js +27 -0
  108. package/codeyam-cli/src/data/designSystems.js.map +1 -0
  109. package/codeyam-cli/src/data/techStacks.js +77 -0
  110. package/codeyam-cli/src/data/techStacks.js.map +1 -0
  111. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
  112. package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
  113. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
  114. package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
  115. package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
  116. package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
  117. package/codeyam-cli/src/utils/__tests__/editorApi.test.js +181 -0
  118. package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
  119. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +4160 -0
  120. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
  121. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
  122. package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
  123. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
  124. package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
  125. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
  126. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
  127. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js +100 -0
  128. package/codeyam-cli/src/utils/__tests__/editorDeleteScenario.test.js.map +1 -0
  129. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +304 -0
  130. package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
  131. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +194 -0
  132. package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
  133. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +381 -0
  134. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
  135. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
  136. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
  137. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
  138. package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
  139. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +542 -0
  140. package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
  141. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +594 -0
  142. package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
  143. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +435 -0
  144. package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
  145. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
  146. package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
  147. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +217 -0
  148. package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
  149. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +361 -0
  150. package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
  151. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +250 -0
  152. package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
  153. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js +1108 -0
  154. package/codeyam-cli/src/utils/__tests__/editorRoadmap.test.js.map +1 -0
  155. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
  156. package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
  157. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +411 -0
  158. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
  159. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +1768 -0
  160. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
  161. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +413 -0
  162. package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
  163. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js +143 -0
  164. package/codeyam-cli/src/utils/__tests__/editorSeedAdapterPrismaValidation.test.js.map +1 -0
  165. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
  166. package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
  167. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
  168. package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
  169. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +2121 -0
  170. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
  171. package/codeyam-cli/src/utils/__tests__/envFile.test.js +125 -0
  172. package/codeyam-cli/src/utils/__tests__/envFile.test.js.map +1 -0
  173. package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
  174. package/codeyam-cli/src/utils/__tests__/git.editor.test.js.map +1 -0
  175. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
  176. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
  177. package/codeyam-cli/src/utils/__tests__/handoffContext.test.js +500 -0
  178. package/codeyam-cli/src/utils/__tests__/handoffContext.test.js.map +1 -0
  179. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +122 -0
  180. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
  181. package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js +302 -0
  182. package/codeyam-cli/src/utils/__tests__/manualEntityAnalysis.test.js.map +1 -0
  183. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
  184. package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
  185. package/codeyam-cli/src/utils/__tests__/project.test.js +65 -0
  186. package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
  187. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
  188. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
  189. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
  190. package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
  191. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +284 -0
  192. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
  193. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
  194. package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
  195. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +672 -0
  196. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
  197. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js +84 -0
  198. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js.map +1 -0
  199. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +26 -5
  200. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  201. package/codeyam-cli/src/utils/__tests__/telemetry.test.js +159 -0
  202. package/codeyam-cli/src/utils/__tests__/telemetry.test.js.map +1 -0
  203. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
  204. package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
  205. package/codeyam-cli/src/utils/__tests__/testRunner.test.js +216 -0
  206. package/codeyam-cli/src/utils/__tests__/testRunner.test.js.map +1 -0
  207. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +148 -0
  208. package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
  209. package/codeyam-cli/src/utils/analysisRunner.js +39 -8
  210. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  211. package/codeyam-cli/src/utils/analyzer.js +19 -0
  212. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  213. package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
  214. package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
  215. package/codeyam-cli/src/utils/backgroundServer.js +95 -19
  216. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  217. package/codeyam-cli/src/utils/buildFlags.js +4 -0
  218. package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
  219. package/codeyam-cli/src/utils/database.js +37 -2
  220. package/codeyam-cli/src/utils/database.js.map +1 -1
  221. package/codeyam-cli/src/utils/designSystemShowcase.js +810 -0
  222. package/codeyam-cli/src/utils/designSystemShowcase.js.map +1 -0
  223. package/codeyam-cli/src/utils/devServerState.js +71 -0
  224. package/codeyam-cli/src/utils/devServerState.js.map +1 -0
  225. package/codeyam-cli/src/utils/editorApi.js +95 -0
  226. package/codeyam-cli/src/utils/editorApi.js.map +1 -0
  227. package/codeyam-cli/src/utils/editorAudit.js +849 -0
  228. package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
  229. package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
  230. package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
  231. package/codeyam-cli/src/utils/editorCapture.js +102 -0
  232. package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
  233. package/codeyam-cli/src/utils/editorDeleteScenario.js +67 -0
  234. package/codeyam-cli/src/utils/editorDeleteScenario.js.map +1 -0
  235. package/codeyam-cli/src/utils/editorDevServer.js +197 -0
  236. package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
  237. package/codeyam-cli/src/utils/editorEntityChangeStatus.js +50 -0
  238. package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
  239. package/codeyam-cli/src/utils/editorEntityHelpers.js +144 -0
  240. package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
  241. package/codeyam-cli/src/utils/editorGuard.js +36 -0
  242. package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
  243. package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
  244. package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
  245. package/codeyam-cli/src/utils/editorJournal.js +225 -0
  246. package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
  247. package/codeyam-cli/src/utils/editorLoaderHelpers.js +152 -0
  248. package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
  249. package/codeyam-cli/src/utils/editorMigration.js +224 -0
  250. package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
  251. package/codeyam-cli/src/utils/editorMockState.js +248 -0
  252. package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
  253. package/codeyam-cli/src/utils/editorPreloadHelpers.js +135 -0
  254. package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
  255. package/codeyam-cli/src/utils/editorPreview.js +139 -0
  256. package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
  257. package/codeyam-cli/src/utils/editorRecapture.js +109 -0
  258. package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
  259. package/codeyam-cli/src/utils/editorRoadmap.js +574 -0
  260. package/codeyam-cli/src/utils/editorRoadmap.js.map +1 -0
  261. package/codeyam-cli/src/utils/editorScenarioSwitch.js +149 -0
  262. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
  263. package/codeyam-cli/src/utils/editorScenarios.js +687 -0
  264. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
  265. package/codeyam-cli/src/utils/editorSeedAdapter.js +475 -0
  266. package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
  267. package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
  268. package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
  269. package/codeyam-cli/src/utils/entityChangeStatus.js +394 -0
  270. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
  271. package/codeyam-cli/src/utils/entityChangeStatus.server.js +227 -0
  272. package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
  273. package/codeyam-cli/src/utils/envFile.js +90 -0
  274. package/codeyam-cli/src/utils/envFile.js.map +1 -0
  275. package/codeyam-cli/src/utils/fileWatcher.js +38 -0
  276. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  277. package/codeyam-cli/src/utils/git.js +51 -0
  278. package/codeyam-cli/src/utils/git.js.map +1 -1
  279. package/codeyam-cli/src/utils/glossaryAdd.js +74 -0
  280. package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
  281. package/codeyam-cli/src/utils/handoffContext.js +257 -0
  282. package/codeyam-cli/src/utils/handoffContext.js.map +1 -0
  283. package/codeyam-cli/src/utils/install-skills.js +78 -23
  284. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  285. package/codeyam-cli/src/utils/manualEntityAnalysis.js +196 -0
  286. package/codeyam-cli/src/utils/manualEntityAnalysis.js.map +1 -0
  287. package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
  288. package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
  289. package/codeyam-cli/src/utils/progress.js +2 -2
  290. package/codeyam-cli/src/utils/progress.js.map +1 -1
  291. package/codeyam-cli/src/utils/project.js +15 -5
  292. package/codeyam-cli/src/utils/project.js.map +1 -1
  293. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js +159 -0
  294. package/codeyam-cli/src/utils/queue/__tests__/job.interactiveStart.test.js.map +1 -0
  295. package/codeyam-cli/src/utils/queue/job.js +35 -6
  296. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  297. package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
  298. package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
  299. package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
  300. package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
  301. package/codeyam-cli/src/utils/scenarioCoverage.js +77 -0
  302. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
  303. package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
  304. package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
  305. package/codeyam-cli/src/utils/scenariosManifest.js +313 -0
  306. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
  307. package/codeyam-cli/src/utils/screenshotHash.js +26 -0
  308. package/codeyam-cli/src/utils/screenshotHash.js.map +1 -0
  309. package/codeyam-cli/src/utils/serverState.js +30 -0
  310. package/codeyam-cli/src/utils/serverState.js.map +1 -1
  311. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +47 -16
  312. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  313. package/codeyam-cli/src/utils/simulationGateMiddleware.js +17 -1
  314. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
  315. package/codeyam-cli/src/utils/slugUtils.js +25 -0
  316. package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
  317. package/codeyam-cli/src/utils/syncMocksMiddleware.js +2 -2
  318. package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
  319. package/codeyam-cli/src/utils/techStackConfig.js +38 -0
  320. package/codeyam-cli/src/utils/techStackConfig.js.map +1 -0
  321. package/codeyam-cli/src/utils/techStackConfig.test.js +85 -0
  322. package/codeyam-cli/src/utils/techStackConfig.test.js.map +1 -0
  323. package/codeyam-cli/src/utils/telemetry.js +106 -0
  324. package/codeyam-cli/src/utils/telemetry.js.map +1 -0
  325. package/codeyam-cli/src/utils/telemetryMiddleware.js +22 -0
  326. package/codeyam-cli/src/utils/telemetryMiddleware.js.map +1 -0
  327. package/codeyam-cli/src/utils/testResultCache.js +53 -0
  328. package/codeyam-cli/src/utils/testResultCache.js.map +1 -0
  329. package/codeyam-cli/src/utils/testResultCache.server.js +81 -0
  330. package/codeyam-cli/src/utils/testResultCache.server.js.map +1 -0
  331. package/codeyam-cli/src/utils/testResultCache.server.test.js +187 -0
  332. package/codeyam-cli/src/utils/testResultCache.server.test.js.map +1 -0
  333. package/codeyam-cli/src/utils/testResultCache.test.js +230 -0
  334. package/codeyam-cli/src/utils/testResultCache.test.js.map +1 -0
  335. package/codeyam-cli/src/utils/testRunner.js +194 -2
  336. package/codeyam-cli/src/utils/testRunner.js.map +1 -1
  337. package/codeyam-cli/src/utils/webappDetection.js +25 -2
  338. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  339. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js +99 -0
  340. package/codeyam-cli/src/webserver/__tests__/api.interactive-switch-scenario.test.js.map +1 -0
  341. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js +153 -0
  342. package/codeyam-cli/src/webserver/__tests__/buildPtyEnv.test.js.map +1 -0
  343. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +107 -0
  344. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
  345. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +762 -0
  346. package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
  347. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +315 -0
  348. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
  349. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js +135 -0
  350. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js.map +1 -0
  351. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +86 -0
  352. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
  353. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  354. package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
  355. package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
  356. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js +34 -0
  357. package/codeyam-cli/src/webserver/app/routes/api.interactive-switch-scenario.js.map +1 -0
  358. package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
  359. package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
  360. package/codeyam-cli/src/webserver/backgroundServer.js +60 -61
  361. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  362. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-DTBZZfSk.js +1 -0
  363. package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BxclONWq.js} +5 -5
  364. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
  365. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-BsnEOJZ_.js} +9 -9
  366. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-ByaELMbv.js +1 -0
  367. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-6WjVfhxX.js +25 -0
  368. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-ChX-Hp7W.js +3 -0
  369. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-BU_OAEMP.js → LoadingDots-By5zI316.js} +1 -1
  370. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-ceAyBX-H.js → LogViewer-C-9zQdXg.js} +3 -3
  371. package/codeyam-cli/src/webserver/build/client/assets/MiniClaudeChat-Bs2_Oua4.js +36 -0
  372. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-DQsceHVv.js} +4 -4
  373. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DThcm_9M.js +1 -0
  374. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-B76aig_2.js → ScenarioViewer-Cl4oOA3A.js} +3 -3
  375. package/codeyam-cli/src/webserver/build/client/assets/Spinner-CIil5-gb.js +34 -0
  376. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
  377. package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-BqkA9zyZ.js +1 -0
  378. package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-DnOgyseQ.js} +4 -4
  379. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-DqM9hbNE.js} +8 -8
  380. package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
  381. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
  382. package/codeyam-cli/src/webserver/build/client/assets/{addon-web-links-Duc5hnl7.js → addon-web-links-C58dYPwR.js} +1 -1
  383. package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
  384. package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-B8NCeOrm.js} +7 -7
  385. package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
  386. package/codeyam-cli/src/webserver/build/client/assets/api.editor-database-verify-l0sNRNKZ.js +1 -0
  387. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
  388. package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
  389. package/codeyam-cli/src/webserver/build/client/assets/api.editor-github-verify-l0sNRNKZ.js +1 -0
  390. package/codeyam-cli/src/webserver/build/client/assets/api.editor-handoff-l0sNRNKZ.js +1 -0
  391. package/codeyam-cli/src/webserver/build/client/assets/api.editor-hosting-verify-l0sNRNKZ.js +1 -0
  392. package/codeyam-cli/src/webserver/build/client/assets/api.editor-load-commit-l0sNRNKZ.js +1 -0
  393. package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
  394. package/codeyam-cli/src/webserver/build/client/assets/api.editor-recapture-stale-l0sNRNKZ.js +1 -0
  395. package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
  396. package/codeyam-cli/src/webserver/build/client/assets/api.editor-roadmap-l0sNRNKZ.js +1 -0
  397. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
  398. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
  399. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
  400. package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
  401. package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
  402. package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
  403. package/codeyam-cli/src/webserver/build/client/assets/api.editor-verify-routes-l0sNRNKZ.js +1 -0
  404. package/codeyam-cli/src/webserver/build/client/assets/api.interactive-switch-scenario-l0sNRNKZ.js +1 -0
  405. package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-BFSIqZgO.js} +2 -2
  406. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-B9fDzFVh.js} +2 -2
  407. package/codeyam-cli/src/webserver/build/client/assets/chunk-UVKPFVEO-Bmq2apuh.js +43 -0
  408. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-DLPObLUx.js} +2 -2
  409. package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-DXEmO0TD.js} +3 -3
  410. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BwyFiRot.js +41 -0
  411. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-Coe5NhbS.js +1 -0
  412. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-DoA97ML3.svg} +2 -2
  413. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-iRhRIFlp.js +1 -0
  414. package/codeyam-cli/src/webserver/build/client/assets/editor._tab-BZPBzV73.js +1 -0
  415. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DOXe0Qx7.js +161 -0
  416. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-C6fEYHrh.js +41 -0
  417. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-pc-vc6wO.js} +14 -13
  418. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-C8AyYgYT.js +6 -0
  419. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DziaVQX1.js +6 -0
  420. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-BTcpgIpC.js +6 -0
  421. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMvVHNXU.js → entity._sha_.edit._scenarioId-D_O_ajfZ.js} +2 -2
  422. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-DTvKq3TY.js → entry.client-j1Vi0bco.js} +6 -6
  423. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
  424. package/codeyam-cli/src/webserver/build/client/assets/files-kuny2Q_s.js +1 -0
  425. package/codeyam-cli/src/webserver/build/client/assets/git-DgCZPMie.js +1 -0
  426. package/codeyam-cli/src/webserver/build/client/assets/globals-L-aUIeux.css +1 -0
  427. package/codeyam-cli/src/webserver/build/client/assets/{index-BcvgDzbZ.js → index-BliGSSpl.js} +1 -1
  428. package/codeyam-cli/src/webserver/build/client/assets/index-SqjQKTdH.js +15 -0
  429. package/codeyam-cli/src/webserver/build/client/assets/{index-10oVnAAH.js → index-vyrZD2g4.js} +1 -1
  430. package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
  431. package/codeyam-cli/src/webserver/build/client/assets/labs-c3yLxSEp.js +1 -0
  432. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-D-q28GLF.js} +2 -2
  433. package/codeyam-cli/src/webserver/build/client/assets/manifest-30c44d84.js +1 -0
  434. package/codeyam-cli/src/webserver/build/client/assets/memory-CEWIUC4t.js +101 -0
  435. package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-BP6fitdh.js} +3 -3
  436. package/codeyam-cli/src/webserver/build/client/assets/root-CLedrjXQ.js +80 -0
  437. package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-BooqacKS.js} +2 -2
  438. package/codeyam-cli/src/webserver/build/client/assets/settings-BM0nbryO.js +1 -0
  439. package/codeyam-cli/src/webserver/build/client/assets/simulations-ovy6FjRY.js +1 -0
  440. package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-DHemCJIs.js} +3 -3
  441. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-D87ekDl8.js} +2 -2
  442. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-Dk0Tciqg.js +1 -0
  443. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C8QvIe05.js +2 -0
  444. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-jkCytuYz.js +1 -0
  445. package/codeyam-cli/src/webserver/build/client/assets/useToast-BgqkixU9.js +1 -0
  446. package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
  447. package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
  448. package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-CuR5TvUx.js +16 -0
  449. package/codeyam-cli/src/webserver/build/server/assets/index-D4MWAsqb.js +1 -0
  450. package/codeyam-cli/src/webserver/build/server/assets/init-JObA4lXD.js +14 -0
  451. package/codeyam-cli/src/webserver/build/server/assets/progress-CHTtrxFG.js +1 -0
  452. package/codeyam-cli/src/webserver/build/server/assets/server-build-i8OXK4oL.js +765 -0
  453. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  454. package/codeyam-cli/src/webserver/build-info.json +5 -5
  455. package/codeyam-cli/src/webserver/editorProxy.js +881 -52
  456. package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
  457. package/codeyam-cli/src/webserver/idleDetector.js +130 -0
  458. package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
  459. package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
  460. package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
  461. package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
  462. package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
  463. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +147 -4
  464. package/codeyam-cli/src/webserver/server.js +281 -12
  465. package/codeyam-cli/src/webserver/server.js.map +1 -1
  466. package/codeyam-cli/src/webserver/terminalServer.js +448 -158
  467. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  468. package/codeyam-cli/templates/__tests__/editor-step-hook.prompt-capture.test.ts +118 -0
  469. package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
  470. package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
  471. package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
  472. package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
  473. package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
  474. package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
  475. package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
  476. package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
  477. package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
  478. package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
  479. package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
  480. package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
  481. package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
  482. package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
  483. package/codeyam-cli/templates/codeyam-editor-claude.md +86 -5
  484. package/codeyam-cli/templates/codeyam-editor-codex.md +61 -0
  485. package/codeyam-cli/templates/codeyam-editor-gemini.md +59 -0
  486. package/codeyam-cli/templates/codeyam-editor-reference.md +216 -0
  487. package/codeyam-cli/templates/design-systems/clean-dashboard-design-system.md +255 -0
  488. package/codeyam-cli/templates/design-systems/editorial-design-system.md +267 -0
  489. package/codeyam-cli/templates/design-systems/mono-brutalist-design-system.md +256 -0
  490. package/codeyam-cli/templates/design-systems/neo-brutalist-design-system.md +294 -0
  491. package/codeyam-cli/templates/editor-step-hook.py +262 -39
  492. package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +288 -0
  493. package/codeyam-cli/templates/expo-react-native/README.md +41 -0
  494. package/codeyam-cli/templates/expo-react-native/__tests__/.gitkeep +0 -0
  495. package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +15 -0
  496. package/codeyam-cli/templates/expo-react-native/app/index.tsx +36 -0
  497. package/codeyam-cli/templates/expo-react-native/app.json +29 -0
  498. package/codeyam-cli/templates/expo-react-native/babel.config.js +10 -0
  499. package/codeyam-cli/templates/expo-react-native/gitignore +14 -0
  500. package/codeyam-cli/templates/expo-react-native/global.css +10 -0
  501. package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
  502. package/codeyam-cli/templates/expo-react-native/lib/theme.ts +73 -0
  503. package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
  504. package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
  505. package/codeyam-cli/templates/expo-react-native/package.json +54 -0
  506. package/codeyam-cli/templates/expo-react-native/patches/expo-modules-autolinking+3.0.24.patch +29 -0
  507. package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
  508. package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
  509. package/codeyam-cli/templates/isolation-route/expo-router.tsx.template +54 -0
  510. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
  511. package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
  512. package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
  513. package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
  514. package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
  515. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
  516. package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +9 -4
  517. package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
  518. package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +22 -0
  519. package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +6 -2
  520. package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +4 -1
  521. package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +140 -0
  522. package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
  523. package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
  524. package/codeyam-cli/templates/{nextjs-prisma-sqlite/PRISMA_SETUP.md → nextjs-prisma-supabase/SUPABASE_SETUP.md} +37 -17
  525. package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
  526. package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
  527. package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
  528. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
  529. package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
  530. package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
  531. package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
  532. package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
  533. package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
  534. package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
  535. package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
  536. package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
  537. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
  538. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
  539. package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
  540. package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
  541. package/codeyam-cli/templates/seed-adapters/supabase.ts +475 -0
  542. package/codeyam-cli/templates/{codeyam-dev-mode.md → skills/codeyam-dev-mode/SKILL.md} +3 -3
  543. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +244 -0
  544. package/codeyam-cli/templates/{codeyam-memory.md → skills/codeyam-memory/SKILL.md} +215 -0
  545. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
  546. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
  547. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
  548. package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/misleading-api-prompt.md +117 -0
  549. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
  550. package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
  551. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/analyze-prompt.md +46 -0
  552. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
  553. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
  554. package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
  555. package/package.json +16 -10
  556. package/packages/ai/src/lib/astScopes/methodSemantics.js +99 -0
  557. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  558. package/packages/ai/src/lib/astScopes/nodeToSource.js +16 -0
  559. package/packages/ai/src/lib/astScopes/nodeToSource.js.map +1 -1
  560. package/packages/ai/src/lib/astScopes/paths.js +12 -3
  561. package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
  562. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +27 -10
  563. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  564. package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js +9 -2
  565. package/packages/ai/src/lib/dataStructure/equivalencyManagers/ParentScopeManager.js.map +1 -1
  566. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +14 -4
  567. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  568. package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
  569. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  570. package/packages/analyze/index.js +1 -1
  571. package/packages/analyze/index.js.map +1 -1
  572. package/packages/analyze/src/lib/ProjectAnalyzer.js +10 -4
  573. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  574. package/packages/analyze/src/lib/asts/index.js +4 -2
  575. package/packages/analyze/src/lib/asts/index.js.map +1 -1
  576. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +16 -2
  577. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  578. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +6 -26
  579. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  580. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +3 -2
  581. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  582. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +9 -7
  583. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  584. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js +14 -0
  585. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
  586. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +44 -11
  587. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  588. package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
  589. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  590. package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
  591. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  592. package/packages/analyze/src/lib/files/analyzeNextRoute.js +5 -1
  593. package/packages/analyze/src/lib/files/analyzeNextRoute.js.map +1 -1
  594. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +120 -28
  595. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  596. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
  597. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  598. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +1368 -1193
  599. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  600. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +104 -0
  601. package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
  602. package/packages/database/src/lib/loadAnalysis.js +7 -1
  603. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  604. package/packages/database/src/lib/loadEntities.js +0 -6
  605. package/packages/database/src/lib/loadEntities.js.map +1 -1
  606. package/packages/database/src/lib/loadEntity.js +5 -5
  607. package/packages/database/src/lib/loadEntity.js.map +1 -1
  608. package/packages/database/src/lib/updateCommitMetadata.js +0 -25
  609. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  610. package/packages/types/src/enums/ProjectFramework.js +2 -0
  611. package/packages/types/src/enums/ProjectFramework.js.map +1 -1
  612. package/packages/utils/src/lib/fs/rsyncCopy.js +22 -1
  613. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  614. package/scripts/npm-post-install.cjs +34 -0
  615. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-DmJveP3T.js +0 -1
  616. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-g3saevPb.js +0 -1
  617. package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +0 -1
  618. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-DYFW3lDD.js +0 -25
  619. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DLeucoVX.js +0 -3
  620. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BED4B6sP.js +0 -1
  621. package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +0 -34
  622. package/codeyam-cli/src/webserver/build/client/assets/Terminal-CcG8YTLx.js +0 -41
  623. package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-C8OKAR5x.js +0 -1
  624. package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +0 -1
  625. package/codeyam-cli/src/webserver/build/client/assets/chunk-JZWAC4HX-C4pqxYJB.js +0 -51
  626. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CMT1jU2q.js +0 -21
  627. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
  628. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +0 -1
  629. package/codeyam-cli/src/webserver/build/client/assets/editor-W_IGJ2Kd.js +0 -7
  630. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D6SEzMCu.js +0 -6
  631. package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +0 -6
  632. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +0 -6
  633. package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-cPo8LiG3.js +0 -1
  634. package/codeyam-cli/src/webserver/build/client/assets/files-DO4CZ16O.js +0 -1
  635. package/codeyam-cli/src/webserver/build/client/assets/git-CFCTYk9I.js +0 -15
  636. package/codeyam-cli/src/webserver/build/client/assets/globals-BZB_H1w2.css +0 -1
  637. package/codeyam-cli/src/webserver/build/client/assets/labs-Zk7ryIM1.js +0 -1
  638. package/codeyam-cli/src/webserver/build/client/assets/manifest-8daa4147.js +0 -1
  639. package/codeyam-cli/src/webserver/build/client/assets/memory-FweZHj5U.js +0 -93
  640. package/codeyam-cli/src/webserver/build/client/assets/root-DiRdBreB.js +0 -67
  641. package/codeyam-cli/src/webserver/build/client/assets/settings-DfuTtcJP.js +0 -1
  642. package/codeyam-cli/src/webserver/build/client/assets/simulations-B3aOzpCZ.js +0 -1
  643. package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
  644. package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +0 -2
  645. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-O-jkvSPx.js +0 -1
  646. package/codeyam-cli/src/webserver/build/client/assets/useToast-9FIWuYfK.js +0 -1
  647. package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +0 -9
  648. package/codeyam-cli/src/webserver/build/server/assets/index-BzAbACSx.js +0 -1
  649. package/codeyam-cli/src/webserver/build/server/assets/server-build-OdUocH6P.js +0 -362
  650. package/codeyam-cli/templates/codeyam-editor.md +0 -68
  651. package/scripts/finalize-analyzer.cjs +0 -13
  652. /package/codeyam-cli/templates/{codeyam-diagnose.md → commands/codeyam-diagnose.md} +0 -0
  653. /package/codeyam-cli/templates/{codeyam-debug.md → skills/codeyam-debug/SKILL.md} +0 -0
  654. /package/codeyam-cli/templates/{codeyam-new-rule.md → skills/codeyam-new-rule/SKILL.md} +0 -0
  655. /package/codeyam-cli/templates/{codeyam-setup.md → skills/codeyam-setup/SKILL.md} +0 -0
  656. /package/codeyam-cli/templates/{codeyam-sim.md → skills/codeyam-sim/SKILL.md} +0 -0
  657. /package/codeyam-cli/templates/{codeyam-test.md → skills/codeyam-test/SKILL.md} +0 -0
  658. /package/codeyam-cli/templates/{codeyam-verify.md → skills/codeyam-verify/SKILL.md} +0 -0
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
- PostToolUse + Stop hook for editor mode step tracking.
3
+ PostToolUse + Stop + UserPromptSubmit hook for editor mode step tracking.
4
4
 
5
5
  Reads .codeyam/editor-step.json and prints a reminder about the current step.
6
6
  Logs each firing to .codeyam/logs/editor-log.jsonl.
@@ -15,30 +15,70 @@ from datetime import datetime, timezone
15
15
 
16
16
  STEP_LABELS = {
17
17
  1: "Plan",
18
- 2: "Prototype",
19
- 3: "Confirm",
20
- 4: "Deconstruct",
21
- 5: "Extract",
22
- 6: "Glossary",
23
- 7: "Analyze",
24
- 8: "App Scenarios",
25
- 9: "User Scenarios",
26
- 10: "Verify",
27
- 11: "Review",
18
+ 2: "Prepare",
19
+ 3: "Prototype",
20
+ 4: "Verify Prototype",
21
+ 5: "Confirm",
22
+ 6: "Deconstruct",
23
+ 7: "Extract",
24
+ 8: "Glossary",
25
+ 9: "Analyze",
26
+ 10: "App Scenarios",
27
+ 11: "User Scenarios",
28
+ 12: "Verify",
29
+ 13: "Journal",
30
+ 14: "Review",
31
+ 15: "Present",
32
+ 16: "Commit",
33
+ 17: "Finalize",
34
+ 18: "Push",
28
35
  }
29
36
 
30
37
  STEP_RESTRICTIONS = {
31
38
  1: "Do NOT write any code. Plan and describe only. Wait for user confirmation.",
32
- 2: "Do NOT create scenarios or run codeyam analyze. Build fast working prototype with real data.",
33
- 3: "Present a selection menu (AskUserQuestion) for confirmation. Do NOT refactor or create scenarios until approved.",
34
- 4: "Do NOT write any code. Read every file, identify all extractable pieces, write a numbered plan. Planning only.",
35
- 5: "Execute the extraction plan from step 4. Components first (no tests), then library functions via TDD. Page files must contain ZERO direct JSX.",
36
- 6: "Do NOT write application code or scenarios. Update the glossary only.",
37
- 7: "Create isolation routes for visual components, run tests for library functions. Register component scenarios via codeyam editor register.",
38
- 8: "Do NOT modify application code. Create and register app-level scenarios only.",
39
- 9: "Do NOT modify application code. Create user-persona scenarios only (or skip if no users).",
40
- 10: "Verify component isolation screenshots AND editor scenarios. After ANY code fix, re-register affected components. Fix only — do NOT add features.",
41
- 11: "Verify ALL screenshots exist and NO client-side errors (/api/editor-client-errors), then present selection menu (AskUserQuestion): Save or make changes.",
39
+ 2: "Do NOT write any code or build features. Set up the project and prepare the database only.",
40
+ 3: "Do NOT create scenarios or run codeyam analyze. Build fast working prototype with real data.",
41
+ 4: "Verify the prototype works. Do NOT add features only fix broken functionality.",
42
+ 5: "Present a selection menu (AskUserQuestion) for confirmation. Do NOT refactor or create scenarios until approved.",
43
+ 6: "Do NOT write any code. Read every file, identify all extractable pieces, write a numbered plan. Planning only. Every opportunity to extract code into a function, helper, or sub-component MUST be taken. Then plan to extract from the extracted code until each piece does one clearly defined thing.",
44
+ 7: "Execute the extraction plan from step 6. Components first (no tests), then library functions via TDD. Page files must contain ZERO direct JSX. After extraction: re-read every file — extract further until each piece does one thing. Verify every test file covers all conditional branches.",
45
+ 8: "Do NOT write application code or scenarios. Update the glossary only.",
46
+ 9: "Create isolation routes for visual components, run tests for library functions. Register component scenarios via codeyam editor register.",
47
+ 10: "Do NOT modify application code. Create and register app-level scenarios only.",
48
+ 11: "Do NOT modify application code. Create user-persona scenarios only (or skip if no users).",
49
+ 12: "Verify component isolation screenshots AND editor scenarios. After ANY code fix, re-register affected components. Fix only — do NOT add features.",
50
+ 13: "Create or update the journal entry for this feature. Do NOT create a duplicate — check if one exists first.",
51
+ 14: "Verify ALL screenshots exist and NO client-side errors (/api/editor-client-errors). Run codeyam editor audit. Do not proceed until all checks pass.",
52
+ 15: "Show the results panel, present summary, then selection menu (AskUserQuestion): Save or make changes.",
53
+ 16: "Hide the results panel and commit all changes. Do NOT push — that happens in step 18.",
54
+ 17: "Update the journal entry with the commit SHA and amend the commit to include the journal update.",
55
+ 18: "Check for a git remote and offer to push. After push (or skip), call the feature-complete API and STOP.",
56
+ }
57
+
58
+ MIGRATION_STEP_LABELS = {
59
+ 1: "Survey",
60
+ 2: "App Scenarios",
61
+ 3: "Component Scenarios",
62
+ 4: "Preview",
63
+ 5: "Discuss",
64
+ 6: "Decompose",
65
+ 7: "Extract",
66
+ 8: "Recapture",
67
+ 9: "Journal",
68
+ 10: "Present",
69
+ }
70
+
71
+ MIGRATION_STEP_RESTRICTIONS = {
72
+ 1: "Survey the page and start the dev server. Read all files and map data flow. Do NOT register scenarios yet.",
73
+ 2: "Set up seed adapter if needed, then register application scenarios for the ACTUAL page route with seed data.",
74
+ 3: "Create isolation routes and register component scenarios for individual visual components.",
75
+ 4: "Verify screenshots and show results to the user. Do NOT modify application code.",
76
+ 5: "Assess complexity and ask user about decomposition. Wait for user decision before proceeding.",
77
+ 6: "Plan-only. Identify all extractions, mark existing components as REUSE. Do NOT write code.",
78
+ 7: "Execute the extraction plan. Components first, then functions via TDD.",
79
+ 8: "Update glossary, re-register scenarios after code changes, verify screenshots. Fix issues only.",
80
+ 9: "Create the journal entry for this page's migration.",
81
+ 10: "Show results, present summary, commit or make changes. After commit run `codeyam editor migrate complete` then `codeyam editor migrate next`.",
42
82
  }
43
83
 
44
84
 
@@ -58,25 +98,67 @@ def log_event(project_dir, event, data=None):
58
98
 
59
99
 
60
100
  def detect_event():
61
- """Detect whether this is a PostToolUse or Stop hook from stdin."""
101
+ """Detect whether this is a PostToolUse, Stop, or UserPromptSubmit hook from stdin."""
62
102
  try:
63
103
  raw = sys.stdin.read()
64
104
  if not raw.strip():
65
105
  return "unknown", {}
66
106
  data = json.loads(raw)
67
- # PostToolUse has tool_name; Stop has stop_hook_active
107
+ # PostToolUse has tool_name; Stop has stop_hook_active; UserPromptSubmit has prompt
68
108
  if "tool_name" in data:
69
109
  return "post_tool_use", data
70
110
  elif "stop_hook_active" in data:
71
111
  return "stop", data
112
+ elif "prompt" in data:
113
+ return "user_prompt", data
72
114
  return "unknown", data
73
115
  except Exception:
74
116
  return "unknown", {}
75
117
 
76
118
 
77
119
  def main():
120
+ # Only run in editor Build sessions. The env var is set by the terminal
121
+ # server when launching Claude in editor mode. Without this guard, hooks
122
+ # fire in every Claude session in the project (scenario editing, bare
123
+ # claude, etc.) and inject unwanted step restrictions.
124
+ if not os.environ.get("CODEYAM_EDITOR_ACTIVE"):
125
+ return
126
+
78
127
  project_dir = os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
79
128
  state_path = os.path.join(project_dir, ".codeyam", "editor-step.json")
129
+ prompt_path = os.path.join(project_dir, ".codeyam", "editor-user-prompt.txt")
130
+
131
+ # Detect event early so we can capture the user prompt even before state exists
132
+ event_type, event_data = detect_event()
133
+
134
+ # Capture the user's feature request prompt.
135
+ # Write when: (a) no prompt file yet, (b) no state file (between features),
136
+ # or (c) previous feature is done (step >= 18). This ensures the prompt
137
+ # is refreshed for each new feature instead of persisting stale text.
138
+ # Skip slash commands (e.g. /codeyam-editor) — they aren't user prompts.
139
+ if event_type == "user_prompt":
140
+ prompt_text = event_data.get("prompt", "").strip()
141
+ if prompt_text and not prompt_text.startswith("/"):
142
+ should_capture = not os.path.exists(prompt_path)
143
+ if not should_capture:
144
+ # Overwrite stale prompt when between features
145
+ if not os.path.exists(state_path):
146
+ should_capture = True
147
+ else:
148
+ try:
149
+ with open(state_path, "r") as f:
150
+ prev = json.load(f)
151
+ if prev.get("step", 0) >= 18:
152
+ should_capture = True
153
+ except Exception:
154
+ pass
155
+ if should_capture:
156
+ try:
157
+ os.makedirs(os.path.dirname(prompt_path), exist_ok=True)
158
+ with open(prompt_path, "w") as f:
159
+ f.write(prompt_text)
160
+ except Exception:
161
+ pass # Best-effort
80
162
 
81
163
  if not os.path.exists(state_path):
82
164
  return
@@ -90,23 +172,115 @@ def main():
90
172
  step = state.get("step")
91
173
  label = state.get("label", "Unknown")
92
174
  feature = state.get("feature", "")
175
+ migration = state.get("migration") # Optional migration context
93
176
 
94
177
  if not step:
95
178
  return
96
179
 
97
- event_type, event_data = detect_event()
180
+ # ── Task tracking ──────────────────────────────────────────────────
181
+ # Track whether TaskCreate was called between step transitions.
182
+ # If Claude advances to the next step without creating a task, block it.
183
+ task_tracking_path = os.path.join(project_dir, ".codeyam", "editor-task-tracking.json")
184
+
185
+ if event_type == "post_tool_use":
186
+ tool_name = event_data.get("tool_name", "")
187
+
188
+ # Record when TaskCreate is called
189
+ if tool_name == "TaskCreate":
190
+ try:
191
+ tracking = {}
192
+ if os.path.exists(task_tracking_path):
193
+ with open(task_tracking_path, "r") as f:
194
+ tracking = json.load(f)
195
+ tracking["taskCreated"] = True
196
+ with open(task_tracking_path, "w") as f:
197
+ json.dump(tracking, f)
198
+ except Exception:
199
+ pass
98
200
 
99
201
  # Log the hook firing
100
202
  log_data = {"step": step, "label": label, "feature": feature, "hook": event_type}
203
+ if migration:
204
+ log_data["migration"] = True
101
205
  if event_type == "post_tool_use":
102
206
  log_data["tool"] = event_data.get("tool_name", "")
103
207
  log_event(project_dir, "hook", log_data)
104
208
 
105
- restriction = STEP_RESTRICTIONS.get(step, "")
106
- next_cmd = f"codeyam editor {step + 1}" if step < 11 else "codeyam editor 1"
209
+ # Use migration-specific labels/restrictions when in migration mode
210
+ if migration:
211
+ restriction = MIGRATION_STEP_RESTRICTIONS.get(step, "")
212
+ next_cmd = f"codeyam editor migrate {step + 1}" if step < 10 else "codeyam editor migrate next"
213
+ else:
214
+ restriction = STEP_RESTRICTIONS.get(step, "")
215
+ next_cmd = f"codeyam editor {step + 1}" if step < 18 else "(feature complete — UI handles transition)"
107
216
 
217
+ # UserPromptSubmit: concise workflow reminder injected before Claude processes the user's message
218
+ if event_type == "user_prompt":
219
+ mode_label = "Migration Mode" if migration else "Editor Mode"
220
+ page_info = ""
221
+ if migration:
222
+ page_name = migration.get("pageName", "")
223
+ page_idx = migration.get("pageIndex", 0)
224
+ total = migration.get("totalPages", 0)
225
+ page_info = f" — Page {page_idx + 1}/{total} ({page_name})"
226
+
227
+ lines = [
228
+ f'<user-prompt-submit-hook>',
229
+ f'{mode_label} — Step {step} ({label}): "{feature}"{page_info}',
230
+ ]
231
+
232
+ # Include the active scenario so Claude knows what the user is looking at
233
+ active_scenario_path = os.path.join(project_dir, ".codeyam", "active-scenario.json")
234
+ try:
235
+ with open(active_scenario_path, "r") as f:
236
+ active = json.load(f)
237
+ scenario_name = (
238
+ active.get("scenarioName")
239
+ or active.get("scenarioSlug", "").replace("_", " ")
240
+ )
241
+ if scenario_name:
242
+ lines.append(
243
+ f'The user is currently viewing scenario: "{scenario_name}". '
244
+ "Assume any feedback refers to this scenario unless they say otherwise."
245
+ )
246
+ except (IOError, json.JSONDecodeError):
247
+ pass
248
+
249
+ if migration and step == 8:
250
+ lines.append(
251
+ "If the user is requesting changes (even indirectly), "
252
+ "run `codeyam editor change` BEFORE making any modifications. "
253
+ "The change workflow ensures Working Session Results are shown to the user. "
254
+ "If the user chose to commit, run `codeyam editor migrate next` to advance to the next page."
255
+ )
256
+ elif step in (15, 16, 17, 18) and not migration:
257
+ lines.append(
258
+ "If the user is requesting changes (even indirectly), "
259
+ "run `codeyam editor change` BEFORE making any modifications "
260
+ "(code, scenarios, data, styles — everything). "
261
+ "The change command gives you the post-change checklist. "
262
+ "The change workflow ensures Working Session Results are shown to the user. "
263
+ "If the user chose to commit, run `codeyam editor 16` to advance to the commit step."
264
+ )
265
+ elif migration:
266
+ lines.append(
267
+ f"You are on migration step {step}. Follow the `codeyam editor migrate` workflow. "
268
+ f"Do NOT skip ahead or make changes outside the current step."
269
+ )
270
+ else:
271
+ lines.append(
272
+ f"You are on step {step}. Follow the `codeyam editor` workflow. "
273
+ f"Do NOT skip ahead or make changes outside the current step."
274
+ )
275
+ if restriction:
276
+ lines.append(restriction)
277
+ lines.append('</user-prompt-submit-hook>')
278
+ print("\n".join(lines))
279
+ return
280
+
281
+ mode_label = "Migration Mode" if migration else "Editor Mode"
108
282
  lines = [
109
- f'Editor Mode \u2014 Step {step} ({label}): "{feature}"',
283
+ f'{mode_label} \u2014 Step {step} ({label}): "{feature}"',
110
284
  ]
111
285
  if restriction:
112
286
  lines.append(restriction)
@@ -117,18 +291,40 @@ def main():
117
291
  BOLD_CYAN = "\033[1;36m"
118
292
  DIM = "\033[2m"
119
293
  RESET = "\033[0m"
120
- tracker = [f"{DIM} \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510{RESET}"]
121
- for i in range(1, 12):
122
- lbl = STEP_LABELS[i].ljust(28)
123
- num = f" {i}" if i < 10 else f"{i}"
124
- content = f"{num}. {lbl}"
125
- if i < step:
126
- tracker.append(f"{DIM} \u2502{RESET}{GREEN} \u2713 {content}{RESET}{DIM}\u2502{RESET}")
127
- elif i == step:
128
- tracker.append(f"{DIM} \u2502{RESET}{BOLD_CYAN} \u2192 {content}{RESET}{DIM}\u2502{RESET}")
129
- else:
130
- tracker.append(f"{DIM} \u2502 \u25cb {content}\u2502{RESET}")
131
- tracker.append(f"{DIM} \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518{RESET}")
294
+
295
+ if migration:
296
+ # Migration progress tracker (10 steps)
297
+ page_name = migration.get("pageName", "")
298
+ page_idx = migration.get("pageIndex", 0)
299
+ total = migration.get("totalPages", 0)
300
+ tracker = [f"{DIM} Migration: Page {page_idx + 1}/{total} ({page_name}){RESET}"]
301
+ tracker.append(f"{DIM} \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510{RESET}")
302
+ for i in range(1, 11):
303
+ lbl = MIGRATION_STEP_LABELS[i].ljust(28)
304
+ num = f" {i}" if i < 10 else f"{i}"
305
+ cntnt = f"{num}. {lbl}"
306
+ if i < step:
307
+ tracker.append(f"{DIM} \u2502{RESET}{GREEN} \u2713 {cntnt}{RESET}{DIM}\u2502{RESET}")
308
+ elif i == step:
309
+ tracker.append(f"{DIM} \u2502{RESET}{BOLD_CYAN} \u2192 {cntnt}{RESET}{DIM}\u2502{RESET}")
310
+ else:
311
+ tracker.append(f"{DIM} \u2502 \u25cb {cntnt}\u2502{RESET}")
312
+ tracker.append(f"{DIM} \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518{RESET}")
313
+ else:
314
+ # Standard progress tracker (18 steps)
315
+ tracker = [f"{DIM} \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510{RESET}"]
316
+ for i in range(1, 19):
317
+ lbl = STEP_LABELS[i].ljust(28)
318
+ num = f" {i}" if i < 10 else f"{i}"
319
+ content = f"{num}. {lbl}"
320
+ if i < step:
321
+ tracker.append(f"{DIM} \u2502{RESET}{GREEN} \u2713 {content}{RESET}{DIM}\u2502{RESET}")
322
+ elif i == step:
323
+ tracker.append(f"{DIM} \u2502{RESET}{BOLD_CYAN} \u2192 {content}{RESET}{DIM}\u2502{RESET}")
324
+ else:
325
+ tracker.append(f"{DIM} \u2502 \u25cb {content}\u2502{RESET}")
326
+ tracker.append(f"{DIM} \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518{RESET}")
327
+
132
328
  lines.append("Present this progress tracker to the user (copy verbatim):")
133
329
  lines.extend(tracker)
134
330
  lines.append(
@@ -136,6 +332,33 @@ def main():
136
332
  "\u2713 (done) or \u2717 (skipped + reason)."
137
333
  )
138
334
 
335
+ if event_type == "stop" and ((step in (15, 16) and not migration) or (step == 8 and migration)):
336
+ import subprocess as _sp
337
+ try:
338
+ _result = _sp.run(
339
+ ["git", "status", "--porcelain"],
340
+ cwd=project_dir,
341
+ capture_output=True, text=True, timeout=5
342
+ )
343
+ has_uncommitted = bool(_result.stdout.strip())
344
+ except Exception:
345
+ has_uncommitted = False
346
+
347
+ if has_uncommitted:
348
+ lines.append(
349
+ "\n\033[1;31m⚠️ You have uncommitted changes but haven't shown Working Session Results.\033[0m"
350
+ )
351
+ lines.append(
352
+ f"\033[31mRun `codeyam editor change` if you haven't already, then complete the "
353
+ f"checklist and run `{'codeyam editor migrate 8' if migration else 'codeyam editor 15'}` to show results to the user.\033[0m"
354
+ )
355
+
356
+ if event_type == "stop":
357
+ lines.append(
358
+ f"\n\033[2mReminder: Only use `codeyam editor` subcommands in the Build terminal. "
359
+ f"Follow `codeyam editor steps` when changing code.\033[0m"
360
+ )
361
+
139
362
  lines.append(f"When this step is complete, run: {next_cmd}")
140
363
 
141
364
  print("\n".join(lines))
@@ -0,0 +1,288 @@
1
+ # Expo + React Native Setup
2
+
3
+ ## Development
4
+
5
+ This project uses **Expo** with **Expo Router** for file-based navigation and **NativeWind** (Tailwind CSS) for styling.
6
+
7
+ ### Web Development (used by CodeYam)
8
+
9
+ ```bash
10
+ npm run dev
11
+ ```
12
+
13
+ This starts the Expo web dev server. CodeYam uses this to preview your app and take screenshots.
14
+
15
+ ### Mobile Development
16
+
17
+ ```bash
18
+ # iOS Simulator
19
+ npm run ios
20
+
21
+ # Android Emulator
22
+ npm run android
23
+
24
+ # Start Expo dev server (pick platform from menu)
25
+ npm start
26
+ ```
27
+
28
+ ## Project Structure
29
+
30
+ ```
31
+ app/ # Expo Router file-based routes
32
+ _layout.tsx # Root layout (SafeAreaProvider, StatusBar)
33
+ index.tsx # Home screen (single entry point)
34
+ components/ # Reusable components
35
+ lib/
36
+ theme.ts # Design tokens (colors, spacing, typography)
37
+ storage.ts # AsyncStorage wrapper for persistent data
38
+ __tests__/ # Test files (keep outside app/ — Expo Router treats all app/ files as routes)
39
+ ```
40
+
41
+ ## Key Patterns
42
+
43
+ ### Navigation (Expo Router)
44
+
45
+ Add new screens by creating files in `app/`:
46
+
47
+ - `app/profile.tsx` — accessible at `/profile`
48
+ - `app/items/[id].tsx` — dynamic route at `/items/123`
49
+
50
+ ### Data Fetching
51
+
52
+ Use standard `fetch()` for API calls. CodeYam intercepts these to provide mock data during simulations:
53
+
54
+ ```tsx
55
+ const response = await fetch('/api/items');
56
+ const data = await response.json();
57
+ ```
58
+
59
+ ### Storage
60
+
61
+ Use the typed storage helper for persistent data:
62
+
63
+ ```tsx
64
+ import { storage } from '@/lib/storage';
65
+
66
+ const items = await storage.get('items', []);
67
+ await storage.set('items', [...items, newItem]);
68
+ ```
69
+
70
+ ### Styling (NativeWind)
71
+
72
+ Use Tailwind classes on React Native components:
73
+
74
+ ```tsx
75
+ <View className="flex-1 items-center justify-center bg-white p-4">
76
+ <Text className="text-lg font-bold text-gray-900">Hello</Text>
77
+ </View>
78
+ ```
79
+
80
+ ## CodeYam Scenario Data
81
+
82
+ ### AsyncStorage Seeding
83
+
84
+ AsyncStorage uses `localStorage` on web, so CodeYam's existing localStorage injection works automatically. Use the `localStorage` field in scenario JSON to pre-populate storage:
85
+
86
+ ```json
87
+ {
88
+ "name": "With Saved Items",
89
+ "url": "/",
90
+ "dimensions": ["iPhone 16"],
91
+ "localStorage": {
92
+ "items": "[{\"id\":\"1\",\"title\":\"Buy groceries\",\"done\":false},{\"id\":\"2\",\"title\":\"Walk the dog\",\"done\":true}]"
93
+ }
94
+ }
95
+ ```
96
+
97
+ Values must be JSON strings (matching how AsyncStorage stores them). Your `storage.get()` calls will read this data normally.
98
+
99
+ ### API Mocking
100
+
101
+ For apps that fetch from APIs, use relative URLs so CodeYam's proxy can intercept and mock them:
102
+
103
+ ```tsx
104
+ // Use relative URLs — these go through the CodeYam proxy
105
+ const response = await fetch('/api/items');
106
+ ```
107
+
108
+ Then provide mock routes in your scenario data:
109
+
110
+ ```json
111
+ {
112
+ "name": "With API Data",
113
+ "url": "/",
114
+ "dimensions": ["iPhone 16"],
115
+ "routes": {
116
+ "/api/items": {
117
+ "body": [{ "id": 1, "title": "First item" }],
118
+ "status": 200
119
+ }
120
+ }
121
+ }
122
+ ```
123
+
124
+ ### Device Presets
125
+
126
+ Mobile projects default to these screen sizes:
127
+
128
+ | Preset | Width | Height |
129
+ | ----------------- | ----- | ------ |
130
+ | iPhone 16 | 393 | 852 |
131
+ | iPhone 16 Pro Max | 430 | 932 |
132
+ | iPhone SE | 375 | 667 |
133
+ | Pixel 8 | 412 | 915 |
134
+ | iPad mini | 744 | 1133 |
135
+
136
+ ## Design Tokens (lib/theme.ts)
137
+
138
+ All design tokens live in `lib/theme.ts` — this is the **single source of truth** for colors, spacing, typography, and border radius. Import and use in every component:
139
+
140
+ ```tsx
141
+ import { theme } from '@/lib/theme';
142
+
143
+ <View
144
+ style={{ backgroundColor: theme.colors.bgBase, padding: theme.spacing.lg }}
145
+ >
146
+ <Text
147
+ style={{ fontSize: theme.fontSize.lg, color: theme.colors.textPrimary }}
148
+ >
149
+ Hello
150
+ </Text>
151
+ </View>;
152
+ ```
153
+
154
+ **Do NOT:**
155
+
156
+ - Use CSS custom properties (`var(--token)`) — they don't work in React Native
157
+ - Hardcode color strings or pixel values in components
158
+ - Create a separate `globals.css` token system — `lib/theme.ts` is the only source
159
+
160
+ When a design system is selected, populate `lib/theme.ts` with its tokens.
161
+
162
+ ## Testing
163
+
164
+ Tests use Jest with the `jest-expo` preset. Run with:
165
+
166
+ ```bash
167
+ npx jest # Run all tests
168
+ npx jest app/hooks/useCounter.ts # Run specific test file
169
+ ```
170
+
171
+ The Jest config is in `package.json`. The `transformIgnorePatterns` is pre-configured to handle Expo and React Native module transforms — you should not need to modify it.
172
+
173
+ ## Building for a Real iOS Device
174
+
175
+ ### Prerequisites
176
+
177
+ - **Xcode 16.x** (Xcode 16.4 or later recommended)
178
+ - **Apple Developer account** (free is fine for personal devices)
179
+ - Device connected via USB or on the same Wi-Fi network
180
+
181
+ ### Steps
182
+
183
+ 1. Generate the native iOS project:
184
+
185
+ ```bash
186
+ npx expo prebuild --clean
187
+ ```
188
+
189
+ 2. Add Swift 5 enforcement to the generated Podfile. Open `ios/Podfile` and add this inside the `post_install` block, after `react_native_post_install(...)`:
190
+
191
+ ```ruby
192
+ # Fix Swift 6.1 (Xcode 16.4) strict concurrency errors
193
+ installer.pods_project.targets.each do |target|
194
+ target.build_configurations.each do |config|
195
+ config.build_settings['SWIFT_VERSION'] = '5.0'
196
+ end
197
+ end
198
+ ```
199
+
200
+ 3. Reinstall pods with the fix:
201
+
202
+ ```bash
203
+ cd ios && pod install && cd ..
204
+ ```
205
+
206
+ 4. Build and run on your device:
207
+
208
+ ```bash
209
+ npx expo run:ios --device
210
+ ```
211
+
212
+ ### Troubleshooting
213
+
214
+ - **"invalid code signature" / "profile has not been explicitly trusted"**: Your iPhone doesn't trust the developer profile yet. On your iPhone: **Settings → General → VPN & Device Management** → tap your Apple ID → **Trust**. Then relaunch the app.
215
+ - **"No script URL provided"**: Metro bundler isn't running or the device can't reach it. Start Metro with `npx expo start` in a separate terminal, then relaunch the app. Your phone and Mac must be on the same Wi-Fi network.
216
+ - **"Missing factory in ExpoAppDelegate"** crash: The native project is stale. Run `npx expo prebuild --clean` to regenerate it.
217
+ - **"ambiguous implicit access level for import"** error: The `patch-package` fix wasn't applied. Run `npm install` to reapply, then `cd ios && pod install`.
218
+
219
+ ### Notes
220
+
221
+ - The `ios/` and `android/` directories are gitignored — they're generated by `expo prebuild` and shouldn't be committed.
222
+ - The `patches/` directory IS committed — it contains a fix for Xcode 16.4 Swift compatibility that auto-applies on `npm install`.
223
+
224
+ ## Web vs Native Differences
225
+
226
+ The CodeYam editor previews your app via **Expo Web** (react-native-web in a browser). Some differences from native iOS/Android devices are expected:
227
+
228
+ | Aspect | Web Preview | Native Device |
229
+ | ---------------- | ------------------------------------------------------ | ------------------------------------------------------- |
230
+ | **Fonts** | System fonts, may differ in weight/metrics/line-height | Loaded custom fonts (if added via expo-font) |
231
+ | **SafeAreaView** | No effect (no notch in browser) | Applies real safe area insets for notch, home indicator |
232
+ | **Platform.OS** | Returns `'web'` | Returns `'ios'` or `'android'` |
233
+ | **Shadows** | Uses CSS `box-shadow` (works well) | Uses RN shadow props (iOS) or `elevation` (Android) |
234
+ | **Gestures** | Mouse drag events | Touch/swipe with inertia |
235
+ | **StatusBar** | No visible effect | Controls device status bar appearance |
236
+ | **Haptics** | No-op | Real haptic feedback via `expo-haptics` |
237
+ | **Pressable** | `backgroundColor`/`borderStyle` work on Pressable | Must use View wrapper (see below) |
238
+
239
+ ### Pressable Styling on Native
240
+
241
+ `<Pressable>` with `backgroundColor`, `borderRadius`, or `borderStyle: 'dashed'` renders correctly in the web preview but **fails silently on native devices** — the background/border simply won't appear.
242
+
243
+ **Fix:** Put visual styles on a wrapping `<View>` and use `onPressIn`/`onPressOut` for press feedback:
244
+
245
+ ```tsx
246
+ const [pressed, setPressed] = useState(false);
247
+
248
+ <View
249
+ style={{
250
+ backgroundColor: theme.colors.bgInverse,
251
+ borderRadius: 60,
252
+ overflow: 'hidden',
253
+ }}
254
+ >
255
+ <Pressable
256
+ onPress={onPress}
257
+ onPressIn={() => setPressed(true)}
258
+ onPressOut={() => setPressed(false)}
259
+ style={{
260
+ opacity: pressed ? 0.8 : 1,
261
+ alignItems: 'center',
262
+ padding: theme.spacing.lg,
263
+ }}
264
+ >
265
+ <Text style={{ color: theme.colors.accent }}>+</Text>
266
+ </Pressable>
267
+ </View>;
268
+ ```
269
+
270
+ For dashed borders, put `borderStyle`, `borderWidth`, and `borderColor` on the outer `<View>`, not on `<Pressable>`.
271
+
272
+ **The web preview is for layout and data verification.** Test final visual polish on a real device or simulator:
273
+
274
+ ```bash
275
+ npm run ios # iOS Simulator
276
+ npm run android # Android Emulator
277
+ npm start # Pick platform from Expo menu
278
+ ```
279
+
280
+ ## Building for Production
281
+
282
+ ```bash
283
+ # Web
284
+ npm run build:web
285
+
286
+ # iOS/Android (requires EAS CLI)
287
+ npx eas build
288
+ ```