Files
arboretum/packages/vscode/package.json
Johan LEROY a7e04278fd
All checks were successful
CI / Build & test (Node 22) (push) Successful in 10m17s
CI / Build & test (Node 24) (push) Successful in 10m13s
CI / No em/en dashes (push) Successful in 4s
Deploy site (production) / build-and-deploy (push) Successful in 24s
Release / Publish to Gitea npm registry (push) Successful in 10m17s
VSCode Release / Package VSIX (push) Successful in 9m39s
Desktop Release / Build Linux (AppImage + deb) (push) Successful in 15m41s
CI / Pack & boot smoke (Node 22) (push) Successful in 10m3s
release: git-arboretum 3.3.0 (« Démarrer le projet » : lancement multi-terminaux), vscode 0.4.0, desktop 0.1.3
« Démarrer le projet » : un repo définit une fois ses commandes de démarrage
(serveur de dev, API, base de données), un clic ouvre un terminal PTY par
commande dans le dock IDE.

Serveur (additif, PROTOCOL_VERSION inchangé) :
- LaunchCommand[] persistées sur repos.launch_commands (migration 13) ; champ additif SessionSummary.launchRunId.
- POST /repos/:id/launch : résolution du worktree côté serveur, cwd de commande borné (anti-traversal), commandIds outrepasse enabled.
- GET /repos/:id/launch/detect : détection package.json / Procfile / docker-compose.
- Shell de login interactif ($SHELL -l -i, charge le PATH nvm/asdf) + auto-type de la commande ; le shell survit à la commande (échec visible).

Web : LaunchProjectModal + actions (ProjectTreeNode, SessionsPanel, CommandPalette), stores sessions/worktrees, i18n EN/FR.

Alignement du reste du projet :
- Extension VS Code 0.4.0 : commande Start Project (repo/worktree), Stop Launch, badge « launch » dans l'arbre, méthode REST startLaunch.
- Site vitrine : 16e feature card (Rocket) + section showcase « Start the project » (mockup fidèle au modal), i18n EN/FR.
- Documentation : README (EN + FR), help-content (EN + FR), CHANGELOGs server + vscode.

Vérifié : 430 tests, typecheck, build (web + site + vscode), acceptance-p13 ALL GREEN, VSIX packagé, garde anti-tirets, vérif visuelle du site (thèmes clair et sombre).
2026-07-21 13:54:16 +02:00

470 lines
13 KiB
JSON

{
"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.4.0",
"private": true,
"publisher": "johanleroy",
"license": "MIT",
"engines": {
"vscode": "^1.85.0"
},
"repository": {
"type": "git",
"url": "https://git.lidge.fr/johanleroy/arboretum"
},
"categories": [
"SCM Providers",
"Other"
],
"keywords": [
"git",
"worktree",
"claude",
"terminal",
"arboretum"
],
"main": "./dist/extension.js",
"activationEvents": [
"onStartupFinished"
],
"contributes": {
"configuration": {
"title": "Arboretum",
"properties": {
"arboretum.url": {
"type": "string",
"default": "http://127.0.0.1:7317",
"markdownDescription": "Base URL of the Arboretum daemon (REST + WebSocket). Defaults to the loopback bind."
},
"arboretum.showExternalSessions": {
"type": "boolean",
"default": false,
"markdownDescription": "Show Claude sessions discovered outside Arboretum (started from the CLI) in the trees. Off by default to avoid clutter."
},
"arboretum.showArchivedSessions": {
"type": "boolean",
"default": false,
"markdownDescription": "Show finished sessions that Arboretum auto-archived after their retention window. Off by default to keep the trees focused on live work."
},
"arboretum.notifyOnWaiting": {
"type": "boolean",
"default": true,
"markdownDescription": "Show a native notification when a Claude session starts waiting for input."
}
}
},
"viewsContainers": {
"activitybar": [
{
"id": "arboretum",
"title": "Arboretum",
"icon": "media/arboretum.svg"
}
]
},
"views": {
"arboretum": [
{
"id": "arboretum.repos",
"name": "Repositories",
"icon": "media/arboretum.svg"
},
{
"id": "arboretum.groups",
"name": "Groups",
"icon": "media/arboretum.svg"
}
]
},
"viewsWelcome": [
{
"view": "arboretum.repos",
"contents": "Not connected to an Arboretum daemon.\n[Sign in](command:arboretum.signIn)\n\nMake sure the daemon is running (`npx @johanleroy/git-arboretum`) and paste a token.",
"when": "!arboretum.connected"
}
],
"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.startProject",
"title": "Start Project",
"category": "Arboretum",
"icon": "$(rocket)"
},
{
"command": "arboretum.stopLaunch",
"title": "Stop Launch",
"category": "Arboretum",
"icon": "$(stop-circle)"
},
{
"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"
}
],
"view/item/context": [
{
"command": "arboretum.createWorktree",
"when": "viewItem == arboretum:repo",
"group": "inline"
},
{
"command": "arboretum.startSession",
"when": "viewItem == arboretum:repo",
"group": "1_session"
},
{
"command": "arboretum.startProject",
"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.startProject",
"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.stopLaunch",
"when": "viewItem =~ /arboretum:session:live.*:launch/",
"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.startProject",
"when": "false"
},
{
"command": "arboretum.stopLaunch",
"when": "false"
},
{
"command": "arboretum.revealWorktree",
"when": "false"
}
]
}
},
"scripts": {
"typecheck": "tsc -p . --noEmit",
"build": "npm run typecheck && node esbuild.mjs",
"dev": "node esbuild.mjs --watch",
"vscode:prepublish": "node esbuild.mjs",
"package": "vsce package --no-dependencies"
},
"devDependencies": {
"@arboretum/shared": "0.1.0",
"@types/node": "^22.10.0",
"@types/vscode": "^1.85.0",
"@types/ws": "^8.5.0",
"@vscode/vsce": "^3.2.0",
"esbuild": "^0.21.0",
"typescript": "^5.7.0",
"ws": "^8.18.0"
}
}