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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +7 -7
  4. package/analyzer-template/packages/ai/index.ts +10 -2
  5. package/analyzer-template/packages/ai/package.json +2 -2
  6. package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +86 -18
  7. package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +67 -9
  8. package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +41 -17
  9. package/analyzer-template/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.ts +10 -17
  10. package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +308 -50
  11. package/analyzer-template/packages/ai/src/lib/astScopes/types.ts +15 -6
  12. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +837 -243
  13. package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.ts +5 -1
  14. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +16 -3
  15. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +6 -4
  16. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.ts +54 -3
  17. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +60 -15
  18. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.ts +70 -0
  19. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.ts +80 -5
  20. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.ts +179 -0
  21. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.ts +40 -30
  22. package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +393 -97
  23. package/analyzer-template/packages/ai/src/lib/generateEntityDataStructure.ts +58 -3
  24. package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +283 -1
  25. package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +9 -5
  26. package/analyzer-template/packages/ai/src/lib/generateExecutionFlows.ts +11 -3
  27. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionalEffects.ts +1 -1
  28. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromConditionals.ts +297 -7
  29. package/analyzer-template/packages/ai/src/lib/generateExecutionFlowsFromJsxUsages.ts +1 -1
  30. package/analyzer-template/packages/ai/src/lib/isolateScopes.ts +51 -3
  31. package/analyzer-template/packages/ai/src/lib/mergeStatements.ts +90 -96
  32. package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +10 -7
  33. package/analyzer-template/packages/ai/src/lib/resolvePathToControllable.ts +25 -13
  34. package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +4 -3
  35. package/analyzer-template/packages/ai/src/lib/worker/analyzeScopeWorker.ts +114 -2
  36. package/analyzer-template/packages/analyze/index.ts +2 -0
  37. package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +65 -59
  38. package/analyzer-template/packages/analyze/src/lib/ProjectAnalyzer.ts +113 -26
  39. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +19 -0
  40. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.ts +19 -0
  41. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +11 -0
  42. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.ts +8 -0
  43. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.ts +49 -1
  44. package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.ts +2 -1
  45. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +71 -9
  46. package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +19 -4
  47. package/analyzer-template/packages/analyze/src/lib/files/analyze/dependencyResolver.ts +6 -0
  48. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +4 -2
  49. package/analyzer-template/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.ts +0 -3
  50. package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +4 -5
  51. package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +14 -12
  52. package/analyzer-template/packages/analyze/src/lib/files/scenarios/TransformationTracer.ts +1315 -0
  53. package/analyzer-template/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.ts +61 -13
  54. package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +37 -0
  55. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +229 -19
  56. package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.ts +117 -9
  57. package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +459 -39
  58. package/analyzer-template/packages/analyze/src/lib/files/scenarios/propagateArrayItemSchemas.ts +474 -0
  59. package/analyzer-template/packages/analyze/src/lib/files/setImportedExports.ts +2 -1
  60. package/analyzer-template/packages/analyze/src/lib/index.ts +1 -0
  61. package/analyzer-template/packages/analyze/src/lib/utils/getFileByPath.ts +19 -0
  62. package/analyzer-template/packages/aws/package.json +1 -1
  63. package/analyzer-template/packages/database/package.json +1 -1
  64. package/analyzer-template/packages/database/src/lib/analysisBranchToDb.ts +1 -1
  65. package/analyzer-template/packages/database/src/lib/analysisToDb.ts +1 -1
  66. package/analyzer-template/packages/database/src/lib/branchToDb.ts +1 -1
  67. package/analyzer-template/packages/database/src/lib/commitBranchToDb.ts +1 -1
  68. package/analyzer-template/packages/database/src/lib/commitToDb.ts +1 -1
  69. package/analyzer-template/packages/database/src/lib/fileToDb.ts +1 -1
  70. package/analyzer-template/packages/database/src/lib/kysely/db.ts +14 -1
  71. package/analyzer-template/packages/database/src/lib/kysely/tables/commitsTable.ts +6 -0
  72. package/analyzer-template/packages/database/src/lib/kysely/tables/labsRequestsTable.ts +52 -0
  73. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +13 -0
  74. package/analyzer-template/packages/database/src/lib/loadBranch.ts +16 -1
  75. package/analyzer-template/packages/database/src/lib/loadCommit.ts +11 -0
  76. package/analyzer-template/packages/database/src/lib/loadCommits.ts +12 -0
  77. package/analyzer-template/packages/database/src/lib/loadEntityBranches.ts +12 -0
  78. package/analyzer-template/packages/database/src/lib/projectToDb.ts +1 -1
  79. package/analyzer-template/packages/database/src/lib/saveFiles.ts +1 -1
  80. package/analyzer-template/packages/database/src/lib/scenarioToDb.ts +1 -1
  81. package/analyzer-template/packages/database/src/lib/updateCommitMetadata.ts +7 -14
  82. package/analyzer-template/packages/database/src/lib/userScenarioToDb.ts +1 -1
  83. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js +1 -1
  84. package/analyzer-template/packages/github/dist/database/src/lib/analysisBranchToDb.js.map +1 -1
  85. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js +1 -1
  86. package/analyzer-template/packages/github/dist/database/src/lib/analysisToDb.js.map +1 -1
  87. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js +1 -1
  88. package/analyzer-template/packages/github/dist/database/src/lib/branchToDb.js.map +1 -1
  89. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js +1 -1
  90. package/analyzer-template/packages/github/dist/database/src/lib/commitBranchToDb.js.map +1 -1
  91. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js +1 -1
  92. package/analyzer-template/packages/github/dist/database/src/lib/commitToDb.js.map +1 -1
  93. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js +1 -1
  94. package/analyzer-template/packages/github/dist/database/src/lib/fileToDb.js.map +1 -1
  95. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts +2 -0
  96. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.d.ts.map +1 -1
  97. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js +11 -1
  98. package/analyzer-template/packages/github/dist/database/src/lib/kysely/db.js.map +1 -1
  99. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts +1 -0
  100. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.d.ts.map +1 -1
  101. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js +3 -0
  102. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  103. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts +23 -0
  104. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.d.ts.map +1 -0
  105. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  106. package/analyzer-template/packages/github/dist/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  107. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  108. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +8 -0
  109. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  110. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js +11 -1
  111. package/analyzer-template/packages/github/dist/database/src/lib/loadBranch.js.map +1 -1
  112. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.d.ts.map +1 -1
  113. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js +7 -0
  114. package/analyzer-template/packages/github/dist/database/src/lib/loadCommit.js.map +1 -1
  115. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.d.ts.map +1 -1
  116. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js +9 -0
  117. package/analyzer-template/packages/github/dist/database/src/lib/loadCommits.js.map +1 -1
  118. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.d.ts.map +1 -1
  119. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js +9 -0
  120. package/analyzer-template/packages/github/dist/database/src/lib/loadEntityBranches.js.map +1 -1
  121. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js +1 -1
  122. package/analyzer-template/packages/github/dist/database/src/lib/projectToDb.js.map +1 -1
  123. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js +1 -1
  124. package/analyzer-template/packages/github/dist/database/src/lib/saveFiles.js.map +1 -1
  125. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js +1 -1
  126. package/analyzer-template/packages/github/dist/database/src/lib/scenarioToDb.js.map +1 -1
  127. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts +2 -2
  128. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.d.ts.map +1 -1
  129. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js +5 -4
  130. package/analyzer-template/packages/github/dist/database/src/lib/updateCommitMetadata.js.map +1 -1
  131. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts +2 -0
  132. package/analyzer-template/packages/github/dist/types/src/types/Commit.d.ts.map +1 -1
  133. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  134. package/analyzer-template/packages/github/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  135. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  136. package/analyzer-template/packages/github/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  137. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  138. package/analyzer-template/packages/github/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  139. package/analyzer-template/packages/github/package.json +1 -1
  140. package/analyzer-template/packages/types/src/types/Commit.ts +2 -0
  141. package/analyzer-template/packages/types/src/types/ProjectMetadata.ts +7 -0
  142. package/analyzer-template/packages/types/src/types/ScenariosDataStructure.ts +6 -5
  143. package/analyzer-template/packages/types/src/types/ScopeAnalysis.ts +6 -1
  144. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts +2 -0
  145. package/analyzer-template/packages/utils/dist/types/src/types/Commit.d.ts.map +1 -1
  146. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts +7 -0
  147. package/analyzer-template/packages/utils/dist/types/src/types/ProjectMetadata.d.ts.map +1 -1
  148. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts +5 -5
  149. package/analyzer-template/packages/utils/dist/types/src/types/ScenariosDataStructure.d.ts.map +1 -1
  150. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts +6 -1
  151. package/analyzer-template/packages/utils/dist/types/src/types/ScopeAnalysis.d.ts.map +1 -1
  152. package/analyzer-template/playwright/capture.ts +20 -8
  153. package/analyzer-template/playwright/captureStatic.ts +1 -1
  154. package/analyzer-template/project/analyzeBaselineCommit.ts +5 -0
  155. package/analyzer-template/project/analyzeRegularCommit.ts +5 -0
  156. package/analyzer-template/project/captureLibraryFunctionDirect.ts +29 -26
  157. package/analyzer-template/project/constructMockCode.ts +90 -10
  158. package/analyzer-template/project/createEntitiesAndSortFiles.ts +83 -0
  159. package/analyzer-template/project/loadReadyToBeCaptured.ts +65 -41
  160. package/analyzer-template/project/orchestrateCapture/AwsCaptureTaskRunner.ts +12 -4
  161. package/analyzer-template/project/orchestrateCapture/SequentialCaptureTaskRunner.ts +11 -6
  162. package/analyzer-template/project/orchestrateCapture/taskRunner.ts +4 -2
  163. package/analyzer-template/project/orchestrateCapture.ts +45 -6
  164. package/analyzer-template/project/start.ts +35 -11
  165. package/analyzer-template/project/writeMockDataTsx.ts +181 -8
  166. package/analyzer-template/project/writeScenarioComponents.ts +60 -12
  167. package/analyzer-template/project/writeSimpleRoot.ts +21 -11
  168. package/analyzer-template/scripts/comboWorkerLoop.cjs +98 -50
  169. package/background/src/lib/local/createLocalAnalyzer.js +1 -1
  170. package/background/src/lib/local/createLocalAnalyzer.js.map +1 -1
  171. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js +5 -0
  172. package/background/src/lib/virtualized/project/analyzeBaselineCommit.js.map +1 -1
  173. package/background/src/lib/virtualized/project/analyzeRegularCommit.js +5 -0
  174. package/background/src/lib/virtualized/project/analyzeRegularCommit.js.map +1 -1
  175. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js +3 -3
  176. package/background/src/lib/virtualized/project/captureLibraryFunctionDirect.js.map +1 -1
  177. package/background/src/lib/virtualized/project/constructMockCode.js +75 -4
  178. package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
  179. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js +73 -1
  180. package/background/src/lib/virtualized/project/createEntitiesAndSortFiles.js.map +1 -1
  181. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js +19 -8
  182. package/background/src/lib/virtualized/project/loadReadyToBeCaptured.js.map +1 -1
  183. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js +2 -2
  184. package/background/src/lib/virtualized/project/orchestrateCapture/AwsCaptureTaskRunner.js.map +1 -1
  185. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js +4 -4
  186. package/background/src/lib/virtualized/project/orchestrateCapture/SequentialCaptureTaskRunner.js.map +1 -1
  187. package/background/src/lib/virtualized/project/orchestrateCapture.js +38 -6
  188. package/background/src/lib/virtualized/project/orchestrateCapture.js.map +1 -1
  189. package/background/src/lib/virtualized/project/start.js +32 -11
  190. package/background/src/lib/virtualized/project/start.js.map +1 -1
  191. package/background/src/lib/virtualized/project/writeMockDataTsx.js +162 -4
  192. package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
  193. package/background/src/lib/virtualized/project/writeScenarioComponents.js +60 -15
  194. package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
  195. package/background/src/lib/virtualized/project/writeSimpleRoot.js +21 -11
  196. package/background/src/lib/virtualized/project/writeSimpleRoot.js.map +1 -1
  197. package/codeyam-cli/scripts/apply-setup.js +180 -0
  198. package/codeyam-cli/scripts/apply-setup.js.map +1 -1
  199. package/codeyam-cli/src/cli.js +4 -0
  200. package/codeyam-cli/src/cli.js.map +1 -1
  201. package/codeyam-cli/src/commands/analyze.js +2 -0
  202. package/codeyam-cli/src/commands/analyze.js.map +1 -1
  203. package/codeyam-cli/src/commands/baseline.js +2 -0
  204. package/codeyam-cli/src/commands/baseline.js.map +1 -1
  205. package/codeyam-cli/src/commands/debug.js +9 -5
  206. package/codeyam-cli/src/commands/debug.js.map +1 -1
  207. package/codeyam-cli/src/commands/default.js +14 -4
  208. package/codeyam-cli/src/commands/default.js.map +1 -1
  209. package/codeyam-cli/src/commands/detect-universal-mocks.js +2 -0
  210. package/codeyam-cli/src/commands/detect-universal-mocks.js.map +1 -1
  211. package/codeyam-cli/src/commands/init.js +42 -184
  212. package/codeyam-cli/src/commands/init.js.map +1 -1
  213. package/codeyam-cli/src/commands/memory.js +264 -0
  214. package/codeyam-cli/src/commands/memory.js.map +1 -0
  215. package/codeyam-cli/src/commands/recapture.js +2 -0
  216. package/codeyam-cli/src/commands/recapture.js.map +1 -1
  217. package/codeyam-cli/src/commands/setup-sandbox.js +2 -0
  218. package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -1
  219. package/codeyam-cli/src/commands/setup-simulations.js +284 -0
  220. package/codeyam-cli/src/commands/setup-simulations.js.map +1 -0
  221. package/codeyam-cli/src/commands/test-startup.js +2 -0
  222. package/codeyam-cli/src/commands/test-startup.js.map +1 -1
  223. package/codeyam-cli/src/commands/verify.js +2 -0
  224. package/codeyam-cli/src/commands/verify.js.map +1 -1
  225. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +128 -86
  226. package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
  227. package/codeyam-cli/src/utils/analysisRunner.js +1 -1
  228. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  229. package/codeyam-cli/src/utils/analyzer.js +7 -0
  230. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  231. package/codeyam-cli/src/utils/backgroundServer.js +4 -0
  232. package/codeyam-cli/src/utils/backgroundServer.js.map +1 -1
  233. package/codeyam-cli/src/utils/install-skills.js +71 -46
  234. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  235. package/codeyam-cli/src/utils/labsAutoCheck.js +48 -0
  236. package/codeyam-cli/src/utils/labsAutoCheck.js.map +1 -0
  237. package/codeyam-cli/src/utils/progress.js +7 -0
  238. package/codeyam-cli/src/utils/progress.js.map +1 -1
  239. package/codeyam-cli/src/utils/queue/job.js +4 -0
  240. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  241. package/codeyam-cli/src/utils/requireSimulations.js +10 -0
  242. package/codeyam-cli/src/utils/requireSimulations.js.map +1 -0
  243. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js +82 -0
  244. package/codeyam-cli/src/utils/ruleReflection/__tests__/confusionDetector.test.js.map +1 -0
  245. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js +230 -0
  246. package/codeyam-cli/src/utils/ruleReflection/__tests__/contextBuilder.test.js.map +1 -0
  247. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js +67 -0
  248. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/assertRules.js.map +1 -0
  249. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js +105 -0
  250. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/captureFixture.js.map +1 -0
  251. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js +34 -0
  252. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/loadCapturedFixture.js.map +1 -0
  253. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js +162 -0
  254. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/runClaude.js.map +1 -0
  255. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js +75 -0
  256. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/helpers/setupTempProject.js.map +1 -0
  257. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js +378 -0
  258. package/codeyam-cli/src/utils/ruleReflection/__tests__/integration/ruleReflectionE2E.test.js.map +1 -0
  259. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js +115 -0
  260. package/codeyam-cli/src/utils/ruleReflection/__tests__/promptBuilder.test.js.map +1 -0
  261. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js +127 -0
  262. package/codeyam-cli/src/utils/ruleReflection/__tests__/transcriptParser.test.js.map +1 -0
  263. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js +50 -0
  264. package/codeyam-cli/src/utils/ruleReflection/confusionDetector.js.map +1 -0
  265. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js +116 -0
  266. package/codeyam-cli/src/utils/ruleReflection/contextBuilder.js.map +1 -0
  267. package/codeyam-cli/src/utils/ruleReflection/index.js +5 -0
  268. package/codeyam-cli/src/utils/ruleReflection/index.js.map +1 -0
  269. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js +44 -0
  270. package/codeyam-cli/src/utils/ruleReflection/promptBuilder.js.map +1 -0
  271. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js +85 -0
  272. package/codeyam-cli/src/utils/ruleReflection/transcriptParser.js.map +1 -0
  273. package/codeyam-cli/src/utils/ruleReflection/types.js +5 -0
  274. package/codeyam-cli/src/utils/ruleReflection/types.js.map +1 -0
  275. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js +293 -0
  276. package/codeyam-cli/src/utils/rules/__tests__/ruleState.test.js.map +1 -0
  277. package/codeyam-cli/src/utils/rules/index.js +6 -0
  278. package/codeyam-cli/src/utils/rules/index.js.map +1 -0
  279. package/codeyam-cli/src/utils/rules/parser.js +83 -0
  280. package/codeyam-cli/src/utils/rules/parser.js.map +1 -0
  281. package/codeyam-cli/src/utils/rules/pathMatcher.js +18 -0
  282. package/codeyam-cli/src/utils/rules/pathMatcher.js.map +1 -0
  283. package/codeyam-cli/src/utils/rules/ruleState.js +150 -0
  284. package/codeyam-cli/src/utils/rules/ruleState.js.map +1 -0
  285. package/codeyam-cli/src/utils/rules/staleness.js +137 -0
  286. package/codeyam-cli/src/utils/rules/staleness.js.map +1 -0
  287. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +20 -43
  288. package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
  289. package/codeyam-cli/src/webserver/app/lib/database.js +15 -3
  290. package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
  291. package/codeyam-cli/src/webserver/backgroundServer.js +31 -0
  292. package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
  293. package/codeyam-cli/src/webserver/build/client/assets/CopyButton-CA3JxPb7.js +1 -0
  294. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-B86KKU7e.js +11 -0
  295. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeBadge-DLqD3qNt.js → EntityTypeBadge-B5ctlSYt.js} +1 -1
  296. package/codeyam-cli/src/webserver/build/client/assets/{EntityTypeIcon-Ba2JVPzP.js → EntityTypeIcon-BqY8gDAW.js} +1 -1
  297. package/codeyam-cli/src/webserver/build/client/assets/{InlineSpinner-C8lyxW9k.js → InlineSpinner-ClaLpuOo.js} +1 -1
  298. package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-aht4aafF.js → InteractivePreview-BDhPilK7.js} +2 -2
  299. package/codeyam-cli/src/webserver/build/client/assets/{LibraryFunctionPreview-CVtiBnY5.js → LibraryFunctionPreview-VeqEBv9v.js} +1 -1
  300. package/codeyam-cli/src/webserver/build/client/assets/{LoadingDots-B0GLXMsr.js → LoadingDots-Bs7Nn1Jr.js} +1 -1
  301. package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-xgeCVgSM.js → LogViewer-Bm3PmcCz.js} +1 -1
  302. package/codeyam-cli/src/webserver/build/client/assets/{ReportIssueModal-D4TZhLuw.js → ReportIssueModal-C6PKeMYR.js} +3 -13
  303. package/codeyam-cli/src/webserver/build/client/assets/{SafeScreenshot-DuDvi0jm.js → SafeScreenshot-Gq3Ocjo6.js} +1 -1
  304. package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DEx02QDa.js → ScenarioViewer-BNLaXBHR.js} +3 -3
  305. package/codeyam-cli/src/webserver/build/client/assets/{TruncatedFilePath-DyFZkK0l.js → TruncatedFilePath-CiwXDxLh.js} +1 -1
  306. package/codeyam-cli/src/webserver/build/client/assets/{_index-BwqWJOgH.js → _index-B3TDXxnk.js} +1 -1
  307. package/codeyam-cli/src/webserver/build/client/assets/{activity.(_tab)-DoLIqZX2.js → activity.(_tab)-BtBFH820.js} +6 -16
  308. package/codeyam-cli/src/webserver/build/client/assets/agent-transcripts-CN61MOMa.js +11 -0
  309. package/codeyam-cli/src/webserver/build/client/assets/api.labs-survey-l0sNRNKZ.js +1 -0
  310. package/codeyam-cli/src/webserver/build/client/assets/api.labs-unlock-l0sNRNKZ.js +1 -0
  311. package/codeyam-cli/src/webserver/build/client/assets/api.memory-profile-l0sNRNKZ.js +1 -0
  312. package/codeyam-cli/src/webserver/build/client/assets/api.save-fixture-l0sNRNKZ.js +1 -0
  313. package/codeyam-cli/src/webserver/build/client/assets/book-open-PttOB2SF.js +6 -0
  314. package/codeyam-cli/src/webserver/build/client/assets/{chevron-down-Cx24_aWc.js → chevron-down-TJp6ofnp.js} +1 -1
  315. package/codeyam-cli/src/webserver/build/client/assets/{chunk-EPOLDU6W-CXRTFQ3F.js → chunk-JZWAC4HX-JE9ZIoBl.js} +12 -12
  316. package/codeyam-cli/src/webserver/build/client/assets/{circle-check-BOARzkeR.js → circle-check-CXhHQYrI.js} +1 -1
  317. package/codeyam-cli/src/webserver/build/client/assets/copy-6y9ALfGT.js +11 -0
  318. package/codeyam-cli/src/webserver/build/client/assets/{createLucideIcon-BdhJEx6B.js → createLucideIcon-Ca9fAY46.js} +1 -1
  319. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C5lqplTC.js +1 -0
  320. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-C2N4Op8e.js → entity._sha._-n38keI1k.js} +10 -10
  321. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-DavjRmOY.js → entity._sha.scenarios._scenarioId.fullscreen-CBoafmVs.js} +1 -1
  322. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.create-scenario-D1T4TGjf.js → entity._sha_.create-scenario-DGgZjdFg.js} +1 -1
  323. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha_.edit._scenarioId-CTBG2mmz.js → entity._sha_.edit._scenarioId-38yPijoD.js} +1 -1
  324. package/codeyam-cli/src/webserver/build/client/assets/{entry.client-CS2cb_eZ.js → entry.client-BSHEfydn.js} +1 -1
  325. package/codeyam-cli/src/webserver/build/client/assets/{fileTableUtils-DMJ7zii9.js → fileTableUtils-DCPhhSMo.js} +1 -1
  326. package/codeyam-cli/src/webserver/build/client/assets/files-0N0YJQv7.js +1 -0
  327. package/codeyam-cli/src/webserver/build/client/assets/{git-B4RJRvYB.js → git-DXnyr8uP.js} +8 -8
  328. package/codeyam-cli/src/webserver/build/client/assets/globals-EVn6Z9pz.css +1 -0
  329. package/codeyam-cli/src/webserver/build/client/assets/{index-lzqtyFU8.js → index-CcsFv748.js} +1 -1
  330. package/codeyam-cli/src/webserver/build/client/assets/{index-B1h680n5.js → index-ChN9-fAY.js} +1 -1
  331. package/codeyam-cli/src/webserver/build/client/assets/labs-CmBYA0PH.js +1 -0
  332. package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-B7B9V-bu.js → loader-circle-CTqLEAGU.js} +1 -1
  333. package/codeyam-cli/src/webserver/build/client/assets/manifest-aa4ff97b.js +1 -0
  334. package/codeyam-cli/src/webserver/build/client/assets/memory-BSlqS1QA.js +81 -0
  335. package/codeyam-cli/src/webserver/build/client/assets/pause-D6vreykR.js +11 -0
  336. package/codeyam-cli/src/webserver/build/client/assets/root-DVAbJY8B.js +62 -0
  337. package/codeyam-cli/src/webserver/build/client/assets/{search-CxXUmBSd.js → search-B8VUL8nl.js} +1 -1
  338. package/codeyam-cli/src/webserver/build/client/assets/settings-BK-cnzp-.js +1 -0
  339. package/codeyam-cli/src/webserver/build/client/assets/{simulations-DwFIBT09.js → simulations-CPoAg7Zo.js} +1 -1
  340. package/codeyam-cli/src/webserver/build/client/assets/terminal-BrCP7uQo.js +11 -0
  341. package/codeyam-cli/src/webserver/build/client/assets/{triangle-alert-B6LgvRJg.js → triangle-alert-BZz2NjYa.js} +1 -1
  342. package/codeyam-cli/src/webserver/build/client/assets/{useCustomSizes-C1v1PQzo.js → useCustomSizes-DNwUduNu.js} +1 -1
  343. package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-aSv48UbS.js → useLastLogLine-COky1GVF.js} +1 -1
  344. package/codeyam-cli/src/webserver/build/client/assets/{useReportContext-DYxHZQuP.js → useReportContext-CpZgwliL.js} +1 -1
  345. package/codeyam-cli/src/webserver/build/client/assets/{useToast-mBRpZPiu.js → useToast-Bv9JFvUO.js} +1 -1
  346. package/codeyam-cli/src/webserver/build/server/assets/index-Cz2RkDCa.js +1 -0
  347. package/codeyam-cli/src/webserver/build/server/assets/server-build-CUVsWicu.js +260 -0
  348. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  349. package/codeyam-cli/src/webserver/build-info.json +5 -5
  350. package/codeyam-cli/templates/{codeyam-power-rules-hook.sh → codeyam-memory-hook.sh} +12 -13
  351. package/codeyam-cli/templates/codeyam:diagnose.md +195 -496
  352. package/codeyam-cli/templates/codeyam:memory.md +403 -0
  353. package/codeyam-cli/templates/codeyam:new-rule.md +2 -2
  354. package/codeyam-cli/templates/codeyam:setup.md +12 -0
  355. package/codeyam-cli/templates/rule-notification-hook.py +56 -0
  356. package/codeyam-cli/templates/rule-reflection-hook.py +627 -0
  357. package/codeyam-cli/templates/rules-instructions.md +136 -0
  358. package/package.json +8 -6
  359. package/packages/ai/index.js +3 -2
  360. package/packages/ai/index.js.map +1 -1
  361. package/packages/ai/src/lib/analyzeScope.js +68 -13
  362. package/packages/ai/src/lib/analyzeScope.js.map +1 -1
  363. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +54 -8
  364. package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
  365. package/packages/ai/src/lib/astScopes/methodSemantics.js +41 -17
  366. package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
  367. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js +10 -14
  368. package/packages/ai/src/lib/astScopes/patterns/forInStatementHandler.js.map +1 -1
  369. package/packages/ai/src/lib/astScopes/processExpression.js +239 -43
  370. package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
  371. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +654 -166
  372. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  373. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js +5 -1
  374. package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/JavascriptFrameworkManager.js.map +1 -1
  375. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +13 -3
  376. package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -1
  377. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +6 -4
  378. package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -1
  379. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js +52 -3
  380. package/packages/ai/src/lib/dataStructure/helpers/cleanKnownObjectFunctions.js.map +1 -1
  381. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +55 -11
  382. package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
  383. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js +63 -0
  384. package/packages/ai/src/lib/dataStructure/helpers/coerceObjectsToPrimitivesBySchema.js.map +1 -0
  385. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js +73 -5
  386. package/packages/ai/src/lib/dataStructure/helpers/convertDotNotation.js.map +1 -1
  387. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js +173 -0
  388. package/packages/ai/src/lib/dataStructure/helpers/convertTypeAnnotationsToValues.js.map +1 -0
  389. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js +37 -20
  390. package/packages/ai/src/lib/dataStructure/helpers/deduplicateFunctionSchemas.js.map +1 -1
  391. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +333 -86
  392. package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
  393. package/packages/ai/src/lib/generateEntityDataStructure.js +46 -2
  394. package/packages/ai/src/lib/generateEntityDataStructure.js.map +1 -1
  395. package/packages/ai/src/lib/generateEntityScenarioData.js +205 -1
  396. package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
  397. package/packages/ai/src/lib/generateEntityScenarios.js +7 -1
  398. package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
  399. package/packages/ai/src/lib/generateExecutionFlows.js +10 -2
  400. package/packages/ai/src/lib/generateExecutionFlows.js.map +1 -1
  401. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js +209 -3
  402. package/packages/ai/src/lib/generateExecutionFlowsFromConditionals.js.map +1 -1
  403. package/packages/ai/src/lib/isolateScopes.js +39 -3
  404. package/packages/ai/src/lib/isolateScopes.js.map +1 -1
  405. package/packages/ai/src/lib/mergeStatements.js +70 -51
  406. package/packages/ai/src/lib/mergeStatements.js.map +1 -1
  407. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +10 -4
  408. package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
  409. package/packages/ai/src/lib/resolvePathToControllable.js +24 -14
  410. package/packages/ai/src/lib/resolvePathToControllable.js.map +1 -1
  411. package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
  412. package/packages/ai/src/lib/worker/analyzeScopeWorker.js +94 -1
  413. package/packages/ai/src/lib/worker/analyzeScopeWorker.js.map +1 -1
  414. package/packages/analyze/index.js +1 -0
  415. package/packages/analyze/index.js.map +1 -1
  416. package/packages/analyze/src/lib/FileAnalyzer.js +60 -36
  417. package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
  418. package/packages/analyze/src/lib/ProjectAnalyzer.js +96 -26
  419. package/packages/analyze/src/lib/ProjectAnalyzer.js.map +1 -1
  420. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js +14 -0
  421. package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -1
  422. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js +14 -0
  423. package/packages/analyze/src/lib/asts/sourceFiles/getAllEntityNodes.js.map +1 -1
  424. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +6 -0
  425. package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
  426. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js +6 -0
  427. package/packages/analyze/src/lib/asts/sourceFiles/getImportsAnalysis.js.map +1 -1
  428. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js +39 -1
  429. package/packages/analyze/src/lib/asts/sourceFiles/getResolvedModule.js.map +1 -1
  430. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js +2 -1
  431. package/packages/analyze/src/lib/asts/sourceFiles/getSourceFilesForAllImports.js.map +1 -1
  432. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +54 -6
  433. package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
  434. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +17 -4
  435. package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
  436. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js +5 -0
  437. package/packages/analyze/src/lib/files/analyze/dependencyResolver.js.map +1 -1
  438. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +2 -1
  439. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  440. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js +0 -3
  441. package/packages/analyze/src/lib/files/analyze/validateDependencyAnalyses.js.map +1 -1
  442. package/packages/analyze/src/lib/files/analyzeRemixRoute.js +3 -2
  443. package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
  444. package/packages/analyze/src/lib/files/getImportedExports.js +11 -7
  445. package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
  446. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js +880 -0
  447. package/packages/analyze/src/lib/files/scenarios/TransformationTracer.js.map +1 -0
  448. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js +56 -10
  449. package/packages/analyze/src/lib/files/scenarios/enrichArrayTypesFromChildSignatures.js.map +1 -1
  450. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +33 -8
  451. package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
  452. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +150 -17
  453. package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
  454. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js +56 -8
  455. package/packages/analyze/src/lib/files/scenarios/generateExecutionFlows.js.map +1 -1
  456. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +399 -31
  457. package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
  458. package/packages/analyze/src/lib/files/setImportedExports.js +2 -1
  459. package/packages/analyze/src/lib/files/setImportedExports.js.map +1 -1
  460. package/packages/analyze/src/lib/index.js +1 -0
  461. package/packages/analyze/src/lib/index.js.map +1 -1
  462. package/packages/analyze/src/lib/utils/getFileByPath.js +12 -0
  463. package/packages/analyze/src/lib/utils/getFileByPath.js.map +1 -0
  464. package/packages/database/src/lib/analysisBranchToDb.js +1 -1
  465. package/packages/database/src/lib/analysisBranchToDb.js.map +1 -1
  466. package/packages/database/src/lib/analysisToDb.js +1 -1
  467. package/packages/database/src/lib/analysisToDb.js.map +1 -1
  468. package/packages/database/src/lib/branchToDb.js +1 -1
  469. package/packages/database/src/lib/branchToDb.js.map +1 -1
  470. package/packages/database/src/lib/commitBranchToDb.js +1 -1
  471. package/packages/database/src/lib/commitBranchToDb.js.map +1 -1
  472. package/packages/database/src/lib/commitToDb.js +1 -1
  473. package/packages/database/src/lib/commitToDb.js.map +1 -1
  474. package/packages/database/src/lib/fileToDb.js +1 -1
  475. package/packages/database/src/lib/fileToDb.js.map +1 -1
  476. package/packages/database/src/lib/kysely/db.js +11 -1
  477. package/packages/database/src/lib/kysely/db.js.map +1 -1
  478. package/packages/database/src/lib/kysely/tables/commitsTable.js +3 -0
  479. package/packages/database/src/lib/kysely/tables/commitsTable.js.map +1 -1
  480. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js +35 -0
  481. package/packages/database/src/lib/kysely/tables/labsRequestsTable.js.map +1 -0
  482. package/packages/database/src/lib/loadAnalysis.js +8 -0
  483. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  484. package/packages/database/src/lib/loadBranch.js +11 -1
  485. package/packages/database/src/lib/loadBranch.js.map +1 -1
  486. package/packages/database/src/lib/loadCommit.js +7 -0
  487. package/packages/database/src/lib/loadCommit.js.map +1 -1
  488. package/packages/database/src/lib/loadCommits.js +9 -0
  489. package/packages/database/src/lib/loadCommits.js.map +1 -1
  490. package/packages/database/src/lib/loadEntityBranches.js +9 -0
  491. package/packages/database/src/lib/loadEntityBranches.js.map +1 -1
  492. package/packages/database/src/lib/projectToDb.js +1 -1
  493. package/packages/database/src/lib/projectToDb.js.map +1 -1
  494. package/packages/database/src/lib/saveFiles.js +1 -1
  495. package/packages/database/src/lib/saveFiles.js.map +1 -1
  496. package/packages/database/src/lib/scenarioToDb.js +1 -1
  497. package/packages/database/src/lib/scenarioToDb.js.map +1 -1
  498. package/packages/database/src/lib/updateCommitMetadata.js +5 -4
  499. package/packages/database/src/lib/updateCommitMetadata.js.map +1 -1
  500. package/scripts/finalize-analyzer.cjs +8 -76
  501. package/codeyam-cli/src/webserver/build/client/assets/EntityItem-BXhEawa3.js +0 -1
  502. package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BRb-0kQl.js +0 -1
  503. package/codeyam-cli/src/webserver/build/client/assets/files-Cs4MdYtv.js +0 -1
  504. package/codeyam-cli/src/webserver/build/client/assets/git-commit-horizontal-CysbcZxi.js +0 -6
  505. package/codeyam-cli/src/webserver/build/client/assets/globals-DMUaGAqV.css +0 -1
  506. package/codeyam-cli/src/webserver/build/client/assets/manifest-f874c610.js +0 -1
  507. package/codeyam-cli/src/webserver/build/client/assets/root-Bz5TunQg.js +0 -57
  508. package/codeyam-cli/src/webserver/build/client/assets/rules-hEkvVw2-.js +0 -97
  509. package/codeyam-cli/src/webserver/build/client/assets/settings-CS5f3WzT.js +0 -1
  510. package/codeyam-cli/src/webserver/build/server/assets/index-uNNbimct.js +0 -1
  511. package/codeyam-cli/src/webserver/build/server/assets/server-build-B08qC4Y7.js +0 -257
  512. package/codeyam-cli/templates/codeyam:power-rules.md +0 -449
  513. /package/codeyam-cli/src/webserver/build/client/assets/{api.rules-l0sNRNKZ.js → api.agent-transcripts-l0sNRNKZ.js} +0 -0
@@ -28,6 +28,14 @@ export interface SortedEntitiesAndMap {
28
28
  entityMap: { [key: string]: { [key: string]: EntityWithImportCount } };
29
29
  }
30
30
 
31
+ // Timing stats for debugging
32
+ let findOrCreateEntityTime = 0;
33
+ let gatherEntityMapTime = 0;
34
+ let recursiveCallTime = 0;
35
+ let findOrCreateEntityCalls = 0;
36
+ let gatherEntityMapCalls = 0;
37
+ let recursiveCalls = 0;
38
+
31
39
  async function findAndGatherEntity({
32
40
  project,
33
41
  branch,
@@ -37,6 +45,7 @@ async function findAndGatherEntity({
37
45
  projectAnalyzer,
38
46
  context,
39
47
  fileStore,
48
+ depth = 0,
40
49
  }: {
41
50
  project: Project;
42
51
  branch: Branch;
@@ -46,6 +55,7 @@ async function findAndGatherEntity({
46
55
  projectAnalyzer: ProjectAnalyzer;
47
56
  context: AnalysisContext;
48
57
  fileStore?: LazyFileStore;
58
+ depth?: number;
49
59
  }) {
50
60
  let entityWithImportCount: EntityWithImportCount = context.getEntity(
51
61
  file.path,
@@ -53,6 +63,7 @@ async function findAndGatherEntity({
53
63
  ) as EntityWithImportCount;
54
64
  if (entityWithImportCount?.importCount === undefined) {
55
65
  try {
66
+ const t0 = performance.now();
56
67
  entityWithImportCount = await findOrCreateEntity({
57
68
  file,
58
69
  branchId: branch?.id,
@@ -61,6 +72,8 @@ async function findAndGatherEntity({
61
72
  projectAnalyzer,
62
73
  context,
63
74
  });
75
+ findOrCreateEntityTime += performance.now() - t0;
76
+ findOrCreateEntityCalls++;
64
77
  } catch (e) {
65
78
  console.log(
66
79
  'CodeYam Warning: Entity not found in create and sort entities',
@@ -72,12 +85,15 @@ async function findAndGatherEntity({
72
85
  // Add entity to context
73
86
  context.addEntity(entityWithImportCount);
74
87
 
88
+ const t1 = performance.now();
75
89
  await gatherEntityMap({
76
90
  entity: entityWithImportCount,
77
91
  branchId: branch?.id,
78
92
  context,
79
93
  projectAnalyzer,
80
94
  });
95
+ gatherEntityMapTime += performance.now() - t1;
96
+ gatherEntityMapCalls++;
81
97
 
82
98
  entityWithImportCount.importCount = 0;
83
99
  for (const importedEntity of entityWithImportCount.metadata
@@ -105,6 +121,8 @@ async function findAndGatherEntity({
105
121
  continue;
106
122
  }
107
123
 
124
+ const t2 = performance.now();
125
+ recursiveCalls++;
108
126
  const info = await findAndGatherEntity({
109
127
  project,
110
128
  branch,
@@ -114,7 +132,11 @@ async function findAndGatherEntity({
114
132
  projectAnalyzer,
115
133
  context,
116
134
  fileStore,
135
+ depth: depth + 1,
117
136
  });
137
+ if (depth === 0) {
138
+ recursiveCallTime += performance.now() - t2;
139
+ }
118
140
  entityWithImportCount.importCount +=
119
141
  info.entityWithImportCount.importCount;
120
142
  }
@@ -147,6 +169,14 @@ export default async function createEntitiesAndSortFiles({
147
169
  branchCommit, // just for progress updates
148
170
  fileStore,
149
171
  }: EntitiesAndSortFiles): Promise<SortedEntitiesAndMap> {
172
+ // Reset timing stats
173
+ findOrCreateEntityTime = 0;
174
+ gatherEntityMapTime = 0;
175
+ recursiveCallTime = 0;
176
+ findOrCreateEntityCalls = 0;
177
+ gatherEntityMapCalls = 0;
178
+ recursiveCalls = 0;
179
+
150
180
  const sortedEntities: Entity[] = [];
151
181
 
152
182
  // We slightly abuse the AnalysisContext here, initializing and later throwing it away
@@ -161,6 +191,16 @@ export default async function createEntitiesAndSortFiles({
161
191
  // Enable baseline mode to skip DB reads during entity creation
162
192
  context.setBaselineMode(true);
163
193
  let ii = 0;
194
+ let updateCommitMetadataTime = 0;
195
+ let getFileAnalyzerTime = 0;
196
+ let getAllEntityNodesTime = 0;
197
+ const loopStart = performance.now();
198
+ let lastLogTime = loopStart;
199
+
200
+ console.log(
201
+ `CodeYam: createEntitiesAndSortFiles starting, ${filePaths.length} files to process`,
202
+ );
203
+
164
204
  for (const currentFilePath of filePaths) {
165
205
  if (filePath && currentFilePath !== filePath) {
166
206
  ii++;
@@ -179,16 +219,23 @@ export default async function createEntitiesAndSortFiles({
179
219
  }
180
220
 
181
221
  if (branchCommit) {
222
+ const t0 = performance.now();
182
223
  branchCommit.metadata = await updateCommitMetadata({
183
224
  commitId: branchCommit.id,
184
225
  runStatusUpdate: {
185
226
  filesCompleted: ii + 1,
186
227
  },
187
228
  });
229
+ updateCommitMetadataTime += performance.now() - t0;
188
230
  }
189
231
 
232
+ const t1 = performance.now();
190
233
  const fileAnalyzer = projectAnalyzer.getFileAnalyzer(file);
234
+ getFileAnalyzerTime += performance.now() - t1;
235
+
236
+ const t2 = performance.now();
191
237
  const allEntityNodes = fileAnalyzer.getAllEntityNodesOnlyAliases();
238
+ getAllEntityNodesTime += performance.now() - t2;
192
239
 
193
240
  for (const entityName of Object.keys(allEntityNodes)) {
194
241
  const { entityWithImportCount: entity } = await findAndGatherEntity({
@@ -206,8 +253,44 @@ export default async function createEntitiesAndSortFiles({
206
253
  }
207
254
 
208
255
  ii++;
256
+
257
+ // Log timing stats every 5 seconds
258
+ const now = performance.now();
259
+ if (now - lastLogTime > 5000) {
260
+ lastLogTime = now;
261
+ const elapsed = ((now - loopStart) / 1000).toFixed(1);
262
+ console.log(`CodeYam: createEntitiesAndSortFiles progress`, {
263
+ filesProcessed: ii,
264
+ totalFiles: filePaths.length,
265
+ elapsedSec: elapsed,
266
+ timings: {
267
+ updateCommitMetadata: `${(updateCommitMetadataTime / 1000).toFixed(1)}s`,
268
+ getFileAnalyzer: `${(getFileAnalyzerTime / 1000).toFixed(1)}s`,
269
+ getAllEntityNodes: `${(getAllEntityNodesTime / 1000).toFixed(1)}s`,
270
+ findOrCreateEntity: `${(findOrCreateEntityTime / 1000).toFixed(1)}s (${findOrCreateEntityCalls} calls)`,
271
+ gatherEntityMap: `${(gatherEntityMapTime / 1000).toFixed(1)}s (${gatherEntityMapCalls} calls)`,
272
+ recursiveCalls: `${(recursiveCallTime / 1000).toFixed(1)}s (${recursiveCalls} calls)`,
273
+ },
274
+ });
275
+ }
209
276
  }
210
277
 
278
+ // Final timing log
279
+ const totalElapsed = ((performance.now() - loopStart) / 1000).toFixed(1);
280
+ console.log(`CodeYam: createEntitiesAndSortFiles loop complete`, {
281
+ filesProcessed: ii,
282
+ totalFiles: filePaths.length,
283
+ elapsedSec: totalElapsed,
284
+ timings: {
285
+ updateCommitMetadata: `${(updateCommitMetadataTime / 1000).toFixed(1)}s`,
286
+ getFileAnalyzer: `${(getFileAnalyzerTime / 1000).toFixed(1)}s`,
287
+ getAllEntityNodes: `${(getAllEntityNodesTime / 1000).toFixed(1)}s`,
288
+ findOrCreateEntity: `${(findOrCreateEntityTime / 1000).toFixed(1)}s (${findOrCreateEntityCalls} calls)`,
289
+ gatherEntityMap: `${(gatherEntityMapTime / 1000).toFixed(1)}s (${gatherEntityMapCalls} calls)`,
290
+ recursiveCalls: `${(recursiveCallTime / 1000).toFixed(1)}s (${recursiveCalls} calls)`,
291
+ },
292
+ });
293
+
211
294
  await setImportedExports({
212
295
  entities: Object.values(sortedEntities).flat(),
213
296
  context,
@@ -7,6 +7,28 @@ import {
7
7
  import { Analysis, Project } from '~codeyam/types';
8
8
  import { LazyFileStore } from './LazyFileStore';
9
9
 
10
+ const DB_CONCURRENCY = 1;
11
+
12
+ async function mapWithConcurrency<T, R>(
13
+ items: T[],
14
+ fn: (item: T) => Promise<R>,
15
+ concurrency: number,
16
+ ): Promise<R[]> {
17
+ const results: R[] = new Array(items.length);
18
+ let index = 0;
19
+ const workers = Array.from(
20
+ { length: Math.min(concurrency, items.length) },
21
+ async () => {
22
+ while (index < items.length) {
23
+ const i = index++;
24
+ results[i] = await fn(items[i]);
25
+ }
26
+ },
27
+ );
28
+ await Promise.all(workers);
29
+ return results;
30
+ }
31
+
10
32
  interface LoadReadyToBeCapturedArgs {
11
33
  project: Project;
12
34
  branchCommitSha?: string;
@@ -77,8 +99,9 @@ async function gatherAllReferencedEntities(
77
99
  byFilePath.get(filePath)!.push(name);
78
100
  }
79
101
 
80
- // Batch load entities by file path
81
- const loadPromises = Array.from(byFilePath.entries()).map(
102
+ // Batch load entities by file path (concurrency-limited to avoid exhausting DB connections)
103
+ const results = await mapWithConcurrency(
104
+ Array.from(byFilePath.entries()),
82
105
  async ([filePath, names]) => {
83
106
  const entities = await loadEntities({
84
107
  projectId: project.id,
@@ -106,9 +129,8 @@ async function gatherAllReferencedEntities(
106
129
  return false;
107
130
  });
108
131
  },
132
+ DB_CONCURRENCY,
109
133
  );
110
-
111
- const results = await Promise.all(loadPromises);
112
134
  const loadedEntities = results.flat();
113
135
 
114
136
  // Add loaded entities to context
@@ -198,48 +220,50 @@ export default async function loadReadyToBeCaptured({
198
220
  foundNewDependencies = false;
199
221
  const currentBatch = Array.from(stillNeeded);
200
222
 
201
- // Load analyses for current batch
202
- const loadPromises = currentBatch.map(async (keyString) => {
203
- const [filePath, entityName] = keyString.split(':');
204
-
205
- // Find the file ID for this file path - use fileStore for O(1) lookup when available
206
- const file = fileStore
207
- ? fileStore.getByPath(filePath)
208
- : project.files.find((f) => f.path === filePath);
209
- if (!file) {
210
- console.log(
211
- `CodeYam Warning: File not found in project: ${filePath} for key ${keyString}`,
212
- );
213
- return null;
214
- }
215
-
216
- try {
217
- const analysis = await loadAnalysis({
218
- projectId: project.id,
219
- fileId: file.id,
220
- entityName,
221
- includeScenarios: isFirstBatch, // Only include scenarios for the root analyses
222
- });
223
-
224
- if (analysis) {
225
- console.log(`CodeYam: Loaded analysis ${filePath}:${entityName}`);
226
- return { key: keyString, analysis };
227
- } else {
223
+ // Load analyses for current batch (concurrency-limited to avoid exhausting DB connections)
224
+ const results = await mapWithConcurrency(
225
+ currentBatch,
226
+ async (keyString) => {
227
+ const [filePath, entityName] = keyString.split(':');
228
+
229
+ // Find the file ID for this file path - use fileStore for O(1) lookup when available
230
+ const file = fileStore
231
+ ? fileStore.getByPath(filePath)
232
+ : project.files.find((f) => f.path === filePath);
233
+ if (!file) {
228
234
  console.log(
229
- `CodeYam Warning: Analysis not found: ${filePath}:${entityName}`,
235
+ `CodeYam Warning: File not found in project: ${filePath} for key ${keyString}`,
230
236
  );
231
237
  return null;
232
238
  }
233
- } catch (error) {
234
- console.log(
235
- `CodeYam Error loading analysis ${filePath}:${entityName}:`,
236
- error,
237
- );
238
- return null;
239
- }
240
- });
241
239
 
242
- const results = await Promise.all(loadPromises);
240
+ try {
241
+ const analysis = await loadAnalysis({
242
+ projectId: project.id,
243
+ fileId: file.id,
244
+ entityName,
245
+ includeScenarios: isFirstBatch, // Only include scenarios for the root analyses
246
+ });
247
+
248
+ if (analysis) {
249
+ console.log(`CodeYam: Loaded analysis ${filePath}:${entityName}`);
250
+ return { key: keyString, analysis };
251
+ } else {
252
+ console.log(
253
+ `CodeYam Warning: Analysis not found: ${filePath}:${entityName}`,
254
+ );
255
+ return null;
256
+ }
257
+ } catch (error) {
258
+ console.log(
259
+ `CodeYam Error loading analysis ${filePath}:${entityName}:`,
260
+ error,
261
+ );
262
+ return null;
263
+ }
264
+ },
265
+ DB_CONCURRENCY,
266
+ );
243
267
 
244
268
  // Process loaded analyses and find new dependencies
245
269
  for (const result of results) {
@@ -35,7 +35,10 @@ export default class AwsCaptureTaskRunner implements CaptureTaskRunner {
35
35
  private sqs: SQSClient;
36
36
  private queueInfo: QueueInfo;
37
37
  private taskArns: string[];
38
- private batchCompletedCallback?: (analysisIds: string[]) => void;
38
+ private batchCompletedCallback?: (
39
+ analysisIds: string[],
40
+ success: boolean,
41
+ ) => void;
39
42
  private controlPollingInterval?: NodeJS.Timeout;
40
43
  private lastTaskHealthCheck = Date.now();
41
44
  private isCleanedUp = false;
@@ -213,7 +216,9 @@ export default class AwsCaptureTaskRunner implements CaptureTaskRunner {
213
216
  }
214
217
  }
215
218
 
216
- onBatchCompleted(callback: (analysisIds: string[]) => void): void {
219
+ onBatchCompleted(
220
+ callback: (analysisIds: string[], success: boolean) => void,
221
+ ): void {
217
222
  this.batchCompletedCallback = callback;
218
223
  }
219
224
 
@@ -255,9 +260,12 @@ export default class AwsCaptureTaskRunner implements CaptureTaskRunner {
255
260
  body.analysisIds &&
256
261
  Array.isArray(body.analysisIds)
257
262
  ) {
258
- // Notify callback
263
+ // Notify callback with success status (default false for backwards compatibility)
259
264
  if (this.batchCompletedCallback) {
260
- this.batchCompletedCallback(body.analysisIds);
265
+ this.batchCompletedCallback(
266
+ body.analysisIds,
267
+ body.success ?? false,
268
+ );
261
269
  }
262
270
  }
263
271
 
@@ -49,7 +49,10 @@ export interface SequentialCaptureTaskRunnerContext {
49
49
 
50
50
  export default class SequentialCaptureTaskRunner implements CaptureTaskRunner {
51
51
  private queue: string[][] = [];
52
- private batchCompletedCallback?: (analysisIds: string[]) => void;
52
+ private batchCompletedCallback?: (
53
+ analysisIds: string[],
54
+ success: boolean,
55
+ ) => void;
53
56
  private isProcessing = false;
54
57
  private isCleanedUp = false;
55
58
  private processingLoop: Promise<void> | null = null;
@@ -197,15 +200,15 @@ export default class SequentialCaptureTaskRunner implements CaptureTaskRunner {
197
200
  try {
198
201
  await this.processBatch(batch);
199
202
 
200
- // Notify callback of completion
203
+ // Notify callback of successful completion
201
204
  if (this.batchCompletedCallback) {
202
- this.batchCompletedCallback(batch);
205
+ this.batchCompletedCallback(batch, true);
203
206
  }
204
207
  } catch (error) {
205
208
  console.error('CodeYam: Error processing batch:', error);
206
- // Still notify callback so orchestration can track failures
209
+ // Notify callback of failure so orchestration can track retries
207
210
  if (this.batchCompletedCallback) {
208
- this.batchCompletedCallback(batch);
211
+ this.batchCompletedCallback(batch, false);
209
212
  }
210
213
  } finally {
211
214
  this.isProcessing = false;
@@ -399,7 +402,9 @@ export default class SequentialCaptureTaskRunner implements CaptureTaskRunner {
399
402
  console.log('CodeYam: Sequential task runner cleanup complete');
400
403
  }
401
404
 
402
- onBatchCompleted(callback: (analysisIds: string[]) => void): void {
405
+ onBatchCompleted(
406
+ callback: (analysisIds: string[], success: boolean) => void,
407
+ ): void {
403
408
  this.batchCompletedCallback = callback;
404
409
  }
405
410
  }
@@ -115,7 +115,9 @@ export interface CaptureTaskRunner {
115
115
  * Register callback for when workers complete batch processing.
116
116
  *
117
117
  * Critical for retry logic and progress tracking in orchestration.
118
- * Callback receives the analysis IDs that were completed.
118
+ * Callback receives the analysis IDs and whether the batch succeeded.
119
119
  */
120
- onBatchCompleted(callback: (analysisIds: string[]) => void): void;
120
+ onBatchCompleted(
121
+ callback: (analysisIds: string[], success: boolean) => void,
122
+ ): void;
121
123
  }
@@ -99,15 +99,20 @@ export default async function orchestrateCapture({
99
99
  const attemptCount = new Map<string, number>();
100
100
  const maxAttempts = 2;
101
101
 
102
+ // Track which analyses had a worker report success — only these can be "captured"
103
+ const confirmedSuccessAnalyses = new Set<string>();
104
+
102
105
  // Register batch completion callback with task runner
103
- taskRunner.onBatchCompleted((analysisIds: string[]) => {
106
+ taskRunner.onBatchCompleted((analysisIds: string[], success: boolean) => {
104
107
  console.log(
105
- `CodeYam Capture: Received batch completion for ${analysisIds.length} analyses: ${analysisIds.join(', ')}`,
108
+ `CodeYam Capture: Received batch completion (success=${success}) for ${analysisIds.length} analyses: ${analysisIds.join(', ')}`,
106
109
  );
107
- // Remove from inFlight and increment attempt count for each analysis
108
110
  for (const analysisId of analysisIds) {
109
111
  inFlight.delete(analysisId);
110
112
  attemptCount.set(analysisId, (attemptCount.get(analysisId) || 0) + 1);
113
+ if (success) {
114
+ confirmedSuccessAnalyses.add(analysisId);
115
+ }
111
116
  }
112
117
  });
113
118
 
@@ -195,9 +200,13 @@ export default async function orchestrateCapture({
195
200
  knownAnalyses.add(id);
196
201
  }
197
202
 
198
- // an analysis we've seen, but is no longer "ready to be captured", is captured!
203
+ // An analysis is "captured" only if:
204
+ // 1. A worker reported success for its batch (in confirmedSuccessAnalyses)
205
+ // 2. It no longer appears in the ready-to-be-captured list (DB confirms)
206
+ // This prevents transient empty DB results from inflating the captured count.
199
207
  const capturedAnalysisIds = Array.from(knownAnalyses).filter(
200
- (id) => !allReadyAnalysisIds.includes(id),
208
+ (id) =>
209
+ confirmedSuccessAnalyses.has(id) && !allReadyAnalysisIds.includes(id),
201
210
  );
202
211
 
203
212
  // Remove captured analyses from inFlight tracking
@@ -397,7 +406,9 @@ export default async function orchestrateCapture({
397
406
  // check if all enqueued analyses have been either captured or abandoned
398
407
  const allAnalysesSettled = Array.from(enqueuedAnalyses).every(
399
408
  (id) => {
400
- const captured = !allReadyAnalysisIds.includes(id);
409
+ const captured =
410
+ confirmedSuccessAnalyses.has(id) &&
411
+ !allReadyAnalysisIds.includes(id);
401
412
  const abandoned = (attemptCount.get(id) || 0) >= maxAttempts;
402
413
  return captured || abandoned;
403
414
  },
@@ -437,5 +448,33 @@ export default async function orchestrateCapture({
437
448
  } finally {
438
449
  // Always clean up task runner resources in finally block
439
450
  await taskRunner.cleanup();
451
+
452
+ const trackingCommit = metadataCommit ?? commit;
453
+ if (trackingCommit?.id) {
454
+ const captureCompletedAt = new Date().toISOString();
455
+
456
+ await updateCommitMetadata({
457
+ commitId: trackingCommit.id,
458
+ runStatusUpdate: {
459
+ captureCompletedAt,
460
+ capturePid: undefined,
461
+ },
462
+ // completedAt = max(analysisCompletedAt, captureCompletedAt)
463
+ // Normally capture finishes after analysis, but using max means illogical
464
+ // orderings leave a detectable signal (completedAt !== captureCompletedAt).
465
+ updateCallback(metadata) {
466
+ const run = metadata.currentRun!;
467
+ run.completedAt =
468
+ run.analysisCompletedAt &&
469
+ run.analysisCompletedAt > captureCompletedAt
470
+ ? run.analysisCompletedAt
471
+ : captureCompletedAt;
472
+ },
473
+ }).catch((error) => {
474
+ console.log(
475
+ `Warning: Failed to update capture completion metadata: ${error}`,
476
+ );
477
+ });
478
+ }
440
479
  }
441
480
  }
@@ -17,7 +17,8 @@ import { startScenarioCapture } from './startScenarioCapture';
17
17
  import { createController } from './controller/startController';
18
18
  import { awsLog, awsLogDebugLevel } from '~codeyam/utils';
19
19
  import * as v8 from 'v8';
20
- import { initializeAIServiceMode } from '~codeyam/ai';
20
+ import * as os from 'os';
21
+ import { initializeAIServiceMode, destroyWorkerPool } from '~codeyam/ai';
21
22
  import runAnalysis, { EnvConfig, SharedContext } from './runAnalysis';
22
23
  import {
23
24
  loadOrCreateCommit,
@@ -119,28 +120,31 @@ async function main({
119
120
  // and attempted to access project/commit/branch data before it was loaded.
120
121
  const sharedContext = await loadSharedContext(envConfig);
121
122
 
122
- // Heap monitoring: pulse every 1s, log every 30s when normal, warn every 1s when high
123
+ // Memory monitoring: tracks both V8 heap and RSS (which includes worker threads)
124
+ const containerMemoryMB = process.env.ECS_CONTAINER_MEMORY_MB
125
+ ? parseInt(process.env.ECS_CONTAINER_MEMORY_MB, 10)
126
+ : Math.round(os.totalmem() / 1024 / 1024);
123
127
  let lastLogTime = 0;
124
128
  setInterval(() => {
125
129
  const mem = process.memoryUsage();
126
130
  const heap = v8.getHeapStatistics();
127
- const usagePercent = (mem.heapUsed / heap.heap_size_limit) * 100;
131
+ const heapMB = Math.round(mem.heapUsed / 1024 / 1024);
132
+ const rssMB = Math.round(mem.rss / 1024 / 1024);
133
+ const heapLimitMB = Math.round(heap.heap_size_limit / 1024 / 1024);
134
+ const rssPercent = (rssMB / containerMemoryMB) * 100;
128
135
  const now = Date.now();
129
136
 
130
- if (usagePercent >= 80) {
131
- // High usage: warn every second
137
+ if (rssPercent >= 80) {
132
138
  console.warn(
133
- `CodeYam Heap Warning: ${Math.round(mem.heapUsed / 1024 / 1024)}MB used / ${Math.round(heap.heap_size_limit / 1024 / 1024)}MB limit (${Math.round(usagePercent)}%) ⚠️ HIGH USAGE`,
139
+ `CodeYam Memory Warning: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB ⚠️ HIGH`,
134
140
  );
135
- } else if (usagePercent >= 50 && now - lastLogTime >= 5000) {
136
- // Elevated usage: log every 5 seconds
141
+ } else if (rssPercent >= 50 && now - lastLogTime >= 5000) {
137
142
  console.log(
138
- `CodeYam Heap Notice: ${Math.round(mem.heapUsed / 1024 / 1024)}MB used / ${Math.round(heap.heap_size_limit / 1024 / 1024)}MB limit (${Math.round(usagePercent)}%) ⚠️ Elevated`,
143
+ `CodeYam Memory Notice: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB ⚠️ Elevated`,
139
144
  );
140
145
  } else if (now - lastLogTime >= 30000) {
141
- // Normal usage: log every 30 seconds
142
146
  console.log(
143
- `CodeYam Heap Stats: ${Math.round(mem.heapUsed / 1024 / 1024)}MB used / ${Math.round(heap.heap_size_limit / 1024 / 1024)}MB limit (${Math.round(usagePercent)}%) 📊 OK`,
147
+ `CodeYam Memory Stats: RSS ${rssMB}MB/${containerMemoryMB}MB (${Math.round(rssPercent)}%), heap ${heapMB}MB/${heapLimitMB}MB 📊 OK`,
144
148
  );
145
149
  }
146
150
 
@@ -187,6 +191,11 @@ async function main({
187
191
  analyzerPid: undefined,
188
192
  capturePid: process.pid,
189
193
  },
194
+ updateCallback(metadata) {
195
+ if (metadata.currentRun?.captureCompletedAt) {
196
+ metadata.currentRun.completedAt = new Date().toISOString();
197
+ }
198
+ },
190
199
  }).catch((error) => {
191
200
  awsLog(`Warning: Failed to update commit metadata: ${error}`);
192
201
  });
@@ -219,6 +228,10 @@ async function main({
219
228
  }
220
229
  awsLog('CodeYam: Analysis producing, starting orchestration...');
221
230
 
231
+ // Worker pool is no longer needed after data structure prep phase.
232
+ // Freeing it reclaims ~2GB before capture workers ramp up.
233
+ await destroyWorkerPool();
234
+
222
235
  // Create task runner based on orchestration mode
223
236
  let taskRunner;
224
237
 
@@ -229,6 +242,17 @@ async function main({
229
242
  framework: framework,
230
243
  packageManager: packageManager,
231
244
  });
245
+
246
+ const captureCommit =
247
+ sharedContext.commit ?? sharedContext.branchCommit;
248
+ if (captureCommit) {
249
+ await updateCommitMetadata({
250
+ commitId: captureCommit.id,
251
+ runStatusUpdate: {
252
+ captureTaskArns: taskRunner.getTaskArns(),
253
+ },
254
+ });
255
+ }
232
256
  } else if (orchestrateCapture === 'local-sequential') {
233
257
  taskRunner = await SequentialCaptureTaskRunner.create(
234
258
  {