bash-agent — кодинг-агент на чистом bash и awk
📂 Исходный код на GitHubМинимальная среда запуска кодинг-агента на чистом bash и awk, без единой зависимости. Та же логика портирована на C, Go и Rust.
bash-agent — это кодинг-агент, написанный целиком на bash и awk. У него нет ни библиотек, ни интерпретатора, ни менеджера пакетов: весь цикл работы с LLM помещается в один файл на 1690 строк, в котором 107 функций. Нужны только bash, awk, curl и rg. Требования — bash 5.0 и новее, платформы — Linux, macOS и WSL. Лицензия MIT, статус у проекта пока preview.
Тот же агент есть на C, Go и Rust — это cagent, goagent и rustagent. Автор держит одинаковую логику во всех четырёх версиях: тот же цикл агента, те же инструменты, та же работа с сессиями.
Установка
Для macOS есть tap по Homebrew. Он ставит сразу четыре версии:
brew install lloydzhou/tap/bash-agent
Для Arch Linux пакет лежит в AUR:
yay -S bash-agent
# or
paru -S bash-agent
Для Debian и Ubuntu есть APT-репозиторий с готовыми пакетами для amd64 и arm64:
curl -fsSL https://lloydzhou.github.io/bash-agent/install.sh | sudo bash
Bash-версию можно поставить и вручную — одним файлом, без системы пакетов:
curl -fsSL https://github.com/lloydzhou/bash-agent/releases/latest/download/agent.sh \
-o ~/.local/bin/bash-agent && chmod +x ~/.local/bin/bash-agent
Go- и Rust-версии собираются из исходников:
# Go
go -C go build -o ~/.local/bin/goagent ./cmd/goagent
# Rust
cd rust && cargo build --release && cp target/release/rustagent ~/.local/bin/rustagent
Нативным версиям на Linux нужен GLIBC 2.31 или новее. На системах со старым GLIBC остаётся только bash-вариант.
Первый запуск
Ключ провайдера задаётся переменной окружения. Дальше вызов выглядит коротко:
bash-agent "scan this repo and summarize"
bash-agent -i # interactive mode
bash-agent --output-format stream-json "inspect"
Кроме Claude есть DeepSeek и любой OpenAI-совместимый endpoint:
export DEEPSEEK_API_KEY="sk-..."
bash-agent "hello" # auto-detect, uses deepseek-v4-flash
export OPENAI_API_KEY="sk-..."
bash-agent -p openai -m gpt-4o "hello"
OPENAI_BASE_URL=http://localhost:11434/v1 bash-agent -p openai -m llama3 S4
Последний пример — локальный сервер Ollama: агент принимает и локальные модели, если адрес указан через OPENAI_BASE_URL.
Что умеет цикл агента
В агента встроено 11 инструментов: Read, Write, Edit, Bash, Glob, Grep, TodoWrite, PlanConfirm, PlanClear, Skill и SubAgent. То есть кроме обычной работы с файлами и запуска команд есть список задач, подтверждение плана, навыки и под-агенты.
Часть параметров командной строки:
| Параметр | Что делает | По умолчанию |
|---|---|---|
-p, --provider |
claude или openai |
claude |
-m, --model |
имя модели | claude-sonnet-4-20250514 |
--max-tokens |
сколько токенов ответа | 16384 |
--max-turns |
сколько кругов цикла агента | 1000 |
--thinking |
adaptive / enabled / disabled |
adaptive |
--effort |
low / medium / high / xhigh / max |
high |
--max-context |
бюджет контекста: 100k / 1m / 1g |
200000 |
--tool-timeout |
таймаут инструмента в секундах | 600 |
--output-format |
human или stream-json |
human |
--skill NAME |
загрузить навык | — |
Режим stream-json выдаёт наружу структурированные события, а не текст для человека. Его удобно встраивать в свои скрипты и редакторы.
Под-агенты и сессии
Инструмент SubAgent передаёт часть задачи отдельной сессии, которая работает параллельно с основной. Ответ под-агента сам возвращается в главный разговор. У под-агента своя сессия и свой контекст. Если он упал, основной диалог это не ломает.
Сессии хранятся отдельно для каждого проекта. Их можно перечислить, продолжить с последней, восстановить после сбоя или ответвить:
bash-agent --list-sessions
bash-agent --continue
bash-agent --session my-work
bash-agent --fork --continue # branch a new session from the last one
Флаг --fork делает новую сессию от старой, не затирая исходную. Это удобный способ попробовать альтернативный вариант решения, оставив первый нетронутым.
Сжатие контекста
Когда история перестаёт помещаться в бюджет контекста, агент сжимает её в краткое резюме. Автор не берёт алгоритм «на глаз»: он считает деньги. Сжатие должно окупиться, иначе дешевле просто обрезать историю.
Прикидка идёт по пяти статьям:
- сколько денег сэкономит кэш на будущих запросах;
- сколько стоит сброс этого кэша;
- сколько стоит сам вызов резюме;
- сколько стоит потеря части информации;
- сколько даёт выигрыш в качестве ответа.
Все параметры вынесены в переменные окружения — например, DP_P_INPUT (цена непрокэшированного ввода), DP_P_CACHE (цена прокэшированного ввода), DP_BETA (штраф за потерю информации). Есть и страховка: если контекст занял больше 90 процентов лимита, сжатие происходит принудительно.
Второй приём — выравнивание кэша. Запрос резюме отправляется с тем же началом, что и обычный запрос: системный промпт, описание инструментов и старое резюме идут первыми и попадают в кэш. Полной ценой оплачивается только инструкция «сожми» — она одна в кэш не попадает. Автор приводит расчёт на Claude Sonnet 4 для истории в 45 тысяч токенов:
| Токены | Без выравнивания кэша | С выравниванием |
|---|---|---|
| System prompt, около 2K | $0.006 | $0.0006 |
| Tools, около 3K | $0.009 | $0.0009 |
| Отброшенные сообщения, около 40K | $0.120 | $0.012 |
| Инструкция резюме, около 200 | $0.0006 | $0.0006 |
| Итого около 45.2K | $0.136 | $0.014 |
Разница почти в десять раз. Полный вывод с формулами лежит в docs/compact-analysis.md.
Права доступа к файлам и командам
Переменная BASH_AGENT_BASH_MODE задаёт, что агенту разрешено делать с системой, с файлами и с сетью. Это строка из четырёх восьмеричных цифр — по одной на system, external, network, workspace. Каждая цифра собирает биты 4 — читать, 2 — писать, 1 — выполнять.
Значение по умолчанию — 0467:
system=0— на уровне системы ничего не разрешено;external=4— обычные пути вне рабочей папки можно читать;network=6— сеть доступна на чтение и запись;workspace=7— внутри рабочей папки можно всё.
Проверка идёт по битам, а не по величине числа. Если команде нужен запуск на уровне системы, режим 6677 её не пропустит: цифра 6 в позиции system не содержит бита выполнения, несмотря на то что число больше. Чтобы открыть всё, нужен 7677 или 7777.
Инструменты работы с файлами проверяются так же: Read, Grep и Glob — как чтение, Write и Edit — как запись. Пути /tmp и папка проектов в $BASH_AGENT_HOME/.bash-agent/projects считаются своими, но путь с .. всегда проверяется как системный — так нельзя выйти за пределы через /tmp/../.... Если значение переменной не разбирается, все доступы закрываются (0000). Подробности в docs/bash-tool-policy.md.
Навыки и файлы инструкций
Навыки лежат в трёх местах, и приоритет сверху вниз:
.claude/skills/<name>/SKILL.md
./skills/<name>/SKILL.md
~/.claude/skills/<name>/SKILL.md
Загрузка идёт в три шага. Сначала в промпт попадает только список навыков с коротким описанием, потом целиком грузится выбранное, и уже потом инструмент Skill читает нужный файл по требованию. Так лишние навыки не засоряют каждый запрос.
Из каждой области берётся только один файл — с наивысшим приоритетом: AGENTS.md, потом AGENT.md, потом CLAUDE.md, потом .claude/CLAUDE.md. Областей две: глобальная (~/.bash-agent/) и проектная (текущая папка).
Интерфейс и картинки
В составе есть tcode — обёртка над tmux, которая делит экран на три панели: список сессий слева, диалог с агентом справа и поле ввода. Запуск — tcode, можно указать конкретную версию и пробросить ей аргументы.
В интерактивном режиме по Ctrl+V вставляется картинка из буспера. Агент кладёт файл в папку images внутри сессии и вставляет в текст метку [Image #N]. По умолчанию картинки в модель не отправляются. Включить это можно флагом --vision on, но автор прямо пишет, что эта часть пока черновик и в версии на Go, Rust и C не перенесена. Поддерживаемые платформы для вставки: macOS через osascript, Wayland через wl-paste, X11 через xclip.
Кому это полезно
Проект интересен тем, кто устал от агента на 300 мегабайт зависимостей. Bash-версия ставится одной командой, её можно положить в репозиторий рядом с кодом и запустить на любой машине с bash 5. Нативные версии на Go, Rust и C дают тот же функционал там, где нужна скорость или готовый пакет для дистрибутива.
Отрицательные стороны чевидны из README. Статус preview, документы частично на китайском, поддержка картинок не доведена. Цифры в бейджах — 1690 строк и 107 функций — относятся к bash-версии, и по ней удобно прикинуть, сколько кода приходится писать руками.
Лицензия MIT, так что заимствовать можно свободно.
Источник: https://github.com/lloydzhou/bash-agent