#!/usr/bin/env bash # worktree-setup — create a git worktree that's immediately usable. # # Collapses the /whats-next §3c ritual into one command. A bare # `git worktree add` leaves two things broken that bit the Layer-5 batch: # 1. no `.venv` in the worktree, so `make test-tooling` / `make regen-db` / # any python tooling can't find `.venv/bin/python`; # 2. (fixed separately in .config/hooks/post-checkout) pql resolving the # worktree's `.git` *file* to the MAIN checkout — the post-checkout hook # now passes `--vault`, so this script relies on it for the pql rebuild. # # This script adds the worktree under the repo's gitignored `.worktrees/` # (never the parent dir — outside the permission sandbox), symlinks the venv, # and prints the worktree path + the in-worktree reminders. # # Usage: tooling/worktree-setup [] # (run from the MAIN checkout, not a linked worktree) set -euo pipefail branch="${1:?usage: tooling/worktree-setup []}" start="${2:-HEAD}" repo_root="$(git rev-parse --show-toplevel)" if [ -f "$repo_root/.git" ]; then echo "worktree-setup: run this from the MAIN checkout, not a worktree" >&2 exit 1 fi wt_dir="$repo_root/.worktrees/$branch" if [ -e "$wt_dir" ]; then echo "worktree-setup: $wt_dir already exists — reuse it or 'git worktree remove' it first" >&2 exit 1 fi # The post-checkout hook (.config/hooks/post-checkout) fires here and rebuilds # the new worktree's pql.db via `pql --vault `. git worktree add "$wt_dir" -b "$branch" "$start" # Symlink the venv — worktrees don't copy it and a fresh per-worktree venv is # wasteful (the main one is identical). Makes `.venv/bin/python` resolve so the # Makefile's VENV_PY and every python tool work inside the worktree. if [ -d "$repo_root/.venv" ] && [ ! -e "$wt_dir/.venv" ]; then ln -s "$repo_root/.venv" "$wt_dir/.venv" echo " linked .venv -> $repo_root/.venv" fi echo "worktree ready: $wt_dir" echo " reminders: pql in this worktree needs --vault \"$wt_dir\" (FR-4);" echo " tea commands run from the main checkout (go-git can't read a linked worktree)."