@codeyam/codeyam-cli 0.1.0-staging.ae0de75 → 0.1.0-staging.b6c4c78
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.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +6 -6
- package/analyzer-template/packages/ai/package.json +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +0 -33
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +13 -7
- package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +92 -0
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +0 -65
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +10 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +92 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +0 -25
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
- package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
- package/analyzer-template/packages/ui-components/package.json +1 -1
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
- package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
- package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
- package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
- package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
- package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
- package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +45 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +101 -47
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +3 -46
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +2629 -329
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +68 -34
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/data/techStacks.js +77 -0
- package/codeyam-cli/src/data/techStacks.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +173 -0
- package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
- package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
- package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js +137 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +742 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js +76 -0
- package/codeyam-cli/src/utils/__tests__/editorBroadcastViewport.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
- package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +181 -3
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +124 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +223 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
- package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +249 -2
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +555 -0
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorMigration.test.js +430 -0
- package/codeyam-cli/src/utils/__tests__/editorMigration.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +118 -1
- package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +209 -3
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +153 -0
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +221 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +1114 -2
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +280 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js +66 -0
- package/codeyam-cli/src/utils/__tests__/editorSessionFilter.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js +53 -0
- package/codeyam-cli/src/utils/__tests__/editorShouldRevalidate.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +1829 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +107 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +129 -0
- package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js +118 -0
- package/codeyam-cli/src/utils/__tests__/routePatternMatching.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +227 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +454 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +26 -5
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
- package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
- package/codeyam-cli/src/utils/analysisRunner.js +3 -1
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +9 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/analyzerFinalization.js +100 -0
- package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
- package/codeyam-cli/src/utils/backgroundServer.js +94 -18
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/database.js +37 -2
- package/codeyam-cli/src/utils/database.js.map +1 -1
- package/codeyam-cli/src/utils/devServerState.js +71 -0
- package/codeyam-cli/src/utils/devServerState.js.map +1 -0
- package/codeyam-cli/src/utils/editorApi.js +79 -0
- package/codeyam-cli/src/utils/editorApi.js.map +1 -0
- package/codeyam-cli/src/utils/editorAudit.js +135 -7
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorBroadcastViewport.js +26 -0
- package/codeyam-cli/src/utils/editorBroadcastViewport.js.map +1 -0
- package/codeyam-cli/src/utils/editorCapture.js +102 -0
- package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
- package/codeyam-cli/src/utils/editorDevServer.js +100 -1
- package/codeyam-cli/src/utils/editorDevServer.js.map +1 -1
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js +44 -0
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
- package/codeyam-cli/src/utils/editorEntityHelpers.js +129 -0
- package/codeyam-cli/src/utils/editorEntityHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
- package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
- package/codeyam-cli/src/utils/editorJournal.js +92 -4
- package/codeyam-cli/src/utils/editorJournal.js.map +1 -1
- package/codeyam-cli/src/utils/editorLoaderHelpers.js +140 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorMigration.js +224 -0
- package/codeyam-cli/src/utils/editorMigration.js.map +1 -0
- package/codeyam-cli/src/utils/editorMockState.js +1 -1
- package/codeyam-cli/src/utils/editorPreloadHelpers.js +72 -1
- package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -1
- package/codeyam-cli/src/utils/editorPreview.js +72 -1
- package/codeyam-cli/src/utils/editorPreview.js.map +1 -1
- package/codeyam-cli/src/utils/editorScenarioSwitch.js +112 -0
- package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarios.js +349 -0
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/editorSeedAdapter.js +352 -0
- package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
- package/codeyam-cli/src/utils/editorShouldRevalidate.js +21 -0
- package/codeyam-cli/src/utils/editorShouldRevalidate.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js +360 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js +196 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +10 -1
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
- package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
- package/codeyam-cli/src/utils/progress.js +2 -2
- package/codeyam-cli/src/utils/progress.js.map +1 -1
- package/codeyam-cli/src/utils/routePatternMatching.js +129 -0
- package/codeyam-cli/src/utils/routePatternMatching.js.map +1 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js +74 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
- package/codeyam-cli/src/utils/scenariosManifest.js +244 -0
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
- package/codeyam-cli/src/utils/serverState.js +30 -0
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +47 -16
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js +8 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/slugUtils.js +25 -0
- package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
- package/codeyam-cli/src/utils/syncMocksMiddleware.js +2 -2
- package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/webappDetection.js +21 -0
- package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +40 -0
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +567 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +146 -0
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js +65 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
- package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
- package/codeyam-cli/src/webserver/app/types/editor.js +8 -0
- package/codeyam-cli/src/webserver/app/types/editor.js.map +1 -0
- package/codeyam-cli/src/webserver/backgroundServer.js +18 -4
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CzTDWkF2.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BFbq6iFk.js} +5 -5
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-CQgyEGV-.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-B6OMi58N.js} +9 -9
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-DuYodzo1.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-CXo9EeCl.js +25 -0
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DYCNb2It.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-BU_OAEMP.js → LoadingDots-By5zI316.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-ceAyBX-H.js → LogViewer-CZgY3sxX.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-CnYYwRDw.js} +4 -4
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-CDoF7ZpU.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-B76aig_2.js → ScenarioViewer-DrnfvaLL.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-Df3UCi8k.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-CK7-NaPZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-DRKR9T0U.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-ClR-g3tY.js} +4 -4
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-DTH6ydEA.js} +8 -8
- package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
- package/codeyam-cli/src/webserver/build/client/assets/{addon-web-links-Duc5hnl7.js → addon-web-links-74hnHF59.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
- package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-B8CYhCO9.js} +7 -7
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-rename-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-seed-state-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-prompt-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-session-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-CLaoh4ac.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-BZ2DZxbW.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-C4pqxYJB.js → chunk-JZWAC4HX-BBXArFPl.js} +13 -21
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-CT4unAk-.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-zK0B6Nu-.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-DJB0YQJL.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-CkXFP_i-.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor._tab-DPw7NZHc.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-y_5LB2iU.js +58 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-DBa7T2FK.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-BqAN7hyG.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-BOi8kpwd.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-Dg1NhIms.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-CJX6kkkV.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMvVHNXU.js → entity._sha_.edit._scenarioId-BhVjZhKg.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-DTvKq3TY.js → entry.client-_gzKltPN.js} +6 -6
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-Daa96Fr1.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-CV_17tZS.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/git-D-YXmMbR.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-BCTpZEY8.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-Blo6EK8G.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-10oVnAAH.js → index-BsX0F-9C.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-BcvgDzbZ.js → index-CCrgCshv.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/jsx-runtime-D_zvdyIk.js +9 -0
- package/codeyam-cli/src/webserver/build/client/assets/labs-Byazq8Pv.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-DVQ0oHR7.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/manifest-5f1c29f5.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-b-VmA2Vj.js +101 -0
- package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-DGcndCAa.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/root-BBCQJ_ZM.js +67 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-C0Uw0bcK.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/settings-OoNgHIfW.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/simulations-Bcemfu8a.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-BgMmG7R9.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-Cs87hJYK.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BR3Rs7JY.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-C14nCb1q.js → useLastLogLine-BxxP_XF9.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-BermyNU5.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/useToast-a_QN_W9_.js +1 -0
- package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-BLKsJR3o.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/init-C2iMAqYu.js +10 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DR42Xd5a.js +489 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/src/webserver/editorProxy.js +511 -50
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
- package/codeyam-cli/src/webserver/idleDetector.js +73 -0
- package/codeyam-cli/src/webserver/idleDetector.js.map +1 -0
- package/codeyam-cli/src/webserver/mockStateEvents.js +28 -0
- package/codeyam-cli/src/webserver/mockStateEvents.js.map +1 -0
- package/codeyam-cli/src/webserver/public/sound-test.html +98 -0
- package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +242 -3
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +94 -4
- package/codeyam-cli/src/webserver/server.js +99 -16
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +186 -39
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
- package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
- package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
- package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
- package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
- package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
- package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
- package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
- package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
- package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
- package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
- package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
- package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
- package/codeyam-cli/templates/codeyam-editor-claude.md +84 -5
- package/codeyam-cli/templates/editor-step-hook.py +188 -21
- package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
- package/codeyam-cli/templates/expo-react-native/README.md +41 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app.json +18 -0
- package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
- package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
- package/codeyam-cli/templates/expo-react-native/global.css +3 -0
- package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
- package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
- package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
- package/codeyam-cli/templates/expo-react-native/package.json +38 -0
- package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
- package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +9 -4
- package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +21 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +5 -1
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +4 -1
- package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +127 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
- package/codeyam-cli/templates/{nextjs-prisma-sqlite/PRISMA_SETUP.md → nextjs-prisma-supabase/SUPABASE_SETUP.md} +37 -17
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
- package/codeyam-cli/templates/seed-adapters/supabase.ts +282 -0
- package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +2 -2
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +159 -17
- package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +10 -10
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
- package/package.json +15 -10
- package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +10 -4
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/index.js +4 -2
- package/packages/analyze/src/lib/asts/index.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +92 -0
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +0 -6
- package/packages/database/src/lib/loadEntities.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +0 -25
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/types/src/enums/ProjectFramework.js +2 -0
- package/packages/types/src/enums/ProjectFramework.js.map +1 -1
- package/scripts/npm-post-install.cjs +22 -0
- package/codeyam-cli/src/webserver/build/client/assets/CopyButton-DmJveP3T.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeBadge-g3saevPb.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-DYFW3lDD.js +0 -25
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DLeucoVX.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BED4B6sP.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +0 -34
- package/codeyam-cli/src/webserver/build/client/assets/Terminal-wkqC0AQk.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/TruncatedFilePath-C8OKAR5x.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CMT1jU2q.js +0 -21
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor-CdjF_fX6.js +0 -8
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D8ILZMR0.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/fileTableUtils-cPo8LiG3.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-DO4CZ16O.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-CFCTYk9I.js +0 -15
- package/codeyam-cli/src/webserver/build/client/assets/globals-B17TBSS6.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-Zk7ryIM1.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-b8fd6b07.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-FweZHj5U.js +0 -93
- package/codeyam-cli/src/webserver/build/client/assets/root-DUKqhFlb.js +0 -67
- package/codeyam-cli/src/webserver/build/client/assets/settings-DfuTtcJP.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-B3aOzpCZ.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-O-jkvSPx.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-9FIWuYfK.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-BLhjL9Xi.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DyMuI5mU.js +0 -363
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh +0 -108
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh +0 -69
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.sh +0 -12
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter.jq +0 -45
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.sh +0 -139
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>CodeYam App</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="root"></div>
|
|
10
|
+
<script type="module" src="/src/popup/main.tsx"></script>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest_version": 3,
|
|
3
|
+
"name": "CodeYam App",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Built with CodeYam Editor",
|
|
6
|
+
"action": {
|
|
7
|
+
"default_popup": "popup.html",
|
|
8
|
+
"default_title": "CodeYam App"
|
|
9
|
+
},
|
|
10
|
+
"permissions": ["storage"],
|
|
11
|
+
"background": {
|
|
12
|
+
"service_worker": "background.js",
|
|
13
|
+
"type": "module"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Background service worker for the Chrome extension.
|
|
2
|
+
// This runs in the background and can handle events like
|
|
3
|
+
// extension install, alarms, messages from popup/content scripts, etc.
|
|
4
|
+
|
|
5
|
+
chrome.runtime.onInstalled.addListener(() => {
|
|
6
|
+
console.log('Extension installed');
|
|
7
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Wrapper around chrome.storage.local for type-safe data persistence.
|
|
2
|
+
// Falls back to localStorage when running in a regular browser (during development).
|
|
3
|
+
//
|
|
4
|
+
// Usage:
|
|
5
|
+
// import { storage } from "@/lib/storage";
|
|
6
|
+
// await storage.get<Todo[]>("todos", []);
|
|
7
|
+
// await storage.set("todos", updatedTodos);
|
|
8
|
+
|
|
9
|
+
const isChromeExtension =
|
|
10
|
+
typeof chrome !== 'undefined' && chrome.storage?.local;
|
|
11
|
+
|
|
12
|
+
export const storage = {
|
|
13
|
+
async get<T>(key: string, defaultValue: T): Promise<T> {
|
|
14
|
+
if (isChromeExtension) {
|
|
15
|
+
const result = await chrome.storage.local.get(key);
|
|
16
|
+
return (result[key] as T) ?? defaultValue;
|
|
17
|
+
}
|
|
18
|
+
const item = localStorage.getItem(key);
|
|
19
|
+
return item ? (JSON.parse(item) as T) : defaultValue;
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
async set<T>(key: string, value: T): Promise<void> {
|
|
23
|
+
if (isChromeExtension) {
|
|
24
|
+
await chrome.storage.local.set({ [key]: value });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
localStorage.setItem(key, JSON.stringify(value));
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
async remove(key: string): Promise<void> {
|
|
31
|
+
if (isChromeExtension) {
|
|
32
|
+
await chrome.storage.local.remove(key);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
localStorage.removeItem(key);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export default function App() {
|
|
2
|
+
return (
|
|
3
|
+
<main className="w-80 min-h-48 p-4 flex items-center justify-center">
|
|
4
|
+
<div className="text-center">
|
|
5
|
+
<h1 className="text-xl font-bold mb-2">Welcome</h1>
|
|
6
|
+
<p className="text-gray-600 text-sm">
|
|
7
|
+
Your extension is ready. Start building!
|
|
8
|
+
</p>
|
|
9
|
+
</div>
|
|
10
|
+
</main>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"moduleResolution": "bundler",
|
|
9
|
+
"allowImportingTsExtensions": true,
|
|
10
|
+
"isolatedModules": true,
|
|
11
|
+
"moduleDetection": "force",
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"jsx": "react-jsx",
|
|
14
|
+
"strict": true,
|
|
15
|
+
"noUnusedLocals": true,
|
|
16
|
+
"noUnusedParameters": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"noUncheckedSideEffectImports": true,
|
|
19
|
+
"paths": {
|
|
20
|
+
"@/*": ["./src/*"]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"include": ["src"]
|
|
24
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import react from '@vitejs/plugin-react';
|
|
3
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
4
|
+
import { resolve } from 'path';
|
|
5
|
+
|
|
6
|
+
// In "extension" mode, build produces a Chrome extension in dist/.
|
|
7
|
+
// In default mode, `vite dev` serves the popup as a regular web page
|
|
8
|
+
// so you can develop and test it in a normal browser tab.
|
|
9
|
+
|
|
10
|
+
export default defineConfig(({ mode }) => ({
|
|
11
|
+
plugins: [react(), tailwindcss()],
|
|
12
|
+
server: {
|
|
13
|
+
// Bind to the port provided by CodeYam editor (via PORT env var) or default 5173.
|
|
14
|
+
// Use 0.0.0.0 so the dev server is reachable on both IPv4 and IPv6 loopback.
|
|
15
|
+
port: process.env.PORT ? parseInt(process.env.PORT, 10) : 5173,
|
|
16
|
+
host: '0.0.0.0',
|
|
17
|
+
},
|
|
18
|
+
resolve: {
|
|
19
|
+
alias: {
|
|
20
|
+
'@': resolve(__dirname, 'src'),
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
build:
|
|
24
|
+
mode === 'extension'
|
|
25
|
+
? {
|
|
26
|
+
rollupOptions: {
|
|
27
|
+
input: {
|
|
28
|
+
popup: resolve(__dirname, 'popup.html'),
|
|
29
|
+
},
|
|
30
|
+
output: {
|
|
31
|
+
entryFileNames: '[name].js',
|
|
32
|
+
chunkFileNames: '[name].js',
|
|
33
|
+
assetFileNames: '[name].[ext]',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
outDir: 'dist',
|
|
37
|
+
emptyOutDir: true,
|
|
38
|
+
copyPublicDir: true,
|
|
39
|
+
}
|
|
40
|
+
: undefined,
|
|
41
|
+
}));
|
|
@@ -26,14 +26,20 @@ A **scenario** is a named set of data that drives how the app renders. Scenarios
|
|
|
26
26
|
- **App-level scenarios**: Full application state — what the database contains, what API responses return. Example: "Empty Dashboard", "Dashboard with 50 Tasks", "Dashboard with Overdue Tasks"
|
|
27
27
|
- **Component-level scenarios**: Props for a single component in isolation. Example: "TaskCard - Default", "TaskCard - Overdue", "TaskCard - Completed"
|
|
28
28
|
|
|
29
|
-
**
|
|
29
|
+
**Only create scenarios for states the current code can render.** If you seed 10 articles but the app doesn't have an article list component yet, the screenshot will show an empty page — that's a broken scenario. After registering, always view the captured screenshot to verify the data is actually visible.
|
|
30
|
+
|
|
31
|
+
**Always register scenarios with CodeYam** using the CLI:
|
|
30
32
|
|
|
31
33
|
```bash
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
# Small inline JSON:
|
|
35
|
+
codeyam editor register '{"name":"TaskCard - Default","componentName":"TaskCard","url":"/isolated-components/TaskCard?s=Default","dimensions":["<name from screenSizes>"]}'
|
|
36
|
+
|
|
37
|
+
# Large JSON — use the Write tool to write to .codeyam/tmp/scenario.json, then:
|
|
38
|
+
codeyam editor register @.codeyam/tmp/scenario.json
|
|
35
39
|
```
|
|
36
40
|
|
|
41
|
+
**To list existing scenarios:** `codeyam editor scenarios`
|
|
42
|
+
|
|
37
43
|
### Database First
|
|
38
44
|
|
|
39
45
|
Use a real database (SQLite + Prisma recommended) from the start. This lets scenarios represent different database states rather than just static prop variations:
|
|
@@ -54,7 +60,11 @@ Build components so they work at both zoom levels. A `TaskCard` should render co
|
|
|
54
60
|
## Workflow
|
|
55
61
|
|
|
56
62
|
1. Build a component
|
|
57
|
-
2. Create
|
|
63
|
+
2. Create scenarios with rich, realistic data that thoroughly exercises the component:
|
|
64
|
+
- Happy path with diverse, realistic content (not just "Test Item 1", "Test Item 2")
|
|
65
|
+
- Empty state (no data, first-time user)
|
|
66
|
+
- Rich data (many items, all optional fields populated, varied lengths and categories)
|
|
67
|
+
- Edge cases if they surface naturally from diverse data
|
|
58
68
|
3. Register the scenarios with CodeYam
|
|
59
69
|
4. Preview each scenario to verify the component handles all states
|
|
60
70
|
5. Repeat for the next component, building up scenario coverage
|
|
@@ -66,3 +76,72 @@ Build components so they work at both zoom levels. A `TaskCard` should render co
|
|
|
66
76
|
- Components accept props that can be provided by scenarios
|
|
67
77
|
- Database seed scripts go in `prisma/seeds/` (one per scenario when using DB-level scenarios)
|
|
68
78
|
- MSW handler files go in `.codeyam/msw-handlers/` (one per scenario for API mocking)
|
|
79
|
+
|
|
80
|
+
## Design System
|
|
81
|
+
|
|
82
|
+
If `.codeyam/design-system.md` exists, it contains the project's design tokens and brand guidelines. The editor step instructions will automatically show its contents inline — you don't need to read the file separately.
|
|
83
|
+
|
|
84
|
+
- Define **every** design token as a CSS custom property in `globals.css` — not just colors:
|
|
85
|
+
- Colors: `--bg-surface`, `--text-primary`, `--accent-green-a`, etc.
|
|
86
|
+
- Typography: `--text-xs: 12px`, `--text-sm: 14px`, `--text-lg: 18px`, etc.
|
|
87
|
+
- Font weights: `--font-weight-normal: 400`, `--font-weight-medium: 500`, `--font-weight-semibold: 600`
|
|
88
|
+
- Spacing: `--spacing-xs: 4px`, `--spacing-sm: 8px`, `--spacing-md: 12px`, `--spacing-lg: 16px`, etc.
|
|
89
|
+
- Border radius, shadows, and transitions
|
|
90
|
+
- Components must reference tokens — **zero hardcoded px values** for font-size, padding, margin, gap, or colors
|
|
91
|
+
- Bad: `fontSize: 14`, `padding: '12px 16px'`, `gap: 8`
|
|
92
|
+
- Good: `fontSize: 'var(--text-sm)'`, `padding: 'var(--spacing-md) var(--spacing-lg)'`, `gap: 'var(--spacing-sm)'`
|
|
93
|
+
- This ensures the entire app updates when the design system changes
|
|
94
|
+
|
|
95
|
+
## Avoiding Permission Prompts
|
|
96
|
+
|
|
97
|
+
These patterns cause unnecessary approval prompts in Claude Code. Follow these rules:
|
|
98
|
+
|
|
99
|
+
### Writing JSON files — use the Write tool, not bash
|
|
100
|
+
|
|
101
|
+
**BAD** (triggers "expansion obfuscation" security warning due to braces+quotes in heredoc):
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
cat > /tmp/scenario.json << 'EOF'
|
|
105
|
+
{"name":"My Scenario","localStorage":{"key":"[{\"id\":\"1\"}]"}}
|
|
106
|
+
EOF
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**GOOD** (Write tool is pre-approved, no bash prompt):
|
|
110
|
+
Use the **Write tool** to create `.codeyam/tmp/scenario.json`, then register:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
codeyam editor register @.codeyam/tmp/scenario.json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Listing scenarios — use the CLI subcommand
|
|
117
|
+
|
|
118
|
+
**BAD** (triggers bash approval):
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
cat .codeyam/editor-scenarios/*.json | grep -o '"name":"[^"]*"'
|
|
122
|
+
ls .codeyam/editor-scenarios/*.json
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**GOOD** (pre-approved):
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
codeyam editor scenarios
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Database schema changes — never force-reset
|
|
132
|
+
|
|
133
|
+
**BAD** (destructive, triggers approval, drops all data):
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
npx prisma db push --force-reset
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**GOOD** (preserves data by providing defaults for new required columns):
|
|
140
|
+
|
|
141
|
+
```prisma
|
|
142
|
+
userId Int @default(0) // existing rows get 0
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Then: `npm run db:push`
|
|
146
|
+
|
|
147
|
+
If you must add a required column without a default, make it optional (`Int?`) or provide a `@default()` value. Never destroy user data with `--force-reset`.
|
|
@@ -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.
|
|
@@ -26,6 +26,10 @@ STEP_LABELS = {
|
|
|
26
26
|
10: "Verify",
|
|
27
27
|
11: "Journal",
|
|
28
28
|
12: "Review",
|
|
29
|
+
13: "Present",
|
|
30
|
+
14: "Commit",
|
|
31
|
+
15: "Finalize",
|
|
32
|
+
16: "Push",
|
|
29
33
|
}
|
|
30
34
|
|
|
31
35
|
STEP_RESTRICTIONS = {
|
|
@@ -40,7 +44,37 @@ STEP_RESTRICTIONS = {
|
|
|
40
44
|
9: "Do NOT modify application code. Create user-persona scenarios only (or skip if no users).",
|
|
41
45
|
10: "Verify component isolation screenshots AND editor scenarios. After ANY code fix, re-register affected components. Fix only — do NOT add features.",
|
|
42
46
|
11: "Create or update the journal entry for this feature. Do NOT create a duplicate — check if one exists first.",
|
|
43
|
-
12: "Verify ALL screenshots exist and NO client-side errors (/api/editor-client-errors)
|
|
47
|
+
12: "Verify ALL screenshots exist and NO client-side errors (/api/editor-client-errors). Run codeyam editor audit. Do not proceed until all checks pass.",
|
|
48
|
+
13: "Show the results panel, present summary, then selection menu (AskUserQuestion): Save or make changes.",
|
|
49
|
+
14: "Hide the results panel and commit all changes. Do NOT push — that happens in step 16.",
|
|
50
|
+
15: "Update the journal entry with the commit SHA and amend the commit to include the journal update.",
|
|
51
|
+
16: "Check for a git remote and offer to push. WAIT for the user's answer before starting the next feature.",
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
MIGRATION_STEP_LABELS = {
|
|
55
|
+
1: "Survey",
|
|
56
|
+
2: "App Scenarios",
|
|
57
|
+
3: "Component Scenarios",
|
|
58
|
+
4: "Preview",
|
|
59
|
+
5: "Discuss",
|
|
60
|
+
6: "Decompose",
|
|
61
|
+
7: "Extract",
|
|
62
|
+
8: "Recapture",
|
|
63
|
+
9: "Journal",
|
|
64
|
+
10: "Present",
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
MIGRATION_STEP_RESTRICTIONS = {
|
|
68
|
+
1: "Survey the page and start the dev server. Read all files and map data flow. Do NOT register scenarios yet.",
|
|
69
|
+
2: "Set up seed adapter if needed, then register application scenarios for the ACTUAL page route with seed data.",
|
|
70
|
+
3: "Create isolation routes and register component scenarios for individual visual components.",
|
|
71
|
+
4: "Verify screenshots and show results to the user. Do NOT modify application code.",
|
|
72
|
+
5: "Assess complexity and ask user about decomposition. Wait for user decision before proceeding.",
|
|
73
|
+
6: "Plan-only. Identify all extractions, mark existing components as REUSE. Do NOT write code.",
|
|
74
|
+
7: "Execute the extraction plan. Components first, then functions via TDD.",
|
|
75
|
+
8: "Update glossary, re-register scenarios after code changes, verify screenshots. Fix issues only.",
|
|
76
|
+
9: "Create the journal entry for this page's migration.",
|
|
77
|
+
10: "Show results, present summary, commit or make changes. After commit run `codeyam editor migrate complete` then `codeyam editor migrate next`.",
|
|
44
78
|
}
|
|
45
79
|
|
|
46
80
|
|
|
@@ -60,17 +94,19 @@ def log_event(project_dir, event, data=None):
|
|
|
60
94
|
|
|
61
95
|
|
|
62
96
|
def detect_event():
|
|
63
|
-
"""Detect whether this is a PostToolUse or
|
|
97
|
+
"""Detect whether this is a PostToolUse, Stop, or UserPromptSubmit hook from stdin."""
|
|
64
98
|
try:
|
|
65
99
|
raw = sys.stdin.read()
|
|
66
100
|
if not raw.strip():
|
|
67
101
|
return "unknown", {}
|
|
68
102
|
data = json.loads(raw)
|
|
69
|
-
# PostToolUse has tool_name; Stop has stop_hook_active
|
|
103
|
+
# PostToolUse has tool_name; Stop has stop_hook_active; UserPromptSubmit has prompt
|
|
70
104
|
if "tool_name" in data:
|
|
71
105
|
return "post_tool_use", data
|
|
72
106
|
elif "stop_hook_active" in data:
|
|
73
107
|
return "stop", data
|
|
108
|
+
elif "prompt" in data:
|
|
109
|
+
return "user_prompt", data
|
|
74
110
|
return "unknown", data
|
|
75
111
|
except Exception:
|
|
76
112
|
return "unknown", {}
|
|
@@ -79,6 +115,23 @@ def detect_event():
|
|
|
79
115
|
def main():
|
|
80
116
|
project_dir = os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
|
|
81
117
|
state_path = os.path.join(project_dir, ".codeyam", "editor-step.json")
|
|
118
|
+
prompt_path = os.path.join(project_dir, ".codeyam", "editor-user-prompt.txt")
|
|
119
|
+
|
|
120
|
+
# Detect event early so we can capture the user prompt even before state exists
|
|
121
|
+
event_type, event_data = detect_event()
|
|
122
|
+
|
|
123
|
+
# Capture the very first real user prompt (before state file may exist).
|
|
124
|
+
# Save to a separate file so it persists across state transitions.
|
|
125
|
+
# Skip slash commands (e.g. /codeyam-editor) — they aren't user prompts.
|
|
126
|
+
if event_type == "user_prompt" and not os.path.exists(prompt_path):
|
|
127
|
+
prompt_text = event_data.get("prompt", "").strip()
|
|
128
|
+
if prompt_text and not prompt_text.startswith("/"):
|
|
129
|
+
try:
|
|
130
|
+
os.makedirs(os.path.dirname(prompt_path), exist_ok=True)
|
|
131
|
+
with open(prompt_path, "w") as f:
|
|
132
|
+
f.write(prompt_text)
|
|
133
|
+
except Exception:
|
|
134
|
+
pass # Best-effort
|
|
82
135
|
|
|
83
136
|
if not os.path.exists(state_path):
|
|
84
137
|
return
|
|
@@ -92,23 +145,94 @@ def main():
|
|
|
92
145
|
step = state.get("step")
|
|
93
146
|
label = state.get("label", "Unknown")
|
|
94
147
|
feature = state.get("feature", "")
|
|
148
|
+
migration = state.get("migration") # Optional migration context
|
|
95
149
|
|
|
96
150
|
if not step:
|
|
97
151
|
return
|
|
98
152
|
|
|
99
|
-
event_type, event_data = detect_event()
|
|
100
|
-
|
|
101
153
|
# Log the hook firing
|
|
102
154
|
log_data = {"step": step, "label": label, "feature": feature, "hook": event_type}
|
|
155
|
+
if migration:
|
|
156
|
+
log_data["migration"] = True
|
|
103
157
|
if event_type == "post_tool_use":
|
|
104
158
|
log_data["tool"] = event_data.get("tool_name", "")
|
|
105
159
|
log_event(project_dir, "hook", log_data)
|
|
106
160
|
|
|
107
|
-
|
|
108
|
-
|
|
161
|
+
# Use migration-specific labels/restrictions when in migration mode
|
|
162
|
+
if migration:
|
|
163
|
+
restriction = MIGRATION_STEP_RESTRICTIONS.get(step, "")
|
|
164
|
+
next_cmd = f"codeyam editor migrate {step + 1}" if step < 10 else "codeyam editor migrate next"
|
|
165
|
+
else:
|
|
166
|
+
restriction = STEP_RESTRICTIONS.get(step, "")
|
|
167
|
+
next_cmd = f"codeyam editor {step + 1}" if step < 16 else "codeyam editor 1"
|
|
109
168
|
|
|
169
|
+
# UserPromptSubmit: concise workflow reminder injected before Claude processes the user's message
|
|
170
|
+
if event_type == "user_prompt":
|
|
171
|
+
mode_label = "Migration Mode" if migration else "Editor Mode"
|
|
172
|
+
page_info = ""
|
|
173
|
+
if migration:
|
|
174
|
+
page_name = migration.get("pageName", "")
|
|
175
|
+
page_idx = migration.get("pageIndex", 0)
|
|
176
|
+
total = migration.get("totalPages", 0)
|
|
177
|
+
page_info = f" — Page {page_idx + 1}/{total} ({page_name})"
|
|
178
|
+
|
|
179
|
+
lines = [
|
|
180
|
+
f'<user-prompt-submit-hook>',
|
|
181
|
+
f'{mode_label} — Step {step} ({label}): "{feature}"{page_info}',
|
|
182
|
+
]
|
|
183
|
+
|
|
184
|
+
# Include the active scenario so Claude knows what the user is looking at
|
|
185
|
+
active_scenario_path = os.path.join(project_dir, ".codeyam", "active-scenario.json")
|
|
186
|
+
try:
|
|
187
|
+
with open(active_scenario_path, "r") as f:
|
|
188
|
+
active = json.load(f)
|
|
189
|
+
scenario_name = (
|
|
190
|
+
active.get("scenarioName")
|
|
191
|
+
or active.get("scenarioSlug", "").replace("_", " ")
|
|
192
|
+
)
|
|
193
|
+
if scenario_name:
|
|
194
|
+
lines.append(
|
|
195
|
+
f'The user is currently viewing scenario: "{scenario_name}". '
|
|
196
|
+
"Assume any feedback refers to this scenario unless they say otherwise."
|
|
197
|
+
)
|
|
198
|
+
except (IOError, json.JSONDecodeError):
|
|
199
|
+
pass
|
|
200
|
+
|
|
201
|
+
if migration and step == 8:
|
|
202
|
+
lines.append(
|
|
203
|
+
"If the user is requesting changes (even indirectly), "
|
|
204
|
+
"run `codeyam editor change` BEFORE making any modifications. "
|
|
205
|
+
"The change workflow ensures Working Session Results are shown to the user. "
|
|
206
|
+
"If the user chose to commit, run `codeyam editor migrate next` to advance to the next page."
|
|
207
|
+
)
|
|
208
|
+
elif step in (13, 14, 15, 16) and not migration:
|
|
209
|
+
lines.append(
|
|
210
|
+
"If the user is requesting changes (even indirectly), "
|
|
211
|
+
"run `codeyam editor change` BEFORE making any modifications "
|
|
212
|
+
"(code, scenarios, data, styles — everything). "
|
|
213
|
+
"The change command gives you the post-change checklist. "
|
|
214
|
+
"The change workflow ensures Working Session Results are shown to the user. "
|
|
215
|
+
"If the user chose to commit, run `codeyam editor 14` to advance to the commit step."
|
|
216
|
+
)
|
|
217
|
+
elif migration:
|
|
218
|
+
lines.append(
|
|
219
|
+
f"You are on migration step {step}. Follow the `codeyam editor migrate` workflow. "
|
|
220
|
+
f"Do NOT skip ahead or make changes outside the current step."
|
|
221
|
+
)
|
|
222
|
+
else:
|
|
223
|
+
lines.append(
|
|
224
|
+
f"You are on step {step}. Follow the `codeyam editor` workflow. "
|
|
225
|
+
f"Do NOT skip ahead or make changes outside the current step."
|
|
226
|
+
)
|
|
227
|
+
if restriction:
|
|
228
|
+
lines.append(restriction)
|
|
229
|
+
lines.append('</user-prompt-submit-hook>')
|
|
230
|
+
print("\n".join(lines))
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
mode_label = "Migration Mode" if migration else "Editor Mode"
|
|
110
234
|
lines = [
|
|
111
|
-
f'
|
|
235
|
+
f'{mode_label} \u2014 Step {step} ({label}): "{feature}"',
|
|
112
236
|
]
|
|
113
237
|
if restriction:
|
|
114
238
|
lines.append(restriction)
|
|
@@ -119,18 +243,40 @@ def main():
|
|
|
119
243
|
BOLD_CYAN = "\033[1;36m"
|
|
120
244
|
DIM = "\033[2m"
|
|
121
245
|
RESET = "\033[0m"
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
246
|
+
|
|
247
|
+
if migration:
|
|
248
|
+
# Migration progress tracker (10 steps)
|
|
249
|
+
page_name = migration.get("pageName", "")
|
|
250
|
+
page_idx = migration.get("pageIndex", 0)
|
|
251
|
+
total = migration.get("totalPages", 0)
|
|
252
|
+
tracker = [f"{DIM} Migration: Page {page_idx + 1}/{total} ({page_name}){RESET}"]
|
|
253
|
+
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}")
|
|
254
|
+
for i in range(1, 11):
|
|
255
|
+
lbl = MIGRATION_STEP_LABELS[i].ljust(28)
|
|
256
|
+
num = f" {i}" if i < 10 else f"{i}"
|
|
257
|
+
cntnt = f"{num}. {lbl}"
|
|
258
|
+
if i < step:
|
|
259
|
+
tracker.append(f"{DIM} \u2502{RESET}{GREEN} \u2713 {cntnt}{RESET}{DIM}\u2502{RESET}")
|
|
260
|
+
elif i == step:
|
|
261
|
+
tracker.append(f"{DIM} \u2502{RESET}{BOLD_CYAN} \u2192 {cntnt}{RESET}{DIM}\u2502{RESET}")
|
|
262
|
+
else:
|
|
263
|
+
tracker.append(f"{DIM} \u2502 \u25cb {cntnt}\u2502{RESET}")
|
|
264
|
+
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}")
|
|
265
|
+
else:
|
|
266
|
+
# Standard progress tracker (16 steps)
|
|
267
|
+
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}"]
|
|
268
|
+
for i in range(1, 17):
|
|
269
|
+
lbl = STEP_LABELS[i].ljust(28)
|
|
270
|
+
num = f" {i}" if i < 10 else f"{i}"
|
|
271
|
+
content = f"{num}. {lbl}"
|
|
272
|
+
if i < step:
|
|
273
|
+
tracker.append(f"{DIM} \u2502{RESET}{GREEN} \u2713 {content}{RESET}{DIM}\u2502{RESET}")
|
|
274
|
+
elif i == step:
|
|
275
|
+
tracker.append(f"{DIM} \u2502{RESET}{BOLD_CYAN} \u2192 {content}{RESET}{DIM}\u2502{RESET}")
|
|
276
|
+
else:
|
|
277
|
+
tracker.append(f"{DIM} \u2502 \u25cb {content}\u2502{RESET}")
|
|
278
|
+
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}")
|
|
279
|
+
|
|
134
280
|
lines.append("Present this progress tracker to the user (copy verbatim):")
|
|
135
281
|
lines.extend(tracker)
|
|
136
282
|
lines.append(
|
|
@@ -138,6 +284,27 @@ def main():
|
|
|
138
284
|
"\u2713 (done) or \u2717 (skipped + reason)."
|
|
139
285
|
)
|
|
140
286
|
|
|
287
|
+
if event_type == "stop" and ((step in (13, 14) and not migration) or (step == 8 and migration)):
|
|
288
|
+
import subprocess as _sp
|
|
289
|
+
try:
|
|
290
|
+
_result = _sp.run(
|
|
291
|
+
["git", "status", "--porcelain"],
|
|
292
|
+
cwd=project_dir,
|
|
293
|
+
capture_output=True, text=True, timeout=5
|
|
294
|
+
)
|
|
295
|
+
has_uncommitted = bool(_result.stdout.strip())
|
|
296
|
+
except Exception:
|
|
297
|
+
has_uncommitted = False
|
|
298
|
+
|
|
299
|
+
if has_uncommitted:
|
|
300
|
+
lines.append(
|
|
301
|
+
"\n\033[1;31m⚠️ You have uncommitted changes but haven't shown Working Session Results.\033[0m"
|
|
302
|
+
)
|
|
303
|
+
lines.append(
|
|
304
|
+
f"\033[31mRun `codeyam editor change` if you haven't already, then complete the "
|
|
305
|
+
f"checklist and run `{'codeyam editor migrate 8' if migration else 'codeyam editor 13'}` to show results to the user.\033[0m"
|
|
306
|
+
)
|
|
307
|
+
|
|
141
308
|
lines.append(f"When this step is complete, run: {next_cmd}")
|
|
142
309
|
|
|
143
310
|
print("\n".join(lines))
|
|
@@ -0,0 +1,89 @@
|
|
|
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 (status bar, navigation)
|
|
33
|
+
(tabs)/ # Tab-based navigation group
|
|
34
|
+
_layout.tsx # Tab bar configuration
|
|
35
|
+
index.tsx # Home tab
|
|
36
|
+
settings.tsx # Settings tab
|
|
37
|
+
components/ # Reusable components
|
|
38
|
+
lib/
|
|
39
|
+
storage.ts # AsyncStorage wrapper for persistent data
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Key Patterns
|
|
43
|
+
|
|
44
|
+
### Navigation (Expo Router)
|
|
45
|
+
|
|
46
|
+
Add new screens by creating files in `app/`:
|
|
47
|
+
|
|
48
|
+
- `app/profile.tsx` — accessible at `/profile`
|
|
49
|
+
- `app/items/[id].tsx` — dynamic route at `/items/123`
|
|
50
|
+
|
|
51
|
+
### Data Fetching
|
|
52
|
+
|
|
53
|
+
Use standard `fetch()` for API calls. CodeYam intercepts these to provide mock data during simulations:
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
const response = await fetch('/api/items');
|
|
57
|
+
const data = await response.json();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Storage
|
|
61
|
+
|
|
62
|
+
Use the typed storage helper for persistent data:
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { storage } from '@/lib/storage';
|
|
66
|
+
|
|
67
|
+
const items = await storage.get('items', []);
|
|
68
|
+
await storage.set('items', [...items, newItem]);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Styling (NativeWind)
|
|
72
|
+
|
|
73
|
+
Use Tailwind classes on React Native components:
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
<View className="flex-1 items-center justify-center bg-white p-4">
|
|
77
|
+
<Text className="text-lg font-bold text-gray-900">Hello</Text>
|
|
78
|
+
</View>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Building for Production
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Web
|
|
85
|
+
npm run build:web
|
|
86
|
+
|
|
87
|
+
# iOS/Android (requires EAS CLI)
|
|
88
|
+
npx eas build
|
|
89
|
+
```
|