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.
- package/CHANGELOG.md +20 -0
- package/dist/frameworks/claude/claudeInvoker.d.ts +31 -0
- package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
- package/dist/frameworks/claude/claudeInvoker.js +243 -288
- package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
- package/dist/frameworks/claude/streamJsonParser.d.ts +1 -38
- package/dist/frameworks/claude/streamJsonParser.d.ts.map +1 -1
- package/dist/frameworks/claude/streamJsonParser.js +16 -88
- package/dist/frameworks/claude/streamJsonParser.js.map +1 -1
- package/dist/frameworks/claude/timers/claudeInvocationTimers.d.ts +14 -0
- package/dist/frameworks/claude/timers/claudeInvocationTimers.d.ts.map +1 -0
- package/dist/frameworks/claude/timers/claudeInvocationTimers.js +23 -0
- package/dist/frameworks/claude/timers/claudeInvocationTimers.js.map +1 -0
- package/dist/frameworks/queue/pQueueAdapter.d.ts +2 -0
- package/dist/frameworks/queue/pQueueAdapter.d.ts.map +1 -1
- package/dist/frameworks/queue/pQueueAdapter.js +26 -5
- package/dist/frameworks/queue/pQueueAdapter.js.map +1 -1
- package/dist/frameworks/scheduler/supervisorScheduler.d.ts +17 -0
- package/dist/frameworks/scheduler/supervisorScheduler.d.ts.map +1 -0
- package/dist/frameworks/scheduler/supervisorScheduler.js +25 -0
- package/dist/frameworks/scheduler/supervisorScheduler.js.map +1 -0
- package/dist/main/dependencies.d.ts +4 -0
- package/dist/main/dependencies.d.ts.map +1 -1
- package/dist/main/dependencies.js +4 -0
- package/dist/main/dependencies.js.map +1 -1
- package/dist/main/routes.d.ts.map +1 -1
- package/dist/main/routes.js +14 -0
- package/dist/main/routes.js.map +1 -1
- package/dist/main/server.d.ts.map +1 -1
- package/dist/main/server.js +37 -0
- package/dist/main/server.js.map +1 -1
- package/dist/mcp/mcpServerStdio.d.ts.map +1 -1
- package/dist/mcp/mcpServerStdio.js +10 -1
- package/dist/mcp/mcpServerStdio.js.map +1 -1
- package/dist/modules/claude-invocation/entities/billingState/billingState.gateway.d.ts +8 -0
- package/dist/modules/claude-invocation/entities/billingState/billingState.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/billingState/billingState.gateway.js +2 -0
- package/dist/modules/claude-invocation/entities/billingState/billingState.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/entities/billingState/billingState.schema.d.ts +8 -0
- package/dist/modules/claude-invocation/entities/billingState/billingState.schema.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/billingState/billingState.schema.js +7 -0
- package/dist/modules/claude-invocation/entities/billingState/billingState.schema.js.map +1 -0
- package/dist/modules/claude-invocation/entities/billingState/environment.gateway.d.ts +4 -0
- package/dist/modules/claude-invocation/entities/billingState/environment.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/billingState/environment.gateway.js +2 -0
- package/dist/modules/claude-invocation/entities/billingState/environment.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.d.ts +16 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts +52 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.js +2 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.d.ts +11 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.js +4 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.guard.js.map +1 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.js +29 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.js.map +1 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts +38 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js +27 -0
- package/dist/modules/claude-invocation/entities/claudeSession/claudeSession.schema.js.map +1 -0
- package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.schema.d.ts +10 -0
- package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.schema.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.schema.js +14 -0
- package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.schema.js.map +1 -0
- package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.valueObject.d.ts +10 -0
- package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.valueObject.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.valueObject.js +11 -0
- package/dist/modules/claude-invocation/entities/retrySchedule/retrySchedule.valueObject.js.map +1 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/mcpCompletion.gateway.d.ts +8 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/mcpCompletion.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/mcpCompletion.gateway.js +2 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/mcpCompletion.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/reviewReport.gateway.d.ts +16 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/reviewReport.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/reviewReport.gateway.js +2 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/reviewReport.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.guard.d.ts +8 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.guard.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.guard.js +7 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.guard.js.map +1 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.schema.d.ts +28 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.schema.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.schema.js +9 -0
- package/dist/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.schema.js.map +1 -0
- package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.gateway.d.ts +6 -0
- package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.gateway.js +2 -0
- package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.schema.d.ts +16 -0
- package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.schema.d.ts.map +1 -0
- package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.schema.js +8 -0
- package/dist/modules/claude-invocation/entities/supervisorHealth/supervisorHealth.schema.js.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.d.ts +10 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.js +32 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.d.ts +25 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.js +102 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.d.ts +8 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.js +11 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.d.ts +34 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.js +131 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.d.ts +10 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.js +24 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.d.ts +12 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js +25 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.d.ts +8 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.d.ts.map +1 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.js +18 -0
- package/dist/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.js.map +1 -0
- package/dist/modules/claude-invocation/usecases/auditBilling.usecase.d.ts +15 -0
- package/dist/modules/claude-invocation/usecases/auditBilling.usecase.d.ts.map +1 -0
- package/dist/modules/claude-invocation/usecases/auditBilling.usecase.js +12 -0
- package/dist/modules/claude-invocation/usecases/auditBilling.usecase.js.map +1 -0
- package/dist/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.d.ts +16 -0
- package/dist/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.d.ts.map +1 -0
- package/dist/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.js +64 -0
- package/dist/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.js.map +1 -0
- package/dist/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.d.ts +10 -0
- package/dist/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.d.ts.map +1 -0
- package/dist/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.js +12 -0
- package/dist/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.js.map +1 -0
- package/dist/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.d.ts +15 -0
- package/dist/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.d.ts.map +1 -0
- package/dist/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.js +25 -0
- package/dist/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.js.map +1 -0
- package/dist/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.d.ts +34 -0
- package/dist/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.d.ts.map +1 -0
- package/dist/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.js +32 -0
- package/dist/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.js.map +1 -0
- package/dist/modules/claude-invocation/usecases/retrieveReviewReport.usecase.d.ts +20 -0
- package/dist/modules/claude-invocation/usecases/retrieveReviewReport.usecase.d.ts.map +1 -0
- package/dist/modules/claude-invocation/usecases/retrieveReviewReport.usecase.js +17 -0
- package/dist/modules/claude-invocation/usecases/retrieveReviewReport.usecase.js.map +1 -0
- package/dist/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.d.ts +41 -0
- package/dist/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.d.ts.map +1 -0
- package/dist/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.js +88 -0
- package/dist/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.js.map +1 -0
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/health.routes.d.ts +2 -0
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/health.routes.d.ts.map +1 -1
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/health.routes.js +16 -1
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/health.routes.js.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts +6 -0
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.d.ts.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js +16 -0
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/github.controller.js.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts +6 -0
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.d.ts.map +1 -1
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js +31 -0
- package/dist/modules/platform-integration/interface-adapters/controllers/webhook/gitlab.controller.js.map +1 -1
- package/dist/modules/review-execution/usecases/mcp/setPhase.usecase.d.ts +2 -0
- package/dist/modules/review-execution/usecases/mcp/setPhase.usecase.d.ts.map +1 -1
- package/dist/modules/review-execution/usecases/mcp/setPhase.usecase.js +4 -1
- package/dist/modules/review-execution/usecases/mcp/setPhase.usecase.js.map +1 -1
- package/dist/modules/supervisor-management/entities/supervisor/supervisor.gateway.d.ts +14 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisor.gateway.d.ts.map +1 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisor.gateway.js +2 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisor.gateway.js.map +1 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorLock.gateway.d.ts +9 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorLock.gateway.d.ts.map +1 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorLock.gateway.js +2 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorLock.gateway.js.map +1 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorStatus.schema.d.ts +19 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorStatus.schema.d.ts.map +1 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorStatus.schema.js +11 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorStatus.schema.js.map +1 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorStatusStore.gateway.d.ts +6 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorStatusStore.gateway.d.ts.map +1 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorStatusStore.gateway.js +2 -0
- package/dist/modules/supervisor-management/entities/supervisor/supervisorStatusStore.gateway.js.map +1 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisor.cli.gateway.d.ts +25 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisor.cli.gateway.d.ts.map +1 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisor.cli.gateway.js +79 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisor.cli.gateway.js.map +1 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorLock.fileSystem.gateway.d.ts +22 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorLock.fileSystem.gateway.d.ts.map +1 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorLock.fileSystem.gateway.js +71 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorLock.fileSystem.gateway.js.map +1 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorStatusStore.memory.gateway.d.ts +8 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorStatusStore.memory.gateway.d.ts.map +1 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorStatusStore.memory.gateway.js +20 -0
- package/dist/modules/supervisor-management/interface-adapters/gateways/supervisorStatusStore.memory.gateway.js.map +1 -0
- package/dist/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.d.ts +14 -0
- package/dist/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.d.ts.map +1 -0
- package/dist/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.js +51 -0
- package/dist/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.js.map +1 -0
- package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.d.ts +15 -0
- package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.d.ts.map +1 -0
- package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.js +2 -0
- package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.js.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.d.ts +14 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.d.ts.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.gateway.d.ts +18 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.gateway.d.ts.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.gateway.js +2 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.gateway.js.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.js +58 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.js.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.schema.d.ts +54 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.schema.d.ts.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.schema.js +8 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.schema.js.map +1 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.d.ts +8 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.d.ts.map +1 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.js +28 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.js.map +1 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.d.ts +17 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.d.ts.map +1 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js +67 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js.map +1 -0
- package/dist/modules/worktree-management/services/worktreeSettingsWriter.d.ts +4 -0
- package/dist/modules/worktree-management/services/worktreeSettingsWriter.d.ts.map +1 -0
- package/dist/modules/worktree-management/services/worktreeSettingsWriter.js +16 -0
- package/dist/modules/worktree-management/services/worktreeSettingsWriter.js.map +1 -0
- package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.d.ts +19 -0
- package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.d.ts.map +1 -0
- package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.js +53 -0
- package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.js.map +1 -0
- package/dist/modules/worktree-management/usecases/removeWorktree.usecase.d.ts +12 -0
- package/dist/modules/worktree-management/usecases/removeWorktree.usecase.d.ts.map +1 -0
- package/dist/modules/worktree-management/usecases/removeWorktree.usecase.js +26 -0
- package/dist/modules/worktree-management/usecases/removeWorktree.usecase.js.map +1 -0
- package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.d.ts +23 -0
- package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.d.ts.map +1 -0
- package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.js +63 -0
- package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.js.map +1 -0
- package/dist/shared/services/daemonPaths.d.ts +1 -0
- package/dist/shared/services/daemonPaths.d.ts.map +1 -1
- package/dist/shared/services/daemonPaths.js +1 -0
- package/dist/shared/services/daemonPaths.js.map +1 -1
- package/dist/tests/acceptance/169-migrate-claude-invocation-to-bg-mode.acceptance.test.d.ts +2 -0
- package/dist/tests/acceptance/169-migrate-claude-invocation-to-bg-mode.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/169-migrate-claude-invocation-to-bg-mode.acceptance.test.js +238 -0
- package/dist/tests/acceptance/169-migrate-claude-invocation-to-bg-mode.acceptance.test.js.map +1 -0
- package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.d.ts +13 -0
- package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js +145 -0
- package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js.map +1 -0
- package/dist/tests/acceptance/172-claude-agents-supervisor-lifecycle.acceptance.test.d.ts +2 -0
- package/dist/tests/acceptance/172-claude-agents-supervisor-lifecycle.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/172-claude-agents-supervisor-lifecycle.acceptance.test.js +118 -0
- package/dist/tests/acceptance/172-claude-agents-supervisor-lifecycle.acceptance.test.js.map +1 -0
- package/dist/tests/acceptance/46-github-followup-review-on-push.acceptance.test.js +5 -34
- package/dist/tests/acceptance/46-github-followup-review-on-push.acceptance.test.js.map +1 -1
- package/dist/tests/factories/claudeSession.factory.d.ts +5 -0
- package/dist/tests/factories/claudeSession.factory.d.ts.map +1 -0
- package/dist/tests/factories/claudeSession.factory.js +17 -0
- package/dist/tests/factories/claudeSession.factory.js.map +1 -0
- package/dist/tests/factories/sessionCompletion.factory.d.ts +5 -0
- package/dist/tests/factories/sessionCompletion.factory.d.ts.map +1 -0
- package/dist/tests/factories/sessionCompletion.factory.js +11 -0
- package/dist/tests/factories/sessionCompletion.factory.js.map +1 -0
- package/dist/tests/integration/claudeInvocation.integration.test.d.ts +2 -0
- package/dist/tests/integration/claudeInvocation.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/claudeInvocation.integration.test.js +147 -0
- package/dist/tests/integration/claudeInvocation.integration.test.js.map +1 -0
- package/dist/tests/stubs/billingState.stub.d.ts +10 -0
- package/dist/tests/stubs/billingState.stub.d.ts.map +1 -0
- package/dist/tests/stubs/billingState.stub.js +32 -0
- package/dist/tests/stubs/billingState.stub.js.map +1 -0
- package/dist/tests/stubs/capturingLogger.stub.d.ts +9 -0
- package/dist/tests/stubs/capturingLogger.stub.d.ts.map +1 -0
- package/dist/tests/stubs/capturingLogger.stub.js +36 -0
- package/dist/tests/stubs/capturingLogger.stub.js.map +1 -0
- package/dist/tests/stubs/claudeSession.stub.d.ts +23 -0
- package/dist/tests/stubs/claudeSession.stub.d.ts.map +1 -0
- package/dist/tests/stubs/claudeSession.stub.js +55 -0
- package/dist/tests/stubs/claudeSession.stub.js.map +1 -0
- package/dist/tests/stubs/environment.stub.d.ts +7 -0
- package/dist/tests/stubs/environment.stub.d.ts.map +1 -0
- package/dist/tests/stubs/environment.stub.js +10 -0
- package/dist/tests/stubs/environment.stub.js.map +1 -0
- package/dist/tests/stubs/gitCommandExecutor.stub.d.ts +13 -0
- package/dist/tests/stubs/gitCommandExecutor.stub.d.ts.map +1 -0
- package/dist/tests/stubs/gitCommandExecutor.stub.js +25 -0
- package/dist/tests/stubs/gitCommandExecutor.stub.js.map +1 -0
- package/dist/tests/stubs/mcpCompletion.stub.d.ts +13 -0
- package/dist/tests/stubs/mcpCompletion.stub.d.ts.map +1 -0
- package/dist/tests/stubs/mcpCompletion.stub.js +29 -0
- package/dist/tests/stubs/mcpCompletion.stub.js.map +1 -0
- package/dist/tests/stubs/reviewReport.stub.d.ts +11 -0
- package/dist/tests/stubs/reviewReport.stub.d.ts.map +1 -0
- package/dist/tests/stubs/reviewReport.stub.js +21 -0
- package/dist/tests/stubs/reviewReport.stub.js.map +1 -0
- package/dist/tests/stubs/supervisor.stub.d.ts +12 -0
- package/dist/tests/stubs/supervisor.stub.d.ts.map +1 -0
- package/dist/tests/stubs/supervisor.stub.js +25 -0
- package/dist/tests/stubs/supervisor.stub.js.map +1 -0
- package/dist/tests/stubs/supervisorHealth.stub.d.ts +8 -0
- package/dist/tests/stubs/supervisorHealth.stub.d.ts.map +1 -0
- package/dist/tests/stubs/supervisorHealth.stub.js +18 -0
- package/dist/tests/stubs/supervisorHealth.stub.js.map +1 -0
- package/dist/tests/stubs/supervisorLock.stub.d.ts +10 -0
- package/dist/tests/stubs/supervisorLock.stub.d.ts.map +1 -0
- package/dist/tests/stubs/supervisorLock.stub.js +19 -0
- package/dist/tests/stubs/supervisorLock.stub.js.map +1 -0
- package/dist/tests/units/architecture/noClaudePInProduction.test.d.ts +2 -0
- package/dist/tests/units/architecture/noClaudePInProduction.test.d.ts.map +1 -0
- package/dist/tests/units/architecture/noClaudePInProduction.test.js +89 -0
- package/dist/tests/units/architecture/noClaudePInProduction.test.js.map +1 -0
- package/dist/tests/units/frameworks/claude/buildSpawnEnv.test.d.ts +2 -0
- package/dist/tests/units/frameworks/claude/buildSpawnEnv.test.d.ts.map +1 -0
- package/dist/tests/units/frameworks/claude/buildSpawnEnv.test.js +30 -0
- package/dist/tests/units/frameworks/claude/buildSpawnEnv.test.js.map +1 -0
- package/dist/tests/units/frameworks/claude/claudeInvoker.test.js +24 -27
- package/dist/tests/units/frameworks/claude/claudeInvoker.test.js.map +1 -1
- package/dist/tests/units/frameworks/claude/mcpContext.test.js +3 -1
- package/dist/tests/units/frameworks/claude/mcpContext.test.js.map +1 -1
- package/dist/tests/units/frameworks/claude/streamJsonParser.test.js +15 -72
- package/dist/tests/units/frameworks/claude/streamJsonParser.test.js.map +1 -1
- package/dist/tests/units/frameworks/claude/timers/claudeInvocationTimers.test.d.ts +2 -0
- package/dist/tests/units/frameworks/claude/timers/claudeInvocationTimers.test.d.ts.map +1 -0
- package/dist/tests/units/frameworks/claude/timers/claudeInvocationTimers.test.js +66 -0
- package/dist/tests/units/frameworks/claude/timers/claudeInvocationTimers.test.js.map +1 -0
- package/dist/tests/units/frameworks/queue/pQueueAdapter.test.d.ts +2 -0
- package/dist/tests/units/frameworks/queue/pQueueAdapter.test.d.ts.map +1 -0
- package/dist/tests/units/frameworks/queue/pQueueAdapter.test.js +116 -0
- package/dist/tests/units/frameworks/queue/pQueueAdapter.test.js.map +1 -0
- package/dist/tests/units/frameworks/scheduler/supervisorScheduler.test.d.ts +2 -0
- package/dist/tests/units/frameworks/scheduler/supervisorScheduler.test.d.ts.map +1 -0
- package/dist/tests/units/frameworks/scheduler/supervisorScheduler.test.js +76 -0
- package/dist/tests/units/frameworks/scheduler/supervisorScheduler.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/controllers/http/health.routes.test.js +45 -0
- package/dist/tests/units/interface-adapters/controllers/http/health.routes.test.js.map +1 -1
- package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js +27 -0
- package/dist/tests/units/interface-adapters/controllers/webhook/github.controller.test.js.map +1 -1
- package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js +43 -0
- package/dist/tests/units/interface-adapters/controllers/webhook/gitlab.controller.test.js.map +1 -1
- package/dist/tests/units/modules/claude-invocation/entities/claudeSession/claudeSession.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/entities/claudeSession/claudeSession.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/entities/claudeSession/claudeSession.test.js +51 -0
- package/dist/tests/units/modules/claude-invocation/entities/claudeSession/claudeSession.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/entities/retrySchedule/retrySchedule.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/entities/retrySchedule/retrySchedule.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/entities/retrySchedule/retrySchedule.test.js +28 -0
- package/dist/tests/units/modules/claude-invocation/entities/retrySchedule/retrySchedule.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.test.js +27 -0
- package/dist/tests/units/modules/claude-invocation/entities/sessionCompletion/sessionCompletion.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.test.js +40 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/billingState.memory.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.js +188 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/claudeSession.cli.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.test.js +17 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/environment.process.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.test.js +119 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.fileSystem.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.test.js +39 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/mcpCompletion.memory.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.js +64 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/reviewReport.fileSystem.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.test.js +32 -0
- package/dist/tests/units/modules/claude-invocation/interface-adapters/gateways/supervisorHealth.memory.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/auditBilling.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/usecases/auditBilling.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/auditBilling.usecase.test.js +33 -0
- package/dist/tests/units/modules/claude-invocation/usecases/auditBilling.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.js +53 -0
- package/dist/tests/units/modules/claude-invocation/usecases/awaitSessionCompletion.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.test.js +31 -0
- package/dist/tests/units/modules/claude-invocation/usecases/checkSupervisorHealth.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.js +17 -0
- package/dist/tests/units/modules/claude-invocation/usecases/cleanupClaudeSession.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.test.js +97 -0
- package/dist/tests/units/modules/claude-invocation/usecases/dispatchClaudeSession.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/retrieveReviewReport.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/usecases/retrieveReviewReport.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/retrieveReviewReport.usecase.test.js +49 -0
- package/dist/tests/units/modules/claude-invocation/usecases/retrieveReviewReport.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.test.js +171 -0
- package/dist/tests/units/modules/claude-invocation/usecases/runClaudeReviewJob.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/supervisor-management/entities/supervisorStatus.schema.test.d.ts +2 -0
- package/dist/tests/units/modules/supervisor-management/entities/supervisorStatus.schema.test.d.ts.map +1 -0
- package/dist/tests/units/modules/supervisor-management/entities/supervisorStatus.schema.test.js +32 -0
- package/dist/tests/units/modules/supervisor-management/entities/supervisorStatus.schema.test.js.map +1 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisor.cli.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisor.cli.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisor.cli.gateway.test.js +85 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisor.cli.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.js +94 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorLock.fileSystem.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorStatusStore.memory.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorStatusStore.memory.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorStatusStore.memory.gateway.test.js +26 -0
- package/dist/tests/units/modules/supervisor-management/gateways/supervisorStatusStore.memory.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.test.js +129 -0
- package/dist/tests/units/modules/supervisor-management/usecases/checkSupervisorAndRespawn.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.js +54 -0
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktree.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.test.js +35 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/gitCommand.cli.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/services/worktreeSettingsWriter.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/services/worktreeSettingsWriter.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/services/worktreeSettingsWriter.test.js +32 -0
- package/dist/tests/units/modules/worktree-management/services/worktreeSettingsWriter.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.js +113 -0
- package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.js +55 -0
- package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.js +131 -0
- package/dist/tests/units/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.test.js.map +1 -0
- package/dist/tests/units/usecases/mcp/setPhase.usecase.test.js +21 -0
- package/dist/tests/units/usecases/mcp/setPhase.usecase.test.js.map +1 -1
- 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 {
|
|
27
|
-
import {
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
//
|
|
286
|
-
//
|
|
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
|
-
'--
|
|
290
|
-
'--verbose',
|
|
331
|
+
'--bg',
|
|
291
332
|
'--model', model,
|
|
292
|
-
'--permission-mode', '
|
|
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
|
-
|
|
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
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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
|
-
|
|
416
|
-
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
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
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
|
|
448
|
-
|
|
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
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
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
|
-
|
|
496
|
+
catch (statsError) {
|
|
497
|
+
logger.warn({ error: statsError }, 'Erreur lors de l\'enregistrement des stats');
|
|
471
498
|
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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
|