gitwatch - я устал держать GitHub в десяти вкладках

Если ты работаешь сразу с кучей репозиториев, ты знаешь эту боль. У тебя открыто несколько пул-реквестов, где-то упал CI, где-то тебя попросили внести правки, где-то ревьюер наконец поставил апрув и можно мержить. И всё это раскидано по разным репозиториям. GitHub не показывает это в одном месте, а уведомления превращаются в шум, в котором тонет важное.
Я сделал инструмент, который решает именно это. Называется gitwatch. Он живёт прямо в терминале и сам подсказывает, какой PR требует твоего внимания прямо сейчас.
Что он делает
gitwatch собирает все твои открытые пул-реквесты по всем репозиториям сразу и сортирует их по срочности. Тебе не нужно ничего искать - открываешь окно и сразу видишь, за что хвататься.
Он сам обновляется каждые 30 секунд и подсвечивает то, что изменилось с прошлого раза. Упал CI, прилетел новый комментарий с упоминанием, появился новый PR - ты это сразу заметишь, не перезагружая ничего руками.
Как он решает, что срочно
Здесь нет никакой магии, всё на простых и понятных правилах.
Красный, нужно действовать сейчас: упал CI, или PR уже одобрен и готов к мержу, или тебя упомянули в свежем комментарии.
Жёлтый, скоро понадобится: есть конфликт с веткой, попросили внести правки, или PR висит без ревью больше двух дней.
Серый, фоновое: всё остальное.
Список идёт от срочного к спокойному, а внутри каждого уровня сверху самые свежие. Ты всегда можешь объяснить, почему PR попал в свою категорию.
Как это работает под капотом
При запуске gitwatch берёт токен из уже установленного GitHub CLI командой gh auth token. Никаких отдельных токенов руками создавать не надо, и токен никуда не уходит.
Дальше он делает один-единственный запрос к GitHub через их GraphQL API. Это важно: вместо десятков отдельных вызовов по каждому репозиторию он одним батч-запросом получает сразу всё - список открытых PR, статус CI и отдельные проверки, кто из ревьюеров что поставил, есть ли конфликт, имена веток и последние комментарии. Один запрос на один цикл опроса, чтобы не упираться в лимиты GitHub.
Живой режим устроен так, чтобы интерфейс никогда не подвисал. Внутри крутится цикл, который одновременно слушает три вещи: таймер обновления, нажатия клавиш и результат фонового запроса к GitHub. Сам запрос уходит в фоновую задачу, поэтому пока данные грузятся, ты спокойно листаешь список и открываешь детали - ничего не замирает.
Чтобы подсветить новое, gitwatch запоминает снимок прошлого опроса и сравнивает с новым. Если у PR изменился статус CI, ревью, конфликт или прилетело упоминание - строка помечается, а в шапке растёт счётчик новых событий.
Технологии
Проект написан на Rust. Это дало маленький быстрый бинарник без рантайм-зависимостей, который легко собрать под все три платформы.
Интерфейс сделан на ratatui поверх crossterm - это даёт кроссплатформенный терминальный UI из коробки, одинаково работающий на Linux, macOS и Windows. Асинхронность держится на tokio, благодаря ему опрос и отрисовка не мешают друг другу. Запросы идут через reqwest с rustls, то есть без системного OpenSSL - это сильно упрощает распространение готового бинарника. Парсинг ответов на serde, конфигурация в toml, работа со временем на chrono, разбор аргументов на clap.
Группы и фильтры
Репозитории можно объединять в группы прямо в приложении. Например, собрать пять сервисов одного проекта в группу Backend и смотреть только её. Группы сохраняются в конфиг на твоей машине и подхватываются при следующем запуске. Можно открыть детали группы и увидеть все её репозитории сразу, даже те, где сейчас нет открытых PR, с количеством PR по каждому.
Что нужно для запуска
Единственное обязательное - установленный и залогиненный GitHub CLI. Через него gitwatch и входит, отдельный токен заводить не надо.
Поставить сам GitHub CLI просто. На Arch Linux:
sudo pacman -S github-cliНа macOS:
brew install ghНа Windows:
winget install --id GitHub.cliПосле установки один раз залогинься:
gh auth loginУстановка gitwatch
Есть два пути.
Первый, самый простой, без Rust. На странице релизов в репозитории скачиваешь готовый файл под свою систему: для Linux версию linux-musl, для macOS под Intel или Apple Silicon, для Windows версию windows. Распаковываешь и кладёшь программу в любую папку из твоего PATH. На Linux или macOS это выглядит так:
tar -xzf gitwatch-x86_64-unknown-linux-musl.tar.gz
sudo mv gitwatch /usr/local/bin/Второй путь, если у тебя установлен Rust. Клонируешь репозиторий и ставишь одной командой:
git clone https://github.com/AbuZhuma/gitwatch-tui
cd gitwatch-tui
cargo install --path .После этого команда gitwatch доступна из любого места. Просто набери:
gitwatchУправление
Всё на стрелках, заучивать нечего.
Вверх и вниз двигают курсор. Если дойти до верха списка PR и нажать вверх ещё раз, попадёшь в блок групп и репозиториев, и наоборот.
Стрелка вправо открывает детали - выбранного PR или группы. Стрелка влево возвращает назад.
Enter фильтрует список по выбранной группе или репозиторию. Клавиша n создаёт новую группу, Backspace удаляет выбранную. r обновляет вручную, q выходит.
Почему read-only
gitwatch только читает. Он ничего не делает с твоим аккаунтом, не мержит, не комментирует, не трогает настройки. Для инструмента, который просит доступ к GitHub, это вопрос доверия: исходники открыты, и любой может убедиться, что токен остаётся на машине и используется только для чтения.
Тихий сосед
Я специально сделал так, чтобы приложение можно было держать открытым в углу экрана или в панели tmux весь день. В простое оно почти не ест процессор: пока ничего не происходит, оно просто ждёт событий и не перерисовывается зря. Экран обновляется только когда реально что-то поменялось.
Финалочка
Это первая версия. Если проект показался полезным или просто залип на идею - буду очень благодарен за звезду на GitHub, это сильно помогает проекту жить и развиваться:
https://github.com/AbuZhuma/gitwatch-tui
Если попробуешь - расскажи, как зашло, и что хотелось бы добавить.
Комментарии