bootstrap
Adom Hydrogen (platform base)
Public Made by Adomby adom
Layer Hydrogen's workspace onto a standard Adom workstation.
← Commit history
package.json+1−1@@ -4,7 +4,7 @@ "type": "bootstrap", "title": "Hydrogen Desktop Bootstrap (apps + skills)", "brief": "Layer Hydrogen Desktop's workspace onto a standard Adom workstation.",- "version": "0.2.14",+ "version": "0.2.15", "description": "Hydrogen Desktop'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 Desktop on ANY platform: the platform-generic hd-* skills (BUNDLED in this package by design; wsl2 skills ride adom/hd-windows-bootstrap, mac skills ride adom/hd-mac-bootstrap) and the generic HD editor configuration (Claude Code CLI + extension, VS Code settings, trusted domains). Platform-specific layers depend on THIS: adom/hd-windows-bootstrap, adom/hd-mac-bootstrap.", "org": "adom", "tags": [
page.json+1−1@@ -4,7 +4,7 @@ "type": "bootstrap", "title": "Hydrogen Desktop Bootstrap (apps + skills)", "brief": "Layer Hydrogen Desktop's workspace onto a standard Adom workstation.",- "version": "0.2.14",+ "version": "0.2.15", "description": "Hydrogen Desktop'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 Desktop on ANY platform: the platform-generic hd-* skills (BUNDLED in this package by design; wsl2 skills ride adom/hd-windows-bootstrap, mac skills ride adom/hd-mac-bootstrap) and the generic HD editor configuration (Claude Code CLI + extension, VS Code settings, trusted domains). Platform-specific layers depend on THIS: adom/hd-windows-bootstrap, adom/hd-mac-bootstrap.", "org": "adom", "tags": [
skills/hd-api/SKILL.md+61−5@@ -5,9 +5,11 @@ description: > API runs on a dynamic port (find it in the HD log or via port discovery). Use these endpoints to drive HD programmatically: manage the workspace runtime (WSL2 distro or legacy Docker container), 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).+ virgin reset, and more. ~200 endpoints. The COMPLETE, always-current catalog is+ GET /_manifest (every route with a category + description; curated entries are+ richer). The API Explorer window (Adom menu > API Explorer, or POST /api-explorer/open)+ renders it with a runnable Try per endpoint. GET /test/help lists the gated /test/*+ diagnostics. NEVER blind-call destructive endpoints (see the Safety section). Trigger words: HD API, control API, HD endpoint, container exec, claude api, iframe eval, workspace tabs, setup run-all, docker status, reload vscode, browser profiles, open url, virgin reset api, reboot api, diagnostics,@@ -22,8 +24,45 @@ sources of truth you should hit first: | Source | What it gives you | Where | |---|---|---|-| `GET /_manifest` | Curated, grouped, machine-readable list of the highest-value endpoints (path, method, args, description, `visibility`). `hd_api` forwards anything not listed. | `hd-control/src/lib.rs:11744` |-| `GET /test/help` | Lists the `/test/*` diagnostics (window enumeration, UIA click, dialog classification, cascade reset). Gated behind `HD_TEST_API_ENABLED=1`. | `hd-control/src/lib.rs:12423` |+| `GET /_manifest` | **THE complete catalog** — every registered route (`path`, `method`, `args`, `category`, `description`, `visibility`). Curated entries carry richer descriptions; the rest are auto-generated from the router (`scripts/gen-manifest.py`), so it never drifts. **Discover here first — don't guess paths.** | `hd-control/src/lib.rs` `/_manifest` arm |+| **API Explorer window** | The human face of `/_manifest`: every endpoint grouped by category tab, with a runnable **Try** + Copy URL. Open from the Adom menu, or `POST /api-explorer/open`. | Adom menu ▸ API Explorer |+| `GET /test/help` | The `/test/*` diagnostics (window enumeration, UIA click, dialog classification, cascade reset). **Gated behind `HD_TEST_API_ENABLED=1`** — 404 by default (expected, not a bug). | `hd-control/src/lib.rs` `/test/help` arm |++## ⛔ Safety — the API enforces this, and tells you in-band++The API itself now labels, warns about, and gates dangerous endpoints (single source of+truth: `safety.rs` in hd-control). Three tiers:++- **`catastrophic`** — irreversibly destroys real user state: `/setup/virgin-reset`,+ `/setup/panel/(run-virgin-reset|wipe-keep-auth)`, `/wsl/unregister` (deletes the whole+ workspace distro), `/docker/(uninstall|clean-reinstall)`, `/system/reboot` (reboots the+ user's COMPUTER), `/config-reset`, `/claude/wipe-creds`, `*-delete`.+ **Headless calls (no browser Origin header — i.e. YOU) get HTTP 409 `confirmation_required`+ and NOTHING happens** until you re-call with `?confirm=1`. Only add `?confirm=1` when the+ user explicitly asked for exactly that action — never to make an error go away.+- **`destructive`** — kills/restarts/re-runs real state (recoverable but real):+ `/app/(restart|relaunch-frontend)`, `/reload-vscode`, `/docker/(stop|restart)`,+ `/container(-stop|-restart)`, `/workspace/apply-updates`, `/setup/(run-all|run-step|state|+ force-close|trigger|countdown)`, `/claude/tabs/close-all`, `/updater/install`.+ Never call these speculatively or in a sweep.+- **`disruptive`** — the user SEES it (window opens, focus moves, typing lands in their+ real chat, screen recording starts): `/hdbw/open`, `/api-explorer/open`, `/open-url`,+ `/open-in-profile`, `/window/foreground`, `/ai-cursor/*`, `/recording/native/start`,+ `/ui/toast`, `/claude/(trigger-auth|authorize-in-browser|open-with-message|inject*|send|+ submit|uia-*|new-chat-and-send|type-and-submit)` (the send/submit ones SPEND a real user+ turn). Run only when the user actually wants that action, and clean up after yourself.+ (Calling `/claude/authorize-in-browser` blindly is how you spray OAuth windows into Edge.)++How the API tells you:+- **Before calling:** every `GET /_manifest` entry carries `safety` + `safety_note`. Check+ them before you POST anything unfamiliar. Unlabeled = safe.+- **When you call:** responses from these endpoints include a `_safety` block. READ IT —+ it says exactly what you just did to the user's machine.+- **The 409 gate** is your last chance to stop; it is not an error to route around.++A safe GET/POST returns within a couple seconds with a 2xx or a clean 4xx `{ok:false,...}`.+If you must probe an endpoint you're unsure about, POST an empty `{}` body and treat a+graceful validation error as "it works" — a 500 or a hang is the bug. **Base URL:** `http://127.0.0.1:<dynamic>` — the same loopback address from inside the workspace (WSL2 mirrored networking shares loopback with the Windows host) and on the@@ -52,6 +91,23 @@ rewrites it with the live dynamic port every launch. This is the channel for the the live ports map, Claude control, etc. — distinct from `adom-cli` (`ADOM_HYDROGEN_URL` → SSE), which is unchanged for web-hydrogen parity. +## Calling gotchas (learned the hard way)++- **Never hardcode the port.** It's dynamic (47084 is only the default and it auto-resolves+ conflicts). Read `~/.adom/hd-control-url` from the workspace, or `GET /ports`. Hardcoding+ 47084 is what makes tools show HD as "down" when it's actually up on another port.+- **Confirm it's really the control API, not the SPA.** In dev, the frontend file server+ answers 200 with HTML for *any* path — so a bare 200 doesn't prove you hit HD's API. Check+ `GET /health` returns JSON with `service:"hydrogen-desktop-control"`.+- **Driving HD from a page HD serves? Use relative fetches, not Tauri IPC.** Tauri `invoke`+ is unavailable on remote http origins; a same-origin `fetch('/ports')` / `fetch('/_manifest')`+ works and sidesteps port discovery entirely.+- **Driving from the CLOUD over the relay:** if two Adom Desktops are connected (laptop ++ a VM), `desktop_*` verbs need `--target <name>` (e.g. `AdomLapper`) or they no-route and+ look empty; `nbrowser_*`/`hd_*` auto-route. PowerShell emits **CRLF** — strip `\r` before+ string-comparing its output. Long calls can exceed the relay's per-call timeout — run+ detached + poll a marker (see `hd-cloud-relay-patterns`).+ ## Health & Status | Method | Path | Description |