@codeyam/codeyam-cli 0.1.0-staging.8aea589 → 0.1.0-staging.bbe4da9

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 (485) 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 +6 -2
  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 +145 -4
  12. package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +1 -3
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1877 -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/cleanNonObjectFunctions.ts +64 -1
  23. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +14 -6
  24. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/selectBestValue.ts +70 -0
  25. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.ts +113 -0
  26. package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +36 -0
  27. package/analyzer-template/packages/ai/src/lib/generateChangesEntityDocumentation.ts +20 -2
  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 +32 -8
  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 +41 -0
  47. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +47 -8
  48. package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -1
  49. package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +2 -1
  50. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExportedNodes.ts +4 -2
  51. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +5 -3
  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/analyzeRemixRoute.ts +21 -33
  60. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +75 -10
  61. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +26 -0
  62. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +7 -1
  63. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +9 -1
  64. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +6 -1
  65. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +9 -1
  66. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +15 -7
  67. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +12 -2
  68. package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.d.ts +23 -0
  69. package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.d.ts.map +1 -0
  70. package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.js +30 -0
  71. package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.js.map +1 -0
  72. package/analyzer-template/packages/aws/package.json +5 -4
  73. package/analyzer-template/packages/aws/s3/index.ts +4 -0
  74. package/analyzer-template/packages/aws/src/lib/s3/getPresignedUrl.ts +62 -0
  75. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +28 -21
  76. package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.ts +18 -11
  77. package/analyzer-template/packages/generate/src/lib/scenarioComponent.ts +6 -3
  78. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
  79. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +28 -21
  80. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  81. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.d.ts.map +1 -1
  82. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js +18 -11
  83. package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js.map +1 -1
  84. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.d.ts.map +1 -1
  85. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.js +5 -3
  86. package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.js.map +1 -1
  87. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.d.ts +2 -0
  88. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.d.ts.map +1 -1
  89. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.js +3 -0
  90. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.js.map +1 -1
  91. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tableRelations.d.ts +2 -0
  92. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tableRelations.d.ts.map +1 -1
  93. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.d.ts +37 -0
  94. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -0
  95. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.js +27 -0
  96. package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.js.map +1 -0
  97. package/analyzer-template/packages/github/dist/supabase/src/lib/scenarioToDb.d.ts.map +1 -1
  98. package/analyzer-template/packages/github/dist/supabase/src/lib/scenarioToDb.js +1 -1
  99. package/analyzer-template/packages/github/dist/supabase/src/lib/scenarioToDb.js.map +1 -1
  100. package/analyzer-template/packages/github/dist/utils/index.d.ts +2 -0
  101. package/analyzer-template/packages/github/dist/utils/index.d.ts.map +1 -1
  102. package/analyzer-template/packages/github/dist/utils/index.js +2 -0
  103. package/analyzer-template/packages/github/dist/utils/index.js.map +1 -1
  104. package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.d.ts +25 -0
  105. package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.d.ts.map +1 -0
  106. package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.js +40 -0
  107. package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.js.map +1 -0
  108. package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.d.ts.map +1 -1
  109. package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.js +39 -5
  110. package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.js.map +1 -1
  111. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.d.ts.map +1 -1
  112. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
  113. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  114. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.d.ts.map +1 -1
  115. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
  116. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
  117. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.d.ts.map +1 -1
  118. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  119. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  120. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.d.ts.map +1 -1
  121. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
  122. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
  123. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts +12 -0
  124. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts.map +1 -0
  125. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  126. package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  127. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  128. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js +17 -0
  129. package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  130. package/analyzer-template/packages/supabase/src/lib/kysely/db.ts +6 -0
  131. package/analyzer-template/packages/supabase/src/lib/kysely/tableRelations.ts +3 -0
  132. package/analyzer-template/packages/supabase/src/lib/kysely/tables/debugReportsTable.ts +61 -0
  133. package/analyzer-template/packages/supabase/src/lib/scenarioToDb.ts +1 -0
  134. package/analyzer-template/packages/ui-components/src/scenario-editor/components/DataItemEditor.tsx +1 -1
  135. package/analyzer-template/packages/utils/dist/utils/index.d.ts +2 -0
  136. package/analyzer-template/packages/utils/dist/utils/index.d.ts.map +1 -1
  137. package/analyzer-template/packages/utils/dist/utils/index.js +2 -0
  138. package/analyzer-template/packages/utils/dist/utils/index.js.map +1 -1
  139. package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.d.ts +25 -0
  140. package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.d.ts.map +1 -0
  141. package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.js +40 -0
  142. package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.js.map +1 -0
  143. package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.d.ts.map +1 -1
  144. package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.js +39 -5
  145. package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.js.map +1 -1
  146. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.d.ts.map +1 -1
  147. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
  148. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  149. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.d.ts.map +1 -1
  150. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
  151. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
  152. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.d.ts.map +1 -1
  153. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  154. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  155. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.d.ts.map +1 -1
  156. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
  157. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
  158. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts +12 -0
  159. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts.map +1 -0
  160. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  161. package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  162. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
  163. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js +17 -0
  164. package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  165. package/analyzer-template/packages/utils/index.ts +2 -0
  166. package/analyzer-template/packages/utils/src/lib/Semaphore.ts +42 -0
  167. package/analyzer-template/packages/utils/src/lib/applyUniversalMocks.ts +46 -7
  168. package/analyzer-template/packages/utils/src/lib/frameworks/getNextRoutePath.ts +2 -1
  169. package/analyzer-template/packages/utils/src/lib/frameworks/getRemixRoutePath.ts +2 -1
  170. package/analyzer-template/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.ts +2 -1
  171. package/analyzer-template/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.ts +1 -0
  172. package/analyzer-template/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.ts +33 -0
  173. package/analyzer-template/packages/utils/src/lib/lightweightEntityExtractor.ts +16 -0
  174. package/analyzer-template/project/constructMockCode.ts +199 -9
  175. package/analyzer-template/project/reconcileMockDataKeys.ts +13 -0
  176. package/analyzer-template/project/runMultiScenarioServer.ts +0 -4
  177. package/analyzer-template/project/runScenarioServer.ts +0 -4
  178. package/analyzer-template/project/start.ts +1 -11
  179. package/analyzer-template/project/startScenarioCapture.ts +24 -0
  180. package/analyzer-template/project/startServer.ts +50 -70
  181. package/analyzer-template/project/trackGeneratedFiles.ts +41 -0
  182. package/analyzer-template/project/writeMockDataTsx.ts +191 -7
  183. package/analyzer-template/project/writeScenarioComponents.ts +643 -63
  184. package/analyzer-template/project/writeUniversalMocks.ts +66 -8
  185. package/analyzer-template/scripts/postbuild.cjs +12 -1
  186. package/background/src/lib/virtualized/project/constructMockCode.js +183 -11
  187. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  188. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +12 -0
  189. package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
  190. package/background/src/lib/virtualized/project/runMultiScenarioServer.js +0 -3
  191. package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
  192. package/background/src/lib/virtualized/project/start.js +1 -8
  193. package/background/src/lib/virtualized/project/start.js.map +1 -1
  194. package/background/src/lib/virtualized/project/startScenarioCapture.js +18 -0
  195. package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
  196. package/background/src/lib/virtualized/project/startServer.js +40 -68
  197. package/background/src/lib/virtualized/project/startServer.js.map +1 -1
  198. package/background/src/lib/virtualized/project/trackGeneratedFiles.js +30 -0
  199. package/background/src/lib/virtualized/project/trackGeneratedFiles.js.map +1 -0
  200. package/background/src/lib/virtualized/project/writeMockDataTsx.js +156 -6
  201. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  202. package/background/src/lib/virtualized/project/writeScenarioComponents.js +433 -41
  203. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  204. package/background/src/lib/virtualized/project/writeUniversalMocks.js +56 -7
  205. package/background/src/lib/virtualized/project/writeUniversalMocks.js.map +1 -1
  206. package/codeyam-cli/src/cli.js +6 -0
  207. package/codeyam-cli/src/cli.js.map +1 -1
  208. package/codeyam-cli/src/codeyam-cli.js +0 -0
  209. package/codeyam-cli/src/commands/debug.js +222 -0
  210. package/codeyam-cli/src/commands/debug.js.map +1 -0
  211. package/codeyam-cli/src/commands/init.js +4 -23
  212. package/codeyam-cli/src/commands/init.js.map +1 -1
  213. package/codeyam-cli/src/commands/report.js +102 -0
  214. package/codeyam-cli/src/commands/report.js.map +1 -0
  215. package/codeyam-cli/src/commands/setup-sandbox.js +165 -0
  216. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -0
  217. package/codeyam-cli/src/commands/test-startup.js +14 -5
  218. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  219. package/codeyam-cli/src/utils/__tests__/cleanupAnalysisFiles.test.js +6 -6
  220. package/codeyam-cli/src/utils/__tests__/cleanupAnalysisFiles.test.js.map +1 -1
  221. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +8 -0
  222. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  223. package/codeyam-cli/src/utils/analysisRunner.js +2 -1
  224. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  225. package/codeyam-cli/src/utils/analyzer.js +24 -2
  226. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  227. package/codeyam-cli/src/utils/cleanupAnalysisFiles.js +2 -2
  228. package/codeyam-cli/src/utils/cleanupAnalysisFiles.js.map +1 -1
  229. package/codeyam-cli/src/utils/generateReport.js +219 -0
  230. package/codeyam-cli/src/utils/generateReport.js.map +1 -0
  231. package/codeyam-cli/src/utils/install-skills.js +7 -0
  232. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  233. package/codeyam-cli/src/utils/queue/__tests__/job.pidTracking.test.js +1 -0
  234. package/codeyam-cli/src/utils/queue/__tests__/job.pidTracking.test.js.map +1 -1
  235. package/codeyam-cli/src/utils/queue/job.js +10 -5
  236. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  237. package/codeyam-cli/src/utils/sandbox.js +190 -0
  238. package/codeyam-cli/src/utils/sandbox.js.map +1 -0
  239. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +4 -0
  240. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  241. package/codeyam-cli/src/utils/webappDetection.js +2 -1
  242. package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
  243. package/codeyam-cli/src/webserver/app/lib/database.js +50 -2
  244. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  245. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-Dp_FTAs1.js +1 -0
  246. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-TlHocYno.js +26 -0
  247. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CVMmGuIc.js +3 -0
  248. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-BKKG1s2B.js → LogViewer-JkfQ-VaI.js} +1 -1
  249. package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-Cqce0_KG.js +1 -0
  250. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BrMAP1nP.js +1 -0
  251. package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bi-__7HT.js +6 -0
  252. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-XmIpHcLJ.js +5 -0
  253. package/codeyam-cli/src/webserver/build/client/assets/_index-BmfhU6CA.js +1 -0
  254. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-Dm8lM73z.js +10 -0
  255. package/codeyam-cli/src/webserver/build/client/assets/api.generate-report-l0sNRNKZ.js +1 -0
  256. package/codeyam-cli/src/webserver/build/client/assets/chart-column-kA4jn9if.js +1 -0
  257. package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-CgXbbZRx.js +26 -0
  258. package/codeyam-cli/src/webserver/build/client/assets/circle-check-B2oHQ-zo.js +1 -0
  259. package/codeyam-cli/src/webserver/build/client/assets/clock-BAfbP_iK.js +1 -0
  260. package/codeyam-cli/src/webserver/build/client/assets/codeyam-name-logo-CvKwUgHo.svg +9 -0
  261. package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BBYuR56H.js +1 -0
  262. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BgPXZbm0.js +1 -0
  263. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BHiWkb_W.js → entity._sha._-BkoAXaOa.js} +10 -10
  264. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-Bj5GHkhb.js +1 -0
  265. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-eW5z9AyZ.js +5 -0
  266. package/codeyam-cli/src/webserver/build/client/assets/entityStatus-C5Okl18j.js +1 -0
  267. package/codeyam-cli/src/webserver/build/client/assets/{entityVersioning-Bk_YB1jM.js → entityVersioning-CU_Lchhc.js} +1 -1
  268. package/codeyam-cli/src/webserver/build/client/assets/entry.client-B9tSboXM.js +5 -0
  269. package/codeyam-cli/src/webserver/build/client/assets/file-text-18aYHZGd.js +1 -0
  270. package/codeyam-cli/src/webserver/build/client/assets/files-Df79EyEb.js +1 -0
  271. package/codeyam-cli/src/webserver/build/client/assets/git-CDEwTVH_.js +12 -0
  272. package/codeyam-cli/src/webserver/build/client/assets/globals-DXRB6jBc.css +1 -0
  273. package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +5 -0
  274. package/codeyam-cli/src/webserver/build/client/assets/index-_LjBsTxX.js +8 -0
  275. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-D_EGChhq.js +1 -0
  276. package/codeyam-cli/src/webserver/build/client/assets/manifest-3e0ffbcc.js +1 -0
  277. package/codeyam-cli/src/webserver/build/client/assets/root-CGyT4J4b.js +16 -0
  278. package/codeyam-cli/src/webserver/build/client/assets/settings-CEPbAsom.js +1 -0
  279. package/codeyam-cli/src/webserver/build/client/assets/settings-R8QF_mHX.js +1 -0
  280. package/codeyam-cli/src/webserver/build/client/assets/simulations-B_PXvFom.js +1 -0
  281. package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-BthANBVv.js +1 -0
  282. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-Lumm1t01.js → useLastLogLine-Blr5oZDE.js} +1 -1
  283. package/codeyam-cli/src/webserver/build/client/assets/useReportContext-CANr3QJ5.js +1 -0
  284. package/codeyam-cli/src/webserver/build/client/assets/useToast-Bbf4Hokd.js +1 -0
  285. package/codeyam-cli/src/webserver/build/server/assets/index-vf1FETCO.js +1 -0
  286. package/codeyam-cli/src/webserver/build/server/assets/server-build-B5s58TvB.js +169 -0
  287. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  288. package/codeyam-cli/src/webserver/build-info.json +5 -5
  289. package/codeyam-cli/src/webserver/server.js +1 -1
  290. package/codeyam-cli/src/webserver/server.js.map +1 -1
  291. package/codeyam-cli/templates/codeyam-setup-skill.md +70 -85
  292. package/codeyam-cli/templates/debug-command.md +125 -0
  293. package/package.json +9 -11
  294. package/packages/ai/index.js +2 -3
  295. package/packages/ai/index.js.map +1 -1
  296. package/packages/ai/src/lib/analyzeScope.js +13 -0
  297. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  298. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +6 -15
  299. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  300. package/packages/ai/src/lib/astScopes/methodSemantics.js +134 -0
  301. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  302. package/packages/ai/src/lib/astScopes/paths.js +28 -3
  303. package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
  304. package/packages/ai/src/lib/astScopes/processExpression.js +123 -3
  305. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  306. package/packages/ai/src/lib/checkAllAttributes.js +1 -3
  307. package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
  308. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1358 -396
  309. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  310. package/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.js +137 -1
  311. package/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.js.map +1 -1
  312. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +1 -1
  313. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
  314. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +112 -0
  315. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -0
  316. package/packages/ai/src/lib/dataStructure/helpers/DebugTracer.js +176 -0
  317. package/packages/ai/src/lib/dataStructure/helpers/DebugTracer.js.map +1 -0
  318. package/packages/ai/src/lib/dataStructure/helpers/PathManager.js +178 -0
  319. package/packages/ai/src/lib/dataStructure/helpers/PathManager.js.map +1 -0
  320. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +138 -0
  321. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -0
  322. package/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.js +199 -0
  323. package/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.js.map +1 -0
  324. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +55 -1
  325. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  326. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +14 -6
  327. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  328. package/packages/ai/src/lib/dataStructure/helpers/selectBestValue.js +62 -0
  329. package/packages/ai/src/lib/dataStructure/helpers/selectBestValue.js.map +1 -0
  330. package/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.js +90 -0
  331. package/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.js.map +1 -0
  332. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +22 -0
  333. package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
  334. package/packages/ai/src/lib/generateChangesEntityDocumentation.js +19 -1
  335. package/packages/ai/src/lib/generateChangesEntityDocumentation.js.map +1 -1
  336. package/packages/ai/src/lib/generateChangesEntityScenarioData.js +55 -156
  337. package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
  338. package/packages/ai/src/lib/generateChangesEntityScenarios.js +79 -262
  339. package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
  340. package/packages/ai/src/lib/generateEntityDocumentation.js +15 -1
  341. package/packages/ai/src/lib/generateEntityDocumentation.js.map +1 -1
  342. package/packages/ai/src/lib/generateEntityKeyAttributes.js +32 -8
  343. package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +1 -1
  344. package/packages/ai/src/lib/generateEntityScenarioData.js +52 -152
  345. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  346. package/packages/ai/src/lib/generateEntityScenarios.js +88 -258
  347. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  348. package/packages/ai/src/lib/generateStatementAnalysis.js +46 -71
  349. package/packages/ai/src/lib/generateStatementAnalysis.js.map +1 -1
  350. package/packages/ai/src/lib/getConditionalUsagesFromCode.js +13 -8
  351. package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
  352. package/packages/ai/src/lib/getLLMCallStats.js +0 -14
  353. package/packages/ai/src/lib/getLLMCallStats.js.map +1 -1
  354. package/packages/ai/src/lib/modelInfo.js +15 -0
  355. package/packages/ai/src/lib/modelInfo.js.map +1 -1
  356. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +36 -3
  357. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  358. package/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.js +8 -33
  359. package/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.js.map +1 -1
  360. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +35 -41
  361. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
  362. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +59 -72
  363. package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
  364. package/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.js +8 -27
  365. package/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.js.map +1 -1
  366. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +24 -27
  367. package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
  368. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +21 -22
  369. package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
  370. package/packages/ai/src/lib/types/index.js +2 -0
  371. package/packages/ai/src/lib/types/index.js.map +1 -1
  372. package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
  373. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  374. package/packages/analyze/src/lib/FileAnalyzer.js +39 -7
  375. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  376. package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -1
  377. package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
  378. package/packages/analyze/src/lib/asts/nodes/index.js +2 -1
  379. package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
  380. package/packages/analyze/src/lib/asts/sourceFiles/getAllExportedNodes.js +3 -2
  381. package/packages/analyze/src/lib/asts/sourceFiles/getAllExportedNodes.js.map +1 -1
  382. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +4 -3
  383. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  384. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +6 -8
  385. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  386. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +5 -1
  387. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  388. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +8 -2
  389. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  390. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js +5 -8
  391. package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
  392. package/packages/analyze/src/lib/files/analyzeChange.js +21 -9
  393. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  394. package/packages/analyze/src/lib/files/analyzeEntity.js +10 -4
  395. package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
  396. package/packages/analyze/src/lib/files/analyzeInitial.js +21 -9
  397. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  398. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +18 -23
  399. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  400. package/packages/analyze/src/lib/files/getImportedExports.js +56 -4
  401. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  402. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +24 -0
  403. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  404. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +6 -1
  405. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  406. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +9 -1
  407. package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +1 -1
  408. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +5 -1
  409. package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
  410. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +9 -1
  411. package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
  412. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +16 -7
  413. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  414. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +8 -2
  415. package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
  416. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +28 -21
  417. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
  418. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js +18 -11
  419. package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js.map +1 -1
  420. package/packages/generate/src/lib/scenarioComponent.js +5 -3
  421. package/packages/generate/src/lib/scenarioComponent.js.map +1 -1
  422. package/packages/supabase/src/lib/kysely/db.js +3 -0
  423. package/packages/supabase/src/lib/kysely/db.js.map +1 -1
  424. package/packages/supabase/src/lib/kysely/tables/debugReportsTable.js +27 -0
  425. package/packages/supabase/src/lib/kysely/tables/debugReportsTable.js.map +1 -0
  426. package/packages/supabase/src/lib/scenarioToDb.js +1 -1
  427. package/packages/supabase/src/lib/scenarioToDb.js.map +1 -1
  428. package/packages/utils/index.js +2 -0
  429. package/packages/utils/index.js.map +1 -1
  430. package/packages/utils/src/lib/Semaphore.js +40 -0
  431. package/packages/utils/src/lib/Semaphore.js.map +1 -0
  432. package/packages/utils/src/lib/applyUniversalMocks.js +39 -5
  433. package/packages/utils/src/lib/applyUniversalMocks.js.map +1 -1
  434. package/packages/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
  435. package/packages/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
  436. package/packages/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
  437. package/packages/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
  438. package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
  439. package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
  440. package/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
  441. package/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
  442. package/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
  443. package/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
  444. package/packages/utils/src/lib/lightweightEntityExtractor.js +17 -0
  445. package/packages/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
  446. package/analyzer-template/packages/ai/src/lib/generateEntityDataMap.ts +0 -375
  447. package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-rqv54FUY.js +0 -1
  448. package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-B0oiPem-.js +0 -26
  449. package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DqXXjAJ7.js +0 -3
  450. package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DU_jxCPD.js +0 -1
  451. package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-5DY-YIxu.js +0 -6
  452. package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-DmjXUj6m.js +0 -5
  453. package/codeyam-cli/src/webserver/build/client/assets/_index-DvSrcxsk.js +0 -1
  454. package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CsaMd9mb.js +0 -10
  455. package/codeyam-cli/src/webserver/build/client/assets/chart-column-VXBS6qOn.js +0 -1
  456. package/codeyam-cli/src/webserver/build/client/assets/circle-alert-n5GUC2AS.js +0 -1
  457. package/codeyam-cli/src/webserver/build/client/assets/clock-DKqtX8js.js +0 -1
  458. package/codeyam-cli/src/webserver/build/client/assets/components-Dj-Ggnl2.js +0 -40
  459. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BbR3FwNc.js +0 -1
  460. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-L7M9Vr5z.js +0 -1
  461. package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-C9w-q7P3.js +0 -5
  462. package/codeyam-cli/src/webserver/build/client/assets/entry.client-CdGoUs8A.js +0 -1
  463. package/codeyam-cli/src/webserver/build/client/assets/file-text-B6Er7j5k.js +0 -1
  464. package/codeyam-cli/src/webserver/build/client/assets/files-KcDVw1FY.js +0 -1
  465. package/codeyam-cli/src/webserver/build/client/assets/git-B9uZ8eSJ.js +0 -12
  466. package/codeyam-cli/src/webserver/build/client/assets/globals-B0f88RTV.css +0 -1
  467. package/codeyam-cli/src/webserver/build/client/assets/loader-circle-v3c6DFp4.js +0 -1
  468. package/codeyam-cli/src/webserver/build/client/assets/manifest-fca08d7e.js +0 -1
  469. package/codeyam-cli/src/webserver/build/client/assets/root-Cf8VBqIb.js +0 -16
  470. package/codeyam-cli/src/webserver/build/client/assets/search-DA14wXpu.js +0 -1
  471. package/codeyam-cli/src/webserver/build/client/assets/settings-COJUrwGu.js +0 -1
  472. package/codeyam-cli/src/webserver/build/client/assets/settings-NU_ZquhK.js +0 -1
  473. package/codeyam-cli/src/webserver/build/client/assets/simulations-CNaMJ-nR.js +0 -1
  474. package/codeyam-cli/src/webserver/build/client/assets/useToast-BRShB17p.js +0 -1
  475. package/codeyam-cli/src/webserver/build/client/assets/zap-BvukH0eN.js +0 -1
  476. package/codeyam-cli/src/webserver/build/client/cy-logo-cli.svg +0 -13
  477. package/codeyam-cli/src/webserver/build/client/favicon.svg +0 -13
  478. package/codeyam-cli/src/webserver/build/server/assets/index-DHr4rT4u.js +0 -1
  479. package/codeyam-cli/src/webserver/build/server/assets/server-build-Bi1mj14J.js +0 -166
  480. package/codeyam-cli/src/webserver/public/cy-logo-cli.svg +0 -13
  481. package/codeyam-cli/src/webserver/public/favicon.svg +0 -13
  482. package/packages/ai/src/lib/generateEntityDataMap.js +0 -335
  483. package/packages/ai/src/lib/generateEntityDataMap.js.map +0 -1
  484. package/packages/ai/src/lib/promptGenerators/generateEntityDataMapGenerator.js +0 -17
  485. package/packages/ai/src/lib/promptGenerators/generateEntityDataMapGenerator.js.map +0 -1
@@ -4,8 +4,9 @@ import {
4
4
  functionArguments,
5
5
  cleanOutBoundary,
6
6
  fillInDirectSchemaGapsAndUnknowns,
7
+ removeDuplicateFunctionCalls,
7
8
  } from '~codeyam/ai';
8
- import { DataStructure, DeepReadonly } from '~codeyam/types';
9
+ import { DataStructure, DeepReadonly, EntityType } from '~codeyam/types';
9
10
 
10
11
  interface ReturnValuePart {
11
12
  name: string;
@@ -18,6 +19,7 @@ interface ReturnValuePart {
18
19
  nested?: ReturnValuePart[];
19
20
  isAsyncFunction?: boolean;
20
21
  isStructural?: boolean;
22
+ hasNoReturnData?: boolean; // true when function has only signature entries, no functionCallReturnValue
21
23
  // Maps literal argument values to their specific nested structures for conditional dispatch
22
24
  argVariants?: Map<string, ReturnValuePart[]>;
23
25
  }
@@ -162,6 +164,7 @@ function isValidKey(key: string) {
162
164
  export default function constructMockCode(
163
165
  mockName: string,
164
166
  dependencySchemas: DeepReadonly<DataStructure['dependencySchemas']>,
167
+ entityType?: EntityType,
165
168
  ) {
166
169
  const mockNameParts = splitOutsideParenthesesAndArrays(mockName);
167
170
 
@@ -193,9 +196,10 @@ export default function constructMockCode(
193
196
  relevantReturnValueSchema = fillInDirectSchemaGapsAndUnknowns({
194
197
  schema: dependencySchemas[filePath][entityName]?.returnValueSchema,
195
198
  });
196
- // NOTE: Temporarily disabled clearAttributesFromMapping as it deletes
199
+ // NOTE: clearAttributesFromMapping is disabled because it deletes
197
200
  // method calls on arrays (like .eq() after functionCallReturnValue: 'array')
198
- // clearAttributesFromMapping(relevantReturnValueSchema)
201
+ // However, we still need to remove duplicate function calls that create invalid syntax
202
+ removeDuplicateFunctionCalls(relevantReturnValueSchema);
199
203
  dataStructureValue = relevantReturnValueSchema?.[dataStructurePath];
200
204
  break;
201
205
  }
@@ -273,7 +277,15 @@ export default function constructMockCode(
273
277
  }
274
278
 
275
279
  const addReturnValueFunctionAccessor = (dataPath: string) => {
276
- if (returnValue.returnsFunctionArgs) {
280
+ // Add function call accessor if:
281
+ // - There are actual arguments, OR
282
+ // - This is a callable (not a method that returns an array directly)
283
+ // For methods like getAll() that return arrays, the data is at ["getAll()"] not ["getAll()"]["()"]
284
+ if (
285
+ returnValue.returnsFunctionArgs &&
286
+ (returnValue.returnsFunctionArgs.length > 0 ||
287
+ !returnValue.returnsFunctionArray)
288
+ ) {
277
289
  if (returnValue.isArray) {
278
290
  dataPath = `${dataPath}${optionalAccess('[0]')}`;
279
291
  }
@@ -313,6 +325,7 @@ export default function constructMockCode(
313
325
  returnsFunctionArgs,
314
326
  returnsFunctionArray,
315
327
  isAsyncFunction,
328
+ hasNoReturnData,
316
329
  } = returnValue;
317
330
 
318
331
  const nestedContent: (string | undefined)[] = (nested ?? []).map(
@@ -325,9 +338,53 @@ export default function constructMockCode(
325
338
  },
326
339
  );
327
340
 
341
+ // Array prototype methods that should be ignored when building mocks
342
+ // (these work on any array - we don't need to mock them)
343
+ const ARRAY_PROTOTYPE_METHODS = new Set([
344
+ 'at',
345
+ 'concat',
346
+ 'copyWithin',
347
+ 'entries',
348
+ 'every',
349
+ 'fill',
350
+ 'filter',
351
+ 'find',
352
+ 'findIndex',
353
+ 'findLast',
354
+ 'findLastIndex',
355
+ 'flat',
356
+ 'flatMap',
357
+ 'forEach',
358
+ 'includes',
359
+ 'indexOf',
360
+ 'join',
361
+ 'keys',
362
+ 'lastIndexOf',
363
+ 'map',
364
+ 'pop',
365
+ 'push',
366
+ 'reduce',
367
+ 'reduceRight',
368
+ 'reverse',
369
+ 'shift',
370
+ 'slice',
371
+ 'some',
372
+ 'sort',
373
+ 'splice',
374
+ 'toLocaleString',
375
+ 'toReversed',
376
+ 'toSorted',
377
+ 'toSpliced',
378
+ 'toString',
379
+ 'unshift',
380
+ 'values',
381
+ 'with',
382
+ 'length',
383
+ ]);
384
+
328
385
  const levelContentItems = [];
329
386
  // Add spread for data paths when:
330
- // - Not a function returning an array
387
+ // - Not a function returning an array, OR function returns array with custom methods
331
388
  // - Has function args OR not an array
332
389
  // - Not structural, OR is a structural [0] element with nested content
333
390
  // (array elements with nested functions need their other properties spread)
@@ -336,8 +393,20 @@ export default function constructMockCode(
336
393
  returnValue.name === '[0]' &&
337
394
  nested &&
338
395
  nested.length > 0;
396
+ // Check if function returns array but has custom methods (not just array prototype methods)
397
+ // Excludes array indices like [0], [1], [] which are not methods
398
+ const hasCustomMethodsOnArrayReturn =
399
+ returnsFunctionArray &&
400
+ nested &&
401
+ nested.length > 0 &&
402
+ nested.some((n) => {
403
+ // Skip array indices - they're not methods
404
+ if (n.name.match(/^\[\d*\]$/)) return false;
405
+ const methodName = n.name.replace(/[<(].*$/, '');
406
+ return !ARRAY_PROTOTYPE_METHODS.has(methodName);
407
+ });
339
408
  if (
340
- !returnsFunctionArray &&
409
+ (!returnsFunctionArray || hasCustomMethodsOnArrayReturn) &&
341
410
  (returnsFunctionArgs || !isArray) &&
342
411
  (!returnValue.isStructural || isStructuralArrayElementWithNested)
343
412
  ) {
@@ -352,14 +421,35 @@ export default function constructMockCode(
352
421
  .join(', ');
353
422
  let funcContents = '';
354
423
  if (returnsFunctionArray) {
355
- if (levelContents.length === 0) {
424
+ if (hasNoReturnData) {
425
+ // Function has no return data (only signatures) - return empty array
426
+ funcContents = 'return []';
427
+ } else if (levelContents.length === 0 && dataPaths.length === 1) {
428
+ // When returning an array with no nested content, return the data path directly
429
+ // (the data path points to the array in scenario data)
430
+ funcContents = `return ${dataPaths[0]}`;
431
+ } else if (levelContents.length === 0) {
356
432
  funcContents = 'return []';
357
433
  } else {
358
434
  funcContents = `return [\n${indent(levelContents)}\n]`;
359
435
  }
360
436
  } else {
437
+ // Check if function has no actual return data (only signatures)
438
+ const hasNestedItems = nested && nested.length > 0;
439
+ const hasActualNestedContent =
440
+ nestedContent.filter(Boolean).length > 0;
441
+
361
442
  if (levelContentItems.length === 1 && dataPaths.length === 1) {
362
- funcContents = `return ${dataPaths[0]}`;
443
+ if (
444
+ hasNoReturnData ||
445
+ (hasNestedItems && !hasActualNestedContent)
446
+ ) {
447
+ // Function has no return data (only signatures) - return empty array
448
+ funcContents = 'return []';
449
+ } else {
450
+ // Has return data - return data path
451
+ funcContents = `return ${dataPaths[0]}`;
452
+ }
363
453
  } else {
364
454
  funcContents = `return {\n${indent(levelContents)}\n}`;
365
455
  }
@@ -372,6 +462,17 @@ export default function constructMockCode(
372
462
  }
373
463
  }
374
464
 
465
+ // Check if all nested items are array prototype methods
466
+ const hasOnlyArrayPrototypeMethods =
467
+ returnsFunctionArray &&
468
+ nested &&
469
+ nested.length > 0 &&
470
+ nested.every((n) => {
471
+ // Extract method name before type params and args (e.g., "reduce<...>(...)" -> "reduce")
472
+ const methodName = n.name.replace(/[<(].*$/, '');
473
+ return ARRAY_PROTOTYPE_METHODS.has(methodName);
474
+ });
475
+
375
476
  let returnValueContents = '';
376
477
  if (
377
478
  !returnsFunctionArgs &&
@@ -379,6 +480,16 @@ export default function constructMockCode(
379
480
  dataPaths.length === 1
380
481
  ) {
381
482
  returnValueContents = dataPaths[0];
483
+ } else if (
484
+ returnsFunctionArray &&
485
+ dataPaths.length === 1 &&
486
+ !root &&
487
+ (!nested || nested.length === 0 || hasOnlyArrayPrototypeMethods)
488
+ ) {
489
+ // Nested method returns an array - return the data path directly
490
+ // Only if nested content is empty or only contains array prototype methods
491
+ // (like .reduce() which work on any array - we don't need to mock them)
492
+ returnValueContents = dataPaths[0];
382
493
  } else {
383
494
  if (isArray) {
384
495
  // When GENERIC array (using []) has nested content (like functions that need wrapping),
@@ -687,6 +798,25 @@ export default function constructMockCode(
687
798
  if (returnValueSection.returnsFunctionArgs && value === 'array') {
688
799
  returnValueSection.returnsFunctionArray = true;
689
800
  }
801
+
802
+ // Check if this function call has actual return data in the schema
803
+ // If the path only has .signature entries (no .functionCallReturnValue), mark as no return data
804
+ // Use parts[i] (original part) instead of modified 'part' to include array indices like [1]
805
+ const functionCallPath = joinParenthesesAndArrays([
806
+ ...parts.slice(0, i),
807
+ parts[i], // Use original part which may include [1](args) together
808
+ ]);
809
+ // Check if there's a .functionCallReturnValue AFTER this function call path
810
+ const hasFunctionCallReturnValue = Object.keys(
811
+ relevantReturnValueSchema,
812
+ ).some((k) => {
813
+ if (!k.startsWith(functionCallPath)) return false;
814
+ const afterPath = k.slice(functionCallPath.length);
815
+ return afterPath.startsWith('.functionCallReturnValue');
816
+ });
817
+ if (!hasFunctionCallReturnValue) {
818
+ returnValueSection.hasNoReturnData = true;
819
+ }
690
820
  }
691
821
 
692
822
  if (nextIsDifferentiatedArray || hasNestedFunction) {
@@ -841,6 +971,26 @@ export default function constructMockCode(
841
971
  }
842
972
 
843
973
  if (!hasNestedFunction) {
974
+ // Before breaking, check if this function returns an array
975
+ // by looking for a functionCallReturnValue: 'array' entry in the schema
976
+ if (relevantPart && part.endsWith(')')) {
977
+ const functionReturnPath = joinParenthesesAndArrays([
978
+ ...parts.slice(0, i + 1),
979
+ RETURN_VALUE,
980
+ ]);
981
+ const returnType = relevantReturnValueSchema[functionReturnPath];
982
+ if (returnType === 'array') {
983
+ // Only set returnsFunctionArray if the array contains plain data,
984
+ // NOT if it contains functions (which need wrapping)
985
+ const arrayElementPath = `${functionReturnPath}[]`;
986
+ const arrayElementType =
987
+ relevantReturnValueSchema[arrayElementPath];
988
+ // If array element is a function, we need to wrap it - don't set returnsFunctionArray
989
+ if (arrayElementType !== 'function') {
990
+ relevantPart.returnsFunctionArray = true;
991
+ }
992
+ }
993
+ }
844
994
  break;
845
995
  }
846
996
 
@@ -884,7 +1034,47 @@ export default function constructMockCode(
884
1034
 
885
1035
  return `const ${mockNameParts[0]} = {\n${indent(returnParts.join(',\n'))}\n};`;
886
1036
  } else if (isFunction) {
887
- return `const ${mockName}ReturnValue = ${contents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${mockName}() {\n${indent(`return ${mockName}ReturnValue;`)}\n}`;
1037
+ // For headers() and cookies() from next/headers, add common iterator methods
1038
+ // These are needed when the mock is passed to functions that use .entries(), .keys(), etc.
1039
+ // (e.g., Object.fromEntries(headers.entries()) in buildLegacyHeaders)
1040
+ const needsIteratorMethods =
1041
+ mockName === 'headers' || mockName === 'cookies';
1042
+ let enhancedContents = contents;
1043
+ if (needsIteratorMethods && contents.trim().startsWith('{')) {
1044
+ // Add iterator methods that operate on the scenario data
1045
+ const iteratorMethods = `,
1046
+ entries: () => Object.entries(scenarios().data()?.["${mockName}()"] || {}),
1047
+ keys: () => Object.keys(scenarios().data()?.["${mockName}()"] || {}),
1048
+ values: () => Object.values(scenarios().data()?.["${mockName}()"] || {}),
1049
+ forEach: (fn) => Object.entries(scenarios().data()?.["${mockName}()"] || {}).forEach(([k, v]) => fn(v, k)),
1050
+ has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${mockName}()"] || {}, key)`;
1051
+ // Insert before the closing brace (handle trailing whitespace)
1052
+ enhancedContents = contents.replace(/\}\s*$/, iteratorMethods + '\n}');
1053
+ }
1054
+
1055
+ // Classes need to be mocked as classes, not functions.
1056
+ // They're used with `new ClassName(args)` which requires a proper constructor.
1057
+ // A function mock like `function ClassName() { return value; }` doesn't work because
1058
+ // `new ClassName("arg")` wouldn't create the expected instance.
1059
+ // For Error subclasses (detected by name ending in "Error"), extend Error for proper error handling.
1060
+ if (entityType === 'class') {
1061
+ const isErrorSubclass = mockName.endsWith('Error');
1062
+ const baseClass = isErrorSubclass ? 'Error' : 'Object';
1063
+ const superCall = isErrorSubclass ? 'super(message);' : '';
1064
+ const nameAssignment = isErrorSubclass
1065
+ ? `this.name = '${mockName}';`
1066
+ : '';
1067
+
1068
+ return `class ${mockName}${isErrorSubclass ? ' extends Error' : ''} {
1069
+ constructor(message) {
1070
+ ${superCall}
1071
+ ${nameAssignment}
1072
+ Object.assign(this, scenarios().data()?.["${mockName}()"] || {});
1073
+ }
1074
+ }`;
1075
+ }
1076
+
1077
+ return `const ${mockName}ReturnValue = ${enhancedContents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${mockName}() {\n${indent(`return ${mockName}ReturnValue;`)}\n}`;
888
1078
  } else {
889
1079
  return `const ${mockName} = ${contents}`;
890
1080
  }
@@ -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
 
@@ -184,10 +184,6 @@ export async function runMultiScenarioServer({
184
184
  // Start the server (this runs in the background)
185
185
  const serverPromise = startServer({
186
186
  startCommand,
187
- packageManager,
188
- exitAfterSuccessfulAppStart,
189
- framework,
190
-
191
187
  onStart: async (port: number) => {
192
188
  projectPort = port;
193
189
  serverStarted = true;
@@ -119,10 +119,6 @@ export async function runScenarioServer({
119
119
  try {
120
120
  const code = await startServer({
121
121
  startCommand,
122
- packageManager,
123
- exitAfterSuccessfulAppStart,
124
- framework,
125
-
126
122
  onStart: async (port: number) => {
127
123
  if (taskCompletion) {
128
124
  console.log(
@@ -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
 
@@ -1,25 +1,32 @@
1
1
  import getPort from 'get-port';
2
2
  import execAsync from '../common/execAsync';
3
- import { ProjectFramework, ServerCommand } from '~codeyam/types';
3
+ import { ServerCommand } from '~codeyam/types';
4
4
  import { Socket } from 'net';
5
5
  import { awsLogDebugLevel } from '~codeyam/utils';
6
6
 
7
7
  export interface StartServerArgs {
8
- startCommand?: ServerCommand;
9
- packageManager: string;
10
- exitAfterSuccessfulAppStart?: boolean;
8
+ startCommand: ServerCommand;
11
9
  onStart: (port: number) => Promise<void>;
12
10
  onError: (data: string) => Promise<void>;
13
- framework: ProjectFramework;
14
11
  projectPort?: number;
15
12
  }
16
13
 
14
+ /**
15
+ * Start the project's dev server.
16
+ *
17
+ * Requires a complete startCommand with $PORT placeholder in args.
18
+ * The startCommand should be fully specified in the project's webapp configuration,
19
+ * including any package manager invocation and framework-specific flags.
20
+ *
21
+ * Examples of valid startCommand configurations:
22
+ * - npm: { command: 'npm', args: ['run', 'dev', '--', '--port', '$PORT'] }
23
+ * - pnpm: { command: 'pnpm', args: ['dev', '--port', '$PORT'] }
24
+ * - monorepo: { command: 'sh', args: ['-c', 'cd subdir && pnpm dev --port $PORT'] }
25
+ */
17
26
  export async function startServer({
18
27
  startCommand,
19
- packageManager,
20
28
  onStart,
21
29
  onError,
22
- framework,
23
30
  projectPort,
24
31
  }: StartServerArgs) {
25
32
  const acceptableErrorsRegexes = [
@@ -27,7 +34,7 @@ export async function startServer({
27
34
  /favicon\.ico/,
28
35
  /DeprecationWarning/,
29
36
  /warn deprecated/,
30
- /One of your dependencies, babel-preset-react-app, is importing the/, // This error is thrown in CRA and is not a problem. TODO: How to not throw for warnings
37
+ /One of your dependencies, babel-preset-react-app, is importing the/,
31
38
  /No route matches URL/,
32
39
  /Browserslist: caniuse-lite is outdated/,
33
40
  /npx update-browserslist-db@latest/,
@@ -37,8 +44,27 @@ export async function startServer({
37
44
  ];
38
45
 
39
46
  try {
40
- // both 'undefined' and 0 triggers port auto-selection, which we do here as late as
41
- // possible to mimimise the risk of race conditions & port conflicts downstream
47
+ // Validate startCommand
48
+ if (!startCommand?.command) {
49
+ throw new Error(
50
+ 'startCommand.command is required. ' +
51
+ 'Please configure a complete startCommand in the webapp configuration.',
52
+ );
53
+ }
54
+ if (!startCommand.args?.length) {
55
+ throw new Error(
56
+ 'startCommand.args is required and must be non-empty. ' +
57
+ 'Please configure startCommand.args with $PORT placeholder.',
58
+ );
59
+ }
60
+ if (!startCommand.args.some((arg) => arg.includes('$PORT'))) {
61
+ throw new Error(
62
+ 'startCommand.args must include $PORT placeholder. ' +
63
+ 'Example: ["run", "dev", "--", "--port", "$PORT"]',
64
+ );
65
+ }
66
+
67
+ // Port auto-selection (as late as possible to minimize race conditions)
42
68
  if (!projectPort) {
43
69
  projectPort = await getPort();
44
70
  console.log(`CodeYam: Auto-selected project port: ${projectPort}`);
@@ -68,7 +94,6 @@ export async function startServer({
68
94
 
69
95
  socket.connect(port, 'localhost');
70
96
 
71
- // Don't leave socket hanging
72
97
  timer.current = setTimeout(() => {
73
98
  console.log(`CodeYam: checkPort: Timeout`);
74
99
  socket.destroy();
@@ -89,66 +114,22 @@ export async function startServer({
89
114
  }
90
115
  };
91
116
 
92
- // figure out the right CLI invocation for starting the server
93
- const command = startCommand?.command ?? packageManager;
94
- let args = startCommand?.args;
95
-
96
- if (args) {
97
- // Custom startCommand provided - clone and process it
98
- args = [...args];
99
-
100
- // Replace any $PORT placeholders with the actual port
101
- let hasPort = false;
102
- for (let i = 0; i < args.length; i++) {
103
- if (args[i].includes('$PORT')) {
104
- args[i] = args[i].replace('$PORT', projectPort.toString());
105
- hasPort = true;
106
- } else if (args[i] === '--port' || args[i] === '-p') {
107
- hasPort = true;
108
- }
109
- }
117
+ // Build command from startCommand (substituting $PORT)
118
+ const command = startCommand.command;
119
+ const args = startCommand.args.map((arg) =>
120
+ arg.replace(/\$PORT/g, projectPort.toString()),
121
+ );
110
122
 
111
- // If no port argument exists, add it.
112
- // Use -- separator for compatibility with Turbo-based projects.
113
- if (!hasPort) {
114
- if (framework === ProjectFramework.Remix) {
115
- args.push('--', '--port', projectPort.toString(), '--strictPort');
116
- } else {
117
- args.push('--', '--port', projectPort.toString());
118
- }
119
- }
120
- } else {
121
- if (framework === ProjectFramework.CodeYam) {
122
- args = ['start', projectPort.toString()];
123
- } else {
124
- // there's no guarantee that the logic below will work for all frameworks, and
125
- // certainly no guarantee that it'll work on any one individual project... but
126
- // it's a reasonable default, and we have `startCommand` for anything bespoke
127
- //
128
- // All package managers support -- to pass arguments to scripts.
129
- // npm requires it, and Turbo-based projects (monorepos) also require it.
130
- // Using -- universally is safe and ensures compatibility.
131
- args = ['run', 'dev', '--', '--port', projectPort.toString()];
132
- if (framework === ProjectFramework.Remix) {
133
- args.push('--strictPort');
134
- }
135
- }
136
- }
137
- let env = startCommand?.env;
138
- if (!env) {
139
- env = {
140
- LOCAL: 'local',
141
- PORT: projectPort.toString(),
142
- };
143
- if (framework === ProjectFramework.CRA) {
144
- env.BROWSER = 'none';
145
- }
146
- } else {
147
- // Replace $PORT placeholders in env values
148
- env = { ...env };
123
+ // Handle env: $PORT substitution
124
+ let env: Record<string, string> = {
125
+ LOCAL: 'local',
126
+ PORT: projectPort.toString(),
127
+ };
128
+ if (startCommand.env) {
129
+ env = { ...env, ...startCommand.env };
149
130
  for (const key of Object.keys(env)) {
150
131
  if (typeof env[key] === 'string' && env[key].includes('$PORT')) {
151
- env[key] = env[key].replace('$PORT', projectPort.toString());
132
+ env[key] = env[key].replace(/\$PORT/g, projectPort.toString());
152
133
  }
153
134
  }
154
135
  }
@@ -166,7 +147,6 @@ export async function startServer({
166
147
  env,
167
148
  workingDir: '../project',
168
149
  acceptableErrorsRegexes,
169
- // logErrors: false, // we do more selective logging ourselves
170
150
  onError,
171
151
  processName: 'local-project-server',
172
152
  }),
@@ -183,6 +163,6 @@ export async function startServer({
183
163
  console.log(
184
164
  `CodeYam Error: Error executing start script: ${error.message}`,
185
165
  );
186
- throw error; // Rethrow the error to be caught in the main function
166
+ throw error;
187
167
  }
188
168
  }
@@ -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
+ }