Skip to content

fix(claude-mobile): сбрасывать режимы терминала при отсоединении - #1

Open
dudkin-2005 wants to merge 1 commit into
HelpFreedom:mainfrom
dudkin-2005:fix/detach-terminal-modes
Open

fix(claude-mobile): сбрасывать режимы терминала при отсоединении#1
dudkin-2005 wants to merge 1 commit into
HelpFreedom:mainfrom
dudkin-2005:fix/detach-terminal-modes

Conversation

@dudkin-2005

@dudkin-2005 dudkin-2005 commented Aug 3, 2026

Copy link
Copy Markdown

Проблема

После Ctrl+\ терминал начинает печатать мусор при каждом движении мыши, а вставка из буфера ломается.

Claude Code при старте включает репортинг мыши (?1000h/?1002h/?1006h) и bracketed paste (?2004h). attach.js прокидывает вывод PTY в реальный TTY байт-в-байт, так что эти последовательности применяются к терминалу пользователя. При отсоединении сессия остаётся жива в хранителе — то есть тот, кто эти режимы включил, никогда не пришлёт парный сброс. cleanup() выключал только raw-режим stdin.

Воспроизводится на любом терминале, я ловил на WSL2 + Windows Terminal.

Решение

cleanup() теперь сбрасывает режимы сам. Оба выхода из зеркалирования идут через die()cleanup(): Ctrl+\ и завершение самой сессии. Ветки -l, --qr, --device в raw-режим не входят, им сброс безвреден.

Alt screen (?1049l) намеренно не трогаю: Claude Code рисует в обычном буфере, и слепой сброс стёр бы вывод сессии, который пользователь только что смотрел.

Заодно — установка claude-mobile

README описывает утилиту, но не говорит, как её получить: в PATH она сама не появляется. Добавил шаг с симлинком на bridge/attach.js в оба README (RU/EN) и выставил бит исполнения на файле — шебанг у него уже был.

Проверка

  • node --check bridge/attach.js
  • вживую: claude-mobileCtrl+\ → мышь больше не печатается, вставка работает; сессия остаётся живой и видна с телефона

Отдельно, не в этом PR: правила в .gitignore записаны с комментарием на той же строке (bridge/config.json # личные пути/прокси), а gitignore такого не поддерживает — комментарий становится частью паттерна. git check-ignore показывает, что bridge/config.json, bridge/pairings.json и bridge/internet.json сейчас не игнорируются ничем; сертификаты спасает только *.pem/*.key ниже. Учитывая, что в pairings.json лежат токены доверенных устройств, стоит починить — могу прислать отдельным PR, если интересно.

🤖 Generated with Claude Code

Claude Code enables mouse reporting and bracketed paste inside the PTY,
and attach.js pipes PTY output to the real TTY verbatim. On Ctrl+\ the
session stays alive, so nobody ever sends the matching reset sequences:
the terminal keeps reporting mouse movement as escape garbage and keeps
expecting bracketed paste.

cleanup() now resets those modes itself. Both exits from mirroring go
through die() -> cleanup(): Ctrl+\ and session exit.

Alt screen (?1049l) is deliberately left alone — Claude Code draws in the
normal buffer, and a blind reset would wipe the session output.

Also document installing claude-mobile as a symlink to bridge/attach.js
(RU + EN README); the exec bit is now set in the repo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PiXf3gNxZZqcRMVqWkF8Y9
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.

1 participant