@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
|
@@ -4,6 +4,68 @@
|
|
|
4
4
|
* Extracted from inline logic in EditorJournal.tsx, api.editor-journal-entry.ts,
|
|
5
5
|
* and api.editor-journal-update.ts.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* Compute a timeframe summary from journal entries.
|
|
9
|
+
*
|
|
10
|
+
* Filters entries to those within the given period (relative to `now`),
|
|
11
|
+
* counts unique commits, and builds per-scenario screenshot timelines
|
|
12
|
+
* grouped into app-level vs component-level.
|
|
13
|
+
*
|
|
14
|
+
* @param entries - Journal entries (unfiltered)
|
|
15
|
+
* @param period - Time window: '1d', '3d', '7d', or '30d'
|
|
16
|
+
* @param now - Reference date (defaults to current time; injectable for testing)
|
|
17
|
+
*/
|
|
18
|
+
export function computeTimeframeSummary(entries, period, now = new Date()) {
|
|
19
|
+
const days = { '1d': 1, '3d': 3, '7d': 7, '30d': 30 }[period];
|
|
20
|
+
const cutoff = new Date(now);
|
|
21
|
+
cutoff.setDate(cutoff.getDate() - days);
|
|
22
|
+
const cutoffDate = cutoff.toISOString().split('T')[0];
|
|
23
|
+
const filtered = entries.filter((e) => e.date >= cutoffDate);
|
|
24
|
+
// Count unique commits
|
|
25
|
+
const commitShas = new Set(filtered.map((e) => e.commitSha).filter(Boolean));
|
|
26
|
+
// Collect all scenario screenshots with timestamps, deduplicate by path
|
|
27
|
+
const scenarioMap = new Map();
|
|
28
|
+
for (const entry of filtered) {
|
|
29
|
+
if (entry.scenarioScreenshots) {
|
|
30
|
+
for (const ss of entry.scenarioScreenshots) {
|
|
31
|
+
if (!scenarioMap.has(ss.name)) {
|
|
32
|
+
scenarioMap.set(ss.name, []);
|
|
33
|
+
}
|
|
34
|
+
const existing = scenarioMap.get(ss.name);
|
|
35
|
+
if (!existing.some((e) => e.path === ss.path)) {
|
|
36
|
+
existing.push({ path: ss.path, time: entry.time });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Sort each scenario's screenshots by time
|
|
42
|
+
for (const screenshots of scenarioMap.values()) {
|
|
43
|
+
screenshots.sort((a, b) => a.time.localeCompare(b.time));
|
|
44
|
+
}
|
|
45
|
+
// Group into app vs component (same logic as groupScreenshotsByComponent)
|
|
46
|
+
const appScenarios = [];
|
|
47
|
+
const componentGroups = new Map();
|
|
48
|
+
for (const [name, screenshots] of scenarioMap) {
|
|
49
|
+
const dashIdx = name.indexOf(' - ');
|
|
50
|
+
if (dashIdx !== -1) {
|
|
51
|
+
const componentName = name.slice(0, dashIdx);
|
|
52
|
+
if (!componentGroups.has(componentName)) {
|
|
53
|
+
componentGroups.set(componentName, []);
|
|
54
|
+
}
|
|
55
|
+
componentGroups.get(componentName).push({ name, screenshots });
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
appScenarios.push({ name, screenshots });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
commitCount: commitShas.size,
|
|
63
|
+
entryCount: filtered.length,
|
|
64
|
+
appScenarios,
|
|
65
|
+
componentGroups,
|
|
66
|
+
totalScenarios: scenarioMap.size,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
7
69
|
/**
|
|
8
70
|
* Group journal entries by date, reversing so newest entries come first.
|
|
9
71
|
* Returns a Map preserving insertion order (newest date first).
|
|
@@ -19,14 +81,27 @@ export function groupEntriesByDate(entries) {
|
|
|
19
81
|
}
|
|
20
82
|
/**
|
|
21
83
|
* Group scenario screenshots by component name.
|
|
22
|
-
*
|
|
84
|
+
* Uses the `componentName` field when available (preferred — matches Results Panel).
|
|
85
|
+
* Falls back to parsing the name at " - " for backward compatibility.
|
|
86
|
+
* Screenshots without a componentName are grouped as "App".
|
|
23
87
|
* Sorted with "App" first, then alphabetical.
|
|
24
88
|
*/
|
|
25
89
|
export function groupScreenshotsByComponent(screenshots) {
|
|
26
90
|
const groups = new Map();
|
|
27
91
|
for (const ss of screenshots) {
|
|
28
|
-
|
|
29
|
-
|
|
92
|
+
let group;
|
|
93
|
+
if ('componentName' in ss && ss.componentName) {
|
|
94
|
+
group = ss.componentName;
|
|
95
|
+
}
|
|
96
|
+
else if ('componentName' in ss && ss.componentName === null) {
|
|
97
|
+
// Explicitly null — this is an application scenario
|
|
98
|
+
group = 'App';
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Legacy fallback: parse name
|
|
102
|
+
const dashIdx = ss.name.indexOf(' - ');
|
|
103
|
+
group = dashIdx !== -1 ? ss.name.slice(0, dashIdx) : 'App';
|
|
104
|
+
}
|
|
30
105
|
const existing = groups.get(group) || [];
|
|
31
106
|
existing.push(ss);
|
|
32
107
|
groups.set(group, existing);
|
|
@@ -56,7 +131,7 @@ export function generateJournalScreenshotFilename(name, timestamp) {
|
|
|
56
131
|
* Returns the joined string ready to append to a daily markdown file.
|
|
57
132
|
*/
|
|
58
133
|
export function buildJournalMarkdown(params) {
|
|
59
|
-
const { title, timeStr, type, description, allScenarioNames, screenshot, scenarioScreenshots, commitSha, commitMessage, } = params;
|
|
134
|
+
const { title, timeStr, type, description, allScenarioNames, screenshot, scenarioScreenshots, commitSha, commitMessage, featureName, userPrompt, } = params;
|
|
60
135
|
const mdLines = [
|
|
61
136
|
'',
|
|
62
137
|
'---',
|
|
@@ -65,6 +140,12 @@ export function buildJournalMarkdown(params) {
|
|
|
65
140
|
`**Time:** ${timeStr}`,
|
|
66
141
|
`**Type:** ${type}`,
|
|
67
142
|
];
|
|
143
|
+
if (featureName) {
|
|
144
|
+
mdLines.push(`**Feature:** ${featureName}`);
|
|
145
|
+
}
|
|
146
|
+
if (userPrompt) {
|
|
147
|
+
mdLines.push(`**Prompt:** ${userPrompt}`);
|
|
148
|
+
}
|
|
68
149
|
if (allScenarioNames.length > 0) {
|
|
69
150
|
mdLines.push(`**Scenarios:** ${allScenarioNames.join(', ')}`);
|
|
70
151
|
}
|
|
@@ -96,6 +177,13 @@ export function buildJournalMarkdown(params) {
|
|
|
96
177
|
export function findJournalEntryByTime(entries, time) {
|
|
97
178
|
return entries.findIndex((e) => e.time === time);
|
|
98
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Check if a journal entry has already been committed.
|
|
182
|
+
* Once committed (commitSha is set), the entry is frozen and should not be updated.
|
|
183
|
+
*/
|
|
184
|
+
export function isJournalEntryCommitted(entry) {
|
|
185
|
+
return !!entry.commitSha;
|
|
186
|
+
}
|
|
99
187
|
/**
|
|
100
188
|
* Apply non-undefined updates to a journal entry.
|
|
101
189
|
* Returns the mutated entry (same reference).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorJournal.js","sourceRoot":"","sources":["../../../../src/utils/editorJournal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"editorJournal.js","sourceRoot":"","sources":["../../../../src/utils/editorJournal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuCH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAgC,EAChC,MAAuB,EACvB,MAAY,IAAI,IAAI,EAAE;IAEtB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC;IAE7D,uBAAuB;IACvB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7E,wEAAwE;IACxE,MAAM,WAAW,GAAG,IAAI,GAAG,EAA4C,CAAC;IACxE,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC9B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;gBAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9B,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAE,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,KAAK,MAAM,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/C,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,0EAA0E;IAC1E,MAAM,YAAY,GAAuB,EAAE,CAAC;IAC5C,MAAM,eAAe,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE9D,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,WAAW,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBACxC,eAAe,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,aAAa,CAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,UAAU,CAAC,IAAI;QAC5B,UAAU,EAAE,QAAQ,CAAC,MAAM;QAC3B,YAAY;QACZ,eAAe;QACf,cAAc,EAAE,WAAW,CAAC,IAAI;KACjC,CAAC;AACJ,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAY;IAEZ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,WAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAe,CAAC;IACtC,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,KAAa,CAAC;QAClB,IAAI,eAAe,IAAI,EAAE,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;YAC9C,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC;QAC3B,CAAC;aAAM,IAAI,eAAe,IAAI,EAAE,IAAI,EAAE,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAC9D,oDAAoD;YACpD,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACvC,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7D,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAC/C,IAAY,EACZ,SAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,SAAS;SAC3B,WAAW,EAAE;SACb,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,GAAG,YAAY,IAAI,QAAQ,MAAM,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAYpC;IACC,MAAM,EACJ,KAAK,EACL,OAAO,EACP,IAAI,EACJ,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,WAAW,EACX,UAAU,GACX,GAAG,MAAM,CAAC;IAEX,MAAM,OAAO,GAAa;QACxB,EAAE;QACF,KAAK;QACL,EAAE;QACF,OAAO,KAAK,EAAE;QACd,aAAa,OAAO,EAAE;QACtB,aAAa,IAAI,EAAE;KACpB,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,kBAAkB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE1B,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,UAAU,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,KAAK,MAAM,EAAE,IAAI,mBAAmB,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,iBAAiB,SAAS,QAAQ,aAAa,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEjB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAgC,EAChC,IAAY;IAEZ,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAEvC;IACC,OAAO,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAQ,EACR,OAMC;IAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACxC,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACtC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC9C,KAAK,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAe,EACf,KAAa,EACb,SAAiB,EACjB,aAA4B;IAE5B,MAAM,UAAU,GAAG,mBAAmB,SAAS,QAAQ,aAAa,IAAI,YAAY,IAAI,CAAC;IACzF,MAAM,WAAW,GAAG,OAAO,KAAK,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAElD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACpE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter glossary entries to extract library functions (non-visual entries with test files).
|
|
3
|
+
*/
|
|
4
|
+
export function filterGlossaryFunctions(entries) {
|
|
5
|
+
return entries
|
|
6
|
+
.filter((g) => g.testFile &&
|
|
7
|
+
g.returnType !== 'JSX.Element' &&
|
|
8
|
+
g.returnType !== 'React.ReactNode')
|
|
9
|
+
.map((g) => ({
|
|
10
|
+
name: g.name,
|
|
11
|
+
filePath: g.filePath,
|
|
12
|
+
description: g.description || '',
|
|
13
|
+
testFile: g.testFile,
|
|
14
|
+
feature: g.feature,
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Determine whether a scenario is "complete" based on entity type.
|
|
19
|
+
* Library entities are complete when they have an executionResult.
|
|
20
|
+
* Visual entities are complete when they have a screenshot that wasn't skipped.
|
|
21
|
+
*/
|
|
22
|
+
export function isScenarioComplete(scenario, isLibrary) {
|
|
23
|
+
if (isLibrary)
|
|
24
|
+
return !!scenario.metadata?.executionResult;
|
|
25
|
+
return (!!scenario.metadata?.screenshotPaths?.[0] &&
|
|
26
|
+
!scenario.metadata?.noScreenshotSaved &&
|
|
27
|
+
!scenario.metadata?.sameAsDefault);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Map raw Entity objects (with analyses) to the AnalyzedEntityData shape
|
|
31
|
+
* consumed by the editor UI.
|
|
32
|
+
*/
|
|
33
|
+
export function mapEntitiesToAnalyzedData(entities, glossaryEntries) {
|
|
34
|
+
return entities
|
|
35
|
+
.filter((entity) => entity.analyses && entity.analyses.length > 0)
|
|
36
|
+
.map((entity) => {
|
|
37
|
+
const analysis = entity.analyses[0];
|
|
38
|
+
const allScenarios = analysis.scenarios || [];
|
|
39
|
+
const isAnalyzing = !analysis.status?.finishedAt;
|
|
40
|
+
const entityType = entity.entityType || 'visual';
|
|
41
|
+
const isLibrary = entityType === 'library' || entityType === 'functionCall';
|
|
42
|
+
const completedScenarios = allScenarios.filter((s) => isScenarioComplete(s, isLibrary));
|
|
43
|
+
const pendingScenarios = allScenarios.filter((s) => !isScenarioComplete(s, isLibrary));
|
|
44
|
+
const glossaryEntry = glossaryEntries.find((g) => g.filePath === (entity.filePath || ''));
|
|
45
|
+
return {
|
|
46
|
+
sha: entity.sha,
|
|
47
|
+
name: entity.name,
|
|
48
|
+
entityType,
|
|
49
|
+
filePath: entity.filePath || '',
|
|
50
|
+
analysisId: analysis.id,
|
|
51
|
+
isAnalyzing,
|
|
52
|
+
scenarioCount: allScenarios.length,
|
|
53
|
+
scenarios: completedScenarios.map((s) => ({
|
|
54
|
+
id: s.id,
|
|
55
|
+
name: s.name,
|
|
56
|
+
description: s.description || '',
|
|
57
|
+
screenshotPath: s.metadata?.screenshotPaths?.[0] || null,
|
|
58
|
+
})),
|
|
59
|
+
pendingScenarios: pendingScenarios.map((s) => s.name),
|
|
60
|
+
testFile: glossaryEntry?.testFile,
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build an import graph from entity metadata, filtered to only include
|
|
66
|
+
* names that exist in the known set of entities/components/functions.
|
|
67
|
+
*/
|
|
68
|
+
export function buildEntityImportGraph(entitiesWithMetadata, knownEntityNames) {
|
|
69
|
+
const entityImports = {};
|
|
70
|
+
for (const entity of entitiesWithMetadata) {
|
|
71
|
+
const importedExports = entity.metadata?.importedExports || [];
|
|
72
|
+
const importedNames = importedExports
|
|
73
|
+
.map((ie) => ie.name)
|
|
74
|
+
.filter((name) => knownEntityNames.has(name));
|
|
75
|
+
if (importedNames.length > 0) {
|
|
76
|
+
entityImports[entity.name] = importedNames;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return entityImports;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Resolve page display names to entity import data via file path matching.
|
|
83
|
+
*
|
|
84
|
+
* Page display names (e.g., "Home" from URL "/") often don't match entity
|
|
85
|
+
* names in the database (e.g., "HomePage"). This function bridges the gap
|
|
86
|
+
* by using file paths — stored on entities in the database — as the
|
|
87
|
+
* canonical join key.
|
|
88
|
+
*
|
|
89
|
+
* Returns a new object with the original entityImports plus any resolved
|
|
90
|
+
* page aliases. Does not mutate the input.
|
|
91
|
+
*/
|
|
92
|
+
export function resolvePageEntityImports(entityImports, pageFilePaths, entitiesWithMetadata) {
|
|
93
|
+
const resolved = { ...entityImports };
|
|
94
|
+
// Build a file-path → entity-name index from analyzed entities
|
|
95
|
+
const filePathToEntityName = new Map();
|
|
96
|
+
for (const entity of entitiesWithMetadata) {
|
|
97
|
+
if (entity.filePath) {
|
|
98
|
+
filePathToEntityName.set(entity.filePath, entity.name);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// For each page, if the display name doesn't already have imports,
|
|
102
|
+
// look up the entity by file path and alias its imports
|
|
103
|
+
for (const [pageName, filePath] of Object.entries(pageFilePaths)) {
|
|
104
|
+
if (resolved[pageName])
|
|
105
|
+
continue; // Already has direct match
|
|
106
|
+
const entityName = filePathToEntityName.get(filePath);
|
|
107
|
+
if (entityName && resolved[entityName]) {
|
|
108
|
+
resolved[pageName] = resolved[entityName];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return resolved;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=editorLoaderHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorLoaderHelpers.js","sourceRoot":"","sources":["../../../../src/utils/editorLoaderHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Stateful mock state manager for the editor proxy.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Provides method-aware, stateful mock matching for the editor proxy.
|
|
5
5
|
* Supports legacy key-based format, route-keyed format, method-prefixed routes,
|
|
6
6
|
* parameterized routes, and mutable state for CRUD operations.
|
|
7
7
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pure redirect functions for the Node.js preload module.
|
|
2
|
+
* Pure redirect and mock-matching functions for the Node.js preload module.
|
|
3
3
|
*
|
|
4
4
|
* Extracted so they can be unit-tested without loading the actual preload
|
|
5
5
|
* (which patches global fetch and http).
|
|
@@ -61,4 +61,75 @@ export function redirectOptions(options, devServerUrl, proxyUrl) {
|
|
|
61
61
|
}
|
|
62
62
|
return options;
|
|
63
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Match a request URL against scenario mock data routes.
|
|
66
|
+
*
|
|
67
|
+
* Supports:
|
|
68
|
+
* - Path-only routes: "/api/drinks" matches fetch("http://localhost:3000/api/drinks")
|
|
69
|
+
* - Full URL routes: "https://api.stripe.com/v1/charges" matches external API calls
|
|
70
|
+
* - Method-prefixed: "POST /api/drinks" matches POST requests only
|
|
71
|
+
*
|
|
72
|
+
* Returns the mock response if matched, or null if no match.
|
|
73
|
+
*/
|
|
74
|
+
export function matchScenarioRoute(requestUrl, method, scenarioData) {
|
|
75
|
+
const routes = scenarioData.routes;
|
|
76
|
+
if (!routes || typeof routes !== 'object')
|
|
77
|
+
return null;
|
|
78
|
+
// Extract pathname from the request URL
|
|
79
|
+
let pathname;
|
|
80
|
+
try {
|
|
81
|
+
const parsed = new URL(requestUrl);
|
|
82
|
+
pathname = parsed.pathname;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Relative URL — use as-is
|
|
86
|
+
pathname = requestUrl.split('?')[0];
|
|
87
|
+
}
|
|
88
|
+
const upperMethod = method.toUpperCase();
|
|
89
|
+
for (const [routeKey, routeValue] of Object.entries(routes)) {
|
|
90
|
+
if (!routeValue || typeof routeValue !== 'object')
|
|
91
|
+
continue;
|
|
92
|
+
const entry = routeValue;
|
|
93
|
+
// Check for method-prefixed route: "POST /api/drinks"
|
|
94
|
+
const spaceIdx = routeKey.indexOf(' ');
|
|
95
|
+
if (spaceIdx !== -1) {
|
|
96
|
+
const routeMethod = routeKey.slice(0, spaceIdx).toUpperCase();
|
|
97
|
+
const routePath = routeKey.slice(spaceIdx + 1);
|
|
98
|
+
if (routeMethod === upperMethod && routePath === pathname) {
|
|
99
|
+
return {
|
|
100
|
+
body: entry.body ?? routeValue,
|
|
101
|
+
status: typeof entry.status === 'number' ? entry.status : 200,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
// Full URL route: "https://api.stripe.com/v1/charges"
|
|
107
|
+
if (routeKey.startsWith('http://') || routeKey.startsWith('https://')) {
|
|
108
|
+
try {
|
|
109
|
+
const routeParsed = new URL(routeKey);
|
|
110
|
+
const reqParsed = new URL(requestUrl);
|
|
111
|
+
if (routeParsed.hostname === reqParsed.hostname &&
|
|
112
|
+
routeParsed.port === reqParsed.port &&
|
|
113
|
+
routeParsed.pathname === reqParsed.pathname) {
|
|
114
|
+
return {
|
|
115
|
+
body: entry.body ?? routeValue,
|
|
116
|
+
status: typeof entry.status === 'number' ? entry.status : 200,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Invalid URL in route key — skip
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
// Path-only route: "/api/drinks"
|
|
126
|
+
if (routeKey === pathname) {
|
|
127
|
+
return {
|
|
128
|
+
body: entry.body ?? routeValue,
|
|
129
|
+
status: typeof entry.status === 'number' ? entry.status : 200,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
64
135
|
//# sourceMappingURL=editorPreloadHelpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorPreloadHelpers.js","sourceRoot":"","sources":["../../../../src/utils/editorPreloadHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,GAAW,EACX,YAAoB,EACpB,QAAgB;IAEhB,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;QACzC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEhC,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;QACjE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACjC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzB,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACjC,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAYD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAuB,EACvB,YAAoB,EACpB,QAAgB;IAEhB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE3C,2BAA2B;IAC3B,IACE,OAAO,CAAC,QAAQ;QAChB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO;QAC9C,OAAO,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,EACjC,CAAC;QACD,OAAO;YACL,GAAG,OAAO;YACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,OAAO,CAAC,OAAO;gBACtB,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE,EAAE;gBAChE,CAAC,CAAC,OAAO,CAAC,OAAO;SACpB,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAClC,OAAO;gBACL,GAAG,OAAO;gBACV,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"editorPreloadHelpers.js","sourceRoot":"","sources":["../../../../src/utils/editorPreloadHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ export function buildPreviewUrl(params) {
|
|
|
25
25
|
if (activeAnalyzedScenario && !analyzedPreviewUrl) {
|
|
26
26
|
return null;
|
|
27
27
|
}
|
|
28
|
-
// Component isolation scenarios store a path (e.g. /
|
|
28
|
+
// Component isolation scenarios store a path (e.g. /isolated-components/DrinkCard?s=Default)
|
|
29
29
|
if (activeScenarioId) {
|
|
30
30
|
const scenario = scenarios.find((s) => s.id === activeScenarioId);
|
|
31
31
|
if (scenario?.url) {
|
|
@@ -50,10 +50,76 @@ export function buildPreviewUrl(params) {
|
|
|
50
50
|
}
|
|
51
51
|
return baseUrl;
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Apply a navigation path override to a preview URL.
|
|
55
|
+
*
|
|
56
|
+
* Correctly handles paths with query strings (e.g. `/isolated-components/DrinkCard?s=Default`)
|
|
57
|
+
* by parsing the path into pathname + search components instead of naively assigning
|
|
58
|
+
* to `URL.pathname` (which would URL-encode the `?`).
|
|
59
|
+
*/
|
|
60
|
+
export function applyNavigatePath(previewUrl, navigatePath) {
|
|
61
|
+
if (!previewUrl)
|
|
62
|
+
return previewUrl;
|
|
63
|
+
if (!navigatePath)
|
|
64
|
+
return previewUrl;
|
|
65
|
+
try {
|
|
66
|
+
const base = new URL(previewUrl);
|
|
67
|
+
// Parse navigatePath to separate pathname from query string
|
|
68
|
+
const qIndex = navigatePath.indexOf('?');
|
|
69
|
+
if (qIndex >= 0) {
|
|
70
|
+
base.pathname = navigatePath.slice(0, qIndex);
|
|
71
|
+
base.search = navigatePath.slice(qIndex);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
base.pathname = navigatePath;
|
|
75
|
+
base.search = '';
|
|
76
|
+
}
|
|
77
|
+
return base.href;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return previewUrl;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
53
83
|
/**
|
|
54
84
|
* Compute CSS scale factor to fit a viewport in a container.
|
|
55
85
|
* Returns 1 if the target fits, otherwise the smallest scale that fits both dimensions.
|
|
56
86
|
*/
|
|
87
|
+
/**
|
|
88
|
+
* Determines whether the proxy needs to be synced to the active scenario.
|
|
89
|
+
* Returns true only when activeScenarioId actually changes — NOT when
|
|
90
|
+
* allScenarios gets a new array reference from SSE revalidation.
|
|
91
|
+
*/
|
|
92
|
+
export function shouldSyncScenarioToProxy(activeScenarioId, lastSyncedId) {
|
|
93
|
+
if (!activeScenarioId)
|
|
94
|
+
return false;
|
|
95
|
+
return activeScenarioId !== lastSyncedId;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Resolve which scenario to display when no scenario is explicitly selected.
|
|
99
|
+
* Prefers the first application-type scenario (full page view), falls back
|
|
100
|
+
* to the first scenario of any type.
|
|
101
|
+
*/
|
|
102
|
+
export function getDefaultScenario(scenarios) {
|
|
103
|
+
if (scenarios.length === 0)
|
|
104
|
+
return undefined;
|
|
105
|
+
return scenarios.find((s) => s.type === 'application') || scenarios[0];
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve the viewport size for a scenario. If the scenario has custom
|
|
109
|
+
* dimensions, returns a ScreenSize (matching a preset name if possible,
|
|
110
|
+
* otherwise "Custom"). Returns null when the scenario has no custom viewport.
|
|
111
|
+
*/
|
|
112
|
+
export function resolveScenarioViewport(scenario, presets) {
|
|
113
|
+
if (!scenario.viewportWidth || !scenario.viewportHeight)
|
|
114
|
+
return null;
|
|
115
|
+
const match = presets.find((p) => p.width === scenario.viewportWidth &&
|
|
116
|
+
p.height === scenario.viewportHeight);
|
|
117
|
+
return {
|
|
118
|
+
name: match?.name || 'Custom',
|
|
119
|
+
width: scenario.viewportWidth,
|
|
120
|
+
height: scenario.viewportHeight,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
57
123
|
export function calculatePreviewScale(containerSize, targetSize) {
|
|
58
124
|
const targetW = targetSize.width;
|
|
59
125
|
const targetH = targetSize.height ?? 900;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorPreview.js","sourceRoot":"","sources":["../../../../src/utils/editorPreview.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAkBzD;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,EACJ,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,aAAa,GACd,GAAG,MAAM,CAAC;IAEX,oEAAoE;IACpE,IAAI,sBAAsB,IAAI,kBAAkB,EAAE,CAAC;QACjD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,iFAAiF;IACjF,kDAAkD;IAClD,IAAI,sBAAsB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"editorPreview.js","sourceRoot":"","sources":["../../../../src/utils/editorPreview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared scenario switching logic.
|
|
3
|
+
*
|
|
4
|
+
* Both `/api/dev-mode-preview` (Express, server.ts) and
|
|
5
|
+
* `/api/editor-switch-scenario` (React Router action) need to switch
|
|
6
|
+
* the active scenario. This module consolidates that logic so both
|
|
7
|
+
* code paths handle seed-based scenarios correctly.
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { runSeedAdapter, detectSeedAdapter } from "./editorSeedAdapter.js";
|
|
12
|
+
/**
|
|
13
|
+
* Track in-flight seed operations to deduplicate concurrent requests
|
|
14
|
+
* for the same scenario.
|
|
15
|
+
*/
|
|
16
|
+
let activeSeedOperation = null;
|
|
17
|
+
/**
|
|
18
|
+
* Switch the active editor scenario.
|
|
19
|
+
*
|
|
20
|
+
* 1. Resolves the scenario type from the data file if not provided
|
|
21
|
+
* 2. Writes `active-scenario.json` (including `type`)
|
|
22
|
+
* 3. Runs the seed adapter for application/user scenarios
|
|
23
|
+
* 4. Returns the result (caller is responsible for cache invalidation and refresh)
|
|
24
|
+
*/
|
|
25
|
+
export async function switchActiveScenario(params) {
|
|
26
|
+
const { scenarioId, projectRoot } = params;
|
|
27
|
+
const codeyamDir = path.join(projectRoot, '.codeyam');
|
|
28
|
+
const scenariosDir = path.join(codeyamDir, 'editor-scenarios');
|
|
29
|
+
// Resolve slug from data file if not provided
|
|
30
|
+
let effectiveSlug = params.scenarioSlug || null;
|
|
31
|
+
if (!effectiveSlug) {
|
|
32
|
+
try {
|
|
33
|
+
const dataFile = path.join(scenariosDir, `${scenarioId}.json`);
|
|
34
|
+
if (fs.existsSync(dataFile)) {
|
|
35
|
+
const data = JSON.parse(fs.readFileSync(dataFile, 'utf-8'));
|
|
36
|
+
effectiveSlug = data.name || scenarioId;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
effectiveSlug = scenarioId;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
effectiveSlug = scenarioId;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Resolve type: prefer explicit param, fall back to data file
|
|
47
|
+
let effectiveType = params.scenarioType || null;
|
|
48
|
+
if (!effectiveType) {
|
|
49
|
+
try {
|
|
50
|
+
const dataFile = path.join(scenariosDir, `${scenarioId}.json`);
|
|
51
|
+
if (fs.existsSync(dataFile)) {
|
|
52
|
+
const data = JSON.parse(fs.readFileSync(dataFile, 'utf-8'));
|
|
53
|
+
effectiveType = data.type || null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Non-fatal
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Write active-scenario.json — MUST include type so proxy is type-aware
|
|
61
|
+
const activeScenarioPath = path.join(codeyamDir, 'active-scenario.json');
|
|
62
|
+
fs.mkdirSync(codeyamDir, { recursive: true });
|
|
63
|
+
fs.writeFileSync(activeScenarioPath, JSON.stringify({
|
|
64
|
+
scenarioSlug: effectiveSlug,
|
|
65
|
+
scenarioName: params.scenarioName || effectiveSlug,
|
|
66
|
+
scenarioId,
|
|
67
|
+
type: effectiveType,
|
|
68
|
+
dataFile: `.codeyam/editor-scenarios/${scenarioId}.json`,
|
|
69
|
+
switchedAt: new Date().toISOString(),
|
|
70
|
+
}, null, 2));
|
|
71
|
+
// Run seed adapter for application/user scenarios
|
|
72
|
+
let seedResult = null;
|
|
73
|
+
const isSeedScenario = effectiveType === 'application' || effectiveType === 'user';
|
|
74
|
+
if (isSeedScenario) {
|
|
75
|
+
// Deduplicate concurrent seed requests for the same scenario
|
|
76
|
+
if (activeSeedOperation && activeSeedOperation.scenarioId === scenarioId) {
|
|
77
|
+
seedResult = await activeSeedOperation.promise;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const adapterPath = detectSeedAdapter(projectRoot);
|
|
81
|
+
const seedDataPath = path.join(scenariosDir, `${scenarioId}.seed.json`);
|
|
82
|
+
if (adapterPath && fs.existsSync(seedDataPath)) {
|
|
83
|
+
const seedPromise = runSeedAdapter(adapterPath, seedDataPath).then((result) => ({
|
|
84
|
+
success: result.success,
|
|
85
|
+
error: result.error,
|
|
86
|
+
}));
|
|
87
|
+
activeSeedOperation = { scenarioId, promise: seedPromise };
|
|
88
|
+
try {
|
|
89
|
+
seedResult = await seedPromise;
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
if (activeSeedOperation &&
|
|
93
|
+
activeSeedOperation.scenarioId === scenarioId) {
|
|
94
|
+
activeSeedOperation = null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (!adapterPath) {
|
|
99
|
+
seedResult = { success: false, error: 'No seed adapter found' };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
success: true,
|
|
105
|
+
scenarioSlug: effectiveSlug,
|
|
106
|
+
scenarioId,
|
|
107
|
+
type: effectiveType,
|
|
108
|
+
seeded: isSeedScenario,
|
|
109
|
+
...(seedResult ? { seedResult } : {}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=editorScenarioSwitch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorScenarioSwitch.js","sourceRoot":"","sources":["../../../../src/utils/editorScenarioSwitch.ts"],"names":[],"mappings":"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"}
|