feat: multi-project workspaces and project window groups (#448)

Workspaces open several local project folders in one IDE session (File › New / Open / Manage Workspace…, or Attach when opening a project, which creates a workspace automatically for a plain project window). Member folders are the Project view roots and take part in indexing, Find in Files, Git, language servers, run configurations and builds; agent tasks choose which member they work in. Window › Merge All Project Windows groups project windows into one window with project tabs (switch, reorder, close, move to a new window), restored on reopen.

Closes #241
Closes #198
Closes #286
Цей коміт міститься в:
l0ng-ai authored and GitHub committed 2026-10-30 22:45:42 +08:00
1 джерело 5bab140968
коміт 01defdefe4
88 files changed
+2689 -151

No files matched your search

+24
Переглянути файл
@@ -201,3 +201,27 @@ describe("project view context menu", () => {
expect(l).not.toContain("Find in Files…");
});
});
it("offers workspace removal for every member root", () => {
useProject.setState({
project: {
root: "/workspace",
name: "A",
settings: {},
isGit: false,
workspace: { version: 1, name: "A", projects: ["/a", "/b"] },
},
});
const removal = {
kind: "action",
action: "workspace.removeProject",
arg: "/b",
};
expect(contextMenuItems([node("/b", true, true)])).toContainEqual(removal);
expect(contextMenuItems([node("/a", true, true)])).toContainEqual(
expect.objectContaining({ action: "workspace.removeProject" }),
);
expect(contextMenuItems([node("/b/src", true)])).not.toContainEqual(
expect.objectContaining({ action: "workspace.removeProject" }),
);
});