dsh-git-worktree 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/NOTICE +14 -0
- package/README.en.md +74 -286
- package/README.md +78 -307
- package/cordis.patch.yml +7 -3
- package/lib/client/WorktreeReviewRow.d.ts +1 -1
- package/lib/client/WorktreeReviewRow.js +8 -0
- package/lib/client/WorktreeReviewRow.js.map +1 -1
- package/lib/client/console-remote/adapter.js +1 -0
- package/lib/client/console-remote/adapter.js.map +1 -1
- package/lib/client/index.d.ts +1 -1
- package/lib/client/index.js +3 -1
- package/lib/client/index.js.map +1 -1
- package/lib/client/pre-session/controller.js +9 -0
- package/lib/client/pre-session/controller.js.map +1 -1
- package/lib/client/review-console/ReviewActions.js +14 -12
- package/lib/client/review-console/ReviewActions.js.map +1 -1
- package/lib/client/styles.js +61 -0
- package/lib/client/styles.js.map +1 -1
- package/lib/client/target-console/TargetStatusAction.js +2 -2
- package/lib/client/target-console/TargetStatusAction.js.map +1 -1
- package/lib/client/target-console/WorktreeReviewStatus.js +6 -6
- package/lib/client/target-console/WorktreeReviewStatus.js.map +1 -1
- package/lib/client/workspace-sidebar/index.d.ts +33 -0
- package/lib/client/workspace-sidebar/index.js +127 -0
- package/lib/client/workspace-sidebar/index.js.map +1 -0
- package/lib/client/workspace-sidebar/model.d.ts +37 -0
- package/lib/client/workspace-sidebar/model.js +88 -0
- package/lib/client/workspace-sidebar/model.js.map +1 -0
- package/lib/client.js +2885 -25
- package/lib/console-contract.d.ts +19 -0
- package/lib/console-contract.js.map +1 -1
- package/lib/console-host/control-plane.d.ts +2 -1
- package/lib/console-host/control-plane.js +53 -1
- package/lib/console-host/control-plane.js.map +1 -1
- package/lib/console-host/service.d.ts +2 -1
- package/lib/console-host/service.js +6 -0
- package/lib/console-host/service.js.map +1 -1
- package/lib/console-remote/descriptors.js +4 -3
- package/lib/console-remote/descriptors.js.map +1 -1
- package/lib/console-remote/remote.d.ts +2 -1
- package/lib/console-remote/remote.js.map +1 -1
- package/lib/console-remote/schemas.d.ts +2 -1
- package/lib/console-remote/schemas.js +14 -0
- package/lib/console-remote/schemas.js.map +1 -1
- package/lib/session-checkout-module.js +7 -3
- package/lib/session-checkout-module.js.map +1 -1
- package/lib/tools.js +1 -1
- package/lib/tools.js.map +1 -1
- package/package.json +10 -2
- package/scripts/check-publish.mjs +17 -2
- package/scripts/check-workspace-sidebar-version.mjs +14 -0
- package/scripts/dev-dsh-lib.mjs +1 -1
- package/scripts/workspace-sidebar-upstream.d.mts +8 -0
- package/scripts/workspace-sidebar-upstream.mjs +160 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { apply as applyOfficialWorkspace } from 'virtual:dsh-official-workspace-client';
|
|
4
|
+
import { WORKTREE_REVIEW_REFRESH_EVENT } from '../review-console/status-events.js';
|
|
5
|
+
import { projectManagedWorkspaceSidebar } from './model.js';
|
|
6
|
+
const EMPTY_TOPOLOGY = { projects: [] };
|
|
7
|
+
/**
|
|
8
|
+
* Preserve the complete official Workspace Browser and change only its data
|
|
9
|
+
* projection plus mutations that are unsafe for one-to-one Managed owners.
|
|
10
|
+
*/
|
|
11
|
+
export function ManagedOfficialWorkspaceBrowser({ adapter, OfficialBrowser, ...officialProps }) {
|
|
12
|
+
const props = officialProps;
|
|
13
|
+
const workspaceState = props.useWorkspaces((state) => state);
|
|
14
|
+
const sessionState = props.useSessions((state) => state);
|
|
15
|
+
const [topology, setTopology] = useState(EMPTY_TOPOLOGY);
|
|
16
|
+
const workspaceKey = workspaceState.items
|
|
17
|
+
.map(workspace => `${workspace.workspaceId}:${workspace.sessionIds.join(',')}`)
|
|
18
|
+
.join('|');
|
|
19
|
+
const sessionKey = sessionState.ids.join('|');
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
let active = true;
|
|
22
|
+
const refresh = () => {
|
|
23
|
+
void adapter.sidebarTopology().then(outcome => {
|
|
24
|
+
if (!active)
|
|
25
|
+
return;
|
|
26
|
+
setTopology(outcome.ok ? outcome.value : EMPTY_TOPOLOGY);
|
|
27
|
+
}, () => {
|
|
28
|
+
if (active)
|
|
29
|
+
setTopology(EMPTY_TOPOLOGY);
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
refresh();
|
|
33
|
+
window.addEventListener(WORKTREE_REVIEW_REFRESH_EVENT, refresh);
|
|
34
|
+
return () => {
|
|
35
|
+
active = false;
|
|
36
|
+
window.removeEventListener(WORKTREE_REVIEW_REFRESH_EVENT, refresh);
|
|
37
|
+
};
|
|
38
|
+
}, [adapter, sessionKey, workspaceKey]);
|
|
39
|
+
const projection = useMemo(() => projectManagedWorkspaceSidebar({
|
|
40
|
+
workspaces: workspaceState.items,
|
|
41
|
+
sessions: sessionState.byId,
|
|
42
|
+
topology,
|
|
43
|
+
}), [sessionState.byId, topology, workspaceState.items]);
|
|
44
|
+
const projectedWorkspaceState = useMemo(() => ({
|
|
45
|
+
...workspaceState,
|
|
46
|
+
items: projection.workspaces.map(workspace => projection.protectedWorkspaceIds.has(workspace.workspaceId)
|
|
47
|
+
? { ...workspace, __dshGitWorktreeProtected: true }
|
|
48
|
+
: workspace),
|
|
49
|
+
}), [projection.protectedWorkspaceIds, projection.workspaces, workspaceState]);
|
|
50
|
+
const projectedSessionState = useMemo(() => {
|
|
51
|
+
const byId = { ...sessionState.byId };
|
|
52
|
+
for (const sessionId of projection.suppressedSessionIds)
|
|
53
|
+
delete byId[sessionId];
|
|
54
|
+
for (const [sessionId, task] of Object.entries(projection.managedBySessionId)) {
|
|
55
|
+
const summary = byId[sessionId];
|
|
56
|
+
if (!summary || !task)
|
|
57
|
+
continue;
|
|
58
|
+
byId[sessionId] = {
|
|
59
|
+
...summary,
|
|
60
|
+
// Keep the canonical title untouched. The official derivative renders
|
|
61
|
+
// this metadata as a fixed icon/badge before the truncating title.
|
|
62
|
+
__dshGitWorktree: {
|
|
63
|
+
kind: 'managed-worktree',
|
|
64
|
+
state: task.state,
|
|
65
|
+
label: task.label,
|
|
66
|
+
originalTitle: summary.displayTitle,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
...sessionState,
|
|
72
|
+
ids: sessionState.ids.filter(sessionId => !projection.suppressedSessionIds.has(sessionId)),
|
|
73
|
+
byId,
|
|
74
|
+
};
|
|
75
|
+
}, [projection.managedBySessionId, projection.suppressedSessionIds, sessionState]);
|
|
76
|
+
const useProjectedWorkspaces = ((selector) => selector(projectedWorkspaceState));
|
|
77
|
+
const useProjectedSessions = ((selector) => selector(projectedSessionState));
|
|
78
|
+
const protectedIds = projection.protectedSessionIds;
|
|
79
|
+
const protectedWorkspaceIds = projection.protectedWorkspaceIds;
|
|
80
|
+
return _jsx(OfficialBrowser, { ...props, useWorkspaces: useProjectedWorkspaces, useSessions: useProjectedSessions, startSession: async (workspaceId) => {
|
|
81
|
+
if (protectedWorkspaceIds.has(workspaceId))
|
|
82
|
+
return;
|
|
83
|
+
await props.startSession(workspaceId);
|
|
84
|
+
}, forkSession: (sessionId) => {
|
|
85
|
+
if (protectedIds.has(sessionId))
|
|
86
|
+
return;
|
|
87
|
+
props.forkSession(sessionId);
|
|
88
|
+
}, insertSessionBefore: async (workspaceId, sessionId, beforeSessionId) => {
|
|
89
|
+
if (protectedWorkspaceIds.has(workspaceId)
|
|
90
|
+
|| protectedIds.has(sessionId)
|
|
91
|
+
|| (beforeSessionId !== undefined && protectedIds.has(beforeSessionId)))
|
|
92
|
+
return;
|
|
93
|
+
await props.insertSessionBefore(workspaceId, sessionId, beforeSessionId);
|
|
94
|
+
} });
|
|
95
|
+
}
|
|
96
|
+
function officialContextProxy(ctx, adapter) {
|
|
97
|
+
const proxySlots = new Proxy(ctx.slots, {
|
|
98
|
+
get(target, key, receiver) {
|
|
99
|
+
if (key === 'register') {
|
|
100
|
+
return (descriptor, component) => {
|
|
101
|
+
if (descriptor.name !== 'sidebar.workspaces')
|
|
102
|
+
return target.register(descriptor, component);
|
|
103
|
+
const OfficialBrowser = component;
|
|
104
|
+
const Browser = (props) => _jsx(ManagedOfficialWorkspaceBrowser, { ...props, adapter: adapter, OfficialBrowser: OfficialBrowser });
|
|
105
|
+
return target.register(descriptor, Browser);
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return Reflect.get(target, key, receiver);
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
return new Proxy(ctx, {
|
|
112
|
+
get(target, key, receiver) {
|
|
113
|
+
if (key === 'slots')
|
|
114
|
+
return proxySlots;
|
|
115
|
+
return Reflect.get(target, key, receiver);
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Apply the version- and hash-gated official Workspace Client exactly once,
|
|
121
|
+
* replacing only its Browser component while preserving its declaration tree,
|
|
122
|
+
* locale, picker, stores, and directory-flow authorization.
|
|
123
|
+
*/
|
|
124
|
+
export function registerManagedWorkspaceSidebar(ctx, adapter) {
|
|
125
|
+
applyOfficialWorkspace(officialContextProxy(ctx, adapter));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/workspace-sidebar/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { WorktreeSidebarTask, WorktreeSidebarTopologyResponse } from '../../console-contract.js';
|
|
2
|
+
export interface SidebarWorkspaceView {
|
|
3
|
+
workspaceId: string;
|
|
4
|
+
title: string;
|
|
5
|
+
path: string;
|
|
6
|
+
sessionIds: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export interface SidebarSessionSummary {
|
|
9
|
+
id: string;
|
|
10
|
+
displayTitle: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
cwd?: string;
|
|
13
|
+
updatedAt?: number;
|
|
14
|
+
blank?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ProjectedManagedTask extends WorktreeSidebarTask {
|
|
17
|
+
projectId: string;
|
|
18
|
+
projectName: string;
|
|
19
|
+
label: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ManagedWorkspaceSidebarProjection {
|
|
22
|
+
workspaces: SidebarWorkspaceView[];
|
|
23
|
+
managedBySessionId: Record<string, ProjectedManagedTask | undefined>;
|
|
24
|
+
protectedSessionIds: ReadonlySet<string>;
|
|
25
|
+
protectedWorkspaceIds: ReadonlySet<string>;
|
|
26
|
+
suppressedSessionIds: ReadonlySet<string>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Merge one owner Session per Managed Checkout into the original Local project.
|
|
30
|
+
* Ambiguous Workspace membership fails open: the official Workspace rows remain
|
|
31
|
+
* visible rather than hiding a Session the projection cannot prove safe.
|
|
32
|
+
*/
|
|
33
|
+
export declare function projectManagedWorkspaceSidebar(input: {
|
|
34
|
+
workspaces: readonly SidebarWorkspaceView[];
|
|
35
|
+
sessions: Readonly<Record<string, SidebarSessionSummary | undefined>>;
|
|
36
|
+
topology: WorktreeSidebarTopologyResponse;
|
|
37
|
+
}): ManagedWorkspaceSidebarProjection;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
const STATE_LABELS = {
|
|
2
|
+
working: '进行中',
|
|
3
|
+
ready_for_review: '待验收',
|
|
4
|
+
preview_active: '预览中',
|
|
5
|
+
preview_detached: '待恢复',
|
|
6
|
+
recovery_required: '需要恢复',
|
|
7
|
+
finalized: '已完成',
|
|
8
|
+
discarded: '已放弃',
|
|
9
|
+
};
|
|
10
|
+
function currentTasks(topology) {
|
|
11
|
+
const byOwner = new Map();
|
|
12
|
+
for (const project of topology.projects) {
|
|
13
|
+
if (!project?.project?.id || !project.project.name || !Array.isArray(project.tasks))
|
|
14
|
+
continue;
|
|
15
|
+
for (const task of project.tasks) {
|
|
16
|
+
if (!task?.checkoutId || !task.ownerSessionId || !task.sourceSessionId)
|
|
17
|
+
continue;
|
|
18
|
+
const projected = {
|
|
19
|
+
...task,
|
|
20
|
+
projectId: project.project.id,
|
|
21
|
+
projectName: project.project.name,
|
|
22
|
+
label: STATE_LABELS[task.state] ?? '进行中',
|
|
23
|
+
};
|
|
24
|
+
const previous = byOwner.get(task.ownerSessionId);
|
|
25
|
+
if (!previous
|
|
26
|
+
|| task.iteration > previous.iteration
|
|
27
|
+
|| (task.iteration === previous.iteration && task.revision > previous.revision)) {
|
|
28
|
+
byOwner.set(task.ownerSessionId, projected);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return [...byOwner.values()];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Merge one owner Session per Managed Checkout into the original Local project.
|
|
36
|
+
* Ambiguous Workspace membership fails open: the official Workspace rows remain
|
|
37
|
+
* visible rather than hiding a Session the projection cannot prove safe.
|
|
38
|
+
*/
|
|
39
|
+
export function projectManagedWorkspaceSidebar(input) {
|
|
40
|
+
const tasks = currentTasks(input.topology);
|
|
41
|
+
const protectedSessionIds = new Set(tasks.map(task => task.ownerSessionId));
|
|
42
|
+
const projected = input.workspaces.map(workspace => ({ ...workspace, sessionIds: [...workspace.sessionIds] }));
|
|
43
|
+
const byWorkspace = new Map(projected.map(workspace => [workspace.workspaceId, workspace]));
|
|
44
|
+
const hiddenWorkspaceIds = new Set();
|
|
45
|
+
const protectedWorkspaceIds = new Set();
|
|
46
|
+
const suppressedSessionIds = new Set();
|
|
47
|
+
const managedBySessionId = {};
|
|
48
|
+
for (const task of tasks) {
|
|
49
|
+
const local = byWorkspace.get(task.projectId);
|
|
50
|
+
const owner = input.sessions[task.ownerSessionId];
|
|
51
|
+
if (!local || !owner)
|
|
52
|
+
continue;
|
|
53
|
+
const memberships = projected.filter(workspace => workspace.sessionIds.includes(task.ownerSessionId));
|
|
54
|
+
if (memberships.length === 0) {
|
|
55
|
+
local.sessionIds = [...local.sessionIds, task.ownerSessionId];
|
|
56
|
+
managedBySessionId[task.ownerSessionId] = task;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (memberships.length !== 1)
|
|
60
|
+
continue;
|
|
61
|
+
const managed = memberships[0];
|
|
62
|
+
if (managed.workspaceId !== local.workspaceId)
|
|
63
|
+
protectedWorkspaceIds.add(managed.workspaceId);
|
|
64
|
+
if (managed.workspaceId === local.workspaceId) {
|
|
65
|
+
managedBySessionId[task.ownerSessionId] = task;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const visibleMembers = managed.sessionIds.filter(sessionId => input.sessions[sessionId] !== undefined);
|
|
69
|
+
const extraMembers = visibleMembers.filter(sessionId => sessionId !== task.ownerSessionId);
|
|
70
|
+
if (extraMembers.some(sessionId => input.sessions[sessionId]?.blank !== true))
|
|
71
|
+
continue;
|
|
72
|
+
for (const sessionId of extraMembers)
|
|
73
|
+
suppressedSessionIds.add(sessionId);
|
|
74
|
+
if (!local.sessionIds.includes(task.ownerSessionId)) {
|
|
75
|
+
local.sessionIds = [...local.sessionIds, task.ownerSessionId];
|
|
76
|
+
}
|
|
77
|
+
hiddenWorkspaceIds.add(managed.workspaceId);
|
|
78
|
+
managedBySessionId[task.ownerSessionId] = task;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
workspaces: projected.filter(workspace => !hiddenWorkspaceIds.has(workspace.workspaceId)),
|
|
82
|
+
managedBySessionId,
|
|
83
|
+
protectedSessionIds,
|
|
84
|
+
protectedWorkspaceIds,
|
|
85
|
+
suppressedSessionIds,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/client/workspace-sidebar/model.ts"],"names":[],"mappings":"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"}
|