| .forgejo/workflows | ||
| .verta-recall | ||
| cmd/vsetup | ||
| docs | ||
| internal | ||
| scripts | ||
| .gitignore | ||
| .golangci.yml | ||
| .goreleaser.yaml | ||
| bootstrap.sh | ||
| go.mod | ||
| go.sum | ||
| README.md | ||
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/.