@samitouri / QOS-React-2 / commits / 6a0ab4d2dd

Add worktree script (#35593)

Intended to be used directly and/or from skills in an agent. Usage is `./scripts/worktree.sh [--compiler] [--claude] <name>`. The script: * Checks that ./worktrees is in gitignore * Checks the named worktree does not exist yet * Creates the named worktree in ./worktrees/ * Installs deps * cds into the worktree (optionally the compiler dir if `--compiler`) * optionally runs claude in the worktree if `--claude`

Joseph Savona committed Jan 21, 2026 at 22:38 UTC 6a0ab4d2dd62dfdf8881ba1c3443c6d5acedc871
2 files changed +126
.gitignore
+1
@@ -24,6 +24,7 @@ chrome-user-data
24 *.swp
25 *.swo
26 /tmp
27 +/worktrees
28
29 packages/react-devtools-core/dist
30 packages/react-devtools-extensions/chrome/build
scripts/worktree.sh new
+125
@@ -0,0 +1,125 @@
1 +#!/usr/bin/env bash
2 +# Copyright (c) Meta Platforms, Inc. and affiliates.
3 +#
4 +# This source code is licensed under the MIT license found in the
5 +# LICENSE file in the root directory of this source tree.
6 +
7 +set -eo pipefail
8 +
9 +# --- Configuration ---
10 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11 +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
12 +WORKTREE_CREATED=false
13 +WORKTREE_PATH=""
14 +
15 +# --- Usage ---
16 +usage() {
17 + echo "Usage: $0 <name> [--claude] [--compiler]"
18 + echo ""
19 + echo "Creates a new git worktree with dependencies installed."
20 + echo ""
21 + echo "Arguments:"
22 + echo " <name> Name for the worktree (also used as branch name)"
23 + echo ""
24 + echo "Options:"
25 + echo " --claude Launch Claude Code after setup"
26 + echo " --compiler When used with --claude, launch Claude in the compiler directory"
27 + exit 1
28 +}
29 +
30 +# --- Error handling ---
31 +error() {
32 + echo "Error: $1" >&2
33 + exit 1
34 +}
35 +
36 +# --- Cleanup on error ---
37 +cleanup() {
38 + if [[ "$WORKTREE_CREATED" == "true" && -n "$WORKTREE_PATH" ]]; then
39 + echo "Cleaning up: removing worktree at $WORKTREE_PATH..." >&2
40 + git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || true
41 + fi
42 +}
43 +
44 +trap cleanup ERR
45 +
46 +# --- Argument parsing ---
47 +NAME=""
48 +USE_CLAUDE=false
49 +USE_COMPILER=false
50 +
51 +while [[ $# -gt 0 ]]; do
52 + case "$1" in
53 + --claude)
54 + USE_CLAUDE=true
55 + shift
56 + ;;
57 + --compiler)
58 + USE_COMPILER=true
59 + shift
60 + ;;
61 + -h|--help)
62 + usage
63 + ;;
64 + -*)
65 + error "Unknown option: $1"
66 + ;;
67 + *)
68 + if [[ -z "$NAME" ]]; then
69 + NAME="$1"
70 + else
71 + error "Unexpected argument: $1"
72 + fi
73 + shift
74 + ;;
75 + esac
76 +done
77 +
78 +if [[ -z "$NAME" ]]; then
79 + usage
80 +fi
81 +
82 +# --- Check .gitignore ---
83 +if ! grep -qE '^/?worktrees/?$' "$REPO_ROOT/.gitignore" 2>/dev/null; then
84 + error "'worktrees' is not in .gitignore. Add it before creating worktrees."
85 +fi
86 +
87 +# --- Check if worktree already exists ---
88 +if git worktree list | grep -q "\[$NAME\]"; then
89 + error "Worktree with branch name '$NAME' already exists"
90 +fi
91 +
92 +# --- Set up worktree path ---
93 +WORKTREES_DIR="$REPO_ROOT/worktrees"
94 +WORKTREE_PATH="$WORKTREES_DIR/$NAME"
95 +
96 +if [[ -d "$WORKTREE_PATH" ]]; then
97 + error "Directory already exists at $WORKTREE_PATH"
98 +fi
99 +
100 +# --- Create worktree ---
101 +mkdir -p "$WORKTREES_DIR"
102 +echo "Creating worktree '$NAME' at $WORKTREE_PATH..."
103 +git worktree add "$WORKTREE_PATH" -b "$NAME"
104 +WORKTREE_CREATED=true
105 +
106 +# --- Install dependencies ---
107 +echo "Installing compiler dependencies..."
108 +(cd "$WORKTREE_PATH/compiler" && yarn install)
109 +
110 +echo "Installing root dependencies..."
111 +(cd "$WORKTREE_PATH" && yarn install)
112 +
113 +echo "Worktree '$NAME' created successfully at $WORKTREE_PATH"
114 +
115 +# --- Launch Claude (optional) ---
116 +if [[ "$USE_CLAUDE" == "true" ]]; then
117 + if [[ "$USE_COMPILER" == "true" ]]; then
118 + echo "Launching Claude in compiler directory..."
119 + cd "$WORKTREE_PATH/compiler"
120 + else
121 + echo "Launching Claude in worktree root..."
122 + cd "$WORKTREE_PATH"
123 + fi
124 + exec claude
125 +fi