diff --git a/configs/cli/claude/CLAUDE.md b/configs/cli/claude/CLAUDE.md index 5c426d58..fa6a71f2 100644 --- a/configs/cli/claude/CLAUDE.md +++ b/configs/cli/claude/CLAUDE.md @@ -23,7 +23,9 @@ Chromeは2026-08-30に撤去した(Claude in Chrome拡張ごと)。拡張が `terminal-browser action -- snapshot|click|fill|eval`。ssh越しも可 (`open --ssh user@host `)。終わったら`terminal-browser shutdown`。 **必ず見えるペインを開く**(TTYが無くても右に分割する)ので、ユーザーの - 目視が要らない場面では2で粘る。 + 目視が要らない場面では2で粘る。フォーカスは奪わない(上流は`--focus`を決め打ちで + 渡すが、stdoutが端末でないときは外すようパッケージ側で当ててある)。人が打った + ときだけ移る。常に移したいなら`TERMINAL_BROWSER_FOCUS=1`。 Playwrightからは掴めない: CDPは出しているが**ポートが毎回変わる** (実測 53218 → 53337)ので、固定の`--cdp-endpoint`にできない。`action`で操作する。 herdrの`[experimental] kitty_graphics`が要る(既定false)。切れているとペインは diff --git a/nix/pkgs/terminal-browser.nix b/nix/pkgs/terminal-browser.nix index 57a17ebc..f28a503b 100644 --- a/nix/pkgs/terminal-browser.nix +++ b/nix/pkgs/terminal-browser.nix @@ -42,6 +42,18 @@ stdenvNoCC.mkDerivation (finalAttrs: { # ここでは実害が分かりやすく、署名が壊れた Electron は起動せず --help すら返さない。 find . -name '._*' -delete find . -name '.DS_Store' -delete + + # ペインを分けたときにフォーカスを奪わせない。terminal-browser は herdr の split に + # `--focus` を決め打ちで渡すので、エージェントが裏で 1 枚開くたびにユーザーの + # 入力先がブラウザのペインに飛ぶ。分割の後は全部明示的な pane id で動いている + # (swap も pane run も newPaneId を渡している) ので、外しても壊れない。 + # 環境変数で切り替える形にして、判断は bin ラッパー側に置く。 + # cli/dist/main.js は .app の外なので、ここを触っても同梱 Electron の署名は無事。 + # cmux 側にも "--focus" があるが、そちらは別のリテラルなので巻き込まない。 + substituteInPlace cli/dist/main.js \ + --replace-fail \ + '["--pane", from.id, "--direction", native, "--focus", ...ratio]' \ + '["--pane", from.id, "--direction", native, ...(process.env.TERMINAL_BROWSER_NO_FOCUS ? [] : ["--focus"]), ...ratio]' mkdir -p $out/libexec/terminal-browser $out/bin cp -R . $out/libexec/terminal-browser/ # bin/terminal-browser は自分の symlink を辿ってバンドルを見つける /bin/sh ラッパーなので、 @@ -83,6 +95,16 @@ stdenvNoCC.mkDerivation (finalAttrs: { # main.js は ~/.config に置かれるので、自分の居場所から CLI を辿れない。実体を渡す。 TERMINAL_BROWSER_CLI="\$real" export TERMINAL_BROWSER_CLI + + # 分割したペインにフォーカスを移すかどうか。人が打ったなら移す (見るために開いた + # はずなので)。エージェントが開いたなら移さない — 裏で 1 枚開くたびに入力先が + # ブラウザに飛ぶと、ユーザーが打っている最中に持っていかれる。 + # 見分けは stdout が端末かどうか。エージェントはパイプ越しに叩くのでここで分かれる。 + # TERMINAL_BROWSER_FOCUS=1 を置けば常に移す。 + if [ ! -t 1 ] && [ "\''${TERMINAL_BROWSER_FOCUS:-}" != 1 ]; then + TERMINAL_BROWSER_NO_FOCUS=1 + export TERMINAL_BROWSER_NO_FOCUS + fi exec "\$real" "\$@" WRAPPER sed -i -e 's/^ //' $out/bin/terminal-browser