reviewflow 3.25.0 → 3.27.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 +17 -0
- package/dist/config/projectConfig.d.ts +1 -0
- package/dist/config/projectConfig.d.ts.map +1 -1
- package/dist/config/projectConfig.js +17 -0
- package/dist/config/projectConfig.js.map +1 -1
- package/dist/dashboard/index.html +113 -7
- package/dist/dashboard/modules/constants.d.ts +1 -0
- package/dist/dashboard/modules/constants.d.ts.map +1 -1
- package/dist/dashboard/modules/constants.js +1 -0
- package/dist/dashboard/modules/constants.js.map +1 -1
- package/dist/dashboard/modules/headerCapacityBadge.d.ts +33 -0
- package/dist/dashboard/modules/headerCapacityBadge.d.ts.map +1 -0
- package/dist/dashboard/modules/headerCapacityBadge.js +53 -0
- package/dist/dashboard/modules/headerCapacityBadge.js.map +1 -0
- package/dist/dashboard/modules/i18n.d.ts.map +1 -1
- package/dist/dashboard/modules/i18n.js +4 -0
- package/dist/dashboard/modules/i18n.js.map +1 -1
- package/dist/dashboard/modules/settingsModal.d.ts +17 -0
- package/dist/dashboard/modules/settingsModal.d.ts.map +1 -1
- package/dist/dashboard/modules/settingsModal.js +38 -0
- package/dist/dashboard/modules/settingsModal.js.map +1 -1
- package/dist/dashboard/modules/worktreePanel.d.ts +40 -0
- package/dist/dashboard/modules/worktreePanel.d.ts.map +1 -1
- package/dist/dashboard/modules/worktreePanel.js +98 -1
- package/dist/dashboard/modules/worktreePanel.js.map +1 -1
- package/dist/dashboard/styles.css +152 -1
- package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
- package/dist/frameworks/claude/claudeInvoker.js +5 -10
- package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
- package/dist/frameworks/config/configLoader.d.ts +1 -0
- package/dist/frameworks/config/configLoader.d.ts.map +1 -1
- package/dist/frameworks/config/configLoader.js +11 -0
- package/dist/frameworks/config/configLoader.js.map +1 -1
- package/dist/frameworks/queue/pQueueAdapter.d.ts +17 -0
- package/dist/frameworks/queue/pQueueAdapter.d.ts.map +1 -1
- package/dist/frameworks/queue/pQueueAdapter.js +103 -40
- package/dist/frameworks/queue/pQueueAdapter.js.map +1 -1
- package/dist/frameworks/queue/projectSemaphore.d.ts +26 -0
- package/dist/frameworks/queue/projectSemaphore.d.ts.map +1 -0
- package/dist/frameworks/queue/projectSemaphore.js +79 -0
- package/dist/frameworks/queue/projectSemaphore.js.map +1 -0
- package/dist/frameworks/settings/runtimeSettings.d.ts +3 -0
- package/dist/frameworks/settings/runtimeSettings.d.ts.map +1 -1
- package/dist/frameworks/settings/runtimeSettings.js +14 -0
- package/dist/frameworks/settings/runtimeSettings.js.map +1 -1
- package/dist/main/dependencies.d.ts +4 -0
- package/dist/main/dependencies.d.ts.map +1 -1
- package/dist/main/dependencies.js +8 -0
- package/dist/main/dependencies.js.map +1 -1
- package/dist/main/routes.d.ts.map +1 -1
- package/dist/main/routes.js +32 -3
- package/dist/main/routes.js.map +1 -1
- package/dist/main/server.d.ts.map +1 -1
- package/dist/main/server.js +69 -1
- package/dist/main/server.js.map +1 -1
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.d.ts +2 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.d.ts.map +1 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.js +4 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.js.map +1 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.schema.d.ts +7 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.schema.d.ts.map +1 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.schema.js +10 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.schema.js.map +1 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.d.ts +18 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.d.ts.map +1 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.js +28 -0
- package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.js.map +1 -0
- package/dist/modules/cli-configuration/entities/repositoriesList/repositoriesList.gateway.d.ts +9 -0
- package/dist/modules/cli-configuration/entities/repositoriesList/repositoriesList.gateway.d.ts.map +1 -0
- package/dist/modules/cli-configuration/entities/repositoriesList/repositoriesList.gateway.js +2 -0
- package/dist/modules/cli-configuration/entities/repositoriesList/repositoriesList.gateway.js.map +1 -0
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.d.ts +1 -0
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.d.ts.map +1 -1
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.js +26 -0
- package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.js.map +1 -1
- package/dist/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.d.ts +8 -0
- package/dist/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.d.ts.map +1 -0
- package/dist/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.js +14 -0
- package/dist/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.js.map +1 -0
- package/dist/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.d.ts +26 -0
- package/dist/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.d.ts.map +1 -0
- package/dist/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.js +24 -0
- package/dist/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.js.map +1 -0
- package/dist/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.d.ts +2 -1
- package/dist/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.d.ts.map +1 -1
- package/dist/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.js +29 -5
- package/dist/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.js.map +1 -1
- package/dist/modules/review-execution/entities/job/jobHistory.gateway.d.ts +10 -0
- package/dist/modules/review-execution/entities/job/jobHistory.gateway.d.ts.map +1 -0
- package/dist/modules/review-execution/entities/job/jobHistory.gateway.js +2 -0
- package/dist/modules/review-execution/entities/job/jobHistory.gateway.js.map +1 -0
- package/dist/modules/review-execution/entities/job/jobRecord.guard.d.ts +13 -0
- package/dist/modules/review-execution/entities/job/jobRecord.guard.d.ts.map +1 -0
- package/dist/modules/review-execution/entities/job/jobRecord.guard.js +4 -0
- package/dist/modules/review-execution/entities/job/jobRecord.guard.js.map +1 -0
- package/dist/modules/review-execution/entities/job/jobRecord.schema.d.ts +33 -0
- package/dist/modules/review-execution/entities/job/jobRecord.schema.d.ts.map +1 -0
- package/dist/modules/review-execution/entities/job/jobRecord.schema.js +15 -0
- package/dist/modules/review-execution/entities/job/jobRecord.schema.js.map +1 -0
- package/dist/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.d.ts +19 -0
- package/dist/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.d.ts.map +1 -0
- package/dist/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.js +120 -0
- package/dist/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.js.map +1 -0
- package/dist/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.d.ts +17 -0
- package/dist/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.d.ts.map +1 -0
- package/dist/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.js +11 -0
- package/dist/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.js.map +1 -0
- package/dist/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.d.ts +18 -0
- package/dist/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.d.ts.map +1 -0
- package/dist/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.js +58 -0
- package/dist/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.js.map +1 -0
- package/dist/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.d.ts +16 -0
- package/dist/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.d.ts.map +1 -0
- package/dist/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.js +12 -0
- package/dist/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.js.map +1 -0
- package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.d.ts +4 -0
- package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.d.ts.map +1 -1
- package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.js +2 -0
- package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.js.map +1 -1
- package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.d.ts +12 -0
- package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.d.ts.map +1 -1
- package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.js +8 -0
- package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.js.map +1 -1
- package/dist/modules/statistics-insights/services/fetchDiffStatsSafely.d.ts +5 -0
- package/dist/modules/statistics-insights/services/fetchDiffStatsSafely.d.ts.map +1 -0
- package/dist/modules/statistics-insights/services/fetchDiffStatsSafely.js +10 -0
- package/dist/modules/statistics-insights/services/fetchDiffStatsSafely.js.map +1 -0
- package/dist/modules/statistics-insights/services/statsService.d.ts +5 -0
- package/dist/modules/statistics-insights/services/statsService.d.ts.map +1 -1
- package/dist/modules/statistics-insights/services/statsService.js +5 -0
- package/dist/modules/statistics-insights/services/statsService.js.map +1 -1
- package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.d.ts +1 -1
- package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.d.ts.map +1 -1
- package/dist/modules/worktree-management/entities/worktree/worktree.gateway.d.ts +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktree.gateway.d.ts.map +1 -1
- package/dist/modules/worktree-management/entities/worktree/worktreeHealth.schema.d.ts +44 -0
- package/dist/modules/worktree-management/entities/worktree/worktreeHealth.schema.d.ts.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktreeHealth.schema.js +31 -0
- package/dist/modules/worktree-management/entities/worktree/worktreeHealth.schema.js.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.d.ts +20 -0
- package/dist/modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.d.ts.map +1 -0
- package/dist/modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.js +2 -0
- package/dist/modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.js.map +1 -0
- package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.d.ts +6 -0
- package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.d.ts.map +1 -1
- package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.js +52 -1
- package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.js.map +1 -1
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.d.ts.map +1 -1
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js +5 -1
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js.map +1 -1
- package/dist/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.d.ts +14 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.d.ts.map +1 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.js +97 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.js.map +1 -0
- package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.d.ts +20 -0
- package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.d.ts.map +1 -1
- package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.js +58 -0
- package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.js.map +1 -1
- package/dist/modules/worktree-management/services/forceCleanupLock.d.ts +10 -0
- package/dist/modules/worktree-management/services/forceCleanupLock.d.ts.map +1 -0
- package/dist/modules/worktree-management/services/forceCleanupLock.js +14 -0
- package/dist/modules/worktree-management/services/forceCleanupLock.js.map +1 -0
- package/dist/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.d.ts +13 -0
- package/dist/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.d.ts.map +1 -0
- package/dist/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.js +35 -0
- package/dist/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.js.map +1 -0
- package/dist/modules/worktree-management/usecases/removeWorktree.usecase.d.ts +1 -0
- package/dist/modules/worktree-management/usecases/removeWorktree.usecase.d.ts.map +1 -1
- package/dist/modules/worktree-management/usecases/removeWorktree.usecase.js +2 -1
- package/dist/modules/worktree-management/usecases/removeWorktree.usecase.js.map +1 -1
- package/dist/tests/acceptance/175-worktree-failure-visibility.acceptance.test.d.ts +12 -0
- package/dist/tests/acceptance/175-worktree-failure-visibility.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/175-worktree-failure-visibility.acceptance.test.js +293 -0
- package/dist/tests/acceptance/175-worktree-failure-visibility.acceptance.test.js.map +1 -0
- package/dist/tests/acceptance/176-job-history-persistence.acceptance.test.d.ts +13 -0
- package/dist/tests/acceptance/176-job-history-persistence.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/176-job-history-persistence.acceptance.test.js +261 -0
- package/dist/tests/acceptance/176-job-history-persistence.acceptance.test.js.map +1 -0
- package/dist/tests/acceptance/186-per-project-concurrency-cap.acceptance.test.d.ts +16 -0
- package/dist/tests/acceptance/186-per-project-concurrency-cap.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/186-per-project-concurrency-cap.acceptance.test.js +391 -0
- package/dist/tests/acceptance/186-per-project-concurrency-cap.acceptance.test.js.map +1 -0
- package/dist/tests/acceptance/47-capture-git-diff-stats.acceptance.test.d.ts +18 -0
- package/dist/tests/acceptance/47-capture-git-diff-stats.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/47-capture-git-diff-stats.acceptance.test.js +221 -0
- package/dist/tests/acceptance/47-capture-git-diff-stats.acceptance.test.js.map +1 -0
- package/dist/tests/factories/config.factory.d.ts.map +1 -1
- package/dist/tests/factories/config.factory.js +1 -0
- package/dist/tests/factories/config.factory.js.map +1 -1
- package/dist/tests/factories/jobRecord.factory.d.ts +5 -0
- package/dist/tests/factories/jobRecord.factory.d.ts.map +1 -0
- package/dist/tests/factories/jobRecord.factory.js +18 -0
- package/dist/tests/factories/jobRecord.factory.js.map +1 -0
- package/dist/tests/factories/projectConcurrencyCap.factory.d.ts +5 -0
- package/dist/tests/factories/projectConcurrencyCap.factory.d.ts.map +1 -0
- package/dist/tests/factories/projectConcurrencyCap.factory.js +8 -0
- package/dist/tests/factories/projectConcurrencyCap.factory.js.map +1 -0
- package/dist/tests/factories/worktreeHealth.factory.d.ts +22 -0
- package/dist/tests/factories/worktreeHealth.factory.d.ts.map +1 -0
- package/dist/tests/factories/worktreeHealth.factory.js +53 -0
- package/dist/tests/factories/worktreeHealth.factory.js.map +1 -0
- package/dist/tests/stubs/jobHistory.stub.d.ts +13 -0
- package/dist/tests/stubs/jobHistory.stub.d.ts.map +1 -0
- package/dist/tests/stubs/jobHistory.stub.js +63 -0
- package/dist/tests/stubs/jobHistory.stub.js.map +1 -0
- package/dist/tests/stubs/queueCapacityPort.stub.d.ts +8 -0
- package/dist/tests/stubs/queueCapacityPort.stub.d.ts.map +1 -0
- package/dist/tests/stubs/queueCapacityPort.stub.js +11 -0
- package/dist/tests/stubs/queueCapacityPort.stub.js.map +1 -0
- package/dist/tests/stubs/repositoriesListGateway.stub.d.ts +7 -0
- package/dist/tests/stubs/repositoriesListGateway.stub.d.ts.map +1 -0
- package/dist/tests/stubs/repositoriesListGateway.stub.js +10 -0
- package/dist/tests/stubs/repositoriesListGateway.stub.js.map +1 -0
- package/dist/tests/stubs/worktreeHealthProbe.stub.d.ts +11 -0
- package/dist/tests/stubs/worktreeHealthProbe.stub.d.ts.map +1 -0
- package/dist/tests/stubs/worktreeHealthProbe.stub.js +26 -0
- package/dist/tests/stubs/worktreeHealthProbe.stub.js.map +1 -0
- package/dist/tests/units/cli/cli.integration.test.js +6 -4
- package/dist/tests/units/cli/cli.integration.test.js.map +1 -1
- package/dist/tests/units/dashboard/modules/headerCapacityBadge.test.d.ts +2 -0
- package/dist/tests/units/dashboard/modules/headerCapacityBadge.test.d.ts.map +1 -0
- package/dist/tests/units/dashboard/modules/headerCapacityBadge.test.js +55 -0
- package/dist/tests/units/dashboard/modules/headerCapacityBadge.test.js.map +1 -0
- package/dist/tests/units/dashboard/modules/notifications.test.js +17 -0
- package/dist/tests/units/dashboard/modules/notifications.test.js.map +1 -1
- package/dist/tests/units/dashboard/modules/settingsModal.test.js +7 -0
- package/dist/tests/units/dashboard/modules/settingsModal.test.js.map +1 -1
- package/dist/tests/units/dashboard/modules/worktreePanel.test.js +123 -1
- package/dist/tests/units/dashboard/modules/worktreePanel.test.js.map +1 -1
- package/dist/tests/units/frameworks/config/configLoader.test.js +28 -0
- package/dist/tests/units/frameworks/config/configLoader.test.js.map +1 -1
- package/dist/tests/units/frameworks/queue/pQueueAdapter.test.js +125 -0
- package/dist/tests/units/frameworks/queue/pQueueAdapter.test.js.map +1 -1
- package/dist/tests/units/frameworks/queue/projectSemaphore.test.d.ts +2 -0
- package/dist/tests/units/frameworks/queue/projectSemaphore.test.d.ts.map +1 -0
- package/dist/tests/units/frameworks/queue/projectSemaphore.test.js +92 -0
- package/dist/tests/units/frameworks/queue/projectSemaphore.test.js.map +1 -0
- package/dist/tests/units/frameworks/settings/runtimeSettings.test.js +34 -2
- package/dist/tests/units/frameworks/settings/runtimeSettings.test.js.map +1 -1
- package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.test.d.ts +2 -0
- package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.test.d.ts.map +1 -0
- package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.test.js +22 -0
- package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.test.js.map +1 -0
- package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.test.d.ts +2 -0
- package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.test.d.ts.map +1 -0
- package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.test.js +85 -0
- package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.test.js.map +1 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js +91 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js.map +1 -1
- package/dist/tests/units/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.test.js +29 -0
- package/dist/tests/units/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.test.js +126 -0
- package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.test.js +78 -0
- package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.test.js.map +1 -1
- package/dist/tests/units/modules/review-execution/entities/job/jobRecord.guard.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/entities/job/jobRecord.guard.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/entities/job/jobRecord.guard.test.js +48 -0
- package/dist/tests/units/modules/review-execution/entities/job/jobRecord.guard.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.test.js +134 -0
- package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.test.js +38 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.test.js +126 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.test.js +42 -0
- package/dist/tests/units/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.test.js +28 -0
- package/dist/tests/units/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.test.js.map +1 -1
- package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.js +39 -0
- package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.js.map +1 -1
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktreeHealth.schema.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktreeHealth.schema.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktreeHealth.schema.test.js +50 -0
- package/dist/tests/units/modules/worktree-management/entities/worktree/worktreeHealth.schema.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.js +106 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.js.map +1 -1
- package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.test.js +114 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.js +140 -0
- package/dist/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.js.map +1 -1
- package/dist/tests/units/modules/worktree-management/services/forceCleanupLock.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/services/forceCleanupLock.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/services/forceCleanupLock.test.js +29 -0
- package/dist/tests/units/modules/worktree-management/services/forceCleanupLock.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.test.js +124 -0
- package/dist/tests/units/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.js +27 -0
- package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.js.map +1 -1
- package/dist/tests/units/services/statsService.summary.test.d.ts +2 -0
- package/dist/tests/units/services/statsService.summary.test.d.ts.map +1 -0
- package/dist/tests/units/services/statsService.summary.test.js +43 -0
- package/dist/tests/units/services/statsService.summary.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,15 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const cleanupPayloadSchema = z.object({
|
|
3
|
+
platform: z.enum(['gitlab', 'github']),
|
|
4
|
+
projectPath: z.string().min(1),
|
|
5
|
+
mrNumber: z.number().int().positive(),
|
|
6
|
+
});
|
|
7
|
+
function buildLockKey(identity) {
|
|
8
|
+
return `${identity.platform}:${identity.projectPath}:${identity.mrNumber}`;
|
|
9
|
+
}
|
|
1
10
|
export const worktreeOverviewRoutes = async (fastify, opts) => {
|
|
2
|
-
const { worktreeGateway, presenter, schedulerControls, logger } = opts;
|
|
11
|
+
const { worktreeGateway, presenter, schedulerControls, logger, detectDegradedWorktrees, forceCleanupLock, removeWorktreeForCleanup, } = opts;
|
|
3
12
|
fastify.get('/api/worktrees', async (_request, reply) => {
|
|
4
13
|
if (schedulerControls === null) {
|
|
5
14
|
reply.code(503);
|
|
6
15
|
return { error: 'scheduler-unavailable' };
|
|
7
16
|
}
|
|
8
17
|
const worktrees = await worktreeGateway.list();
|
|
18
|
+
const healthReports = detectDegradedWorktrees ? await detectDegradedWorktrees(worktrees) : [];
|
|
9
19
|
const viewModel = await presenter.present({
|
|
10
20
|
worktrees,
|
|
11
21
|
lastSweep: schedulerControls.getLastSweep(),
|
|
12
22
|
nextSweepAt: schedulerControls.getNextSweepEta(),
|
|
23
|
+
healthReports,
|
|
13
24
|
});
|
|
14
25
|
return viewModel;
|
|
15
26
|
});
|
|
@@ -35,5 +46,45 @@ export const worktreeOverviewRoutes = async (fastify, opts) => {
|
|
|
35
46
|
scanned: result.summary.scanned,
|
|
36
47
|
};
|
|
37
48
|
});
|
|
49
|
+
fastify.post('/api/worktrees/cleanup', async (request, reply) => {
|
|
50
|
+
if (forceCleanupLock === undefined || removeWorktreeForCleanup === undefined) {
|
|
51
|
+
reply.code(503);
|
|
52
|
+
return { error: 'cleanup-unavailable' };
|
|
53
|
+
}
|
|
54
|
+
const parsed = cleanupPayloadSchema.safeParse(request.body);
|
|
55
|
+
if (!parsed.success) {
|
|
56
|
+
reply.code(400);
|
|
57
|
+
return { error: 'invalid-payload' };
|
|
58
|
+
}
|
|
59
|
+
const identity = {
|
|
60
|
+
platform: parsed.data.platform,
|
|
61
|
+
projectPath: parsed.data.projectPath,
|
|
62
|
+
mrNumber: parsed.data.mrNumber,
|
|
63
|
+
};
|
|
64
|
+
const lockKey = buildLockKey(identity);
|
|
65
|
+
if (!forceCleanupLock.tryAcquire(lockKey)) {
|
|
66
|
+
reply.code(409);
|
|
67
|
+
return { error: 'cleanup-in-progress' };
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const result = await removeWorktreeForCleanup(identity);
|
|
71
|
+
if (result.status === 'failed') {
|
|
72
|
+
logger.warn({ identity, warning: result.warning }, 'Force cleanup failed');
|
|
73
|
+
reply.code(500);
|
|
74
|
+
return { error: 'cleanup-failed', warning: result.warning };
|
|
75
|
+
}
|
|
76
|
+
logger.info({ identity, outcome: result.status }, 'Force cleanup completed');
|
|
77
|
+
return { status: 'removed' };
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const warning = error instanceof Error ? error.message : String(error);
|
|
81
|
+
logger.warn({ identity, warning }, 'Force cleanup threw');
|
|
82
|
+
reply.code(500);
|
|
83
|
+
return { error: 'cleanup-failed', warning };
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
forceCleanupLock.release(lockKey);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
38
89
|
};
|
|
39
90
|
//# sourceMappingURL=worktreeOverview.routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktreeOverview.routes.js","sourceRoot":"","sources":["../../../../../../src/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktreeOverview.routes.js","sourceRoot":"","sources":["../../../../../../src/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA+BxB,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,QAA0B;IAC9C,OAAO,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAsD,KAAK,EAC5F,OAAO,EACP,IAAI,EACJ,EAAE;IACF,MAAM,EACJ,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,MAAM,EACN,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,GACzB,GAAG,IAAI,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QACtD,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,uBAAuB,CAAC,CAAC,CAAC,MAAM,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;YACxC,SAAS;YACT,SAAS,EAAE,iBAAiB,CAAC,YAAY,EAAE;YAC3C,WAAW,EAAE,iBAAiB,CAAC,eAAe,EAAE;YAChD,aAAa;SACd,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC7D,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QACnF,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;QACnC,CAAC;QACD,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;YAC/B,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;YACjC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;SAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9D,IAAI,gBAAgB,KAAK,SAAS,IAAI,wBAAwB,KAAK,SAAS,EAAE,CAAC;YAC7E,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;QAC1C,CAAC;QAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,QAAQ,GAAqB;YACjC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;YAC9B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;YACpC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;SAC/B,CAAC;QACF,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACxD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;gBAC3E,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9D,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC;YAC7E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,qBAAqB,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.fileSystem.gateway.d.ts","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EAChB,MAAM,qEAAqE,CAAC;AAC7E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EACjB,MAAM,oEAAoE,CAAC;AAI5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAElH,MAAM,WAAW,qCAAqC;IACpD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,yBAA0B,YAAW,eAAe;IAC/D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,IAAI,EAAE,qCAAqC;IAKjD,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC;IAiB7D,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree.fileSystem.gateway.d.ts","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EAChB,MAAM,qEAAqE,CAAC;AAC7E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EACjB,MAAM,oEAAoE,CAAC;AAI5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAElH,MAAM,WAAW,qCAAqC;IACpD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,yBAA0B,YAAW,eAAe;IAC/D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,IAAI,EAAE,qCAAqC;IAKjD,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC;IAiB7D,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC;IAmB7D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;CAoBvC"}
|
package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js
CHANGED
|
@@ -27,7 +27,11 @@ export class WorktreeFileSystemGateway {
|
|
|
27
27
|
}
|
|
28
28
|
async remove(request) {
|
|
29
29
|
try {
|
|
30
|
-
return await removeWorktree({
|
|
30
|
+
return await removeWorktree({
|
|
31
|
+
identity: request.identity,
|
|
32
|
+
sourceCheckoutPath: request.sourceCheckoutPath,
|
|
33
|
+
force: request.force === true,
|
|
34
|
+
}, {
|
|
31
35
|
executor: this.executor,
|
|
32
36
|
worktreeExists: async (path) => existsSync(path),
|
|
33
37
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.fileSystem.gateway.js","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,6DAA6D,CAAC;AAarE,OAAO,EAAE,cAAc,EAAE,MAAM,kEAAkE,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,kEAAkE,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kEAAkE,CAAC;AAQzG,MAAM,OAAO,yBAAyB;IACnB,QAAQ,CAAqB;IAC7B,aAAa,CAAS;IAEvC,YAAY,IAA2C;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA8B;QACzC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,cAAc,CACnB;YACE,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;SAC/C,EACD;YACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAC9C,qBAAqB;SACtB,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA8B;QACzC,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CACzB,
|
|
1
|
+
{"version":3,"file":"worktree.fileSystem.gateway.js","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,6DAA6D,CAAC;AAarE,OAAO,EAAE,cAAc,EAAE,MAAM,kEAAkE,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,kEAAkE,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kEAAkE,CAAC;AAQzG,MAAM,OAAO,yBAAyB;IACnB,QAAQ,CAAqB;IAC7B,aAAa,CAAS;IAEvC,YAAY,IAA2C;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA8B;QACzC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,cAAc,CACnB;YACE,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;SAC/C,EACD;YACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAC9C,qBAAqB;SACtB,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA8B;QACzC,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CACzB;gBACE,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gBAC9C,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;aAC9B,EACD;gBACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,cAAc,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;aAC/C,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAA0B;QACrC,OAAO,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBAAE,SAAS;YACpC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,QAAQ,KAAK,IAAI;gBAAE,SAAS;YAChC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,6EAA6E;YAC/E,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HealthSignals, WorktreeHealthProbeGateway } from '../../../../modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.js';
|
|
2
|
+
import type { WorktreeEntry } from '../../../../modules/worktree-management/entities/worktree/worktree.schema.js';
|
|
3
|
+
import type { GitCommandExecutor } from '../../../../modules/worktree-management/entities/gitCommand/gitCommand.gateway.js';
|
|
4
|
+
export interface WorktreeHealthProbeFileSystemGatewayDependencies {
|
|
5
|
+
executor: GitCommandExecutor;
|
|
6
|
+
now?: () => Date;
|
|
7
|
+
}
|
|
8
|
+
export declare class WorktreeHealthProbeFileSystemGateway implements WorktreeHealthProbeGateway {
|
|
9
|
+
private readonly executor;
|
|
10
|
+
private readonly now;
|
|
11
|
+
constructor(deps: WorktreeHealthProbeFileSystemGatewayDependencies);
|
|
12
|
+
probe(entry: WorktreeEntry): Promise<HealthSignals>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=worktreeHealthProbe.fileSystem.gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktreeHealthProbe.fileSystem.gateway.d.ts","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,0BAA0B,EAE3B,MAAM,gFAAgF,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oEAAoE,CAAC;AACxG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAElH,MAAM,WAAW,gDAAgD;IAC/D,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAqDD,qBAAa,oCAAqC,YAAW,0BAA0B;IACrF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAErB,IAAI,EAAE,gDAAgD;IAK5D,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;CAkC1D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
const CONFLICT_PORCELAIN_PREFIXES = ['UU', 'AA', 'DD', 'AU', 'UA', 'DU', 'UD'];
|
|
4
|
+
function readGitDir(worktreePath) {
|
|
5
|
+
const gitPointerPath = join(worktreePath, '.git');
|
|
6
|
+
if (!existsSync(gitPointerPath))
|
|
7
|
+
return null;
|
|
8
|
+
try {
|
|
9
|
+
const stat = statSync(gitPointerPath);
|
|
10
|
+
if (stat.isDirectory())
|
|
11
|
+
return gitPointerPath;
|
|
12
|
+
const content = readFileSync(gitPointerPath, 'utf-8').trim();
|
|
13
|
+
const match = content.match(/^gitdir:\s*(.+)$/);
|
|
14
|
+
if (!match)
|
|
15
|
+
return null;
|
|
16
|
+
const target = match[1];
|
|
17
|
+
if (target === undefined)
|
|
18
|
+
return null;
|
|
19
|
+
return isAbsolute(target) ? target : resolve(worktreePath, target);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function detectOrphanLock(gitDir, now) {
|
|
26
|
+
for (const lockName of ['index.lock', 'HEAD.lock']) {
|
|
27
|
+
const lockPath = join(gitDir, lockName);
|
|
28
|
+
if (!existsSync(lockPath))
|
|
29
|
+
continue;
|
|
30
|
+
try {
|
|
31
|
+
const stat = statSync(lockPath);
|
|
32
|
+
const ageMs = Math.max(0, now.getTime() - stat.mtime.getTime());
|
|
33
|
+
return { present: true, path: lockPath, ageMs };
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
function detectConflict(stdout) {
|
|
42
|
+
const lines = stdout.split('\n');
|
|
43
|
+
for (const line of lines) {
|
|
44
|
+
const head = line.slice(0, 2);
|
|
45
|
+
if (CONFLICT_PORCELAIN_PREFIXES.includes(head))
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
function readMtime(worktreePath, fallback) {
|
|
51
|
+
try {
|
|
52
|
+
return statSync(worktreePath).mtime;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return fallback;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class WorktreeHealthProbeFileSystemGateway {
|
|
59
|
+
executor;
|
|
60
|
+
now;
|
|
61
|
+
constructor(deps) {
|
|
62
|
+
this.executor = deps.executor;
|
|
63
|
+
this.now = deps.now ?? (() => new Date());
|
|
64
|
+
}
|
|
65
|
+
async probe(entry) {
|
|
66
|
+
const now = this.now();
|
|
67
|
+
const mtime = readMtime(entry.path, entry.mtime);
|
|
68
|
+
const gitDir = readGitDir(entry.path);
|
|
69
|
+
const orphanLock = gitDir === null ? null : detectOrphanLock(gitDir, now);
|
|
70
|
+
let unresolvedConflict = false;
|
|
71
|
+
try {
|
|
72
|
+
const statusResult = await this.executor.execute({
|
|
73
|
+
kind: 'status-porcelain',
|
|
74
|
+
args: ['status', '--porcelain=v1'],
|
|
75
|
+
cwd: entry.path,
|
|
76
|
+
});
|
|
77
|
+
if (statusResult.exitCode === 0) {
|
|
78
|
+
unresolvedConflict = detectConflict(statusResult.stdout);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
unresolvedConflict = false;
|
|
83
|
+
}
|
|
84
|
+
const expectedPath = join(entry.path, 'node_modules');
|
|
85
|
+
const missingBuildArtifacts = {
|
|
86
|
+
missing: !existsSync(expectedPath),
|
|
87
|
+
expectedPath,
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
mtime,
|
|
91
|
+
orphanLock,
|
|
92
|
+
unresolvedConflict,
|
|
93
|
+
missingBuildArtifacts,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=worktreeHealthProbe.fileSystem.gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktreeHealthProbe.fileSystem.gateway.js","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.ts"],"names":[],"mappings":"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"}
|
package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { LastSweepSummary } from '../../../../modules/worktree-management/entities/sweep/lastSweepSummary.schema.js';
|
|
2
2
|
import type { WorktreeSizeProbeGateway } from '../../../../modules/worktree-management/entities/worktree/worktreeSizeProbe.gateway.js';
|
|
3
3
|
import type { WorktreeEntry, WorktreePlatform } from '../../../../modules/worktree-management/entities/worktree/worktree.schema.js';
|
|
4
|
+
import type { DegradedReason, WorktreeHealthReport } from '../../../../modules/worktree-management/entities/worktree/worktreeHealth.schema.js';
|
|
4
5
|
export type WorktreeRowStatus = 'active' | 'idle' | 'stale';
|
|
5
6
|
export interface WorktreeRowViewModel {
|
|
6
7
|
mrNumber: number;
|
|
@@ -21,6 +22,22 @@ export interface LastSweepViewModel {
|
|
|
21
22
|
failures: number;
|
|
22
23
|
scanned: number;
|
|
23
24
|
}
|
|
25
|
+
export type DegradedReasonCode = DegradedReason['kind'];
|
|
26
|
+
export interface DegradedRowViewModel {
|
|
27
|
+
mrNumber: number;
|
|
28
|
+
platform: WorktreePlatform;
|
|
29
|
+
projectPath: string;
|
|
30
|
+
path: string;
|
|
31
|
+
reasonCode: DegradedReasonCode;
|
|
32
|
+
reasonLabel: string;
|
|
33
|
+
detectedAtIso: string;
|
|
34
|
+
recommendedAction: string;
|
|
35
|
+
cleanupEndpointPayload: {
|
|
36
|
+
platform: WorktreePlatform;
|
|
37
|
+
projectPath: string;
|
|
38
|
+
mrNumber: number;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
24
41
|
export interface WorktreePanelViewModel {
|
|
25
42
|
totalCount: number;
|
|
26
43
|
totalSizeBytes: number;
|
|
@@ -30,11 +47,14 @@ export interface WorktreePanelViewModel {
|
|
|
30
47
|
nextSweepAt: string;
|
|
31
48
|
lastSweep: LastSweepViewModel | null;
|
|
32
49
|
groups: WorktreeGroupViewModel[];
|
|
50
|
+
degradedCount: number;
|
|
51
|
+
degraded: DegradedRowViewModel[];
|
|
33
52
|
}
|
|
34
53
|
export interface WorktreePanelPresenterInput {
|
|
35
54
|
worktrees: WorktreeEntry[];
|
|
36
55
|
lastSweep: LastSweepSummary | null;
|
|
37
56
|
nextSweepAt: Date;
|
|
57
|
+
healthReports?: WorktreeHealthReport[];
|
|
38
58
|
}
|
|
39
59
|
export interface WorktreePanelPresenterDependencies {
|
|
40
60
|
sizeProbe: WorktreeSizeProbeGateway;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktreePanel.presenter.d.ts","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yEAAyE,CAAC;AAChH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8EAA8E,CAAC;AAC7H,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EACjB,MAAM,oEAAoE,CAAC;
|
|
1
|
+
{"version":3,"file":"worktreePanel.presenter.d.ts","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yEAAyE,CAAC;AAChH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8EAA8E,CAAC;AAC7H,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EACjB,MAAM,oEAAoE,CAAC;AAC5E,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,0EAA0E,CAAC;AAKlF,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE;QACtB,QAAQ,EAAE,gBAAgB,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,IAAI,CAAC;IAClB,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,kCAAkC;IACjD,SAAS,EAAE,wBAAwB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAoED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;gBAExD,IAAI,EAAE,kCAAkC;IAM9C,OAAO,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,sBAAsB,CAAC;YAgFpE,WAAW;CAY1B"}
|
package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.js
CHANGED
|
@@ -8,6 +8,54 @@ function computeStatus(ageSeconds) {
|
|
|
8
8
|
return 'idle';
|
|
9
9
|
return 'stale';
|
|
10
10
|
}
|
|
11
|
+
function formatHours(ms) {
|
|
12
|
+
return String(Math.max(1, Math.round(ms / (60 * 60 * 1000))));
|
|
13
|
+
}
|
|
14
|
+
function describeReason(reason) {
|
|
15
|
+
if (reason.kind === 'stale') {
|
|
16
|
+
return {
|
|
17
|
+
label: `Worktree inactif depuis ${formatHours(reason.ageMs)}h`,
|
|
18
|
+
action: 'Cleanup forcé recommandé',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (reason.kind === 'orphan-git-lock') {
|
|
22
|
+
return {
|
|
23
|
+
label: `Lock git orphelin depuis ${formatHours(reason.lockAgeMs)}h`,
|
|
24
|
+
action: 'Cleanup forcé recommandé',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (reason.kind === 'unresolved-conflict') {
|
|
28
|
+
return {
|
|
29
|
+
label: 'Conflit git non résolu',
|
|
30
|
+
action: 'Cleanup forcé recommandé',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
label: 'Artefacts de build manquants',
|
|
35
|
+
action: 'Cleanup forcé recommandé',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function buildDegradedRow(report) {
|
|
39
|
+
if (report.health.status !== 'degraded')
|
|
40
|
+
return null;
|
|
41
|
+
const { entry, health } = report;
|
|
42
|
+
const description = describeReason(health.reason);
|
|
43
|
+
return {
|
|
44
|
+
mrNumber: entry.identity.mrNumber,
|
|
45
|
+
platform: entry.identity.platform,
|
|
46
|
+
projectPath: entry.identity.projectPath,
|
|
47
|
+
path: entry.path,
|
|
48
|
+
reasonCode: health.reason.kind,
|
|
49
|
+
reasonLabel: description.label,
|
|
50
|
+
detectedAtIso: health.detectedAt.toISOString(),
|
|
51
|
+
recommendedAction: description.action,
|
|
52
|
+
cleanupEndpointPayload: {
|
|
53
|
+
platform: entry.identity.platform,
|
|
54
|
+
projectPath: entry.identity.projectPath,
|
|
55
|
+
mrNumber: entry.identity.mrNumber,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
11
59
|
function groupKey(platform, projectPath) {
|
|
12
60
|
return `${platform}:${projectPath}`;
|
|
13
61
|
}
|
|
@@ -68,6 +116,14 @@ export class WorktreePanelPresenter {
|
|
|
68
116
|
worktrees: [...group.worktrees].sort((a, b) => new Date(b.mtime).getTime() - new Date(a.mtime).getTime()),
|
|
69
117
|
}))
|
|
70
118
|
.sort((a, b) => groupKey(a.platform, a.projectPath).localeCompare(groupKey(b.platform, b.projectPath)));
|
|
119
|
+
const degraded = [];
|
|
120
|
+
if (input.healthReports) {
|
|
121
|
+
for (const report of input.healthReports) {
|
|
122
|
+
const row = buildDegradedRow(report);
|
|
123
|
+
if (row !== null)
|
|
124
|
+
degraded.push(row);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
71
127
|
return {
|
|
72
128
|
totalCount: input.worktrees.length,
|
|
73
129
|
totalSizeBytes,
|
|
@@ -84,6 +140,8 @@ export class WorktreePanelPresenter {
|
|
|
84
140
|
scanned: input.lastSweep.scanned,
|
|
85
141
|
},
|
|
86
142
|
groups,
|
|
143
|
+
degradedCount: degraded.length,
|
|
144
|
+
degraded,
|
|
87
145
|
};
|
|
88
146
|
}
|
|
89
147
|
async resolveSize(path, nowMs) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktreePanel.presenter.js","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktreePanel.presenter.js","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ForceCleanupLockService {
|
|
2
|
+
tryAcquire(identityKey: string): boolean;
|
|
3
|
+
release(identityKey: string): void;
|
|
4
|
+
}
|
|
5
|
+
export declare class InMemoryForceCleanupLockService implements ForceCleanupLockService {
|
|
6
|
+
private readonly locked;
|
|
7
|
+
tryAcquire(identityKey: string): boolean;
|
|
8
|
+
release(identityKey: string): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=forceCleanupLock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forceCleanupLock.d.ts","sourceRoot":"","sources":["../../../../src/modules/worktree-management/services/forceCleanupLock.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,qBAAa,+BAAgC,YAAW,uBAAuB;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IAEjD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAQxC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAGnC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export class InMemoryForceCleanupLockService {
|
|
2
|
+
locked = new Set();
|
|
3
|
+
tryAcquire(identityKey) {
|
|
4
|
+
if (this.locked.has(identityKey)) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
this.locked.add(identityKey);
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
release(identityKey) {
|
|
11
|
+
this.locked.delete(identityKey);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=forceCleanupLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forceCleanupLock.js","sourceRoot":"","sources":["../../../../src/modules/worktree-management/services/forceCleanupLock.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,+BAA+B;IACzB,MAAM,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEjD,UAAU,CAAC,WAAmB;QAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,WAAmB;QACzB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WorktreeHealthReport } from '../../../modules/worktree-management/entities/worktree/worktreeHealth.schema.js';
|
|
2
|
+
import type { WorktreeEntry } from '../../../modules/worktree-management/entities/worktree/worktree.schema.js';
|
|
3
|
+
import type { WorktreeHealthProbeGateway } from '../../../modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.js';
|
|
4
|
+
export interface DetectDegradedWorktreesInput {
|
|
5
|
+
entries: WorktreeEntry[];
|
|
6
|
+
staleThresholdMs: number;
|
|
7
|
+
now: () => Date;
|
|
8
|
+
}
|
|
9
|
+
export interface DetectDegradedWorktreesDependencies {
|
|
10
|
+
healthProbe: WorktreeHealthProbeGateway;
|
|
11
|
+
}
|
|
12
|
+
export declare function detectDegradedWorktrees(input: DetectDegradedWorktreesInput, deps: DetectDegradedWorktreesDependencies): Promise<WorktreeHealthReport[]>;
|
|
13
|
+
//# sourceMappingURL=detectDegradedWorktrees.usecase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectDegradedWorktrees.usecase.d.ts","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,oBAAoB,EAErB,MAAM,0EAA0E,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oEAAoE,CAAC;AACxG,OAAO,KAAK,EAEV,0BAA0B,EAC3B,MAAM,gFAAgF,CAAC;AAExF,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mCAAmC;IAClD,WAAW,EAAE,0BAA0B,CAAC;CACzC;AA8BD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,EACnC,IAAI,EAAE,mCAAmC,GACxC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAajC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function decideReason(signals, staleThresholdMs, now) {
|
|
2
|
+
const ageMs = now.getTime() - signals.mtime.getTime();
|
|
3
|
+
if (ageMs > staleThresholdMs) {
|
|
4
|
+
return { kind: 'stale', ageMs, thresholdMs: staleThresholdMs };
|
|
5
|
+
}
|
|
6
|
+
if (signals.orphanLock?.present) {
|
|
7
|
+
return {
|
|
8
|
+
kind: 'orphan-git-lock',
|
|
9
|
+
lockPath: signals.orphanLock.path,
|
|
10
|
+
lockAgeMs: signals.orphanLock.ageMs,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (signals.unresolvedConflict) {
|
|
14
|
+
return { kind: 'unresolved-conflict' };
|
|
15
|
+
}
|
|
16
|
+
if (signals.missingBuildArtifacts.missing) {
|
|
17
|
+
return {
|
|
18
|
+
kind: 'missing-build-artifacts',
|
|
19
|
+
expectedPath: signals.missingBuildArtifacts.expectedPath,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
export async function detectDegradedWorktrees(input, deps) {
|
|
25
|
+
const now = input.now();
|
|
26
|
+
const reports = [];
|
|
27
|
+
for (const entry of input.entries) {
|
|
28
|
+
const signals = await deps.healthProbe.probe(entry);
|
|
29
|
+
const reason = decideReason(signals, input.staleThresholdMs, now);
|
|
30
|
+
const health = reason === null ? { status: 'healthy' } : { status: 'degraded', reason, detectedAt: now };
|
|
31
|
+
reports.push({ entry, health });
|
|
32
|
+
}
|
|
33
|
+
return reports;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=detectDegradedWorktrees.usecase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectDegradedWorktrees.usecase.js","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.ts"],"names":[],"mappings":"AAqBA,SAAS,YAAY,CACnB,OAAsB,EACtB,gBAAwB,EACxB,GAAS;IAET,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACtD,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI;YACjC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK;SACpC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,yBAAyB;YAC/B,YAAY,EAAE,OAAO,CAAC,qBAAqB,CAAC,YAAY;SACzD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAmC,EACnC,IAAyC;IAEzC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IACxB,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAClE,MAAM,MAAM,GACV,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -3,6 +3,7 @@ import type { GitCommandExecutor } from '../../../modules/worktree-management/en
|
|
|
3
3
|
export interface RemoveWorktreeInput {
|
|
4
4
|
identity: WorktreeIdentity;
|
|
5
5
|
sourceCheckoutPath: string;
|
|
6
|
+
force?: boolean;
|
|
6
7
|
}
|
|
7
8
|
export interface RemoveWorktreeDependencies {
|
|
8
9
|
executor: GitCommandExecutor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeWorktree.usecase.d.ts","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/removeWorktree.usecase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACb,MAAM,oEAAoE,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAElH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"removeWorktree.usecase.d.ts","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/removeWorktree.usecase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACb,MAAM,oEAAoE,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAElH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,cAAc,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,YAAY,CAAC,CA6BvB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { deriveWorktreePath } from '../../../modules/worktree-management/entities/worktree/worktree.js';
|
|
2
2
|
export async function removeWorktree(input, deps) {
|
|
3
3
|
const targetPath = deriveWorktreePath(input.identity);
|
|
4
|
+
const isForced = input.force === true;
|
|
4
5
|
await deps.executor.execute({
|
|
5
6
|
kind: 'worktree-prune',
|
|
6
7
|
args: ['worktree', 'prune'],
|
|
@@ -8,7 +9,7 @@ export async function removeWorktree(input, deps) {
|
|
|
8
9
|
});
|
|
9
10
|
const exists = await deps.worktreeExists(targetPath);
|
|
10
11
|
if (!exists) {
|
|
11
|
-
return { status: 'absent' };
|
|
12
|
+
return isForced ? { status: 'removed' } : { status: 'absent' };
|
|
12
13
|
}
|
|
13
14
|
const removeResult = await deps.executor.execute({
|
|
14
15
|
kind: 'worktree-remove',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeWorktree.usecase.js","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/removeWorktree.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;
|
|
1
|
+
{"version":3,"file":"removeWorktree.usecase.js","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/removeWorktree.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AAmBjG,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAA0B,EAC1B,IAAgC;IAEhC,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IAEtC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC1B,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;QAC3B,GAAG,EAAE,KAAK,CAAC,kBAAkB;KAC9B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC/C,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;QACnD,GAAG,EAAE,KAAK,CAAC,kBAAkB;KAC9B,CAAC,CAAC;IAEH,IAAI,YAAY,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,YAAY,CAAC,MAAM,IAAI,4BAA4B;SAC7D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPEC-175 — Worktree Failure Visibility & Force-Cleanup
|
|
3
|
+
*
|
|
4
|
+
* Outer-loop acceptance test (SDD): exercises GET /api/worktrees and
|
|
5
|
+
* POST /api/worktrees/cleanup end-to-end through a Fastify instance with
|
|
6
|
+
* stubbed health probe + real ForceCleanupLockService + real presenter +
|
|
7
|
+
* real detectDegradedWorktrees use case. No real disk I/O.
|
|
8
|
+
*
|
|
9
|
+
* Covers scenarios 2, 6, 7, 8, 10 from docs/specs/175-worktree-failure-visibility.md.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=175-worktree-failure-visibility.acceptance.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"175-worktree-failure-visibility.acceptance.test.d.ts","sourceRoot":"","sources":["../../../src/tests/acceptance/175-worktree-failure-visibility.acceptance.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|