@codeyam/codeyam-cli 0.1.0-staging.8df382d → 0.1.0-staging.a890816
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +34 -3
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +14 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +27 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +78 -2
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +6 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +9 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +12 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +65 -28
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +83 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +23 -4
- package/analyzer-template/packages/database/index.ts +1 -0
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +62 -0
- package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
- package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +151 -135
- package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
- package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
- package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/index.js +1 -0
- package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +5 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +20 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.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 +100 -89
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +1 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
- package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +1 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/playwright/captureFromUrl.ts +89 -82
- package/analyzer-template/project/constructMockCode.ts +136 -43
- package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
- package/analyzer-template/project/start.ts +3 -0
- package/analyzer-template/project/startScenarioCapture.ts +9 -0
- package/analyzer-template/project/writeClientLogRoute.ts +125 -0
- package/analyzer-template/project/writeMockDataTsx.ts +17 -0
- package/analyzer-template/project/writeScenarioComponents.ts +36 -7
- package/analyzer-template/tsconfig.json +13 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +115 -34
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +2 -0
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
- package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
- package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +12 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +29 -7
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +208 -11
- package/codeyam-cli/scripts/apply-setup.js.map +1 -1
- package/codeyam-cli/src/cli.js +2 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/analyze.js +17 -7
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +58 -3
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +1037 -0
- package/codeyam-cli/src/commands/editor.js.map +1 -0
- package/codeyam-cli/src/commands/init.js +34 -10
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +26 -2
- package/codeyam-cli/src/commands/memory.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js +9 -0
- package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +26 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +19 -3
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/devModeEvents.js +40 -0
- package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
- package/codeyam-cli/src/utils/fileMetadata.js +5 -0
- package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
- package/codeyam-cli/src/utils/fileWatcher.js +25 -9
- package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
- package/codeyam-cli/src/utils/git.js +52 -0
- package/codeyam-cli/src/utils/git.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +31 -0
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
- package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
- package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
- package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
- package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
- package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +70 -1
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +7 -6
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/serverState.js +27 -2
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +45 -4
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/testRunner.js +158 -0
- package/codeyam-cli/src/utils/testRunner.js.map +1 -0
- package/codeyam-cli/src/utils/transcriptPruning.js +67 -0
- package/codeyam-cli/src/utils/transcriptPruning.js.map +1 -0
- package/codeyam-cli/src/utils/webappDetection.js +14 -2
- package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +41 -27
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
- package/codeyam-cli/src/webserver/backgroundServer.js +109 -19
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CtmbP4Gl.js → CopyButton-DmJveP3T.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DlMph_Hm.js → EntityItem-C76mRRiF.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-B-0PjGOU.js → EntityTypeBadge-g3saevPb.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-DN9eiJAO.js → EntityTypeIcon-CobE682z.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-rE_fI2h2.js → InteractivePreview-DYFW3lDD.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CnatsCw2.js → LibraryFunctionPreview-DLeucoVX.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-CSP6DZrh.js → LoadingDots-BU_OAEMP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CMK8Q7yk.js → LogViewer-ceAyBX-H.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-TCV_HBjy.js → ReportIssueModal-djPLI-WV.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CG2uh31y.js → SafeScreenshot-BED4B6sP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CU_TDYd8.js → ScenarioViewer-B76aig_2.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/Terminal-CcG8YTLx.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D7IoaWUW.js → TruncatedFilePath-C8OKAR5x.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-B8z7mjR-.js → _index-C96V0n15.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DZu78RI1.js → activity.(_tab)-BpKzcsJz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-web-links-Duc5hnl7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-D9hemwl6.js +22 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-entry-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-refresh-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-Bp5FLkd4.js → book-open-D_nMCFmP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DQJA9f4o.js → chevron-down-BH2h1Ea2.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-7VptmeIr.js → chunk-JZWAC4HX-C4pqxYJB.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-B6C4LY9o.js → circle-check-DyIKORY6.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{copy-6nzYCu0G.js → copy-NDbZjXao.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-D-QUFOwe.js → createLucideIcon-CMT1jU2q.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor-W_IGJ2Kd.js +7 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._--zvFJ4OH.js → entity._sha._-CrjR3zZW.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D6SEzMCu.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-p9hhkjJM.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-C7ysA4Jq.js → entity._sha_.edit._scenarioId-BMvVHNXU.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CU6EUArK.js → entry.client-DTvKq3TY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-EWpfFU4X.js → fileTableUtils-cPo8LiG3.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-CrxAoWIL.js → files-DO4CZ16O.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{git-BldHtKeW.js → git-CFCTYk9I.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-BZB_H1w2.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-7-1FmlHo.js → index-10oVnAAH.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-DuYcwYp_.js → index-BcvgDzbZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{labs-CPPVOSWB.js → labs-Zk7ryIM1.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BnDcD54R.js → loader-circle-BAXYRVEO.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-8daa4147.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{memory-CfpYxpNu.js → memory-FweZHj5U.js} +28 -28
- package/codeyam-cli/src/webserver/build/client/assets/{pause-DhQX2g22.js → pause-DTAcYxBt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-DiRdBreB.js +67 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-DborVoKD.js → search-fKo7v0Zo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-DfuTtcJP.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-BtrtCYJg.js → simulations-B3aOzpCZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-Bs4NC-VZ.js → terminal-BG4heKCG.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DTf3Jojp.js → triangle-alert-DtSmdtM4.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-D_bDZyDU.js → useCustomSizes-ByhSyh0W.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-C14nCb1q.js +2 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-BsQb6rFd.js → useReportContext-O-jkvSPx.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-BOur3mUv.js → useToast-9FIWuYfK.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +9 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-BzAbACSx.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-OdUocH6P.js +362 -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/devServer.js +39 -5
- package/codeyam-cli/src/webserver/devServer.js.map +1 -1
- package/codeyam-cli/src/webserver/editorProxy.js +272 -0
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +140 -0
- package/codeyam-cli/src/webserver/server.js +177 -1
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +753 -0
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
- package/codeyam-cli/templates/codeyam-dev-mode.md +237 -0
- package/codeyam-cli/templates/codeyam-editor-claude.md +68 -0
- package/codeyam-cli/templates/codeyam-editor.md +68 -0
- package/codeyam-cli/templates/editor-step-hook.py +145 -0
- package/codeyam-cli/templates/isolation-route/next-app.tsx.template +80 -0
- package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
- package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
- package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
- package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
- package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/PRISMA_SETUP.md +84 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/api/todos/route.ts +17 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +19 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +43 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +35 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +37 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -0
- package/codeyam-cli/templates/prompts/conversation-guidance.txt +12 -0
- package/codeyam-cli/templates/prompts/conversation-prompt.txt +3 -3
- package/codeyam-cli/templates/prompts/interruption-prompt.txt +3 -3
- package/codeyam-cli/templates/prompts/stale-rules-prompt.txt +3 -3
- package/codeyam-cli/templates/rule-notification-hook.py +44 -17
- package/codeyam-cli/templates/rule-reflection-hook.py +24 -4
- package/codeyam-cli/templates/rules-instructions.md +4 -3
- package/package.json +4 -2
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +10 -2
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +21 -0
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
- package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
- package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
- package/packages/ai/src/lib/generateEntityScenarioData.js +57 -2
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +3 -0
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +8 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +54 -27
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +65 -0
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +18 -4
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/database/index.js +1 -0
- package/packages/database/index.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +5 -0
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +45 -0
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
- package/packages/database/src/lib/loadCommits.js +23 -13
- package/packages/database/src/lib/loadCommits.js.map +1 -1
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +100 -89
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
- package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
- package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
- package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/codeyam-cli/src/webserver/app/routes/api.agent-transcripts.js +0 -486
- package/codeyam-cli/src/webserver/app/routes/api.agent-transcripts.js.map +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-C1rIyZdV.js +0 -34
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-DxCa1oBt.js +0 -23
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DmzSmblj.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DVTcUnur.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-BVgNO76F.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-B4MPiL7S.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-c1fc3656.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-CAAbm4U5.js +0 -62
- package/codeyam-cli/src/webserver/build/client/assets/settings-BpLDWmGh.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-DZp6rrQD.js +0 -2
- package/codeyam-cli/src/webserver/build/server/assets/index-B8A_aaGG.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-69rRZnZo.js +0 -286
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodeYam Isolation Route — Next.js Pages Router
|
|
3
|
+
*
|
|
4
|
+
* Place this file at: pages/__codeyam__/[component]/[scenario].tsx
|
|
5
|
+
*
|
|
6
|
+
* This route dynamically imports a component and renders it with mock data
|
|
7
|
+
* from the specified scenario, enabling isolated component preview.
|
|
8
|
+
*
|
|
9
|
+
* Usage: http://localhost:3000/__codeyam__/TaskCard/Default
|
|
10
|
+
*/
|
|
11
|
+
import { useRouter } from 'next/router';
|
|
12
|
+
import { useEffect, useState } from 'react';
|
|
13
|
+
|
|
14
|
+
interface ScenarioData {
|
|
15
|
+
mockData: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default function CodeYamIsolationPage() {
|
|
19
|
+
const router = useRouter();
|
|
20
|
+
const { component: componentName, scenario: scenarioSlug } = router.query;
|
|
21
|
+
|
|
22
|
+
const [Component, setComponent] = useState<React.ComponentType<any> | null>(null);
|
|
23
|
+
const [mockData, setMockData] = useState<Record<string, unknown> | null>(null);
|
|
24
|
+
const [error, setError] = useState<string | null>(null);
|
|
25
|
+
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (!componentName || !scenarioSlug) return;
|
|
28
|
+
|
|
29
|
+
async function loadComponent() {
|
|
30
|
+
try {
|
|
31
|
+
// Fetch scenario data from CodeYam API
|
|
32
|
+
const res = await fetch(
|
|
33
|
+
`http://localhost:${process.env.NEXT_PUBLIC_CODEYAM_PORT || '3111'}/api/editor-scenario-data?component=${componentName}&scenario=${scenarioSlug}`
|
|
34
|
+
);
|
|
35
|
+
if (res.ok) {
|
|
36
|
+
const data: ScenarioData = await res.json();
|
|
37
|
+
setMockData(data.mockData);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Try to dynamically import the component
|
|
41
|
+
// Claude should update this mapping when adding new components
|
|
42
|
+
const componentModules: Record<string, () => Promise<any>> = {
|
|
43
|
+
// Example: 'TaskCard': () => import('../components/TaskCard'),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const loader = componentModules[componentName as string];
|
|
47
|
+
if (loader) {
|
|
48
|
+
const mod = await loader();
|
|
49
|
+
setComponent(() => mod.default || mod[componentName as string]);
|
|
50
|
+
} else {
|
|
51
|
+
setError(`Component "${componentName}" not registered in isolation route`);
|
|
52
|
+
}
|
|
53
|
+
} catch (err) {
|
|
54
|
+
setError(`Failed to load component: ${err}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
void loadComponent();
|
|
59
|
+
}, [componentName, scenarioSlug]);
|
|
60
|
+
|
|
61
|
+
if (error) {
|
|
62
|
+
return (
|
|
63
|
+
<div style={{ padding: 24, fontFamily: 'monospace', color: '#e74c3c' }}>
|
|
64
|
+
<h2>CodeYam Isolation Error</h2>
|
|
65
|
+
<p>{error}</p>
|
|
66
|
+
</div>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!Component || !mockData) {
|
|
71
|
+
return (
|
|
72
|
+
<div style={{ padding: 24, fontFamily: 'monospace', color: '#666' }}>
|
|
73
|
+
Loading {componentName} / {scenarioSlug}...
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return <Component {...mockData} />;
|
|
79
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodeYam Isolation Route — Vite + React
|
|
3
|
+
*
|
|
4
|
+
* Add this route to your React Router config.
|
|
5
|
+
* For example, in your router setup:
|
|
6
|
+
* { path: '/__codeyam__/:component/:scenario', element: <CodeYamIsolation /> }
|
|
7
|
+
*
|
|
8
|
+
* Usage: http://localhost:5173/__codeyam__/TaskCard/Default
|
|
9
|
+
*/
|
|
10
|
+
import { useParams } from 'react-router-dom';
|
|
11
|
+
import { useEffect, useState } from 'react';
|
|
12
|
+
|
|
13
|
+
interface ScenarioData {
|
|
14
|
+
mockData: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default function CodeYamIsolation() {
|
|
18
|
+
const { component: componentName, scenario: scenarioSlug } = useParams();
|
|
19
|
+
|
|
20
|
+
const [Component, setComponent] = useState<React.ComponentType<any> | null>(null);
|
|
21
|
+
const [mockData, setMockData] = useState<Record<string, unknown> | null>(null);
|
|
22
|
+
const [error, setError] = useState<string | null>(null);
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!componentName || !scenarioSlug) return;
|
|
26
|
+
|
|
27
|
+
async function loadComponent() {
|
|
28
|
+
try {
|
|
29
|
+
// Fetch scenario data from CodeYam API
|
|
30
|
+
const codeyamPort = import.meta.env.VITE_CODEYAM_PORT || '3111';
|
|
31
|
+
const res = await fetch(
|
|
32
|
+
`http://localhost:${codeyamPort}/api/editor-scenario-data?component=${componentName}&scenario=${scenarioSlug}`
|
|
33
|
+
);
|
|
34
|
+
if (res.ok) {
|
|
35
|
+
const data: ScenarioData = await res.json();
|
|
36
|
+
setMockData(data.mockData);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Try to dynamically import the component
|
|
40
|
+
// Claude should update this mapping when adding new components
|
|
41
|
+
const componentModules: Record<string, () => Promise<any>> = {
|
|
42
|
+
// Example: 'TaskCard': () => import('./components/TaskCard'),
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const loader = componentModules[componentName];
|
|
46
|
+
if (loader) {
|
|
47
|
+
const mod = await loader();
|
|
48
|
+
setComponent(() => mod.default || mod[componentName]);
|
|
49
|
+
} else {
|
|
50
|
+
setError(`Component "${componentName}" not registered in isolation route`);
|
|
51
|
+
}
|
|
52
|
+
} catch (err) {
|
|
53
|
+
setError(`Failed to load component: ${err}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
void loadComponent();
|
|
58
|
+
}, [componentName, scenarioSlug]);
|
|
59
|
+
|
|
60
|
+
if (error) {
|
|
61
|
+
return (
|
|
62
|
+
<div style={{ padding: 24, fontFamily: 'monospace', color: '#e74c3c' }}>
|
|
63
|
+
<h2>CodeYam Isolation Error</h2>
|
|
64
|
+
<p>{error}</p>
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!Component || !mockData) {
|
|
70
|
+
return (
|
|
71
|
+
<div style={{ padding: 24, fontFamily: 'monospace', color: '#666' }}>
|
|
72
|
+
Loading {componentName} / {scenarioSlug}...
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return <Component {...mockData} />;
|
|
78
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MSW Browser Setup — CodeYam Editor Mode
|
|
3
|
+
*
|
|
4
|
+
* This file sets up Mock Service Worker in the browser.
|
|
5
|
+
* Import this in your app's entry point (e.g., main.tsx or layout.tsx).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { startMSW } from './__codeyam-msw__/browser';
|
|
9
|
+
* await startMSW();
|
|
10
|
+
*/
|
|
11
|
+
import { setupWorker } from 'msw/browser';
|
|
12
|
+
import { getHandlers } from './index';
|
|
13
|
+
|
|
14
|
+
let started = false;
|
|
15
|
+
|
|
16
|
+
export async function startMSW() {
|
|
17
|
+
if (started) return;
|
|
18
|
+
if (typeof window === 'undefined') return;
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
// Read active scenario from CodeYam
|
|
22
|
+
let scenarioSlug = 'Default';
|
|
23
|
+
try {
|
|
24
|
+
const res = await fetch('/.codeyam/active-scenario.json');
|
|
25
|
+
if (res.ok) {
|
|
26
|
+
const data = await res.json();
|
|
27
|
+
scenarioSlug = data.scenarioSlug || 'Default';
|
|
28
|
+
}
|
|
29
|
+
} catch {
|
|
30
|
+
// Use default
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const handlers = getHandlers(scenarioSlug);
|
|
34
|
+
if (handlers.length === 0) return;
|
|
35
|
+
|
|
36
|
+
const worker = setupWorker(...handlers);
|
|
37
|
+
await worker.start({
|
|
38
|
+
onUnhandledRequest: 'bypass',
|
|
39
|
+
quiet: true,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
started = true;
|
|
43
|
+
console.log(`[CodeYam MSW] Browser mocking started (scenario: ${scenarioSlug})`);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.warn('[CodeYam MSW] Failed to start browser mocking:', error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MSW Handler Router — CodeYam Editor Mode
|
|
3
|
+
*
|
|
4
|
+
* Central router that collects handlers from all scenario handler files.
|
|
5
|
+
* Handler files live in `.codeyam/msw-handlers/{ScenarioSlug}.ts`.
|
|
6
|
+
*
|
|
7
|
+
* This file should be placed at `src/__codeyam-msw__/index.ts` in the user's project.
|
|
8
|
+
*/
|
|
9
|
+
import type { RequestHandler } from 'msw';
|
|
10
|
+
|
|
11
|
+
// Map of scenario slugs to their handler modules.
|
|
12
|
+
// Claude adds imports here as scenarios are created.
|
|
13
|
+
// Example:
|
|
14
|
+
// import * as Dashboard_Default from '../../.codeyam/msw-handlers/Dashboard_Default';
|
|
15
|
+
// import * as TaskCard_Empty from '../../.codeyam/msw-handlers/TaskCard_Empty';
|
|
16
|
+
|
|
17
|
+
const handlerModules: Record<string, { handlers: () => RequestHandler[] }> = {
|
|
18
|
+
// Claude registers handler modules here:
|
|
19
|
+
// 'Dashboard_Default': Dashboard_Default,
|
|
20
|
+
// 'TaskCard_Empty': TaskCard_Empty,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get MSW handlers for a specific scenario.
|
|
25
|
+
* Falls back to 'Default' if the requested scenario doesn't have handlers.
|
|
26
|
+
*/
|
|
27
|
+
export function getHandlers(scenarioSlug: string): RequestHandler[] {
|
|
28
|
+
const module = handlerModules[scenarioSlug];
|
|
29
|
+
if (module) {
|
|
30
|
+
return module.handlers();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Try to find a default handler
|
|
34
|
+
const defaultModule = handlerModules['Default'];
|
|
35
|
+
if (defaultModule) {
|
|
36
|
+
return defaultModule.handlers();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get all available scenario slugs that have MSW handlers.
|
|
44
|
+
*/
|
|
45
|
+
export function getAvailableScenarios(): string[] {
|
|
46
|
+
return Object.keys(handlerModules);
|
|
47
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MSW Server Setup — CodeYam Editor Mode
|
|
3
|
+
*
|
|
4
|
+
* This file sets up Mock Service Worker for server-side interception (Node.js).
|
|
5
|
+
* For Next.js: import in `instrumentation.ts`.
|
|
6
|
+
* For Vite SSR: import in the server entry.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { startMSWServer } from './__codeyam-msw__/server';
|
|
10
|
+
* startMSWServer();
|
|
11
|
+
*/
|
|
12
|
+
import { setupServer } from 'msw/node';
|
|
13
|
+
import { getHandlers } from './index';
|
|
14
|
+
import * as fs from 'fs';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
|
|
17
|
+
let started = false;
|
|
18
|
+
|
|
19
|
+
export function startMSWServer() {
|
|
20
|
+
if (started) return;
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
// Read active scenario from .codeyam/active-scenario.json
|
|
24
|
+
let scenarioSlug = 'Default';
|
|
25
|
+
try {
|
|
26
|
+
const activeScenarioPath = path.join(
|
|
27
|
+
process.cwd(),
|
|
28
|
+
'.codeyam',
|
|
29
|
+
'active-scenario.json',
|
|
30
|
+
);
|
|
31
|
+
if (fs.existsSync(activeScenarioPath)) {
|
|
32
|
+
const data = JSON.parse(fs.readFileSync(activeScenarioPath, 'utf8'));
|
|
33
|
+
scenarioSlug = data.scenarioSlug || 'Default';
|
|
34
|
+
}
|
|
35
|
+
} catch {
|
|
36
|
+
// Use default
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const handlers = getHandlers(scenarioSlug);
|
|
40
|
+
if (handlers.length === 0) return;
|
|
41
|
+
|
|
42
|
+
const server = setupServer(...handlers);
|
|
43
|
+
server.listen({
|
|
44
|
+
onUnhandledRequest: 'bypass',
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
started = true;
|
|
48
|
+
console.log(`[CodeYam MSW] Server mocking started (scenario: ${scenarioSlug})`);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.warn('[CodeYam MSW] Failed to start server mocking:', error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Prisma 7 + SQLite Setup
|
|
2
|
+
|
|
3
|
+
This project uses Prisma 7 with SQLite via the `better-sqlite3` driver adapter.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
Prisma 7 requires a **driver adapter** — you cannot use `new PrismaClient()` alone.
|
|
8
|
+
Every file that creates a PrismaClient must use this pattern:
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
import { PrismaClient } from '@prisma/client';
|
|
12
|
+
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
|
|
13
|
+
|
|
14
|
+
const adapter = new PrismaBetterSqlite3({ url: 'file:./dev.db' });
|
|
15
|
+
const prisma = new PrismaClient({ adapter });
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The singleton in `app/lib/prisma.ts` is already configured. Import it in your code:
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { prisma } from '@/app/lib/prisma';
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Important: do NOT change these settings
|
|
25
|
+
|
|
26
|
+
- **Generator must be `prisma-client-js`** (not `prisma-client`). The `prisma-client`
|
|
27
|
+
generator requires a custom output path that breaks Turbopack import resolution.
|
|
28
|
+
- **Do NOT add an `output` field** to the generator. The default output to
|
|
29
|
+
`node_modules/@prisma/client` works with standard imports everywhere.
|
|
30
|
+
- **Do NOT add `url` to the datasource block** in `schema.prisma`. Prisma 7
|
|
31
|
+
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
|
+
- **Keep `turbopack: { root: "." }`** in `next.config.ts`. Without it,
|
|
35
|
+
Turbopack may infer a parent directory as root and break imports.
|
|
36
|
+
- **Database file is at project root** (`./dev.db`), not in `prisma/`.
|
|
37
|
+
- **Always run `npx prisma generate`** after `npx prisma db push` (or use
|
|
38
|
+
`npm run db:push` which does both). Without this, the client module is missing.
|
|
39
|
+
|
|
40
|
+
## Common tasks
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Edit your schema
|
|
44
|
+
vim prisma/schema.prisma
|
|
45
|
+
|
|
46
|
+
# Push schema changes to the database (also regenerates client)
|
|
47
|
+
npm run db:push
|
|
48
|
+
|
|
49
|
+
# Seed the database
|
|
50
|
+
npx tsx prisma/seed.ts
|
|
51
|
+
# or: npm run db:seed
|
|
52
|
+
|
|
53
|
+
# Reset the database (delete + recreate + seed)
|
|
54
|
+
npm run db:reset
|
|
55
|
+
|
|
56
|
+
# Open Prisma Studio (database browser)
|
|
57
|
+
npx prisma studio
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Writing seed scripts
|
|
61
|
+
|
|
62
|
+
Seed scripts run outside of Next.js, so they must create their own PrismaClient
|
|
63
|
+
with the adapter (they cannot import from `@/app/lib/prisma`). See `prisma/seed.ts`
|
|
64
|
+
for the correct pattern.
|
|
65
|
+
|
|
66
|
+
## Writing API routes
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// app/api/todos/route.ts
|
|
70
|
+
import { prisma } from '@/app/lib/prisma';
|
|
71
|
+
|
|
72
|
+
export async function GET() {
|
|
73
|
+
const todos = await prisma.todo.findMany({
|
|
74
|
+
orderBy: { createdAt: 'desc' },
|
|
75
|
+
});
|
|
76
|
+
return Response.json(todos);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function POST(request: Request) {
|
|
80
|
+
const { title } = await request.json();
|
|
81
|
+
const todo = await prisma.todo.create({ data: { title } });
|
|
82
|
+
return Response.json(todo);
|
|
83
|
+
}
|
|
84
|
+
```
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Prisma 7 requires a driver adapter for database access.
|
|
2
|
+
// This file uses better-sqlite3 for SQLite.
|
|
3
|
+
//
|
|
4
|
+
// Usage in API routes and server components:
|
|
5
|
+
// import { prisma } from "@/app/lib/prisma";
|
|
6
|
+
// const items = await prisma.todo.findMany();
|
|
7
|
+
|
|
8
|
+
import { PrismaClient } from '@prisma/client';
|
|
9
|
+
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
|
|
10
|
+
|
|
11
|
+
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
|
|
12
|
+
|
|
13
|
+
const adapter = new PrismaBetterSqlite3({ url: 'file:./dev.db' });
|
|
14
|
+
|
|
15
|
+
export const prisma = globalForPrisma.prisma ?? new PrismaClient({ adapter });
|
|
16
|
+
|
|
17
|
+
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
|
|
18
|
+
|
|
19
|
+
export default prisma;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default function Home() {
|
|
2
|
+
return (
|
|
3
|
+
<main className="min-h-screen flex items-center justify-center">
|
|
4
|
+
<div className="text-center">
|
|
5
|
+
<h1 className="text-4xl font-bold mb-4">Welcome</h1>
|
|
6
|
+
<p className="text-gray-600">Your app is ready. Start building!</p>
|
|
7
|
+
</div>
|
|
8
|
+
</main>
|
|
9
|
+
);
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { defineConfig, globalIgnores } from "eslint/config";
|
|
2
|
+
import nextVitals from "eslint-config-next/core-web-vitals";
|
|
3
|
+
import nextTs from "eslint-config-next/typescript";
|
|
4
|
+
|
|
5
|
+
const eslintConfig = defineConfig([
|
|
6
|
+
...nextVitals,
|
|
7
|
+
...nextTs,
|
|
8
|
+
globalIgnores([".next/**", "out/**", "build/**", "next-env.d.ts"]),
|
|
9
|
+
]);
|
|
10
|
+
|
|
11
|
+
export default eslintConfig;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# dependencies
|
|
2
|
+
/node_modules
|
|
3
|
+
/.pnp
|
|
4
|
+
.pnp.*
|
|
5
|
+
.yarn/*
|
|
6
|
+
!.yarn/patches
|
|
7
|
+
!.yarn/plugins
|
|
8
|
+
!.yarn/releases
|
|
9
|
+
!.yarn/versions
|
|
10
|
+
|
|
11
|
+
# testing
|
|
12
|
+
/coverage
|
|
13
|
+
|
|
14
|
+
# next.js
|
|
15
|
+
/.next/
|
|
16
|
+
/out/
|
|
17
|
+
|
|
18
|
+
# production
|
|
19
|
+
/build
|
|
20
|
+
|
|
21
|
+
# misc
|
|
22
|
+
.DS_Store
|
|
23
|
+
*.pem
|
|
24
|
+
|
|
25
|
+
# debug
|
|
26
|
+
npm-debug.log*
|
|
27
|
+
yarn-debug.log*
|
|
28
|
+
yarn-error.log*
|
|
29
|
+
.pnpm-debug.log*
|
|
30
|
+
|
|
31
|
+
# env files
|
|
32
|
+
.env*.local
|
|
33
|
+
|
|
34
|
+
# vercel
|
|
35
|
+
.vercel
|
|
36
|
+
|
|
37
|
+
# typescript
|
|
38
|
+
*.tsbuildinfo
|
|
39
|
+
next-env.d.ts
|
|
40
|
+
|
|
41
|
+
# database
|
|
42
|
+
dev.db
|
|
43
|
+
dev.db-journal
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { NextConfig } from 'next';
|
|
2
|
+
|
|
3
|
+
const nextConfig: NextConfig = {
|
|
4
|
+
// Required: better-sqlite3 is a native module that can't be bundled
|
|
5
|
+
serverExternalPackages: ['better-sqlite3'],
|
|
6
|
+
|
|
7
|
+
turbopack: {
|
|
8
|
+
// Required: prevents Turbopack from inferring a parent directory as root
|
|
9
|
+
// when .codeyam/ exists above the project (which breaks import resolution)
|
|
10
|
+
root: '.',
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default nextConfig;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "codeyam-project",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev --turbopack",
|
|
7
|
+
"build": "next build",
|
|
8
|
+
"start": "next start",
|
|
9
|
+
"lint": "eslint",
|
|
10
|
+
"db:push": "npx prisma db push && npx prisma generate",
|
|
11
|
+
"db:seed": "npx tsx prisma/seed.ts",
|
|
12
|
+
"db:reset": "rm -f dev.db && npm run db:push && npx tsx prisma/seed.ts"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@prisma/adapter-better-sqlite3": "^7.4.1",
|
|
16
|
+
"@prisma/client": "^7.4.1",
|
|
17
|
+
"better-sqlite3": "^12.6.2",
|
|
18
|
+
"next": "^15.3.3",
|
|
19
|
+
"prisma": "^7.4.1",
|
|
20
|
+
"react": "^19.1.0",
|
|
21
|
+
"react-dom": "^19.1.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@tailwindcss/postcss": "^4",
|
|
25
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
26
|
+
"@types/node": "^20",
|
|
27
|
+
"@types/react": "^19",
|
|
28
|
+
"@types/react-dom": "^19",
|
|
29
|
+
"eslint": "^9",
|
|
30
|
+
"eslint-config-next": "^15.3.3",
|
|
31
|
+
"tailwindcss": "^4",
|
|
32
|
+
"tsx": "^4.19.4",
|
|
33
|
+
"typescript": "^5"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Prisma 7 with SQLite via better-sqlite3 driver adapter.
|
|
2
|
+
//
|
|
3
|
+
// IMPORTANT: Use "prisma-client-js" (NOT "prisma-client").
|
|
4
|
+
// The "prisma-client" generator requires a custom output path which
|
|
5
|
+
// breaks Turbopack import resolution and seed script imports.
|
|
6
|
+
// "prisma-client-js" outputs to node_modules/@prisma/client which
|
|
7
|
+
// works everywhere with standard imports.
|
|
8
|
+
|
|
9
|
+
generator client {
|
|
10
|
+
provider = "prisma-client-js"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
datasource db {
|
|
14
|
+
provider = "sqlite"
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// ──────────────────────────────────────────────
|
|
18
|
+
// Replace these placeholder models with your own.
|
|
19
|
+
// After editing, run: npx prisma db push
|
|
20
|
+
// ──────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
model Todo {
|
|
23
|
+
id Int @id @default(autoincrement())
|
|
24
|
+
title String
|
|
25
|
+
completed Boolean @default(false)
|
|
26
|
+
createdAt DateTime @default(now())
|
|
27
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Seed script for populating the database with demo data.
|
|
2
|
+
//
|
|
3
|
+
// Run with: npx tsx prisma/seed.ts
|
|
4
|
+
// Or: npm run db:seed
|
|
5
|
+
//
|
|
6
|
+
// IMPORTANT: This file must use the same adapter pattern as app/lib/prisma.ts.
|
|
7
|
+
// Do NOT use `new PrismaClient()` without the adapter — Prisma 7 requires it.
|
|
8
|
+
|
|
9
|
+
import { PrismaClient } from '@prisma/client';
|
|
10
|
+
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
|
|
11
|
+
|
|
12
|
+
const adapter = new PrismaBetterSqlite3({ url: 'file:./dev.db' });
|
|
13
|
+
const prisma = new PrismaClient({ adapter });
|
|
14
|
+
|
|
15
|
+
async function main() {
|
|
16
|
+
// Clear existing data
|
|
17
|
+
await prisma.todo.deleteMany();
|
|
18
|
+
|
|
19
|
+
// Seed with demo data
|
|
20
|
+
await prisma.todo.createMany({
|
|
21
|
+
data: [
|
|
22
|
+
{ title: 'Set up the project', completed: true },
|
|
23
|
+
{ title: 'Build the first feature' },
|
|
24
|
+
{ title: 'Add more scenarios' },
|
|
25
|
+
],
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const count = await prisma.todo.count();
|
|
29
|
+
console.log(`Seeded ${count} todos`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
main()
|
|
33
|
+
.then(() => prisma.$disconnect())
|
|
34
|
+
.catch((e) => {
|
|
35
|
+
console.error(e);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
});
|