@codeyam/codeyam-cli 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analyzer-template/.build-info.json +8 -8
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +4 -4
- 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/src/lib/kysely/tables/editorScenariosTable.ts +76 -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 +7 -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 +76 -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 +1793 -257
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +67 -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__/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 +121 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.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 +520 -0
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.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 +985 -2
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +213 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +1742 -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__/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 +25 -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/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/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/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 +113 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.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 +331 -0
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/editorSeedAdapter.js +173 -0
- package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js +349 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js +158 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +1 -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/scenarioCoverage.js +75 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
- package/codeyam-cli/src/utils/scenariosManifest.js +241 -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 +46 -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/build/client/assets/{CopyButton-DmJveP3T.js → CopyButton-BPXZwM4t.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BcgbViKV.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-CQIG2qda.js} +9 -9
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-BzHcG7SE.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-B76aig_2.js → ScenarioViewer-TSD3C211.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-oAf2Kqsf.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-DLxKhri3.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-BcY3q6nt.js} +6 -6
- 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-webgl-DI8QOUvO.js +58 -0
- package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-Bni3iiUj.js} +5 -5
- 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-scenario-coverage-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-BYOypzCa.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-C_Pmso5S.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-BVMi9VA5.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-n2FB0_Sw.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CC6AbExI.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Ii3inc0_.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor-COWCNVyV.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-CNB06EIa.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-DwCV5__E.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-CXSi2aeZ.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CHMiAog3.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{files-DO4CZ16O.js → files-BZrlFE1F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-DdZcvjGh.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-phvmGvat.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-yHOVb4rc.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-DaAZ_H2w.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/manifest-6134dc40.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-9gnxSZlb.js +101 -0
- package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-f5-1lKBt.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/root-BWAyuj0r.js +67 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-Di64LWVb.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{settings-DfuTtcJP.js → settings-0OrEMU6J.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-B3aOzpCZ.js → simulations-DWT-CvLy.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-Br7MOqts.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-BLdiCuG-.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-C-_hOl_g.js +1 -0
- package/codeyam-cli/src/webserver/build/client/sound-test.html +98 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-ChX0hPcu.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/init-kSNsMjj8.js +10 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-Bm2xIhmh.js +439 -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 +487 -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/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 +90 -16
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +71 -34
- 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 +98 -8
- 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 +92 -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/skills/codeyam-dev-mode/SKILL.md +2 -2
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +97 -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 +14 -9
- 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 +76 -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/codeyam-cli/src/webserver/build/client/assets/Terminal-Dnj5CY9R.js +0 -41
- 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-D1DAKXtT.js +0 -8
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DkzqFzFj.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/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/manifest-a632de18.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-Dg0mvYrI.js +0 -96
- package/codeyam-cli/src/webserver/build/client/assets/root-DUKqhFlb.js +0 -67
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-HfLydfDq.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CUu_F-oo.js +0 -366
- 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,304 @@
|
|
|
1
|
+
# Upgrading Auth for Production
|
|
2
|
+
|
|
3
|
+
The dev auth pattern in `app/lib/auth.ts` is designed for easy replacement.
|
|
4
|
+
All consumer code imports from `@/app/lib/auth` — only the internals of that file change.
|
|
5
|
+
|
|
6
|
+
## What Stays the Same
|
|
7
|
+
|
|
8
|
+
Every file that imports from `@/app/lib/auth` continues to work unchanged:
|
|
9
|
+
|
|
10
|
+
- Server components calling `getSession()` and `requireAuth()`
|
|
11
|
+
- Client components fetching `/api/auth/session`
|
|
12
|
+
- API routes using `signIn()` and `signOut()`
|
|
13
|
+
- Login/logout forms
|
|
14
|
+
|
|
15
|
+
## What Changes
|
|
16
|
+
|
|
17
|
+
Only `app/lib/auth.ts` internals. Replace the cookie+DB implementation with your chosen provider.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## NextAuth v5
|
|
22
|
+
|
|
23
|
+
### Install
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install next-auth @auth/prisma-adapter
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Replace `app/lib/auth.ts`
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import NextAuth from 'next-auth';
|
|
33
|
+
import { PrismaAdapter } from '@auth/prisma-adapter';
|
|
34
|
+
import { prisma } from '@/app/lib/prisma';
|
|
35
|
+
import Credentials from 'next-auth/providers/credentials';
|
|
36
|
+
// Add other providers: Google, GitHub, etc.
|
|
37
|
+
|
|
38
|
+
export interface AuthUser {
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
email: string;
|
|
42
|
+
image?: string | null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface Session {
|
|
46
|
+
user: AuthUser;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const {
|
|
50
|
+
auth,
|
|
51
|
+
signIn: nextAuthSignIn,
|
|
52
|
+
signOut: nextAuthSignOut,
|
|
53
|
+
} = NextAuth({
|
|
54
|
+
adapter: PrismaAdapter(prisma),
|
|
55
|
+
providers: [
|
|
56
|
+
Credentials({
|
|
57
|
+
credentials: { email: {}, password: {} },
|
|
58
|
+
authorize: async (credentials) => {
|
|
59
|
+
const user = await prisma.user.findUnique({
|
|
60
|
+
where: { email: credentials.email as string },
|
|
61
|
+
});
|
|
62
|
+
if (!user) return null;
|
|
63
|
+
// In production, use bcrypt: await bcrypt.compare(password, user.password)
|
|
64
|
+
return user;
|
|
65
|
+
},
|
|
66
|
+
}),
|
|
67
|
+
// Add: Google({ clientId: ..., clientSecret: ... })
|
|
68
|
+
// Add: GitHub({ clientId: ..., clientSecret: ... })
|
|
69
|
+
],
|
|
70
|
+
session: { strategy: 'jwt' },
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
export async function getSession(): Promise<Session | null> {
|
|
74
|
+
const session = await auth();
|
|
75
|
+
if (!session?.user) return null;
|
|
76
|
+
return {
|
|
77
|
+
user: {
|
|
78
|
+
id: session.user.id!,
|
|
79
|
+
name: session.user.name!,
|
|
80
|
+
email: session.user.email!,
|
|
81
|
+
image: session.user.image,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export async function requireAuth(): Promise<Session> {
|
|
87
|
+
const session = await getSession();
|
|
88
|
+
if (!session) {
|
|
89
|
+
const { redirect } = await import('next/navigation');
|
|
90
|
+
redirect('/login');
|
|
91
|
+
}
|
|
92
|
+
return session;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function signIn(
|
|
96
|
+
email: string,
|
|
97
|
+
password: string,
|
|
98
|
+
): Promise<Session | null> {
|
|
99
|
+
try {
|
|
100
|
+
await nextAuthSignIn('credentials', { email, password, redirect: false });
|
|
101
|
+
return getSession();
|
|
102
|
+
} catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export async function signOut(): Promise<void> {
|
|
108
|
+
await nextAuthSignOut({ redirect: false });
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Add route handler
|
|
113
|
+
|
|
114
|
+
Create `app/api/auth/[...nextauth]/route.ts`:
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
import { handlers } from '@/app/lib/auth';
|
|
118
|
+
export const { GET, POST } = handlers;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## better-auth
|
|
124
|
+
|
|
125
|
+
### Install
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npm install better-auth
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Replace `app/lib/auth.ts`
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
import { betterAuth } from 'better-auth';
|
|
135
|
+
import { prismaAdapter } from 'better-auth/adapters/prisma';
|
|
136
|
+
import { prisma } from '@/app/lib/prisma';
|
|
137
|
+
import { cookies } from 'next/headers';
|
|
138
|
+
|
|
139
|
+
export interface AuthUser {
|
|
140
|
+
id: string;
|
|
141
|
+
name: string;
|
|
142
|
+
email: string;
|
|
143
|
+
image?: string | null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export interface Session {
|
|
147
|
+
user: AuthUser;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const auth = betterAuth({
|
|
151
|
+
database: prismaAdapter(prisma, { provider: 'sqlite' }),
|
|
152
|
+
emailAndPassword: { enabled: true },
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
export async function getSession(): Promise<Session | null> {
|
|
156
|
+
const cookieStore = await cookies();
|
|
157
|
+
const session = await auth.api.getSession({
|
|
158
|
+
headers: new Headers({ cookie: cookieStore.toString() }),
|
|
159
|
+
});
|
|
160
|
+
if (!session?.user) return null;
|
|
161
|
+
return {
|
|
162
|
+
user: {
|
|
163
|
+
id: session.user.id,
|
|
164
|
+
name: session.user.name,
|
|
165
|
+
email: session.user.email,
|
|
166
|
+
image: session.user.image ?? null,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export async function requireAuth(): Promise<Session> {
|
|
172
|
+
const session = await getSession();
|
|
173
|
+
if (!session) {
|
|
174
|
+
const { redirect } = await import('next/navigation');
|
|
175
|
+
redirect('/login');
|
|
176
|
+
}
|
|
177
|
+
return session;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export async function signIn(
|
|
181
|
+
email: string,
|
|
182
|
+
password: string,
|
|
183
|
+
): Promise<Session | null> {
|
|
184
|
+
try {
|
|
185
|
+
await auth.api.signInEmail({ body: { email, password } });
|
|
186
|
+
return getSession();
|
|
187
|
+
} catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export async function signOut(): Promise<void> {
|
|
193
|
+
const cookieStore = await cookies();
|
|
194
|
+
await auth.api.signOut({
|
|
195
|
+
headers: new Headers({ cookie: cookieStore.toString() }),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Supabase Auth
|
|
203
|
+
|
|
204
|
+
### Install
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
npm install @supabase/supabase-js @supabase/ssr
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Replace `app/lib/auth.ts`
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
import { createServerClient } from '@supabase/ssr';
|
|
214
|
+
import { cookies } from 'next/headers';
|
|
215
|
+
|
|
216
|
+
export interface AuthUser {
|
|
217
|
+
id: string;
|
|
218
|
+
name: string;
|
|
219
|
+
email: string;
|
|
220
|
+
image?: string | null;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export interface Session {
|
|
224
|
+
user: AuthUser;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function createClient() {
|
|
228
|
+
const cookieStore = cookies();
|
|
229
|
+
return createServerClient(
|
|
230
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
231
|
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
|
|
232
|
+
{
|
|
233
|
+
cookies: {
|
|
234
|
+
getAll: () => cookieStore.then((c) => c.getAll()),
|
|
235
|
+
setAll: (cookies) =>
|
|
236
|
+
cookieStore.then((c) => {
|
|
237
|
+
cookies.forEach(({ name, value, options }) =>
|
|
238
|
+
c.set(name, value, options),
|
|
239
|
+
);
|
|
240
|
+
}),
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export async function getSession(): Promise<Session | null> {
|
|
247
|
+
const supabase = createClient();
|
|
248
|
+
const {
|
|
249
|
+
data: { user },
|
|
250
|
+
} = await supabase.auth.getUser();
|
|
251
|
+
if (!user) return null;
|
|
252
|
+
return {
|
|
253
|
+
user: {
|
|
254
|
+
id: user.id,
|
|
255
|
+
name: user.user_metadata.name || user.email?.split('@')[0] || '',
|
|
256
|
+
email: user.email!,
|
|
257
|
+
image: user.user_metadata.avatar_url ?? null,
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export async function requireAuth(): Promise<Session> {
|
|
263
|
+
const session = await getSession();
|
|
264
|
+
if (!session) {
|
|
265
|
+
const { redirect } = await import('next/navigation');
|
|
266
|
+
redirect('/login');
|
|
267
|
+
}
|
|
268
|
+
return session;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export async function signIn(
|
|
272
|
+
email: string,
|
|
273
|
+
password: string,
|
|
274
|
+
): Promise<Session | null> {
|
|
275
|
+
const supabase = createClient();
|
|
276
|
+
const { error } = await supabase.auth.signInWithPassword({ email, password });
|
|
277
|
+
if (error) return null;
|
|
278
|
+
return getSession();
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export async function signOut(): Promise<void> {
|
|
282
|
+
const supabase = createClient();
|
|
283
|
+
await supabase.auth.signOut();
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Environment variables
|
|
288
|
+
|
|
289
|
+
Add to `.env.local`:
|
|
290
|
+
|
|
291
|
+
```
|
|
292
|
+
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
|
|
293
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## After Upgrading
|
|
299
|
+
|
|
300
|
+
1. Remove the `Session` model from `prisma/schema.prisma` (the provider manages sessions)
|
|
301
|
+
2. Keep the `User` model if your provider uses it, or migrate to the provider's user table
|
|
302
|
+
3. Run `npm run db:push` to apply schema changes
|
|
303
|
+
4. Test sign-in and sign-out flows
|
|
304
|
+
5. Update scenario seed data if the session table structure changed
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Database
|
|
2
|
+
|
|
3
|
+
This project uses **Prisma 7 with SQLite** for local development. No external services needed.
|
|
4
|
+
|
|
5
|
+
All application code imports from `@/app/lib/prisma` — this is the only file that changes when you upgrade to a hosted database.
|
|
6
|
+
|
|
7
|
+
## Quick Reference
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Edit your schema
|
|
11
|
+
vim prisma/schema.prisma
|
|
12
|
+
|
|
13
|
+
# Push schema changes (also regenerates Prisma client)
|
|
14
|
+
npm run db:push
|
|
15
|
+
|
|
16
|
+
# Seed demo data
|
|
17
|
+
npm run db:seed
|
|
18
|
+
|
|
19
|
+
# Reset database (delete + recreate + seed)
|
|
20
|
+
npm run db:reset
|
|
21
|
+
|
|
22
|
+
# Browse data visually
|
|
23
|
+
npx prisma studio
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Adding Columns to Existing Tables
|
|
27
|
+
|
|
28
|
+
When adding a new **required** column to a table that already has data, `db push` will fail because existing rows have no value for the new column. To avoid this:
|
|
29
|
+
|
|
30
|
+
- **Add a `@default(...)` value** so Prisma can fill existing rows automatically:
|
|
31
|
+
```prisma
|
|
32
|
+
model Rating {
|
|
33
|
+
userId String @default("anonymous") // existing rows get "anonymous"
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
- Once all rows have real values, you can remove the default if desired.
|
|
37
|
+
- **Never use `--force-reset`** — it drops ALL tables and deletes all data.
|
|
38
|
+
- Optional columns (`String?`) don't need a default — existing rows get `null`.
|
|
39
|
+
|
|
40
|
+
## Using the Database
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { prisma } from '@/app/lib/prisma';
|
|
44
|
+
|
|
45
|
+
// In API routes or server components:
|
|
46
|
+
const items = await prisma.todo.findMany();
|
|
47
|
+
const item = await prisma.todo.create({ data: { title: 'New item' } });
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Important: Do NOT Change These Settings
|
|
51
|
+
|
|
52
|
+
- **Generator must be `prisma-client-js`** (not `prisma-client`). The `prisma-client` generator requires a custom output path that breaks Turbopack.
|
|
53
|
+
- **Do NOT add an `output` field** to the generator.
|
|
54
|
+
- **Do NOT add `url` to the datasource block** in `schema.prisma`. Prisma 7 moved the URL to `prisma.config.ts`.
|
|
55
|
+
- **Keep `serverExternalPackages: ["better-sqlite3"]`** in `next.config.ts`.
|
|
56
|
+
- **Keep `turbopack: { root: "." }`** in `next.config.ts`.
|
|
57
|
+
- **Always run `npx prisma generate`** after `npx prisma db push` (or use `npm run db:push` which does both).
|
|
58
|
+
- **Database file is at project root** (`./dev.db`), not in `prisma/`.
|
|
59
|
+
|
|
60
|
+
## Upgrading to a Hosted Database
|
|
61
|
+
|
|
62
|
+
When you're ready for production, you'll want a hosted database. SQLite is great for prototyping, but doesn't support concurrent connections or run in serverless environments (Vercel, etc.).
|
|
63
|
+
|
|
64
|
+
### Option 1: Supabase (PostgreSQL)
|
|
65
|
+
|
|
66
|
+
Free tier available. Gives you PostgreSQL + auth + realtime + storage.
|
|
67
|
+
|
|
68
|
+
1. Create a project at https://supabase.com/dashboard
|
|
69
|
+
2. Get your credentials from Project Settings > Database > Connection string (URI)
|
|
70
|
+
3. Replace packages:
|
|
71
|
+
```bash
|
|
72
|
+
npm uninstall better-sqlite3 @prisma/adapter-better-sqlite3 @types/better-sqlite3
|
|
73
|
+
npm install @prisma/adapter-pg pg @supabase/supabase-js
|
|
74
|
+
npm install -D @types/pg
|
|
75
|
+
```
|
|
76
|
+
4. Update `prisma/schema.prisma`:
|
|
77
|
+
```prisma
|
|
78
|
+
datasource db {
|
|
79
|
+
provider = "postgresql"
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
5. Update `app/lib/prisma.ts`:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { PrismaClient } from '@prisma/client';
|
|
86
|
+
import { PrismaPg } from '@prisma/adapter-pg';
|
|
87
|
+
|
|
88
|
+
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
|
|
89
|
+
const connectionString = process.env.DATABASE_URL!;
|
|
90
|
+
const adapter = new PrismaPg({ connectionString });
|
|
91
|
+
export const prisma =
|
|
92
|
+
globalForPrisma.prisma ?? new PrismaClient({ adapter });
|
|
93
|
+
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
|
|
94
|
+
export default prisma;
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
6. Create `.env`:
|
|
98
|
+
```
|
|
99
|
+
DATABASE_URL=postgresql://postgres.YOUR_PROJECT_ID:YOUR_PASSWORD@aws-0-us-east-1.pooler.supabase.com:6543/postgres
|
|
100
|
+
```
|
|
101
|
+
7. Remove `serverExternalPackages` from `next.config.ts`
|
|
102
|
+
8. Run `npm run db:push` to create tables in Supabase
|
|
103
|
+
9. Update `prisma/seed.ts` to use the new adapter (same pattern as `prisma.ts`)
|
|
104
|
+
|
|
105
|
+
### Option 2: Other PostgreSQL Hosts (Neon, Railway, etc.)
|
|
106
|
+
|
|
107
|
+
Same steps as Supabase above (steps 3-9), just use your provider's connection string.
|
|
108
|
+
|
|
109
|
+
### Option 3: PlanetScale / MySQL
|
|
110
|
+
|
|
111
|
+
1. Replace packages:
|
|
112
|
+
```bash
|
|
113
|
+
npm uninstall better-sqlite3 @prisma/adapter-better-sqlite3 @types/better-sqlite3
|
|
114
|
+
npm install @prisma/adapter-planetscale @planetscale/database
|
|
115
|
+
```
|
|
116
|
+
2. Update `schema.prisma` datasource to `provider = "mysql"`
|
|
117
|
+
3. Update `app/lib/prisma.ts` to use `PrismaPlanetScale` adapter
|
|
118
|
+
4. Follow PlanetScale setup docs for connection string
|
|
119
|
+
|
|
120
|
+
### What Stays the Same
|
|
121
|
+
|
|
122
|
+
Your application code doesn't change at all. Every file that uses the database already imports from `@/app/lib/prisma`, which is the only file that gets updated. Your Prisma schema models, API routes, and server components all work identically regardless of which database backs them.
|
|
123
|
+
|
|
124
|
+
## Writing Seed Scripts
|
|
125
|
+
|
|
126
|
+
Seed scripts run outside of Next.js, so they must create their own PrismaClient with the adapter (they cannot import from `@/app/lib/prisma`). See `prisma/seed.ts` for the correct pattern.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Feature Patterns
|
|
2
|
+
|
|
3
|
+
When the feature you're building involves any of the patterns below, **read the linked doc before writing code**. These patterns are designed for the local SQLite dev environment and upgrade cleanly to production services later.
|
|
4
|
+
|
|
5
|
+
## Authentication (login, sign-up, user sessions)
|
|
6
|
+
|
|
7
|
+
**Read:** `AUTH_PATTERNS.md`
|
|
8
|
+
|
|
9
|
+
Use the cookie + DB auth abstraction in `app/lib/auth.ts`. All consumer code imports from this single file. DO NOT use NextAuth, Clerk, better-auth, Supabase Auth, or any external auth provider during prototyping — they require infrastructure unavailable locally.
|
|
10
|
+
|
|
11
|
+
**For scenarios:** Include User and Session seed rows. Add `"session": {"cookieValue": "<token>"}` at the scenario top level to auto-log the user in. Omit `session` for a logged-out scenario.
|
|
12
|
+
|
|
13
|
+
**Upgrade path:** See `AUTH_UPGRADE.md` — only `app/lib/auth.ts` internals change; consumer code stays the same.
|
|
14
|
+
|
|
15
|
+
## External Services (payments, email, maps, weather APIs, etc.)
|
|
16
|
+
|
|
17
|
+
If the user has dev/test credentials (e.g., Stripe test keys):
|
|
18
|
+
|
|
19
|
+
- Store them in `.codeyam/config.json` under `environmentVariables`
|
|
20
|
+
- Restart the dev server — credentials are injected into `process.env`
|
|
21
|
+
|
|
22
|
+
If no credentials are available:
|
|
23
|
+
|
|
24
|
+
- Build with real API calls in the code
|
|
25
|
+
- Mock responses per scenario using `externalApis` in scenario registration (Step 8)
|
|
26
|
+
|
|
27
|
+
## File Storage / Uploads
|
|
28
|
+
|
|
29
|
+
For local prototyping, store files in the `public/uploads/` directory and serve them as static assets. Use `fs.writeFile` in API routes. For production, swap to S3/Cloudflare R2/Supabase Storage.
|
|
30
|
+
|
|
31
|
+
## Email / Notifications
|
|
32
|
+
|
|
33
|
+
For prototyping, log emails to the console or write them to a `/api/dev/sent-emails` endpoint that stores in the database. For production, swap to Resend/SendGrid/Postmark.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
_This list will grow as new patterns are added. Each pattern follows the same principle: build with a simple local implementation, upgrade to a production service later by swapping one file._
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Project Name
|
|
2
|
+
|
|
3
|
+
Brief description of what this app does.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
Run the setup script to install dependencies, initialize the database, and seed it with demo data:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run setup
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Development
|
|
14
|
+
|
|
15
|
+
Start the dev server:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm run dev
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Open [http://localhost:3000](http://localhost:3000) in your browser.
|
|
22
|
+
|
|
23
|
+
## Using CodeYam Editor
|
|
24
|
+
|
|
25
|
+
This project was built with [CodeYam](https://codeyam.com). To launch the editor:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
codeyam editor
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The editor provides a live preview alongside a Claude Code terminal for iterating on the app.
|
|
32
|
+
|
|
33
|
+
## Database
|
|
34
|
+
|
|
35
|
+
This project uses SQLite via Prisma. Common commands:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm run db:push # Apply schema changes and generate Prisma client
|
|
39
|
+
npm run db:seed # Seed the database with demo data
|
|
40
|
+
npm run db:reset # Reset database: drop, recreate, and re-seed
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Scripts
|
|
44
|
+
|
|
45
|
+
| Script | Description |
|
|
46
|
+
| ------------------ | -------------------------------------------- |
|
|
47
|
+
| `npm run setup` | One-line project setup (install + db + seed) |
|
|
48
|
+
| `npm run dev` | Start the development server |
|
|
49
|
+
| `npm run build` | Build for production |
|
|
50
|
+
| `npm run test` | Run tests |
|
|
51
|
+
| `npm run db:push` | Apply Prisma schema changes |
|
|
52
|
+
| `npm run db:seed` | Seed the database |
|
|
53
|
+
| `npm run db:reset` | Reset and re-seed the database |
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
//
|
|
2
|
-
// This file
|
|
1
|
+
// Database connection singleton.
|
|
2
|
+
// This is the ONLY file that changes when upgrading to a hosted database.
|
|
3
|
+
// All application code imports from here — API routes, server components, etc.
|
|
3
4
|
//
|
|
4
|
-
// Usage
|
|
5
|
+
// Usage:
|
|
5
6
|
// import { prisma } from "@/app/lib/prisma";
|
|
6
7
|
// const items = await prisma.todo.findMany();
|
|
8
|
+
//
|
|
9
|
+
// To upgrade to a hosted database (e.g., Supabase PostgreSQL), see DATABASE.md.
|
|
7
10
|
|
|
8
11
|
import { PrismaClient } from '@prisma/client';
|
|
9
12
|
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
|
|
10
13
|
|
|
11
14
|
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
|
|
12
15
|
|
|
13
|
-
const adapter = new PrismaBetterSqlite3({
|
|
16
|
+
const adapter = new PrismaBetterSqlite3({
|
|
17
|
+
url: process.env.DATABASE_URL || 'file:./dev.db',
|
|
18
|
+
});
|
|
14
19
|
|
|
15
20
|
export const prisma = globalForPrisma.prisma ?? new PrismaClient({ adapter });
|
|
16
21
|
|
|
@@ -41,3 +41,24 @@ next-env.d.ts
|
|
|
41
41
|
# database
|
|
42
42
|
dev.db
|
|
43
43
|
dev.db-journal
|
|
44
|
+
|
|
45
|
+
# CodeYam - local only (not shared)
|
|
46
|
+
.codeyam/db.sqlite3
|
|
47
|
+
.codeyam/db.sqlite3-wal
|
|
48
|
+
.codeyam/db.sqlite3-shm
|
|
49
|
+
.codeyam/secrets.json
|
|
50
|
+
.codeyam/server.json
|
|
51
|
+
.codeyam/server-state.json
|
|
52
|
+
.codeyam/queue.json
|
|
53
|
+
.codeyam/active-scenario.json
|
|
54
|
+
.codeyam/editor-step.json
|
|
55
|
+
.codeyam/editor-user-prompt.txt
|
|
56
|
+
.codeyam/editor-mode-context.md
|
|
57
|
+
.codeyam/dev-mode-context.md
|
|
58
|
+
.codeyam/logs/
|
|
59
|
+
.codeyam/llm-calls/
|
|
60
|
+
.codeyam/captures/
|
|
61
|
+
.codeyam/results/
|
|
62
|
+
.codeyam/tmp/
|
|
63
|
+
.codeyam/rules/
|
|
64
|
+
.codeyam/bin/
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"scripts": {
|
|
6
|
+
"setup": "npm install && npm run db:push && npm run db:seed",
|
|
6
7
|
"dev": "next dev --turbopack",
|
|
7
8
|
"build": "next build",
|
|
8
9
|
"start": "next start",
|
|
9
10
|
"lint": "eslint",
|
|
11
|
+
"test": "vitest run",
|
|
12
|
+
"test:watch": "vitest",
|
|
10
13
|
"db:push": "npx prisma db push && npx prisma generate",
|
|
11
14
|
"db:seed": "npx tsx prisma/seed.ts",
|
|
12
15
|
"db:reset": "rm -f dev.db && npm run db:push && npx tsx prisma/seed.ts"
|
|
@@ -30,6 +33,7 @@
|
|
|
30
33
|
"eslint-config-next": "^15.3.3",
|
|
31
34
|
"tailwindcss": "^4",
|
|
32
35
|
"tsx": "^4.19.4",
|
|
33
|
-
"typescript": "^5"
|
|
36
|
+
"typescript": "^5",
|
|
37
|
+
"vitest": "^3"
|
|
34
38
|
}
|
|
35
39
|
}
|
|
@@ -6,10 +6,13 @@
|
|
|
6
6
|
// IMPORTANT: This file must use the same adapter pattern as app/lib/prisma.ts.
|
|
7
7
|
// Do NOT use `new PrismaClient()` without the adapter — Prisma 7 requires it.
|
|
8
8
|
|
|
9
|
+
import 'dotenv/config';
|
|
9
10
|
import { PrismaClient } from '@prisma/client';
|
|
10
11
|
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
|
|
11
12
|
|
|
12
|
-
const adapter = new PrismaBetterSqlite3({
|
|
13
|
+
const adapter = new PrismaBetterSqlite3({
|
|
14
|
+
url: process.env.DATABASE_URL || 'file:./dev.db',
|
|
15
|
+
});
|
|
13
16
|
const prisma = new PrismaClient({ adapter });
|
|
14
17
|
|
|
15
18
|
async function main() {
|