@shepai/cli 1.89.0 → 1.90.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/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +48 -0
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +4 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +103 -0
- package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-merge-review-data.js +11 -3
- package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts +6 -0
- package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/merge-review/diff-view.js +30 -0
- package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts +18 -0
- package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.js +174 -0
- package/dist/src/presentation/web/components/common/merge-review/index.d.ts +2 -1
- package/dist/src/presentation/web/components/common/merge-review/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/index.js +1 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +23 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.js +3 -2
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +69 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_03115bf1._.js +4 -0
- package/web/.next/server/chunks/ssr/_03115bf1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_752e01fd._.js +1 -1
- package/web/.next/server/chunks/ssr/_752e01fd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +28 -28
- package/web/.next/static/chunks/{fa2691e072fbc32e.js → 016d2a66dc4ecb3d.js} +1 -1
- package/web/.next/static/chunks/0f48ff9396f6ad8d.js +2 -0
- package/web/.next/static/chunks/548adb8fecaaddba.css +2 -0
- package/web/.next/static/chunks/{28d9c6be736a8cc7.js → 5d599eee149e1390.js} +1 -1
- package/web/.next/static/chunks/{9bccc1cd5344dbe9.js → 679bde57b488628c.js} +1 -1
- package/web/.next/static/chunks/{76a19eab77047b72.js → 6f1adf575d82a1ca.js} +1 -1
- package/web/.next/static/chunks/{6a3ca803667538a9.js → 85f19bbdb0d011bc.js} +1 -1
- package/web/.next/static/chunks/{0d676efbd1a069ac.js → ac45184c461dc23b.js} +1 -1
- package/web/.next/static/chunks/{fa7ead6d9da7f2e0.js → c4b4a16a5d8914a6.js} +1 -1
- package/web/.next/static/chunks/{276883c9dc46601a.js → cfaf3920a4eb45e3.js} +1 -1
- package/web/.next/static/chunks/feeb4661ab3e51e6.js +1 -0
- package/web/.next/server/chunks/ssr/_74b242a7._.js +0 -4
- package/web/.next/server/chunks/ssr/_74b242a7._.js.map +0 -1
- package/web/.next/static/chunks/59e9e5a9cfc3ba38.css +0 -2
- package/web/.next/static/chunks/a7d96dc069f1377e.js +0 -2
- package/web/.next/static/chunks/f30cab6b43179c31.js +0 -1
- /package/web/.next/static/{cHOqXO6iNIVWrwsMRYjXK → 04e-HIyL71MGmjPjyT0Bg}/_buildManifest.js +0 -0
- /package/web/.next/static/{cHOqXO6iNIVWrwsMRYjXK → 04e-HIyL71MGmjPjyT0Bg}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{cHOqXO6iNIVWrwsMRYjXK → 04e-HIyL71MGmjPjyT0Bg}/_ssgManifest.js +0 -0
package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts
CHANGED
|
@@ -55,6 +55,45 @@ export interface DiffSummary {
|
|
|
55
55
|
/** Number of commits in the diff */
|
|
56
56
|
commitCount: number;
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* A single hunk in a file diff showing the actual line changes.
|
|
60
|
+
*/
|
|
61
|
+
export interface DiffHunk {
|
|
62
|
+
/** Header line (e.g. "@@ -1,5 +1,7 @@") */
|
|
63
|
+
header: string;
|
|
64
|
+
/** Lines in this hunk with their type and content */
|
|
65
|
+
lines: DiffLine[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A single line within a diff hunk.
|
|
69
|
+
*/
|
|
70
|
+
export interface DiffLine {
|
|
71
|
+
/** Type of change: added, removed, or context (unchanged) */
|
|
72
|
+
type: 'added' | 'removed' | 'context';
|
|
73
|
+
/** The line content (without the leading +/-/space) */
|
|
74
|
+
content: string;
|
|
75
|
+
/** Old file line number (undefined for added lines) */
|
|
76
|
+
oldNumber?: number;
|
|
77
|
+
/** New file line number (undefined for removed lines) */
|
|
78
|
+
newNumber?: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Per-file diff data showing what changed in a single file.
|
|
82
|
+
*/
|
|
83
|
+
export interface FileDiff {
|
|
84
|
+
/** File path (new path for renames) */
|
|
85
|
+
path: string;
|
|
86
|
+
/** Previous path if the file was renamed */
|
|
87
|
+
oldPath?: string;
|
|
88
|
+
/** Number of lines added */
|
|
89
|
+
additions: number;
|
|
90
|
+
/** Number of lines removed */
|
|
91
|
+
deletions: number;
|
|
92
|
+
/** Change type */
|
|
93
|
+
status: 'added' | 'modified' | 'deleted' | 'renamed';
|
|
94
|
+
/** Diff hunks with actual line changes */
|
|
95
|
+
hunks: DiffHunk[];
|
|
96
|
+
}
|
|
58
97
|
/**
|
|
59
98
|
* Result of creating a pull request.
|
|
60
99
|
*/
|
|
@@ -201,6 +240,15 @@ export interface IGitPrService {
|
|
|
201
240
|
* @throws GitPrError with GIT_ERROR code
|
|
202
241
|
*/
|
|
203
242
|
getPrDiffSummary(cwd: string, baseBranch: string): Promise<DiffSummary>;
|
|
243
|
+
/**
|
|
244
|
+
* Get per-file diffs between the current branch and a base branch.
|
|
245
|
+
*
|
|
246
|
+
* @param cwd - Working directory path
|
|
247
|
+
* @param baseBranch - Base branch to compare against
|
|
248
|
+
* @returns Array of per-file diffs with hunks and line changes
|
|
249
|
+
* @throws GitPrError with GIT_ERROR code
|
|
250
|
+
*/
|
|
251
|
+
getFileDiffs(cwd: string, baseBranch: string): Promise<FileDiff[]>;
|
|
204
252
|
/**
|
|
205
253
|
* List PR statuses for all open and recently-updated PRs in a repository.
|
|
206
254
|
*
|
package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-pr-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/git-pr-service.interface.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git-pr-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/git-pr-service.interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Uses constructor dependency injection for the command executor.
|
|
6
6
|
*/
|
|
7
7
|
import type { IGitPrService } from '../../../application/ports/output/services/git-pr-service.interface.js';
|
|
8
|
-
import type { CiStatusResult, DiffSummary, MergeStrategy, PrCreateResult, PrStatusInfo } from '../../../application/ports/output/services/git-pr-service.interface.js';
|
|
8
|
+
import type { CiStatusResult, DiffSummary, FileDiff, MergeStrategy, PrCreateResult, PrStatusInfo } from '../../../application/ports/output/services/git-pr-service.interface.js';
|
|
9
9
|
import type { ExecFunction } from './worktree.service.js';
|
|
10
10
|
export declare class GitPrService implements IGitPrService {
|
|
11
11
|
private readonly execFile;
|
|
@@ -23,6 +23,9 @@ export declare class GitPrService implements IGitPrService {
|
|
|
23
23
|
watchCi(cwd: string, branch: string, timeoutMs?: number): Promise<CiStatusResult>;
|
|
24
24
|
deleteBranch(cwd: string, branch: string, deleteRemote?: boolean): Promise<void>;
|
|
25
25
|
getPrDiffSummary(cwd: string, baseBranch: string): Promise<DiffSummary>;
|
|
26
|
+
getFileDiffs(cwd: string, baseBranch: string): Promise<FileDiff[]>;
|
|
27
|
+
private parseUnifiedDiff;
|
|
28
|
+
private parseFileDiff;
|
|
26
29
|
listPrStatuses(cwd: string): Promise<PrStatusInfo[]>;
|
|
27
30
|
verifyMerge(cwd: string, featureBranch: string, baseBranch: string): Promise<boolean>;
|
|
28
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,
|
|
1
|
+
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAQhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgF9C,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAmDjF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAaxE,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,aAAa;IAmFf,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkCpD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B3F;;;OAGG;YACW,UAAU;IAmBlB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAW3F,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -275,6 +275,109 @@ let GitPrService = class GitPrService {
|
|
|
275
275
|
const { stdout: logOutput } = await this.execFile('git', ['log', '--oneline', `${baseBranch}...HEAD`], { cwd });
|
|
276
276
|
return this.parseDiffStat(diffStat, logOutput);
|
|
277
277
|
}
|
|
278
|
+
async getFileDiffs(cwd, baseBranch) {
|
|
279
|
+
try {
|
|
280
|
+
const { stdout } = await this.execFile('git', ['diff', '--unified=3', `${baseBranch}...HEAD`], { cwd });
|
|
281
|
+
return this.parseUnifiedDiff(stdout);
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
throw this.parseGitError(error);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
parseUnifiedDiff(rawDiff) {
|
|
288
|
+
if (!rawDiff.trim())
|
|
289
|
+
return [];
|
|
290
|
+
const files = [];
|
|
291
|
+
// Split on "diff --git" boundaries (keeping the delimiter)
|
|
292
|
+
const fileSections = rawDiff.split(/^(?=diff --git )/m).filter((s) => s.trim());
|
|
293
|
+
for (const section of fileSections) {
|
|
294
|
+
const file = this.parseFileDiff(section);
|
|
295
|
+
if (file)
|
|
296
|
+
files.push(file);
|
|
297
|
+
}
|
|
298
|
+
return files;
|
|
299
|
+
}
|
|
300
|
+
parseFileDiff(section) {
|
|
301
|
+
const lines = section.split('\n');
|
|
302
|
+
if (lines.length === 0)
|
|
303
|
+
return null;
|
|
304
|
+
// Parse header: "diff --git a/path b/path"
|
|
305
|
+
const headerMatch = lines[0].match(/^diff --git a\/(.+?) b\/(.+)$/);
|
|
306
|
+
if (!headerMatch)
|
|
307
|
+
return null;
|
|
308
|
+
const oldPath = headerMatch[1];
|
|
309
|
+
const newPath = headerMatch[2];
|
|
310
|
+
// Determine status from diff header lines
|
|
311
|
+
let status = 'modified';
|
|
312
|
+
const isNew = lines.some((l) => l.startsWith('new file mode'));
|
|
313
|
+
const isDeleted = lines.some((l) => l.startsWith('deleted file mode'));
|
|
314
|
+
const isRenamed = lines.some((l) => l.startsWith('rename from'));
|
|
315
|
+
if (isNew)
|
|
316
|
+
status = 'added';
|
|
317
|
+
else if (isDeleted)
|
|
318
|
+
status = 'deleted';
|
|
319
|
+
else if (isRenamed)
|
|
320
|
+
status = 'renamed';
|
|
321
|
+
// Parse hunks
|
|
322
|
+
const hunks = [];
|
|
323
|
+
let currentHunk = null;
|
|
324
|
+
let oldLineNum = 0;
|
|
325
|
+
let newLineNum = 0;
|
|
326
|
+
let additions = 0;
|
|
327
|
+
let deletions = 0;
|
|
328
|
+
for (const line of lines) {
|
|
329
|
+
const hunkHeaderMatch = line.match(/^@@\s+-(\d+)(?:,\d+)?\s+\+(\d+)(?:,\d+)?\s+@@(.*)$/);
|
|
330
|
+
if (hunkHeaderMatch) {
|
|
331
|
+
currentHunk = { header: line, lines: [] };
|
|
332
|
+
hunks.push(currentHunk);
|
|
333
|
+
oldLineNum = parseInt(hunkHeaderMatch[1], 10);
|
|
334
|
+
newLineNum = parseInt(hunkHeaderMatch[2], 10);
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
if (!currentHunk)
|
|
338
|
+
continue;
|
|
339
|
+
if (line.startsWith('+')) {
|
|
340
|
+
const diffLine = {
|
|
341
|
+
type: 'added',
|
|
342
|
+
content: line.slice(1),
|
|
343
|
+
newNumber: newLineNum,
|
|
344
|
+
};
|
|
345
|
+
currentHunk.lines.push(diffLine);
|
|
346
|
+
newLineNum++;
|
|
347
|
+
additions++;
|
|
348
|
+
}
|
|
349
|
+
else if (line.startsWith('-')) {
|
|
350
|
+
const diffLine = {
|
|
351
|
+
type: 'removed',
|
|
352
|
+
content: line.slice(1),
|
|
353
|
+
oldNumber: oldLineNum,
|
|
354
|
+
};
|
|
355
|
+
currentHunk.lines.push(diffLine);
|
|
356
|
+
oldLineNum++;
|
|
357
|
+
deletions++;
|
|
358
|
+
}
|
|
359
|
+
else if (line.startsWith(' ')) {
|
|
360
|
+
const diffLine = {
|
|
361
|
+
type: 'context',
|
|
362
|
+
content: line.slice(1),
|
|
363
|
+
oldNumber: oldLineNum,
|
|
364
|
+
newNumber: newLineNum,
|
|
365
|
+
};
|
|
366
|
+
currentHunk.lines.push(diffLine);
|
|
367
|
+
oldLineNum++;
|
|
368
|
+
newLineNum++;
|
|
369
|
+
}
|
|
370
|
+
// Skip lines like ""
|
|
371
|
+
}
|
|
372
|
+
return {
|
|
373
|
+
path: newPath,
|
|
374
|
+
oldPath: isRenamed || oldPath !== newPath ? oldPath : undefined,
|
|
375
|
+
additions,
|
|
376
|
+
deletions,
|
|
377
|
+
status,
|
|
378
|
+
hunks,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
278
381
|
async listPrStatuses(cwd) {
|
|
279
382
|
try {
|
|
280
383
|
const { stdout } = await this.execFile('gh', [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;
|
|
1
|
+
{"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;AAG9D,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA2D7F"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use server';
|
|
2
2
|
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
import { computeWorktreePath } from '../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
|
|
3
4
|
export async function getMergeReviewData(featureId) {
|
|
4
5
|
if (!featureId.trim()) {
|
|
5
6
|
return { error: 'Feature id is required' };
|
|
@@ -30,13 +31,20 @@ export async function getMergeReviewData(featureId) {
|
|
|
30
31
|
catch {
|
|
31
32
|
// Plan unavailable — not critical
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
+
const worktreePath = feature.worktreePath ??
|
|
35
|
+
(feature.repositoryPath && feature.branch
|
|
36
|
+
? computeWorktreePath(feature.repositoryPath, feature.branch)
|
|
37
|
+
: null);
|
|
38
|
+
if (!worktreePath) {
|
|
34
39
|
return { pr, branch, phases, warning: pr ? undefined : 'No PR or diff data available' };
|
|
35
40
|
}
|
|
36
41
|
try {
|
|
37
42
|
const gitPrService = resolve('IGitPrService');
|
|
38
|
-
const diffSummary = await
|
|
39
|
-
|
|
43
|
+
const [diffSummary, fileDiffs] = await Promise.all([
|
|
44
|
+
gitPrService.getPrDiffSummary(worktreePath, 'main'),
|
|
45
|
+
gitPrService.getFileDiffs(worktreePath, 'main').catch(() => undefined),
|
|
46
|
+
]);
|
|
47
|
+
return { pr, branch, phases, diffSummary, fileDiffs };
|
|
40
48
|
}
|
|
41
49
|
catch {
|
|
42
50
|
return { pr, branch, phases, warning: 'Diff statistics unavailable' };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MergeReviewFileDiff } from './merge-review-config.js';
|
|
2
|
+
export interface DiffViewProps {
|
|
3
|
+
fileDiffs: MergeReviewFileDiff[];
|
|
4
|
+
}
|
|
5
|
+
export declare function DiffView({ fileDiffs }: DiffViewProps): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
//# sourceMappingURL=diff-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAC;AA4GtF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,kDAmBpD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { ChevronRight, FileText, FilePlus, FileMinus, FileEdit } from 'lucide-react';
|
|
5
|
+
import { cn } from '../../../lib/utils.js';
|
|
6
|
+
const STATUS_CONFIG = {
|
|
7
|
+
added: { icon: FilePlus, label: 'A', className: 'text-green-600' },
|
|
8
|
+
modified: { icon: FileEdit, label: 'M', className: 'text-amber-600' },
|
|
9
|
+
deleted: { icon: FileMinus, label: 'D', className: 'text-red-600' },
|
|
10
|
+
renamed: { icon: FileEdit, label: 'R', className: 'text-blue-600' },
|
|
11
|
+
};
|
|
12
|
+
function FileStatusIcon({ status }) {
|
|
13
|
+
const config = STATUS_CONFIG[status];
|
|
14
|
+
const Icon = config.icon;
|
|
15
|
+
return _jsx(Icon, { className: cn('h-3.5 w-3.5 shrink-0', config.className) });
|
|
16
|
+
}
|
|
17
|
+
function HunkView({ hunk }) {
|
|
18
|
+
return (_jsxs("div", { className: "border-border border-t first:border-t-0", children: [_jsx("div", { className: "bg-muted/50 text-muted-foreground px-3 py-1 font-mono text-[10px]", children: hunk.header }), _jsx("div", { className: "font-mono text-[11px] leading-[18px]", children: hunk.lines.map((line) => (_jsxs("div", { className: cn('flex', line.type === 'added' && 'bg-green-50 dark:bg-green-950/30', line.type === 'removed' && 'bg-red-50 dark:bg-red-950/30'), children: [_jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.oldNumber ?? '' }), _jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.newNumber ?? '' }), _jsx("span", { className: cn('w-4 shrink-0 text-center select-none', line.type === 'added' && 'text-green-700 dark:text-green-400', line.type === 'removed' && 'text-red-700 dark:text-red-400'), children: line.type === 'added' ? '+' : line.type === 'removed' ? '-' : ' ' }), _jsx("span", { className: "min-w-0 flex-1 pr-2 break-all whitespace-pre-wrap", children: line.content })] }, `${line.type}-${line.oldNumber ?? ''}-${line.newNumber ?? ''}`))) })] }));
|
|
19
|
+
}
|
|
20
|
+
function FileDiffItem({ file }) {
|
|
21
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
22
|
+
const fileName = file.path.split('/').pop() ?? file.path;
|
|
23
|
+
const dirPath = file.path.includes('/') ? file.path.slice(0, file.path.lastIndexOf('/')) : '';
|
|
24
|
+
return (_jsxs("div", { className: "border-border border-b last:border-b-0", children: [_jsxs("button", { type: "button", onClick: () => setIsOpen(!isOpen), className: "hover:bg-muted/50 flex w-full items-center gap-2 px-3 py-2 text-left", children: [_jsx(ChevronRight, { className: cn('text-muted-foreground h-3 w-3 shrink-0 transition-transform duration-150', isOpen && 'rotate-90') }), _jsx(FileStatusIcon, { status: file.status }), _jsx("span", { className: "text-foreground min-w-0 flex-1 truncate text-xs", children: dirPath ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "text-muted-foreground", children: [dirPath, "/"] }), fileName] })) : (fileName) }), file.oldPath ? (_jsxs("span", { className: "text-muted-foreground truncate text-[10px]", children: ["\u2190 ", file.oldPath.split('/').pop()] })) : null, _jsxs("span", { className: "shrink-0 text-[10px]", children: [file.additions > 0 ? _jsxs("span", { className: "text-green-600", children: ["+", file.additions] }) : null, file.additions > 0 && file.deletions > 0 ? ' ' : null, file.deletions > 0 ? _jsxs("span", { className: "text-red-600", children: ["-", file.deletions] }) : null] })] }), isOpen && file.hunks.length > 0 ? (_jsx("div", { className: "border-border overflow-x-auto border-t", children: file.hunks.map((hunk) => (_jsx(HunkView, { hunk: hunk }, hunk.header))) })) : null] }));
|
|
25
|
+
}
|
|
26
|
+
export function DiffView({ fileDiffs }) {
|
|
27
|
+
if (fileDiffs.length === 0)
|
|
28
|
+
return null;
|
|
29
|
+
return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsx("div", { className: "px-4 py-3", children: _jsxs("div", { className: "mb-2 flex items-center gap-2", children: [_jsx(FileText, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changed Files" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", fileDiffs.length, ")"] })] }) }), _jsx("div", { className: "border-border border-t", children: fileDiffs.map((file) => (_jsx(FileDiffItem, { file: file }, file.path))) })] }));
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { DiffView } from './diff-view.js';
|
|
3
|
+
declare const meta: Meta<typeof DiffView>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof DiffView>;
|
|
6
|
+
/** Default — multiple files with various change types. */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** Single modified file. */
|
|
9
|
+
export declare const SingleFile: Story;
|
|
10
|
+
/** Only new files added. */
|
|
11
|
+
export declare const OnlyAdditions: Story;
|
|
12
|
+
/** Only deleted files. */
|
|
13
|
+
export declare const OnlyDeletions: Story;
|
|
14
|
+
/** Renamed file. */
|
|
15
|
+
export declare const RenamedFile: Story;
|
|
16
|
+
/** Empty diff list — renders nothing. */
|
|
17
|
+
export declare const EmptyDiffs: Story;
|
|
18
|
+
//# sourceMappingURL=diff-view.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-view.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2HvC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,QAAQ,CAuB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEvC,0DAA0D;AAC1D,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { DiffView } from './diff-view.js';
|
|
3
|
+
const sampleFiles = [
|
|
4
|
+
{
|
|
5
|
+
path: 'src/components/auth/login-form.tsx',
|
|
6
|
+
additions: 45,
|
|
7
|
+
deletions: 12,
|
|
8
|
+
status: 'modified',
|
|
9
|
+
hunks: [
|
|
10
|
+
{
|
|
11
|
+
header: '@@ -1,8 +1,12 @@',
|
|
12
|
+
lines: [
|
|
13
|
+
{
|
|
14
|
+
type: 'context',
|
|
15
|
+
content: "import { useState } from 'react';",
|
|
16
|
+
oldNumber: 1,
|
|
17
|
+
newNumber: 1,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
type: 'context',
|
|
21
|
+
content: "import { Button } from '../../ui/button.js';",
|
|
22
|
+
oldNumber: 2,
|
|
23
|
+
newNumber: 2,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: 'added',
|
|
27
|
+
content: "import { Input } from '../../ui/input.js';",
|
|
28
|
+
newNumber: 3,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: 'added',
|
|
32
|
+
content: "import { Label } from '../../ui/label.js';",
|
|
33
|
+
newNumber: 4,
|
|
34
|
+
},
|
|
35
|
+
{ type: 'context', content: '', oldNumber: 3, newNumber: 5 },
|
|
36
|
+
{ type: 'removed', content: 'export function LoginForm() {', oldNumber: 4 },
|
|
37
|
+
{
|
|
38
|
+
type: 'added',
|
|
39
|
+
content: 'export function LoginForm({ onSubmit }: LoginFormProps) {',
|
|
40
|
+
newNumber: 6,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: 'context',
|
|
44
|
+
content: " const [email, setEmail] = useState('');",
|
|
45
|
+
oldNumber: 5,
|
|
46
|
+
newNumber: 7,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
type: 'context',
|
|
50
|
+
content: " const [password, setPassword] = useState('');",
|
|
51
|
+
oldNumber: 6,
|
|
52
|
+
newNumber: 8,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: 'added',
|
|
56
|
+
content: ' const [isLoading, setIsLoading] = useState(false);',
|
|
57
|
+
newNumber: 9,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
path: 'src/lib/auth.ts',
|
|
65
|
+
additions: 28,
|
|
66
|
+
deletions: 0,
|
|
67
|
+
status: 'added',
|
|
68
|
+
hunks: [
|
|
69
|
+
{
|
|
70
|
+
header: '@@ -0,0 +1,8 @@',
|
|
71
|
+
lines: [
|
|
72
|
+
{ type: 'added', content: "import { hash } from 'bcrypt';", newNumber: 1 },
|
|
73
|
+
{ type: 'added', content: '', newNumber: 2 },
|
|
74
|
+
{
|
|
75
|
+
type: 'added',
|
|
76
|
+
content: 'export async function hashPassword(password: string) {',
|
|
77
|
+
newNumber: 3,
|
|
78
|
+
},
|
|
79
|
+
{ type: 'added', content: ' return hash(password, 10);', newNumber: 4 },
|
|
80
|
+
{ type: 'added', content: '}', newNumber: 5 },
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
path: 'src/utils/legacy-auth.ts',
|
|
87
|
+
additions: 0,
|
|
88
|
+
deletions: 35,
|
|
89
|
+
status: 'deleted',
|
|
90
|
+
hunks: [
|
|
91
|
+
{
|
|
92
|
+
header: '@@ -1,5 +0,0 @@',
|
|
93
|
+
lines: [
|
|
94
|
+
{ type: 'removed', content: '// Legacy auth utilities', oldNumber: 1 },
|
|
95
|
+
{ type: 'removed', content: 'export function oldLogin() {', oldNumber: 2 },
|
|
96
|
+
{ type: 'removed', content: " return fetch('/api/login');", oldNumber: 3 },
|
|
97
|
+
{ type: 'removed', content: '}', oldNumber: 4 },
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
path: 'src/services/user-service.ts',
|
|
104
|
+
oldPath: 'src/services/user.ts',
|
|
105
|
+
additions: 5,
|
|
106
|
+
deletions: 2,
|
|
107
|
+
status: 'renamed',
|
|
108
|
+
hunks: [
|
|
109
|
+
{
|
|
110
|
+
header: '@@ -1,4 +1,7 @@',
|
|
111
|
+
lines: [
|
|
112
|
+
{ type: 'removed', content: "import { db } from './db';", oldNumber: 1 },
|
|
113
|
+
{ type: 'added', content: "import { db } from '../lib/db';", newNumber: 1 },
|
|
114
|
+
{ type: 'added', content: "import { hashPassword } from '../lib/auth';", newNumber: 2 },
|
|
115
|
+
{ type: 'context', content: '', oldNumber: 2, newNumber: 3 },
|
|
116
|
+
{ type: 'context', content: 'export class UserService {', oldNumber: 3, newNumber: 4 },
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
];
|
|
122
|
+
const meta = {
|
|
123
|
+
title: 'Drawers/Review/DiffView',
|
|
124
|
+
component: DiffView,
|
|
125
|
+
tags: ['autodocs'],
|
|
126
|
+
parameters: {
|
|
127
|
+
layout: 'fullscreen',
|
|
128
|
+
},
|
|
129
|
+
decorators: [
|
|
130
|
+
(Story) => (_jsx("div", { style: {
|
|
131
|
+
height: '600px',
|
|
132
|
+
width: '500px',
|
|
133
|
+
overflow: 'auto',
|
|
134
|
+
border: '1px solid var(--color-border)',
|
|
135
|
+
}, children: _jsx("div", { style: { padding: '16px' }, children: _jsx(Story, {}) }) })),
|
|
136
|
+
],
|
|
137
|
+
};
|
|
138
|
+
export default meta;
|
|
139
|
+
/** Default — multiple files with various change types. */
|
|
140
|
+
export const Default = {
|
|
141
|
+
args: {
|
|
142
|
+
fileDiffs: sampleFiles,
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
/** Single modified file. */
|
|
146
|
+
export const SingleFile = {
|
|
147
|
+
args: {
|
|
148
|
+
fileDiffs: [sampleFiles[0]],
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
/** Only new files added. */
|
|
152
|
+
export const OnlyAdditions = {
|
|
153
|
+
args: {
|
|
154
|
+
fileDiffs: [sampleFiles[1]],
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
/** Only deleted files. */
|
|
158
|
+
export const OnlyDeletions = {
|
|
159
|
+
args: {
|
|
160
|
+
fileDiffs: [sampleFiles[2]],
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
/** Renamed file. */
|
|
164
|
+
export const RenamedFile = {
|
|
165
|
+
args: {
|
|
166
|
+
fileDiffs: [sampleFiles[3]],
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
/** Empty diff list — renders nothing. */
|
|
170
|
+
export const EmptyDiffs = {
|
|
171
|
+
args: {
|
|
172
|
+
fileDiffs: [],
|
|
173
|
+
},
|
|
174
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { MergeReview } from './merge-review.js';
|
|
2
|
-
export
|
|
2
|
+
export { DiffView } from './diff-view.js';
|
|
3
|
+
export type { MergeReviewProps, MergeReviewData, MergeReviewFileDiff } from './merge-review-config.js';
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -7,6 +7,27 @@ export interface MergeReviewDiffSummary {
|
|
|
7
7
|
deletions: number;
|
|
8
8
|
commitCount: number;
|
|
9
9
|
}
|
|
10
|
+
/** A line within a diff hunk */
|
|
11
|
+
export interface MergeReviewDiffLine {
|
|
12
|
+
type: 'added' | 'removed' | 'context';
|
|
13
|
+
content: string;
|
|
14
|
+
oldNumber?: number;
|
|
15
|
+
newNumber?: number;
|
|
16
|
+
}
|
|
17
|
+
/** A hunk within a file diff */
|
|
18
|
+
export interface MergeReviewDiffHunk {
|
|
19
|
+
header: string;
|
|
20
|
+
lines: MergeReviewDiffLine[];
|
|
21
|
+
}
|
|
22
|
+
/** Per-file diff showing what changed in a single file */
|
|
23
|
+
export interface MergeReviewFileDiff {
|
|
24
|
+
path: string;
|
|
25
|
+
oldPath?: string;
|
|
26
|
+
additions: number;
|
|
27
|
+
deletions: number;
|
|
28
|
+
status: 'added' | 'modified' | 'deleted' | 'renamed';
|
|
29
|
+
hunks: MergeReviewDiffHunk[];
|
|
30
|
+
}
|
|
10
31
|
/** PR metadata extracted from Feature.pr */
|
|
11
32
|
export interface MergeReviewPr {
|
|
12
33
|
url: string;
|
|
@@ -34,6 +55,8 @@ export interface MergeReviewData {
|
|
|
34
55
|
pr?: MergeReviewPr;
|
|
35
56
|
/** Aggregate diff statistics (omitted when worktree is unavailable) */
|
|
36
57
|
diffSummary?: MergeReviewDiffSummary;
|
|
58
|
+
/** Per-file diffs with line-level changes (omitted when worktree is unavailable) */
|
|
59
|
+
fileDiffs?: MergeReviewFileDiff[];
|
|
37
60
|
/** Implementation phases from plan.yaml */
|
|
38
61
|
phases?: MergeReviewPhase[];
|
|
39
62
|
/** Branch merge direction */
|
package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-review-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,yCAAyC;AACzC,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,uEAAuE;IACvE,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,2CAA2C;IAC3C,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,6BAA6B;IAC7B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,IAAI,EAAE,eAAe,CAAC;IACtB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,uGAAuG;IACvG,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IACvE,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,wDAAwD;AACxD,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAC5E,6CAA6C;IAC7C,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
|
|
1
|
+
{"version":3,"file":"merge-review-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,uBAAuB,CAAC;AAgChF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,EAAE,gBAAgB,2CAyIlB"}
|
|
@@ -4,12 +4,13 @@ import { ExternalLink, AlertTriangle, FileDiff, GitCommitHorizontal, GitBranch,
|
|
|
4
4
|
import { Badge } from '../../ui/badge.js';
|
|
5
5
|
import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
|
|
6
6
|
import { DrawerActionBar } from '../../common/drawer-action-bar/index.js';
|
|
7
|
+
import { DiffView } from './diff-view.js';
|
|
7
8
|
function PhaseList({ phases }) {
|
|
8
9
|
return (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(Layers, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Implementation Phases" })] }), _jsx("ol", { className: "space-y-2", children: phases.map((phase, i) => (_jsxs("li", { className: "flex items-start gap-2.5", children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-emerald-100 text-[10px] font-bold text-emerald-700", children: i + 1 }), _jsxs("div", { className: "min-w-0", children: [_jsx("span", { className: "text-foreground text-xs font-medium", children: phase.name }), phase.description ? (_jsx("p", { className: "text-muted-foreground mt-0.5 text-[11px] leading-relaxed", children: phase.description })) : null] })] }, phase.id))) })] }) }));
|
|
9
10
|
}
|
|
10
11
|
export function MergeReview({ data, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
|
|
11
|
-
const { pr, diffSummary, phases, branch, warning } = data;
|
|
12
|
+
const { pr, diffSummary, fileDiffs, phases, branch, warning } = data;
|
|
12
13
|
return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-emerald-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-foreground text-sm font-bold", children: "Merge Review" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs leading-relaxed", children: pr
|
|
13
14
|
? 'Review the pull request details and approve to merge.'
|
|
14
|
-
: 'Review the changes and approve to merge.' })] })] }), branch ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx(Badge, { variant: "secondary", className: "font-mono text-[11px]", children: branch.source }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx(Badge, { variant: "outline", className: "font-mono text-[11px]", children: branch.target })] }) })) : null, pr ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { variant: "outline", className: "text-xs", children: pr.status })] }), pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) })) : null, diffSummary ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(FileDiff, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changes" })] }), _jsxs("div", { className: "grid grid-cols-4 gap-3", children: [_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.filesChanged }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "files" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-green-600", children: ["+", diffSummary.additions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "additions" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-red-600", children: ["-", diffSummary.deletions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "deletions" })] }), _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.commitCount }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "commits" })] })] })] }) })) : warning ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(AlertTriangle, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "text-muted-foreground text-xs", children: warning })] }) })) : null, phases && phases.length > 0 ? _jsx(PhaseList, { phases: phases }) : null] }), _jsx(DrawerActionBar, { onReject: onReject, onApprove: onApprove, approveLabel: "Approve Merge", revisionPlaceholder: "Ask AI to revise before merging...", isProcessing: isProcessing, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] }));
|
|
15
|
+
: 'Review the changes and approve to merge.' })] })] }), branch ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx(Badge, { variant: "secondary", className: "font-mono text-[11px]", children: branch.source }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx(Badge, { variant: "outline", className: "font-mono text-[11px]", children: branch.target })] }) })) : null, pr ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { variant: "outline", className: "text-xs", children: pr.status })] }), pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) })) : null, diffSummary ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(FileDiff, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changes" })] }), _jsxs("div", { className: "grid grid-cols-4 gap-3", children: [_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.filesChanged }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "files" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-green-600", children: ["+", diffSummary.additions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "additions" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-red-600", children: ["-", diffSummary.deletions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "deletions" })] }), _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.commitCount }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "commits" })] })] })] }) })) : warning ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(AlertTriangle, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "text-muted-foreground text-xs", children: warning })] }) })) : null, fileDiffs && fileDiffs.length > 0 ? _jsx(DiffView, { fileDiffs: fileDiffs }) : null, phases && phases.length > 0 ? _jsx(PhaseList, { phases: phases }) : null] }), _jsx(DrawerActionBar, { onReject: onReject, onApprove: onApprove, approveLabel: "Approve Merge", revisionPlaceholder: "Ask AI to revise before merging...", isProcessing: isProcessing, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] }));
|
|
15
16
|
}
|
|
@@ -21,4 +21,6 @@ export declare const NoPrWithDiff: Story;
|
|
|
21
21
|
export declare const NoPrNoDiff: Story;
|
|
22
22
|
/** With implementation phases shown. */
|
|
23
23
|
export declare const WithPhases: Story;
|
|
24
|
+
/** With file diffs — shows expandable file list with line-level changes. */
|
|
25
|
+
export declare const WithFileDiffs: Story;
|
|
24
26
|
//# sourceMappingURL=merge-review.stories.d.ts.map
|
package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-review.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"merge-review.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAkG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAE1C,kDAAkD;AAClD,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,YAAY,EAAE,KAS1B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC"}
|