Skip to content

fix: detect claude-terminal prompt with v2.1 placeholder hint#766

Merged
nrslib merged 2 commits into
nrslib:mainfrom
hiranorrr:fix/claude-terminal-prompt-pattern-v21
May 29, 2026
Merged

fix: detect claude-terminal prompt with v2.1 placeholder hint#766
nrslib merged 2 commits into
nrslib:mainfrom
hiranorrr:fix/claude-terminal-prompt-pattern-v21

Conversation

@hiranorrr
Copy link
Copy Markdown
Contributor

@hiranorrr hiranorrr commented May 28, 2026

Summary

  • provider: claude-terminal の tmux backend が Claude Code v2.1.x のプロンプト UI と非互換で、入力欄を検出できず 60s で Timed out waiting for Claude terminal input prompt. と落ちる問題を修正
  • 検出パターン ^[❯❱>]$^[❯❱>](?:\s|$) に緩和し、❯ Try "..." 形式でも ready と判定されるように
  • 同パターンに対する回帰テストを追加

Refs #765

背景

Claude Code v2.0 系では tmux pane 末尾に 単独の行が出ていたが、v2.1.x で入力欄が ❯ Try "refactor routing.ts" のようなプレースホルダ付き表記に変わった(pane の hex dump で e2 9d af c2 a0 54 72 79 ... を確認)。isClaudeInputReady.trim() 後の各行が ^[❯❱>]$ に完全一致するかを見ていたため、v2.1 以降では永久に ready と判定されなくなっていた。

BUSY 判定 (Running|thinking|Searching|Reading|Writing|Editing|Crunched) は別途行われており、プレースホルダ文字列 (Try ...) はそのいずれにも一致しないため、緩和による誤検出は発生しない。

Test plan

  • npm run build 成功
  • npm run lint 成功
  • npm test: 6154 tests passed
  • npm run test:e2e:mock: 107 tests passed
  • 新規回帰テスト Given Claude v2.1 pane with placeholder hint after prompt char, ... が通る
  • reviewer 側で実環境 (Claude Code v2.1.x + tmux) における takt --pipeline -t "..." -w default の通過確認

🤖 Generated with Claude Code

Summary by CodeRabbit

Bug Fixes

  • Claude v2.1 環境でのプロンプト認識を改善しました。プロンプト直後の空白やヒント表示を正しく扱い、入力準備の検出が安定します。
  • 貼り付け動作に関する追加テストを導入し、信頼ダイアログ表示時やプロンプト直後のヒントがある場合でも期待どおりに入力が渡されることを検証しました。

Review Change Stack

The tail-line regex required the prompt line to be exactly `❯` (or `❱` / `>`),
but Claude Code v2.1 renders the input row as `❯ Try "..."` so the regex never
matches and `waitForClaudeInputReady` times out after 60s.

Relax the pattern to `^[❯❱>](?:\s|$)` so any prompt char followed by whitespace
(or end-of-line) is accepted. The busy pattern still gates ready-detection, so
the placeholder hint cannot cause a false positive.

Refs nrslib#765

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 28, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f7bf0408-e353-4f64-8f68-3c0dc113873c

📥 Commits

Reviewing files that changed from the base of the PR and between 9d56f47 and 6d857fa.

📒 Files selected for processing (2)
  • src/__tests__/claude-terminal-tmux-backend.test.ts
  • src/infra/claude-terminal/tmux-backend.ts

📝 Walkthrough

Walkthrough

プロンプト判定正規表現を拡張し、信頼ダイアログ表示時とプレースホルダーヒント付きプロンプトの両方について pasteText の振る舞いを検証するテストを追加しました。

Changes

プロンプト検出パターン拡張と pasteText テスト

Layer / File(s) Summary
プロンプトパターンの正規表現更新
src/infra/claude-terminal/tmux-backend.ts
CLAUDE_PROMPT_PATTERN を修正し、プロンプト文字 ❯❱> の直後に空白が続くか行末で終了するケースを入力準備として検出できるように拡張しました。
pasteText テスト(信頼ダイアログが表示される場合)
src/__tests__/claude-terminal-tmux-backend.test.ts
Claude の信頼ダイアログ(番号付きメニュー)を含む capture-pane 出力では準備完了と扱わないことを検証し、遷移後にプロンプト貼り付け〜send-keysdelete-buffer が実行されることを確認するテストを追加しました。
pasteText テスト(プレースホルダーヒント付きプロンプト)
src/__tests__/claude-terminal-tmux-backend.test.ts
Claude v2.1 の「プロンプト記号直後にプレースホルダーヒントが続く」出力を再現し、pasteText が準備完了と判定して tmux 呼び出し列(capture-panepaste-buffercapture-panesend-keysdelete-buffer)および stdin への書き込みが期待通りになることを検証するテストを追加しました。

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

Possibly related PRs

  • nrslib/takt#748: tmux バックエンドのプロンプト待ち・貼り付けシーケンス改善に関連する変更を含み、同領域の安定化テストと重なります。
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed プルリクエストのタイトルは、主要な変更内容(Claude v2.1のプレースホルダーヒント付きプロンプト検出の修正)を正確かつ簡潔に説明しており、変更セットの中心的な目的と合致している。
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

The previous regex `^[❯❱>](?:\s|$)` accepted lines like `❯ 1. Yes, I trust
this folder` as a ready prompt, which would cause `pasteText` to silently
forward the user's prompt body into a trust/permission dialog instead of
the real input box. The old `^[❯❱>]$` failed-loud with a 60s timeout in
this scenario; the v2.1 fix re-introduced it as a silent regression.

Tighten the pattern with a negative lookahead so any `<prompt> <digit>.`
sequence (numbered menus) is rejected, and add a regression test that
proves the trust dialog stays not-ready until claude transitions to a
real input row.

Refs nrslib#765

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hiranorrr
Copy link
Copy Markdown
Contributor Author

レビューサマリー

総合判定: APPROVE

サマリー

PR #766(claude-terminal の v2.1 プロンプト検出パターン修正)に対する 6 観点レビューはすべて APPROVE。要件 7 項目(v2.1 検出 / NBSP 対応 / 信頼ダイアログ回避 / BUSY 両立 / v2.0 リグレッションなし / 回帰テスト 2 件)はいずれも実コード(src/infra/claude-terminal/tmux-backend.ts:16)とテスト(src/__tests__/claude-terminal-tmux-backend.test.ts:199-277)で充足を確認。番号付きメニュー除外はスコープ拡大に見えるが、緩和パターン採用時に信頼ダイアログが新規 ready 誤判定となる問題を防ぐため必須で、スコープ判定としても妥当。

レビュー結果

レビュー 結果 主要な発見
アーキテクチャ APPROVE 単一責務・infra層に閉じた regex 1 行変更。リグレッションテスト 2 件で挙動固定。REJECT 該当なし
セキュリティ APPROVE ReDoS なし(先頭アンカー+ネスト量化なし)。信頼ダイアログ誤マッチ排除により silent な trust 確立を防止し、信頼境界を後退させない
QA APPROVE リグレッションテスト追加済み。NBSP 明示テスト不足と多桁メニュー境界テスト不足は Warning 止まり
テスト APPROVE Given-When-Then 構造、モック境界、独立性すべて適切。ブロッキング指摘なし
AIアンチパターン APPROVE 仮定・API 実在・コンテキスト適合いずれも問題なし。PR description と実装最終形の乖離は参考情報
要件充足 APPROVE 4 要件 + 派生 3 要件すべて実コード/テストで充足。番号メニュー除外のスコープ拡大も正当性あり

今回の指摘(new)

# finding_id 重大度 ソース 場所 問題 修正案
- - - - - ブロッキング指摘なし -

継続指摘(persists)

# finding_id ソース 前回根拠 今回根拠 問題
- - - - - なし(このワークフロー run の初回レビュー)

解消済み(resolved)

finding_id ソース 解消根拠
- - 前回レポートなし

改善提案

  • (QA Warning) NBSP テスト明示化: src/__tests__/claude-terminal-tmux-backend.test.tsv21ReadyPane❯\u00A0Try "..." ケースを 1 件追加。現行 \s+ は NBSP を含むため通るが、将来パターンが ASCII space 限定に絞られた際のリグレッション検知が可能になる
  • (QA Warning) 境界値テスト追加: (a) ❯ 10. Option Ten を not-ready 扱いするケース、(b) ❱ Try "..." を ready 扱いするケースを各 1 件追加。多桁メニューと /> 始まりプロンプトの同値分割を明示
  • (AI Warning) PR 本文更新: PR description のサンプル /^[❯❱>](?:\s|$)/ が実装最終形 /^[❯❱>](?:\s+(?!\d+\.\s)|$)/ と乖離。文書整合性のため PR 本文を実装に合わせて更新することを推奨
  • (検証ギャップ・参考) 実 Claude Code v2.1.x + tmux 環境での takt --pipeline エンドツーエンド検証は PR 作成者・本レビュー双方で未実施。マージ前に手元での疎通確認を 1 回行うとリスクが下がる

REJECT判定条件

  • new 0 件、persists 0 件、reopened 0 件のため REJECT 条件を満たさない
  • 全 6 レビューが APPROVE、要件 7 項目すべて充足、スコープ拡大は正当性あり、Warning 3 件はいずれも非ブロッキングのため APPROVE

@nrslib
Copy link
Copy Markdown
Owner

nrslib commented May 29, 2026

ありがとうございます
こちらマージさせていただきます!

@nrslib nrslib merged commit de7e021 into nrslib:main May 29, 2026
4 checks passed
@nrslib nrslib mentioned this pull request May 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants