@codeyam/codeyam-cli 0.1.0-staging.a890816 → 0.1.0-staging.ad88eeb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +9 -9
- package/analyzer-template/packages/ai/package.json +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +0 -33
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +13 -7
- package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
- package/analyzer-template/packages/aws/package.json +2 -2
- package/analyzer-template/packages/database/package.json +3 -3
- package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +20 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +4 -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 +20 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.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/github/package.json +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/default.js +3 -46
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +1893 -215
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +6 -1
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/data/techStacks.js +82 -0
- package/codeyam-cli/src/data/techStacks.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 +635 -0
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
- package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +279 -0
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -0
- 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 +542 -0
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +393 -0
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorMockState.test.js +270 -0
- package/codeyam-cli/src/utils/__tests__/editorMockState.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +217 -0
- package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +266 -0
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +107 -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 +221 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -0
- 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 +1737 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/git.editor.test.js +134 -0
- package/codeyam-cli/src/utils/__tests__/git.editor.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__/project.test.js +65 -0
- package/codeyam-cli/src/utils/__tests__/project.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js +121 -0
- package/codeyam-cli/src/utils/__tests__/scenarioMarkers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +246 -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/backgroundServer.js +2 -2
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/buildFlags.js +4 -0
- package/codeyam-cli/src/utils/buildFlags.js.map +1 -0
- 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 +159 -0
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -0
- package/codeyam-cli/src/utils/editorCapture.js +102 -0
- package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
- package/codeyam-cli/src/utils/editorDevServer.js +193 -0
- package/codeyam-cli/src/utils/editorDevServer.js.map +1 -0
- 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 +225 -0
- package/codeyam-cli/src/utils/editorJournal.js.map +1 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.js +81 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorMockState.js +248 -0
- package/codeyam-cli/src/utils/editorMockState.js.map +1 -0
- package/codeyam-cli/src/utils/editorPreloadHelpers.js +135 -0
- package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorPreview.js +106 -0
- package/codeyam-cli/src/utils/editorPreview.js.map +1 -0
- 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 +96 -0
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -0
- 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 +347 -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/git.js +51 -0
- package/codeyam-cli/src/utils/git.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +28 -17
- 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/project.js +15 -5
- package/codeyam-cli/src/utils/project.js.map +1 -1
- package/codeyam-cli/src/utils/scenarioMarkers.js +134 -0
- package/codeyam-cli/src/utils/scenarioMarkers.js.map +1 -0
- package/codeyam-cli/src/utils/scenariosManifest.js +112 -0
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +46 -16
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/testRunner.js +1 -1
- package/codeyam-cli/src/utils/testRunner.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__/editorProxy.test.js +178 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/git.js +396 -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-0DY_NKil.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-audit-l0sNRNKZ.js +1 -0
- 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-load-commit-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/{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-Csi0_PMl.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor-BuT_Huj0.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-B7ztwLut.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-BF4oLwaE.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D5rYBT5x.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-CF164ouH.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-BkWJ_UNc.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-b0f1372e.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{memory-FweZHj5U.js → memory-Bl2rpw8u.js} +13 -10
- 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-DiRdBreB.js → root-B_X8HS1x.js} +18 -18
- 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-CrAK28Bc.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -0
- package/codeyam-cli/src/webserver/build/server/assets/{index-BzAbACSx.js → index-CbF6h3dj.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DRFwTJqO.js +367 -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 +383 -50
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
- package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +94 -4
- package/codeyam-cli/src/webserver/server.js +93 -12
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +65 -112
- 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/gitignore +15 -0
- package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/package.json +26 -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 +35 -0
- package/codeyam-cli/templates/editor-step-hook.py +95 -9
- package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -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 +37 -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 +112 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -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 +4 -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-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 +36 -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/{codeyam-dev-mode.md → skills/codeyam-dev-mode/SKILL.md} +2 -2
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +145 -0
- package/codeyam-cli/templates/{codeyam-memory.md → skills/codeyam-memory/SKILL.md} +215 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/deprecated-prompt.md +100 -0
- 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/holistic-analysis/misleading-api-prompt.md +117 -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/analyze-prompt.md +46 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
- package/package.json +15 -10
- package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +10 -4
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/index.js +4 -2
- package/packages/analyze/src/lib/asts/index.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +20 -0
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/packages/types/src/enums/ProjectFramework.js +2 -0
- package/packages/types/src/enums/ProjectFramework.js.map +1 -1
- package/scripts/npm-post-install.cjs +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/Terminal-CcG8YTLx.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-W_IGJ2Kd.js +0 -7
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-D6SEzMCu.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-BZB_H1w2.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-8daa4147.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/xterm-DMSzMhqy.js +0 -9
- package/codeyam-cli/src/webserver/build/server/assets/server-build-OdUocH6P.js +0 -362
- package/codeyam-cli/templates/codeyam-editor.md +0 -68
- package/scripts/finalize-analyzer.cjs +0 -13
- /package/codeyam-cli/templates/{codeyam-diagnose.md → commands/codeyam-diagnose.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-debug.md → skills/codeyam-debug/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-new-rule.md → skills/codeyam-new-rule/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-setup.md → skills/codeyam-setup/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-sim.md → skills/codeyam-sim/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-test.md → skills/codeyam-test/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-verify.md → skills/codeyam-verify/SKILL.md} +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev server process management utilities for the editor.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from inline logic in api.editor-dev-server.ts.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
/**
|
|
9
|
+
* Detect the package manager and start script for a project.
|
|
10
|
+
*
|
|
11
|
+
* Returns `{ command, args }` on success, or `{ error }` if the project
|
|
12
|
+
* lacks a runnable dev/start script or package.json.
|
|
13
|
+
*/
|
|
14
|
+
export function detectPackageManagerAndScript(projectRoot) {
|
|
15
|
+
const packageJsonPath = path.join(projectRoot, 'package.json');
|
|
16
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
17
|
+
return { error: 'No package.json found.' };
|
|
18
|
+
}
|
|
19
|
+
let command = 'npm';
|
|
20
|
+
let args = ['run', 'dev'];
|
|
21
|
+
try {
|
|
22
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
23
|
+
// Detect package manager from lockfile
|
|
24
|
+
if (fs.existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))) {
|
|
25
|
+
command = 'pnpm';
|
|
26
|
+
}
|
|
27
|
+
else if (fs.existsSync(path.join(projectRoot, 'yarn.lock'))) {
|
|
28
|
+
command = 'yarn';
|
|
29
|
+
}
|
|
30
|
+
else if (fs.existsSync(path.join(projectRoot, 'bun.lockb'))) {
|
|
31
|
+
command = 'bun';
|
|
32
|
+
}
|
|
33
|
+
// Check for dev or start script
|
|
34
|
+
if (!pkg.scripts?.dev) {
|
|
35
|
+
if (pkg.scripts?.start) {
|
|
36
|
+
args = ['run', 'start'];
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return { error: 'No "dev" or "start" script found in package.json.' };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Use defaults (npm run dev)
|
|
45
|
+
}
|
|
46
|
+
return { command, args };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the start command for the dev server.
|
|
50
|
+
* Reads the webapp's startCommand from .codeyam/config.json if available,
|
|
51
|
+
* falls back to detectPackageManagerAndScript otherwise.
|
|
52
|
+
* Substitutes $PORT in args and env values, and always provides PORT in env.
|
|
53
|
+
*/
|
|
54
|
+
export function resolveStartCommand(projectRoot, port) {
|
|
55
|
+
const portStr = port.toString();
|
|
56
|
+
const env = { PORT: portStr };
|
|
57
|
+
// Try to read startCommand from config
|
|
58
|
+
const configPath = path.join(projectRoot, '.codeyam', 'config.json');
|
|
59
|
+
if (fs.existsSync(configPath)) {
|
|
60
|
+
try {
|
|
61
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
62
|
+
const webapps = config.webapps || [];
|
|
63
|
+
const webapp = webapps[0];
|
|
64
|
+
if (webapp?.startCommand) {
|
|
65
|
+
const { command, args: rawArgs, env: cmdEnv } = webapp.startCommand;
|
|
66
|
+
// Substitute $PORT in args
|
|
67
|
+
const args = (rawArgs || []).map((arg) => arg.includes('$PORT') ? arg.replace(/\$PORT/g, portStr) : arg);
|
|
68
|
+
// Substitute $PORT in env values
|
|
69
|
+
if (cmdEnv) {
|
|
70
|
+
for (const [key, value] of Object.entries(cmdEnv)) {
|
|
71
|
+
if (typeof value === 'string' && value.includes('$PORT')) {
|
|
72
|
+
env[key] = value.replace(/\$PORT/g, portStr);
|
|
73
|
+
}
|
|
74
|
+
else if (typeof value === 'string') {
|
|
75
|
+
env[key] = value;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { command, args, env };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Fall through to detection
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Fall back to auto-detection
|
|
87
|
+
const pmResult = detectPackageManagerAndScript(projectRoot);
|
|
88
|
+
if ('error' in pmResult) {
|
|
89
|
+
return pmResult;
|
|
90
|
+
}
|
|
91
|
+
return { command: pmResult.command, args: pmResult.args, env };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Compute the port assignments for the editor proxy and dev server.
|
|
95
|
+
* Proxy sits at codeyamPort+1 (where the preview iframe connects).
|
|
96
|
+
* Dev server sits at codeyamPort+2 (behind the proxy).
|
|
97
|
+
*/
|
|
98
|
+
export function computeEditorPorts(codeyamPort) {
|
|
99
|
+
return {
|
|
100
|
+
proxyPort: codeyamPort + 1,
|
|
101
|
+
devServerPort: codeyamPort + 2,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** URL patterns matched in dev server output to detect the running URL. */
|
|
105
|
+
const URL_PATTERNS = [
|
|
106
|
+
/Local:\s+(https?:\/\/[^\s]+)/, // Vite
|
|
107
|
+
/Ready on\s+(https?:\/\/[^\s]+)/i, // Next.js
|
|
108
|
+
/started at\s+(https?:\/\/[^\s]+)/i, // Remix
|
|
109
|
+
/listening on\s+(https?:\/\/[^\s]+)/i, // Generic
|
|
110
|
+
/waiting on\s+(https?:\/\/[^\s]+)/i, // Expo
|
|
111
|
+
/http:\/\/localhost:\d+/, // Bare URL
|
|
112
|
+
];
|
|
113
|
+
/**
|
|
114
|
+
* Extract a dev server URL from process output text.
|
|
115
|
+
* Matches common patterns from Vite, Next.js, Remix, and generic servers.
|
|
116
|
+
* Strips ANSI codes from the result.
|
|
117
|
+
* Returns null if no URL is found.
|
|
118
|
+
*/
|
|
119
|
+
export function extractDevServerUrl(text) {
|
|
120
|
+
for (const pattern of URL_PATTERNS) {
|
|
121
|
+
const match = text.match(pattern);
|
|
122
|
+
if (match) {
|
|
123
|
+
const url = match[1] || match[0];
|
|
124
|
+
return stripAnsiCodes(url).trim();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Remove ANSI escape sequences from text.
|
|
131
|
+
*/
|
|
132
|
+
export function stripAnsiCodes(text) {
|
|
133
|
+
return text.replace(/\x1b\[[0-9;]*m/g, '');
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Read the dev server URL from the global state shared with api.editor-dev-server.
|
|
137
|
+
* Returns the URL when the dev server is running, null otherwise.
|
|
138
|
+
*/
|
|
139
|
+
export function getEditorDevServerUrl() {
|
|
140
|
+
const server = globalThis.__codeyam_editor_dev_server__;
|
|
141
|
+
if (server && server.status === 'running' && server.url) {
|
|
142
|
+
return server.url;
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Poll a port to detect if a dev server is responding.
|
|
148
|
+
* Used as a fallback when stdout-based URL detection doesn't trigger.
|
|
149
|
+
* Returns the URL if the server responds, null otherwise.
|
|
150
|
+
*/
|
|
151
|
+
export async function pollForDevServer(port, options = {}) {
|
|
152
|
+
const { intervalMs = 2000, maxAttempts = 15 } = options;
|
|
153
|
+
const url = `http://localhost:${port}`;
|
|
154
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
155
|
+
try {
|
|
156
|
+
const response = await fetch(url, {
|
|
157
|
+
method: 'HEAD',
|
|
158
|
+
signal: AbortSignal.timeout(2000),
|
|
159
|
+
});
|
|
160
|
+
if (response.ok || response.status === 304) {
|
|
161
|
+
return url;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Server not ready yet
|
|
166
|
+
}
|
|
167
|
+
if (attempt < maxAttempts - 1) {
|
|
168
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Determine what action to take when the dev server process exits.
|
|
175
|
+
*
|
|
176
|
+
* - Quick failure (< 10s) on first attempt → retry
|
|
177
|
+
* - Non-zero exit after retry or after long uptime → error
|
|
178
|
+
* - Zero or null exit → stopped normally
|
|
179
|
+
*/
|
|
180
|
+
export function determineProcessExitState(params) {
|
|
181
|
+
const { exitCode, uptime, retryCount } = params;
|
|
182
|
+
const quickFailure = uptime < 10000;
|
|
183
|
+
if (exitCode !== 0 && exitCode !== null && quickFailure && retryCount === 0) {
|
|
184
|
+
return { action: 'retry' };
|
|
185
|
+
}
|
|
186
|
+
else if (exitCode !== 0 && exitCode !== null) {
|
|
187
|
+
return { action: 'error' };
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
return { action: 'stopped' };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=editorDevServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorDevServer.js","sourceRoot":"","sources":["../../../../src/utils/editorDevServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestration wrapper for computing entity change status in the editor.
|
|
3
|
+
*
|
|
4
|
+
* Combines: detectFirstFeature + getGitStatusForProject + buildChangedFilesMap +
|
|
5
|
+
* scanPageFilePaths + initializeEnvironment + loadEntities +
|
|
6
|
+
* buildEntityInfosFromScenarios + buildEntityInfosFromGlossary + computeEntityChangeStatus
|
|
7
|
+
*
|
|
8
|
+
* Previously duplicated across editor.tsx, api.editor-scenarios.ts, and
|
|
9
|
+
* api.editor-journal-entry.ts (~80 lines each).
|
|
10
|
+
*/
|
|
11
|
+
import { getGitStatusForProject } from "../webserver/app/lib/git.js";
|
|
12
|
+
import { initializeEnvironment } from "./database.js";
|
|
13
|
+
import { loadEntities } from "../../../packages/database/index.js";
|
|
14
|
+
import { detectFirstFeature, scanPageFilePaths, } from "./entityChangeStatus.server.js";
|
|
15
|
+
import { buildChangedFilesMap, buildEntityInfosFromScenarios, buildEntityInfosFromGlossary, computeEntityChangeStatus, } from "./entityChangeStatus.js";
|
|
16
|
+
export async function computeEntityChangeStatusForEditor(params) {
|
|
17
|
+
const { projectRoot, scenarioInputs, glossaryInputs } = params;
|
|
18
|
+
const pageFilePaths = scanPageFilePaths(projectRoot);
|
|
19
|
+
const pageEntityNames = new Set(Object.keys(pageFilePaths));
|
|
20
|
+
const gitFiles = getGitStatusForProject();
|
|
21
|
+
if (gitFiles.length === 0) {
|
|
22
|
+
return { entityChangeStatus: {}, pageEntityNames };
|
|
23
|
+
}
|
|
24
|
+
const isFirstFeature = detectFirstFeature(projectRoot);
|
|
25
|
+
const changedFiles = buildChangedFilesMap(gitFiles, isFirstFeature);
|
|
26
|
+
let entitiesWithMetadata = [];
|
|
27
|
+
try {
|
|
28
|
+
await initializeEnvironment();
|
|
29
|
+
entitiesWithMetadata = (await loadEntities({})) || [];
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Non-fatal — just won't have importedBy data
|
|
33
|
+
}
|
|
34
|
+
const scenarioEntityInfos = buildEntityInfosFromScenarios(scenarioInputs, pageFilePaths, entitiesWithMetadata);
|
|
35
|
+
let entityInfos = scenarioEntityInfos;
|
|
36
|
+
if (glossaryInputs && glossaryInputs.length > 0) {
|
|
37
|
+
const scenarioNames = new Set(scenarioEntityInfos.map((e) => e.name));
|
|
38
|
+
const glossaryEntityInfos = buildEntityInfosFromGlossary(glossaryInputs, scenarioNames);
|
|
39
|
+
entityInfos = [...scenarioEntityInfos, ...glossaryEntityInfos];
|
|
40
|
+
}
|
|
41
|
+
const entityChangeStatus = computeEntityChangeStatus(changedFiles, entityInfos);
|
|
42
|
+
return { entityChangeStatus, pageEntityNames };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=editorEntityChangeStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorEntityChangeStatus.js","sourceRoot":"","sources":["../../../../src/utils/editorEntityChangeStatus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,yBAAyB,GAI1B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,MAIxD;IAIC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAC/D,MAAM,aAAa,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAEpE,IAAI,oBAAoB,GAAU,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,qBAAqB,EAAE,CAAC;QAC9B,oBAAoB,GAAG,CAAC,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IAED,MAAM,mBAAmB,GAAG,6BAA6B,CACvD,cAAc,EACd,aAAa,EACb,oBAAoB,CACrB,CAAC;IAEF,IAAI,WAAW,GAAG,mBAAmB,CAAC;IAEtC,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,MAAM,mBAAmB,GAAG,4BAA4B,CACtD,cAAc,EACd,aAAa,CACd,CAAC;QACF,WAAW,GAAG,CAAC,GAAG,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,kBAAkB,GAAG,yBAAyB,CAClD,YAAY,EACZ,WAAW,CACZ,CAAC;IACF,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract and verify image URLs from HTML pages.
|
|
3
|
+
*
|
|
4
|
+
* Used by `codeyam editor verify-images` to deterministically check
|
|
5
|
+
* that all image references in rendered pages return HTTP 200.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* Extract all image URLs from an HTML string.
|
|
11
|
+
*
|
|
12
|
+
* Finds URLs from:
|
|
13
|
+
* 1. <img src="..."> attributes
|
|
14
|
+
* 2. <img srcset="..."> attributes
|
|
15
|
+
* 3. URLs in inline JSON/script data that look like image references
|
|
16
|
+
* (common image hosts, or URLs ending in image extensions)
|
|
17
|
+
*/
|
|
18
|
+
export function extractImageUrls(html) {
|
|
19
|
+
const urls = new Set();
|
|
20
|
+
// 1. <img src="...">
|
|
21
|
+
const srcRegex = /<img\b[^>]*\bsrc=["']([^"']+)["'][^>]*>/gi;
|
|
22
|
+
let match;
|
|
23
|
+
while ((match = srcRegex.exec(html)) !== null) {
|
|
24
|
+
const url = match[1].trim();
|
|
25
|
+
if (url && !url.startsWith('data:')) {
|
|
26
|
+
urls.add(url);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// 2. <img srcset="...">
|
|
30
|
+
const srcsetRegex = /<img\b[^>]*\bsrcset=["']([^"']+)["'][^>]*>/gi;
|
|
31
|
+
while ((match = srcsetRegex.exec(html)) !== null) {
|
|
32
|
+
const srcset = match[1];
|
|
33
|
+
// srcset format: "url1 1x, url2 2x" or "url1 300w, url2 600w"
|
|
34
|
+
for (const entry of srcset.split(',')) {
|
|
35
|
+
const url = entry.trim().split(/\s+/)[0];
|
|
36
|
+
if (url && !url.startsWith('data:')) {
|
|
37
|
+
urls.add(url);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// 3. URLs in JSON/inline data — match quoted URLs that are likely images
|
|
42
|
+
// Covers: known image hosts (unsplash, pravatar, etc.) and URLs with image extensions
|
|
43
|
+
const IMAGE_EXTENSIONS = /\.(jpg|jpeg|png|gif|svg|webp|avif|ico)(\?[^"']*)?$/i;
|
|
44
|
+
const IMAGE_HOSTS = /\b(unsplash\.com|pravatar\.cc|cloudinary\.com|imgix\.net|imgur\.com)\b/i;
|
|
45
|
+
const jsonUrlRegex = /"(https?:\/\/[^"]+)"/g;
|
|
46
|
+
while ((match = jsonUrlRegex.exec(html)) !== null) {
|
|
47
|
+
const url = match[1];
|
|
48
|
+
if (!urls.has(url) &&
|
|
49
|
+
(IMAGE_EXTENSIONS.test(url) || IMAGE_HOSTS.test(url))) {
|
|
50
|
+
urls.add(url);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return [...urls];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolve a potentially relative image URL against a base URL.
|
|
57
|
+
*/
|
|
58
|
+
export function resolveImageUrl(url, baseUrl) {
|
|
59
|
+
if (url.startsWith('http://') || url.startsWith('https://')) {
|
|
60
|
+
return url;
|
|
61
|
+
}
|
|
62
|
+
if (url.startsWith('//')) {
|
|
63
|
+
const protocol = new URL(baseUrl).protocol;
|
|
64
|
+
return `${protocol}${url}`;
|
|
65
|
+
}
|
|
66
|
+
const base = new URL(baseUrl);
|
|
67
|
+
if (url.startsWith('/')) {
|
|
68
|
+
return `${base.origin}${url}`;
|
|
69
|
+
}
|
|
70
|
+
// Relative path — resolve against base origin
|
|
71
|
+
return `${base.origin}/${url}`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Parse the JSON argument for verify-images into paths and explicit image URLs.
|
|
75
|
+
* Claude can pass known image URLs directly via `imageUrls` so they get verified
|
|
76
|
+
* without needing to be discoverable in HTML or scenario files.
|
|
77
|
+
*
|
|
78
|
+
* Example: `{"paths":["/"], "imageUrls":["https://images.unsplash.com/photo-123"]}`
|
|
79
|
+
*/
|
|
80
|
+
export function parseVerifyImagesInput(jsonArg) {
|
|
81
|
+
if (!jsonArg)
|
|
82
|
+
return { paths: ['/'], imageUrls: [] };
|
|
83
|
+
const parsed = JSON.parse(jsonArg);
|
|
84
|
+
const paths = Array.isArray(parsed.paths) && parsed.paths.length > 0
|
|
85
|
+
? parsed.paths
|
|
86
|
+
: ['/'];
|
|
87
|
+
const imageUrls = Array.isArray(parsed.imageUrls) ? parsed.imageUrls : [];
|
|
88
|
+
return { paths, imageUrls };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build a structured report from image verification results.
|
|
92
|
+
*/
|
|
93
|
+
export function buildVerifyImagesReport(input) {
|
|
94
|
+
const failures = input.results
|
|
95
|
+
.filter((r) => !r.ok)
|
|
96
|
+
.map((f) => ({ url: f.url, status: f.status, error: f.error }));
|
|
97
|
+
const report = {
|
|
98
|
+
pagesChecked: input.pagesChecked,
|
|
99
|
+
imagesFound: input.imageUrls.length,
|
|
100
|
+
imagesVerified: input.results.filter((r) => r.ok).length,
|
|
101
|
+
failures,
|
|
102
|
+
};
|
|
103
|
+
if (input.scenarioFilesScanned !== undefined) {
|
|
104
|
+
report.scenarioFilesScanned = input.scenarioFilesScanned;
|
|
105
|
+
}
|
|
106
|
+
return report;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Extract image URLs from scenario mock data files (`.codeyam/editor-scenarios/*.json`).
|
|
110
|
+
*
|
|
111
|
+
* Client-rendered pages load image URLs from mock API data at runtime,
|
|
112
|
+
* so these URLs are invisible to the HTML-only scan. This function reads
|
|
113
|
+
* the raw JSON text and reuses `extractImageUrls()` to find them.
|
|
114
|
+
*/
|
|
115
|
+
export function extractImageUrlsFromScenarioFiles(scenariosDir) {
|
|
116
|
+
if (!fs.existsSync(scenariosDir)) {
|
|
117
|
+
return { urls: [], filesScanned: 0 };
|
|
118
|
+
}
|
|
119
|
+
const allUrls = new Set();
|
|
120
|
+
let filesScanned = 0;
|
|
121
|
+
const entries = fs.readdirSync(scenariosDir, { withFileTypes: true });
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
if (entry.isDirectory() || !entry.name.endsWith('.json')) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const content = fs.readFileSync(path.join(scenariosDir, entry.name), 'utf-8');
|
|
127
|
+
for (const url of extractImageUrls(content)) {
|
|
128
|
+
allUrls.add(url);
|
|
129
|
+
}
|
|
130
|
+
filesScanned++;
|
|
131
|
+
}
|
|
132
|
+
return { urls: [...allUrls], filesScanned };
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Verify that each URL returns HTTP 200.
|
|
136
|
+
*/
|
|
137
|
+
export async function verifyImageUrls(urls) {
|
|
138
|
+
const results = [];
|
|
139
|
+
for (const url of urls) {
|
|
140
|
+
try {
|
|
141
|
+
const res = await fetch(url, { method: 'HEAD' });
|
|
142
|
+
results.push({ url, status: res.status, ok: res.ok });
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
results.push({
|
|
146
|
+
url,
|
|
147
|
+
status: null,
|
|
148
|
+
ok: false,
|
|
149
|
+
error: err.message,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return results;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=editorImageVerifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorImageVerifier.js","sourceRoot":"","sources":["../../../../src/utils/editorImageVerifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Journal data transformation utilities for the editor.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from inline logic in EditorJournal.tsx, api.editor-journal-entry.ts,
|
|
5
|
+
* and api.editor-journal-update.ts.
|
|
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
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Group journal entries by date, reversing so newest entries come first.
|
|
71
|
+
* Returns a Map preserving insertion order (newest date first).
|
|
72
|
+
*/
|
|
73
|
+
export function groupEntriesByDate(entries) {
|
|
74
|
+
const grouped = new Map();
|
|
75
|
+
for (const entry of [...entries].reverse()) {
|
|
76
|
+
const existing = grouped.get(entry.date) || [];
|
|
77
|
+
existing.push(entry);
|
|
78
|
+
grouped.set(entry.date, existing);
|
|
79
|
+
}
|
|
80
|
+
return grouped;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Group scenario screenshots by component name.
|
|
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".
|
|
87
|
+
* Sorted with "App" first, then alphabetical.
|
|
88
|
+
*/
|
|
89
|
+
export function groupScreenshotsByComponent(screenshots) {
|
|
90
|
+
const groups = new Map();
|
|
91
|
+
for (const ss of screenshots) {
|
|
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
|
+
}
|
|
105
|
+
const existing = groups.get(group) || [];
|
|
106
|
+
existing.push(ss);
|
|
107
|
+
groups.set(group, existing);
|
|
108
|
+
}
|
|
109
|
+
return [...groups.entries()].sort(([a], [b]) => {
|
|
110
|
+
if (a === 'App')
|
|
111
|
+
return -1;
|
|
112
|
+
if (b === 'App')
|
|
113
|
+
return 1;
|
|
114
|
+
return a.localeCompare(b);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate a sanitized filename for a journal screenshot.
|
|
119
|
+
* Format: `{ISO timestamp with colons replaced}_{sanitized name}.png`
|
|
120
|
+
*/
|
|
121
|
+
export function generateJournalScreenshotFilename(name, timestamp) {
|
|
122
|
+
const safeName = name.replace(/[^a-zA-Z0-9_\-]/g, '_');
|
|
123
|
+
const isoTimestamp = timestamp
|
|
124
|
+
.toISOString()
|
|
125
|
+
.replace(/:/g, '-')
|
|
126
|
+
.replace(/\.\d+Z$/, '');
|
|
127
|
+
return `${isoTimestamp}_${safeName}.png`;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build markdown lines array for a journal entry.
|
|
131
|
+
* Returns the joined string ready to append to a daily markdown file.
|
|
132
|
+
*/
|
|
133
|
+
export function buildJournalMarkdown(params) {
|
|
134
|
+
const { title, timeStr, type, description, allScenarioNames, screenshot, scenarioScreenshots, commitSha, commitMessage, featureName, userPrompt, } = params;
|
|
135
|
+
const mdLines = [
|
|
136
|
+
'',
|
|
137
|
+
'---',
|
|
138
|
+
'',
|
|
139
|
+
`### ${title}`,
|
|
140
|
+
`**Time:** ${timeStr}`,
|
|
141
|
+
`**Type:** ${type}`,
|
|
142
|
+
];
|
|
143
|
+
if (featureName) {
|
|
144
|
+
mdLines.push(`**Feature:** ${featureName}`);
|
|
145
|
+
}
|
|
146
|
+
if (userPrompt) {
|
|
147
|
+
mdLines.push(`**Prompt:** ${userPrompt}`);
|
|
148
|
+
}
|
|
149
|
+
if (allScenarioNames.length > 0) {
|
|
150
|
+
mdLines.push(`**Scenarios:** ${allScenarioNames.join(', ')}`);
|
|
151
|
+
}
|
|
152
|
+
mdLines.push('');
|
|
153
|
+
mdLines.push(description);
|
|
154
|
+
if (screenshot) {
|
|
155
|
+
mdLines.push('');
|
|
156
|
+
mdLines.push(``);
|
|
157
|
+
}
|
|
158
|
+
if (scenarioScreenshots.length > 0) {
|
|
159
|
+
mdLines.push('');
|
|
160
|
+
mdLines.push('**Scenario Screenshots:**');
|
|
161
|
+
for (const ss of scenarioScreenshots) {
|
|
162
|
+
mdLines.push('');
|
|
163
|
+
mdLines.push(``);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (commitSha && commitMessage) {
|
|
167
|
+
mdLines.push('');
|
|
168
|
+
mdLines.push(`**Commit:** \`${commitSha}\` — ${commitMessage}`);
|
|
169
|
+
}
|
|
170
|
+
mdLines.push('');
|
|
171
|
+
return mdLines.join('\n');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Find a journal entry's index by its time field.
|
|
175
|
+
* Returns -1 if not found.
|
|
176
|
+
*/
|
|
177
|
+
export function findJournalEntryByTime(entries, time) {
|
|
178
|
+
return entries.findIndex((e) => e.time === time);
|
|
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
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Apply non-undefined updates to a journal entry.
|
|
189
|
+
* Returns the mutated entry (same reference).
|
|
190
|
+
*/
|
|
191
|
+
export function applyJournalEntryUpdates(entry, updates) {
|
|
192
|
+
if (updates.commitSha !== undefined) {
|
|
193
|
+
entry.commitSha = updates.commitSha;
|
|
194
|
+
}
|
|
195
|
+
if (updates.commitMessage !== undefined) {
|
|
196
|
+
entry.commitMessage = updates.commitMessage;
|
|
197
|
+
}
|
|
198
|
+
if (updates.description !== undefined) {
|
|
199
|
+
entry.description = updates.description;
|
|
200
|
+
}
|
|
201
|
+
if (updates.scenarios !== undefined) {
|
|
202
|
+
entry.scenarios = updates.scenarios;
|
|
203
|
+
}
|
|
204
|
+
if (updates.scenarioScreenshots !== undefined) {
|
|
205
|
+
entry.scenarioScreenshots = updates.scenarioScreenshots;
|
|
206
|
+
}
|
|
207
|
+
return entry;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Insert a commit line into markdown content before the next section separator (---).
|
|
211
|
+
* Finds the entry by its title marker (### Title), then inserts before the next `\n---\n`.
|
|
212
|
+
* Returns the modified content, or null if the title was not found.
|
|
213
|
+
*/
|
|
214
|
+
export function insertCommitIntoMarkdown(content, title, commitSha, commitMessage) {
|
|
215
|
+
const commitLine = `\n**Commit:** \`${commitSha}\` — ${commitMessage || 'no message'}\n`;
|
|
216
|
+
const titleMarker = `### ${title}`;
|
|
217
|
+
const titlePos = content.lastIndexOf(titleMarker);
|
|
218
|
+
if (titlePos === -1) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
const nextSection = content.indexOf('\n---\n', titlePos + 1);
|
|
222
|
+
const insertPos = nextSection !== -1 ? nextSection : content.length;
|
|
223
|
+
return content.slice(0, insertPos) + commitLine + content.slice(insertPos);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=editorJournal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorJournal.js","sourceRoot":"","sources":["../../../../src/utils/editorJournal.ts"],"names":[],"mappings":"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"}
|