@cerbur/clutch-dsh-worktree 0.1.12 → 0.1.13
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/README.md +290 -433
- package/README.zh.md +244 -348
- package/assets/screenshots/screenshots-dashboard.png +0 -0
- package/assets/screenshots/screenshots-git-reviewer.png +0 -0
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +139 -17
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/context/WorktreeHeroContext.d.ts +4 -3
- package/lib/client/context/WorktreeHeroContext.d.ts.map +1 -1
- package/lib/client/context/WorktreeHeroContext.js +29 -11
- package/lib/client/context/WorktreeHeroContext.js.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.d.ts +9 -2
- package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.js +165 -14
- package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
- package/lib/client/dashboard/dashboard-navigation.d.ts +35 -0
- package/lib/client/dashboard/dashboard-navigation.d.ts.map +1 -0
- package/lib/client/dashboard/dashboard-navigation.js +48 -0
- package/lib/client/dashboard/dashboard-navigation.js.map +1 -0
- package/lib/client/dashboard/dashboard-overlay.d.ts +7 -2
- package/lib/client/dashboard/dashboard-overlay.d.ts.map +1 -1
- package/lib/client/dashboard/dashboard-overlay.js +81 -16
- package/lib/client/dashboard/dashboard-overlay.js.map +1 -1
- package/lib/client/dashboard/dashboard-selection.d.ts +2 -1
- package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -1
- package/lib/client/dashboard/dashboard-selection.js +1 -1
- package/lib/client/dashboard/dashboard-selection.js.map +1 -1
- package/lib/client/dashboard/git/GitChangedFiles.d.ts +11 -0
- package/lib/client/dashboard/git/GitChangedFiles.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitChangedFiles.js +101 -0
- package/lib/client/dashboard/git/GitChangedFiles.js.map +1 -0
- package/lib/client/dashboard/git/GitCommitList.d.ts +15 -0
- package/lib/client/dashboard/git/GitCommitList.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitCommitList.js +55 -0
- package/lib/client/dashboard/git/GitCommitList.js.map +1 -0
- package/lib/client/dashboard/git/GitDiffView.d.ts +10 -0
- package/lib/client/dashboard/git/GitDiffView.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitDiffView.js +65 -0
- package/lib/client/dashboard/git/GitDiffView.js.map +1 -0
- package/lib/client/dashboard/git/GitFileTypeIcon.d.ts +8 -0
- package/lib/client/dashboard/git/GitFileTypeIcon.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitFileTypeIcon.js +24 -0
- package/lib/client/dashboard/git/GitFileTypeIcon.js.map +1 -0
- package/lib/client/dashboard/git/GitLineStats.d.ts +10 -0
- package/lib/client/dashboard/git/GitLineStats.d.ts.map +1 -0
- package/lib/client/dashboard/git/GitLineStats.js +9 -0
- package/lib/client/dashboard/git/GitLineStats.js.map +1 -0
- package/lib/client/dashboard/git/WorktreeGitOverview.d.ts +31 -0
- package/lib/client/dashboard/git/WorktreeGitOverview.d.ts.map +1 -0
- package/lib/client/dashboard/git/WorktreeGitOverview.js +89 -0
- package/lib/client/dashboard/git/WorktreeGitOverview.js.map +1 -0
- package/lib/client/dashboard/git/WorktreeGitPanel.d.ts +16 -0
- package/lib/client/dashboard/git/WorktreeGitPanel.d.ts.map +1 -0
- package/lib/client/dashboard/git/WorktreeGitPanel.js +126 -0
- package/lib/client/dashboard/git/WorktreeGitPanel.js.map +1 -0
- package/lib/client/dashboard/git/file-address.d.ts +2 -0
- package/lib/client/dashboard/git/file-address.d.ts.map +1 -0
- package/lib/client/dashboard/git/file-address.js +16 -0
- package/lib/client/dashboard/git/file-address.js.map +1 -0
- package/lib/client/dashboard/git/git-column-split.d.ts +34 -0
- package/lib/client/dashboard/git/git-column-split.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-column-split.js +41 -0
- package/lib/client/dashboard/git/git-column-split.js.map +1 -0
- package/lib/client/dashboard/git/git-diff-parser.d.ts +24 -0
- package/lib/client/dashboard/git/git-diff-parser.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-diff-parser.js +56 -0
- package/lib/client/dashboard/git/git-diff-parser.js.map +1 -0
- package/lib/client/dashboard/git/git-facts.d.ts +18 -0
- package/lib/client/dashboard/git/git-facts.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-facts.js +31 -0
- package/lib/client/dashboard/git/git-facts.js.map +1 -0
- package/lib/client/dashboard/git/git-file-tree.d.ts +16 -0
- package/lib/client/dashboard/git/git-file-tree.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-file-tree.js +52 -0
- package/lib/client/dashboard/git/git-file-tree.js.map +1 -0
- package/lib/client/dashboard/git/git-state-cache.d.ts +49 -0
- package/lib/client/dashboard/git/git-state-cache.d.ts.map +1 -0
- package/lib/client/dashboard/git/git-state-cache.js +80 -0
- package/lib/client/dashboard/git/git-state-cache.js.map +1 -0
- package/lib/client/dashboard/git/useGitPaneSplit.d.ts +33 -0
- package/lib/client/dashboard/git/useGitPaneSplit.d.ts.map +1 -0
- package/lib/client/dashboard/git/useGitPaneSplit.js +119 -0
- package/lib/client/dashboard/git/useGitPaneSplit.js.map +1 -0
- package/lib/client/dashboard/git/useWorktreeGitState.d.ts +60 -0
- package/lib/client/dashboard/git/useWorktreeGitState.d.ts.map +1 -0
- package/lib/client/dashboard/git/useWorktreeGitState.js +654 -0
- package/lib/client/dashboard/git/useWorktreeGitState.js.map +1 -0
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +28 -0
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +158 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +166 -8
- package/lib/client/locales.js.map +1 -1
- package/lib/client/session/session-view.d.ts +10 -0
- package/lib/client/session/session-view.d.ts.map +1 -1
- package/lib/client/session/session-view.js +57 -0
- package/lib/client/session/session-view.js.map +1 -1
- package/lib/client/session/worktree-session-order.d.ts +2 -5
- package/lib/client/session/worktree-session-order.d.ts.map +1 -1
- package/lib/client/session/worktree-session-order.js +35 -10
- package/lib/client/session/worktree-session-order.js.map +1 -1
- package/lib/client/session/worktree-session-position.d.ts +2 -1
- package/lib/client/session/worktree-session-position.d.ts.map +1 -1
- package/lib/client/session/worktree-session-position.js +10 -3
- package/lib/client/session/worktree-session-position.js.map +1 -1
- package/lib/client/surface/actions/useDragActions.d.ts +33 -2
- package/lib/client/surface/actions/useDragActions.d.ts.map +1 -1
- package/lib/client/surface/actions/useDragActions.js +66 -18
- package/lib/client/surface/actions/useDragActions.js.map +1 -1
- package/lib/client/surface/components/ActiveWorktree.js +2 -2
- package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktree.js +2 -2
- package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.js +2 -2
- package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
- package/lib/client/surface/components/SurfaceContent.d.ts +1 -1
- package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceContent.js +1 -1
- package/lib/client/surface/components/SurfaceContent.js.map +1 -1
- package/lib/client/surface/components/SurfaceHeader.d.ts +1 -1
- package/lib/client/surface/components/SurfaceHeader.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceHeader.js +12 -3
- package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.js +4 -4
- package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
- package/lib/client/surface/components/rows.d.ts +2 -2
- package/lib/client/surface/components/rows.d.ts.map +1 -1
- package/lib/client/surface/components/rows.js +14 -9
- package/lib/client/surface/components/rows.js.map +1 -1
- package/lib/client/surface/selectors.d.ts +10 -0
- package/lib/client/surface/selectors.d.ts.map +1 -1
- package/lib/client/surface/selectors.js +14 -0
- package/lib/client/surface/selectors.js.map +1 -1
- package/lib/client/surface/state/useSessionExpansion.d.ts +2 -1
- package/lib/client/surface/state/useSessionExpansion.d.ts.map +1 -1
- package/lib/client/surface/state/useSessionExpansion.js +26 -13
- package/lib/client/surface/state/useSessionExpansion.js.map +1 -1
- package/lib/client/surface/state/useSessionOrdering.d.ts +1 -1
- package/lib/client/surface/state/useSessionOrdering.d.ts.map +1 -1
- package/lib/client/surface/state/useSessionOrdering.js +23 -8
- package/lib/client/surface/state/useSessionOrdering.js.map +1 -1
- package/lib/client/surface/types.d.ts +15 -3
- package/lib/client/surface/types.d.ts.map +1 -1
- package/lib/client/view/worktree-expand-state.d.ts +1 -1
- package/lib/client/view/worktree-expand-state.d.ts.map +1 -1
- package/lib/client/view/worktree-expand-state.js +8 -1
- package/lib/client/view/worktree-expand-state.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +4 -0
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +10 -0
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client.js +3454 -307
- package/lib/client.js.map +1 -1
- package/lib/contract/index.contract.js +8 -0
- package/lib/contract/index.contract.js.map +1 -1
- package/lib/contract/index.d.ts +145 -1
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +18 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/host/remote.d.ts.map +1 -1
- package/lib/host/remote.js +4 -0
- package/lib/host/remote.js.map +1 -1
- package/lib/host/service.d.ts +14 -1
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +24 -0
- package/lib/host/service.js.map +1 -1
- package/lib/index.d.ts +4 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/lib/manage/manager-git-history.d.ts +17 -0
- package/lib/manage/manager-git-history.d.ts.map +1 -0
- package/lib/manage/manager-git-history.js +717 -0
- package/lib/manage/manager-git-history.js.map +1 -0
- package/lib/manage/manager-worktrees.d.ts.map +1 -1
- package/lib/manage/manager-worktrees.js +24 -0
- package/lib/manage/manager-worktrees.js.map +1 -1
- package/lib/manage/manager.d.ts +14 -1
- package/lib/manage/manager.d.ts.map +1 -1
- package/lib/manage/manager.js +13 -0
- package/lib/manage/manager.js.map +1 -1
- package/lib/provider/git/adapter.d.ts +54 -1
- package/lib/provider/git/adapter.d.ts.map +1 -1
- package/lib/provider/git/adapter.js +820 -1
- package/lib/provider/git/adapter.js.map +1 -1
- package/lib/provider/index.d.ts +2 -2
- package/lib/provider/index.d.ts.map +1 -1
- package/lib/provider/index.js +1 -1
- package/lib/provider/index.js.map +1 -1
- package/lib/provider/mutation-token.d.ts +1 -1
- package/lib/provider/mutation-token.d.ts.map +1 -1
- package/lib/provider/mutation-token.js +1 -0
- package/lib/provider/mutation-token.js.map +1 -1
- package/lib/provider/sidecar/repository.d.ts +1 -1
- package/lib/provider/sidecar/repository.d.ts.map +1 -1
- package/lib/provider/sidecar/repository.js +3 -2
- package/lib/provider/sidecar/repository.js.map +1 -1
- package/lib/provider/sidecar/sidecar-schema.d.ts +16 -3
- package/lib/provider/sidecar/sidecar-schema.d.ts.map +1 -1
- package/lib/provider/sidecar/sidecar-schema.js +105 -23
- package/lib/provider/sidecar/sidecar-schema.js.map +1 -1
- package/lib/provider/transaction/operations/create.d.ts.map +1 -1
- package/lib/provider/transaction/operations/create.js +21 -6
- package/lib/provider/transaction/operations/create.js.map +1 -1
- package/lib/provider/transaction/recovery/failure-recovery.d.ts.map +1 -1
- package/lib/provider/transaction/recovery/failure-recovery.js +11 -4
- package/lib/provider/transaction/recovery/failure-recovery.js.map +1 -1
- package/lib/provider/transaction/recovery/recover.d.ts.map +1 -1
- package/lib/provider/transaction/recovery/recover.js +9 -11
- package/lib/provider/transaction/recovery/recover.js.map +1 -1
- package/lib/provider/transaction/support/inspection.d.ts +0 -2
- package/lib/provider/transaction/support/inspection.d.ts.map +1 -1
- package/lib/provider/transaction/support/inspection.js +0 -4
- package/lib/provider/transaction/support/inspection.js.map +1 -1
- package/lib/provider/transaction/support/journal.d.ts.map +1 -1
- package/lib/provider/transaction/support/journal.js +2 -0
- package/lib/provider/transaction/support/journal.js.map +1 -1
- package/lib/provider/transaction/types.d.ts +1 -0
- package/lib/provider/transaction/types.d.ts.map +1 -1
- package/lib/provider/types.d.ts +53 -5
- package/lib/provider/types.d.ts.map +1 -1
- package/lib/provider/types.js +1 -1
- package/lib/provider/types.js.map +1 -1
- package/lib/typert.host.js +295 -34
- package/lib/typert.remote-client.d.ts +9 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +295 -34
- package/package.json +3 -1
- package/assets/screenshots/screenshots-dashboard.webp +0 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import styles from './worktree-git.css';
|
|
3
|
+
/** Compact, color-coded Git line counts shared by overview and changed-file rows. */
|
|
4
|
+
export function GitLineStats({ additions, deletions, ariaLabel, className, }) {
|
|
5
|
+
if (additions === undefined && deletions === undefined)
|
|
6
|
+
return null;
|
|
7
|
+
return (_jsxs("span", { className: [styles.gitLineStats, className].filter(Boolean).join(' '), "aria-label": ariaLabel, "data-dashboard-git-line-stats": true, children: [additions !== undefined && (_jsxs("span", { className: styles.gitLineAdded, "data-dashboard-git-additions": true, children: ["+", additions] })), deletions !== undefined && (_jsxs("span", { className: styles.gitLineRemoved, "data-dashboard-git-deletions": true, children: ["-", deletions] }))] }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=GitLineStats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLineStats.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/GitLineStats.tsx"],"names":[],"mappings":";AACA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AASxC,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,EAC3B,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,GACS;IAClB,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,CACL,gBACE,SAAS,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBACzD,SAAS,oDAGpB,SAAS,KAAK,SAAS,IAAI,CAC1B,gBAAM,SAAS,EAAE,MAAM,CAAC,YAAY,wDAChC,SAAS,IACN,CACR,EACA,SAAS,KAAK,SAAS,IAAI,CAC1B,gBAAM,SAAS,EAAE,MAAM,CAAC,cAAc,wDAClC,SAAS,IACN,CACR,IACI,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { WorktreeGitChangedFile, WorktreeGitHistory, WorktreeManager } from '../../../contract/index.js';
|
|
2
|
+
import type { WorktreeTranslate } from '../../surface/types.js';
|
|
3
|
+
export interface WorktreeGitOverviewInput {
|
|
4
|
+
readonly manager?: Pick<WorktreeManager, 'listWorktreeCommits' | 'listWorktreeCommitFiles'>;
|
|
5
|
+
readonly workspaceId: string;
|
|
6
|
+
readonly worktreeId: string;
|
|
7
|
+
readonly defaultBaselineBranch?: string;
|
|
8
|
+
readonly currentBranch?: string;
|
|
9
|
+
/** The record captured an acquisition commit the Manager can use implicitly. */
|
|
10
|
+
readonly capturedBaseline?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export type WorktreeGitOverviewState = {
|
|
13
|
+
readonly status: 'unavailable';
|
|
14
|
+
} | {
|
|
15
|
+
readonly status: 'loading';
|
|
16
|
+
} | {
|
|
17
|
+
readonly status: 'ready';
|
|
18
|
+
readonly history: WorktreeGitHistory;
|
|
19
|
+
readonly committedFiles: readonly WorktreeGitChangedFile[];
|
|
20
|
+
readonly workingTreeFiles: readonly WorktreeGitChangedFile[];
|
|
21
|
+
} | {
|
|
22
|
+
readonly status: 'error';
|
|
23
|
+
};
|
|
24
|
+
/** Read the compact Git projections needed by the Overview status facts. */
|
|
25
|
+
export declare function useWorktreeGitOverview(input: WorktreeGitOverviewInput): WorktreeGitOverviewState;
|
|
26
|
+
export declare function WorktreeGitOverviewValue({ state, metric, t, }: {
|
|
27
|
+
readonly state: WorktreeGitOverviewState;
|
|
28
|
+
readonly metric: 'aheadBehind' | 'committed' | 'workingTree';
|
|
29
|
+
readonly t: WorktreeTranslate;
|
|
30
|
+
}): import("react").JSX.Element;
|
|
31
|
+
//# sourceMappingURL=WorktreeGitOverview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeGitOverview.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/WorktreeGitOverview.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAKhE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,qBAAqB,GAAG,yBAAyB,CAAC,CAAC;IAC5F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAClC;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC9B;IACE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC9D,GACD;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAMjC,4EAA4E;AAC5E,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,wBAAwB,GAC9B,wBAAwB,CAmD1B;AAED,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,MAAM,EACN,CAAC,GACF,EAAE;IACD,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,aAAa,CAAC;IAC7D,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC;CAC/B,+BAmCA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { WORKTREE_GIT_WORKING_TREE } from '../../../contract/index.js';
|
|
4
|
+
import { isMainWorktreeId, normalizeBaselineBranch, sumLineTotals } from './git-facts.js';
|
|
5
|
+
import { GitLineStats } from './GitLineStats.js';
|
|
6
|
+
import styles from '../dashboard.css';
|
|
7
|
+
function isWorkingTreeCommit(commit) {
|
|
8
|
+
return commit.kind === 'working-tree' || commit.sha === WORKTREE_GIT_WORKING_TREE;
|
|
9
|
+
}
|
|
10
|
+
/** Read the compact Git projections needed by the Overview status facts. */
|
|
11
|
+
export function useWorktreeGitOverview(input) {
|
|
12
|
+
const baselineBranch = normalizeBaselineBranch(input.defaultBaselineBranch, input.currentBranch);
|
|
13
|
+
// A captured acquisition commit keeps the Overview readable without a selected
|
|
14
|
+
// branch; Main and genuinely baseline-less records still make no Git request.
|
|
15
|
+
const readable = input.capturedBaseline === true || baselineBranch !== undefined;
|
|
16
|
+
const [state, setState] = useState({ status: 'unavailable' });
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (input.manager === undefined || isMainWorktreeId(input.worktreeId) || !readable) {
|
|
19
|
+
setState({ status: 'unavailable' });
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const manager = input.manager;
|
|
23
|
+
let active = true;
|
|
24
|
+
setState({ status: 'loading' });
|
|
25
|
+
void manager.listWorktreeCommits({
|
|
26
|
+
workspaceId: input.workspaceId,
|
|
27
|
+
worktreeId: input.worktreeId,
|
|
28
|
+
baseBranch: baselineBranch,
|
|
29
|
+
})
|
|
30
|
+
.then(async (history) => {
|
|
31
|
+
const workingTree = history.commits.find(isWorkingTreeCommit);
|
|
32
|
+
const committedFilesPromise = history.unavailableReason === undefined
|
|
33
|
+
? manager.listWorktreeCommitFiles({
|
|
34
|
+
workspaceId: input.workspaceId,
|
|
35
|
+
worktreeId: input.worktreeId,
|
|
36
|
+
baseBranch: baselineBranch,
|
|
37
|
+
selection: { kind: 'summary', includeWorkingTree: false },
|
|
38
|
+
}).then((result) => result.files)
|
|
39
|
+
: Promise.resolve([]);
|
|
40
|
+
const workingTreeFilesPromise = workingTree === undefined
|
|
41
|
+
? Promise.resolve([])
|
|
42
|
+
: manager.listWorktreeCommitFiles({
|
|
43
|
+
workspaceId: input.workspaceId,
|
|
44
|
+
worktreeId: input.worktreeId,
|
|
45
|
+
baseBranch: baselineBranch,
|
|
46
|
+
commit: workingTree.sha,
|
|
47
|
+
}).then((result) => result.files);
|
|
48
|
+
const [committedFiles, workingTreeFiles] = await Promise.all([
|
|
49
|
+
committedFilesPromise,
|
|
50
|
+
workingTreeFilesPromise,
|
|
51
|
+
]);
|
|
52
|
+
if (active)
|
|
53
|
+
setState({ status: 'ready', history, committedFiles, workingTreeFiles });
|
|
54
|
+
})
|
|
55
|
+
.catch(() => {
|
|
56
|
+
if (active)
|
|
57
|
+
setState({ status: 'error' });
|
|
58
|
+
});
|
|
59
|
+
return () => {
|
|
60
|
+
active = false;
|
|
61
|
+
};
|
|
62
|
+
}, [baselineBranch, readable, input.manager, input.workspaceId, input.worktreeId]);
|
|
63
|
+
return state;
|
|
64
|
+
}
|
|
65
|
+
export function WorktreeGitOverviewValue({ state, metric, t, }) {
|
|
66
|
+
if (state.status !== 'ready') {
|
|
67
|
+
return _jsx("span", { className: styles.dashboardHistorical, children: t('dashboard.notConnected') });
|
|
68
|
+
}
|
|
69
|
+
if (metric === 'aheadBehind') {
|
|
70
|
+
const { ahead, behind } = state.history;
|
|
71
|
+
if (ahead === undefined || behind === undefined) {
|
|
72
|
+
return _jsx("span", { className: styles.dashboardHistorical, children: t('dashboard.notConnected') });
|
|
73
|
+
}
|
|
74
|
+
return (_jsx(GitLineStats, { additions: ahead, deletions: behind, ariaLabel: t('dashboard.git.aheadBehindStats', { ahead, behind }) }));
|
|
75
|
+
}
|
|
76
|
+
if (state.history.unavailableReason !== undefined) {
|
|
77
|
+
return _jsx("span", { className: styles.dashboardHistorical, children: t('dashboard.notConnected') });
|
|
78
|
+
}
|
|
79
|
+
const files = metric === 'committed' ? state.committedFiles : state.workingTreeFiles;
|
|
80
|
+
const totals = sumLineTotals(files);
|
|
81
|
+
if (totals === undefined) {
|
|
82
|
+
return _jsx("span", { className: styles.dashboardHistorical, children: t('dashboard.unknown') });
|
|
83
|
+
}
|
|
84
|
+
return (_jsx(GitLineStats, { additions: totals.additions, deletions: totals.deletions, ariaLabel: t('dashboard.git.lineStats', {
|
|
85
|
+
additions: totals.additions,
|
|
86
|
+
deletions: totals.deletions,
|
|
87
|
+
}) }));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=WorktreeGitOverview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeGitOverview.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/WorktreeGitOverview.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WorktreeManager } from '../../../contract/index.js';
|
|
2
|
+
import type { WorktreeTranslate } from '../../surface/types.js';
|
|
3
|
+
export interface WorktreeGitPanelProps {
|
|
4
|
+
readonly manager?: Pick<WorktreeManager, 'listBranches' | 'listWorktreeCommits' | 'listWorktreeCommitFiles' | 'getWorktreeCommitFileDiff'>;
|
|
5
|
+
readonly workspaceId: string;
|
|
6
|
+
readonly worktreeId: string;
|
|
7
|
+
readonly defaultBaselineBranch?: string;
|
|
8
|
+
readonly currentBranch?: string;
|
|
9
|
+
/** The record captured an acquisition commit the Manager can use implicitly. */
|
|
10
|
+
readonly capturedBaseline?: boolean;
|
|
11
|
+
readonly onOpenFile?: (path: string) => void;
|
|
12
|
+
readonly t: WorktreeTranslate;
|
|
13
|
+
}
|
|
14
|
+
/** Git & Changes tab: read-only, on-demand history -> target files -> one-file diff. */
|
|
15
|
+
export declare function WorktreeGitPanel({ manager, workspaceId, worktreeId, defaultBaselineBranch, currentBranch, capturedBaseline, onOpenFile, t, }: WorktreeGitPanelProps): import("react").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=WorktreeGitPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeGitPanel.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/WorktreeGitPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,eAAe,EAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAkBhE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CACrB,eAAe,EACf,cAAc,GAAG,qBAAqB,GAAG,yBAAyB,GAAG,2BAA2B,CACjG,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAgED,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,CAAC,GACF,EAAE,qBAAqB,+BAkVvB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { isMainWorktreeId, normalizeBaselineBranch, sumLineTotals } from './git-facts.js';
|
|
4
|
+
import { GitChangedFiles } from './GitChangedFiles.js';
|
|
5
|
+
import { GitLineStats } from './GitLineStats.js';
|
|
6
|
+
import { GitCommitList } from './GitCommitList.js';
|
|
7
|
+
import { GitDiffView } from './GitDiffView.js';
|
|
8
|
+
import { GIT_SPLIT_DEFAULT_COLUMN_PERCENT, GIT_SPLIT_DEFAULT_ROW_PERCENT, GIT_SPLIT_MIN_COLUMN_PX, GIT_SPLIT_MIN_ROW_PX, } from './git-column-split.js';
|
|
9
|
+
import { useGitPaneSplit } from './useGitPaneSplit.js';
|
|
10
|
+
import { useWorktreeGitState } from './useWorktreeGitState.js';
|
|
11
|
+
import styles from './worktree-git.css';
|
|
12
|
+
function shortCommit(commit) {
|
|
13
|
+
return commit === undefined ? '—' : commit.slice(0, 7);
|
|
14
|
+
}
|
|
15
|
+
function selectedCommit(history, sha) {
|
|
16
|
+
return history?.commits.find((commit) => commit.sha === sha);
|
|
17
|
+
}
|
|
18
|
+
function commitCountLabel(history, t) {
|
|
19
|
+
const committedCount = history.commits.filter((commit) => commit.kind !== 'working-tree').length;
|
|
20
|
+
return history.commits.some((commit) => commit.kind === 'working-tree')
|
|
21
|
+
? t('dashboard.git.commitCountWithWorkingTree', { commits: committedCount })
|
|
22
|
+
: t('dashboard.git.commitCount', { n: committedCount });
|
|
23
|
+
}
|
|
24
|
+
function commitLabel(commit, t) {
|
|
25
|
+
return commit.kind === 'working-tree'
|
|
26
|
+
? t('dashboard.git.workingTree')
|
|
27
|
+
: shortCommit(commit.sha);
|
|
28
|
+
}
|
|
29
|
+
function readyFiles(value) {
|
|
30
|
+
return value?.files ?? [];
|
|
31
|
+
}
|
|
32
|
+
/** Empty-state copy per honest unavailable reason; one definition for both blocks. */
|
|
33
|
+
const UNAVAILABLE_COPY = {
|
|
34
|
+
main: {
|
|
35
|
+
title: 'dashboard.git.mainUnavailableTitle',
|
|
36
|
+
description: 'dashboard.git.mainUnavailableDescription',
|
|
37
|
+
},
|
|
38
|
+
'baseline-unselected': {
|
|
39
|
+
title: 'dashboard.git.selectBaselineTitle',
|
|
40
|
+
description: 'dashboard.git.selectBaselineDescription',
|
|
41
|
+
},
|
|
42
|
+
'baseline-unknown': {
|
|
43
|
+
title: 'dashboard.git.baselineUnknownTitle',
|
|
44
|
+
description: 'dashboard.git.baselineUnknownDescription',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
function UnavailableNotice({ reason, t, }) {
|
|
48
|
+
return (_jsxs("div", { className: styles.gitUnavailable, "data-dashboard-git-unavailable": true, children: [_jsx("strong", { children: t(UNAVAILABLE_COPY[reason].title) }), _jsx("p", { children: t(UNAVAILABLE_COPY[reason].description) })] }));
|
|
49
|
+
}
|
|
50
|
+
/** Git & Changes tab: read-only, on-demand history -> target files -> one-file diff. */
|
|
51
|
+
export function WorktreeGitPanel({ manager, workspaceId, worktreeId, defaultBaselineBranch, currentBranch, capturedBaseline, onOpenFile, t, }) {
|
|
52
|
+
const isMain = isMainWorktreeId(worktreeId);
|
|
53
|
+
const selectedDefaultBaseline = normalizeBaselineBranch(defaultBaselineBranch, currentBranch);
|
|
54
|
+
const state = useWorktreeGitState({
|
|
55
|
+
manager,
|
|
56
|
+
workspaceId,
|
|
57
|
+
worktreeId,
|
|
58
|
+
defaultBaselineBranch: isMain ? undefined : selectedDefaultBaseline,
|
|
59
|
+
capturedBaseline: isMain ? false : capturedBaseline,
|
|
60
|
+
});
|
|
61
|
+
const gridRef = useRef(null);
|
|
62
|
+
// Both dividers share the grid: one splits rows, one splits columns, in either layout.
|
|
63
|
+
const rows = useGitPaneSplit({
|
|
64
|
+
containerRef: gridRef,
|
|
65
|
+
orientation: 'horizontal',
|
|
66
|
+
property: '--git-rows-top',
|
|
67
|
+
minimum: GIT_SPLIT_MIN_ROW_PX,
|
|
68
|
+
fallback: GIT_SPLIT_DEFAULT_ROW_PERCENT,
|
|
69
|
+
});
|
|
70
|
+
const columns = useGitPaneSplit({
|
|
71
|
+
containerRef: gridRef,
|
|
72
|
+
orientation: 'vertical',
|
|
73
|
+
property: '--git-columns-left',
|
|
74
|
+
minimum: GIT_SPLIT_MIN_COLUMN_PX,
|
|
75
|
+
fallback: GIT_SPLIT_DEFAULT_COLUMN_PERCENT,
|
|
76
|
+
});
|
|
77
|
+
const historyValue = state.history.status === 'ready' ? state.history.value : undefined;
|
|
78
|
+
const commit = selectedCommit(historyValue, state.selectedCommit);
|
|
79
|
+
const files = state.files.status === 'ready' ? readyFiles(state.files.value) : [];
|
|
80
|
+
const diff = state.diff.status === 'ready' ? state.diff.value : undefined;
|
|
81
|
+
const refreshing = state.history.status === 'ready' && state.history.refreshing === true;
|
|
82
|
+
const unavailable = historyValue?.unavailableReason;
|
|
83
|
+
const branchOptions = (state.branches.status === 'ready' ? state.branches.value : [])
|
|
84
|
+
.filter((branch) => branch.name !== currentBranch);
|
|
85
|
+
const branchError = state.branches.status === 'error'
|
|
86
|
+
? state.branches.error
|
|
87
|
+
: state.branches.status === 'ready'
|
|
88
|
+
? state.branches.error
|
|
89
|
+
: undefined;
|
|
90
|
+
const baselineCommit = historyValue?.baseline?.commit;
|
|
91
|
+
const baselineRef = state.baselineBranch ?? historyValue?.baseline?.ref;
|
|
92
|
+
const targetLabel = state.view === 'summary'
|
|
93
|
+
? t('dashboard.git.baselineSummary')
|
|
94
|
+
: state.selectedCommits.length > 1
|
|
95
|
+
? t('dashboard.git.selectedCommitCount', { n: state.selectedCommits.length })
|
|
96
|
+
: commit === undefined
|
|
97
|
+
? undefined
|
|
98
|
+
: commitLabel(commit, t);
|
|
99
|
+
const hasTarget = state.view === 'summary' || commit !== undefined;
|
|
100
|
+
const lineTotals = state.files.status === 'ready' && hasTarget ? sumLineTotals(files) : undefined;
|
|
101
|
+
return (_jsxs("section", { className: styles.gitPanel, "data-dashboard-git-panel": true, children: [_jsxs("header", { className: styles.gitPanelHeader, children: [_jsxs("div", { className: styles.gitPanelHeading, children: [_jsx("h2", { children: t('dashboard.git.title') }), !isMain && (_jsxs("label", { className: styles.gitBaselineSelector, children: [_jsx("span", { children: t('dashboard.git.baselineSelector') }), _jsxs("select", { value: state.baselineBranch ?? '', "data-dashboard-git-baseline": true, disabled: state.branches.status === 'loading', onChange: (event) => state.selectBaselineBranch(event.currentTarget.value || undefined), children: [_jsx("option", { value: "", children: t('dashboard.git.selectBaseline') }), state.baselineBranch !== undefined && !branchOptions.some((branch) => branch.name === state.baselineBranch) && (_jsx("option", { value: state.baselineBranch, children: state.baselineBranch })), branchOptions.map((branch) => (_jsx("option", { value: branch.name, children: branch.name }, branch.name)))] })] })), baselineCommit !== undefined && (_jsxs("dl", { className: styles.gitBaselineFacts, children: [_jsxs("div", { children: [_jsx("dt", { children: t('dashboard.git.base') }), _jsxs("dd", { children: [baselineRef !== undefined ? (_jsxs(_Fragment, { children: [baselineRef, _jsxs("code", { children: ["@ ", shortCommit(baselineCommit)] })] })) : (_jsx("code", { children: shortCommit(baselineCommit) })), historyValue?.baseline?.source === 'derived' && (_jsx("span", { className: styles.gitDerived, children: t('dashboard.git.derived') }))] })] }), historyValue !== undefined && (_jsxs(_Fragment, { children: [_jsxs("div", { children: [_jsx("dt", { children: t('dashboard.git.head') }), _jsx("dd", { children: _jsx("code", { children: shortCommit(historyValue.headCommit) }) })] }), _jsxs("div", { children: [_jsx("dt", { children: t('dashboard.git.commits') }), _jsx("dd", { children: commitCountLabel(historyValue, t) })] }), historyValue.ahead !== undefined && historyValue.behind !== undefined && (_jsxs("div", { children: [_jsx("dt", { children: t('dashboard.aheadBehind') }), _jsx("dd", { children: _jsx(GitLineStats, { additions: historyValue.ahead, deletions: historyValue.behind, ariaLabel: t('dashboard.git.aheadBehindStats', {
|
|
102
|
+
ahead: historyValue.ahead,
|
|
103
|
+
behind: historyValue.behind,
|
|
104
|
+
}) }) })] }))] }))] }))] }), _jsx("button", { type: "button", className: styles.gitRefresh, "data-dashboard-git-refresh": true, disabled: isMain || refreshing || state.history.status === 'loading', "aria-busy": refreshing || state.history.status === 'loading', onClick: () => void state.refresh(), children: refreshing ? t('dashboard.git.refreshing') : t('dashboard.git.refresh') })] }), branchError !== undefined && (_jsxs("div", { className: styles.gitError, role: "alert", children: [_jsx("p", { children: t('dashboard.git.loadFailed', { reason: errorText(branchError, t) }) }), _jsx("button", { type: "button", onClick: () => void state.loadBranches(), children: t('dashboard.git.retry') })] })), isMain && _jsx(UnavailableNotice, { reason: "main", t: t }), !isMain && unavailable === 'baseline-unselected' && (_jsxs("div", { className: styles.gitBaselinePrompt, "data-dashboard-git-baseline-prompt": true, children: [_jsx("strong", { children: t('dashboard.git.selectBaselineTitle') }), _jsx("p", { children: t('dashboard.git.selectBaselineDescription') })] })), state.history.status === 'loading' && (_jsx("div", { className: styles.gitLoading, role: "status", children: t('dashboard.git.loading') })), state.history.status === 'error' && (_jsxs("div", { className: styles.gitError, role: "alert", children: [_jsx("p", { children: t('dashboard.git.loadFailed', { reason: errorText(state.history.error, t) }) }), _jsx("button", { type: "button", onClick: () => void state.refresh(), children: t('dashboard.git.retry') })] })), state.history.status === 'ready' && state.history.error !== undefined && (_jsxs("div", { className: styles.gitError, role: "alert", children: [_jsx("p", { children: t('dashboard.git.refreshFailed', { reason: errorText(state.history.error, t) }) }), _jsx("button", { type: "button", onClick: () => void state.refresh(), children: t('dashboard.git.retry') })] })), state.history.status === 'ready' && historyValue !== undefined && unavailable !== undefined && (_jsx(UnavailableNotice, { reason: unavailable, t: t })), state.history.status === 'ready' && historyValue !== undefined && unavailable === undefined && (_jsxs("div", { className: styles.gitColumns, ref: gridRef, children: [_jsxs("section", { className: styles.gitColumn, "data-dashboard-git-pane": "commits", "aria-label": t('dashboard.git.commits'), children: [_jsxs("div", { className: styles.gitColumnHeader, children: [_jsx("h3", { children: t('dashboard.git.commits') }), _jsxs("div", { className: styles.gitColumnHeaderControls, children: [historyValue.truncated && _jsx("span", { children: t('dashboard.git.truncatedHistory') }), _jsxs("label", { className: styles.gitCommitMultiSelect, title: t('dashboard.git.multiSelectCommitsDescription'), children: [_jsx("input", { type: "checkbox", role: "switch", "data-dashboard-git-multi-select": true, "aria-describedby": "dashboard-git-commit-selection-hint", checked: state.commitMultiSelect, onChange: (event) => state.setCommitMultiSelect(event.currentTarget.checked) }), _jsx("span", { className: styles.gitCommitMultiSelectTrack, "aria-hidden": "true", children: _jsx("span", { className: styles.gitCommitMultiSelectThumb }) }), _jsx("span", { className: styles.gitCommitMultiSelectLabel, children: t('dashboard.git.multiSelectCommits') })] })] })] }), _jsxs("button", { type: "button", className: styles.gitSummaryButton, "data-dashboard-git-summary": true, "aria-pressed": state.view === 'summary', onClick: state.selectSummary, children: [_jsx("span", { children: t('dashboard.git.baselineSummary') }), _jsx("small", { children: t('dashboard.git.baselineSummaryDescription') })] }), state.view === 'summary' && (_jsxs("label", { className: styles.gitSummaryToggle, "data-dashboard-git-include-working-tree": true, children: [_jsx("input", { type: "checkbox", checked: state.includeWorkingTree, disabled: state.files.status === 'loading', onChange: (event) => state.setIncludeWorkingTree(event.currentTarget.checked) }), _jsxs("span", { children: [_jsx("strong", { children: t('dashboard.git.includeWorkingTree') }), _jsx("small", { children: t('dashboard.git.includeWorkingTreeDescription') })] })] })), _jsx("span", { id: "dashboard-git-commit-selection-hint", className: styles.gitSrOnly, children: t('dashboard.git.commitSelectionHint') }), historyValue.commits.length === 0 && _jsx("div", { className: styles.gitEmpty, children: t('dashboard.git.noCommits') }), _jsx(GitCommitList, { commits: historyValue.commits, selectedCommit: state.selectedCommit, selectedCommits: state.selectedCommits, multiSelect: state.commitMultiSelect, onSelect: state.selectCommit, onToggle: state.toggleCommit, t: t })] }), _jsx(GitSplitter, { split: rows, orientation: "horizontal", axis: "rows", label: t('dashboard.git.resizeRows') }), _jsxs("section", { className: styles.gitColumn, "data-dashboard-git-pane": "changed-files", "aria-label": t('dashboard.git.changedFiles'), "aria-busy": state.files.status === 'loading', children: [_jsxs("div", { className: styles.gitColumnHeader, children: [_jsx("h3", { children: t('dashboard.git.changedFiles') }), _jsxs("div", { className: styles.gitColumnHeaderMeta, children: [targetLabel !== undefined && (state.selectedCommits.length > 1 || state.view === 'summary'
|
|
105
|
+
? _jsx("span", { children: targetLabel })
|
|
106
|
+
: _jsx("code", { children: targetLabel })), state.files.status === 'ready' && hasTarget && (lineTotals === undefined ? (_jsx("span", { className: styles.gitColumnHeaderUnknown, children: t('dashboard.unknown') })) : (_jsx(GitLineStats, { additions: lineTotals.additions, deletions: lineTotals.deletions, ariaLabel: t('dashboard.git.lineStats', {
|
|
107
|
+
additions: lineTotals.additions,
|
|
108
|
+
deletions: lineTotals.deletions,
|
|
109
|
+
}) })))] })] }), state.commitMultiSelect && state.selectedCommits.length > 0 && state.view === 'commits' && (_jsxs("div", { className: styles.gitSelectionToolbar, children: [_jsx("span", { children: t('dashboard.git.selectedCommitCount', { n: state.selectedCommits.length }) }), _jsx("button", { type: "button", onClick: state.clearCommitSelection, children: t('dashboard.git.clearCommitSelection') })] })), !hasTarget ? (_jsx("div", { className: styles.gitEmpty, children: t('dashboard.git.selectCommit') })) : state.files.status === 'loading' ? (_jsx("div", { className: styles.gitLoading, role: "status", children: state.view === 'summary' ? t('dashboard.git.loadingSummaryFiles') : t('dashboard.git.loadingFiles') })) : state.files.status === 'error' ? (_jsx("div", { className: styles.gitError, role: "alert", children: errorText(state.files.error, t) })) : (_jsxs(_Fragment, { children: [state.files.status === 'ready' && state.files.error !== undefined && (_jsx("div", { className: styles.gitError, role: "alert", children: errorText(state.files.error, t) })), state.files.status === 'ready' && state.files.value.truncated === true && (_jsx("div", { className: styles.gitEmpty, role: "status", "data-dashboard-git-files-truncated": true, children: t('dashboard.git.truncatedFiles') })), files.length === 0 && !(state.files.status === 'ready' && state.files.value.truncated === true) ? (_jsx("div", { className: styles.gitEmpty, children: state.view === 'summary'
|
|
110
|
+
? state.includeWorkingTree
|
|
111
|
+
? t('dashboard.git.noLiveBaselineChanges')
|
|
112
|
+
: t('dashboard.git.noBaselineChanges')
|
|
113
|
+
: t('dashboard.git.noFiles') })) : (_jsx(GitChangedFiles, { files: files, selectedPath: state.selectedPath, onSelect: state.selectPath, t: t }))] }))] }), _jsx(GitSplitter, { split: columns, orientation: "vertical", axis: "columns", label: t('dashboard.git.resizeColumns') }), _jsxs("section", { className: styles.gitColumn, "data-dashboard-git-pane": "diff", "aria-label": t('dashboard.git.diff'), "aria-busy": state.diff.status === 'loading', children: [_jsxs("div", { className: styles.gitColumnHeader, children: [_jsx("h3", { children: state.view === 'summary' ? t('dashboard.git.summaryDiff') : t('dashboard.git.diff') }), state.selectedPath !== undefined && _jsx("code", { title: state.selectedPath, children: state.selectedPath })] }), state.diff.status === 'loading' ? (_jsx("div", { className: styles.gitLoading, role: "status", children: state.view === 'summary' ? t('dashboard.git.loadingSummaryDiff') : t('dashboard.git.loadingDiff') })) : state.diff.status === 'error' ? (_jsx("div", { className: styles.gitError, role: "alert", children: errorText(state.diff.error, t) })) : (_jsx(GitDiffView, { diff: diff, onOpenFile: onOpenFile, t: t }))] })] }))] }));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Draggable divider that resizes one axis of the Git grid. The wide layout puts
|
|
117
|
+
* the row divider inside the left column and the column divider beside it; the
|
|
118
|
+
* narrow layout keeps both, between the top panes and above the diff.
|
|
119
|
+
*/
|
|
120
|
+
function GitSplitter({ split, orientation, axis, label }) {
|
|
121
|
+
return (_jsx("div", { className: styles.gitColumnSplitter, "data-dashboard-git-splitter": axis, "data-dashboard-git-splitting": split.dragging ? 'true' : undefined, role: "separator", "aria-orientation": orientation, "aria-label": label, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(split.percent), title: label, tabIndex: 0, ref: split.splitterRef, onPointerDown: split.startDrag, onPointerMove: split.drag, onPointerUp: split.endDrag, onPointerCancel: split.endDrag, onLostPointerCapture: split.endDrag, onDoubleClick: split.reset, onKeyDown: split.onKeyDown }));
|
|
122
|
+
}
|
|
123
|
+
function errorText(error, t) {
|
|
124
|
+
return error.message || t('dashboard.unknownError');
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=WorktreeGitPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeGitPanel.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/WorktreeGitPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-address.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/file-address.ts"],"names":[],"mappings":"AAaA,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical DSH session file address constructor.
|
|
3
|
+
* Equivalent to `sessionFileAddress` from `@deepseek-ai/dsh-util-workspace-path`.
|
|
4
|
+
* Address grammar: `dsh-resource://file/session/<sessionId>/<encodedPath>`
|
|
5
|
+
*/
|
|
6
|
+
function encodeSegment(segment) {
|
|
7
|
+
return encodeURIComponent(segment).replace(/%3A/gi, ':');
|
|
8
|
+
}
|
|
9
|
+
function encodePath(path) {
|
|
10
|
+
return path.split('/').map(encodeSegment).join('/');
|
|
11
|
+
}
|
|
12
|
+
export function buildSessionFileAddress(sessionId, path) {
|
|
13
|
+
const normalized = path.replace(/\\/g, '/').replace(/^(?:\.\/)+/, '');
|
|
14
|
+
return `dsh-resource://file/session/${encodeSegment(sessionId)}/${encodePath(normalized)}`;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=file-address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-address.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/file-address.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAE,IAAY;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,+BAA+B,aAAa,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry for the two draggable Git dividers. Each divider splits one grid axis
|
|
3
|
+
* of the panel into a leading pane, the divider itself, and a trailing pane.
|
|
4
|
+
* These helpers stay free of DOM and React APIs so the drag math is testable.
|
|
5
|
+
*/
|
|
6
|
+
/** Share of the stacked axis, in percent, given to the commits pane by default. */
|
|
7
|
+
export declare const GIT_SPLIT_DEFAULT_ROW_PERCENT = 45;
|
|
8
|
+
/** Share of the side-by-side axis, in percent, given to the left column by default. */
|
|
9
|
+
export declare const GIT_SPLIT_DEFAULT_COLUMN_PERCENT = 38;
|
|
10
|
+
/** Smallest rendered height, in CSS pixels, kept usable for a stacked pane. */
|
|
11
|
+
export declare const GIT_SPLIT_MIN_ROW_PX = 140;
|
|
12
|
+
/** Smallest rendered width, in CSS pixels, kept usable for a side-by-side pane. */
|
|
13
|
+
export declare const GIT_SPLIT_MIN_COLUMN_PX = 240;
|
|
14
|
+
/** Percentage points moved by one arrow-key press (Shift multiplies the step). */
|
|
15
|
+
export declare const GIT_SPLIT_KEY_STEP = 4;
|
|
16
|
+
/** Rendered box of the grid one divider splits, measured once per interaction. */
|
|
17
|
+
export interface GitSplitGeometry {
|
|
18
|
+
/** Viewport-relative leading edge: the top for row splits, the left for column splits. */
|
|
19
|
+
readonly start: number;
|
|
20
|
+
/** Rendered container size along the split axis, in CSS pixels. */
|
|
21
|
+
readonly size: number;
|
|
22
|
+
/** Rendered divider thickness, in CSS pixels. */
|
|
23
|
+
readonly divider: number;
|
|
24
|
+
/** Smallest pane size along the split axis, in CSS pixels. */
|
|
25
|
+
readonly minimum: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clamp a leading-pane share to the range that keeps both panes usable, or
|
|
29
|
+
* undefined when the measured geometry cannot express a usable split at all.
|
|
30
|
+
*/
|
|
31
|
+
export declare function clampGitSplitPercent(percent: number, geometry: GitSplitGeometry): number | undefined;
|
|
32
|
+
/** Resolve the share that keeps the divider centered under a pointer. */
|
|
33
|
+
export declare function gitSplitPercentFromPointer(pointer: number, geometry: GitSplitGeometry): number | undefined;
|
|
34
|
+
//# sourceMappingURL=git-column-split.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-column-split.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-column-split.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mFAAmF;AACnF,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,uFAAuF;AACvF,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,mFAAmF;AACnF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,GACzB,MAAM,GAAG,SAAS,CAQpB;AAED,yEAAyE;AACzE,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,GACzB,MAAM,GAAG,SAAS,CAIpB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry for the two draggable Git dividers. Each divider splits one grid axis
|
|
3
|
+
* of the panel into a leading pane, the divider itself, and a trailing pane.
|
|
4
|
+
* These helpers stay free of DOM and React APIs so the drag math is testable.
|
|
5
|
+
*/
|
|
6
|
+
/** Share of the stacked axis, in percent, given to the commits pane by default. */
|
|
7
|
+
export const GIT_SPLIT_DEFAULT_ROW_PERCENT = 45;
|
|
8
|
+
/** Share of the side-by-side axis, in percent, given to the left column by default. */
|
|
9
|
+
export const GIT_SPLIT_DEFAULT_COLUMN_PERCENT = 38;
|
|
10
|
+
/** Smallest rendered height, in CSS pixels, kept usable for a stacked pane. */
|
|
11
|
+
export const GIT_SPLIT_MIN_ROW_PX = 140;
|
|
12
|
+
/** Smallest rendered width, in CSS pixels, kept usable for a side-by-side pane. */
|
|
13
|
+
export const GIT_SPLIT_MIN_COLUMN_PX = 240;
|
|
14
|
+
/** Percentage points moved by one arrow-key press (Shift multiplies the step). */
|
|
15
|
+
export const GIT_SPLIT_KEY_STEP = 4;
|
|
16
|
+
function roundPercent(percent) {
|
|
17
|
+
return Math.round(percent * 100) / 100;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Clamp a leading-pane share to the range that keeps both panes usable, or
|
|
21
|
+
* undefined when the measured geometry cannot express a usable split at all.
|
|
22
|
+
*/
|
|
23
|
+
export function clampGitSplitPercent(percent, geometry) {
|
|
24
|
+
if (!Number.isFinite(percent))
|
|
25
|
+
return undefined;
|
|
26
|
+
const { size, divider, minimum } = geometry;
|
|
27
|
+
if (!Number.isFinite(size) || size <= 0)
|
|
28
|
+
return undefined;
|
|
29
|
+
const lower = (minimum / size) * 100;
|
|
30
|
+
const upper = 100 - ((minimum + Math.max(divider, 0)) / size) * 100;
|
|
31
|
+
if (upper <= lower)
|
|
32
|
+
return undefined;
|
|
33
|
+
return roundPercent(Math.min(Math.max(percent, lower), upper));
|
|
34
|
+
}
|
|
35
|
+
/** Resolve the share that keeps the divider centered under a pointer. */
|
|
36
|
+
export function gitSplitPercentFromPointer(pointer, geometry) {
|
|
37
|
+
const halfDivider = Math.max(geometry.divider, 0) / 2;
|
|
38
|
+
const leadingPx = pointer - geometry.start - halfDivider;
|
|
39
|
+
return clampGitSplitPercent((leadingPx / geometry.size) * 100, geometry);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=git-column-split.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-column-split.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-column-split.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEhD,uFAAuF;AACvF,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAExC,mFAAmF;AACnF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAcpC,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,QAA0B;IAE1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IACpE,IAAI,KAAK,IAAI,KAAK;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,0BAA0B,CACxC,OAAe,EACf,QAA0B;IAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC;IACzD,OAAO,oBAAoB,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface DiffHunk {
|
|
2
|
+
readonly oldStart: number;
|
|
3
|
+
readonly oldLines: number;
|
|
4
|
+
readonly newStart: number;
|
|
5
|
+
readonly newLines: number;
|
|
6
|
+
readonly lines: readonly DiffLine[];
|
|
7
|
+
}
|
|
8
|
+
export type DiffLine = {
|
|
9
|
+
readonly type: 'context';
|
|
10
|
+
readonly oldLine: number;
|
|
11
|
+
readonly newLine: number;
|
|
12
|
+
readonly text: string;
|
|
13
|
+
} | {
|
|
14
|
+
readonly type: 'add';
|
|
15
|
+
readonly newLine: number;
|
|
16
|
+
readonly text: string;
|
|
17
|
+
} | {
|
|
18
|
+
readonly type: 'delete';
|
|
19
|
+
readonly oldLine: number;
|
|
20
|
+
readonly text: string;
|
|
21
|
+
};
|
|
22
|
+
/** Parse only the small unified-diff subset needed by the V1 plain-text renderer. */
|
|
23
|
+
export declare function parseUnifiedDiff(patch: string): readonly DiffHunk[];
|
|
24
|
+
//# sourceMappingURL=git-diff-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff-parser.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-diff-parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;CACrC;AAED,MAAM,MAAM,QAAQ,GAChB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAIN,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,CA0DnE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const HUNK_HEADER = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/u;
|
|
2
|
+
/** Parse only the small unified-diff subset needed by the V1 plain-text renderer. */
|
|
3
|
+
export function parseUnifiedDiff(patch) {
|
|
4
|
+
const hunks = [];
|
|
5
|
+
let current;
|
|
6
|
+
let oldLine = 0;
|
|
7
|
+
let newLine = 0;
|
|
8
|
+
const flush = () => {
|
|
9
|
+
if (current === undefined)
|
|
10
|
+
return;
|
|
11
|
+
hunks.push({
|
|
12
|
+
oldStart: current.oldStart,
|
|
13
|
+
oldLines: current.oldLines,
|
|
14
|
+
newStart: current.newStart,
|
|
15
|
+
newLines: current.newLines,
|
|
16
|
+
lines: current.lines,
|
|
17
|
+
});
|
|
18
|
+
current = undefined;
|
|
19
|
+
};
|
|
20
|
+
for (const rawLine of patch.split(/\r?\n/u)) {
|
|
21
|
+
const header = HUNK_HEADER.exec(rawLine);
|
|
22
|
+
if (header !== null) {
|
|
23
|
+
flush();
|
|
24
|
+
oldLine = Number(header[1]);
|
|
25
|
+
newLine = Number(header[3]);
|
|
26
|
+
current = {
|
|
27
|
+
oldStart: oldLine,
|
|
28
|
+
oldLines: Number(header[2] ?? '1'),
|
|
29
|
+
newStart: newLine,
|
|
30
|
+
newLines: Number(header[4] ?? '1'),
|
|
31
|
+
lines: [],
|
|
32
|
+
};
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (current === undefined || rawLine === '\')
|
|
36
|
+
continue;
|
|
37
|
+
const marker = rawLine[0];
|
|
38
|
+
const text = rawLine.slice(1);
|
|
39
|
+
if (marker === ' ') {
|
|
40
|
+
current.lines.push({ type: 'context', oldLine, newLine, text });
|
|
41
|
+
oldLine += 1;
|
|
42
|
+
newLine += 1;
|
|
43
|
+
}
|
|
44
|
+
else if (marker === '+') {
|
|
45
|
+
current.lines.push({ type: 'add', newLine, text });
|
|
46
|
+
newLine += 1;
|
|
47
|
+
}
|
|
48
|
+
else if (marker === '-') {
|
|
49
|
+
current.lines.push({ type: 'delete', oldLine, text });
|
|
50
|
+
oldLine += 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
flush();
|
|
54
|
+
return hunks;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=git-diff-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff-parser.js","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-diff-parser.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,GAAG,8CAA8C,CAAC;AAEnE,qFAAqF;AACrF,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,IAAI,OAQS,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAClC,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,OAAO,GAAG;gBACR,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBAClC,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBAClC,KAAK,EAAE,EAAE;aACV,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,8BAA8B;YAAE,SAAS;QAClF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC,CAAC;YACb,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { WorktreeGitChangedFile } from '../../../contract/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Shared Git-tab facts. These helpers stay free of React and DOM APIs so the
|
|
4
|
+
* Dashboard's branch, Main, and line-total rules have one definition.
|
|
5
|
+
*/
|
|
6
|
+
/** Main (Local) Worktree ids never carry a Worktree-relative Git comparison. */
|
|
7
|
+
export declare function isMainWorktreeId(worktreeId: string): boolean;
|
|
8
|
+
/** Trim a branch value and drop empty strings. */
|
|
9
|
+
export declare function normalizeBranch(branch: string | undefined): string | undefined;
|
|
10
|
+
/** A baseline equal to the current Worktree branch is not a usable default. */
|
|
11
|
+
export declare function normalizeBaselineBranch(value: string | undefined, currentBranch: string | undefined): string | undefined;
|
|
12
|
+
export interface GitLineTotals {
|
|
13
|
+
readonly additions: number;
|
|
14
|
+
readonly deletions: number;
|
|
15
|
+
}
|
|
16
|
+
/** Sum additions/deletions, or undefined when any file count is unknown. */
|
|
17
|
+
export declare function sumLineTotals(files: readonly WorktreeGitChangedFile[]): GitLineTotals | undefined;
|
|
18
|
+
//# sourceMappingURL=git-facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-facts.d.ts","sourceRoot":"","sources":["../../../../src/client/dashboard/git/git-facts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE;;;GAGG;AAEH,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG9E;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAGpB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,GAAG,aAAa,GAAG,SAAS,CASjG"}
|