headless terminal CLI
CLI и скилл для управления терминальными интерфейсами из агента: фоновая сессия, клавиши и снимок экрана
- 122 ★ репозитория
- Последний коммит
- MIT
Широкий доступ
Почему такой уровень
- Запускает произвольные программы и вводит в них нажатия клавиш, включая оболочку.
Установка
- Работает в
Ручная установка
brew install montanaflynn/tap/htПервая команда раздела Install. Затем скилл: `npx skills add montanaflynn/headless-terminal --skill headless-terminal`.
Доступ и проверки
Как мы проверяемШирокий доступИнструмент может менять данные, выполнять команды или работать с секретами.
- Запускает произвольные программы и вводит в них нажатия клавиш, включая оболочку.
Это чужой код. Посмотрите файлы в репозитории перед установкой.
Что делает
headless terminal (команда `ht`) работает как Puppeteer для терминальных интерфейсов. Демон на Unix-сокете держит псевдотерминал для каждой сессии и пропускает вывод через `libghostty-vt`, эмулятор из приложения Ghostty. Программа запускается в фоне, агент отправляет нажатия клавиш, ждет завершения перерисовки и получает снимок экрана текстом или PNG. Примеры: `ht run --name notes vim /tmp/notes.md` запускает сессию, `ht send notes "ihello from an agent<Esc>:wq<CR>" --view` вводит текст и сохраняет файл, `ht remove notes` удаляет сессию. Клавиши записываются в нотации vim (`<CR>`, `<Esc>`, `<C-c>`). Ключ `--wait-idle 200ms` ждет затишья вывода, а `ht view demo --format png` отдает картинку. Так агент работает с `git add -p`, `gh auth login`, `create-next-app`, отладчиками и самим `vim`.
Для кого. Разработчикам, которые хотят, чтобы агент работал с интерактивными терминальными программами, а также тестировщикам TUI.
Подходит, если
- Агент должен пройти интерактивный `git add -p` или `gh auth login`.
- Нужно автоматизировать редактирование файла в `vim` или `emacs`.
- В CI проверяют, что TUI отрисовывается так, как ожидалось.
- Нужен скриншот терминальной программы в PNG из скрипта.
Не подходит, если
- Достаточно обычных неинтерактивных команд.
- Вы работаете на Windows: сборки есть для macOS и Linux.
- Агенту нельзя давать выполнение произвольных программ в терминале.
Пример запроса к агенту
Запусти `vim` в фоновой сессии, введи текст в файл, сохрани и покажи содержимое экрана перед выходом.Ограничения
Готовые сборки выпущены для macOS (arm64) и Linux (amd64, arm64), для Windows их нет. Демон и клиент общаются через Unix-сокет. Через `ht` агент может запустить любую программу и вводить в нее любые клавиши, включая оболочку, поэтому права агента на машине ограничивает система разрешений клиента, сам `ht` их не сужает. Сессии остаются в фоне, пока их не удалят (`ht remove`), не оставляйте их с открытым доступом к секретам. Установка скилла через `npx skills add` или копированием в Claude Code. Лицензия MIT.
Как отключить. Удалите сессии командой `ht remove <имя>`, бинарь `ht` через `brew uninstall ht` (или вручную из `PATH`) и папку скилла из каталога навыков.
Частые вопросы
Как установить ht?
Выполните `brew install montanaflynn/tap/ht`. Есть архивы релизов для `darwin-arm64`, `linux-amd64` и `linux-arm64`, они распаковываются командой `tar xz`.
Как подключить скилл?
Командой `npx skills add montanaflynn/headless-terminal --skill headless-terminal`, она сама подберет путь для Claude Code, Codex, Cursor и Gemini. Запасной вариант — положить папку в Claude Code вручную.
Чем он отличается от обычного запуска команды?
Он создает псевдотерминал, отслеживает курсор и стили и умеет ждать перерисовки, чего нет у оболочки без терминала.
Можно ли наблюдать сессию?
Да, за сессией можно следить из другой оболочки в реальном времени.
Что использует для разбора вывода?
`libghostty-vt`, парсер VT из эмулятора Ghostty.
Обсуждение
Вопросов и отзывов пока нет.
Похожие
CLI-инструментыТерминал для macOS с CLI termio и скиллом: агенты порождают соседние сессии, а вы видите, какому из них нужен ответ
Скилл tty7 учит Claude Code и Codex управлять панелями терминала tty7: запускать команды в настоящем PTY, читать экран и передавать работу другому агенту
term-cli запускает интерактивные программы для агента в tmux-сессиях, а человек вводит пароли и MFA через term-assist.
CLI на Rust с терминальным переключателем между кодинг-агентами: список, проверка готовности, выбор активного, предпросмотр команд
Терминальная оболочка для кодовых агентов: встроенные терминалы, git, файлы, задачи td и рабочие деревья рядом
Расширение Pi запускает vim, psql, ssh и другие интерактивные программы в окне, где вы следите и можете перехватить ввод.
Коротко о README
Репозиторий содержит CLI на Go, демон и скилл с рецептами и справочником клавиш. Примеры показывают работу с `vim`, CI-проверки и скриншоты.
Бейдж для README
Исходный SKILL.md
--- name: headless-terminal description: Drive interactive terminal programs (vim, emacs, nethack, htop, CLI installers, REPLs, anything curses-based) headlessly via the `ht` CLI. Use when the task needs a program that expects a real TTY — won't run under plain pipes, draws to an alternate screen, or needs keystrokes like arrow keys, Ctrl-C, or function keys. Do not use for non-interactive commands that work fine with plain shell pipes. license: MIT compatibility: Requires the ht CLI (v0.1.0+) on macOS (Apple Silicon) or Linux. metadata: author: Montana Flynn version: "1.0" homepage: https://github.com/montanaflynn/headless-terminal --- # ht — headless terminal `ht` is a daemon that owns a pseudo-terminal per session and parses output with the same VT engine Ghostty uses. You can launch a TUI, send keystrokes, snapshot the rendered screen, and block until a screen condition is met. ## Install ht Check if the CLI is on `PATH`; if not, install it: ```sh command -v ht || brew install montanaflynn/tap/ht ``` Without Homebrew, grab a tarball from the [releases page](https://github.com/montanaflynn/headless-terminal/releases) and move the binary onto `PATH`. macOS (Apple Silicon) and Linux (x86_64/arm64) only. ## When to reach for this - Target program draws to the alternate screen / uses (n)curses / reads `$TERM`. - Needs real keystrokes (arrow keys, `<C-c>`, `<F5>`), not just stdin text. - You need to inspect the *rendered* screen state, not the raw output byte stream. If the program works with `echo ... | cmd`, use a plain pipe — don't reach for ht. ## Core workflow ``` ht run --name S <cmd...> # launch, prints session ID ht send S "<keys>" # type into it ht view S # snapshot screen (plain text) ht wait S --text "READY" # block until a condition ht stop S && ht remove S # cleanup ``` `ht run` prints a short hex session ID. Use `--name` to label it and reference the session by that name everywhere else — it's easier than juggling IDs. ## The one thing agents get wrong Keystrokes reach the PTY before the program has finished rendering a response. **Do not `view` immediately after `send`** — you'll snapshot a stale screen. Fold the wait into the send: