bash-agent — кодинг-агент на чистом bash и awk

· 2 мин чтения
ai-agents coding-agent cli bash open-source
📂 Исходный код на GitHub

Минимальная среда запуска кодинг-агента на чистом bash и awk, без единой зависимости. Та же логика портирована на C, Go и Rust.

bash-agent — кодинг-агент на чистом bash и awk

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