reviewflow 3.12.0 → 3.14.0

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 (455) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/frameworks/claude/claudeInvoker.d.ts +31 -0
  3. package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
  4. package/dist/frameworks/claude/claudeInvoker.js +243 -288
  5. package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
  6. package/dist/frameworks/claude/streamJsonParser.d.ts +1 -38
  7. package/dist/frameworks/claude/streamJsonParser.d.ts.map +1 -1
  8. package/dist/frameworks/claude/streamJsonParser.js +16 -88
  9. package/dist/frameworks/claude/streamJsonParser.js.map +1 -1
  10. package/dist/frameworks/claude/timers/claudeInvocationTimers.d.ts +14 -0
  11. package/dist/frameworks/claude/timers/claudeInvocationTimers.d.ts.map +1 -0
  12. package/dist/frameworks/claude/timers/claudeInvocationTimers.js +23 -0
  13. package/dist/frameworks/claude/timers/claudeInvocationTimers.js.map +1 -0
  14. package/dist/frameworks/queue/pQueueAdapter.d.ts +2 -0
  15. package/dist/frameworks/queue/pQueueAdapter.d.ts.map +1 -1
  16. package/dist/frameworks/queue/pQueueAdapter.js +26 -5
  17. package/dist/frameworks/queue/pQueueAdapter.js.map +1 -1
  18. package/dist/frameworks/scheduler/supervisorScheduler.d.ts +17 -0
  19. package/dist/frameworks/scheduler/supervisorScheduler.d.ts.map +1 -0
  20. package/dist/frameworks/scheduler/supervisorScheduler.js +25 -0
  21. package/dist/frameworks/scheduler/supervisorScheduler.js.map +1 -0
  22. package/dist/main/dependencies.d.ts +4 -0
  23. package/dist/main/dependencies.d.ts.map +1 -1
  24. package/dist/main/dependencies.js +4 -0
  25. package/dist/main/dependencies.js.map +1 -1
  26. package/dist/main/routes.d.ts.map +1 -1
  27. package/dist/main/routes.js +14 -0
  28. package/dist/main/routes.js.map +1 -1
  29. package/dist/main/server.d.ts.map +1 -1
  30. package/dist/main/server.js +37 -0
  31. package/dist/main/server.js.map +1 -1
  32. package/dist/mcp/mcpServerStdio.d.ts.map +1 -1
  33. package/dist/mcp/mcpServerStdio.js +10 -1
  34. package/dist/mcp/mcpServerStdio.js.map +1 -1
  35. package/dist/modules/claude-invocation/entities/billingState/billingState.gateway.d.ts +8 -0
  36. package/dist/modules/claude-invocation/entities/billingState/billingState.gateway.d.ts.map +1 -0
  37. package/dist/modules/claude-invocation/entities/billingState/billingState.gateway.js +2 -0
  38. package/dist/modules/claude-invocation/entities/billingState/billingState.gateway.js.map +1 -0
  39. package/dist/modules/claude-invocation/entities/billingState/billingState.schema.d.ts +8 -0
  40. package/dist/modules/claude-invocation/entities/billingState/billingState.schema.d.ts.map +1 -0
  41. package/dist/modules/claude-invocation/entities/billingState/billingState.schema.js +7 -0
  42. package/dist/modules/claude-invocation/entities/billingState/billingState.schema.js.map +1 -0
  43. package/dist/modules/claude-invocation/entities/billingState/environment.gateway.d.ts +4 -0
  44. package/dist/modules/claude-invocation/entities/billingState/environment.gateway.d.ts.map +1 -0
  45. package/dist/modules/claude-invocation/entities/billingState/environment.gateway.js +2 -0
  46. package/dist/modules/claude-invocation/entities/billingState/environment.gateway.js.map +1 -0
  47. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.d.ts +16 -0
  48. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.d.ts.map +1 -0
  49. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts +52 -0
  50. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts.map +1 -0
  51. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.js +2 -0
  52. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.js.map +1 -0
  53. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.d.ts +11 -0
  54. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.d.ts.map +1 -0
  55. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.js +4 -0
  56. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.js.map +1 -0
  57. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.js +29 -0
  58. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.js.map +1 -0
  59. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts +38 -0
  60. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts.map +1 -0
  61. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js +27 -0
  62. package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js.map +1 -0
  63. package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.schema.d.ts +10 -0
  64. package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.schema.d.ts.map +1 -0
  65. package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.schema.js +14 -0
  66. package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.schema.js.map +1 -0
  67. package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.valueObject.d.ts +10 -0
  68. package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.valueObject.d.ts.map +1 -0
  69. package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.valueObject.js +11 -0
  70. package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.valueObject.js.map +1 -0
  71. package/dist/modules/claude-invocation/entities/sessionCompletion/mcpCompletion.gateway.d.ts +8 -0
  72. package/dist/modules/claude-invocation/entities/sessionCompletion/mcpCompletion.gateway.d.ts.map +1 -0
  73. package/dist/modules/claude-invocation/entities/sessionCompletion/mcpCompletion.gateway.js +2 -0
  74. package/dist/modules/claude-invocation/entities/sessionCompletion/mcpCompletion.gateway.js.map +1 -0
  75. package/dist/modules/claude-invocation/entities/sessionCompletion/reviewReport.gateway.d.ts +16 -0
  76. package/dist/modules/claude-invocation/entities/sessionCompletion/reviewReport.gateway.d.ts.map +1 -0
  77. package/dist/modules/claude-invocation/entities/sessionCompletion/reviewReport.gateway.js +2 -0
  78. package/dist/modules/claude-invocation/entities/sessionCompletion/reviewReport.gateway.js.map +1 -0
  79. package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.guard.d.ts +8 -0
  80. package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.guard.d.ts.map +1 -0
  81. package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.guard.js +7 -0
  82. package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.guard.js.map +1 -0
  83. package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.schema.d.ts +28 -0
  84. package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.schema.d.ts.map +1 -0
  85. package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.schema.js +9 -0
  86. package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.schema.js.map +1 -0
  87. package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.gateway.d.ts +6 -0
  88. package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.gateway.d.ts.map +1 -0
  89. package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.gateway.js +2 -0
  90. package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.gateway.js.map +1 -0
  91. package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.schema.d.ts +16 -0
  92. package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.schema.d.ts.map +1 -0
  93. package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.schema.js +8 -0
  94. package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.schema.js.map +1 -0
  95. package/dist/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.d.ts +10 -0
  96. package/dist/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.d.ts.map +1 -0
  97. package/dist/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.js +32 -0
  98. package/dist/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.js.map +1 -0
  99. package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.d.ts +25 -0
  100. package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.d.ts.map +1 -0
  101. package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.js +102 -0
  102. package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.js.map +1 -0
  103. package/dist/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.d.ts +8 -0
  104. package/dist/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.d.ts.map +1 -0
  105. package/dist/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.js +11 -0
  106. package/dist/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.js.map +1 -0
  107. package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.d.ts +34 -0
  108. package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.d.ts.map +1 -0
  109. package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.js +131 -0
  110. package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.js.map +1 -0
  111. package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.d.ts +10 -0
  112. package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.d.ts.map +1 -0
  113. package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.js +24 -0
  114. package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.js.map +1 -0
  115. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.d.ts +12 -0
  116. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.d.ts.map +1 -0
  117. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js +25 -0
  118. package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js.map +1 -0
  119. package/dist/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.d.ts +8 -0
  120. package/dist/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.d.ts.map +1 -0
  121. package/dist/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.js +18 -0
  122. package/dist/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.js.map +1 -0
  123. package/dist/modules/claude-invocation/usecases/auditBilling.usecase.d.ts +15 -0
  124. package/dist/modules/claude-invocation/usecases/auditBilling.usecase.d.ts.map +1 -0
  125. package/dist/modules/claude-invocation/usecases/auditBilling.usecase.js +12 -0
  126. package/dist/modules/claude-invocation/usecases/auditBilling.usecase.js.map +1 -0
  127. package/dist/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.d.ts +16 -0
  128. package/dist/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.d.ts.map +1 -0
  129. package/dist/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.js +64 -0
  130. package/dist/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.js.map +1 -0
  131. package/dist/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.d.ts +10 -0
  132. package/dist/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.d.ts.map +1 -0
  133. package/dist/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.js +12 -0
  134. package/dist/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.js.map +1 -0
  135. package/dist/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.d.ts +15 -0
  136. package/dist/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.d.ts.map +1 -0
  137. package/dist/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.js +25 -0
  138. package/dist/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.js.map +1 -0
  139. package/dist/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.d.ts +34 -0
  140. package/dist/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.d.ts.map +1 -0
  141. package/dist/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.js +32 -0
  142. package/dist/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.js.map +1 -0
  143. package/dist/modules/claude-invocation/usecases/retrieveReviewReport.usecase.d.ts +20 -0
  144. package/dist/modules/claude-invocation/usecases/retrieveReviewReport.usecase.d.ts.map +1 -0
  145. package/dist/modules/claude-invocation/usecases/retrieveReviewReport.usecase.js +17 -0
  146. package/dist/modules/claude-invocation/usecases/retrieveReviewReport.usecase.js.map +1 -0
  147. package/dist/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.d.ts +41 -0
  148. package/dist/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.d.ts.map +1 -0
  149. package/dist/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.js +88 -0
  150. package/dist/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.js.map +1 -0
  151. package/dist/modules/cli-configuration/interface-adapters/controllers/http/health.routes.d.ts +2 -0
  152. package/dist/modules/cli-configuration/interface-adapters/controllers/http/health.routes.d.ts.map +1 -1
  153. package/dist/modules/cli-configuration/interface-adapters/controllers/http/health.routes.js +16 -1
  154. package/dist/modules/cli-configuration/interface-adapters/controllers/http/health.routes.js.map +1 -1
  155. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts +6 -0
  156. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
  157. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js +16 -0
  158. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
  159. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts +6 -0
  160. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
  161. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js +31 -0
  162. package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
  163. package/dist/modules/review-execution/usecases/mcp/setPhase.usecase.d.ts +2 -0
  164. package/dist/modules/review-execution/usecases/mcp/setPhase.usecase.d.ts.map +1 -1
  165. package/dist/modules/review-execution/usecases/mcp/setPhase.usecase.js +4 -1
  166. package/dist/modules/review-execution/usecases/mcp/setPhase.usecase.js.map +1 -1
  167. package/dist/modules/supervisor-management/entities/supervisor/supervisor.gateway.d.ts +14 -0
  168. package/dist/modules/supervisor-management/entities/supervisor/supervisor.gateway.d.ts.map +1 -0
  169. package/dist/modules/supervisor-management/entities/supervisor/supervisor.gateway.js +2 -0
  170. package/dist/modules/supervisor-management/entities/supervisor/supervisor.gateway.js.map +1 -0
  171. package/dist/modules/supervisor-management/entities/supervisor/supervisorLock.gateway.d.ts +9 -0
  172. package/dist/modules/supervisor-management/entities/supervisor/supervisorLock.gateway.d.ts.map +1 -0
  173. package/dist/modules/supervisor-management/entities/supervisor/supervisorLock.gateway.js +2 -0
  174. package/dist/modules/supervisor-management/entities/supervisor/supervisorLock.gateway.js.map +1 -0
  175. package/dist/modules/supervisor-management/entities/supervisor/supervisorStatus.schema.d.ts +19 -0
  176. package/dist/modules/supervisor-management/entities/supervisor/supervisorStatus.schema.d.ts.map +1 -0
  177. package/dist/modules/supervisor-management/entities/supervisor/supervisorStatus.schema.js +11 -0
  178. package/dist/modules/supervisor-management/entities/supervisor/supervisorStatus.schema.js.map +1 -0
  179. package/dist/modules/supervisor-management/entities/supervisor/supervisorStatusStore.gateway.d.ts +6 -0
  180. package/dist/modules/supervisor-management/entities/supervisor/supervisorStatusStore.gateway.d.ts.map +1 -0
  181. package/dist/modules/supervisor-management/entities/supervisor/supervisorStatusStore.gateway.js +2 -0
  182. package/dist/modules/supervisor-management/entities/supervisor/supervisorStatusStore.gateway.js.map +1 -0
  183. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisor.cli.gateway.d.ts +25 -0
  184. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisor.cli.gateway.d.ts.map +1 -0
  185. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisor.cli.gateway.js +79 -0
  186. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisor.cli.gateway.js.map +1 -0
  187. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorLock.fileSystem.gateway.d.ts +22 -0
  188. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorLock.fileSystem.gateway.d.ts.map +1 -0
  189. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorLock.fileSystem.gateway.js +71 -0
  190. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorLock.fileSystem.gateway.js.map +1 -0
  191. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorStatusStore.memory.gateway.d.ts +8 -0
  192. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorStatusStore.memory.gateway.d.ts.map +1 -0
  193. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorStatusStore.memory.gateway.js +20 -0
  194. package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorStatusStore.memory.gateway.js.map +1 -0
  195. package/dist/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.d.ts +14 -0
  196. package/dist/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.d.ts.map +1 -0
  197. package/dist/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.js +51 -0
  198. package/dist/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.js.map +1 -0
  199. package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.d.ts +15 -0
  200. package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.d.ts.map +1 -0
  201. package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.js +2 -0
  202. package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.js.map +1 -0
  203. package/dist/modules/worktree-management/entities/worktree/worktree.d.ts +14 -0
  204. package/dist/modules/worktree-management/entities/worktree/worktree.d.ts.map +1 -0
  205. package/dist/modules/worktree-management/entities/worktree/worktree.gateway.d.ts +18 -0
  206. package/dist/modules/worktree-management/entities/worktree/worktree.gateway.d.ts.map +1 -0
  207. package/dist/modules/worktree-management/entities/worktree/worktree.gateway.js +2 -0
  208. package/dist/modules/worktree-management/entities/worktree/worktree.gateway.js.map +1 -0
  209. package/dist/modules/worktree-management/entities/worktree/worktree.js +58 -0
  210. package/dist/modules/worktree-management/entities/worktree/worktree.js.map +1 -0
  211. package/dist/modules/worktree-management/entities/worktree/worktree.schema.d.ts +54 -0
  212. package/dist/modules/worktree-management/entities/worktree/worktree.schema.d.ts.map +1 -0
  213. package/dist/modules/worktree-management/entities/worktree/worktree.schema.js +8 -0
  214. package/dist/modules/worktree-management/entities/worktree/worktree.schema.js.map +1 -0
  215. package/dist/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.d.ts +8 -0
  216. package/dist/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.d.ts.map +1 -0
  217. package/dist/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.js +28 -0
  218. package/dist/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.js.map +1 -0
  219. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.d.ts +17 -0
  220. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.d.ts.map +1 -0
  221. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js +67 -0
  222. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js.map +1 -0
  223. package/dist/modules/worktree-management/services/worktreeSettingsWriter.d.ts +4 -0
  224. package/dist/modules/worktree-management/services/worktreeSettingsWriter.d.ts.map +1 -0
  225. package/dist/modules/worktree-management/services/worktreeSettingsWriter.js +16 -0
  226. package/dist/modules/worktree-management/services/worktreeSettingsWriter.js.map +1 -0
  227. package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.d.ts +19 -0
  228. package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.d.ts.map +1 -0
  229. package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.js +53 -0
  230. package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.js.map +1 -0
  231. package/dist/modules/worktree-management/usecases/removeWorktree.usecase.d.ts +12 -0
  232. package/dist/modules/worktree-management/usecases/removeWorktree.usecase.d.ts.map +1 -0
  233. package/dist/modules/worktree-management/usecases/removeWorktree.usecase.js +26 -0
  234. package/dist/modules/worktree-management/usecases/removeWorktree.usecase.js.map +1 -0
  235. package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.d.ts +23 -0
  236. package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.d.ts.map +1 -0
  237. package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.js +63 -0
  238. package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.js.map +1 -0
  239. package/dist/shared/services/daemonPaths.d.ts +1 -0
  240. package/dist/shared/services/daemonPaths.d.ts.map +1 -1
  241. package/dist/shared/services/daemonPaths.js +1 -0
  242. package/dist/shared/services/daemonPaths.js.map +1 -1
  243. package/dist/tests/acceptance/169-migrate-claude-invocation-to-bg-mode.acceptance.test.d.ts +2 -0
  244. package/dist/tests/acceptance/169-migrate-claude-invocation-to-bg-mode.acceptance.test.d.ts.map +1 -0
  245. package/dist/tests/acceptance/169-migrate-claude-invocation-to-bg-mode.acceptance.test.js +238 -0
  246. package/dist/tests/acceptance/169-migrate-claude-invocation-to-bg-mode.acceptance.test.js.map +1 -0
  247. package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.d.ts +13 -0
  248. package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.d.ts.map +1 -0
  249. package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js +145 -0
  250. package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js.map +1 -0
  251. package/dist/tests/acceptance/172-claude-agents-supervisor-lifecycle.acceptance.test.d.ts +2 -0
  252. package/dist/tests/acceptance/172-claude-agents-supervisor-lifecycle.acceptance.test.d.ts.map +1 -0
  253. package/dist/tests/acceptance/172-claude-agents-supervisor-lifecycle.acceptance.test.js +118 -0
  254. package/dist/tests/acceptance/172-claude-agents-supervisor-lifecycle.acceptance.test.js.map +1 -0
  255. package/dist/tests/acceptance/46-github-followup-review-on-push.acceptance.test.js +5 -34
  256. package/dist/tests/acceptance/46-github-followup-review-on-push.acceptance.test.js.map +1 -1
  257. package/dist/tests/factories/claudeSession.factory.d.ts +5 -0
  258. package/dist/tests/factories/claudeSession.factory.d.ts.map +1 -0
  259. package/dist/tests/factories/claudeSession.factory.js +17 -0
  260. package/dist/tests/factories/claudeSession.factory.js.map +1 -0
  261. package/dist/tests/factories/sessionCompletion.factory.d.ts +5 -0
  262. package/dist/tests/factories/sessionCompletion.factory.d.ts.map +1 -0
  263. package/dist/tests/factories/sessionCompletion.factory.js +11 -0
  264. package/dist/tests/factories/sessionCompletion.factory.js.map +1 -0
  265. package/dist/tests/integration/claudeInvocation.integration.test.d.ts +2 -0
  266. package/dist/tests/integration/claudeInvocation.integration.test.d.ts.map +1 -0
  267. package/dist/tests/integration/claudeInvocation.integration.test.js +147 -0
  268. package/dist/tests/integration/claudeInvocation.integration.test.js.map +1 -0
  269. package/dist/tests/stubs/billingState.stub.d.ts +10 -0
  270. package/dist/tests/stubs/billingState.stub.d.ts.map +1 -0
  271. package/dist/tests/stubs/billingState.stub.js +32 -0
  272. package/dist/tests/stubs/billingState.stub.js.map +1 -0
  273. package/dist/tests/stubs/capturingLogger.stub.d.ts +9 -0
  274. package/dist/tests/stubs/capturingLogger.stub.d.ts.map +1 -0
  275. package/dist/tests/stubs/capturingLogger.stub.js +36 -0
  276. package/dist/tests/stubs/capturingLogger.stub.js.map +1 -0
  277. package/dist/tests/stubs/claudeSession.stub.d.ts +23 -0
  278. package/dist/tests/stubs/claudeSession.stub.d.ts.map +1 -0
  279. package/dist/tests/stubs/claudeSession.stub.js +55 -0
  280. package/dist/tests/stubs/claudeSession.stub.js.map +1 -0
  281. package/dist/tests/stubs/environment.stub.d.ts +7 -0
  282. package/dist/tests/stubs/environment.stub.d.ts.map +1 -0
  283. package/dist/tests/stubs/environment.stub.js +10 -0
  284. package/dist/tests/stubs/environment.stub.js.map +1 -0
  285. package/dist/tests/stubs/gitCommandExecutor.stub.d.ts +13 -0
  286. package/dist/tests/stubs/gitCommandExecutor.stub.d.ts.map +1 -0
  287. package/dist/tests/stubs/gitCommandExecutor.stub.js +25 -0
  288. package/dist/tests/stubs/gitCommandExecutor.stub.js.map +1 -0
  289. package/dist/tests/stubs/mcpCompletion.stub.d.ts +13 -0
  290. package/dist/tests/stubs/mcpCompletion.stub.d.ts.map +1 -0
  291. package/dist/tests/stubs/mcpCompletion.stub.js +29 -0
  292. package/dist/tests/stubs/mcpCompletion.stub.js.map +1 -0
  293. package/dist/tests/stubs/reviewReport.stub.d.ts +11 -0
  294. package/dist/tests/stubs/reviewReport.stub.d.ts.map +1 -0
  295. package/dist/tests/stubs/reviewReport.stub.js +21 -0
  296. package/dist/tests/stubs/reviewReport.stub.js.map +1 -0
  297. package/dist/tests/stubs/supervisor.stub.d.ts +12 -0
  298. package/dist/tests/stubs/supervisor.stub.d.ts.map +1 -0
  299. package/dist/tests/stubs/supervisor.stub.js +25 -0
  300. package/dist/tests/stubs/supervisor.stub.js.map +1 -0
  301. package/dist/tests/stubs/supervisorHealth.stub.d.ts +8 -0
  302. package/dist/tests/stubs/supervisorHealth.stub.d.ts.map +1 -0
  303. package/dist/tests/stubs/supervisorHealth.stub.js +18 -0
  304. package/dist/tests/stubs/supervisorHealth.stub.js.map +1 -0
  305. package/dist/tests/stubs/supervisorLock.stub.d.ts +10 -0
  306. package/dist/tests/stubs/supervisorLock.stub.d.ts.map +1 -0
  307. package/dist/tests/stubs/supervisorLock.stub.js +19 -0
  308. package/dist/tests/stubs/supervisorLock.stub.js.map +1 -0
  309. package/dist/tests/units/architecture/noClaudePInProduction.test.d.ts +2 -0
  310. package/dist/tests/units/architecture/noClaudePInProduction.test.d.ts.map +1 -0
  311. package/dist/tests/units/architecture/noClaudePInProduction.test.js +89 -0
  312. package/dist/tests/units/architecture/noClaudePInProduction.test.js.map +1 -0
  313. package/dist/tests/units/frameworks/claude/buildSpawnEnv.test.d.ts +2 -0
  314. package/dist/tests/units/frameworks/claude/buildSpawnEnv.test.d.ts.map +1 -0
  315. package/dist/tests/units/frameworks/claude/buildSpawnEnv.test.js +30 -0
  316. package/dist/tests/units/frameworks/claude/buildSpawnEnv.test.js.map +1 -0
  317. package/dist/tests/units/frameworks/claude/claudeInvoker.test.js +24 -27
  318. package/dist/tests/units/frameworks/claude/claudeInvoker.test.js.map +1 -1
  319. package/dist/tests/units/frameworks/claude/mcpContext.test.js +3 -1
  320. package/dist/tests/units/frameworks/claude/mcpContext.test.js.map +1 -1
  321. package/dist/tests/units/frameworks/claude/streamJsonParser.test.js +15 -72
  322. package/dist/tests/units/frameworks/claude/streamJsonParser.test.js.map +1 -1
  323. package/dist/tests/units/frameworks/claude/timers/claudeInvocationTimers.test.d.ts +2 -0
  324. package/dist/tests/units/frameworks/claude/timers/claudeInvocationTimers.test.d.ts.map +1 -0
  325. package/dist/tests/units/frameworks/claude/timers/claudeInvocationTimers.test.js +66 -0
  326. package/dist/tests/units/frameworks/claude/timers/claudeInvocationTimers.test.js.map +1 -0
  327. package/dist/tests/units/frameworks/queue/pQueueAdapter.test.d.ts +2 -0
  328. package/dist/tests/units/frameworks/queue/pQueueAdapter.test.d.ts.map +1 -0
  329. package/dist/tests/units/frameworks/queue/pQueueAdapter.test.js +116 -0
  330. package/dist/tests/units/frameworks/queue/pQueueAdapter.test.js.map +1 -0
  331. package/dist/tests/units/frameworks/scheduler/supervisorScheduler.test.d.ts +2 -0
  332. package/dist/tests/units/frameworks/scheduler/supervisorScheduler.test.d.ts.map +1 -0
  333. package/dist/tests/units/frameworks/scheduler/supervisorScheduler.test.js +76 -0
  334. package/dist/tests/units/frameworks/scheduler/supervisorScheduler.test.js.map +1 -0
  335. package/dist/tests/units/interface-adapters/controllers/http/health.routes.test.js +45 -0
  336. package/dist/tests/units/interface-adapters/controllers/http/health.routes.test.js.map +1 -1
  337. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js +27 -0
  338. package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js.map +1 -1
  339. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +43 -0
  340. package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
  341. package/dist/tests/units/modules/claude-invocation/entities/claudeSession/claudeSession.test.d.ts +2 -0
  342. package/dist/tests/units/modules/claude-invocation/entities/claudeSession/claudeSession.test.d.ts.map +1 -0
  343. package/dist/tests/units/modules/claude-invocation/entities/claudeSession/claudeSession.test.js +51 -0
  344. package/dist/tests/units/modules/claude-invocation/entities/claudeSession/claudeSession.test.js.map +1 -0
  345. package/dist/tests/units/modules/claude-invocation/entities/retrySchedule/retrySchedule.test.d.ts +2 -0
  346. package/dist/tests/units/modules/claude-invocation/entities/retrySchedule/retrySchedule.test.d.ts.map +1 -0
  347. package/dist/tests/units/modules/claude-invocation/entities/retrySchedule/retrySchedule.test.js +28 -0
  348. package/dist/tests/units/modules/claude-invocation/entities/retrySchedule/retrySchedule.test.js.map +1 -0
  349. package/dist/tests/units/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.test.d.ts +2 -0
  350. package/dist/tests/units/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.test.d.ts.map +1 -0
  351. package/dist/tests/units/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.test.js +27 -0
  352. package/dist/tests/units/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.test.js.map +1 -0
  353. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.test.d.ts +2 -0
  354. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.test.d.ts.map +1 -0
  355. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.test.js +40 -0
  356. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.test.js.map +1 -0
  357. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.d.ts +2 -0
  358. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.d.ts.map +1 -0
  359. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.js +188 -0
  360. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.js.map +1 -0
  361. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.test.d.ts +2 -0
  362. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.test.d.ts.map +1 -0
  363. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.test.js +17 -0
  364. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.test.js.map +1 -0
  365. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.test.d.ts +2 -0
  366. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.test.d.ts.map +1 -0
  367. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.test.js +119 -0
  368. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.test.js.map +1 -0
  369. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.test.d.ts +2 -0
  370. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.test.d.ts.map +1 -0
  371. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.test.js +39 -0
  372. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.test.js.map +1 -0
  373. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.d.ts +2 -0
  374. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.d.ts.map +1 -0
  375. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.js +64 -0
  376. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.js.map +1 -0
  377. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.test.d.ts +2 -0
  378. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.test.d.ts.map +1 -0
  379. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.test.js +32 -0
  380. package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.test.js.map +1 -0
  381. package/dist/tests/units/modules/claude-invocation/usecases/auditBilling.usecase.test.d.ts +2 -0
  382. package/dist/tests/units/modules/claude-invocation/usecases/auditBilling.usecase.test.d.ts.map +1 -0
  383. package/dist/tests/units/modules/claude-invocation/usecases/auditBilling.usecase.test.js +33 -0
  384. package/dist/tests/units/modules/claude-invocation/usecases/auditBilling.usecase.test.js.map +1 -0
  385. package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.d.ts +2 -0
  386. package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.d.ts.map +1 -0
  387. package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.js +53 -0
  388. package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.js.map +1 -0
  389. package/dist/tests/units/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.test.d.ts +2 -0
  390. package/dist/tests/units/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.test.d.ts.map +1 -0
  391. package/dist/tests/units/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.test.js +31 -0
  392. package/dist/tests/units/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.test.js.map +1 -0
  393. package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.d.ts +2 -0
  394. package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.d.ts.map +1 -0
  395. package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.js +17 -0
  396. package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.js.map +1 -0
  397. package/dist/tests/units/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.test.d.ts +2 -0
  398. package/dist/tests/units/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.test.d.ts.map +1 -0
  399. package/dist/tests/units/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.test.js +97 -0
  400. package/dist/tests/units/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.test.js.map +1 -0
  401. package/dist/tests/units/modules/claude-invocation/usecases/retrieveReviewReport.usecase.test.d.ts +2 -0
  402. package/dist/tests/units/modules/claude-invocation/usecases/retrieveReviewReport.usecase.test.d.ts.map +1 -0
  403. package/dist/tests/units/modules/claude-invocation/usecases/retrieveReviewReport.usecase.test.js +49 -0
  404. package/dist/tests/units/modules/claude-invocation/usecases/retrieveReviewReport.usecase.test.js.map +1 -0
  405. package/dist/tests/units/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.test.d.ts +2 -0
  406. package/dist/tests/units/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.test.d.ts.map +1 -0
  407. package/dist/tests/units/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.test.js +171 -0
  408. package/dist/tests/units/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.test.js.map +1 -0
  409. package/dist/tests/units/modules/supervisor-management/entities/supervisorStatus.schema.test.d.ts +2 -0
  410. package/dist/tests/units/modules/supervisor-management/entities/supervisorStatus.schema.test.d.ts.map +1 -0
  411. package/dist/tests/units/modules/supervisor-management/entities/supervisorStatus.schema.test.js +32 -0
  412. package/dist/tests/units/modules/supervisor-management/entities/supervisorStatus.schema.test.js.map +1 -0
  413. package/dist/tests/units/modules/supervisor-management/gateways/supervisor.cli.gateway.test.d.ts +2 -0
  414. package/dist/tests/units/modules/supervisor-management/gateways/supervisor.cli.gateway.test.d.ts.map +1 -0
  415. package/dist/tests/units/modules/supervisor-management/gateways/supervisor.cli.gateway.test.js +85 -0
  416. package/dist/tests/units/modules/supervisor-management/gateways/supervisor.cli.gateway.test.js.map +1 -0
  417. package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.d.ts +2 -0
  418. package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.d.ts.map +1 -0
  419. package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.js +94 -0
  420. package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.js.map +1 -0
  421. package/dist/tests/units/modules/supervisor-management/gateways/supervisorStatusStore.memory.gateway.test.d.ts +2 -0
  422. package/dist/tests/units/modules/supervisor-management/gateways/supervisorStatusStore.memory.gateway.test.d.ts.map +1 -0
  423. package/dist/tests/units/modules/supervisor-management/gateways/supervisorStatusStore.memory.gateway.test.js +26 -0
  424. package/dist/tests/units/modules/supervisor-management/gateways/supervisorStatusStore.memory.gateway.test.js.map +1 -0
  425. package/dist/tests/units/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.test.d.ts +2 -0
  426. package/dist/tests/units/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.test.d.ts.map +1 -0
  427. package/dist/tests/units/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.test.js +129 -0
  428. package/dist/tests/units/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.test.js.map +1 -0
  429. package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.d.ts +2 -0
  430. package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.d.ts.map +1 -0
  431. package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.js +54 -0
  432. package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.js.map +1 -0
  433. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.test.d.ts +2 -0
  434. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.test.d.ts.map +1 -0
  435. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.test.js +35 -0
  436. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.test.js.map +1 -0
  437. package/dist/tests/units/modules/worktree-management/services/worktreeSettingsWriter.test.d.ts +2 -0
  438. package/dist/tests/units/modules/worktree-management/services/worktreeSettingsWriter.test.d.ts.map +1 -0
  439. package/dist/tests/units/modules/worktree-management/services/worktreeSettingsWriter.test.js +32 -0
  440. package/dist/tests/units/modules/worktree-management/services/worktreeSettingsWriter.test.js.map +1 -0
  441. package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.d.ts +2 -0
  442. package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.d.ts.map +1 -0
  443. package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.js +113 -0
  444. package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.js.map +1 -0
  445. package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.d.ts +2 -0
  446. package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.d.ts.map +1 -0
  447. package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.js +55 -0
  448. package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.js.map +1 -0
  449. package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.d.ts +2 -0
  450. package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.d.ts.map +1 -0
  451. package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.js +131 -0
  452. package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.js.map +1 -0
  453. package/dist/tests/units/usecases/mcp/setPhase.usecase.test.js +21 -0
  454. package/dist/tests/units/usecases/mcp/setPhase.usecase.test.js.map +1 -1
  455. package/package.json +1 -1
@@ -2,7 +2,6 @@ import { spawn } from 'node:child_process';
2
2
  import { writeFileSync, mkdirSync, existsSync, unlinkSync } from 'node:fs';
3
3
  import { join, dirname } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
- import { ProgressParser } from '../../frameworks/claude/progressParser.js';
6
5
  import { logInfo, logWarn, logError } from '../../frameworks/logging/logBuffer.js';
7
6
  import { getModel } from '../../frameworks/settings/runtimeSettings.js';
8
7
  import { getProjectAgents, getFollowupAgents, loadProjectConfig } from '../../config/projectConfig.js';
@@ -23,8 +22,14 @@ import { FilesystemTokenUsageGateway } from '../../modules/token-accounting/inte
23
22
  import { GetBudgetStatusUseCase } from '../../modules/token-accounting/usecases/getBudgetStatus/getBudgetStatus.usecase.js';
24
23
  import { FilesystemBudgetGateway } from '../../modules/token-accounting/interface-adapters/gateways/budget/budget.filesystem.gateway.js';
25
24
  import { BudgetStatusPresenter } from '../../modules/token-accounting/interface-adapters/presenters/budgetStatus.presenter.js';
26
- import { broadcastBudgetAfterUsage } from '../../frameworks/claude/broadcastBudgetAfterUsage.js';
27
- import { StreamJsonParser } from '../../frameworks/claude/streamJsonParser.js';
25
+ import { ClaudeSessionCliGateway, } from '../../modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.js';
26
+ import { FileSystemMcpCompletionBridge } from '../../modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.js';
27
+ import { ReviewReportFileSystemGateway } from '../../modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js';
28
+ import { InMemoryBillingStateGateway } from '../../modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.js';
29
+ import { ProcessEnvironmentGateway } from '../../modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.js';
30
+ import { runClaudeReviewJob } from '../../modules/claude-invocation/usecases/runClaudeReviewJob.usecase.js';
31
+ import { WorktreeFileSystemGateway } from '../../modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js';
32
+ import { GitCommandCliGateway } from '../../modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.js';
28
33
  /**
29
34
  * Default wiring used when invokeClaudeReview is called without explicit deps.
30
35
  *
@@ -34,6 +39,62 @@ import { StreamJsonParser } from '../../frameworks/claude/streamJsonParser.js';
34
39
  * The no-op `broadcastBudgetStatus` here is intentional for tests and CLI
35
40
  * one-shots where there is no WebSocket fanout to perform.
36
41
  */
42
+ /**
43
+ * Build the environment for spawning a Claude child process.
44
+ *
45
+ * Strips CLAUDECODE so a Claude-launched ReviewFlow does not leak its parent
46
+ * session marker into the child, and forces TERM=dumb + CI=true to keep the
47
+ * child in non-interactive mode.
48
+ */
49
+ export function buildSpawnEnv(processEnv, override) {
50
+ const { CLAUDECODE: _claudeCode, ...rest } = processEnv;
51
+ return {
52
+ ...rest,
53
+ TERM: 'dumb',
54
+ CI: 'true',
55
+ ...(override ?? {}),
56
+ };
57
+ }
58
+ /**
59
+ * Default process runner used by createDefaultClaudeInvocationDeps when the
60
+ * composition root does not provide one. Wraps node:child_process.spawn so
61
+ * tests can inject a fake runner instead.
62
+ */
63
+ function defaultProcessRunner() {
64
+ return async ({ args, cwd, env }) => new Promise((resolve, reject) => {
65
+ const child = spawn(resolveClaudePath(), args, {
66
+ cwd,
67
+ env: buildSpawnEnv(process.env, env),
68
+ stdio: ['ignore', 'pipe', 'pipe'],
69
+ });
70
+ let stdout = '';
71
+ let stderr = '';
72
+ child.stdout?.on('data', chunk => {
73
+ stdout += chunk.toString();
74
+ });
75
+ child.stderr?.on('data', chunk => {
76
+ stderr += chunk.toString();
77
+ });
78
+ child.on('error', reject);
79
+ child.on('close', code => {
80
+ resolve({ stdout, stderr, exitCode: code ?? -1 });
81
+ });
82
+ });
83
+ }
84
+ export function createDefaultClaudeInvocationDeps() {
85
+ return {
86
+ sessionGateway: new ClaudeSessionCliGateway(defaultProcessRunner()),
87
+ // FileSystem-backed because the MCP server runs in a sub-process spawned
88
+ // by `claude --bg`, so an in-memory bridge cannot reach the Fastify host.
89
+ // See FileSystemMcpCompletionBridge for the wire format.
90
+ completionBridge: new FileSystemMcpCompletionBridge(),
91
+ reportGateway: new ReviewReportFileSystemGateway(),
92
+ billingState: new InMemoryBillingStateGateway(),
93
+ environment: new ProcessEnvironmentGateway(),
94
+ timeoutMs: 15 * 60 * 1000,
95
+ pollIntervalMs: 30 * 1000,
96
+ };
97
+ }
37
98
  export function createDefaultClaudeInvokerDependencies() {
38
99
  const tokenUsageGateway = new FilesystemTokenUsageGateway();
39
100
  const budgetGateway = new FilesystemBudgetGateway();
@@ -48,6 +109,8 @@ export function createDefaultClaudeInvokerDependencies() {
48
109
  getBudgetStatus: new GetBudgetStatusUseCase({ budgetGateway, tokenUsageGateway }),
49
110
  budgetStatusPresenter: new BudgetStatusPresenter(),
50
111
  broadcastBudgetStatus: () => { },
112
+ invocation: createDefaultClaudeInvocationDeps(),
113
+ worktreeGateway: new WorktreeFileSystemGateway({ executor: new GitCommandCliGateway() }),
51
114
  };
52
115
  }
53
116
  const currentDir = dirname(fileURLToPath(import.meta.url));
@@ -116,10 +179,6 @@ export function cleanupMcpContext(jobId) {
116
179
  // Ignore cleanup errors
117
180
  }
118
181
  }
119
- // Memory guard configuration
120
- const MEMORY_LIMIT_GB = 4; // Kill process if RSS exceeds 4GB
121
- const MEMORY_CHECK_INTERVAL_MS = 5000; // Check every 5 seconds
122
- const MEMORY_LIMIT_BYTES = MEMORY_LIMIT_GB * 1024 * 1024 * 1024;
123
182
  function fetchDiffStatsSafely(job, deps, logger) {
124
183
  try {
125
184
  const gateway = deps.diffStatsFetchFactory(job.platform);
@@ -155,9 +214,6 @@ async function resolveModel(job, diffStats, deps, logger) {
155
214
  * This instruction is AUTHORITATIVE and forces Claude to use MCP tools
156
215
  */
157
216
  export function buildMcpSystemPrompt(job) {
158
- const isGitHub = job.platform === 'github';
159
- const diffSourceCommand = isGitHub ? `gh pr diff ${job.mrNumber}` : `glab mr diff ${job.mrNumber}`;
160
- const metadataSourceCommand = isGitHub ? `gh pr view ${job.mrNumber}` : `glab mr view ${job.mrNumber}`;
161
217
  return `
162
218
  # AUTOMATED REVIEW MODE - EXECUTE IMMEDIATELY
163
219
 
@@ -189,22 +245,9 @@ These rules are about WRITING production code. You are in **READ-ONLY review mod
189
245
  - **Source Branch**: ${job.sourceBranch || 'unknown'}
190
246
  - **Target Branch**: ${job.targetBranch || 'unknown'}
191
247
 
192
- ## CRITICAL: Data Source Rules
193
-
194
- The local repository at \`${job.localPath}\` may be checked out on a DIFFERENT branch than MR !${job.mrNumber}.
195
- Multiple reviews can run concurrently on the same repo. The local state is UNRELIABLE.
196
-
197
- **SOURCE OF TRUTH for the MR diff**: \`${diffSourceCommand}\` — use this, NEVER \`git diff\`.
198
- **SOURCE OF TRUTH for MR metadata**: \`${metadataSourceCommand}\` — use this for branch names, title, description.
199
- **SOURCE OF TRUTH for threads**: \`get_threads({ jobId: "${job.id}" })\` — MCP tool.
200
-
201
- **FORBIDDEN — these reflect LOCAL state, not the MR:**
202
- - \`git diff\`, \`git log\`, \`git branch\`, \`git status\`
203
- - Reading local files as source of truth for what the MR changes
204
- - Assuming the local branch matches the MR being reviewed
205
-
206
- **ALLOWED — local repo for conflict detection only:**
207
- - Reading local files to check if they conflict with MR changes (advisory only)
248
+ The current working directory is the dedicated worktree for this MR. The branch is already
249
+ checked out and up to date — \`git diff\`, \`git log\`, and local file reads reflect MR state.
250
+ For thread metadata always use the MCP tool: \`get_threads({ jobId: "${job.id}" })\`.
208
251
 
209
252
  ## MANDATORY MCP Tools Usage
210
253
 
@@ -281,21 +324,19 @@ export async function invokeClaudeReview(job, logger, onProgress, signal, deps =
281
324
  // Build MCP config: isolated from project .mcp.json to avoid
282
325
  // third-party MCP servers (e.g. gitnexus) causing initialization timeouts
283
326
  const mcpConfigJson = buildMcpConfigJson();
284
- // Build arguments
285
- // --permission-mode bypassPermissions: automated review, no user to approve
286
- // --allowedTools / --disallowedTools: belt-and-suspenders to restrict tool scope
287
- // --mcp-config + --strict-mcp-config: use ONLY review-progress MCP server
327
+ // Build arguments for the --bg (background subscription billing) invocation.
328
+ // The session id is captured from stdout; completion is observed through MCP
329
+ // (set_phase) or `claude agents --json` polling. No -p, no --print, no stream-json.
288
330
  const args = [
289
- '--output-format', 'stream-json',
290
- '--verbose',
331
+ '--bg',
291
332
  '--model', model,
292
- '--permission-mode', 'bypassPermissions',
333
+ '--permission-mode', 'auto',
293
334
  '--append-system-prompt', mcpSystemPrompt,
294
335
  '--mcp-config', mcpConfigJson,
295
336
  '--strict-mcp-config',
296
337
  '--allowedTools', 'Read,Glob,Grep,Bash,Edit,Task,Skill,Write,LSP,mcp__review-progress__*',
297
338
  '--disallowedTools', 'EnterPlanMode,AskUserQuestion',
298
- '-p', prompt,
339
+ prompt,
299
340
  ];
300
341
  // Setup MCP job context file (used by MCP server to identify the review)
301
342
  writeMcpContext(job);
@@ -319,13 +360,6 @@ export async function invokeClaudeReview(job, logger, onProgress, signal, deps =
319
360
  jobType: job.jobType || 'review',
320
361
  customAgents: projectAgents?.length ?? 'default',
321
362
  });
322
- // Initialize progress parser with project agents (or defaults)
323
- const progressParser = new ProgressParser(job.id, (event, progress) => {
324
- logger.debug({ event, progress: progress.overallProgress }, 'Progress update');
325
- onProgress?.(progress, event);
326
- }, projectAgents);
327
- // Emit initial progress
328
- onProgress?.(progressParser.getProgress());
329
363
  // Check if already cancelled
330
364
  if (signal?.aborted) {
331
365
  logWarn('Review annulée avant démarrage', { jobId: job.id });
@@ -335,265 +369,186 @@ export async function invokeClaudeReview(job, logger, onProgress, signal, deps =
335
369
  stdout: '',
336
370
  stderr: 'Review cancelled before start',
337
371
  durationMs: Date.now() - startTime,
338
- finalProgress: progressParser.getProgress(),
339
372
  cancelled: true,
340
373
  };
341
374
  }
342
- return new Promise((resolve) => {
343
- let stdout = '';
344
- let stderr = '';
345
- let cancelled = false;
346
- const streamParser = new StreamJsonParser();
347
- const childEnv = { ...process.env };
348
- // Remove CLAUDECODE to allow spawning Claude from within a Claude session
349
- childEnv.CLAUDECODE = undefined;
350
- const child = spawn(resolveClaudePath(), args, {
351
- cwd: job.localPath,
352
- env: {
353
- ...childEnv,
354
- // Ensure non-interactive mode
355
- TERM: 'dumb',
356
- CI: 'true',
357
- // Note: MCP env vars are now passed via --mcp-config
358
- },
359
- stdio: ['ignore', 'pipe', 'pipe'],
360
- });
361
- // Memory guard: monitor RSS and kill if exceeds limit
362
- let memoryExceeded = false;
363
- const memoryCheckInterval = setInterval(() => {
364
- const memUsage = process.memoryUsage();
365
- const rssMB = Math.round(memUsage.rss / 1024 / 1024);
366
- if (memUsage.rss > MEMORY_LIMIT_BYTES) {
367
- memoryExceeded = true;
368
- const errorMessage = `
369
- ╔═══════════════════════════════════════════════════════════════════╗
370
- ║ 🚨 MEMORY LIMIT EXCEEDED - REVIEW KILLED ║
371
- ╠═══════════════════════════════════════════════════════════════════╣
372
- ║ ║
373
- ║ Current RSS: ${rssMB} MB (limit: ${MEMORY_LIMIT_GB * 1024} MB) ║
374
- ║ Job: ${job.id.substring(0, 50).padEnd(50)} ║
375
- ║ ║
376
- ║ The review process consumed too much memory. ║
377
- ║ This usually happens when running too many sub-agents ║
378
- ║ in parallel. Consider using sequential execution. ║
379
- ║ ║
380
- ╚═══════════════════════════════════════════════════════════════════╝
381
- `;
382
- logger.error({ rssMB, limitMB: MEMORY_LIMIT_GB * 1024, jobId: job.id }, 'Memory limit exceeded, killing process');
383
- logError('Memory limit exceeded', {
384
- jobId: job.id,
385
- rssMB,
386
- limitMB: MEMORY_LIMIT_GB * 1024,
387
- message: 'Review killed due to excessive memory consumption',
388
- });
389
- // Output error to stderr for visibility
390
- stderr += errorMessage;
391
- // Kill the child process
392
- child.kill('SIGKILL');
393
- clearInterval(memoryCheckInterval);
394
- }
395
- else if (rssMB > (MEMORY_LIMIT_GB * 1024 * 0.8)) {
396
- // Warn when approaching limit (80%)
397
- logger.warn({ rssMB, limitMB: MEMORY_LIMIT_GB * 1024 }, 'Memory usage high, approaching limit');
398
- }
399
- }, MEMORY_CHECK_INTERVAL_MS);
400
- // Handle cancellation via AbortSignal
401
- const abortHandler = () => {
402
- if (!cancelled) {
403
- cancelled = true;
404
- logger.info({ jobId: job.id }, 'Review annulée par utilisateur');
405
- logWarn('Review annulée', { jobId: job.id });
406
- child.kill('SIGTERM');
407
- // Give it time to cleanup, then force kill
408
- setTimeout(() => {
409
- if (!child.killed) {
410
- child.kill('SIGKILL');
411
- }
412
- }, 5000);
413
- }
375
+ return invokeViaBackgroundSession({
376
+ job,
377
+ prompt,
378
+ model,
379
+ mcpSystemPrompt,
380
+ mcpConfigJson,
381
+ diffStats,
382
+ startTime,
383
+ signal,
384
+ }, logger, onProgress, deps);
385
+ }
386
+ function deriveMrSourceFromJob(job) {
387
+ if (job.sourceForkCloneUrl) {
388
+ return { kind: 'fork', cloneUrl: job.sourceForkCloneUrl };
389
+ }
390
+ return { kind: 'origin' };
391
+ }
392
+ async function invokeViaBackgroundSession(context, logger, onProgress, deps) {
393
+ const { job, prompt, model, mcpSystemPrompt, mcpConfigJson, diffStats, startTime, signal } = context;
394
+ const invocation = deps.invocation;
395
+ const mergeRequestId = `${job.platform}-${job.projectPath}-${job.mrNumber}`;
396
+ const jobType = job.jobType === 'followup' ? 'followup' : 'review';
397
+ const ensureStart = Date.now();
398
+ const ensureResult = await deps.worktreeGateway.ensure({
399
+ identity: {
400
+ platform: job.platform,
401
+ projectPath: job.projectPath,
402
+ mrNumber: job.mrNumber,
403
+ },
404
+ sourceBranch: job.sourceBranch,
405
+ source: deriveMrSourceFromJob(job),
406
+ sourceCheckoutPath: job.localPath,
407
+ });
408
+ const ensureDurationMs = Date.now() - ensureStart;
409
+ logger.info({ jobId: job.id, ensureDurationMs, status: ensureResult.status }, 'ensureWorktree completed');
410
+ if (ensureResult.status === 'failed') {
411
+ cleanupMcpContext(job.id);
412
+ logError('Préparation worktree échouée', { jobId: job.id, reason: ensureResult.reason });
413
+ return {
414
+ success: false,
415
+ exitCode: null,
416
+ stdout: '',
417
+ stderr: `ensureWorktree failed: ${ensureResult.reason}`,
418
+ durationMs: Date.now() - startTime,
419
+ selectedModel: model,
414
420
  };
415
- if (signal) {
416
- signal.addEventListener('abort', abortHandler, { once: true });
417
- }
418
- child.stdout.on('data', (data) => {
419
- const chunk = data.toString();
420
- stdout += chunk;
421
- streamParser.feed(chunk);
422
- // Progress markers may still appear in assistant text within stream-json events;
423
- // feeding the raw chunk keeps any legacy markers detected without coupling to JSON shape.
424
- progressParser.parseChunk(chunk);
425
- const preview = chunk.length > 200 ? chunk.substring(0, 200) + '...' : chunk;
426
- logger.debug({ preview }, 'Claude stdout');
427
- });
428
- child.stderr.on('data', (data) => {
429
- const chunk = data.toString();
430
- stderr += chunk;
431
- logger.warn({ chunk }, 'Claude stderr');
432
- logWarn('Claude stderr', { jobId: job.id, message: chunk.substring(0, 500) });
421
+ }
422
+ if (ensureResult.status === 'created' && ensureResult.settingsWarning !== null) {
423
+ logger.warn({ jobId: job.id, warning: ensureResult.settingsWarning }, 'Worktree created but settings write produced a warning (FR-4 bgIsolation may not be applied)');
424
+ }
425
+ const worktreePath = ensureResult.path;
426
+ // attempt counter is reserved for the queue layer to re-enqueue with backoff
427
+ // when status === 'retry' is returned. Until that wiring exists, every
428
+ // invocation is treated as attempt 0 and a single retry signal surfaces back
429
+ // to the controller as a soft failure.
430
+ const attempt = 0;
431
+ const flags = {
432
+ model,
433
+ mcpConfigJson,
434
+ systemPrompt: mcpSystemPrompt,
435
+ allowedTools: 'Read,Glob,Grep,Bash,Edit,Task,Skill,Write,LSP,mcp__review-progress__*',
436
+ disallowedTools: 'EnterPlanMode,AskUserQuestion',
437
+ permissionMode: 'auto',
438
+ };
439
+ let result;
440
+ try {
441
+ result = await runClaudeReviewJob({
442
+ jobId: job.id,
443
+ jobType,
444
+ prompt,
445
+ flags,
446
+ localPath: worktreePath,
447
+ mergeRequestId,
448
+ mergeRequestNumber: job.mrNumber,
449
+ attempt,
450
+ signal,
451
+ }, {
452
+ sessionGateway: invocation.sessionGateway,
453
+ completionBridge: invocation.completionBridge,
454
+ reportGateway: invocation.reportGateway,
455
+ billingState: invocation.billingState,
456
+ environment: invocation.environment,
457
+ now: () => new Date(),
458
+ timeoutMs: invocation.timeoutMs,
459
+ pollIntervalMs: invocation.pollIntervalMs,
433
460
  });
434
- child.on('error', (error) => {
435
- logger.error({ error }, 'Erreur lors du spawn de Claude');
436
- logError('Erreur spawn Claude', { jobId: job.id, error: error.message });
437
- progressParser.markFailed(error.message);
438
- resolve({
439
- success: false,
440
- exitCode: null,
441
- stdout,
442
- stderr: stderr + `\nSpawn error: ${error.message}`,
443
- durationMs: Date.now() - startTime,
444
- finalProgress: progressParser.getProgress(),
445
- });
461
+ }
462
+ catch (error) {
463
+ cleanupMcpContext(job.id);
464
+ const message = error instanceof Error ? error.message : String(error);
465
+ logger.error({ error: message, jobId: job.id }, 'runClaudeReviewJob threw');
466
+ logError('Review en erreur', { jobId: job.id, message });
467
+ return {
468
+ success: false,
469
+ exitCode: null,
470
+ stdout: '',
471
+ stderr: message,
472
+ durationMs: Date.now() - startTime,
473
+ selectedModel: model,
474
+ };
475
+ }
476
+ cleanupMcpContext(job.id);
477
+ const durationMs = Date.now() - startTime;
478
+ const durationMin = Math.round(durationMs / 60000);
479
+ if (result.status === 'completed') {
480
+ logInfo('Review terminée', {
481
+ jobId: job.id,
482
+ mrNumber: job.mrNumber,
483
+ duration: `${durationMin} min`,
484
+ outputLength: result.content.length,
485
+ model,
446
486
  });
447
- child.on('close', async (code) => {
448
- // Cleanup interval, abort listener, and MCP context
449
- clearInterval(memoryCheckInterval);
450
- cleanupMcpContext(job.id);
451
- if (signal) {
452
- signal.removeEventListener('abort', abortHandler);
453
- }
454
- const durationMs = Date.now() - startTime;
455
- const success = code === 0 && !cancelled && !memoryExceeded;
456
- const assistantText = streamParser.getAssistantText();
457
- const tokenUsage = streamParser.getUsage();
458
- // Save logs: raw stream-json + reconstructed human text for readability
487
+ // Save review statistics (followups are not counted as reviews)
488
+ if (job.jobType !== 'followup') {
459
489
  try {
460
- const logsDir = join(job.localPath, '.claude', 'reviews', 'logs');
461
- if (!existsSync(logsDir)) {
462
- mkdirSync(logsDir, { recursive: true });
463
- }
464
- const sanitizedJobId = job.id.replace(/[:/\\]/g, '-');
465
- const logPath = join(logsDir, `${sanitizedJobId}-stdout.log`);
466
- writeFileSync(logPath, `=== Claude Review Output ===\nJob: ${job.id}\nMR: ${job.mrNumber}\nSkill: ${job.skill}\nModel: ${model}\nExit code: ${code}\nDuration: ${Math.round(durationMs / 1000)}s\nTimestamp: ${new Date().toISOString()}\n\n--- ASSISTANT TEXT ---\n${assistantText}\n\n--- STDERR ---\n${stderr}\n\n--- RAW STREAM-JSON ---\n${stdout}\n`);
467
- logger.info({ logPath }, 'Review stdout saved to log file');
490
+ const mrId = `${job.platform}-${job.projectPath}-${job.mrNumber}`;
491
+ const mrDetails = deps.trackingGateway.getById(job.localPath, mrId);
492
+ const assignedBy = mrDetails?.assignment?.username;
493
+ const reviewStats = addReviewStats(job.localPath, job.mrNumber, durationMs, result.content, assignedBy, diffStats);
494
+ logger.info({ reviewStats }, 'Stats de review enregistrées');
468
495
  }
469
- catch {
470
- // Non-critical
496
+ catch (statsError) {
497
+ logger.warn({ error: statsError }, 'Erreur lors de l\'enregistrement des stats');
471
498
  }
472
- // Finalize progress
473
- if (memoryExceeded) {
474
- progressParser.markFailed('Memory limit exceeded - review killed');
475
- }
476
- else if (cancelled) {
477
- progressParser.markFailed('Annulée par utilisateur');
478
- }
479
- else if (success) {
480
- progressParser.markAllCompleted();
481
- }
482
- else {
483
- progressParser.markFailed(`Exit code: ${code}`);
484
- }
485
- const finalProgress = progressParser.getProgress();
486
- onProgress?.(finalProgress);
487
- logger.info({
488
- exitCode: code,
489
- durationMs,
490
- stdoutLength: stdout.length,
491
- stderrLength: stderr.length,
492
- finalProgress: finalProgress.overallProgress,
493
- cancelled,
494
- memoryExceeded,
495
- }, memoryExceeded
496
- ? 'Claude killed - memory limit exceeded'
497
- : cancelled
498
- ? 'Claude annulé'
499
- : success
500
- ? 'Claude terminé avec succès'
501
- : 'Claude terminé avec erreur');
502
- // Log to dashboard with summary
503
- const durationMin = Math.round(durationMs / 60000);
504
- if (memoryExceeded) {
505
- logError('Review killed - Memory limit exceeded', {
506
- jobId: job.id,
507
- mrNumber: job.mrNumber,
508
- duration: `${durationMin} min`,
509
- limitGB: MEMORY_LIMIT_GB,
510
- });
511
- }
512
- else if (cancelled) {
513
- logWarn('Review annulée', {
514
- jobId: job.id,
515
- mrNumber: job.mrNumber,
516
- duration: `${durationMin} min`,
517
- });
518
- }
519
- else if (success) {
520
- logInfo('Review terminée', {
521
- jobId: job.id,
522
- mrNumber: job.mrNumber,
523
- duration: `${durationMin} min`,
524
- outputLength: assistantText.length,
525
- model,
526
- });
527
- // Save review statistics (followups are not counted as reviews)
528
- if (job.jobType !== 'followup') {
529
- try {
530
- const mrId = `${job.platform}-${job.projectPath}-${job.mrNumber}`;
531
- const mrDetails = deps.trackingGateway.getById(job.localPath, mrId);
532
- const assignedBy = mrDetails?.assignment?.username;
533
- const reviewStats = addReviewStats(job.localPath, job.mrNumber, durationMs, assistantText, assignedBy, diffStats);
534
- logger.info({ reviewStats }, 'Stats de review enregistrées');
535
- }
536
- catch (statsError) {
537
- logger.warn({ error: statsError }, 'Erreur lors de l\'enregistrement des stats');
538
- }
539
- }
540
- // Persist token usage for cost tracking (non-critical, never blocks the review result)
541
- if (tokenUsage) {
542
- try {
543
- await deps.trackTokenUsage.execute({
544
- jobId: job.id,
545
- mrNumber: job.mrNumber,
546
- platform: job.platform,
547
- projectPath: job.projectPath,
548
- localPath: job.localPath,
549
- model,
550
- recordedAt: new Date().toISOString(),
551
- usage: tokenUsage,
552
- });
553
- logger.info({ jobId: job.id, model, usage: tokenUsage }, 'Token usage recorded');
554
- const broadcastLocalPaths = deps.getEnabledLocalPaths?.() ?? [job.localPath];
555
- await broadcastBudgetAfterUsage({
556
- getBudgetStatus: deps.getBudgetStatus,
557
- broadcastBudgetStatus: deps.broadcastBudgetStatus,
558
- presenter: deps.budgetStatusPresenter,
559
- }, { localPaths: broadcastLocalPaths }, logger);
560
- }
561
- catch (trackError) {
562
- logger.warn({ jobId: job.id, error: trackError }, 'Failed to persist token usage');
563
- }
564
- }
565
- // Log assistant text preview for debugging
566
- if (assistantText.length > 0) {
567
- logInfo('Claude output preview', {
568
- jobId: job.id,
569
- preview: assistantText.substring(0, 1000),
570
- fullLength: assistantText.length,
571
- });
572
- }
573
- }
574
- else {
575
- logError('Review échouée', {
576
- jobId: job.id,
577
- mrNumber: job.mrNumber,
578
- exitCode: code,
579
- duration: `${durationMin} min`,
580
- stderr: stderr.substring(0, 500),
581
- stdoutPreview: (assistantText || stdout).substring(0, 300),
582
- });
583
- }
584
- resolve({
585
- success,
586
- exitCode: memoryExceeded ? null : code,
587
- stdout: assistantText,
588
- stderr,
589
- durationMs,
590
- finalProgress,
591
- cancelled: cancelled || memoryExceeded,
592
- usage: tokenUsage,
593
- selectedModel: model,
499
+ }
500
+ // Token usage tracking is disabled in --bg mode: the legacy stream-json
501
+ // path is gone and `claude --bg` does not emit usage to stdout. Re-enabling
502
+ // requires parsing `claude logs <sessionId>` — tracked in SPEC-171
503
+ // (docs/specs/171-bg-token-usage-tracking.md). Until SPEC-171 ships, the
504
+ // budget dashboard reports zero spending for --bg reviews.
505
+ if (onProgress) {
506
+ onProgress({
507
+ currentPhase: 'completed',
508
+ overallProgress: 100,
509
+ lastUpdate: new Date(),
510
+ agents: [],
594
511
  });
512
+ }
513
+ return {
514
+ success: true,
515
+ exitCode: 0,
516
+ stdout: result.content,
517
+ stderr: '',
518
+ durationMs,
519
+ usage: null,
520
+ selectedModel: model,
521
+ };
522
+ }
523
+ if (result.status === 'retry') {
524
+ logWarn('Rate-limited — backoff demandé', {
525
+ jobId: job.id,
526
+ delayMs: result.delayMs,
527
+ nextAttempt: result.attempt,
595
528
  });
529
+ return {
530
+ success: false,
531
+ exitCode: 1,
532
+ stdout: '',
533
+ stderr: `rate-limited; retry in ${result.delayMs}ms (attempt ${result.attempt})`,
534
+ durationMs,
535
+ selectedModel: model,
536
+ };
537
+ }
538
+ logError('Review échouée', {
539
+ jobId: job.id,
540
+ mrNumber: job.mrNumber,
541
+ duration: `${durationMin} min`,
542
+ reason: result.reason,
596
543
  });
544
+ return {
545
+ success: false,
546
+ exitCode: 1,
547
+ stdout: '',
548
+ stderr: result.reason,
549
+ durationMs,
550
+ selectedModel: model,
551
+ };
597
552
  }
598
553
  /**
599
554
  * Send desktop notification