reviewflow 3.41.0 → 3.42.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 (93) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/dashboard/index.html +32 -226
  3. package/dist/dashboard/modules/i18n.d.ts.map +1 -1
  4. package/dist/dashboard/modules/i18n.js +16 -2
  5. package/dist/dashboard/modules/i18n.js.map +1 -1
  6. package/dist/dashboard/modules/statsCharts.d.ts.map +1 -1
  7. package/dist/dashboard/modules/statsCharts.js +43 -28
  8. package/dist/dashboard/modules/statsCharts.js.map +1 -1
  9. package/dist/dashboard/modules/statsPage.d.ts +15 -0
  10. package/dist/dashboard/modules/statsPage.d.ts.map +1 -0
  11. package/dist/dashboard/modules/statsPage.js +250 -0
  12. package/dist/dashboard/modules/statsPage.js.map +1 -0
  13. package/dist/dashboard/stats.html +371 -0
  14. package/dist/dashboard/styles.css +23 -8
  15. package/dist/main/routes.d.ts.map +1 -1
  16. package/dist/main/routes.js +14 -4
  17. package/dist/main/routes.js.map +1 -1
  18. package/dist/modules/statistics-insights/entities/stats/keyInsights.d.ts +4 -3
  19. package/dist/modules/statistics-insights/entities/stats/keyInsights.d.ts.map +1 -1
  20. package/dist/modules/statistics-insights/entities/stats/keyInsights.js +27 -7
  21. package/dist/modules/statistics-insights/entities/stats/keyInsights.js.map +1 -1
  22. package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.d.ts +7 -0
  23. package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.d.ts.map +1 -1
  24. package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.js +24 -1
  25. package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.js.map +1 -1
  26. package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.d.ts +9 -1
  27. package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.d.ts.map +1 -1
  28. package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.js +14 -25
  29. package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.js.map +1 -1
  30. package/dist/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.d.ts +33 -0
  31. package/dist/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.d.ts.map +1 -0
  32. package/dist/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.js +42 -0
  33. package/dist/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.js.map +1 -0
  34. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.d.ts.map +1 -1
  35. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js +2 -1
  36. package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js.map +1 -1
  37. package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.d.ts +1 -0
  38. package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.d.ts.map +1 -1
  39. package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.js +17 -1
  40. package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.js.map +1 -1
  41. package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js +3 -0
  42. package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js.map +1 -1
  43. package/dist/tests/acceptance/180-quality-threshold-block-approval.acceptance.test.js +7 -0
  44. package/dist/tests/acceptance/180-quality-threshold-block-approval.acceptance.test.js.map +1 -1
  45. package/dist/tests/acceptance/215-mark-any-review-as-merged.acceptance.test.d.ts +12 -0
  46. package/dist/tests/acceptance/215-mark-any-review-as-merged.acceptance.test.d.ts.map +1 -0
  47. package/dist/tests/acceptance/215-mark-any-review-as-merged.acceptance.test.js +158 -0
  48. package/dist/tests/acceptance/215-mark-any-review-as-merged.acceptance.test.js.map +1 -0
  49. package/dist/tests/acceptance/80-split-stats-service.acceptance.test.js +8 -1
  50. package/dist/tests/acceptance/80-split-stats-service.acceptance.test.js.map +1 -1
  51. package/dist/tests/units/dashboard/dashboardLayout.test.js +11 -18
  52. package/dist/tests/units/dashboard/dashboardLayout.test.js.map +1 -1
  53. package/dist/tests/units/dashboard/modules/i18n.test.js +13 -0
  54. package/dist/tests/units/dashboard/modules/i18n.test.js.map +1 -1
  55. package/dist/tests/units/dashboard/modules/statsCharts.test.js +37 -0
  56. package/dist/tests/units/dashboard/modules/statsCharts.test.js.map +1 -1
  57. package/dist/tests/units/dashboard/modules/statsPage.test.d.ts +2 -0
  58. package/dist/tests/units/dashboard/modules/statsPage.test.d.ts.map +1 -0
  59. package/dist/tests/units/dashboard/modules/statsPage.test.js +169 -0
  60. package/dist/tests/units/dashboard/modules/statsPage.test.js.map +1 -0
  61. package/dist/tests/units/interface-adapters/presenters/statsSummary.presenter.test.js +61 -1
  62. package/dist/tests/units/interface-adapters/presenters/statsSummary.presenter.test.js.map +1 -1
  63. package/dist/tests/units/modules/statistics-insights/entities/stats/keyInsights.test.js +49 -0
  64. package/dist/tests/units/modules/statistics-insights/entities/stats/keyInsights.test.js.map +1 -1
  65. package/dist/tests/units/modules/statistics-insights/entities/stats/reviewOutput.parser.test.d.ts.map +1 -0
  66. package/dist/tests/units/{entities → modules/statistics-insights/entities}/stats/reviewOutput.parser.test.js +1 -1
  67. package/dist/tests/units/modules/statistics-insights/entities/stats/reviewOutput.parser.test.js.map +1 -0
  68. package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/keyInsights.presenter.test.js +24 -0
  69. package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/keyInsights.presenter.test.js.map +1 -1
  70. package/dist/tests/units/modules/statistics-insights/usecases/stats/addReviewStats.counter.test.d.ts +2 -0
  71. package/dist/tests/units/modules/statistics-insights/usecases/stats/addReviewStats.counter.test.d.ts.map +1 -0
  72. package/dist/tests/units/modules/statistics-insights/usecases/stats/addReviewStats.counter.test.js +95 -0
  73. package/dist/tests/units/modules/statistics-insights/usecases/stats/addReviewStats.counter.test.js.map +1 -0
  74. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.markAsMerged.routes.test.d.ts +2 -0
  75. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.markAsMerged.routes.test.d.ts.map +1 -0
  76. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.markAsMerged.routes.test.js +108 -0
  77. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.markAsMerged.routes.test.js.map +1 -0
  78. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.test.js +11 -5
  79. package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.test.js.map +1 -1
  80. package/dist/tests/units/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.test.d.ts +2 -0
  81. package/dist/tests/units/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.test.d.ts.map +1 -0
  82. package/dist/tests/units/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.test.js +138 -0
  83. package/dist/tests/units/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.test.js.map +1 -0
  84. package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.js +71 -34
  85. package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.js.map +1 -1
  86. package/package.json +1 -1
  87. package/dist/tests/acceptance/182-mark-pending-fix-as-merged.acceptance.test.d.ts +0 -19
  88. package/dist/tests/acceptance/182-mark-pending-fix-as-merged.acceptance.test.d.ts.map +0 -1
  89. package/dist/tests/acceptance/182-mark-pending-fix-as-merged.acceptance.test.js +0 -157
  90. package/dist/tests/acceptance/182-mark-pending-fix-as-merged.acceptance.test.js.map +0 -1
  91. package/dist/tests/units/entities/stats/reviewOutput.parser.test.d.ts.map +0 -1
  92. package/dist/tests/units/entities/stats/reviewOutput.parser.test.js.map +0 -1
  93. /package/dist/tests/units/{entities → modules/statistics-insights/entities}/stats/reviewOutput.parser.test.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"keyInsights.d.ts","sourceRoot":"","sources":["../../../../../src/modules/statistics-insights/entities/stats/keyInsights.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,8DAA8D,CAAC;AAGtE,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,kBAAkB,GAAG,YAAY,CAAC;AAS/E;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,aAAa,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AA2FD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,GAAG,UAAU,EAAE,CAa9E"}
1
+ {"version":3,"file":"keyInsights.d.ts","sourceRoot":"","sources":["../../../../../src/modules/statistics-insights/entities/stats/keyInsights.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,8DAA8D,CAAC;AAGtE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,kBAAkB,GAAG,YAAY,CAAC;AAW9F;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,aAAa,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgHD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,GAAG,UAAU,EAAE,CAgB9E"}
@@ -6,6 +6,8 @@ const TIME_MIN_RELATIVE_CHANGE = 0.1;
6
6
  const VOLUME_MIN_RELATIVE_CHANGE = 0.1;
7
7
  const VOLUME_PERIOD_DAYS = 30;
8
8
  const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
9
+ const SUBSTANTIAL_AVERAGE_LINES = 200;
10
+ const PINNED_STRENGTH = Number.POSITIVE_INFINITY;
9
11
  function formatSignedPercent(relativeChange, sign) {
10
12
  const prefix = sign === 'up' ? '+' : '-';
11
13
  return `${prefix}${Math.round(relativeChange * 100)}%`;
@@ -79,23 +81,41 @@ function reviewTimeInsight(reviews) {
79
81
  strength: relativeChange,
80
82
  };
81
83
  }
84
+ function codeVolumeInsight(stats) {
85
+ const totalLines = stats.totalAdditions + stats.totalDeletions;
86
+ const totalCommits = stats.totalCommits ?? 0;
87
+ if (totalLines === 0 && totalCommits === 0)
88
+ return null;
89
+ const averageLines = Math.round((stats.averageAdditions ?? 0) + (stats.averageDeletions ?? 0));
90
+ const averageCommits = stats.averageCommits ?? 0;
91
+ const substantial = averageLines >= SUBSTANTIAL_AVERAGE_LINES;
92
+ return {
93
+ key: 'codeVolume',
94
+ title: substantial ? 'Substantial code volume' : 'Lean changesets',
95
+ body: `${totalLines.toLocaleString('en-US')} lines across ${totalCommits.toLocaleString('en-US')} commits (avg ${averageLines.toLocaleString('en-US')} lines, ${averageCommits.toFixed(1)} commits/MR)`,
96
+ strength: PINNED_STRENGTH,
97
+ };
98
+ }
82
99
  /**
83
100
  * Derive the ranked key insights from already-recorded project stats. Pure and
84
101
  * deterministic — `now` is injected so the helper never reads the wall clock.
85
- * Candidates that fail their data/threshold gate are omitted. The result is
86
- * sorted by `strength` descending and is empty when no candidate qualifies.
102
+ * Candidates that fail their data/threshold gate are omitted. Trend candidates
103
+ * are sorted by `strength` descending; the code-volume assessment is always
104
+ * pinned first when diff data exists. Empty when no candidate qualifies.
87
105
  */
88
106
  export function deriveKeyInsights(stats, now) {
89
- const insights = [];
107
+ const trends = [];
90
108
  const reviewVolume = reviewVolumeInsight(stats.reviews, now);
91
109
  if (reviewVolume !== null)
92
- insights.push(reviewVolume);
110
+ trends.push(reviewVolume);
93
111
  const category = dominantCategoryInsight(stats.categoryBreakdown ?? null);
94
112
  if (category !== null)
95
- insights.push(category);
113
+ trends.push(category);
96
114
  const reviewTime = reviewTimeInsight(stats.reviews);
97
115
  if (reviewTime !== null)
98
- insights.push(reviewTime);
99
- return insights.toSorted((left, right) => right.strength - left.strength);
116
+ trends.push(reviewTime);
117
+ const ranked = trends.toSorted((left, right) => right.strength - left.strength);
118
+ const codeVolume = codeVolumeInsight(stats);
119
+ return codeVolume !== null ? [codeVolume, ...ranked] : ranked;
100
120
  }
101
121
  //# sourceMappingURL=keyInsights.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyInsights.js","sourceRoot":"","sources":["../../../../../src/modules/statistics-insights/entities/stats/keyInsights.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyInsights.js","sourceRoot":"","sources":["../../../../../src/modules/statistics-insights/entities/stats/keyInsights.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
1
  import type { ProjectStats } from '../../../../modules/statistics-insights/entities/stats/projectStats.js';
2
2
  import type { Presenter } from '../../../../shared/foundation/presenter.base.js';
3
3
  type Trend = 'up' | 'down' | 'stable';
4
+ export interface StatsPeriod {
5
+ from: string;
6
+ to: string;
7
+ days: number;
8
+ }
4
9
  export interface StatsSummaryViewModel {
5
10
  totalReviews: number;
6
11
  totalTime: string;
@@ -8,6 +13,7 @@ export interface StatsSummaryViewModel {
8
13
  averageScore: string;
9
14
  totalBlocking: number;
10
15
  totalWarnings: number;
16
+ bugsDetected: number;
11
17
  totalAdditions: number;
12
18
  totalDeletions: number;
13
19
  totalCommits: number;
@@ -15,6 +21,7 @@ export interface StatsSummaryViewModel {
15
21
  averageDeletions: string;
16
22
  averageCommits: string;
17
23
  totalLinesReviewed: number;
24
+ period: StatsPeriod | null;
18
25
  trend: {
19
26
  score: Trend;
20
27
  blocking: Trend;
@@ -1 +1 @@
1
- {"version":3,"file":"statsSummary.presenter.d.ts","sourceRoot":"","sources":["../../../../../src/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,8DAA8D,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAEvE,KAAK,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEtC,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAA;KAAE,CAAC;CAC1C;AAkCD,qBAAa,qBAAsB,YAAW,SAAS,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC1F,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,qBAAqB;CAkBpD"}
1
+ {"version":3,"file":"statsSummary.presenter.d.ts","sourceRoot":"","sources":["../../../../../src/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,8DAA8D,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAEvE,KAAK,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;AAItC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAA;KAAE,CAAC;CAC1C;AAsDD,qBAAa,qBAAsB,YAAW,SAAS,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAC1F,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,qBAAqB;CAqBpD"}
@@ -1,4 +1,24 @@
1
1
  import { formatReviewDuration } from '../../../../modules/statistics-insights/entities/stats/reviewDuration.format.js';
2
+ const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
3
+ function formatPeriodDate(timestamp) {
4
+ return new Date(timestamp).toLocaleDateString('en-GB', {
5
+ day: 'numeric',
6
+ month: 'short',
7
+ year: 'numeric',
8
+ });
9
+ }
10
+ function periodOf(reviews) {
11
+ if (reviews.length === 0)
12
+ return null;
13
+ const times = reviews.map((review) => new Date(review.timestamp).getTime());
14
+ const from = Math.min(...times);
15
+ const to = Math.max(...times);
16
+ return {
17
+ from: formatPeriodDate(from),
18
+ to: formatPeriodDate(to),
19
+ days: Math.round((to - from) / MILLISECONDS_PER_DAY),
20
+ };
21
+ }
2
22
  function averageScoreOf(reviews) {
3
23
  const scored = reviews.filter((review) => review.score !== null);
4
24
  if (scored.length === 0)
@@ -33,13 +53,15 @@ function computeTrend(stats) {
33
53
  }
34
54
  export class StatsSummaryPresenter {
35
55
  present(stats) {
56
+ const averageScore = averageScoreOf(stats.reviews);
36
57
  return {
37
58
  totalReviews: stats.totalReviews,
38
59
  totalTime: formatReviewDuration(stats.totalDuration),
39
60
  averageTime: formatReviewDuration(stats.averageDuration),
40
- averageScore: stats.averageScore !== null ? stats.averageScore.toFixed(1) : '-',
61
+ averageScore: averageScore !== null ? averageScore.toFixed(1) : '-',
41
62
  totalBlocking: stats.totalBlocking,
42
63
  totalWarnings: stats.totalWarnings,
64
+ bugsDetected: stats.totalBlocking + stats.totalWarnings,
43
65
  totalAdditions: stats.totalAdditions,
44
66
  totalDeletions: stats.totalDeletions,
45
67
  totalCommits: stats.totalCommits ?? 0,
@@ -47,6 +69,7 @@ export class StatsSummaryPresenter {
47
69
  averageDeletions: stats.averageDeletions !== null ? stats.averageDeletions.toFixed(1) : '-',
48
70
  averageCommits: stats.averageCommits != null ? stats.averageCommits.toFixed(1) : '-',
49
71
  totalLinesReviewed: stats.totalAdditions + stats.totalDeletions,
72
+ period: periodOf(stats.reviews),
50
73
  trend: computeTrend(stats),
51
74
  };
52
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"statsSummary.presenter.js","sourceRoot":"","sources":["../../../../../src/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uEAAuE,CAAC;AAsB7G,SAAS,cAAc,CAAC,OAAsB;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;AACtF,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAsB;IAC/C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;AACpF,CAAC;AAED,SAAS,YAAY,CAAC,KAAmB;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAE7F,IAAI,KAAK,GAAU,QAAQ,CAAC;IAC5B,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC3C,IAAI,SAAS,GAAG,OAAO,GAAG,GAAG;YAAE,KAAK,GAAG,IAAI,CAAC;aACvC,IAAI,SAAS,GAAG,OAAO,GAAG,GAAG;YAAE,KAAK,GAAG,MAAM,CAAC;IACrD,CAAC;IAED,IAAI,QAAQ,GAAU,QAAQ,CAAC;IAC/B,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,cAAc,GAAG,YAAY,GAAG,GAAG;QAAE,QAAQ,GAAG,IAAI,CAAC;SACpD,IAAI,cAAc,GAAG,YAAY,GAAG,GAAG;QAAE,QAAQ,GAAG,MAAM,CAAC;IAEhE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,OAAO,qBAAqB;IAChC,OAAO,CAAC,KAAmB;QACzB,OAAO;YACL,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,aAAa,CAAC;YACpD,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC,eAAe,CAAC;YACxD,YAAY,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;YAC/E,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;YACrC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;YAC3F,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;YAC3F,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;YACpF,kBAAkB,EAAE,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;YAC/D,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;SAC3B,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"statsSummary.presenter.js","sourceRoot":"","sources":["../../../../../src/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,18 @@
1
1
  import type { FastifyPluginAsync } from 'fastify';
2
+ import type { Logger } from 'pino';
3
+ import type { ReviewContextGateway } from '../../../../../modules/review-execution/entities/reviewContext/reviewContext.gateway.js';
2
4
  import type { StatsGateway } from '../../../../../modules/statistics-insights/entities/stats/stats.gateway.js';
3
- import type { ReviewRequestTrackingGateway } from '../../../../../modules/tracking/entities/tracking/reviewRequestTracking.gateway.js';
5
+ import type { Platform, ReviewRequestTrackingGateway } from '../../../../../modules/tracking/entities/tracking/reviewRequestTracking.gateway.js';
6
+ import type { RemoveWorktreeAction } from '../../../../../modules/worktree-management/entities/worktree/worktree.schema.js';
4
7
  interface MrTrackingRoutesOptions {
5
8
  reviewRequestTrackingGateway: ReviewRequestTrackingGateway;
6
9
  getQualityThreshold?: (projectPath: string) => number | null;
7
10
  statsGateway?: StatsGateway;
11
+ reviewContextGateway: ReviewContextGateway;
12
+ cancelJob: (jobId: string) => boolean;
13
+ buildJobId: (platform: Platform, projectPath: string, mrNumber: number) => string;
14
+ removeWorktree: RemoveWorktreeAction;
15
+ logger: Logger;
8
16
  }
9
17
  export declare const mrTrackingRoutes: FastifyPluginAsync<MrTrackingRoutesOptions>;
10
18
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"mrTracking.routes.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+DAA+D,CAAC;AAElG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uEAAuE,CAAC;AAI1H,UAAU,uBAAuB;IAC/B,4BAA4B,EAAE,4BAA4B,CAAC;IAC3D,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAiBD,eAAO,MAAM,gBAAgB,EAAE,kBAAkB,CAAC,uBAAuB,CAgIxE,CAAC"}
1
+ {"version":3,"file":"mrTracking.routes.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4EAA4E,CAAC;AACvH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+DAA+D,CAAC;AAElG,OAAO,KAAK,EACV,QAAQ,EACR,4BAA4B,EAC7B,MAAM,uEAAuE,CAAC;AAI/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oEAAoE,CAAC;AAE/G,UAAU,uBAAuB;IAC/B,4BAA4B,EAAE,4BAA4B,CAAC;IAC3D,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAClF,cAAc,EAAE,oBAAoB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB;AAiBD,eAAO,MAAM,gBAAgB,EAAE,kBAAkB,CAAC,uBAAuB,CA6HxE,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { logInfo, logError } from '../../../../../frameworks/logging/logBuffer.js';
2
2
  import { evaluateQualityGate } from '../../../../../modules/tracking/entities/qualityGate/qualityGate.js';
3
3
  import { MrDiffStatsPresenter } from '../../../../../modules/tracking/interface-adapters/presenters/mrDiffStats.presenter.js';
4
+ import { MarkReviewAsMergedUseCase } from '../../../../../modules/tracking/usecases/tracking/markReviewAsMerged.usecase.js';
4
5
  import { TransitionStateUseCase } from '../../../../../modules/tracking/usecases/tracking/transitionState.usecase.js';
5
6
  function validateProjectPath(path) {
6
7
  if (!path) {
@@ -13,7 +14,7 @@ function validateProjectPath(path) {
13
14
  return { valid: true, path: trimmed };
14
15
  }
15
16
  export const mrTrackingRoutes = async (fastify, opts) => {
16
- const { reviewRequestTrackingGateway, getQualityThreshold, statsGateway } = opts;
17
+ const { reviewRequestTrackingGateway, getQualityThreshold, statsGateway, reviewContextGateway, cancelJob, buildJobId, removeWorktree, logger, } = opts;
17
18
  const mrDiffStatsPresenter = new MrDiffStatsPresenter();
18
19
  fastify.get('/api/mr-tracking', async (request, reply) => {
19
20
  const validation = validateProjectPath(request.query.path);
@@ -24,11 +25,13 @@ export const mrTrackingRoutes = async (fastify, opts) => {
24
25
  try {
25
26
  const pendingFix = reviewRequestTrackingGateway.getByState(validation.path, 'pending-fix');
26
27
  const pendingApproval = reviewRequestTrackingGateway.getByState(validation.path, 'pending-approval');
28
+ const merged = reviewRequestTrackingGateway.getByState(validation.path, 'merged');
27
29
  const stats = statsGateway?.loadProjectStats(validation.path) ?? null;
28
30
  return {
29
31
  success: true,
30
32
  pendingFix: mrDiffStatsPresenter.present(pendingFix, stats),
31
33
  pendingApproval: mrDiffStatsPresenter.present(pendingApproval, stats),
34
+ merged: mrDiffStatsPresenter.present(merged, stats),
32
35
  };
33
36
  }
34
37
  catch (error) {
@@ -82,35 +85,21 @@ export const mrTrackingRoutes = async (fastify, opts) => {
82
85
  reply.code(400);
83
86
  return { success: false, error: validation.error };
84
87
  }
85
- const transitionState = new TransitionStateUseCase(reviewRequestTrackingGateway);
86
- const result = transitionState.execute({
87
- projectPath: validation.path,
88
- mrId,
89
- targetState: 'merged',
90
- requireCurrentState: 'pending-fix',
88
+ const markReviewAsMerged = new MarkReviewAsMergedUseCase({
89
+ trackingGateway: reviewRequestTrackingGateway,
90
+ reviewContextGateway,
91
+ cancelJob,
92
+ buildJobId,
93
+ removeWorktree,
94
+ logger,
91
95
  });
96
+ const result = await markReviewAsMerged.execute({ projectPath: validation.path, mrId });
92
97
  if (result.ok) {
93
98
  logInfo('MR marquée comme mergée', { mrId });
94
99
  return { success: true, mrId, message: 'MR marquée comme mergée' };
95
100
  }
96
- switch (result.reason) {
97
- case 'not-found':
98
- reply.code(404);
99
- return { success: false, error: 'MR non trouvée' };
100
- case 'invalid-current-state':
101
- reply.code(409);
102
- return {
103
- success: false,
104
- error: 'Seules les MR en correction peuvent être marquées comme mergées',
105
- };
106
- case 'quality-gate':
107
- reply.code(409);
108
- return { success: false, error: result.message };
109
- default: {
110
- const _exhaustive = result;
111
- throw new Error(`Unhandled transition rejection: ${JSON.stringify(_exhaustive)}`);
112
- }
113
- }
101
+ reply.code(404);
102
+ return { success: false, error: 'MR non trouvée' };
114
103
  });
115
104
  };
116
105
  //# sourceMappingURL=mrTracking.routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mrTracking.routes.js","sourceRoot":"","sources":["../../../../../../src/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AAE7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,2EAA2E,CAAC;AACjH,OAAO,EAAE,sBAAsB,EAAE,MAAM,iEAAiE,CAAC;AAQzG,SAAS,mBAAmB,CAC1B,IAAwB;IAExB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgD,KAAK,EAChF,OAAO,EACP,IAAI,EACJ,EAAE;IACF,MAAM,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACjF,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAExD,OAAO,CAAC,GAAG,CAAqC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC3F,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE3D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,4BAA4B,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YAC3F,MAAM,eAAe,GAAG,4BAA4B,CAAC,UAAU,CAC7D,UAAU,CAAC,IAAI,EACf,kBAAkB,CACnB,CAAC;YACF,MAAM,KAAK,GAAG,YAAY,EAAE,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YACtE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;gBAC3D,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;aACtE,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,QAAQ,CAAC,4BAA4B,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACzF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CACV,0BAA0B,EAC1B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;QAE3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAClD,CAAC;QAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,sBAAsB,CAAC,4BAA4B,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QACjE,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC;YACrC,WAAW,EAAE,UAAU,CAAC,IAAI;YAC5B,IAAI;YACJ,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CACnB,mBAAmB,CAAC;gBAClB,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,cAAc,EAAE,EAAE,CAAC,WAAW;gBAC9B,SAAS;aACV,CAAC;SACL,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,IAAI,CACV,iCAAiC,EACjC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;QAE3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAClD,CAAC;QAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,sBAAsB,CAAC,4BAA4B,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC;YACrC,WAAW,EAAE,UAAU,CAAC,IAAI;YAC5B,IAAI;YACJ,WAAW,EAAE,QAAQ;YACrB,mBAAmB,EAAE,aAAa;SACnC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;QACrE,CAAC;QAED,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,WAAW;gBACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;YACrD,KAAK,uBAAuB;gBAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,iEAAiE;iBACzE,CAAC;YACJ,KAAK,cAAc;gBACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACnD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,WAAW,GAAU,MAAM,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"mrTracking.routes.js","sourceRoot":"","sources":["../../../../../../src/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Logger } from 'pino';
2
+ import type { ReviewContextGateway } from '../../../../modules/review-execution/entities/reviewContext/reviewContext.gateway.js';
3
+ import type { Platform, ReviewRequestTrackingGateway } from '../../../../modules/tracking/entities/tracking/reviewRequestTracking.gateway.js';
4
+ import type { RemoveWorktreeAction } from '../../../../modules/worktree-management/entities/worktree/worktree.schema.js';
5
+ import type { UseCase } from '../../../../shared/foundation/usecase.base.js';
6
+ export interface MarkReviewAsMergedInput {
7
+ projectPath: string;
8
+ mrId: string;
9
+ }
10
+ export type MarkReviewAsMergedResult = {
11
+ ok: true;
12
+ jobCancelled: boolean;
13
+ contextReleased: boolean;
14
+ recordRetained: true;
15
+ } | {
16
+ ok: false;
17
+ reason: 'not-found';
18
+ };
19
+ export interface MarkReviewAsMergedDependencies {
20
+ trackingGateway: Pick<ReviewRequestTrackingGateway, 'getById' | 'update'>;
21
+ reviewContextGateway: Pick<ReviewContextGateway, 'delete'>;
22
+ cancelJob: (jobId: string) => boolean;
23
+ buildJobId: (platform: Platform, projectPath: string, mrNumber: number) => string;
24
+ removeWorktree: RemoveWorktreeAction;
25
+ logger: Logger;
26
+ }
27
+ export declare class MarkReviewAsMergedUseCase implements UseCase<MarkReviewAsMergedInput, Promise<MarkReviewAsMergedResult>> {
28
+ private readonly deps;
29
+ constructor(deps: MarkReviewAsMergedDependencies);
30
+ execute(input: MarkReviewAsMergedInput): Promise<MarkReviewAsMergedResult>;
31
+ private removeWorktreeBestEffort;
32
+ }
33
+ //# sourceMappingURL=markReviewAsMerged.usecase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markReviewAsMerged.usecase.d.ts","sourceRoot":"","sources":["../../../../../src/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4EAA4E,CAAC;AACvH,OAAO,KAAK,EACV,QAAQ,EACR,4BAA4B,EAC7B,MAAM,uEAAuE,CAAC;AAE/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oEAAoE,CAAC;AAC/G,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,IAAI,CAAA;CAAE,GACnF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,8BAA8B;IAC7C,eAAe,EAAE,IAAI,CAAC,4BAA4B,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC1E,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC3D,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAClF,cAAc,EAAE,oBAAoB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,yBAA0B,YAAW,OAAO,CACvD,uBAAuB,EACvB,OAAO,CAAC,wBAAwB,CAAC,CAClC;IACa,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,8BAA8B;IAE3D,OAAO,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;YAuBlE,wBAAwB;CAuBvC"}
@@ -0,0 +1,42 @@
1
+ export class MarkReviewAsMergedUseCase {
2
+ deps;
3
+ constructor(deps) {
4
+ this.deps = deps;
5
+ }
6
+ async execute(input) {
7
+ const { projectPath, mrId } = input;
8
+ const mr = this.deps.trackingGateway.getById(projectPath, mrId);
9
+ if (!mr)
10
+ return { ok: false, reason: 'not-found' };
11
+ if (mr.state === 'merged') {
12
+ return { ok: true, jobCancelled: false, contextReleased: false, recordRetained: true };
13
+ }
14
+ const jobCancelled = this.deps.cancelJob(this.deps.buildJobId(mr.platform, projectPath, mr.mrNumber));
15
+ const contextReleased = this.deps.reviewContextGateway.delete(projectPath, mrId).deleted;
16
+ await this.removeWorktreeBestEffort(mr, projectPath);
17
+ this.deps.trackingGateway.update(projectPath, mrId, {
18
+ state: 'merged',
19
+ mergedAt: new Date().toISOString(),
20
+ });
21
+ return { ok: true, jobCancelled, contextReleased, recordRetained: true };
22
+ }
23
+ async removeWorktreeBestEffort(mr, projectPath) {
24
+ try {
25
+ const removal = await this.deps.removeWorktree({
26
+ identity: { platform: mr.platform, projectPath, mrNumber: mr.mrNumber },
27
+ sourceCheckoutPath: projectPath,
28
+ });
29
+ if (removal.status === 'failed') {
30
+ this.deps.logger.warn({ projectPath, mrNumber: mr.mrNumber, warning: removal.warning }, 'removeWorktree failed on mark-as-merged');
31
+ }
32
+ }
33
+ catch (error) {
34
+ this.deps.logger.warn({
35
+ projectPath,
36
+ mrNumber: mr.mrNumber,
37
+ error: error instanceof Error ? error.message : String(error),
38
+ }, 'removeWorktree threw on mark-as-merged');
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=markReviewAsMerged.usecase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markReviewAsMerged.usecase.js","sourceRoot":"","sources":["../../../../../src/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.ts"],"names":[],"mappings":"AA6BA,MAAM,OAAO,yBAAyB;IAIP;IAA7B,YAA6B,IAAoC;QAApC,SAAI,GAAJ,IAAI,CAAgC;IAAG,CAAC;IAErE,KAAK,CAAC,OAAO,CAAC,KAA8B;QAC1C,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAEnD,IAAI,EAAE,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QACzF,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CACtC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,CAC5D,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC;QACzF,MAAM,IAAI,CAAC,wBAAwB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAErD,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE;YAClD,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC,CAAC;QAEH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAC3E,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,EAAa,EAAE,WAAmB;QACvE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;gBAC7C,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;gBACvE,kBAAkB,EAAE,WAAW;aAChC,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAChE,yCAAyC,CAC1C,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB;gBACE,WAAW;gBACX,QAAQ,EAAE,EAAE,CAAC,QAAQ;gBACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,EACD,wCAAwC,CACzC,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -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":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAElH,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EAChB,MAAM,qEAAqE,CAAC;AAM7E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EACjB,MAAM,oEAAoE,CAAC;AAM5E,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"}
1
+ {"version":3,"file":"worktree.fileSystem.gateway.d.ts","sourceRoot":"","sources":["../../../../../src/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAElH,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EAChB,MAAM,qEAAqE,CAAC;AAM7E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EACjB,MAAM,oEAAoE,CAAC;AAM5E,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;IAkB7D,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"}
@@ -1,4 +1,4 @@
1
- import { existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';
1
+ import { existsSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { createWorktreePath, deriveWorktreePath, parseWorktreeDirectoryName, } from '../../../../modules/worktree-management/entities/worktree/worktree.js';
4
4
  import { writeWorktreeSettings } from '../../../../modules/worktree-management/services/worktreeSettingsWriter.js';
@@ -22,6 +22,7 @@ export class WorktreeFileSystemGateway {
22
22
  }, {
23
23
  executor: this.executor,
24
24
  worktreeExists: async (path) => existsSync(path),
25
+ removeDirectory: async (path) => rmSync(path, { recursive: true, force: true }),
25
26
  writeWorktreeSettings,
26
27
  });
27
28
  }
@@ -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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"}
@@ -13,6 +13,7 @@ export interface WorktreeSettingsWriteResult {
13
13
  export interface EnsureWorktreeDependencies {
14
14
  executor: GitCommandExecutor;
15
15
  worktreeExists: (path: WorktreePath) => Promise<boolean>;
16
+ removeDirectory: (path: WorktreePath) => Promise<void>;
16
17
  writeWorktreeSettings: (path: WorktreePath) => Promise<WorktreeSettingsWriteResult>;
17
18
  }
18
19
  export declare function ensureWorktree(input: EnsureWorktreeInput, deps: EnsureWorktreeDependencies): Promise<EnsureResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"ensureWorktree.usecase.d.ts","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/ensureWorktree.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,yEAAyE,CAAC;AAKjF,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACb,MAAM,oEAAoE,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,QAAQ,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,cAAc,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,qBAAqB,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC;CACrF;AAMD,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,YAAY,CAAC,CAyDvB"}
1
+ {"version":3,"file":"ensureWorktree.usecase.d.ts","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/ensureWorktree.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,yEAAyE,CAAC;AAKjF,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACb,MAAM,oEAAoE,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,QAAQ,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,cAAc,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,eAAe,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,qBAAqB,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC;CACrF;AAkBD,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,YAAY,CAAC,CAkEvB"}
@@ -2,6 +2,14 @@ import { deriveFetchRef, deriveWorktreePath, } from '../../../modules/worktree-m
2
2
  function isFetchFailure(result) {
3
3
  return result.exitCode !== 0;
4
4
  }
5
+ async function isHealthyWorktree(executor, targetPath) {
6
+ const result = await executor.execute({
7
+ kind: 'rev-parse-toplevel',
8
+ args: ['rev-parse', '--show-toplevel'],
9
+ cwd: targetPath,
10
+ });
11
+ return result.exitCode === 0;
12
+ }
5
13
  export async function ensureWorktree(input, deps) {
6
14
  const targetPath = deriveWorktreePath(input.identity);
7
15
  const fetchRef = deriveFetchRef(input.source, input.sourceBranch, input.identity.mrNumber);
@@ -11,7 +19,7 @@ export async function ensureWorktree(input, deps) {
11
19
  cwd: input.sourceCheckoutPath,
12
20
  });
13
21
  const alreadyExists = await deps.worktreeExists(targetPath);
14
- if (alreadyExists) {
22
+ if (alreadyExists && (await isHealthyWorktree(deps.executor, targetPath))) {
15
23
  const fetchInsideResult = await deps.executor.execute({
16
24
  kind: 'fetch',
17
25
  args: ['fetch', fetchRef.remote, fetchRef.refspec],
@@ -30,6 +38,14 @@ export async function ensureWorktree(input, deps) {
30
38
  }
31
39
  return { status: 'reused', path: targetPath };
32
40
  }
41
+ if (alreadyExists) {
42
+ await deps.removeDirectory(targetPath);
43
+ await deps.executor.execute({
44
+ kind: 'worktree-prune',
45
+ args: ['worktree', 'prune'],
46
+ cwd: input.sourceCheckoutPath,
47
+ });
48
+ }
33
49
  const fetchResult = await deps.executor.execute({
34
50
  kind: 'fetch',
35
51
  args: ['fetch', fetchRef.remote, fetchRef.refspec],
@@ -1 +1 @@
1
- {"version":3,"file":"ensureWorktree.usecase.js","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/ensureWorktree.usecase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensureWorktree.usecase.js","sourceRoot":"","sources":["../../../../src/modules/worktree-management/usecases/ensureWorktree.usecase.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,7 @@ describe('Acceptance — SPEC-170: Pre-built Worktree Lifecycle', () => {
44
44
  }, {
45
45
  executor,
46
46
  worktreeExists: async () => false,
47
+ removeDirectory: async () => { },
47
48
  writeWorktreeSettings: async (path) => {
48
49
  writeSettingsCalls.push(path);
49
50
  return { status: 'ok' };
@@ -80,6 +81,7 @@ describe('Acceptance — SPEC-170: Pre-built Worktree Lifecycle', () => {
80
81
  }, {
81
82
  executor,
82
83
  worktreeExists: async () => true,
84
+ removeDirectory: async () => { },
83
85
  writeWorktreeSettings: async (path) => {
84
86
  writeSettingsCalls.push(path);
85
87
  return { status: 'ok' };
@@ -306,6 +308,7 @@ describe('Acceptance — SPEC-170: Pre-built Worktree Lifecycle', () => {
306
308
  }, {
307
309
  executor,
308
310
  worktreeExists: async () => false,
311
+ removeDirectory: async () => { },
309
312
  writeWorktreeSettings: async () => ({ status: 'ok' }),
310
313
  });
311
314
  expect(result.status).toBe('created');