feat: generate OpenAPI without peer repositories
Backend security / security (pull_request) Successful in 7s
Backend verify / verify (pull_request) Successful in 2m28s
Conventional commits / commits (pull_request) Successful in 25s
Backend security / security (push) Successful in 6s
Backend verify / verify (push) Successful in 2m16s
Backend security / security (pull_request) Successful in 7s
Backend verify / verify (pull_request) Successful in 2m28s
Conventional commits / commits (pull_request) Successful in 25s
Backend security / security (push) Successful in 6s
Backend verify / verify (push) Successful in 2m16s
This commit was merged in pull request #19.
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
# WealthLedger backend
|
||||
|
||||
NestJS API WealthLedger. Backend владеет auth, SQLite-данными и server-side
|
||||
интеграцией T-Bank; frontend не обращается к T-Bank напрямую.
|
||||
интеграциями. Потребители используют публичный HTTP API и OpenAPI artifact;
|
||||
их репозитории не нужны для разработки, сборки и проверок backend.
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
@@ -33,7 +34,7 @@ npm run verify
|
||||
application/test typechecks, Jest и build. `npm run lint:fix` — отдельная
|
||||
записывающая команда, `npm run test:cov` — диагностика без общего числового
|
||||
threshold. `npm run test:e2e` отдельно проверяет все HTTP suites на новых базах
|
||||
и runtime OpenAPI с соседним frontend checkout. Для полной backend-проверки
|
||||
и соответствие генерируемого OpenAPI настроенному приложению. Для полной backend-проверки
|
||||
выполните обе команды.
|
||||
|
||||
Nest 12 поставляется как ESM. Скрипты Jest включают `--experimental-vm-modules`,
|
||||
@@ -44,11 +45,9 @@ TypeScript 7 требует поддержки со стороны `ts-jest` и
|
||||
### CI и обновления зависимостей
|
||||
|
||||
`.gitea/workflows/verify.yml` запускает `npm ci`, генерацию Prisma client,
|
||||
`npm run verify` и `npm run test:e2e` на push и PR. Frontend snapshot для
|
||||
разработки берётся из `develop`; для `main`, PR в `main` и `release/*` — из
|
||||
полного SHA в `.ci/refs.json`. Лог сохраняет оба SHA. Изменение
|
||||
контракта согласуется с этой frontend revision. Успешный unit gate не заменяет
|
||||
SQLite/e2e; ошибка любой suite завершает job с FAIL.
|
||||
`npm run verify` и `npm run test:e2e` на push и PR. Используется только checkout
|
||||
backend и его зависимости; OpenAPI генерируется во время проверки, SHA записывается в лог.
|
||||
Успешный unit gate не заменяет SQLite/e2e; ошибка любой suite завершает job с FAIL.
|
||||
|
||||
`security.yml` сканирует всю Git-историю Gitleaks 8.30.1 с полностью скрытыми
|
||||
значениями и выполняет `npm audit --include=dev --audit-level=low` при push,
|
||||
@@ -83,20 +82,34 @@ runtime-валидацию. В обычном коде нужны инициал
|
||||
- [HTTP API](.ai/conventions/http-api.md), [data](.ai/conventions/data.md) и [testing](.ai/conventions/testing.md)
|
||||
- [Security/auth](.ai/conventions/security-auth.md) и [integrations](.ai/conventions/integrations.md)
|
||||
|
||||
- [Карта проектных фактов](../docs/README.md)
|
||||
- [API contract и runtime OpenAPI](../docs/architecture/http-api.md#источник-контракта)
|
||||
- [Обзор поставленной системы](../docs/overview.md)
|
||||
- [Архитектурные решения](../docs/adr/README.md)
|
||||
- [Генерация OpenAPI](#генерация-openapi)
|
||||
|
||||
Из backend runtime OpenAPI можно read-only сверить с frontend snapshot:
|
||||
Генерация без сервера сверяется с OpenAPI настроенного приложения:
|
||||
|
||||
```bash
|
||||
npm run test:openapi-contract
|
||||
```
|
||||
|
||||
Разработка идёт напрямую по задаче пользователя. Каждый affected repo проходит
|
||||
свой verify; при изменении wire contract дополнительно выполняется contract check.
|
||||
Обязательного OpenSpec/SDD lifecycle нет.
|
||||
## Генерация OpenAPI
|
||||
|
||||
```bash
|
||||
nvm use --silent
|
||||
npm run openapi:generate
|
||||
```
|
||||
|
||||
Команда собирает backend и записывает `openapi.json` в корень репозитория.
|
||||
Сервер и HTTP-порт не запускаются; Nest preview читает metadata без создания
|
||||
провайдеров и подключения к БД/T-Bank. Настроенный `.env` и реальные секреты
|
||||
не нужны. `openapi.json` исключён из Git и каждый раз создаётся из DTO/Swagger
|
||||
metadata; передай полученный artifact потребителю отдельно.
|
||||
|
||||
`npm run test:openapi-contract` собирает backend и сравнивает результат генератора
|
||||
с runtime schema настроенного приложения, используя временный каталог и SQLite.
|
||||
`npm run test:e2e` также сначала собирает backend. Изменение публичного API
|
||||
проверяй relevant HTTP tests: без versioned snapshot сравнение не отслеживает
|
||||
breaking changes относительно предыдущего выпуска.
|
||||
|
||||
Разработка идёт напрямую по задаче пользователя; OpenSpec/SDD — по явному запросу.
|
||||
|
||||
## Реальная SQLite и сохранность данных
|
||||
|
||||
@@ -161,4 +174,38 @@ npm run test:durability -- "$baseline_dir"
|
||||
Durability оставляет временные DB, логи и `result.json` по пути из вывода для
|
||||
диагностики; он не откатывает schema пользовательской базы.
|
||||
|
||||
Версии и ветки: [процесс релиза](../README.md#релизы-и-ветки).
|
||||
## Релизы
|
||||
|
||||
Репозиторий выпускается независимо. `develop` — интеграция, `main` — принятые
|
||||
релизы. Работа: `codex/<task>` от актуального `develop`, PR в `develop`.
|
||||
Обычные PR допускают squash; release и обратная синхронизация сохраняют историю.
|
||||
Commits и PR titles — Conventional Commits, включая `spec:`. Версии вручную не повышай.
|
||||
|
||||
1. Получи `main`, `develop` и теги: `git fetch origin --tags`. Убедись, что
|
||||
`develop` содержит последний релиз. Создай `release/<name>` от проверенного
|
||||
`develop`; `nvm use --silent`, `npm ci`. Hotfix начинается от `main` в
|
||||
`release/hotfix-<name>` и проходит тот же процесс.
|
||||
2. На чистой ветке выполни `npm run release:preview`, просмотри версию/changelog,
|
||||
затем `npm run release:prepare`. Команда создаёт `chore(release): X.Y.Z`,
|
||||
обновляет manifest/lockfile/CHANGELOG; тег и push не выполняет. Не обходи
|
||||
guards ветки, чистого дерева, отсутствующих тегов или уже подготовленной версии.
|
||||
3. Проверь diff и штатные gates этого репозитория. Отправь только release-ветку,
|
||||
открой PR в `main` с заголовком `chore(release): X.Y.Z`. После зелёных
|
||||
`verify`, `security`, `commits` выполни fast-forward-only merge. Если `main`
|
||||
изменился, согласуй историю и повтори проверки кандидата.
|
||||
4. Получи удалённый `main`, сравни его HEAD с проверенным release SHA и версией
|
||||
manifest/lockfile. Создай аннотированный `vX.Y.Z` именно на этом SHA:
|
||||
`git tag -a vX.Y.Z <release-sha> -m "Release X.Y.Z"`, затем отправь только
|
||||
`git push origin refs/tags/vX.Y.Z`. Не запускай release-it повторно на `main`.
|
||||
5. Верни release-коммит через PR `main → develop` без squash/rebase; проверь,
|
||||
что `develop` содержит тег. Опубликованные теги не перемещай. При сбое после
|
||||
merge создай отсутствующий тег без нового bump; до merge исправь и проверь
|
||||
существующий кандидат без повторного повышения версии.
|
||||
|
||||
`feat:` повышает minor, `fix:`/`perf:` и прочие разрешённые типы — patch;
|
||||
`!`/`BREAKING CHANGE:` — major, включая версии до 1.0. `chore(release):`
|
||||
исключён из рекомендации и changelog. Конфигурация — `.release-it.json`.
|
||||
В Gitea для `main`/`develop` должны быть запрещены прямой/force push и обход
|
||||
администратором, обязательны `verify`, `security`, `commits`; теги `v*` защищены.
|
||||
Workflow сам не включает эти настройки. Отдельное review approval для одного
|
||||
владельца не требуется. Npm publishing, deploy и Gitea Releases не включены.
|
||||
|
||||
Reference in New Issue
Block a user