@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
|
@@ -22,6 +22,10 @@ function detectFrameworkFromPackageJson(packageJsonPath) {
|
|
|
22
22
|
return ProjectFramework.Remix;
|
|
23
23
|
if (deps['react-scripts'])
|
|
24
24
|
return ProjectFramework.CRA;
|
|
25
|
+
if (deps.expo)
|
|
26
|
+
return ProjectFramework.Expo;
|
|
27
|
+
if (deps.vite)
|
|
28
|
+
return ProjectFramework.Vite;
|
|
25
29
|
return ProjectFramework.Unknown;
|
|
26
30
|
}
|
|
27
31
|
catch (error) {
|
|
@@ -98,6 +102,7 @@ function isWebAppDirectory(dirPath) {
|
|
|
98
102
|
'react-scripts',
|
|
99
103
|
'webpack-dev-server',
|
|
100
104
|
'parcel',
|
|
105
|
+
'expo',
|
|
101
106
|
];
|
|
102
107
|
const possibleStartAndBuildScripts = Object.keys(scripts).filter((script) => ['dev', 'start', 'serve', 'build'].some((keyword) => script.includes(keyword)));
|
|
103
108
|
const scriptsWithWebappPattern = possibleStartAndBuildScripts.filter((scriptName) => webappPatterns.some((pattern) => scripts[scriptName].includes(pattern)));
|
|
@@ -239,6 +244,22 @@ export function getDefaultStartScript(webappPath, projectRoot) {
|
|
|
239
244
|
return null;
|
|
240
245
|
}
|
|
241
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Merge detected webapps with existing config webapps.
|
|
249
|
+
* Detected webapps take precedence, but manually-configured webapps
|
|
250
|
+
* (those with a startCommand that aren't in the detected set) are preserved.
|
|
251
|
+
*/
|
|
252
|
+
export function mergeWebApps(detected, existing) {
|
|
253
|
+
const detectedPaths = new Set(detected.map((w) => w.path));
|
|
254
|
+
const merged = [...detected];
|
|
255
|
+
for (const existingWebapp of existing) {
|
|
256
|
+
if (!detectedPaths.has(existingWebapp.path)) {
|
|
257
|
+
// Preserve manually-configured webapps not found by detection
|
|
258
|
+
merged.push(existingWebapp);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return merged;
|
|
262
|
+
}
|
|
242
263
|
/**
|
|
243
264
|
* Find which webapp a component belongs to based on its file path
|
|
244
265
|
* Returns the webapp that contains the component, or the first webapp as fallback
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webappDetection.js","sourceRoot":"","sources":["../../../../src/utils/webappDetection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAU,MAAM,gBAAgB,CAAC;AAE1D;;GAEG;AACH,SAAS,8BAA8B,CACrC,eAAuB;IAEvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,gBAAgB,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG;YACX,GAAG,WAAW,CAAC,YAAY;YAC3B,GAAG,WAAW,CAAC,eAAe;SAC/B,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC;QAC5C,IACE,IAAI,CAAC,iBAAiB,CAAC;YACvB,IAAI,CAAC,kBAAkB,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC;YAEpB,OAAO,gBAAgB,CAAC,KAAK,CAAC;QAChC,IAAI,IAAI,CAAC,eAAe,CAAC;YAAE,OAAO,gBAAgB,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"webappDetection.js","sourceRoot":"","sources":["../../../../src/utils/webappDetection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import http from 'http';
|
|
2
|
+
describe('editorProxy', () => {
|
|
3
|
+
describe('normalizeTargetUrl', () => {
|
|
4
|
+
it('should leave localhost as-is (no longer normalizes to 127.0.0.1)', () => {
|
|
5
|
+
const { normalizeTargetUrl } = require('../editorProxy');
|
|
6
|
+
expect(normalizeTargetUrl('http://localhost:3112')).toBe('http://localhost:3112');
|
|
7
|
+
});
|
|
8
|
+
it('should leave 127.0.0.1 unchanged', () => {
|
|
9
|
+
const { normalizeTargetUrl } = require('../editorProxy');
|
|
10
|
+
expect(normalizeTargetUrl('http://127.0.0.1:3112')).toBe('http://127.0.0.1:3112');
|
|
11
|
+
});
|
|
12
|
+
it('should leave other hostnames unchanged', () => {
|
|
13
|
+
const { normalizeTargetUrl } = require('../editorProxy');
|
|
14
|
+
expect(normalizeTargetUrl('http://myhost:3112')).toBe('http://myhost:3112');
|
|
15
|
+
});
|
|
16
|
+
it('should strip trailing slash', () => {
|
|
17
|
+
const { normalizeTargetUrl } = require('../editorProxy');
|
|
18
|
+
expect(normalizeTargetUrl('http://localhost:3112/')).toBe('http://localhost:3112');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('resolveLoopbackAddress', () => {
|
|
22
|
+
let server;
|
|
23
|
+
afterEach((done) => {
|
|
24
|
+
if (server?.listening) {
|
|
25
|
+
server.close(done);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
done();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
it('should resolve to 127.0.0.1 when server binds to IPv4', async () => {
|
|
32
|
+
const { resolveLoopbackAddress } = require('../editorProxy');
|
|
33
|
+
server = http.createServer((_req, res) => res.end('ok'));
|
|
34
|
+
await new Promise((resolve) => server.listen(0, '127.0.0.1', () => resolve()));
|
|
35
|
+
const port = server.address().port;
|
|
36
|
+
const host = await resolveLoopbackAddress(port);
|
|
37
|
+
expect(host).toBe('127.0.0.1');
|
|
38
|
+
});
|
|
39
|
+
it('should resolve to ::1 when server binds to IPv6 only', async () => {
|
|
40
|
+
const { resolveLoopbackAddress } = require('../editorProxy');
|
|
41
|
+
server = http.createServer((_req, res) => res.end('ok'));
|
|
42
|
+
await new Promise((resolve) => server.listen(0, '::1', () => resolve()));
|
|
43
|
+
const port = server.address().port;
|
|
44
|
+
const host = await resolveLoopbackAddress(port);
|
|
45
|
+
expect(host).toBe('::1');
|
|
46
|
+
});
|
|
47
|
+
it('should return null when no server is listening', async () => {
|
|
48
|
+
const { resolveLoopbackAddress } = require('../editorProxy');
|
|
49
|
+
const host = await resolveLoopbackAddress(19876);
|
|
50
|
+
expect(host).toBeNull();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('proxy forwarding uses 127.0.0.1', () => {
|
|
54
|
+
let targetServer;
|
|
55
|
+
let targetPort;
|
|
56
|
+
afterEach((done) => {
|
|
57
|
+
if (targetServer?.listening) {
|
|
58
|
+
targetServer.close(done);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
done();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
it('should forward requests to target and return correct response', async () => {
|
|
65
|
+
const { startEditorProxy, stopEditorProxy } = require('../editorProxy');
|
|
66
|
+
// Start a target server that returns 200
|
|
67
|
+
targetServer = http.createServer((_req, res) => {
|
|
68
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
69
|
+
res.end('OK from target');
|
|
70
|
+
});
|
|
71
|
+
await new Promise((resolve) => targetServer.listen(0, '127.0.0.1', () => resolve()));
|
|
72
|
+
targetPort = targetServer.address().port;
|
|
73
|
+
// Start proxy pointing to the target using localhost URL
|
|
74
|
+
const result = await startEditorProxy({
|
|
75
|
+
port: 0, // let OS pick
|
|
76
|
+
targetUrl: `http://localhost:${targetPort}`,
|
|
77
|
+
});
|
|
78
|
+
expect(result).not.toBeNull();
|
|
79
|
+
// Make a request through the proxy
|
|
80
|
+
const response = await fetch(`http://127.0.0.1:${result.port}/`);
|
|
81
|
+
expect(response.status).toBe(200);
|
|
82
|
+
const body = await response.text();
|
|
83
|
+
expect(body).toBe('OK from target');
|
|
84
|
+
await stopEditorProxy();
|
|
85
|
+
});
|
|
86
|
+
it('should log when target returns non-2xx status', async () => {
|
|
87
|
+
const { startEditorProxy, stopEditorProxy } = require('../editorProxy');
|
|
88
|
+
// Start a target that returns 404
|
|
89
|
+
targetServer = http.createServer((_req, res) => {
|
|
90
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
91
|
+
res.end('Not Found');
|
|
92
|
+
});
|
|
93
|
+
await new Promise((resolve) => targetServer.listen(0, '127.0.0.1', () => resolve()));
|
|
94
|
+
targetPort = targetServer.address().port;
|
|
95
|
+
const warnSpy = jest.spyOn(console, 'warn').mockImplementation();
|
|
96
|
+
const result = await startEditorProxy({
|
|
97
|
+
port: 0,
|
|
98
|
+
targetUrl: `http://localhost:${targetPort}`,
|
|
99
|
+
});
|
|
100
|
+
const response = await fetch(`http://127.0.0.1:${result.port}/test-path`);
|
|
101
|
+
expect(response.status).toBe(404);
|
|
102
|
+
// Verify a warning was logged about the non-2xx response
|
|
103
|
+
expect(warnSpy.mock.calls.some((call) => String(call[0]).includes('[editorProxy]') &&
|
|
104
|
+
String(call[0]).includes('404') &&
|
|
105
|
+
String(call[0]).includes('/test-path'))).toBe(true);
|
|
106
|
+
warnSpy.mockRestore();
|
|
107
|
+
await stopEditorProxy();
|
|
108
|
+
});
|
|
109
|
+
it('should verify forwarding works after start via self-test', async () => {
|
|
110
|
+
const { startEditorProxy, stopEditorProxy, verifyProxyForwarding, } = require('../editorProxy');
|
|
111
|
+
// Start a target that returns 200
|
|
112
|
+
targetServer = http.createServer((_req, res) => {
|
|
113
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
114
|
+
res.end('healthy');
|
|
115
|
+
});
|
|
116
|
+
await new Promise((resolve) => targetServer.listen(0, '127.0.0.1', () => resolve()));
|
|
117
|
+
targetPort = targetServer.address().port;
|
|
118
|
+
const result = await startEditorProxy({
|
|
119
|
+
port: 0,
|
|
120
|
+
targetUrl: `http://localhost:${targetPort}`,
|
|
121
|
+
});
|
|
122
|
+
const verified = await verifyProxyForwarding();
|
|
123
|
+
expect(verified).toBe(true);
|
|
124
|
+
await stopEditorProxy();
|
|
125
|
+
});
|
|
126
|
+
it('should report verification failure when target is down', async () => {
|
|
127
|
+
const { startEditorProxy, stopEditorProxy, verifyProxyForwarding, } = require('../editorProxy');
|
|
128
|
+
const result = await startEditorProxy({
|
|
129
|
+
port: 0,
|
|
130
|
+
targetUrl: 'http://127.0.0.1:19876',
|
|
131
|
+
});
|
|
132
|
+
const verified = await verifyProxyForwarding();
|
|
133
|
+
expect(verified).toBe(false);
|
|
134
|
+
await stopEditorProxy();
|
|
135
|
+
});
|
|
136
|
+
it('should return false for verification when proxy is not running', async () => {
|
|
137
|
+
const { verifyProxyForwarding, stopEditorProxy, } = require('../editorProxy');
|
|
138
|
+
await stopEditorProxy();
|
|
139
|
+
const verified = await verifyProxyForwarding();
|
|
140
|
+
expect(verified).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
it('should return 502 when target is unreachable', async () => {
|
|
143
|
+
const { startEditorProxy, stopEditorProxy } = require('../editorProxy');
|
|
144
|
+
// Start proxy pointing to a port with nothing listening
|
|
145
|
+
const result = await startEditorProxy({
|
|
146
|
+
port: 0,
|
|
147
|
+
targetUrl: 'http://localhost:19876',
|
|
148
|
+
});
|
|
149
|
+
expect(result).not.toBeNull();
|
|
150
|
+
const response = await fetch(`http://127.0.0.1:${result.port}/`);
|
|
151
|
+
expect(response.status).toBe(502);
|
|
152
|
+
await stopEditorProxy();
|
|
153
|
+
});
|
|
154
|
+
it('should forward requests to an IPv6-only target server', async () => {
|
|
155
|
+
const { startEditorProxy, stopEditorProxy } = require('../editorProxy');
|
|
156
|
+
// Start a target server bound to IPv6 only (::1) — this is what Vite 6 does on macOS
|
|
157
|
+
targetServer = http.createServer((_req, res) => {
|
|
158
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
159
|
+
res.end('OK from IPv6 target');
|
|
160
|
+
});
|
|
161
|
+
await new Promise((resolve) => targetServer.listen(0, '::1', () => resolve()));
|
|
162
|
+
targetPort = targetServer.address().port;
|
|
163
|
+
// Start proxy with a localhost URL (simulating Vite's "Local: http://localhost:PORT")
|
|
164
|
+
const result = await startEditorProxy({
|
|
165
|
+
port: 0,
|
|
166
|
+
targetUrl: `http://localhost:${targetPort}`,
|
|
167
|
+
});
|
|
168
|
+
expect(result).not.toBeNull();
|
|
169
|
+
// The proxy should successfully forward to the IPv6-only target
|
|
170
|
+
const response = await fetch(`http://127.0.0.1:${result.port}/`);
|
|
171
|
+
expect(response.status).toBe(200);
|
|
172
|
+
const body = await response.text();
|
|
173
|
+
expect(body).toBe('OK from IPv6 target');
|
|
174
|
+
await stopEditorProxy();
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=editorProxy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorProxy.test.js","sourceRoot":"","sources":["../../../../../src/webserver/__tests__/editorProxy.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACzD,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CACtD,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACzD,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CACtD,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACzD,MAAM,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CACnD,oBAAoB,CACrB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACzD,MAAM,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CACvD,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,IAAI,MAAmB,CAAC;QAExB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE7D,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAC/C,CAAC;YACF,MAAM,IAAI,GAAI,MAAM,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAE5C,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE7D,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACzC,CAAC;YACF,MAAM,IAAI,GAAI,MAAM,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAE5C,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE7D,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,IAAI,YAAyB,CAAC;QAC9B,IAAI,UAAkB,CAAC;QAEvB,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,IAAI,YAAY,EAAE,SAAS,EAAE,CAAC;gBAC5B,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAExE,yCAAyC;YACzC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACrD,CAAC;YACF,UAAU,GAAI,YAAY,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAElD,yDAAyD;YACzD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC,EAAE,cAAc;gBACvB,SAAS,EAAE,oBAAoB,UAAU,EAAE;aAC5C,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE9B,mCAAmC;YACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,MAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAEpC,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAExE,kCAAkC;YAClC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACrD,CAAC;YACF,UAAU,GAAI,YAAY,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAElD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,oBAAoB,UAAU,EAAE;aAC5C,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,oBAAoB,MAAO,CAAC,IAAI,YAAY,CAC7C,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAElC,yDAAyD;YACzD,MAAM,CACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CACrB,CAAC,IAAI,EAAE,EAAE,CACP,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CACzC,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,EACJ,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE9B,kCAAkC;YAClC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACrD,CAAC;YACF,UAAU,GAAI,YAAY,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAElD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,oBAAoB,UAAU,EAAE;aAC5C,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE5B,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,EACJ,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE9B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,wBAAwB;aACpC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE7B,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,EACJ,qBAAqB,EACrB,eAAe,GAChB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC9B,MAAM,eAAe,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAExE,wDAAwD;YACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,wBAAwB;aACpC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,MAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAElC,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAExE,qFAAqF;YACrF,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAC/C,CAAC;YACF,UAAU,GAAI,YAAY,CAAC,OAAO,EAAU,CAAC,IAAI,CAAC;YAElD,sFAAsF;YACtF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,oBAAoB,UAAU,EAAE;aAC5C,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAE9B,gEAAgE;YAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,MAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAEzC,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import { getProjectRoot as getProjectRootFromState } from "../../../state.js";
|
|
5
|
+
export function getGitStatus(rootPath) {
|
|
6
|
+
const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
7
|
+
try {
|
|
8
|
+
// Get git status with porcelain format for easy parsing
|
|
9
|
+
const output = execSync('git status --porcelain', {
|
|
10
|
+
cwd: workingDir,
|
|
11
|
+
encoding: 'utf8',
|
|
12
|
+
stdio: ['pipe', 'pipe', 'ignore'], // Suppress stderr
|
|
13
|
+
});
|
|
14
|
+
return parseGitStatus(output);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
console.error('Failed to get git status:', error);
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function parseGitStatus(output) {
|
|
22
|
+
const lines = output
|
|
23
|
+
.trim()
|
|
24
|
+
.split('\n')
|
|
25
|
+
.filter((line) => line.length > 0);
|
|
26
|
+
const results = [];
|
|
27
|
+
for (const line of lines) {
|
|
28
|
+
// Git status format: XY filename
|
|
29
|
+
// X = staged status, Y = unstaged status
|
|
30
|
+
const staged = line[0];
|
|
31
|
+
const unstaged = line[1];
|
|
32
|
+
// Skip the two status characters and any following space
|
|
33
|
+
let filePath = line.slice(2).replace(/^[ \t]+/, '');
|
|
34
|
+
// Determine the primary status
|
|
35
|
+
let status;
|
|
36
|
+
let isStaged = false;
|
|
37
|
+
let oldPath;
|
|
38
|
+
if (staged === 'A' || unstaged === 'A') {
|
|
39
|
+
status = 'added';
|
|
40
|
+
isStaged = staged === 'A';
|
|
41
|
+
}
|
|
42
|
+
else if (staged === 'M' || unstaged === 'M') {
|
|
43
|
+
status = 'modified';
|
|
44
|
+
isStaged = staged === 'M';
|
|
45
|
+
}
|
|
46
|
+
else if (staged === 'D' || unstaged === 'D') {
|
|
47
|
+
status = 'deleted';
|
|
48
|
+
isStaged = staged === 'D';
|
|
49
|
+
}
|
|
50
|
+
else if (staged === 'R' || unstaged === 'R') {
|
|
51
|
+
status = 'renamed';
|
|
52
|
+
isStaged = staged === 'R';
|
|
53
|
+
// For renamed files, git shows: "oldfile.txt -> newfile.txt"
|
|
54
|
+
// Extract both the old and new filenames
|
|
55
|
+
const arrowIndex = filePath.indexOf(' -> ');
|
|
56
|
+
if (arrowIndex !== -1) {
|
|
57
|
+
oldPath = filePath.slice(0, arrowIndex).trim();
|
|
58
|
+
filePath = filePath.slice(arrowIndex + 4).trim();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (unstaged === '?') {
|
|
62
|
+
status = 'untracked';
|
|
63
|
+
isStaged = false;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
status = 'modified'; // Default fallback
|
|
67
|
+
isStaged = staged !== ' ' && staged !== '?';
|
|
68
|
+
}
|
|
69
|
+
// If it's a directory (ends with /), expand to show individual files
|
|
70
|
+
if (filePath.endsWith('/')) {
|
|
71
|
+
const workingDir = process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
72
|
+
const fullDirPath = path.join(workingDir, filePath);
|
|
73
|
+
try {
|
|
74
|
+
// Recursively find all files in the directory
|
|
75
|
+
const findFiles = (dir, baseDir) => {
|
|
76
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
77
|
+
const files = [];
|
|
78
|
+
for (const entry of entries) {
|
|
79
|
+
const fullPath = path.join(dir, entry.name);
|
|
80
|
+
const relativePath = path.relative(workingDir, fullPath);
|
|
81
|
+
if (entry.isDirectory()) {
|
|
82
|
+
files.push(...findFiles(fullPath, baseDir));
|
|
83
|
+
}
|
|
84
|
+
else if (entry.isFile()) {
|
|
85
|
+
files.push(relativePath);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return files;
|
|
89
|
+
};
|
|
90
|
+
const filesInDir = findFiles(fullDirPath, workingDir);
|
|
91
|
+
for (const file of filesInDir) {
|
|
92
|
+
results.push({
|
|
93
|
+
path: file,
|
|
94
|
+
status,
|
|
95
|
+
staged: isStaged,
|
|
96
|
+
...(oldPath && { oldPath }),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.error(`Failed to expand directory ${filePath}:`, error);
|
|
102
|
+
// If we can't expand the directory, just skip it
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
results.push({
|
|
107
|
+
path: filePath,
|
|
108
|
+
status,
|
|
109
|
+
staged: isStaged,
|
|
110
|
+
...(oldPath && { oldPath }),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return results;
|
|
115
|
+
}
|
|
116
|
+
export function getFileModificationTime(filePath, rootPath) {
|
|
117
|
+
const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
118
|
+
const fullPath = path.join(workingDir, filePath);
|
|
119
|
+
try {
|
|
120
|
+
// Get the last commit time for this file
|
|
121
|
+
const output = execSync(`git log -1 --format=%ci "${filePath}"`, {
|
|
122
|
+
cwd: workingDir,
|
|
123
|
+
encoding: 'utf8',
|
|
124
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
125
|
+
});
|
|
126
|
+
return new Date(output.trim());
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
// If git log fails, try to get file system modification time
|
|
130
|
+
try {
|
|
131
|
+
const stats = fs.statSync(fullPath);
|
|
132
|
+
return stats.mtime;
|
|
133
|
+
}
|
|
134
|
+
catch (fsError) {
|
|
135
|
+
console.error(`Failed to get modification time for ${filePath}:`, error);
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export function isFileUncommitted(filePath, rootPath) {
|
|
141
|
+
const gitStatus = getGitStatus(rootPath);
|
|
142
|
+
return gitStatus.some((file) => file.path === filePath);
|
|
143
|
+
}
|
|
144
|
+
export function getCurrentBranch(rootPath) {
|
|
145
|
+
const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
146
|
+
try {
|
|
147
|
+
const output = execSync('git branch --show-current', {
|
|
148
|
+
cwd: workingDir,
|
|
149
|
+
encoding: 'utf8',
|
|
150
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
151
|
+
});
|
|
152
|
+
return output.trim() || null;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('Failed to get current branch:', error);
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export function getDefaultBranch(rootPath) {
|
|
160
|
+
const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
161
|
+
try {
|
|
162
|
+
// Try to get the default branch from remote
|
|
163
|
+
const output = execSync('git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo ""', {
|
|
164
|
+
cwd: workingDir,
|
|
165
|
+
encoding: 'utf8',
|
|
166
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
167
|
+
});
|
|
168
|
+
const match = output.trim().match(/refs\/remotes\/origin\/(.+)/);
|
|
169
|
+
if (match) {
|
|
170
|
+
return match[1];
|
|
171
|
+
}
|
|
172
|
+
// Fallback: check if main or master exists locally
|
|
173
|
+
try {
|
|
174
|
+
execSync('git show-ref --verify --quiet refs/heads/main', {
|
|
175
|
+
cwd: workingDir,
|
|
176
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
177
|
+
});
|
|
178
|
+
return 'main';
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Try master
|
|
182
|
+
try {
|
|
183
|
+
execSync('git show-ref --verify --quiet refs/heads/master', {
|
|
184
|
+
cwd: workingDir,
|
|
185
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
186
|
+
});
|
|
187
|
+
return 'master';
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Default to main
|
|
191
|
+
return 'main';
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
console.error('Failed to get default branch:', error);
|
|
197
|
+
return 'main';
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export function getAllBranches(rootPath) {
|
|
201
|
+
const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
202
|
+
try {
|
|
203
|
+
const output = execSync('git branch --format="%(refname:short)"', {
|
|
204
|
+
cwd: workingDir,
|
|
205
|
+
encoding: 'utf8',
|
|
206
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
207
|
+
});
|
|
208
|
+
return output
|
|
209
|
+
.trim()
|
|
210
|
+
.split('\n')
|
|
211
|
+
.filter((branch) => branch.length > 0);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
console.error('Failed to get branches:', error);
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Helper functions that use getProjectRoot internally
|
|
219
|
+
// These are safe to call from route loaders
|
|
220
|
+
export function getGitStatusForProject() {
|
|
221
|
+
const rootPath = getProjectRootFromState();
|
|
222
|
+
return rootPath ? getGitStatus(rootPath) : [];
|
|
223
|
+
}
|
|
224
|
+
export function getCurrentBranchForProject() {
|
|
225
|
+
const rootPath = getProjectRootFromState();
|
|
226
|
+
return rootPath ? getCurrentBranch(rootPath) : null;
|
|
227
|
+
}
|
|
228
|
+
export function getDefaultBranchForProject() {
|
|
229
|
+
const rootPath = getProjectRootFromState();
|
|
230
|
+
return rootPath ? getDefaultBranch(rootPath) : 'main';
|
|
231
|
+
}
|
|
232
|
+
export function getAllBranchesForProject() {
|
|
233
|
+
const rootPath = getProjectRootFromState();
|
|
234
|
+
return rootPath ? getAllBranches(rootPath) : [];
|
|
235
|
+
}
|
|
236
|
+
export function getBranchDiffForProject(baseBranch, compareBranch) {
|
|
237
|
+
const rootPath = getProjectRootFromState();
|
|
238
|
+
return rootPath ? getBranchDiff(baseBranch, compareBranch, rootPath) : [];
|
|
239
|
+
}
|
|
240
|
+
export function getBranchDiff(baseBranch, compareBranch, rootPath) {
|
|
241
|
+
const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
242
|
+
try {
|
|
243
|
+
// Use three-dot syntax to get changes in compareBranch since it diverged from baseBranch
|
|
244
|
+
const output = execSync(`git diff --name-status ${baseBranch}...${compareBranch}`, {
|
|
245
|
+
cwd: workingDir,
|
|
246
|
+
encoding: 'utf8',
|
|
247
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
248
|
+
});
|
|
249
|
+
const lines = output
|
|
250
|
+
.trim()
|
|
251
|
+
.split('\n')
|
|
252
|
+
.filter((line) => line.length > 0);
|
|
253
|
+
return lines.map((line) => {
|
|
254
|
+
const parts = line.split('\t');
|
|
255
|
+
const statusCode = parts[0];
|
|
256
|
+
let filePath = parts[1];
|
|
257
|
+
let oldPath;
|
|
258
|
+
let status;
|
|
259
|
+
if (statusCode === 'A') {
|
|
260
|
+
status = 'added';
|
|
261
|
+
}
|
|
262
|
+
else if (statusCode === 'M') {
|
|
263
|
+
status = 'modified';
|
|
264
|
+
}
|
|
265
|
+
else if (statusCode === 'D') {
|
|
266
|
+
status = 'deleted';
|
|
267
|
+
}
|
|
268
|
+
else if (statusCode.startsWith('R')) {
|
|
269
|
+
status = 'renamed';
|
|
270
|
+
// For renamed files, git diff --name-status shows: "R100\told/path.ts\tnew/path.ts"
|
|
271
|
+
// parts[1] is old path, parts[2] is new path
|
|
272
|
+
oldPath = parts[1];
|
|
273
|
+
filePath = parts[2];
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
status = 'modified'; // Default fallback
|
|
277
|
+
}
|
|
278
|
+
return { path: filePath, status, ...(oldPath && { oldPath }) };
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
console.error('Failed to get branch diff:', error);
|
|
283
|
+
return [];
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
export function getFileDiff(filePath, rootPath) {
|
|
287
|
+
const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
288
|
+
try {
|
|
289
|
+
// Get the committed version (HEAD)
|
|
290
|
+
let oldContent = '';
|
|
291
|
+
try {
|
|
292
|
+
oldContent = execSync(`git show HEAD:"${filePath}"`, {
|
|
293
|
+
cwd: workingDir,
|
|
294
|
+
encoding: 'utf8',
|
|
295
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
296
|
+
maxBuffer: 1024 * 1024 * 10,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// File might be new
|
|
301
|
+
oldContent = '';
|
|
302
|
+
}
|
|
303
|
+
// Get the current working version
|
|
304
|
+
let newContent = '';
|
|
305
|
+
try {
|
|
306
|
+
newContent = fs.readFileSync(path.join(workingDir, filePath), 'utf8');
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
// File might be deleted
|
|
310
|
+
console.error(`Failed to read current file ${filePath}:`, error);
|
|
311
|
+
newContent = '';
|
|
312
|
+
}
|
|
313
|
+
return {
|
|
314
|
+
oldContent,
|
|
315
|
+
newContent,
|
|
316
|
+
fileName: filePath,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
console.error(`Failed to get diff for ${filePath}:`, error);
|
|
321
|
+
return {
|
|
322
|
+
oldContent: 'Error loading old content',
|
|
323
|
+
newContent: 'Error loading new content',
|
|
324
|
+
fileName: filePath,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
export function getFileDiffForProject(filePath) {
|
|
329
|
+
const rootPath = getProjectRootFromState();
|
|
330
|
+
if (!rootPath) {
|
|
331
|
+
return {
|
|
332
|
+
oldContent: 'Error: No project root',
|
|
333
|
+
newContent: 'Error: No project root',
|
|
334
|
+
fileName: filePath,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return getFileDiff(filePath, rootPath);
|
|
338
|
+
}
|
|
339
|
+
export function getBranchFileDiff(filePath, baseBranch, compareBranch, rootPath) {
|
|
340
|
+
const workingDir = rootPath || process.env.CODEYAM_ROOT_PATH || process.cwd();
|
|
341
|
+
try {
|
|
342
|
+
// Get the file content from base branch
|
|
343
|
+
let oldContent = '';
|
|
344
|
+
try {
|
|
345
|
+
oldContent = execSync(`git show ${baseBranch}:"${filePath}"`, {
|
|
346
|
+
cwd: workingDir,
|
|
347
|
+
encoding: 'utf8',
|
|
348
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
349
|
+
maxBuffer: 1024 * 1024 * 10,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
// File might not exist in base branch
|
|
354
|
+
oldContent = '';
|
|
355
|
+
}
|
|
356
|
+
// Get the file content from compare branch
|
|
357
|
+
let newContent = '';
|
|
358
|
+
try {
|
|
359
|
+
newContent = execSync(`git show ${compareBranch}:"${filePath}"`, {
|
|
360
|
+
cwd: workingDir,
|
|
361
|
+
encoding: 'utf8',
|
|
362
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
363
|
+
maxBuffer: 1024 * 1024 * 10,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
// File might not exist in compare branch
|
|
368
|
+
newContent = '';
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
oldContent,
|
|
372
|
+
newContent,
|
|
373
|
+
fileName: filePath,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
console.error(`Failed to get branch diff for ${filePath}:`, error);
|
|
378
|
+
return {
|
|
379
|
+
oldContent: 'Error loading old content',
|
|
380
|
+
newContent: 'Error loading new content',
|
|
381
|
+
fileName: filePath,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
export function getBranchFileDiffForProject(filePath, baseBranch, compareBranch) {
|
|
386
|
+
const rootPath = getProjectRootFromState();
|
|
387
|
+
if (!rootPath) {
|
|
388
|
+
return {
|
|
389
|
+
oldContent: 'Error: No project root',
|
|
390
|
+
newContent: 'Error: No project root',
|
|
391
|
+
fileName: filePath,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
return getBranchFileDiff(filePath, baseBranch, compareBranch, rootPath);
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=git.js.map
|