bootstrap
Adom Hydrogen (Windows / WSL2)
Public Made by Adomby adom
The Windows (WSL2) platform layer for Hydrogen.
← Commit history
Publish 0.3.31
12 files changed
+42−42
install.shpackage.json+3−3page.json+4−4skills/hydrogen-bridges/SKILL.md+10−10skills/hydrogen-browser-picker/SKILL.md+2−2skills/hydrogen-container/SKILL.md+4−4skills/hydrogen-notifications-windows/SKILL.md+1−1skills/hydrogen-notifications/SKILL.md+4−4skills/hydrogen-open-url/SKILL.md+5−5skills/hydrogen-ports/SKILL.md+1−1skills/hydrogen-recording/SKILL.md+6−6skills/hydrogen-screen-lock/SKILL.md+2−2install.shpackage.json+3−3@@ -4,7 +4,7 @@ "type": "bootstrap", "title": "Adom Hydrogen (Windows / WSL2)", "brief": "The Windows (WSL2) platform layer for Hydrogen.",- "version": "0.3.30",+ "version": "0.3.31", "description": "The Windows platform layer for Hydrogen, where the workspace runs in a WSL2 Ubuntu distro. Depends on adom/hydrogen-bootstrap (the platform-generic layer, which bundles the generic hydrogen-* skills) and adds everything specific to the WSL2 runtime: the WSL2/networking/lifecycle hydrogen-* skills (BUNDLED here by design, John+Kyle 2026-07-16) and the WSL2 code-server workbench seed. Sibling adom/hydrogen-mac-bootstrap carries the parallel mac skills. This is the package the golden WSL2 image installs.", "org": "adom", "tags": [@@ -19,7 +19,7 @@ }, "dependencies": { "adom/hydrogen-bootstrap": "^0.5.0",- "adom/adom-shotlog": "^0.28.0",+ "adom/adom-shotlog": "^0.29.0", "adom/adom-bridge": "^2.0.0" }, "files": [@@ -31,5 +31,5 @@ "hero": { "path": "docs/hero.png" },- "changelog": "0.3.30: skill cleanup: shorter valid descriptions, retired names (hd-*, HD, adom-desktop) replaced, dead skill links fixed, hydrogen-topology true for both local and cloud agents, hydrogen-skill-catalog removed (use hydrogen-overview; install.sh prunes it), maintainer skills hidden from the model."+ "changelog": "0.3.31: Pup verbs renamed browser_* -> pup_* (the puppeteer bridge 2.0.733 exposes only pup_*), and the adom/adom-shotlog range widened to ^0.29.0 so updates stop skipping it. 0.3.30: skill cleanup: shorter valid descriptions, retired names replaced, dead skill links fixed, hydrogen-skill-catalog removed, maintainer skills hidden." }
page.json+4−4@@ -4,7 +4,7 @@ "slug": "hydrogen-windows-bootstrap", "title": "Adom Hydrogen (Windows / WSL2)", "brief": "The Windows (WSL2) platform layer for Hydrogen.",- "version": "0.3.30",+ "version": "0.3.31", "author": { "name": "John Lauer", "email": "[email protected]"@@ -28,7 +28,7 @@ }, "dependencies": { "adom/hydrogen-bootstrap": "^0.5.0",- "adom/adom-shotlog": "^0.28.0",+ "adom/adom-shotlog": "^0.29.0", "adom/adom-bridge": "^2.0.0" }, "files": [@@ -37,5 +37,5 @@ "README.md", "skills/**" ],- "changelog": "0.3.30: skill cleanup: shorter valid descriptions, retired names (hd-*, HD, adom-desktop) replaced, dead skill links fixed, hydrogen-topology true for both local and cloud agents, hydrogen-skill-catalog removed (use hydrogen-overview; install.sh prunes it), maintainer skills hidden from the model."-}+ "changelog": "0.3.31: Pup verbs renamed browser_* -> pup_* (the puppeteer bridge 2.0.733 exposes only pup_*), and the adom/adom-shotlog range widened to ^0.29.0 so updates stop skipping it. 0.3.30: skill cleanup: shorter valid descriptions, retired names replaced, dead skill links fixed, hydrogen-skill-catalog removed, maintainer skills hidden."+}
skills/hydrogen-bridges/SKILL.md+10−10@@ -189,23 +189,23 @@ Port: default **8851** (adom-bridge registers the live port; see `adom-bridge st ```bash # Open browser window-adom-bridge browser_open_window '{"url": "https://example.com"}'+adom-bridge pup_open_window '{"url": "https://example.com"}' # Screenshot current tab-adom-bridge browser_screenshot '{"sessionId": "default"}'+adom-bridge pup_screenshot '{"sessionId": "default"}' # Evaluate JavaScript-adom-bridge browser_eval '{"js": "document.title", "sessionId": "default"}'+adom-bridge pup_eval '{"js": "document.title", "sessionId": "default"}' # Navigate-adom-bridge browser_navigate '{"url": "https://...", "sessionId": "default"}'+adom-bridge pup_navigate '{"url": "https://...", "sessionId": "default"}' # List open windows/tabs-adom-bridge browser_list_windows+adom-bridge pup_list_windows # Record tab (CDP screencast, zero dialogs)-adom-bridge browser_record_start '{"sessionId": "default"}'-adom-bridge browser_record_stop '{"sessionId": "default"}'+adom-bridge pup_record_start '{"sessionId": "default"}'+adom-bridge pup_record_stop '{"sessionId": "default"}' ``` ---@@ -332,7 +332,7 @@ adom-bridge shell_execute '{"command": "<host shell command>"}' > **Tab-vs-desktop footgun.** `desktop_record_start` records the **whole screen** > and requires an explicit `confirmDesktopNotTabRecording:true` guard so you don't > accidentally capture the entire desktop when you meant one tab. To record a-> single Chrome tab, use `browser_record_start` instead (CDP screencast, served by+> single Chrome tab, use `pup_record_start` instead (CDP screencast, served by > the Puppeteer bridge, no whole-screen capture). ```bash@@ -341,8 +341,8 @@ adom-bridge desktop_record_start '{"reason": "Demo recording", "confirmDesktopNo adom-bridge desktop_record_stop # Record a single browser tab (CDP screencast, zero dialogs) — prefer this for one tab-adom-bridge browser_record_start '{"sessionId": "default"}'-adom-bridge browser_record_stop '{"sessionId": "default"}'+adom-bridge pup_record_start '{"sessionId": "default"}'+adom-bridge pup_record_stop '{"sessionId": "default"}' ``` ---
skills/hydrogen-browser-picker/SKILL.md+2−2@@ -444,8 +444,8 @@ Tauri compiles capabilities INTO the binary at build time. Capability changes re adom-bridge shell_execute '{"command":"CTRL=\"$(cat ~/.adom/hydrogen-control-url)\"; curl -s -X POST -d {\"url\":\"https://example.com\"} \"$CTRL/open-url\""}' # 3. Within 5s, picker auto-routes to Pup (or saved pref)-# 4. Drive Pup with adom-bridge browser_* verbs-adom-bridge browser_eval '{"sessionId":"default","js":"document.title"}'+# 4. Drive Pup with adom-bridge pup_* verbs+adom-bridge pup_eval '{"sessionId":"default","js":"document.title"}' # Force a picker dialog (no auto-timer) adom-bridge shell_execute '{"command":"CTRL=\"$(cat ~/.adom/hydrogen-control-url)\"; curl -s -X POST -d {\"url\":\"https://example.com\",\"force\":true} \"$CTRL/open-url\""}'
skills/hydrogen-container/SKILL.md+4−4@@ -75,10 +75,10 @@ Default to `maxWidth: 1500, format: "png"` for UI screenshots. Use `"jpeg"` for ### Browser automation (Puppeteer) ```bash-adom-bridge browser_open_window '{"url": "https://..."}'-adom-bridge browser_screenshot '{"sessionId": "default"}'-adom-bridge browser_eval '{"js": "document.title"}'-adom-bridge browser_navigate '{"url": "..."}'+adom-bridge pup_open_window '{"url": "https://..."}'+adom-bridge pup_screenshot '{"sessionId": "default"}'+adom-bridge pup_eval '{"js": "document.title"}'+adom-bridge pup_navigate '{"url": "..."}' ``` ### KiCad bridge
skills/hydrogen-notifications-windows/SKILL.md+1−1@@ -10,7 +10,7 @@ description: >- Windows-specific companion to **`hydrogen-notifications`**. The generic skill covers the cross-platform `notify_user` API, the `/ui/toast` in-app toast, and Pup's-`browser_alert_window`. This page covers how the native OS toast is delivered on Windows.+`pup_alert_window`. This page covers how the native OS toast is delivered on Windows. > **Windows-only.** On macOS Hydrogen uses a more limited `osascript`-style notification; Linux > has no native toast path. See `hydrogen-notifications` for the platform-neutral story.
skills/hydrogen-notifications/SKILL.md+4−4@@ -94,17 +94,17 @@ when the user may be **away from / not looking at** Hydrogen; use `/ui/toast` fo 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 attention nudge (`browser_alert_window`)+## Pup's attention nudge (`pup_alert_window`) For AI-driven browser work, Pup has its own attention nudge: ```bash-adom-bridge browser_alert_window '{"sessionId":"default"}'+adom-bridge pup_alert_window '{"sessionId":"default"}' ``` It **triggers the OS attention nudge** for that browser window (and brings the page to front within Chrome) **without stealing foreground focus** — a gentle "look here." (Use-`browser_focus_window` if you actually want to raise the window.)+`pup_focus_window` if you actually want to raise the window.) ## When you (the AI) should notify proactively @@ -120,5 +120,5 @@ Don't spam: one notification per meaningful event. Verify the bridge first ## Related skills - [hydrogen-adom-bridge](../hydrogen-adom-bridge/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-bridges](../hydrogen-bridges/SKILL.md) — the full ab capability list (`notify`, …) and Pup's `pup_alert_window` - [[hydrogen-notifications-windows]] / [[hydrogen-notifications-mac]] — the per-platform toast backends and attention mechanics
skills/hydrogen-open-url/SKILL.md+5−5@@ -102,12 +102,12 @@ 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 `hydrogen-browser-picker`. -**3. Pup** — open and then drive it with `adom-bridge browser_*` verbs-(`browser_open_window`, `browser_navigate`, `browser_screenshot`, `browser_eval`,-`browser_reload`, …). Either open the URL directly via Pup, or let the picker+**3. Pup** — open and then drive it with `adom-bridge pup_*` verbs+(`pup_open_window`, `pup_navigate`, `pup_screenshot`, `pup_eval`,+`pup_reload`, …). Either open the URL directly via Pup, or let the picker route to Pup. See the `hydrogen-pup` skill for the full verb set. ```bash-adom-bridge browser_eval '{"sessionId":"default","js":"document.title"}'+adom-bridge pup_eval '{"sessionId":"default","js":"document.title"}' ``` **6. Headless content** — if you only need to *read* the page, skip the browser@@ -130,7 +130,7 @@ picker; Pup and webview-tab are direct calls. Reserve the picker only as below.) | Use case | Open it in | How (bypass the picker) | |---|---|---| | **Login-likely site** — vendor/account/portal/cart: TI, Mouser, DigiKey, any "my…"/sign-in | the user's **native browser + WORK profile** (their saved login/cookies live there) | `GET /browser-profiles` → find the work profile (non-gmail) → `POST /open-in-profile {url, browser, profileDir, fresh:true}` |-| **Building/testing their own app**, or you need to drive/screenshot/scrape the page | **Pup** (AI-drivable) | open via Pup (`browser_*`) / route `/open-url {url, direct:true}` to Pup |+| **Building/testing their own app**, or you need to drive/screenshot/scrape the page | **Pup** (AI-drivable) | open via Pup (`pup_*`) / route `/open-url {url, direct:true}` to Pup | | **Glance at content alongside their work** | **Hydrogen webview tab** | `adom-workspace-control` add web-view tab | | **Genuinely ambiguous, OR an OAuth/sign-in the user must complete themselves** | let them choose | `POST /open-url {url, force:true}` — the one time the picker is right |
skills/hydrogen-ports/SKILL.md+1−1@@ -255,7 +255,7 @@ Or use the bridge directly via adom-bridge CLI — you don't need the port at al ```bash adom-bridge kicad_open_board '{"path":"..."}' # adom-bridge routes to the right port-adom-bridge browser_eval '{"js":"..."}'+adom-bridge pup_eval '{"js":"..."}' ``` This means **old code or skill examples that hardcoded fixed bridge ports
skills/hydrogen-recording/SKILL.md+6−6@@ -50,7 +50,7 @@ do.** Default to Hydrogen-native. says "prefer Hydrogen's `recording start --share screen`" — this is for the parallel-with-an-Hydrogen-capture case, not the default. 4. **A single Chrome tab** (AI-driven Pup browser — a clean per-tab clip): `adom-bridge- browser_record_start {sessionId}` / `browser_record_stop`. CDP screencast, ~50fps, no HUD,+ pup_record_start {sessionId}` / `pup_record_stop`. CDP screencast, ~50fps, no HUD, no wake-lock, coexists with everything. 5. **Just audio — a voice / narration track, no video** ("record a narration", "record my voice"): **`adom-cli hydrogen audio start/stop`** → `~/project/audio/<name>.webm` (Opus).@@ -64,7 +64,7 @@ Unlike screenshots — where ab grabs a window *or* the screen — **recording i | `adom-cli hydrogen recording` (ah) | — (use control API) | ✅ `--share screen` | ✅ `--share tab` | native WGC/DXGI | **NO** | mp4 → `~/project/recordings/` | | Hydrogen native control API | ✅ `source:"window:X"` | ✅ `source:"screen"` | — | native WGC/DXGI | **NO** | mp4 → `~/project/recordings/` | | ab `desktop_record_start` | ❌ **none** | ✅ whole desktop | ❌ | Chrome `getDisplayMedia` | **YES** | `.webm` → ab cache |-| pup `browser_record_start` | — | ❌ | ✅ one tab | CDP screencast | **NO** | tab clip |+| pup `pup_record_start` | — | ❌ | ✅ one tab | CDP screencast | **NO** | tab clip | So: **per-window recording = Hydrogen-native only; whole-desktop = Hydrogen-native (no wake-lock) preferred over ab (wake-lock); single tab = pup.** When someone says "record a window," that's #2 (Hydrogen@@ -235,7 +235,7 @@ method coexists with a live recording — only the `adom-cli` SSE screenshot pat - ✅ **Coexist with a recording** (use these while recording): CDP `POST /screenshot` (Hydrogen-native, the default), `adom-bridge desktop_screenshot_window` (ab per-window),- `adom-bridge desktop_screenshot_screen` (ab host GDI), pup `browser_screenshot`.+ `adom-bridge desktop_screenshot_screen` (ab host GDI), pup `pup_screenshot`. - ⚠️ **The ONE exception** — `adom-cli hydrogen screenshot panel|workspace|screen` (the SSE path, `PATCH /current/screenshot`). The moment a native recording is active this returns **`{ok:false, error:"capture_busy", retry_after_ms, alternatives:[...], _hint}`** instead of@@ -363,7 +363,7 @@ adom-bridge status # → .capabilities must include "record" ``` If `record` isn't listed, the host/runtime doesn't support it — fall back to the-in-app recorder (for the workspace) or `browser_record_start` (for a tab).+in-app recorder (for the workspace) or `pup_record_start` (for a tab). --- @@ -374,7 +374,7 @@ in-app recorder (for the workspace) or `browser_record_start` (for a tab). | **Record whole screen (ah)** | `adom-cli hydrogen recording start --share screen …` or `POST /recording/native/start {source:"screen"}` | **h264 mp4** → `~/project/recordings/` | | **Record a window (ah), e.g. "record kicad"** | `POST /recording/native/start {source:"window:KiCad"}` | **h264 mp4** → `~/project/recordings/` | | **Smaller archival recording (ah)** | `POST /recording/native/start {source:…, codec:"h265"}` | **h265 mp4** (not web-playable) |-| Record one AI browser tab | `adom-bridge browser_record_start` (pup) | tab screencast |+| Record one AI browser tab | `adom-bridge pup_record_start` (pup) | tab screencast | | Record host desktop via ab (Hydrogen busy) | `adom-bridge desktop_record_start '{"confirmDesktopNotTabRecording":true}'` | host recording | | Record the workspace (web-Hydrogen) | In-app Recording dropdown (or `promptRecording()`) | `.webm` → container `recordings/` | @@ -382,5 +382,5 @@ in-app recorder (for the workspace) or `browser_record_start` (for a tab). - [hydrogen-screen-lock](../hydrogen-screen-lock/SKILL.md) — native capture holds NO display wake-lock; the max-duration cap + "● Recording" indicator - [hydrogen-self-screenshot](../hydrogen-self-screenshot/SKILL.md) — native CDP screenshots (the 90% "ralph test the webview" case); the capture-contention matrix — which screenshot methods coexist with a recording and which (`adom-cli` SSE) return `capture_busy` - [hydrogen-capture-share](../hydrogen-capture-share/SKILL.md) — the (web-Hydrogen) screen-share + AI-consent flow incl. the cancelable CountdownToast-- [hydrogen-bridges](../hydrogen-bridges/SKILL.md) — `browser_record_start` (Pup tab recording) and the ab capability list (`record`, `screenshot`, …)+- [hydrogen-bridges](../hydrogen-bridges/SKILL.md) — `pup_record_start` (Pup tab recording) and the ab capability list (`record`, `screenshot`, …) - `pup` — driving the Pup browser windows you'd record per-tab
skills/hydrogen-screen-lock/SKILL.md+2−2@@ -56,7 +56,7 @@ Hydrogen guards with the rules below. 1. `powercfg /requests` (elevated) — read the `DISPLAY:` section for the holder. 2. If it's a **browser** (`msedge.exe`/`chrome.exe — screen capture`), that's a `getDisplayMedia` leak from web Hydrogen or a pup tab capture — stop that capture- (close the tab / `browser_record_stop`), not a Hydrogen problem.+ (close the tab / `pup_record_stop`), not a Hydrogen problem. 3. If it's **Hydrogen**, that's unexpected (native capture holds no lock) — capture the `powercfg` output and treat it as a bug to file against the recorder. @@ -68,7 +68,7 @@ source" is the fix. Hydrogen's native capture is release-by-construction. Distinct from the wake-lock: when one AI thread is recording, another thread's **screenshot** must not silently fail. Hydrogen handles this without holding any lock — CDP `POST /screenshot`, ab `desktop_screenshot_window`/`_screen`, and pup-`browser_screenshot` all **coexist** with a live recording; only the `adom-cli` SSE+`pup_screenshot` all **coexist** with a live recording; only the `adom-cli` SSE screenshot path returns **`capture_busy`** (with `alternatives`) so the caller switches methods instead of getting an empty frame. Pre-flight with `GET /capture/availability`. This is a *contention* guard, not a power-state one — full detail in