diff --git a/package-lock.json b/package-lock.json index 94ca858..5c27333 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7924,7 +7924,7 @@ }, "packages/server": { "name": "@johanleroy/git-arboretum", - "version": "2.0.0", + "version": "3.0.0", "license": "MIT", "dependencies": { "@fastify/cookie": "^11.0.0", @@ -8053,7 +8053,7 @@ }, "packages/vscode": { "name": "git-arboretum", - "version": "0.2.0", + "version": "0.3.0", "license": "MIT", "devDependencies": { "@arboretum/shared": "0.1.0", diff --git a/packages/server/package.json b/packages/server/package.json index 830a8d6..d96ac74 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@johanleroy/git-arboretum", - "version": "2.0.0", + "version": "3.0.0", "description": "Self-hosted web dashboard for git worktrees and the Claude Code sessions running on them", "license": "MIT", "type": "module", diff --git a/packages/vscode/CHANGELOG.md b/packages/vscode/CHANGELOG.md index aeed494..c4c79e8 100644 --- a/packages/vscode/CHANGELOG.md +++ b/packages/vscode/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 0.3.0 + +Aligns with the daemon's **multi-project IDE** milestone: the web UI is now a single IDE that holds all +your open projects at once (a unified project / worktree / session tree, a tabbed Monaco editor, and +Claude terminals docked at the bottom), and ships as a native desktop app too. The extension stays a +lightweight visual worktree manager (no editor duplicated here), and its deep-link now opens that IDE: + +- **Open Worktree IDE** now deep-links into the multi-project IDE (route `/workspace/:repoId/:wt`) and + focuses the chosen worktree in its unified tree. +- Worktree deep-link encoding unified with the web front through the shared `encodeWtKey` + (`@arboretum/shared`), so links resolve consistently on both sides. + ## 0.2.0 Follows the daemon's "worktree IDE" milestone (P7→P12), while keeping the extension a lightweight diff --git a/packages/vscode/README.md b/packages/vscode/README.md index 82f6457..f59a838 100644 --- a/packages/vscode/README.md +++ b/packages/vscode/README.md @@ -11,9 +11,9 @@ integration on top of the [Arboretum](https://git.lidge.fr/johanleroy/arboretum) input: answer **Yes/No** without even opening the terminal (uses the daemon's `answer` command). - **Git mutations** from the tree: create worktree, commit, push, fetch, pull, promote to main, with a **detailed git status** on each worktree (staged / unstaged / conflicts and the last commit subject). -- **Open Worktree IDE**: jump from any worktree to its full `/workspace` view (file tree, Monaco editor, - inline diffs, integrated terminal) in the browser. The extension stays a lightweight visual worktree - manager: the heavy editing lives in the web IDE. +- **Open Worktree IDE**: jump from any worktree into the multi-project IDE (unified project / worktree / + session tree, tabbed Monaco editor with inline diffs, docked terminals), in the browser or the native + desktop app. The extension stays a lightweight visual worktree manager: the heavy editing lives in the IDE. - **Workspace-aware**: the worktree matching your open folder is highlighted; start a session or create a worktree for the current folder in one command. diff --git a/packages/vscode/package.json b/packages/vscode/package.json index 88e647b..db5452f 100644 --- a/packages/vscode/package.json +++ b/packages/vscode/package.json @@ -2,7 +2,7 @@ "name": "git-arboretum", "displayName": "Arboretum", "description": "Pilot your git worktrees and Claude Code sessions from VS Code: native terminals, live tree, waiting alerts.", - "version": "0.2.0", + "version": "0.3.0", "private": true, "publisher": "johanleroy", "license": "MIT", @@ -85,77 +85,332 @@ } ], "commands": [ - { "command": "arboretum.signIn", "title": "Sign In", "category": "Arboretum" }, - { "command": "arboretum.signOut", "title": "Sign Out", "category": "Arboretum" }, - { "command": "arboretum.refresh", "title": "Refresh", "category": "Arboretum", "icon": "$(refresh)" }, - { "command": "arboretum.openDashboard", "title": "Open Dashboard in Browser", "category": "Arboretum", "icon": "$(globe)" }, - { "command": "arboretum.attachSession", "title": "Attach Terminal", "category": "Arboretum", "icon": "$(terminal)" }, - { "command": "arboretum.observeSession", "title": "Observe Terminal (read-only)", "category": "Arboretum", "icon": "$(eye)" }, - { "command": "arboretum.answerSession", "title": "Answer Prompt…", "category": "Arboretum", "icon": "$(comment-discussion)" }, - { "command": "arboretum.killSession", "title": "Kill Session", "category": "Arboretum", "icon": "$(trash)" }, - { "command": "arboretum.hideSession", "title": "Hide Session", "category": "Arboretum", "icon": "$(eye-closed)" }, - { "command": "arboretum.resumeSession", "title": "Resume Session", "category": "Arboretum", "icon": "$(debug-restart)" }, - { "command": "arboretum.forkSession", "title": "Fork Session", "category": "Arboretum", "icon": "$(git-branch)" }, - { "command": "arboretum.createWorktree", "title": "Create Worktree…", "category": "Arboretum", "icon": "$(add)" }, - { "command": "arboretum.commitWorktree", "title": "Commit…", "category": "Arboretum", "icon": "$(git-commit)" }, - { "command": "arboretum.pushWorktree", "title": "Push", "category": "Arboretum", "icon": "$(repo-push)" }, - { "command": "arboretum.fetchWorktree", "title": "Fetch", "category": "Arboretum", "icon": "$(cloud-download)" }, - { "command": "arboretum.pullWorktree", "title": "Pull…", "category": "Arboretum", "icon": "$(arrow-down)" }, - { "command": "arboretum.promoteWorktree", "title": "Promote to Main", "category": "Arboretum", "icon": "$(arrow-up)" }, - { "command": "arboretum.openWorktreeIde", "title": "Open Worktree IDE", "category": "Arboretum", "icon": "$(link-external)" }, - { "command": "arboretum.startSession", "title": "Start Claude Session", "category": "Arboretum", "icon": "$(play)" }, - { "command": "arboretum.startGroupSession", "title": "Start Group Session…", "category": "Arboretum", "icon": "$(play)" }, - { "command": "arboretum.startSessionHere", "title": "Start Session in Current Folder", "category": "Arboretum" }, - { "command": "arboretum.createWorktreeHere", "title": "Create Worktree for Current Folder…", "category": "Arboretum" }, - { "command": "arboretum.revealWorktree", "title": "Reveal Worktree for Current Folder", "category": "Arboretum" } + { + "command": "arboretum.signIn", + "title": "Sign In", + "category": "Arboretum" + }, + { + "command": "arboretum.signOut", + "title": "Sign Out", + "category": "Arboretum" + }, + { + "command": "arboretum.refresh", + "title": "Refresh", + "category": "Arboretum", + "icon": "$(refresh)" + }, + { + "command": "arboretum.openDashboard", + "title": "Open Dashboard in Browser", + "category": "Arboretum", + "icon": "$(globe)" + }, + { + "command": "arboretum.attachSession", + "title": "Attach Terminal", + "category": "Arboretum", + "icon": "$(terminal)" + }, + { + "command": "arboretum.observeSession", + "title": "Observe Terminal (read-only)", + "category": "Arboretum", + "icon": "$(eye)" + }, + { + "command": "arboretum.answerSession", + "title": "Answer Prompt…", + "category": "Arboretum", + "icon": "$(comment-discussion)" + }, + { + "command": "arboretum.killSession", + "title": "Kill Session", + "category": "Arboretum", + "icon": "$(trash)" + }, + { + "command": "arboretum.hideSession", + "title": "Hide Session", + "category": "Arboretum", + "icon": "$(eye-closed)" + }, + { + "command": "arboretum.resumeSession", + "title": "Resume Session", + "category": "Arboretum", + "icon": "$(debug-restart)" + }, + { + "command": "arboretum.forkSession", + "title": "Fork Session", + "category": "Arboretum", + "icon": "$(git-branch)" + }, + { + "command": "arboretum.createWorktree", + "title": "Create Worktree…", + "category": "Arboretum", + "icon": "$(add)" + }, + { + "command": "arboretum.commitWorktree", + "title": "Commit…", + "category": "Arboretum", + "icon": "$(git-commit)" + }, + { + "command": "arboretum.pushWorktree", + "title": "Push", + "category": "Arboretum", + "icon": "$(repo-push)" + }, + { + "command": "arboretum.fetchWorktree", + "title": "Fetch", + "category": "Arboretum", + "icon": "$(cloud-download)" + }, + { + "command": "arboretum.pullWorktree", + "title": "Pull…", + "category": "Arboretum", + "icon": "$(arrow-down)" + }, + { + "command": "arboretum.promoteWorktree", + "title": "Promote to Main", + "category": "Arboretum", + "icon": "$(arrow-up)" + }, + { + "command": "arboretum.openWorktreeIde", + "title": "Open Worktree IDE", + "category": "Arboretum", + "icon": "$(link-external)" + }, + { + "command": "arboretum.startSession", + "title": "Start Claude Session", + "category": "Arboretum", + "icon": "$(play)" + }, + { + "command": "arboretum.startGroupSession", + "title": "Start Group Session…", + "category": "Arboretum", + "icon": "$(play)" + }, + { + "command": "arboretum.startSessionHere", + "title": "Start Session in Current Folder", + "category": "Arboretum" + }, + { + "command": "arboretum.createWorktreeHere", + "title": "Create Worktree for Current Folder…", + "category": "Arboretum" + }, + { + "command": "arboretum.revealWorktree", + "title": "Reveal Worktree for Current Folder", + "category": "Arboretum" + } ], "menus": { "view/title": [ - { "command": "arboretum.refresh", "when": "view == arboretum.repos || view == arboretum.groups", "group": "navigation" }, - { "command": "arboretum.openDashboard", "when": "view == arboretum.repos", "group": "navigation" }, - { "command": "arboretum.signOut", "when": "view == arboretum.repos && arboretum.connected", "group": "1_auth" }, - { "command": "arboretum.signIn", "when": "view == arboretum.repos && !arboretum.connected", "group": "1_auth" } + { + "command": "arboretum.refresh", + "when": "view == arboretum.repos || view == arboretum.groups", + "group": "navigation" + }, + { + "command": "arboretum.openDashboard", + "when": "view == arboretum.repos", + "group": "navigation" + }, + { + "command": "arboretum.signOut", + "when": "view == arboretum.repos && arboretum.connected", + "group": "1_auth" + }, + { + "command": "arboretum.signIn", + "when": "view == arboretum.repos && !arboretum.connected", + "group": "1_auth" + } ], "view/item/context": [ - { "command": "arboretum.createWorktree", "when": "viewItem == arboretum:repo", "group": "inline" }, - { "command": "arboretum.startSession", "when": "viewItem == arboretum:repo", "group": "1_session" }, - { "command": "arboretum.openWorktreeIde", "when": "viewItem == arboretum:worktree", "group": "inline" }, - { "command": "arboretum.commitWorktree", "when": "viewItem == arboretum:worktree", "group": "1_git" }, - { "command": "arboretum.pushWorktree", "when": "viewItem == arboretum:worktree", "group": "1_git" }, - { "command": "arboretum.fetchWorktree", "when": "viewItem == arboretum:worktree", "group": "1_git" }, - { "command": "arboretum.pullWorktree", "when": "viewItem == arboretum:worktree", "group": "1_git" }, - { "command": "arboretum.promoteWorktree", "when": "viewItem == arboretum:worktree", "group": "2_git" }, - { "command": "arboretum.openWorktreeIde", "when": "viewItem == arboretum:worktree", "group": "2_git" }, - { "command": "arboretum.startSession", "when": "viewItem == arboretum:worktree", "group": "3_session" }, - { "command": "arboretum.attachSession", "when": "viewItem =~ /arboretum:session:live/", "group": "inline" }, - { "command": "arboretum.observeSession", "when": "viewItem =~ /arboretum:session:live/", "group": "1_term" }, - { "command": "arboretum.answerSession", "when": "viewItem =~ /arboretum:session:live:.*waiting/", "group": "1_term" }, - { "command": "arboretum.killSession", "when": "viewItem =~ /arboretum:session:live/", "group": "9_danger" }, - { "command": "arboretum.resumeSession", "when": "viewItem =~ /arboretum:session:dead/", "group": "inline" }, - { "command": "arboretum.forkSession", "when": "viewItem =~ /arboretum:session/", "group": "2_term" }, - { "command": "arboretum.hideSession", "when": "viewItem =~ /arboretum:session:.*discovered/", "group": "9_danger" }, - { "command": "arboretum.startGroupSession", "when": "viewItem == arboretum:group", "group": "inline" } + { + "command": "arboretum.createWorktree", + "when": "viewItem == arboretum:repo", + "group": "inline" + }, + { + "command": "arboretum.startSession", + "when": "viewItem == arboretum:repo", + "group": "1_session" + }, + { + "command": "arboretum.openWorktreeIde", + "when": "viewItem == arboretum:worktree", + "group": "inline" + }, + { + "command": "arboretum.commitWorktree", + "when": "viewItem == arboretum:worktree", + "group": "1_git" + }, + { + "command": "arboretum.pushWorktree", + "when": "viewItem == arboretum:worktree", + "group": "1_git" + }, + { + "command": "arboretum.fetchWorktree", + "when": "viewItem == arboretum:worktree", + "group": "1_git" + }, + { + "command": "arboretum.pullWorktree", + "when": "viewItem == arboretum:worktree", + "group": "1_git" + }, + { + "command": "arboretum.promoteWorktree", + "when": "viewItem == arboretum:worktree", + "group": "2_git" + }, + { + "command": "arboretum.openWorktreeIde", + "when": "viewItem == arboretum:worktree", + "group": "2_git" + }, + { + "command": "arboretum.startSession", + "when": "viewItem == arboretum:worktree", + "group": "3_session" + }, + { + "command": "arboretum.attachSession", + "when": "viewItem =~ /arboretum:session:live/", + "group": "inline" + }, + { + "command": "arboretum.observeSession", + "when": "viewItem =~ /arboretum:session:live/", + "group": "1_term" + }, + { + "command": "arboretum.answerSession", + "when": "viewItem =~ /arboretum:session:live:.*waiting/", + "group": "1_term" + }, + { + "command": "arboretum.killSession", + "when": "viewItem =~ /arboretum:session:live/", + "group": "9_danger" + }, + { + "command": "arboretum.resumeSession", + "when": "viewItem =~ /arboretum:session:dead/", + "group": "inline" + }, + { + "command": "arboretum.forkSession", + "when": "viewItem =~ /arboretum:session/", + "group": "2_term" + }, + { + "command": "arboretum.hideSession", + "when": "viewItem =~ /arboretum:session:.*discovered/", + "group": "9_danger" + }, + { + "command": "arboretum.startGroupSession", + "when": "viewItem == arboretum:group", + "group": "inline" + } ], "commandPalette": [ - { "command": "arboretum.refresh", "when": "arboretum.connected" }, - { "command": "arboretum.signOut", "when": "arboretum.connected" }, - { "command": "arboretum.attachSession", "when": "false" }, - { "command": "arboretum.observeSession", "when": "false" }, - { "command": "arboretum.answerSession", "when": "false" }, - { "command": "arboretum.killSession", "when": "false" }, - { "command": "arboretum.hideSession", "when": "false" }, - { "command": "arboretum.resumeSession", "when": "false" }, - { "command": "arboretum.forkSession", "when": "false" }, - { "command": "arboretum.createWorktree", "when": "false" }, - { "command": "arboretum.commitWorktree", "when": "false" }, - { "command": "arboretum.pushWorktree", "when": "false" }, - { "command": "arboretum.fetchWorktree", "when": "false" }, - { "command": "arboretum.pullWorktree", "when": "false" }, - { "command": "arboretum.promoteWorktree", "when": "false" }, - { "command": "arboretum.openWorktreeIde", "when": "false" }, - { "command": "arboretum.startSession", "when": "false" }, - { "command": "arboretum.startGroupSession", "when": "false" }, - { "command": "arboretum.revealWorktree", "when": "false" } + { + "command": "arboretum.refresh", + "when": "arboretum.connected" + }, + { + "command": "arboretum.signOut", + "when": "arboretum.connected" + }, + { + "command": "arboretum.attachSession", + "when": "false" + }, + { + "command": "arboretum.observeSession", + "when": "false" + }, + { + "command": "arboretum.answerSession", + "when": "false" + }, + { + "command": "arboretum.killSession", + "when": "false" + }, + { + "command": "arboretum.hideSession", + "when": "false" + }, + { + "command": "arboretum.resumeSession", + "when": "false" + }, + { + "command": "arboretum.forkSession", + "when": "false" + }, + { + "command": "arboretum.createWorktree", + "when": "false" + }, + { + "command": "arboretum.commitWorktree", + "when": "false" + }, + { + "command": "arboretum.pushWorktree", + "when": "false" + }, + { + "command": "arboretum.fetchWorktree", + "when": "false" + }, + { + "command": "arboretum.pullWorktree", + "when": "false" + }, + { + "command": "arboretum.promoteWorktree", + "when": "false" + }, + { + "command": "arboretum.openWorktreeIde", + "when": "false" + }, + { + "command": "arboretum.startSession", + "when": "false" + }, + { + "command": "arboretum.startGroupSession", + "when": "false" + }, + { + "command": "arboretum.revealWorktree", + "when": "false" + } ] } },