reviewflow 3.16.0 → 3.17.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 (92) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/dashboard/index.html +132 -0
  3. package/dist/dashboard/modules/i18n.d.ts.map +1 -1
  4. package/dist/dashboard/modules/i18n.js +30 -0
  5. package/dist/dashboard/modules/i18n.js.map +1 -1
  6. package/dist/dashboard/modules/worktreePanel.d.ts +111 -0
  7. package/dist/dashboard/modules/worktreePanel.d.ts.map +1 -0
  8. package/dist/dashboard/modules/worktreePanel.js +373 -0
  9. package/dist/dashboard/modules/worktreePanel.js.map +1 -0
  10. package/dist/dashboard/styles.css +312 -0
  11. package/dist/dashboard/vendor/anime.esm.min.js +7 -0
  12. package/dist/frameworks/scheduler/worktreeSweepScheduler.d.ts +8 -2
  13. package/dist/frameworks/scheduler/worktreeSweepScheduler.d.ts.map +1 -1
  14. package/dist/frameworks/scheduler/worktreeSweepScheduler.js +38 -3
  15. package/dist/frameworks/scheduler/worktreeSweepScheduler.js.map +1 -1
  16. package/dist/main/dependencies.d.ts +6 -0
  17. package/dist/main/dependencies.d.ts.map +1 -1
  18. package/dist/main/dependencies.js +9 -0
  19. package/dist/main/dependencies.js.map +1 -1
  20. package/dist/main/routes.d.ts.map +1 -1
  21. package/dist/main/routes.js +7 -0
  22. package/dist/main/routes.js.map +1 -1
  23. package/dist/main/server.d.ts.map +1 -1
  24. package/dist/main/server.js +7 -2
  25. package/dist/main/server.js.map +1 -1
  26. package/dist/modules/review-execution/entities/progress/agentDefinition.type.d.ts.map +1 -1
  27. package/dist/modules/review-execution/entities/progress/agentDefinition.type.js +1 -0
  28. package/dist/modules/review-execution/entities/progress/agentDefinition.type.js.map +1 -1
  29. package/dist/modules/worktree-management/entities/sweep/lastSweepSummary.schema.d.ts +9 -0
  30. package/dist/modules/worktree-management/entities/sweep/lastSweepSummary.schema.d.ts.map +1 -0
  31. package/dist/modules/worktree-management/entities/sweep/lastSweepSummary.schema.js +8 -0
  32. package/dist/modules/worktree-management/entities/sweep/lastSweepSummary.schema.js.map +1 -0
  33. package/dist/modules/worktree-management/entities/sweep/runSweepResult.d.ts +12 -0
  34. package/dist/modules/worktree-management/entities/sweep/runSweepResult.d.ts.map +1 -0
  35. package/dist/modules/worktree-management/entities/sweep/runSweepResult.js +2 -0
  36. package/dist/modules/worktree-management/entities/sweep/runSweepResult.js.map +1 -0
  37. package/dist/modules/worktree-management/entities/worktree/worktreeSizeProbe.gateway.d.ts +4 -0
  38. package/dist/modules/worktree-management/entities/worktree/worktreeSizeProbe.gateway.d.ts.map +1 -0
  39. package/dist/modules/worktree-management/entities/worktree/worktreeSizeProbe.gateway.js +2 -0
  40. package/dist/modules/worktree-management/entities/worktree/worktreeSizeProbe.gateway.js.map +1 -0
  41. package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.d.ts +19 -0
  42. package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.d.ts.map +1 -0
  43. package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.js +39 -0
  44. package/dist/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.js.map +1 -0
  45. package/dist/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.d.ts +17 -0
  46. package/dist/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.d.ts.map +1 -0
  47. package/dist/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.js +46 -0
  48. package/dist/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.js.map +1 -0
  49. package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.d.ts +53 -0
  50. package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.d.ts.map +1 -0
  51. package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.js +102 -0
  52. package/dist/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.js.map +1 -0
  53. package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.d.ts +1 -1
  54. package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.d.ts.map +1 -1
  55. package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.js +1 -1
  56. package/dist/modules/worktree-management/usecases/sweepStaleWorktrees.usecase.js.map +1 -1
  57. package/dist/tests/acceptance/173-dashboard-worktree-panel.acceptance.test.d.ts +10 -0
  58. package/dist/tests/acceptance/173-dashboard-worktree-panel.acceptance.test.d.ts.map +1 -0
  59. package/dist/tests/acceptance/173-dashboard-worktree-panel.acceptance.test.js +192 -0
  60. package/dist/tests/acceptance/173-dashboard-worktree-panel.acceptance.test.js.map +1 -0
  61. package/dist/tests/factories/lastSweepSummary.factory.d.ts +5 -0
  62. package/dist/tests/factories/lastSweepSummary.factory.d.ts.map +1 -0
  63. package/dist/tests/factories/lastSweepSummary.factory.js +12 -0
  64. package/dist/tests/factories/lastSweepSummary.factory.js.map +1 -0
  65. package/dist/tests/stubs/worktreeSizeProbe.stub.d.ts +11 -0
  66. package/dist/tests/stubs/worktreeSizeProbe.stub.d.ts.map +1 -0
  67. package/dist/tests/stubs/worktreeSizeProbe.stub.js +22 -0
  68. package/dist/tests/stubs/worktreeSizeProbe.stub.js.map +1 -0
  69. package/dist/tests/units/dashboard/modules/worktreePanel.test.d.ts +2 -0
  70. package/dist/tests/units/dashboard/modules/worktreePanel.test.d.ts.map +1 -0
  71. package/dist/tests/units/dashboard/modules/worktreePanel.test.js +274 -0
  72. package/dist/tests/units/dashboard/modules/worktreePanel.test.js.map +1 -0
  73. package/dist/tests/units/frameworks/scheduler/worktreeSweepScheduler.test.js +117 -0
  74. package/dist/tests/units/frameworks/scheduler/worktreeSweepScheduler.test.js.map +1 -1
  75. package/dist/tests/units/modules/worktree-management/entities/sweep/lastSweepSummary.schema.test.d.ts +2 -0
  76. package/dist/tests/units/modules/worktree-management/entities/sweep/lastSweepSummary.schema.test.d.ts.map +1 -0
  77. package/dist/tests/units/modules/worktree-management/entities/sweep/lastSweepSummary.schema.test.js +44 -0
  78. package/dist/tests/units/modules/worktree-management/entities/sweep/lastSweepSummary.schema.test.js.map +1 -0
  79. package/dist/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.d.ts +2 -0
  80. package/dist/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.d.ts.map +1 -0
  81. package/dist/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.js +160 -0
  82. package/dist/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.js.map +1 -0
  83. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.test.d.ts +2 -0
  84. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.test.d.ts.map +1 -0
  85. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.test.js +54 -0
  86. package/dist/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.test.js.map +1 -0
  87. package/dist/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.d.ts +2 -0
  88. package/dist/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.d.ts.map +1 -0
  89. package/dist/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.js +259 -0
  90. package/dist/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.js.map +1 -0
  91. package/package.json +2 -1
  92. package/scripts/copyAssets.mjs +8 -0
@@ -115,5 +115,122 @@ describe('worktreeSweepScheduler', () => {
115
115
  await expect(vi.advanceTimersByTimeAsync(TWENTY_FOUR_HOURS_MS)).resolves.not.toThrow();
116
116
  scheduler.stop();
117
117
  });
118
+ describe('SPEC-173 extensions', () => {
119
+ it('returns null from getLastSweep when no sweep has run yet', () => {
120
+ const stub = createStubWorktreeGateway([]);
121
+ const scheduler = startWorktreeSweepScheduler({
122
+ worktreeGateway: stub.gateway,
123
+ trackingGateway: createStubTrackingGateway(),
124
+ getRepositories: () => [],
125
+ logger: createStubLogger(),
126
+ now: () => new Date('2026-05-23T12:00:00Z'),
127
+ });
128
+ expect(scheduler.getLastSweep()).toBeNull();
129
+ scheduler.stop();
130
+ });
131
+ it('exposes the last sweep summary after the boot run completes', async () => {
132
+ const stub = createStubWorktreeGateway([]);
133
+ const scheduler = startWorktreeSweepScheduler({
134
+ worktreeGateway: stub.gateway,
135
+ trackingGateway: createStubTrackingGateway(),
136
+ getRepositories: () => [],
137
+ logger: createStubLogger(),
138
+ now: () => new Date('2026-05-23T12:00:00Z'),
139
+ });
140
+ await vi.advanceTimersByTimeAsync(10);
141
+ const summary = scheduler.getLastSweep();
142
+ expect(summary).not.toBeNull();
143
+ expect(summary?.removed).toBe(0);
144
+ expect(summary?.failures).toBe(0);
145
+ expect(summary?.scanned).toBe(0);
146
+ expect(summary?.ranAt.toISOString()).toBe('2026-05-23T12:00:00.000Z');
147
+ scheduler.stop();
148
+ });
149
+ it('getNextSweepEta returns now + interval before any sweep runs and ranAt + interval after a sweep', async () => {
150
+ const stub = createStubWorktreeGateway([]);
151
+ const startTime = new Date('2026-05-23T12:00:00Z');
152
+ const scheduler = startWorktreeSweepScheduler({
153
+ worktreeGateway: stub.gateway,
154
+ trackingGateway: createStubTrackingGateway(),
155
+ getRepositories: () => [],
156
+ logger: createStubLogger(),
157
+ now: () => startTime,
158
+ });
159
+ await vi.advanceTimersByTimeAsync(10);
160
+ const eta = scheduler.getNextSweepEta();
161
+ expect(eta.getTime()).toBe(startTime.getTime() + TWENTY_FOUR_HOURS_MS);
162
+ scheduler.stop();
163
+ });
164
+ it('runSweepNow runs the sweep and returns an ok result with the new summary', async () => {
165
+ const stub = createStubWorktreeGateway([]);
166
+ const scheduler = startWorktreeSweepScheduler({
167
+ worktreeGateway: stub.gateway,
168
+ trackingGateway: createStubTrackingGateway(),
169
+ getRepositories: () => [],
170
+ logger: createStubLogger(),
171
+ now: () => new Date('2026-05-23T12:00:00Z'),
172
+ });
173
+ await vi.advanceTimersByTimeAsync(10);
174
+ const callsBefore = stub.listCalls;
175
+ const result = await scheduler.runSweepNow();
176
+ expect(result.status).toBe('ok');
177
+ if (result.status === 'ok') {
178
+ expect(result.summary.scanned).toBe(0);
179
+ }
180
+ expect(stub.listCalls).toBe(callsBefore + 1);
181
+ scheduler.stop();
182
+ });
183
+ it('runSweepNow returns an error result when the internal sweep throws', async () => {
184
+ const throwingGateway = {
185
+ list: async () => {
186
+ throw new Error('disk full');
187
+ },
188
+ remove: async () => ({ status: 'absent' }),
189
+ ensure: async () => ({ status: 'failed', reason: 'not-implemented-in-stub' }),
190
+ exists: async () => false,
191
+ };
192
+ const scheduler = startWorktreeSweepScheduler({
193
+ worktreeGateway: throwingGateway,
194
+ trackingGateway: createStubTrackingGateway(),
195
+ getRepositories: () => [],
196
+ logger: createStubLogger(),
197
+ now: () => new Date('2026-05-23T12:00:00Z'),
198
+ });
199
+ await vi.advanceTimersByTimeAsync(10);
200
+ const result = await scheduler.runSweepNow();
201
+ expect(result.status).toBe('error');
202
+ if (result.status === 'error') {
203
+ expect(result.reason).toContain('disk full');
204
+ }
205
+ scheduler.stop();
206
+ });
207
+ it('runSweepNow returns a conflict result when a sweep is already running', async () => {
208
+ let resolveList = () => undefined;
209
+ const blockingGateway = {
210
+ list: () => new Promise(resolve => {
211
+ resolveList = resolve;
212
+ }),
213
+ remove: async () => ({ status: 'removed' }),
214
+ ensure: async () => ({ status: 'failed', reason: 'not-implemented-in-stub' }),
215
+ exists: async () => false,
216
+ };
217
+ const scheduler = startWorktreeSweepScheduler({
218
+ worktreeGateway: blockingGateway,
219
+ trackingGateway: createStubTrackingGateway(),
220
+ getRepositories: () => [],
221
+ logger: createStubLogger(),
222
+ now: () => new Date('2026-05-23T12:00:00Z'),
223
+ });
224
+ await vi.advanceTimersByTimeAsync(0);
225
+ const conflictResult = await scheduler.runSweepNow();
226
+ expect(conflictResult.status).toBe('conflict');
227
+ if (conflictResult.status === 'conflict') {
228
+ expect(conflictResult.startedAt).toBeInstanceOf(Date);
229
+ }
230
+ resolveList([]);
231
+ await vi.advanceTimersByTimeAsync(0);
232
+ scheduler.stop();
233
+ });
234
+ });
118
235
  });
119
236
  //# sourceMappingURL=worktreeSweepScheduler.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worktreeSweepScheduler.test.js","sourceRoot":"","sources":["../../../../../src/tests/units/frameworks/scheduler/worktreeSweepScheduler.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worktreeSweepScheduler.test.js","sourceRoot":"","sources":["../../../../../src/tests/units/frameworks/scheduler/worktreeSweepScheduler.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lastSweepSummary.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lastSweepSummary.schema.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/modules/worktree-management/entities/sweep/lastSweepSummary.schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { lastSweepSummarySchema } from '../../../../../../modules/worktree-management/entities/sweep/lastSweepSummary.schema.js';
3
+ describe('lastSweepSummarySchema', () => {
4
+ it('parses a well-formed sweep summary', () => {
5
+ const parsed = lastSweepSummarySchema.parse({
6
+ ranAt: new Date('2026-05-23T03:00:00.000Z'),
7
+ removed: 2,
8
+ failures: 0,
9
+ scanned: 9,
10
+ });
11
+ expect(parsed.ranAt.toISOString()).toBe('2026-05-23T03:00:00.000Z');
12
+ expect(parsed.removed).toBe(2);
13
+ expect(parsed.failures).toBe(0);
14
+ expect(parsed.scanned).toBe(9);
15
+ });
16
+ it('rejects negative counters', () => {
17
+ const result = lastSweepSummarySchema.safeParse({
18
+ ranAt: new Date(),
19
+ removed: -1,
20
+ failures: 0,
21
+ scanned: 0,
22
+ });
23
+ expect(result.success).toBe(false);
24
+ });
25
+ it('rejects non-integer counters', () => {
26
+ const result = lastSweepSummarySchema.safeParse({
27
+ ranAt: new Date(),
28
+ removed: 1.5,
29
+ failures: 0,
30
+ scanned: 0,
31
+ });
32
+ expect(result.success).toBe(false);
33
+ });
34
+ it('rejects an invalid ranAt', () => {
35
+ const result = lastSweepSummarySchema.safeParse({
36
+ ranAt: 'not-a-date',
37
+ removed: 0,
38
+ failures: 0,
39
+ scanned: 0,
40
+ });
41
+ expect(result.success).toBe(false);
42
+ });
43
+ });
44
+ //# sourceMappingURL=lastSweepSummary.schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lastSweepSummary.schema.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/modules/worktree-management/entities/sweep/lastSweepSummary.schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yEAAyE,CAAC;AAEjH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC;YAC1C,KAAK,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;YAC3C,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;YAC9C,KAAK,EAAE,IAAI,IAAI,EAAE;YACjB,OAAO,EAAE,CAAC,CAAC;YACX,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;YAC9C,KAAK,EAAE,IAAI,IAAI,EAAE;YACjB,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;YAC9C,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worktreeOverview.routes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeOverview.routes.test.d.ts","sourceRoot":"","sources":["../../../../../../../../src/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,160 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import Fastify from 'fastify';
3
+ import { worktreeOverviewRoutes } from '../../../../../../../modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.js';
4
+ import { WorktreePanelPresenter } from '../../../../../../../modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.js';
5
+ import { StubWorktreeSizeProbeGateway } from '../../../../../../../tests/stubs/worktreeSizeProbe.stub.js';
6
+ import { LastSweepSummaryFactory } from '../../../../../../../tests/factories/lastSweepSummary.factory.js';
7
+ import { createStubLogger } from '../../../../../../../tests/stubs/logger.stub.js';
8
+ import { createWorktreePath } from '../../../../../../../modules/worktree-management/entities/worktree/worktree.js';
9
+ const NOW = new Date('2026-05-23T12:00:00.000Z');
10
+ function buildEntry(identity, mtime, path) {
11
+ return {
12
+ identity,
13
+ path: createWorktreePath(path),
14
+ mtime,
15
+ };
16
+ }
17
+ class StubWorktreeGateway {
18
+ entries;
19
+ constructor(entries) {
20
+ this.entries = entries;
21
+ }
22
+ async list() {
23
+ return this.entries;
24
+ }
25
+ async ensure() {
26
+ return { status: 'failed', reason: 'not-implemented' };
27
+ }
28
+ async remove() {
29
+ return { status: 'absent' };
30
+ }
31
+ async exists() {
32
+ return false;
33
+ }
34
+ }
35
+ async function buildApp(options = {}) {
36
+ const app = Fastify();
37
+ const worktrees = options.worktrees ?? [];
38
+ const sizeProbe = new StubWorktreeSizeProbeGateway();
39
+ if (options.sizeProbeMap) {
40
+ for (const [path, size] of Object.entries(options.sizeProbeMap)) {
41
+ sizeProbe.setSize(path, size);
42
+ }
43
+ }
44
+ else {
45
+ sizeProbe.setDefault(100);
46
+ }
47
+ const presenter = new WorktreePanelPresenter({
48
+ sizeProbe,
49
+ cacheTtlMs: 30_000,
50
+ now: () => NOW,
51
+ });
52
+ const lastSweep = options.lastSweep ?? null;
53
+ const nextSweepAt = options.nextSweepAt ?? NOW;
54
+ const runSweepNow = options.runSweepNow ??
55
+ (async () => ({ status: 'ok', summary: LastSweepSummaryFactory.create() }));
56
+ await app.register(worktreeOverviewRoutes, {
57
+ worktreeGateway: new StubWorktreeGateway(worktrees),
58
+ presenter,
59
+ schedulerControls: options.controlsAbsent
60
+ ? null
61
+ : {
62
+ getLastSweep: () => lastSweep,
63
+ getNextSweepEta: () => nextSweepAt,
64
+ runSweepNow,
65
+ },
66
+ logger: createStubLogger(),
67
+ });
68
+ return app;
69
+ }
70
+ describe('worktreeOverviewRoutes', () => {
71
+ describe('GET /api/worktrees', () => {
72
+ it('returns the presented view model with empty pool', async () => {
73
+ const app = await buildApp();
74
+ const response = await app.inject({ method: 'GET', url: '/api/worktrees' });
75
+ expect(response.statusCode).toBe(200);
76
+ const body = response.json();
77
+ expect(body.totalCount).toBe(0);
78
+ expect(body.totalSizeBytes).toBe(0);
79
+ expect(body.groups).toEqual([]);
80
+ expect(body.lastSweep).toBeNull();
81
+ await app.close();
82
+ });
83
+ it('returns the populated pool with one group + one row', async () => {
84
+ const identity = { platform: 'gitlab', projectPath: 'group/project', mrNumber: 1 };
85
+ const path = '/tmp/worktrees/gitlab-group-project-1';
86
+ const entry = buildEntry(identity, new Date(NOW.getTime() - 60 * 60 * 1000), path);
87
+ const app = await buildApp({
88
+ worktrees: [entry],
89
+ sizeProbeMap: { [path]: 200 },
90
+ lastSweep: LastSweepSummaryFactory.create({ removed: 3, failures: 1, scanned: 5 }),
91
+ nextSweepAt: new Date('2026-05-24T03:00:00.000Z'),
92
+ });
93
+ const response = await app.inject({ method: 'GET', url: '/api/worktrees' });
94
+ expect(response.statusCode).toBe(200);
95
+ const body = response.json();
96
+ expect(body.totalCount).toBe(1);
97
+ expect(body.totalSizeBytes).toBe(200);
98
+ expect(body.lastSweep.removed).toBe(3);
99
+ expect(body.groups[0]?.worktrees[0]?.mrNumber).toBe(1);
100
+ expect(body.groups[0]?.worktrees[0]?.status).toBe('active');
101
+ await app.close();
102
+ });
103
+ it('returns 503 when scheduler controls are absent', async () => {
104
+ const app = await buildApp({ controlsAbsent: true });
105
+ const response = await app.inject({ method: 'GET', url: '/api/worktrees' });
106
+ expect(response.statusCode).toBe(503);
107
+ await app.close();
108
+ });
109
+ });
110
+ describe('POST /api/worktrees/sweep', () => {
111
+ it('returns 200 with the new sweep summary on success', async () => {
112
+ const summary = LastSweepSummaryFactory.create({
113
+ ranAt: new Date('2026-05-23T11:55:00.000Z'),
114
+ removed: 2,
115
+ failures: 0,
116
+ scanned: 4,
117
+ });
118
+ const app = await buildApp({
119
+ runSweepNow: async () => ({ status: 'ok', summary }),
120
+ });
121
+ const response = await app.inject({ method: 'POST', url: '/api/worktrees/sweep' });
122
+ expect(response.statusCode).toBe(200);
123
+ const body = response.json();
124
+ expect(body.ranAt).toBe('2026-05-23T11:55:00.000Z');
125
+ expect(body.removed).toBe(2);
126
+ expect(body.failures).toBe(0);
127
+ expect(body.scanned).toBe(4);
128
+ await app.close();
129
+ });
130
+ it('returns 409 with startedAt when a sweep is already running', async () => {
131
+ const startedAt = new Date('2026-05-23T11:59:57.000Z');
132
+ const app = await buildApp({
133
+ runSweepNow: async () => ({ status: 'conflict', startedAt }),
134
+ });
135
+ const response = await app.inject({ method: 'POST', url: '/api/worktrees/sweep' });
136
+ expect(response.statusCode).toBe(409);
137
+ const body = response.json();
138
+ expect(body.error).toBe('sweep-in-progress');
139
+ expect(body.startedAt).toBe('2026-05-23T11:59:57.000Z');
140
+ await app.close();
141
+ });
142
+ it('returns 500 with a generic message when runSweepNow returns an error result', async () => {
143
+ const app = await buildApp({
144
+ runSweepNow: async () => ({ status: 'error', reason: 'disk full' }),
145
+ });
146
+ const response = await app.inject({ method: 'POST', url: '/api/worktrees/sweep' });
147
+ expect(response.statusCode).toBe(500);
148
+ const body = response.json();
149
+ expect(body.error).toBe('sweep-failed');
150
+ await app.close();
151
+ });
152
+ it('returns 503 when scheduler controls are absent', async () => {
153
+ const app = await buildApp({ controlsAbsent: true });
154
+ const response = await app.inject({ method: 'POST', url: '/api/worktrees/sweep' });
155
+ expect(response.statusCode).toBe(503);
156
+ await app.close();
157
+ });
158
+ });
159
+ });
160
+ //# sourceMappingURL=worktreeOverview.routes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeOverview.routes.test.js","sourceRoot":"","sources":["../../../../../../../../src/tests/units/modules/worktree-management/interface-adapters/controllers/http/worktreeOverview.routes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worktreeSizeProbe.cli.gateway.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeSizeProbe.cli.gateway.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { WorktreeSizeProbeCliGateway, } from '../../../../../../modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.js';
3
+ describe('WorktreeSizeProbeCliGateway', () => {
4
+ it('returns the parsed byte count from the first du -sb token', async () => {
5
+ const runner = async () => ({
6
+ stdout: '218103808\t/home/.reviewflow/worktrees/example\n',
7
+ stderr: '',
8
+ exitCode: 0,
9
+ });
10
+ const gateway = new WorktreeSizeProbeCliGateway(runner);
11
+ const result = await gateway.probe('/home/.reviewflow/worktrees/example');
12
+ expect(result).toBe(218_103_808);
13
+ });
14
+ it('returns null when du exits with a non-zero code', async () => {
15
+ const runner = async () => ({
16
+ stdout: '',
17
+ stderr: 'du: cannot access',
18
+ exitCode: 1,
19
+ });
20
+ const gateway = new WorktreeSizeProbeCliGateway(runner);
21
+ const result = await gateway.probe('/missing/path');
22
+ expect(result).toBeNull();
23
+ });
24
+ it('returns null when stdout is not parseable', async () => {
25
+ const runner = async () => ({
26
+ stdout: 'garbage output\n',
27
+ stderr: '',
28
+ exitCode: 0,
29
+ });
30
+ const gateway = new WorktreeSizeProbeCliGateway(runner);
31
+ const result = await gateway.probe('/tmp/x');
32
+ expect(result).toBeNull();
33
+ });
34
+ it('returns null when the runner throws', async () => {
35
+ const runner = async () => {
36
+ throw new Error('process spawn failed');
37
+ };
38
+ const gateway = new WorktreeSizeProbeCliGateway(runner);
39
+ const result = await gateway.probe('/tmp/x');
40
+ expect(result).toBeNull();
41
+ });
42
+ it('invokes the runner with du -sb <path>', async () => {
43
+ const calls = [];
44
+ const runner = async (command) => {
45
+ calls.push({ args: command.args, cwd: command.cwd });
46
+ return { stdout: '42\t/p\n', stderr: '', exitCode: 0 };
47
+ };
48
+ const gateway = new WorktreeSizeProbeCliGateway(runner);
49
+ await gateway.probe('/tmp/worktrees/a');
50
+ expect(calls).toHaveLength(1);
51
+ expect(calls[0]?.args).toEqual(['-sb', '/tmp/worktrees/a']);
52
+ });
53
+ });
54
+ //# sourceMappingURL=worktreeSizeProbe.cli.gateway.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeSizeProbe.cli.gateway.test.js","sourceRoot":"","sources":["../../../../../../../src/tests/units/modules/worktree-management/interface-adapters/gateways/worktreeSizeProbe.cli.gateway.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worktreePanel.presenter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreePanel.presenter.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/tests/units/modules/worktree-management/interface-adapters/presenters/worktreePanel.presenter.test.ts"],"names":[],"mappings":""}