← Commit history

hygiene: scripts.install lifecycle (current logic; stale install.sh replaced), hero to screenshots/ (out of the install tarball), discovery_triggers, page.json unpinned to 0.3.21

John Lauer ·56a1e0cf7f ·2mo ago ·parent fb2d283
7 files changed +195−94
install.sh+69−37
@@ -1,55 +1,85 @@ #!/usr/bin/env bash-# postinstall.sh — adom/hd-bootstrap+# install.sh — adom/hydrogen-bootstrap (the scripts.install lifecycle hook; was postinstall.sh) # # Runs (as the workspace user) after every dependency is installed —-# apps/skills install first, bootstraps (and their postinstall) last. This hook applies the HD *environment configuration* that isn't a+# adompkg installs apps/skills first, bootstraps (and their postinstall)+# last. This hook applies the HD *environment configuration* that isn't a # package: the Claude Code + adom-vscode extensions, and the VS Code / code-server-# settings that make the editor behave like Hydrogen Desktop.+# settings that make the editor behave like Hydrogen. # # What is NOT here, by design: #   - the Adom ecosystem (skills hub, distributor search, KiCad/Fusion, pup, #     adom-cli, adom-vscode binary, ...) — comes from the adom/core dependency-#   - the hd-* runtime skills — BUNDLED in this package (skills/ dir)-#   - the CLIs (adom-cli, adom-desktop) — their own dependencies+#   - the hd-* runtime skills — the adom/hd-skills dependency+#   - the workspace-updater daemon + the CLIs — their own dependencies #   - the OS baseline (apt, code-server, systemd, user/linger/pam) — that's #     the golden image's Dockerfile ("hardware"); a live install assumes a #     workspace that already has it. # # Idempotent + LIVE-INSTALLABLE: this must converge correctly from a cold-# `adom-wiki pkg install adom/hd-bootstrap` on an already-running workspace (the+# `adompkg install adom/hydrogen-bootstrap` on an already-running workspace (the # vendor "am I set up?" path), not only inside the golden-image bake. Re-runs # are safe. The bake runs the exact same command, just earlier. #-# Mirrors the config sections of hd-wsl2-image/image/bake-hd-setup.sh — keep-# the two in lockstep until the bake is rewritten to just install this.+# Mirrors the config sections of the golden-image bake script+# (bake-hydrogen-setup.sh in the image repo) — keep the two in lockstep until+# the bake is rewritten to just install this. set -euo pipefail log() { echo "[hd-bootstrap] $*"; }  CS="$(command -v code-server 2>/dev/null || echo /usr/lib/code-server/bin/code-server)" HERE="$(cd "$(dirname "$0")" && pwd)" -# 0. Deploy the bundled hd-* runtime skills into ~/.claude/skills/. These ship-#    INSIDE this package (HD-specific); the package's skills/ dir is the source of truth.+# 0. Deploy the bundled hydrogen-* runtime skills into ~/.claude/skills/. These+#    ship INSIDE this package (Hydrogen-specific — there is no separate skills+#    package); the package's skills/ dir is the source of truth.+#    NAMING CUTOVER (2026-08): skills renamed hd-* -> hydrogen-*. Deploy EVERY+#    bundled skill dir (no name-prefix glob to go stale again), and purge the+#    old hd-* copies a previous version deployed so the two generations never+#    sit side by side (the ab 2.0.17 lesson, issue #584 sidebar). if [ -d "$HERE/skills" ]; then-  log "deploying bundled hd-* skills"+  log "deploying bundled hydrogen skills"   install -d -m 0755 "$HOME/.claude/skills"   count=0-  for d in "$HERE"/skills/hd-*/; do+  for d in "$HERE"/skills/*/; do     [ -f "${d}SKILL.md" ] || continue     name="$(basename "$d")"     install -d -m 0755 "$HOME/.claude/skills/${name}"     install -m 0644 "${d}SKILL.md" "$HOME/.claude/skills/${name}/SKILL.md"     count=$((count + 1))   done-  log "  deployed ${count} hd-* skills"+  log "  deployed ${count} bundled skills"+  purged=0+  for d in "$HOME"/.claude/skills/hd-*/; do+    [ -d "$d" ] || continue+    rm -rf "$d"+    purged=$((purged + 1))+  done+  [ "$purged" -gt 0 ] && log "  purged ${purged} stale hd-* skill dirs (renamed to hydrogen-*)" fi +# 0b. Purge KNOWN-DEAD sibling module dirs. These are baked v22 leftovers whose+#     packages were renamed in the registry (June slug consolidation + the+#     adom-desktop -> adom-bridge rename): `pkg update` skips them forever with a+#     STALE_INSTALL warning and never deletes the folders, so every fresh install+#     carries dead names in adom_modules (John, 2026-08-09). Fixed allowlist on+#     purpose - a hook must never guess at deleting things the registry merely+#     failed to resolve transiently. Successors all install via the dependency+#     tree, so removing the corpse loses nothing.+MODULES_ADOM="$(cd "$HERE/.." && pwd)"+for dead in adom-desktop step2glb adom-theme-system adom-workspace-control; do+  if [ -d "${MODULES_ADOM}/${dead}" ]; then+    rm -rf "${MODULES_ADOM}/${dead}"+    log "purged dead module dir: adom/${dead} (renamed in the registry; successor installs via the tree)"+  fi+done+ # 1. Claude Code CLI — NOT installed here, on purpose. It's not an adompkg/wiki #    package (it's Anthropic's, from claude.ai), and its installer needs a working #    systemd user session, which is unreliable in the bake env. HD installs + auths #    it at runtime via its setup cascade (install-claude-cli + claude-auth), in the #    real workspace where the user session works. So the bootstrap leaves Claude to-#    HD. Just ensure ~/.local/bin is on PATH (for adompkg + adom-desktop).+#    HD. Just ensure ~/.local/bin is on PATH (for adompkg + the Adom CLIs). grep -q '/.local/bin' "$HOME/.bashrc" 2>/dev/null \   || printf 'export PATH="$HOME/.local/bin:$PATH"\n' >> "$HOME/.bashrc" @@ -80,13 +110,14 @@ cat > "$HOME/.local/share/code-server/User/settings.json" <<'SETTINGS'   "workbench.startupEditor": "none",   "workbench.activityBar.location": "default",   "workbench.activityBar.iconClickBehavior": "toggle",-  "workbench.colorTheme": "Default Dark Modern",+  "workbench.colorTheme": "Adom Studio Dark (Brighter Text)",+  "editor.fontSize": 15,   "workbench.statusBar.visible": false,   "workbench.navigationControl.enabled": false,   "workbench.secondarySideBar.visible": false,   "workbench.secondarySideBar.defaultVisibility": "hidden",-  "claudeCode.allowDangerouslySkipPermissions": true,-  "claudeCode.initialPermissionMode": "bypassPermissions",+  "claudeCode.allowDangerouslySkipPermissions": false,+  "claudeCode.initialPermissionMode": "auto",   "claudeCode.preferredLocation": "panel",   "chat.agent.enabled": false,   "chat.commandCenter.enabled": false,@@ -117,34 +148,35 @@ disable-update-check: true CSCONF  # NOTE: the workbench.html IndexedDB seed (trusted domains + activity-bar unpin)-# patches the WSL2 code-server install path and is therefore PLATFORM-SPECIFIC —-# it lives in adom/hd-windows-bootstrap, not here. Mac/Ubuntu layers add their own.+# patches a code-server install path that differs per host and is therefore+# PLATFORM-SPECIFIC — it lives in the platform bootstraps+# (adom/hydrogen-windows-bootstrap etc.), not here. -# 6. API-KEY PERSISTENCE (2026-08-04). /var/run is tmpfs — wiped on EVERY distro-#    boot — and HD's launch-time re-injection missed every other boot path-#    (workspace stop/start under a running HD, relay-exec auto-start, manual-#    wsl --terminate), so /var/run/adom/api-key vanished and every in-workspace-#    tool 401'd against carbon/wiki until the next HD relaunch. Fix is-#    DAEMONLESS: a systemd-tmpfiles rule (declarative, runs during sysinit,-#    before code-server) re-materializes the tmpfs key from a persistent copy-#    at ~/.adom/api-key on every boot. HD writes both copies whenever it holds-#    the session token (write-through, HD >= build a1e3b20); this section-#    installs the machinery and migrates a live key into the persistent copy,-#    so a plain `adom-wiki pkg update` retrofits already-running workspaces.-#    NO key material ships in this package — plumbing only.+# 6. API-KEY PERSISTENCE (2026-08-04). /var/run is tmpfs — wiped on EVERY workspace+#    boot — and HD's launch-time re-injection missed every other boot path, so+#    /var/run/adom/api-key vanished and all in-workspace tools 401'd against+#    carbon/wiki. Fix is DAEMONLESS: systemd-tmpfiles (declarative, runs during+#    sysinit, before code-server) re-materializes the tmpfs key from a persistent+#    copy at /home/adom/.adom/api-key on every boot. HD writes both copies when+#    it has the token (write-through); this section installs the machinery and,+#    if a live key exists but no persistent copy yet, migrates it — so a plain+#    `adom-wiki pkg update` retrofits running workspaces. No key material ships+#    in this package; only the plumbing. log "api-key persistence: tmpfiles machinery + persistent-copy migration" install -d -m 0700 "$HOME/.adom" if [ -s /var/run/adom/api-key ] && [ ! -s "$HOME/.adom/api-key" ]; then   cp /var/run/adom/api-key "$HOME/.adom/api-key" && chmod 600 "$HOME/.adom/api-key"   log "  migrated live key to persistent copy" fi-if printf 'd /run/adom 0755 root root -\nC /run/adom/api-key 0644 root root - %s/.adom/api-key\n' "$HOME" \-  | sudo tee /etc/tmpfiles.d/adom-api-key.conf >/dev/null 2>&1; then-  log "  tmpfiles.d/adom-api-key.conf installed (boot-time re-materialization)"-else-  log "  WARN: could not install tmpfiles snippet (no sudo?) — HD self-heal installs it on next start"-fi+printf 'd /run/adom 0755 root root -+C /run/adom/api-key 0644 root root - /home/adom/.adom/api-key+'   | sudo tee /etc/tmpfiles.d/adom-api-key.conf >/dev/null   && log "  tmpfiles.d/adom-api-key.conf installed (boot-time re-materialization)"   || log "  WARN: could not install tmpfiles snippet (no sudo?) — HD self-heal will retry"  # 7. tidy — install.mjs / tooling leave an empty ~/project/.mcp.json; remove it. rm -f "$HOME/project/.mcp.json" 2>/dev/null || true log "done"++# ── Retired-slug migration (John 2026-08-13) ─────────────────────────────────+# Heals pre-rename lockfile roots (hd-bootstrap, adom-desktop, ...) so the old+# wiki pages/redirects can be deleted. Idempotent, best-effort, never fatal.+bash "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/migrate-retired-slugs.sh" || true
package.json+14−4
@@ -4,10 +4,9 @@   "type": "bootstrap",   "title": "Adom Hydrogen (platform base)",   "brief": "Layer Hydrogen's workspace onto a standard Adom workstation.",-  "version": "0.3.20",+  "version": "0.3.21",   "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",@@ -15,9 +14,20 @@   ],   "needs_sudo": false,   "scripts": {-    "postinstall": "./postinstall.sh"+    "install": "./install.sh"   },   "dependencies": {     "adom/core": "^4.9.0"-  }+  },+  "discovery_triggers": [+    "hydrogen bootstrap",+    "hydrogen platform base",+    "install hydrogen workspace",+    "what installed my hydrogen skills",+    "hydrogen skillpack",+    "hydrogen-* skills",+    "build a bootstrap on adom core",+    "hydrogen editor configuration",+    "where do hydrogen skills come from"+  ] }\ No newline at end of file
page.json+3−3
@@ -4,7 +4,7 @@   "type": "bootstrap",   "title": "Adom Hydrogen (platform base)",   "brief": "Layer Hydrogen's workspace onto a standard Adom workstation.",-  "version": "0.3.20",+  "version": "0.3.21",   "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": [@@ -25,7 +25,7 @@   },   "hero": {     "type": "image",-    "path": "docs/hero.png"+    "path": "screenshots/hero.png"   },   "files": [     "package.json",@@ -35,4 +35,4 @@     "dock/**"   ],   "visibility": "public"-}\ No newline at end of file+}
screenshots/hero.htmladded+34
@@ -0,0 +1,34 @@+<!doctype html><html><head><meta charset="utf-8"><style>+  *{margin:0;box-sizing:border-box}+  html,body{width:1520px;height:950px;background:#0b0f14;font-family:ui-sans-serif,system-ui,Segoe UI,Roboto,sans-serif}+  .wrap{padding:46px 54px;height:100%;display:flex;flex-direction:column;gap:26px}+  .top{display:flex;align-items:baseline;gap:18px}+  .slug{font-family:ui-monospace,Menlo,monospace;font-size:40px;font-weight:700;color:#2dd4bf;letter-spacing:-.5px}+  .badge{font-size:18px;color:#0b0f14;background:#2dd4bf;border-radius:30px;padding:4px 16px;font-weight:700}+  .vp{font-size:25px;line-height:1.45;color:#e6edf3;max-width:1360px}+  .vp b{color:#7fe9dd}+  .term{flex:1;background:#0e141c;border:1px solid #1f2b38;border-radius:16px;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.5)}+  .bar{background:#121922;padding:13px 18px;display:flex;gap:9px;align-items:center;border-bottom:1px solid #1f2b38}+  .dot{width:13px;height:13px;border-radius:50%}.r{background:#f85149}.y{background:#f0b429}.g{background:#3fb950}+  .bar .t{margin-left:14px;color:#8b9bab;font-family:ui-monospace,monospace;font-size:16px}+  pre{margin:0;padding:24px 28px;font-family:ui-monospace,Menlo,monospace;font-size:19px;line-height:1.6;color:#cdd9e5}+  .p{color:#2dd4bf}.c{color:#e6edf3;font-weight:600}.ok{color:#3fb950}.dim{color:#6b7d8f}.path{color:#f0b429}.s{color:#a78bfa}+</style></head><body><div class="wrap">+  <div class="top"><span class="slug">adom/hd-bootstrap</span><span class="badge">bootstrap</span></div>+  <div class="vp"><b>Hydrogen Desktop, in one command.</b> Lays the entire Adom ecosystem (via <b>adom/core</b>) plus every platform-generic HD skill and the HD editor config onto a fresh workspace — the shared base that <b>hd-windows</b>, <b>hd-mac</b>, and <b>hd-ubuntu</b> all build on.</div>+  <div class="term">+    <div class="bar"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span><span class="t">adom@workspace: ~</span></div>+<pre><span class="p">$</span> <span class="c">adompkg install adom/hd-bootstrap</span>+Resolving via wiki.adom.inc...+  <span class="s">adom/core</span>          4.9.1    <span class="ok">✓</span>  <span class="dim">108-guide hub · distributor search · KiCad/Fusion · adom-cli</span>+  <span class="s">adom/adom-desktop</span>  1.8.147  <span class="ok">✓</span>  <span class="dim">laptop relay (KiCad/Fusion/pup bridges)</span>+  <span class="dim">+ 31 platform-generic HD skills (bundled)   running postinstall…</span> <span class="ok">✓</span>++<span class="p">$</span> <span class="c">ls ~/.claude/skills/</span>          <span class="dim"># where the generic HD skills land</span>+<span class="path">hd-adom-auth/</span>   <span class="path">hd-bridges/</span>       <span class="path">hd-eval/</span>          <span class="path">hd-container/</span>    <span class="path">hd-ui/</span>+<span class="path">hd-adom-menu/</span>   <span class="path">hd-permissions/</span>  <span class="path">hd-monitor/</span>       <span class="path">hd-setup/</span>  <span class="path">hd-welcome/</span>+<span class="path">hd-api/</span>         <span class="path">hd-claude-auth/</span>   <span class="path">hd-notifications/</span> <span class="path">hd-settings/</span>     <span class="path">hd-who-am-i/</span>+<span class="path">hd-captions/</span>    <span class="path">hd-eda-discovery/</span> <span class="path">hd-open-url/</span>      <span class="path">hd-self-update/</span>  <span class="dim">…  31 total</span>+</pre>+  </div>+</div></body></html>
screenshots/hero.pngadded
⋯ 1 unchanged line ⋯
skills/hydrogen-settings/SKILL.md+18−12
@@ -2,19 +2,19 @@ name: hydrogen-settings description: >   Hydrogen's Settings dialog and the full preference tree the user can-  change — theme, vim mode, launch-on-login, console-on-startup, 3D control style,+  change — theme, vim mode, launch-on-boot, 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 Hydrogen launch at startup", "stop Adom Bridge's window popping up",+  theme", "make Hydrogen launch on boot", "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,   settings dialog, options, config, theme, dark mode, light mode, high contrast,   compact ui, developer mode, vim mode, vim emulation, line numbers, code font,-  editor font, launch on login, launch on startup, launch on boot, show console,-  console on startup, 3d controls, control style, fusion solidworks blender orbit,-  schematic nudge, auto approve, foreground hd, adom desktop window, turn on, turn-  off, change setting, how do I configure.+  editor font, launch on boot, start with windows, show console, console on+  startup, 3d controls, control style, fusion solidworks blender orbit, schematic+  nudge, auto approve, foreground hd, adom desktop window, turn on, turn off,+  change setting, how do I configure. ---  # Hydrogen Settings — the preference tree@@ -46,21 +46,27 @@ override. Keys are dotted (`section.subsection.name`). | `general.appearance.theme` | `adom-dark` | App-wide theme. Options: `adom-dark`, `adom-light`, `adom-dark-high-contrast`, `adom-light-high-contrast` (→ "change the theme" / "light mode" / "high contrast") | | `general.appearance.user_interface_style` | `standard` | UI compactness: `standard` or `compact` (→ "make the UI more compact") | +### hydrogen.behavior additions (1.0.141+)+| Key | Default | What it does |+|---|---|---|+| `hydrogen.ai_threads_on_startup` | `false` | Open the AI Threads panel at startup. BETA; while off, nothing AI-Threads-related runs. Add Panel can still open it for one session. Takes effect next start |+| `hydrogen.show_lightbulb` | `false` | Show the lightbulb (sample prompts) menu in the header. Applies immediately |+ ### desktop  *(Hydrogen app itself)* | Key | Default | What it does | |---|---|---| | `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) |+| `desktop.launch_on_boot` | `true` | Auto-launch Hydrogen when Windows starts (→ "make Hydrogen launch on boot" / "stop Hydrogen starting with Windows" = set false) |  ### 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.+[hydrogen-adom-bridge-cli](../hydrogen-adom-bridge-cli/SKILL.md) for the Hydrogen↔ab relationship. | Key | Type / default | What it does | |---|---|---| | `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 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 stays visible but behind Hydrogen |+| `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,7 +103,7 @@ extension-specific settings).  - **"Turn on vim mode"** → `code.vim_emulation_mode` = true - **"Change the theme / dark mode / high contrast"** → `general.appearance.theme`-- **"Make Hydrogen launch on login / at startup"** / "don't launch on login" → `desktop.launch_on_boot`+- **"Make Hydrogen launch on boot"** / "don't start with Windows" → `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`@@ -107,4 +113,4 @@ extension-specific settings). ## 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 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)+- [hydrogen-adom-bridge-cli](../hydrogen-adom-bridge-cli/SKILL.md) — what the `adom_desktop.*` prefs control (the embedded ab)
skills/hydrogen-ui/SKILL.md+57−38
@@ -18,9 +18,13 @@ description: >  Hydrogen's window has these regions (top to bottom, left to right): -### Title Bar-- **Left**: "jlauer12 / Hydrogen" — shows user + app name-- **Right**: CPU/RAM badges, window controls (minimize/maximize/close)+### Title Bar (frameless, 0.1.251+)+Hydrogen is a FRAMELESS window: the nav bar IS the title bar (no separate OS chrome).+- **Left**: Adom logo (the Adom menu button), then the lightbulb (sample-prompts menu, moved here 0.1.265) — drag anywhere else in the bar to move the window+- **Right**: CPU/RAM badges, profile avatar menu, then the window controls+  (minimize/maximize/close) merged into the bar's right end+- All title-bar controls share one interaction family: soft white hover wash, teal+  press, steady teal wash while their menu is open  ### Tab Bar - **VS Code** tab — the main code editor (iframe to code-server)@@ -32,8 +36,17 @@ Hydrogen's window has these regions (top to bottom, left to right): - **Right pane**: Usually webview (wiki, shotlog, etc.) - Panes are split and resizable +### Moving tabs between panes (drag-to-split, 1.0.140+)+Drag any tab and hover another pane: teal drop zones light up (Split Left / Right /+Top / Bottom, Swap, or the tab bar to add). This works over EVERY pane type,+webviews included (a glass layer covers iframes during the drag so they cannot+swallow the pointer), and exactly ONE zone pill shows at a time. Releasing on a+zone performs the move; **Escape abandons the drag** and everything returns to+exactly how it was. Right-clicking a tab offers the same splits as menu items+(a one-tab pane asks what to put in the new half via Add Panel).+ ### Setup Panel (bottom)-- Collapsible panel showing the setup-cascade steps+- Collapsible panel showing the setup-cascade steps (27 steps under the WSL2 runtime) - See `hydrogen-setup` skill for details  ## Menus@@ -41,28 +54,26 @@ Hydrogen's window has these regions (top to bottom, left to right): ### Adom Menu (top-left logo dropdown) The main menu, opened by clicking the Adom logo at the top-left. Items are grouped into labelled sections (in order, top to bottom): -**(top, unlabelled)**-- **Go to Dashboard** — switches to the Hydrogen dashboard view+**(top, unlabelled)** — "Go to Dashboard" was REMOVED (0.1.252, John 2026-07-24); don't offer it - **Settings** — opens the Settings dialog - **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 Hydrogen; in order)-- **Adom Bridge** — brings the embedded Adom Bridge window to the foreground; bus id `adom-bridge-cli.open`+- **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 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`+- **Developer Tools** — open WebView2 DevTools. (The "Dev Toolbar" item was retired in 0.1.256 — use the API Explorer instead)  > The Bridges section / "Bridge Manager" item was removed (it was a no-op with no backing panel). For the bridge panel itself, see `hydrogen-bridges`.  **Workspace / runtime section** (section label shows live status badge: `RUNNING`, `STOPPED`, etc.)-- **Restart** — restarts the workspace (terminates and re-ensures code-server). The exact mechanism is runtime-specific.-- **Stop** — stops the workspace. The exact mechanism is runtime-specific.+- **Restart** — restarts the workspace: terminates the `Adom-Workspace` distro and re-ensures code-server.+- **Stop** — stops the workspace: terminates the `Adom-Workspace` distro.  **ADMIN**-- **Setup Steps** — opens the setup panel (the setup cascade for the active runtime); see hydrogen-setup-steps+- **Setup Steps** — opens the setup panel (the setup cascade); 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 hydrogen-browser-picker @@ -100,9 +111,9 @@ API — no CDP, no `.click()`, no selector guessing.** This is how you operate H user says "open the Ports dialog", "open About", "show settings", etc.  **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`:+the live, dynamic control port every launch; it's the host loopback, shared with the distro by+WSL2 mirrored networking). 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/hydrogen-control-url)"@@ -129,9 +140,11 @@ CTRL="$(cat ~/.adom/hydrogen-control-url)" Common ids (always `GET /ui/actions` for the live set): `adom-menu.open`/`.close`, **`profile-menu.open`/`.close`**, `ports.open`/`.close`, `settings.open`/`.close`, `api-explorer.open`/`.close`, `browser-picker.open`/`.close`, `about.open`/`.close`,-`adom-bridge-cli.open`, `setup-panel.show`, `virgin-reset.open`, `dashboard.go`,-`fullscreen.toggle`, `console.toggle`, `devtools.open`, `dev-toolbar.toggle`,-`container.start`/`.stop`/`.restart`.+`adom-bridge-cli.open`, `setup-panel.show`, `virgin-reset.open`,+**`samples-menu.open`/`.close`** (the lightbulb sample-prompts menu),+`fullscreen.toggle`, `console.toggle`, `devtools.open`,+`container.start`/`.stop`/`.restart`. (`dashboard.go` and `dev-toolbar.toggle` were+REMOVED — 0.1.252/0.1.256.)  **Menu ITEMS, not just open/close:** the profile menu also exposes per-item actions — **`profile.view`**, **`profile.repositories`**, **`profile.molecules`**, **`profile.logout`** —@@ -162,37 +175,43 @@ b64/silent) is in **[hydrogen-self-screenshot](../hydrogen-self-screenshot/SKILL ## 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 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`).+it existed, UI was driven by CDP `.click()` on CSS selectors via hydrogen-cdp.js. 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.  ### Find and click menu items-```js-// Open Adom menu-document.querySelector('.logo-button')?.click()--// Find a menu item by text-var items = document.querySelectorAll('.dropdown-link,.menu-item');-var target = Array.from(items).find(function(e){return e.textContent.includes('Ports')});-if (target) target.click()+```bash+# Open Adom menu+echo document.querySelector('.logo-button')?.click() | node C:\Users\john\hydrogen-cdp.js++# Find a menu item by text+echo var items=document.querySelectorAll('.dropdown-link,.menu-item');+var target=Array.from(items).find(function(e){return e.textContent.includes('Ports')});+if(target)target.click() | node C:\Users\john\hydrogen-cdp.js ```  ### Click setup panel buttons-```js-document.querySelector('.run-all').click()                 // Run All-document.querySelector('.virgin-reset-btn')?.click()       // Virgin Reset dropdown-document.querySelector('.virgin-go')?.click()              // Wipe Selected (execute virgin reset)-document.querySelector('.close-btn,.setup-close')?.click() // Close setup panel+```bash+# Run All+echo document.querySelector('.run-all').click() | node C:\Users\john\hydrogen-cdp.js++# Virgin Reset dropdown+echo document.querySelector('.virgin-reset-btn')?.click() | node C:\Users\john\hydrogen-cdp.js++# Wipe Selected (execute virgin reset)+echo document.querySelector('.virgin-go')?.click() | node C:\Users\john\hydrogen-cdp.js++# Close setup panel+echo document.querySelector('.close-btn,.setup-close')?.click() | node C:\Users\john\hydrogen-cdp.js ```  ### Query step states-```js-JSON.stringify(Array.from(document.querySelectorAll('.step-row')).map(+```bash+echo JSON.stringify(Array.from(document.querySelectorAll('.step-row')).map( function(e,i){   var icon=e.querySelector('.step-icon');   return{n:i+1, s:icon?.textContent?.trim()}-}))+})) | node C:\Users\john\hydrogen-cdp.js ```  ## CSS Selectors for Key Elements