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.
Files changed (310) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/config/projectConfig.d.ts +1 -0
  3. package/dist/config/projectConfig.d.ts.map +1 -1
  4. package/dist/config/projectConfig.js +17 -0
  5. package/dist/config/projectConfig.js.map +1 -1
  6. package/dist/dashboard/index.html +113 -7
  7. package/dist/dashboard/modules/constants.d.ts +1 -0
  8. package/dist/dashboard/modules/constants.d.ts.map +1 -1
  9. package/dist/dashboard/modules/constants.js +1 -0
  10. package/dist/dashboard/modules/constants.js.map +1 -1
  11. package/dist/dashboard/modules/headerCapacityBadge.d.ts +33 -0
  12. package/dist/dashboard/modules/headerCapacityBadge.d.ts.map +1 -0
  13. package/dist/dashboard/modules/headerCapacityBadge.js +53 -0
  14. package/dist/dashboard/modules/headerCapacityBadge.js.map +1 -0
  15. package/dist/dashboard/modules/i18n.d.ts.map +1 -1
  16. package/dist/dashboard/modules/i18n.js +4 -0
  17. package/dist/dashboard/modules/i18n.js.map +1 -1
  18. package/dist/dashboard/modules/settingsModal.d.ts +17 -0
  19. package/dist/dashboard/modules/settingsModal.d.ts.map +1 -1
  20. package/dist/dashboard/modules/settingsModal.js +38 -0
  21. package/dist/dashboard/modules/settingsModal.js.map +1 -1
  22. package/dist/dashboard/modules/worktreePanel.d.ts +40 -0
  23. package/dist/dashboard/modules/worktreePanel.d.ts.map +1 -1
  24. package/dist/dashboard/modules/worktreePanel.js +98 -1
  25. package/dist/dashboard/modules/worktreePanel.js.map +1 -1
  26. package/dist/dashboard/styles.css +152 -1
  27. package/dist/frameworks/claude/claudeInvoker.d.ts.map +1 -1
  28. package/dist/frameworks/claude/claudeInvoker.js +5 -10
  29. package/dist/frameworks/claude/claudeInvoker.js.map +1 -1
  30. package/dist/frameworks/config/configLoader.d.ts +1 -0
  31. package/dist/frameworks/config/configLoader.d.ts.map +1 -1
  32. package/dist/frameworks/config/configLoader.js +11 -0
  33. package/dist/frameworks/config/configLoader.js.map +1 -1
  34. package/dist/frameworks/queue/pQueueAdapter.d.ts +17 -0
  35. package/dist/frameworks/queue/pQueueAdapter.d.ts.map +1 -1
  36. package/dist/frameworks/queue/pQueueAdapter.js +103 -40
  37. package/dist/frameworks/queue/pQueueAdapter.js.map +1 -1
  38. package/dist/frameworks/queue/projectSemaphore.d.ts +26 -0
  39. package/dist/frameworks/queue/projectSemaphore.d.ts.map +1 -0
  40. package/dist/frameworks/queue/projectSemaphore.js +79 -0
  41. package/dist/frameworks/queue/projectSemaphore.js.map +1 -0
  42. package/dist/frameworks/settings/runtimeSettings.d.ts +3 -0
  43. package/dist/frameworks/settings/runtimeSettings.d.ts.map +1 -1
  44. package/dist/frameworks/settings/runtimeSettings.js +14 -0
  45. package/dist/frameworks/settings/runtimeSettings.js.map +1 -1
  46. package/dist/main/dependencies.d.ts +4 -0
  47. package/dist/main/dependencies.d.ts.map +1 -1
  48. package/dist/main/dependencies.js +8 -0
  49. package/dist/main/dependencies.js.map +1 -1
  50. package/dist/main/routes.d.ts.map +1 -1
  51. package/dist/main/routes.js +32 -3
  52. package/dist/main/routes.js.map +1 -1
  53. package/dist/main/server.d.ts.map +1 -1
  54. package/dist/main/server.js +69 -1
  55. package/dist/main/server.js.map +1 -1
  56. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.d.ts +2 -0
  57. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.d.ts.map +1 -0
  58. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.js +4 -0
  59. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.js.map +1 -0
  60. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.schema.d.ts +7 -0
  61. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.schema.d.ts.map +1 -0
  62. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.schema.js +10 -0
  63. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.schema.js.map +1 -0
  64. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.d.ts +18 -0
  65. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.d.ts.map +1 -0
  66. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.js +28 -0
  67. package/dist/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.js.map +1 -0
  68. package/dist/modules/cli-configuration/entities/repositoriesList/repositoriesList.gateway.d.ts +9 -0
  69. package/dist/modules/cli-configuration/entities/repositoriesList/repositoriesList.gateway.d.ts.map +1 -0
  70. package/dist/modules/cli-configuration/entities/repositoriesList/repositoriesList.gateway.js +2 -0
  71. package/dist/modules/cli-configuration/entities/repositoriesList/repositoriesList.gateway.js.map +1 -0
  72. package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.d.ts +1 -0
  73. package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.d.ts.map +1 -1
  74. package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.js +26 -0
  75. package/dist/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.js.map +1 -1
  76. package/dist/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.d.ts +8 -0
  77. package/dist/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.d.ts.map +1 -0
  78. package/dist/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.js +14 -0
  79. package/dist/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.js.map +1 -0
  80. package/dist/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.d.ts +26 -0
  81. package/dist/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.d.ts.map +1 -0
  82. package/dist/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.js +24 -0
  83. package/dist/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.js.map +1 -0
  84. package/dist/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.d.ts +2 -1
  85. package/dist/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.d.ts.map +1 -1
  86. package/dist/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.js +29 -5
  87. package/dist/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.js.map +1 -1
  88. package/dist/modules/review-execution/entities/job/jobHistory.gateway.d.ts +10 -0
  89. package/dist/modules/review-execution/entities/job/jobHistory.gateway.d.ts.map +1 -0
  90. package/dist/modules/review-execution/entities/job/jobHistory.gateway.js +2 -0
  91. package/dist/modules/review-execution/entities/job/jobHistory.gateway.js.map +1 -0
  92. package/dist/modules/review-execution/entities/job/jobRecord.guard.d.ts +13 -0
  93. package/dist/modules/review-execution/entities/job/jobRecord.guard.d.ts.map +1 -0
  94. package/dist/modules/review-execution/entities/job/jobRecord.guard.js +4 -0
  95. package/dist/modules/review-execution/entities/job/jobRecord.guard.js.map +1 -0
  96. package/dist/modules/review-execution/entities/job/jobRecord.schema.d.ts +33 -0
  97. package/dist/modules/review-execution/entities/job/jobRecord.schema.d.ts.map +1 -0
  98. package/dist/modules/review-execution/entities/job/jobRecord.schema.js +15 -0
  99. package/dist/modules/review-execution/entities/job/jobRecord.schema.js.map +1 -0
  100. package/dist/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.d.ts +19 -0
  101. package/dist/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.d.ts.map +1 -0
  102. package/dist/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.js +120 -0
  103. package/dist/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.js.map +1 -0
  104. package/dist/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.d.ts +17 -0
  105. package/dist/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.d.ts.map +1 -0
  106. package/dist/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.js +11 -0
  107. package/dist/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.js.map +1 -0
  108. package/dist/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.d.ts +18 -0
  109. package/dist/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.d.ts.map +1 -0
  110. package/dist/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.js +58 -0
  111. package/dist/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.js.map +1 -0
  112. package/dist/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.d.ts +16 -0
  113. package/dist/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.d.ts.map +1 -0
  114. package/dist/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.js +12 -0
  115. package/dist/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.js.map +1 -0
  116. package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.d.ts +4 -0
  117. package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.d.ts.map +1 -1
  118. package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.js +2 -0
  119. package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.js.map +1 -1
  120. package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.d.ts +12 -0
  121. package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.d.ts.map +1 -1
  122. package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.js +8 -0
  123. package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.js.map +1 -1
  124. package/dist/modules/statistics-insights/services/fetchDiffStatsSafely.d.ts +5 -0
  125. package/dist/modules/statistics-insights/services/fetchDiffStatsSafely.d.ts.map +1 -0
  126. package/dist/modules/statistics-insights/services/fetchDiffStatsSafely.js +10 -0
  127. package/dist/modules/statistics-insights/services/fetchDiffStatsSafely.js.map +1 -0
  128. package/dist/modules/statistics-insights/services/statsService.d.ts +5 -0
  129. package/dist/modules/statistics-insights/services/statsService.d.ts.map +1 -1
  130. package/dist/modules/statistics-insights/services/statsService.js +5 -0
  131. package/dist/modules/statistics-insights/services/statsService.js.map +1 -1
  132. package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.d.ts +1 -1
  133. package/dist/modules/worktree-management/entities/gitCommand/gitCommand.gateway.d.ts.map +1 -1
  134. package/dist/modules/worktree-management/entities/worktree/worktree.gateway.d.ts +1 -0
  135. package/dist/modules/worktree-management/entities/worktree/worktree.gateway.d.ts.map +1 -1
  136. package/dist/modules/worktree-management/entities/worktree/worktreeHealth.schema.d.ts +44 -0
  137. package/dist/modules/worktree-management/entities/worktree/worktreeHealth.schema.d.ts.map +1 -0
  138. package/dist/modules/worktree-management/entities/worktree/worktreeHealth.schema.js +31 -0
  139. package/dist/modules/worktree-management/entities/worktree/worktreeHealth.schema.js.map +1 -0
  140. package/dist/modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.d.ts +20 -0
  141. package/dist/modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.d.ts.map +1 -0
  142. package/dist/modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.js +2 -0
  143. package/dist/modules/worktree-management/entities/worktree/worktreeHealthProbe.gateway.js.map +1 -0
  144. package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.d.ts +6 -0
  145. package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.d.ts.map +1 -1
  146. package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.js +52 -1
  147. package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.js.map +1 -1
  148. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.d.ts.map +1 -1
  149. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js +5 -1
  150. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js.map +1 -1
  151. package/dist/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.d.ts +14 -0
  152. package/dist/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.d.ts.map +1 -0
  153. package/dist/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.js +97 -0
  154. package/dist/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.js.map +1 -0
  155. package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.d.ts +20 -0
  156. package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.d.ts.map +1 -1
  157. package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.js +58 -0
  158. package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.js.map +1 -1
  159. package/dist/modules/worktree-management/services/forceCleanupLock.d.ts +10 -0
  160. package/dist/modules/worktree-management/services/forceCleanupLock.d.ts.map +1 -0
  161. package/dist/modules/worktree-management/services/forceCleanupLock.js +14 -0
  162. package/dist/modules/worktree-management/services/forceCleanupLock.js.map +1 -0
  163. package/dist/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.d.ts +13 -0
  164. package/dist/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.d.ts.map +1 -0
  165. package/dist/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.js +35 -0
  166. package/dist/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.js.map +1 -0
  167. package/dist/modules/worktree-management/usecases/removeWorktree.usecase.d.ts +1 -0
  168. package/dist/modules/worktree-management/usecases/removeWorktree.usecase.d.ts.map +1 -1
  169. package/dist/modules/worktree-management/usecases/removeWorktree.usecase.js +2 -1
  170. package/dist/modules/worktree-management/usecases/removeWorktree.usecase.js.map +1 -1
  171. package/dist/tests/acceptance/175-worktree-failure-visibility.acceptance.test.d.ts +12 -0
  172. package/dist/tests/acceptance/175-worktree-failure-visibility.acceptance.test.d.ts.map +1 -0
  173. package/dist/tests/acceptance/175-worktree-failure-visibility.acceptance.test.js +293 -0
  174. package/dist/tests/acceptance/175-worktree-failure-visibility.acceptance.test.js.map +1 -0
  175. package/dist/tests/acceptance/176-job-history-persistence.acceptance.test.d.ts +13 -0
  176. package/dist/tests/acceptance/176-job-history-persistence.acceptance.test.d.ts.map +1 -0
  177. package/dist/tests/acceptance/176-job-history-persistence.acceptance.test.js +261 -0
  178. package/dist/tests/acceptance/176-job-history-persistence.acceptance.test.js.map +1 -0
  179. package/dist/tests/acceptance/186-per-project-concurrency-cap.acceptance.test.d.ts +16 -0
  180. package/dist/tests/acceptance/186-per-project-concurrency-cap.acceptance.test.d.ts.map +1 -0
  181. package/dist/tests/acceptance/186-per-project-concurrency-cap.acceptance.test.js +391 -0
  182. package/dist/tests/acceptance/186-per-project-concurrency-cap.acceptance.test.js.map +1 -0
  183. package/dist/tests/acceptance/47-capture-git-diff-stats.acceptance.test.d.ts +18 -0
  184. package/dist/tests/acceptance/47-capture-git-diff-stats.acceptance.test.d.ts.map +1 -0
  185. package/dist/tests/acceptance/47-capture-git-diff-stats.acceptance.test.js +221 -0
  186. package/dist/tests/acceptance/47-capture-git-diff-stats.acceptance.test.js.map +1 -0
  187. package/dist/tests/factories/config.factory.d.ts.map +1 -1
  188. package/dist/tests/factories/config.factory.js +1 -0
  189. package/dist/tests/factories/config.factory.js.map +1 -1
  190. package/dist/tests/factories/jobRecord.factory.d.ts +5 -0
  191. package/dist/tests/factories/jobRecord.factory.d.ts.map +1 -0
  192. package/dist/tests/factories/jobRecord.factory.js +18 -0
  193. package/dist/tests/factories/jobRecord.factory.js.map +1 -0
  194. package/dist/tests/factories/projectConcurrencyCap.factory.d.ts +5 -0
  195. package/dist/tests/factories/projectConcurrencyCap.factory.d.ts.map +1 -0
  196. package/dist/tests/factories/projectConcurrencyCap.factory.js +8 -0
  197. package/dist/tests/factories/projectConcurrencyCap.factory.js.map +1 -0
  198. package/dist/tests/factories/worktreeHealth.factory.d.ts +22 -0
  199. package/dist/tests/factories/worktreeHealth.factory.d.ts.map +1 -0
  200. package/dist/tests/factories/worktreeHealth.factory.js +53 -0
  201. package/dist/tests/factories/worktreeHealth.factory.js.map +1 -0
  202. package/dist/tests/stubs/jobHistory.stub.d.ts +13 -0
  203. package/dist/tests/stubs/jobHistory.stub.d.ts.map +1 -0
  204. package/dist/tests/stubs/jobHistory.stub.js +63 -0
  205. package/dist/tests/stubs/jobHistory.stub.js.map +1 -0
  206. package/dist/tests/stubs/queueCapacityPort.stub.d.ts +8 -0
  207. package/dist/tests/stubs/queueCapacityPort.stub.d.ts.map +1 -0
  208. package/dist/tests/stubs/queueCapacityPort.stub.js +11 -0
  209. package/dist/tests/stubs/queueCapacityPort.stub.js.map +1 -0
  210. package/dist/tests/stubs/repositoriesListGateway.stub.d.ts +7 -0
  211. package/dist/tests/stubs/repositoriesListGateway.stub.d.ts.map +1 -0
  212. package/dist/tests/stubs/repositoriesListGateway.stub.js +10 -0
  213. package/dist/tests/stubs/repositoriesListGateway.stub.js.map +1 -0
  214. package/dist/tests/stubs/worktreeHealthProbe.stub.d.ts +11 -0
  215. package/dist/tests/stubs/worktreeHealthProbe.stub.d.ts.map +1 -0
  216. package/dist/tests/stubs/worktreeHealthProbe.stub.js +26 -0
  217. package/dist/tests/stubs/worktreeHealthProbe.stub.js.map +1 -0
  218. package/dist/tests/units/cli/cli.integration.test.js +6 -4
  219. package/dist/tests/units/cli/cli.integration.test.js.map +1 -1
  220. package/dist/tests/units/dashboard/modules/headerCapacityBadge.test.d.ts +2 -0
  221. package/dist/tests/units/dashboard/modules/headerCapacityBadge.test.d.ts.map +1 -0
  222. package/dist/tests/units/dashboard/modules/headerCapacityBadge.test.js +55 -0
  223. package/dist/tests/units/dashboard/modules/headerCapacityBadge.test.js.map +1 -0
  224. package/dist/tests/units/dashboard/modules/notifications.test.js +17 -0
  225. package/dist/tests/units/dashboard/modules/notifications.test.js.map +1 -1
  226. package/dist/tests/units/dashboard/modules/settingsModal.test.js +7 -0
  227. package/dist/tests/units/dashboard/modules/settingsModal.test.js.map +1 -1
  228. package/dist/tests/units/dashboard/modules/worktreePanel.test.js +123 -1
  229. package/dist/tests/units/dashboard/modules/worktreePanel.test.js.map +1 -1
  230. package/dist/tests/units/frameworks/config/configLoader.test.js +28 -0
  231. package/dist/tests/units/frameworks/config/configLoader.test.js.map +1 -1
  232. package/dist/tests/units/frameworks/queue/pQueueAdapter.test.js +125 -0
  233. package/dist/tests/units/frameworks/queue/pQueueAdapter.test.js.map +1 -1
  234. package/dist/tests/units/frameworks/queue/projectSemaphore.test.d.ts +2 -0
  235. package/dist/tests/units/frameworks/queue/projectSemaphore.test.d.ts.map +1 -0
  236. package/dist/tests/units/frameworks/queue/projectSemaphore.test.js +92 -0
  237. package/dist/tests/units/frameworks/queue/projectSemaphore.test.js.map +1 -0
  238. package/dist/tests/units/frameworks/settings/runtimeSettings.test.js +34 -2
  239. package/dist/tests/units/frameworks/settings/runtimeSettings.test.js.map +1 -1
  240. package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.test.d.ts +2 -0
  241. package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.test.d.ts.map +1 -0
  242. package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.test.js +22 -0
  243. package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.guard.test.js.map +1 -0
  244. package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.test.d.ts +2 -0
  245. package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.test.d.ts.map +1 -0
  246. package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.test.js +85 -0
  247. package/dist/tests/units/modules/cli-configuration/entities/projectConcurrencyCap/projectConcurrencyCap.valueObject.test.js.map +1 -0
  248. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js +91 -0
  249. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/projectConfig.routes.test.js.map +1 -1
  250. package/dist/tests/units/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.test.d.ts +2 -0
  251. package/dist/tests/units/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.test.d.ts.map +1 -0
  252. package/dist/tests/units/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.test.js +29 -0
  253. package/dist/tests/units/modules/cli-configuration/interface-adapters/gateways/repositoriesList.runtimeConfig.gateway.test.js.map +1 -0
  254. package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.test.d.ts +2 -0
  255. package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.test.d.ts.map +1 -0
  256. package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.test.js +126 -0
  257. package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/recomputeGlobalConcurrency.usecase.test.js.map +1 -0
  258. package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.test.js +78 -0
  259. package/dist/tests/units/modules/cli-configuration/usecases/projectConfig/updateProjectConfig.usecase.test.js.map +1 -1
  260. package/dist/tests/units/modules/review-execution/entities/job/jobRecord.guard.test.d.ts +2 -0
  261. package/dist/tests/units/modules/review-execution/entities/job/jobRecord.guard.test.d.ts.map +1 -0
  262. package/dist/tests/units/modules/review-execution/entities/job/jobRecord.guard.test.js +48 -0
  263. package/dist/tests/units/modules/review-execution/entities/job/jobRecord.guard.test.js.map +1 -0
  264. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.test.d.ts +2 -0
  265. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.test.d.ts.map +1 -0
  266. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.test.js +134 -0
  267. package/dist/tests/units/modules/review-execution/interface-adapters/gateways/fileSystem/jobHistory.fileSystem.gateway.test.js.map +1 -0
  268. package/dist/tests/units/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.test.d.ts +2 -0
  269. package/dist/tests/units/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.test.d.ts.map +1 -0
  270. package/dist/tests/units/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.test.js +38 -0
  271. package/dist/tests/units/modules/review-execution/usecases/jobHistory/loadRecentJobHistory.usecase.test.js.map +1 -0
  272. package/dist/tests/units/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.test.d.ts +2 -0
  273. package/dist/tests/units/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.test.d.ts.map +1 -0
  274. package/dist/tests/units/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.test.js +126 -0
  275. package/dist/tests/units/modules/review-execution/usecases/jobHistory/persistJobRecord.usecase.test.js.map +1 -0
  276. package/dist/tests/units/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.test.d.ts +2 -0
  277. package/dist/tests/units/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.test.d.ts.map +1 -0
  278. package/dist/tests/units/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.test.js +42 -0
  279. package/dist/tests/units/modules/review-execution/usecases/jobHistory/pruneJobHistory.usecase.test.js.map +1 -0
  280. package/dist/tests/units/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.test.js +28 -0
  281. package/dist/tests/units/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.test.js.map +1 -1
  282. package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.js +39 -0
  283. package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.js.map +1 -1
  284. package/dist/tests/units/modules/worktree-management/entities/worktree/worktreeHealth.schema.test.d.ts +2 -0
  285. package/dist/tests/units/modules/worktree-management/entities/worktree/worktreeHealth.schema.test.d.ts.map +1 -0
  286. package/dist/tests/units/modules/worktree-management/entities/worktree/worktreeHealth.schema.test.js +50 -0
  287. package/dist/tests/units/modules/worktree-management/entities/worktree/worktreeHealth.schema.test.js.map +1 -0
  288. package/dist/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.js +106 -0
  289. package/dist/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.js.map +1 -1
  290. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.test.d.ts +2 -0
  291. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.test.d.ts.map +1 -0
  292. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.test.js +114 -0
  293. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeHealthProbe.fileSystem.gateway.test.js.map +1 -0
  294. package/dist/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.js +140 -0
  295. package/dist/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.js.map +1 -1
  296. package/dist/tests/units/modules/worktree-management/services/forceCleanupLock.test.d.ts +2 -0
  297. package/dist/tests/units/modules/worktree-management/services/forceCleanupLock.test.d.ts.map +1 -0
  298. package/dist/tests/units/modules/worktree-management/services/forceCleanupLock.test.js +29 -0
  299. package/dist/tests/units/modules/worktree-management/services/forceCleanupLock.test.js.map +1 -0
  300. package/dist/tests/units/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.test.d.ts +2 -0
  301. package/dist/tests/units/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.test.d.ts.map +1 -0
  302. package/dist/tests/units/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.test.js +124 -0
  303. package/dist/tests/units/modules/worktree-management/usecases/detectDegradedWorktrees.usecase.test.js.map +1 -0
  304. package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.js +27 -0
  305. package/dist/tests/units/modules/worktree-management/usecases/removeWorktree.usecase.test.js.map +1 -1
  306. package/dist/tests/units/services/statsService.summary.test.d.ts +2 -0
  307. package/dist/tests/units/services/statsService.summary.test.d.ts.map +1 -0
  308. package/dist/tests/units/services/statsService.summary.test.js +43 -0
  309. package/dist/tests/units/services/statsService.summary.test.js.map +1 -0
  310. 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":"AAoBA,MAAM,CAAC,MAAM,sBAAsB,GAAsD,KAAK,EAC5F,OAAO,EACP,IAAI,EACJ,EAAE;IACF,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEvE,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,SAAS,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;YACxC,SAAS;YACT,SAAS,EAAE,iBAAiB,CAAC,YAAY,EAAE;YAC3C,WAAW,EAAE,iBAAiB,CAAC,eAAe,EAAE;SACjD,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;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"worktreeOverview.routes.js","sourceRoot":"","sources":["../../../../../../src/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.ts"],"names":[],"mappings":"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"}
@@ -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;IAe7D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;CAoBvC"}
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"}
@@ -27,7 +27,11 @@ export class WorktreeFileSystemGateway {
27
27
  }
28
28
  async remove(request) {
29
29
  try {
30
- return await removeWorktree({ identity: request.identity, sourceCheckoutPath: request.sourceCheckoutPath }, {
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":"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"}
1
+ {"version":3,"file":"worktree.fileSystem.gateway.js","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -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;AAK5E,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,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;CAClC;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,kCAAkC;IACjD,SAAS,EAAE,wBAAwB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAkBD,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;YAsEpE,WAAW;CAY1B"}
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"}
@@ -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":"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"}
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;CAC5B;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,CA4BvB"}
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;AAkBjG,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAA0B,EAC1B,IAAgC;IAEhC,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEtD,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,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,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"}
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"}