#!/bin/sh # install.sh — set up Claire locally. # # Two independent steps, each idempotent and runnable on its own: # # 1. venv + editable install via `uv` — requires `uv` on PATH. # 2. Symlink the `claire` console script into ~/.local/bin — requires only # that `.venv/bin/claire` already exists (built by step 1, or by an # earlier run). # # Re-running the script always re-creates the symlink if the venv exists, # even if `uv` is missing from the current PATH (the common partial-install # case: venv was built in an interactive shell but the symlink step is # being run from a non-interactive shell without uv on PATH). set -eu ROOT=$(cd "$(dirname "$0")/.." && pwd) cd "$ROOT" # --------------------------------------------------------------------------- # Step 1: venv + editable install (skipped gracefully if uv is missing) # --------------------------------------------------------------------------- if command -v uv >/dev/null 2>&1; then if [ ! -d "$ROOT/.venv" ]; then uv venv fi uv pip install -e ".[dev]" else echo "install.sh: uv not on PATH; skipping venv build." >&2 echo " (will only succeed if .venv/bin/claire already exists)" >&2 fi # --------------------------------------------------------------------------- # Step 2: symlink — only depends on .venv/bin/claire existing # --------------------------------------------------------------------------- TARGET="$ROOT/.venv/bin/claire" LINK="$HOME/.local/bin/claire" if [ ! -x "$TARGET" ]; then echo "install.sh: $TARGET does not exist; cannot create symlink." >&2 echo " install uv and re-run from an interactive shell, or run:" >&2 echo " cd $ROOT && uv venv && uv pip install -e ." >&2 exit 1 fi mkdir -p "$HOME/.local/bin" ln -sf "$TARGET" "$LINK" echo "install.sh: linked $LINK -> $TARGET" echo "install.sh: ensure ~/.local/bin is on your PATH"