@codeyam/codeyam-cli 0.1.0-staging.09652b8 → 0.1.0-staging.28f73cf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +7 -6
- package/analyzer-template/packages/ai/index.ts +2 -0
- package/analyzer-template/packages/ai/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +24 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +14 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1402 -546
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.ts +138 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +139 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/DebugTracer.ts +224 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/PathManager.ts +203 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/README.md +294 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +161 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.ts +235 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +2 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/selectBestValue.ts +70 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.ts +113 -0
- package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +36 -0
- package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +32 -8
- package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +27 -6
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +42 -4
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +39 -0
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +18 -6
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +8 -10
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +6 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +8 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.ts +5 -13
- package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +34 -15
- package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +17 -3
- package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +35 -16
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +7 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +9 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +6 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +9 -1
- package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.d.ts +23 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.d.ts.map +1 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.js +30 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.js.map +1 -0
- package/analyzer-template/packages/aws/package.json +5 -4
- package/analyzer-template/packages/aws/s3/index.ts +4 -0
- package/analyzer-template/packages/aws/src/lib/s3/getPresignedUrl.ts +62 -0
- package/analyzer-template/packages/generate/src/lib/scenarioComponent.ts +6 -3
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.js +5 -3
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.js.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.d.ts +2 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.js +3 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.js.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tableRelations.d.ts +2 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tableRelations.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.d.ts +37 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.js +27 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/utils/index.d.ts +1 -0
- package/analyzer-template/packages/github/dist/utils/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/index.js +1 -0
- package/analyzer-template/packages/github/dist/utils/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.d.ts +25 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.js +40 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.js.map +1 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
- package/analyzer-template/packages/supabase/src/lib/kysely/db.ts +6 -0
- package/analyzer-template/packages/supabase/src/lib/kysely/tableRelations.ts +3 -0
- package/analyzer-template/packages/supabase/src/lib/kysely/tables/debugReportsTable.ts +61 -0
- package/analyzer-template/packages/utils/dist/utils/index.d.ts +1 -0
- package/analyzer-template/packages/utils/dist/utils/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/index.js +1 -0
- package/analyzer-template/packages/utils/dist/utils/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.d.ts +25 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.d.ts.map +1 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.js +40 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.js.map +1 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
- package/analyzer-template/packages/utils/index.ts +1 -0
- package/analyzer-template/packages/utils/src/lib/Semaphore.ts +42 -0
- package/analyzer-template/packages/utils/src/lib/frameworks/getRemixRoutePath.ts +2 -1
- package/analyzer-template/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.ts +1 -0
- package/analyzer-template/project/constructMockCode.ts +170 -6
- package/analyzer-template/project/reconcileMockDataKeys.ts +13 -0
- package/analyzer-template/project/start.ts +1 -11
- package/analyzer-template/project/writeMockDataTsx.ts +32 -1
- package/analyzer-template/project/writeScenarioComponents.ts +164 -18
- package/analyzer-template/project/writeUniversalMocks.ts +66 -8
- package/background/src/lib/virtualized/project/constructMockCode.js +158 -7
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +12 -0
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +1 -8
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +25 -1
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +129 -17
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeUniversalMocks.js +56 -7
- package/background/src/lib/virtualized/project/writeUniversalMocks.js.map +1 -1
- package/codeyam-cli/src/cli.js +6 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/codeyam-cli.js +0 -0
- package/codeyam-cli/src/commands/debug.js +221 -0
- package/codeyam-cli/src/commands/debug.js.map +1 -0
- package/codeyam-cli/src/commands/report.js +102 -0
- package/codeyam-cli/src/commands/report.js.map +1 -0
- package/codeyam-cli/src/commands/setup-sandbox.js +164 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/cleanupAnalysisFiles.test.js +6 -6
- package/codeyam-cli/src/utils/__tests__/cleanupAnalysisFiles.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +8 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +30 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/cleanupAnalysisFiles.js +2 -2
- package/codeyam-cli/src/utils/cleanupAnalysisFiles.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +219 -0
- package/codeyam-cli/src/utils/generateReport.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +7 -0
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/job.pidTracking.test.js +1 -0
- package/codeyam-cli/src/utils/queue/__tests__/job.pidTracking.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +5 -1
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +4 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +50 -2
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-D5ZHFomX.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-CDnfNKKQ.js → InteractivePreview-XDSzQLOY.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-DUS-3h7I.js → LibraryFunctionPreview-BYVx9KFp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-TJzDQku1.js → LogViewer-CRcT5fOZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-BORLgi0X.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-BgdlWM6p.js → SafeScreenshot-Bual6h18.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bi-YUMa-.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-4D2vLLJz.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/_index-BC200mfN.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CxvZPkCv.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.generate-report-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/chart-column-B8fb6wnw.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-WWGJGFF6-DvL0YqDJ.js → chunk-WWGJGFF6-De6i8FUT.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/circle-alert-IdsgAK39.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/circle-check-BACUUf75.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/clock-vWeoCemX.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CS7XDrKv.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DIOEw_3i.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-3bYjyojg.js → entity._sha._-8Els_3Wb.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-DtfwpN9J.js → entity._sha_.create-scenario-C3FZJx1w.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-YJz_igar.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/entityStatus-BEqj2qBy.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-DiP0q291.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/file-text-LM0mgxXE.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-Dxh9CcaV.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{git-WoKohOtW.js → git-BXmqrWCH.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/globals-BGS74ED-.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-Vvbl94Xc.js → index-D-zYbzFZ.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-BXPKbHEb.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/manifest-1af162d4.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-DB7VgjCY.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/settings-5zF_GOcS.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{settings-LuiJ1UIm.js → settings-Dc4MlMpK.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-BQ-02-jB.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-D7k-ArFa.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-CpUcCv1V.js → useLastLogLine-AlhS7g5F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-Ddo4UQv7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/zap-_jw-9DCp.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/{index-DzbqTxoN.js → index-D4JpXSIO.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-vwbN7n65.js +169 -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-setup-skill.md +65 -85
- package/codeyam-cli/templates/debug-command.md +125 -0
- package/package.json +4 -6
- package/packages/ai/index.js +1 -1
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +13 -0
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +12 -0
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1023 -405
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.js +137 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +112 -0
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/DebugTracer.js +176 -0
- package/packages/ai/src/lib/dataStructure/helpers/DebugTracer.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/PathManager.js +178 -0
- package/packages/ai/src/lib/dataStructure/helpers/PathManager.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +138 -0
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.js +199 -0
- package/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +2 -0
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/selectBestValue.js +62 -0
- package/packages/ai/src/lib/dataStructure/helpers/selectBestValue.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.js +90 -0
- package/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.js.map +1 -0
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +22 -0
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/generateEntityKeyAttributes.js +32 -8
- package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/getConditionalUsagesFromCode.js +13 -8
- package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +36 -3
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.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/analyze/src/lib/FileAnalyzer.js +17 -5
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/nodes/index.js +2 -1
- package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +6 -8
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +5 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +8 -2
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js +5 -8
- package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeChange.js +21 -9
- package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeEntity.js +10 -4
- package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeInitial.js +21 -9
- package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +6 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +9 -1
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +5 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +9 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
- package/packages/generate/src/lib/scenarioComponent.js +5 -3
- package/packages/generate/src/lib/scenarioComponent.js.map +1 -1
- package/packages/supabase/src/lib/kysely/db.js +3 -0
- package/packages/supabase/src/lib/kysely/db.js.map +1 -1
- package/packages/supabase/src/lib/kysely/tables/debugReportsTable.js +27 -0
- package/packages/supabase/src/lib/kysely/tables/debugReportsTable.js.map +1 -0
- package/packages/utils/index.js +1 -0
- package/packages/utils/index.js.map +1 -1
- package/packages/utils/src/lib/Semaphore.js +40 -0
- package/packages/utils/src/lib/Semaphore.js.map +1 -0
- package/packages/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
- package/packages/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
- package/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
- package/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-B9Sf8e9w.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bl6GY-OE.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-BDq8RX50.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/_index-Bh3y3Wsl.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-tq7Bl6-t.js +0 -10
- package/codeyam-cli/src/webserver/build/client/assets/chart-column-q9_nHfwv.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/circle-alert-CKMpA1v_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/clock-Wnfog8Qw.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C_ixaqqh.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-QecTs_sq.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-hnkEgHrC.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/file-text-CvCVdKLW.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-DgUCYhbd.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-DZfbt0u5.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-Bxm63UxG.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-c90b8608.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-DrVZQamX.js +0 -16
- package/codeyam-cli/src/webserver/build/client/assets/search-CJkk16Ct.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-ConzHeiL.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-B9LRwAej.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-DOxmMaSg.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/zap-D5R1FAcH.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DGGis3OZ.js +0 -166
|
@@ -34,6 +34,28 @@ export interface SerializableFunctionResult {
|
|
|
34
34
|
environmentVariables: string[];
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Enriched conditional usage that includes traced source data path.
|
|
39
|
+
* The sourceDataPath connects a local variable (used in conditionals) back to
|
|
40
|
+
* the original data attribute from the attributes map.
|
|
41
|
+
*/
|
|
42
|
+
export interface EnrichedConditionalUsage {
|
|
43
|
+
/** The local variable path (e.g., "activeTab") */
|
|
44
|
+
path: string;
|
|
45
|
+
/** The type of condition this attribute is used in */
|
|
46
|
+
conditionType: 'truthiness' | 'comparison' | 'switch';
|
|
47
|
+
/** For comparison conditions, the literal values being compared against */
|
|
48
|
+
comparedValues?: string[];
|
|
49
|
+
/** Where this conditional usage occurs */
|
|
50
|
+
location: 'if' | 'ternary' | 'logical-and' | 'switch';
|
|
51
|
+
/**
|
|
52
|
+
* The traced source data path in the format "scopeName.path"
|
|
53
|
+
* e.g., "useParams().functionCallReturnValue['*']"
|
|
54
|
+
* This connects the local variable to the original data attribute.
|
|
55
|
+
*/
|
|
56
|
+
sourceDataPath?: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
37
59
|
export interface SerializableDataStructure {
|
|
38
60
|
// External function calls array
|
|
39
61
|
externalFunctionCalls: SerializableFunctionCallInfo[];
|
|
@@ -48,6 +70,13 @@ export interface SerializableDataStructure {
|
|
|
48
70
|
equivalentSignatureVariables: Record<string, string>;
|
|
49
71
|
|
|
50
72
|
environmentVariables: string[];
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Conditional usages with source tracing.
|
|
76
|
+
* Maps local variable path to array of enriched usages that include
|
|
77
|
+
* the traced source data path.
|
|
78
|
+
*/
|
|
79
|
+
conditionalUsages?: Record<string, EnrichedConditionalUsage[]>;
|
|
51
80
|
}
|
|
52
81
|
|
|
53
82
|
/**
|
|
@@ -182,3 +211,13 @@ export function getEquivalentSignatureVariables(
|
|
|
182
211
|
): Record<string, string> {
|
|
183
212
|
return dataStructure.equivalentSignatureVariables;
|
|
184
213
|
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Get enriched conditional usages with source tracing.
|
|
217
|
+
* Returns the conditional usages map, or empty object if not available.
|
|
218
|
+
*/
|
|
219
|
+
export function getConditionalUsages(
|
|
220
|
+
dataStructure: SerializableDataStructure,
|
|
221
|
+
): Record<string, EnrichedConditionalUsage[]> {
|
|
222
|
+
return dataStructure.conditionalUsages ?? {};
|
|
223
|
+
}
|
|
@@ -278,11 +278,16 @@ export class FileAnalyzer {
|
|
|
278
278
|
|
|
279
279
|
for (let i = 0; i < uniqueRelevantExpressions.length; i++) {
|
|
280
280
|
const relevantExpression = uniqueRelevantExpressions[i];
|
|
281
|
-
|
|
282
|
-
|
|
281
|
+
// Resolve namespace imports for local packages (not external libraries).
|
|
282
|
+
// A module is local if it's not external OR if it resolves to a path outside node_modules
|
|
283
|
+
// (handles local monorepo packages like @codeyam/ui-components).
|
|
284
|
+
// If resolvedFileName is undefined, we can't determine location, so treat as external.
|
|
285
|
+
const isLocalModule =
|
|
283
286
|
resolvedModule &&
|
|
284
|
-
!resolvedModule.isExternalLibraryImport
|
|
285
|
-
|
|
287
|
+
(!resolvedModule.isExternalLibraryImport ||
|
|
288
|
+
(resolvedModule.resolvedFileName &&
|
|
289
|
+
!resolvedModule.resolvedFileName.includes('node_modules')));
|
|
290
|
+
if (relevantExpression.exportName === '*' && isLocalModule) {
|
|
286
291
|
uniqueRelevantExpressions.splice(i, 1);
|
|
287
292
|
uniqueRelevantExpressions.push(
|
|
288
293
|
...this.resolveNamespaceImport(
|
|
@@ -295,11 +300,18 @@ export class FileAnalyzer {
|
|
|
295
300
|
}
|
|
296
301
|
|
|
297
302
|
if (uniqueRelevantExpressions.length > 0) {
|
|
298
|
-
//
|
|
303
|
+
// A module is external if TypeScript says so AND the resolved path is in node_modules.
|
|
304
|
+
// This handles local monorepo packages (like @codeyam/ui-components) which TypeScript
|
|
305
|
+
// marks as isExternalLibraryImport=true because they're symlinked, but actually
|
|
306
|
+
// resolve to files inside the project (not in node_modules).
|
|
307
|
+
const isExternalLibrary =
|
|
308
|
+
(resolvedModule?.isExternalLibraryImport ?? true) &&
|
|
309
|
+
(resolvedModule?.resolvedFileName?.includes('node_modules') ??
|
|
310
|
+
true);
|
|
299
311
|
return [
|
|
300
312
|
importedFilePath,
|
|
301
313
|
{
|
|
302
|
-
externalLibrary:
|
|
314
|
+
externalLibrary: isExternalLibrary,
|
|
303
315
|
resolvedPath: resolvedModule?.resolvedFileName,
|
|
304
316
|
exportInfos: uniqueRelevantExpressions,
|
|
305
317
|
},
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
getReturnValue,
|
|
13
13
|
getSourceEquivalencies,
|
|
14
14
|
getUsageEquivalencies,
|
|
15
|
-
|
|
15
|
+
getConditionalUsages,
|
|
16
16
|
detectWrapperRequirements,
|
|
17
17
|
} from '~codeyam/ai';
|
|
18
18
|
import type { AnalysisOptions } from '../analyzeEntities';
|
|
@@ -94,11 +94,6 @@ export default async function prepareEntityDataStructures(
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
// Extract conditional usages from the entity code for key attribute detection
|
|
98
|
-
const conditionalUsages = entity.code
|
|
99
|
-
? getConditionalUsagesFromCode(entity.code)
|
|
100
|
-
: {};
|
|
101
|
-
|
|
102
97
|
entity.metadata.isolatedDataStructure = {
|
|
103
98
|
signatureSchema: deduplicateFunctionSchemas(
|
|
104
99
|
isolatedDataStructure.signatureSchema,
|
|
@@ -110,10 +105,8 @@ export default async function prepareEntityDataStructures(
|
|
|
110
105
|
isolatedDataStructure.equivalentSignatureVariables,
|
|
111
106
|
dependencySchemas: clonedDependencySchemas,
|
|
112
107
|
environmentVariables: isolatedDataStructure.environmentVariables,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
? conditionalUsages
|
|
116
|
-
: undefined,
|
|
108
|
+
// Use enriched conditional usages with source tracing from analysis
|
|
109
|
+
conditionalUsages: isolatedDataStructure.conditionalUsages,
|
|
117
110
|
};
|
|
118
111
|
|
|
119
112
|
// Detect wrapper requirements (Context providers, etc.)
|
|
@@ -290,6 +283,9 @@ async function getEntityDataStructureAndFunctionCalls({
|
|
|
290
283
|
const clonedRawSignature = { ...rawSignature };
|
|
291
284
|
const clonedRawReturnValue = { ...rawReturnValue };
|
|
292
285
|
|
|
286
|
+
// Get enriched conditional usages with source tracing
|
|
287
|
+
const conditionalUsages = getConditionalUsages(dataStructure);
|
|
288
|
+
|
|
293
289
|
const isolatedDataStructure = {
|
|
294
290
|
signatureSchema: deduplicateFunctionSchemas(clonedRawSignature),
|
|
295
291
|
returnValueSchema: deduplicateFunctionSchemas(clonedRawReturnValue),
|
|
@@ -297,6 +293,8 @@ async function getEntityDataStructureAndFunctionCalls({
|
|
|
297
293
|
getEquivalentSignatureVariables(dataStructure),
|
|
298
294
|
dependencySchemas,
|
|
299
295
|
environmentVariables: dataStructure.environmentVariables,
|
|
296
|
+
conditionalUsages:
|
|
297
|
+
Object.keys(conditionalUsages).length > 0 ? conditionalUsages : undefined,
|
|
300
298
|
};
|
|
301
299
|
|
|
302
300
|
const functionCalls: Record<string, string[]> = {};
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
upsertEntities,
|
|
19
19
|
} from '~codeyam/supabase';
|
|
20
20
|
import { getCandidatesReadyForCapture as getAnalysesReadyForCapture } from './dependencyResolver';
|
|
21
|
-
import { awsLog, awsLogDebugLevel } from '~codeyam/utils';
|
|
21
|
+
import { awsLog, awsLogDebugLevel, Semaphore } from '~codeyam/utils';
|
|
22
22
|
|
|
23
23
|
const MAX_CONCURRENT_ANALYSES = 100; // fairly arbitrary, but more isn't necessarily better
|
|
24
24
|
|
|
@@ -133,6 +133,10 @@ export default async function analyzeEntities({
|
|
|
133
133
|
const markedReady = new Set<string>(); // Analyses we've attempted to mark ready
|
|
134
134
|
const analyses: Analysis[] = [];
|
|
135
135
|
|
|
136
|
+
// Semaphore to serialize CPU-intensive Structure phase while allowing
|
|
137
|
+
// I/O-bound KeyAttributes LLM calls to run in parallel
|
|
138
|
+
const structureSemaphore = new Semaphore(1);
|
|
139
|
+
|
|
136
140
|
const analysesAlreadyCompletedAtStart =
|
|
137
141
|
commit?.metadata?.currentRun?.analysesCompleted ?? 0;
|
|
138
142
|
|
|
@@ -442,6 +446,7 @@ export default async function analyzeEntities({
|
|
|
442
446
|
analyzeAsDependency: !allRootEntities.some(
|
|
443
447
|
(e) => e.filePath === entity.filePath && e.name === entity.name,
|
|
444
448
|
),
|
|
449
|
+
structureSemaphore,
|
|
445
450
|
...options,
|
|
446
451
|
force,
|
|
447
452
|
}),
|
|
@@ -73,14 +73,16 @@ export default async function gatherEntityMap({
|
|
|
73
73
|
);
|
|
74
74
|
|
|
75
75
|
if (!importedFile) {
|
|
76
|
+
// Skip dependencies when the file is not found in project.files.
|
|
77
|
+
// This commonly happens when a universal mock intercepts the import:
|
|
78
|
+
// 1. TypeScript resolves @formbricks/types/errors to the mock file
|
|
79
|
+
// 2. The original packages/types/errors.ts is never imported
|
|
80
|
+
// 3. So it's not in getSourceFiles() and thus not in project.files
|
|
81
|
+
// 4. Since the mock handles the import, we don't need to analyze the original
|
|
76
82
|
console.log(
|
|
77
|
-
`CodeYam
|
|
78
|
-
entity.filePath,
|
|
79
|
-
entity.name,
|
|
80
|
-
);
|
|
81
|
-
throw new Error(
|
|
82
|
-
`File not found while gathering entity map: ${importedExportFilePath}`,
|
|
83
|
+
`CodeYam Warning: Skipping dependency - file not in project.files (likely mocked): ${importedExportFilePath}`,
|
|
83
84
|
);
|
|
85
|
+
continue;
|
|
84
86
|
}
|
|
85
87
|
|
|
86
88
|
let importedEntity = context.getEntity(
|
package/analyzer-template/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.ts
CHANGED
|
@@ -99,19 +99,11 @@ function traverseEntity(
|
|
|
99
99
|
);
|
|
100
100
|
|
|
101
101
|
if (!dependentEntity) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
dependencyFilePath,
|
|
108
|
-
dependencyName,
|
|
109
|
-
fileEntities: context.getEntityNamesForFile(dependencyFilePath),
|
|
110
|
-
},
|
|
111
|
-
);
|
|
112
|
-
throw new Error(
|
|
113
|
-
'trackEntityCircularDependencies: Dependent entity not found',
|
|
114
|
-
);
|
|
102
|
+
// Skip dependencies when the entity is not found in context.
|
|
103
|
+
// This commonly happens when a universal mock intercepts the import:
|
|
104
|
+
// - gatherEntityMap skips adding the entity because the file isn't in project.files
|
|
105
|
+
// - The mock handles the import at runtime, so we don't need to track it
|
|
106
|
+
continue;
|
|
115
107
|
}
|
|
116
108
|
|
|
117
109
|
// Recursively traverse (will skip if already visited)
|
|
@@ -16,7 +16,12 @@ import { AI } from '~codeyam/ai';
|
|
|
16
16
|
import extractDiffLines from './extractDiffLines';
|
|
17
17
|
import analyzeCodeChange from './analyzeCodeChange';
|
|
18
18
|
import relevantDiffPart from './relevantDiffPart';
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
awsLog,
|
|
21
|
+
awsLogDebugLevel,
|
|
22
|
+
pushAnalysisError,
|
|
23
|
+
Semaphore,
|
|
24
|
+
} from '~codeyam/utils';
|
|
20
25
|
|
|
21
26
|
export interface AnalyzeChangeArgs {
|
|
22
27
|
previousAnalysis: Analysis;
|
|
@@ -29,6 +34,8 @@ export interface AnalyzeChangeArgs {
|
|
|
29
34
|
steps?: string[];
|
|
30
35
|
updateProgress?: (detail: string) => void;
|
|
31
36
|
model: AI.Model;
|
|
37
|
+
/** Semaphore to serialize CPU-intensive Structure phase */
|
|
38
|
+
structureSemaphore?: Semaphore;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
export default async function analyzeChange({
|
|
@@ -42,6 +49,7 @@ export default async function analyzeChange({
|
|
|
42
49
|
steps,
|
|
43
50
|
updateProgress,
|
|
44
51
|
model,
|
|
52
|
+
structureSemaphore,
|
|
45
53
|
}: AnalyzeChangeArgs) {
|
|
46
54
|
analysis.entity = entity;
|
|
47
55
|
awsLog('CodeYam: Analyzing change entity', {
|
|
@@ -79,24 +87,35 @@ export default async function analyzeChange({
|
|
|
79
87
|
});
|
|
80
88
|
}
|
|
81
89
|
|
|
90
|
+
// Structure phase: CPU-intensive, serialize via semaphore if provided
|
|
82
91
|
if (!steps || steps.includes(Step.Structure)) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
92
|
+
if (structureSemaphore) {
|
|
93
|
+
await structureSemaphore.acquire();
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
awsLogDebugLevel(
|
|
97
|
+
1,
|
|
98
|
+
`Merging dependent data structures for ${entity.name}...`,
|
|
99
|
+
);
|
|
87
100
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
101
|
+
const { step: dataStructureStep } = await recordStep(
|
|
102
|
+
'generateDataStructure',
|
|
103
|
+
() =>
|
|
104
|
+
generateDataStructure({
|
|
105
|
+
entity,
|
|
106
|
+
dependentAnalyses,
|
|
107
|
+
analysis,
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
analysis.status.steps.push(dataStructureStep);
|
|
111
|
+
} finally {
|
|
112
|
+
if (structureSemaphore) {
|
|
113
|
+
structureSemaphore.release();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
98
116
|
}
|
|
99
117
|
|
|
118
|
+
// KeyAttributes phase: I/O-bound LLM call, can run in parallel with other entities' Structure
|
|
100
119
|
if (!steps || steps.includes(Step.KeyAttributes)) {
|
|
101
120
|
awsLogDebugLevel(1, `Determining key attributes for ${entity.name}...`);
|
|
102
121
|
|
|
@@ -31,7 +31,12 @@ import relevantDiffPart from './relevantDiffPart';
|
|
|
31
31
|
import { Step } from './enums/steps';
|
|
32
32
|
import { ImmutableAnalysisContext } from '../analysisContext';
|
|
33
33
|
import generateAnalyzedTreeSha from './analyze/generateAnalyzedTreeSha';
|
|
34
|
-
import {
|
|
34
|
+
import {
|
|
35
|
+
awsLog,
|
|
36
|
+
awsLogDebugLevel,
|
|
37
|
+
pushAnalysisError,
|
|
38
|
+
Semaphore,
|
|
39
|
+
} from '~codeyam/utils';
|
|
35
40
|
|
|
36
41
|
export interface AnalyzeEntityArgs {
|
|
37
42
|
project: Project;
|
|
@@ -50,6 +55,8 @@ export interface AnalyzeEntityArgs {
|
|
|
50
55
|
forceAll?: boolean;
|
|
51
56
|
updateProgress?: (detail: string) => void;
|
|
52
57
|
modelString?: string;
|
|
58
|
+
/** Semaphore to serialize CPU-intensive Structure phase */
|
|
59
|
+
structureSemaphore?: Semaphore;
|
|
53
60
|
}
|
|
54
61
|
|
|
55
62
|
/**
|
|
@@ -77,6 +84,7 @@ export default async function analyzeEntity({
|
|
|
77
84
|
forceAll,
|
|
78
85
|
updateProgress,
|
|
79
86
|
modelString,
|
|
87
|
+
structureSemaphore,
|
|
80
88
|
}: AnalyzeEntityArgs): Promise<{
|
|
81
89
|
analysis: Analysis;
|
|
82
90
|
dependentAnalyses?: ReadonlyAnalysisMap;
|
|
@@ -476,6 +484,7 @@ export default async function analyzeEntity({
|
|
|
476
484
|
steps,
|
|
477
485
|
updateProgress,
|
|
478
486
|
model,
|
|
487
|
+
structureSemaphore,
|
|
479
488
|
})
|
|
480
489
|
: analyzeInitial({
|
|
481
490
|
analysis,
|
|
@@ -485,6 +494,7 @@ export default async function analyzeEntity({
|
|
|
485
494
|
steps,
|
|
486
495
|
updateProgress,
|
|
487
496
|
model,
|
|
497
|
+
structureSemaphore,
|
|
488
498
|
}),
|
|
489
499
|
]);
|
|
490
500
|
|
|
@@ -498,8 +508,12 @@ export default async function analyzeEntity({
|
|
|
498
508
|
analysis = analysisResult.analysis;
|
|
499
509
|
|
|
500
510
|
analysis.completedAt = new Date().toISOString();
|
|
501
|
-
// Don't set analyzedTreeSha when
|
|
502
|
-
|
|
511
|
+
// Don't set analyzedTreeSha when:
|
|
512
|
+
// 1. ONLY_DATA_STRUCTURE=true - so full analysis can re-analyze later
|
|
513
|
+
// 2. analyzeAsDependency=true - dependency analyses only generate Structure+KeyAttributes,
|
|
514
|
+
// not scenarios. Leaving analyzedTreeSha unset allows partial analysis detection to work
|
|
515
|
+
// when the entity is later analyzed directly.
|
|
516
|
+
if (process.env.ONLY_DATA_STRUCTURE !== 'true' && !analyzeAsDependency) {
|
|
503
517
|
analysis.analyzedTreeSha = generateAnalyzedTreeSha(analysis);
|
|
504
518
|
}
|
|
505
519
|
} catch (error) {
|
|
@@ -12,7 +12,12 @@ import {
|
|
|
12
12
|
type ReadonlyAnalysisMap,
|
|
13
13
|
} from '~codeyam/types';
|
|
14
14
|
import { upsertAnalysesWithScenarios } from '~codeyam/supabase';
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
awsLog,
|
|
17
|
+
awsLogDebugLevel,
|
|
18
|
+
pushAnalysisError,
|
|
19
|
+
Semaphore,
|
|
20
|
+
} from '~codeyam/utils';
|
|
16
21
|
import generateKeyAttributes from './scenarios/generateKeyAttributes';
|
|
17
22
|
|
|
18
23
|
export interface AnalyzeInitialArgs {
|
|
@@ -23,6 +28,8 @@ export interface AnalyzeInitialArgs {
|
|
|
23
28
|
steps?: string[];
|
|
24
29
|
updateProgress?: (detail: string) => void;
|
|
25
30
|
model: AI.Model;
|
|
31
|
+
/** Semaphore to serialize CPU-intensive Structure phase */
|
|
32
|
+
structureSemaphore?: Semaphore;
|
|
26
33
|
}
|
|
27
34
|
|
|
28
35
|
export default async function analyzeInitial({
|
|
@@ -33,6 +40,7 @@ export default async function analyzeInitial({
|
|
|
33
40
|
steps,
|
|
34
41
|
updateProgress,
|
|
35
42
|
model,
|
|
43
|
+
structureSemaphore,
|
|
36
44
|
}: AnalyzeInitialArgs) {
|
|
37
45
|
analysis.entity = entity;
|
|
38
46
|
awsLog('CodeYam: Analyzing initial entity', {
|
|
@@ -47,22 +55,32 @@ export default async function analyzeInitial({
|
|
|
47
55
|
});
|
|
48
56
|
|
|
49
57
|
try {
|
|
58
|
+
// Structure phase: CPU-intensive, serialize via semaphore if provided
|
|
50
59
|
if (!steps || steps.includes(Step.Structure)) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
if (structureSemaphore) {
|
|
61
|
+
await structureSemaphore.acquire();
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
awsLogDebugLevel(
|
|
65
|
+
1,
|
|
66
|
+
`Merging dependent data structures for ${entity.name}...`,
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const { step: dataStructureStep } = await recordStep(
|
|
70
|
+
'generateDataStructure',
|
|
71
|
+
() =>
|
|
72
|
+
generateDataStructure({
|
|
73
|
+
entity,
|
|
74
|
+
dependentAnalyses,
|
|
75
|
+
analysis,
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
analysis.status.steps.push(dataStructureStep);
|
|
79
|
+
} finally {
|
|
80
|
+
if (structureSemaphore) {
|
|
81
|
+
structureSemaphore.release();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
66
84
|
}
|
|
67
85
|
|
|
68
86
|
// Short-circuit for test mocking: only generate data structure, skip key attributes and scenarios
|
|
@@ -73,6 +91,7 @@ export default async function analyzeInitial({
|
|
|
73
91
|
return { analysis };
|
|
74
92
|
}
|
|
75
93
|
|
|
94
|
+
// KeyAttributes phase: I/O-bound LLM call, can run in parallel with other entities' Structure
|
|
76
95
|
if (!steps || steps.includes(Step.KeyAttributes)) {
|
|
77
96
|
awsLogDebugLevel(1, `Determining key attributes for ${entity.name}...`);
|
|
78
97
|
|
|
@@ -54,8 +54,14 @@ export default function generateDataStructure({
|
|
|
54
54
|
const nonMockedDependentAnalyses: ReadonlyAnalysisMap =
|
|
55
55
|
allImportedExports.reduce((acc, importedExport) => {
|
|
56
56
|
if (importedExport.isMocked) return acc;
|
|
57
|
+
// Use resolvedFilePath when available (for re-exports from index files)
|
|
58
|
+
// to find the actual analysis of the component
|
|
59
|
+
const lookupPath =
|
|
60
|
+
('resolvedFilePath' in importedExport &&
|
|
61
|
+
importedExport.resolvedFilePath) ||
|
|
62
|
+
importedExport.filePath;
|
|
57
63
|
const relevantDependencyAnalysis =
|
|
58
|
-
dependentAnalyses[
|
|
64
|
+
dependentAnalyses[lookupPath]?.[importedExport.name];
|
|
59
65
|
|
|
60
66
|
if (!relevantDependencyAnalysis) {
|
|
61
67
|
// console.info(
|
|
@@ -8,6 +8,7 @@ import measureAndReportExecutionTime from '../../utils/measureAndReportExecution
|
|
|
8
8
|
import { AI, generateEntityKeyAttributes } from '~codeyam/ai';
|
|
9
9
|
import { awsLog } from '~codeyam/utils';
|
|
10
10
|
import { gatherRelevantDependentKeyAttributes } from '~codeyam/ai';
|
|
11
|
+
import { gatherDataForMocks } from './generateScenarioData';
|
|
11
12
|
|
|
12
13
|
export interface GenerateEntityKeyAttributesArgs {
|
|
13
14
|
entity: Entity;
|
|
@@ -28,7 +29,14 @@ export default async function generateKeyAttributes({
|
|
|
28
29
|
}: GenerateEntityKeyAttributesArgs): Promise<void> {
|
|
29
30
|
if (!['visual', 'library'].includes(entity.entityType)) return;
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
// Merge direct dataForMocks with recursively gathered data from dependencies
|
|
33
|
+
const structure = {
|
|
34
|
+
arguments: analysis.metadata.scenariosDataStructure?.arguments ?? [],
|
|
35
|
+
dataForMocks: {
|
|
36
|
+
...(analysis.metadata.scenariosDataStructure?.dataForMocks ?? {}),
|
|
37
|
+
...gatherDataForMocks(analysis, dependentAnalyses),
|
|
38
|
+
},
|
|
39
|
+
};
|
|
32
40
|
|
|
33
41
|
awsLog(`🔮 Generating ${error ? 'error ' : ''}scenarios for`, {
|
|
34
42
|
filePath: entity.filePath,
|
|
@@ -104,8 +104,13 @@ export function gatherDataForMocks(
|
|
|
104
104
|
// regardless of whether we found a relevantKey above.
|
|
105
105
|
// This ensures transitive dependencies are included.
|
|
106
106
|
// For example: Activity -> CurrentActivityTab -> useLastLogLine
|
|
107
|
+
// Use resolvedFilePath when available (for re-exports from index files)
|
|
108
|
+
const lookupPath =
|
|
109
|
+
('resolvedFilePath' in importedExport &&
|
|
110
|
+
importedExport.resolvedFilePath) ||
|
|
111
|
+
importedExport.filePath;
|
|
107
112
|
const dependentAnalysis =
|
|
108
|
-
dependentAnalyses?.[
|
|
113
|
+
dependentAnalyses?.[lookupPath]?.[importedExport.name];
|
|
109
114
|
|
|
110
115
|
if (dependentAnalysis && !analysesGathered.has(dependentAnalysis.id)) {
|
|
111
116
|
analysesGathered.add(dependentAnalysis.id);
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
import measureAndReportExecutionTime from '../../utils/measureAndReportExecutionTime';
|
|
8
8
|
import { AI, generateEntityScenarios } from '~codeyam/ai';
|
|
9
9
|
import { awsLog } from '~codeyam/utils';
|
|
10
|
+
import { gatherDataForMocks } from './generateScenarioData';
|
|
10
11
|
|
|
11
12
|
export interface GenerateScenariosArgs {
|
|
12
13
|
entity: Entity;
|
|
@@ -27,7 +28,14 @@ export default async function generateScenarios({
|
|
|
27
28
|
}: GenerateScenariosArgs): Promise<void> {
|
|
28
29
|
if (!['visual', 'library'].includes(entity.entityType)) return;
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
// Merge direct dataForMocks with recursively gathered data from dependencies
|
|
32
|
+
const structure = {
|
|
33
|
+
arguments: analysis.metadata.scenariosDataStructure?.arguments ?? [],
|
|
34
|
+
dataForMocks: {
|
|
35
|
+
...(analysis.metadata.scenariosDataStructure?.dataForMocks ?? {}),
|
|
36
|
+
...gatherDataForMocks(analysis, dependentAnalyses),
|
|
37
|
+
},
|
|
38
|
+
};
|
|
31
39
|
|
|
32
40
|
awsLog(`🔮 Generating ${error ? 'error ' : ''}scenarios for`, {
|
|
33
41
|
filePath: entity.filePath,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface GetPresignedUploadUrlArgs {
|
|
2
|
+
bucketName: string;
|
|
3
|
+
key: string;
|
|
4
|
+
contentType?: string;
|
|
5
|
+
expiresInSeconds?: number;
|
|
6
|
+
}
|
|
7
|
+
interface GetPresignedDownloadUrlArgs {
|
|
8
|
+
bucketName: string;
|
|
9
|
+
key: string;
|
|
10
|
+
expiresInSeconds?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate a presigned URL for uploading a file to S3.
|
|
14
|
+
* The client can PUT directly to this URL without AWS credentials.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getPresignedUploadUrl({ bucketName, key, contentType, expiresInSeconds, }: GetPresignedUploadUrlArgs): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a presigned URL for downloading a file from S3.
|
|
19
|
+
* Anyone with this URL can GET the file without AWS credentials.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getPresignedDownloadUrl({ bucketName, key, expiresInSeconds, }: GetPresignedDownloadUrlArgs): Promise<string>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=getPresignedUrl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPresignedUrl.d.ts","sourceRoot":"","sources":["../../../../src/lib/s3/getPresignedUrl.ts"],"names":[],"mappings":"AAOA,UAAU,yBAAyB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,2BAA2B;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAKD;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,EAC1C,UAAU,EACV,GAAG,EACH,WAAgC,EAChC,gBAAwC,GACzC,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7C;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAC5C,UAAU,EACV,GAAG,EACH,gBAA0C,GAC3C,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAS/C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { S3Client, PutObjectCommand, GetObjectCommand, } from '@aws-sdk/client-s3';
|
|
2
|
+
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
|
3
|
+
const DEFAULT_UPLOAD_EXPIRY = 2 * 60 * 60; // 2 hours
|
|
4
|
+
const DEFAULT_DOWNLOAD_EXPIRY = 24 * 60 * 60; // 24 hours
|
|
5
|
+
/**
|
|
6
|
+
* Generate a presigned URL for uploading a file to S3.
|
|
7
|
+
* The client can PUT directly to this URL without AWS credentials.
|
|
8
|
+
*/
|
|
9
|
+
export async function getPresignedUploadUrl({ bucketName, key, contentType = 'application/gzip', expiresInSeconds = DEFAULT_UPLOAD_EXPIRY, }) {
|
|
10
|
+
const s3Client = new S3Client({});
|
|
11
|
+
const command = new PutObjectCommand({
|
|
12
|
+
Bucket: bucketName,
|
|
13
|
+
Key: key,
|
|
14
|
+
ContentType: contentType,
|
|
15
|
+
});
|
|
16
|
+
return getSignedUrl(s3Client, command, { expiresIn: expiresInSeconds });
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate a presigned URL for downloading a file from S3.
|
|
20
|
+
* Anyone with this URL can GET the file without AWS credentials.
|
|
21
|
+
*/
|
|
22
|
+
export async function getPresignedDownloadUrl({ bucketName, key, expiresInSeconds = DEFAULT_DOWNLOAD_EXPIRY, }) {
|
|
23
|
+
const s3Client = new S3Client({});
|
|
24
|
+
const command = new GetObjectCommand({
|
|
25
|
+
Bucket: bucketName,
|
|
26
|
+
Key: key,
|
|
27
|
+
});
|
|
28
|
+
return getSignedUrl(s3Client, command, { expiresIn: expiresInSeconds });
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=getPresignedUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPresignedUrl.js","sourceRoot":"","sources":["../../../../src/lib/s3/getPresignedUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAe7D,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU;AACrD,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW;AAEzD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,UAAU,EACV,GAAG,EACH,WAAW,GAAG,kBAAkB,EAChC,gBAAgB,GAAG,qBAAqB,GACd;IAC1B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;QACnC,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE,GAAG;QACR,WAAW,EAAE,WAAW;KACzB,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAC5C,UAAU,EACV,GAAG,EACH,gBAAgB,GAAG,uBAAuB,GACd;IAC5B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;QACnC,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE,GAAG;KACT,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -11,14 +11,15 @@
|
|
|
11
11
|
"author": "",
|
|
12
12
|
"license": "ISC",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@aws-sdk/client-codebuild": "^3.
|
|
14
|
+
"@aws-sdk/client-codebuild": "^3.948.0",
|
|
15
15
|
"@aws-sdk/client-cloudwatch-logs": "^3.940.0",
|
|
16
16
|
"@aws-sdk/client-dynamodb": "^3.899.0",
|
|
17
|
-
"@aws-sdk/client-ecr": "^3.
|
|
17
|
+
"@aws-sdk/client-ecr": "^3.948.0",
|
|
18
18
|
"@aws-sdk/client-ecs": "^3.937.0",
|
|
19
|
-
"@aws-sdk/client-s3": "^3.
|
|
19
|
+
"@aws-sdk/client-s3": "^3.940.0",
|
|
20
20
|
"@aws-sdk/client-sqs": "^3.940.0",
|
|
21
|
-
"@aws-sdk/lib-storage": "^3.
|
|
21
|
+
"@aws-sdk/lib-storage": "^3.940.0",
|
|
22
|
+
"@aws-sdk/s3-request-presigner": "^3.940.0",
|
|
22
23
|
"@aws-sdk/util-dynamodb": "^3.902.0"
|
|
23
24
|
}
|
|
24
25
|
}
|