@codeyam/codeyam-cli 0.1.0-staging.323686 → 0.1.0-staging.483fdc2

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.
Files changed (171) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +2 -2
  4. package/analyzer-template/packages/ai/index.ts +6 -1
  5. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +39 -17
  6. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
  7. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +308 -50
  8. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +15 -6
  9. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +664 -242
  10. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  11. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +20 -1
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +35 -13
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +160 -0
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +289 -83
  17. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +269 -1
  18. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
  19. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +11 -3
  20. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  21. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +297 -7
  22. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
  23. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  24. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  25. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
  26. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
  27. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  28. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  29. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  30. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  31. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  32. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  33. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  34. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  35. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +20 -6
  36. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +14 -4
  37. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  38. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
  39. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  40. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  41. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +57 -13
  42. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +29 -0
  43. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +35 -4
  44. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
  45. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +199 -17
  46. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  47. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  48. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  49. package/analyzer-template/packages/aws/package.json +1 -1
  50. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  51. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  52. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  53. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  54. package/analyzer-template/packages/github/package.json +1 -1
  55. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
  56. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  57. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  58. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  59. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  60. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  61. package/analyzer-template/project/constructMockCode.ts +54 -9
  62. package/analyzer-template/project/writeMockDataTsx.ts +73 -2
  63. package/background/src/lib/virtualized/project/constructMockCode.js +45 -3
  64. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  65. package/background/src/lib/virtualized/project/writeMockDataTsx.js +71 -2
  66. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  67. package/codeyam-cli/scripts/apply-setup.js +146 -0
  68. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  69. package/codeyam-cli/src/commands/debug.js +7 -5
  70. package/codeyam-cli/src/commands/debug.js.map +1 -1
  71. package/codeyam-cli/src/utils/install-skills.js +22 -0
  72. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  73. package/codeyam-cli/src/utils/reviewedRules.js +92 -0
  74. package/codeyam-cli/src/utils/reviewedRules.js.map +1 -0
  75. package/codeyam-cli/src/webserver/build/client/assets/globals-CX9f-5xM.css +1 -0
  76. package/codeyam-cli/src/webserver/build/client/assets/{manifest-7522edd4.js → manifest-bba56ec1.js} +1 -1
  77. package/codeyam-cli/src/webserver/build/client/assets/memory-DuTFSyJ2.js +92 -0
  78. package/codeyam-cli/src/webserver/build/client/assets/{root-eVAaavTS.js → root-DTfSQARG.js} +6 -6
  79. package/codeyam-cli/src/webserver/build/server/assets/{index-DVzYx8PN.js → index-TD1f-DHV.js} +1 -1
  80. package/codeyam-cli/src/webserver/build/server/assets/server-build-BQ-1XyEa.js +258 -0
  81. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  82. package/codeyam-cli/src/webserver/build-info.json +5 -5
  83. package/codeyam-cli/templates/codeyam:memory.md +174 -233
  84. package/codeyam-cli/templates/codeyam:new-rule.md +41 -2
  85. package/codeyam-cli/templates/rule-reflection-hook.py +161 -0
  86. package/codeyam-cli/templates/rules-instructions.md +126 -0
  87. package/package.json +1 -1
  88. package/packages/ai/index.js +2 -1
  89. package/packages/ai/index.js.map +1 -1
  90. package/packages/ai/src/lib/analyzeScope.js +29 -12
  91. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  92. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  93. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  94. package/packages/ai/src/lib/astScopes/processExpression.js +239 -43
  95. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  96. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +503 -165
  97. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  98. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  99. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  100. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  101. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  102. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +22 -1
  103. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  104. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +34 -9
  105. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  106. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +159 -0
  107. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  108. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  109. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  110. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +237 -73
  111. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  112. package/packages/ai/src/lib/generateEntityScenarioData.js +195 -1
  113. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  114. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  115. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  116. package/packages/ai/src/lib/generateExecutionFlows.js +10 -2
  117. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  118. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +209 -3
  119. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  120. package/packages/ai/src/lib/mergeStatements.js +70 -51
  121. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  122. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  123. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  124. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  125. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  126. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  127. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  128. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  129. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  130. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  131. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  132. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  133. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  134. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  135. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  136. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  137. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  138. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  139. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  140. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  141. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  142. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  143. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +13 -5
  144. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  145. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +14 -4
  146. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  147. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  148. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  149. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  150. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  151. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  152. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  153. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  154. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  155. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +52 -10
  156. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  157. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +25 -8
  158. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  159. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +34 -4
  160. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  161. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  162. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  163. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +168 -9
  164. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  165. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  166. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  167. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  168. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  169. package/codeyam-cli/src/webserver/build/client/assets/globals-D3yhhV8x.css +0 -1
  170. package/codeyam-cli/src/webserver/build/client/assets/memory-yxFcrxBX.js +0 -92
  171. package/codeyam-cli/src/webserver/build/server/assets/server-build-4Cr0uToj.js +0 -257
@@ -1,10 +1,10 @@
1
1
  {
2
- "buildTimestamp": "2026-01-30T00:55:52.181Z",
3
- "buildTime": 1769734552181,
4
- "gitCommit": "03236865a7602ab6d30df31e0ad3bee876906fb9",
2
+ "buildTimestamp": "2026-02-04T17:33:57.768Z",
3
+ "buildTime": 1770226437768,
4
+ "gitCommit": "483fdc20d9d24e266e9bca6a25b473ccb58957fd",
5
5
  "nodeVersion": "v20.20.0",
6
- "contentHash": "05d53efd18fbc545b72ac5e31193346a32efa60861ecfb3bf24454bef6533f43",
7
- "buildNumber": 549,
8
- "semanticVersion": "0.1.549",
9
- "version": "0.1.549 (2026-01-30T00:55+05d53ef)"
6
+ "contentHash": "21dbd7d480c0c50901df9ce172ec9316ac759c210f7ad6216cdfbd7d9f65446e",
7
+ "buildNumber": 563,
8
+ "semanticVersion": "0.1.563",
9
+ "version": "0.1.563 (2026-02-04T17:33+21dbd7d)"
10
10
  }
@@ -1,7 +1,7 @@
1
1
 
2
- [1/30/2026, 12:55:52 AM] > codeyam-combo@1.0.0 mergeDependencies
3
- [1/30/2026, 12:55:52 AM] > node ./scripts/mergePackageJsonFiles.cjs
2
+ [2/4/2026, 5:33:57 PM] > codeyam-combo@1.0.0 mergeDependencies
3
+ [2/4/2026, 5:33:57 PM] > node ./scripts/mergePackageJsonFiles.cjs
4
4
 
5
5
 
6
- [1/30/2026, 12:55:52 AM] Merged dependencies into root package.json
6
+ [2/4/2026, 5:33:57 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.966.0",
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",
@@ -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": "^15.0.0",
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",
@@ -57,8 +57,13 @@ export {
57
57
  removeDuplicateFunctionCalls,
58
58
  } from './src/lib/dataStructure/helpers/cleanNonObjectFunctions';
59
59
  export { default as convertDotNotation } from './src/lib/dataStructure/helpers/convertDotNotation';
60
+ export { default as convertTypeAnnotationsToValues } from './src/lib/dataStructure/helpers/convertTypeAnnotationsToValues';
60
61
  export { default as cleanOutBoundary } from './src/lib/cleanOutBoundary';
61
- export { fillInDirectSchemaGapsAndUnknowns } from './src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns';
62
+ export {
63
+ fillInDirectSchemaGapsAndUnknowns,
64
+ buildSchemaIndexes,
65
+ type SchemaIndexes,
66
+ } from './src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns';
62
67
  export { default as deduplicateFunctionSchemas } from './src/lib/dataStructure/helpers/deduplicateFunctionSchemas';
63
68
  export { default as getConditionalUsagesFromCode } from './src/lib/getConditionalUsagesFromCode';
64
69
  export type {
@@ -372,7 +372,7 @@ export async function analyzeScopeLocal({
372
372
  }
373
373
 
374
374
  for (const mapping of [structure, equivalentVariables]) {
375
- for (let [key, value] of Object.entries(mapping)) {
375
+ for (let [key, rawValue] of Object.entries(mapping)) {
376
376
  for (const [childScopeId, childScope] of sortedEntries) {
377
377
  const scopeText = fileAnalyzer.sourceFile.text.slice(
378
378
  childScope.start,
@@ -392,27 +392,49 @@ export async function analyzeScopeLocal({
392
392
  return text;
393
393
  };
394
394
 
395
- if (value.includes(scopeText)) {
396
- // DEBUG: Log when replacement happens
397
- if (key.includes('Fetcher') || key.includes('fetcher')) {
398
- console.log(
399
- 'CodeYam DEBUG value replacement:',
400
- JSON.stringify({
401
- key,
402
- oldValue: value,
403
- childScopeId,
404
- scopeTextPreview: scopeText.slice(0, 50),
405
- }),
406
- );
395
+ // Handle both string and string[] values (for OR expressions)
396
+ const processValue = (value: string): string => {
397
+ if (value.includes(scopeText)) {
398
+ // DEBUG: Log when replacement happens
399
+ if (key.includes('Fetcher') || key.includes('fetcher')) {
400
+ console.log(
401
+ 'CodeYam DEBUG value replacement:',
402
+ JSON.stringify({
403
+ key,
404
+ oldValue: value,
405
+ childScopeId,
406
+ scopeTextPreview: scopeText.slice(0, 50),
407
+ }),
408
+ );
409
+ }
410
+ return replaceChildScopeId(value);
411
+ }
412
+ return value;
413
+ };
414
+
415
+ if (Array.isArray(rawValue)) {
416
+ const newValues = rawValue.map(processValue);
417
+ (mapping as Record<string, string | string[]>)[key] =
418
+ newValues;
419
+ rawValue = newValues;
420
+ } else if (typeof rawValue === 'string') {
421
+ const newValue = processValue(rawValue);
422
+ if (newValue !== rawValue) {
423
+ (mapping as Record<string, string | string[]>)[key] =
424
+ newValue;
425
+ rawValue = newValue;
407
426
  }
408
- value = replaceChildScopeId(value);
409
- mapping[key] = value;
410
427
  }
428
+
411
429
  if (key.includes(scopeText)) {
412
430
  const oldKey = key;
413
431
  key = replaceChildScopeId(key);
414
- mapping[key] = mapping[oldKey];
415
- delete mapping[oldKey];
432
+ (mapping as Record<string, string | string[]>)[key] = (
433
+ mapping as Record<string, string | string[]>
434
+ )[oldKey];
435
+ delete (mapping as Record<string, string | string[]>)[
436
+ oldKey
437
+ ];
416
438
  }
417
439
  }
418
440
  }
@@ -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 equivalentPath = this.equivalentVariables[pathStr];
791
- if (equivalentPath) {
792
- this.structure[equivalentPath] = newType;
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, equivalence] of Object.entries(
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 transformedPath = equivalence + suffix;
803
- this.structure[transformedPath] = newType;
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
  }