@codeyam/codeyam-cli 0.1.0-bleeding-edge.8afd3ee → 0.1.0-staging.09652b8

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 (220) 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 +1 -1
  4. package/analyzer-template/packages/ai/index.ts +0 -1
  5. package/analyzer-template/packages/ai/scripts/ai-test-matrix.mjs +424 -0
  6. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +6 -16
  7. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +197 -0
  8. package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +28 -2
  9. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +113 -4
  10. package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +1 -3
  11. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +430 -7
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +12 -6
  13. package/analyzer-template/packages/ai/src/lib/generateChangesEntityDocumentation.ts +20 -2
  14. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +56 -160
  15. package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +79 -265
  16. package/analyzer-template/packages/ai/src/lib/generateEntityDocumentation.ts +16 -2
  17. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +53 -154
  18. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +84 -254
  19. package/analyzer-template/packages/ai/src/lib/generateStatementAnalysis.ts +48 -71
  20. package/analyzer-template/packages/ai/src/lib/getLLMCallStats.ts +0 -14
  21. package/analyzer-template/packages/ai/src/lib/modelInfo.ts +15 -0
  22. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.ts +8 -33
  23. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.ts +54 -62
  24. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +93 -109
  25. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.ts +8 -27
  26. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +33 -38
  27. package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +30 -30
  28. package/analyzer-template/packages/ai/src/lib/types/index.ts +2 -0
  29. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +15 -7
  30. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +28 -21
  31. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.ts +18 -11
  32. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
  33. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +28 -21
  34. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  35. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.d.ts.map +1 -1
  36. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js +18 -11
  37. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js.map +1 -1
  38. package/analyzer-template/packages/github/dist/utils/index.d.ts +1 -0
  39. package/analyzer-template/packages/github/dist/utils/index.d.ts.map +1 -1
  40. package/analyzer-template/packages/github/dist/utils/index.js +1 -0
  41. package/analyzer-template/packages/github/dist/utils/index.js.map +1 -1
  42. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.d.ts.map +1 -1
  43. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
  44. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  45. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.d.ts.map +1 -1
  46. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  47. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  48. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts +12 -0
  49. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts.map +1 -0
  50. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  51. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  52. package/analyzer-template/packages/ui-components/src/scenario-editor/components/DataItemEditor.tsx +1 -1
  53. package/analyzer-template/packages/utils/dist/utils/index.d.ts +1 -0
  54. package/analyzer-template/packages/utils/dist/utils/index.d.ts.map +1 -1
  55. package/analyzer-template/packages/utils/dist/utils/index.js +1 -0
  56. package/analyzer-template/packages/utils/dist/utils/index.js.map +1 -1
  57. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.d.ts.map +1 -1
  58. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
  59. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  60. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.d.ts.map +1 -1
  61. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  62. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  63. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts +12 -0
  64. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts.map +1 -0
  65. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  66. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  67. package/analyzer-template/packages/utils/index.ts +1 -0
  68. package/analyzer-template/packages/utils/src/lib/frameworks/getNextRoutePath.ts +2 -1
  69. package/analyzer-template/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.ts +2 -1
  70. package/analyzer-template/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.ts +33 -0
  71. package/analyzer-template/project/startScenarioCapture.ts +24 -0
  72. package/analyzer-template/project/trackGeneratedFiles.ts +41 -0
  73. package/analyzer-template/project/writeMockDataTsx.ts +94 -4
  74. package/analyzer-template/project/writeScenarioComponents.ts +35 -27
  75. package/background/src/lib/virtualized/project/startScenarioCapture.js +18 -0
  76. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  77. package/background/src/lib/virtualized/project/trackGeneratedFiles.js +30 -0
  78. package/background/src/lib/virtualized/project/trackGeneratedFiles.js.map +1 -0
  79. package/background/src/lib/virtualized/project/writeMockDataTsx.js +71 -3
  80. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  81. package/background/src/lib/virtualized/project/writeScenarioComponents.js +15 -11
  82. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  83. package/codeyam-cli/src/commands/init.js +4 -23
  84. package/codeyam-cli/src/commands/init.js.map +1 -1
  85. package/codeyam-cli/src/utils/webappDetection.js +2 -1
  86. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  87. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-B9Sf8e9w.js +1 -0
  88. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-B0oiPem-.js → InteractivePreview-CDnfNKKQ.js} +3 -3
  89. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DUS-3h7I.js +3 -0
  90. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-BKKG1s2B.js → LogViewer-TJzDQku1.js} +1 -1
  91. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BgdlWM6p.js +1 -0
  92. package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bl6GY-OE.js +6 -0
  93. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DmjXUj6m.js → ScenarioViewer-BDq8RX50.js} +1 -1
  94. package/codeyam-cli/src/webserver/build/client/assets/_index-Bh3y3Wsl.js +1 -0
  95. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-tq7Bl6-t.js +10 -0
  96. package/codeyam-cli/src/webserver/build/client/assets/{chart-column-VXBS6qOn.js → chart-column-q9_nHfwv.js} +1 -1
  97. package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-DvL0YqDJ.js +26 -0
  98. package/codeyam-cli/src/webserver/build/client/assets/{circle-alert-n5GUC2AS.js → circle-alert-CKMpA1v_.js} +1 -1
  99. package/codeyam-cli/src/webserver/build/client/assets/{clock-DKqtX8js.js → clock-Wnfog8Qw.js} +1 -1
  100. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C_ixaqqh.js +1 -0
  101. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BHiWkb_W.js → entity._sha._-3bYjyojg.js} +10 -10
  102. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DtfwpN9J.js +1 -0
  103. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-QecTs_sq.js +5 -0
  104. package/codeyam-cli/src/webserver/build/client/assets/entry.client-hnkEgHrC.js +5 -0
  105. package/codeyam-cli/src/webserver/build/client/assets/file-text-CvCVdKLW.js +1 -0
  106. package/codeyam-cli/src/webserver/build/client/assets/files-DgUCYhbd.js +1 -0
  107. package/codeyam-cli/src/webserver/build/client/assets/git-WoKohOtW.js +12 -0
  108. package/codeyam-cli/src/webserver/build/client/assets/globals-DZfbt0u5.css +1 -0
  109. package/codeyam-cli/src/webserver/build/client/assets/index-Vvbl94Xc.js +8 -0
  110. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-v3c6DFp4.js → loader-circle-Bxm63UxG.js} +1 -1
  111. package/codeyam-cli/src/webserver/build/client/assets/manifest-c90b8608.js +1 -0
  112. package/codeyam-cli/src/webserver/build/client/assets/root-DrVZQamX.js +16 -0
  113. package/codeyam-cli/src/webserver/build/client/assets/{search-DA14wXpu.js → search-CJkk16Ct.js} +1 -1
  114. package/codeyam-cli/src/webserver/build/client/assets/{settings-COJUrwGu.js → settings-ConzHeiL.js} +1 -1
  115. package/codeyam-cli/src/webserver/build/client/assets/settings-LuiJ1UIm.js +1 -0
  116. package/codeyam-cli/src/webserver/build/client/assets/simulations-B9LRwAej.js +1 -0
  117. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-Lumm1t01.js → useLastLogLine-CpUcCv1V.js} +1 -1
  118. package/codeyam-cli/src/webserver/build/client/assets/useToast-DOxmMaSg.js +1 -0
  119. package/codeyam-cli/src/webserver/build/client/assets/{zap-BvukH0eN.js → zap-D5R1FAcH.js} +1 -1
  120. package/codeyam-cli/src/webserver/build/server/assets/index-DzbqTxoN.js +1 -0
  121. package/codeyam-cli/src/webserver/build/server/assets/server-build-DGGis3OZ.js +166 -0
  122. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  123. package/codeyam-cli/src/webserver/build-info.json +5 -5
  124. package/codeyam-cli/src/webserver/server.js +1 -1
  125. package/codeyam-cli/src/webserver/server.js.map +1 -1
  126. package/codeyam-cli/templates/codeyam-setup-skill.md +5 -0
  127. package/package.json +7 -7
  128. package/packages/ai/index.js +0 -1
  129. package/packages/ai/index.js.map +1 -1
  130. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +6 -15
  131. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  132. package/packages/ai/src/lib/astScopes/methodSemantics.js +134 -0
  133. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  134. package/packages/ai/src/lib/astScopes/paths.js +28 -3
  135. package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
  136. package/packages/ai/src/lib/astScopes/processExpression.js +99 -3
  137. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  138. package/packages/ai/src/lib/checkAllAttributes.js +1 -3
  139. package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
  140. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +308 -2
  141. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  142. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +12 -6
  143. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  144. package/packages/ai/src/lib/generateChangesEntityDocumentation.js +19 -1
  145. package/packages/ai/src/lib/generateChangesEntityDocumentation.js.map +1 -1
  146. package/packages/ai/src/lib/generateChangesEntityScenarioData.js +55 -156
  147. package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
  148. package/packages/ai/src/lib/generateChangesEntityScenarios.js +79 -262
  149. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  150. package/packages/ai/src/lib/generateEntityDocumentation.js +15 -1
  151. package/packages/ai/src/lib/generateEntityDocumentation.js.map +1 -1
  152. package/packages/ai/src/lib/generateEntityScenarioData.js +52 -152
  153. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  154. package/packages/ai/src/lib/generateEntityScenarios.js +88 -258
  155. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  156. package/packages/ai/src/lib/generateStatementAnalysis.js +46 -71
  157. package/packages/ai/src/lib/generateStatementAnalysis.js.map +1 -1
  158. package/packages/ai/src/lib/getLLMCallStats.js +0 -14
  159. package/packages/ai/src/lib/getLLMCallStats.js.map +1 -1
  160. package/packages/ai/src/lib/modelInfo.js +15 -0
  161. package/packages/ai/src/lib/modelInfo.js.map +1 -1
  162. package/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.js +8 -33
  163. package/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.js.map +1 -1
  164. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +35 -41
  165. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
  166. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +59 -72
  167. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  168. package/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.js +8 -27
  169. package/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.js.map +1 -1
  170. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +24 -27
  171. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  172. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +21 -22
  173. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
  174. package/packages/ai/src/lib/types/index.js +2 -0
  175. package/packages/ai/src/lib/types/index.js.map +1 -1
  176. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +16 -7
  177. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  178. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +28 -21
  179. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  180. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js +18 -11
  181. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js.map +1 -1
  182. package/packages/utils/index.js +1 -0
  183. package/packages/utils/index.js.map +1 -1
  184. package/packages/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
  185. package/packages/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  186. package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  187. package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  188. package/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  189. package/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  190. package/analyzer-template/packages/ai/src/lib/generateEntityDataMap.ts +0 -375
  191. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-rqv54FUY.js +0 -1
  192. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DqXXjAJ7.js +0 -3
  193. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DU_jxCPD.js +0 -1
  194. package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-5DY-YIxu.js +0 -6
  195. package/codeyam-cli/src/webserver/build/client/assets/_index-DvSrcxsk.js +0 -1
  196. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CsaMd9mb.js +0 -10
  197. package/codeyam-cli/src/webserver/build/client/assets/components-Dj-Ggnl2.js +0 -40
  198. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BbR3FwNc.js +0 -1
  199. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-L7M9Vr5z.js +0 -1
  200. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-C9w-q7P3.js +0 -5
  201. package/codeyam-cli/src/webserver/build/client/assets/entry.client-CdGoUs8A.js +0 -1
  202. package/codeyam-cli/src/webserver/build/client/assets/file-text-B6Er7j5k.js +0 -1
  203. package/codeyam-cli/src/webserver/build/client/assets/files-KcDVw1FY.js +0 -1
  204. package/codeyam-cli/src/webserver/build/client/assets/git-B9uZ8eSJ.js +0 -12
  205. package/codeyam-cli/src/webserver/build/client/assets/globals-B0f88RTV.css +0 -1
  206. package/codeyam-cli/src/webserver/build/client/assets/manifest-fca08d7e.js +0 -1
  207. package/codeyam-cli/src/webserver/build/client/assets/root-Cf8VBqIb.js +0 -16
  208. package/codeyam-cli/src/webserver/build/client/assets/settings-NU_ZquhK.js +0 -1
  209. package/codeyam-cli/src/webserver/build/client/assets/simulations-CNaMJ-nR.js +0 -1
  210. package/codeyam-cli/src/webserver/build/client/assets/useToast-BRShB17p.js +0 -1
  211. package/codeyam-cli/src/webserver/build/client/cy-logo-cli.svg +0 -13
  212. package/codeyam-cli/src/webserver/build/client/favicon.svg +0 -13
  213. package/codeyam-cli/src/webserver/build/server/assets/index-DHr4rT4u.js +0 -1
  214. package/codeyam-cli/src/webserver/build/server/assets/server-build-Bi1mj14J.js +0 -166
  215. package/codeyam-cli/src/webserver/public/cy-logo-cli.svg +0 -13
  216. package/codeyam-cli/src/webserver/public/favicon.svg +0 -13
  217. package/packages/ai/src/lib/generateEntityDataMap.js +0 -335
  218. package/packages/ai/src/lib/generateEntityDataMap.js.map +0 -1
  219. package/packages/ai/src/lib/promptGenerators/generateEntityDataMapGenerator.js +0 -17
  220. package/packages/ai/src/lib/promptGenerators/generateEntityDataMapGenerator.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  {
2
- "buildTimestamp": "2025-12-09T21:06:56.685Z",
3
- "buildTime": 1765314416685,
4
- "gitCommit": "8afd3ee021d3d54ad4b194a574ae3bcd6427b53f",
2
+ "buildTimestamp": "2025-12-11T19:58:38.049Z",
3
+ "buildTime": 1765483118049,
4
+ "gitCommit": "09652b804d2c3f3bc36b68a17478631e582f31af",
5
5
  "nodeVersion": "v20.19.6",
6
- "contentHash": "131ce1b86de761d815eb9d47d321d6959a13627b88b736f0e01a873d6f68e719",
7
- "buildNumber": 47,
8
- "semanticVersion": "0.1.47",
9
- "version": "0.1.47 (2025-12-09T21:06+131ce1b)"
6
+ "contentHash": "6e8c56946bdcea6f1963d242e2b564537497d45ca94380cb79761d60d176e37e",
7
+ "buildNumber": 70,
8
+ "semanticVersion": "0.1.70",
9
+ "version": "0.1.70 (2025-12-11T19:58+6e8c569)"
10
10
  }
@@ -1,7 +1,7 @@
1
1
 
2
- [12/9/2025, 9:06:56 PM] > codeyam-combo@1.0.0 mergeDependencies
3
- [12/9/2025, 9:06:56 PM] > node ./scripts/mergePackageJsonFiles.cjs
2
+ [12/11/2025, 7:58:37 PM] > codeyam-combo@1.0.0 mergeDependencies
3
+ [12/11/2025, 7:58:37 PM] > node ./scripts/mergePackageJsonFiles.cjs
4
4
 
5
5
 
6
- [12/9/2025, 9:06:56 PM] Merged dependencies into root package.json
6
+ [12/11/2025, 7:58:38 PM] Merged dependencies into root package.json
7
7
 
@@ -24,7 +24,7 @@
24
24
  "@supabase/supabase-js": "2.52.1",
25
25
  "domhandler": "^5.0.3",
26
26
  "dotenv": "^17.2.3",
27
- "express": "^5.2.0",
27
+ "express": "^5.2.1",
28
28
  "get-port": "^7.1.0",
29
29
  "htmlparser2": "^10.0.0",
30
30
  "jest": "^30.2.0",
@@ -13,7 +13,6 @@ export { default as generateEntityDocumentation } from './src/lib/generateEntity
13
13
  export { default as generateChangesEntityDocumentation } from './src/lib/generateChangesEntityDocumentation';
14
14
  export { default as codeQualityEntityAnalysis } from './src/lib/codeQualityEntityAnalysis';
15
15
  export { default as summarizeDiff } from './src/lib/summarizeDiff';
16
- export { default as generateEntityDataMap } from './src/lib/generateEntityDataMap';
17
16
  export { default as generateEntityDataStructure } from './src/lib/generateEntityDataStructure';
18
17
  export { default as generateEntityScenarios } from './src/lib/generateEntityScenarios';
19
18
  export {
@@ -0,0 +1,424 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AI Test Matrix Runner
4
+ *
5
+ * Runs AI test suites across multiple models with configurable concurrency.
6
+ * Outputs JSON results for analysis.
7
+ *
8
+ * Usage:
9
+ * node packages/ai/scripts/ai-test-matrix.mjs [options]
10
+ *
11
+ * Options:
12
+ * --test, -t Test file pattern (default: all ai_tests)
13
+ * --models, -m Comma-separated model list (default: see MODELS below)
14
+ * --runs, -r Number of runs per model (default: 1, useful for flakiness detection)
15
+ * --concurrency Max concurrent test runs (default: 4)
16
+ * --output, -o Output file for results JSON (default: stdout)
17
+ *
18
+ * Examples:
19
+ * node packages/ai/scripts/ai-test-matrix.mjs -t generateStatementAnalysis
20
+ * node packages/ai/scripts/ai-test-matrix.mjs -m "gpt-4.1-mini,claude-sonnet-4-20250514" -r 3
21
+ */
22
+
23
+ import { spawn } from 'node:child_process';
24
+ import { writeFile } from 'node:fs/promises';
25
+ import { parseArgs } from 'node:util';
26
+
27
+ const MODELS = [
28
+ // OpenAI
29
+ 'openai/gpt-5',
30
+ 'openai/gpt-5-mini',
31
+ 'openai/gpt-5-nano',
32
+ 'openai/gpt-4.1',
33
+ 'openai/gpt-4.1-mini',
34
+ 'openai/gpt-4o',
35
+ 'openai/gpt-4o-mini',
36
+
37
+ // Groq
38
+ 'openai/gpt-oss-120b-groq',
39
+
40
+ // DeepInfra
41
+ 'openai/gpt-oss-120b-deepinfra',
42
+ 'qwen/qwen3-235b-instruct-deepinfra',
43
+ 'qwen/qwen3-coder-480b-instruct-deepinfra',
44
+ 'google/gemini-2.5-pro-deepinfra',
45
+ 'google/gemini-2.5-flash-deepinfra',
46
+
47
+ // OpenRouter
48
+ 'google/gemini-2.5-flash-lite-openrouter',
49
+ 'meta-llama/llama-4-maverick-openrouter',
50
+ 'deepseek/v3.1-terminus-openrouter',
51
+
52
+ // Anthropic
53
+ 'anthropic/claude-4.5-haiku',
54
+ 'anthropic/claude-4.5-sonnet',
55
+ 'anthropic/claude-4.5-opus',
56
+ ];
57
+
58
+ const AI_TESTS_DIR = 'packages/ai/src/lib/__tests__/ai_tests';
59
+
60
+ // Tests excluded from default runs (low signal-to-noise ratio)
61
+ const EXCLUDED_TESTS = [
62
+ 'generateStatementAnalysis',
63
+ 'generateEntityDataStructure',
64
+ ];
65
+
66
+ const HELP_TEXT = `
67
+ AI Test Matrix Runner
68
+
69
+ Runs AI test suites across multiple models with configurable concurrency.
70
+ Outputs JSON results for analysis.
71
+
72
+ Usage:
73
+ node packages/ai/scripts/ai-test-matrix.mjs [options]
74
+
75
+ Options:
76
+ --test, -t Test file pattern (default: all ai_tests)
77
+ --models, -m Comma-separated model list (default: ${MODELS.join(', ')})
78
+ --runs, -r Number of runs per model (default: 1, useful for flakiness detection)
79
+ --concurrency Max concurrent test runs (default: 4)
80
+ --output, -o Output file for results JSON (default: stdout)
81
+ --help, -h Show this help message
82
+
83
+ Examples:
84
+ node packages/ai/scripts/ai-test-matrix.mjs -t generateStatementAnalysis
85
+ node packages/ai/scripts/ai-test-matrix.mjs -m "gpt-4.1-mini,claude-sonnet-4-20250514" -r 3
86
+ `;
87
+
88
+ function parseCliArgs() {
89
+ const { values } = parseArgs({
90
+ options: {
91
+ test: { type: 'string', short: 't', default: '' },
92
+ models: { type: 'string', short: 'm', default: '' },
93
+ runs: { type: 'string', short: 'r', default: '1' },
94
+ concurrency: { type: 'string', default: '4' },
95
+ output: { type: 'string', short: 'o', default: '' },
96
+ help: { type: 'boolean', short: 'h', default: false },
97
+ },
98
+ });
99
+
100
+ if (values.help) {
101
+ console.log(HELP_TEXT);
102
+ process.exit(0);
103
+ }
104
+
105
+ return {
106
+ testPattern: values.test || '',
107
+ models: values.models ? values.models.split(',').map((m) => m.trim()) : MODELS,
108
+ runs: parseInt(values.runs, 10),
109
+ concurrency: parseInt(values.concurrency, 10),
110
+ outputFile: values.output || '',
111
+ };
112
+ }
113
+
114
+ /**
115
+ * Run jest with JSON output and return parsed results
116
+ */
117
+ async function runJest(model, testPattern, ignorePatterns = []) {
118
+ const testPath = testPattern
119
+ ? `${AI_TESTS_DIR}/${testPattern}.test.ts`
120
+ : AI_TESTS_DIR;
121
+
122
+ const jestArgs = ['jest', '--config', 'jest.config.ai.ts', '--json', testPath];
123
+
124
+ // Add --testPathIgnorePatterns for excluded tests
125
+ for (const pattern of ignorePatterns) {
126
+ jestArgs.push('--testPathIgnorePatterns', pattern);
127
+ }
128
+
129
+ return new Promise((resolve) => {
130
+ const startTime = Date.now();
131
+ const proc = spawn('npx', jestArgs, {
132
+ env: { ...process.env, CODEYAM_TEST_MODEL: model },
133
+ stdio: ['ignore', 'pipe', 'pipe'],
134
+ }
135
+ );
136
+
137
+ let stdout = '';
138
+ let stderr = '';
139
+
140
+ proc.stdout.on('data', (data) => {
141
+ stdout += data.toString();
142
+ });
143
+ proc.stderr.on('data', (data) => {
144
+ stderr += data.toString();
145
+ });
146
+
147
+ proc.on('close', (exitCode) => {
148
+ const duration = Date.now() - startTime;
149
+
150
+ // Jest outputs JSON to stdout, but may include non-JSON lines
151
+ // Find the JSON object in the output
152
+ let jsonResult = null;
153
+ try {
154
+ const jsonMatch = stdout.match(/^\{[\s\S]*\}$/m);
155
+ if (jsonMatch) {
156
+ jsonResult = JSON.parse(jsonMatch[0]);
157
+ }
158
+ } catch {
159
+ // JSON parse failed
160
+ }
161
+
162
+ if (jsonResult) {
163
+ resolve({
164
+ success: exitCode === 0,
165
+ model,
166
+ duration,
167
+ numTotalTests: jsonResult.numTotalTests,
168
+ numPassedTests: jsonResult.numPassedTests,
169
+ numFailedTests: jsonResult.numFailedTests,
170
+ testResults: jsonResult.testResults.map((tr) => {
171
+ const passed = tr.assertionResults.filter((ar) => ar.status === 'passed').length;
172
+ const failed = tr.assertionResults.filter((ar) => ar.status === 'failed').length;
173
+ return {
174
+ file: tr.name.replace(/.*ai_tests\//, ''),
175
+ passed,
176
+ failed,
177
+ failures: tr.assertionResults
178
+ .filter((ar) => ar.status === 'failed')
179
+ .map((ar) => ({
180
+ name: ar.title,
181
+ message: ar.failureMessages?.[0]?.slice(0, 500) || '',
182
+ })),
183
+ };
184
+ }),
185
+ });
186
+ } else {
187
+ resolve({
188
+ success: false,
189
+ model,
190
+ duration,
191
+ error: 'Failed to parse Jest JSON output',
192
+ stderr: stderr.slice(0, 1000),
193
+ });
194
+ }
195
+ });
196
+ });
197
+ }
198
+
199
+ /**
200
+ * Run tasks with limited concurrency
201
+ */
202
+ async function runWithConcurrency(tasks, concurrency) {
203
+ const results = [];
204
+ const executing = new Set();
205
+
206
+ for (const task of tasks) {
207
+ const promise = task().then((result) => {
208
+ executing.delete(promise);
209
+ return result;
210
+ });
211
+ executing.add(promise);
212
+ results.push(promise);
213
+
214
+ if (executing.size >= concurrency) {
215
+ await Promise.race(executing);
216
+ }
217
+ }
218
+
219
+ return Promise.all(results);
220
+ }
221
+
222
+ /**
223
+ * Aggregate results for summary statistics
224
+ */
225
+ function aggregateResults(results, models, runs) {
226
+ const byModel = {};
227
+
228
+ for (const model of models) {
229
+ const modelResults = results.filter((r) => r.model === model);
230
+ const cleanRuns = modelResults.filter((r) => r.numFailedTests === 0).length;
231
+ const totalPassed = modelResults.reduce((sum, r) => sum + (r.numPassedTests || 0), 0);
232
+ const totalTests = modelResults.reduce((sum, r) => sum + (r.numTotalTests || 0), 0);
233
+
234
+ byModel[model] = {
235
+ runs: modelResults.length,
236
+ cleanRuns,
237
+ testsTotal: totalTests,
238
+ testsPassed: totalPassed,
239
+ testPassRate: totalTests > 0 ? ((totalPassed / totalTests) * 100).toFixed(1) + '%' : 'N/A',
240
+ avgDuration: Math.round(
241
+ modelResults.reduce((sum, r) => sum + r.duration, 0) / modelResults.length
242
+ ),
243
+ // Flakiness: tests that passed in some runs but failed in others
244
+ flakyTests: runs > 1 ? findFlakyTests(modelResults) : [],
245
+ };
246
+ }
247
+
248
+ return byModel;
249
+ }
250
+
251
+ /**
252
+ * Find tests that passed in some runs but failed in others
253
+ */
254
+ function findFlakyTests(modelResults) {
255
+ const testOutcomes = new Map();
256
+
257
+ for (const result of modelResults) {
258
+ if (!result.testResults) continue;
259
+
260
+ for (const tr of result.testResults) {
261
+ for (const failure of tr.failures || []) {
262
+ const key = `${tr.file}:${failure.name}`;
263
+ if (!testOutcomes.has(key)) {
264
+ testOutcomes.set(key, { passed: 0, failed: 0 });
265
+ }
266
+ testOutcomes.get(key).failed++;
267
+ }
268
+ }
269
+ }
270
+
271
+ // Mark passed for tests not in failures
272
+ const totalRuns = modelResults.length;
273
+ const flaky = [];
274
+
275
+ for (const [test, outcomes] of testOutcomes) {
276
+ outcomes.passed = totalRuns - outcomes.failed;
277
+ if (outcomes.passed > 0 && outcomes.failed > 0) {
278
+ flaky.push({
279
+ test,
280
+ passRate: ((outcomes.passed / totalRuns) * 100).toFixed(0) + '%',
281
+ });
282
+ }
283
+ }
284
+
285
+ return flaky;
286
+ }
287
+
288
+ async function main() {
289
+ const config = parseCliArgs();
290
+
291
+ console.error(`🧪 AI Test Matrix Runner`);
292
+ console.error(` Models: ${config.models.join(', ')}`);
293
+ console.error(` Runs per model: ${config.runs}`);
294
+ console.error(` Concurrency: ${config.concurrency}`);
295
+ console.error(` Test pattern: ${config.testPattern || '(all ai_tests)'}`);
296
+
297
+ // When running all tests (no specific pattern), exclude noisy tests
298
+ const ignorePatterns = config.testPattern ? [] : EXCLUDED_TESTS;
299
+ if (ignorePatterns.length > 0) {
300
+ console.error(` Excluding: ${ignorePatterns.join(', ')}`);
301
+ }
302
+ console.error('');
303
+
304
+ // Build task list
305
+ const tasks = [];
306
+ for (const model of config.models) {
307
+ for (let run = 0; run < config.runs; run++) {
308
+ tasks.push(async () => {
309
+ const runLabel = config.runs > 1 ? ` (run ${run + 1}/${config.runs})` : '';
310
+ console.error(`⏳ Starting: ${model}${runLabel}`);
311
+ const result = await runJest(model, config.testPattern, ignorePatterns);
312
+ const status = result.numFailedTests === 0 ? '✅' : '❌';
313
+ console.error(
314
+ `${status} Finished: ${model}${runLabel} - ${result.numPassedTests}/${result.numTotalTests} passed (${result.duration}ms)`
315
+ );
316
+ return { ...result, runIndex: run };
317
+ });
318
+ }
319
+ }
320
+
321
+ const results = await runWithConcurrency(tasks, config.concurrency);
322
+ const summary = aggregateResults(results, config.models, config.runs);
323
+
324
+ const output = {
325
+ timestamp: new Date().toISOString(),
326
+ config: {
327
+ testPattern: config.testPattern || '(all)',
328
+ models: config.models,
329
+ runs: config.runs,
330
+ },
331
+ summary,
332
+ results,
333
+ };
334
+
335
+ const jsonOutput = JSON.stringify(output, null, 2);
336
+
337
+ if (config.outputFile) {
338
+ await writeFile(config.outputFile, jsonOutput);
339
+ console.error(`\n📄 Results written to ${config.outputFile}`);
340
+ } else {
341
+ console.log(jsonOutput);
342
+ }
343
+
344
+ // Print summary table to stderr
345
+ console.error('\n📊 Summary:');
346
+ console.error('─'.repeat(70));
347
+ for (const [model, stats] of Object.entries(summary)) {
348
+ console.error(
349
+ `${model.padEnd(40)} ${stats.testPassRate.padStart(6)} (${stats.testsPassed}/${stats.testsTotal}) | ${stats.avgDuration}ms`
350
+ );
351
+ if (stats.flakyTests.length > 0) {
352
+ console.error(` ⚠️ Flaky: ${stats.flakyTests.map((f) => f.test).join(', ')}`);
353
+ }
354
+ }
355
+ console.error('─'.repeat(70));
356
+
357
+ // Print matrix view (models × test files)
358
+ printMatrix(results, config.models);
359
+ }
360
+
361
+ /**
362
+ * Print a matrix view: test files (rows) × models (columns)
363
+ */
364
+ function printMatrix(results, models) {
365
+ // Collect all test files across all results
366
+ const testFiles = new Set();
367
+ for (const result of results) {
368
+ if (!result.testResults) continue;
369
+ for (const tr of result.testResults) {
370
+ testFiles.add(tr.file);
371
+ }
372
+ }
373
+
374
+ if (testFiles.size === 0) return;
375
+
376
+ const sortedFiles = [...testFiles].sort();
377
+
378
+ // Compute column widths
379
+ const fileColWidth = Math.max(30, ...sortedFiles.map((f) => f.replace('.test.ts', '').length + 2));
380
+ const modelColWidth = 12;
381
+
382
+ // Shorten model names for display
383
+ const shortModelName = (m) => {
384
+ const parts = m.split('/');
385
+ return parts[parts.length - 1].slice(0, modelColWidth - 1);
386
+ };
387
+
388
+ console.error('\n📋 Matrix (test files × models):');
389
+ console.error('─'.repeat(fileColWidth + models.length * (modelColWidth + 1)));
390
+
391
+ // Header row
392
+ const header = ''.padEnd(fileColWidth) + models.map((m) => shortModelName(m).padStart(modelColWidth)).join(' ');
393
+ console.error(header);
394
+ console.error('─'.repeat(fileColWidth + models.length * (modelColWidth + 1)));
395
+
396
+ // Data rows
397
+ for (const file of sortedFiles) {
398
+ const shortFile = file.replace('.test.ts', '');
399
+ let row = shortFile.padEnd(fileColWidth);
400
+
401
+ for (const model of models) {
402
+ // Find result for this model (use first run if multiple)
403
+ const result = results.find((r) => r.model === model);
404
+ const tr = result?.testResults?.find((t) => t.file === file);
405
+
406
+ if (tr) {
407
+ const total = tr.passed + tr.failed;
408
+ const cell = `${tr.passed}/${total}`;
409
+ row += cell.padStart(modelColWidth) + ' ';
410
+ } else {
411
+ row += '-'.padStart(modelColWidth) + ' ';
412
+ }
413
+ }
414
+
415
+ console.error(row);
416
+ }
417
+
418
+ console.error('─'.repeat(fileColWidth + models.length * (modelColWidth + 1)));
419
+ }
420
+
421
+ main().catch((err) => {
422
+ console.error('Fatal error:', err);
423
+ process.exit(1);
424
+ });
@@ -170,17 +170,6 @@ export class ASTScopeAnalyzer {
170
170
  // console.info('SOURCEFILE', this.sourceFile.getText());
171
171
  // console.info('RANGE', this.statementInfo.start, this.statementInfo.end, this.sourceFile.getText().slice(this.statementInfo.start, this.statementInfo.end));
172
172
 
173
- // console.info('RELEVANT NODES:\n\n', this.statementInfo.text);
174
- // relevantNodes.forEach((node, i) =>
175
- // console.info(`RELEVANT NODE ${i}`, node.getText(this.sourceFile)),
176
- // );
177
-
178
- // console.info(
179
- // 'CHILD BOUNDARIES',
180
- // this.statementInfo.childBoundaries.map((b) =>
181
- // this.sourceFile.getText().slice(b.start, b.end),
182
- // ),
183
- // );
184
173
  this.processNodes(relevantNodes, context);
185
174
 
186
175
  // for (const childBoundary of this.statementInfo.childBoundaries) {
@@ -285,12 +274,13 @@ export class ASTScopeAnalyzer {
285
274
  node: ts.Node,
286
275
  sourceFile: ts.SourceFile,
287
276
  ): { nodeStart: number; nodeEnd: number } {
288
- const sourceText = sourceFile.text;
289
- const sourceGetText = sourceFile.getText();
290
- const leadingContentOffset = sourceText.length - sourceGetText.length;
277
+ // Use getStart(sourceFile) to get the position after leading trivia.
278
+ // Note: We intentionally don't adjust for leadingContentOffset here because
279
+ // the positions from isolateStatements are calculated using getStart() too,
280
+ // which uses the same sourceFile.text coordinate system.
291
281
  return {
292
- nodeStart: node.getStart(sourceFile) - leadingContentOffset,
293
- nodeEnd: node.getEnd() - leadingContentOffset,
282
+ nodeStart: node.getStart(sourceFile),
283
+ nodeEnd: node.getEnd(),
294
284
  };
295
285
  }
296
286