From f1fda9bdee59fd4dd3566b9f65cd6e324205024e Mon Sep 17 00:00:00 2001 From: Thomas Faour Date: Sat, 25 Jul 2026 12:09:39 +0000 Subject: [PATCH] Move make-widget/run-server skills to root .claude/skills/ Nested .claude/skills/ dirs (previously under server/) are only auto-discovered on-demand once a file under that subdirectory is touched, so /make-widget and /run-server weren't invocable from a fresh session. Root .claude/skills/ is scanned at session start. Fixes setup.sh/start-server.sh's relative cd-depth math (was hardcoded for the old server/.claude/skills/run-server/ depth) to instead resolve the repo root via git and cd into server/ explicitly, and updates SKILL.md/driver.py's path references to match the new layout. --- .../.claude => .claude}/skills/make-widget/SKILL.md | 0 .../.claude => .claude}/skills/run-server/.gitignore | 0 .../.claude => .claude}/skills/run-server/SKILL.md | 11 ++++++++--- .../.claude => .claude}/skills/run-server/driver.py | 4 ++-- .../.claude => .claude}/skills/run-server/setup.sh | 2 +- .../skills/run-server/start-server.sh | 2 +- .../skills/run-server/stop-server.sh | 0 CLAUDE.md | 2 +- 8 files changed, 13 insertions(+), 8 deletions(-) rename {server/.claude => .claude}/skills/make-widget/SKILL.md (100%) rename {server/.claude => .claude}/skills/run-server/.gitignore (100%) rename {server/.claude => .claude}/skills/run-server/SKILL.md (95%) rename {server/.claude => .claude}/skills/run-server/driver.py (97%) rename {server/.claude => .claude}/skills/run-server/setup.sh (98%) rename {server/.claude => .claude}/skills/run-server/start-server.sh (91%) rename {server/.claude => .claude}/skills/run-server/stop-server.sh (100%) diff --git a/server/.claude/skills/make-widget/SKILL.md b/.claude/skills/make-widget/SKILL.md similarity index 100% rename from server/.claude/skills/make-widget/SKILL.md rename to .claude/skills/make-widget/SKILL.md diff --git a/server/.claude/skills/run-server/.gitignore b/.claude/skills/run-server/.gitignore similarity index 100% rename from server/.claude/skills/run-server/.gitignore rename to .claude/skills/run-server/.gitignore diff --git a/server/.claude/skills/run-server/SKILL.md b/.claude/skills/run-server/SKILL.md similarity index 95% rename from server/.claude/skills/run-server/SKILL.md rename to .claude/skills/run-server/SKILL.md index cb3ea85..def254d 100644 --- a/server/.claude/skills/run-server/SKILL.md +++ b/.claude/skills/run-server/SKILL.md @@ -14,7 +14,12 @@ This container ships with **no Python, Node, Docker, or browser, and no sudo**. `setup.sh` bootstraps everything non-root; it's the bulk of what makes this skill non-obvious. Run it once per fresh container. -All paths below are relative to `server/`. +Commands below (`setup.sh`, `start-server.sh`, `stop-server.sh`, +`env.sh`, `driver.py`) are invoked from the **repo root** via their +`.claude/skills/run-server/` path -- the scripts `cd` into `server/` +themselves. Anything under `.venv/` (the venv itself, `pytest`, +`uvicorn`) lives inside `server/`, so those commands need `server/` +prefixed or `cd server` first. ## Prerequisites @@ -65,7 +70,7 @@ the pane -- source `env.sh` before the first `tmux` call: source .claude/skills/run-server/env.sh tmux new-session -d -s runserver -x 200 -y 50 tmux send-keys -t runserver \ - 'source .claude/skills/run-server/env.sh && .venv/bin/python .claude/skills/run-server/driver.py' Enter + 'source .claude/skills/run-server/env.sh && server/.venv/bin/python .claude/skills/run-server/driver.py' Enter timeout 20 bash -c 'until tmux capture-pane -t runserver -p | grep -q "driver>"; do sleep 0.3; done' # Every fresh scratch DB starts with no users -- bootstrap-admin @@ -143,7 +148,7 @@ isn't needed for most UI testing. ## Test ```bash -.venv/bin/pytest +cd server && .venv/bin/pytest ``` Uses its own tempfile SQLite per run (`tests/conftest.py`) -- no setup diff --git a/server/.claude/skills/run-server/driver.py b/.claude/skills/run-server/driver.py similarity index 97% rename from server/.claude/skills/run-server/driver.py rename to .claude/skills/run-server/driver.py index 0aeadb9..fe70053 100644 --- a/server/.claude/skills/run-server/driver.py +++ b/.claude/skills/run-server/driver.py @@ -10,8 +10,8 @@ eval/console-errors). Requires setup.sh to have run first (Python venv + Playwright Chromium + the non-root shared-lib/font extraction). Run via: - server/.claude/skills/run-server/env.sh sourced, then - .venv/bin/python server/.claude/skills/run-server/driver.py + .claude/skills/run-server/env.sh sourced, then + server/.venv/bin/python .claude/skills/run-server/driver.py See SKILL.md for the full agent-path invocation (tmux wrapping etc). """ diff --git a/server/.claude/skills/run-server/setup.sh b/.claude/skills/run-server/setup.sh similarity index 98% rename from server/.claude/skills/run-server/setup.sh rename to .claude/skills/run-server/setup.sh index 52b78bb..aaa5a11 100755 --- a/server/.claude/skills/run-server/setup.sh +++ b/.claude/skills/run-server/setup.sh @@ -4,7 +4,7 @@ # container that ships with NO Python/Node/Docker/browser and NO sudo. # Re-run any time; every step checks whether it already happened. set -euo pipefail -cd "$(dirname "${BASH_SOURCE[0]}")"/../../.. # -> server/ +cd "$(git -C "$(dirname "${BASH_SOURCE[0]}")" rev-parse --show-toplevel)/server" UV_BIN="$HOME/.local/bin/uv" DEPS_ROOT="/tmp/run-server-chromium-deps" diff --git a/server/.claude/skills/run-server/start-server.sh b/.claude/skills/run-server/start-server.sh similarity index 91% rename from server/.claude/skills/run-server/start-server.sh rename to .claude/skills/run-server/start-server.sh index 7e65326..96a1a29 100755 --- a/server/.claude/skills/run-server/start-server.sh +++ b/.claude/skills/run-server/start-server.sh @@ -3,7 +3,7 @@ # real deployment's data (see CLAUDE.md). Waits for readiness, prints # the PID and log path. Usage: ./start-server.sh [scratch-dir] [port] set -euo pipefail -cd "$(dirname "${BASH_SOURCE[0]}")"/../../.. # -> server/ +cd "$(git -C "$(dirname "${BASH_SOURCE[0]}")" rev-parse --show-toplevel)/server" SCRATCH="${1:-/tmp/run-server-scratch}" PORT="${2:-8420}" diff --git a/server/.claude/skills/run-server/stop-server.sh b/.claude/skills/run-server/stop-server.sh similarity index 100% rename from server/.claude/skills/run-server/stop-server.sh rename to .claude/skills/run-server/stop-server.sh diff --git a/CLAUDE.md b/CLAUDE.md index 1b5a83e..c480b18 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -54,7 +54,7 @@ Start here, don't re-derive from scratch: live (mobile viewport CSS collapse, a dialog's status message landing behind its own backdrop, a JSON/form-urlencoded body mismatch). Spin up `uvicorn app.main:app` against a scratch `DATABASE_URL`/`CONFIG_PATH` - sqlite file, don't touch the real deployment's data. `server/.claude/skills/run-server/` + sqlite file, don't touch the real deployment's data. `.claude/skills/run-server/` (`/run-server`) has a driver for exactly this. - **New/changed UI must work at both desktop and mobile widths -- screenshot both, don't assume one implies the other.** The layout