Skip to content
TimmyZininPublic

About

ZININ CLI — AI-инженер в твоём терминале. Пилотируемый AI, не автопилот.

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Zinin OS — локальный CLI

Текущий CLI: просмотр и управление видимыми сессиями аппарата на Маке. Установить текущий checkout (нужен Bun):

./install.sh
zinin
zinin ps
zinin watch
Команда Действие
zinin Короткая справка и версия git HEAD
zinin ps [--json] Окна Terminal, активные потоки Codex, события шины за 6 часов
zinin report [--tick] Вызов ~/apparat/bin/report.py --full/--tick
zinin board [направление] Вызов ~/apparat/state/board.py tim/show
ZININ_SESSION=ZOS zinin say TYPE REF "текст" Запись в шину через say.sh; также допустимо --from ZOS
zinin watch Обновление раз в 10 секунд; клавиши 1/2/3, выход q
zinin launch task.md [--cwd DIR] [--engine codex|claude] Открыть новое окно Terminal из абсолютного .command; дождаться UUID в шине и записать владельца в ~/apparat/state/<ref>.json
zinin word ИМЯ|UUID "текст" Отправить слово через codex queue --thread; имя ищется сначала в owner доски, затем среди сегодняшних Codex-сессий по cwd
zinin close ОКНО Остановить Codex/Claude/caffeinate выбранного tty и закрыть окно Terminal
zinin tim Таблицы из доски, дневного плана и календаря, если он есть
zinin repl Прежний AI-харнес

ps не выдумывает сессии: недоступные источники показаны ошибкой, неизвестное время движения — «—». Если Terminal временно не отвечает, ps выводит подтверждённые процессы codex/claude/kimi по tty с id вида tty:ttys010; номер окна и заголовок остаются неизвестными. Потоки app-server читаются страницами по 20, шина показывает число отправителей. Код, документы и результат живой проверки 11.10 описаны в STATE-2026-10-11.md. Установщик собирает dist/zinin.js, сохраняет прежний обычный бинарь как .legacy-* и указывает ~/.local/bin/zinin на сборку текущего checkout.

launch берёт ref из имени task.md (префикс task- снимается). Первое сообщение нового агента в шине должно содержать реальный UUID; если оно не пришло за 90 секунд, CLI показывает окно и оставляет owner.thread пустым. Повторный запуск с тем же ref блокируется, пока за ним закреплено окно. Для пробного запуска задайте ZININ_STATE_DIR на отдельный временный каталог: ZININ_STATE_DIR=/tmp/zinin-smoke-state zinin launch task.md. В этом случае launch, word, close, ps и tim используют эту доску; реальная доска ~/apparat/state не получает тестового owner. Для close того же тестового окна оставьте тот же ZININ_STATE_DIR. close завершает процессы только выбранного tty. Terminal иногда сохраняет пустой AppleScript id после закрытия последней вкладки; CLI помечает такой случай, а ps не показывает пустые окна. tim указывает время среза дневного плана: таблица плана сама по себе не подтверждает исполнение.

Историческое описание REPL и E3

Ниже сохранено описание прежнего продукта и E3 collector. Команды и установка из этого раздела не описывают текущий zinin; REPL запускается как zinin repl, E3 collector доступен исходным кодом src/ps.ts.

AI-инженер в твоём терминале. Пилотируемый AI, не автопилот — управляй и понимай.

Авторский AI-харнес Тима Зинина: собственный REPL, мульти-LLM, ведёт за руку через установку Claude Code и Codex, учит, как устроен AI, пока ты работаешь.

Установка — одна команда

macOS / Linux:

curl -fsSL https://zinin.ai/install | sh

Windows (PowerShell):

irm https://zinin.ai/install.ps1 | iex

Без Node, без Homebrew — ставится один бинарь в PATH. Потом просто:

zinin

Команды

Команда Что делает
(просто пиши) разбор бизнеса, контент, автоматизации — обычным языком
/setup проверит и поставит Claude Code / Codex
/call позвать Тима на разговор (живой инженер, помощь с настройкой)
/model сменить LLM (бесплатные / платные)
/help меню
/exit выход

Движок

Мульти-LLM с бесплатными моделями по умолчанию — ничего настраивать не нужно. Свой ключ OpenRouter (опционально, для прямого доступа):

export OPENROUTER_API_KEY=...

zinin ps — обзор всех сессий

Одна таблица: одна строка на сессию, только чтение источников, никаких действий над сессиями. Флаги: --watch [N] (обновление раз в N секунд, по умолчанию 5), --json (машинный вывод), --stuck-minutes N (свой порог stuck для всех движков), --sources mac|newa|all, --help.

Состояния и доказательства

Каждое состояние имеет точный сигнал; при конфликте сигналов выигрывает более высокий приоритет.

Приоритет Состояние Сигнал-доказательство
1 (высший) done маркер (ГОТОВ|ГОТОВО|ГОТОВА|ГОТОВЫ|ИТОГ|СДАНО|СДАЧА|DONE|FINISHED) в последнем заголовке файла (хвост после тире, глубина не важна) или в начале одной из последних 3 содержательных строк TO-S0.md/REPORT-S0.md; строка сдачи в обратных кавычках распознаётся; отрицания («пока не готов», «итог: пока не готово») и вопросы («что готово, а что нет», «ГОТОВО?») не срабатывают; «итог» без двоеточия в заголовке — существительное, не маркер; подписи вида «— newa (E3)» пропускаются
2 closing status.json: stop_requested=true при живом воркере (live≠false)
3 limit недельный лимит ≥ 95%, либо в хвосте транскрипта/окна есть rate_limit/403/limit reached
4 waiting-tim последняя строка TO-S0.md: «вопрос»/«ждём Тима»/«блокер»/«нужен Тим»; или окно Claude: «What should Claude do instead»
5 starting tmux-сессия/окно моложе 120 секунд и ходов ещё нет
6 stuck нет движения дольше порога движка (см. ниже), а сессия рабочая
7 working status.json state=running; глиф ◑/◐/✳ в заголовке окна; attached tmux
8 (низший) idle всё наблюдаемо тихое: глиф ○, «| idle» в заголовке, state=idle

Порог stuck по движкам: claude — 20 минут (при работе Claude непрерывно пишет в транскрипт и крутит индикатор; 20 минут тишины — скрытый запрос или зависание; компактификация занимает минуты, не десятки минут); kimi — 30 минут (рабочий цикл: ход до 600 секунд плюс ожидание следующего поручения до 1800 секунд — легальный простой между ходами); codex — 30 минут (тот же покадровый цикл, что у kimi); unknown — 30 минут. Флаг --stuck-minutes N задаёт порог для всех движков разом.

Откуда берутся данные

  • mac: заголовки окон Terminal (osascript, поля id/title/экран/busy), ps по tty, транскрипты ~/.claude/projects/*/*.jsonl, vm_stat/memory_pressure, df.
  • newa: /home/agents/work/<name>/ (meta.json, status.json, turns/, TO-S0.md, REPORT-S0.md, TASK*.md), tmux ls (сессии af-*), /proc/meminfo, df. С Мака newa читается по ssh той же командой zinin ps --sources newa --json. Команда: ZININ_PS_NEWA_CMD → ~/.zinin/ps.json {"newaCmd": ["ssh", …]} → встроенный дефолт с абсолютными путями (временный, указывает на checkout воркера — закрепите установку через ps.json). В --json есть version (код локальной стороны) и machines[].version — по ним видно, какой код считал каждую половину (newa-сторона: git-шортшa checkout, при недоступном git — версия пакета); при недоступности футер честно пишет newa: недоступна. Транскрипты Claude читаются хвостом 64 КБ и только за окно 24 ч (ZININ_PS_TRANSCRIPT_MINUTES), обогащают строку окна (движение, ошибки), а не порождают свои строки. Ключ «окно ↔ проект»: основной — каталог запуска движка (tty из osascript в форме /dev/ttysNNN → pid → lsof cwd; Claude Code ведёт транскрипты по каталогу запуска, а не по cd). Движок — argv[0] или его скрипт-обёртка (*.js/py), на tty владелец — самый старший pid; запасной — cwd из строки статуса. Факты получает только самое живое окно проекта (спиннер/busy/глиф; равенство — по числовому id, младшее старшее окно), припаркованное честно показывает «—». Память в футере Мака — memory_pressure (system-wide free %), не «Pages free».

Колонки: id, машина, движок и модель, задача, состояние, минуты без движения, во что упёрлась (последняя ошибка), что нужно (последний вопрос к Тиму), контекст %, недельный лимит %; в футере — свободная память и диск машины.

Приватность

Телеметрия собирает только метаданные событий (никогда — текст твоих запросов). Отключить:

export ZININ_NO_TELEMETRY=1

zinin.ai · Telegram @timzinin · 30 мин: calendly.com/timzinin/30min

About

ZININ CLI — AI-инженер в твоём терминале. Пилотируемый AI, не автопилот.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages