bootstrap
Adom Hydrogen (platform base)
Public Made by Adomby adom
Layer Hydrogen's workspace onto a standard Adom workstation.
← Commit history
Publish 0.3.3
33 files changed
+482−481
package.json+2−1page.json+1−1skills/hydrogen-adom-auth/SKILL.md+16−16skills/hydrogen-adom-desktop/SKILL.md+58−58skills/hydrogen-adom-menu/SKILL.md+13−13skills/hydrogen-api/SKILL.md+29−29skills/hydrogen-bridges/SKILL.md+18−18skills/hydrogen-captions/SKILL.md+14−14skills/hydrogen-capture-share/SKILL.md+23−23skills/hydrogen-claude-auth/SKILL.md+14−14skills/hydrogen-container-stats/SKILL.md+9−9skills/hydrogen-container/SKILL.md+10−10skills/hydrogen-desktop-sse/SKILL.md+25−25skills/hydrogen-eda-discovery/SKILL.md+2−2skills/hydrogen-eval/SKILL.md+9−9skills/hydrogen-instapcb/SKILL.md+5−5skills/hydrogen-monitor/SKILL.md+3−3skills/hydrogen-naming/SKILL.md+4−4skills/hydrogen-notifications/SKILL.md+16−16skills/hydrogen-open-url/SKILL.md+23−23skills/hydrogen-overview/SKILL.md+19−19skills/hydrogen-permissions/SKILL.md+12−12skills/hydrogen-profile-menu/SKILL.md+17−17skills/hydrogen-self-screenshot/SKILL.md+29−29skills/hydrogen-self-update/SKILL.md+8−8skills/hydrogen-settings/SKILL.md+15−15skills/hydrogen-setup-steps/SKILL.md+17−17skills/hydrogen-setup/SKILL.md+16−16skills/hydrogen-ui/SKILL.md+18−18skills/hydrogen-welcome/SKILL.md+11−11skills/hydrogen-who-am-i/SKILL.md+13−13skills/hydrogen-workspace-monitoring/SKILL.md+10−10skills/hydrogen-workspace-updater/SKILL.md+3−3package.json+2−1@@ -4,9 +4,10 @@ "type": "bootstrap", "title": "Adom Hydrogen (platform base)", "brief": "Layer Hydrogen's workspace onto a standard Adom workstation.",- "version": "0.3.2",+ "version": "0.3.3", "description": "Hydrogen's PLATFORM-GENERIC workspace layer on top of adom/core. Installs adom/core for the full Adom ecosystem, then adds everything common to running inside Hydrogen on ANY platform: the runtime-neutral hydrogen-* skills and the generic editor configuration (Claude Code CLI + extension, VS Code settings, trusted domains). Platform-specific layers depend on THIS: adom/hydrogen-windows-bootstrap (WSL2), adom/hydrogen-mac-bootstrap, adom/hydrogen-ubuntu-bootstrap. The reference design other orgs copy to build their own bootstrap on adom/core.", "org": "adom",+ "platform": "any", "tags": [ "bootstrap", "hydrogen",
page.json+1−1@@ -4,7 +4,7 @@ "type": "bootstrap", "title": "Adom Hydrogen (platform base)", "brief": "Layer Hydrogen's workspace onto a standard Adom workstation.",- "version": "0.3.2",+ "version": "0.3.3", "description": "Hydrogen's PLATFORM-GENERIC workspace layer on top of adom/core. Installs adom/core for the full Adom ecosystem, then adds everything common to running inside Hydrogen on ANY platform: the runtime-neutral hydrogen-* skills and the generic editor configuration (Claude Code CLI + extension, VS Code settings, trusted domains). Platform-specific layers depend on THIS: adom/hydrogen-windows-bootstrap (WSL2), adom/hydrogen-mac-bootstrap, adom/hydrogen-ubuntu-bootstrap. The reference design other orgs copy to build their own bootstrap on adom/core.", "org": "adom", "tags": [
skills/hydrogen-adom-auth/SKILL.md+16−16@@ -1,51 +1,51 @@ --- name: hydrogen-adom-auth description: >- Adom auth in HD — how login/logout works (auth intent flow), where the+ Adom auth in Hydrogen — how login/logout works (auth intent flow), where the session token lives, the profile menu, and how the Adom session feeds the setup steps. For Claude Code auth specifically, see hydrogen-claude-auth. READ when troubleshooting Adom login failures, session token expiry, the profile dropdown, or virgin-reset Adom-auth options. Trigger words — adom login, login, logout, auth, session token, auth intent, confirmation code, profile menu, avatar, sign in, sign out, auth proxy, clear session,- HD adom login, Your profile, Your repositories.+ Hydrogen adom login, Your profile, Your repositories. --- # Hydrogen -- Authentication Reference ## Auth Flow Overview -HD uses an **auth intent** flow (no email/password entry in the app).+Hydrogen uses an **auth intent** flow (no email/password entry in the app). The backend creates a short-lived intent token on the Carbon API, opens the user's default browser to the Adom login page, and polls until the user completes sign-in in the browser. ### Sequence -1. HD calls `invoke('auth_intent_start')` -> backend POSTs to+1. Hydrogen calls `invoke('auth_intent_start')` -> backend POSTs to `https://carbon.adom.inc/auth/intents` with `{"max_age": 7776000}` (90-day session). 2. Carbon returns `{token, confirmation_code, expires_at, auth_url}`.-3. HD opens the browser to the **`auth_url` Carbon returned**, falling back to+3. Hydrogen opens the browser to the **`auth_url` Carbon returned**, falling back to `https://hydrogen.adom.inc/auth/intent?token={token}` (singular `intent`, token as a query param — NOT `/auth/intents/{token}`).-4. HD displays the confirmation code on screen and shows a spinner.+4. Hydrogen displays the confirmation code on screen and shows a spinner. 5. Frontend polls `invoke('auth_intent_poll', {token})` every 2 seconds. Backend GETs `https://carbon.adom.inc/auth/intents/{token}/status`. 6. When the user confirms in the browser, the response includes `{state: "authenticated", session_token: "..."}`.-7. The backend saves the session token to HD's app-data directory on the host+7. The backend saves the session token to Hydrogen's app-data directory on the host (the `hydrogen-session.txt` file) and a replay copy alongside it. 8. Frontend redirects to the dashboard. ### Source files - **Login page**: `src/routes/auth/login/+page.svelte`-- **Auth backend**: `src-tauri/crates/hd-app/src/lib.rs` (functions+- **Auth backend**: `src-tauri/crates/hydrogen-app/src/lib.rs` (functions `auth_intent_start`, `auth_intent_poll`, `auth_proxy`, `check_replay_credentials`, `replay_adom_login`). NOTE: the old `src-tauri/src/lib.rs` is a pre-crate-split vestige — the live code is in the- `hd-app` crate.+ `hydrogen-app` crate. - **Auth components**: `src/lib/components/auth/` (Header, Form, Footer, SubmitButton, Error, Success) - **User API**: `src/lib/api/authenticated_user.ts`@@ -54,7 +54,7 @@ the user completes sign-in in the browser. ## Session Token -**Location**: HD's app-data directory on the host (the `hydrogen-session.txt`+**Location**: Hydrogen's app-data directory on the host (the `hydrogen-session.txt` file). A plain-text file containing the Adom session cookie value. Created by either:@@ -114,16 +114,16 @@ const result = await invoke('auth_proxy', { ## Credential Replay -On login page mount, HD checks for saved credentials before starting the+On login page mount, Hydrogen checks for saved credentials before starting the full auth intent flow: 1. `invoke('check_replay_credentials')` checks if replay files exist on disk.-2. If the replay-session file exists (has_adom = true), HD shows a "REPLAY"+2. If the replay-session file exists (has_adom = true), Hydrogen shows a "REPLAY" badge and a 5-second countdown. 3. `invoke('replay_adom_login')` attempts to authenticate using the saved session token. 4. If replay succeeds, the user is logged in without opening a browser.-5. If replay fails, HD falls back to the normal auth intent flow.+5. If replay fails, Hydrogen falls back to the normal auth intent flow. This makes re-login after a virgin reset instant when the user chose to preserve the Adom session token.@@ -132,7 +132,7 @@ preserve the Adom session token. ## Claude Credentials -**Location**: HD's app-data directory on the host (the+**Location**: Hydrogen's app-data directory on the host (the `replay-claude-credentials.json` file). Stores Claude Code OAuth credentials so they can be replayed into the@@ -234,7 +234,7 @@ avatar ? avatar.alt : 'unknown'; 3. If confirmed (app mode): - `invoke('auth_proxy', {path: '/auth/logout', method: 'DELETE'})` -- server-side logout - `invoke('auth_proxy', {path: '/auth/clear-local', method: 'POST'})` -- deletes `hydrogen-session.txt`- - Clears auth-related domain preferences from `localStorage['hd-url-routing-prefs']`+ - Clears auth-related domain preferences from `localStorage['hydrogen-url-routing-prefs']` 4. Redirects to `/auth/login`. ---@@ -293,7 +293,7 @@ document.querySelector('.skip-login a')?.click(); The setup/bootstrap process depends on a valid session token: -1. **inject-api-key** -- reads the HD-side `hydrogen-session.txt`, writes the+1. **inject-api-key** -- reads the Hydrogen-side `hydrogen-session.txt`, writes the token into the workspace at `/var/run/adom/api-key` (mode 644) as the Adom API key. If the token is missing or expired, this step fails and downstream steps (adom-cli, gallia, etc.) cannot authenticate.
skills/hydrogen-adom-desktop/SKILL.md+58−58@@ -1,36 +1,36 @@ --- name: hydrogen-adom-desktop description: >- What Hydrogen (HD) and Adom Bridge (AD) are, what each does, and how+ What Hydrogen (ah) and Adom Bridge (ab) are, what each does, and how they work together — so the AI in the workspace knows it has HANDS on the- user's real operating system. HD is the workspace app the user looks at; AD is+ user's real operating system. Hydrogen is the workspace app the user looks at; ab is the bridge that reaches the user's actual machine to create files & folders, run shell commands, take OS screenshots, launch apps, open browsers (Pup /- native), and drive KiCad / Fusion 360. HD bundles AD during install and runs- it in embedded mode, but AD is a standalone product that ALSO connects Adom- cloud containers to a user's machine. HD also has a BUILT-IN desktop bridge of- its own that serves a subset of AD's verbs.+ native), and drive KiCad / Fusion 360. Hydrogen bundles ab during install and runs+ it in embedded mode, but ab is a standalone product that ALSO connects Adom+ cloud containers to a user's machine. Hydrogen also has a BUILT-IN desktop bridge of+ its own that serves a subset of ab's verbs. READ THIS to understand your reach beyond the workspace and how to invoke it.- Trigger words — adom desktop, AD, ad cli, what can you do on my computer, reach+ Trigger words — adom desktop, ab, ad cli, what can you do on my computer, reach my machine, create a file on my pc, make a folder on my desktop, run a command on my machine, control the host, host screenshot, screenshot my screen, os screenshot, open a file on my computer, control my desktop, bridge to my pc, send file to my desktop, pull file from my desktop, hd and ad, two apps, how do hd and ad work together, talk to hydrogen, desktop bridge, relay,- embedded mode, AD hidden, hd_status, hd_api, shell_execute, adom-bridge-cli ping,+ embedded mode, ab hidden, hd_status, hd_api, shell_execute, adom-bridge-cli ping, adom-bridge-cli status. --- # Hydrogen ↔ Adom Bridge — your reach onto the user's real machine -You (the AI) run inside the **HD workspace** (a local Linux workspace on the-user's machine). That's a sandbox. **Adom Bridge (AD) is how you reach OUT of it+You (the AI) run inside the **Hydrogen workspace** (a local Linux workspace on the+user's machine). That's a sandbox. **Adom Bridge (ab) is how you reach OUT of it onto the user's actual operating system** — their real files, shell, screen, and-desktop apps. Knowing AD exists is the difference between "I can only work in+desktop apps. Knowing ab exists is the difference between "I can only work in here" and "I can create that file on your Desktop, screenshot your screen, and open it in KiCad." -> **Platform note:** HD's host layer (file/shell/screenshot/notification/window+> **Platform note:** Hydrogen's host layer (file/shell/screenshot/notification/window > control) is platform-specific. Before promising a host action on a given OS, > verify the capability with `adom-bridge-cli status` rather than assuming it. > For Windows/WSL2-specific host behavior, see the [[hydrogen-adom-desktop-windows]]@@ -38,36 +38,36 @@ open it in KiCad." ## Two apps, two jobs -| | **Hydrogen (HD)** | **Adom Bridge (AD)** |+| | **Hydrogen (ah)** | **Adom Bridge (ab)** | |---|---|---| | What it is | The user-facing workspace app (Tauri). VS Code pane + Wiki + the runtime that hosts your workspace. | A bridge app that talks to the user's real OS and local apps. |-| What the user sees | The window they work in. | Usually nothing — HD hides it (embedded mode). |+| What the user sees | The window they work in. | Usually nothing — Hydrogen hides it (embedded mode). | | What it does for YOU | Hosts you, your editor, your tools. | Lets you act on the host: files, folders, shell, OS screenshots, app launch, KiCad/Fusion, browsers. |-| Runs without the other? | HD spawns AD. | **Yes** — AD is a standalone product; it also connects Adom *cloud* containers to a user's machine. |+| Runs without the other? | Hydrogen spawns ab. | **Yes** — ab is a standalone product; it also connects Adom *cloud* containers to a user's machine. | -**Why two apps:** AD came first and is genuinely powerful — it's what lets any-Adom cloud container reach into a user's desktop. Rather than reinvent it, HD-**bundles AD and makes it part of HD's install**, then puts it in *embedded mode*-so the user only ever manages one app (HD). The two talk to each other-constantly. See [hd-embedded-ad](../hd-embedded-ad/SKILL.md) for the embedding+**Why two apps:** ab came first and is genuinely powerful — it's what lets any+Adom cloud container reach into a user's desktop. Rather than reinvent it, Hydrogen+**bundles ab and makes it part of Hydrogen's install**, then puts it in *embedded mode*+so the user only ever manages one app (ah). The two talk to each other+constantly. See [hydrogen-embedded-ad](../hydrogen-embedded-ad/SKILL.md) for the embedding mechanics (tray ownership, lifecycle, standalone↔embedded transitions). -## HD's built-in bridge vs the embedded AD (dual-client)+## Hydrogen's built-in bridge vs the embedded ab (dual-client) Here's the subtlety that matters when you reason about "who serves this verb?": **there are two desktop clients on the host, not one.** -1. **HD's own built-in bridge** — HD's `hd-app` crate implements a desktop bridge+1. **Hydrogen's own built-in bridge** — Hydrogen's `hydrogen-app` crate implements a desktop bridge *itself* (`commands.rs::handle_command` → `screenshot.rs::handle_desktop_command`).- It serves a **subset** of AD's verbs directly inside HD's process:+ It serves a **subset** of ab's verbs directly inside Hydrogen's process: `list_windows, screenshot_window, screenshot_screen, open_folder, open_url, bring_to_front, set_window_state, list_files, watch_files, install_kicad, install_node, list_browsers` under the `desktop` app, plus the top-level apps `caption, notify, shell, kicad, fusion360, browser` and the desktop verbs `set_project_watch, trigger_project_watch, revoke_approvals`.-2. **The standalone AD, spawned `--embedded`** by HD's supervisor- (`ad_supervisor.rs`). AD serves the **full** verb surface — including ones- HD's built-in bridge does NOT implement:+2. **The standalone ab, spawned `--embedded`** by Hydrogen's supervisor+ (`ad_supervisor.rs`). ab serves the **full** verb surface — including ones+ Hydrogen's built-in bridge does NOT implement: `desktop_record_*`, `desktop_recorder_*`, `desktop_list_monitors`, `desktop_pull_glob`, `desktop_embedded_*`. @@ -81,28 +81,28 @@ adom-bridge-cli status # → .capabilities lists what the connected client(s) ``` If `.capabilities` is missing `record` (or `desktop_list_monitors` errors with-"unknown desktop command"), the embedded AD isn't connected — only HD's built-in-bridge is — so recording / multi-monitor / glob-pull aren't available until AD+"unknown desktop command"), the embedded ab isn't connected — only Hydrogen's built-in+bridge is — so recording / multi-monitor / glob-pull aren't available until ab is up. Screenshots, window control, files, shell, captions, notifications and-the KiCad/Fusion/browser bridges all work off HD's built-in bridge regardless.+the KiCad/Fusion/browser bridges all work off Hydrogen's built-in bridge regardless. -## What AD/HD let you do on the user's real machine+## What ab/Hydrogen let you do on the user's real machine All via the `adom-bridge-cli` CLI from inside the workspace. Rather than re-document every verb here, this is a **capability map → the focused skill**: | Capability | Verb(s) / surface | Where it's documented | |---|---|---|-| **Create files/folders on the host** | `send_files` (container → desktop) | [hd-file-transfer](../hd-file-transfer/SKILL.md) |-| **Pull files from the host** | `pull_file` (desktop → container, SHA256-verified); browse + watch via `list_files` / `watch_files` | [hd-file-transfer](../hd-file-transfer/SKILL.md) |+| **Create files/folders on the host** | `send_files` (container → desktop) | [hydrogen-file-transfer](../hydrogen-file-transfer/SKILL.md) |+| **Pull files from the host** | `pull_file` (desktop → container, SHA256-verified); browse + watch via `list_files` / `watch_files` | [hydrogen-file-transfer](../hydrogen-file-transfer/SKILL.md) | | **Run a shell command on the host** | `shell_execute` (real host shell) | shell-trust model below | | **Screen/window control + screenshots** | `desktop_screenshot_screen` / `desktop_screenshot_window` / `desktop_list_windows`, `desktop_set_window_state`, `desktop_bring_to_front` | [hydrogen-self-screenshot](../hydrogen-self-screenshot/SKILL.md) |-| **Record the screen / a tab** | `desktop_record_*` (whole screen), `browser_record_*` (one tab) | [hd-recording](../hd-recording/SKILL.md) — AD-served, verify `record` capability |+| **Record the screen / a tab** | `desktop_record_*` (whole screen), `browser_record_*` (one tab) | [hydrogen-recording](../hydrogen-recording/SKILL.md) — ab-served, verify `record` capability | | **Desktop notifications** | `notify_user` (title/body/level + action buttons) | [hydrogen-notifications](../hydrogen-notifications/SKILL.md) | | **On-screen captions** | `caption` (always-on-top click-through overlay) | [hydrogen-captions](../hydrogen-captions/SKILL.md) | | **Open browsers** | `browser_*` (Pup) and the Browser Picker | [hydrogen-open-url](../hydrogen-open-url/SKILL.md), `pup` | | **Drive KiCad / Fusion 360 / Pup** | `kicad_*`, `fusion_*`, `browser_*` | [hydrogen-bridges](../hydrogen-bridges/SKILL.md) |-| **Embedded mechanics (tray/lifecycle)** | `desktop_embedded_*` | [hd-embedded-ad](../hd-embedded-ad/SKILL.md) — AD-served |+| **Embedded mechanics (tray/lifecycle)** | `desktop_embedded_*` | [hydrogen-embedded-ad](../hydrogen-embedded-ad/SKILL.md) — ab-served | For the complete verb list run `adom-bridge-cli list_commands` (or see the `adom-bridge-cli` skill).@@ -110,7 +110,7 @@ For the complete verb list run `adom-bridge-cli list_commands` (or see the ### Host shell-trust model `shell_execute` runs a **real command on the user's machine** (the host's native-shell). In **embedded mode HD auto-approves** shell commands so the AI isn't+shell). In **embedded mode Hydrogen auto-approves** shell commands so the AI isn't blocked on per-command approval dialogs — convenient, but it means anything you run there really runs. Revoke the standing auto-approval at any time: @@ -119,7 +119,7 @@ adom-bridge-cli shell_auto_approve '{"duration_secs":0}' # turn auto-approve o ``` When you *don't* need a free-form shell, prefer the **no-escape structured-runners** over hand-quoted `shell_execute` (AD ≥ 1.8.50):+runners** over hand-quoted `shell_execute` (ab ≥ 1.8.50): `adom-bridge-cli run_script '{"interpreter":"bash|cmd|powershell","scriptB64":"<b64>"}'` and `adom-bridge-cli wsl_exec '{"distro":"<workspace-distro>","user":"adom","scriptB64":"<b64>"}'` — base64 the script so no quoting survives to be mangled. (`wsl_exec` is a@@ -127,7 +127,7 @@ Windows/WSL2 path — see the [[hydrogen-adom-desktop-windows]] companion.) ### Auto-installing missing apps -If KiCad or Node.js is missing on the host, HD can trigger an unattended+If KiCad or Node.js is missing on the host, Hydrogen can trigger an unattended install on platforms that support it (see the [[hydrogen-adom-desktop-windows]] companion for the Windows winget verbs). The triggers: `install_kicad` fires when `kicad_list_versions` returns `errorCode:"kicad_not_installed"`;@@ -143,7 +143,7 @@ between the workspace and the host. The watcher fires on changes to so edits you make in the workspace land on the user's machine (and vice-versa) without manual `send_files`/`pull_file` round-trips. -## Talking to HD + AD from the CLI+## Talking to Hydrogen + ab from the CLI You reach the host through the **`adom-bridge-cli` CLI**, which relays your commands over a WebSocket to the desktop client(s).@@ -156,20 +156,20 @@ adom-bridge-cli send_files '{"filePaths":["/tmp/x"],"saveTo":"<host dir>"}' adom-bridge-cli desktop_list_windows ``` -**Hydrogen control (the HD app itself):**+**Hydrogen control (the Hydrogen app itself):** ```bash-adom-bridge-cli hd_status # is HD running + composed runtime state-adom-bridge-cli hd_screenshot # window-bounded HD shot (resize <1500px before reading!)-adom-bridge-cli hd_log # tail HD's log-adom-bridge-cli hd_launch # start HD detached-# Direct HD control API (HTTP, no shell-escaping pain):+adom-bridge-cli hd_status # is Hydrogen running + composed runtime state+adom-bridge-cli hd_screenshot # window-bounded Hydrogen shot (resize <1500px before reading!)+adom-bridge-cli hd_log # tail Hydrogen's log+adom-bridge-cli hd_launch # start Hydrogen detached+# Direct Hydrogen control API (HTTP, no shell-escaping pain): adom-bridge-cli hd_api '{"method":"POST","path":"/setup/run-all","body":{}}' adom-bridge-cli hd_api '{"method":"GET","path":"/health"}' ```-`hd_api` hits HD's **control API** on its discovered port (fallback **47084**).+`hd_api` hits Hydrogen's **control API** on its discovered port (fallback **47084**). See the [[hydrogen-adom-desktop-windows]] companion for the host port-discovery file. -**Embedded-mode introspection (AD-served):**+**Embedded-mode introspection (ab-served):** ```bash adom-bridge-cli desktop_embedded_status # embedded=true/false, enteredVia=launch-flag|runtime-adopt ```@@ -180,12 +180,12 @@ adom-bridge-cli desktop_embedded_status # embedded=true/false, enteredVia=laun You (AI in the workspace) └─ adom-bridge-cli <verb> '<json>' ← CLI in the workspace └─ relay (adom-bridge-cli serve: WS :8765 + HTTP :8766, started in the workspace)- └─ WebSocket ──► HD's built-in bridge AND/OR the embedded AD on the user's machine+ └─ WebSocket ──► Hydrogen's built-in bridge AND/OR the embedded ab on the user's machine └─ acts on the OS / KiCad / Fusion / Chrome ``` -- In HD the relay is started for you by the **`start-relay`** setup step; HD's- built-in bridge and the embedded AD both connect to it. The host-side clients+- In Hydrogen the relay is started for you by the **`start-relay`** setup step; Hydrogen's+ built-in bridge and the embedded ab both connect to it. The host-side clients reach your in-workspace relay — the exact networking depends on the runtime (see the `hydrogen-networking` skill, and the [[hydrogen-adom-desktop-windows]] companion for the WSL2 loopback-forwarding details).@@ -201,12 +201,12 @@ You (AI in the workspace) ## What NOT to do -- **Never kill the host AD process** — the host AD is your relay bridge;+- **Never kill the host ab process** — the host ab is your relay bridge; killing it severs your control channel (you can't get it back from in here). (Windows-specific `taskkill` warnings live in the [[hydrogen-adom-desktop-windows]] companion.)-- **Never hardcode `:9001` as HD's control API.** `9001` is real — it's AD's- liveness beacon that AD probes to detect HD — but HD's actual control API is+- **Never hardcode `:9001` as Hydrogen's control API.** `9001` is real — it's ab's+ liveness beacon that ab probes to detect Hydrogen — but Hydrogen's actual control API is **47084** (use `hd_api`, which reads the discovered port). - **Don't broad-kill `node`** — VS Code Server runs as node; killing it kills the whole workspace.@@ -217,18 +217,18 @@ You (AI in the workspace) When the user asks for something that lives on their real computer — "save this to my Desktop", "what's on my screen", "open this in KiCad", "run this command on-my machine" — that's an **AD** job, and you can do it. When it's about the+my machine" — that's an **ab** job, and you can do it. When it's about the workspace itself (editor, files under `/home/adom/project`, the runtime), that's-**HD**. Lead with what you can do, verify with `adom-bridge-cli ping`, then act.+**Hydrogen**. Lead with what you can do, verify with `adom-bridge-cli ping`, then act. ## Related skills - [[hydrogen-adom-desktop-windows]] — Windows/WSL2 host specifics (paths, winget installs, loopback forwarding, taskkill)-- [hd-embedded-ad](../hd-embedded-ad/SKILL.md) — how HD bundles + embeds AD (tray, lifecycle, standalone↔embedded)+- [hydrogen-embedded-ad](../hydrogen-embedded-ad/SKILL.md) — how Hydrogen bundles + embeds ab (tray, lifecycle, standalone↔embedded) - [hydrogen-bridges](../hydrogen-bridges/SKILL.md) — the KiCad / Fusion / Puppeteer bridge ecosystem-- [hd-file-transfer](../hd-file-transfer/SKILL.md) — send/pull files, browse + watch the host filesystem+- [hydrogen-file-transfer](../hydrogen-file-transfer/SKILL.md) — send/pull files, browse + watch the host filesystem - [hydrogen-self-screenshot](../hydrogen-self-screenshot/SKILL.md) — host screenshots + window control-- [hd-recording](../hd-recording/SKILL.md) — screen vs tab recording (AD-served)+- [hydrogen-recording](../hydrogen-recording/SKILL.md) — screen vs tab recording (ab-served) - [hydrogen-notifications](../hydrogen-notifications/SKILL.md) — desktop toasts; [hydrogen-captions](../hydrogen-captions/SKILL.md) — on-screen caption overlay - [hydrogen-open-url](../hydrogen-open-url/SKILL.md) — the ways to open a URL (Pup, native browser, picker, …) - `pup` — driving Pup browser windows; `adom-bridge-cli` — the full CLI verb reference-- [hd-runtime-mode](../hd-runtime-mode/SKILL.md) — the HD↔AD relationship is identical across runtimes+- [hydrogen-runtime-mode](../hydrogen-runtime-mode/SKILL.md) — the Hydrogen↔ab relationship is identical across runtimes
skills/hydrogen-adom-menu/SKILL.md+13−13@@ -31,15 +31,15 @@ logo = go straight to the Dashboard.) Source: `EditorNav.svelte` → `.logo-butt | Item | What it does | |---|---|-| **Go to Dashboard** | Navigate HD to your Adom dashboard (`/`) |+| **Go to Dashboard** | Navigate Hydrogen to your Adom dashboard (`/`) | | **Settings** | Opens the Settings dialog (`SettingsDialog.svelte`) |-| **Ports…** | Configure local host port assignments for HD services (`SettingsPortsDialog`) |-| **API Explorer…** | Browse + test every HD control-API endpoint (`ApiExplorerDialog`); see **hydrogen-api** |-| *— Desktop —* | (desktop-only section, shown when running in HD/Tauri; in order) |+| **Ports…** | Configure local host port assignments for Hydrogen services (`SettingsPortsDialog`) |+| **API Explorer…** | Browse + test every Hydrogen control-API endpoint (`ApiExplorerDialog`); see **hydrogen-api** |+| *— Desktop —* | (desktop-only section, shown when running in Hydrogen/Tauri; in order) | | **Adom Bridge** | Bring the embedded Adom Bridge window to the foreground (taskbar) — FIRST item in the section |-| **Zoom** | −/+ zoom the whole HD UI (persisted) |+| **Zoom** | −/+ zoom the whole Hydrogen UI (persisted) | | **Fullscreen** | Toggle fullscreen |-| **Console** | Show/hide the native HD debug console window |+| **Console** | Show/hide the native Hydrogen debug console window | | **Developer Tools** | Opens WebView2 DevTools (separate window) — see below | | **Dev Toolbar** | Show/hide the Adom Dev Toolbar window (eval-in / shot / Claude control endpoints) | | *— Container —* | (state shown: running/stopped/…) |@@ -47,7 +47,7 @@ logo = go straight to the Dashboard.) Source: `EditorNav.svelte` → `.logo-butt | *— Admin —* | | | **Setup Steps** | Show the setup-steps panel — the setup cascade for the active runtime (16 steps under WSL2); see **hydrogen-setup-steps** / **hydrogen-setup** | | **Virgin Reset** | Open the virgin-reset panel — wipe + re-run setup (see **hydrogen-setup**) |-| **Browser Picker Manager** | Manage saved browser choices per domain (see **hd-browser-picker**) |+| **Browser Picker Manager** | Manage saved browser choices per domain (see **hydrogen-browser-picker**) | > **Removed items (do not list):** "Bridge Manager" (was a no-op with no backing > panel) and "Port Mappings…" (no such action exists in the code).@@ -58,8 +58,8 @@ Drive it programmatically with **hydrogen-eval** (`target:"shell"`): click ## Developer Tools The `devtools` capability is compiled into **all** builds (dev and release), so-"Open Developer Tools" works for end users too — HD is a developer tool. It opens-WebView2 DevTools as a **separate top-level window** (a window-bounded HD+"Open Developer Tools" works for end users too — Hydrogen is a developer tool. It opens+WebView2 DevTools as a **separate top-level window** (a window-bounded Hydrogen screenshot will NOT show it). Also reachable from the tray menu and via `POST /devtools` (or the `open_devtools` Tauri command). Pair with **hydrogen-eval** to inspect/inject into any panel.@@ -67,15 +67,15 @@ inspect/inject into any panel. ## Version readout — title bar + About dialog **Title bar** (always visible) shows, in order:-`Hydrogen v<version> · <dev|release> · <sha>-dirty · <build time> · <signed|unsigned> · AD <ad-version>`+`Hydrogen v<version> · <dev|release> · <sha>-dirty · <build time> · <signed|unsigned> · ab <ad-version>` — a fast way to confirm which build is running and whether it's signed. **About dialog** (deep version info) — open it from the **tray menu → "About Hydrogen"** (emits the `show-about` event; the dialog is mounted app-wide). It shows, for **both** Hydrogen and the embedded **Adom Bridge**: - Version, channel (dev/release), signed yes/no, commit SHA (+dirty), build time,- install path, and reachability/endpoint (for AD)-- Links to each app's GitHub repo and **Wiki v1 + Wiki v2** pages (they're git+ install path, and reachability/endpoint (for ab)+- Links to each app's GitHub repo and **wiki** pages (they're git repos now) Backed by the `get_about_info` Tauri command.@@ -84,6 +84,6 @@ Backed by the `get_about_info` Tauri command. - **hydrogen-profile-menu** — the upper-RIGHT avatar dropdown (don't confuse the two) - **hydrogen-settings** — the settings tree behind the **Settings** item - **hydrogen-api** — the control-API surface behind **API Explorer…**-- **hydrogen-capture-share** / **hd-recording** — the AV capture/record controls (Dev Toolbar)+- **hydrogen-capture-share** / **hydrogen-recording** — the AV capture/record controls (Dev Toolbar) - **hydrogen-setup** / **hydrogen-setup-steps** — what Setup Steps / Virgin Reset do - **hydrogen-eval** — drive these menu items / inject UI from the workspace
skills/hydrogen-api/SKILL.md+29−29@@ -3,18 +3,18 @@ name: hydrogen-api description: > Complete reference for Hydrogen control API endpoints. The control API runs on a dynamic port (find it via port discovery). Use these endpoints- to drive HD programmatically: manage the workspace runtime, control Claude+ to drive Hydrogen programmatically: manage the workspace runtime, control Claude Code, manipulate VS Code, manage workspace tabs, run setup steps, trigger virgin reset, and more. ~159 endpoints. Two self-documenting sources of truth list them live: GET /_manifest (curated grouped list) and GET /test/help (the /test/* diagnostics).- Trigger words: HD API, control API, HD endpoint, container exec, claude api,+ Trigger words: Hydrogen API, control API, Hydrogen endpoint, container exec, claude api, iframe eval, workspace tabs, setup run-all, runtime status, reload vscode, browser profiles, open url, virgin reset api, diagnostics, ad health, test window-tree, ai cursor, setup panel, screenshot mode. --- -# HD Control API Reference+# Hydrogen Control API Reference The control API exposes **~159 endpoints**. Don't trust a static count or list in this file to stay exhaustive — the API is **self-documenting**, with two live@@ -26,7 +26,7 @@ sources of truth you should hit first: | `GET /test/help` | Lists the `/test/*` diagnostics (window enumeration, UIA click, dialog classification, cascade reset). Gated behind `HD_TEST_API_ENABLED=1`. | `lib.rs:9723` | **Base URL:** `http://127.0.0.1:<dynamic>` — the loopback address. The port is-dynamic per launch; read the live URL from `~/.adom/hd-control-url` — see+dynamic per launch; read the live URL from `~/.adom/hydrogen-control-url` — see "Finding the Control Port" below. ## Finding the Control Port@@ -34,21 +34,21 @@ dynamic per launch; read the live URL from `~/.adom/hd-control-url` — see The control API port is dynamic (default 47084, auto-resolves conflicts). ```bash-# From HD log+# From Hydrogen log adom-bridge-cli hd_log '{"tail":100}' | grep "control=" -# From inside the workspace — USE THIS. HD writes its live control URL to a discovery+# From inside the workspace — USE THIS. Hydrogen writes its live control URL to a discovery # file every launch, so you never hunt for the dynamic port:-CTRL="$(cat ~/.adom/hd-control-url)"; curl -sf "$CTRL/health"+CTRL="$(cat ~/.adom/hydrogen-control-url)"; curl -sf "$CTRL/health" ``` -⭐ **From the workspace, read `~/.adom/hd-control-url`** (e.g. `http://127.0.0.1:<control>`) — a-file, NOT an env var (your non-interactive Bash shells don't source `.bashrc`/`profile.d`). HD+⭐ **From the workspace, read `~/.adom/hydrogen-control-url`** (e.g. `http://127.0.0.1:<control>`) — a+file, NOT an env var (your non-interactive Bash shells don't source `.bashrc`/`profile.d`). Hydrogen rewrites it with the live dynamic port every launch. This is the channel for the UI command bus, the live ports map, Claude control, etc. — distinct from `adom-cli` (`ADOM_HYDROGEN_URL` → SSE), which is unchanged for web-hydrogen parity. -> For the host-side ways to discover the port (HD log/`ports.json`) and the+> For the host-side ways to discover the port (Hydrogen log/`ports.json`) and the > host runtime endpoints (`/wsl/*`, `/docker/*`, `/system/reboot`), see the > [[hydrogen-api-windows]] companion skill. @@ -56,36 +56,36 @@ which is unchanged for web-hydrogen parity. | Method | Path | Description | |---|---|---|-| GET | `/health` | HD alive check — returns `{ok, port, service}` |+| GET | `/health` | Hydrogen alive check — returns `{ok, port, service}` | | GET | `/buildinfo` | Running build git SHA + build metadata (the only trustworthy "did my build ship?" check) | | GET | `/ports` | The 4 editable PortConfig ports (proxy, control, cdp, code_server) |-| GET | `/ports/all` | LIVE full port map — every port HD has bound, with status info |+| GET | `/ports/all` | LIVE full port map — every port Hydrogen has bound, with status info | -## AD-health diagnostics (`/ad/*`)+## ab-health diagnostics (`/ad/*`) -These verify the **adom-bridge-cli / relay / embedded-AD** half of HD is alive (the-bridge that connects this cloud container to HD). All GET, all return `{ok, ...}`.+These verify the **adom-bridge-cli / relay / embedded-ab** half of Hydrogen is alive (the+bridge that connects this cloud container to Hydrogen). All GET, all return `{ok, ...}`. | Method | Path | Description | |---|---|---|-| GET | `/ad/health` | Overall embedded-AD health roll-up |+| GET | `/ad/health` | Overall embedded-ab health roll-up | | GET | `/ad/process` | Is the adom-bridge-cli process running |-| GET | `/ad/embedded` | Embedded-AD module status |+| GET | `/ad/embedded` | Embedded-ab module status | | GET | `/ad/workspace-direct` | ⭐ The **converged** check — direct path to the workspace relay (use this one) | | GET | `/ad/relay` | Relay (WS/HTTP) reachability | | GET | `/ad/liveness-beacon` | Liveness beacon freshness | | GET | `/ad/direct-api` | Direct-API reachability | | GET | `/ad/discovery-file` | Discovery file present + parseable | -## Driving HD's UI (command bus)+## Driving Hydrogen's UI (command bus) -Open/close/toggle any HD menu, dialog, or panel — the first-class alternative to CDP clicking. See the `hydrogen-ui` skill.+Open/close/toggle any Hydrogen menu, dialog, or panel — the first-class alternative to CDP clicking. See the `hydrogen-ui` skill. | Method | Path | Body | Description | |---|---|---|---| | GET | `/ui/actions` | — | List every drivable UI action `{id,label,description,group}` (+ `_hints`) | | POST | `/ui/invoke` | `{"id":"ports.open"}` | Run a UI action; returns `{ok,value}` only after the frontend ran it |-| GET | `/auth-token` | HD session token |+| GET | `/auth-token` | Hydrogen session token | | GET | `/setup-status` | Overall setup completion state | | GET | `/diagnostics/all` | Run all diagnostic checks | | GET | `/diagnostics/{name}` | Run a single diagnostic check |@@ -120,7 +120,7 @@ These endpoints manage the active workspace runtime. | Method | Path | Body | Description | |---|---|---|---|-| POST | `/eval` | `{"js":"..."}` | JS eval in main HD webview |+| POST | `/eval` | `{"js":"..."}` | JS eval in main Hydrogen webview | | POST | `/iframe-eval` | `{"js":"...","contextIndex":N}` | JS eval in a specific iframe context (0-14) | | POST | `/cdp-eval` | `{"expression":"..."}` | Direct Chrome DevTools Protocol eval | | POST | `/click` | `{"x":N,"y":N}` | Click at coordinates in webview |@@ -147,7 +147,7 @@ glides it, and can click. Use for demos or when the user should see where the AI | Method | Path | Body | Description | |---|---|---|---|-| GET | `/capture/viewport` | — | Capture the HD webview viewport (PNG) |+| GET | `/capture/viewport` | — | Capture the Hydrogen webview viewport (PNG) | | POST | `/shot` | `{...}` | Screenshot primitive (see **hydrogen-self-screenshot** for the full workflow) | ### Port hints@@ -229,12 +229,12 @@ glides it, and can click. Use for demos or when the user should see where the AI | POST | `/setup/countdown` | `{"seconds":N,"message":"..."}` | Show countdown overlay | | GET | `/setup/trigger` | — | Read trigger file | | DELETE | `/setup/trigger` | — | Delete trigger file |-| POST | `/config-reset` | — | Reset HD config |+| POST | `/config-reset` | — | Reset Hydrogen config | > ⛔ **REFUSED as deprecated** (headless runs with no visible UI): > `POST /setup/run-all`, `POST /setup/run-step`, `POST /setup/virgin-reset`. > They return a refusal pointing at the UI-visible path.-> To run steps: use `POST /setup/step/<id>` or relaunch HD to auto-run the cascade.+> To run steps: use `POST /setup/step/<id>` or relaunch Hydrogen to auto-run the cascade. ### Setup panel control @@ -263,9 +263,9 @@ glides it, and can click. Use for demos or when the user should see where the AI | Method | Path | Body | Description | |---|---|---|---|-| POST | `/app/restart` | — | Restart the HD app (kills + respawns the binary) |-| POST | `/app/relaunch-frontend` | — | Relaunch the HD GUI (kill+respawn) while it is responsive |-| POST | `/window/foreground` | — | Bring the HD window to the foreground (unminimize + focus) |+| POST | `/app/restart` | — | Restart the Hydrogen app (kills + respawns the binary) |+| POST | `/app/relaunch-frontend` | — | Relaunch the Hydrogen GUI (kill+respawn) while it is responsive |+| POST | `/window/foreground` | — | Bring the Hydrogen window to the foreground (unminimize + focus) | > Host OS reboot (`/system/*`) is platform-specific — see the > [[hydrogen-api-windows]] companion skill.@@ -280,12 +280,12 @@ disabled" otherwise). `GET /test/help` self-lists the whole cluster. |---|---|---|---| | GET | `/test/help` | — | Self-lists every `/test/*` endpoint | | GET | `/test/window-tree` | — | Enumerate all visible top-level windows |-| POST | `/test/focus` | `{"window":"..."}` | Focus HD (`self`) or a window by title substring |+| POST | `/test/focus` | `{"window":"..."}` | Focus Hydrogen (`self`) or a window by title substring | | POST | `/test/click-uia` | `{...}` | Poll UIAutomation for a Button by Name; Invoke when found | | GET | `/test/setup-steps` | — | Raw setup-steps.json + derived summary (alias: `/test/install-steps`) | | POST | `/test/dump-state` | `{...}` | Write a diagnostic bundle (logs, install-steps, runtime state, tasklist, window-tree) | | POST | `/test/reset-cascade` | — | Delete install-steps.json + emit setup-reset event |-| POST | `/test/screenshot-hd-window` | `{...}` | Capture HD's own window to a PNG file |+| POST | `/test/screenshot-hydrogen-window` | `{...}` | Capture Hydrogen's own window to a PNG file | > The `/test/probe-dialogs` endpoint (classifies UAC / WSL2-update / MSI / > Docker-EULA blocker windows) is Windows-specific — see the
skills/hydrogen-bridges/SKILL.md+18−18@@ -1,7 +1,7 @@ --- name: hydrogen-bridges description: >- Complete reference for the HD bridge ecosystem: the built-in KiCad, Fusion 360,+ Complete reference for the Hydrogen bridge ecosystem: the built-in KiCad, Fusion 360, and Puppeteer bridges, plus the extensible wiki bridge catalog (e.g. Blender) and the full set of Adom Bridge capabilities. How they connect through adom-bridge-cli, the Bridge Manager dialog, bridge status polling, and all bridge CLI commands. Use when the AI@@ -14,14 +14,14 @@ description: > # Hydrogen -- Bridge Ecosystem -HD is the bridge between your Docker container and the user's Windows desktop.+Hydrogen is the bridge between your Docker container and the user's Windows desktop. All commands go through the relay at ws://localhost:8765/. --- ## Bridge Architecture -HD launches external bridge processes **on demand**. This is an **extensible**+Hydrogen launches external bridge processes **on demand**. This is an **extensible** ecosystem, not a fixed list — new bridges ship via the wiki catalog (see "Extensible bridge catalog" below). The core/first-party bridges: @@ -33,12 +33,12 @@ ecosystem, not a fixed list — new bridges ship via the wiki catalog (see **Bridge ports have conventional defaults** (KiCad **8771**, Fusion **8773**, Pup **8851**), but adom-bridge-cli registers the **live** port at bridge launch and may pick a different one if a default is taken. To find the actual live port, run `adom-bridge-cli status` and look at `desktop.apps.<bridge>.bridgePort` (or `adom-bridge-cli bridge_list`). In practice you don't need the port directly — use the `adom-bridge-cli <verb>` CLI which routes to the right bridge automatically. -Bridges are launched on demand by HD. They are NOT always running. The Bridge+Bridges are launched on demand by Hydrogen. They are NOT always running. The Bridge Manager polls status every 15 seconds via Tauri `invoke('get_bridge_status')`. ### What Adom Bridge can do (live capability list) -Bridges are only part of AD. Query the **authoritative, machine-specific** list:+Bridges are only part of ab. Query the **authoritative, machine-specific** list: ```bash adom-bridge-cli status # → .capabilities and .desktop.apps@@ -52,7 +52,7 @@ Mapping to where each is documented: |---|---|---| | `kicad` / `fusion360` / `browser` | the three built-in app bridges | this skill | | `screenshot` / `record` / `caption` | OS screenshots, screen/tab recording, recording captions | this skill (screenshots/recording); `caption` is recording-caption support |-| `files` | send_files / pull_file | **hd-file-transfer**, **hydrogen-adom-desktop** |+| `files` | send_files / pull_file | **hydrogen-file-transfer**, **hydrogen-adom-desktop** | | `notify` | desktop toast notifications | this skill | | `shell` | run a command on the user's PC (approval-gated) | **hydrogen-adom-desktop** | | `usb` | USB passthrough to the workspace (e.g. workcell hardware over USBIP) | not yet covered — query `adom-bridge-cli status`; future skill |@@ -99,7 +99,7 @@ each bridge's status. Auto-refreshes every 15 seconds. ### Features - Status badges with color-coded icons - Per-bridge install links when the target app is missing-- "Browse Bridge Catalog" button linking to the wiki (`/apps?tag=hd-bridge`)+- "Browse Bridge Catalog" button linking to the wiki (`/apps?tag=hydrogen-bridge`) - Polls `invoke('get_bridge_status')` on mount and every 15 seconds > **App missing? You can auto-install it.** When the target app isn't installed,@@ -158,8 +158,8 @@ setTimeout(function() { ## Prerequisites -Check connection: `adom-bridge-cli ping` -- returns "pong" if HD is connected.-If not connected, the user needs to launch HD on their Windows machine.+Check connection: `adom-bridge-cli ping` -- returns "pong" if Hydrogen is connected.+If not connected, the user needs to launch Hydrogen on their Windows machine. --- @@ -279,10 +279,10 @@ bridge catalog** and installed on demand — for example the **Blender bridge** (`adom-blender-bridge`), which is NOT built in (it won't appear in `adom-bridge-cli status` until installed). To use a catalog bridge: -- **Discover:** Bridge Manager → "Browse Bridge Catalog" → wiki `/apps?tag=hd-bridge`.+- **Discover:** Bridge Manager → "Browse Bridge Catalog" → wiki `/apps?tag=hydrogen-bridge`. - **Reserved ports:** the `8900-8999` range is set aside for 3rd-party bridges. - **Enumerate what's actually live:** `adom-bridge-cli status` → `desktop.apps.*` lists- every bridge AD currently knows about, with `bridgePort`, `status`, and whether+ every bridge ab currently knows about, with `bridgePort`, `status`, and whether the target app was detected. **Treat that as the source of truth** for "what bridges exist right now" — this skill's table lists the core ones, but new catalog bridges will appear in `status` without being in this table.@@ -326,12 +326,12 @@ adom-bridge-cli shell_execute '{"command": "dir C:\\Github"}' ## Screen Recording -> **Served by the embedded AD process, NOT HD's built-in bridge.** The+> **Served by the embedded ab process, NOT Hydrogen's built-in bridge.** The > `desktop_record_*` / `desktop_recorder_*` verbs only exist when the standalone-> AD (spawned `--embedded`) is connected. Verify before using:+> ab (spawned `--embedded`) is connected. Verify before using: > `adom-bridge-cli status` → `.capabilities` must include `record`. If it's absent,-> only HD's built-in bridge is up and these verbs return "unknown desktop-> command". See **hd-recording** for full details.+> only Hydrogen's built-in bridge is up and these verbs return "unknown desktop+> command". See **hydrogen-recording** for full details. > **Tab-vs-desktop footgun.** `desktop_record_start` records the **whole screen** > and requires an explicit `confirmDesktopNotTabRecording:true` guard so you don't@@ -340,7 +340,7 @@ adom-bridge-cli shell_execute '{"command": "dir C:\\Github"}' > the Puppeteer bridge, no whole-screen capture). ```bash-# Record entire desktop (AD-served; needs the confirm guard, zero dialogs)+# Record entire desktop (ab-served; needs the confirm guard, zero dialogs) adom-bridge-cli desktop_record_start '{"reason": "Demo recording", "confirmDesktopNotTabRecording": true}' adom-bridge-cli desktop_record_stop @@ -367,7 +367,7 @@ adom-bridge-cli desktop_screenshot_screen '{"maxWidth": 1500}' ## Browser Profiles -HD can detect all browser profiles installed on the user's machine and open+Hydrogen can detect all browser profiles installed on the user's machine and open URLs in specific browsers/profiles. **Control API endpoints**:@@ -384,7 +384,7 @@ URLs in specific browsers/profiles. - **hydrogen-ui** -- Adom menu layout where Bridge Manager lives - **hydrogen-networking** -- port architecture (conventional bridge ports + dynamic registration) - **hydrogen-adom-menu** -- the API Explorer (has bridge-related endpoints)-- **hydrogen-settings** -- HD settings surface+- **hydrogen-settings** -- Hydrogen settings surface - **hydrogen-self-screenshot** -- host screenshots, window control, and the ralph loop - **kicad-interaction** -- foundational KiCad desktop interaction rules - **pup** -- Puppeteer browser control via pup CLI
skills/hydrogen-captions/SKILL.md+14−14@@ -4,9 +4,9 @@ description: > Paint labeled caption text on the Hydrogen workspace for demos/walkthroughs — captions are CAPTURED BY RECORDINGS so they show up in the finished video. Drive the WORKSPACE caption with `adom-cli hydrogen caption` — THE default, identical on- web-Hydrogen AND HD (text positional; `-d` duration in SECONDS not ms; 30s auto-expire+ web-Hydrogen AND Hydrogen (text positional; `-d` duration in SECONDS not ms; 30s auto-expire by default, 5-min hard cap, newest-wins, `hide` to clear; a raw-HTTP- `POST .../current/caption` fallback exists for scripts hitting HD's API directly).+ `POST .../current/caption` fallback exists for scripts hitting Hydrogen's API directly). Distinct from toasts (notifications) and TTS (audio). NOTE: a full-DESKTOP overlay (over every window, on top of other apps) exists as a platform-specific companion — see [[hydrogen-captions-windows]]. Trigger words — caption, on-screen caption, workspace@@ -29,16 +29,16 @@ so they end up in the finished video ("Step 3: run DRC →"). > - **toasts** — corner pop-ups via `POST /ui/toast` (transient notifications, see > `hydrogen-notifications`); a caption is centered narration, a toast is a corner alert. > - **TTS** *audio* narration (`adom-tts`) — pair a caption with TTS for a narrated walkthrough.-> - the internal **auth-overlay caption** HD draws for login/auth flows — not something+> - the internal **auth-overlay caption** Hydrogen draws for login/auth flows — not something > you trigger for demos. The workspace caption below is the one you drive. ## Two caption surfaces — pick by WHAT you're recording -HD has **two** caption surfaces, each captured by a *different* kind of recording:+Hydrogen has **two** caption surfaces, each captured by a *different* kind of recording: | Surface | Command | Renders | Captured by | Use when | |---|---|---|---|---|-| **Workspace caption** | `adom-cli hydrogen caption` | **inside the HD workspace** (webview overlay, web-Hydrogen style) | a recording/screenshot of the **HD window** (panel/workspace) | the demo is **inside HD** — captioning the workspace itself |+| **Workspace caption** | `adom-cli hydrogen caption` | **inside the Hydrogen workspace** (webview overlay, web-Hydrogen style) | a recording/screenshot of the **Hydrogen window** (panel/workspace) | the demo is **inside Hydrogen** — captioning the workspace itself | | **Desktop overlay** | platform-specific (see [[hydrogen-captions-windows]]) | **over the WHOLE desktop**, above every window | a **full-screen / desktop** recording | the demo shows **other apps** (KiCad, Fusion, a browser) or the whole screen | **Match the caption to the recording.** A `screenshot panel` / workspace capture sees the@@ -52,9 +52,9 @@ screen pixels). Pick wrong and your caption won't be in the video. ## Workspace caption — `adom-cli hydrogen caption` ⭐ THE DEFAULT -**Reach for this FIRST.** It's the *same* command on web Hydrogen and HD (adom-cli routes-through HD's workspace-events server → SSE → the frontend `captionStore`), so it stays-consistent across both — same principle as screenshots. Renders centered **inside the HD+**Reach for this FIRST.** It's the *same* command on web Hydrogen and Hydrogen (adom-cli routes+through Hydrogen's workspace-events server → SSE → the frontend `captionStore`), so it stays+consistent across both — same principle as screenshots. Renders centered **inside the Hydrogen workspace webview**. `show` takes the TEXT as a **positional arg** (NOT `--text`); the only flags are `-d`/`--duration`, `-p`/`--position`, `-s`/`--size` (no `id`, `x`/`y`, or `fontSize` — those are desktop-overlay-only). Subcommands: `show` / `hide`.@@ -72,9 +72,9 @@ default already covers "leave it up while I do a thing." (Note: the *desktop ove the platform companion uses **milliseconds** — the two surfaces differ; don't cross the units.) -> **Web-Hydrogen vs HD parity:** the **command + the SECONDS unit + `hide` are identical**+> **Web-Hydrogen vs Hydrogen parity:** the **command + the SECONDS unit + `hide` are identical** > on both (center/large rendering, `-d 20` held visibly). BUT the sane **lifecycle below-> (30s default / 300s cap / persist)** is verified on HD; web Hydrogen may still return the+> (30s default / 300s cap / persist)** is verified on Hydrogen; web Hydrogen may still return the > *older terse `_hint`* ("auto-hides after the specified duration") and may not enforce the > 30s-default/300s-cap yet. **So on web Hydrogen, don't assume a fat `-d` self-heals — pass > a sane duration.**@@ -87,7 +87,7 @@ units.) - **Newest wins:** showing another caption replaces the current one; `hide` clears immediately. - **No "forever" via adom-cli** — its `-d` is an unsigned int (rejects negatives) by design. This is a **feature, not a gap**: adom-cli is the same binary on web-Hydrogen and- HD, so "no persist via adom-cli" keeps both consistent and bounded (no abandoned+ Hydrogen, so "no persist via adom-cli" keeps both consistent and bounded (no abandoned captions). A persist-until-hidden escape exists ONLY on the raw HTTP endpoint (`{"duration":-1}`, below) — rarely needed. - **No `caption status` verb (yet).** There's no way to query "is a caption up / how long@@ -96,8 +96,8 @@ units.) those). `-s` size: `small` / `medium` / `large`. - Needs a live workspace/editor session (the server returns 409 if none). -### Direct HTTP fallback — only for scripts already hitting HD's API-adom-cli is the consistent default; use HTTP **only** when a script talks to HD's API+### Direct HTTP fallback — only for scripts already hitting Hydrogen's API+adom-cli is the consistent default; use HTTP **only** when a script talks to Hydrogen's API directly. It's the **same caption, same lifecycle** — adom-cli just wraps this path with the workspace owner/repo. The caption lives on the **workspace-events server** (`ADOM_HYDROGEN_URL`, the proxy) — **NOT the control port**:@@ -118,7 +118,7 @@ Body: `{text, duration (SECONDS), position, size}`; clear with `{hide:true}`. ## Desktop overlay caption (over the whole screen) For a caption that floats over **every window** (above other apps, the whole desktop) —-with ids, corners, and normalized x/y placement — HD provides a native always-on-top,+with ids, corners, and normalized x/y placement — Hydrogen provides a native always-on-top, click-through desktop overlay. That surface and its arguments are **platform-specific**; see **[[hydrogen-captions-windows]]**.
skills/hydrogen-capture-share/SKILL.md+23−23@@ -1,15 +1,15 @@ --- name: hydrogen-capture-share description: >- The in-HD screen-share + AI-consent surface that lets YOU (the AI) screenshot+ The in-Hydrogen screen-share + AI-consent surface that lets YOU (the AI) screenshot the editor or the whole screen into the container. Covers the Screen Capture dropdown in the editor toolbar (Share this tab / Share entire screen / Stop sharing, plus Workspace / Full-screen screenshot), the Webview-vs-Pup Window mode toggle, the panel/workspace/screen capture scopes + Element-Capture RestrictionTarget, and the AI sharing-approval flow: SharingApprovalDialog- ("AI wants access" + your reason), the ~3s auto-approve in HD, and the+ ("AI wants access" + your reason), the ~3s auto-approve in Hydrogen, and the cancelable CountdownToast before capture starts. READ THIS before trying to- screenshot the editor — a screenshot of HD's own UI requires an active share.+ screenshot the editor — a screenshot of Hydrogen's own UI requires an active share. Trigger words — screen share, share this tab, share screen, screen capture dropdown, capture the editor, screenshot the workspace, workspace screenshot, AI wants access, sharing approval, consent dialog, countdown toast, start@@ -19,15 +19,15 @@ description: > # Hydrogen — Screen Capture & Sharing (the AI-consent surface) -This is the surface **you (the AI) trigger to see HD's own screen.** To screenshot+This is the surface **you (the AI) trigger to see Hydrogen's own screen.** To screenshot the *editor* (panels, the workspace, or the whole monitor) into the container, a-**screen share must be active first.** You request it, the user consents once (HD+**screen share must be active first.** You request it, the user consents once (Hydrogen auto-approves in ~3s), a brief countdown plays, then you can capture frames. > This is **not** the same as host OS screenshots. `desktop_screenshot_*` > (see [hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md)) take true OS screenshots via-> AD with zero dialogs. This skill is the **in-webview** share that captures what-> HD itself is rendering (the editor) via the browser's `getDisplayMedia`/Element+> ab with zero dialogs. This skill is the **in-webview** share that captures what+> Hydrogen itself is rendering (the editor) via the browser's `getDisplayMedia`/Element > Capture, gated by an in-app consent dialog. And it is distinct from > [hydrogen-permissions](../hydrogen-permissions/SKILL.md) (WebView2 auto-granting mic/cam OS > permissions) — that's a different layer.@@ -41,7 +41,7 @@ Store: `src/lib/stores/screenCaptureStore.ts`. | Option | Description | What you get | |---|---|---|-| **Share this tab** | "Panels and workspace screenshots" | Captures HD's own webview — panels + workspace |+| **Share this tab** | "Panels and workspace screenshots" | Captures Hydrogen's own webview — panels + workspace | | **Share entire screen** | "Full display including other apps" | Captures the whole monitor (or a chosen window) | **While sharing**, it shows `Sharing <surface>` ("entire screen" / "window" / "this@@ -57,8 +57,8 @@ tab") plus capture actions: Below the share options is a **Window mode** toggle with two buttons — **Webview** and **Pup** (`windowModeStore`). It selects which window surface-capture/recording targets: HD's own embedded Webview, or a Pup (Puppeteer)-browser window. Webview = "see HD itself"; Pup = "see the AI-driven browser."+capture/recording targets: Hydrogen's own embedded Webview, or a Pup (Puppeteer)+browser window. Webview = "see Hydrogen itself"; Pup = "see the AI-driven browser." ## Capture scopes & how a frame is taken @@ -71,7 +71,7 @@ type CaptureScope = 'screen' | 'workspace' | 'panel'; | Scope | Function | What it captures | |---|---|---| | `panel` | `capturePanel(panelId)` | a single editor panel |-| `workspace` | `captureWorkspace()` | the whole HD workspace surface |+| `workspace` | `captureWorkspace()` | the whole Hydrogen workspace surface | | `screen` | `captureScreen()` | the full display / shared window | Other store entry points you'll see: `startTabCapture()`, `startScreenCapture()`,@@ -83,19 +83,19 @@ where `displaySurface` is `'browser'` (tab) / `'window'` / `'monitor'`. ### Element Capture (RestrictionTarget) -When `'RestrictionTarget' in window` and `getDisplayMedia` are available, HD can+When `'RestrictionTarget' in window` and `getDisplayMedia` are available, Hydrogen can **restrict a tab capture to a single DOM element** so only that panel is in frame: `restrictCaptureTo(el)` builds a `RestrictionTarget.fromElement(el)` and calls `track.restrictTo(target)` (a short ~3s settle window). This is how a panel-scoped capture yields just the panel, not the whole webview. -> Native (Tauri) note: inside HD, tab/screen snapshots come from the native CDP+> Native (Tauri) note: inside Hydrogen, tab/screen snapshots come from the native CDP > path rather than a live `MediaStream`; the store still flips `isSharing` and sets > `displaySurface` to `'window'`/`'monitor'` so the same UI flow applies. ## The AI sharing-approval flow -When you (or a bridge) need screen/mic access, HD shows a consent gate before any+When you (or a bridge) need screen/mic access, Hydrogen shows a consent gate before any capture. Source: `src/lib/components/editor/SharingApprovalDialog.svelte`, store `src/lib/stores/sharingApprovalStore.ts`. @@ -109,13 +109,13 @@ The request you send carries: highlighted box. **Send a clear, specific reason** — it's the only thing the user sees to decide. ("Screenshot the schematic panel to verify the layout," not "capture screen.")-- **HD auto-approves after ~3 s** (`AUTO_MS = 3000`), showing- "Auto permission will be given in N…". This is the HD-only fast path so you're+- **Hydrogen auto-approves after ~3 s** (`AUTO_MS = 3000`), showing+ "Auto permission will be given in N…". This is the Hydrogen-only fast path so you're not blocked on hands-free flows. - **The user can override before it auto-fires:** flip share-type between **Share this tab** and **Share entire screen**, toggle the **mic**, or pick a mic device. Any interaction cancels the auto-countdown so they stay in control.-- On approve, HD starts the screen share first (tab or screen), then mic if+- On approve, Hydrogen starts the screen share first (tab or screen), then mic if requested, and returns a result (`status: 'approved'`, with `sharing` + `mic` details) to the requesting bridge. @@ -129,20 +129,20 @@ the toast is a real, abortable delay. ## What this means for you (the AI) -1. **To screenshot HD's editor you need an active share.** If you're not sharing,+1. **To screenshot Hydrogen's editor you need an active share.** If you're not sharing, call `promptScreenCapture(...)` / send a sharing request with a reason; don't silently fail a `capturePanel`/`captureWorkspace`. 2. **Write the reason for a human.** It's your one chance to justify the access. 3. **Respect the override + countdown.** The user may switch share-type, deny mic, or cancel the countdown — read the returned result before claiming success. 4. **Pick the right scope:** `panel` (one panel, Element-Capture-restricted),- `workspace` (the HD surface), or `screen` (full display). Use Window mode- (Webview vs Pup) to choose HD's own UI vs the AI browser.-5. **For host-OS screenshots that need no share at all,** use AD's+ `workspace` (the Hydrogen surface), or `screen` (full display). Use Window mode+ (Webview vs Pup) to choose Hydrogen's own UI vs the AI browser.+5. **For host-OS screenshots that need no share at all,** use ab's `desktop_screenshot_*` instead (see Related skills). ## Related skills-- [hd-recording](../hd-recording/SKILL.md) — screen/mic recording (same share + countdown machinery; in-app .webm recorder + AD desktop recording)+- [hydrogen-recording](../hydrogen-recording/SKILL.md) — screen/mic recording (same share + countdown machinery; in-app .webm recorder + ab desktop recording) - [hydrogen-self-screenshot](../hydrogen-self-screenshot/SKILL.md) — CDP per-panel screenshots + shotlog visual-verify loop - [hydrogen-permissions](../hydrogen-permissions/SKILL.md) — WebView2 auto-granting OS mic/cam/notification permissions (a *different* layer from this consent dialog)-- [hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md) — AD's dialog-free host OS screenshots (`desktop_screenshot_screen/_window`)+- [hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md) — ab's dialog-free host OS screenshots (`desktop_screenshot_screen/_window`)
skills/hydrogen-claude-auth/SKILL.md+14−14@@ -1,11 +1,11 @@ --- name: hydrogen-claude-auth-description: How Claude Code authenticates inside HD — the OAuth flow that opens in your browser via the Browser Picker, where credentials are stored on host vs workspace, how HD backs them up so a workspace rebuild doesn't make you re-auth, the virgin-reset toggle that wipes Claude creds, and the 4-technique auth cascade HD runs if Claude isn't authenticated. READ when troubleshooting "Claude not authenticated", expired Claude tokens, re-authenticating after a virgin reset, or wondering where Claude credentials live. Trigger words — claude auth, claude code login, claude code authentication, claude not authenticated, claude oauth, claude credentials, claude session, claude.ai subscription, replay-claude-credentials.json, claude-auth, claude credential backup, claude re-auth, claude expired, claude.ai subscription button.+description: How Claude Code authenticates inside Hydrogen — the OAuth flow that opens in your browser via the Browser Picker, where credentials are stored on host vs workspace, how Hydrogen backs them up so a workspace rebuild doesn't make you re-auth, the virgin-reset toggle that wipes Claude creds, and the 4-technique auth cascade Hydrogen runs if Claude isn't authenticated. READ when troubleshooting "Claude not authenticated", expired Claude tokens, re-authenticating after a virgin reset, or wondering where Claude credentials live. Trigger words — claude auth, claude code login, claude code authentication, claude not authenticated, claude oauth, claude credentials, claude session, claude.ai subscription, replay-claude-credentials.json, claude-auth, claude credential backup, claude re-auth, claude expired, claude.ai subscription button. --- -# HD Claude Auth — how Claude Code signs in+# Hydrogen Claude Auth — how Claude Code signs in -Claude Code (the VS Code extension inside your HD workspace) authenticates separately from your Adom login. HD takes responsibility for making sure Claude is signed in throughout workspace rebuilds so you don't have to re-authenticate every time.+Claude Code (the VS Code extension inside your Hydrogen workspace) authenticates separately from your Adom login. Hydrogen takes responsibility for making sure Claude is signed in throughout workspace rebuilds so you don't have to re-authenticate every time. For Adom auth (your hydrogen.adom.inc login), see [hydrogen-adom-auth](../hydrogen-adom-auth/SKILL.md). This skill is Claude-Code-specific. @@ -13,40 +13,40 @@ For Adom auth (your hydrogen.adom.inc login), see [hydrogen-adom-auth](../hydrog 1. The Claude Code extension panel shows a "Claude.ai Subscription" button when it isn't authenticated. 2. Clicking opens an OAuth URL to `claude.ai`.-3. HD's Browser Picker intercepts the URL (since it's a `*.claude.ai` link). The "Claude auth" branded variant of the picker appears with the work browser profile pre-selected and a 5-second auto-countdown.+3. Hydrogen's Browser Picker intercepts the URL (since it's a `*.claude.ai` link). The "Claude auth" branded variant of the picker appears with the work browser profile pre-selected and a 5-second auto-countdown. 4. The browser opens the Claude OAuth page; you complete sign-in (or it auto-completes if you're already signed in to claude.ai). 5. Claude returns OAuth credentials, which the extension stores at `/home/adom/.claude/.credentials.json` inside the workspace.-6. HD's setup step `claude-auth` notices the new credentials and **backs them up to the host** (in HD's app-data directory, as `replay-claude-credentials.json`) so future workspace rebuilds can replay them. The exact host path is platform-specific — see the platform layer for where it lives on your OS.+6. Hydrogen's setup step `claude-auth` notices the new credentials and **backs them up to the host** (in Hydrogen's app-data directory, as `replay-claude-credentials.json`) so future workspace rebuilds can replay them. The exact host path is platform-specific — see the platform layer for where it lives on your OS. ## Where Claude credentials live | Layer | Location | Purpose | |-------|----------|---------| | Inside workspace (live) | `/home/adom/.claude/.credentials.json` | Active credentials the extension and `claude` CLI both read |-| Host-side backup | `replay-claude-credentials.json` in HD's app-data dir on the host | Backup so a fresh workspace can be re-authenticated without re-OAuth |+| Host-side backup | `replay-claude-credentials.json` in Hydrogen's app-data dir on the host | Backup so a fresh workspace can be re-authenticated without re-OAuth | | VS Code secret store (in code-server's user data) | webview-internal, can't be inspected directly | The extension also keeps a secret per panel; this is what dictates the chat UI showing vs the auth button | **Key insight**: each Claude Code panel instance keeps its own auth state. If one panel says "not authenticated", opening a NEW Claude Code conversation panel often shows the auth button fresh and lets you sign in cleanly. -## How HD keeps you signed in across workspace rebuilds+## How Hydrogen keeps you signed in across workspace rebuilds When you virgin-reset and rebuild the workspace (assuming you DON'T check the "Claude credentials" toggle): 1. Workspace deleted + recreated by setup steps-2. Step `claude-auth` runs early — reads the `replay-claude-credentials.json` backup from HD's host app-data dir+2. Step `claude-auth` runs early — reads the `replay-claude-credentials.json` backup from Hydrogen's host app-data dir 3. If the file exists AND the `expiresAt` is still in the future → copies it into the new workspace at `/home/adom/.claude/.credentials.json` 4. Claude Code extension reads it on first launch → user stays signed in -If credentials are expired or missing, HD runs the **auth cascade** to get you signed in without manual fiddling.+If credentials are expired or missing, Hydrogen runs the **auth cascade** to get you signed in without manual fiddling. ## The 4-technique auth cascade -If Claude isn't authenticated after setup, HD tries each technique in order until one works. Each call logs to the setup panel output so you see exactly what's happening.+If Claude isn't authenticated after setup, Hydrogen tries each technique in order until one works. Each call logs to the setup panel output so you see exactly what's happening. | # | Technique | What it does | |---|-----------|--------------| | 1 | Detect auth failure | Scans all VS Code webview contexts for the "Claude.ai Subscription" button / "How do you want to log in?" text. Confirms whether the auth UI is reachable. |-| 2 | Open NEW conversation + auto-click auth button | The new-conversation panel re-evaluates auth state and shows the button cleanly. HD clicks it via the webview eval channel. |+| 2 | Open NEW conversation + auto-click auth button | The new-conversation panel re-evaluates auth state and shows the button cleanly. Hydrogen clicks it via the webview eval channel. | | 3 | Open Claude editor + auto-click auth button | If technique 2 didn't trigger a fresh auth state, opens a Claude editor (different VS Code command) and tries the same click. | | 4 | CLI fallback (`claude auth login`) | Runs `claude auth login` inside the workspace, extracts the OAuth URL from stdout, opens it in your browser via the Browser Picker. You paste the returned code into a VS Code terminal. | @@ -70,17 +70,17 @@ The setup panel's Virgin Reset section has a per-Claude-creds toggle: - A SECOND panel still has stale auth state. Close all Claude Code panels and open one fresh — it'll read the new credentials. **Credentials backup file exists but Claude says expired**-- Open the `replay-claude-credentials.json` backup (in HD's host app-data dir) and check the `expiresAt` (epoch ms). Compare to current time. If past, you need to re-OAuth. HD's auth cascade will handle this on next setup run.+- Open the `replay-claude-credentials.json` backup (in Hydrogen's host app-data dir) and check the `expiresAt` (epoch ms). Compare to current time. If past, you need to re-OAuth. Hydrogen's auth cascade will handle this on next setup run. **`claude auth status` says `loggedIn: true` but the extension says not authenticated** - **Known quirk**: the CLI and the VS Code extension use SEPARATE credential stores. `claude auth status` checks the CLI store; the extension uses VS Code secrets. Trust the extension UI (the "Claude.ai Subscription" button) over the CLI's status output. **OAuth callback fails / browser shows "connection refused"**-- The callback URL is hitting a local port that HD hasn't forwarded to the host. Check the HD log for `[oauth] Callback port N detected` — HD should auto-start a proxy for it. If not, register the port manually via `adom-cli port-forward register <port> --visibility external`. (How host↔workspace port forwarding works is platform-specific — see the platform layer.)+- The callback URL is hitting a local port that Hydrogen hasn't forwarded to the host. Check the Hydrogen log for `[oauth] Callback port N detected` — Hydrogen should auto-start a proxy for it. If not, register the port manually via `adom-cli port-forward register <port> --visibility external`. (How host↔workspace port forwarding works is platform-specific — see the platform layer.) ## Related skills - [hydrogen-adom-auth](../hydrogen-adom-auth/SKILL.md) — Adom (hydrogen.adom.inc) login, separate from Claude-- [hd-browser-picker](../hd-browser-picker/SKILL.md) — the Browser Picker that routes the Claude OAuth URL, including the branded "Claude auth" variant+- [hydrogen-browser-picker](../hydrogen-browser-picker/SKILL.md) — the Browser Picker that routes the Claude OAuth URL, including the branded "Claude auth" variant - `hydrogen-setup-steps` — the `claude-auth` step and the auth cascade are part of setup - `hydrogen-volume` — explains why the host-side backup survives workspace rebuild
skills/hydrogen-container-stats/SKILL.md+9−9@@ -1,17 +1,17 @@ --- name: hydrogen-container-stats-description: HD's workspace stats indicator in the top-right of the title bar — two thin progress bars (CPU + RAM) labelled "Container" plus an info tooltip on hover that shows the workspace name, CPU vs total cores, RAM usage vs limit, disk usage, image, ID, and creation date. Polls once per second when running, every 5 seconds when stopped. Status badges show stopped / starting / restarting / restart-needed states. Use this skill when the user asks about CPU/RAM usage, the resource bars in HD's title bar, workspace disk usage, the "restart needed" badge, why bars are red/yellow, or what's in the tooltip. Trigger words — container stats, workspace stats, container cpu, container ram, container disk, resource bars, cpu bar, ram bar, container tooltip, container indicator, top bar stats, restart needed badge, container stopped badge, container starting, workspace_stats, workspace stats.+description: Hydrogen's workspace stats indicator in the top-right of the title bar — two thin progress bars (CPU + RAM) labelled "Container" plus an info tooltip on hover that shows the workspace name, CPU vs total cores, RAM usage vs limit, disk usage, image, ID, and creation date. Polls once per second when running, every 5 seconds when stopped. Status badges show stopped / starting / restarting / restart-needed states. Use this skill when the user asks about CPU/RAM usage, the resource bars in Hydrogen's title bar, workspace disk usage, the "restart needed" badge, why bars are red/yellow, or what's in the tooltip. Trigger words — container stats, workspace stats, container cpu, container ram, container disk, resource bars, cpu bar, ram bar, container tooltip, container indicator, top bar stats, restart needed badge, container stopped badge, container starting, workspace_stats, workspace stats. --- -# HD Workspace Stats Indicator+# Hydrogen Workspace Stats Indicator -The top-right of HD's title bar (next to the audio/video icons and your profile avatar) shows a tiny `Container` block with two horizontal progress bars — CPU% and RAM% — that animate in real-time. Hovering brings up a tooltip with the full workspace details. The numbers reflect your **local HD workspace**; the header reads "Container" on all platforms.+The top-right of Hydrogen's title bar (next to the audio/video icons and your profile avatar) shows a tiny `Container` block with two horizontal progress bars — CPU% and RAM% — that animate in real-time. Hovering brings up a tooltip with the full workspace details. The numbers reflect your **local Hydrogen workspace**; the header reads "Container" on all platforms. > Platform layers add a `*-windows` companion ([[hydrogen-container-stats-windows]]) with the host-specific probe — the WSL `workspace_stats()` health check, `wsl --terminate` restart, the benign `[docker]` log line, and distro disk semantics. ## How often it polls -There's an active polling loop in HD's title bar that asks the runtime for fresh stats on a timer:+There's an active polling loop in Hydrogen's title bar that asks the runtime for fresh stats on a timer: - **Every 1 second** when the workspace is `running` — for live, smooth bar animation - **Every 5 seconds** when it's `stopped`, `starting`, `restarting`, or `restart needed` — saves cycles when nothing's changing@@ -57,8 +57,8 @@ The `Container` text in the section header gets an inline status badge depending |-------|---------|-------| | (no badge) | Running normally | normal | | `stopped` | Workspace registered but not running | red |-| `starting` | HD is starting the workspace / code-server | yellow |-| `restarting` | HD is restarting the workspace | yellow |+| `starting` | Hydrogen is starting the workspace / code-server | yellow |+| `restarting` | Hydrogen is restarting the workspace | yellow | | `restart needed` | The workspace or code-server is unreachable (usually a hiccup after the host wakes from sleep) | red | When `restart needed` shows, open the Adom menu → Restart Workspace (see the `[[hydrogen-ui]]` skill for the Adom menu). A "Restart" here terminates and re-ensures the workspace + code-server.@@ -78,10 +78,10 @@ If you want the same stats data your AI can hit directly via the control API: ```bash # From inside the workspace — query the control API on the host-curl -s "$(cat ~/.adom/hd-control-url)/container-stats"+curl -s "$(cat ~/.adom/hydrogen-control-url)/container-stats" ``` -(Read the live URL from `~/.adom/hd-control-url` rather than hardcoding it — the port is **dynamic per launch**.)+(Read the live URL from `~/.adom/hydrogen-control-url` rather than hardcoding it — the port is **dynamic per launch**.) Returns JSON like: ```json@@ -124,7 +124,7 @@ Or if the workspace is in a broken state: **"Why does RAM stay constant at ~4% even when I'm doing nothing?"** Code-server, the relay, gallia, the adom-vscode HTTP API, etc. all run in the workspace all the time. ~700 MB baseline is normal. -**"The 'restart needed' badge appeared — what happened?"** Almost always a hiccup after the host woke from sleep/hibernate, leaving the workspace or code-server unreachable. Click Restart Workspace in the Adom menu (top-left); HD restarts the workspace, re-ensures code-server, and the badge clears.+**"The 'restart needed' badge appeared — what happened?"** Almost always a hiccup after the host woke from sleep/hibernate, leaving the workspace or code-server unreachable. Click Restart Workspace in the Adom menu (top-left); Hydrogen restarts the workspace, re-ensures code-server, and the badge clears. **"Disk is 1.3 GB — does that include my project files?"** Yes — `/home/adom/project` lives inside the workspace, so the `Disk:` figure includes your project.
skills/hydrogen-container/SKILL.md+10−10@@ -1,11 +1,11 @@ --- name: hydrogen-container-description: Context for Claude Code running inside a Hydrogen workspace. Documents the exact OS (Ubuntu 24.04, code-server, the local workspace), explains how setup differs from Adom cloud containers (HD setup-steps NOT bootstrap.sh), what bridges are available, and how to use the relay. Trigger on startup, adom-cli errors, bridge commands, screenshot requests, container-platform questions, code-server / VS Code extension issues, or when the AI needs concrete facts about its environment instead of guessing.+description: Context for Claude Code running inside a Hydrogen workspace. Documents the exact OS (Ubuntu 24.04, code-server, the local workspace), explains how setup differs from Adom cloud containers (Hydrogen setup-steps NOT bootstrap.sh), what bridges are available, and how to use the relay. Trigger on startup, adom-cli errors, bridge commands, screenshot requests, container-platform questions, code-server / VS Code extension issues, or when the AI needs concrete facts about its environment instead of guessing. --- # Hydrogen Workspace -You are running inside the **local workspace** managed by Hydrogen (HD). HD is the flagship Adom desktop app — it manages your workspace, bridges to desktop apps, and provides VS Code + Claude Code. HD runs on Windows, macOS, and Ubuntu; the platform-specific mechanics of how the workspace is hosted are abstracted away from inside the workspace — the facts below hold regardless of host OS.+You are running inside the **local workspace** managed by Hydrogen (ah). Hydrogen is the flagship Adom desktop app — it manages your workspace, bridges to desktop apps, and provides VS Code + Claude Code. Hydrogen runs on Windows, macOS, and Ubuntu; the platform-specific mechanics of how the workspace is hosted are abstracted away from inside the workspace — the facts below hold regardless of host OS. > Platform layers add a `*-windows` companion to this skill (`[[hydrogen-container-windows]]`) with the host-specific spine — the WSL2 `Adom-Workspace` distro, `wsl --import`, code-server port auto-forward, the runtime source, and the Cloud-vs-local comparison table. @@ -27,13 +27,13 @@ You are running inside the **local workspace** managed by Hydrogen (HD). HD is t If you ever need to confirm: `cat /etc/os-release`, `uname -m`, `/usr/lib/code-server/bin/code-server --version`. Don't speculate about alpine/arm64 — Ubuntu 24.04 matches the cloud container. -## Setup is via HD's setup-steps, NOT gallia bootstrap.sh+## Setup is via Hydrogen's setup-steps, NOT gallia bootstrap.sh -HD provisions this workspace through its own **setup-steps** flow, shown as the "Install Tools" panel in the HD UI. It is a **different code path** than cloud containers, which run `gallia/scripts/bootstrap.sh`.+Hydrogen provisions this workspace through its own **setup-steps** flow, shown as the "Install Tools" panel in the Hydrogen UI. It is a **different code path** than cloud containers, which run `gallia/scripts/bootstrap.sh`. Most tooling is NOT installed by a step — it's BAKED into the golden image at image-build time (gallia, the Adom CLIs, the claude CLI + Code extension, code-server, VS Code settings, and all `hd-*` skills). The provisioning step imports the golden image if the workspace isn't already registered, and the relay is started by the `start-relay` step. See `[[hydrogen-setup-steps]]`. -When debugging install issues here, the source of truth is HD's setup-steps code — its step IDs (`ensure-workspace`, `install-adom-vscode`, `set-env-vars`, `inject-api-key`, `start-relay`, `claude-auth`, etc.) map 1:1 to what ran on this workspace. There is NO `install-claude-ext` / `install-claude-cli` / `install-gallia` / `write-vscode-settings` step — those are baked. Do NOT chase bugs into `bootstrap.sh` — that script lives in the baked image but HD itself never invokes it.+When debugging install issues here, the source of truth is Hydrogen's setup-steps code — its step IDs (`ensure-workspace`, `install-adom-vscode`, `set-env-vars`, `inject-api-key`, `start-relay`, `claude-auth`, etc.) map 1:1 to what ran on this workspace. There is NO `install-claude-ext` / `install-claude-cli` / `install-gallia` / `write-vscode-settings` step — those are baked. Do NOT chase bugs into `bootstrap.sh` — that script lives in the baked image but Hydrogen itself never invokes it. ## VS Code extension caveats @@ -43,11 +43,11 @@ When debugging install issues here, the source of truth is HD's setup-steps code ## adom-cli is authenticated -HD auto-injects the user's session token on every launch. To verify:+Hydrogen auto-injects the user's session token on every launch. To verify: ```bash adom-cli carbon user get ```-If this returns user data, all adom-cli commands work (containers, repos, orgs, wiki, etc.). If it fails, the user needs to log in via HD's login page.+If this returns user data, all adom-cli commands work (containers, repos, orgs, wiki, etc.). If it fails, the user needs to log in via Hydrogen's login page. ## Relay server is running @@ -56,7 +56,7 @@ The adom-bridge-cli relay runs on ports 8765 (WebSocket) / 8766 (HTTP) inside th Check health: `curl -sf http://127.0.0.1:8766/health` Check desktop connection: `adom-bridge-cli ping` -The host control API is reachable from inside the workspace at `127.0.0.1`. The port is dynamic per launch, so read the live URL from `~/.adom/hd-control-url` (`http://127.0.0.1:<dynamic>`): `BASE="$(cat ~/.adom/hd-control-url)"; curl "$BASE/health"`.+The host control API is reachable from inside the workspace at `127.0.0.1`. The port is dynamic per launch, so read the live URL from `~/.adom/hydrogen-control-url` (`http://127.0.0.1:<dynamic>`): `BASE="$(cat ~/.adom/hydrogen-control-url)"; curl "$BASE/health"`. ## Available bridge commands (when desktop is connected) @@ -108,7 +108,7 @@ adom-bridge-cli desktop_open_folder '{"path": "<host folder path>"}' ## What's different from Adom cloud containers -| Feature | Adom Cloud | HD Local |+| Feature | Adom Cloud | Hydrogen Local | |---------|-----------|----------| | Workspace provisioning | Adom platform API | golden image imported on the user's machine | | Relay connection | wss:// through Cloudflare | ws://localhost:8765 (direct, no TLS) |@@ -119,7 +119,7 @@ adom-bridge-cli desktop_open_folder '{"path": "<host folder path>"}' ## Environment variables -- `ADOM_DESKTOP_MODE=local` — indicates HD local mode+- `ADOM_DESKTOP_MODE=local` — indicates Hydrogen local mode - `GALLIA_SERVICE=local` — tells gallia this is a local workspace - `VSCODE_PROXY_URI=http://localhost:7380/proxy/{{port}}/` — code-server's proxy
skills/hydrogen-desktop-sse/SKILL.md+25−25@@ -1,11 +1,11 @@ --- name: hydrogen-desktop-sse-description: How HD's local workspace API + SSE works (a.k.a. the workspace API) — replaces Carbon for workspace commands so the workspace's adom-cli controls HD, not cloud Hydrogen. Covers the full pipeline, routing, env vars, field format differences, port discovery, and hard-won lessons. Trigger words — HD SSE, workspace API, local API, adom-cli workspace, add-tab, move-tab, webview tab, EventSource, workspace_updated, ADOM_CARBON_URL, ADOM_HYDROGEN_URL, discovery port.+description: How Hydrogen's local workspace API + SSE works (a.k.a. the workspace API) — replaces Carbon for workspace commands so the workspace's adom-cli controls Hydrogen, not cloud Hydrogen. Covers the full pipeline, routing, env vars, field format differences, port discovery, and hard-won lessons. Trigger words — Hydrogen SSE, workspace API, local API, adom-cli workspace, add-tab, move-tab, webview tab, EventSource, workspace_updated, ADOM_CARBON_URL, ADOM_HYDROGEN_URL, discovery port. --- # Hydrogen — Local Workspace API + SSE -> Platform note: HD runs the same local workspace API on every platform (Windows/WSL2,+> Platform note: Hydrogen runs the same local workspace API on every platform (Windows/WSL2, > macOS, Linux). For the WSL2-specific networking details (mirrored loopback, > `%APPDATA%\hydrogen-desktop\ports.json`, the `HD_RUNTIME=docker` runtime, relay > same-port behavior), see **[[hydrogen-desktop-sse-windows]]**.@@ -14,17 +14,17 @@ description: How HD's local workspace API + SSE works (a.k.a. the workspace API) ``` Workspace adom-cli (the local workspace)- → http://127.0.0.1:47083 (HD's proxy)- → HD handles workspace commands locally + broadcasts SSE- → HD frontend receives SSE, re-fetches workspace, renders+ → http://127.0.0.1:47083 (Hydrogen's proxy)+ → Hydrogen handles workspace commands locally + broadcasts SSE+ → Hydrogen frontend receives SSE, re-fetches workspace, renders Cloud adom-cli (unchanged) → carbon.adom.inc → Hydrogen web ``` -HD runs its own workspace API on port 47083 (reverse proxy, default — see PortConfig) so the workspace's adom-cli controls HD's UI, not cloud Hydrogen. No cross-talk between environments. The workspace reaches HD at `127.0.0.1:47083`.+Hydrogen runs its own workspace API on port 47083 (reverse proxy, default — see PortConfig) so the workspace's adom-cli controls Hydrogen's UI, not cloud Hydrogen. No cross-talk between environments. The workspace reaches Hydrogen at `127.0.0.1:47083`. -## Port 47083 routing (the hd-proxy / reverse-proxy)+## Port 47083 routing (the hydrogen-proxy / reverse-proxy) All requests hit port 47083 (reverse proxy, default — see PortConfig). The router in `handle_request()` decides: @@ -42,7 +42,7 @@ The dev file server on port 1420 forwards `/api/*` directly to `handle_request() **Endpoint:** `GET /api/workspaces/editor/{owner}/{repo}/current/events` -Uses `tokio::sync::broadcast` channel. On connect sends `{"type":"connected","connectionId":"hd-local"}`. Workspace mutations broadcast `{"type":"workspace_updated"}`.+Uses `tokio::sync::broadcast` channel. On connect sends `{"type":"connected","connectionId":"hydrogen-local"}`. Workspace mutations broadcast `{"type":"workspace_updated"}`. **Frontend connects** in `PanelWorkspaceComponent.svelte` → `setupSSE()`. In Tauri mode, `$page.params` may be empty (adapter-static), so it falls back to `owner=local, repo=workspace`. @@ -72,12 +72,12 @@ Set when the workspace is created: | Var | Value | Why | |---|---|---|-| `VSCODE_PROXY_URI` | `http://hd-hdlocal/proxy/{{port}}/` | Slug = `hdlocal` (last segment after `-`) |+| `VSCODE_PROXY_URI` | `http://hydrogen-hdlocal/proxy/{{port}}/` | Slug = `hdlocal` (last segment after `-`) | | `ADOM_CARBON_URL` | `http://127.0.0.1:47083` | Container discovery + non-workspace API | | `ADOM_HYDROGEN_URL` | `http://127.0.0.1:47083` | Workspace mutations (adom-cli sends these HERE, not to Carbon) | | `ADOM_DESKTOP_MODE` | `local` | Tells adom-cli it's a local environment | -`127.0.0.1` reaches HD on the host from inside the workspace. The canonical code-server port HD exposes on the host is 7380.+`127.0.0.1` reaches Hydrogen on the host from inside the workspace. The canonical code-server port Hydrogen exposes on the host is 7380. **Also set in adom-cli config** (persists across sessions): ```bash@@ -86,7 +86,7 @@ adom-cli config set-token <session-token> ``` Plus manually write `hydrogen_url` to `~/.config/adom-cli/config.json` (no CLI command for it). -**API key** injected at `/var/run/adom/api-key` by bootstrap via `GET "$(cat ~/.adom/hd-control-url)/auth-token"` (the control URL is `http://127.0.0.1:<dynamic>`).+**API key** injected at `/var/run/adom/api-key` by bootstrap via `GET "$(cat ~/.adom/hydrogen-control-url)/auth-token"` (the control URL is `http://127.0.0.1:<dynamic>`). ## Workspace Tree Format @@ -104,11 +104,11 @@ The frontend serializes splits with `first`/`second`, NOT `children`: All tree traversal functions (`find_leaf_path`, `find_split_path`, `resolve_path`) must handle BOTH `children` array and `first`/`second` keys. -## REST Endpoint Field Names (adom-cli vs HD)+## REST Endpoint Field Names (adom-cli vs Hydrogen) adom-cli sends different field names than you might expect: -| Endpoint | adom-cli sends | HD must read |+| Endpoint | adom-cli sends | Hydrogen must read | |---|---|---| | POST /tabs | `{panelId, panelType, displayName, initialState}` | Construct tab with UUID, merge initialState into panelState | | POST /moves | `{sourcePanelId, tabId, targetPanelId}` | NOT `sourcePanel`/`targetPanel` |@@ -153,10 +153,10 @@ The `onopen` handler PUTs workspace state → broadcasts `workspace_updated` → Three stacked issues: 1. `VSCODE_PROXY_URI` was `http://localhost:8080/...` → slug parsed as `8080` → called `/containers/8080` → Carbon 404 2. Container info response had flat `{"owner": "..."}` but adom-cli reads `container["repository"]["owner"]["name"]`-3. `ADOM_HYDROGEN_URL` wasn't set → workspace commands went to `hydrogen.adom.inc` instead of HD+3. `ADOM_HYDROGEN_URL` wasn't set → workspace commands went to `hydrogen.adom.inc` instead of Hydrogen ### add-tab returned "Missing 'tab' in body"-HD expected `{"panelId", "tab": {id, panelType, panelState}}` but adom-cli sends `{"panelId", "panelType", "displayName", "initialState"}` — flat format. **Fix:** accept both, construct tab with UUID for the flat format.+Hydrogen expected `{"panelId", "tab": {id, panelType, panelState}}` but adom-cli sends `{"panelId", "panelType", "displayName", "initialState"}` — flat format. **Fix:** accept both, construct tab with UUID for the flat format. ### move-tab returned "Source/target panel not found" Two issues:@@ -167,11 +167,11 @@ Two issues: `add_FrameNavigationStarting` was blocking ALL external URLs in child iframes, including legitimate webview panel content. **Fix:** stop blocking frame navigations entirely — webview panels need external URLs. URL interception for window.open still works via `on_new_window`. ### Google showed "blocked" icon-Not an HD bug. Google sends `X-Frame-Options: SAMEORIGIN` which prevents iframe embedding. Sites that allow embedding (adom.inc, wiki) load fine.+Not an Hydrogen bug. Google sends `X-Frame-Options: SAMEORIGIN` which prevents iframe embedding. Sites that allow embedding (adom.inc, wiki) load fine. -## Port Discovery — How Any Client Finds HD+## Port Discovery — How Any Client Finds Hydrogen -All HD ports are dynamic (configurable via `ports.json`). The ONE constant is the **discovery port: 47080**. It never changes.+All Hydrogen ports are dynamic (configurable via `ports.json`). The ONE constant is the **discovery port: 47080**. It never changes. ``` GET http://127.0.0.1:47080/discover@@ -200,11 +200,11 @@ Returns: | adom-bridge-cli relay | Control API port (was hardcoded 9001) | `curl :47080/discover` → use `control` field | | adom-cli in the workspace | Proxy + Hydrogen URL | Already set via `ADOM_CARBON_URL` env var at workspace creation | | External tools / diagnostics | Any port | Hit discovery, get the full map |-| Cloud Docker (this container) | All HD ports | `curl http://<desktop-ip>:47080/discover` via relay |+| Cloud Docker (this container) | All Hydrogen ports | `curl http://<desktop-ip>:47080/discover` via relay | ### Implementation -Tiny `std::net::TcpListener` on port 47080 in `hd-app/src/lib.rs`. Runs on a plain OS thread (no tokio). Reads `get_runtime_ports()` on each request. Returns raw HTTP response with JSON body.+Tiny `std::net::TcpListener` on port 47080 in `hydrogen-app/src/lib.rs`. Runs on a plain OS thread (no tokio). Reads `get_runtime_ports()` on each request. Returns raw HTTP response with JSON body. ```rust std::thread::spawn(move || {@@ -235,11 +235,11 @@ On first launch, defaults are written without scanning. Workspace-side ports (80 | File | What | |---|---|-| `src-tauri/crates/hd-proxy/src/lib.rs` | Workspace API, SSE, Carbon proxy, tree mutations (~1500 lines) |-| `src-tauri/crates/hd-docker/src/lib.rs` | Container env vars (CARBON_URL, HYDROGEN_URL, VSCODE_PROXY_URI) |-| `src-tauri/crates/hd-control/src/lib.rs` | `/auth-token` endpoint, `/ports` endpoint, `/setup/*` routes |-| `src-tauri/crates/hd-control/src/ports.rs` | PortConfig struct, load/save/resolve, DISCOVERY_PORT constant |-| `src-tauri/crates/hd-app/src/lib.rs` | Discovery server on :47080, port resolution at startup |+| `src-tauri/crates/hydrogen-proxy/src/lib.rs` | Workspace API, SSE, Carbon proxy, tree mutations (~1500 lines) |+| `src-tauri/crates/hydrogen-docker/src/lib.rs` | Container env vars (CARBON_URL, HYDROGEN_URL, VSCODE_PROXY_URI) |+| `src-tauri/crates/hydrogen-control/src/lib.rs` | `/auth-token` endpoint, `/ports` endpoint, `/setup/*` routes |+| `src-tauri/crates/hydrogen-control/src/ports.rs` | PortConfig struct, load/save/resolve, DISCOVERY_PORT constant |+| `src-tauri/crates/hydrogen-app/src/lib.rs` | Discovery server on :47080, port resolution at startup | | `src/lib/stores/portStore.ts` | Frontend Svelte store, `initPorts()`, `controlUrl()`, `codeServerUrl()` | | `src/lib/components/editor/workspaces/PanelWorkspaceComponent.svelte` | Frontend SSE setup, autosave, workspace re-fetch | | `scripts/hydrogen-bootstrap.sh` | Sets adom-cli config, injects API key, uses `HD_CONTROL_PORT` env var |
skills/hydrogen-eda-discovery/SKILL.md+2−2@@ -1,7 +1,7 @@ --- name: hydrogen-eda-discovery description: >- The onboarding playbook a (second, background) Claude conversation runs after HD setup to+ The onboarding playbook a (second, background) Claude conversation runs after Hydrogen setup to discover which EDA / electronics-design tools the user runs — KiCad, Fusion 360, Altium, OrCAD/Cadence — and onboard them into the AI-first electronics workflow. If KiCad/Fusion (we have bridges): remember their preferred tool in a prefs file, offer to open example@@ -17,7 +17,7 @@ description: > # EDA tool discovery & onboarding (run in the background after setup) -You're (likely) a **second Claude conversation** launched after HD setup to quietly figure out+You're (likely) a **second Claude conversation** launched after Hydrogen setup to quietly figure out the user's electronics-design stack and show them what the AI-first Adom workflow unlocks. Be **exploratory and opt-in** — detect first, then offer; never auto-install or auto-build. Do the detection in the background, then come back with a short, friendly summary + one clear offer.
skills/hydrogen-eval/SKILL.md+9−9@@ -13,14 +13,14 @@ description: > target claude, find probe, eval-in targets, point at element, nav widget. --- -# hydrogen-eval — inject JS into any HD surface (`POST /eval-in`)+# hydrogen-eval — inject JS into any Hydrogen surface (`POST /eval-in`) -The HD window is **not one page**. It's a tree of cross-origin surfaces, each a+The Hydrogen window is **not one page**. It's a tree of cross-origin surfaces, each a separate Chrome DevTools Protocol (CDP) target/context: | friendly target | what it is | typical use | |---|---|---|-| `shell` | the HD app shell (Svelte): top nav, logo menu, dialogs, the floating layer | inject add-ons/overlays that float over everything |+| `shell` | the Hydrogen app shell (Svelte): top nav, logo menu, dialogs, the floating layer | inject add-ons/overlays that float over everything | | `workbench` | the VS Code editor (code-server) | activity bar, tabs, the "Claude Code: Open" button | | `wiki` | the wiki panel iframe | wiki DOM | | `claude` | the Claude Code chat **webview** (only exists while the panel is open) | the chat input + send button |@@ -31,16 +31,16 @@ see "Why two paths" below) and runs your JS there, returning the value. ## Finding the control port + reaching it from the workspace The control API port is **dynamic** (auto-resolves conflicts per launch). From inside-the workspace, reach HD on `127.0.0.1` (WSL2 mirrored networking shares loopback with the-Windows host). Read the live control URL from the discovery file `~/.adom/hd-control-url`+the workspace, reach Hydrogen on `127.0.0.1` (WSL2 mirrored networking shares loopback with the+Windows host). Read the live control URL from the discovery file `~/.adom/hydrogen-control-url` (your non-interactive Bash shells don't source `.bashrc`/`profile.d`, so the env var alone is unreliable): ```bash-BASE="$(cat ~/.adom/hd-control-url)" # http://127.0.0.1:<dynamic>+BASE="$(cat ~/.adom/hydrogen-control-url)" # http://127.0.0.1:<dynamic> ``` -(Never hardcode the port — read the live URL from `~/.adom/hd-control-url`.)+(Never hardcode the port — read the live URL from `~/.adom/hydrogen-control-url`.) ## Discover the surfaces @@ -114,7 +114,7 @@ path. Prefer it over the older `/eval` (shell only) and `/iframe-eval` ## Verify-then-fallback (recommended) `/eval-in` returns the JS value, so always verify: after an action, eval a probe-and check it; if it fails, try a second technique. The HD "eval-in demo" floating+and check it; if it fails, try a second technique. The Hydrogen "eval-in demo" floating toolbar does exactly this and logs endpoint + params + verify + fallback per step. ## Don'ts@@ -153,7 +153,7 @@ Instead write VS Code's own source-of-truth state, then reload the workbench: "js":"(async function(){function g(d,k){return new Promise(function(r){var o=indexedDB.open(d);o.onsuccess=function(){var b=o.result;var q=b.transaction('ItemTable','readonly').objectStore('ItemTable').get(k);q.onsuccess=function(){b.close();r(q.result)}}})}function p(d,k,v){return new Promise(function(r){var o=indexedDB.open(d);o.onsuccess=function(){var b=o.result;var t=b.transaction('ItemTable','readwrite');t.objectStore('ItemTable').put(v,k);t.oncomplete=function(){b.close();r(true)}}})}var DB='vscode-web-state-db-global',K='workbench.activity.pinnedViewlets2';var a=JSON.parse(await g(DB,K));var ids=['workbench.view.search','workbench.view.scm','workbench.view.debug'];a.forEach(function(e){if(ids.indexOf(e.id)>-1)e.pinned=false});await p(DB,K,JSON.stringify(a));return 'hidden';})()" } ``` -The HD demo toolbar's **Hide / Restore activity icons** buttons (`/demo/run+The Hydrogen demo toolbar's **Hide / Restore activity icons** buttons (`/demo/run {action:"hide-activitybar"|"show-activitybar"}`) do exactly this. The setup-steps `configure-vscode` step should hide icons this way too (persisted across the mid-setup reload), not via CSS or transient `:8821` layout calls.
skills/hydrogen-instapcb/SKILL.md+5−5@@ -3,7 +3,7 @@ name: hydrogen-instapcb description: > The playbook a (second, background) Claude conversation runs after setup to wire up the user's InstaPCB quoting workflow inside Hydrogen: find any InstaPCB quotes they uploaded- earlier, bring one up in the InstaPCB quoting engine in HD, and — if they want — set up a+ earlier, bring one up in the InstaPCB quoting engine in Hydrogen, and — if they want — set up a live loop so KiCad design changes auto-import and the quote re-quotes on-the-fly with zero manual steps. Detect + report + offer first; build the watch→reload loop only on a yes. READ + RUN this when a thread is asked about InstaPCB quotes / "bring up my instapcb quote" / "auto@@ -21,8 +21,8 @@ quote → offer the live loop → build it only on a yes.** Don't change anythin ## 1. Discover (report, don't assume) -The InstaPCB quoting engine is the **`instapcb-quote` app** (Ray's app), surfaced inside HD as a-webview/app — it is **NOT** part of HD itself, so locate it rather than guess:+The InstaPCB quoting engine is the **`instapcb-quote` app** (Ray's app), surfaced inside Hydrogen as a+webview/app — it is **NOT** part of Hydrogen itself, so locate it rather than guess: ```bash # Is the quoting app running / reachable? (check the running webviews + workspace tabs)@@ -68,8 +68,8 @@ every InstaPCB user gets the live loop (see [hydrogen-eda-discovery](../hydrogen - **Verify the engine + quotes exist before claiming anything** ("I found 2 quotes: …" or "I can't find the InstaPCB app — where is it?"). Never report a false negative. - Keep the loop **observable + debounced**; let the user pause/stop it.-- InstaPCB is **Ray's `instapcb-quote` app**, not an HD feature — file quirks/bugs to the- instapcb-quote feedback list, not as HD bugs.+- InstaPCB is **Ray's `instapcb-quote` app**, not an Hydrogen feature — file quirks/bugs to the+ instapcb-quote feedback list, not as Hydrogen bugs. ## Related skills - [hydrogen-eda-discovery](../hydrogen-eda-discovery/SKILL.md) — the sibling post-setup discovery tab (EDA tools); same detect→offer pattern + the AI-first/Adom-wiki frame
skills/hydrogen-monitor/SKILL.md+3−3@@ -32,7 +32,7 @@ Watch the Hydrogen workspace in real-time using Claude Code's Monitor tool + Hyd ## Lighter than SSE for point-in-time checks The proxy SSE stream below is for *reacting continuously*. If you just need a-snapshot of current state, the **control port** (`$(cat ~/.adom/hd-control-url)`,+snapshot of current state, the **control port** (`$(cat ~/.adom/hydrogen-control-url)`, i.e. `http://127.0.0.1:<dynamic>` — same loopback from the workspace and the host via WSL2 mirrored networking) has cheaper reads: @@ -60,9 +60,9 @@ The events don't include details about *what* changed — query `workspace tabs` ```bash # Monitor tool script — reports tab changes in real-time.-# Inside an HD workspace, talk to the LOCAL HD workspace API, not cloud hostnames:+# Inside an Hydrogen workspace, talk to the LOCAL Hydrogen workspace API, not cloud hostnames: # derive the base from ADOM_CARBON_URL / ADOM_HYDROGEN_URL (they point at-# http://127.0.0.1:<proxy>). The HD-local slug is always `hdlocal`.+# http://127.0.0.1:<proxy>). The Hydrogen-local slug is always `hdlocal`. API_KEY=$(cat /var/run/adom/api-key) CARBON="${ADOM_CARBON_URL:-http://127.0.0.1:47083}" HYDROGEN="${ADOM_HYDROGEN_URL:-$CARBON}"
skills/hydrogen-naming/SKILL.md+4−4@@ -6,8 +6,8 @@ description: >- search, Spotlight, app listings, installer filename) says "Adom Hydrogen", NEVER bare "Hydrogen" - because a new user types "adom" into taskbar search before they have memorized the product name. Also the shorthand table (ah,- ab, hc, aw, nb, nbe, hbw, pup) and the dead legacy names (HD, AD, Hydrogen- Desktop as external copy, Adom Desktop, hw, hdbw, abe). READ when naming+ ab, hc, aw, nb, nbe, hbw, pup) and the dead legacy names (hd, ad, "Hydrogen+ Desktop" in copy, "Adom Desktop", hw, hdbw, abe). READ when naming anything user-visible: an installer, a shortcut, a window title, a wiki page, marketing copy, or when unsure what to call a product in prose. Trigger words - naming, product name, formal name, what do we call it,@@ -53,10 +53,10 @@ exists as a register. ## Dead names - never write these -- **HD / Hydrogen Desktop** in any copy (chat, docs, UI, skills). Say+- **hd / "Hydrogen Desktop"** in any copy (chat, docs, UI, skills). Say Hydrogen or ah. (Code identifiers like `hd_*` verbs or `hd-` crate names are unrenamed call sites, not license to use the name in prose.)-- **AD / Adom Desktop** - the product is Bridge (ab). The CLI is+- **ad / "Adom Desktop"** - the product is Bridge (ab). The CLI is `adom-bridge-cli`; the native launcher is `adom-bridge`. - **hw** (now hc), **hdbw** (now hbw), **abe** (now nbe), bare single-letter shorthands (say ah, ab, aw - never h, b, w).
skills/hydrogen-notifications/SKILL.md+16−16@@ -4,10 +4,10 @@ description: > How Hydrogen reaches the user OUTSIDE the window — native OS toast notifications + taskbar/dock attention — so the AI can proactively tell the user a long job finished or that it needs them (great for hands-free / away-from-keyboard- work). Covers HD's notify handler (levels info|warning|error|emergency, optional+ work). Covers Hydrogen's notify handler (levels info|warning|error|emergency, optional <actions> buttons; emergency = a persistent attention request until the user looks) and how to fire one with the `notify` desktop command / `adom-bridge-cli notify_user`.- Also the in-app `/ui/toast` (a message INSIDE the HD window) and Pup's+ Also the in-app `/ui/toast` (a message INSIDE the Hydrogen window) and Pup's browser_alert_window taskbar/dock nudge. The native OS-toast backend is platform-specific (see [[hydrogen-notifications-windows]] for the Windows path); cross-platform behavior is documented here. Trigger words — notify the user, send a@@ -15,12 +15,12 @@ description: > bounce, get the user's attention, alert the user, notify_user, emergency notification, urgent alert, notification actions, action buttons, ping the user, job done notification, tell me when it's done, request attention, browser_alert_window, in-app- toast, ui toast, /ui/toast, show a toast in HD, toast inside the window.+ toast, ui toast, /ui/toast, show a toast in Hydrogen, toast inside the window. --- # Hydrogen — Notifications (reaching the user outside the window) -When the user isn't looking at HD — a long build is running, you've finished a job, or+When the user isn't looking at Hydrogen — a long build is running, you've finished a job, or you're **blocked and need them** — you can reach them on the OS level: a native **toast**, and for urgent cases a **persistent attention request** (a taskbar flash / dock bounce, depending on platform). This is what makes hands-free / away-from-keyboard work usable:@@ -35,8 +35,8 @@ don't just print a message into a panel nobody's watching — fire a notificatio ## Firing a notification -Source: `src-tauri/crates/hd-app/src/notifications.rs` (`handle_notify` → `show_toast`).-Dispatched via the `notify` message; from the workspace use the AD CLI:+Source: `src-tauri/crates/hydrogen-app/src/notifications.rs` (`handle_notify` → `show_toast`).+Dispatched via the `notify` message; from the workspace use the ab CLI: ```bash adom-bridge-cli notify_user '{"title":"Build complete","body":"hd_build_rust finished — exit 0","level":"info"}'@@ -55,7 +55,7 @@ Payload shape (`NotifyPayload`): | Field | Notes | |---|---|-| `title` | Toast heading. (On some platforms HD prefixes the app identity — see the platform companion.) |+| `title` | Toast heading. (On some platforms Hydrogen prefixes the app identity — see the platform companion.) | | `body` | The message. | | `level` | `info` / `warning` / `error` / `emergency`. `warning`/`error`/`emergency` render as **long-duration** toasts; `info` is short. | | `actions` | Optional array of button labels rendered as buttons in the toast. Empty/omitted = no buttons. |@@ -63,7 +63,7 @@ Payload shape (`NotifyPayload`): ### Levels — and the `emergency` attention request - `info` / `warning` / `error` — a standard toast (warnings and errors stay up longer).-- **`emergency`** — in addition to the toast, HD calls **`request_user_attention(Critical)`**+- **`emergency`** — in addition to the toast, Hydrogen calls **`request_user_attention(Critical)`** on the main window and shows/unminimizes it. This produces a **persistent attention request** (a taskbar flash on Windows, a dock bounce on macOS) that **keeps going until the user actually interacts with the window/taskbar themselves** — it is *not* cleared by@@ -73,10 +73,10 @@ Payload shape (`NotifyPayload`): > The Windows-specific toast identity/title behavior (the AUMID "Adom" title quirk) and the > WinRT/orange-taskbar-flash details live in [[hydrogen-notifications-windows]]. -## In-app toast — `POST /ui/toast` (inside the HD window)+## In-app toast — `POST /ui/toast` (inside the Hydrogen window) The notifications above reach the user **outside** the window (OS toast / taskbar). For a-lightweight message **inside** the HD window — the same toast UI the app uses for its own+lightweight message **inside** the Hydrogen window — the same toast UI the app uses for its own success/error messages — fire a control-API toast: ```bash@@ -91,11 +91,11 @@ POST /ui/toast { "message": "Build finished ✅", "type": "success", "duration": | `duration` | ms before auto-dismiss (default 5000). **0 = persistent** until the user dismisses. | | `groupId` + `detail` | Optional: coalesce related toasts into one expandable group. | -It emits the `hd-toast` Tauri event, which the main window renders via the global+It emits the `hydrogen-toast` Tauri event, which the main window renders via the global `toastStore` (bottom-stacked toasts). **OS toast vs in-app toast:** use a `notify` OS toast-when the user may be **away from / not looking at** HD; use `/ui/toast` for an in-window-status cue while they're working in HD. (HD's native recording uses this for its auto-stop-notice — see [hd-recording](../hd-recording/SKILL.md).)+when the user may be **away from / not looking at** Hydrogen; use `/ui/toast` for an in-window+status cue while they're working in Hydrogen. (Hydrogen's native recording uses this for its auto-stop+notice — see [hydrogen-recording](../hydrogen-recording/SKILL.md).) ## Pup's taskbar/dock nudge (`browser_alert_window`) @@ -122,6 +122,6 @@ Don't spam: one notification per meaningful event. Verify the bridge first (`adom-bridge-cli ping`) before claiming you notified them. ## Related skills-- [hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md) — AD is what carries `notify_user` to the host; `ping`/`status` to verify the bridge and the `notify` capability-- [hydrogen-bridges](../hydrogen-bridges/SKILL.md) — the full AD capability list (`notify`, …) and Pup's `browser_alert_window`+- [hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md) — ab is what carries `notify_user` to the host; `ping`/`status` to verify the bridge and the `notify` capability+- [hydrogen-bridges](../hydrogen-bridges/SKILL.md) — the full ab capability list (`notify`, …) and Pup's `browser_alert_window` - [[hydrogen-notifications-windows]] — the Windows toast backend (WinRT, AUMID "Adom" title, orange taskbar flash)
skills/hydrogen-open-url/SKILL.md+23−23@@ -3,12 +3,12 @@ name: hydrogen-open-url description: > The decision guide for "open a URL / open a website" inside Hydrogen. When the user says "open ti.com" / "pull up the datasheet page" / "show me- that site", HD has SIX distinct ways to do it — a Hydrogen webview tab, an HD+ that site", Hydrogen has SIX distinct ways to do it — a Hydrogen webview tab, an Hydrogen browser window, Pup (AI-drivable Chrome), a native desktop browser profile, the Browser Picker chooser, or headless curl/fetch — each with different trade-offs. READ THIS to pick the right one and to explain the options back to the user instead of silently guessing. For the interception/plumbing behind the- picker see hd-browser-picker; to drive Pup see pup; for webview tabs see+ picker see hydrogen-browser-picker; to drive Pup see pup; for webview tabs see adom-workspace-control. Trigger words — open url, open website, open the site, open ti.com, open a link, pull up the page, show me the website, view this url, open in browser, which browser, how do I open, open the datasheet page, open in@@ -16,9 +16,9 @@ description: > link options, wv, open in wv, open as wv, webview tab, wv tab. --- -# HD — Opening a URL (your options)+# Hydrogen — Opening a URL (your options) -When a user says **"open the ti.com website"** (or any URL), HD has several paths+When a user says **"open the ti.com website"** (or any URL), Hydrogen has several paths and a Browser Picker — but **don't hand the user the picker to decide.** Pick the best destination *for them* by use-case and **open it directly**, then offer the alternatives in one line. The right path depends on what they're doing — look at@@ -29,8 +29,8 @@ user — DON'T hand them the picker"** below for the rule. | # | Option | Best when… | What the user sees | AI drives it? | |---|--------|-----------|--------------------|---------------|-| 1 | **Hydrogen webview tab** (aka **wv**) | the user wants the site *inside* HD, next to their work, and to keep it around | a panel/tab in the HD workspace | partly (reload/route) |-| 2 | **HD Browser Window** | a quick popout window owned by HD, not a full browser | a standalone HD-owned window | no |+| 1 | **Hydrogen webview tab** (aka **wv**) | the user wants the site *inside* Hydrogen, next to their work, and to keep it around | a panel/tab in the Hydrogen workspace | partly (reload/route) |+| 2 | **Hydrogen Browser Window** | a quick popout window owned by Hydrogen, not a full browser | a standalone Hydrogen-owned window | no | | 3 | **Pup (Puppeteer Chrome)** | **you** need to act on the page — screenshot, click, scrape, fill a form, verify | a real Chrome window on their desktop | **yes, fully** | | 4 | **Native desktop browser** | real logins/sessions, downloads, "just open it for me", auth flows | their own Chrome/Edge profile | no | | 5 | **Browser Picker** | you're not sure, or it's an auth/OAuth link — let the user choose (5s auto-default) | a chooser dialog | n/a (routes to one of the above) |@@ -50,10 +50,10 @@ keystrokes)."* Say it **once**, not every time (don't nag). This is exactly how ## How you invoke each -All of these run from inside the HD workspace. The control API base URL is the live-value in `~/.adom/hd-control-url` — `http://127.0.0.1:<dynamic>` (WSL2 mirrored+All of these run from inside the Hydrogen workspace. The control API base URL is the live+value in `~/.adom/hydrogen-control-url` — `http://127.0.0.1:<dynamic>` (WSL2 mirrored networking shares loopback with the Windows host; the port is dynamic per launch).-Read it with `BASE="$(cat ~/.adom/hd-control-url)"` then hit `"$BASE/<endpoint>"`.+Read it with `BASE="$(cat ~/.adom/hydrogen-control-url)"` then hit `"$BASE/<endpoint>"`. **1. Webview tab (wv)** — add a web-view tab pointed at the URL (`adom-workspace-control`, or `adom-cli hydrogen webview open-or-refresh --name <X> --url <url> --panel-id <id>`). Good@@ -61,13 +61,13 @@ for "keep this open while we work." ⚠️ **`open-or-refresh` needs `--panel-id tab** — without it you get *"Tab 'X' not found and --panel-id not provided"* (verified live 2026-06-14; get a panel id from `adom-cli hydrogen workspace get`). Re-running with the same `--name` once it exists just navigates/refreshes (no panel-id needed). Same `adom-cli` on-web-Hydrogen and HD — the consistent surface.+web-Hydrogen and Hydrogen — the consistent surface. **2 / 4 / 5. Through the Browser Picker** — the single unifying entry point. POST-the URL and HD routes it (auto-picking a sensible default after a 5-second+the URL and Hydrogen routes it (auto-picking a sensible default after a 5-second countdown, or showing the chooser): ```bash-BASE="$(cat ~/.adom/hd-control-url)" # http://127.0.0.1:<dynamic>+BASE="$(cat ~/.adom/hydrogen-control-url)" # http://127.0.0.1:<dynamic> # Auto-route (picker picks the best default in 5s — hands-free) curl -s -X POST -H 'Content-Type: application/json' \@@ -90,7 +90,7 @@ curl -s -X POST -H 'Content-Type: application/json' \ -d '{"url":"https://claude.ai/","browser":"edge","profileDir":"Default","fresh":true}' \ "$BASE/open-in-profile" ```-> ⚠️ **`/open-url` often replies `"HD timed out after 5s"` even when it SUCCEEDED**+> ⚠️ **`/open-url` often replies `"Hydrogen timed out after 5s"` even when it SUCCEEDED** > (verified live 2026-06-14: `{"url":"https://www.google.com"}` reported the timeout, but the > page opened in Edge). **Don't treat that as failure** — confirm with > `GET "$BASE/browser-picker/last-open"` → `{destination, url, fresh, ts}`. `fresh:false` =@@ -100,7 +100,7 @@ curl -s -X POST -H 'Content-Type: application/json' \ The picker's auto-default heuristic: `*.claude.ai`/`*.claude.com` and Adom `/auth/intent` → the user's work browser profile; unknown/right-click/iframe →-Pup; otherwise the user's last choice for that domain. See `hd-browser-picker`.+Pup; otherwise the user's last choice for that domain. See `hydrogen-browser-picker`. **Fresh window (`"fresh":true`)** — the native-browser path (#4) can open the URL either as a tab in an already-running browser (default) or as a **brand-new window/@@ -109,7 +109,7 @@ a tab does not. So for **auth flows the user must complete** (Claude/Adom sign-i prefer `fresh:true` — the consent page comes to the front by itself, no manual focus. The Browser Picker defaults the "Open in a fresh window" toggle ON for auth URLs. On `/open-url`, `fresh` pre-seeds that toggle (the picker still shows; add `direct:true`-to skip it); `/open-in-profile` opens fresh directly. See `hd-browser-picker`.+to skip it); `/open-in-profile` opens fresh directly. See `hydrogen-browser-picker`. **3. Pup** — open and then drive it with `adom-bridge-cli browser_*` verbs (`browser_open_window`, `browser_navigate`, `browser_screenshot`, `browser_eval`,@@ -149,22 +149,22 @@ profile."* Decide, act, offer alternatives — don't ask first. Example — "open the texas instruments website" (login-likely → native work profile): ```bash-BASE="$(cat ~/.adom/hd-control-url)"+BASE="$(cat ~/.adom/hydrogen-control-url)" curl -s "$BASE/browser-profiles" # pick the work profile (non-gmail email) curl -s -X POST -H 'Content-Type: application/json' \ -d '{"url":"https://www.ti.com","browser":"chrome","profileDir":"<work profileDir>"}' \ "$BASE/open-in-profile" ``` -## Govern routing policy — the picker is now a true FALLBACK (HD prefs API)+## Govern routing policy — the picker is now a true FALLBACK (Hydrogen prefs API) -The picker's per-domain memory is a first-class API (HD app behavior), so **the AI OWNS URL+The picker's per-domain memory is a first-class API (Hydrogen app behavior), so **the AI OWNS URL routing** — the picker only pops for a domain with **no stored policy AND no direct call**. Use this to set policy the user would otherwise click through the Manager for ("always open DigiKey in my work profile", "stop auto-opening X in Edge"). ```bash-BASE="$(cat ~/.adom/hd-control-url)"+BASE="$(cat ~/.adom/hydrogen-control-url)" # READ the policy map curl -s "$BASE/browser-picker/prefs" # → {ok, prefs:{domains:{"<host>":{destination,label}, …}}}@@ -183,8 +183,8 @@ curl -s -X DELETE "$BASE/browser-picker/prefs" - **native:** `browser:<browser>:<dir>` — e.g. `browser:edge:Default`, `browser:chrome:Profile 1`. **The profile dir is encoded in the ID** (no separate field). - **Discover valid native IDs** via `GET $BASE/browser-profiles` (maps each detected profile → its `browser`+`dir`); the 3 internal IDs are fixed above. - **`fresh` is NOT stored in prefs** — it's a per-OPEN flag (`/open-url {fresh:…}` / `/open-in-profile {fresh:…}`). Don't try to persist it here.-- **Writes hit the live Manager UI immediately** (the backend writes `hd-url-routing-prefs`- localStorage + dispatches `hd-url-routing-prefs-changed`; an open Browser Picker Manager+- **Writes hit the live Manager UI immediately** (the backend writes `hydrogen-url-routing-prefs`+ localStorage + dispatches `hydrogen-url-routing-prefs-changed`; an open Browser Picker Manager re-reads at once, and re-reads on open anyway). **Net:** for a one-off open, *decide and call the direct endpoint* (`/open-in-profile`,@@ -193,7 +193,7 @@ policy so even user-initiated link clicks route there silently. The picker is no fallback for the genuinely-undecided. ## Related skills-- [hd-browser-picker](../hd-browser-picker/SKILL.md) — the interception layers + picker dialog behind #2/#4/#5+- [hydrogen-browser-picker](../hydrogen-browser-picker/SKILL.md) — the interception layers + picker dialog behind #2/#4/#5 - `pup` — driving Pup browser windows (#3): navigate, screenshot, eval, reload - `adom-workspace-control` — adding/managing Hydrogen webview tabs (#1)-- [hd-runtime-mode](../hd-runtime-mode/SKILL.md) — none of this changes between the WSL2 and Docker runtimes+- [hydrogen-runtime-mode](../hydrogen-runtime-mode/SKILL.md) — none of this changes between the WSL2 and Docker runtimes
skills/hydrogen-overview/SKILL.md+19−19@@ -2,59 +2,59 @@ name: hydrogen-overview description: > Master index for the platform-generic Hydrogen skills (the- hydrogen-bootstrap set). Start here to find the right skill for any HD topic.- These skills are runtime-neutral and apply on every host HD runs on+ hydrogen-bootstrap set). Start here to find the right skill for any Hydrogen topic.+ These skills are runtime-neutral and apply on every host Hydrogen runs on (Windows, macOS, Ubuntu); platform layers add their own *-windows (etc.)- companions. Trigger words: HD skills, hydrogen, what skills, find- skill, HD help, HD overview, skill index, HD reference.+ companions. Trigger words: Hydrogen skills, hydrogen, what skills, find+ skill, Hydrogen help, Hydrogen overview, skill index, Hydrogen reference. --- # Hydrogen — Skill Index -Hydrogen (HD) is Adom's standalone Tauri v2 app that runs the full+Hydrogen (ah) is Adom's standalone Tauri v2 app that runs the full Hydrogen experience locally. One exe manages your workspace, VS Code,-Claude Code, the bridges, and the Adom Wiki — zero cloud dependency. HD runs+Claude Code, the bridges, and the Adom Wiki — zero cloud dependency. Hydrogen runs on Windows, macOS, and Ubuntu. -This index lists the **platform-generic** HD skills (the `hydrogen-bootstrap` set).+This index lists the **platform-generic** Hydrogen skills (the `hydrogen-bootstrap` set). Every fact in these skills holds regardless of host OS. Where a topic has host-specific mechanics (e.g. how the workspace is hosted, host networking, host-side recording), the platform layer adds a companion skill — on Windows those are the **`hydrogen-windows-bootstrap`** `*-windows` skills (and equivalents for other platforms). The generic skill cross-references its companion. -## The generic HD skills (hydrogen-bootstrap)+## The generic Hydrogen skills (hydrogen-bootstrap) | Skill | What it covers | |---|---| | **hydrogen-adom-auth** | Adom login/logout, session token, profile menu, how auth feeds setup. |-| **hydrogen-adom-desktop** | What HD and Adom Bridge (AD) are and how they work together — AD is your hands on the user's real OS (files, shell, OS screenshots, app launch, bridges). |+| **hydrogen-adom-desktop** | What Hydrogen and Adom Bridge (ab) are and how they work together — ab is your hands on the user's real OS (files, shell, OS screenshots, app launch, bridges). | | **hydrogen-adom-menu** | The upper-left Adom logo menu (Settings, Ports, API Explorer, DevTools, Setup/Virgin Reset) + About dialog + version readout. | | **hydrogen-api** | Control API reference. Runtime-neutral endpoints. |-| **hydrogen-bridges** | Built-in KiCad/Fusion/Puppeteer bridges + extensible wiki catalog (e.g. Blender) + AD capability list. |+| **hydrogen-bridges** | Built-in KiCad/Fusion/Puppeteer bridges + extensible wiki catalog (e.g. Blender) + ab capability list. | | **hydrogen-captions** | Paint labeled text on the user's screen — an always-on-top caption overlay for demos / step callouts. | | **hydrogen-capture-share** | The screen-share + "AI wants access" approval + countdown the AI triggers to capture the editor; tab/screen scopes, Webview/Pup window mode. | | **hydrogen-claude-auth** | How Claude Code signs in: OAuth via Browser Picker, credential backup, the `claude-auth` step. | | **hydrogen-container** | Context for Claude running inside the workspace: relay, direct connect, bridge commands, env vars. | | **hydrogen-container-stats** | The title-bar CPU/RAM "Container" indicator and how its stats are gathered. |-| **hydrogen-desktop-sse** | Local workspace API + SSE — how adom-cli inside the workspace controls HD (replaces Carbon locally). |+| **hydrogen-desktop-sse** | Local workspace API + SSE — how adom-cli inside the workspace controls Hydrogen (replaces Carbon locally). | | **hydrogen-eda-discovery** | EDA tool discovery / setup flow. |-| **hydrogen-eval** | Inject JS into any HD surface (shell/workbench/wiki/Claude) via /eval-in — add-ons, overlays, highlights, drive UI. |-| **hydrogen-instapcb** | InstaPCB integration in HD. |+| **hydrogen-eval** | Inject JS into any Hydrogen surface (shell/workbench/wiki/Claude) via /eval-in — add-ons, overlays, highlights, drive UI. |+| **hydrogen-instapcb** | InstaPCB integration in Hydrogen. | | **hydrogen-monitor** | Real-time SSE event stream + Monitor-tool patterns for watching workspace mutations. | | **hydrogen-naming** | The naming doctrine: Hydrogen/ah, Bridge/ab, and WHY installers/shortcuts MUST say "Adom Hydrogen" (users search "adom"). | | **hydrogen-notifications** | Reach the user outside the window — native OS toasts + emergency taskbar flash via `notify_user`. |-| **hydrogen-open-url** | The decision guide for "open a website" — the ways (webview tab, HD window, Pup, native browser, picker, headless curl) and when to pick each. |+| **hydrogen-open-url** | The decision guide for "open a website" — the ways (webview tab, Hydrogen window, Pup, native browser, picker, headless curl) and when to pick each. | | **hydrogen-overview** | This index. |-| **hydrogen-permissions** | Why mic/camera/clipboard/notifications "just work" in HD — webview permissions are auto-granted, so webview apps see no Allow prompts. |+| **hydrogen-permissions** | Why mic/camera/clipboard/notifications "just work" in Hydrogen — webview permissions are auto-granted, so webview apps see no Allow prompts. | | **hydrogen-profile-menu** | The avatar dropdown: profile/repos/molecules links and logout. |-| **hydrogen-self-screenshot** | How the AI screenshots HD panels + any host window (window control, multi-monitor), injects to shotlog, runs visual self-checks. |-| **hydrogen-self-update** | How HD updates itself. |-| **hydrogen-settings** | HD's Settings dialog + the full preferences tree (theme, vim mode, 3D control style, launch-on-login, AD window behavior). |+| **hydrogen-self-screenshot** | How the AI screenshots Hydrogen panels + any host window (window control, multi-monitor), injects to shotlog, runs visual self-checks. |+| **hydrogen-self-update** | How Hydrogen updates itself. |+| **hydrogen-settings** | Hydrogen's Settings dialog + the full preferences tree (theme, vim mode, 3D control style, launch-on-login, ab window behavior). | | **hydrogen-setup** | The setup panel, Run All, Rollback, Virgin Reset. | | **hydrogen-setup-steps** | What each setup step did to prepare your workspace. | | **hydrogen-tab-icons** | Webview tab icon system — `displayIcon`, icon resolution, SVG data URLs. |-| **hydrogen-ui** | HD's UI: menus, dialogs, panels, CDP-driven navigation, brand/CSS conventions. |+| **hydrogen-ui** | Hydrogen's UI: menus, dialogs, panels, CDP-driven navigation, brand/CSS conventions. | | **hydrogen-welcome** | The static welcome page shown after setup completes. | | **hydrogen-who-am-i** | Answer "who am I / what can I do here" — identity, resources, environment intro. | | **hydrogen-workspace-monitoring** | Workspace + code-server health monitoring, floaty states, the 15s poll, auto-start. |
skills/hydrogen-permissions/SKILL.md+12−12@@ -2,13 +2,13 @@ name: hydrogen-permissions description: > Hydrogen AUTO-GRANTS every webview permission — microphone, camera,- clipboard-read, geolocation, notifications, sensors — so inside HD a webview app NEVER+ clipboard-read, geolocation, notifications, sensors — so inside Hydrogen a webview app NEVER shows a "this site wants to use your microphone/camera/clipboard/location" prompt. READ THIS before building or debugging a webview app that uses getUserMedia / clipboard / geolocation: do NOT tell the user to click "Allow" — there is no prompt to click; it's suppressed by design. Distinguish this browser-permission auto-grant from the SEPARATE in-app screen-share / mic consent the AI itself requests (that one IS user-approved — see- hydrogen-capture-share). HD's webview engine is platform-specific; the per-engine+ hydrogen-capture-share). Hydrogen's webview engine is platform-specific; the per-engine implementation detail (e.g. WebView2 on Windows) lives in the platform companion (see [[hydrogen-permissions-windows]]). Trigger words — permission, permissions, webview permission, allow microphone, allow camera, allow clipboard, clipboard read, getUserMedia, mic@@ -17,29 +17,29 @@ description: > auto-grant, auto granted, why no prompt, permission denied webview. --- -# HD auto-grants every webview permission+# Hydrogen auto-grants every webview permission Hydrogen's webview registers a permission handler that returns **ALLOW for every permission kind** — microphone, camera, clipboard-read, geolocation, notifications,-sensors, etc. So **inside HD the user never sees a "this site wants to use your microphone /+sensors, etc. So **inside Hydrogen the user never sees a "this site wants to use your microphone / camera / clipboard / location" dialog.** Webview apps that call `getUserMedia`, read the clipboard, or ask for geolocation simply *work*, with no prompt. -Every request is unconditionally allowed. In the HD log you'll see lines like `[perm]+Every request is unconditionally allowed. In the Hydrogen log you'll see lines like `[perm] auto-granted permission kind …` and, at startup, `[perm] Registered PermissionRequested auto-grant handler`. -> **Platform note:** HD uses a different webview engine per platform (e.g. WebView2 on+> **Platform note:** Hydrogen uses a different webview engine per platform (e.g. WebView2 on > Windows, WebKit on mac/Linux). The auto-grant policy is the same everywhere — every > permission is allowed up front — but the exact engine API is platform-specific. The > Windows/WebView2 implementation and its code evidence are in [[hydrogen-permissions-windows]]. -## Why HD does this+## Why Hydrogen does this -HD is the user's **trusted desktop app** — they've already chosen to run it. Intermediate+Hydrogen is the user's **trusted desktop app** — they've already chosen to run it. Intermediate per-site Web permission prompts (especially the clipboard-paste dialog) are pure friction with no added safety here, since there's no untrusted third-party browsing context: the-surfaces are HD's own panels and the user's own webview apps. So HD grants them all up+surfaces are Hydrogen's own panels and the user's own webview apps. So Hydrogen grants them all up front. ## What this means for you when building webview apps@@ -48,10 +48,10 @@ front. for one is wrong and confusing. `getUserMedia({ audio: true })`, clipboard reads, geolocation, notifications all resolve without a dialog. - If a webview app *isn't* getting mic/camera data, the cause is **not** a denied- permission prompt (HD never denies). Look elsewhere: no device present, the page served+ permission prompt (Hydrogen never denies). Look elsewhere: no device present, the page served over a non-secure context, a code bug, or the OS-level privacy toggle for the camera/mic being off for the app entirely.-- This is behavior baked into HD's webview host — it's not something the web page or the+- This is behavior baked into Hydrogen's webview host — it's not something the web page or the user configures. ## NOT the same as in-app screen-share / mic consent@@ -65,5 +65,5 @@ approval. See `hydrogen-capture-share`. ## Related skills - `hydrogen-capture-share` — the SEPARATE, user-approved screen-share / mic consent the AI requests-- [hydrogen-open-url](../hydrogen-open-url/SKILL.md) — opening URLs/webview apps inside HD (where these permissions apply)+- [hydrogen-open-url](../hydrogen-open-url/SKILL.md) — opening URLs/webview apps inside Hydrogen (where these permissions apply) - [[hydrogen-permissions-windows]] — the WebView2 (Windows) implementation + lib.rs evidence
skills/hydrogen-profile-menu/SKILL.md+17−17@@ -1,29 +1,29 @@ --- name: hydrogen-profile-menu-description: HD's profile menu — the user-avatar dropdown in the top-right corner that links to your Adom profile/repositories/molecules pages on adom.inc and contains the logout action. Logout is gated by a confirm dialog and returns you to the HD login page; logging in is the gate to using HD at all (no anonymous use). Use when the user asks about "log out", "logout", "sign out", "Your profile", "Your repositories", "Your molecules", the avatar dropdown, the login page, or "why am I locked out". Trigger words — profile menu, avatar menu, top-right avatar, user menu, log out, logout, sign out, confirm logout, login gate, login page, your profile, your repositories, your molecules, adom.inc profile, hd locked out, hd login required, return to login.+description: Hydrogen's profile menu — the user-avatar dropdown in the top-right corner that links to your Adom profile/repositories/molecules pages on adom.inc and contains the logout action. Logout is gated by a confirm dialog and returns you to the Hydrogen login page; logging in is the gate to using Hydrogen at all (no anonymous use). Use when the user asks about "log out", "logout", "sign out", "Your profile", "Your repositories", "Your molecules", the avatar dropdown, the login page, or "why am I locked out". Trigger words — profile menu, avatar menu, top-right avatar, user menu, log out, logout, sign out, confirm logout, login gate, login page, your profile, your repositories, your molecules, adom.inc profile, hd locked out, hd login required, return to login. --- -# HD Profile Menu+# Hydrogen Profile Menu -The profile menu is the dropdown that opens when you click your **circular user avatar in the top-right corner** of HD. It contains links to your Adom-account pages on `adom.inc` plus the logout action.+The profile menu is the dropdown that opens when you click your **circular user avatar in the top-right corner** of Hydrogen. It contains links to your Adom-account pages on `adom.inc` plus the logout action. This is **separate from the Adom menu** (top-left logo). Different audiences, different functions — see [hydrogen-ui](../hydrogen-ui/SKILL.md) for the Adom menu. ## Where your avatar image comes from -- **Logged in via Google** — HD displays the Google profile photo that Google gives us as part of the sign-in payload. You change it by changing your Google account photo.-- **Logged in via direct Adom login** (email/password style) — HD shows the avatar you've uploaded on `adom.inc`. To customize it, click **Your profile** in this menu to open your profile page on adom.inc and change the avatar there.+- **Logged in via Google** — Hydrogen displays the Google profile photo that Google gives us as part of the sign-in payload. You change it by changing your Google account photo.+- **Logged in via direct Adom login** (email/password style) — Hydrogen shows the avatar you've uploaded on `adom.inc`. To customize it, click **Your profile** in this menu to open your profile page on adom.inc and change the avatar there. ## What's in the menu | Item | Icon | Behavior | |------|------|----------|-| **Your profile** | person | `goTo('/users/<name>')` — navigates the HD webview to your Adom profile page |+| **Your profile** | person | `goTo('/users/<name>')` — navigates the Hydrogen webview to your Adom profile page | | **Your repositories** | folder | `goTo('/users/<name>/repositories')` — your repositories list | | **Your molecules** | atom / molecule | `goTo('/users/<name>/molecules')` — your molecules list |-| **Log out** | exit-arrow | Opens a confirm dialog → on confirm, clears the Adom session and returns to the HD login page |+| **Log out** | exit-arrow | Opens a confirm dialog → on confirm, clears the Adom session and returns to the Hydrogen login page | -> **Note (current behavior, verified 2026-06-12)**: the three "Your *" items call `goTo('/users/<name>/...')` (see `EditorNav.svelte` ~L2540-2557), i.e. they navigate the HD webview itself to the in-app `/users/...` route rather than opening adom.inc in the user's external browser. This is in-app navigation, not the Browser Picker. (The earlier "routes to internal HD views" concern has been narrowed to this expected in-app routing.)+> **Note (current behavior, verified 2026-06-12)**: the three "Your *" items call `goTo('/users/<name>/...')` (see `EditorNav.svelte` ~L2540-2557), i.e. they navigate the Hydrogen webview itself to the in-app `/users/...` route rather than opening adom.inc in the user's external browser. This is in-app navigation, not the Browser Picker. (The earlier "routes to internal Hydrogen views" concern has been narrowed to this expected in-app routing.) ## Log out — the confirm dialog @@ -42,15 +42,15 @@ Clicking **Log out** opens this dialog: - **Cancel** — dismisses the dialog, you stay signed in - **Confirm** — wipes `hydrogen-session.txt` from `%APPDATA%\hydrogen-desktop\`, clears in-memory session state, and routes the webview to `/auth/login` -After Confirm: you land on the HD login page and **cannot use HD until you log in again.**+After Confirm: you land on the Hydrogen login page and **cannot use Hydrogen until you log in again.** -## Login is a gate to using HD+## Login is a gate to using Hydrogen -HD is **not usable without an Adom login**. There is no anonymous mode, no skip-login option once you're signed out. The (app)/+layout.svelte enforces this — if the session token is missing or expired, every protected route redirects to `/auth/login`.+Hydrogen is **not usable without an Adom login**. There is no anonymous mode, no skip-login option once you're signed out. The (app)/+layout.svelte enforces this — if the session token is missing or expired, every protected route redirects to `/auth/login`. -The login itself uses the auth-intent flow (no email/password entry in HD — you complete sign-in in your default browser, then HD picks up the session). See [hydrogen-adom-auth](../hydrogen-adom-auth/SKILL.md) for the full flow.+The login itself uses the auth-intent flow (no email/password entry in Hydrogen — you complete sign-in in your default browser, then Hydrogen picks up the session). See [hydrogen-adom-auth](../hydrogen-adom-auth/SKILL.md) for the full flow. -After successful login, HD restores you to the route you were trying to reach (or the dashboard).+After successful login, Hydrogen restores you to the route you were trying to reach (or the dashboard). ## CSS selectors (for CDP eval / Claude automation) @@ -66,18 +66,18 @@ After successful login, HD restores you to the route you were trying to reach (o ```bash # Open profile menu-echo "document.querySelector('.profile-dropdown-button')?.click()" | node C:\Users\john\hd-cdp.js+echo "document.querySelector('.profile-dropdown-button')?.click()" | node C:\Users\john\hydrogen-cdp.js # Trigger logout-echo "Array.from(document.querySelectorAll('.dropdown-link')).find(e => e.textContent.includes('Log out'))?.click()" | node C:\Users\john\hd-cdp.js+echo "Array.from(document.querySelectorAll('.dropdown-link')).find(e => e.textContent.includes('Log out'))?.click()" | node C:\Users\john\hydrogen-cdp.js # Confirm logout (after dialog appears)-echo "Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === 'Confirm')?.click()" | node C:\Users\john\hd-cdp.js+echo "Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === 'Confirm')?.click()" | node C:\Users\john\hydrogen-cdp.js ``` ## Related skills - [hydrogen-adom-auth](../hydrogen-adom-auth/SKILL.md) — the Adom session token, login flow, profile loading - [hydrogen-claude-auth](../hydrogen-claude-auth/SKILL.md) — Claude Code auth (separate from Adom auth; logging out of Adom does NOT log you out of Claude)-- [hd-browser-picker](../hd-browser-picker/SKILL.md) — what opens the Your-*/external URLs in the user's chosen browser+- [hydrogen-browser-picker](../hydrogen-browser-picker/SKILL.md) — what opens the Your-*/external URLs in the user's chosen browser - [hydrogen-ui](../hydrogen-ui/SKILL.md) — the Adom menu (top-left, different dropdown)
skills/hydrogen-self-screenshot/SKILL.md+29−29@@ -1,24 +1,24 @@ --- name: hydrogen-self-screenshot description: >- Screenshot HD from inside the workspace — a panel/webview (the welcome page, a+ Screenshot Hydrogen from inside the workspace — a panel/webview (the welcome page, a tab), the whole workspace, OR the whole screen/desktop — using the BUILT-IN `adom-cli hydrogen screenshot`. It saves a PNG into the container's `screenshots/` folder and prints the path to Read. THE answer for "take a screenshot of the welcome page", "screenshot the webview", "screenshot this panel", "screenshot the editor", "screenshot my whole screen / the desktop",- "show me what HD looks like", or verifying a UI change (ralph loop). Use this+ "show me what Hydrogen looks like", or verifying a UI change (ralph loop). Use this even for "my whole screen / my desktop / my monitor" — that's the `screen` scope. You do NOT need any image resizer. For a SPECIFIC element/region (a CPU meter, a menu, a dialog, a toolbar) or an inline-b64 PNG, use the canonical `POST /screenshot` control endpoint with a CSS `selector` (it ALWAYS region-clips to that element) — and combine it with the UI command bus (`hydrogen-ui`: `ui/invoke` to open a menu/dialog, then `/screenshot` its selector). Identical across web- Hydrogen and HD. Trigger words — screenshot HD, screenshot the welcome page,+ Hydrogen and Hydrogen. Trigger words — screenshot Hydrogen, screenshot the welcome page, screenshot the webview, screenshot a panel, screenshot a tab, screenshot the workspace, screenshot the editor, screenshot my screen, screenshot the whole screen, screenshot the desktop, capture my monitor, full screen capture,- screenshot everything on screen, what does HD look like, adom-cli hydrogen+ screenshot everything on screen, what does Hydrogen look like, adom-cli hydrogen screenshot, capture panel, capture workspace, capture screen, screenshot a region, clip to selector, screenshot an element, screenshot a menu, screenshot a dialog, region screenshot, b64 screenshot, POST /screenshot, /shot, screenshot without flash,@@ -26,9 +26,9 @@ description: > image resizer, resize screenshot. --- -# HD — Screenshot a panel / webview / the workspace / the screen+# Hydrogen — Screenshot a panel / webview / the workspace / the screen -The built-in way to screenshot anything inside HD is the **`adom-cli hydrogen+The built-in way to screenshot anything inside Hydrogen is the **`adom-cli hydrogen screenshot`** command — the *same* `adom-cli` you already use. It captures the real rendered surface, drops a PNG into the container's `screenshots/` folder, and prints the path. Just `Read` that path. **No image resizer needed.**@@ -36,15 +36,15 @@ and prints the path. Just `Read` that path. **No image resizer needed.** ## Which screenshot tool? — the priority ladder What you're capturing (and whether you want the teal flash) picks the tool. Default to-HD-native:+Hydrogen-native: -1. **HD content — a panel, the workspace, the editor, a webview, the screen+1. **Hydrogen content — a panel, the workspace, the editor, a webview, the screen (the 99% case): `adom-cli hydrogen screenshot panel|workspace|screen`. THIS IS THE- DEFAULT — reach for it first.** It's the *same* command in web Hydrogen and HD (HD is+ DEFAULT — reach for it first.** It's the *same* command in web Hydrogen and Hydrogen (Hydrogen is meant to behave like web Hydrogen, and `adom-cli` is the one surface that's identical on both), saves a PNG to your container's `screenshots/`, and you just `Read` it. Don't lead- with an HD-only endpoint.- - **HD-only enhancement / power path — `POST /screenshot {target, selector, b64, silent}`+ with an Hydrogen-only endpoint.+ - **Hydrogen-only enhancement / power path — `POST /screenshot {target, selector, b64, silent}` (CDP).** Use ONLY when you need something `adom-cli` doesn't give you: a precise CSS `selector` region-clip, an inline-base64 PNG (`b64`), or a `silent` (no-flash) grab — see below. It does NOT exist in web Hydrogen, so it's a deliberate step OFF the consistent path.@@ -54,9 +54,9 @@ HD-native: ## During a recording (multi-thread) — pick a coexisting method, never blind-retry -Adom users run **multiple AI threads on one HD**, so another thread may be recording the+Adom users run **multiple AI threads on one Hydrogen**, so another thread may be recording the screen while you capture. **Only the `adom-cli` SSE path (`screenshot panel/workspace/screen`)-is affected** — the CDP path coexists. HD makes this deterministic:+is affected** — the CDP path coexists. Hydrogen makes this deterministic: - **Pre-flight `GET /capture/availability`** → reports the recording state plus, per method, reliability + whether it coexists with a recording, a `recommended` method, and a `_hint`.@@ -71,18 +71,18 @@ is affected** — the CDP path coexists. HD makes this deterministic: panel/workspace`) returns, the moment a recording is active, `{ok:false, error:"capture_busy", retry_after_ms, alternatives:[{method:"cdp"}], _hint}` — never an empty body. **On `capture_busy`: read `alternatives` and SWITCH — do NOT blindly retry the SSE path.**-- Authoritative recording state: `GET /recording/native/status`. See `hd-recording`.+- Authoritative recording state: `GET /recording/native/status`. See `hydrogen-recording`. ## Pick the scope — panel / workspace / screen | You want… | Command | Sub-command | |---|---|---| | ONE panel or webview tab (the welcome page, a viewer, the editor) | `adom-cli hydrogen screenshot panel …` | `panel` |-| The whole HD **workspace** (every panel side by side) | `adom-cli hydrogen screenshot workspace` | `workspace` |+| The whole Hydrogen **workspace** (every panel side by side) | `adom-cli hydrogen screenshot workspace` | `workspace` | | The whole **screen** — desktop, taskbar, OTHER apps | `adom-cli hydrogen screenshot screen` | `screen` | **"My whole screen / my desktop / my monitor / everything"** → `adom-cli hydrogen-screenshot screen`. The HD `screen` scope captures the real desktop and saves the PNG into+screenshot screen`. The Hydrogen `screen` scope captures the real desktop and saves the PNG into your container, same as the others. ## Do this — it saves a PNG and prints the path; then Read it@@ -149,15 +149,15 @@ display **awake** — leaving it active blocks the user's screensaver. After a o opened). Tab `panel`/`workspace` sharing doesn't hold the display, so this only matters once you've requested the `screen` scope. -## Why this works the same in HD as it does for web Hydrogen+## Why this works the same in Hydrogen as it does for web Hydrogen -`adom-cli` is **one binary** used by both web Hydrogen and HD — you can test these-commands anywhere. The difference is purely *where the work runs*: HD intercepts+`adom-cli` is **one binary** used by both web Hydrogen and Hydrogen — you can test these+commands anywhere. The difference is purely *where the work runs*: Hydrogen intercepts what adom-cli talks to. `adom-cli hydrogen <cmd>` hits `ADOM_HYDROGEN_URL`, which-in HD points at **HD's local proxy**. HD's proxy pulls out the **local hydrogen/SSE+in Hydrogen points at **Hydrogen's local proxy**. Hydrogen's proxy pulls out the **local hydrogen/SSE commands** (screenshot, webview, caption, notify, recording…) and runs them against-the HD frontend over SSE, while **carbon/cloud calls pass straight through** to the-cloud. For a screenshot: `PATCH /current/screenshot` → HD broadcasts an SSE+the Hydrogen frontend over SSE, while **carbon/cloud calls pass straight through** to the+cloud. For a screenshot: `PATCH /current/screenshot` → Hydrogen broadcasts an SSE `screenshot_request` → the frontend Element-Captures the panel → uploads it into **this container's** `screenshots/` folder → the CLI returns the saved path. So the command, and the returned path, behave the same — the bytes just land in your local@@ -175,19 +175,19 @@ container. `adom-cli hydrogen screenshot` above is the easy "save a panel/workspace/screen PNG" path. For **precise control** — a specific VS Code or webview surface, **any CSS region** (a meter, a menu, a dialog, a toolbar), or an inline PNG with no flash — use-HD's **canonical capture endpoint `POST /screenshot`** (aliases: `/shot`,+Hydrogen's **canonical capture endpoint `POST /screenshot`** (aliases: `/shot`, `/capture/viewport`). Read the control URL from the FILE — it's the dynamic port, and your non-login Bash shell won't have the env var: ```bash-CTRL="$(cat ~/.adom/hd-control-url)" # http://127.0.0.1:<dynamic>+CTRL="$(cat ~/.adom/hydrogen-control-url)" # http://127.0.0.1:<dynamic> curl -s -X POST "$CTRL/screenshot" -H 'Content-Type: application/json' \ -d '{"target":"full","b64":true}' ``` | Field | Meaning | |---|---|-| `target` | the surface — `full`/`window` (whole HD window) · `vscode`/`editor`/`workbench`/`code` (the VS Code panel) · `shell`/`hd` (the Svelte shell: title bar, menus, panels) · a **webview url-substring** (e.g. `wiki`) · **or a TAB DISPLAY NAME** (e.g. `"ScreenA"`, `"VS Code"`) — see by-name note below |+| `target` | the surface — `full`/`window` (whole Hydrogen window) · `vscode`/`editor`/`workbench`/`code` (the VS Code panel) · `shell`/`hd` (the Svelte shell: title bar, menus, panels) · a **webview url-substring** (e.g. `wiki`) · **or a TAB DISPLAY NAME** (e.g. `"ScreenA"`, `"VS Code"`) — see by-name note below | | `selector` | **optional CSS selector — it ALWAYS WINS and region-clips to that element.** e.g. `.resource-bars` (CPU/RAM meter), `iframe[src*='wiki']`, `.setup-panel`, `.dialog`, `.dropdown-content.open` | | `b64` | `true` → returns the PNG inline as a `dataUrl` (decode + Read); else saved to a file in `screenshots/` | | `silent` | `true` → suppress the capture flash |@@ -206,15 +206,15 @@ returns ScreenA's pixels and leaves ScreenB active. The `adom-cli` SSE path (`screenshot panel --name ScreenA`) also activates + restores. This is the right call for "shot tab #2 while #4 is showing." -**The teal zap:** every HD-driven capture flashes a teal (`#00b8b0`) highlight on the+**The teal zap:** every Hydrogen-driven capture flashes a teal (`#00b8b0`) highlight on the captured **region** (just the panel/menu/region; full-window flash only for-`target:full`). Teal = HD-driven. Pass `silent:true` to suppress it.+`target:full`). Teal = Hydrogen-driven. Pass `silent:true` to suppress it. ### Screenshot a menu / dialog / panel — open it, then clip to it The killer combo with the UI command bus (see **`hydrogen-ui`**): **open a surface → screenshot just that surface → close it** — no screen-clicking, no guessing where it is. ```bash-CTRL="$(cat ~/.adom/hd-control-url)"+CTRL="$(cat ~/.adom/hydrogen-control-url)" curl -s -X POST "$CTRL/ui/invoke" -H 'Content-Type: application/json' -d '{"id":"adom-menu.open"}' curl -s -X POST "$CTRL/screenshot" -H 'Content-Type: application/json' -d '{"target":"shell","selector":".dropdown-content.open","b64":true}' curl -s -X POST "$CTRL/ui/invoke" -H 'Content-Type: application/json' -d '{"id":"adom-menu.close"}'@@ -232,5 +232,5 @@ repeat. Log shots for the user with `shotlog inject -c hydrogen-ui -d "<desc>" < ## Related skills - [hydrogen-capture-share](../hydrogen-capture-share/SKILL.md) — the sharing/approval UX behind `screenshot`-- [hd-recording](../hd-recording/SKILL.md) · [hydrogen-captions](../hydrogen-captions/SKILL.md) — sibling `adom-cli hydrogen` AV verbs+- [hydrogen-recording](../hydrogen-recording/SKILL.md) · [hydrogen-captions](../hydrogen-captions/SKILL.md) — sibling `adom-cli hydrogen` AV verbs - `shotlog` — the screenshot log viewer/injector
skills/hydrogen-self-update/SKILL.md+8−8@@ -1,13 +1,13 @@ --- name: hydrogen-self-update-description: "How the AI keeps the Hydrogen APP itself (the Windows/macOS frontend, not the workspace) up to date — AI-first, consent-based. Use when asked \"is there an HD update\", \"update Hydrogen\", \"is my HD current\", \"what version of HD am I on\", \"update the app\", \"new HD version\". Trigger words: HD update, update hydrogen, app update, is HD current, HD version, new version of HD, relaunch to update, self-update."+description: "How the AI keeps the Hydrogen APP itself (the Windows/macOS frontend, not the workspace) up to date — AI-first, consent-based. Use when asked \"is there an Hydrogen update\", \"update Hydrogen\", \"is my Hydrogen current\", \"what version of Hydrogen am I on\", \"update the app\", \"new Hydrogen version\". Trigger words: Hydrogen update, update hydrogen, app update, is Hydrogen current, Hydrogen version, new version of Hydrogen, relaunch to update, self-update." --- -# HD Self-Update — the AI updates the app for you (consent-based)+# Hydrogen Self-Update — the AI updates the app for you (consent-based) This is how the **Hydrogen app itself** (the Windows/macOS shell around your editor) stays current. It is NOT the `workspace-updater` (that's the in-distro tooling). It's **AI-first**:-there is no nagging button — the AI notices a new HD version, tells you both version numbers, and+there is no nagging button — the AI notices a new Hydrogen version, tells you both version numbers, and on your OK downloads + relaunches onto the new version. ## When to check@@ -19,7 +19,7 @@ constantly. GET http://127.0.0.1:<control-port>/updater/status ``` Returns `{ current_version, latest_version, update_available, staged, ... }`:-- `update_available: true` → a newer HD exists.+- `update_available: true` → a newer Hydrogen exists. - `staged: true` → it's already downloaded + SHA-verified in the background, so applying is an **instant relaunch** (no wait). (`current_version` is also derivable from `/buildinfo`; `latest_version` comes from the wiki@@ -34,17 +34,17 @@ On **explicit consent**: ``` POST http://127.0.0.1:<control-port>/updater/install ```-HD applies the staged update (instant if `staged`, else downloads first) and relaunches onto the+Hydrogen applies the staged update (instant if `staged`, else downloads first) and relaunches onto the new version. **The Linux workspace + code-server keep running**, so your session reconnects in a few seconds — you can pick the conversation right back up. ## Rules-- **Consent-first.** Never relaunch HD without the user's OK (it restarts their app). Pick a+- **Consent-first.** Never relaunch Hydrogen without the user's OK (it restarts their app). Pick a natural break — not mid-task. - **State both versions** (current → latest) so the user knows what's changing. - This updates the **app shell only**. Editor extensions/code-server use the reload banner; in-workspace tooling/skills use the `workspace-updater`. Don't confuse the three. ## Resolving the control port-Read it from `VSCODE_PROXY_URI` / the HD `[ports]` log line (default control API `47084`), or-reach it through the relay/proxy like other HD control endpoints.+Read it from `VSCODE_PROXY_URI` / the Hydrogen `[ports]` log line (default control API `47084`), or+reach it through the relay/proxy like other Hydrogen control endpoints.
skills/hydrogen-settings/SKILL.md+15−15@@ -5,7 +5,7 @@ description: > change — theme, vim mode, launch-on-login, console-on-startup, 3D control style, font, line numbers, schematic nudge, the embedded Adom Bridge options, and more. READ THIS when the user asks "how do I turn on vim mode", "change the- theme", "make HD launch at startup", "stop Adom Bridge's window popping up",+ theme", "make Hydrogen launch at startup", "stop Adom Bridge's window popping up", "switch to blender/solidworks orbit controls", "hide line numbers", "show the console on startup", "make the UI compact", or "where are the settings". Opened from the Adom logo menu → Settings. Trigger words — settings, preferences,@@ -17,7 +17,7 @@ description: > off, change setting, how do I configure. --- -# HD Settings — the preference tree+# Hydrogen Settings — the preference tree Open it from the **Adom logo menu** (upper-left teal logo) → **Settings** (see [hydrogen-adom-menu](../hydrogen-adom-menu/SKILL.md)). The dialog is@@ -49,18 +49,18 @@ override. Keys are dotted (`section.subsection.name`). ### desktop *(Hydrogen app itself)* | Key | Default | What it does | |---|---|---|-| `desktop.show_console_on_startup` | `false` | Show the debug console window when HD starts (→ "show the console on startup") |-| `desktop.launch_on_boot` | `true` | Auto-launch HD on login / at startup (→ "make HD launch at startup" / "stop HD launching on login" = set false) |+| `desktop.show_console_on_startup` | `false` | Show the debug console window when Hydrogen starts (→ "show the console on startup") |+| `desktop.launch_on_boot` | `true` | Auto-launch Hydrogen on login / at startup (→ "make Hydrogen launch at startup" / "stop Hydrogen launching on login" = set false) | -### adom_desktop *(the embedded Adom Bridge / AD that HD runs)*-When HD is running it takes over AD, so AD's options live here. See-[hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md) for the HD↔AD relationship.+### adom_desktop *(the embedded Adom Bridge / ab that Hydrogen runs)*+When Hydrogen is running it takes over ab, so ab's options live here. See+[hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md) for the Hydrogen↔ab relationship. | Key | Type / default | What it does | |---|---|---|-| `adom_desktop.open` | action button | "Open Adom Bridge" — brings the AD window to the foreground (persists nothing) |-| `adom_desktop.auto_approve_when_running` | bool, `true` | While HD runs, keep AD in permanent auto-approve mode (auto-accept AD permission prompts) |-| `adom_desktop.show_window_on_launch` | bool, `true` | Show AD's window + taskbar icon when HD launches, so you can see it's running (→ "stop AD's window popping up" = set false) |-| `adom_desktop.foreground_hd_on_launch` | bool, `true` | Bring HD to the front on launch; AD still shows in the taskbar but stays behind HD |+| `adom_desktop.open` | action button | "Open Adom Bridge" — brings the ab window to the foreground (persists nothing) |+| `adom_desktop.auto_approve_when_running` | bool, `true` | While Hydrogen runs, keep ab in permanent auto-approve mode (auto-accept ab permission prompts) |+| `adom_desktop.show_window_on_launch` | bool, `true` | Show ab's window + taskbar icon when Hydrogen launches, so you can see it's running (→ "stop ab's window popping up" = set false) |+| `adom_desktop.foreground_hd_on_launch` | bool, `true` | Bring Hydrogen to the front on launch; ab still shows in the taskbar but stays behind Hydrogen | ### schematic *(Schematic Workspace)* | Key | Default | What it does |@@ -97,14 +97,14 @@ extension-specific settings). - **"Turn on vim mode"** → `code.vim_emulation_mode` = true - **"Change the theme / dark mode / high contrast"** → `general.appearance.theme`-- **"Make HD launch on login / at startup"** / "don't launch on login" → `desktop.launch_on_boot`+- **"Make Hydrogen launch on login / at startup"** / "don't launch on login" → `desktop.launch_on_boot` - **"Stop Adom Bridge's window popping up"** → `adom_desktop.show_window_on_launch` = false - **"Blender / SolidWorks orbit controls"** → `3d.control_style` - **"Hide line numbers / change code font"** → `code.line_numbers.enabled` / `code.appearance.font.family`-- **"Show the console when HD starts"** → `desktop.show_console_on_startup`+- **"Show the console when Hydrogen starts"** → `desktop.show_console_on_startup` - **"Make the UI compact"** → `general.appearance.user_interface_style` = compact ## Related skills - [hydrogen-adom-menu](../hydrogen-adom-menu/SKILL.md) — the logo menu that opens Settings (and Ports, API Explorer, etc.)-- [hydrogen-ui](../hydrogen-ui/SKILL.md) — the broader HD UI / panel layout this dialog sits in-- [hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md) — what the `adom_desktop.*` prefs control (the embedded AD)+- [hydrogen-ui](../hydrogen-ui/SKILL.md) — the broader Hydrogen UI / panel layout this dialog sits in+- [hydrogen-adom-desktop](../hydrogen-adom-desktop/SKILL.md) — what the `adom_desktop.*` prefs control (the embedded ab)
skills/hydrogen-setup-steps/SKILL.md+17−17@@ -1,23 +1,23 @@ --- name: hydrogen-setup-steps-description: What HD's setup steps did to prepare your workspace — the install sequence that provisions the golden workspace image, injects your Adom session, wires up the relay, and walks the Claude auth gate. Use this skill when the user asks "what did setup do", "why is X installed", "re-run a setup step", "what's a virgin reset", or "why did step N fail". Trigger words — setup steps, install steps, setup panel, virgin reset, re-run step, Run All, what did setup do, why is X installed, setup failed, install-tools, hd setup, claude code extension install, gallia install, hd workspace ready.+description: What Hydrogen's setup steps did to prepare your workspace — the install sequence that provisions the golden workspace image, injects your Adom session, wires up the relay, and walks the Claude auth gate. Use this skill when the user asks "what did setup do", "why is X installed", "re-run a setup step", "what's a virgin reset", or "why did step N fail". Trigger words — setup steps, install steps, setup panel, virgin reset, re-run step, Run All, what did setup do, why is X installed, setup failed, install-tools, hd setup, claude code extension install, gallia install, hd workspace ready. --- -# HD Setup Steps — what was done to prepare your workspace+# Hydrogen Setup Steps — what was done to prepare your workspace -This is the platform-generic, user-facing Q&A about what HD's setup did. The+This is the platform-generic, user-facing Q&A about what Hydrogen's setup did. The exact per-platform step list, the workspace-provisioning commands, and the state-file name live in the companion [[hydrogen-setup-steps-windows]] skill (for Windows/WSL2). -When you first launched Hydrogen (or after a virgin reset), HD ran an+When you first launched Hydrogen (or after a virgin reset), Hydrogen ran an install sequence to turn a blank machine into a fully-tooled Adom workspace. The heavy tooling (code-server, gallia, the Adom CLIs, the claude CLI + Code extension, VS Code settings, and all `hd-*` skills) is already BAKED into the golden image; setup just provisions that image, injects your Adom session, wires up the relay, and walks the Claude auth gate. This skill explains what each phase did so you can help the user understand their environment, re-run-failed steps, or wipe and rebuild. See `hd-golden-image` for the baked-image+failed steps, or wipe and rebuild. See `hydrogen-golden-image` for the baked-image model. The cascade is halt-on-failure, resume-not-restart, with per-step 3x@@ -43,16 +43,16 @@ auto-retry. The exact steps and ordering are platform-specific — see | ensure-sse | GATE: confirm the editor browser SSE session is connected so Welcome's webview-open doesn't 409 | | verify-workspace | GATE: battery confirming the proxy holds a real layout | | welcome | Open Claude Code, authenticate if needed, send the first prompt |-| open-welcome | GATE (final): open welcome.html in HD's right pane; hard-fails if the Welcome tab doesn't appear |+| open-welcome | GATE (final): open welcome.html in Hydrogen's right pane; hard-fails if the Welcome tab doesn't appear | ### Steps that NO LONGER EXIST (baked into the golden image) These are NOT setup steps anymore — they are baked at image-build time:-`install-gallia`, `install-hd-skills`, `verify-adom-bridge-cli`,+`install-gallia`, `install-hydrogen-skills`, `verify-adom-bridge-cli`, `install-claude-cli`, `install-claude-ext`, `write-vscode-settings`, `set-trusted-domains`, `clean-layout`. If a user asks "what installed gallia / the Claude extension / my skills / VS Code settings", the answer is: **baked-into the golden image at build time, not a setup step.** See `hd-golden-image`.+into the golden image at build time, not a setup step.** See `hydrogen-golden-image`. ## Common user questions @@ -60,7 +60,7 @@ into the golden image at build time, not a setup step.** See `hd-golden-image`. claude CLI, the Claude Code extension, VS Code settings, or an `hd-*` skill, it was **baked into the golden image** — not run as a setup step. The setup steps only provision the image, inject your session, wire the relay, and walk Claude-auth. The setup panel (HD UI → bottom) lists every step with its current+auth. The setup panel (Hydrogen UI → bottom) lists every step with its current status. **"Setup failed at step N"** → The setup panel shows the error. Most common@@ -88,17 +88,17 @@ which artifacts to delete (option keys in parentheses): | Install step state (`install_state`) | Marks all steps as pending so they re-run | Always (default on) | | Workspace (`container`) | PRISTINE wipe + re-provision — deletes the workspace AND everything in it, including your project files | Always (default on); your work is GONE | | Image tarball (`tarball`, legacy `image`) | Deletes the cached golden image (full re-download) | Rarely — only if the image is corrupted |-| Webview storage (`webview_storage`) | Queued wipe, flushed at next HD launch (restart_required) | Rarely |-| VS Code state (`vscode_state`) | Queued wipe, flushed at next HD launch (restart_required) | Rarely |+| Webview storage (`webview_storage`) | Queued wipe, flushed at next Hydrogen launch (restart_required) | Rarely |+| VS Code state (`vscode_state`) | Queued wipe, flushed at next Hydrogen launch (restart_required) | Rarely | | Adom session token (`adom_token`) | Deletes `hydrogen-session.txt`; forces re-login | Rarely | | Claude credentials (`claude_token`) | Deletes the host-side Claude creds backup; forces Claude re-auth | When Claude auth is stuck | `confirmed_destructive` must be set. After toggling, hit "Wipe Selected", then "Run All" to rebuild. The workspace reset backs up Claude creds first UNLESS `claude_token` is checked; the `webview_storage` / `vscode_state` wipes are-queued and flushed at the next HD launch (restart_required), not immediate.+queued and flushed at the next Hydrogen launch (restart_required), not immediate. -CRITICAL: the workspace reset ONLY ever wipes HD's own workspace. It never+CRITICAL: the workspace reset ONLY ever wipes Hydrogen's own workspace. It never touches other workspaces, distros, or runtimes the user may have on the machine, and it performs NO reboot for the wipe. The platform-specific wipe commands are in [[hydrogen-setup-steps-windows]].@@ -112,7 +112,7 @@ commands are in [[hydrogen-setup-steps-windows]]. | `POST /setup/panel/run-virgin-reset` | Trigger virgin reset with the supplied toggle options | | `POST /setup/panel/show` | Open the setup panel from anywhere | -All on HD's control API at `http://127.0.0.1:47084`.+All on Hydrogen's control API at `http://127.0.0.1:47084`. **DEPRECATED — now REFUSED, do not use:** `POST /wsl/unregister`, `POST /setup/virgin-reset`, `POST /setup/run-all`, `POST /setup/run-step`. Use@@ -121,14 +121,14 @@ All on HD's control API at `http://127.0.0.1:47084`. ## Setup state file Setup writes its state to a per-step state file (one entry per step with-`status: pending|running|done|failed`, output text, percent complete). HD reads+`status: pending|running|done|failed`, output text, percent complete). Hydrogen reads this on launch to decide whether the setup panel auto-opens. The exact file name and location are platform-specific — see [[hydrogen-setup-steps-windows]]. ## Related skills - [[hydrogen-setup-steps-windows]] — the concrete WSL2 16-step cascade, the import step, `wsl --unregister`, `setup-steps-wsl.json`, and the golden tarball-- `hd-golden-image` — the baked-image model: what's pre-installed vs. what setup does+- `hydrogen-golden-image` — the baked-image model: what's pre-installed vs. what setup does - `hydrogen-setup` — the setup-panel UX and virgin-reset toggles-- `hd-browser-picker` — used by claude-auth for the Claude auth OAuth flow+- `hydrogen-browser-picker` — used by claude-auth for the Claude auth OAuth flow - `hydrogen-adom-auth` — how the Adom session token (inject-api-key) gets injected
skills/hydrogen-setup/SKILL.md+16−16@@ -1,7 +1,7 @@ --- name: hydrogen-setup description: >- HD setup panel: the install-step cascade, Run All, Rollback All, Virgin Reset+ Hydrogen setup panel: the install-step cascade, Run All, Rollback All, Virgin Reset with toggles, and automated testing patterns. MUST READ before running setup, testing steps, or doing virgin resets. Covers the step list, the virgin reset toggle panel, how to keep auth during resets, and how Run All handles@@ -11,27 +11,27 @@ description: > # Hydrogen -- Setup Panel & Virgin Reset -This is the platform-generic reference for the HD setup panel and virgin+This is the platform-generic reference for the Hydrogen setup panel and virgin reset. The host-platform specifics (the exact install cascade on Windows/WSL2, distro import/unregister mechanics, the per-platform step list and state file) live in the companion [[hydrogen-setup-windows]] skill. ## Zero-Click Goal -The HD setup process targets ZERO manual clicks for the user. The heavy+The Hydrogen setup process targets ZERO manual clicks for the user. The heavy lifting is already done at image-build time: the golden workspace image ships with code-server, gallia, the Adom CLIs, the claude CLI + Code extension, VS Code settings, and all `hd-*` skills BAKED IN. Setup just provisions that image, injects the user's session, wires up the relay, and walks the single-human auth gate. If something is missing, HD downloads it — never tell the-user to install something manually. See the `hd-golden-image` skill for the+human auth gate. If something is missing, Hydrogen downloads it — never tell the+user to install something manually. See the `hydrogen-golden-image` skill for the baked-image model. ## The Install Steps The setup cascade is a halt-on-failure, resume-not-restart sequence with per-step 3x auto-retry. State is tracked per-step (status pending / running /-done / failed, output text, percent complete) and HD reads it on launch to+done / failed, output text, percent complete) and Hydrogen reads it on launch to decide whether the setup panel auto-opens. The exact step list, ordering, and state-file name are platform-specific — see [[hydrogen-setup-windows]]. @@ -53,17 +53,17 @@ Conceptually the steps fall into these phases: 5. **Gates + payoff** — gate on adom-cli reachability (carbon + hydrogen-proxy), walk the single Claude auth gate, confirm the editor SSE session, verify the proxy holds a real layout, open Claude Code and send the- first prompt, and finally open welcome.html in HD's right pane (hard-fails+ first prompt, and finally open welcome.html in Hydrogen's right pane (hard-fails if the Welcome tab doesn't appear). ### Steps that NO LONGER EXIST (baked into the golden image) These are NOT setup steps anymore — they are baked at image-build time and-must not be listed or "run": `install-gallia`, `install-hd-skills`,+must not be listed or "run": `install-gallia`, `install-hydrogen-skills`, `verify-adom-bridge-cli`, `install-claude-cli`, `install-claude-ext`, `write-vscode-settings`, `set-trusted-domains`, `clean-layout`. gallia, the Adom CLIs, the claude CLI + Code extension, code-server, settings, and all-`hd-*` skills are baked into the golden image. See `hd-golden-image`.+`hd-*` skills are baked into the golden image. See `hydrogen-golden-image`. ## Panel Buttons @@ -91,10 +91,10 @@ live status badge showing the current state. The ONLY programmatic trigger is | Toggle (option key) | What it wipes | Status badges | |---|---|---| | Install step state (`install_state`) | Resets all steps to pending | CLEAN / EXISTS |-| Workspace (`container`) | PRISTINE wipe + re-provision of the workspace (ONLY HD's own workspace) | GONE / RUNNING / EXISTS |+| Workspace (`container`) | PRISTINE wipe + re-provision of the workspace (ONLY Hydrogen's own workspace) | GONE / RUNNING / EXISTS | | Image tarball (`tarball`, legacy `image`) | Deletes the cached golden image (full re-download) | CACHED / GONE |-| Webview storage (`webview_storage`) | Queued wipe, flushed at next HD launch (restart_required) | CLEAN / EXISTS |-| VS Code state (`vscode_state`) | Queued wipe, flushed at next HD launch (restart_required) | CLEAN / EXISTS |+| Webview storage (`webview_storage`) | Queued wipe, flushed at next Hydrogen launch (restart_required) | CLEAN / EXISTS |+| VS Code state (`vscode_state`) | Queued wipe, flushed at next Hydrogen launch (restart_required) | CLEAN / EXISTS | | Adom session token (`adom_token`) | Deletes `hydrogen-session.txt` | CLEAN / EXISTS | | Claude credentials (`claude_token`) | Deletes the host-side Claude creds backup | CLEAN / EXISTS | @@ -103,10 +103,10 @@ Selected"** at the bottom executes the reset for all checked toggles. The workspace reset is a PRISTINE wipe + re-provision — it backs up Claude creds first UNLESS `claude_token` is checked. The `webview_storage` /-`vscode_state` wipes are queued and flushed at the next HD launch+`vscode_state` wipes are queued and flushed at the next Hydrogen launch (restart_required), NOT immediate; there is no reboot for the wipe. -CRITICAL — the virgin reset only ever touches HD's OWN workspace. It NEVER+CRITICAL — the virgin reset only ever touches Hydrogen's OWN workspace. It NEVER touches other workspaces, distros, or runtimes the user may have on the machine. The platform-specific commands (and the never-touch-global rule) are in [[hydrogen-setup-windows]].@@ -176,12 +176,12 @@ via the native browser Browser Picker. Runs LAST before the payoff steps. `ensure-sse` confirms the editor browser SSE session is connected (so the Welcome webview-open doesn't 409); `verify-workspace` confirms the proxy holds a real layout; `welcome` opens Claude Code and sends the first prompt; the-final `open-welcome` gate opens welcome.html in HD's right pane and HARD-FAILS+final `open-welcome` gate opens welcome.html in Hydrogen's right pane and HARD-FAILS if the Welcome tab doesn't appear. > Note: gallia, the Adom CLIs, the claude CLI + Code extension, VS Code > settings, and `hd-*` skills are NOT setup steps — they are baked into the-> golden image. See `hd-golden-image`.+> golden image. See `hydrogen-golden-image`. ## Workspace Recreation
skills/hydrogen-ui/SKILL.md+18−18@@ -1,22 +1,22 @@ --- name: hydrogen-ui description: >- HD's user interface: menus, dialogs, panels, login/logout, profile menu,+ Hydrogen's user interface: menus, dialogs, panels, login/logout, profile menu, workspace layout, setup panel — and how to DRIVE them from the workspace via the UI command bus (GET /ui/actions → POST /ui/invoke), the first-class way to- open/close/toggle any HD menu or dialog (no CDP clicking). READ when the user- asks you to open/close a dialog or menu, operate HD's UI, or you need to know- where a UI element is. Trigger words — HD menu, HD dialog, HD panel, open+ open/close/toggle any Hydrogen menu or dialog (no CDP clicking). READ when the user+ asks you to open/close a dialog or menu, operate Hydrogen's UI, or you need to know+ where a UI element is. Trigger words — Hydrogen menu, Hydrogen dialog, Hydrogen panel, open dialog, open menu, close dialog, drive UI, ui/actions, ui/invoke, command bus, ports.open, settings.open, about dialog, profile menu, login, logout, settings,- setup panel, Adom menu, HD UI.+ setup panel, Adom menu, Hydrogen UI. --- # Hydrogen — UI Reference ## Window Layout -HD's window has these regions (top to bottom, left to right):+Hydrogen's window has these regions (top to bottom, left to right): ### Title Bar - **Left**: "jlauer12 / Hydrogen" — shows user + app name@@ -47,11 +47,11 @@ The main menu, opened by clicking the Adom logo at the top-left. Items are group - **Ports...** — opens the port configuration dialog (see hydrogen-ports) - **API Explorer...** — opens the control-API endpoint explorer dialog -**DESKTOP** (Tauri-only — won't appear in browser-served HD; in order)+**DESKTOP** (Tauri-only — won't appear in browser-served Hydrogen; in order) - **Adom Bridge** — brings the embedded Adom Bridge window to the foreground (taskbar); bus id `adom-bridge-cli.open` - **Zoom** — webview zoom controls (− % +) with persistence across launches - **Fullscreen** — toggle fullscreen-- **Console** — show/hide the HD debug console window+- **Console** — show/hide the Hydrogen debug console window - **Developer Tools** — open the webview developer tools - **Dev Toolbar** — show/hide the Adom Dev Toolbar window (eval-in / shot / Claude control endpoints); bus id `dev-toolbar.toggle` @@ -64,7 +64,7 @@ The main menu, opened by clicking the Adom logo at the top-left. Items are group **ADMIN** - **Setup Steps** — opens the setup panel (the setup cascade for the active runtime); see hydrogen-setup-steps - **Virgin Reset** — opens the virgin reset section of the setup panel; see hydrogen-volume for what each toggle deletes-- **Browser Picker Manager** — configure per-domain default browser/profile prefs; see hd-browser-picker+- **Browser Picker Manager** — configure per-domain default browser/profile prefs; see hydrogen-browser-picker ### Profile Menu (top-right avatar) Click the user avatar (circular photo) in the top-right corner.@@ -95,17 +95,17 @@ Appears when clicking external links. Shows detected browser profiles ## Driving the UI — the command bus (PREFERRED, first-class) -⭐ **Every menu / dialog / panel HD has wired is a first-class action you drive over the control-API — no CDP, no `.click()`, no selector guessing.** This is how you operate HD's UI when the+⭐ **Every menu / dialog / panel Hydrogen has wired is a first-class action you drive over the control+API — no CDP, no `.click()`, no selector guessing.** This is how you operate Hydrogen's UI when the user says "open the Ports dialog", "open About", "show settings", etc. -**Get the control URL from the discovery file** `~/.adom/hd-control-url` (HD rewrites it with+**Get the control URL from the discovery file** `~/.adom/hydrogen-control-url` (Hydrogen rewrites it with the live, dynamic control port every launch; it's the host loopback, reachable from the workspace). Read it from a file, not an env var — your Bash tool runs non-interactive shells that don't source `.bashrc`/`profile.d`: ```bash-CTRL="$(cat ~/.adom/hd-control-url)"+CTRL="$(cat ~/.adom/hydrogen-control-url)" ``` **Always do this in order:**@@ -147,7 +147,7 @@ item-level treatment over time. > `setup-panel.hide` action is on the wishlist. ### Open a surface, then screenshot it (the killer combo)-Combine the bus with HD's canonical capture endpoint to grab any menu/dialog/panel with+Combine the bus with Hydrogen's canonical capture endpoint to grab any menu/dialog/panel with **no screen-clicking**: `POST /ui/invoke {id:"<x>.open"}` → `POST /screenshot {target:"shell", selector:"<open-state selector>"}` → `POST /ui/invoke {id:"<x>.close"}`. The `/screenshot` region-flash lands on that selector. Resolved selectors (verified live):@@ -155,14 +155,14 @@ The `/screenshot` region-flash lands on that selector. Resolved selectors (verif `.setup-panel`; **API Explorer** → `.dialog`. Full `/screenshot` reference (target/selector/ b64/silent) is in **[hydrogen-self-screenshot](../hydrogen-self-screenshot/SKILL.md)**. -> **This is HD-desktop-only and SEPARATE from `adom-cli`.** `adom-cli` drives *web-hydrogen's*-> UI via the SSE bridge (`ADOM_HYDROGEN_URL`) and is unchanged. For HD desktop's far richer UI+> **This is Hydrogen-desktop-only and SEPARATE from `adom-cli`.** `adom-cli` drives *web-hydrogen's*+> UI via the SSE bridge (`ADOM_HYDROGEN_URL`) and is unchanged. For Hydrogen desktop's far richer UI > control, use the command bus above — never `adom-cli` for this. ## Legacy: raw CDP clicking (deprecated fallback — the command bus above is canonical) -⚠ The command bus (`/ui/actions` → `/ui/invoke`) is the canonical way to drive HD's UI. Before-it existed, UI was driven by CDP `.click()` on CSS selectors via the HD CDP eval channel. This+⚠ The command bus (`/ui/actions` → `/ui/invoke`) is the canonical way to drive Hydrogen's UI. Before+it existed, UI was driven by CDP `.click()` on CSS selectors via the Hydrogen CDP eval channel. This is brittle (selectors drift; multiple `localhost:1420` CDP targets) and the selectors below may be stale. Reach for CDP ONLY for an element not yet on the bus — and the better fix is to register it. Eval JS against the CDP endpoint (its port comes from `/discover` as `cdp`).
skills/hydrogen-welcome/SKILL.md+11−11@@ -1,18 +1,18 @@ --- name: hydrogen-welcome description: >- The HD welcome page — shown after setup steps complete. Served from+ The Hydrogen welcome page — shown after setup steps complete. Served from static/welcome.html at http://localhost:1420/welcome.html. Shows Adom branding, "Build and test electronics in the cloud", and an "Open Claude Code" button. This is NOT the adom.inc homepage — it's a local static page- bundled with HD. Trigger words: welcome page, welcome tab, show welcome,+ bundled with Hydrogen. Trigger words: welcome page, welcome tab, show welcome, onboarding page, setup complete page, first launch page. --- -# HD Welcome Page+# Hydrogen Welcome Page -The welcome page is a static HTML page bundled with HD at `static/welcome.html`.-It's served locally at `http://localhost:1420/welcome.html` by HD's dev file server.+The welcome page is a static HTML page bundled with Hydrogen at `static/welcome.html`.+It's served locally at `http://localhost:1420/welcome.html` by Hydrogen's dev file server. ## What it shows @@ -41,11 +41,11 @@ adom-cli hydrogen webview open-or-refresh \ --panel-id desktop-pane-right ``` -`localhost:1420` is HD's dev file server running on the host (where HD itself runs),-NOT anything inside the workspace. HD's webview renders the URL against the host, so the-page resolves on whatever platform HD is running on.+`localhost:1420` is Hydrogen's dev file server running on the host (where Hydrogen itself runs),+NOT anything inside the workspace. Hydrogen's webview renders the URL against the host, so the+page resolves on whatever platform Hydrogen is running on. -### From outside (via HD control API)+### From outside (via Hydrogen control API) The workspace tabs API doesn't reliably store the URL in panelState when creating tabs. The reliable method is to navigate an existing webview iframe:@@ -71,9 +71,9 @@ curl -X POST http://127.0.0.1:47083/api/workspaces/editor/{owner}/{repo}/current - NOT the VS Code welcome tab inside code-server It is a LOCAL static page at `http://localhost:1420/welcome.html`, bundled-in `static/welcome.html` in the HD repo.+in `static/welcome.html` in the Hydrogen repo. ## Panel type -Webview tabs in HD use panel type `adom/a1b2c3d4-0031-4000-a000-000000000031`.+Webview tabs in Hydrogen use panel type `adom/a1b2c3d4-0031-4000-a000-000000000031`. Do NOT use `panelType: "webview"` — that shows "Unknown panel type" error.
skills/hydrogen-who-am-i/SKILL.md+13−13@@ -1,11 +1,11 @@ --- name: hydrogen-who-am-i-description: How to answer "who am I and what can I do here?" — the auto-question HD's welcome step injects on first launch. Tells Claude what data sources to pull (Adom session token, adom-cli user/repo/container queries), the Linux-username-vs-Adom-username distinction (everyone is `adom` inside the container), and the template answer that names the user, shows their resources, and explains what HD + the Adom ecosystem can do for them. READ this skill when answering "who am i", "what can i do here", or "what is this environment". Trigger words — who am i, what can I do here, who is this user, welcome question, first AI question, introduce yourself, what is HD, what can hydrogen do, user identity, user introspection, my profile in HD, my repos, my containers, linux username vs adom username, adom username container.+description: How to answer "who am I and what can I do here?" — the auto-question Hydrogen's welcome step injects on first launch. Tells Claude what data sources to pull (Adom session token, adom-cli user/repo/container queries), the Linux-username-vs-Adom-username distinction (everyone is `adom` inside the container), and the template answer that names the user, shows their resources, and explains what Hydrogen + the Adom ecosystem can do for them. READ this skill when answering "who am i", "what can i do here", or "what is this environment". Trigger words — who am i, what can I do here, who is this user, welcome question, first AI question, introduce yourself, what is Hydrogen, what can hydrogen do, user identity, user introspection, my profile in Hydrogen, my repos, my containers, linux username vs adom username, adom username container. --- -# HD Who Am I — answer the welcome-step prompt coherently+# Hydrogen Who Am I — answer the welcome-step prompt coherently -When HD finishes setup (the final setup step, `welcome`), it auto-injects this prompt into your Claude Code chat:+When Hydrogen finishes setup (the final setup step, `welcome`), it auto-injects this prompt into your Claude Code chat: > **who am i and what can i do here** @@ -23,39 +23,39 @@ Run these first (they're all fast — under 5s total): | Workspace hostname | `hostname` | The workspace hostname (varies by runtime) | | OS | `cat /etc/os-release \| grep PRETTY_NAME` | Always Ubuntu 24.04 | -If `adom-cli carbon user get` fails with no session token, the user isn't authenticated. In that case answer: "I don't see an Adom session — please log in via the HD login page first."+If `adom-cli carbon user get` fails with no session token, the user isn't authenticated. In that case answer: "I don't see an Adom session — please log in via the Hydrogen login page first." ## The Linux-username-vs-Adom-username quirk (always mention this) -Every user's Linux username inside the HD workspace is **`adom`** — not their Adom username. This is intentional (consistency across all Adom workspaces makes filesystem paths, scripts, and skill examples portable). The user's Adom identity is John, Jane, etc.; their shell prompt just always says `adom@<workspace-hostname>`.+Every user's Linux username inside the Hydrogen workspace is **`adom`** — not their Adom username. This is intentional (consistency across all Adom workspaces makes filesystem paths, scripts, and skill examples portable). The user's Adom identity is John, Jane, etc.; their shell prompt just always says `adom@<workspace-hostname>`. Mention this in the welcome answer so they don't get confused when their `whoami` says `adom`. -## What HD + the Adom ecosystem can do (the capabilities pitch)+## What Hydrogen + the Adom ecosystem can do (the capabilities pitch) Tell them they have access to a full electronics prototyping ecosystem. Specifically: - **Build PCBs** — InstaPCB workflow with tscircuit, KiCad, our autorouter - **Build apps** — wiki webview apps via the app-creator skill - **Build CLIs** — automate workflows from the terminal-- **3D viewers** — full 3D component / STEP / GLB viewing in HD (via adom-step / adom-tsci panels)-- **Open KiCad or Fusion 360** on their Windows machine — HD bridges to the local apps+- **3D viewers** — full 3D component / STEP / GLB viewing in Hydrogen (via adom-step / adom-tsci panels)+- **Open KiCad or Fusion 360** on their Windows machine — Hydrogen bridges to the local apps - **File transfer** — send/receive files between container and their Windows desktop (`adom-bridge-cli send_files` / `pull_file`) - **Talk to their cloud containers** — adom-cli reaches Adom-cloud-hosted containers under their account-- **Main AI dev environment** — HD is designed as the primary AI-powered dev surface for hardware + software+- **Main AI dev environment** — Hydrogen is designed as the primary AI-powered dev surface for hardware + software ## Answer template Adapt this to whatever the user's data is. Don't bullet-dump everything — write it as a warm welcome paragraph followed by capabilities. Use markdown. ```markdown-You're **{user.formatted_name}**, signed in to Adom as **{user.name}** ({user.email}). You're running in **Hydrogen**, Adom's local AI dev environment, on your Windows machine. The workspace itself is Ubuntu 24.04 with code-server, the `claude` CLI, and the full Adom skill ecosystem (gallia + HD skills) already loaded.+You're **{user.formatted_name}**, signed in to Adom as **{user.name}** ({user.email}). You're running in **Hydrogen**, Adom's local AI dev environment, on your Windows machine. The workspace itself is Ubuntu 24.04 with code-server, the `claude` CLI, and the full Adom skill ecosystem (gallia + Hydrogen skills) already loaded. A few quick orientation notes: - Your **Linux username here is `adom`** (not `{user.name}`) — that's intentional, every Adom workspace uses `adom` for consistency. Your Adom identity (`{user.name}`) is what shows up across the Adom ecosystem. - You have **{N} repos** and **{M} cloud containers** under your Adom account. -Here's what we can do together in HD:+Here's what we can do together in Hydrogen: **Electronics & hardware** - Build PCBs end-to-end (tscircuit → KiCad → Adom's autorouter → InstaPCB fab)@@ -83,12 +83,12 @@ Ask me to do any of those, or just ask "what's the best way to start a new PCB p - **Pull real numbers** from `adom-cli` — generic "you have some repos" feels worse than "you have 4 repos." - **Don't list internal jargon** — say "Adom's autorouter", not "the gallia/autorouter/v2 skill". - **Mention the Linux username quirk early** — it WILL confuse users on first `whoami`.-- **If a data fetch fails** (e.g. adom-cli not yet configured), gracefully say "I can't read your Adom session right now, but here's what HD can do once you're signed in" and pivot to capabilities only.+- **If a data fetch fails** (e.g. adom-cli not yet configured), gracefully say "I can't read your Adom session right now, but here's what Hydrogen can do once you're signed in" and pivot to capabilities only. ## Related skills - [hydrogen-adom-auth](../hydrogen-adom-auth/SKILL.md) — the session token that gives `adom-cli` its identity - [hydrogen-claude-auth](../hydrogen-claude-auth/SKILL.md) — Claude Code's own auth (separate)-- [hd-skill-catalog](../hd-skill-catalog/SKILL.md) — the full list of public hd-* skills your AI has access to+- [hydrogen-skill-catalog](../hydrogen-skill-catalog/SKILL.md) — the full list of public hd-* skills your AI has access to - `hydrogen-container` — the exact Ubuntu image / arch / pre-installed tools you'll mention - [hydrogen-bridges](../hydrogen-bridges/SKILL.md) — KiCad / Fusion / Puppeteer bridge capabilities to mention
skills/hydrogen-workspace-monitoring/SKILL.md+10−10@@ -12,16 +12,16 @@ description: > workspace running. --- -# HD Workspace Monitoring+# Hydrogen Workspace Monitoring -This is the platform-generic reference for how HD monitors workspace health.+This is the platform-generic reference for how Hydrogen monitors workspace health. The host-platform specifics (the runtime-unavailable floaty wording, the stop command, the exact code-server reachability port, and the no-daemon framing) live in the companion [[hydrogen-workspace-monitoring-windows]] skill. ## Architecture -The workspace is HD's local code-server-backed dev environment. HD monitors+The workspace is Hydrogen's local code-server-backed dev environment. Hydrogen monitors workspace health at two levels: 1. **Runtime available** — is the workspace runtime itself installed and@@ -30,8 +30,8 @@ workspace health at two levels: code-server reachable on its host port? The second level is a real reachability check, not just "is the workspace-present." A resume reality-check (after sleep, or after an HD rebuild/relaunch)-requires code-server to actually answer before HD trusts the workspace as+present." A resume reality-check (after sleep, or after an Hydrogen rebuild/relaunch)+requires code-server to actually answer before Hydrogen trusts the workspace as healthy — a workspace can be Running while code-server is dead. The VS Code panel (`PanelVisualStudioCode.svelte`) polls workspace state every@@ -66,7 +66,7 @@ etc.) remains fully interactive. ### 1. Runtime Not Available (red dot) - **When**: the workspace runtime itself is not installed / not responding (level-1 health fails)-- **Action**: "Run Setup Steps" button → dispatches `hd-show-setup` event+- **Action**: "Run Setup Steps" button → dispatches `hydrogen-show-setup` event (which walks the user through enabling the runtime) - **Color**: Red dot in header @@ -93,11 +93,11 @@ the active runtime's `setup_and_start`: - If the workspace is present but code-server is down, it just (re-)starts code-server. -Importantly, code-server runs as an **HD-owned child process** (not a detached-`nohup`) — it dies with HD. So HD also **re-ensures code-server on every+Importantly, code-server runs as an **Hydrogen-owned child process** (not a detached+`nohup`) — it dies with Hydrogen. So Hydrogen also **re-ensures code-server on every launch** (look for `re-ensured code-server on launch` in the log). Without-that, a freshly relaunched HD would show the workspace Running but the editor-stuck on "Starting AI Environment" forever, because the previous HD's+that, a freshly relaunched Hydrogen would show the workspace Running but the editor+stuck on "Starting AI Environment" forever, because the previous Hydrogen's code-server child was orphaned. See `hydrogen-workspace-lifecycle` for the full lifecycle detail.
skills/hydrogen-workspace-updater/SKILL.md+3−3@@ -24,7 +24,7 @@ adom-workspace-updater --once It converges this workspace to a wiki **desired-state manifest**: SHA-verified, never downgrades, and **surgical** — it only touches the specific named tooling, never your files or anything you installed yourself.-- Installed skill-bundle version: `cat ~/.claude/skills/.hd-skills-version`+- Installed skill-bundle version: `cat ~/.claude/skills/.hydrogen-skills-version` - Last run + what changed: `cat ~/.adom/workspace-updater-status.json` (code-server and the Claude Code extension are **baked fundamentals** that self-update — the@@ -36,7 +36,7 @@ daemon does *not* manage them; it just notices a change and offers the reload.) ``` scripts/publish-tooling.sh publish-skills ```- (bundles every public hd-* skill, pushes it to the `hd-workspace-tooling` wiki page, bumps the version.)+ (bundles every public hd-* skill, pushes it to the `hydrogen-workspace-tooling` wiki page, bumps the version.) 3. That's it — every workspace's daemon picks it up on its next tick and extracts it into `~/.claude/skills/`. To distribute an **extension** or a **CLI** instead, add a manifest entry then publish:@@ -50,7 +50,7 @@ skill in the hydrogen-desktop repo. ## The reload banner When a new version is on disk but not yet active (a daemon-installed extension, or one the-editor auto-updated), HD shows **"<Tool> is ready / has an update — click to reload"** at the+editor auto-updated), Hydrogen shows **"<Tool> is ready / has an update — click to reload"** at the top of the editor; clicking reloads it to activate the new code. **Skills need no reload** — Claude re-reads them itself.