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.
- package/CHANGELOG.md +26 -0
- package/dist/dashboard/index.html +32 -226
- package/dist/dashboard/modules/i18n.d.ts.map +1 -1
- package/dist/dashboard/modules/i18n.js +16 -2
- package/dist/dashboard/modules/i18n.js.map +1 -1
- package/dist/dashboard/modules/statsCharts.d.ts.map +1 -1
- package/dist/dashboard/modules/statsCharts.js +43 -28
- package/dist/dashboard/modules/statsCharts.js.map +1 -1
- package/dist/dashboard/modules/statsPage.d.ts +15 -0
- package/dist/dashboard/modules/statsPage.d.ts.map +1 -0
- package/dist/dashboard/modules/statsPage.js +250 -0
- package/dist/dashboard/modules/statsPage.js.map +1 -0
- package/dist/dashboard/stats.html +371 -0
- package/dist/dashboard/styles.css +23 -8
- package/dist/main/routes.d.ts.map +1 -1
- package/dist/main/routes.js +14 -4
- package/dist/main/routes.js.map +1 -1
- package/dist/modules/statistics-insights/entities/stats/keyInsights.d.ts +4 -3
- package/dist/modules/statistics-insights/entities/stats/keyInsights.d.ts.map +1 -1
- package/dist/modules/statistics-insights/entities/stats/keyInsights.js +27 -7
- package/dist/modules/statistics-insights/entities/stats/keyInsights.js.map +1 -1
- package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.d.ts +7 -0
- package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.d.ts.map +1 -1
- package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.js +24 -1
- package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.js.map +1 -1
- package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.d.ts +9 -1
- package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.d.ts.map +1 -1
- package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.js +14 -25
- package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.js.map +1 -1
- package/dist/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.d.ts +33 -0
- package/dist/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.d.ts.map +1 -0
- package/dist/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.js +42 -0
- package/dist/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.js.map +1 -0
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.d.ts.map +1 -1
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js +2 -1
- package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js.map +1 -1
- package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.d.ts +1 -0
- package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.d.ts.map +1 -1
- package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.js +17 -1
- package/dist/modules/worktree-management/usecases/ensureWorktree.usecase.js.map +1 -1
- package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js +3 -0
- package/dist/tests/acceptance/170-prebuilt-worktree-lifecycle.acceptance.test.js.map +1 -1
- package/dist/tests/acceptance/180-quality-threshold-block-approval.acceptance.test.js +7 -0
- package/dist/tests/acceptance/180-quality-threshold-block-approval.acceptance.test.js.map +1 -1
- package/dist/tests/acceptance/215-mark-any-review-as-merged.acceptance.test.d.ts +12 -0
- package/dist/tests/acceptance/215-mark-any-review-as-merged.acceptance.test.d.ts.map +1 -0
- package/dist/tests/acceptance/215-mark-any-review-as-merged.acceptance.test.js +158 -0
- package/dist/tests/acceptance/215-mark-any-review-as-merged.acceptance.test.js.map +1 -0
- package/dist/tests/acceptance/80-split-stats-service.acceptance.test.js +8 -1
- package/dist/tests/acceptance/80-split-stats-service.acceptance.test.js.map +1 -1
- package/dist/tests/units/dashboard/dashboardLayout.test.js +11 -18
- package/dist/tests/units/dashboard/dashboardLayout.test.js.map +1 -1
- package/dist/tests/units/dashboard/modules/i18n.test.js +13 -0
- package/dist/tests/units/dashboard/modules/i18n.test.js.map +1 -1
- package/dist/tests/units/dashboard/modules/statsCharts.test.js +37 -0
- package/dist/tests/units/dashboard/modules/statsCharts.test.js.map +1 -1
- package/dist/tests/units/dashboard/modules/statsPage.test.d.ts +2 -0
- package/dist/tests/units/dashboard/modules/statsPage.test.d.ts.map +1 -0
- package/dist/tests/units/dashboard/modules/statsPage.test.js +169 -0
- package/dist/tests/units/dashboard/modules/statsPage.test.js.map +1 -0
- package/dist/tests/units/interface-adapters/presenters/statsSummary.presenter.test.js +61 -1
- package/dist/tests/units/interface-adapters/presenters/statsSummary.presenter.test.js.map +1 -1
- package/dist/tests/units/modules/statistics-insights/entities/stats/keyInsights.test.js +49 -0
- package/dist/tests/units/modules/statistics-insights/entities/stats/keyInsights.test.js.map +1 -1
- package/dist/tests/units/modules/statistics-insights/entities/stats/reviewOutput.parser.test.d.ts.map +1 -0
- package/dist/tests/units/{entities → modules/statistics-insights/entities}/stats/reviewOutput.parser.test.js +1 -1
- package/dist/tests/units/modules/statistics-insights/entities/stats/reviewOutput.parser.test.js.map +1 -0
- package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/keyInsights.presenter.test.js +24 -0
- package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/keyInsights.presenter.test.js.map +1 -1
- package/dist/tests/units/modules/statistics-insights/usecases/stats/addReviewStats.counter.test.d.ts +2 -0
- package/dist/tests/units/modules/statistics-insights/usecases/stats/addReviewStats.counter.test.d.ts.map +1 -0
- package/dist/tests/units/modules/statistics-insights/usecases/stats/addReviewStats.counter.test.js +95 -0
- package/dist/tests/units/modules/statistics-insights/usecases/stats/addReviewStats.counter.test.js.map +1 -0
- package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.markAsMerged.routes.test.d.ts +2 -0
- package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.markAsMerged.routes.test.d.ts.map +1 -0
- package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.markAsMerged.routes.test.js +108 -0
- package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.markAsMerged.routes.test.js.map +1 -0
- package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.test.js +11 -5
- package/dist/tests/units/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.test.js.map +1 -1
- package/dist/tests/units/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.test.d.ts +2 -0
- package/dist/tests/units/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.test.js +138 -0
- package/dist/tests/units/modules/tracking/usecases/tracking/markReviewAsMerged.usecase.test.js.map +1 -0
- package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.js +71 -34
- package/dist/tests/units/modules/worktree-management/usecases/ensureWorktree.usecase.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/tests/acceptance/182-mark-pending-fix-as-merged.acceptance.test.d.ts +0 -19
- package/dist/tests/acceptance/182-mark-pending-fix-as-merged.acceptance.test.d.ts.map +0 -1
- package/dist/tests/acceptance/182-mark-pending-fix-as-merged.acceptance.test.js +0 -157
- package/dist/tests/acceptance/182-mark-pending-fix-as-merged.acceptance.test.js.map +0 -1
- package/dist/tests/units/entities/stats/reviewOutput.parser.test.d.ts.map +0 -1
- package/dist/tests/units/entities/stats/reviewOutput.parser.test.js.map +0 -1
- /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;
|
|
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.
|
|
86
|
-
* sorted by `strength` descending
|
|
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
|
|
107
|
+
const trends = [];
|
|
90
108
|
const reviewVolume = reviewVolumeInsight(stats.reviews, now);
|
|
91
109
|
if (reviewVolume !== null)
|
|
92
|
-
|
|
110
|
+
trends.push(reviewVolume);
|
|
93
111
|
const category = dominantCategoryInsight(stats.categoryBreakdown ?? null);
|
|
94
112
|
if (category !== null)
|
|
95
|
-
|
|
113
|
+
trends.push(category);
|
|
96
114
|
const reviewTime = reviewTimeInsight(stats.reviews);
|
|
97
115
|
if (reviewTime !== null)
|
|
98
|
-
|
|
99
|
-
|
|
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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"}
|
package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.js
CHANGED
|
@@ -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:
|
|
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
|
}
|
package/dist/modules/statistics-insights/interface-adapters/presenters/statsSummary.presenter.js.map
CHANGED
|
@@ -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;
|
|
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 {};
|
package/dist/modules/tracking/interface-adapters/controllers/http/mrTracking.routes.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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":"
|
|
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;
|
|
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"}
|
package/dist/modules/worktree-management/interface-adapters/gateways/worktree.fileSystem.gateway.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
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;
|
|
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":"AAIA,OAAO,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,6DAA6D,CAAC;
|
|
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');
|