Polyrepo CLI
Интерактивный CLI для управления папкой локальных npm-пакетов: бамп версии через pull request, публикация в npm, GitHub Releases и отслеживание рассинхронизации зависимостей между пакетами — всё из одного инструмента, и всё можно предварительно проверить через --dry-run, прежде чем что-то реально изменится.
Возможности
setup— добавление, редактирование и удаление директорий с пакетами, которые сканирует CLI, прямо из терминала.clone— сверяет список репозиториев GitHub-организации/пользователя с тем, что уже склонировано локально, и клонирует недостающее.list— одна таблица по всем пакетам: версия, ветка, git-статус, git-тег, GitHub Release, статус в npm-реестре и рассинхронизация зависимостей между локальными пакетами.--quickпропускает сетевые проверки ради мгновенного вывода версии/ветки/git-статуса;--outputсохраняет ту же таблицу в Markdown, JSON, CSV или HTML.outdated— одна таблица устаревших зависимостей по всем пакетам сразу, сгруппированная по пакетам, с раскраской колонкиLatestпо тому, насколько версия отстала (major/minor/patch).audit— одна таблица уязвимостей npm по всем пакетам сразу, сгруппированная по пакетам, с раскраской по критичности (critical/high/moderate/low) и отметкой, есть ли готовый фикс.prs— одна таблица всех открытых pull request'ов по всем пакетам.doctor— проверка состояния из семи разделов с несколькими безопасными автофиксами по пути: окружение (Node/git/gh/npm), дрейф основной ветки от реального состояния на GitHub, устаревшие remote-tracking ссылки, расхождение с origin, состояние detachedHEAD, отсутствие защиты ветки и мёртвые ветки после прошлых релизов (--clean-branchesпревращает последний пункт в интерактивную чистку).switch-default— подтягивает выбранные репозитории до актуальной основной ветки — какой бы она ни называлась,master,mainили как-то иначе (определяется отдельно для каждого репозитория, а не предполагается заранее).--force/--clean— для полного сброса репозитория, когда он действительно нужен.bump— поднимает версию пакета (по умолчанию patch; либо--minor/--major; либо--prerelease/--preidдля старта или продвижения пререлиза; либо--custom-versionдля точной версии) через ветку → PR → merge, затем ставит тег релиза. Безопасно перезапускать, если предыдущая попытка прервалась на середине — процесс продолжается с того места, где остановился. Сам пишет черновик записи вCHANGELOG.md, если у пакета такой файл уже есть.publish— запускаетnpm publishтолько для тех пакетов, что реально обогнали реестр, предварительно проверяя (и при необходимости обновляя) логин в npm.tag— ставит тег на текущую версию пакета без повторного бампа, если версия уже была поднята каким-то другим способом. Сразу после предлагает создать GitHub Release.release— создаёт GitHub Release из тега, с текстом релиза из соответствующего разделаCHANGELOG.md, если он есть.exec— прогоняет любую команду по каждому выбранному пакету, один за другим, с реальным терминалом.- Любая команда, затрагивающая несколько репозиториев, поддерживает
--packagesи--yesдля полностью неинтерактивного использования в скриптах.
Как это работает
Каждая команда читает один и тот же список репозиториев из одного конфиг-файла (roots — папки, каждая подпапка которых является отдельным пакетом; packages — отдельные папки репозиториев). Список настраивается один раз через setup, после чего всё остальное работает с ним же.
Read-only проверки (git-статус, теги, релизы, состояние реестра, статус PR) выполняются по всем репозиториям параллельно, поэтому полный list или doctor по многим пакетам работает быстро, а не ждёт каждый репозиторий по очереди. А вот всё, что реально меняет состояние — коммит, push, merge, тег — выполняется по одному репозиторию за раз, с выводом каждого шага по мере его выполнения. bump отдельно отслеживает, как далеко зашла предыдущая попытка (запушена ли ветка? открыт ли PR? смёрджен ли он?), так что повторный запуск после прерывания продолжается с нужного места вместо падения на «ветка уже существует» или создания дублирующего PR.