vsetup — единый онбординг dev-инфры Verta (оркестратор + манифест)
Find a file
luvlaceeeee 2c07687816
All checks were successful
ci / lint (push) Successful in 43s
ci / go-test (push) Successful in 52s
release / release (push) Successful in 1m49s
merge: манифест знает про скилл verta-buzz
2026-08-14 20:36:38 +03:00
.forgejo/workflows feat: vsetup skeleton — embedded manifest, cobra cli, goreleaser (ref VERTA-754) 2026-06-07 16:03:31 +03:00
.verta-recall feat(setup): doctor, bootstrap.sh, update, install <component> (ref VERTA-756) 2026-06-07 17:10:23 +03:00
cmd/vsetup feat(login): набор логинов в манифесте и команда vsetup login (ref VERTA-3487) 2026-07-31 10:37:06 +03:00
docs feat(login): infisical в наборе логинов (ref VERTA-3490) 2026-07-31 10:40:57 +03:00
internal chore(manifest): rail ставит два claude-скилла — infisical-creds и verta-buzz 2026-08-14 20:36:31 +03:00
scripts fix(scripts): write-probe live-green — type=secret-manager + separate calls 2026-06-23 15:35:37 +03:00
.gitignore feat: vsetup skeleton — embedded manifest, cobra cli, goreleaser (ref VERTA-754) 2026-06-07 16:03:31 +03:00
.golangci.yml feat: vsetup skeleton — embedded manifest, cobra cli, goreleaser (ref VERTA-754) 2026-06-07 16:03:31 +03:00
.goreleaser.yaml feat: vsetup skeleton — embedded manifest, cobra cli, goreleaser (ref VERTA-754) 2026-06-07 16:03:31 +03:00
bootstrap.sh fix(bootstrap): detect tty by opening /dev/tty, not -r (ref VERTA-756) 2026-06-07 17:18:04 +03:00
go.mod feat(term): цвет и профиль терминала в Printer (ref VERTA-3481) 2026-07-31 01:49:48 +03:00
go.sum feat(term): цвет и профиль терминала в Printer (ref VERTA-3481) 2026-07-31 01:49:48 +03:00
README.md feat(login): infisical в наборе логинов (ref VERTA-3490) 2026-07-31 10:40:57 +03:00

verta-setup

Единая точка входа онбординга dev-инфры Verta. Go-CLI vsetup: оркестратор + embedded-манифест. Каждая репа экосистемы владеет своим install.sh — vsetup ведёт человека по шагам, ставит бинари и проверяет результат.

Быстрый старт (новая машина)

curl -fsSL https://forgejo.vertaspace.com/verta/verta-setup/raw/branch/main/bootstrap.sh | sh

bootstrap.sh спросит Forgejo PAT, скачает vsetup из Releases (с проверкой checksums) и запустит гайдовый визард vsetup setup.

Команды

Команда Что делает
vsetup setup Гайдовый визард онбординга: prereqs → креды → клон → бинари → инсталлеры → хуки → doctor; --from <шаг>, --yes, --verbose, идемпотентен
vsetup doctor Stateless-диагностика: бинари+версии vs latest, хуки (включая единый Codex user-layer), MCP, маркеры, счётчики; вывод сгруппирован по областям; --json; провалы → exit ≠ 0
vsetup update Re-pull реп + переустановка бинарей (включая self-update) и инсталлеров; --verbose
vsetup install <component> Точечная установка/починка компонента манифеста; --verbose
vsetup login [сервис] Логин в инфру без визарда: весь набор манифеста (vrecall, vship, vobs, vdb, infisical) или один сервис; живая сессия (whoami-гейт) браузер не дёргает, headless (INFISICAL_TOKEN) пропускается, провал одного — warn
vsetup manifest Печатает карту экосистемы: бинари, инсталлеры, хуки, счётчики
vsetup version Версия CLI

Вывод: лог-файл и итоговый отчёт

Сырой вывод чужих install.sh не льётся в терминал: он пишется в ~/.cache/vsetup/last-run.log ($XDG_CACHE_HOME/vsetup, если задан; права 600), предыдущий прогон остаётся в prev-run.log. В терминале — одна строка на единицу работы плюс живой счётчик [n/N] со спиннером; при провале печатается хвост вывода, причина и команда починки.

Прогон заканчивается итогом:

Итог: 19/21 ✓  1 ✗  1 !

  ✗ vship — exit status 7 (не достучался до install.vertaspace.com)
    → vsetup install vship
  ! verta-ui — незакоммиченные изменения — пропуск

полный лог: /Users/me/.cache/vsetup/last-run.log

Единица внутри шага падает — остальные единицы шага всё равно выполняются; падает шаг целиком — следующий не стартует. Хотя бы одна красная единица даёт ненулевой код выхода. --verbose возвращает сырой стрим в терминал (лог пишется всё равно). Не терминал, NO_COLOR или TERM=dumb → перерисовки и ANSI нет, только обычные строки.

Архитектура

Оркестратор + манифест. internal/manifest/manifest.yaml (зашит через embed.FS) — единственный источник правды: какие репы клонить, какие бинари ставить из Forgejo Releases, какие инсталлеры звать и какими managed-маркерами проверять результат. Логика установки конкретной репы живёт в самой репе — vsetup её не дублирует.

MCP-записи с env. stdio-MCP в mcp: может объявить переменные окружения (env:), которые vsetup прокинет в claude mcp add -e K=V:

  • type: literal — несекретное значение прямо в манифесте (value — само значение).
  • type: required-passthrough — секрет: value хранит имя env-переменной, значение читается из окружения процесса при регистрации и в git не попадает. Пустое значение → сервер не регистрируется (fail-closed), печатается только имя.

Слои — по канону экосистемы (паттерн vobs):

cmd/vsetup            composition root (cobra-провода)
internal/handler/cli  тела команд (I/O параметрами, тестируемые)
internal/service/     creds, gitops, release, installer, hookwire, doctor
internal/manifest     карта экосистемы + валидация
internal/pkg/term     наратив визарда: шаги, счётчики, цвет, prompt/confirm
internal/pkg/progress лог прогона, результаты единиц, inline-хвост, итог
internal/service/diag класс ошибки → причина и команда починки

Разработка

go build ./cmd/vsetup
go test ./...
golangci-lint run

Релиз: тег v*.forgejo/workflows/release.yml → goreleaser → Forgejo Releases (архивы + checksums.txt).

Эта репа — публичная (единственная в org): bootstrap.sh должен качаться без кредов, иначе курица-яйцо. Секретов здесь нет и быть не должно.

План — Linear, проект «vsetup: единый онбординг dev-инфры + чистка CLI-имён» (label setup). Решения — docs/decisions/.