From session
新規セッションで指定プロンプトを実行。コンテキスト引き継ぎなし。 tmux new-window で cld を起動し、wait-ready + inject-file でプロンプトを送達。 Use when user wants to: spawn new session, run background task, start independent session, run command in new window, says 「spawn」「新しいセッション」「バックグラウンドで」 says 「別ディレクトリで」「コンテキスト付きで」「監視して」 says 「--worktree」「ワークツリーで」
How this skill is triggered — by the user, by Claude, or both
Slash command
/session:spawnThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
新しい tmux ウィンドウで cld を起動し、指定プロンプトを初期入力として実行する。
新しい tmux ウィンドウで cld を起動し、指定プロンプトを初期入力として実行する。
--worktree オプションで独立した git worktree を .worktrees/(隠しディレクトリ、.gitignore に自動追記)に作成し、その中でセッションを起動できる。
会話コンテキストは引き継がない(/fork との違い)。
!ls -d ~/projects/local-projects/*/main 2>/dev/null
ユーザー入力から以下を推定する:
| 意図 | 検出パターン例 | 動作 |
|---|---|---|
| 即実行 | 引数なし | カレントディレクトリで cld-spawn を即座に実行 |
| worktree | --worktree, ワークツリーで | worktree 作成 → cld-spawn --cd(パターン D) |
| cd | 「tradingで」「別ディレクトリで」「paperプロジェクトで」 | AskUserQuestion でプロジェクト選択 |
| window名指定 | 「11というウィンドウで」「window名はXで」 | --window-name オプション使用 |
| bd id | プロンプト中の un-cbi 形式 / #123 数値形式の issue id | BD_ID に格納し命名規約へ反映(後述) |
| prompt | cd 意図なしのテキスト | cld-spawn -- "$PROMPT" を即実行 |
優先順位: worktree > cd > window名指定 > prompt。--worktree と cd 意図が同時検出された場合は --worktree を優先(cd は無視)。
worker セッションを bd issue に紐づけて起動するとき、プロンプト中の bd issue id を BD_ID として特定する。これにより worktree/branch=spawn/<BD_ID>-<HHMMSS>・window=wt-<BD_ID> が生成され、consumer 側(fleet-monitor.sh)が window 名 wt-<id> / worktree パス spawn/<id>-<HHMMSS> の完全一致で worker を ◆ 点灯できる。
BD_ID に直接セットするのが一次経路(信頼境界)。un-cbi 形式・#123 数値形式・**dotted 階層 id(例 un-3sh.3)**に対応する。extract_bd_id "$PROMPT"(session-name.sh)は確実性が低い last resort:
#<digits> (2) 明示アンカー(cell: <id> / bd id: <id> / issue: <id> の直後トークン) (3) bare-slug <prefix>-<slug>。read-only / multi-line 等の hyphenated 英単語にも構造的に一致しうる(常用語は denylist で除外するが網羅ではない)。誤検出を避けたいときは LLM が明示特定した BD_ID を渡すか、プロンプトに cell: <id> アンカーを置くこと。'.' 込みで丸ごと捕捉される(un-3sh 等への誤切詰めはしない)。#123 は 123 に正規化される(# を剥がす)。#123 → window wt-123(既存挙動と整合)。dotted id(un-3sh.3)は内部 '.' を保持し wt-un-3sh.3 / spawn/un-3sh.3-<HHMMSS> になる(consumer が完全一致で復元)。'..' / '/' を含む id は path traversal として拒否される。BD_ID="" のままにする → 現行フォールバック命名(spawn/<HHMMSS>-<pid> / 意味論的 window 名)になり後方互換。session-name.sh の spawn_branch_name / spawn_window_name が SSOT(cld-spawn と共有)。tmux内か確認(tmux外はエラー終了)
意図を推定する
cld-spawn をカレントディレクトリで実行。
DCI で取得したプロジェクト一覧から AskUserQuestion で選択:
どのプロジェクトで起動しますか?
(DCI 一覧からプロジェクト名を選択肢として提示)
プロジェクト選択後、追加オプションを multiSelect で提示:
追加オプション:
□ コンテキスト注入(現在の会話の要約を引き継ぐ)
テキストを prompt として cld-spawn -- "$PROMPT" を実行(PROMPT は '--' の後に置き、
'-' 始まり PROMPT の誤拒否を構造的に封鎖する)。
プロジェクトルート解決:
GIT_COMMON_DIR=$(git rev-parse --git-common-dir)
GIT_COMMON_DIR=$(cd "$GIT_COMMON_DIR" && pwd)
PROJECT_DIR=$(dirname "$GIT_COMMON_DIR")
ブランチ名・worktree パス生成(bd id 連動):
SCRIPT_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
source "$SCRIPT_DIR/session-name.sh"
# bd id を特定(NLU で明示特定した値があれば優先、無ければ prompt から best-effort 抽出)
BD_ID="${BD_ID:-$(extract_bd_id "$PROMPT" 2>/dev/null || true)}"
# bd id 有り: spawn/<id>-<HHMMSS>(fleet-monitor が ◆ 照合する規約名。pid は含めない
# =consumer の末尾 -<数字> 1 回剥がし照合と整合させるため)。1 issue = 1 cell 運用が前提で、
# 同一 id を同一秒に二重 spawn すると branch 名が完全一致するが、git worktree add -b が
# fail-loud で検知する(規約外の二重 spawn を黙って通さない)。
# bd id 無し: spawn/<HHMMSS>-<pid>(フォールバック)。pid 込みのため同一秒の並列 spawn でも distinct。
BRANCH_NAME="$(spawn_branch_name "$BD_ID")"
WORKTREE_DIR="$PROJECT_DIR/.worktrees/$BRANCH_NAME"
.gitignore 冪等追記 → worktree 作成:
# 対象リポジトリの .gitignore に .worktrees/ を冪等追記(git 汚染防止)
GI="$PROJECT_DIR/.gitignore"
if ! { [ -f "$GI" ] && grep -qxF '.worktrees/' "$GI"; }; then
printf '%s\n' '.worktrees/' >> "$GI"
fi
mkdir -p "$(dirname "$WORKTREE_DIR")"
git worktree add -b "$BRANCH_NAME" "$WORKTREE_DIR" main
失敗時はエラーメッセージを表示して終了。
ウィンドウ名決定(bd id 連動):
# bd id 有り: wt-<id>(fleet-monitor が ◆ 照合する規約名。un-cbi → wt-un-cbi / #123 → wt-123)
# bd id 無し: 空 → 時刻ベースフォールバック wt-HHMMSS-$$
WINDOW_NAME="$(spawn_window_name "$BD_ID")"
[[ -z "$WINDOW_NAME" ]] && WINDOW_NAME="wt-$(date +%H%M%S)-$$"
session-comm.sh / session-state.sh は window 名で送達・状態取得するため、各 worker に distinct な window 名を与える(bd id ベース wt-<id> 推奨。無名フォールバックも -$$ で衝突回避)。wt-<完全bd id> と worktree spawn/<完全bd id>-<HHMMSS> は consumer 側の完全一致照合(誤検出ゼロ設計)の producer。両者が規約どおりなら実 worker が ◆ 点灯する。cld-spawn 実行:
--worktree を除いた残りのテキストを PROMPT として使用。
# --bd-id は cld-spawn 側の window 名フォールバック(--window-name 未指定時の wt-<id> 採用)の
# ためにのみ併渡しする(空なら省略可)。ここでは --window-name を明示しているので window 名は
# それが優先され、--bd-id は実質 no-op(cld-spawn は bd id を別途記録しない)。
# PROMPT は必ず '--' の後に置く。'-' 始まりの PROMPT を未知オプション扱いで誤拒否させない
# ための構造的封鎖(cld-spawn は '--' 以降を PROMPT として扱う)。
bash "$SCRIPT_DIR/cld-spawn" --cd "$WORKTREE_DIR" --window-name "$WINDOW_NAME" \
${BD_ID:+--bd-id "$BD_ID"} -- "$PROMPT"
ロールバック: cld-spawn が失敗した場合、作成した worktree を削除:
git worktree remove "$WORKTREE_DIR" 2>/dev/null
git branch -D "$BRANCH_NAME" 2>/dev/null
完了メッセージに worktree パスを含める:
worktree 作成: $WORKTREE_DIR(ブランチ: $BRANCH_NAME)
cld-spawn を実行する
SCRIPT_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
# オプション構築
OPTS=()
[[ -n "$TARGET_DIR" ]] && OPTS+=(--cd "$TARGET_DIR")
[[ -n "$WINDOW_NAME" ]] && OPTS+=(--window-name "$WINDOW_NAME")
# bd id があれば渡す(--window-name 未指定時に cld-spawn が wt-<id> を採用)
[[ -n "$BD_ID" ]] && OPTS+=(--bd-id "$BD_ID")
# PROMPT は必ず '--' の後に置く('-' 始まり PROMPT の誤拒否を構造的に封鎖)。
bash "$SCRIPT_DIR/cld-spawn" "${OPTS[@]}" -- "$FULL_PROMPT"
cld-spawn は以下を順に実行:
session-state.sh wait で input-waiting 状態を待機(デフォルト60秒)session-comm.sh inject-file で送達stdout からウィンドウ名を取得(spawned → tmux window 'WINDOW_NAME' (session: SESSION) の形式。
ウィンドウ名は最初の引用符内。--session 未指定時の spawn 先は現在の session)。
完了監視(WATCH=off 以外、デフォルト ON)
spawn 元のこのセッションが spawn 先の完了を監視し報告する。「投げっぱなし」「監視不要」と指示された場合のみ省略する。
Bash tool の run_in_background: true で以下を起動する。状態を逐次 stdout に出すため経過を追える:
SCRIPT_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
WINDOW_NAME="<Step 3 で取得したウィンドウ名>"
TIMEOUT=300; ELAPSED=0
until bash "$SCRIPT_DIR/session-state.sh" state "$WINDOW_NAME" 2>/dev/null | grep -qx "input-waiting"; do
STATE=$(bash "$SCRIPT_DIR/session-state.sh" state "$WINDOW_NAME" 2>/dev/null || echo exited)
echo "[${ELAPSED}s] $STATE"
{ [ "$STATE" = "exited" ] || [ "$ELAPSED" -ge "$TIMEOUT" ]; } && break
sleep 10; ELAPSED=$((ELAPSED + 10))
done
echo "[final] $(bash "$SCRIPT_DIR/session-state.sh" state "$WINDOW_NAME" 2>/dev/null || echo exited)"
bash "$SCRIPT_DIR/session-comm.sh" capture "$WINDOW_NAME" --lines 30
sleep 10 を短く(例 5)して途中経過(processing)も報告に含める。run_in_background の完了通知を受けたら、capture を下記フォーマットで要約報告する:
# Context from previous session
## 決定事項
- (設計判断、技術選定など)
## 技術制約
- (プロジェクト固有の制約、禁止事項など)
## 関連ファイル
- (議論で参照されたファイルパス)
## 補足
- (その他の重要なコンテキスト)
pwd が引き継がれる--worktree の worktree は対象リポジトリの .worktrees/ に作成し、.gitignore に自動追記する(git 汚染防止)--worktree で作成した worktree は手動管理(自動削除しない)。不要時は worktree-delete で削除--worktree は git リポジトリ内でのみ使用可能(bare repo 構造を前提)Guides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Implements work from a spec or tickets using TDD at agreed seams, with regular typechecking and test runs, followed by code review.
npx claudepluginhub shuu5/cc-session --plugin session