How this skill is triggered — by the user, by Claude, or both
Slash command
/tmux-plugin:tmux-issue-roomThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Issue専用の開発環境をtmux上に構築する。
Issue専用の開発環境をtmux上に構築する。
<issue-number> → gh issue view → ブランチ名生成 → worktree作成 → tmuxレイアウト構築
スキル実行前に以下を確認:
gh CLIが利用可能かtmux セッション内か($TMUX 変数の存在)— 非tmux時はworktree作成とパス出力のみif ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "Error: gitリポジトリ内で実行してください"
exit 1
fi
if ! command -v gh >/dev/null 2>&1; then
echo "Error: gh CLIがインストールされていません"
exit 1
fi
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")
ISSUE_NUMBER="$1" # 引数から取得。未指定なら質問する
if [ -z "$ISSUE_NUMBER" ] || ! echo "$ISSUE_NUMBER" | grep -qE '^[0-9]+$'; then
echo "Error: 有効なIssue番号を指定してください(例: 45)"
exit 1
fi
# Issue情報をJSON形式で取得
ISSUE_JSON=$(gh issue view "$ISSUE_NUMBER" --json title,body,labels,assignees,url)
ISSUE_TITLE=$(echo "$ISSUE_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['title'])")
ISSUE_URL=$(echo "$ISSUE_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['url'])")
ISSUE_LABELS=$(echo "$ISSUE_JSON" | python3 -c "
import sys, json
labels = json.load(sys.stdin).get('labels', [])
print(', '.join(l['name'] for l in labels)) if labels else print('none')
")
# タイトルからslugを生成
TITLE_SLUG=$(printf '%s' "$ISSUE_TITLE" | \
tr '[:upper:]' '[:lower:]' | \
sed 's/[^a-z0-9]/-/g; s/--*/-/g; s/^-//; s/-$//' | \
cut -c1-40)
BRANCH="issue-${ISSUE_NUMBER}-${TITLE_SLUG}"
tmux-worktreeスキルと同等のロジック。
WORKTREE_BASE="${CLAUDE_WORKTREE_DIR:-$(dirname "$REPO_ROOT")/${REPO_NAME}.worktrees}"
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 }
}
'
}
EXISTING_PATH=$(find_worktree_by_branch "$BRANCH")
if [ -n "$EXISTING_PATH" ]; then
WORKTREE_PATH="$EXISTING_PATH"
echo "既存のworktreeを使用: ${WORKTREE_PATH}"
else
BRANCH_HASH=$(printf '%s' "$BRANCH" | shasum | cut -c1-6)
BRANCH_SLUG=$(printf '%s' "$BRANCH" | sed 's/[^A-Za-z0-9._-]/-/g; s/--*/-/g; s/^-//; s/-$//' | cut -c1-60)
case "$BRANCH_SLUG" in
""|"."|"..") BRANCH_SLUG="branch" ;;
esac
BRANCH_SLUG="${BRANCH_SLUG}-${BRANCH_HASH}"
WORKTREE_PATH="${WORKTREE_BASE}/${BRANCH_SLUG}"
# 書き込み権限チェック + フォールバック
if ! mkdir -p "${WORKTREE_BASE}" 2>/dev/null; then
WORKTREE_BASE="${TMPDIR:-/tmp}/${REPO_NAME}.worktrees"
WORKTREE_PATH="${WORKTREE_BASE}/${BRANCH_SLUG}"
mkdir -p "${WORKTREE_BASE}"
fi
# デフォルトブランチから分岐
DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||')
if [ -z "$DEFAULT_BRANCH" ]; then
DEFAULT_BRANCH="main"
fi
git worktree add -b "${BRANCH}" "${WORKTREE_PATH}" "${DEFAULT_BRANCH}"
fi
if [ -n "$TMUX" ]; then
WINDOW_NAME="issue-${ISSUE_NUMBER}"
# メインpane: worktreeディレクトリで開く
tmux new-window -n "${WINDOW_NAME}" -c "${WORKTREE_PATH}"
else
echo "Worktree created: ${WORKTREE_PATH}"
echo "cd ${WORKTREE_PATH}"
fi
tmuxレイアウト構築後、以下を表示する:
Issue #<number>: <title>
URL: <url>
Labels: <labels>
Branch: <branch>
Worktree: <path>
Claudeがプロジェクト構造を分析し、Issue内容に関連するファイルを特定して提示する。
作業完了後は tmux-worktree delete <branch> と同等の操作で環境を削除する。
gh issue view のエラーメッセージを表示npx claudepluginhub caphtech/claude-marketplace --plugin tmux-pluginStarts GitHub issue in new tmux window: validates prereqs, fetches code, creates/reuses worktree, launches Claude Code, sends start command.
Resolves GitHub issues via isolated git worktrees, TDD implementation, and PR creation with auto-close keywords. Use for 'fix issue' requests or /resolve-issues invocation.
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.