@codeyam/codeyam-cli 0.1.7 → 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 +9 -9
- package/analyzer-template/packages/ai/package.json +1 -1
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +34 -3
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +14 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +27 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.ts +62 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +78 -2
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +0 -33
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +19 -7
- package/analyzer-template/packages/analyze/src/lib/asts/index.ts +7 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +9 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +0 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +12 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +65 -28
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +83 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +0 -98
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +23 -4
- package/analyzer-template/packages/aws/package.json +2 -2
- package/analyzer-template/packages/database/index.ts +1 -0
- package/analyzer-template/packages/database/package.json +3 -3
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -0
- package/analyzer-template/packages/database/src/lib/kysely/tables/editorScenariosTable.ts +93 -0
- package/analyzer-template/packages/database/src/lib/loadCommits.ts +31 -20
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +0 -6
- package/analyzer-template/packages/database/src/lib/loadReadyToBeCapturedAnalyses.ts +0 -5
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +94 -143
- package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatus.ts +58 -42
- package/analyzer-template/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.ts +81 -65
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.ts +29 -1
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.ts +33 -5
- package/analyzer-template/packages/github/dist/database/index.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/index.js +1 -0
- package/analyzer-template/packages/github/dist/database/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +5 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts +25 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js +76 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts +5 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/scenariosTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +23 -13
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/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/loadReadyToBeCapturedAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
- package/analyzer-template/packages/github/dist/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +76 -90
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js +41 -30
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
- package/analyzer-template/packages/github/dist/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/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/dist/types/src/types/ProjectMetadata.d.ts +1 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts +10 -0
- package/analyzer-template/packages/github/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/packages/github/package.json +1 -1
- package/analyzer-template/packages/types/src/enums/ProjectFramework.ts +2 -0
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
- package/analyzer-template/packages/types/src/types/Scenario.ts +10 -0
- package/analyzer-template/packages/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/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +1 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts +10 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Scenario.d.ts.map +1 -1
- package/analyzer-template/playwright/captureFromUrl.ts +89 -82
- package/analyzer-template/project/constructMockCode.ts +136 -43
- package/analyzer-template/project/reconcileMockDataKeys.ts +19 -14
- package/analyzer-template/project/start.ts +3 -0
- package/analyzer-template/project/startScenarioCapture.ts +9 -0
- package/analyzer-template/project/writeClientLogRoute.ts +125 -0
- package/analyzer-template/project/writeMockDataTsx.ts +17 -0
- package/analyzer-template/project/writeScenarioComponents.ts +36 -7
- package/analyzer-template/tsconfig.json +13 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +115 -34
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +17 -11
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +2 -0
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/startScenarioCapture.js +5 -0
- package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/writeClientLogRoute.js +110 -0
- package/background/src/lib/virtualized/project/writeClientLogRoute.js.map +1 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +12 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +29 -7
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +208 -11
- package/codeyam-cli/scripts/apply-setup.js.map +1 -1
- package/codeyam-cli/src/__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/cli.js +2 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- 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/analyze.js +17 -7
- package/codeyam-cli/src/commands/analyze.js.map +1 -1
- package/codeyam-cli/src/commands/default.js +14 -2
- package/codeyam-cli/src/commands/default.js.map +1 -1
- package/codeyam-cli/src/commands/editor.js +3215 -0
- package/codeyam-cli/src/commands/editor.js.map +1 -0
- package/codeyam-cli/src/commands/init.js +107 -45
- 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 +855 -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 +304 -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 +520 -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 +339 -0
- package/codeyam-cli/src/utils/__tests__/editorPreview.test.js.map +1 -0
- 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 +855 -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 +1742 -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__/pathIgnoring.test.js +9 -0
- package/codeyam-cli/src/utils/__tests__/pathIgnoring.test.js.map +1 -1
- 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__/scenarioCoverage.test.js +227 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.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 +300 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +50 -4
- 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 +104 -12
- 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/database.js +37 -2
- package/codeyam-cli/src/utils/database.js.map +1 -1
- package/codeyam-cli/src/utils/devModeEvents.js +40 -0
- package/codeyam-cli/src/utils/devModeEvents.js.map +1 -0
- package/codeyam-cli/src/utils/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 +176 -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 +197 -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 +113 -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 +132 -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 +332 -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 +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/fileMetadata.js +5 -0
- package/codeyam-cli/src/utils/fileMetadata.js.map +1 -1
- package/codeyam-cli/src/utils/fileWatcher.js +25 -9
- package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
- package/codeyam-cli/src/utils/git.js +103 -0
- package/codeyam-cli/src/utils/git.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +55 -13
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/interactiveSyncWatcher.js +126 -0
- package/codeyam-cli/src/utils/interactiveSyncWatcher.js.map +1 -0
- package/codeyam-cli/src/utils/parseRegisterArg.js +31 -0
- package/codeyam-cli/src/utils/parseRegisterArg.js.map +1 -0
- package/codeyam-cli/src/utils/pathIgnoring.js +19 -7
- package/codeyam-cli/src/utils/pathIgnoring.js.map +1 -1
- package/codeyam-cli/src/utils/project.js +15 -5
- package/codeyam-cli/src/utils/project.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js +11 -11
- package/codeyam-cli/src/utils/queue/__tests__/heartbeat.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js +22 -0
- package/codeyam-cli/src/utils/queue/__tests__/manager.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/heartbeat.js +13 -5
- package/codeyam-cli/src/utils/queue/heartbeat.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +70 -1
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +7 -6
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/scenarioCoverage.js +75 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -0
- 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 +159 -0
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -0
- package/codeyam-cli/src/utils/serverState.js +57 -2
- package/codeyam-cli/src/utils/serverState.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +82 -11
- 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/testRunner.js +158 -0
- package/codeyam-cli/src/utils/testRunner.js.map +1 -0
- package/codeyam-cli/src/utils/webappDetection.js +35 -2
- 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/database.js +41 -27
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/dbNotifier.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/git.js +397 -0
- package/codeyam-cli/src/webserver/app/lib/git.js.map +1 -0
- package/codeyam-cli/src/webserver/backgroundServer.js +108 -18
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{CopyButton-CtmbP4Gl.js → CopyButton-BPXZwM4t.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityItem-DlMph_Hm.js → EntityItem-BcgbViKV.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-B-0PjGOU.js → EntityTypeBadge-g3saevPb.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-DN9eiJAO.js → EntityTypeIcon-CQIG2qda.js} +9 -9
- package/codeyam-cli/src/webserver/build/client/assets/InlineSpinner-Bu6c6aDe.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-rE_fI2h2.js → InteractivePreview-DYFW3lDD.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CnatsCw2.js → LibraryFunctionPreview-DLeucoVX.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-CSP6DZrh.js → LoadingDots-BU_OAEMP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CMK8Q7yk.js → LogViewer-ceAyBX-H.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-TCV_HBjy.js → ReportIssueModal-BzHcG7SE.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CG2uh31y.js → SafeScreenshot-BED4B6sP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CU_TDYd8.js → ScenarioViewer-Bd-hxofb.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/Spinner-Bb5uFQ5V.js +34 -0
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D7IoaWUW.js → TruncatedFilePath-C8OKAR5x.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ViewportInspectBar-oAf2Kqsf.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{_index-B8z7mjR-.js → _index-DLxKhri3.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DZu78RI1.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-web-links-Duc5hnl7.js +1 -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-Dm5RS9il.js → agent-transcripts-Bni3iiUj.js} +5 -5
- package/codeyam-cli/src/webserver/build/client/assets/api.dev-mode-events-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-audit-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-capture-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-client-errors-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-commit-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-dev-server-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-entity-status-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-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-journal-entry-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-image._-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-screenshot-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-journal-update-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-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/api.editor-refresh-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-register-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-coverage-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-data-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenario-image._-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-scenarios-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-switch-scenario-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-test-results-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{book-open-Bp5FLkd4.js → book-open-BYOypzCa.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DQJA9f4o.js → chevron-down-C_Pmso5S.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-JZWAC4HX-7VptmeIr.js → chunk-JZWAC4HX-C4pqxYJB.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-B6C4LY9o.js → circle-check-BVMi9VA5.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{copy-6nzYCu0G.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._-C6PQhwY5.js → entity._sha._-BsDXNp45.js} +9 -9
- 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/entity._sha_.create-scenario-p9hhkjJM.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-C7ysA4Jq.js → entity._sha_.edit._scenarioId-BMvVHNXU.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CU6EUArK.js → entry.client-DTvKq3TY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-EWpfFU4X.js → fileTableUtils-cPo8LiG3.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{files-CrxAoWIL.js → files-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-7-1FmlHo.js → index-10oVnAAH.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-DuYcwYp_.js → index-BcvgDzbZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/index-yHOVb4rc.js +15 -0
- package/codeyam-cli/src/webserver/build/client/assets/{labs-CPPVOSWB.js → labs-Zk7ryIM1.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BnDcD54R.js → loader-circle-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-DhQX2g22.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-DborVoKD.js → search-Di64LWVb.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{settings-BWunYSXt.js → settings-0OrEMU6J.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-BtrtCYJg.js → simulations-DWT-CvLy.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{terminal-Bs4NC-VZ.js → terminal-Br7MOqts.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-DTf3Jojp.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/client/assets/useLastLogLine-C14nCb1q.js +2 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-BsQb6rFd.js → useReportContext-O-jkvSPx.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-BOur3mUv.js → useToast-9FIWuYfK.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/xterm-BqvuqXEL.js +27 -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/devServer.js +39 -5
- package/codeyam-cli/src/webserver/devServer.js.map +1 -1
- package/codeyam-cli/src/webserver/editorProxy.js +877 -0
- package/codeyam-cli/src/webserver/editorProxy.js.map +1 -0
- package/codeyam-cli/src/webserver/scripts/codeyam-preload.mjs +414 -0
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +230 -0
- package/codeyam-cli/src/webserver/server.js +258 -1
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +726 -0
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -0
- 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 +147 -0
- package/codeyam-cli/templates/editor-step-hook.py +236 -0
- 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/isolation-route/next-app.tsx.template +80 -0
- package/codeyam-cli/templates/isolation-route/next-pages.tsx.template +79 -0
- package/codeyam-cli/templates/isolation-route/vite-react.tsx.template +78 -0
- package/codeyam-cli/templates/msw/browser-setup.ts.template +47 -0
- package/codeyam-cli/templates/msw/handler-router.ts.template +47 -0
- package/codeyam-cli/templates/msw/server-setup.ts.template +52 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/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/api/todos/route.ts +17 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/codeyam-isolate/layout.tsx +12 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/globals.css +26 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/layout.tsx +34 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/lib/prisma.ts +24 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/app/page.tsx +10 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/env +4 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/eslint.config.mjs +11 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/gitignore +64 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/next.config.ts +14 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/package.json +39 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/postcss.config.mjs +7 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/schema.prisma +27 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma/seed.ts +40 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/prisma.config.ts +12 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/seed-adapter.ts +92 -0
- package/codeyam-cli/templates/nextjs-prisma-sqlite/tsconfig.json +34 -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-supabase/SUPABASE_SETUP.md +104 -0
- 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 +237 -0
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +148 -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 +17 -10
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +22 -4
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +10 -2
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +21 -0
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js +54 -0
- package/packages/ai/src/lib/dataStructure/helpers/coercePrimitivesToArraysBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js +34 -0
- package/packages/ai/src/lib/dataStructure/helpers/stripNullableMarkers.js.map +1 -0
- package/packages/ai/src/lib/generateEntityScenarioData.js +57 -2
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +0 -11
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +13 -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/analyze/analyzeEntities.js +8 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +0 -5
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +9 -0
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +54 -27
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +65 -0
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +0 -40
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +18 -4
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/database/index.js +1 -0
- package/packages/database/index.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +5 -0
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js +76 -0
- package/packages/database/src/lib/kysely/tables/editorScenariosTable.js.map +1 -0
- package/packages/database/src/lib/loadCommits.js +23 -13
- package/packages/database/src/lib/loadCommits.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +0 -6
- package/packages/database/src/lib/loadEntities.js.map +1 -1
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js +1 -4
- package/packages/database/src/lib/loadReadyToBeCapturedAnalyses.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +76 -90
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/database/src/lib/updateFreshAnalysisStatus.js +41 -30
- package/packages/database/src/lib/updateFreshAnalysisStatus.js.map +1 -1
- package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js +68 -57
- package/packages/database/src/lib/updateFreshAnalysisStatusWithScenarios.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js +29 -1
- package/packages/generate/src/lib/componentScenarioPage/generateScenarioClientWrapper.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js +33 -5
- package/packages/generate/src/lib/componentScenarioPage/getIFrameMessageListenerCode.js.map +1 -1
- package/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/InlineSpinner-C1rIyZdV.js +0 -34
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-D-QUFOwe.js +0 -21
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DmzSmblj.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha.scenarios._scenarioId.fullscreen-DVTcUnur.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-BVgNO76F.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/git-BldHtKeW.js +0 -15
- package/codeyam-cli/src/webserver/build/client/assets/globals-CLmFdUae.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-717e346a.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/memory-0wMU4KXe.js +0 -93
- package/codeyam-cli/src/webserver/build/client/assets/root-DqfSDjyQ.js +0 -62
- package/codeyam-cli/src/webserver/build/client/assets/useCustomSizes-D_bDZyDU.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useLastLogLine-DZp6rrQD.js +0 -2
- package/codeyam-cli/src/webserver/build/server/assets/index-B8jmgmn2.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-9OU4lmvL.js +0 -285
- package/scripts/finalize-analyzer.cjs +0 -13
- /package/codeyam-cli/templates/{codeyam-diagnose.md → commands/codeyam-diagnose.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-debug.md → skills/codeyam-debug/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-new-rule.md → skills/codeyam-new-rule/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-setup.md → skills/codeyam-setup/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-sim.md → skills/codeyam-sim/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-test.md → skills/codeyam-test/SKILL.md} +0 -0
- /package/codeyam-cli/templates/{codeyam-verify.md → skills/codeyam-verify/SKILL.md} +0 -0
|
@@ -0,0 +1,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,46 @@
|
|
|
1
|
+
# Session Log Analysis Prompt
|
|
2
|
+
|
|
3
|
+
You are analyzing a filtered Claude Code session transcript to find instances where Claude got confused about **this specific codebase**. The transcript has been preprocessed — each line is a JSON object with `type` ("user" or "assistant"), `ts` (timestamp), and `content`.
|
|
4
|
+
|
|
5
|
+
## Your Task
|
|
6
|
+
|
|
7
|
+
Read the session file provided and identify moments where Claude demonstrated confusion that a `.claude/rules/` rule could have prevented.
|
|
8
|
+
|
|
9
|
+
## Signal Types to Detect
|
|
10
|
+
|
|
11
|
+
1. **USER_CORRECTION** — The user corrects Claude's approach, code, or assumption. Look for: "no, that's not how...", "actually...", "you need to use X not Y", "that's wrong", explicit disagreement.
|
|
12
|
+
|
|
13
|
+
2. **RE_EDIT** — Claude edits the same file multiple times in quick succession, indicating the first attempt was wrong. Look for: multiple Edit/Write tool calls targeting the same file path with different content.
|
|
14
|
+
|
|
15
|
+
3. **FAILED_PIVOT** — A tool call fails (test failure, bash error, type error) and Claude switches to a different approach. Look for: error in tool result followed by a new strategy in the next assistant message.
|
|
16
|
+
|
|
17
|
+
4. **WRONG_ASSUMPTION** — Claude's thinking or text reveals an incorrect assumption about the codebase. Look for: statements that contradict later evidence, "I assumed...", reasoning that turns out wrong.
|
|
18
|
+
|
|
19
|
+
5. **TRIBAL_KNOWLEDGE** — The user provides context Claude didn't have but needed. Look for: the user explaining how something works, why something is the way it is, historical context, non-obvious conventions.
|
|
20
|
+
|
|
21
|
+
6. **APPROACH_PIVOT** — Claude abandons a call chain mid-stream and tries something completely different (without an explicit error triggering it). Look for: sudden topic/strategy shifts in assistant messages.
|
|
22
|
+
|
|
23
|
+
## Rules for Reporting
|
|
24
|
+
|
|
25
|
+
- **Only report codebase-specific confusion.** Generic programming mistakes (typos, syntax errors, forgetting imports for standard libraries) are NOT worth reporting.
|
|
26
|
+
- **Only report findings where a `.claude/rules/` rule would prevent the confusion.** If the confusion is situational or one-off, skip it.
|
|
27
|
+
- **Maximum 5 findings per session.** Prioritize the strongest, most rule-worthy signals.
|
|
28
|
+
- **Be precise about file paths.** If the confusion relates to specific files, include them.
|
|
29
|
+
|
|
30
|
+
## Output Format
|
|
31
|
+
|
|
32
|
+
Return a JSON array (no markdown fences, no explanation outside the array). Each element:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"signal": "USER_CORRECTION | RE_EDIT | FAILED_PIVOT | WRONG_ASSUMPTION | TRIBAL_KNOWLEDGE | APPROACH_PIVOT",
|
|
37
|
+
"summary": "One sentence describing what went wrong",
|
|
38
|
+
"evidence": "Brief quote or paraphrase from the session proving this happened",
|
|
39
|
+
"file_path": "path/to/relevant/file.ts or null if not file-specific",
|
|
40
|
+
"topic": "kebab-case-topic-label",
|
|
41
|
+
"rule_worthy": true,
|
|
42
|
+
"rule_worthy_reason": "Why a rule would prevent this from recurring"
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If the session contains no codebase-specific confusion worth documenting, return an empty array: `[]`
|
|
@@ -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,30 +1,30 @@
|
|
|
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": {
|
|
7
7
|
"codeyam": "./codeyam-cli/src/codeyam-cli.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"postinstall": "node ./scripts/
|
|
10
|
+
"postinstall": "node ./scripts/npm-post-install.cjs"
|
|
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",
|
|
@@ -58,8 +58,15 @@
|
|
|
58
58
|
"react-resizable": "^3.0.5",
|
|
59
59
|
"react-syntax-highlighter": "^15.6.1",
|
|
60
60
|
"remark-gfm": "^4.0.1",
|
|
61
|
+
"node-pty": "^1.0.0",
|
|
61
62
|
"sharp": "^0.34.5",
|
|
62
|
-
"
|
|
63
|
+
"ws": "^8.18.3",
|
|
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",
|
|
63
70
|
"typescript": "^5.9.3",
|
|
64
71
|
"uuid": "^11.1.0",
|
|
65
72
|
"yargs": "^18.0.0",
|
|
@@ -742,10 +742,28 @@ export class ASTScopeAnalyzer {
|
|
|
742
742
|
// Handle union types - we simplify unions to the most specific common type
|
|
743
743
|
if (tsType.flags & ts.TypeFlags.Union) {
|
|
744
744
|
const unionType = tsType;
|
|
745
|
-
// Check if it's a string literal union
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
745
|
+
// Check if it's a string literal union (optionally with null/undefined).
|
|
746
|
+
// Preserve literal values so the LLM knows which values are valid when
|
|
747
|
+
// generating mock data. Without this, types like
|
|
748
|
+
// 'suggestion' | 'warning' | 'achievement' | 'tip' become just 'string'
|
|
749
|
+
// and the LLM generates invalid values (e.g. "Motivational").
|
|
750
|
+
const stringLiterals = unionType.types.filter((t) => (t.flags & ts.TypeFlags.StringLiteral) !== 0);
|
|
751
|
+
const nullishTypes = unionType.types.filter((t) => (t.flags & ts.TypeFlags.Undefined) !== 0 ||
|
|
752
|
+
(t.flags & ts.TypeFlags.Null) !== 0);
|
|
753
|
+
if (stringLiterals.length > 0 &&
|
|
754
|
+
stringLiterals.length + nullishTypes.length === unionType.types.length) {
|
|
755
|
+
const literalValues = stringLiterals.map((t) => `'${t.value}'`);
|
|
756
|
+
const literalUnion = literalValues.join(' | ');
|
|
757
|
+
if (nullishTypes.length > 0) {
|
|
758
|
+
const nullishParts = [];
|
|
759
|
+
if (nullishTypes.some((t) => (t.flags & ts.TypeFlags.Null) !== 0))
|
|
760
|
+
nullishParts.push('null');
|
|
761
|
+
if (nullishTypes.some((t) => (t.flags & ts.TypeFlags.Undefined) !== 0))
|
|
762
|
+
nullishParts.push('undefined');
|
|
763
|
+
return `${literalUnion} | ${nullishParts.join(' | ')}`;
|
|
764
|
+
}
|
|
765
|
+
return literalUnion;
|
|
766
|
+
}
|
|
749
767
|
// Check if it's a number literal union
|
|
750
768
|
const isAllNumberLiterals = unionType.types.every((t) => (t.flags & ts.TypeFlags.NumberLiteral) !== 0);
|
|
751
769
|
if (isAllNumberLiterals)
|