fullstack-gates
v0.8.2
Published
Verification gates for a Bun + Elysia + Drizzle + Turborepo modular monolith: pinned dependency declarations, acceptance-criteria coverage, work queue, screen wiring, prototype boundary, declared debt. Plain files in, exit code out — no dependencies.
Maintainers
Readme
fullstack-gates
Проверки, которые отказываются, а не пропускают. Обычные файлы на вход, код возврата на выход,
ноль зависимостей — только node:fs, node:path и рантайм Bun.
bun add -d fullstack-gates// package.json
"scripts": {
"check:pins": "stack-gate pins",
"check:priority": "stack-gate priority",
"check:debt": "stack-gate debt",
"check": "bun run lint && bun run type-check && bun run check:pins && bun run check:priority",
"ac": "stack-gate ac"
}Правило, из которого следует всё остальное
Пропущенная проверка выглядит ровно как пройденная. Поэтому здесь нет ни одного гейта, который молча зеленеет, когда ему нечего проверять: пустой каталог критериев — отказ, пустой список манифестов — отказ, опечатка в имени гейта — отказ. Зелёный прогон обязан означать, что что-то было проверено, а не что проверять было нечего.
Гейты
| stack-gate … | Что проверяет | Почему это не ловит ничто другое |
|---|---|---|
| pins | в объявлениях зависимостей нет "latest" / "*" | пока цел локфайл, плавающее объявление МОЛЧИТ; просыпается на bun update — когда никто уже не связывает поломку с объявлением полугодовой давности |
| ac | критерии приёмки доказаны прогоном, галочки переписаны по факту | галочка, поставленная рукой, — обещание, а не отчёт |
| priority | объявления приоритета в спеке действительны | опечатка heigh при молчаливом умолчании даёт normal — противоположное написанному, без признаков |
| next-slice | какой слайс следующий: покрытие, провод, адреса, конфликты, есть ли у слайса код | очередь, названная человеком, называет удобное, а не следующее |
| ↳ колонка код | есть / НЕТ / ≠имя — каталог packages/<пакет>/src/features/<слайс>/ | счёты нарушений дают ноль и когда чисто, и когда нарушать нечему: спека без единой строки печаталась как «подключён: да · вид сверен: да», а слайс, чей код лежит в каталоге с ДРУГИМ именем, — как «порт: нет» при живом store.ts и 32/32 доказанных |
| wiring | проводка экрана: мёртвый проп, дубль data-testid, эндпоинт без вызывающего | юнит и интеграция зовут сервер напрямую, оракул разметки согласен с прототипом по построению — провод не смотрит никто |
| write-path | у каждого пишущего эндпоинта есть вызывающий в клиенте | кнопка, которая рапортует об успехе и ничего не делает, проходит все остальные уровни |
| proto | извлечённая вёрстка не пересекает границу слоя представления | фикстура прототипа, ставшая ключом сущности, снимается потом переписыванием четырёх слоёв разом |
| proto-ids | идентификаторы из прототипа не стали ключами | то же, но про адресацию |
| unwired | слайс собран, но приложение его не собирает: фабрику сервиса не вызывает никто | все остальные проверки смотрят на КОД, а он правильный — тесты создают сервис сами, критерии доказываются, покрытие растёт, способности в продукте нет |
| fidelity | вид экрана сверен с прототипом: замер есть, свежий и выше порога | screens считает НАЛИЧИЕ экрана; приёмка читает текст и атрибуты элемента — экран, потерявший половину оформления, проходит обе |
| levels | критерий доказан тем уровнем, который требует | галочка говорит «доказано прогоном», но не говорит КАКИМ: юнит-тест закрывает критерий, которому нужна интеграция, и отчёт выглядит одинаково |
| debt | сознательно не сделанное названо и счётно | «пока не делаем», записанное комментарием в коде, выглядит взвешенным — и потому дыру никто не ищет |
stack-gate без аргументов печатает список; неизвестное имя — отказ с кодом 2, а не тихий пропуск.
Что гейт считает корнем репы
Текущий каталог, если в нём есть package.json. Поэтому зовите их из корня — так же, как bun run.
Раскладка, которую предполагают гейты
Часть проверок читает конкретные места: docs/usecases/<пакет>/<слайс>.md (критерии приёмки),
packages/* и apps/* (манифесты), apps/<любое>/src/client (клиент). Раскладка описана в
плагине fullstack — он же объясняет, что где
живёт. Гейт, которому нечего проверять, скажет об этом и вернёт 1.
Каталог маршрутов приложения (screens, next-slice) задаётся переменной SCREEN_ROUTES_DIR;
умолчание — apps/web/src/client/routes/_authenticated.
Лицензия
MIT.
