返回 DeepSeek-Reasonix
worktreeMergeMock.ts
根目录 / desktop / frontend / src / lib / worktreeMergeMock.ts
1 import type {
2 CloseMergedWorktreeTabRequest,
3 TabMeta,
4 WorktreeCleanupRequest,
5 WorktreeMergeRequest,
6 } from "./types";
7
8 export function makeMockWorktreeMergeBindings(
9 readTabs: () => TabMeta[],
10 writeTabs: (tabs: TabMeta[]) => void,
11 ) {
12 return {
13 async RegisterNavigationIntent(_token: string) {},
14 async InspectWorktreeMerge(tabID: string) {
15 const tabs = readTabs();
16 const tab = tabs.find((candidate) => candidate.id === tabID) ?? tabs.find((candidate) => candidate.active);
17 return {
18 available: true,
19 canMerge: true,
20 alreadyMerged: false,
21 worktreeRoot: tab?.workspaceRoot || "/mock/worktree",
22 sourceRoot: "/mock/source",
23 worktreeBranch: tab?.gitBranch || "reasonix/fork-mock",
24 targetBranch: "main",
25 createdHead: "mock-created-head",
26 worktreeHead: "mock-worktree-head",
27 worktreeStateToken: "mock-worktree-state-token",
28 targetHead: "mock-target-head",
29 aheadCount: 2,
30 behindCount: 0,
31 filesChanged: 1,
32 insertions: 15,
33 deletions: 3,
34 changedFiles: ["feature.ts"],
35 hasConflicts: false,
36 conflictFiles: [],
37 worktreeDirty: false,
38 sourceDirty: false,
39 blockers: [],
40 cleanupBlockers: [{ code: "not_merged", message: "Worktree is not merged yet", paths: [] }],
41 };
42 },
43 async GetWorktreeStatus(tabID: string) {
44 return this.InspectWorktreeMerge(tabID);
45 },
46 async PrepareWorktreeMerge(tabID: string) {
47 return this.InspectWorktreeMerge(tabID);
48 },
49 async MergeWorktreeBack(request: WorktreeMergeRequest) {
50 const tabs = readTabs();
51 const tab = tabs.find((candidate) => candidate.id === request.tabId) ?? tabs.find((candidate) => candidate.active);
52 return {
53 merged: true,
54 alreadyMerged: false,
55 recoveryRequired: false,
56 sourceRoot: "/mock/source",
57 targetBranch: "main",
58 targetHead: "mock-commit-hash",
59 mergedCommit: "mock-commit-hash",
60 worktreeRoot: tab?.workspaceRoot || "/mock/worktree",
61 worktreeBranch: tab?.gitBranch || "reasonix/delivery-mock",
62 worktreeHead: "mock-worktree-head",
63 };
64 },
65 async CloseMergedWorktreeTab(request: CloseMergedWorktreeTabRequest) {
66 writeTabs(readTabs().filter((candidate) => candidate.id !== request.tabId));
67 return { closed: true, idempotent: false };
68 },
69 async FinalizeWorktreeMerge(request: WorktreeCleanupRequest) {
70 const tabs = readTabs().filter((candidate) => candidate.workspaceRoot !== request.worktreeRoot);
71 if (tabs.length > 0) tabs[0].active = true;
72 writeTabs(tabs);
73 const allocationRoot = request.worktreeRoot.replace(/[\\/][^\\/]+$/, "");
74 return {
75 completed: false,
76 worktreeRemoved: false,
77 branchDeleted: false,
78 recoveryRetained: true,
79 recoveryRoot: `${allocationRoot}/.reasonix-cleanup/recovery-mock`,
80 recoveryWorktreeRegistered: true,
81 branchRetained: true,
82 blockers: [],
83 };
84 },
85 };
86 }
87
87 lines TYPESCRIPT