Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cw — Claude Worktree

Release License Homebrew Bash Platform

git worktree + claude -w를 대체하는 CLI. 워크트리 생성부터 claude 실행, 잠금, 일괄 정리까지 서브커맨드로 관리.

만든 이유

git worktree의 불편함

  • 매번 .claude/worktrees/<name> 경로를 직접 타이핑해야 함 (git worktree add .claude/worktrees/my-feature -b feature/my-feature main)
  • 생성 후 claude 실행까지 cdclaude 2단계
  • 머지된 브랜치 일괄 정리 기능 없음
  • 잠긴 워크트리 사유(reason) 관리 번거로움
  • 어떤 워크트리가 "정리해도 되는지" 한 번에 안 보임

claude -w의 불편함

  • 브랜치명을 직접 지정 불가 — 항상 worktrees-<name> 자동 작명
  • 베이스 브랜치 지정 옵션 없음 (main/현재 브랜치 고정)
  • 변경사항 없으면 세션 종료 시 자동 삭제 → 작업 중인 워크트리 날아갈 위험
  • 잠금/정리/이름변경 기능 없음
  • 워크트리 생성 후 초기화 훅 지원 없음

cw가 제공하는 것

기능 git worktree claude -w cw
.claude/worktrees/ 경로 자동
브랜치명 직접 지정
베이스 브랜치 선택
생성 후 claude 자동 실행
머지 기반 일괄 정리
잠금 + 사유 ✅ (번거로움)
detached HEAD ancestor 체크 정리
init hook (.env.local 복사 등)
경로 출력 + 클립보드 복사
stale 참조 + 미사용 브랜치 동시 정리
축약/번들 옵션 (-Fn, -dFn) - -
컬러 출력 (메인/잠금/prunable 강조) 일부 -

요구사항

  • git (필수)
  • bash 3.2+ (macOS/Linux 기본 탑재)
  • claude CLI (PATH에 있어야 cw add/open 기본 동작 — --no-open으로 우회 가능)

설치

Homebrew (권장)

brew install dunzkoi/tap/cw

Install script

curl -fsSL https://raw.githubusercontent.com/dunzkoi/cw/main/install.sh | bash

설치 경로 커스텀:

CW_INSTALL_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/dunzkoi/cw/main/install.sh | bash

수동

curl -fsSL https://raw.githubusercontent.com/dunzkoi/cw/main/cw -o ~/.local/bin/cw
chmod +x ~/.local/bin/cw

NO_COLOR=1 환경변수로 색상 비활성화 가능.

사용법

생성 + 진입

cw add my-feature                                     # worktrees-my-feature 브랜치로 생성
cw add BMSQUARE-16512 feature/BMSQUARE-16512          # 브랜치명 직접 지정
cw add BMSQUARE-16512 feature/BMSQUARE-16512 main     # 베이스 main
cw add hotfix -d main                                 # detached HEAD
cw add urgent -l                                      # 생성 즉시 잠금
cw add exp -F                                         # fetch 선행
cw add setup -n                                       # 생성만, claude 실행 X
cw add x -Fn                                          # 번들: fetch + no-open

기존 워크트리 접근

cw open my-feature       # claude 실행
cw path my-feature       # 경로 출력 + 클립보드 복사

목록 / 선택

cw list                          # TTY: ↑↓로 선택 → Cursor/claude/cd/복사
cw list --plain                  # 스크립트용 텍스트 목록
cw BMSQUARE-15764                # 이름만 입력 → 액션 메뉴
cw cursor BMSQUARE-15764         # Cursor에서 열기
cw name BMSQUARE-15764           # 워크트리 이름 출력 + 클립보드
eval "$(cw cd BMSQUARE-15764)"   # 현재 쉘에서 이동

cw.claude/worktrees/.worktrees/ 모두에서 워크트리를 찾습니다.
remove, clean, lock, move 등 관리 명령도 양쪽 베이스 모두 적용됩니다.
cw add로 새로 만드는 워크트리는 기본적으로 .claude/worktrees/에 생성됩니다.

목록 출력 예

cw list --plain

~/work/project 082c77b7ec [main] ~/work/project/.claude/worktrees/mobile-gnb ce52264285 [feature/...] 🔒 locked ~/work/project/.claude/worktrees/dead abc123ff00 [old-branch] ⚠ prunable


### 잠금
```bash
cw lock my-feature "MR 리뷰 중"     # 삭제 방지
cw unlock my-feature

이동

cw move old-name new-name

정리

cw remove my-feature             # 안전 모드: 변경사항 있으면 차단
cw remove my-feature -f          # 강제 (변경사항 무시)
cw clean                         # 메인 워크트리 현재 브랜치에 머지된 것만 일괄 삭제
cw clean main                    # 기준 브랜치 명시 override

clean 정책:

  • 대상: git worktree list모든 linked worktree (메인·bare 제외). .claude/worktrees, .worktrees, orca/workspaces/... 등 경로 무관
  • 머지 판정: git cherry(patch-id) — rebase/cherry-pick 흡수분 포함
  • tip이 기준 ancestor이고 reflog≤1 → 유지 (orca 주차·미작업). ancestor가 아닌데 cherry0 → 삭제(빈 reflog여도, 예: 15764)
  • tip==기준 tip + reflog>1 → ff-merge로 삭제
  • 잠긴·dirty·머지 안 됨 → 스킵 (끝에 cw remove <name> -f 힌트)
  • detached HEAD → HEAD가 기준 브랜치 ancestor면 삭제(dirty면 유지)
  • stray 디렉토리 삭제는 관리 베이스(.claude/worktrees, .worktrees) 안에서만
cw prune                         # stale 참조 정리 + 머지된 orphan 브랜치 삭제
cw repair                        # 레포 이동 후 워크트리 링크 복구

옵션 매핑

축약 전체 대상 명령 의미
-l --lock add 생성 즉시 잠금
-d --detach add detached HEAD 체크아웃
-F --fetch add 생성 전 git fetch origin
-n --no-open add claude 실행 생략
-f --force remove 더티 상태 무시

번들링 지원: cw add foo -dFn main = cw add foo --detach --fetch --no-open main

Init Hook

~/.claude/worktree-init.sh가 실행 가능하면 cw add 완료 후 자동 실행 (인자: 새 워크트리 경로).

활용 예:

#!/bin/bash
# ~/.claude/worktree-init.sh
WT="$1"
# 프로젝트 로컬 설정 복사
[ -f .env.local ] && cp .env.local "$WT/"
# VSCode workspace 설정 복사
[ -d .vscode ] && cp -r .vscode "$WT/"

환경변수

변수 용도
NO_COLOR=1 색상 출력 비활성화
NO_CLIPBOARD=1 cw path 클립보드 복사 비활성화

안전장치

  • 자동 hooksPath 차단 — 워크트리 생성 시 core.hooksPath=/dev/null (husky 등 중복 실행 방지)
  • dirty 보호cw remove는 기본 안전 모드. 변경사항 있으면 -f 없이 차단
  • 잠금 우선 — 잠긴 워크트리는 remove/clean에서 스킵
  • 머지 체크clean/prune은 기준 브랜치에 실제 머지된 것만 자동 삭제
  • TTY 감지 — 파이프/리다이렉트 시 색상 + 클립보드 복사 자동 비활성

주요 동작 플로우

cw add <folder>

  1. 폴더명 정규화 + 브랜치명 결정 (인자 or worktrees-<folder>)
  2. 기존 브랜치 존재 확인 → 있으면 체크아웃 (base 인자 경고), 없으면 신규 생성
  3. core.hooksPath /dev/null 설정
  4. --lock 시 즉시 잠금
  5. ~/.claude/worktree-init.sh 실행
  6. --no-open 아니면 cd + exec claude --dangerously-skip-permissions

cw clean

  1. 메인 워크트리의 현재 브랜치를 기준으로 선정 (override: cw clean <base>)
  2. 각 워크트리 반복:
    • 잠금 → 스킵
    • detached HEAD → merge-base --is-ancestor 체크
    • 일반 브랜치 → git branch --merged <base> 체크
  3. 삭제 대상: git worktree remove --force + git branch -D
  4. 유지 대상 요약 + 수동 삭제 힌트 출력

제약

  • Darwin/Linux 대상 (Windows 미지원)
  • claude CLI가 PATH에 있어야 open/add 기본 동작 가능 (--no-open으로 우회)
  • cw add 생성 경로는 .claude/worktrees/<folder> 고정. 조회/정리/잠금은 .worktrees/도 인식

About

Claude Worktree — git worktree + claude -w 통합 CLI

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages