#!/usr/bin/env bash # Create a permanent overlay branch for a client: an orphan branch (no # shared history with main) holding only what's unique to that client. # export_client.sh merges it into the freshly-generated client/ # branch automatically if it exists. # # Usage: scripts/new_client_overlay.sh set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." SLUG="${1:-}" if [ -z "$SLUG" ]; then echo "Usage: $0 " exit 1 fi BRANCH="overlay/${SLUG}" if git show-ref --verify --quiet "refs/heads/${BRANCH}"; then echo "${BRANCH} already exists." exit 1 fi if [ -n "$(git status --porcelain)" ]; then echo "Working tree isn't clean. Commit or stash before creating an overlay." exit 1 fi CURRENT_BRANCH="$(git branch --show-current)" git checkout -q --orphan "$BRANCH" # Clears both the index AND the working tree of everything inherited from # $CURRENT_BRANCH — safe, because `git rm` only ever touches tracked # paths (node_modules/, .env, dist/ are gitignored, untouched either way). # -f is required because there's no HEAD yet on a fresh orphan branch, so # git has nothing to compare the index to and refuses without it. No # error suppression: a real failure here should stop the script rather # than silently commit all of main's files onto this branch. git rm -rqf -- . mkdir -p src/router/overlay cat > "src/router/overlay/${SLUG}.tsx" < }, ]; EOF git add "src/router/overlay/${SLUG}.tsx" git commit -q -m "Start ${BRANCH} overlay" echo "Created ${BRANCH}." echo echo "Add whatever's unique to ${SLUG} as NEW files only — never edit a file that" echo "also exists on main. export_client.sh regenerates .env.example every run," echo "and every existing route/layout/style is main's, so there's no stable base" echo "for a merge to reconcile against and it will conflict every time." echo echo "Extension points main already exposes (unused ones don't need touching):" echo " src/router/overlay/${SLUG}.tsx routes — see the example added" echo " src/shared/components/layouts/overlay/AppLayout.tsx" echo " swap the whole app shell" echo " (sidebar/navbar/colors)." echo " Default export, same props" echo " as DefaultAppLayout. Its mere" echo " presence replaces the shell" echo " for EVERY route, so only add" echo " it once you have a real one —" echo " that's why it's not scaffolded" echo " here the way the routes file is." echo " src/styles/overlay/*.css redefine index.css's :root/.dark" echo " CSS variables (--primary, etc.)." echo " Same caveat: any file here is" echo " live the moment it exists." echo " public/branding/${SLUG}/ new asset paths only — an" echo " *existing* asset path (e.g." echo " Logo_PLN.png) isn't safe to" echo " override yet, see GIT_BRANCHES.md." echo echo "It's never merged into main and main is never merged into it — export_client.sh" echo "merges it onto the disposable client/${SLUG} branch on every export instead." git checkout -q "$CURRENT_BRANCH"