@codeyam/codeyam-cli 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +31 -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 +5 -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 +31 -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 +1619 -243
- 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 +144 -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 +127 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +610 -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 +195 -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 +781 -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 +101 -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 +300 -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 +96 -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 +73 -0
- package/codeyam-cli/src/utils/editorApi.js.map +1 -0
- package/codeyam-cli/src/utils/editorAudit.js +101 -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 +67 -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 +276 -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/scenarioCoverage.js +75 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
- package/codeyam-cli/src/utils/scenariosManifest.js +159 -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/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-Bd-hxofb.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-BsDh6TSF.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor-PBc_6L9R.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-4FzHlcNn.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-BsDXNp45.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-BgAqUtTZ.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-Bmshgrij.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-B8vTTNy2.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-65850841.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-BwX8YgFb.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-BE43Hjti.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-DEEQf4pi.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/init-CkWmyFY2.js +10 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BHi-9O8W.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/scripts/codeyam-preload.mjs +242 -3
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +94 -4
- package/codeyam-cli/src/webserver/server.js +46 -14
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +39 -11
- 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 +97 -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 +96 -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 +31 -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,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() {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodeYam Seed Adapter for Prisma + SQLite.
|
|
3
|
+
*
|
|
4
|
+
* Reads a JSON seed data file (path passed as CLI arg), wipes all tables,
|
|
5
|
+
* then inserts the seed data using Prisma.
|
|
6
|
+
*
|
|
7
|
+
* Usage: npx tsx .codeyam/seed-adapter.ts <path-to-seed-data.json>
|
|
8
|
+
*
|
|
9
|
+
* The JSON file has the format:
|
|
10
|
+
* {
|
|
11
|
+
* "type": "application",
|
|
12
|
+
* "seed": {
|
|
13
|
+
* "tableName": [{ "column": "value", ... }, ...]
|
|
14
|
+
* },
|
|
15
|
+
* "externalApis": { ... } // optional, not used by this adapter
|
|
16
|
+
* }
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import 'dotenv/config';
|
|
20
|
+
import { PrismaClient } from '@prisma/client';
|
|
21
|
+
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
|
|
22
|
+
import * as fs from 'fs';
|
|
23
|
+
|
|
24
|
+
const adapter = new PrismaBetterSqlite3({
|
|
25
|
+
url: process.env.DATABASE_URL || 'file:./dev.db',
|
|
26
|
+
});
|
|
27
|
+
const prisma = new PrismaClient({ adapter });
|
|
28
|
+
|
|
29
|
+
async function main() {
|
|
30
|
+
const seedDataPath = process.argv[2];
|
|
31
|
+
if (!seedDataPath) {
|
|
32
|
+
console.error('Usage: npx tsx .codeyam/seed-adapter.ts <seed-data.json>');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const raw = fs.readFileSync(seedDataPath, 'utf-8');
|
|
37
|
+
const data = JSON.parse(raw);
|
|
38
|
+
const seed = data.seed || data;
|
|
39
|
+
|
|
40
|
+
console.log(`Seeding tables: ${Object.keys(seed).join(', ')}`);
|
|
41
|
+
|
|
42
|
+
// Wipe all tables in reverse order (to respect foreign keys)
|
|
43
|
+
const tableNames = Object.keys(seed);
|
|
44
|
+
for (const table of [...tableNames].reverse()) {
|
|
45
|
+
try {
|
|
46
|
+
await (prisma as any)[table].deleteMany();
|
|
47
|
+
console.log(` Cleared ${table}`);
|
|
48
|
+
} catch (err) {
|
|
49
|
+
console.warn(
|
|
50
|
+
` Could not clear ${table}: ${err instanceof Error ? err.message : err}`,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Reset auto-increment counters so IDs start from 1 after each re-seed.
|
|
56
|
+
// Without this, SQLite IDs keep climbing (1, 2, ... then 9, 10, ...)
|
|
57
|
+
// across scenario switches, causing hardcoded URLs like /drinks/1 to 404.
|
|
58
|
+
for (const table of tableNames) {
|
|
59
|
+
try {
|
|
60
|
+
// Prisma uses PascalCase model names; sqlite_sequence stores the actual table name.
|
|
61
|
+
// Try both the seed key (which matches the Prisma model) and common casings.
|
|
62
|
+
await prisma.$executeRawUnsafe(
|
|
63
|
+
`DELETE FROM sqlite_sequence WHERE name = '${table}' OR name = '${table.charAt(0).toUpperCase() + table.slice(1)}'`,
|
|
64
|
+
);
|
|
65
|
+
} catch {
|
|
66
|
+
// sqlite_sequence may not exist if no autoincrement columns — safe to ignore
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Insert seed data
|
|
71
|
+
for (const [table, rows] of Object.entries(seed)) {
|
|
72
|
+
if (!Array.isArray(rows) || rows.length === 0) continue;
|
|
73
|
+
try {
|
|
74
|
+
await (prisma as any)[table].createMany({ data: rows });
|
|
75
|
+
console.log(` Seeded ${rows.length} rows into ${table}`);
|
|
76
|
+
} catch (err) {
|
|
77
|
+
console.error(
|
|
78
|
+
` Failed to seed ${table}: ${err instanceof Error ? err.message : err}`,
|
|
79
|
+
);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
console.log('Seed complete');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
main()
|
|
88
|
+
.then(() => prisma.$disconnect())
|
|
89
|
+
.catch((e) => {
|
|
90
|
+
console.error('Seed adapter error:', e);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
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 Supabase (PostgreSQL) 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 (runs prisma migrate reset)
|
|
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 db:push` | Apply Prisma schema changes |
|
|
51
|
+
| `npm run db:seed` | Seed the database |
|
|
52
|
+
| `npm run db:reset` | Reset the database |
|
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
# Prisma 7
|
|
1
|
+
# Supabase + Prisma 7 Setup
|
|
2
2
|
|
|
3
|
-
This project uses Prisma 7 with
|
|
3
|
+
This project uses Prisma 7 with PostgreSQL via Supabase.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Quick start
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
1. Create a Supabase project at https://supabase.com/dashboard
|
|
8
|
+
2. Copy `.env` and fill in your credentials (see comments in the file)
|
|
9
|
+
3. Run `npm run db:push` to create tables
|
|
10
|
+
4. Run `npm run db:seed` to populate demo data
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
import { PrismaClient } from '@prisma/client';
|
|
12
|
-
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
|
|
12
|
+
## How it works
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
const prisma = new PrismaClient({ adapter });
|
|
16
|
-
```
|
|
14
|
+
Prisma 7 requires a **driver adapter**. This project uses `@prisma/adapter-pg` with the `pg` package to connect to Supabase's PostgreSQL.
|
|
17
15
|
|
|
18
16
|
The singleton in `app/lib/prisma.ts` is already configured. Import it in your code:
|
|
19
17
|
|
|
@@ -21,6 +19,12 @@ The singleton in `app/lib/prisma.ts` is already configured. Import it in your co
|
|
|
21
19
|
import { prisma } from '@/app/lib/prisma';
|
|
22
20
|
```
|
|
23
21
|
|
|
22
|
+
For Supabase-specific features (auth, realtime, storage), use the Supabase client:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { supabase } from '@/app/lib/supabase';
|
|
26
|
+
```
|
|
27
|
+
|
|
24
28
|
## Important: do NOT change these settings
|
|
25
29
|
|
|
26
30
|
- **Generator must be `prisma-client-js`** (not `prisma-client`). The `prisma-client`
|
|
@@ -29,14 +33,19 @@ import { prisma } from '@/app/lib/prisma';
|
|
|
29
33
|
`node_modules/@prisma/client` works with standard imports everywhere.
|
|
30
34
|
- **Do NOT add `url` to the datasource block** in `schema.prisma`. Prisma 7
|
|
31
35
|
moved the URL to `prisma.config.ts`. Adding it to the schema causes a validation error.
|
|
32
|
-
- **Keep `serverExternalPackages: ["better-sqlite3"]`** in `next.config.ts`.
|
|
33
|
-
Without it, Next.js tries to bundle the native module and fails.
|
|
34
36
|
- **Keep `turbopack: { root: "." }`** in `next.config.ts`. Without it,
|
|
35
37
|
Turbopack may infer a parent directory as root and break imports.
|
|
36
|
-
- **Database file is at project root** (`./dev.db`), not in `prisma/`.
|
|
37
38
|
- **Always run `npx prisma generate`** after `npx prisma db push` (or use
|
|
38
39
|
`npm run db:push` which does both). Without this, the client module is missing.
|
|
39
40
|
|
|
41
|
+
## Getting your Supabase credentials
|
|
42
|
+
|
|
43
|
+
1. Go to https://supabase.com/dashboard and select your project
|
|
44
|
+
2. **SUPABASE_URL** and **SUPABASE_ANON_KEY**: Project Settings → API
|
|
45
|
+
3. **DATABASE_URL**: Project Settings → Database → Connection string (URI)
|
|
46
|
+
- For serverless (Vercel, etc.): use the "Transaction" pooler connection string (port 6543)
|
|
47
|
+
- For long-running servers: use the "Session" pooler connection string (port 5432)
|
|
48
|
+
|
|
40
49
|
## Common tasks
|
|
41
50
|
|
|
42
51
|
```bash
|
|
@@ -47,10 +56,9 @@ vim prisma/schema.prisma
|
|
|
47
56
|
npm run db:push
|
|
48
57
|
|
|
49
58
|
# Seed the database
|
|
50
|
-
|
|
51
|
-
# or: npm run db:seed
|
|
59
|
+
npm run db:seed
|
|
52
60
|
|
|
53
|
-
# Reset the database (
|
|
61
|
+
# Reset the database (drops all tables, re-creates, re-seeds)
|
|
54
62
|
npm run db:reset
|
|
55
63
|
|
|
56
64
|
# Open Prisma Studio (database browser)
|
|
@@ -82,3 +90,15 @@ export async function POST(request: Request) {
|
|
|
82
90
|
return Response.json(todo);
|
|
83
91
|
}
|
|
84
92
|
```
|
|
93
|
+
|
|
94
|
+
## Deployment
|
|
95
|
+
|
|
96
|
+
This template is ready to deploy to Vercel:
|
|
97
|
+
|
|
98
|
+
1. Push your code to GitHub
|
|
99
|
+
2. Import the repo in Vercel
|
|
100
|
+
3. Add the same environment variables from `.env` to Vercel's project settings
|
|
101
|
+
4. Deploy
|
|
102
|
+
|
|
103
|
+
The DATABASE_URL should use Supabase's **Transaction** pooler connection string
|
|
104
|
+
(port 6543) for serverless environments like Vercel.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Example API route using Prisma.
|
|
2
|
+
// Import prisma from the singleton — do NOT create a new PrismaClient here.
|
|
3
|
+
|
|
4
|
+
import { prisma } from '@/app/lib/prisma';
|
|
5
|
+
|
|
6
|
+
export async function GET() {
|
|
7
|
+
const todos = await prisma.todo.findMany({
|
|
8
|
+
orderBy: { createdAt: 'desc' },
|
|
9
|
+
});
|
|
10
|
+
return Response.json(todos);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function POST(request: Request) {
|
|
14
|
+
const { title } = await request.json();
|
|
15
|
+
const todo = await prisma.todo.create({ data: { title } });
|
|
16
|
+
return Response.json(todo);
|
|
17
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--background: #ffffff;
|
|
5
|
+
--foreground: #171717;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@theme inline {
|
|
9
|
+
--color-background: var(--background);
|
|
10
|
+
--color-foreground: var(--foreground);
|
|
11
|
+
--font-sans: var(--font-geist-sans);
|
|
12
|
+
--font-mono: var(--font-geist-mono);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@media (prefers-color-scheme: dark) {
|
|
16
|
+
:root {
|
|
17
|
+
--background: #0a0a0a;
|
|
18
|
+
--foreground: #ededed;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
body {
|
|
23
|
+
background: var(--background);
|
|
24
|
+
color: var(--foreground);
|
|
25
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
26
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Metadata } from 'next';
|
|
2
|
+
import { Geist, Geist_Mono } from 'next/font/google';
|
|
3
|
+
import './globals.css';
|
|
4
|
+
|
|
5
|
+
const geistSans = Geist({
|
|
6
|
+
variable: '--font-geist-sans',
|
|
7
|
+
subsets: ['latin'],
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
const geistMono = Geist_Mono({
|
|
11
|
+
variable: '--font-geist-mono',
|
|
12
|
+
subsets: ['latin'],
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export const metadata: Metadata = {
|
|
16
|
+
title: 'CodeYam App',
|
|
17
|
+
description: 'Built with CodeYam Editor',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default function RootLayout({
|
|
21
|
+
children,
|
|
22
|
+
}: Readonly<{
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
}>) {
|
|
25
|
+
return (
|
|
26
|
+
<html lang="en">
|
|
27
|
+
<body
|
|
28
|
+
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
|
29
|
+
>
|
|
30
|
+
{children}
|
|
31
|
+
</body>
|
|
32
|
+
</html>
|
|
33
|
+
);
|
|
34
|
+
}
|