@codeyam/codeyam-cli 0.1.0-staging.6e699e5 → 0.1.0-staging.79ef713
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 -7
- package/analyzer-template/packages/ai/index.ts +10 -2
- package/analyzer-template/packages/ai/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +86 -18
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +41 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +308 -50
- package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +15 -6
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +833 -243
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +54 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +60 -15
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +80 -5
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +393 -97
- package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +283 -1
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +11 -3
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +297 -7
- package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
- package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
- package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
- package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
- package/analyzer-template/packages/analyze/index.ts +2 -0
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
- package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +71 -9
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
- package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
- package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +37 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +459 -39
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
- package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
- package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/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/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/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/ProjectMetadata.d.ts +3 -0
- package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/package.json +1 -1
- package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
- package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +1 -0
- package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
- package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -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/ProjectMetadata.d.ts +3 -0
- package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
- package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
- package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
- 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 +90 -10
- 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 +11 -6
- package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
- package/analyzer-template/project/orchestrateCapture.ts +45 -6
- package/analyzer-template/project/start.ts +35 -11
- package/analyzer-template/project/writeMockDataTsx.ts +181 -8
- package/analyzer-template/project/writeScenarioComponents.ts +103 -12
- package/analyzer-template/project/writeSimpleRoot.ts +21 -11
- 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 +75 -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 +4 -4
- package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
- package/background/src/lib/virtualized/project/orchestrateCapture.js +38 -6
- package/background/src/lib/virtualized/project/orchestrateCapture.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 +162 -4
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +85 -15
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
- package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +180 -0
- package/codeyam-cli/scripts/apply-setup.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/debug.js +7 -5
- package/codeyam-cli/src/commands/debug.js.map +1 -1
- package/codeyam-cli/src/commands/memory.js +264 -0
- package/codeyam-cli/src/commands/memory.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +2 -2
- 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/backgroundServer.js +4 -0
- package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/utils/install-skills.js +55 -10
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +4 -0
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +285 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
- package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
- package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
- package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
- package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
- package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
- package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
- package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
- package/codeyam-cli/src/utils/rules/index.js +6 -0
- package/codeyam-cli/src/utils/rules/index.js.map +1 -0
- package/codeyam-cli/src/utils/rules/parser.js +78 -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/ruleState.js +150 -0
- package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
- package/codeyam-cli/src/utils/rules/staleness.js +137 -0
- package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +1 -1
- 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/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/EntityItem-B86KKU7e.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-D4TZhLuw.js → ReportIssueModal-C6PKeMYR.js} +3 -13
- package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DEx02QDa.js → ScenarioViewer-BNLaXBHR.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DoLIqZX2.js → activity.(_tab)-BtBFH820.js} +6 -16
- package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-DfKzxuoe.js +11 -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.save-fixture-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/book-open-PttOB2SF.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
- package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C5lqplTC.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-C2N4Op8e.js → entity._sha._-n38keI1k.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-0N0YJQv7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{git-B4RJRvYB.js → git-DXnyr8uP.js} +8 -8
- package/codeyam-cli/src/webserver/build/client/assets/globals-Bh6jH0cL.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/labs-CdVUfvji.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-87319d0f.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/memory-CPIDnDEj.js +76 -0
- package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-D6oziHts.js +62 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-CS5f3WzT.js → settings-eBI36Yv5.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
- package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-9ox9LcrG.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-Cq5Vqcob.js +260 -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-power-rules-hook.sh → codeyam-memory-hook.sh} +12 -13
- package/codeyam-cli/templates/codeyam:diagnose.md +178 -25
- package/codeyam-cli/templates/codeyam:memory.md +404 -0
- package/codeyam-cli/templates/codeyam:new-rule.md +2 -2
- package/codeyam-cli/templates/rule-notification-hook.py +56 -0
- package/codeyam-cli/templates/rule-reflection-hook.py +590 -0
- package/codeyam-cli/templates/rules-instructions.md +123 -0
- package/package.json +8 -6
- package/packages/ai/index.js +3 -2
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +68 -13
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/methodSemantics.js +41 -17
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
- package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +239 -43
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +650 -166
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +52 -3
- package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +55 -11
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
- package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +73 -5
- package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
- package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
- package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +333 -86
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
- package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +205 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlows.js +10 -2
- package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +209 -3
- package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
- package/packages/ai/src/lib/isolateScopes.js +39 -3
- package/packages/ai/src/lib/isolateScopes.js.map +1 -1
- package/packages/ai/src/lib/mergeStatements.js +70 -51
- package/packages/ai/src/lib/mergeStatements.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
- package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
- 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/index.js +1 -0
- package/packages/analyze/index.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
- package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +54 -6
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.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/gatherEntityMap.js +2 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
- package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
- package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
- package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
- package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +33 -8
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
- package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +399 -31
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
- package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/index.js +1 -0
- package/packages/analyze/src/lib/index.js.map +1 -1
- package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
- package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
- 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/codeyam-cli/src/webserver/build/client/assets/EntityItem-BXhEawa3.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BRb-0kQl.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-Cs4MdYtv.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-commit-horizontal-CysbcZxi.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/globals-DMUaGAqV.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-f874c610.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-Bz5TunQg.js +0 -57
- package/codeyam-cli/src/webserver/build/client/assets/rules-hEkvVw2-.js +0 -97
- package/codeyam-cli/src/webserver/build/server/assets/index-967OuJoF.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DRTmerg9.js +0 -257
- package/codeyam-cli/templates/codeyam:power-rules.md +0 -447
- /package/codeyam-cli/src/webserver/build/client/assets/{api.rules-l0sNRNKZ.js → api.agent-transcripts-l0sNRNKZ.js} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"buildTimestamp": "2026-
|
|
3
|
-
"buildTime":
|
|
4
|
-
"gitCommit": "
|
|
2
|
+
"buildTimestamp": "2026-02-09T23:40:32.703Z",
|
|
3
|
+
"buildTime": 1770680432703,
|
|
4
|
+
"gitCommit": "79ef713db8aedbd08bf0e42c7aa8b6f99117bbdb",
|
|
5
5
|
"nodeVersion": "v20.20.0",
|
|
6
|
-
"contentHash": "
|
|
7
|
-
"buildNumber":
|
|
8
|
-
"semanticVersion": "0.1.
|
|
9
|
-
"version": "0.1.
|
|
6
|
+
"contentHash": "aaa0ef29735f956b90bfc57d268b877db2ba758456e586a28cc3af7e44ea35f1",
|
|
7
|
+
"buildNumber": 598,
|
|
8
|
+
"semanticVersion": "0.1.598",
|
|
9
|
+
"version": "0.1.598 (2026-02-09T23:40+aaa0ef2)"
|
|
10
10
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
[
|
|
3
|
-
[
|
|
2
|
+
[2/9/2026, 11:40:32 PM] > codeyam-combo@1.0.0 mergeDependencies
|
|
3
|
+
[2/9/2026, 11:40:32 PM] > node ./scripts/mergePackageJsonFiles.cjs
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
[
|
|
6
|
+
[2/9/2026, 11:40:32 PM] Merged dependencies into root package.json
|
|
7
7
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"build": "tsc && node ./scripts/postbuild.cjs"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@aws-sdk/client-cloudwatch-logs": "^3.
|
|
10
|
+
"@aws-sdk/client-cloudwatch-logs": "^3.980.0",
|
|
11
11
|
"@aws-sdk/client-cloudfront": "^3.966.0",
|
|
12
12
|
"@aws-sdk/client-codebuild": "^3.948.0",
|
|
13
13
|
"@aws-sdk/client-dynamodb": "^3.956.0",
|
|
@@ -30,25 +30,25 @@
|
|
|
30
30
|
"jest": "^30.2.0",
|
|
31
31
|
"jsdom": "^27.4.0",
|
|
32
32
|
"jsonc-parser": "^3.2.1",
|
|
33
|
-
"lru-cache": "^11.2.
|
|
33
|
+
"lru-cache": "^11.2.5",
|
|
34
34
|
"openai": "^6.16.0",
|
|
35
35
|
"p-queue": "^8.1.0",
|
|
36
36
|
"p-retry": "^7.1.1",
|
|
37
37
|
"piscina": "^5.1.4",
|
|
38
38
|
"pixelmatch": "^5.3.0",
|
|
39
|
-
"playwright": "
|
|
39
|
+
"playwright": "1.58.0",
|
|
40
40
|
"sharp": "^0.34.5",
|
|
41
41
|
"simple-git": "^3.28.0",
|
|
42
|
-
"undici": "^7.
|
|
42
|
+
"undici": "^7.18.2",
|
|
43
43
|
"uuid": "^11.1.0",
|
|
44
44
|
"pluralize": "^8.0.0",
|
|
45
45
|
"yargs": "^18.0.0",
|
|
46
46
|
"json5": "^2.2.3",
|
|
47
|
-
"@anthropic-ai/sdk": "^0.
|
|
47
|
+
"@anthropic-ai/sdk": "^0.74.0",
|
|
48
48
|
"@aws-sdk/s3-request-presigner": "^3.940.0",
|
|
49
49
|
"better-sqlite3": "^12.4.1",
|
|
50
50
|
"fetch-retry": "^6.0.0",
|
|
51
|
-
"kysely": "^0.28.
|
|
51
|
+
"kysely": "^0.28.11",
|
|
52
52
|
"pg": "^8.16.3",
|
|
53
53
|
"@octokit/request": "^10.0.3",
|
|
54
54
|
"lucide-react": "^0.556.0",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"@types/jest": "^30.0.0",
|
|
65
65
|
"@types/pg": "^8.15.5",
|
|
66
66
|
"@types/ws": "^8.18.1",
|
|
67
|
-
"@octokit/types": "^
|
|
67
|
+
"@octokit/types": "^16.0.0",
|
|
68
68
|
"@types/react": "^19.2.7",
|
|
69
69
|
"@types/react-dom": "^19.2.3",
|
|
70
70
|
"@types/react-resizable": "^3.0.7",
|
|
@@ -40,7 +40,10 @@ export { default as describeCodeChange } from './src/lib/describeCodeChange';
|
|
|
40
40
|
export { default as validateTypeStructure } from './src/lib/validateTypeStructure';
|
|
41
41
|
export { default as validateDataStructure } from './src/lib/validateDataStructure';
|
|
42
42
|
export { default as isolateScopes } from './src/lib/isolateScopes';
|
|
43
|
-
export {
|
|
43
|
+
export {
|
|
44
|
+
default as analyzeScope,
|
|
45
|
+
destroyWorkerPool,
|
|
46
|
+
} from './src/lib/analyzeScope';
|
|
44
47
|
export { default as logOrderedMap } from './src/lib/logOrderedMap';
|
|
45
48
|
export {
|
|
46
49
|
default as splitOutsideParentheses,
|
|
@@ -54,8 +57,13 @@ export {
|
|
|
54
57
|
removeDuplicateFunctionCalls,
|
|
55
58
|
} from './src/lib/dataStructure/helpers/cleanNonObjectFunctions';
|
|
56
59
|
export { default as convertDotNotation } from './src/lib/dataStructure/helpers/convertDotNotation';
|
|
60
|
+
export { default as convertTypeAnnotationsToValues } from './src/lib/dataStructure/helpers/convertTypeAnnotationsToValues';
|
|
57
61
|
export { default as cleanOutBoundary } from './src/lib/cleanOutBoundary';
|
|
58
|
-
export {
|
|
62
|
+
export {
|
|
63
|
+
fillInDirectSchemaGapsAndUnknowns,
|
|
64
|
+
buildSchemaIndexes,
|
|
65
|
+
type SchemaIndexes,
|
|
66
|
+
} from './src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns';
|
|
59
67
|
export { default as deduplicateFunctionSchemas } from './src/lib/dataStructure/helpers/deduplicateFunctionSchemas';
|
|
60
68
|
export { default as getConditionalUsagesFromCode } from './src/lib/getConditionalUsagesFromCode';
|
|
61
69
|
export type {
|
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"author": "",
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@anthropic-ai/sdk": "^0.
|
|
12
|
+
"@anthropic-ai/sdk": "^0.74.0",
|
|
13
13
|
"jsdom": "^27.4.0",
|
|
14
14
|
"p-queue": "^8.1.0",
|
|
15
15
|
"p-retry": "^7.1.1",
|
|
16
16
|
"piscina": "^5.1.4",
|
|
17
|
-
"lru-cache": "^11.2.
|
|
17
|
+
"lru-cache": "^11.2.5"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@types/jsdom": "^27.0.0"
|
|
@@ -49,6 +49,7 @@ let workerPool: Piscina<
|
|
|
49
49
|
AnalyzeScopeWorkerInput,
|
|
50
50
|
AnalyzeScopeWorkerOutput
|
|
51
51
|
> | null = null;
|
|
52
|
+
let workerPoolDestroyed = false;
|
|
52
53
|
|
|
53
54
|
/**
|
|
54
55
|
* Check if we're in Node.js main thread
|
|
@@ -65,11 +66,48 @@ function getIsMainThread(): boolean {
|
|
|
65
66
|
return isMainThread;
|
|
66
67
|
}
|
|
67
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Destroy the worker pool, freeing its ~2GB heap.
|
|
71
|
+
* Called after data structure preparation completes (the producing phase transition).
|
|
72
|
+
* The worker is not needed after this point — subsequent calls to ensureWorkerPool() will throw.
|
|
73
|
+
*/
|
|
74
|
+
export async function destroyWorkerPool() {
|
|
75
|
+
if (workerPool) {
|
|
76
|
+
const memBefore = process.memoryUsage();
|
|
77
|
+
console.log('CodeYam: Destroying worker pool...', {
|
|
78
|
+
rssBefore: `${Math.round(memBefore.rss / 1024 / 1024)}MB`,
|
|
79
|
+
heapBefore: `${Math.round(memBefore.heapUsed / 1024 / 1024)}MB`,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
await workerPool.destroy();
|
|
83
|
+
workerPool = null;
|
|
84
|
+
|
|
85
|
+
// Force GC if available to reclaim worker memory faster
|
|
86
|
+
if (global.gc) {
|
|
87
|
+
global.gc();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const memAfter = process.memoryUsage();
|
|
91
|
+
console.log('CodeYam: Worker pool destroyed', {
|
|
92
|
+
rssAfter: `${Math.round(memAfter.rss / 1024 / 1024)}MB`,
|
|
93
|
+
heapAfter: `${Math.round(memAfter.heapUsed / 1024 / 1024)}MB`,
|
|
94
|
+
rssDelta: `${Math.round((memAfter.rss - memBefore.rss) / 1024 / 1024)}MB`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
workerPoolDestroyed = true;
|
|
98
|
+
}
|
|
99
|
+
|
|
68
100
|
/**
|
|
69
101
|
* Lazy initialization of worker pool.
|
|
70
102
|
* Called on first use to ensure environment variables are set.
|
|
71
103
|
*/
|
|
72
104
|
function ensureWorkerPool() {
|
|
105
|
+
if (workerPoolDestroyed) {
|
|
106
|
+
throw new Error(
|
|
107
|
+
'CodeYam: Worker pool was destroyed (post-producing phase). ' +
|
|
108
|
+
'analyzeScope should not be called after data structure preparation completes.',
|
|
109
|
+
);
|
|
110
|
+
}
|
|
73
111
|
if (workerPool !== null) return;
|
|
74
112
|
|
|
75
113
|
// Only initialize worker pool in Node.js environment
|
|
@@ -85,10 +123,17 @@ function ensureWorkerPool() {
|
|
|
85
123
|
// Note: WORKER_PATH is null when __mocks__/analyzeScope.ts is active
|
|
86
124
|
const { WORKER_PATH } = analyzeScopeWorkerPaths();
|
|
87
125
|
|
|
126
|
+
// Disable workers when tracing is enabled - we need access to ScopeDataStructure
|
|
127
|
+
// instance in the main thread to capture pre-serialization state
|
|
128
|
+
const tracingEnabled =
|
|
129
|
+
process.env.CODEYAM_TRACE_TRANSFORMS === '1' ||
|
|
130
|
+
process.env.CODEYAM_TRACE_TRANSFORMS === 'true';
|
|
131
|
+
|
|
88
132
|
if (
|
|
89
133
|
process.env.USE_WORKER_THREADS &&
|
|
90
134
|
WORKER_PATH &&
|
|
91
|
-
fs.existsSync(WORKER_PATH)
|
|
135
|
+
fs.existsSync(WORKER_PATH) &&
|
|
136
|
+
!tracingEnabled
|
|
92
137
|
) {
|
|
93
138
|
console.log('CodeYam: Using worker threads for analyzeScope', {
|
|
94
139
|
WORKER_PATH,
|
|
@@ -121,6 +166,7 @@ function ensureWorkerPool() {
|
|
|
121
166
|
WORKER_PATH,
|
|
122
167
|
workerExists: WORKER_PATH ? fs.existsSync(WORKER_PATH) : false,
|
|
123
168
|
USE_WORKER_THREADS: process.env.USE_WORKER_THREADS,
|
|
169
|
+
tracingEnabled,
|
|
124
170
|
});
|
|
125
171
|
workerPool = null; // Explicitly set to indicate "no workers"
|
|
126
172
|
}
|
|
@@ -334,7 +380,7 @@ export async function analyzeScopeLocal({
|
|
|
334
380
|
}
|
|
335
381
|
|
|
336
382
|
for (const mapping of [structure, equivalentVariables]) {
|
|
337
|
-
for (let [key,
|
|
383
|
+
for (let [key, rawValue] of Object.entries(mapping)) {
|
|
338
384
|
for (const [childScopeId, childScope] of sortedEntries) {
|
|
339
385
|
const scopeText = fileAnalyzer.sourceFile.text.slice(
|
|
340
386
|
childScope.start,
|
|
@@ -354,27 +400,49 @@ export async function analyzeScopeLocal({
|
|
|
354
400
|
return text;
|
|
355
401
|
};
|
|
356
402
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
if (
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
403
|
+
// Handle both string and string[] values (for OR expressions)
|
|
404
|
+
const processValue = (value: string): string => {
|
|
405
|
+
if (value.includes(scopeText)) {
|
|
406
|
+
// DEBUG: Log when replacement happens
|
|
407
|
+
if (key.includes('Fetcher') || key.includes('fetcher')) {
|
|
408
|
+
console.log(
|
|
409
|
+
'CodeYam DEBUG value replacement:',
|
|
410
|
+
JSON.stringify({
|
|
411
|
+
key,
|
|
412
|
+
oldValue: value,
|
|
413
|
+
childScopeId,
|
|
414
|
+
scopeTextPreview: scopeText.slice(0, 50),
|
|
415
|
+
}),
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
return replaceChildScopeId(value);
|
|
419
|
+
}
|
|
420
|
+
return value;
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
if (Array.isArray(rawValue)) {
|
|
424
|
+
const newValues = rawValue.map(processValue);
|
|
425
|
+
(mapping as Record<string, string | string[]>)[key] =
|
|
426
|
+
newValues;
|
|
427
|
+
rawValue = newValues;
|
|
428
|
+
} else if (typeof rawValue === 'string') {
|
|
429
|
+
const newValue = processValue(rawValue);
|
|
430
|
+
if (newValue !== rawValue) {
|
|
431
|
+
(mapping as Record<string, string | string[]>)[key] =
|
|
432
|
+
newValue;
|
|
433
|
+
rawValue = newValue;
|
|
369
434
|
}
|
|
370
|
-
value = replaceChildScopeId(value);
|
|
371
|
-
mapping[key] = value;
|
|
372
435
|
}
|
|
436
|
+
|
|
373
437
|
if (key.includes(scopeText)) {
|
|
374
438
|
const oldKey = key;
|
|
375
439
|
key = replaceChildScopeId(key);
|
|
376
|
-
mapping[key] =
|
|
377
|
-
|
|
440
|
+
(mapping as Record<string, string | string[]>)[key] = (
|
|
441
|
+
mapping as Record<string, string | string[]>
|
|
442
|
+
)[oldKey];
|
|
443
|
+
delete (mapping as Record<string, string | string[]>)[
|
|
444
|
+
oldKey
|
|
445
|
+
];
|
|
378
446
|
}
|
|
379
447
|
}
|
|
380
448
|
}
|
|
@@ -102,7 +102,7 @@ import { ThrowStatementHandler } from './patterns/throwStatementHandler';
|
|
|
102
102
|
*/
|
|
103
103
|
export class ASTScopeAnalyzer {
|
|
104
104
|
private structure: Record<string, string> = {};
|
|
105
|
-
private equivalentVariables: Record<string, string> = {};
|
|
105
|
+
private equivalentVariables: Record<string, string | string[]> = {};
|
|
106
106
|
private environmentVariables: string[] = [];
|
|
107
107
|
private conditionalUsages: Record<string, ConditionalUsage[]> = {};
|
|
108
108
|
private compoundConditionals: CompoundConditional[] = [];
|
|
@@ -235,6 +235,8 @@ export class ASTScopeAnalyzer {
|
|
|
235
235
|
typeChecker: this.fileAnalyzer.typeChecker,
|
|
236
236
|
addEquivalence: (leftSide, rightSide) =>
|
|
237
237
|
this.addEquivalence(leftSide, rightSide),
|
|
238
|
+
addMultipleEquivalencies: (leftSide, rightSides) =>
|
|
239
|
+
this.addMultipleEquivalencies(leftSide, rightSides),
|
|
238
240
|
addType: (path, type) => this.addType(path, type),
|
|
239
241
|
addEnvironmentVariable: (variablePath) =>
|
|
240
242
|
this.addEnvironmentVariable(variablePath),
|
|
@@ -592,7 +594,9 @@ export class ASTScopeAnalyzer {
|
|
|
592
594
|
}
|
|
593
595
|
|
|
594
596
|
/**
|
|
595
|
-
* Adds an equivalence relationship between two variable paths
|
|
597
|
+
* Adds an equivalence relationship between two variable paths.
|
|
598
|
+
* Uses overwrite semantics - if an equivalence already exists, the new value replaces it
|
|
599
|
+
* (unless the new value is 'undefined' or 'null').
|
|
596
600
|
*/
|
|
597
601
|
private addEquivalence(
|
|
598
602
|
leftSide: StructuredPath,
|
|
@@ -622,6 +626,44 @@ export class ASTScopeAnalyzer {
|
|
|
622
626
|
}
|
|
623
627
|
}
|
|
624
628
|
|
|
629
|
+
/**
|
|
630
|
+
* Adds multiple equivalence relationships for a single variable path.
|
|
631
|
+
* Used for OR expressions like `x = a || b` where x is equivalent to both a and b.
|
|
632
|
+
* The values are stored as an array to track all possible sources.
|
|
633
|
+
*/
|
|
634
|
+
private addMultipleEquivalencies(
|
|
635
|
+
leftSide: StructuredPath,
|
|
636
|
+
rightSides: StructuredPath[],
|
|
637
|
+
): void {
|
|
638
|
+
if (leftSide?.isLiteral()) {
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
const leftSideStr = leftSide?.toLeftHandSideString();
|
|
643
|
+
if (!leftSideStr) return;
|
|
644
|
+
|
|
645
|
+
// Filter out invalid paths and convert to strings
|
|
646
|
+
const validRightSides = rightSides
|
|
647
|
+
.map((r) => r?.toRightHandSideString())
|
|
648
|
+
.filter((r): r is string => !!r && r !== leftSideStr);
|
|
649
|
+
|
|
650
|
+
// Remove duplicates while preserving order
|
|
651
|
+
const uniqueRightSides = [...new Set(validRightSides)];
|
|
652
|
+
|
|
653
|
+
// Filter out 'undefined' and 'null' unless they're the only values
|
|
654
|
+
const meaningfulValues = uniqueRightSides.filter(
|
|
655
|
+
(v) => v !== 'undefined' && v !== 'null',
|
|
656
|
+
);
|
|
657
|
+
const finalValues =
|
|
658
|
+
meaningfulValues.length > 0 ? meaningfulValues : uniqueRightSides;
|
|
659
|
+
|
|
660
|
+
if (finalValues.length === 0) return;
|
|
661
|
+
|
|
662
|
+
// Store as single value if only one, otherwise as array
|
|
663
|
+
this.equivalentVariables[leftSideStr] =
|
|
664
|
+
finalValues.length === 1 ? finalValues[0] : finalValues;
|
|
665
|
+
}
|
|
666
|
+
|
|
625
667
|
/**
|
|
626
668
|
* Adds a type for a variable path
|
|
627
669
|
*/
|
|
@@ -785,22 +827,38 @@ export class ASTScopeAnalyzer {
|
|
|
785
827
|
// Update the type for the given path
|
|
786
828
|
this.structure[pathStr] = newType;
|
|
787
829
|
|
|
788
|
-
// Also update the type for any equivalent path
|
|
830
|
+
// Also update the type for any equivalent path(s)
|
|
789
831
|
// e.g., if "state" -> "signature[0]", update "signature[0]" as well
|
|
790
|
-
const
|
|
791
|
-
|
|
792
|
-
|
|
832
|
+
const rawEquivalentPath = this.equivalentVariables[pathStr];
|
|
833
|
+
const equivalentPaths = Array.isArray(rawEquivalentPath)
|
|
834
|
+
? rawEquivalentPath
|
|
835
|
+
: rawEquivalentPath
|
|
836
|
+
? [rawEquivalentPath]
|
|
837
|
+
: [];
|
|
838
|
+
for (const equivalentPath of equivalentPaths) {
|
|
839
|
+
if (typeof equivalentPath === 'string') {
|
|
840
|
+
this.structure[equivalentPath] = newType;
|
|
841
|
+
}
|
|
793
842
|
}
|
|
794
843
|
|
|
795
844
|
// For property paths like "data.status", check if the base has an equivalence
|
|
796
845
|
// e.g., if "data" -> "signature[0]", transform "data.status" to "signature[0].status"
|
|
797
|
-
for (const [varPath,
|
|
846
|
+
for (const [varPath, rawEquivalence] of Object.entries(
|
|
798
847
|
this.equivalentVariables,
|
|
799
848
|
)) {
|
|
800
849
|
if (pathStr.startsWith(varPath + '.')) {
|
|
850
|
+
const equivalences = Array.isArray(rawEquivalence)
|
|
851
|
+
? rawEquivalence
|
|
852
|
+
: rawEquivalence
|
|
853
|
+
? [rawEquivalence]
|
|
854
|
+
: [];
|
|
801
855
|
const suffix = pathStr.slice(varPath.length);
|
|
802
|
-
const
|
|
803
|
-
|
|
856
|
+
for (const equivalence of equivalences) {
|
|
857
|
+
if (typeof equivalence === 'string') {
|
|
858
|
+
const transformedPath = equivalence + suffix;
|
|
859
|
+
this.structure[transformedPath] = newType;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
804
862
|
}
|
|
805
863
|
}
|
|
806
864
|
}
|
|
@@ -329,11 +329,17 @@ export class ArrayReduceSemantics implements MethodSemantics {
|
|
|
329
329
|
/**
|
|
330
330
|
* Array concat method semantics
|
|
331
331
|
*
|
|
332
|
-
* concat() returns a new array combining the original
|
|
332
|
+
* concat() returns a new array/string combining the original and additional items
|
|
333
|
+
*
|
|
334
|
+
* NOTE: We intentionally do NOT type the source as 'array' here because
|
|
335
|
+
* .concat() exists on both arrays AND strings. Typing the source prematurely
|
|
336
|
+
* causes type contamination when the source is equivalent to other paths
|
|
337
|
+
* via ?? chains. Type inference happens later in checkIfKnownType() based
|
|
338
|
+
* on accumulated evidence from all methods called on a path.
|
|
333
339
|
*/
|
|
334
340
|
export class ArrayConcatSemantics implements MethodSemantics {
|
|
335
341
|
getReturnType(): string {
|
|
336
|
-
return '
|
|
342
|
+
return 'unknown'; // Could be array or string depending on source
|
|
337
343
|
}
|
|
338
344
|
|
|
339
345
|
addEquivalences(
|
|
@@ -341,23 +347,24 @@ export class ArrayConcatSemantics implements MethodSemantics {
|
|
|
341
347
|
sourcePath: StructuredPath,
|
|
342
348
|
context: AnalysisContext,
|
|
343
349
|
): void {
|
|
344
|
-
//
|
|
345
|
-
|
|
350
|
+
// NOTE: We use 'unknown' instead of 'array' for the source because .concat()
|
|
351
|
+
// exists on both arrays AND strings. Using 'array' causes type contamination
|
|
352
|
+
// when the source is equivalent to other paths via ?? chains.
|
|
353
|
+
context.addType(sourcePath, 'unknown');
|
|
346
354
|
|
|
347
|
-
// Any arguments are also added to the
|
|
355
|
+
// Any arguments are also added to the result
|
|
348
356
|
const functionCallSegment = methodCallPath.getLastFunctionCallSegment();
|
|
349
357
|
|
|
350
358
|
if (functionCallSegment) {
|
|
351
359
|
// Each argument could be an array or single element
|
|
352
360
|
functionCallSegment.args.forEach((argPath) => {
|
|
353
361
|
// No need to guess the type - we'll discover it through normal processing
|
|
354
|
-
// But we can indicate that these elements will be in the result
|
|
362
|
+
// But we can indicate that these elements will be in the result
|
|
355
363
|
context.addEquivalence(methodCallPath, argPath);
|
|
356
364
|
});
|
|
357
365
|
}
|
|
358
366
|
|
|
359
|
-
// The original
|
|
360
|
-
context.addType(methodCallPath, 'array');
|
|
367
|
+
// The original elements are also in the result
|
|
361
368
|
context.addEquivalence(methodCallPath, sourcePath.withElement('*'));
|
|
362
369
|
}
|
|
363
370
|
|
|
@@ -369,11 +376,17 @@ export class ArrayConcatSemantics implements MethodSemantics {
|
|
|
369
376
|
/**
|
|
370
377
|
* Array slice method semantics
|
|
371
378
|
*
|
|
372
|
-
* slice() returns a shallow copy of a portion of an array
|
|
379
|
+
* slice() returns a shallow copy of a portion of an array (or string)
|
|
380
|
+
*
|
|
381
|
+
* NOTE: We intentionally do NOT type the source as 'array' here because
|
|
382
|
+
* .slice() exists on both arrays AND strings. Typing the source prematurely
|
|
383
|
+
* causes type contamination when the source is equivalent to other paths
|
|
384
|
+
* via ?? chains. Type inference happens later in checkIfKnownType() based
|
|
385
|
+
* on accumulated evidence from all methods called on a path.
|
|
373
386
|
*/
|
|
374
387
|
export class ArraySliceSemantics implements MethodSemantics {
|
|
375
388
|
getReturnType(): string {
|
|
376
|
-
return '
|
|
389
|
+
return 'unknown'; // Could be array or string depending on source
|
|
377
390
|
}
|
|
378
391
|
|
|
379
392
|
addEquivalences(
|
|
@@ -381,12 +394,15 @@ export class ArraySliceSemantics implements MethodSemantics {
|
|
|
381
394
|
sourcePath: StructuredPath,
|
|
382
395
|
context: AnalysisContext,
|
|
383
396
|
): void {
|
|
384
|
-
//
|
|
385
|
-
|
|
397
|
+
// NOTE: We use 'unknown' instead of 'array' for the source because .slice()
|
|
398
|
+
// exists on both arrays AND strings. Using 'array' causes type contamination
|
|
399
|
+
// when the source is equivalent to other paths via ?? chains.
|
|
400
|
+
// Type inference happens later in checkIfKnownType() based on accumulated evidence.
|
|
401
|
+
context.addType(sourcePath, 'unknown');
|
|
386
402
|
|
|
387
|
-
//
|
|
403
|
+
// Still track the return value type for data structure tracking
|
|
388
404
|
const methodCallPathWithReturnValues = methodCallPath.withReturnValues();
|
|
389
|
-
context.addType(methodCallPathWithReturnValues, '
|
|
405
|
+
context.addType(methodCallPathWithReturnValues, 'unknown');
|
|
390
406
|
}
|
|
391
407
|
|
|
392
408
|
isComplete(): boolean {
|
|
@@ -608,6 +624,12 @@ export class ArrayFlatMapSemantics implements MethodSemantics {
|
|
|
608
624
|
* Array at method semantics
|
|
609
625
|
*
|
|
610
626
|
* at() returns the element at the given index, supporting negative indices
|
|
627
|
+
*
|
|
628
|
+
* NOTE: We intentionally do NOT type the source as 'array' here because
|
|
629
|
+
* .at() exists on both arrays AND strings. Typing the source prematurely
|
|
630
|
+
* causes type contamination when the source is equivalent to other paths
|
|
631
|
+
* via ?? chains. Type inference happens later in checkIfKnownType() based
|
|
632
|
+
* on accumulated evidence from all methods called on a path.
|
|
611
633
|
*/
|
|
612
634
|
export class ArrayAtSemantics implements MethodSemantics {
|
|
613
635
|
getReturnType(): string {
|
|
@@ -619,10 +641,12 @@ export class ArrayAtSemantics implements MethodSemantics {
|
|
|
619
641
|
sourcePath: StructuredPath,
|
|
620
642
|
context: AnalysisContext,
|
|
621
643
|
): void {
|
|
622
|
-
//
|
|
623
|
-
|
|
644
|
+
// NOTE: We use 'unknown' instead of 'array' for the source because .at()
|
|
645
|
+
// exists on both arrays AND strings. Using 'array' causes type contamination
|
|
646
|
+
// when the source is equivalent to other paths via ?? chains.
|
|
647
|
+
context.addType(sourcePath, 'unknown');
|
|
624
648
|
|
|
625
|
-
// The return value is equivalent to an
|
|
649
|
+
// The return value is equivalent to an element
|
|
626
650
|
context.addEquivalence(
|
|
627
651
|
methodCallPath.withReturnValues(),
|
|
628
652
|
sourcePath.withElement('*'),
|
|
@@ -22,11 +22,8 @@ export class ForInStatementHandler implements PatternHandler {
|
|
|
22
22
|
// Process the expression being iterated over first (e.g., object)
|
|
23
23
|
context.processExpression(node.expression);
|
|
24
24
|
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// If the initializer is a variable declaration with an identifier, establish equivalence
|
|
29
|
-
// to indicate it's iterating over the keys of the expression
|
|
25
|
+
// If the initializer is a variable declaration with an identifier,
|
|
26
|
+
// type it as 'string' since for-in keys are always strings
|
|
30
27
|
if (ts.isVariableDeclarationList(node.initializer)) {
|
|
31
28
|
const declarations = node.initializer.declarations;
|
|
32
29
|
if (
|
|
@@ -36,25 +33,21 @@ export class ForInStatementHandler implements PatternHandler {
|
|
|
36
33
|
) {
|
|
37
34
|
const variableName = StructuredPath.fromBase(declarations[0].name.text);
|
|
38
35
|
|
|
39
|
-
//
|
|
36
|
+
// Type the key variable as 'string' — for-in keys are always strings.
|
|
37
|
+
// Note: We intentionally do NOT equivalence the key variable to
|
|
38
|
+
// expressionPath[*key*]. The key variable is the KEY (a string),
|
|
39
|
+
// while [*key*] in the schema represents the VALUE at a dynamic key.
|
|
40
|
+
// Creating that equivalence would cause the 'string' type to propagate
|
|
41
|
+
// to the value path. The value access (e.g., obj[key]) is handled
|
|
42
|
+
// correctly by the element access handler in processExpression.
|
|
40
43
|
context.addType(variableName, 'string');
|
|
41
|
-
|
|
42
|
-
if (expressionPath) {
|
|
43
|
-
// For for...in loops, the variable is equivalent to the keys of the object
|
|
44
|
-
// We represent this with a *key* suffix to indicate it's a key, not a value
|
|
45
|
-
context.addEquivalence(variableName, expressionPath.withKey('key'));
|
|
46
|
-
}
|
|
47
44
|
}
|
|
48
45
|
} else if (ts.isIdentifier(node.initializer)) {
|
|
49
46
|
// If the initializer is directly an identifier (rare but possible)
|
|
50
47
|
const variableName = StructuredPath.fromBase(node.initializer.text);
|
|
51
48
|
|
|
52
|
-
//
|
|
49
|
+
// See comment above — type as string but don't equivalence to value path
|
|
53
50
|
context.addType(variableName, 'string');
|
|
54
|
-
|
|
55
|
-
if (expressionPath) {
|
|
56
|
-
context.addEquivalence(variableName, expressionPath.withKey('key'));
|
|
57
|
-
}
|
|
58
51
|
} else {
|
|
59
52
|
context.processExpression(node.initializer);
|
|
60
53
|
}
|