headless terminal CLI

CLI и скилл для управления терминальными интерфейсами из агента: фоновая сессия, клавиши и снимок экрана

  • 122 ★ репозитория
  • Последний коммит
  • MIT
CLI

Широкий доступ

Почему такой уровень

  • Запускает произвольные программы и вводит в них нажатия клавиш, включая оболочку.
Все причины и проверки

montanaflynn/headless-terminal

Установка

Ручная установка

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.

Обсуждение

Вопросов и отзывов пока нет.

Терминал для macOS с CLI termio и скиллом: агенты порождают соседние сессии, а вы видите, какому из них нужен ответ

CLIШирокий доступ790Звезды репозитория

Скилл tty7 учит Claude Code и Codex управлять панелями терминала tty7: запускать команды в настоящем PTY, читать экран и передавать работу другому агенту

СкиллШирокий доступ1,5 тыс.Звезды репозитория

term-cli запускает интерактивные программы для агента в tmux-сессиях, а человек вводит пароли и MFA через term-assist.

CLIШирокий доступ103Звезды репозитория

CLI на Rust с терминальным переключателем между кодинг-агентами: список, проверка готовности, выбор активного, предпросмотр команд

CLIРасширенный доступ139Звезды репозитория

Терминальная оболочка для кодовых агентов: встроенные терминалы, git, файлы, задачи td и рабочие деревья рядом

CLIШирокий доступ1,1 тыс.Звезды репозитория

Расширение Pi запускает vim, psql, ssh и другие интерактивные программы в окне, где вы следите и можете перехватить ввод.

ПлагинШирокий доступ608Звезды репозитория

Коротко о 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:

Сообщить о проблеме