@codeyam/codeyam-cli 0.1.0-staging.1669d45 → 0.1.0-staging.323686
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 +3 -3
- package/analyzer-template/packages/ai/index.ts +9 -1
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +48 -34
- package/analyzer-template/packages/ai/src/lib/astScopes/arrayDerivationDetector.ts +199 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +31 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +139 -23
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.ts +6 -126
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +277 -8
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +73 -1
- package/analyzer-template/packages/ai/src/lib/completionCall.ts +198 -34
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +108 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.ts +205 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +10 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +23 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +87 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +32 -7
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.ts +129 -0
- package/analyzer-template/packages/ai/src/lib/dataStructureChunking.ts +156 -0
- package/analyzer-template/packages/ai/src/lib/e2eDataTracking.ts +334 -0
- package/analyzer-template/packages/ai/src/lib/extractCriticalDataKeys.ts +120 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +626 -6
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +26 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +375 -6
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +1003 -45
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +239 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChunkPrompt.ts +82 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateCriticalKeysPrompt.ts +103 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +23 -6
- package/analyzer-template/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.ts +391 -0
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +154 -32
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +22 -1
- package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
- package/analyzer-template/packages/analyze/src/lib/analysisContext.ts +44 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +10 -13
- package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +33 -7
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +142 -73
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +42 -5
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +1 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +77 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +56 -11
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/kysely/db.ts +8 -1
- package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
- package/analyzer-template/packages/database/src/lib/loadAnalyses.ts +58 -1
- package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
- package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
- package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
- package/analyzer-template/packages/database/src/lib/loadCommits.ts +28 -0
- package/analyzer-template/packages/database/src/lib/loadEntities.ts +26 -3
- package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
- package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
- 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 +8 -1
- 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/analysesTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
- package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts +2 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js +45 -2
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalyses.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts +3 -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 +22 -1
- 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 +3 -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 +23 -4
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntities.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
- 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 +5 -4
- package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts +1 -1
- package/analyzer-template/packages/github/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts +25 -1
- package/analyzer-template/packages/github/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
- package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +51 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts +9 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js +29 -3
- package/analyzer-template/packages/github/dist/utils/src/lib/safeFileName.js.map +1 -1
- package/analyzer-template/packages/types/index.ts +1 -0
- package/analyzer-template/packages/types/src/types/Analysis.ts +25 -0
- package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +64 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts +1 -1
- package/analyzer-template/packages/utils/dist/types/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts +25 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Analysis.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +51 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts +9 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js +29 -3
- package/analyzer-template/packages/utils/dist/utils/src/lib/safeFileName.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/safeFileName.ts +48 -3
- package/analyzer-template/playwright/capture.ts +20 -8
- package/analyzer-template/playwright/captureStatic.ts +1 -1
- package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
- package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
- package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
- package/analyzer-template/project/constructMockCode.ts +314 -29
- package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
- package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
- package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
- package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +18 -7
- package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
- package/analyzer-template/project/orchestrateCapture.ts +71 -6
- package/analyzer-template/project/reconcileMockDataKeys.ts +152 -9
- package/analyzer-template/project/runAnalysis.ts +4 -0
- package/analyzer-template/project/start.ts +35 -11
- package/analyzer-template/project/writeMockDataTsx.ts +114 -2
- package/analyzer-template/project/writeScenarioComponents.ts +101 -8
- package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
- package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
- package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
- package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
- package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +255 -4
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
- package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
- package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
- package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +7 -5
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +58 -6
- package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +126 -9
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runAnalysis.js +3 -0
- package/background/src/lib/virtualized/project/runAnalysis.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +32 -11
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +89 -2
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +57 -8
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/codeyam-cli/src/cli.js +2 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +273 -0
- package/codeyam-cli/src/commands/memory.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +4 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analysisRunner.js +21 -2
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +20 -6
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +1 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/queue/manager.js +6 -0
- package/codeyam-cli/src/utils/queue/manager.js.map +1 -1
- package/codeyam-cli/src/utils/rules/index.js +5 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -0
- package/codeyam-cli/src/utils/rules/parser.js +106 -0
- package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
- package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +132 -0
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +2 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +7 -3
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/bootstrap.js +40 -0
- package/codeyam-cli/src/webserver/bootstrap.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-DsN1wKrm.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-COi5OvsN.js → EntityTypeBadge-DLqD3qNt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-BwdQv49w.js → EntityTypeIcon-Ba2JVPzP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-CEleMv_j.js → InlineSpinner-C8lyxW9k.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-D68KarMg.js → InteractivePreview-aht4aafF.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-L75Wvqgw.js → LibraryFunctionPreview-CVtiBnY5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-C53WM8qn.js → LoadingDots-B0GLXMsr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-CrNkmy4i.js → LogViewer-xgeCVgSM.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-OApQuNyq.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-CQifa1n-.js → SafeScreenshot-DuDvi0jm.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-CyaBFX7l.js → ScenarioViewer-DzccYyI8.js} +3 -13
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-D36O1rzU.js → TruncatedFilePath-DyFZkK0l.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-BwqWJOgH.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BwavGCpm.js +32 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.health-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.restart-server-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-DgTPh8H-.js → chevron-down-Cx24_aWc.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-DdQKK6on.js → chunk-EPOLDU6W-CXRTFQ3F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-Dmr2bb1R.js → circle-check-BOARzkeR.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-Bb-80kDT.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-Do4ZLUYa.js → createLucideIcon-BdhJEx6B.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BBnGWYga.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-CbdFyxZh.js → entity._sha._-BJUiQqZF.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-B4iCfs5M.js → entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-wDWZZO1W.js → entity._sha_.create-scenario-D1T4TGjf.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-BMbl7MeQ.js → entity._sha_.edit._scenarioId-CTBG2mmz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-5wRKRIH9.js → entry.client-CS2cb_eZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/file-code-Dhef1kWN.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DD3SDH7t.js → fileTableUtils-DMJ7zii9.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-CJ6lTdTA.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{git-zXjT7J0G.js → git-CPTZZ-JZ.js} +8 -8
- package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-DLbXwndH.js → index-B1h680n5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-gPZ-lad1.js → index-lzqtyFU8.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-BsPXJ81F.js → loader-circle-B7B9V-bu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-7522edd4.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +92 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-eVAaavTS.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-P2FKIUql.js → search-CxXUmBSd.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-B2eDuBj8.js → settings-CS5f3WzT.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-L18M6-kN.js → simulations-DwFIBT09.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-BDz7kbVA.js → triangle-alert-B6LgvRJg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-29dDmbH8.js → useCustomSizes-C1v1PQzo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BUm0UVJm.js → useLastLogLine-aSv48UbS.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-CkIOKTrZ.js → useReportContext-DYxHZQuP.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-KKw5kTn-.js → useToast-mBRpZPiu.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-DVzYx8PN.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +257 -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/templates/codeyam-memory-hook.sh +200 -0
- package/codeyam-cli/templates/codeyam:debug.md +47 -3
- package/codeyam-cli/templates/codeyam:diagnose.md +203 -25
- package/codeyam-cli/templates/codeyam:memory.md +462 -0
- package/codeyam-cli/templates/codeyam:new-rule.md +13 -0
- package/package.json +8 -5
- package/packages/ai/index.js +5 -2
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +41 -17
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js +150 -0
- package/packages/ai/src/lib/astScopes/arrayDerivationDetector.js.map +1 -0
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +24 -0
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/methodSemantics.js +109 -23
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js +1 -102
- package/packages/ai/src/lib/astScopes/patterns/variableDeclarationHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +228 -11
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/completionCall.js +161 -30
- package/packages/ai/src/lib/completionCall.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +86 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js +179 -0
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/MuiManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +7 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +19 -0
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +70 -2
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +29 -7
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js +107 -0
- package/packages/ai/src/lib/dataStructure/helpers/fixNullIdsBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructureChunking.js +111 -0
- package/packages/ai/src/lib/dataStructureChunking.js.map +1 -0
- package/packages/ai/src/lib/e2eDataTracking.js +241 -0
- package/packages/ai/src/lib/e2eDataTracking.js.map +1 -0
- package/packages/ai/src/lib/extractCriticalDataKeys.js +96 -0
- package/packages/ai/src/lib/extractCriticalDataKeys.js.map +1 -0
- package/packages/ai/src/lib/generateEntityScenarioData.js +510 -7
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +19 -1
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +273 -4
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +738 -40
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js +194 -0
- package/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js +54 -0
- package/packages/ai/src/lib/promptGenerators/generateChunkPrompt.js.map +1 -0
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +15 -7
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js +335 -0
- package/packages/ai/src/lib/promptGenerators/simplifyKeysForLLM.js.map +1 -0
- package/packages/ai/src/lib/resolvePathToControllable.js +131 -27
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
- package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
- package/packages/analyze/src/lib/analysisContext.js +30 -5
- package/packages/analyze/src/lib/analysisContext.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +8 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
- package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +31 -7
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +116 -66
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +37 -5
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +65 -0
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +46 -9
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
- package/packages/database/src/lib/kysely/db.js +8 -1
- package/packages/database/src/lib/kysely/db.js.map +1 -1
- package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
- package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
- package/packages/database/src/lib/loadAnalyses.js +45 -2
- package/packages/database/src/lib/loadAnalyses.js.map +1 -1
- package/packages/database/src/lib/loadAnalysis.js +8 -0
- package/packages/database/src/lib/loadAnalysis.js.map +1 -1
- package/packages/database/src/lib/loadBranch.js +11 -1
- package/packages/database/src/lib/loadBranch.js.map +1 -1
- package/packages/database/src/lib/loadCommit.js +7 -0
- package/packages/database/src/lib/loadCommit.js.map +1 -1
- package/packages/database/src/lib/loadCommits.js +22 -1
- package/packages/database/src/lib/loadCommits.js.map +1 -1
- package/packages/database/src/lib/loadEntities.js +23 -4
- package/packages/database/src/lib/loadEntities.js.map +1 -1
- package/packages/database/src/lib/loadEntityBranches.js +9 -0
- package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
- package/packages/database/src/lib/updateCommitMetadata.js +5 -4
- package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
- package/packages/types/index.js.map +1 -1
- package/packages/utils/src/lib/safeFileName.js +29 -3
- package/packages/utils/src/lib/safeFileName.js.map +1 -1
- package/scripts/finalize-analyzer.cjs +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-vauWK972.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-DzJRkCkr.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/_index-Be83mo_j.js +0 -11
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-BN6wu6Y-.js +0 -37
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-Bn6aCAy_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-DKyMFI90.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-DTTQ3gY7.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-22590fcf.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-BsAarjAM.js +0 -57
- package/codeyam-cli/src/webserver/build/server/assets/index-BND5I5fv.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-CFXnd7MG.js +0 -228
|
@@ -16,7 +16,6 @@ import { awsLog } from '~codeyam/utils';
|
|
|
16
16
|
import gatherDataForMocks from './gatherDataForMocks';
|
|
17
17
|
import enrichArrayTypesFromChildSignatures from './enrichArrayTypesFromChildSignatures';
|
|
18
18
|
import enrichUnknownTypesFromSourceEquivalencies from './enrichUnknownTypesFromSourceEquivalencies';
|
|
19
|
-
|
|
20
19
|
export interface GenerateDataStructureArgs {
|
|
21
20
|
entity: Entity;
|
|
22
21
|
dependentAnalyses: ReadonlyAnalysisMap;
|
|
@@ -256,8 +255,10 @@ export default function generateDataStructure({
|
|
|
256
255
|
);
|
|
257
256
|
|
|
258
257
|
if (existingImport) {
|
|
259
|
-
// Merge
|
|
260
|
-
|
|
258
|
+
// Merge calls from child into existing import
|
|
259
|
+
// Note: Check length > 0 because empty array [] is truthy but has no variable names
|
|
260
|
+
if (imported.callVariableNames?.length && imported.calls) {
|
|
261
|
+
// Case 1: Both calls and callVariableNames are set - merge as pairs
|
|
261
262
|
existingImport.calls = existingImport.calls || [];
|
|
262
263
|
existingImport.callVariableNames =
|
|
263
264
|
existingImport.callVariableNames || [];
|
|
@@ -274,6 +275,18 @@ export default function generateDataStructure({
|
|
|
274
275
|
existingImport.callVariableNames.push(varName);
|
|
275
276
|
}
|
|
276
277
|
}
|
|
278
|
+
} else if (imported.calls) {
|
|
279
|
+
// Case 2: Only calls are set (no callVariableNames) - common with tRPC
|
|
280
|
+
// where destructuring like `const { data, isLoading } = trpc.xxx.useQuery()`
|
|
281
|
+
// doesn't create a variable name for the hook call itself
|
|
282
|
+
existingImport.calls = existingImport.calls || [];
|
|
283
|
+
|
|
284
|
+
// Add each call that doesn't already exist
|
|
285
|
+
for (const call of imported.calls) {
|
|
286
|
+
if (!existingImport.calls.includes(call)) {
|
|
287
|
+
existingImport.calls.push(call);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
277
290
|
}
|
|
278
291
|
} else {
|
|
279
292
|
// Add new import
|
|
@@ -527,10 +540,13 @@ export default function generateDataStructure({
|
|
|
527
540
|
|
|
528
541
|
// Enrich mocked dependency array types with fields from child component signatures
|
|
529
542
|
// This ensures that when getSurveysAction returns { data: array }, and SurveyCard
|
|
530
|
-
// expects survey.updatedAt, the array element type includes updatedAt
|
|
543
|
+
// expects survey.updatedAt, the array element type includes updatedAt.
|
|
544
|
+
// Uses usageEquivalencies to trace data flow and only enrich arrays with fields
|
|
545
|
+
// from children that actually receive elements from that specific array.
|
|
531
546
|
enrichArrayTypesFromChildSignatures(
|
|
532
547
|
allImportedExports,
|
|
533
548
|
mergedDataStructure.dependencySchemas,
|
|
549
|
+
mergedDataStructure.usageEquivalencies,
|
|
534
550
|
);
|
|
535
551
|
|
|
536
552
|
// Enrich mocked dependency unknown types using sourceEquivalencies
|
|
@@ -544,12 +560,33 @@ export default function generateDataStructure({
|
|
|
544
560
|
allImportedExports,
|
|
545
561
|
);
|
|
546
562
|
|
|
547
|
-
|
|
563
|
+
let dataForMocks = gatherDataForMocks(
|
|
548
564
|
allImportedExports,
|
|
549
565
|
mergedDataStructure.dependencySchemas,
|
|
550
566
|
{ entityName: entity.name },
|
|
551
567
|
);
|
|
552
568
|
|
|
569
|
+
// Merge dataForMocks from non-mocked child analyses to include transitive dependency data.
|
|
570
|
+
// This handles cases where grandchild trpc calls aren't in allImportedExports because
|
|
571
|
+
// the grandchild's analysis wasn't in dependentAnalyses.
|
|
572
|
+
//
|
|
573
|
+
// Issue 19 fix: The child's dataForMocks already contains merged data from its
|
|
574
|
+
// dependencies (including grandchildren). By merging the child's dataForMocks,
|
|
575
|
+
// we transitively include all nested dependency data.
|
|
576
|
+
for (const filePath in nonMockedDependentAnalyses) {
|
|
577
|
+
for (const name in nonMockedDependentAnalyses[filePath]) {
|
|
578
|
+
const childAnalysis = nonMockedDependentAnalyses[filePath][name];
|
|
579
|
+
const childDataForMocks =
|
|
580
|
+
childAnalysis?.metadata?.scenariosDataStructure?.dataForMocks;
|
|
581
|
+
if (childDataForMocks && Object.keys(childDataForMocks).length > 0) {
|
|
582
|
+
dataForMocks = mergeJsonTypeDefinitions(
|
|
583
|
+
dataForMocks as Record<string, unknown>,
|
|
584
|
+
childDataForMocks as Record<string, unknown>,
|
|
585
|
+
) as { [importAlias: string]: JsonTypeDefinition };
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
|
|
553
590
|
const finalizedArgumentsSchema = fillInDirectSchemaGapsAndUnknowns({
|
|
554
591
|
schema: { ...mergedDataStructure.signatureSchema },
|
|
555
592
|
});
|
package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts
CHANGED
|
@@ -108,7 +108,7 @@ export default async function generateExecutionFlows({
|
|
|
108
108
|
* then looks them up in importedExports to get their file paths,
|
|
109
109
|
* then retrieves their metadata from dependentAnalyses.
|
|
110
110
|
*/
|
|
111
|
-
function buildChildEntityMetadata(
|
|
111
|
+
export function buildChildEntityMetadata(
|
|
112
112
|
entity: Entity,
|
|
113
113
|
dependentAnalyses?: ReadonlyAnalysisMap,
|
|
114
114
|
): Record<string, Entity['metadata']> {
|
package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts
CHANGED
|
@@ -1134,6 +1134,83 @@ export default function mergeInDependentDataStructure({
|
|
|
1134
1134
|
}
|
|
1135
1135
|
|
|
1136
1136
|
cleanSchema(depSchema.returnValueSchema);
|
|
1137
|
+
|
|
1138
|
+
// Pull signature requirements from downstream functions into the mocked return value.
|
|
1139
|
+
// When a mocked function's return flows into another function's signature (via usageEquivalencies),
|
|
1140
|
+
// we need to include that function's signature requirements in the mock.
|
|
1141
|
+
//
|
|
1142
|
+
// Example: fromE5() returns a currency object that flows to calculateTotalPrice(price, quantity).
|
|
1143
|
+
// calculateTotalPrice's signatureSchema shows signature[0].multiply() is required.
|
|
1144
|
+
// We need to add multiply() to fromE5's mock return value.
|
|
1145
|
+
const usageEquivalencies = srcSchema.usageEquivalencies ?? {};
|
|
1146
|
+
for (const [returnPath, equivalencies] of Object.entries(
|
|
1147
|
+
usageEquivalencies,
|
|
1148
|
+
)) {
|
|
1149
|
+
// Only process return value paths (functionCallReturnValue)
|
|
1150
|
+
if (!returnPath.includes('.functionCallReturnValue')) continue;
|
|
1151
|
+
|
|
1152
|
+
for (const equiv of equivalencies) {
|
|
1153
|
+
// Check if this equivalency points to a signature path
|
|
1154
|
+
const signatureMatch = equiv.schemaPath.match(/\.signature\[(\d+)\]$/);
|
|
1155
|
+
if (!signatureMatch) continue;
|
|
1156
|
+
|
|
1157
|
+
const targetFunctionName = cleanFunctionName(equiv.scopeNodeName);
|
|
1158
|
+
const signatureIndex = signatureMatch[1];
|
|
1159
|
+
|
|
1160
|
+
// Look up the target function's analysis to get its signature requirements
|
|
1161
|
+
// First try dependentAnalyses, then dependencySchemas
|
|
1162
|
+
let targetSignatureSchema: Record<string, string> | undefined;
|
|
1163
|
+
|
|
1164
|
+
// Check dependentAnalyses first (has the full merged analysis)
|
|
1165
|
+
for (const depFilePath in dependentAnalyses) {
|
|
1166
|
+
const analysis = dependentAnalyses[depFilePath]?.[targetFunctionName];
|
|
1167
|
+
if (analysis?.metadata?.mergedDataStructure?.signatureSchema) {
|
|
1168
|
+
targetSignatureSchema =
|
|
1169
|
+
analysis.metadata.mergedDataStructure.signatureSchema;
|
|
1170
|
+
break;
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
// Fallback to dependencySchemas if not found
|
|
1175
|
+
if (!targetSignatureSchema) {
|
|
1176
|
+
for (const depFilePath in dependencySchemas) {
|
|
1177
|
+
const schema = dependencySchemas[depFilePath]?.[targetFunctionName];
|
|
1178
|
+
if (schema?.signatureSchema) {
|
|
1179
|
+
targetSignatureSchema = schema.signatureSchema;
|
|
1180
|
+
break;
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
if (!targetSignatureSchema) continue;
|
|
1186
|
+
|
|
1187
|
+
// Find all paths in the target's signatureSchema that extend from signature[N]
|
|
1188
|
+
// e.g., signature[0].multiply(quantity) -> .multiply(quantity)
|
|
1189
|
+
const signaturePrefix = `signature[${signatureIndex}]`;
|
|
1190
|
+
for (const [sigPath, sigType] of Object.entries(
|
|
1191
|
+
targetSignatureSchema,
|
|
1192
|
+
)) {
|
|
1193
|
+
if (!sigPath.startsWith(signaturePrefix)) continue;
|
|
1194
|
+
|
|
1195
|
+
// Skip the base signature[N] path itself - we only want the method/property extensions
|
|
1196
|
+
if (sigPath === signaturePrefix) continue;
|
|
1197
|
+
|
|
1198
|
+
// Extract the suffix after signature[N] (e.g., ".multiply(quantity)")
|
|
1199
|
+
const suffix = sigPath.slice(signaturePrefix.length);
|
|
1200
|
+
|
|
1201
|
+
// Build the path for the mocked return value
|
|
1202
|
+
// e.g., fromE5(priceE5).functionCallReturnValue.multiply(quantity)
|
|
1203
|
+
const returnValuePath = returnPath + suffix;
|
|
1204
|
+
|
|
1205
|
+
// Add to the mocked dependency's return value schema if not already present
|
|
1206
|
+
if (!(returnValuePath in depSchema.returnValueSchema)) {
|
|
1207
|
+
depSchema.returnValueSchema[returnValuePath] = sigType;
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
cleanSchema(depSchema.returnValueSchema);
|
|
1137
1214
|
}
|
|
1138
1215
|
|
|
1139
1216
|
// Process the input dependencySchemas FIRST (before child dependentAnalyses).
|
package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts
CHANGED
|
@@ -2,6 +2,49 @@ import { splitOutsideParenthesesAndArrays } from '~codeyam/ai';
|
|
|
2
2
|
import { JsonTypeDefinition, ReadonlyAnalysisMap } from '~codeyam/types';
|
|
3
3
|
import { awsLog } from '~codeyam/utils';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Deep merge for JsonTypeDefinition schemas.
|
|
7
|
+
* Only recursively merges when BOTH sides are plain objects (not arrays, not primitives).
|
|
8
|
+
* This is different from the general deepMerge which is designed for data values -
|
|
9
|
+
* here we're merging type schemas where leaf values are strings like "boolean" or "function".
|
|
10
|
+
*
|
|
11
|
+
* When types are incompatible (e.g., array vs object), prefer keeping the base value
|
|
12
|
+
* since it was set first from the root entity's validatedVariables.
|
|
13
|
+
*/
|
|
14
|
+
function deepMergeSchemas(
|
|
15
|
+
base: JsonTypeDefinition,
|
|
16
|
+
override: JsonTypeDefinition,
|
|
17
|
+
): JsonTypeDefinition {
|
|
18
|
+
// If override is null/undefined, return base
|
|
19
|
+
if (override === null || override === undefined) return base;
|
|
20
|
+
// If base is null/undefined, return override
|
|
21
|
+
if (base === null || base === undefined) return override;
|
|
22
|
+
|
|
23
|
+
// Only recursively merge if BOTH are plain objects (not arrays, not primitives)
|
|
24
|
+
const baseIsPlainObject =
|
|
25
|
+
typeof base === 'object' && !Array.isArray(base) && base !== null;
|
|
26
|
+
const overrideIsPlainObject =
|
|
27
|
+
typeof override === 'object' &&
|
|
28
|
+
!Array.isArray(override) &&
|
|
29
|
+
override !== null;
|
|
30
|
+
|
|
31
|
+
if (baseIsPlainObject && overrideIsPlainObject) {
|
|
32
|
+
const result: JsonTypeDefinition = { ...base };
|
|
33
|
+
for (const key in override) {
|
|
34
|
+
result[key] = deepMergeSchemas(
|
|
35
|
+
base[key] as JsonTypeDefinition,
|
|
36
|
+
override[key] as JsonTypeDefinition,
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// For incompatible types (array vs object, string vs object, etc.), keep base
|
|
43
|
+
// This ensures the root entity's structure is preserved when a dependency
|
|
44
|
+
// has a different view of the same mock
|
|
45
|
+
return base;
|
|
46
|
+
}
|
|
47
|
+
|
|
5
48
|
export function mergeInStructure(
|
|
6
49
|
name: string | number,
|
|
7
50
|
key: string | number,
|
|
@@ -155,10 +198,10 @@ export default function mergeValidatedDataStructures({
|
|
|
155
198
|
}
|
|
156
199
|
activeValidatedParts = validatedVariables[usedName] as JsonTypeDefinition;
|
|
157
200
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
201
|
+
// Use deep merge instead of shallow spread to preserve previously merged
|
|
202
|
+
// dependency data. This fixes Issue #15 where multiple dependencies with
|
|
203
|
+
// the same top-level key (e.g., trpc) would overwrite each other.
|
|
204
|
+
dataForMocks = deepMergeSchemas(dataForMocks, validatedData);
|
|
162
205
|
};
|
|
163
206
|
|
|
164
207
|
for (const dependency of relevantDependencies) {
|
|
@@ -181,13 +224,15 @@ export default function mergeValidatedDataStructures({
|
|
|
181
224
|
for (const mockName in dependencyDataForMocks) {
|
|
182
225
|
addMockDataForEntity(mockName);
|
|
183
226
|
|
|
184
|
-
//
|
|
185
|
-
//
|
|
186
|
-
//
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
227
|
+
// Always deep merge the dependency's value to preserve nested structures.
|
|
228
|
+
// This handles cases like usePathname() which returns a simple "string" type,
|
|
229
|
+
// AND cases like trpc where both root and dependency have nested data that
|
|
230
|
+
// needs to be combined (e.g., trpc.quote from root + trpc.fastener.getAttributeValues
|
|
231
|
+
// from dependency).
|
|
232
|
+
if (dependencyDataForMocks[mockName] !== undefined) {
|
|
233
|
+
dataForMocks = deepMergeSchemas(dataForMocks, {
|
|
234
|
+
[mockName]: dependencyDataForMocks[mockName],
|
|
235
|
+
} as JsonTypeDefinition);
|
|
191
236
|
}
|
|
192
237
|
}
|
|
193
238
|
}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"@aws-sdk/client-ecs": "^3.956.0",
|
|
19
19
|
"@aws-sdk/client-s3": "^3.940.0",
|
|
20
20
|
"@aws-sdk/client-sqs": "^3.956.0",
|
|
21
|
-
"@aws-sdk/lib-storage": "^3.
|
|
21
|
+
"@aws-sdk/lib-storage": "^3.975.0",
|
|
22
22
|
"@aws-sdk/s3-request-presigner": "^3.940.0",
|
|
23
23
|
"@aws-sdk/util-dynamodb": "^3.971.0"
|
|
24
24
|
}
|
|
@@ -245,7 +245,14 @@ export function getSqliteDatabase(sqlitePath?: string) {
|
|
|
245
245
|
export function getPostgreDatabase() {
|
|
246
246
|
const connectionString = getPostgresConnectionString();
|
|
247
247
|
console.log(`CodeYam: Using PostgreSQL database at: ${connectionString}`);
|
|
248
|
-
const pool = new Pool({
|
|
248
|
+
const pool = new Pool({
|
|
249
|
+
connectionString,
|
|
250
|
+
// Session pooler (required for IPv4) holds real Postgres connections,
|
|
251
|
+
// so keep this low: 10 ECS tasks × 3 = 30 connections max
|
|
252
|
+
max: 3,
|
|
253
|
+
// Release idle connections after 10s to free up pool slots
|
|
254
|
+
idleTimeoutMillis: 10000,
|
|
255
|
+
});
|
|
249
256
|
pool.on('error', (err: Error, _client: PoolClient) => {
|
|
250
257
|
console.error('CodeYam: Unexpected error on idle PostgreSQL client', err);
|
|
251
258
|
});
|
|
@@ -33,6 +33,12 @@ export const CommitsTableColumns = Object.keys(
|
|
|
33
33
|
commitsSchema,
|
|
34
34
|
) as (keyof CommitsTable)[];
|
|
35
35
|
|
|
36
|
+
// Lightweight columns list excluding 'files' (which can be 1MB+ for large commits)
|
|
37
|
+
// Use this for queries where file diff data is not needed
|
|
38
|
+
export const CommitsTableColumnsLite = CommitsTableColumns.filter(
|
|
39
|
+
(col) => col !== 'files',
|
|
40
|
+
) as Exclude<keyof CommitsTable, 'files'>[];
|
|
41
|
+
|
|
36
42
|
export async function createCommitsTable(db: Kysely<any>): Promise<void> {
|
|
37
43
|
await db.schema
|
|
38
44
|
.createTable('commits')
|
|
@@ -27,6 +27,7 @@ function buildAnalysesQuery({
|
|
|
27
27
|
commitIds,
|
|
28
28
|
branchCommitSha,
|
|
29
29
|
limit,
|
|
30
|
+
excludeMetadata,
|
|
30
31
|
}: LoadAnalysesArgs & {
|
|
31
32
|
ids?: string[];
|
|
32
33
|
fileIds?: string[];
|
|
@@ -37,7 +38,32 @@ function buildAnalysesQuery({
|
|
|
37
38
|
const { jsonObjectFrom, jsonArrayFrom } = getJsonHelper();
|
|
38
39
|
|
|
39
40
|
// Create CTE for filtering analyses
|
|
40
|
-
|
|
41
|
+
// When excludeMetadata is true, select specific columns to avoid loading 64MB+ of metadata
|
|
42
|
+
let filteredAnalysisCTE = excludeMetadata
|
|
43
|
+
? db
|
|
44
|
+
.selectFrom('analyses')
|
|
45
|
+
.select([
|
|
46
|
+
'analyses.id',
|
|
47
|
+
'analyses.project_id',
|
|
48
|
+
'analyses.file_id',
|
|
49
|
+
'analyses.commit_id',
|
|
50
|
+
'analyses.entity_sha',
|
|
51
|
+
'analyses.entity_name',
|
|
52
|
+
'analyses.entity_type',
|
|
53
|
+
'analyses.file_path',
|
|
54
|
+
'analyses.status',
|
|
55
|
+
'analyses.created_at',
|
|
56
|
+
'analyses.updated_at',
|
|
57
|
+
'analyses.tree_sha',
|
|
58
|
+
'analyses.analyzed_tree_sha',
|
|
59
|
+
'analyses.dependency_analyzed_tree_sha',
|
|
60
|
+
'analyses.previous_analysis_id',
|
|
61
|
+
'analyses.branch_commit_sha',
|
|
62
|
+
'analyses.indirect',
|
|
63
|
+
'analyses.committed_at',
|
|
64
|
+
'analyses.completed_at',
|
|
65
|
+
])
|
|
66
|
+
: db.selectFrom('analyses').selectAll('analyses');
|
|
41
67
|
|
|
42
68
|
// Apply filters
|
|
43
69
|
if (projectId) {
|
|
@@ -96,6 +122,35 @@ function buildAnalysesQuery({
|
|
|
96
122
|
}
|
|
97
123
|
|
|
98
124
|
// Main query with JSON aggregations referencing the CTE
|
|
125
|
+
// When excludeMetadata is true, skip the entity subquery (saves loading entity metadata again)
|
|
126
|
+
if (excludeMetadata) {
|
|
127
|
+
return db
|
|
128
|
+
.with('filtered_analyses', () => filteredAnalysisCTE)
|
|
129
|
+
.selectFrom('filtered_analyses')
|
|
130
|
+
.selectAll('filtered_analyses')
|
|
131
|
+
.select((eb: ExpressionBuilder<any, any>) => [
|
|
132
|
+
// Skip entity subquery - not needed for list views and loads 41MB+ of entity metadata
|
|
133
|
+
|
|
134
|
+
jsonArrayFrom(
|
|
135
|
+
eb
|
|
136
|
+
.selectFrom('scenarios')
|
|
137
|
+
.select(aliasedTableColumns('scenarios', ScenariosTableColumns))
|
|
138
|
+
.whereRef('scenarios.analysis_id', '=', 'filtered_analyses.id'),
|
|
139
|
+
).as('scenarios'),
|
|
140
|
+
|
|
141
|
+
jsonArrayFrom(
|
|
142
|
+
eb
|
|
143
|
+
.selectFrom('analysis_branches')
|
|
144
|
+
.select(['id', 'branch_id'])
|
|
145
|
+
.whereRef(
|
|
146
|
+
'analysis_branches.analysis_id',
|
|
147
|
+
'=',
|
|
148
|
+
'filtered_analyses.id',
|
|
149
|
+
),
|
|
150
|
+
).as('analysis_branches'),
|
|
151
|
+
]);
|
|
152
|
+
}
|
|
153
|
+
|
|
99
154
|
return db
|
|
100
155
|
.with('filtered_analyses', () => filteredAnalysisCTE)
|
|
101
156
|
.selectFrom('filtered_analyses')
|
|
@@ -138,6 +193,8 @@ export interface LoadAnalysesArgs {
|
|
|
138
193
|
entityShas?: string[];
|
|
139
194
|
branchCommitSha?: string;
|
|
140
195
|
limit?: number;
|
|
196
|
+
/** Exclude large metadata columns for faster list queries */
|
|
197
|
+
excludeMetadata?: boolean;
|
|
141
198
|
}
|
|
142
199
|
|
|
143
200
|
export default async function loadAnalyses(
|
|
@@ -45,6 +45,7 @@ export default async function loadAnalysis({
|
|
|
45
45
|
// TODO: Consider refactoring to use CTE + aliasedTableColumns pattern (Pattern 3)
|
|
46
46
|
// like loadMostRecentPreviousAnalysis for more elegant single-query approach
|
|
47
47
|
const db = getDatabase();
|
|
48
|
+
const startTime = Date.now();
|
|
48
49
|
|
|
49
50
|
try {
|
|
50
51
|
// Build the main query
|
|
@@ -169,6 +170,8 @@ export default async function loadAnalysis({
|
|
|
169
170
|
});
|
|
170
171
|
|
|
171
172
|
const analysis = await query.executeTakeFirst();
|
|
173
|
+
const queryTime = Date.now() - startTime;
|
|
174
|
+
|
|
172
175
|
if (!analysis) {
|
|
173
176
|
awsLog('CodeYam Error: Analysis not found', null, {
|
|
174
177
|
id,
|
|
@@ -188,6 +191,16 @@ export default async function loadAnalysis({
|
|
|
188
191
|
return null;
|
|
189
192
|
}
|
|
190
193
|
|
|
194
|
+
// DEBUG: Log slow queries (when includeCommitAndBranch=true, includes files column which can be 1MB+)
|
|
195
|
+
if (queryTime > 100 && includeCommitAndBranch) {
|
|
196
|
+
const commit = (analysis as any).commit;
|
|
197
|
+
const filesSize = commit?.files ? JSON.stringify(commit.files).length : 0;
|
|
198
|
+
console.log(
|
|
199
|
+
`CodeYam DEBUG: [CommitFilesTiming] loadAnalysis took ${queryTime}ms (files: ${Math.round(filesSize / 1024)}KB)`,
|
|
200
|
+
{ id: analysis.id, entityName: analysis.entity_name },
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
191
204
|
return dbToAnalysis(analysis);
|
|
192
205
|
} catch (error) {
|
|
193
206
|
awsLog('CodeYam Error: Database error loading analysis', error, {
|
|
@@ -98,9 +98,10 @@ async function loadCommitsForBranch(branchId: string): Promise<DbCommit[]> {
|
|
|
98
98
|
const db = getDatabase();
|
|
99
99
|
|
|
100
100
|
const { jsonArrayFrom } = getJsonHelper();
|
|
101
|
+
const startTime = Date.now();
|
|
101
102
|
|
|
102
103
|
try {
|
|
103
|
-
|
|
104
|
+
const commits = await db
|
|
104
105
|
.selectFrom('commits')
|
|
105
106
|
.selectAll()
|
|
106
107
|
.select((eb: ExpressionBuilder<any, any>) => [
|
|
@@ -115,6 +116,20 @@ async function loadCommitsForBranch(branchId: string): Promise<DbCommit[]> {
|
|
|
115
116
|
.where('commits.branch_id', '=', branchId)
|
|
116
117
|
.orderBy('commits.committed_at', 'desc')
|
|
117
118
|
.execute();
|
|
119
|
+
const queryTime = Date.now() - startTime;
|
|
120
|
+
|
|
121
|
+
// DEBUG: Log slow queries (includes files column which can be 1MB+)
|
|
122
|
+
if (queryTime > 100) {
|
|
123
|
+
const totalFilesSize = commits.reduce((sum, c: any) => {
|
|
124
|
+
return sum + (c.files ? JSON.stringify(c.files).length : 0);
|
|
125
|
+
}, 0);
|
|
126
|
+
console.log(
|
|
127
|
+
`CodeYam DEBUG: [CommitFilesTiming] loadCommitsForBranch took ${queryTime}ms (${commits.length} commits, totalFiles: ${Math.round(totalFilesSize / 1024)}KB)`,
|
|
128
|
+
{ branchId },
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return commits;
|
|
118
133
|
} catch (error) {
|
|
119
134
|
awsLog('CodeYam Error: Loading commits for branch', error, { branchId });
|
|
120
135
|
return [];
|
|
@@ -69,6 +69,7 @@ export default async function loadCommit({
|
|
|
69
69
|
branchId,
|
|
70
70
|
}: LoadCommitArgs) {
|
|
71
71
|
const db = getDatabase();
|
|
72
|
+
const startTime = Date.now();
|
|
72
73
|
|
|
73
74
|
try {
|
|
74
75
|
let query = db
|
|
@@ -97,6 +98,7 @@ export default async function loadCommit({
|
|
|
97
98
|
query = query.orderBy('committed_at', 'desc').limit(1);
|
|
98
99
|
|
|
99
100
|
const commit = await query.executeTakeFirst();
|
|
101
|
+
const queryTime = Date.now() - startTime;
|
|
100
102
|
|
|
101
103
|
if (!commit) {
|
|
102
104
|
awsLog('CodeYam Error: Commit not found', null, {
|
|
@@ -108,6 +110,15 @@ export default async function loadCommit({
|
|
|
108
110
|
return null;
|
|
109
111
|
}
|
|
110
112
|
|
|
113
|
+
// DEBUG: Log slow queries (includes files column which can be 1MB+)
|
|
114
|
+
if (queryTime > 100) {
|
|
115
|
+
const filesSize = commit.files ? JSON.stringify(commit.files).length : 0;
|
|
116
|
+
console.log(
|
|
117
|
+
`CodeYam DEBUG: [CommitFilesTiming] loadCommit took ${queryTime}ms (files: ${Math.round(filesSize / 1024)}KB)`,
|
|
118
|
+
{ sha: commit.sha },
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
111
122
|
// Load branch and mergedBranch separately
|
|
112
123
|
const [branch, mergedBranch, analyses] = await Promise.all([
|
|
113
124
|
commit.branch_id
|
|
@@ -19,6 +19,8 @@ interface LoadCommitsArgs {
|
|
|
19
19
|
shas?: string[];
|
|
20
20
|
fileNames?: string[];
|
|
21
21
|
limit?: number;
|
|
22
|
+
/** Skip loading related data (analyses, entities, branches) for faster queries */
|
|
23
|
+
skipRelations?: boolean;
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
async function loadBranchesForCommits(
|
|
@@ -137,6 +139,7 @@ export default async function loadCommits({
|
|
|
137
139
|
shas,
|
|
138
140
|
fileNames,
|
|
139
141
|
limit = 10,
|
|
142
|
+
skipRelations = false,
|
|
140
143
|
}: LoadCommitsArgs): Promise<Commit[]> {
|
|
141
144
|
if (!projectId && !ids) {
|
|
142
145
|
throw new Error('Must provide projectId or ids');
|
|
@@ -144,6 +147,7 @@ export default async function loadCommits({
|
|
|
144
147
|
|
|
145
148
|
const db = getDatabase();
|
|
146
149
|
const { jsonObjectFrom } = getJsonHelper();
|
|
150
|
+
const startTime = Date.now();
|
|
147
151
|
|
|
148
152
|
try {
|
|
149
153
|
let query = db
|
|
@@ -203,11 +207,35 @@ export default async function loadCommits({
|
|
|
203
207
|
.orderBy('committed_at', 'desc')
|
|
204
208
|
.limit(limit)
|
|
205
209
|
.execute();
|
|
210
|
+
const queryTime = Date.now() - startTime;
|
|
206
211
|
|
|
207
212
|
if (!commits || commits.length === 0) {
|
|
208
213
|
return [];
|
|
209
214
|
}
|
|
210
215
|
|
|
216
|
+
// DEBUG: Log slow queries (includes files column which can be 1MB+)
|
|
217
|
+
if (queryTime > 100) {
|
|
218
|
+
const totalFilesSize = commits.reduce((sum, c: any) => {
|
|
219
|
+
return sum + (c.files ? JSON.stringify(c.files).length : 0);
|
|
220
|
+
}, 0);
|
|
221
|
+
console.log(
|
|
222
|
+
`CodeYam DEBUG: [CommitFilesTiming] loadCommits took ${queryTime}ms (${commits.length} commits, totalFiles: ${Math.round(totalFilesSize / 1024)}KB)`,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// When skipRelations is true, just return commits without loading related data
|
|
227
|
+
// This is much faster for queries that only need commit metadata
|
|
228
|
+
if (skipRelations) {
|
|
229
|
+
const dbCommits: DbCommit[] = commits.map((commit: any) => ({
|
|
230
|
+
...commit,
|
|
231
|
+
branch: undefined,
|
|
232
|
+
mergedBranch: undefined,
|
|
233
|
+
analyses: [],
|
|
234
|
+
entities: [],
|
|
235
|
+
}));
|
|
236
|
+
return dbCommits.map(dbToCommit);
|
|
237
|
+
}
|
|
238
|
+
|
|
211
239
|
const commitIds = commits.map((c: any) => c.id);
|
|
212
240
|
|
|
213
241
|
// Load all relations in parallel
|
|
@@ -9,6 +9,8 @@ export interface LoadEntitiesArgs {
|
|
|
9
9
|
filePaths?: string[];
|
|
10
10
|
names?: string[];
|
|
11
11
|
shas?: string[];
|
|
12
|
+
/** Exclude large metadata column for faster list queries */
|
|
13
|
+
excludeMetadata?: boolean;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
export default async function loadEntities({
|
|
@@ -18,6 +20,7 @@ export default async function loadEntities({
|
|
|
18
20
|
filePaths,
|
|
19
21
|
names,
|
|
20
22
|
shas,
|
|
23
|
+
excludeMetadata,
|
|
21
24
|
}: LoadEntitiesArgs): Promise<Entity[] | null> {
|
|
22
25
|
if (
|
|
23
26
|
(fileIds && fileIds.length == 0) ||
|
|
@@ -39,6 +42,7 @@ export default async function loadEntities({
|
|
|
39
42
|
filePaths,
|
|
40
43
|
names,
|
|
41
44
|
shas: chunk,
|
|
45
|
+
excludeMetadata,
|
|
42
46
|
});
|
|
43
47
|
|
|
44
48
|
if (chunkEntities) {
|
|
@@ -51,9 +55,28 @@ export default async function loadEntities({
|
|
|
51
55
|
const db = getDatabase();
|
|
52
56
|
|
|
53
57
|
try {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
// When excludeMetadata is true, select all columns except the large metadata column
|
|
59
|
+
// This dramatically speeds up list queries (41MB+ of JSON avoided)
|
|
60
|
+
const baseQuery = excludeMetadata
|
|
61
|
+
? db
|
|
62
|
+
.selectFrom('entities')
|
|
63
|
+
.select([
|
|
64
|
+
'entities.project_id',
|
|
65
|
+
'entities.file_id',
|
|
66
|
+
'entities.commit_id',
|
|
67
|
+
'entities.name',
|
|
68
|
+
'entities.sha',
|
|
69
|
+
'entities.entity_type',
|
|
70
|
+
'entities.file_path',
|
|
71
|
+
'entities.description',
|
|
72
|
+
'entities.documentation',
|
|
73
|
+
'entities.quality',
|
|
74
|
+
'entities.created_at',
|
|
75
|
+
'entities.updated_at',
|
|
76
|
+
])
|
|
77
|
+
: db.selectFrom('entities').selectAll('entities');
|
|
78
|
+
|
|
79
|
+
const query = baseQuery
|
|
57
80
|
.$if(!!branchId, (qb) =>
|
|
58
81
|
qb
|
|
59
82
|
.innerJoin(
|
|
@@ -121,6 +121,7 @@ async function loadCommitsForEntities(
|
|
|
121
121
|
const db = getDatabase();
|
|
122
122
|
|
|
123
123
|
const { jsonArrayFrom } = getJsonHelper();
|
|
124
|
+
const startTime = Date.now();
|
|
124
125
|
|
|
125
126
|
try {
|
|
126
127
|
const commits = await db
|
|
@@ -137,6 +138,17 @@ async function loadCommitsForEntities(
|
|
|
137
138
|
])
|
|
138
139
|
.where('commits.id', 'in', commitIds)
|
|
139
140
|
.execute();
|
|
141
|
+
const queryTime = Date.now() - startTime;
|
|
142
|
+
|
|
143
|
+
// DEBUG: Log slow queries (includes files column which can be 1MB+)
|
|
144
|
+
if (queryTime > 100) {
|
|
145
|
+
const totalFilesSize = commits.reduce((sum, c: any) => {
|
|
146
|
+
return sum + (c.files ? JSON.stringify(c.files).length : 0);
|
|
147
|
+
}, 0);
|
|
148
|
+
console.log(
|
|
149
|
+
`CodeYam DEBUG: [CommitFilesTiming] loadCommitsForEntities took ${queryTime}ms (${commits.length} commits, totalFiles: ${Math.round(totalFilesSize / 1024)}KB)`,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
140
152
|
|
|
141
153
|
return new Map(commits.map((commit) => [commit.id, commit]));
|
|
142
154
|
} catch (error) {
|