@codeyam/codeyam-cli 0.1.0-staging.1 → 0.1.0-staging.28f73cf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) 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 +8 -7
  4. package/analyzer-template/packages/ai/index.ts +2 -1
  5. package/analyzer-template/packages/ai/package.json +2 -2
  6. package/analyzer-template/packages/ai/scripts/ai-test-matrix.mjs +424 -0
  7. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +24 -0
  8. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +6 -16
  9. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +197 -0
  10. package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +28 -2
  11. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +127 -4
  12. package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +1 -3
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1821 -542
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.ts +138 -0
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +1 -1
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +139 -0
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/DebugTracer.ts +224 -0
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/PathManager.ts +203 -0
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/README.md +294 -0
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +161 -0
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.ts +235 -0
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +14 -6
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/selectBestValue.ts +70 -0
  24. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.ts +113 -0
  25. package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +36 -0
  26. package/analyzer-template/packages/ai/src/lib/generateChangesEntityDocumentation.ts +20 -2
  27. package/analyzer-template/packages/ai/src/lib/generateChangesEntityKeyAttributes.ts +51 -107
  28. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +56 -160
  29. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +79 -265
  30. package/analyzer-template/packages/ai/src/lib/generateEntityDocumentation.ts +16 -2
  31. package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +53 -176
  32. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +53 -154
  33. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +84 -254
  34. package/analyzer-template/packages/ai/src/lib/generateStatementAnalysis.ts +48 -71
  35. package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +27 -6
  36. package/analyzer-template/packages/ai/src/lib/getLLMCallStats.ts +0 -14
  37. package/analyzer-template/packages/ai/src/lib/modelInfo.ts +15 -0
  38. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +42 -4
  39. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.ts +8 -33
  40. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.ts +54 -62
  41. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +93 -109
  42. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.ts +8 -27
  43. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +33 -38
  44. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +30 -30
  45. package/analyzer-template/packages/ai/src/lib/types/index.ts +2 -0
  46. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +39 -0
  47. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +52 -6
  48. package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +2 -1
  49. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +238 -0
  50. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getDeclaredEntityNode.ts +25 -0
  51. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/index.ts +2 -0
  52. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +8 -10
  53. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +6 -1
  54. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +8 -6
  55. package/analyzer-template/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.ts +5 -13
  56. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +34 -15
  57. package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +17 -3
  58. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +35 -16
  59. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +7 -1
  60. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +9 -1
  61. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +6 -1
  62. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +9 -1
  63. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +15 -7
  64. package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.d.ts +23 -0
  65. package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.d.ts.map +1 -0
  66. package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.js +30 -0
  67. package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.js.map +1 -0
  68. package/analyzer-template/packages/aws/package.json +5 -4
  69. package/analyzer-template/packages/aws/s3/index.ts +4 -0
  70. package/analyzer-template/packages/aws/src/lib/s3/getPresignedUrl.ts +62 -0
  71. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +28 -21
  72. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.ts +18 -11
  73. package/analyzer-template/packages/generate/src/lib/scenarioComponent.ts +6 -3
  74. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
  75. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +28 -21
  76. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  77. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.d.ts.map +1 -1
  78. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js +18 -11
  79. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js.map +1 -1
  80. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.d.ts.map +1 -1
  81. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.js +5 -3
  82. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.js.map +1 -1
  83. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.d.ts +2 -0
  84. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.d.ts.map +1 -1
  85. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.js +3 -0
  86. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.js.map +1 -1
  87. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tableRelations.d.ts +2 -0
  88. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tableRelations.d.ts.map +1 -1
  89. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.d.ts +37 -0
  90. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -0
  91. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.js +27 -0
  92. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.js.map +1 -0
  93. package/analyzer-template/packages/github/dist/utils/index.d.ts +2 -0
  94. package/analyzer-template/packages/github/dist/utils/index.d.ts.map +1 -1
  95. package/analyzer-template/packages/github/dist/utils/index.js +2 -0
  96. package/analyzer-template/packages/github/dist/utils/index.js.map +1 -1
  97. package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.d.ts +25 -0
  98. package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.d.ts.map +1 -0
  99. package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.js +40 -0
  100. package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.js.map +1 -0
  101. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.d.ts.map +1 -1
  102. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js +5 -3
  103. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  104. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.d.ts.map +1 -1
  105. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
  106. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
  107. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.d.ts.map +1 -1
  108. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  109. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  110. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.d.ts.map +1 -1
  111. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
  112. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
  113. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts +12 -0
  114. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts.map +1 -0
  115. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  116. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  117. package/analyzer-template/packages/supabase/src/lib/kysely/db.ts +6 -0
  118. package/analyzer-template/packages/supabase/src/lib/kysely/tableRelations.ts +3 -0
  119. package/analyzer-template/packages/supabase/src/lib/kysely/tables/debugReportsTable.ts +61 -0
  120. package/analyzer-template/packages/ui-components/src/scenario-editor/components/DataItemEditor.tsx +1 -1
  121. package/analyzer-template/packages/utils/dist/utils/index.d.ts +2 -0
  122. package/analyzer-template/packages/utils/dist/utils/index.d.ts.map +1 -1
  123. package/analyzer-template/packages/utils/dist/utils/index.js +2 -0
  124. package/analyzer-template/packages/utils/dist/utils/index.js.map +1 -1
  125. package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.d.ts +25 -0
  126. package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.d.ts.map +1 -0
  127. package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.js +40 -0
  128. package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.js.map +1 -0
  129. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.d.ts.map +1 -1
  130. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js +5 -3
  131. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  132. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.d.ts.map +1 -1
  133. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
  134. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
  135. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.d.ts.map +1 -1
  136. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  137. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  138. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.d.ts.map +1 -1
  139. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
  140. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
  141. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts +12 -0
  142. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts.map +1 -0
  143. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  144. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  145. package/analyzer-template/packages/utils/index.ts +2 -0
  146. package/analyzer-template/packages/utils/src/lib/Semaphore.ts +42 -0
  147. package/analyzer-template/packages/utils/src/lib/frameworks/getNextRoutePath.ts +8 -3
  148. package/analyzer-template/packages/utils/src/lib/frameworks/getRemixRoutePath.ts +2 -1
  149. package/analyzer-template/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.ts +2 -1
  150. package/analyzer-template/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.ts +1 -0
  151. package/analyzer-template/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.ts +33 -0
  152. package/analyzer-template/project/constructMockCode.ts +170 -6
  153. package/analyzer-template/project/reconcileMockDataKeys.ts +13 -0
  154. package/analyzer-template/project/start.ts +1 -11
  155. package/analyzer-template/project/startScenarioCapture.ts +24 -0
  156. package/analyzer-template/project/trackGeneratedFiles.ts +41 -0
  157. package/analyzer-template/project/writeMockDataTsx.ts +125 -4
  158. package/analyzer-template/project/writeScenarioComponents.ts +199 -45
  159. package/analyzer-template/project/writeUniversalMocks.ts +72 -10
  160. package/background/src/lib/virtualized/project/constructMockCode.js +158 -7
  161. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  162. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +12 -0
  163. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  164. package/background/src/lib/virtualized/project/start.js +1 -8
  165. package/background/src/lib/virtualized/project/start.js.map +1 -1
  166. package/background/src/lib/virtualized/project/startScenarioCapture.js +18 -0
  167. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  168. package/background/src/lib/virtualized/project/trackGeneratedFiles.js +30 -0
  169. package/background/src/lib/virtualized/project/trackGeneratedFiles.js.map +1 -0
  170. package/background/src/lib/virtualized/project/writeMockDataTsx.js +95 -3
  171. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  172. package/background/src/lib/virtualized/project/writeScenarioComponents.js +144 -28
  173. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  174. package/background/src/lib/virtualized/project/writeUniversalMocks.js +59 -9
  175. package/background/src/lib/virtualized/project/writeUniversalMocks.js.map +1 -1
  176. package/codeyam-cli/scripts/apply-setup.js +288 -0
  177. package/codeyam-cli/scripts/apply-setup.js.map +1 -0
  178. package/codeyam-cli/scripts/extract-setup.js +130 -0
  179. package/codeyam-cli/scripts/extract-setup.js.map +1 -0
  180. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +238 -0
  181. package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +1 -0
  182. package/codeyam-cli/src/cli.js +6 -0
  183. package/codeyam-cli/src/cli.js.map +1 -1
  184. package/codeyam-cli/src/codeyam-cli.js +0 -0
  185. package/codeyam-cli/src/commands/debug.js +221 -0
  186. package/codeyam-cli/src/commands/debug.js.map +1 -0
  187. package/codeyam-cli/src/commands/init.js +4 -23
  188. package/codeyam-cli/src/commands/init.js.map +1 -1
  189. package/codeyam-cli/src/commands/report.js +102 -0
  190. package/codeyam-cli/src/commands/report.js.map +1 -0
  191. package/codeyam-cli/src/commands/setup-sandbox.js +164 -0
  192. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -0
  193. package/codeyam-cli/src/utils/__tests__/cleanupAnalysisFiles.test.js +6 -6
  194. package/codeyam-cli/src/utils/__tests__/cleanupAnalysisFiles.test.js.map +1 -1
  195. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +8 -0
  196. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  197. package/codeyam-cli/src/utils/analysisRunner.js +4 -3
  198. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  199. package/codeyam-cli/src/utils/analyzer.js +30 -0
  200. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  201. package/codeyam-cli/src/utils/backgroundServer.js +25 -5
  202. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  203. package/codeyam-cli/src/utils/cleanupAnalysisFiles.js +2 -2
  204. package/codeyam-cli/src/utils/cleanupAnalysisFiles.js.map +1 -1
  205. package/codeyam-cli/src/utils/fileWatcher.js +75 -5
  206. package/codeyam-cli/src/utils/fileWatcher.js.map +1 -1
  207. package/codeyam-cli/src/utils/generateReport.js +219 -0
  208. package/codeyam-cli/src/utils/generateReport.js.map +1 -0
  209. package/codeyam-cli/src/utils/install-skills.js +7 -0
  210. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  211. package/codeyam-cli/src/utils/queue/__tests__/job.pidTracking.test.js +1 -0
  212. package/codeyam-cli/src/utils/queue/__tests__/job.pidTracking.test.js.map +1 -1
  213. package/codeyam-cli/src/utils/queue/job.js +8 -3
  214. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  215. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +4 -0
  216. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  217. package/codeyam-cli/src/utils/webappDetection.js +2 -1
  218. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  219. package/codeyam-cli/src/webserver/app/lib/database.js +63 -2
  220. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  221. package/codeyam-cli/src/webserver/backgroundServer.js +15 -35
  222. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  223. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-D5ZHFomX.js +1 -0
  224. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-Dh-FldQK.js → InteractivePreview-XDSzQLOY.js} +3 -3
  225. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-BYVx9KFp.js +3 -0
  226. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-Dp6DC845.js → LogViewer-CRcT5fOZ.js} +1 -1
  227. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-BORLgi0X.js +1 -0
  228. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-Bual6h18.js +1 -0
  229. package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bi-YUMa-.js +6 -0
  230. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-4D2vLLJz.js +5 -0
  231. package/codeyam-cli/src/webserver/build/client/assets/_index-BC200mfN.js +1 -0
  232. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CxvZPkCv.js +10 -0
  233. package/codeyam-cli/src/webserver/build/client/assets/api.generate-report-l0sNRNKZ.js +1 -0
  234. package/codeyam-cli/src/webserver/build/client/assets/{chart-column-B2I7jQx2.js → chart-column-B8fb6wnw.js} +1 -1
  235. package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-De6i8FUT.js +26 -0
  236. package/codeyam-cli/src/webserver/build/client/assets/{circle-alert-GwwOAbhw.js → circle-alert-IdsgAK39.js} +1 -1
  237. package/codeyam-cli/src/webserver/build/client/assets/circle-check-BACUUf75.js +1 -0
  238. package/codeyam-cli/src/webserver/build/client/assets/clock-vWeoCemX.js +1 -0
  239. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CS7XDrKv.js +1 -0
  240. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DIOEw_3i.js +1 -0
  241. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-1Z6D0fLM.js → entity._sha._-8Els_3Wb.js} +10 -10
  242. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-C3FZJx1w.js +1 -0
  243. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-YJz_igar.js +5 -0
  244. package/codeyam-cli/src/webserver/build/client/assets/entityStatus-BEqj2qBy.js +1 -0
  245. package/codeyam-cli/src/webserver/build/client/assets/{entityVersioning-DO2gCvXv.js → entityVersioning-Bk_YB1jM.js} +1 -1
  246. package/codeyam-cli/src/webserver/build/client/assets/entry.client-DiP0q291.js +5 -0
  247. package/codeyam-cli/src/webserver/build/client/assets/file-text-LM0mgxXE.js +1 -0
  248. package/codeyam-cli/src/webserver/build/client/assets/files-Dxh9CcaV.js +1 -0
  249. package/codeyam-cli/src/webserver/build/client/assets/git-BXmqrWCH.js +12 -0
  250. package/codeyam-cli/src/webserver/build/client/assets/globals-BGS74ED-.css +1 -0
  251. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +5 -0
  252. package/codeyam-cli/src/webserver/build/client/assets/index-D-zYbzFZ.js +8 -0
  253. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-DN7Vr40D.js → loader-circle-BXPKbHEb.js} +1 -1
  254. package/codeyam-cli/src/webserver/build/client/assets/manifest-1af162d4.js +1 -0
  255. package/codeyam-cli/src/webserver/build/client/assets/root-DB7VgjCY.js +16 -0
  256. package/codeyam-cli/src/webserver/build/client/assets/{settings-MZc4XdmE.js → settings-5zF_GOcS.js} +1 -1
  257. package/codeyam-cli/src/webserver/build/client/assets/settings-Dc4MlMpK.js +1 -0
  258. package/codeyam-cli/src/webserver/build/client/assets/simulations-BQ-02-jB.js +1 -0
  259. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-D7k-ArFa.js +1 -0
  260. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BBlyqxij.js → useLastLogLine-AlhS7g5F.js} +1 -1
  261. package/codeyam-cli/src/webserver/build/client/assets/useToast-Ddo4UQv7.js +1 -0
  262. package/codeyam-cli/src/webserver/build/client/assets/{zap-B4gsLUZQ.js → zap-_jw-9DCp.js} +1 -1
  263. package/codeyam-cli/src/webserver/build/server/assets/index-D4JpXSIO.js +1 -0
  264. package/codeyam-cli/src/webserver/build/server/assets/server-build-vwbN7n65.js +169 -0
  265. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  266. package/codeyam-cli/src/webserver/build-info.json +5 -5
  267. package/codeyam-cli/src/webserver/server.js +1 -1
  268. package/codeyam-cli/src/webserver/server.js.map +1 -1
  269. package/codeyam-cli/templates/codeyam-setup-skill.md +85 -94
  270. package/codeyam-cli/templates/debug-command.md +125 -0
  271. package/package.json +9 -11
  272. package/packages/ai/index.js +1 -2
  273. package/packages/ai/index.js.map +1 -1
  274. package/packages/ai/src/lib/analyzeScope.js +13 -0
  275. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  276. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +6 -15
  277. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  278. package/packages/ai/src/lib/astScopes/methodSemantics.js +134 -0
  279. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  280. package/packages/ai/src/lib/astScopes/paths.js +28 -3
  281. package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
  282. package/packages/ai/src/lib/astScopes/processExpression.js +111 -3
  283. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  284. package/packages/ai/src/lib/checkAllAttributes.js +1 -3
  285. package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
  286. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1320 -396
  287. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  288. package/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.js +137 -1
  289. package/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.js.map +1 -1
  290. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +1 -1
  291. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  292. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +112 -0
  293. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -0
  294. package/packages/ai/src/lib/dataStructure/helpers/DebugTracer.js +176 -0
  295. package/packages/ai/src/lib/dataStructure/helpers/DebugTracer.js.map +1 -0
  296. package/packages/ai/src/lib/dataStructure/helpers/PathManager.js +178 -0
  297. package/packages/ai/src/lib/dataStructure/helpers/PathManager.js.map +1 -0
  298. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +138 -0
  299. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -0
  300. package/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.js +199 -0
  301. package/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.js.map +1 -0
  302. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +14 -6
  303. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  304. package/packages/ai/src/lib/dataStructure/helpers/selectBestValue.js +62 -0
  305. package/packages/ai/src/lib/dataStructure/helpers/selectBestValue.js.map +1 -0
  306. package/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.js +90 -0
  307. package/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.js.map +1 -0
  308. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +22 -0
  309. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
  310. package/packages/ai/src/lib/generateChangesEntityDocumentation.js +19 -1
  311. package/packages/ai/src/lib/generateChangesEntityDocumentation.js.map +1 -1
  312. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js +51 -107
  313. package/packages/ai/src/lib/generateChangesEntityKeyAttributes.js.map +1 -1
  314. package/packages/ai/src/lib/generateChangesEntityScenarioData.js +55 -156
  315. package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
  316. package/packages/ai/src/lib/generateChangesEntityScenarios.js +79 -262
  317. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  318. package/packages/ai/src/lib/generateEntityDocumentation.js +15 -1
  319. package/packages/ai/src/lib/generateEntityDocumentation.js.map +1 -1
  320. package/packages/ai/src/lib/generateEntityKeyAttributes.js +53 -176
  321. package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +1 -1
  322. package/packages/ai/src/lib/generateEntityScenarioData.js +52 -152
  323. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  324. package/packages/ai/src/lib/generateEntityScenarios.js +88 -258
  325. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  326. package/packages/ai/src/lib/generateStatementAnalysis.js +46 -71
  327. package/packages/ai/src/lib/generateStatementAnalysis.js.map +1 -1
  328. package/packages/ai/src/lib/getConditionalUsagesFromCode.js +13 -8
  329. package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
  330. package/packages/ai/src/lib/getLLMCallStats.js +0 -14
  331. package/packages/ai/src/lib/getLLMCallStats.js.map +1 -1
  332. package/packages/ai/src/lib/modelInfo.js +15 -0
  333. package/packages/ai/src/lib/modelInfo.js.map +1 -1
  334. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +36 -3
  335. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  336. package/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.js +8 -33
  337. package/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.js.map +1 -1
  338. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +35 -41
  339. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
  340. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +59 -72
  341. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  342. package/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.js +8 -27
  343. package/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.js.map +1 -1
  344. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +24 -27
  345. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  346. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +21 -22
  347. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
  348. package/packages/ai/src/lib/types/index.js +2 -0
  349. package/packages/ai/src/lib/types/index.js.map +1 -1
  350. package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
  351. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  352. package/packages/analyze/src/lib/FileAnalyzer.js +45 -5
  353. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  354. package/packages/analyze/src/lib/asts/nodes/index.js +2 -1
  355. package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
  356. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +191 -0
  357. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -0
  358. package/packages/analyze/src/lib/asts/sourceFiles/getDeclaredEntityNode.js +16 -0
  359. package/packages/analyze/src/lib/asts/sourceFiles/getDeclaredEntityNode.js.map +1 -0
  360. package/packages/analyze/src/lib/asts/sourceFiles/index.js +2 -0
  361. package/packages/analyze/src/lib/asts/sourceFiles/index.js.map +1 -1
  362. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +6 -8
  363. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  364. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +5 -1
  365. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  366. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +8 -2
  367. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  368. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js +5 -8
  369. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
  370. package/packages/analyze/src/lib/files/analyzeChange.js +21 -9
  371. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  372. package/packages/analyze/src/lib/files/analyzeEntity.js +10 -4
  373. package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
  374. package/packages/analyze/src/lib/files/analyzeInitial.js +21 -9
  375. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  376. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +6 -1
  377. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  378. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +9 -1
  379. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +1 -1
  380. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +5 -1
  381. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
  382. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +9 -1
  383. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
  384. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +16 -7
  385. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  386. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +28 -21
  387. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  388. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js +18 -11
  389. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js.map +1 -1
  390. package/packages/generate/src/lib/scenarioComponent.js +5 -3
  391. package/packages/generate/src/lib/scenarioComponent.js.map +1 -1
  392. package/packages/supabase/src/lib/kysely/db.js +3 -0
  393. package/packages/supabase/src/lib/kysely/db.js.map +1 -1
  394. package/packages/supabase/src/lib/kysely/tables/debugReportsTable.js +27 -0
  395. package/packages/supabase/src/lib/kysely/tables/debugReportsTable.js.map +1 -0
  396. package/packages/utils/index.js +2 -0
  397. package/packages/utils/index.js.map +1 -1
  398. package/packages/utils/src/lib/Semaphore.js +40 -0
  399. package/packages/utils/src/lib/Semaphore.js.map +1 -0
  400. package/packages/utils/src/lib/frameworks/getNextRoutePath.js +5 -3
  401. package/packages/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  402. package/packages/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
  403. package/packages/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
  404. package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  405. package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  406. package/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
  407. package/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
  408. package/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  409. package/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  410. package/analyzer-template/packages/ai/src/lib/generateEntityDataMap.ts +0 -375
  411. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-GqWwt5wG.js +0 -1
  412. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-p0fuyqGQ.js +0 -3
  413. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-xwuhwsZH.js +0 -1
  414. package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bl2IRh55.js +0 -1
  415. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-M2QuSHKC.js +0 -5
  416. package/codeyam-cli/src/webserver/build/client/assets/_index-CAVtep9Q.js +0 -1
  417. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CLmzsLsT.js +0 -10
  418. package/codeyam-cli/src/webserver/build/client/assets/components-CAx5ONX_.js +0 -40
  419. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CgyOwWip.js +0 -1
  420. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DGy3zrli.js +0 -1
  421. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-ChAdTrrU.js +0 -1
  422. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-D9L7267w.js +0 -5
  423. package/codeyam-cli/src/webserver/build/client/assets/entry.client-C6FRgjPr.js +0 -1
  424. package/codeyam-cli/src/webserver/build/client/assets/files-C3-cQjgv.js +0 -1
  425. package/codeyam-cli/src/webserver/build/client/assets/git-Dp4EB9nv.js +0 -12
  426. package/codeyam-cli/src/webserver/build/client/assets/globals-Da3jt49-.css +0 -1
  427. package/codeyam-cli/src/webserver/build/client/assets/manifest-172a4629.js +0 -1
  428. package/codeyam-cli/src/webserver/build/client/assets/root-COyVTsPq.js +0 -16
  429. package/codeyam-cli/src/webserver/build/client/assets/search-CvyP_1Lo.js +0 -1
  430. package/codeyam-cli/src/webserver/build/client/assets/settings-Hbf8b7J_.js +0 -1
  431. package/codeyam-cli/src/webserver/build/client/assets/simulations-BMBi0VzO.js +0 -1
  432. package/codeyam-cli/src/webserver/build/client/assets/useToast-C_VxoXTh.js +0 -1
  433. package/codeyam-cli/src/webserver/build/client/cy-logo-cli.svg +0 -13
  434. package/codeyam-cli/src/webserver/build/server/assets/index-eAULANMV.js +0 -1
  435. package/codeyam-cli/src/webserver/build/server/assets/server-build-lutv16q5.js +0 -161
  436. package/codeyam-cli/src/webserver/public/cy-logo-cli.svg +0 -13
  437. package/packages/ai/src/lib/generateEntityDataMap.js +0 -335
  438. package/packages/ai/src/lib/generateEntityDataMap.js.map +0 -1
  439. package/packages/ai/src/lib/promptGenerators/generateEntityDataMapGenerator.js +0 -17
  440. package/packages/ai/src/lib/promptGenerators/generateEntityDataMapGenerator.js.map +0 -1
@@ -0,0 +1,235 @@
1
+ /**
2
+ * VisitedTracker
3
+ *
4
+ * Manages visited state tracking for the ScopeDataStructure analysis.
5
+ * Prevents infinite loops and redundant processing by tracking which
6
+ * scope/path/value combinations have already been processed.
7
+ *
8
+ * ## Why This Exists
9
+ *
10
+ * The schema building process recursively follows equivalencies between
11
+ * data paths. Without cycle detection, circular references like:
12
+ * `user.profile` → `currentUser` → `user.profile`
13
+ * would cause infinite loops.
14
+ *
15
+ * ## Two Tracking Modes
16
+ *
17
+ * ### 1. Global Visited (scope::path::value)
18
+ * Fine-grained deduplication for `addToSchema()`. Tracks the complete
19
+ * tuple so the same path can be visited with different type values.
20
+ *
21
+ * Example: `myFunc::user.id::string` and `myFunc::user.id::number`
22
+ * are tracked separately, allowing both types to be recorded.
23
+ *
24
+ * ### 2. Complex Source Visited (scope::path)
25
+ * Coarser deduplication for `addComplexSourcePathVariables()`. Ignores
26
+ * the type value because complex source processing should happen once
27
+ * per path regardless of type.
28
+ *
29
+ * ## Lifecycle
30
+ *
31
+ * - Global visited is **reset** at the start of `captureCompleteSchema()`
32
+ * to allow re-processing in the schema building phase.
33
+ * - Complex source visited is **never reset** during normal operation.
34
+ *
35
+ * ## Related Modules
36
+ *
37
+ * - `ScopeDataStructure.addToSchema()` - Primary consumer of global visited
38
+ * - `ScopeDataStructure.addComplexSourcePathVariables()` - Uses complex source visited
39
+ */
40
+
41
+ /**
42
+ * Tracks visited state to prevent infinite loops during schema building.
43
+ */
44
+ export class VisitedTracker {
45
+ /**
46
+ * Fine-grained visited tracking using scope::path::value.
47
+ * Used by addToSchema to skip already-processed combinations.
48
+ */
49
+ private globalVisited: Set<string> = new Set();
50
+
51
+ /**
52
+ * Coarser visited tracking using scope::path only (without value).
53
+ * Used by addComplexSourcePathVariables to allow each unique
54
+ * scope+path combo to be processed once, regardless of value.
55
+ */
56
+ private complexSourceVisited: Set<string> = new Set();
57
+
58
+ /**
59
+ * Creates a unique key for global visited tracking.
60
+ * @param scopeNodeName - Name of the scope
61
+ * @param path - Schema path
62
+ * @param value - Type value
63
+ */
64
+ private makeGlobalKey(
65
+ scopeNodeName: string,
66
+ path: string,
67
+ value: string,
68
+ ): string {
69
+ return `${scopeNodeName}::${path}::${value}`;
70
+ }
71
+
72
+ /**
73
+ * Creates a unique key for complex source visited tracking.
74
+ * @param scopeNodeName - Name of the scope
75
+ * @param path - Schema path
76
+ */
77
+ private makeComplexKey(scopeNodeName: string, path: string): string {
78
+ return `${scopeNodeName}::${path}`;
79
+ }
80
+
81
+ /**
82
+ * Checks if a scope/path/value combination has been globally visited.
83
+ * Does NOT mark it as visited - use markGlobalVisited for that.
84
+ *
85
+ * @returns true if already visited
86
+ */
87
+ hasGlobalVisited(
88
+ scopeNodeName: string,
89
+ path: string,
90
+ value: string,
91
+ ): boolean {
92
+ return this.globalVisited.has(
93
+ this.makeGlobalKey(scopeNodeName, path, value),
94
+ );
95
+ }
96
+
97
+ /**
98
+ * Marks a scope/path/value combination as globally visited.
99
+ */
100
+ markGlobalVisited(scopeNodeName: string, path: string, value: string): void {
101
+ this.globalVisited.add(this.makeGlobalKey(scopeNodeName, path, value));
102
+ }
103
+
104
+ /**
105
+ * Checks and marks a scope/path/value combination as globally visited.
106
+ * This is a convenience method that combines check and mark.
107
+ *
108
+ * @returns true if was already visited (should skip processing)
109
+ */
110
+ checkAndMarkGlobalVisited(
111
+ scopeNodeName: string,
112
+ path: string,
113
+ value: string,
114
+ ): boolean {
115
+ const key = this.makeGlobalKey(scopeNodeName, path, value);
116
+ if (this.globalVisited.has(key)) {
117
+ return true; // Already visited
118
+ }
119
+ this.globalVisited.add(key);
120
+ return false; // Not visited, now marked
121
+ }
122
+
123
+ /**
124
+ * Checks if a scope/path combination has been visited for complex sources.
125
+ * Does NOT mark it as visited - use markComplexSourceVisited for that.
126
+ *
127
+ * @returns true if already visited
128
+ */
129
+ hasComplexSourceVisited(scopeNodeName: string, path: string): boolean {
130
+ return this.complexSourceVisited.has(
131
+ this.makeComplexKey(scopeNodeName, path),
132
+ );
133
+ }
134
+
135
+ /**
136
+ * Marks a scope/path combination as visited for complex sources.
137
+ */
138
+ markComplexSourceVisited(scopeNodeName: string, path: string): void {
139
+ this.complexSourceVisited.add(this.makeComplexKey(scopeNodeName, path));
140
+ }
141
+
142
+ /**
143
+ * Checks and marks a scope/path combination as visited for complex sources.
144
+ * This is a convenience method that combines check and mark.
145
+ *
146
+ * @returns true if was already visited (should skip processing)
147
+ */
148
+ checkAndMarkComplexSourceVisited(
149
+ scopeNodeName: string,
150
+ path: string,
151
+ ): boolean {
152
+ const key = this.makeComplexKey(scopeNodeName, path);
153
+ if (this.complexSourceVisited.has(key)) {
154
+ return true; // Already visited
155
+ }
156
+ this.complexSourceVisited.add(key);
157
+ return false; // Not visited, now marked
158
+ }
159
+
160
+ /**
161
+ * Resets the global visited set.
162
+ * Called at the start of captureCompleteSchema() to allow
163
+ * re-processing in the second phase.
164
+ */
165
+ resetGlobalVisited(): void {
166
+ this.globalVisited.clear();
167
+ }
168
+
169
+ /**
170
+ * Resets the complex source visited set.
171
+ * Note: In the original code, this was never reset.
172
+ */
173
+ resetComplexSourceVisited(): void {
174
+ this.complexSourceVisited.clear();
175
+ }
176
+
177
+ /**
178
+ * Resets all visited tracking.
179
+ */
180
+ resetAll(): void {
181
+ this.globalVisited.clear();
182
+ this.complexSourceVisited.clear();
183
+ }
184
+
185
+ /**
186
+ * Returns statistics about the visited sets for debugging/monitoring.
187
+ */
188
+ getStats(): { globalVisited: number; complexSourceVisited: number } {
189
+ return {
190
+ globalVisited: this.globalVisited.size,
191
+ complexSourceVisited: this.complexSourceVisited.size,
192
+ };
193
+ }
194
+
195
+ /**
196
+ * Checks if ANY variant of a scope/path was ever visited (ignores value).
197
+ * Useful for debugging to see if a path was processed at all.
198
+ *
199
+ * @returns true if any variant of this scope/path was visited
200
+ */
201
+ wasVisited(scopeNodeName: string, path: string): boolean {
202
+ const prefix = `${scopeNodeName}::${path}::`;
203
+ for (const key of this.globalVisited) {
204
+ if (key.startsWith(prefix)) {
205
+ return true;
206
+ }
207
+ }
208
+ return this.hasComplexSourceVisited(scopeNodeName, path);
209
+ }
210
+
211
+ /**
212
+ * Gets all visited entries for a scope (for debugging).
213
+ * Returns an array of {path, value} objects.
214
+ */
215
+ getVisitedForScope(
216
+ scopeNodeName: string,
217
+ ): Array<{ path: string; value: string }> {
218
+ const prefix = `${scopeNodeName}::`;
219
+ const results: Array<{ path: string; value: string }> = [];
220
+
221
+ for (const key of this.globalVisited) {
222
+ if (key.startsWith(prefix)) {
223
+ const parts = key.slice(prefix.length).split('::');
224
+ if (parts.length >= 2) {
225
+ results.push({
226
+ path: parts.slice(0, -1).join('::'), // Everything except last part
227
+ value: parts[parts.length - 1], // Last part is value
228
+ });
229
+ }
230
+ }
231
+ }
232
+
233
+ return results;
234
+ }
235
+ }
@@ -355,9 +355,11 @@ export function fillInDirectSchemaGapsAndUnknowns({
355
355
 
356
356
  // Don't set to 'function' if this is a promise method on an async function
357
357
  // (we want the awaited value, not the promise)
358
+ // Also don't overwrite 'array' - the function might return an array (e.g., getAll())
358
359
  if (
359
360
  schema[functionReturnValuePath] &&
360
361
  schema[functionReturnValuePath] !== 'function' &&
362
+ schema[functionReturnValuePath] !== 'array' &&
361
363
  !(isPromiseMethod && isPreviousAsync)
362
364
  ) {
363
365
  schema[functionReturnValuePath] = 'function';
@@ -408,17 +410,26 @@ function checkIfObjectOrFunction(path: string, schema: ScopeNode['schema']) {
408
410
  }
409
411
  }
410
412
 
411
- // Methods that are ambiguous - used on both arrays and non-arrays (e.g., router.push, history.pop)
413
+ // Methods that are ambiguous - used on both arrays and non-arrays
414
+ // These methods exist on arrays but also on Map, Set, Headers, FormData, URLSearchParams, etc.
412
415
  // Don't infer array type from these alone without additional evidence
413
- const AMBIGUOUS_ARRAY_METHODS = new Set(['push', 'pop']);
416
+ const AMBIGUOUS_ARRAY_METHODS = new Set([
417
+ 'push',
418
+ 'pop',
419
+ 'entries',
420
+ 'keys',
421
+ 'values',
422
+ 'forEach',
423
+ ]);
414
424
 
415
425
  // Methods that are strongly indicative of arrays - only arrays have these
426
+ // Note: entries, keys, values, forEach are NOT in this list because they also exist
427
+ // on Map, Set, Headers, FormData, URLSearchParams, and other iterable types
416
428
  const STRONG_ARRAY_METHODS = new Set([
417
429
  'map',
418
430
  'filter',
419
431
  'reduce',
420
432
  'reduceRight',
421
- 'forEach',
422
433
  'every',
423
434
  'some',
424
435
  'find',
@@ -429,9 +440,6 @@ const STRONG_ARRAY_METHODS = new Set([
429
440
  'flatMap',
430
441
  'fill',
431
442
  'copyWithin',
432
- 'entries',
433
- 'keys',
434
- 'values',
435
443
  'toReversed',
436
444
  'toSorted',
437
445
  'toSpliced',
@@ -0,0 +1,70 @@
1
+ /**
2
+ * selectBestValue
3
+ *
4
+ * Selects the most specific type value from two candidates.
5
+ * Prefers more specific types over 'unknown' values.
6
+ *
7
+ * ## Context
8
+ *
9
+ * During schema building, the same path may have type information from
10
+ * multiple sources (e.g., from a return statement and from a function call).
11
+ * When merging these, we want to keep the most specific type.
12
+ *
13
+ * "Specific" means:
14
+ * - `'string'` is more specific than `'unknown'`
15
+ * - `'string'` is more specific than `'unknown|string'`
16
+ * - `'string|number'` is equal specificity to `'number|string'`
17
+ *
18
+ * ## Selection Rules
19
+ *
20
+ * 1. If value1 exists and is not 'unknown', use value1
21
+ * 2. If value2 exists and is more specific (not 'unknown'), prefer value2
22
+ * 3. Otherwise use the first available value, or 'unknown' as default
23
+ *
24
+ * ## Where Used
25
+ *
26
+ * - `propagateSourceAndUsageEquivalencies.equateSchema()` - Merging schemas
27
+ * - `getReturnValue()` - Combining return type information
28
+ *
29
+ * ## Related Modules
30
+ *
31
+ * - `ensureSchemaConsistency.ts` - Also deals with type merging
32
+ * - `fillInSchemaGapsAndUnknowns.ts` - Fills in missing types after schema building
33
+ */
34
+
35
+ /**
36
+ * Selects the best (most specific) value between two type candidates.
37
+ *
38
+ * @param value1 - Primary value (preferred if specific)
39
+ * @param value2 - Secondary value (used if value1 is 'unknown')
40
+ * @param defaultValue - Default when both are undefined (defaults to 'unknown')
41
+ * @returns The most specific type value
42
+ *
43
+ * @example
44
+ * selectBestValue('string', 'number') // 'string' - value1 is specific
45
+ * selectBestValue('unknown', 'string') // 'string' - value2 is more specific
46
+ * selectBestValue(undefined, 'number') // 'number' - value1 undefined
47
+ * selectBestValue(undefined, undefined) // 'unknown' - default
48
+ * selectBestValue('unknown|string', 'string') // 'string' - value2 has no unknown
49
+ */
50
+ export default function selectBestValue(
51
+ value1: string | undefined,
52
+ value2: string | undefined,
53
+ defaultValue = 'unknown',
54
+ ): string {
55
+ let bestValue = value1 ?? value2 ?? defaultValue;
56
+
57
+ // Prefer value2 if:
58
+ // - value2 exists AND
59
+ // - bestValue is 'unknown' and value2 is not, OR
60
+ // - bestValue contains 'unknown' and value2 doesn't
61
+ if (
62
+ value2 &&
63
+ ((bestValue === 'unknown' && value2 !== 'unknown') ||
64
+ (bestValue.includes('unknown') && !value2.includes('unknown')))
65
+ ) {
66
+ bestValue = value2;
67
+ }
68
+
69
+ return bestValue;
70
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * UniqueIdUtils
3
+ *
4
+ * Utility functions for creating unique identifiers and deduplicating
5
+ * scope variables in the ScopeDataStructure analysis.
6
+ *
7
+ * ## Why Unique IDs Matter
8
+ *
9
+ * The analysis tracks data flow across many scopes and paths. When building
10
+ * equivalency chains or schemas, we need to:
11
+ * - Detect cycles (have we seen this scope+path+value before?)
12
+ * - Deduplicate results (don't report the same equivalency twice)
13
+ * - Index efficiently (O(1) lookups in large datasets)
14
+ *
15
+ * ## Key Format
16
+ *
17
+ * The unique ID format is `scopeNodeName::schemaPath[::value]`:
18
+ * - `myFunc::user.id` - Scope+path without type value
19
+ * - `myFunc::user.id::string` - Full tuple including type
20
+ *
21
+ * The `::` delimiter is chosen because:
22
+ * - Scope names never contain `::`
23
+ * - Schema paths use `.` and `[]` but not `::`
24
+ * - Type values may contain `:` (e.g., `union::type`) but only as the last part
25
+ *
26
+ * ## Performance
27
+ *
28
+ * `uniqueScopeAndPaths` uses O(n) Set-based deduplication instead of O(n²)
29
+ * array comparisons. This matters when processing thousands of equivalencies.
30
+ *
31
+ * ## Related Modules
32
+ *
33
+ * - `VisitedTracker.ts` - Uses similar key format for cycle detection
34
+ * - `ScopeDataStructure.equivalencyDatabase` - Indexed by these unique IDs
35
+ */
36
+
37
+ /**
38
+ * Interface for items that can be deduplicated by scope and path.
39
+ * Matches the ScopeVariable interface's required fields.
40
+ */
41
+ export interface ScopeAndPath {
42
+ scopeNodeName: string;
43
+ schemaPath: string;
44
+ }
45
+
46
+ /**
47
+ * Creates a unique identifier string from scope, path, and optional value.
48
+ * Used for tracking visited combinations and equivalency chains.
49
+ *
50
+ * @example
51
+ * uniqueId({ scopeNodeName: 'myFunc', schemaPath: 'user.id' }) // 'myFunc::user.id'
52
+ * uniqueId({ scopeNodeName: 'myFunc', schemaPath: 'user.id', value: 'string' }) // 'myFunc::user.id::string'
53
+ */
54
+ export function uniqueId({
55
+ scopeNodeName,
56
+ schemaPath,
57
+ value,
58
+ }: {
59
+ scopeNodeName: string;
60
+ schemaPath: string;
61
+ value?: string;
62
+ }): string {
63
+ const parts = [scopeNodeName, schemaPath, value].filter(Boolean);
64
+ return parts.join('::');
65
+ }
66
+
67
+ /**
68
+ * Removes duplicate scope variables from an array, keeping only the first occurrence
69
+ * of each unique scopeNodeName + schemaPath combination.
70
+ *
71
+ * This is a type-preserving version of uniqueScopeAndPaths that returns the full
72
+ * ScopeVariable objects (with id and equivalencyReason).
73
+ *
74
+ * @param scopeVariables - Array of scope variables to deduplicate
75
+ * @returns Deduplicated array preserving original type
76
+ */
77
+ export function uniqueScopeVariables<T extends ScopeAndPath>(
78
+ scopeVariables: T[],
79
+ ): T[] {
80
+ return uniqueScopeAndPaths(scopeVariables);
81
+ }
82
+
83
+ /**
84
+ * Removes duplicates from an array of objects with scopeNodeName and schemaPath.
85
+ * Uses O(n) Set-based deduplication for performance.
86
+ *
87
+ * @param scopeVariables - Array of objects to deduplicate
88
+ * @returns Deduplicated array preserving original type
89
+ *
90
+ * @example
91
+ * uniqueScopeAndPaths([
92
+ * { scopeNodeName: 'a', schemaPath: 'x' },
93
+ * { scopeNodeName: 'a', schemaPath: 'x' },
94
+ * { scopeNodeName: 'b', schemaPath: 'y' },
95
+ * ])
96
+ * // Returns: [{ scopeNodeName: 'a', schemaPath: 'x' }, { scopeNodeName: 'b', schemaPath: 'y' }]
97
+ */
98
+ export function uniqueScopeAndPaths<T extends ScopeAndPath>(
99
+ scopeVariables: T[] | undefined | null,
100
+ ): T[] {
101
+ if (!scopeVariables || scopeVariables.length === 0) return [];
102
+
103
+ // Optimize from O(n²) to O(n) using Set for deduplication
104
+ const seen = new Set<string>();
105
+ return scopeVariables.filter((varItem) => {
106
+ const key = `${varItem.scopeNodeName}::${varItem.schemaPath}`;
107
+ if (seen.has(key)) {
108
+ return false;
109
+ }
110
+ seen.add(key);
111
+ return true;
112
+ });
113
+ }
@@ -70,6 +70,42 @@ export default function gatherRelevantDependentKeyAttributes(
70
70
  const signatureSchema = dependencySchema?.signatureSchema;
71
71
  if (!signatureSchema) return;
72
72
 
73
+ const sourceEquivalencies = dependencySchema?.sourceEquivalencies ?? {};
74
+
75
+ // If sourceEquivalencies is empty but the child has mocked imports,
76
+ // propagate key attributes directly since they affect the parent's visual output
77
+ if (Object.keys(sourceEquivalencies).length === 0) {
78
+ // Check both importedExports and nodeModuleImports for mocked imports
79
+ const importedExports =
80
+ dependentAnalysis.entity?.metadata?.importedExports ?? [];
81
+ const nodeModuleImports =
82
+ dependentAnalysis.entity?.metadata?.nodeModuleImports ?? {};
83
+
84
+ const hasMockedImportedExports = importedExports.some(
85
+ (imp: { isMocked?: boolean }) => imp.isMocked,
86
+ );
87
+ const hasMockedNodeModuleImports = Object.values(
88
+ nodeModuleImports,
89
+ ).some((imports: any[]) =>
90
+ imports?.some((imp: { isMocked?: boolean }) => imp.isMocked),
91
+ );
92
+
93
+ const childHasMockedImports =
94
+ hasMockedImportedExports || hasMockedNodeModuleImports;
95
+
96
+ if (childHasMockedImports) {
97
+ for (const dependentKeyAttribute of dependentKeyAtttributes) {
98
+ relevantDependentKeyAttributes.push({
99
+ ...dependentKeyAttribute,
100
+ dependentEntityName: entityName,
101
+ originalEntityName: entityName,
102
+ filePath: path,
103
+ } as any);
104
+ }
105
+ }
106
+ return;
107
+ }
108
+
73
109
  for (const dependentKeyAttribute of dependentKeyAtttributes) {
74
110
  const dependentKeyAttributeExternalPathParts =
75
111
  splitOutsideParenthesesAndArrays(dependentKeyAttribute.externalPath);
@@ -25,8 +25,7 @@ export default async function generateChangesEntityDocumentation({
25
25
 
26
26
  const { completion: documentation, stats } = await completionCall({
27
27
  type: 'entityDocumentation',
28
- systemMessage:
29
- 'You are an expert coder and educator. You think a lot about how people can understand new things, recognizing that it is a mixture of direct facts and numerous examples from different perspectives.',
28
+ systemMessage: SYSTEM_MESSAGE,
30
29
  prompt,
31
30
  model,
32
31
  jsonResponse: false,
@@ -62,3 +61,22 @@ export default async function generateChangesEntityDocumentation({
62
61
 
63
62
  return { documentation, llmCall };
64
63
  }
64
+
65
+ const SYSTEM_MESSAGE = `You are a technical documentation writer updating existing documentation after code changes.
66
+
67
+ ## When to Update
68
+ - If existing documentation is still accurate: respond with exactly "No changes needed"
69
+ - If code changed significantly: provide updated documentation
70
+
71
+ ## Style
72
+ - Be concise—use bullets, not paragraphs
73
+ - Provide diverse examples (no repetitive variations)
74
+ - In Overview, describe intent directly without mentioning the function name
75
+
76
+ ## Required Sections (when updating)
77
+ Return documentation with exactly these markdown headers:
78
+ - ## Overview
79
+ - ## Inputs
80
+ - ## Output
81
+ - ## Examples
82
+ `;