@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
@@ -1,3 +1,4 @@
1
+ export { default as Semaphore } from './src/lib/Semaphore';
1
2
  export { default as isRemixRoute } from './src/lib/frameworks/isRemixRoute';
2
3
  export { default as isNextRoute } from './src/lib/frameworks/isNextRoute';
3
4
  export { default as isFrameworkRoute } from './src/lib/frameworks/isFrameworkRoute';
@@ -7,6 +8,7 @@ export { default as frameworkRouteFileNameToRoute } from './src/lib/frameworks/f
7
8
  export { default as getRemixRoutePath } from './src/lib/frameworks/getRemixRoutePath';
8
9
  export { default as getNextRoutePath } from './src/lib/frameworks/getNextRoutePath';
9
10
  export { default as getFrameworkRoutePath } from './src/lib/frameworks/getFrameworkRoutePath';
11
+ export { default as sanitizeNextRouteSegments } from './src/lib/frameworks/sanitizeNextRouteSegments';
10
12
  export { default as safeFileName } from './src/lib/safeFileName';
11
13
  export { default as normalizeKey } from './src/lib/normalizeKey';
12
14
  export {
@@ -0,0 +1,42 @@
1
+ /**
2
+ * An async semaphore for limiting concurrent access to a resource.
3
+ *
4
+ * Useful for controlling parallelism when some operations are CPU-bound
5
+ * and shouldn't all run simultaneously, while allowing I/O-bound operations
6
+ * to proceed freely.
7
+ */
8
+ export default class Semaphore {
9
+ private count: number;
10
+ private waiting: Array<() => void> = [];
11
+
12
+ constructor(count: number) {
13
+ this.count = count;
14
+ }
15
+
16
+ /**
17
+ * Acquire a permit from the semaphore.
18
+ * If a permit is available, returns immediately.
19
+ * Otherwise, blocks until a permit becomes available.
20
+ */
21
+ async acquire(): Promise<void> {
22
+ if (this.count > 0) {
23
+ this.count--;
24
+ return;
25
+ }
26
+ await new Promise<void>((resolve) => this.waiting.push(resolve));
27
+ }
28
+
29
+ /**
30
+ * Release a permit back to the semaphore.
31
+ * If there are waiters, the first one in line gets the permit.
32
+ * Otherwise, increments the available count.
33
+ */
34
+ release(): void {
35
+ const next = this.waiting.shift();
36
+ if (next) {
37
+ next();
38
+ } else {
39
+ this.count++;
40
+ }
41
+ }
42
+ }
@@ -1,4 +1,4 @@
1
- import { safeFileName } from '~codeyam/utils';
1
+ import { getAppDirectoryForFile, safeFileName } from '~codeyam/utils';
2
2
  import {
3
3
  Analysis,
4
4
  ReadonlyEntity,
@@ -7,6 +7,7 @@ import {
7
7
  ProjectFramework,
8
8
  } from '~codeyam/types';
9
9
  import { PROJECT_RELATIVE_PATH } from '~codeyam/utils';
10
+ import sanitizeNextRouteSegments from './sanitizeNextRouteSegments';
10
11
 
11
12
  export default function getNextRoutePath({
12
13
  file,
@@ -24,11 +25,15 @@ export default function getNextRoutePath({
24
25
  framework: ProjectFramework;
25
26
  scenario?: { name: string };
26
27
  }) {
27
- const routePath = file.path.split('/').slice(1);
28
+ const routePath = sanitizeNextRouteSegments(file.path.split('/').slice(1));
28
29
  const scenarioSlug = scenario ? safeFileName(scenario.name) : undefined;
30
+ const appDirectory = getAppDirectoryForFile(
31
+ file.path,
32
+ project.metadata?.webapps,
33
+ );
29
34
  const pathComponents = [
30
35
  PROJECT_RELATIVE_PATH,
31
- 'app',
36
+ appDirectory,
32
37
  'static',
33
38
  project.slug,
34
39
  rootAnalysis.id,
@@ -31,7 +31,8 @@ export default function getRemixRoutePath({
31
31
  const route = file.path.slice(routesIndex);
32
32
  const cleanRoute = route
33
33
  .replace(/\//g, '.')
34
- .replace('$', '')
34
+ .replace(/\$(\w+)/g, '$1') // $slug -> slug (named params)
35
+ .replace(/\$/g, 'splat') // bare $ -> splat (catch-all)
35
36
  .replace(/_/g, 'x');
36
37
 
37
38
  const scenarioSlug = scenario ? `.${safeFileName(scenario.name)}` : '';
@@ -1,5 +1,6 @@
1
1
  import { Analysis, File } from '~codeyam/types';
2
2
  import safeFileName from '../safeFileName';
3
+ import sanitizeNextRouteSegments from './sanitizeNextRouteSegments';
3
4
 
4
5
  export default function nextRouteFileNameToRoute(
5
6
  projectSlug: string,
@@ -7,7 +8,7 @@ export default function nextRouteFileNameToRoute(
7
8
  analysis: Analysis,
8
9
  scenarioName?: string,
9
10
  ) {
10
- const route = file.path.split('/').slice(1, -1);
11
+ const route = sanitizeNextRouteSegments(file.path.split('/').slice(1, -1));
11
12
  const pathComponents = [
12
13
  'static',
13
14
  projectSlug,
@@ -20,6 +20,7 @@ export default function remixRouteFileNameToRoute(
20
20
  .replace(/\(\$(\w+)\)/g, '$1')
21
21
  .replace(/\$(\w+)/g, '$1')
22
22
  .replace(/\((\w+)\)/g, '$1')
23
+ .replace(/\$/g, 'splat')
23
24
  .replace(/_/g, 'x'),
24
25
  'default',
25
26
  ].filter(Boolean);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Sanitize Next.js route path segments to remove special syntax.
3
+ * - Route groups (folder) become folder (strip parens, keep name)
4
+ * - Dynamic segments [param] become param0 (suffix avoids Next.js private folder convention)
5
+ * - Catch-all [...slug] becomes slug0
6
+ * - Optional catch-all [[...slug]] becomes slug0
7
+ *
8
+ * Note: We use suffix "0" instead of prefix "_" because Next.js treats folders
9
+ * starting with underscore as private segments that are excluded from routing.
10
+ */
11
+ export default function sanitizeNextRouteSegments(
12
+ segments: string[],
13
+ ): string[] {
14
+ return segments.map((segment) => {
15
+ // Handle route groups (folder) - strip parens, keep name
16
+ const routeGroup = segment.match(/^\(([^)]+)\)$/);
17
+ if (routeGroup) return routeGroup[1];
18
+
19
+ // Handle optional catch-all [[...param]]
20
+ const optionalCatchAll = segment.match(/^\[\[\.\.\.([\w]+)\]\]$/);
21
+ if (optionalCatchAll) return `${optionalCatchAll[1]}0`;
22
+
23
+ // Handle catch-all [...param]
24
+ const catchAll = segment.match(/^\[\.\.\.([\w]+)\]$/);
25
+ if (catchAll) return `${catchAll[1]}0`;
26
+
27
+ // Handle dynamic [param]
28
+ const dynamic = segment.match(/^\[([\w]+)\]$/);
29
+ if (dynamic) return `${dynamic[1]}0`;
30
+
31
+ return segment;
32
+ });
33
+ }
@@ -18,6 +18,7 @@ interface ReturnValuePart {
18
18
  nested?: ReturnValuePart[];
19
19
  isAsyncFunction?: boolean;
20
20
  isStructural?: boolean;
21
+ hasNoReturnData?: boolean; // true when function has only signature entries, no functionCallReturnValue
21
22
  // Maps literal argument values to their specific nested structures for conditional dispatch
22
23
  argVariants?: Map<string, ReturnValuePart[]>;
23
24
  }
@@ -273,7 +274,15 @@ export default function constructMockCode(
273
274
  }
274
275
 
275
276
  const addReturnValueFunctionAccessor = (dataPath: string) => {
276
- if (returnValue.returnsFunctionArgs) {
277
+ // Add function call accessor if:
278
+ // - There are actual arguments, OR
279
+ // - This is a callable (not a method that returns an array directly)
280
+ // For methods like getAll() that return arrays, the data is at ["getAll()"] not ["getAll()"]["()"]
281
+ if (
282
+ returnValue.returnsFunctionArgs &&
283
+ (returnValue.returnsFunctionArgs.length > 0 ||
284
+ !returnValue.returnsFunctionArray)
285
+ ) {
277
286
  if (returnValue.isArray) {
278
287
  dataPath = `${dataPath}${optionalAccess('[0]')}`;
279
288
  }
@@ -313,6 +322,7 @@ export default function constructMockCode(
313
322
  returnsFunctionArgs,
314
323
  returnsFunctionArray,
315
324
  isAsyncFunction,
325
+ hasNoReturnData,
316
326
  } = returnValue;
317
327
 
318
328
  const nestedContent: (string | undefined)[] = (nested ?? []).map(
@@ -325,9 +335,53 @@ export default function constructMockCode(
325
335
  },
326
336
  );
327
337
 
338
+ // Array prototype methods that should be ignored when building mocks
339
+ // (these work on any array - we don't need to mock them)
340
+ const ARRAY_PROTOTYPE_METHODS = new Set([
341
+ 'at',
342
+ 'concat',
343
+ 'copyWithin',
344
+ 'entries',
345
+ 'every',
346
+ 'fill',
347
+ 'filter',
348
+ 'find',
349
+ 'findIndex',
350
+ 'findLast',
351
+ 'findLastIndex',
352
+ 'flat',
353
+ 'flatMap',
354
+ 'forEach',
355
+ 'includes',
356
+ 'indexOf',
357
+ 'join',
358
+ 'keys',
359
+ 'lastIndexOf',
360
+ 'map',
361
+ 'pop',
362
+ 'push',
363
+ 'reduce',
364
+ 'reduceRight',
365
+ 'reverse',
366
+ 'shift',
367
+ 'slice',
368
+ 'some',
369
+ 'sort',
370
+ 'splice',
371
+ 'toLocaleString',
372
+ 'toReversed',
373
+ 'toSorted',
374
+ 'toSpliced',
375
+ 'toString',
376
+ 'unshift',
377
+ 'values',
378
+ 'with',
379
+ 'length',
380
+ ]);
381
+
328
382
  const levelContentItems = [];
329
383
  // Add spread for data paths when:
330
- // - Not a function returning an array
384
+ // - Not a function returning an array, OR function returns array with custom methods
331
385
  // - Has function args OR not an array
332
386
  // - Not structural, OR is a structural [0] element with nested content
333
387
  // (array elements with nested functions need their other properties spread)
@@ -336,8 +390,20 @@ export default function constructMockCode(
336
390
  returnValue.name === '[0]' &&
337
391
  nested &&
338
392
  nested.length > 0;
393
+ // Check if function returns array but has custom methods (not just array prototype methods)
394
+ // Excludes array indices like [0], [1], [] which are not methods
395
+ const hasCustomMethodsOnArrayReturn =
396
+ returnsFunctionArray &&
397
+ nested &&
398
+ nested.length > 0 &&
399
+ nested.some((n) => {
400
+ // Skip array indices - they're not methods
401
+ if (n.name.match(/^\[\d*\]$/)) return false;
402
+ const methodName = n.name.replace(/[<(].*$/, '');
403
+ return !ARRAY_PROTOTYPE_METHODS.has(methodName);
404
+ });
339
405
  if (
340
- !returnsFunctionArray &&
406
+ (!returnsFunctionArray || hasCustomMethodsOnArrayReturn) &&
341
407
  (returnsFunctionArgs || !isArray) &&
342
408
  (!returnValue.isStructural || isStructuralArrayElementWithNested)
343
409
  ) {
@@ -352,14 +418,35 @@ export default function constructMockCode(
352
418
  .join(', ');
353
419
  let funcContents = '';
354
420
  if (returnsFunctionArray) {
355
- if (levelContents.length === 0) {
421
+ if (hasNoReturnData) {
422
+ // Function has no return data (only signatures) - return empty array
423
+ funcContents = 'return []';
424
+ } else if (levelContents.length === 0 && dataPaths.length === 1) {
425
+ // When returning an array with no nested content, return the data path directly
426
+ // (the data path points to the array in scenario data)
427
+ funcContents = `return ${dataPaths[0]}`;
428
+ } else if (levelContents.length === 0) {
356
429
  funcContents = 'return []';
357
430
  } else {
358
431
  funcContents = `return [\n${indent(levelContents)}\n]`;
359
432
  }
360
433
  } else {
434
+ // Check if function has no actual return data (only signatures)
435
+ const hasNestedItems = nested && nested.length > 0;
436
+ const hasActualNestedContent =
437
+ nestedContent.filter(Boolean).length > 0;
438
+
361
439
  if (levelContentItems.length === 1 && dataPaths.length === 1) {
362
- funcContents = `return ${dataPaths[0]}`;
440
+ if (
441
+ hasNoReturnData ||
442
+ (hasNestedItems && !hasActualNestedContent)
443
+ ) {
444
+ // Function has no return data (only signatures) - return empty array
445
+ funcContents = 'return []';
446
+ } else {
447
+ // Has return data - return data path
448
+ funcContents = `return ${dataPaths[0]}`;
449
+ }
363
450
  } else {
364
451
  funcContents = `return {\n${indent(levelContents)}\n}`;
365
452
  }
@@ -372,6 +459,17 @@ export default function constructMockCode(
372
459
  }
373
460
  }
374
461
 
462
+ // Check if all nested items are array prototype methods
463
+ const hasOnlyArrayPrototypeMethods =
464
+ returnsFunctionArray &&
465
+ nested &&
466
+ nested.length > 0 &&
467
+ nested.every((n) => {
468
+ // Extract method name before type params and args (e.g., "reduce<...>(...)" -> "reduce")
469
+ const methodName = n.name.replace(/[<(].*$/, '');
470
+ return ARRAY_PROTOTYPE_METHODS.has(methodName);
471
+ });
472
+
375
473
  let returnValueContents = '';
376
474
  if (
377
475
  !returnsFunctionArgs &&
@@ -379,6 +477,16 @@ export default function constructMockCode(
379
477
  dataPaths.length === 1
380
478
  ) {
381
479
  returnValueContents = dataPaths[0];
480
+ } else if (
481
+ returnsFunctionArray &&
482
+ dataPaths.length === 1 &&
483
+ !root &&
484
+ (!nested || nested.length === 0 || hasOnlyArrayPrototypeMethods)
485
+ ) {
486
+ // Nested method returns an array - return the data path directly
487
+ // Only if nested content is empty or only contains array prototype methods
488
+ // (like .reduce() which work on any array - we don't need to mock them)
489
+ returnValueContents = dataPaths[0];
382
490
  } else {
383
491
  if (isArray) {
384
492
  // When GENERIC array (using []) has nested content (like functions that need wrapping),
@@ -687,6 +795,25 @@ export default function constructMockCode(
687
795
  if (returnValueSection.returnsFunctionArgs && value === 'array') {
688
796
  returnValueSection.returnsFunctionArray = true;
689
797
  }
798
+
799
+ // Check if this function call has actual return data in the schema
800
+ // If the path only has .signature entries (no .functionCallReturnValue), mark as no return data
801
+ // Use parts[i] (original part) instead of modified 'part' to include array indices like [1]
802
+ const functionCallPath = joinParenthesesAndArrays([
803
+ ...parts.slice(0, i),
804
+ parts[i], // Use original part which may include [1](args) together
805
+ ]);
806
+ // Check if there's a .functionCallReturnValue AFTER this function call path
807
+ const hasFunctionCallReturnValue = Object.keys(
808
+ relevantReturnValueSchema,
809
+ ).some((k) => {
810
+ if (!k.startsWith(functionCallPath)) return false;
811
+ const afterPath = k.slice(functionCallPath.length);
812
+ return afterPath.startsWith('.functionCallReturnValue');
813
+ });
814
+ if (!hasFunctionCallReturnValue) {
815
+ returnValueSection.hasNoReturnData = true;
816
+ }
690
817
  }
691
818
 
692
819
  if (nextIsDifferentiatedArray || hasNestedFunction) {
@@ -841,6 +968,26 @@ export default function constructMockCode(
841
968
  }
842
969
 
843
970
  if (!hasNestedFunction) {
971
+ // Before breaking, check if this function returns an array
972
+ // by looking for a functionCallReturnValue: 'array' entry in the schema
973
+ if (relevantPart && part.endsWith(')')) {
974
+ const functionReturnPath = joinParenthesesAndArrays([
975
+ ...parts.slice(0, i + 1),
976
+ RETURN_VALUE,
977
+ ]);
978
+ const returnType = relevantReturnValueSchema[functionReturnPath];
979
+ if (returnType === 'array') {
980
+ // Only set returnsFunctionArray if the array contains plain data,
981
+ // NOT if it contains functions (which need wrapping)
982
+ const arrayElementPath = `${functionReturnPath}[]`;
983
+ const arrayElementType =
984
+ relevantReturnValueSchema[arrayElementPath];
985
+ // If array element is a function, we need to wrap it - don't set returnsFunctionArray
986
+ if (arrayElementType !== 'function') {
987
+ relevantPart.returnsFunctionArray = true;
988
+ }
989
+ }
990
+ }
844
991
  break;
845
992
  }
846
993
 
@@ -884,7 +1031,24 @@ export default function constructMockCode(
884
1031
 
885
1032
  return `const ${mockNameParts[0]} = {\n${indent(returnParts.join(',\n'))}\n};`;
886
1033
  } else if (isFunction) {
887
- return `const ${mockName}ReturnValue = ${contents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${mockName}() {\n${indent(`return ${mockName}ReturnValue;`)}\n}`;
1034
+ // For headers() and cookies() from next/headers, add common iterator methods
1035
+ // These are needed when the mock is passed to functions that use .entries(), .keys(), etc.
1036
+ // (e.g., Object.fromEntries(headers.entries()) in buildLegacyHeaders)
1037
+ const needsIteratorMethods =
1038
+ mockName === 'headers' || mockName === 'cookies';
1039
+ let enhancedContents = contents;
1040
+ if (needsIteratorMethods && contents.trim().startsWith('{')) {
1041
+ // Add iterator methods that operate on the scenario data
1042
+ const iteratorMethods = `,
1043
+ entries: () => Object.entries(scenarios().data()?.["${mockName}()"] || {}),
1044
+ keys: () => Object.keys(scenarios().data()?.["${mockName}()"] || {}),
1045
+ values: () => Object.values(scenarios().data()?.["${mockName}()"] || {}),
1046
+ forEach: (fn) => Object.entries(scenarios().data()?.["${mockName}()"] || {}).forEach(([k, v]) => fn(v, k)),
1047
+ has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${mockName}()"] || {}, key)`;
1048
+ // Insert before the closing brace (handle trailing whitespace)
1049
+ enhancedContents = contents.replace(/\}\s*$/, iteratorMethods + '\n}');
1050
+ }
1051
+ return `const ${mockName}ReturnValue = ${enhancedContents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${mockName}() {\n${indent(`return ${mockName}ReturnValue;`)}\n}`;
888
1052
  } else {
889
1053
  return `const ${mockName} = ${contents}`;
890
1054
  }
@@ -46,8 +46,10 @@ export function reconcileMockDataKeys(
46
46
  * - Extract function name and first argument(s)
47
47
  * - Ignore the last argument value (could be literal or variable)
48
48
  * - Match based on the common prefix
49
+ * - If key has no parentheses, try matching with "()" appended
49
50
  *
50
51
  * e.g., "eq('user_id', 'user-12345')" matches "eq('user_id', user.id)"
52
+ * e.g., "getAll" matches "getAll()"
51
53
  */
52
54
  function findClosestKey(key: string, expectedKeys: string[]): string | null {
53
55
  const keyBase = extractKeyBase(key);
@@ -60,6 +62,17 @@ function findClosestKey(key: string, expectedKeys: string[]): string | null {
60
62
  }
61
63
  }
62
64
 
65
+ // If no match found and key has no parentheses, try matching with "()" appended
66
+ // This handles the case where LLM generates "getAll" but expected key is "getAll()"
67
+ if (!key.includes('(')) {
68
+ const keyWithParens = key + '()';
69
+ for (const expected of expectedKeys) {
70
+ if (expected === keyWithParens) {
71
+ return expected;
72
+ }
73
+ }
74
+ }
75
+
63
76
  return null;
64
77
  }
65
78
 
@@ -378,17 +378,7 @@ async function main({
378
378
  });
379
379
  updateBackgroundJobProgress(backgroundJob, {
380
380
  initiated: backgroundJob.progress.initiated,
381
- steps: [
382
- {
383
- name: 'build-project',
384
- initiated:
385
- backgroundJob.progress.steps.find(
386
- (s) => s.name === 'build-project',
387
- )?.initiated ?? new Date().toISOString(),
388
- error: error.message,
389
- completed: new Date().toISOString(),
390
- },
391
- ],
381
+ steps: [],
392
382
  completed: new Date().toISOString(),
393
383
  }).catch(() => {});
394
384
  }
@@ -24,6 +24,11 @@ import {
24
24
  } from '~codeyam/utils';
25
25
  import getAppPath from './getAppPath';
26
26
  import { restoreAllBackups, restoreFromBackup } from './backupFiles';
27
+ import {
28
+ readTrackingFile,
29
+ writeTrackingFile,
30
+ clearTrackingFile,
31
+ } from './trackGeneratedFiles';
27
32
  import captureLibraryFunctionDirect from './captureLibraryFunctionDirect';
28
33
  import {
29
34
  getFrameworkForComponent,
@@ -79,6 +84,21 @@ export async function startScenarioCapture({
79
84
  restoreAllBackups(fullPath);
80
85
  }
81
86
 
87
+ // Clean up any leftover generated files from previous debug sessions
88
+ const previouslyTracked = readTrackingFile();
89
+ if (previouslyTracked) {
90
+ awsLog('CodeYam: Cleaning up files from previous session', {
91
+ generatedCount: previouslyTracked.generatedFiles.length,
92
+ backupCount: previouslyTracked.backupFiles.length,
93
+ timestamp: previouslyTracked.timestamp,
94
+ });
95
+ removeScenario(previouslyTracked.generatedFiles);
96
+ for (const backupPath of previouslyTracked.backupFiles) {
97
+ restoreFromBackup(backupPath);
98
+ }
99
+ clearTrackingFile();
100
+ }
101
+
82
102
  const sortedReadyToBeCaptured = readyToBeCaptured.sort((a, b) => {
83
103
  if (a.indirect !== b.indirect) {
84
104
  return a.indirect ? 1 : -1;
@@ -446,6 +466,9 @@ export async function startScenarioCapture({
446
466
  controller?.port,
447
467
  );
448
468
  allGeneratedFiles.push(codeyamPagePath);
469
+
470
+ // Persist file tracking for crash/debug recovery
471
+ writeTrackingFile(allGeneratedFiles, backupFiles);
449
472
  }
450
473
 
451
474
  // Skip if no scenarios to capture
@@ -565,6 +588,7 @@ export async function startScenarioCapture({
565
588
  for (const backupPath of backupsToRestore) {
566
589
  restoreFromBackup(backupPath);
567
590
  }
591
+ clearTrackingFile();
568
592
  }
569
593
  };
570
594
 
@@ -0,0 +1,41 @@
1
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
2
+
3
+ const TRACKING_FILE_PATH = '../project/.codeyam-generated-files.json';
4
+
5
+ export interface TrackedFiles {
6
+ generatedFiles: string[];
7
+ backupFiles: string[];
8
+ timestamp: string;
9
+ }
10
+
11
+ export function getTrackingFilePath(): string {
12
+ return TRACKING_FILE_PATH;
13
+ }
14
+
15
+ export function writeTrackingFile(
16
+ generatedFiles: string[],
17
+ backupFiles: string[],
18
+ ): void {
19
+ const data: TrackedFiles = {
20
+ generatedFiles,
21
+ backupFiles,
22
+ timestamp: new Date().toISOString(),
23
+ };
24
+ writeFileSync(TRACKING_FILE_PATH, JSON.stringify(data, null, 2), 'utf8');
25
+ }
26
+
27
+ export function readTrackingFile(): TrackedFiles | null {
28
+ if (!existsSync(TRACKING_FILE_PATH)) return null;
29
+ try {
30
+ const content = readFileSync(TRACKING_FILE_PATH, 'utf8');
31
+ return JSON.parse(content);
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
36
+
37
+ export function clearTrackingFile(): void {
38
+ if (existsSync(TRACKING_FILE_PATH)) {
39
+ unlinkSync(TRACKING_FILE_PATH);
40
+ }
41
+ }