From zellij-plugin
git worktreeを作成してzellij tabで開く。worktree削除とクリーンアップも行う。「worktreeを作って」「ブランチをworktreeで開いて」「worktreeを削除して」「worktreeを一覧して」と言われた時に使用する。
How this skill is triggered — by the user, by Claude, or both
Slash command
/zellij-plugin:zellij-worktreeThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
git worktreeをzellij tabとして管理する。
git worktreeをzellij tabとして管理する。
create <branch> → git worktree add → zellij action new-tab
delete <branch> → zellij action close-tab → git worktree remove
list → git worktree list
スキル実行前に以下を確認:
zellij セッション内か($ZELLIJ 変数の存在)— 非zellij時はworktree操作のみ行いパスを出力# メインリポジトリの特定
COMMON_DIR=$(cd "$(git rev-parse --git-common-dir)" && pwd)
ABS_GIT_DIR=$(cd "$(git rev-parse --absolute-git-dir)" && pwd)
if [ "$COMMON_DIR" != "$ABS_GIT_DIR" ]; then
REPO_ROOT=$(dirname "$COMMON_DIR")
else
REPO_ROOT=$(git rev-parse --show-toplevel)
fi
REPO_NAME=$(basename "$REPO_ROOT")
復元失敗時のフォールバック: git worktree list --porcelain の最初のworktreeエントリがメインrepo。
WORKTREE_BASE="${CLAUDE_WORKTREE_DIR:-$(dirname "$REPO_ROOT")/${REPO_NAME}.worktrees}"
../<repo-name>.worktrees/<branch-slug>/CLAUDE_WORKTREE_DIR で上書き可能# ブランチ名のハッシュ(決定論的、create/delete間で安定)
BRANCH_HASH=$(printf '%s' "$BRANCH" | shasum | cut -c1-6)
# 読みやすいslug + 常にハッシュを付加して一意性を保証
BRANCH_SLUG=$(printf '%s' "$BRANCH" | sed 's/[^A-Za-z0-9._-]/-/g; s/--*/-/g; s/^-//; s/-$//' | cut -c1-60)
# パストラバーサル防止 + 空slug対策
case "$BRANCH_SLUG" in
""|"."|"..") BRANCH_SLUG="branch" ;;
esac
BRANCH_SLUG="${BRANCH_SLUG}-${BRANCH_HASH}"
WORKTREE_PATH="${WORKTREE_BASE}/${BRANCH_SLUG}"
<readable-slug>-<branch-hash> 形式で常に一意feature/a と feature-a の衝突を回避)deleteやcreateの既存チェックでは、slugの再計算ではなく git worktree list --porcelain からブランチ名でパスを逆引きする。これによりslug計算の不一致によるバグを防ぐ。
# ブランチ名からworktreeパスを逆引き
find_worktree_by_branch() {
git worktree list --porcelain | awk -v branch="$1" '
/^worktree / { path = substr($0, 10) }
/^branch refs\/heads\// {
b = substr($0, 19)
if (b == branch) { print path; exit }
}
'
}
引数: ブランチ名(必須)。未指定なら質問する。
# 1. 既存チェック(ブランチ名で逆引き)
EXISTING_PATH=$(find_worktree_by_branch "$BRANCH")
if [ -n "$EXISTING_PATH" ]; then
echo "Worktree already exists: ${EXISTING_PATH}"
if [ -n "$ZELLIJ" ]; then
TAB_NAME=$(basename "$EXISTING_PATH")
zellij action go-to-tab-name "${TAB_NAME}" 2>/dev/null || true
fi
exit 0
fi
# 2. slug化とパス決定(上記slug生成を使用)
# 3. 書き込み権限チェック + フォールバック
if ! mkdir -p "${WORKTREE_BASE}" 2>/dev/null; then
WORKTREE_BASE="${TMPDIR:-/tmp}/${REPO_NAME}.worktrees"
BRANCH_SLUG="${BRANCH_SLUG}" # slug自体は変わらない
WORKTREE_PATH="${WORKTREE_BASE}/${BRANCH_SLUG}"
mkdir -p "${WORKTREE_BASE}"
fi
# 4. worktree作成
if git show-ref --verify --quiet "refs/heads/${BRANCH}"; then
git worktree add "${WORKTREE_PATH}" "${BRANCH}"
elif REMOTE_REF=$(git branch -r --list "*/${BRANCH}" | head -1 | xargs); [ -n "$REMOTE_REF" ]; then
git worktree add --track -b "${BRANCH}" "${WORKTREE_PATH}" "$REMOTE_REF"
else
git worktree add -b "${BRANCH}" "${WORKTREE_PATH}"
fi
# 5. zellij tabを作成(zellij環境の場合のみ)
if [ -n "$ZELLIJ" ]; then
zellij action new-tab --name "${BRANCH_SLUG}" --cwd "${WORKTREE_PATH}"
else
echo "Worktree created: ${WORKTREE_PATH}"
echo "cd ${WORKTREE_PATH}"
fi
引数: ブランチ名(必須)。未指定なら list の結果から選択を促す。
slugを再計算せず、ブランチ名からworktreeパスを逆引きして削除する。
# 1. ブランチ名からworktreeパスを逆引き
WORKTREE_PATH=$(find_worktree_by_branch "$BRANCH")
if [ -z "$WORKTREE_PATH" ]; then
echo "Error: No worktree found for branch '${BRANCH}'"
git worktree list
exit 1
fi
# メイン作業ツリーの削除を防止
MAIN_TOPLEVEL=$(cd "$REPO_ROOT" && pwd)
WORKTREE_RESOLVED=$(cd "$WORKTREE_PATH" && pwd)
if [ "$WORKTREE_RESOLVED" = "$MAIN_TOPLEVEL" ]; then
echo "Error: Cannot delete main working tree"
exit 1
fi
TAB_NAME=$(basename "$WORKTREE_PATH")
# 2. Guard: 削除前の安全チェック
WARNINGS=""
# 未commitの変更チェック
DIRTY=$(git -C "$WORKTREE_PATH" status --porcelain 2>/dev/null)
if [ -n "$DIRTY" ]; then
WARNINGS="${WARNINGS}\n⚠ 未commitの変更があります:\n${DIRTY}\n"
fi
# 未pushのコミットチェック
UNPUSHED=$(git -C "$WORKTREE_PATH" log @{u}.. --oneline 2>/dev/null)
if [ -n "$UNPUSHED" ]; then
WARNINGS="${WARNINGS}\n⚠ 未pushのコミットがあります:\n${UNPUSHED}\n"
fi
# 注: zellijではpane内の実行中プロセスを外部から検出するAPIがないため、
# tmux版のような実行中プロセスチェックは行えない。
# zellij自体がタブ/pane閉じ時に確認プロンプトを表示する。
# 警告がある場合はユーザーに確認を求める
if [ -n "$WARNINGS" ]; then
printf '%s\n' "$WARNINGS"
echo "---"
echo "このworktreeを削除しますか?ユーザーに確認してください。"
echo "確認が取れるまで以降の削除処理を実行しないこと。"
exit 0
fi
# 3. zellij tabを閉じる(worktree削除前に実行 — cwdが消える前にタブを閉じる)
if [ -n "$ZELLIJ" ]; then
zellij action go-to-tab-name "${TAB_NAME}" 2>/dev/null && \
zellij action close-tab 2>/dev/null || true
fi
# 4. worktreeを削除
git worktree remove "${WORKTREE_PATH}"
# 5. 空ディレクトリの掃除
WORKTREE_BASE=$(dirname "$WORKTREE_PATH")
rmdir "${WORKTREE_BASE}" 2>/dev/null || true
引数なし。現在のworktreeを表示。
echo "=== Git Worktrees ==="
git worktree list
注: zellijにはtab一覧を取得するCLIコマンドが限定的なため、git worktree list のみ表示する。
git worktree prune --expire now を実行してリトライ$ZELLIJ で判定)--git-common-dir 復元失敗時: git worktree list --porcelain の最初のエントリからメインrepoパスを取得npx claudepluginhub caphtech/claude-marketplace --plugin zellij-pluginAutomates Git worktree creation for isolated feature branches, listing, removal, and status checks. Copies env files like .env/.nvmrc and runs npm/yarn/pnpm/bun install.
Manages git worktrees for isolated parallel development sessions with safety checks for uncommitted changes and unpushed commits.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.