@codeyam/codeyam-cli 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analyzer-template/.build-info.json +8 -8
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +4 -4
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +0 -33
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +13 -7
- package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +31 -0
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +0 -65
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +5 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +31 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js +0 -6
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +0 -25
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js +2 -0
- package/analyzer-template/packages/github/dist/types/src/enums/ProjectFramework.js.map +1 -1
- package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
- package/analyzer-template/packages/ui-components/package.json +1 -1
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js +2 -0
- package/analyzer-template/packages/utils/dist/types/src/enums/ProjectFramework.js.map +1 -1
- package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js +196 -0
- package/codeyam-cli/src/__tests__/memory-scripts/filter-session.test.js.map +1 -0
- package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js +114 -0
- package/codeyam-cli/src/__tests__/memory-scripts/read-json-field.test.js.map +1 -0
- package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js +149 -0
- package/codeyam-cli/src/__tests__/memory-scripts/ripgrep-fallback.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +45 -0
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js.map +1 -0
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js +101 -47
- package/codeyam-cli/src/commands/__tests__/init.gitignore.test.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +3 -46
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +1619 -243
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +67 -34
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/data/techStacks.js +77 -0
- package/codeyam-cli/src/data/techStacks.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js +144 -0
- package/codeyam-cli/src/utils/__tests__/analyzerFinalization.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js +46 -0
- package/codeyam-cli/src/utils/__tests__/backgroundServer.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/devServerState.test.js +134 -0
- package/codeyam-cli/src/utils/__tests__/devServerState.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js +127 -0
- package/codeyam-cli/src/utils/__tests__/editorApi.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +610 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorCapture.test.js +93 -0
- package/codeyam-cli/src/utils/__tests__/editorCapture.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js +181 -3
- package/codeyam-cli/src/utils/__tests__/editorDevServer.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js +121 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityChangeStatus.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js +294 -0
- package/codeyam-cli/src/utils/__tests__/editorImageVerifier.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js +249 -2
- package/codeyam-cli/src/utils/__tests__/editorJournal.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js +520 -0
- package/codeyam-cli/src/utils/__tests__/editorLoaderHelpers.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js +118 -1
- package/codeyam-cli/src/utils/__tests__/editorPreloadHelpers.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js +195 -3
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js +153 -0
- package/codeyam-cli/src/utils/__tests__/editorProxySession.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js +139 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioLookup.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +221 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +781 -2
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js +213 -0
- package/codeyam-cli/src/utils/__tests__/editorSeedAdapter.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +1742 -0
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +107 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js +101 -0
- package/codeyam-cli/src/utils/__tests__/parseRegisterArg.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +227 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +300 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +25 -5
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js +51 -0
- package/codeyam-cli/src/utils/__tests__/templateConsistency.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js +142 -0
- package/codeyam-cli/src/utils/__tests__/webappDetection.test.js.map +1 -0
- package/codeyam-cli/src/utils/analyzer.js +9 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/analyzerFinalization.js +96 -0
- package/codeyam-cli/src/utils/analyzerFinalization.js.map +1 -0
- package/codeyam-cli/src/utils/backgroundServer.js +94 -18
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/database.js +37 -2
- package/codeyam-cli/src/utils/database.js.map +1 -1
- package/codeyam-cli/src/utils/devServerState.js +71 -0
- package/codeyam-cli/src/utils/devServerState.js.map +1 -0
- package/codeyam-cli/src/utils/editorApi.js +73 -0
- package/codeyam-cli/src/utils/editorApi.js.map +1 -0
- package/codeyam-cli/src/utils/editorAudit.js +101 -7
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorCapture.js +102 -0
- package/codeyam-cli/src/utils/editorCapture.js.map +1 -0
- package/codeyam-cli/src/utils/editorDevServer.js +100 -1
- package/codeyam-cli/src/utils/editorDevServer.js.map +1 -1
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js +44 -0
- package/codeyam-cli/src/utils/editorEntityChangeStatus.js.map +1 -0
- package/codeyam-cli/src/utils/editorImageVerifier.js +155 -0
- package/codeyam-cli/src/utils/editorImageVerifier.js.map +1 -0
- package/codeyam-cli/src/utils/editorJournal.js +92 -4
- package/codeyam-cli/src/utils/editorJournal.js.map +1 -1
- package/codeyam-cli/src/utils/editorLoaderHelpers.js +113 -0
- package/codeyam-cli/src/utils/editorLoaderHelpers.js.map +1 -0
- package/codeyam-cli/src/utils/editorMockState.js +1 -1
- package/codeyam-cli/src/utils/editorPreloadHelpers.js +72 -1
- package/codeyam-cli/src/utils/editorPreloadHelpers.js.map +1 -1
- package/codeyam-cli/src/utils/editorPreview.js +67 -1
- package/codeyam-cli/src/utils/editorPreview.js.map +1 -1
- package/codeyam-cli/src/utils/editorScenarioSwitch.js +112 -0
- package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarios.js +276 -0
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/editorSeedAdapter.js +173 -0
- package/codeyam-cli/src/utils/editorSeedAdapter.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js +349 -0
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js +158 -0
- package/codeyam-cli/src/utils/entityChangeStatus.server.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +1 -1
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
- package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js +75 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
- package/codeyam-cli/src/utils/scenariosManifest.js +159 -0
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
- package/codeyam-cli/src/utils/serverState.js +30 -0
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +46 -16
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js +8 -1
- package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/slugUtils.js +25 -0
- package/codeyam-cli/src/utils/slugUtils.js.map +1 -0
- package/codeyam-cli/src/utils/syncMocksMiddleware.js +2 -2
- package/codeyam-cli/src/utils/syncMocksMiddleware.js.map +1 -1
- package/codeyam-cli/src/utils/webappDetection.js +21 -0
- package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +40 -0
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js +567 -0
- package/codeyam-cli/src/webserver/__tests__/editorProxy.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js +65 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
- package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-DmJveP3T.js → CopyButton-BPXZwM4t.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-C76mRRiF.js → EntityItem-BcgbViKV.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-CobE682z.js → EntityTypeIcon-CQIG2qda.js} +9 -9
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-djPLI-WV.js → ReportIssueModal-BzHcG7SE.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-B76aig_2.js → ScenarioViewer-Bd-hxofb.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-oAf2Kqsf.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{_index-C96V0n15.js → _index-DLxKhri3.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-BpKzcsJz.js → activity.(_tab)-BcY3q6nt.js} +6 -6
- package/codeyam-cli/src/webserver/build/client/assets/addon-canvas-DpzMmAy5.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-fit-YJmn1quW.js +12 -0
- package/codeyam-cli/src/webserver/build/client/assets/addon-webgl-DI8QOUvO.js +58 -0
- package/codeyam-cli/src/webserver/build/client/assets/{agent-transcripts-D9hemwl6.js → agent-transcripts-Bni3iiUj.js} +5 -5
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-diff-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-file-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-project-info-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-D_nMCFmP.js → book-open-BYOypzCa.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-BH2h1Ea2.js → chevron-down-C_Pmso5S.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-DyIKORY6.js → circle-check-BVMi9VA5.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{copy-NDbZjXao.js → copy-n2FB0_Sw.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CC6AbExI.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BsDh6TSF.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor-PBc_6L9R.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-4FzHlcNn.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CrjR3zZW.js → entity._sha._-BsDXNp45.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-BgAqUtTZ.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-Bmshgrij.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{files-DO4CZ16O.js → files-BZrlFE1F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-DdZcvjGh.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-B8vTTNy2.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-yHOVb4rc.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BAXYRVEO.js → loader-circle-DaAZ_H2w.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/manifest-65850841.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-9gnxSZlb.js +101 -0
- package/codeyam-cli/src/webserver/build/client/assets/{pause-DTAcYxBt.js → pause-f5-1lKBt.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/root-BwX8YgFb.js +67 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-fKo7v0Zo.js → search-Di64LWVb.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{settings-DfuTtcJP.js → settings-0OrEMU6J.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-B3aOzpCZ.js → simulations-DWT-CvLy.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-BG4heKCG.js → terminal-Br7MOqts.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DtSmdtM4.js → triangle-alert-BLdiCuG-.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-BE43Hjti.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-DEEQf4pi.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/init-CkWmyFY2.js +10 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-BHi-9O8W.js +439 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/src/webserver/editorProxy.js +487 -50
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -1
- package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +242 -3
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +94 -4
- package/codeyam-cli/src/webserver/server.js +46 -14
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +39 -11
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
- package/codeyam-cli/templates/chrome-extension-react/EXTENSION_SETUP.md +75 -0
- package/codeyam-cli/templates/chrome-extension-react/README.md +46 -0
- package/codeyam-cli/templates/chrome-extension-react/gitignore +15 -0
- package/codeyam-cli/templates/chrome-extension-react/index.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/package.json +27 -0
- package/codeyam-cli/templates/chrome-extension-react/popup.html +12 -0
- package/codeyam-cli/templates/chrome-extension-react/public/manifest.json +15 -0
- package/codeyam-cli/templates/chrome-extension-react/src/background/service-worker.ts +7 -0
- package/codeyam-cli/templates/chrome-extension-react/src/globals.css +6 -0
- package/codeyam-cli/templates/chrome-extension-react/src/lib/storage.ts +37 -0
- package/codeyam-cli/templates/chrome-extension-react/src/popup/App.tsx +12 -0
- package/codeyam-cli/templates/chrome-extension-react/src/popup/main.tsx +10 -0
- package/codeyam-cli/templates/chrome-extension-react/tsconfig.json +24 -0
- package/codeyam-cli/templates/chrome-extension-react/vite.config.ts +41 -0
- package/codeyam-cli/templates/codeyam-editor-claude.md +84 -5
- package/codeyam-cli/templates/editor-step-hook.py +97 -8
- package/codeyam-cli/templates/expo-react-native/MOBILE_SETUP.md +89 -0
- package/codeyam-cli/templates/expo-react-native/README.md +41 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/_layout.tsx +33 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/index.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app/(tabs)/settings.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app/_layout.tsx +12 -0
- package/codeyam-cli/templates/expo-react-native/app.json +18 -0
- package/codeyam-cli/templates/expo-react-native/babel.config.js +9 -0
- package/codeyam-cli/templates/expo-react-native/gitignore +12 -0
- package/codeyam-cli/templates/expo-react-native/global.css +3 -0
- package/codeyam-cli/templates/expo-react-native/lib/storage.ts +32 -0
- package/codeyam-cli/templates/expo-react-native/metro.config.js +6 -0
- package/codeyam-cli/templates/expo-react-native/nativewind-env.d.ts +1 -0
- package/codeyam-cli/templates/expo-react-native/package.json +38 -0
- package/codeyam-cli/templates/expo-react-native/tailwind.config.js +10 -0
- package/codeyam-cli/templates/expo-react-native/tsconfig.json +10 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_PATTERNS.md +308 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/AUTH_UPGRADE.md +304 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/DATABASE.md +126 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/FEATURE_PATTERNS.md +37 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/README.md +53 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +9 -4
- package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +21 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +5 -1
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +4 -1
- package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +92 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/vitest.config.ts +13 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/README.md +52 -0
- package/codeyam-cli/templates/{nextjs-prisma-sqlite/PRISMA_SETUP.md → nextjs-prisma-supabase/SUPABASE_SETUP.md} +37 -17
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/api/todos/route.ts +17 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/globals.css +26 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/layout.tsx +34 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/prisma.ts +20 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/lib/supabase.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/app/page.tsx +10 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/env +9 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/eslint.config.mjs +11 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/gitignore +40 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/next.config.ts +11 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/package.json +37 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/postcss.config.mjs +7 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/schema.prisma +27 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma/seed.ts +39 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/prisma.config.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-supabase/tsconfig.json +34 -0
- package/codeyam-cli/templates/skills/codeyam-dev-mode/SKILL.md +2 -2
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +96 -17
- package/codeyam-cli/templates/skills/codeyam-memory/SKILL.md +10 -10
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.mjs +139 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs +52 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/read-json-field.mjs +61 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/lib/ripgrep-fallback.mjs +155 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.mjs +13 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter-session.mjs +95 -0
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.mjs +160 -0
- package/package.json +14 -9
- package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +10 -4
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/index.js +4 -2
- package/packages/analyze/src/lib/asts/index.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +31 -0
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +0 -6
- package/packages/database/src/lib/loadEntities.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +0 -25
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/types/src/enums/ProjectFramework.js +2 -0
- package/packages/types/src/enums/ProjectFramework.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/Terminal-Dnj5CY9R.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/addon-fit-CUXOrorO.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CMT1jU2q.js +0 -21
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BiM6z3Do.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor-D1DAKXtT.js +0 -8
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.dev-DkzqFzFj.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-C28BiQzt.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/git-CFCTYk9I.js +0 -15
- package/codeyam-cli/src/webserver/build/client/assets/globals-B17TBSS6.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-a632de18.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-Dg0mvYrI.js +0 -96
- package/codeyam-cli/src/webserver/build/client/assets/root-DUKqhFlb.js +0 -67
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-ByhSyh0W.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-HfLydfDq.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CUu_F-oo.js +0 -366
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/detect-deprecated-patterns.sh +0 -108
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.sh +0 -69
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/cleanup.sh +0 -12
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/filter.jq +0 -45
- package/codeyam-cli/templates/skills/codeyam-memory/scripts/session-mining/preprocess.sh +0 -139
package/codeyam-cli/templates/skills/codeyam-memory/scripts/holistic-analysis/find-exports.mjs
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Indexes the project's public API surface by finding all exports.
|
|
3
|
+
// Outputs structured JSON to /tmp/codeyam-memory/exports-scan.json
|
|
4
|
+
|
|
5
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { ripgrepSearch } from '../lib/ripgrep-fallback.mjs';
|
|
8
|
+
|
|
9
|
+
const OUTPUT_DIR = '/tmp/codeyam-memory';
|
|
10
|
+
const OUTPUT_FILE = join(OUTPUT_DIR, 'exports-scan.json');
|
|
11
|
+
await mkdir(OUTPUT_DIR, { recursive: true });
|
|
12
|
+
|
|
13
|
+
const exportOutput = await ripgrepSearch(
|
|
14
|
+
'^export (function|const|class|default|async function|type|interface|enum)',
|
|
15
|
+
{
|
|
16
|
+
types: ['ts', 'js'],
|
|
17
|
+
globs: ['!node_modules', '!dist', '!build', '!.next', '!*.d.ts', '!*.map'],
|
|
18
|
+
lineNumbers: true,
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
if (!exportOutput.trim()) {
|
|
23
|
+
const empty = { files: {}, stats: { total_files: 0, total_exports: 0 } };
|
|
24
|
+
await writeFile(OUTPUT_FILE, JSON.stringify(empty, null, 2));
|
|
25
|
+
console.log(`Export scan complete: ${OUTPUT_FILE} (no exports found)`);
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Parse ripgrep output and group by file
|
|
30
|
+
const files = {};
|
|
31
|
+
for (const line of exportOutput.split('\n')) {
|
|
32
|
+
const match = line.match(/^([^:]+):(\d+):(.*)$/);
|
|
33
|
+
if (!match) continue;
|
|
34
|
+
|
|
35
|
+
const [, file, lineNum, text] = match;
|
|
36
|
+
if (!files[file]) files[file] = [];
|
|
37
|
+
files[file].push({ line: parseInt(lineNum, 10), text: text.trim() });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const totalFiles = Object.keys(files).length;
|
|
41
|
+
const totalExports = Object.values(files).reduce((sum, arr) => sum + arr.length, 0);
|
|
42
|
+
|
|
43
|
+
const output = {
|
|
44
|
+
files,
|
|
45
|
+
stats: { total_files: totalFiles, total_exports: totalExports },
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
await writeFile(OUTPUT_FILE, JSON.stringify(output, null, 2));
|
|
49
|
+
|
|
50
|
+
console.log(`Export scan complete: ${OUTPUT_FILE}`);
|
|
51
|
+
console.log(` Files with exports: ${totalFiles}`);
|
|
52
|
+
console.log(` Total exports: ${totalExports}`);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Lightweight jq replacement for simple field lookups.
|
|
3
|
+
// Usage: node read-json-field.mjs <file> '<expression>'
|
|
4
|
+
// Supports: .field.subfield, .field | length
|
|
5
|
+
|
|
6
|
+
import { readFile } from 'node:fs/promises';
|
|
7
|
+
|
|
8
|
+
const [, , filePath, expression] = process.argv;
|
|
9
|
+
|
|
10
|
+
if (!filePath || !expression) {
|
|
11
|
+
console.error('Usage: node read-json-field.mjs <file> <expression>');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
17
|
+
const data = JSON.parse(raw);
|
|
18
|
+
const result = evaluate(data, expression);
|
|
19
|
+
console.log(typeof result === 'string' ? result : JSON.stringify(result));
|
|
20
|
+
} catch (err) {
|
|
21
|
+
console.error(err.message);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function evaluate(data, expr) {
|
|
26
|
+
const trimmed = expr.trim();
|
|
27
|
+
|
|
28
|
+
// Handle pipe: ".field | length"
|
|
29
|
+
const pipeIdx = trimmed.indexOf('|');
|
|
30
|
+
if (pipeIdx !== -1) {
|
|
31
|
+
const left = trimmed.slice(0, pipeIdx).trim();
|
|
32
|
+
const right = trimmed.slice(pipeIdx + 1).trim();
|
|
33
|
+
const intermediate = resolvePath(data, left);
|
|
34
|
+
|
|
35
|
+
if (right === 'length') {
|
|
36
|
+
if (Array.isArray(intermediate)) return intermediate.length;
|
|
37
|
+
if (typeof intermediate === 'object' && intermediate !== null) return Object.keys(intermediate).length;
|
|
38
|
+
if (typeof intermediate === 'string') return intermediate.length;
|
|
39
|
+
throw new Error(`Cannot get length of ${typeof intermediate}`);
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`Unsupported pipe function: ${right}`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return resolvePath(data, trimmed);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function resolvePath(data, pathExpr) {
|
|
48
|
+
// Strip leading dot: ".foo.bar" -> "foo.bar"
|
|
49
|
+
const cleaned = pathExpr.startsWith('.') ? pathExpr.slice(1) : pathExpr;
|
|
50
|
+
if (cleaned === '') return data;
|
|
51
|
+
|
|
52
|
+
const keys = cleaned.split('.');
|
|
53
|
+
let current = data;
|
|
54
|
+
for (const key of keys) {
|
|
55
|
+
if (current == null || typeof current !== 'object') {
|
|
56
|
+
throw new Error(`Cannot access '${key}' on ${JSON.stringify(current)}`);
|
|
57
|
+
}
|
|
58
|
+
current = current[key];
|
|
59
|
+
}
|
|
60
|
+
return current;
|
|
61
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Shared ripgrep wrapper with pure-Node fallback when rg is not installed.
|
|
3
|
+
|
|
4
|
+
import { execFile } from 'node:child_process';
|
|
5
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {string} pattern - Regex pattern to search for
|
|
10
|
+
* @param {object} [opts]
|
|
11
|
+
* @param {string[]} [opts.types] - File type filters, e.g. ['ts', 'js']
|
|
12
|
+
* @param {string[]} [opts.globs] - Glob filters, e.g. ['!node_modules']
|
|
13
|
+
* @param {number} [opts.context] - Lines of context around matches (-C)
|
|
14
|
+
* @param {boolean} [opts.lineNumbers] - Include line numbers (-n)
|
|
15
|
+
* @param {string} [opts.cwd] - Working directory (defaults to process.cwd())
|
|
16
|
+
* @returns {Promise<string>} ripgrep-compatible output: "file:line:text\n" lines
|
|
17
|
+
*/
|
|
18
|
+
export async function ripgrepSearch(pattern, opts = {}) {
|
|
19
|
+
const { types = [], globs = [], context, lineNumbers = true, cwd = process.cwd() } = opts;
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
return await runRipgrep(pattern, { types, globs, context, lineNumbers, cwd });
|
|
23
|
+
} catch (err) {
|
|
24
|
+
if (err.code === 'ENOENT') {
|
|
25
|
+
// rg not installed — use Node fallback
|
|
26
|
+
return nodeFallback(pattern, { types, globs, context, lineNumbers, cwd });
|
|
27
|
+
}
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function runRipgrep(pattern, { types, globs, context, lineNumbers, cwd }) {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const args = [];
|
|
35
|
+
if (lineNumbers) args.push('-n');
|
|
36
|
+
if (context != null) args.push('-C', String(context));
|
|
37
|
+
for (const t of types) args.push('--type', t);
|
|
38
|
+
for (const g of globs) args.push('--glob', g);
|
|
39
|
+
args.push(pattern, '.'); // Explicit path prevents rg from reading stdin
|
|
40
|
+
|
|
41
|
+
execFile('rg', args, { cwd, maxBuffer: 50 * 1024 * 1024 }, (err, stdout) => {
|
|
42
|
+
if (err) {
|
|
43
|
+
// Exit code 1 = no matches, 2 = error (e.g. no files searched)
|
|
44
|
+
if (err.code === 1 || err.code === 2) return resolve('');
|
|
45
|
+
// ENOENT = rg binary not found
|
|
46
|
+
if (err.code === 'ENOENT') {
|
|
47
|
+
const e = new Error('rg not found');
|
|
48
|
+
e.code = 'ENOENT';
|
|
49
|
+
return reject(e);
|
|
50
|
+
}
|
|
51
|
+
return reject(err);
|
|
52
|
+
}
|
|
53
|
+
resolve(stdout);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const TYPE_EXTENSIONS = {
|
|
59
|
+
ts: ['.ts', '.tsx', '.mts', '.cts'],
|
|
60
|
+
js: ['.js', '.jsx', '.mjs', '.cjs'],
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const DEFAULT_IGNORE = ['node_modules', 'dist', 'build', '.next', '.git'];
|
|
64
|
+
|
|
65
|
+
async function nodeFallback(pattern, { types = [], globs = [], context, lineNumbers = true, cwd = process.cwd() } = {}) {
|
|
66
|
+
// Build file extension filter from types
|
|
67
|
+
const extensions = new Set();
|
|
68
|
+
for (const t of types) {
|
|
69
|
+
const exts = TYPE_EXTENSIONS[t];
|
|
70
|
+
if (exts) exts.forEach((e) => extensions.add(e));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Parse globs for negative patterns (simple heuristic: "!dirname")
|
|
74
|
+
const ignoreDirs = new Set(DEFAULT_IGNORE);
|
|
75
|
+
for (const g of globs) {
|
|
76
|
+
if (g.startsWith('!')) ignoreDirs.add(g.slice(1));
|
|
77
|
+
}
|
|
78
|
+
// Also handle glob patterns like "!*.d.ts" and "!*.map"
|
|
79
|
+
const ignoreExtensions = new Set();
|
|
80
|
+
for (const g of globs) {
|
|
81
|
+
const m = g.match(/^!\*(\.\w+(?:\.\w+)*)$/);
|
|
82
|
+
if (m) ignoreExtensions.add(m[1]);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const regex = new RegExp(pattern);
|
|
86
|
+
const contextLines = context ?? 0;
|
|
87
|
+
const results = [];
|
|
88
|
+
|
|
89
|
+
let entries;
|
|
90
|
+
try {
|
|
91
|
+
entries = await readdir(cwd, { recursive: true });
|
|
92
|
+
} catch {
|
|
93
|
+
return '';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
for (const relPath of entries) {
|
|
97
|
+
// Skip ignored directories
|
|
98
|
+
const parts = relPath.split('/');
|
|
99
|
+
if (parts.some((p) => ignoreDirs.has(p))) continue;
|
|
100
|
+
|
|
101
|
+
// Check extension filters
|
|
102
|
+
if (extensions.size > 0) {
|
|
103
|
+
const hasMatchingExt = [...extensions].some((ext) => relPath.endsWith(ext));
|
|
104
|
+
if (!hasMatchingExt) continue;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Check ignore extensions
|
|
108
|
+
if ([...ignoreExtensions].some((ext) => relPath.endsWith(ext))) continue;
|
|
109
|
+
|
|
110
|
+
const fullPath = join(cwd, relPath);
|
|
111
|
+
let content;
|
|
112
|
+
try {
|
|
113
|
+
content = await readFile(fullPath, 'utf-8');
|
|
114
|
+
} catch {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const lines = content.split('\n');
|
|
119
|
+
const matchIndices = [];
|
|
120
|
+
for (let i = 0; i < lines.length; i++) {
|
|
121
|
+
if (regex.test(lines[i])) matchIndices.push(i);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (matchIndices.length === 0) continue;
|
|
125
|
+
|
|
126
|
+
if (contextLines === 0) {
|
|
127
|
+
for (const idx of matchIndices) {
|
|
128
|
+
const lineNum = idx + 1;
|
|
129
|
+
const prefix = lineNumbers ? `${relPath}:${lineNum}:` : `${relPath}:`;
|
|
130
|
+
results.push(`${prefix}${lines[idx]}`);
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
// With context: output blocks separated by "--"
|
|
134
|
+
const emitted = new Set();
|
|
135
|
+
for (const idx of matchIndices) {
|
|
136
|
+
const start = Math.max(0, idx - contextLines);
|
|
137
|
+
const end = Math.min(lines.length - 1, idx + contextLines);
|
|
138
|
+
for (let i = start; i <= end; i++) {
|
|
139
|
+
if (!emitted.has(i)) {
|
|
140
|
+
emitted.add(i);
|
|
141
|
+
const lineNum = i + 1;
|
|
142
|
+
const sep = i === idx ? ':' : '-';
|
|
143
|
+
const prefix = lineNumbers ? `${relPath}${sep}${lineNum}${sep}` : `${relPath}${sep}`;
|
|
144
|
+
results.push(`${prefix}${lines[i]}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return results.join('\n') + (results.length > 0 ? '\n' : '');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Exported for testing — not part of the public API.
|
|
155
|
+
export { nodeFallback as _nodeFallback };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Removes cached preprocessed session files.
|
|
3
|
+
|
|
4
|
+
import { rm } from 'node:fs/promises';
|
|
5
|
+
|
|
6
|
+
const OUTPUT_DIR = '/tmp/cc-session-analysis';
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
await rm(OUTPUT_DIR, { recursive: true, force: true });
|
|
10
|
+
console.log(`Cleaned up ${OUTPUT_DIR}`);
|
|
11
|
+
} catch {
|
|
12
|
+
console.log(`Nothing to clean up (${OUTPUT_DIR} does not exist)`);
|
|
13
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Session log filter — replaces filter.jq.
|
|
3
|
+
// Strips progress/system/queue records, compresses tool inputs to 300 chars,
|
|
4
|
+
// tool results to 500 chars, thinking to 1000 chars. Output is compact JSONL.
|
|
5
|
+
|
|
6
|
+
import { createReadStream } from 'node:fs';
|
|
7
|
+
import { createInterface } from 'node:readline';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Filter a single parsed session log object.
|
|
11
|
+
* Returns the filtered object, or null if it should be skipped.
|
|
12
|
+
*/
|
|
13
|
+
export function filterSessionLine(obj) {
|
|
14
|
+
if (obj.type === 'assistant') {
|
|
15
|
+
const contentItems = obj.message?.content;
|
|
16
|
+
if (!Array.isArray(contentItems)) return null;
|
|
17
|
+
|
|
18
|
+
const filtered = [];
|
|
19
|
+
for (const item of contentItems) {
|
|
20
|
+
if (item.type === 'text') {
|
|
21
|
+
filtered.push({ t: 'text', text: item.text });
|
|
22
|
+
} else if (item.type === 'thinking') {
|
|
23
|
+
const thinking = item.thinking ?? '';
|
|
24
|
+
filtered.push({
|
|
25
|
+
t: 'think',
|
|
26
|
+
thinking: thinking.length > 1000 ? thinking.slice(0, 1000) + '...[truncated]' : thinking,
|
|
27
|
+
});
|
|
28
|
+
} else if (item.type === 'tool_use') {
|
|
29
|
+
const inputStr = typeof item.input === 'string' ? item.input : JSON.stringify(item.input);
|
|
30
|
+
filtered.push({
|
|
31
|
+
t: 'tool',
|
|
32
|
+
name: item.name,
|
|
33
|
+
input: inputStr.length > 300 ? inputStr.slice(0, 300) + '...' : inputStr,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return { type: 'assistant', ts: obj.timestamp, content: filtered };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (obj.type === 'user') {
|
|
42
|
+
const msgContent = obj.message?.content;
|
|
43
|
+
|
|
44
|
+
if (typeof msgContent === 'string') {
|
|
45
|
+
return { type: 'user', ts: obj.timestamp, content: msgContent };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (Array.isArray(msgContent)) {
|
|
49
|
+
const items = [];
|
|
50
|
+
for (const item of msgContent) {
|
|
51
|
+
if (item.type === 'tool_result') {
|
|
52
|
+
const contentStr = typeof item.content === 'string' ? item.content : JSON.stringify(item.content);
|
|
53
|
+
items.push({
|
|
54
|
+
t: 'result',
|
|
55
|
+
id: item.tool_use_id,
|
|
56
|
+
err: item.is_error ?? false,
|
|
57
|
+
content: contentStr.length > 500 ? contentStr.slice(0, 500) + '...[truncated]' : contentStr,
|
|
58
|
+
});
|
|
59
|
+
} else {
|
|
60
|
+
const text = typeof item === 'string' ? item : JSON.stringify(item);
|
|
61
|
+
items.push({
|
|
62
|
+
t: 'msg',
|
|
63
|
+
text: text.length > 500 ? text.slice(0, 500) + '...[truncated]' : text,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { type: 'user', ts: obj.timestamp, content: items };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Fallback: stringify whatever content is
|
|
71
|
+
const fallback = typeof msgContent === 'string' ? msgContent : JSON.stringify(msgContent);
|
|
72
|
+
return {
|
|
73
|
+
type: 'user',
|
|
74
|
+
ts: obj.timestamp,
|
|
75
|
+
content: fallback.length > 500 ? fallback.slice(0, 500) + '...[truncated]' : fallback,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Standalone mode: node filter-session.mjs input.jsonl → filtered JSONL to stdout
|
|
83
|
+
const inputFile = process.argv[2];
|
|
84
|
+
if (inputFile) {
|
|
85
|
+
const rl = createInterface({ input: createReadStream(inputFile) });
|
|
86
|
+
for await (const line of rl) {
|
|
87
|
+
try {
|
|
88
|
+
const obj = JSON.parse(line);
|
|
89
|
+
const result = filterSessionLine(obj);
|
|
90
|
+
if (result) console.log(JSON.stringify(result));
|
|
91
|
+
} catch {
|
|
92
|
+
// Skip malformed lines (matching jq's silent-skip behavior)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Preprocesses Claude Code session logs for the codeyam-memory skill.
|
|
3
|
+
// Replaces preprocess.sh — no jq or platform-specific stat required.
|
|
4
|
+
//
|
|
5
|
+
// - Finds JSONL session files (>=10KB, last 30 days)
|
|
6
|
+
// - Excludes the current active session
|
|
7
|
+
// - Runs JS filter for 5-50x compression
|
|
8
|
+
// - Caches results in /tmp/cc-session-analysis/
|
|
9
|
+
// - Prints filtered file paths to stdout (one per line)
|
|
10
|
+
|
|
11
|
+
import { readdir, stat, mkdir, readFile, rm } from 'node:fs/promises';
|
|
12
|
+
import { createReadStream, createWriteStream } from 'node:fs';
|
|
13
|
+
import { createInterface } from 'node:readline';
|
|
14
|
+
import { join, basename } from 'node:path';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { filterSessionLine } from './filter-session.mjs';
|
|
17
|
+
|
|
18
|
+
const OUTPUT_DIR = '/tmp/cc-session-analysis';
|
|
19
|
+
const MIN_SIZE = 10240; // 10KB
|
|
20
|
+
const MAX_AGE_DAYS = 30;
|
|
21
|
+
const MAX_SESSIONS = 30;
|
|
22
|
+
const FILTER_TIMEOUT = 30_000; // 30s per file
|
|
23
|
+
|
|
24
|
+
// Compute Claude project directory (mirrors Claude Code's path hashing)
|
|
25
|
+
const projectDir = process.cwd();
|
|
26
|
+
const projectHash = projectDir.replace(/[/.]/g, '-');
|
|
27
|
+
const sessionDir = join(homedir(), '.claude', 'projects', projectHash);
|
|
28
|
+
|
|
29
|
+
// Check session directory exists
|
|
30
|
+
try {
|
|
31
|
+
await stat(sessionDir);
|
|
32
|
+
} catch {
|
|
33
|
+
process.stderr.write(`No Claude session directory found at ${sessionDir}\n`);
|
|
34
|
+
process.stderr.write('This project may not have any Claude Code session history.\n');
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Find eligible session files
|
|
39
|
+
await mkdir(OUTPUT_DIR, { recursive: true });
|
|
40
|
+
|
|
41
|
+
const entries = await readdir(sessionDir);
|
|
42
|
+
const now = Date.now();
|
|
43
|
+
const maxAgeMs = MAX_AGE_DAYS * 24 * 60 * 60 * 1000;
|
|
44
|
+
|
|
45
|
+
const sessionFiles = [];
|
|
46
|
+
for (const name of entries) {
|
|
47
|
+
if (!name.endsWith('.jsonl')) continue;
|
|
48
|
+
const fullPath = join(sessionDir, name);
|
|
49
|
+
try {
|
|
50
|
+
const st = await stat(fullPath);
|
|
51
|
+
if (!st.isFile()) continue;
|
|
52
|
+
if (st.size < MIN_SIZE) continue;
|
|
53
|
+
if (now - st.mtimeMs > maxAgeMs) continue;
|
|
54
|
+
sessionFiles.push({ path: fullPath, mtimeMs: st.mtimeMs });
|
|
55
|
+
} catch {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (sessionFiles.length === 0) process.exit(0);
|
|
61
|
+
|
|
62
|
+
// Sort newest first, cap to MAX_SESSIONS
|
|
63
|
+
sessionFiles.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
64
|
+
if (sessionFiles.length > MAX_SESSIONS) {
|
|
65
|
+
process.stderr.write(`Note: ${sessionFiles.length} sessions found, capping to ${MAX_SESSIONS} most recent\n`);
|
|
66
|
+
}
|
|
67
|
+
const sessions = sessionFiles.slice(0, MAX_SESSIONS);
|
|
68
|
+
|
|
69
|
+
// Determine active session to exclude
|
|
70
|
+
let activeSession = '';
|
|
71
|
+
const claudeSessionId = process.env.CLAUDE_SESSION_ID;
|
|
72
|
+
if (claudeSessionId) {
|
|
73
|
+
const match = sessions.find((s) => basename(s.path, '.jsonl') === claudeSessionId);
|
|
74
|
+
if (match) activeSession = match.path;
|
|
75
|
+
}
|
|
76
|
+
if (!activeSession && sessions.length > 0) {
|
|
77
|
+
activeSession = sessions[0].path; // newest = likely active
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Process each session
|
|
81
|
+
for (const session of sessions) {
|
|
82
|
+
if (session.path === activeSession) continue;
|
|
83
|
+
|
|
84
|
+
const uuid = basename(session.path, '.jsonl');
|
|
85
|
+
const filtered = join(OUTPUT_DIR, `${uuid}.filtered.jsonl`);
|
|
86
|
+
|
|
87
|
+
// Check cache: skip if filtered file has a valid sentinel
|
|
88
|
+
try {
|
|
89
|
+
const firstLine = (await readFile(filtered, 'utf-8')).split('\n')[0];
|
|
90
|
+
const sentinel = JSON.parse(firstLine);
|
|
91
|
+
if (sentinel.processed_at) {
|
|
92
|
+
console.log(filtered);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
} catch {
|
|
96
|
+
// No cache or invalid — reprocess
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Filter with timeout
|
|
100
|
+
try {
|
|
101
|
+
await filterFile(session.path, filtered);
|
|
102
|
+
console.log(filtered);
|
|
103
|
+
} catch (err) {
|
|
104
|
+
if (err.name === 'AbortError') {
|
|
105
|
+
process.stderr.write(`Warning: filter timed out after ${FILTER_TIMEOUT / 1000}s on ${basename(session.path)} — skipping\n`);
|
|
106
|
+
await rm(filtered, { force: true });
|
|
107
|
+
} else {
|
|
108
|
+
process.stderr.write(`Warning: error processing ${basename(session.path)}: ${err.message}\n`);
|
|
109
|
+
await rm(filtered, { force: true });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function filterFile(inputPath, outputPath) {
|
|
115
|
+
const ac = new AbortController();
|
|
116
|
+
const timer = setTimeout(() => ac.abort(), FILTER_TIMEOUT);
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
const st = await stat(inputPath);
|
|
120
|
+
const sentinel = JSON.stringify({
|
|
121
|
+
processed_at: new Date().toISOString(),
|
|
122
|
+
source_size: st.size,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
const output = createWriteStream(outputPath);
|
|
126
|
+
output.write(sentinel + '\n');
|
|
127
|
+
|
|
128
|
+
const rl = createInterface({
|
|
129
|
+
input: createReadStream(inputPath),
|
|
130
|
+
signal: ac.signal,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
let lineCount = 0;
|
|
134
|
+
for await (const line of rl) {
|
|
135
|
+
try {
|
|
136
|
+
const obj = JSON.parse(line);
|
|
137
|
+
const result = filterSessionLine(obj);
|
|
138
|
+
if (result) {
|
|
139
|
+
output.write(JSON.stringify(result) + '\n');
|
|
140
|
+
lineCount++;
|
|
141
|
+
}
|
|
142
|
+
} catch {
|
|
143
|
+
// Skip malformed lines
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
output.end();
|
|
148
|
+
await new Promise((resolve, reject) => {
|
|
149
|
+
output.on('finish', resolve);
|
|
150
|
+
output.on('error', reject);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// Remove files with no content beyond the sentinel
|
|
154
|
+
if (lineCount === 0) {
|
|
155
|
+
await rm(outputPath, { force: true });
|
|
156
|
+
}
|
|
157
|
+
} finally {
|
|
158
|
+
clearTimeout(timer);
|
|
159
|
+
}
|
|
160
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codeyam/codeyam-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Local development CLI for CodeYam analysis",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -11,20 +11,20 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@anthropic-ai/claude-code": "^2.1.7",
|
|
14
|
-
"@anthropic-ai/sdk": "^0.
|
|
14
|
+
"@anthropic-ai/sdk": "^0.78.0",
|
|
15
15
|
"@aws-sdk/client-dynamodb": "^3.990.0",
|
|
16
16
|
"@aws-sdk/s3-request-presigner": "^3.990.0",
|
|
17
17
|
"@aws-sdk/util-dynamodb": "^3.990.0",
|
|
18
18
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
19
|
-
"@octokit/auth-app": "^8.
|
|
19
|
+
"@octokit/auth-app": "^8.2.0",
|
|
20
20
|
"@octokit/request": "^10.0.3",
|
|
21
21
|
"@octokit/rest": "^22.0.0",
|
|
22
22
|
"@react-router/express": "^7.13.0",
|
|
23
|
-
"@react-router/node": "^7.
|
|
23
|
+
"@react-router/node": "^7.13.1",
|
|
24
24
|
"react-router": "^7.13.0",
|
|
25
25
|
"@sendgrid/mail": "^8.1.4",
|
|
26
26
|
"@supabase/supabase-js": "2.88.0",
|
|
27
|
-
"better-sqlite3": "^12.
|
|
27
|
+
"better-sqlite3": "^12.6.2",
|
|
28
28
|
"chalk": "^5.6.2",
|
|
29
29
|
"chokidar": "^4.0.3",
|
|
30
30
|
"cli-spinners": "^3.4.0",
|
|
@@ -41,11 +41,11 @@
|
|
|
41
41
|
"kysely": "^0.28.11",
|
|
42
42
|
"lru-cache": "^11.2.5",
|
|
43
43
|
"lucide-react": "^0.556.0",
|
|
44
|
-
"minimatch": "^10.
|
|
44
|
+
"minimatch": "^10.2.3",
|
|
45
45
|
"openai": "^6.16.0",
|
|
46
|
-
"p-queue": "^
|
|
46
|
+
"p-queue": "^9.1.0",
|
|
47
47
|
"p-retry": "^7.1.1",
|
|
48
|
-
"pg": "^8.
|
|
48
|
+
"pg": "^8.19.0",
|
|
49
49
|
"piscina": "^5.1.4",
|
|
50
50
|
"pixelmatch": "^5.3.0",
|
|
51
51
|
"playwright": "1.58.0",
|
|
@@ -61,7 +61,12 @@
|
|
|
61
61
|
"node-pty": "^1.0.0",
|
|
62
62
|
"sharp": "^0.34.5",
|
|
63
63
|
"ws": "^8.18.3",
|
|
64
|
-
"
|
|
64
|
+
"@xterm/xterm": "^6.0.0",
|
|
65
|
+
"@xterm/addon-fit": "^0.11.0",
|
|
66
|
+
"@xterm/addon-web-links": "^0.11.0",
|
|
67
|
+
"@xterm/addon-webgl": "^0.18.0",
|
|
68
|
+
"@xterm/addon-canvas": "^0.7.0",
|
|
69
|
+
"simple-git": "^3.32.2",
|
|
65
70
|
"typescript": "^5.9.3",
|
|
66
71
|
"uuid": "^11.1.0",
|
|
67
72
|
"yargs": "^18.0.0",
|
|
@@ -75,10 +75,6 @@ export default function generateExecutionFlows({ entity, mergedDataStructure, ch
|
|
|
75
75
|
for (const [shortPath, fullPath] of Object.entries(associationMap)) {
|
|
76
76
|
fullToShortPathMap[fullPath] = shortPath;
|
|
77
77
|
}
|
|
78
|
-
console.log(`[generateExecutionFlows] ${entity.name}: attributesMap has ${Object.keys(resolvedAttributesMap).length} keys, fullToShortPathMap has ${Object.keys(fullToShortPathMap).length} entries`);
|
|
79
|
-
console.log(`[generateExecutionFlows] ${entity.name}: attributesMap keys: [${Object.keys(resolvedAttributesMap).join(', ')}]`);
|
|
80
|
-
console.log(`[generateExecutionFlows] ${entity.name}: fullToShortPathMap: ${JSON.stringify(fullToShortPathMap)}`);
|
|
81
|
-
console.log(`[generateExecutionFlows] ${entity.name}: equivalentSignatureVariables: ${JSON.stringify(equivalentSignatureVariables)}`);
|
|
82
78
|
// Get pre-computed conditional data from metadata
|
|
83
79
|
const conditionalUsages = entity.metadata?.isolatedDataStructure?.conditionalUsages ?? {};
|
|
84
80
|
const compoundConditionals = entity.metadata?.isolatedDataStructure?.compoundConditionals ?? [];
|
|
@@ -111,13 +107,6 @@ export default function generateExecutionFlows({ entity, mergedDataStructure, ch
|
|
|
111
107
|
}
|
|
112
108
|
}
|
|
113
109
|
}
|
|
114
|
-
console.log(`[generateExecutionFlows] ${entity.name}: conditionalUsages keys: [${Object.keys(conditionalUsages).join(', ')}]`);
|
|
115
|
-
console.log(`[generateExecutionFlows] ${entity.name}: conditionalUsages sourceDataPaths: ${JSON.stringify(Object.fromEntries(Object.entries(conditionalUsages).map(([k, v]) => [
|
|
116
|
-
k,
|
|
117
|
-
v.map((u) => u.sourceDataPath ?? '(none)'),
|
|
118
|
-
])))}`);
|
|
119
|
-
console.log(`[generateExecutionFlows] ${entity.name}: compoundConditionals count: ${compoundConditionals.length}`);
|
|
120
|
-
console.log(`[generateExecutionFlows] ${entity.name}: sourceEquivalencies keys count: ${Object.keys(mergedDataStructure.sourceEquivalencies ?? {}).length}`);
|
|
121
110
|
const conditionalsBasedFlows = generateExecutionFlowsFromConditionals({
|
|
122
111
|
conditionalUsages,
|
|
123
112
|
compoundConditionals,
|