From e72c1f9f48023a4649075b9574a59ec9d61fff44 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Fri, 31 Jul 2026 11:38:40 +0000 Subject: [PATCH] =?UTF-8?q?docs(lxc102):=20installer=20+=20procedur=C4=83?= =?UTF-8?q?=20de=20replicare=20pentru=20sbt/statusline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/install-sbt.sh: instalare idempotentă (scripturi + statusline + patch settings.json) cu verificări de mediu - README: replicare de la zero (transfer prin pct exec, installer, sandbox, ce se pierde la recrearea sandbox-ului), verificare rapidă, căi noi Co-Authored-By: Claude Opus 5 (1M context) --- proxmox/lxc102-docker/README.md | 62 ++++++++++++++++++++ proxmox/lxc102-docker/scripts/install-sbt.sh | 59 +++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100755 proxmox/lxc102-docker/scripts/install-sbt.sh diff --git a/proxmox/lxc102-docker/README.md b/proxmox/lxc102-docker/README.md index 6766333..da968fe 100644 --- a/proxmox/lxc102-docker/README.md +++ b/proxmox/lxc102-docker/README.md @@ -80,6 +80,8 @@ Trei scripturi în `/home/work/.local/bin/`, copii versionate în `scripts/` din | `sb` | un shell interactiv în sandbox, într-un director de proiect | | `sbt` | **sesiune tmux** cu sandbox + agent — echivalentul lui `start-agent.sh` de pe LXC 171 | +Instalare / reinstalare: `scripts/install-sbt.sh` — vezi „Replicare de la zero" mai jos. + ### `sbt` — tmux + sandbox + agent **Nu lansează niciun agent** — deschide shell-uri în sandbox, agentul îl pornești manual @@ -142,6 +144,61 @@ Statusline-ul e activat și pentru `claude` rulat direct pe host ca `work`, prin Cache 60s în `/tmp/claude-statusline-usage.json`. Dacă API-ul răspunde `rate_limit_error`, barele arată `0% ↺ --` până la următoarea reîmprospătare — nu e o defecțiune de config. +### Replicare de la zero + +Presupune sbx deja funcțional (vezi „Depanare" mai jos) și userul `work` în grupul `kvm`. + +**1. Copiază `scripts/` din acest repo pe LXC 102.** LXC-ul nu are acces direct la repo, deci +transfer prin `pct exec` (rulat de pe LXC 171, unde e clonat repo-ul): + +```bash +cd proxmox/lxc102-docker +tar czf - scripts | base64 -w0 | ssh root@10.0.20.201 \ + "pct exec 102 -- bash -c 'rm -rf /tmp/sbt-install; mkdir -p /tmp/sbt-install; + cd /tmp/sbt-install && base64 -d | tar xzf - && chown -R work:work /tmp/sbt-install'" +``` + +**2. Rulează installer-ul ca `work`** (idempotent, poate fi rulat oricând la update): + +```bash +ssh root@10.0.20.201 "pct exec 102 -- su - work -c 'cd /tmp/sbt-install/scripts && ./install-sbt.sh'" +``` + +Pune `sbt`/`agents`/`sb` în `~/.local/bin`, statusline-ul în `/home/workspace/.agent/`, +adaugă `statusLine` în `~/.claude/settings.json` al userului `work` și verifică +`tmux` / `sbx` / `jq` / PATH. + +**3. Sandbox-ul.** Scripturile țintesc implicit sandbox-ul `claude-workspace` (numele rezultă din +agent + directorul de lucru, la `sbx create claude /home/workspace`). Alt sandbox se dă prin +variabila `SANDBOX`: + +```bash +SANDBOX=alt-sandbox sbt 2 proiect-b +``` + +**4. După recrearea sandbox-ului** trebuie refăcut ce stă pe overlay-ul efemer `/home/agent`: +login-ul Claude Code (`~/.claude/.credentials.json`) și orice unelte instalate manual în +`~/.local/bin` din sandbox. Persistă doar `/home/workspace` (virtiofs) și volumele montate de sbx +peste `~/.claude/{projects,sessions,todos,skills,shell-snapshots,statsig}` — de aceea statusline-ul +stă în `/home/workspace/.agent/` și e re-legat de `sbt` la fiecare intrare. + +### Verificare rapidă + +```bash +# statusline randează în sandbox (fără a porni un agent) +sbx exec claude-workspace bash -lc '. /home/workspace/.agent/bootstrap-statusline.sh; + jq -c .statusLine ~/.claude/settings.json; claude --version' + +# sesiune tmux fără terminal (test): panes trebuie să fie vii, cu prompt agent@claude-workspace +sbt 3 test-sbt; sleep 10 +tmux list-panes -t sbx3 -F '#{pane_index} dead=#{pane_dead}' +tmux capture-pane -p -t sbx3:0.0 | tail -2 +tmux kill-session -t sbx3; rm -rf /home/workspace/test-sbt +``` + +`open terminal failed: not a terminal` la final e normal când `sbt` e rulat neinteractiv — +sesiunea se creează oricum, doar atașarea eșuează. + --- ## Cum funcționează sbx (relevant pentru depanare) @@ -275,3 +332,8 @@ vechi rămân afișate — ce contează e că nu mai cresc. | `/usr/libexec/containerd-shim-nerdbox-v1` | shim microVM | | `/usr/libexec/lib/libsailor.so` | bibliotecă VMM (sensibilă la versiunea de glibc) | | `/home/work/.profile` | conține fix-ul de PATH pentru `mkfs.ext4` | +| `/home/work/.local/bin/{sbt,agents,sb}` | scripturile de lucru (sursa versionată: `scripts/`) | +| `/home/work/.tmux.conf` | prefix `Ctrl+A`, mouse on | +| `/home/workspace/` | bind-mount virtiofs — singurul spațiu persistent partajat cu sandbox-ul | +| `/home/workspace/.agent/statusline.sh` | statusline Claude Code (host + sandbox) | +| `/home/workspace/.agent/bootstrap-statusline.sh` | re-leagă statusline-ul în sandbox la fiecare intrare | diff --git a/proxmox/lxc102-docker/scripts/install-sbt.sh b/proxmox/lxc102-docker/scripts/install-sbt.sh new file mode 100755 index 0000000..870a3a3 --- /dev/null +++ b/proxmox/lxc102-docker/scripts/install-sbt.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +# Instalează pe LXC 102 (userul `work`) mediul tmux + sandbox + statusline: +# ~/.local/bin/{sbt,agents,sb} +# /home/workspace/.agent/{statusline.sh,bootstrap-statusline.sh} +# statusLine în ~/.claude/settings.json (pentru claude rulat pe host) +# +# Se rulează DIN directorul care conține scripturile (acest scripts/ copiat pe LXC 102): +# su - work -c 'cd /tmp/sbt-install && ./install-sbt.sh' +# +# Idempotent — poate fi rulat de câte ori e nevoie. +set -euo pipefail + +SRC="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BIN="$HOME/.local/bin" +AGENT_DIR="/home/workspace/.agent" +CFG="$HOME/.claude/settings.json" +STATUSLINE="$AGENT_DIR/statusline.sh" + +[ "$(id -un)" = "work" ] || echo "ATENȚIE: rulezi ca $(id -un), nu ca 'work'." + +# --- 1. scripturile de pe host --- +mkdir -p "$BIN" +for f in sbt agents sb; do + install -m 755 "$SRC/$f" "$BIN/$f" + echo "instalat $BIN/$f" +done + +# --- 2. statusline pe volumul partajat cu sandbox-ul --- +# /home/workspace e bind-mount virtiofs, singurul loc persistent văzut identic +# din host și din sandbox (/home/agent din sandbox e overlay efemer). +mkdir -p "$AGENT_DIR" +install -m 755 "$SRC/statusline.sh" "$AGENT_DIR/statusline.sh" +install -m 644 "$SRC/bootstrap-statusline.sh" "$AGENT_DIR/bootstrap-statusline.sh" +echo "instalat $AGENT_DIR/{statusline.sh,bootstrap-statusline.sh}" + +# --- 3. statusline și pentru claude rulat direct pe host --- +mkdir -p "$(dirname "$CFG")" +[ -f "$CFG" ] || printf '{}\n' > "$CFG" +if [ "$(jq -r '.statusLine.command // ""' "$CFG" 2>/dev/null)" != "$STATUSLINE" ]; then + tmp=$(mktemp) + if jq --arg c "$STATUSLINE" '.statusLine = {type: "command", command: $c}' "$CFG" > "$tmp"; then + mv "$tmp" "$CFG"; echo "statusLine adăugat în $CFG" + else + rm -f "$tmp"; echo "EȘEC: $CFG nu e JSON valid — adaugă statusLine manual." >&2 + fi +else + echo "statusLine deja configurat în $CFG" +fi + +# --- 4. verificări --- +echo "--- verificări ---" +for c in tmux sbx jq; do + command -v "$c" >/dev/null && echo "ok: $c" || echo "LIPSĂ: $c" +done +bash -n "$BIN/sbt" && echo "ok: sintaxă sbt" +grep -q "$HOME/.local/bin" <<<"$PATH" && echo "ok: ~/.local/bin în PATH" \ + || echo "ATENȚIE: adaugă ~/.local/bin în PATH (~/.profile)" +echo +echo "Gata. Pornește sandbox-ul și o sesiune: agents up && sbt"