概要
provider: claude-terminal が Claude Code v2.1.x で常に Timed out waiting for Claude terminal input prompt. で失敗する。tmux backend のプロンプト検出正規表現が、v2.1 で導入された「❯ の後ろにプレースホルダ文字列が並ぶ表記」と非互換になっている。
再現手順
# Claude Code v2.1.153, tmux 3.6b, takt 0.42.0
mkdir /tmp/takt-test && cd /tmp/takt-test && git init
TAKT_VERBOSE=true takt --pipeline -t "echo hello" -w default
出力(実測):
[INFO] [1/30] plan (planner)
[INFO] Provider: claude-terminal
Status: error
[ERROR] Error: Timed out waiting for Claude terminal input prompt.
[ERROR] Workflow aborted after 1 iterations (1m 0s): Step "plan" failed: ...
原因
src/infra/claude-terminal/tmux-backend.ts:17
const CLAUDE_PROMPT_PATTERN = /^[❯❱>]$/;
isClaudeInputReady は pane 末尾3行を .trim() し、いずれかが上記正規表現に完全一致するかを見る。
しかし Claude Code v2.1.153 が tmux 内で表示する入力欄は以下のとおり(実 pane の hex dump で確認):
────────────────────────────────────────────────────────────────────────────────
❯ Try "fix typecheck errors" ← 末尾3行のうちの1行
────────────────────────────────────────────────────────────────────────────────
⏵⏵ auto mode on (shift+tab to cycle) · ← for agents ◉ xhigh · /effort
- バイト列:
e2 9d af c2 a0 54 72 79 20 22 ...(❯ + NBSP + プレースホルダ)
String.trim() は NBSP を除去するが、文字列内部は残るため ^[❯❱>]$ には一致しない
- 結果として
waitForClaudeInputReady が 60s 待って throw する
v2.0 系では ❯ だけの行が出ていた(unit test もそれを前提)が、v2.1 でプロンプト UI が変更されたのが背景。
修正案
^[❯❱>]$ を「❯/❱/> で始まり、その後ろが空白 or 行末」に緩和する:
const CLAUDE_PROMPT_PATTERN = /^[❯❱>](?:\s|$)/;
Node 検証:
$ node -e "const p=/^[❯❱>](?:\\s|\$)/; ['❯ Try \"x\"', '❯', '>'].forEach(s=>console.log(s,'=>',p.test(s)))"
❯ Try "x" => true
❯ => true
> => true
- BUSY pattern (
Running|thinking|...) は別判定なので、プレースホルダで誤検出はしない("Try" は busy 語彙に含まれない)。
- 信頼ダイアログ
❯ 1. Yes, I trust this folder も該当行が末尾3行に含まれる場合は誤って ready と判定され得るため、初回未信頼ディレクトリでは別途警告/事前信頼が必要。これは本 issue の範囲外。
環境
- takt 0.42.0 (pnpm global install)
- Claude Code 2.1.153
- tmux 3.6b
- macOS Darwin 25.3.0
テスト
src/__tests__/claude-terminal-tmux-backend.test.ts の固定文字列('❯', '❯\n? for shortcuts' など)は引き続き通る。プレースホルダ付き表記 '❯ Try "..."' をカバーするケースを追加すると将来の回帰を防げる。
概要
provider: claude-terminalが Claude Code v2.1.x で常にTimed out waiting for Claude terminal input prompt.で失敗する。tmux backend のプロンプト検出正規表現が、v2.1 で導入された「❯の後ろにプレースホルダ文字列が並ぶ表記」と非互換になっている。再現手順
出力(実測):
原因
src/infra/claude-terminal/tmux-backend.ts:17isClaudeInputReadyは pane 末尾3行を.trim()し、いずれかが上記正規表現に完全一致するかを見る。しかし Claude Code v2.1.153 が tmux 内で表示する入力欄は以下のとおり(実 pane の hex dump で確認):
e2 9d af c2 a0 54 72 79 20 22 ...(❯+ NBSP + プレースホルダ)String.trim()は NBSP を除去するが、文字列内部は残るため^[❯❱>]$には一致しないwaitForClaudeInputReadyが 60s 待って throw するv2.0 系では
❯だけの行が出ていた(unit test もそれを前提)が、v2.1 でプロンプト UI が変更されたのが背景。修正案
^[❯❱>]$を「❯/❱/>で始まり、その後ろが空白 or 行末」に緩和する:Node 検証:
Running|thinking|...) は別判定なので、プレースホルダで誤検出はしない("Try" は busy 語彙に含まれない)。❯ 1. Yes, I trust this folderも該当行が末尾3行に含まれる場合は誤って ready と判定され得るため、初回未信頼ディレクトリでは別途警告/事前信頼が必要。これは本 issue の範囲外。環境
テスト
src/__tests__/claude-terminal-tmux-backend.test.tsの固定文字列('❯','❯\n? for shortcuts'など)は引き続き通る。プレースホルダ付き表記'❯ Try "..."'をカバーするケースを追加すると将来の回帰を防げる。