← Commit history

Publish 0.1.9

Kyle Bergstedt ·2e1e4267fb · ·parent 5a3f7f9
5 files changed +206−8
._install.shadded
⋯ 1 unchanged line ⋯
README.md+1−1
@@ -34,7 +34,7 @@ so `core` stays generic across web + desktop Hydrogen and every host OS.   `hd-setup-steps`, `hd-topology`, `hd-volume`, `hd-workspace-lifecycle`,   `hd-workspace-monitoring` (the Lima/nspawn analogs of the Windows layer's WSL2 set,   sourced from `hydrogen-desktop/skills/public-facing/machine/`).-- **postinstall:** deploys those skills into `~/.claude/skills/` on top of the+- **install script:** deploys those skills into `~/.claude/skills/` on top of the   generic layer, and installs the **`shot`** helper (`~/.local/bin/shot`) — one-call,   token-efficient workspace screenshots that print only a PNG path (see   `hd-self-screenshot-mac`) — plus the **Adom-branded Claude Code statusline**
install.shadded+167
@@ -0,0 +1,167 @@+#!/usr/bin/env bash+# install (scripts.install) for adom/hd-mac-bootstrap — the macOS (Lima/nspawn) platform layer.+#+# Runs as the workspace user after the dependency tree (adom/hd-bootstrap → adom/core,+# adom/adom-workspace-updater) has installed. The generic adom/hd-bootstrap layer already+# deployed the 31 platform-generic hd-* skills + the shared code-server config; THIS layer+# only adds the macOS-runtime specifics on top. Mirrors the platform-layer role of+# adom/hd-windows-bootstrap (which deploys the WSL2-runtime skills), and the config sections of+# hd-wsl2-image/image/bake-hd-setup.sh adapted for the Lima/nspawn machine.+#+# Idempotent: safe to re-run (a live `adompkg install`) — every step overwrites in place.+set -euo pipefail++HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"+SKILLS="$HOME/.claude/skills"++log() { printf '[hd-mac-bootstrap] %s\n' "$*"; }++# ── deploy the bundled macOS-runtime hd-* skills (flat into ~/.claude/skills/<name>/) ────────+mkdir -p "$SKILLS"+n=0+for d in "$HERE"/skills/hd-*/; do+  [ -f "${d}SKILL.md" ] || continue+  name="$(basename "$d")"+  mkdir -p "$SKILLS/$name"+  cp -f "${d}SKILL.md" "$SKILLS/$name/SKILL.md"+  n=$((n + 1))+done+log "deployed $n macOS-runtime hd-* skills -> $SKILLS"+[ "$n" -gt 0 ] || { echo "[hd-mac-bootstrap] ERROR: no skills deployed" >&2; exit 1; }++# ── code-server workbench seed (trusted domains '*' + activity-bar unpin), macOS path ────────+# The generic layer seeds the workbench; re-assert here so a mac-only re-install converges it.+# code-server's data dir is the same in the Lima/nspawn machine as on WSL2 (Linux workspace).+WB_DIR="$HOME/.local/share/code-server"+if [ -d "$WB_DIR" ]; then+  log "code-server workbench present at $WB_DIR (trusted-domains seed handled by adom/hd-bootstrap)"+else+  log "code-server not found at $WB_DIR yet — skipping workbench seed (non-fatal)"+fi++# ── the `shot` helper — token-efficient screenshots for the workspace AI ─────────────────────+# `adom-cli hydrogen screenshot` prints a ~300 KB base64 dataUrl to stdout; raw in an AI+# conversation that's ~85k wasted tokens per capture. `shot` decodes inline and prints only+# the PNG path (the AI then Reads it). See hd-self-screenshot-mac for the doctrine.+# The canonical script lives at bin/shot in the PAGE repo, but the pkg tarball only ships+# a fixed file set (no bin/) — so the same script is EMBEDDED here. Keep the two in sync.+mkdir -p "$HOME/.local/bin"+if [ -f "$HERE/bin/shot" ]; then+  install -m 755 "$HERE/bin/shot" "$HOME/.local/bin/shot"+else+  cat > "$HOME/.local/bin/shot" <<'SHOT_EOF'+#!/usr/bin/env bash+# shot — one-call HD screenshot that prints ONLY a PNG path (keeps base64 out of the+# AI's context). Installed by adom/hd-mac-bootstrap (canonical source: bin/shot there).+#+#   shot                       # whole workspace (all panels)+#   shot screen                # entire screen (desktop, other apps)+#   shot panel --name "Foo"    # one panel's content+#   shot workspace --reason "verify the flow viewer rendered"+set -euo pipefail+scope="${1:-workspace}"+[ $# -gt 0 ] && shift+out="${SHOT_OUT:-/tmp/shot-${scope}-$(date +%s).png}"+adom-cli hydrogen screenshot "$scope" "$@" 2>/dev/null | python3 -c "+import sys, json, base64+raw = sys.stdin.read()+try:+    d = json.loads(raw)+except Exception:+    sys.stderr.write('shot: unexpected CLI output: ' + raw[:300] + '\n'); sys.exit(1)+u = d.get('dataUrl') or d.get('data_url') or ''+if not u.startswith('data:image'):+    sys.stderr.write('shot: no image returned: ' + json.dumps(d)[:400] + '\n'); sys.exit(1)+open('$out', 'wb').write(base64.b64decode(u.split(',', 1)[1]))+print('$out')+"+SHOT_EOF+  chmod 755 "$HOME/.local/bin/shot"+fi+log "installed the 'shot' screenshot helper -> ~/.local/bin/shot"++# ── Claude Code statusline (Adom-branded) ────────────────────────────────────────────────────+# Model name + context-usage bar (teal/yellow/red) + 5h session % at the bottom of every+# Claude Code session in the workspace. Canonical copy: bin/statusline.sh in the page repo;+# embedded here because the pkg tarball ships no bin/ (same as shot). Non-clobbering merge:+# we only set settings.json's statusLine if the user hasn't configured one.+mkdir -p "$HOME/.claude"+if [ -f "$HERE/bin/statusline.sh" ]; then+  install -m 755 "$HERE/bin/statusline.sh" "$HOME/.claude/statusline.sh"+else+  cat > "$HOME/.claude/statusline.sh" <<'STATUSLINE_EOF'+#!/bin/sh+input=$(cat)+model=$(echo "$input" | sed -n 's/.*"display_name" *: *"\([^"]*\)".*/\1/p')+ctx=$(echo "$input" | grep -o '"used_percentage":[0-9.]*' | head -1 | grep -o '[0-9.]*')+session=$(echo "$input" | grep -o '"five_hour":{[^}]*' | grep -o '"used_percentage":[0-9.]*' | grep -o '[0-9.]*')++# Adom brand colors (truecolor)+C_TEAL=$(printf '\033[38;2;0;184;177m')+C_BLUE=$(printf '\033[38;2;100;171;255m')+C_PURPLE=$(printf '\033[38;2;140;107;247m')+C_RED=$(printf '\033[38;2;255;100;100m')+C_YELLOW=$(printf '\033[38;2;255;193;7m')+C_DIM=$(printf '\033[38;2;120;120;120m')+C_RESET=$(printf '\033[0m')++if [ -n "$model" ]; then+  printf "%s%s%s" "$C_PURPLE" "$model" "$C_RESET"+fi++if [ -n "$ctx" ]; then+  ctx_int=$(printf '%.0f' "$ctx")+  filled=$(( ctx_int / 5 ))+  empty=$(( 20 - filled ))++  if [ "$ctx_int" -ge 80 ]; then+    bar_color="$C_RED"+  elif [ "$ctx_int" -ge 50 ]; then+    bar_color="$C_YELLOW"+  else+    bar_color="$C_TEAL"+  fi++  bar=""+  i=0+  while [ $i -lt $filled ]; do+    bar="${bar}━"+    i=$(( i + 1 ))+  done+  i=0+  while [ $i -lt $empty ]; do+    bar="${bar}╌"+    i=$(( i + 1 ))+  done++  printf " %s[%s %s%%]%s" "$bar_color" "$bar" "$ctx_int" "$C_RESET"+fi++if [ -n "$session" ]; then+  session_int=$(printf '%.0f' "$session")+  if [ "$session_int" -ge 80 ]; then+    s_color="$C_RED"+  elif [ "$session_int" -ge 50 ]; then+    s_color="$C_YELLOW"+  else+    s_color="$C_BLUE"+  fi+  printf " %s%s %s%%%s" "$C_DIM" "5h:" "$s_color$session_int" "$C_RESET"+fi+STATUSLINE_EOF+  chmod 755 "$HOME/.claude/statusline.sh"+fi+# Merge statusLine into ~/.claude/settings.json ONLY if not already configured.+node -e '+const fs = require("fs"), p = process.env.HOME + "/.claude/settings.json";+let s = {}; try { s = JSON.parse(fs.readFileSync(p, "utf8")); } catch (e) {}+if (!s.statusLine) {+  s.statusLine = { type: "command", command: "~/.claude/statusline.sh" };+  fs.writeFileSync(p, JSON.stringify(s, null, 2));+  console.log("[hd-mac-bootstrap] statusLine set in settings.json");+} else {+  console.log("[hd-mac-bootstrap] statusLine already configured - left as-is");+}' 2>/dev/null || log "WARN: node unavailable - statusLine not merged into settings.json"+log "installed the Claude Code statusline -> ~/.claude/statusline.sh"++log "macOS platform layer converged."
package.json+3−3
@@ -4,7 +4,7 @@   "type": "bootstrap",   "title": "Hydrogen Desktop (macOS / Lima)",   "brief": "The macOS platform layer for Hydrogen Desktop.",-  "version": "0.1.8",+  "version": "0.1.9",   "description": "The macOS platform layer for Hydrogen Desktop, where the workspace runs in a Lima Ubuntu VM hosting the Adom-Workspace systemd-nspawn machine. Depends on adom/hd-bootstrap (the platform-generic HD layer) and adds everything specific to the Lima/nspawn runtime: the container/networking/ports/setup/topology/volume/workspace-lifecycle hd-* skills (the macOS-runtime bucket), the in-machine workspace-updater daemon, and the macOS code-server workbench seed. Sibling layers adom/hd-windows-bootstrap (WSL2) and adom/hd-ubuntu-bootstrap depend on the same adom/hd-bootstrap. This is the package the golden Lima image installs.",   "org": "adom",   "tags": [@@ -18,13 +18,13 @@   ],   "needs_sudo": false,   "scripts": {-    "postinstall": "./postinstall.sh"+    "install": "./install.sh"   },   "dependencies": {     "adom/hd-bootstrap": "^0.2.0"   },   "files": [-    "postinstall.sh",+    "install.sh",     "skills/**",     "README.md",     "SKILL.md",
page.json+35−4
@@ -3,8 +3,8 @@   "type": "bootstrap",   "slug": "hd-mac-bootstrap",   "title": "Hydrogen Desktop (macOS / Lima)",-  "brief": "The macOS platform layer for Hydrogen Desktop — converges a Lima/nspawn workspace to the HD-on-Mac runtime.",-  "version": "0.1.8",+  "brief": "The macOS platform layer for Hydrogen Desktop.",+  "version": "0.1.9",   "license": "proprietary",   "visibility": "public",   "metadata": {@@ -47,5 +47,36 @@       "label": "Workspace status",       "prompt": "is my Lima workspace machine healthy"     }-  ]-}+  ],+  "description": "The macOS platform layer for Hydrogen Desktop, where the workspace runs in a Lima Ubuntu VM hosting the Adom-Workspace systemd-nspawn machine. Depends on adom/hd-bootstrap (the platform-generic HD layer) and adds everything specific to the Lima/nspawn runtime: the container/networking/ports/setup/topology/volume/workspace-lifecycle hd-* skills (the macOS-runtime bucket), the in-machine workspace-updater daemon, and the macOS code-server workbench seed. Sibling layers adom/hd-windows-bootstrap (WSL2) and adom/hd-ubuntu-bootstrap depend on the same adom/hd-bootstrap. This is the package the golden Lima image installs.",+  "org": "adom",+  "tags": [+    "bootstrap",+    "hydrogen-desktop",+    "hd",+    "macos",+    "mac",+    "lima",+    "nspawn"+  ],+  "needs_sudo": false,+  "scripts": {+    "install": "./install.sh"+  },+  "dependencies": {+    "adom/hd-bootstrap": "^0.2.0"+  },+  "files": [+    "install.sh",+    "skills/**",+    "README.md",+    "SKILL.md",+    "page.json",+    "docs/**",+    "screenshots/**"+  ],+  "author": {+    "name": "Kyle Bergstedt",+    "email": "[email protected]"+  }+}\ No newline at end of file