@codeyam/codeyam-cli 0.1.0-staging.c90f8c9 → 0.1.0-staging.c9dc00c

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 (513) 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 +7 -7
  4. package/analyzer-template/packages/ai/index.ts +10 -2
  5. package/analyzer-template/packages/ai/package.json +2 -2
  6. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +86 -18
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
  8. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +41 -17
  9. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
  10. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +308 -50
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +15 -6
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +837 -243
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +54 -3
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +60 -15
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +80 -5
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +393 -97
  23. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
  24. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +283 -1
  25. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
  26. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +11 -3
  27. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  28. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +297 -7
  29. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
  30. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
  31. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  32. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  33. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
  34. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
  35. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
  36. package/analyzer-template/packages/analyze/index.ts +2 -0
  37. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  38. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  39. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  40. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  41. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  42. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  43. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  44. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  45. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +71 -9
  46. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
  47. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
  48. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  49. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
  50. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  51. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  52. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
  53. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
  54. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +37 -0
  55. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
  56. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
  57. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +459 -39
  58. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  59. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  60. package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
  61. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  62. package/analyzer-template/packages/aws/package.json +1 -1
  63. package/analyzer-template/packages/database/package.json +1 -1
  64. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  65. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  66. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  67. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  68. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  69. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  70. package/analyzer-template/packages/database/src/lib/kysely/db.ts +14 -1
  71. package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
  72. package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
  73. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
  74. package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
  75. package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
  76. package/analyzer-template/packages/database/src/lib/loadCommits.ts +12 -0
  77. package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
  78. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  79. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  80. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  81. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
  82. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  83. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  85. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  87. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  89. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  90. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  91. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  92. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  93. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  94. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  95. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  96. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  97. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +11 -1
  98. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  99. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
  100. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
  102. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  103. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
  104. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
  105. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  106. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  107. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  108. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
  109. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  110. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
  111. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
  112. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
  113. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
  114. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
  115. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  116. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +9 -0
  117. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  118. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
  119. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
  120. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
  121. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  122. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  123. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  124. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  125. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  126. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  127. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
  128. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  129. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
  130. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  131. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
  132. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
  133. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  134. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  135. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  136. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  137. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  138. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  139. package/analyzer-template/packages/github/package.json +1 -1
  140. package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
  141. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +7 -0
  142. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
  143. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  144. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
  145. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
  146. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  147. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  148. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  149. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  150. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  151. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  152. package/analyzer-template/playwright/capture.ts +20 -8
  153. package/analyzer-template/playwright/captureStatic.ts +1 -1
  154. package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
  155. package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
  156. package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
  157. package/analyzer-template/project/constructMockCode.ts +90 -10
  158. package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
  159. package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
  160. package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
  161. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +11 -6
  162. package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
  163. package/analyzer-template/project/orchestrateCapture.ts +45 -6
  164. package/analyzer-template/project/start.ts +35 -11
  165. package/analyzer-template/project/writeMockDataTsx.ts +181 -8
  166. package/analyzer-template/project/writeScenarioComponents.ts +60 -12
  167. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  168. package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
  169. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  170. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  171. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
  172. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  173. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
  174. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  175. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
  176. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
  177. package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
  178. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  179. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
  180. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
  181. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
  182. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  183. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
  184. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
  185. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +4 -4
  186. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  187. package/background/src/lib/virtualized/project/orchestrateCapture.js +38 -6
  188. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  189. package/background/src/lib/virtualized/project/start.js +32 -11
  190. package/background/src/lib/virtualized/project/start.js.map +1 -1
  191. package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
  192. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  193. package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
  194. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  195. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  196. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  197. package/codeyam-cli/scripts/apply-setup.js +180 -0
  198. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  199. package/codeyam-cli/src/cli.js +4 -0
  200. package/codeyam-cli/src/cli.js.map +1 -1
  201. package/codeyam-cli/src/commands/analyze.js +2 -0
  202. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  203. package/codeyam-cli/src/commands/baseline.js +2 -0
  204. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  205. package/codeyam-cli/src/commands/debug.js +9 -5
  206. package/codeyam-cli/src/commands/debug.js.map +1 -1
  207. package/codeyam-cli/src/commands/default.js +14 -4
  208. package/codeyam-cli/src/commands/default.js.map +1 -1
  209. package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
  210. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
  211. package/codeyam-cli/src/commands/init.js +42 -184
  212. package/codeyam-cli/src/commands/init.js.map +1 -1
  213. package/codeyam-cli/src/commands/memory.js +264 -0
  214. package/codeyam-cli/src/commands/memory.js.map +1 -0
  215. package/codeyam-cli/src/commands/recapture.js +2 -0
  216. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  217. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  218. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  219. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  220. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  221. package/codeyam-cli/src/commands/test-startup.js +2 -0
  222. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  223. package/codeyam-cli/src/commands/verify.js +2 -0
  224. package/codeyam-cli/src/commands/verify.js.map +1 -1
  225. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
  226. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  227. package/codeyam-cli/src/utils/analysisRunner.js +1 -1
  228. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  229. package/codeyam-cli/src/utils/analyzer.js +7 -0
  230. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  231. package/codeyam-cli/src/utils/backgroundServer.js +4 -0
  232. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  233. package/codeyam-cli/src/utils/install-skills.js +71 -46
  234. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  235. package/codeyam-cli/src/utils/labsAutoCheck.js +48 -0
  236. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  237. package/codeyam-cli/src/utils/progress.js +7 -0
  238. package/codeyam-cli/src/utils/progress.js.map +1 -1
  239. package/codeyam-cli/src/utils/queue/job.js +4 -0
  240. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  241. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  242. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  243. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  244. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  245. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
  246. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  247. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  248. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  249. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  250. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  251. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  252. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  253. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  254. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  255. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
  256. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  257. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
  258. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  259. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
  260. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  261. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  262. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  263. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  264. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  265. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  266. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  267. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  268. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  269. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  270. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  271. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  272. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  273. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  274. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  275. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  276. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  277. package/codeyam-cli/src/utils/rules/index.js +6 -0
  278. package/codeyam-cli/src/utils/rules/index.js.map +1 -0
  279. package/codeyam-cli/src/utils/rules/parser.js +83 -0
  280. package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
  281. package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
  282. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
  283. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  284. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  285. package/codeyam-cli/src/utils/rules/staleness.js +137 -0
  286. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
  287. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +20 -43
  288. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  289. package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
  290. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  291. package/codeyam-cli/src/webserver/backgroundServer.js +31 -0
  292. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  293. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
  294. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-B86KKU7e.js +11 -0
  295. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
  296. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
  297. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
  298. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
  299. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
  300. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
  301. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
  302. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-D4TZhLuw.js → ReportIssueModal-C6PKeMYR.js} +3 -13
  303. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
  304. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DEx02QDa.js → ScenarioViewer-BNLaXBHR.js} +3 -3
  305. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
  306. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
  307. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DoLIqZX2.js → activity.(_tab)-BtBFH820.js} +6 -16
  308. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-CN61MOMa.js +11 -0
  309. package/codeyam-cli/src/webserver/build/client/assets/api.labs-survey-l0sNRNKZ.js +1 -0
  310. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  311. package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
  312. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  313. package/codeyam-cli/src/webserver/build/client/assets/book-open-PttOB2SF.js +6 -0
  314. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
  315. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
  316. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
  317. package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
  318. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
  319. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C5lqplTC.js +1 -0
  320. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-C2N4Op8e.js → entity._sha._-n38keI1k.js} +10 -10
  321. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
  322. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
  323. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
  324. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
  325. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
  326. package/codeyam-cli/src/webserver/build/client/assets/files-0N0YJQv7.js +1 -0
  327. package/codeyam-cli/src/webserver/build/client/assets/{git-B4RJRvYB.js → git-DXnyr8uP.js} +8 -8
  328. package/codeyam-cli/src/webserver/build/client/assets/globals-EVn6Z9pz.css +1 -0
  329. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
  330. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
  331. package/codeyam-cli/src/webserver/build/client/assets/labs-CmBYA0PH.js +1 -0
  332. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
  333. package/codeyam-cli/src/webserver/build/client/assets/manifest-aa4ff97b.js +1 -0
  334. package/codeyam-cli/src/webserver/build/client/assets/memory-BSlqS1QA.js +81 -0
  335. package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
  336. package/codeyam-cli/src/webserver/build/client/assets/root-DVAbJY8B.js +62 -0
  337. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
  338. package/codeyam-cli/src/webserver/build/client/assets/settings-BK-cnzp-.js +1 -0
  339. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
  340. package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
  341. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
  342. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
  343. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
  344. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
  345. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
  346. package/codeyam-cli/src/webserver/build/server/assets/index-Cz2RkDCa.js +1 -0
  347. package/codeyam-cli/src/webserver/build/server/assets/server-build-CUVsWicu.js +260 -0
  348. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  349. package/codeyam-cli/src/webserver/build-info.json +5 -5
  350. package/codeyam-cli/templates/{codeyam-power-rules-hook.sh → codeyam-memory-hook.sh} +12 -13
  351. package/codeyam-cli/templates/codeyam:diagnose.md +195 -496
  352. package/codeyam-cli/templates/codeyam:memory.md +403 -0
  353. package/codeyam-cli/templates/codeyam:new-rule.md +2 -2
  354. package/codeyam-cli/templates/codeyam:setup.md +12 -0
  355. package/codeyam-cli/templates/rule-notification-hook.py +56 -0
  356. package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
  357. package/codeyam-cli/templates/rules-instructions.md +136 -0
  358. package/package.json +8 -6
  359. package/packages/ai/index.js +3 -2
  360. package/packages/ai/index.js.map +1 -1
  361. package/packages/ai/src/lib/analyzeScope.js +68 -13
  362. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  363. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  364. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  365. package/packages/ai/src/lib/astScopes/methodSemantics.js +41 -17
  366. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  367. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  368. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  369. package/packages/ai/src/lib/astScopes/processExpression.js +239 -43
  370. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  371. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +654 -166
  372. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  373. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  374. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  375. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  376. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  377. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  378. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  379. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +52 -3
  380. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  381. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +55 -11
  382. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  383. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  384. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  385. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +73 -5
  386. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  387. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  388. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  389. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  390. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  391. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +333 -86
  392. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  393. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  394. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  395. package/packages/ai/src/lib/generateEntityScenarioData.js +205 -1
  396. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  397. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  398. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  399. package/packages/ai/src/lib/generateExecutionFlows.js +10 -2
  400. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  401. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +209 -3
  402. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  403. package/packages/ai/src/lib/isolateScopes.js +39 -3
  404. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  405. package/packages/ai/src/lib/mergeStatements.js +70 -51
  406. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  407. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  408. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  409. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  410. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  411. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  412. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
  413. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  414. package/packages/analyze/index.js +1 -0
  415. package/packages/analyze/index.js.map +1 -1
  416. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  417. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  418. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  419. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  420. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  421. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  422. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  423. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  424. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  425. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  426. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  427. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  428. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  429. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  430. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  431. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  432. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +54 -6
  433. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  434. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
  435. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  436. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
  437. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  438. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  439. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  440. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  441. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  442. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  443. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  444. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  445. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  446. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
  447. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  448. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
  449. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  450. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +33 -8
  451. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  452. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
  453. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  454. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  455. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  456. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +399 -31
  457. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  458. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  459. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  460. package/packages/analyze/src/lib/index.js +1 -0
  461. package/packages/analyze/src/lib/index.js.map +1 -1
  462. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  463. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  464. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  465. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  466. package/packages/database/src/lib/analysisToDb.js +1 -1
  467. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  468. package/packages/database/src/lib/branchToDb.js +1 -1
  469. package/packages/database/src/lib/branchToDb.js.map +1 -1
  470. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  471. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  472. package/packages/database/src/lib/commitToDb.js +1 -1
  473. package/packages/database/src/lib/commitToDb.js.map +1 -1
  474. package/packages/database/src/lib/fileToDb.js +1 -1
  475. package/packages/database/src/lib/fileToDb.js.map +1 -1
  476. package/packages/database/src/lib/kysely/db.js +11 -1
  477. package/packages/database/src/lib/kysely/db.js.map +1 -1
  478. package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
  479. package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  480. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  481. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  482. package/packages/database/src/lib/loadAnalysis.js +8 -0
  483. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  484. package/packages/database/src/lib/loadBranch.js +11 -1
  485. package/packages/database/src/lib/loadBranch.js.map +1 -1
  486. package/packages/database/src/lib/loadCommit.js +7 -0
  487. package/packages/database/src/lib/loadCommit.js.map +1 -1
  488. package/packages/database/src/lib/loadCommits.js +9 -0
  489. package/packages/database/src/lib/loadCommits.js.map +1 -1
  490. package/packages/database/src/lib/loadEntityBranches.js +9 -0
  491. package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
  492. package/packages/database/src/lib/projectToDb.js +1 -1
  493. package/packages/database/src/lib/projectToDb.js.map +1 -1
  494. package/packages/database/src/lib/saveFiles.js +1 -1
  495. package/packages/database/src/lib/saveFiles.js.map +1 -1
  496. package/packages/database/src/lib/scenarioToDb.js +1 -1
  497. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  498. package/packages/database/src/lib/updateCommitMetadata.js +5 -4
  499. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  500. package/scripts/finalize-analyzer.cjs +8 -76
  501. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-BXhEawa3.js +0 -1
  502. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BRb-0kQl.js +0 -1
  503. package/codeyam-cli/src/webserver/build/client/assets/files-Cs4MdYtv.js +0 -1
  504. package/codeyam-cli/src/webserver/build/client/assets/git-commit-horizontal-CysbcZxi.js +0 -6
  505. package/codeyam-cli/src/webserver/build/client/assets/globals-DMUaGAqV.css +0 -1
  506. package/codeyam-cli/src/webserver/build/client/assets/manifest-f874c610.js +0 -1
  507. package/codeyam-cli/src/webserver/build/client/assets/root-Bz5TunQg.js +0 -57
  508. package/codeyam-cli/src/webserver/build/client/assets/rules-hEkvVw2-.js +0 -97
  509. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  510. package/codeyam-cli/src/webserver/build/server/assets/index-uNNbimct.js +0 -1
  511. package/codeyam-cli/src/webserver/build/server/assets/server-build-B08qC4Y7.js +0 -257
  512. package/codeyam-cli/templates/codeyam:power-rules.md +0 -449
  513. /package/codeyam-cli/src/webserver/build/client/assets/{api.rules-l0sNRNKZ.js → api.agent-transcripts-l0sNRNKZ.js} +0 -0
@@ -121,7 +121,11 @@ export default function fillInSchemaGapsAndUnknowns(scopeNode, fillInUnknowns =
121
121
  lastSubPathPart.match(/signature\[\d+\]/);
122
122
  if (!isFunction &&
123
123
  !['object', 'array', 'function', 'async-function'].includes(schema[previousSubPath])) {
124
- const newValue = checkIfKnownType(previousSubPath, functionKeysMapping) ?? 'object';
124
+ // When fillInUnknowns=false, add missing gaps as 'unknown' to preserve raw schema.
125
+ // When fillInUnknowns=true, infer the type using checkIfKnownType.
126
+ const newValue = fillInUnknowns
127
+ ? (checkIfKnownType(previousSubPath, functionKeysMapping) ?? 'object')
128
+ : 'unknown';
125
129
  if (!schema[previousSubPath] ||
126
130
  (fillInUnknowns && schema[previousSubPath] !== newValue)) {
127
131
  schema[previousSubPath] = newValue;
@@ -130,10 +134,14 @@ export default function fillInSchemaGapsAndUnknowns(scopeNode, fillInUnknowns =
130
134
  }
131
135
  // Handle the wrong function chaining function().function()
132
136
  if (isFunction && !existingSchema(previousSubPath)) {
137
+ // When fillInUnknowns=false, use 'unknown' for non-function paths.
138
+ // When fillInUnknowns=true, infer the type.
133
139
  schema[previousSubPath] = previousSubPath.endsWith(')')
134
140
  ? 'function'
135
- : (checkIfKnownType(previousSubPath, functionKeysMapping) ??
136
- 'object');
141
+ : fillInUnknowns
142
+ ? (checkIfKnownType(previousSubPath, functionKeysMapping) ??
143
+ 'object')
144
+ : 'unknown';
137
145
  changeMade = true;
138
146
  }
139
147
  // Handle function chains: if we have x().y(), set x().functionCallReturnValue to 'function'
@@ -160,7 +168,45 @@ export default function fillInSchemaGapsAndUnknowns(scopeNode, fillInUnknowns =
160
168
  fillInSchemaGapsAndUnknowns(scopeNode, fillInUnknowns, ++attempts);
161
169
  }
162
170
  }
163
- export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSchema, attempts = 0, }) {
171
+ /**
172
+ * Build indexes for a schema that can be reused across multiple calls.
173
+ * This avoids rebuilding indexes (~1-2 seconds for 18k keys) on every call.
174
+ *
175
+ * @param schema - The schema to build indexes from (typically the full dependency schema)
176
+ * @returns Indexes that can be passed to fillInDirectSchemaGapsAndUnknowns
177
+ */
178
+ export function buildSchemaIndexes(schema) {
179
+ // Build functionKeysMapping + prefixMaxDepth in a single pass
180
+ // Avoid repeated split/join work by caching parts and building prefixes incrementally.
181
+ const functionKeysMapping = {};
182
+ const prefixMaxDepth = new Map();
183
+ const partsCache = new Map();
184
+ for (const key in schema) {
185
+ const parts = getCachedParts(partsCache, key);
186
+ const lastPart = parts[parts.length - 1];
187
+ const prefixes = buildPrefixParts(parts);
188
+ if (key.endsWith(')') ||
189
+ schema[key] === 'function' ||
190
+ lastPart === 'length') {
191
+ const allButLastPart = parts.length > 1 ? prefixes[parts.length - 2] : '';
192
+ functionKeysMapping[allButLastPart] || (functionKeysMapping[allButLastPart] = []);
193
+ functionKeysMapping[allButLastPart].push(lastPart);
194
+ }
195
+ for (let i = 0; i < prefixes.length; i++) {
196
+ const prefix = prefixes[i];
197
+ const existingMax = prefixMaxDepth.get(prefix) ?? 0;
198
+ if (parts.length > existingMax) {
199
+ prefixMaxDepth.set(prefix, parts.length);
200
+ }
201
+ }
202
+ }
203
+ return { functionKeysMapping, prefixMaxDepth };
204
+ }
205
+ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSchema, attempts = 0,
206
+ // Pre-built indexes from buildSchemaIndexes() - use for cross-call caching
207
+ prebuiltIndexes,
208
+ // Internal: pre-computed indexes to avoid rebuilding on recursion
209
+ _functionKeysMapping, _prefixMaxDepth, _partsCache, _prefixPartsCache, _knownTypeCache, _guessTypeCache, _nameHintCache, }) {
164
210
  try {
165
211
  const existingSchema = (path) => {
166
212
  const options = [path, `${scopeName}.${path}`, `${scopeName}().${path}`];
@@ -169,112 +215,250 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
169
215
  return schema[option];
170
216
  }
171
217
  };
172
- const functionKeysMapping = [...Object.keys(schema)]
173
- .filter((key) => {
174
- if (key.endsWith(')') || schema[key] === 'function')
175
- return true;
176
- const parts = splitOutsideParenthesesAndArrays(key);
177
- if (parts[parts.length - 1] === 'length')
178
- return true;
179
- })
180
- .reduce((acc, key) => {
181
- const parts = splitOutsideParenthesesAndArrays(key);
182
- const allButLastPart = joinParenthesesAndArrays(parts.slice(0, -1));
183
- const lastPart = parts[parts.length - 1];
184
- acc[allButLastPart] || (acc[allButLastPart] = []);
185
- acc[allButLastPart].push(lastPart);
186
- return acc;
187
- }, {});
188
- let changeMade = false;
189
- const guessTypeForPath = (path, defaultType = 'string') => {
190
- let knownType = checkIfKnownType(path, functionKeysMapping);
191
- if (!knownType) {
192
- // Use mergedSchema for type inference if available (has more complete nested paths)
193
- // Fall back to schema if mergedSchema is not provided
194
- knownType = checkIfObjectOrFunction(path, mergedSchema ?? schema);
218
+ const partsCache = _partsCache ?? new Map();
219
+ const prefixPartsCache = _prefixPartsCache ?? new Map();
220
+ const knownTypeCache = _knownTypeCache ?? new Map();
221
+ const guessTypeCache = _guessTypeCache ?? new Map();
222
+ const nameHintCache = _nameHintCache ?? new Map();
223
+ const getParts = (path) => getCachedParts(partsCache, path);
224
+ const getPrefixParts = (path) => {
225
+ const cached = prefixPartsCache.get(path);
226
+ if (cached)
227
+ return cached;
228
+ const prefixes = buildPrefixParts(getParts(path));
229
+ prefixPartsCache.set(path, prefixes);
230
+ return prefixes;
231
+ };
232
+ // Index resolution priority:
233
+ // 1. _functionKeysMapping/_prefixMaxDepth (from recursive calls within this invocation)
234
+ // 2. prebuiltIndexes (from cross-call caching - built once, reused across multiple calls)
235
+ // 3. Build new indexes (fallback - expensive for large schemas)
236
+ const functionKeysMapping = _functionKeysMapping ??
237
+ prebuiltIndexes?.functionKeysMapping ??
238
+ (() => {
239
+ const mapping = {};
240
+ for (const key in schema) {
241
+ const parts = getParts(key);
242
+ const lastPart = parts[parts.length - 1];
243
+ if (key.endsWith(')') ||
244
+ schema[key] === 'function' ||
245
+ lastPart === 'length') {
246
+ const prefixes = getPrefixParts(key);
247
+ const allButLastPart = parts.length > 1 ? prefixes[parts.length - 2] : '';
248
+ mapping[allButLastPart] || (mapping[allButLastPart] = []);
249
+ mapping[allButLastPart].push(lastPart);
250
+ }
251
+ }
252
+ return mapping;
253
+ })();
254
+ // Build prefix index for O(1) lookups in checkIfObjectOrFunction
255
+ // Maps each prefix to the max depth of keys that have this prefix
256
+ // This replaces O(n) scans with O(1) lookups, fixing the O(n²) bottleneck
257
+ let prefixMaxDepth = _prefixMaxDepth ?? prebuiltIndexes?.prefixMaxDepth ?? null;
258
+ if (!prefixMaxDepth) {
259
+ prefixMaxDepth = new Map();
260
+ const targetSchema = mergedSchema ?? schema;
261
+ for (const key in targetSchema) {
262
+ const keyParts = getParts(key);
263
+ const prefixes = buildPrefixParts(keyParts);
264
+ // Record each prefix of this key with its max depth
265
+ for (let i = 0; i < prefixes.length; i++) {
266
+ const prefix = prefixes[i];
267
+ const existingMax = prefixMaxDepth.get(prefix) ?? 0;
268
+ if (keyParts.length > existingMax) {
269
+ prefixMaxDepth.set(prefix, keyParts.length);
270
+ }
271
+ }
195
272
  }
196
- if (knownType && schema[path] !== knownType) {
197
- return knownType;
273
+ }
274
+ // O(1) replacement for checkIfObjectOrFunction
275
+ const checkIfObjectOrFunctionFast = (path) => {
276
+ const maxDepth = prefixMaxDepth.get(path);
277
+ if (maxDepth === undefined)
278
+ return undefined; // No key starts with this path
279
+ const pathParts = getParts(path);
280
+ // Check if path's last part ends with ')' → function
281
+ const lastPart = pathParts[pathParts.length - 1];
282
+ if (lastPart?.endsWith(')')) {
283
+ return 'function';
198
284
  }
199
- const keyParts = splitOutsideParenthesesAndArrays(path);
200
- const lastPart = keyParts[keyParts.length - 1];
285
+ // Check if there are deeper keys
286
+ if (maxDepth > pathParts.length) {
287
+ return 'object';
288
+ }
289
+ return undefined;
290
+ };
291
+ let changeMade = false;
292
+ const getKnownType = (path) => {
293
+ if (knownTypeCache.has(path))
294
+ return knownTypeCache.get(path);
295
+ const known = checkIfKnownType(path, functionKeysMapping);
296
+ knownTypeCache.set(path, known);
297
+ return known;
298
+ };
299
+ const guessTypeFromName = (lastPart, defaultType) => {
300
+ if (nameHintCache.has(lastPart)) {
301
+ return nameHintCache.get(lastPart) ?? defaultType;
302
+ }
303
+ let hint;
201
304
  if (isLikelyBoolean(lastPart)) {
202
- return 'boolean';
305
+ hint = 'boolean';
203
306
  }
204
307
  else if (isLikelyDate(lastPart)) {
205
- return 'date';
308
+ hint = 'date';
206
309
  }
207
310
  else if (isLikelyAction(lastPart)) {
208
- return 'function';
311
+ hint = 'function';
209
312
  }
210
313
  else if (pluralize.isPlural(lastPart)) {
211
- return 'number';
314
+ // Default to number instead of array - safer for JSX rendering
315
+ // Arrays cause "Objects are not valid as a React child" errors when rendered directly
316
+ hint = 'number';
317
+ }
318
+ nameHintCache.set(lastPart, hint);
319
+ return hint ?? defaultType;
320
+ };
321
+ const guessTypeForPath = (path, defaultType = 'string') => {
322
+ const cacheKey = `${path}|${defaultType}`;
323
+ if (guessTypeCache.has(cacheKey)) {
324
+ return guessTypeCache.get(cacheKey);
325
+ }
326
+ let knownType = getKnownType(path);
327
+ if (!knownType) {
328
+ // Use optimized O(1) prefix lookup instead of O(n) scan
329
+ knownType = checkIfObjectOrFunctionFast(path);
212
330
  }
213
- else {
214
- return defaultType;
331
+ if (knownType) {
332
+ guessTypeCache.set(cacheKey, knownType);
333
+ return knownType;
215
334
  }
335
+ const keyParts = getParts(path);
336
+ const lastPart = keyParts[keyParts.length - 1];
337
+ const guessed = guessTypeFromName(lastPart, defaultType);
338
+ guessTypeCache.set(cacheKey, guessed);
339
+ return guessed;
216
340
  };
217
341
  for (const key in schema) {
218
342
  if (!schema[key])
219
343
  schema[key] = 'unknown';
220
344
  if (schema[key].includes(' | unknown')) {
221
- schema[key] = schema[key].replace(' | unknown', '');
222
- changeMade = true;
345
+ const cleaned = schema[key].replace(' | unknown', '');
346
+ if (schema[key] !== cleaned) {
347
+ schema[key] = cleaned;
348
+ changeMade = true;
349
+ }
223
350
  }
224
351
  else if (schema[key].startsWith('unknown | ')) {
225
352
  // Handle "unknown | undefined" -> "string | undefined"
226
353
  const remainingType = schema[key].substring('unknown | '.length);
227
354
  const newType = guessTypeForPath(key, 'string');
228
355
  if (newType) {
229
- schema[key] = `${newType} | ${remainingType}`;
230
- changeMade = true;
356
+ const replacement = `${newType} | ${remainingType}`;
357
+ if (schema[key] !== replacement) {
358
+ schema[key] = replacement;
359
+ changeMade = true;
360
+ }
231
361
  }
232
362
  }
233
363
  else if (schema[key] === 'unknown') {
234
364
  const newType = guessTypeForPath(key, 'string');
235
- if (newType) {
365
+ // Don't convert 'unknown' to 'object' — 'object' is just inferred from
366
+ // having child properties, which isn't more useful than 'unknown' and
367
+ // prevents enrichment from filling in the actual type later.
368
+ if (newType && newType !== 'object' && schema[key] !== newType) {
236
369
  schema[key] = newType;
237
370
  changeMade = true;
238
371
  }
239
372
  }
240
- const keyParts = splitOutsideParenthesesAndArrays(key);
373
+ const keyParts = getParts(key);
374
+ const prefixParts = getPrefixParts(key);
241
375
  for (let i = 0; i < keyParts.length; i++) {
242
- const subPathParts = keyParts.slice(0, i + 1);
243
- const lastSubPathPart = subPathParts[subPathParts.length - 1];
244
- const previousSubPathParts = subPathParts.slice(0, i);
245
- if (previousSubPathParts.length === 0)
376
+ if (i === 0)
246
377
  continue;
247
- const previousSubPath = joinParenthesesAndArrays(previousSubPathParts);
248
- if (cleanOutBoundary(lastSubPathPart).match(/\[\d*\]/) &&
249
- !lastSubPathPart.match(/signature\[\d+\]/)) {
250
- // Fix 39: Don't overwrite explicit 'object' types with 'array'
251
- // This handles spurious [] paths from components like JsonNode that handle
252
- // both arrays and objects. When metadata is explicitly typed as 'object',
253
- // paths like metadata[] (from dynamic iteration) should not change it.
254
- if (schema[previousSubPath] !== 'array' &&
255
- schema[previousSubPath] !== 'object') {
256
- schema[previousSubPath] = 'array';
257
- changeMade = true;
378
+ const lastSubPathPart = keyParts[i];
379
+ const previousSubPath = prefixParts[i - 1];
380
+ const isSignatureIndex = lastSubPathPart.includes('signature[') &&
381
+ SIGNATURE_INDEX_REGEX.test(lastSubPathPart);
382
+ if (lastSubPathPart.includes('[')) {
383
+ const cleaned = cleanOutBoundary(lastSubPathPart);
384
+ if (cleaned.match(/\[\d*\]/) && !isSignatureIndex) {
385
+ // Fix 39: Don't overwrite explicit 'object' types with 'array'
386
+ // This handles spurious [] paths from components like JsonNode that handle
387
+ // both arrays and objects. When metadata is explicitly typed as 'object',
388
+ // paths like metadata[] (from dynamic iteration) should not change it.
389
+ const existingType = schema[previousSubPath];
390
+ const baseType = existingType?.split(' | ')[0];
391
+ // Also check if this path has meaningful object property children (non-[] children).
392
+ // If it does, it's an object with mixed access patterns (e.g., agent.entries
393
+ // AND agent[].type), not a pure array. Don't infer 'array' in that case.
394
+ // Exclude .length since it exists on arrays too and is NOT evidence of object-ness.
395
+ let hasObjectPropertyChildren = false;
396
+ if (baseType !== 'array' && baseType !== 'object') {
397
+ const dotPrefix = previousSubPath + '.';
398
+ const lengthPath = previousSubPath + '.length';
399
+ for (const schemaKey in schema) {
400
+ if (schemaKey.startsWith(dotPrefix) &&
401
+ schemaKey !== lengthPath) {
402
+ hasObjectPropertyChildren = true;
403
+ break;
404
+ }
405
+ }
406
+ }
407
+ if (baseType !== 'array' &&
408
+ baseType !== 'object' &&
409
+ !hasObjectPropertyChildren) {
410
+ // Preserve nullability from existing type (e.g., 'unknown | undefined' -> 'array | undefined')
411
+ let newType = 'array';
412
+ if (existingType?.includes(' | undefined')) {
413
+ newType = 'array | undefined';
414
+ }
415
+ else if (existingType?.includes(' | null')) {
416
+ newType = 'array | null';
417
+ }
418
+ if (schema[previousSubPath] !== newType) {
419
+ schema[previousSubPath] = newType;
420
+ changeMade = true;
421
+ }
422
+ }
258
423
  }
259
424
  }
260
425
  const isFunction = lastSubPathPart.endsWith(')') ||
261
426
  lastSubPathPart === 'functionCallReturnValue' ||
262
- lastSubPathPart.match(/signature\[\d+\]/);
427
+ isSignatureIndex;
263
428
  if (!isFunction &&
264
429
  !['object', 'array', 'function', 'async-function'].includes(schema[previousSubPath])) {
265
- const newValue = checkIfKnownType(previousSubPath, functionKeysMapping) ?? 'object';
266
- if (!schema[previousSubPath] ||
267
- schema[previousSubPath] !== newValue) {
268
- schema[previousSubPath] = newValue;
269
- changeMade = true;
430
+ const existingType = schema[previousSubPath];
431
+ const baseExistingType = existingType?.split(' | ')[0];
432
+ // Skip if the base type is already a structured type
433
+ if (!['object', 'array', 'function', 'async-function'].includes(baseExistingType)) {
434
+ let newValue = getKnownType(previousSubPath) ?? 'object';
435
+ // Don't overwrite 'unknown' with 'object' — 'object' is just
436
+ // inferred from child properties and isn't more useful than 'unknown'
437
+ if (newValue === 'object' &&
438
+ existingType &&
439
+ existingType.split(' | ')[0] === 'unknown') {
440
+ // preserve existing 'unknown' (possibly with nullability)
441
+ }
442
+ else {
443
+ // Preserve nullability from existing type
444
+ if (existingType?.includes(' | undefined')) {
445
+ newValue = `${newValue} | undefined`;
446
+ }
447
+ else if (existingType?.includes(' | null')) {
448
+ newValue = `${newValue} | null`;
449
+ }
450
+ if (!existingType || existingType !== newValue) {
451
+ schema[previousSubPath] = newValue;
452
+ changeMade = true;
453
+ }
454
+ }
270
455
  }
271
456
  }
272
457
  // Handle the wrong function chaining function().function()
273
458
  if (isFunction && !existingSchema(previousSubPath)) {
274
459
  schema[previousSubPath] = previousSubPath.endsWith(')')
275
460
  ? 'function'
276
- : (checkIfKnownType(previousSubPath, functionKeysMapping) ??
277
- 'object');
461
+ : (getKnownType(previousSubPath) ?? 'object');
278
462
  changeMade = true;
279
463
  }
280
464
  // Handle function chains: if we have x().y(), set x().functionCallReturnValue to 'function'
@@ -282,8 +466,11 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
282
466
  if (lastSubPathPart.endsWith(')') && previousSubPath.endsWith(')')) {
283
467
  const functionReturnValuePath = `${previousSubPath}.functionCallReturnValue`;
284
468
  // Extract the method name from lastSubPathPart (e.g., "then()" -> "then")
285
- const methodName = lastSubPathPart.split('(')[0];
286
- const isPromiseMethod = ['then', 'catch', 'finally'].includes(methodName);
469
+ const parenIndex = lastSubPathPart.indexOf('(');
470
+ const methodName = parenIndex === -1
471
+ ? lastSubPathPart
472
+ : lastSubPathPart.slice(0, parenIndex);
473
+ const isPromiseMethod = PROMISE_METHODS.has(methodName);
287
474
  const isPreviousAsync = schema[previousSubPath] === 'async-function';
288
475
  // Don't set to 'function' if this is a promise method on an async function
289
476
  // (we want the awaited value, not the promise)
@@ -304,6 +491,15 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
304
491
  schema,
305
492
  mergedSchema,
306
493
  attempts: ++attempts,
494
+ prebuiltIndexes,
495
+ // Pass pre-computed indexes to avoid rebuilding on each recursive call
496
+ _functionKeysMapping: functionKeysMapping,
497
+ _prefixMaxDepth: prefixMaxDepth,
498
+ _partsCache: partsCache,
499
+ _prefixPartsCache: prefixPartsCache,
500
+ _knownTypeCache: knownTypeCache,
501
+ _guessTypeCache: guessTypeCache,
502
+ _nameHintCache: nameHintCache,
307
503
  });
308
504
  }
309
505
  // Remove .length paths when the parent is typed as 'array' or 'string' (or nullable variants).
@@ -312,9 +508,10 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
312
508
  // However, if the parent could be an 'object' or other type, keep .length as it may be
313
509
  // a custom property.
314
510
  for (const key of Object.keys(schema)) {
315
- const parts = splitOutsideParenthesesAndArrays(key);
511
+ const parts = getParts(key);
316
512
  if (parts[parts.length - 1] === 'length') {
317
- const parentPath = joinParenthesesAndArrays(parts.slice(0, -1));
513
+ const prefixes = getPrefixParts(key);
514
+ const parentPath = parts.length > 1 ? prefixes[parts.length - 2] : '';
318
515
  const parentType = schema[parentPath];
319
516
  if (parentType) {
320
517
  // Split union types and filter out nullable parts
@@ -339,6 +536,36 @@ export function fillInDirectSchemaGapsAndUnknowns({ scopeName, schema, mergedSch
339
536
  throw error;
340
537
  }
341
538
  }
539
+ const SIGNATURE_INDEX_REGEX = /signature\[\d+\]/;
540
+ const PROMISE_METHODS = new Set(['then', 'catch', 'finally']);
541
+ function getCachedParts(cache, path) {
542
+ const cached = cache.get(path);
543
+ if (cached)
544
+ return cached;
545
+ const parts = splitOutsideParenthesesAndArrays(path);
546
+ cache.set(path, parts);
547
+ return parts;
548
+ }
549
+ function buildPrefixParts(parts) {
550
+ if (parts.length === 0)
551
+ return [];
552
+ const prefixes = new Array(parts.length);
553
+ let prefix = '';
554
+ for (let i = 0; i < parts.length; i++) {
555
+ const part = parts[i];
556
+ if (i === 0) {
557
+ prefix = part;
558
+ }
559
+ else if (part.startsWith('[') || part.startsWith('(')) {
560
+ prefix += part;
561
+ }
562
+ else {
563
+ prefix += `.${part}`;
564
+ }
565
+ prefixes[i] = prefix;
566
+ }
567
+ return prefixes;
568
+ }
342
569
  function checkIfObjectOrFunction(path, schema) {
343
570
  const pathParts = splitOutsideParenthesesAndArrays(path);
344
571
  for (const structureKey in schema) {
@@ -389,28 +616,45 @@ const STRONG_ARRAY_METHODS = new Set([
389
616
  'toSpliced',
390
617
  'with',
391
618
  ]);
619
+ /**
620
+ * Check if a method call argument looks like a string literal.
621
+ * String literals start with ' or " (e.g., includes('foo'), indexOf("bar"))
622
+ */
623
+ function hasStringLiteralArgument(methodCall) {
624
+ const parenIndex = methodCall.indexOf('(');
625
+ if (parenIndex === -1)
626
+ return false;
627
+ const arg = methodCall.slice(parenIndex + 1).trim();
628
+ return arg.startsWith("'") || arg.startsWith('"') || arg.startsWith('`');
629
+ }
392
630
  function checkIfKnownType(key, functionAndAttributesKeysMapping) {
393
631
  let isArray;
394
632
  let isString;
395
633
  let hasStrongArrayEvidence = false;
396
634
  let hasOnlyAmbiguousArrayMethods = true;
397
635
  let hasLengthAccess = false;
398
- let hasArrayStringAmbiguousMethod = false;
399
- for (const functionOrAttributeName of functionAndAttributesKeysMapping[key] ??
400
- []) {
636
+ let hasIncludesOrIndexOfWithVariable = false;
637
+ const entries = functionAndAttributesKeysMapping[key];
638
+ if (!entries || entries.length === 0)
639
+ return;
640
+ for (const functionOrAttributeName of entries) {
401
641
  // Extract the method name without arguments for checking against ambiguous list
402
642
  const methodName = functionOrAttributeName.split('(')[0].trim();
403
- const couldBeArray = knownMethodCalls(functionOrAttributeName).includes('array') ||
404
- functionOrAttributeName === 'length';
405
- const couldBeString = knownMethodCalls(functionOrAttributeName).includes('string') ||
406
- functionOrAttributeName === 'length';
643
+ const knownType = knownMethodCalls(functionOrAttributeName);
644
+ const couldBeArray = knownType.includes('array') || functionOrAttributeName === 'length';
645
+ const couldBeString = knownType.includes('string') || functionOrAttributeName === 'length';
407
646
  // Track .length access
408
647
  if (functionOrAttributeName === 'length') {
409
648
  hasLengthAccess = true;
410
649
  }
411
650
  // Track methods that exist on both arrays and strings (like includes, indexOf)
412
- if (couldBeArray && couldBeString && functionOrAttributeName !== 'length') {
413
- hasArrayStringAmbiguousMethod = true;
651
+ // Check if .includes() or .indexOf() is called with a variable argument (not a string literal).
652
+ // Pattern: arr.includes(item) -> likely array (checking if item exists)
653
+ // Pattern: str.includes('substring') -> likely string (checking for substring)
654
+ if ((methodName === 'includes' || methodName === 'indexOf') &&
655
+ functionOrAttributeName.includes('(') &&
656
+ !hasStringLiteralArgument(functionOrAttributeName)) {
657
+ hasIncludesOrIndexOfWithVariable = true;
414
658
  }
415
659
  // Check if this is strong evidence of an array (unambiguous array methods)
416
660
  if (STRONG_ARRAY_METHODS.has(methodName)) {
@@ -437,17 +681,20 @@ function checkIfKnownType(key, functionAndAttributesKeysMapping) {
437
681
  if (isArray && hasStrongArrayEvidence) {
438
682
  return 'array';
439
683
  }
440
- // When we have BOTH .length AND an ambiguous method like .includes(),
441
- // prefer array. This pattern (checking .length AND calling .includes)
442
- // is very common with arrays (e.g., arr.length > 0 && arr.includes(x))
443
- // but rare with strings (you'd typically just call str.includes(x))
444
- if (isArray && hasLengthAccess && hasArrayStringAmbiguousMethod) {
684
+ // When .includes() or .indexOf() is called with a variable argument, prefer array.
685
+ // Pattern: arr.includes(item) -> likely array (checking if item exists in collection)
686
+ // String literals are already filtered by hasStringLiteralArgument, so if we get here
687
+ // with a variable argument, it's strong evidence of array membership testing.
688
+ if (isArray && hasIncludesOrIndexOfWithVariable) {
445
689
  return 'array';
446
690
  }
691
+ // When both array and string are possible, prefer string.
692
+ // Strings have .length, .slice(), .includes(), etc. just like arrays.
693
+ // We only infer 'array' if we have STRONG evidence (like .map, .filter, .reduce).
447
694
  if (isString)
448
695
  return 'string';
449
- // Only infer array if we have strong evidence OR not only ambiguous methods
450
- // This prevents router.push() from being incorrectly inferred as an array
696
+ // Only infer array if we have strong evidence (already handled above)
697
+ // or non-ambiguous array methods that don't exist on strings
451
698
  if (isArray && !hasOnlyAmbiguousArrayMethods) {
452
699
  return 'array';
453
700
  }