← Commit history
SKILL.md+1−1
@@ -29,7 +29,7 @@ description: "Control VS Code Server (code-server) from inside the Docker contai  A VS Code extension inside code-server runs an HTTP server on **127.0.0.1:8821**; the `adom-vscode` CLI wraps those verbs with AI-oriented colored output. Everything-is plain HTTP too, so scripts and the HD/HW frontend hit the API directly.+is plain HTTP too, so scripts and the Hydrogen/hc frontend hit the API directly. `GET /health` returns the full verb roster (`verbs: [...]`) for feature detection.  If 8821 is taken the extension falls back to 8822..8831 (then an ephemeral port)
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-vscode",-  "version": "1.1.20",+  "version": "1.1.21",   "type": "app",   "description": "CLI + VS Code extension that lets AI assistants and the Hydrogen Desktop frontend drive VS Code from inside an Adom container: open files, live get/set of any setting/theme/font (no reload), native streamed exec, a frontend event queue, container identity (hd/hw), api-key status/inject, extension query/update, modes, paste screenshots, and any VS Code command via a local HTTP API on port 8821 (with port-file fallback discovery).",   "license": "PROPRIETARY",
page.json+25−8
@@ -4,7 +4,7 @@   "slug": "adom-vscode",   "title": "adom-vscode",   "brief": "Let Claude, Codex and Kimi drive VS Code inside your Adom container",-  "version": "1.1.20",+  "version": "1.1.21",   "license": "PROPRIETARY",   "visibility": "public",   "hero": {@@ -13,13 +13,17 @@     "thumbnail": "screenshots/hero.png"   },   "tags": [+    "automation",+    "claude",     "cli",-    "vscode",     "code-server",+    "docker",+    "exec",+    "hydrogen-desktop",     "ide",-    "claude",-    "automation",-    "docker"+    "queue",+    "settings",+    "vscode"   ],   "discovery_triggers": [     "adom-vscode",@@ -101,7 +105,9 @@     }   ],   "description": "CLI + VS Code extension that lets AI assistants and the Hydrogen Desktop frontend drive VS Code from inside an Adom container: open files, live get/set of any setting/theme/font (no reload), native streamed exec, a frontend event queue, container identity (hd/hw), api-key status/inject, extension query/update, modes, paste screenshots, and any VS Code command via a local HTTP API on port 8821 (with port-file fallback discovery).",-  "dependencies": {},+  "dependencies": {+    "adom/adom-theme": "^2.0.0"+  },   "scripts": {     "install": "./install.sh",     "uninstall": "./uninstall.sh"@@ -114,7 +120,9 @@     "install.sh",     "uninstall.sh",     "bin/**",-    "screenshots/**"+    "screenshots/**",+    "skills/**",+    "VERSION"   ],   "org": "adom",   "author": {@@ -123,5 +131,14 @@   },   "install": {     "binary_name": "adom-vscode"-  }+  },+  "confirmed_user_skills": [+    "adom-vscode",+    "adom-vscode-settings",+    "adom-vscode-exec",+    "adom-vscode-queue",+    "adom-vscode-container",+    "adom-vscode-extensions",+    "adom-vscode-modes"+  ] }\ No newline at end of file
skills/adom-vscode-container/SKILL.md+4−4
@@ -1,6 +1,6 @@ --- name: adom-vscode-container-description: "Identify the Adom container (hd = local Hydrogen Desktop WSL2 workspace, hw = Adom cloud container), check and inject the Adom api key at /var/run/adom/api-key, discover the extension's real port when 8821 is taken, and feature-detect verbs via GET /health. Trigger words: container type, hd or hw, what kind of container, am I in hydrogen desktop, cloud container, container identity, api key status, is the api key good, refresh api key, inject api key, /var/run/adom/api-key, session key expiring, port discovery, port.json, ADOM_VSCODE_PORT, health verbs, feature detect, carbon url, vscode proxy uri."+description: "Identify the Adom container (ah = local Hydrogen Desktop WSL2 workspace, hw = Adom cloud container), check and inject the Adom api key at /var/run/adom/api-key, discover the extension's real port when 8821 is taken, and feature-detect verbs via GET /health. Trigger words: container type, ah or hw, what kind of container, am I in hydrogen desktop, cloud container, container identity, api key status, is the api key good, refresh api key, inject api key, /var/run/adom/api-key, session key expiring, port discovery, port.json, ADOM_VSCODE_PORT, health verbs, feature detect, carbon url, vscode proxy uri." ---  Parent skill: **adom-vscode**@@ -22,7 +22,7 @@ Returns `kind` plus the raw evidence so callers can gate precisely:  Also included: `hostname`, `os` (from /etc/os-release), `kernel`, `arch`, `workspaceUser`, and `env.carbonUrl` (`ADOM_CARBON_URL`), `env.hydrogenUrl`,-`env.vscodeProxyUri`, plus the `markers` object itself and `execAllowed` (whether the exec verbs are enabled here; they are HD-local only). HTTP: `GET /container`.+`env.vscodeProxyUri`, plus the `markers` object itself and `execAllowed` (whether the exec verbs are enabled here; they are Hydrogen-local only). HTTP: `GET /container`.  ## API key (/var/run/adom/api-key) @@ -39,7 +39,7 @@ adom-vscode apikey set <value>   the frontend completes a login refresh and needs the container to pick up the   new session key. - Typical flow with the queue (adom-vscode ships NO built-in watcher; the-  polling process and its cadence belong to HD or another owner): that process+  polling process and its cadence belong to Hydrogen or another owner): that process   sees the key aging, pushes a `login/refresh-needed` event (see   **adom-vscode-queue**); frontend refreshes the session and calls `apikey   set`; the process confirms via `apikey status` (fresh mtime + new@@ -69,7 +69,7 @@ adom-vscode health  `GET /health` returns `{version, port, preferredPort, portFile, verbs: [...]}`. Gate on the `verbs` array (e.g. `exec.stream`, `queue.push`, `apikey.set`), not-on version strings. Note: `exec` / `exec.stream` only appear on HD-local+on version strings. Note: `exec` / `exec.stream` only appear on Hydrogen-local containers; on cloud (hw) containers they are disabled by security policy and absent from the roster (`execAllowed: false`). An extension that answers /health without a `verbs` field predates 1.1.10 and needs a window reload or update.
skills/adom-vscode-exec/SKILL.md+5−5
@@ -1,19 +1,19 @@ --- name: adom-vscode-exec-description: "Run shell commands inside the Adom container through the adom-vscode extension, streamed live (SSE) or buffered, as the workspace user via a login shell. HD-LOCAL ONLY: cloud (hw) containers refuse exec (exec_disabled_on_cloud), check /health verbs first. THE native replacement for routing container commands through host-side wsl.exe (which wedges, serializes behind a global lock, and flakes with E_UNEXPECTED). Trigger words: exec disabled, exec_disabled_on_cloud, exec in container, run command in container, adom-vscode exec, stream exec, streamed output, exec stream, container shell, run npm test in container, long running command, exec timeout, exec cwd, no wsl.exe, wsl exec replacement, POST /exec, SSE exec."+description: "Run shell commands inside the Adom container through the adom-vscode extension, streamed live (SSE) or buffered, as the workspace user via a login shell. Hydrogen-LOCAL ONLY: cloud (hw) containers refuse exec (exec_disabled_on_cloud), check /health verbs first. THE native replacement for routing container commands through host-side wsl.exe (which wedges, serializes behind a global lock, and flakes with E_UNEXPECTED). Trigger words: exec disabled, exec_disabled_on_cloud, exec in container, run command in container, adom-vscode exec, stream exec, streamed output, exec stream, container shell, run npm test in container, long running command, exec timeout, exec cwd, no wsl.exe, wsl exec replacement, POST /exec, SSE exec." ---  Parent skill: **adom-vscode**  # adom-vscode-exec, run container commands natively -> **HD-LOCAL ONLY (security policy).** exec runs only on local Hydrogen Desktop+> **Hydrogen-LOCAL ONLY (security policy).** exec runs only on local Hydrogen Desktop > workspaces (`container` reports `kind: hd`). Cloud (hw) containers refuse both > exec verbs with `errorCode: exec_disabled_on_cloud` (HTTP 403), and /health > omits `exec` / `exec.stream` from its verb roster there, so feature-detect > before offering exec. Rationale: adom-vscode is a core install for every Adom > user, and an arbitrary-shell verb on an internet-facing cloud container is an-> unnecessary exposure; HD workspaces sit behind the user's own firewall. On a+> unnecessary exposure; Hydrogen workspaces sit behind the user's own firewall. On a > cloud container, run commands in your own terminal/session instead. Debug > escape hatch: `ADOM_VSCODE_ALLOW_EXEC=1` set in the EXTENSION HOST env by the > platform (a remote caller cannot set it).@@ -47,9 +47,9 @@ adom-vscode exec "uname -a" --json                   # buffered: waits, prints o   then `exit {exitCode, timedOut}`. Closing the connection kills the child, so   a frontend that navigates away does not leak processes. -## Why not wsl.exe (the HD context)+## Why not wsl.exe (the Hydrogen context) -HD's legacy path spawned `wsl.exe -d Adom-Workspace -u adom -- bash -lc <cmd>`+Hydrogen's legacy path spawned `wsl.exe -d Adom-Workspace -u adom -- bash -lc <cmd>` on the Windows host behind a global serial lock. That path caused nearly every "wsl.exe is flaky / it wedged" incident: E_UNEXPECTED, management-plane wedges, and everything queued behind one lock, with no VS Code API access. Once the
skills/adom-vscode-queue/SKILL.md+3−3
@@ -1,6 +1,6 @@ --- name: adom-vscode-queue-description: "The shared event queue between container processes and the Hydrogen Desktop / Hydrogen Web frontend, hosted by the adom-vscode extension. Any process pushes events (login refresh needed, long-job progress, arbitrary payloads); the frontend pulls when it wants. Survives window reloads. Trigger words: event queue, queue push, queue pull, push event to frontend, notify hd frontend, frontend event, progress dialog event, api key expiring event, login refresh event, queue status, queue peek, queue topic, adom-vscode queue, POST /queue/push, pull events."+description: "The shared event queue between container processes and the Hydrogen Desktop / Hydrogen Web frontend, hosted by the adom-vscode extension. Any process pushes events (login refresh needed, long-job progress, arbitrary payloads); the frontend pulls when it wants. Survives window reloads. Trigger words: event queue, queue push, queue pull, push event to frontend, notify ah frontend, frontend event, progress dialog event, api key expiring event, login refresh event, queue status, queue peek, queue topic, adom-vscode queue, POST /queue/push, pull events." ---  Parent skill: **adom-vscode**@@ -8,7 +8,7 @@ Parent skill: **adom-vscode** # adom-vscode-queue, container-to-frontend events  A simple durable FIFO inside the extension. Producers are anything in the-container (a watcher, a build, an AI thread); the consumer is usually the HD/HW+container (a watcher, a build, an AI thread); the consumer is usually the Hydrogen/hc frontend polling when it cares. Events survive VS Code window reloads (persisted to `~/.local/share/adom-vscode/queue.json`), are capped at 1000 items, and can carry a per-item TTL.@@ -35,7 +35,7 @@ Each item: `{id, ts, topic, type, payload, ttlSec}`. Default topic is ## Patterns  - **Login refresh**: NOTE, adom-vscode ships NO built-in key watcher; this is-  the pattern for whichever process owns key freshness (an HD daemon, a cron+  the pattern for whichever process owns key freshness (an Hydrogen daemon, a cron   job, any container process). That process decides its own cadence, notices   the session key in `/var/run/adom/api-key` is close to expiry, and pushes   `topic: login, type: refresh-needed`; the frontend pulls, shows the "needs a
skills/adom-vscode-settings/SKILL.md+2−2
@@ -62,10 +62,10 @@ The key map (CLI flag -> settings key): HTTP: `GET /fonts`, `POST /fonts {editorFamily?, proseFamily?, proseCodeFamily?, editorSize?, terminalSize?, proseSize?, proseCodeSize?}` (any subset). -## Resolved fonts, the part HD needs+## Resolved fonts, the part Hydrogen needs  The configured stack often names fonts that are NOT installed on the rendering-side (the user's browser or the HD webview), so reading the setting alone lies.+side (the user's browser or the Hydrogen webview), so reading the setting alone lies. `font get` also returns `resolved`: the first family in each stack that the renderer can truly draw, checked with `document.fonts.check` inside the workbench (via the Adom sidebar webview). If the sidebar webview is not alive