14 Commits
Author SHA1 Message Date
ksv741 3027fd51ec ci: validate release PR commits independently (WealthLedger/main#30)
Conventional commits / commits (pull_request) Successful in 11s
2026-10-12 23:39:30 +03:00
ksv741 a659c9dcc7 chore(release): 0.2.2
Conventional commits / commits (pull_request) Failing after 11s
2026-10-12 23:19:12 +03:00
ksv741 d2d1092344 Merge pull request 'docs: refine workflow conventions after review (#27)' (#29) from docs/27-workflow-review-fixes into develop
Reviewed-on: #29
2026-10-12 22:00:20 +03:00
ksv741 fc589c9130 docs: refine workflow conventions after review (#27)
Conventional commits / commits (pull_request) Successful in 12s
2026-10-12 20:29:00 +03:00
codex-bot 3321d9db25 Merge pull request 'chore: establish engineering workflow (#27)' (#28) from chore/27-engineering-workflow into develop 2026-10-12 11:00:35 +03:00
ksv741 03b3b59e6f fix: align workflow commitlint policy (#27)
Conventional commits / commits (pull_request) Successful in 13s
2026-10-12 10:17:53 +03:00
ksv741 59e0831ad2 docs: document PR ownership and board stage (#27)
Conventional commits / commits (pull_request) Successful in 10s
2026-10-12 09:45:41 +03:00
ksv741 2dc72255fe chore: establish engineering workflow (#27)
Conventional commits / commits (pull_request) Successful in 10s
2026-10-12 09:19:58 +03:00
codex-bot ed8221ae8a Merge pull request 'docs: clarify root Node bootstrap #24' (#26) from codex/issue-24-process into develop 2026-10-11 23:23:10 +03:00
ksv741 1ed4dd5a73 docs: clarify root Node bootstrap #24
Conventional commits / commits (pull_request) Successful in 13s
2026-10-11 23:06:51 +03:00
ksv741 dc030f84c9 chore(release): 0.2.1
Conventional commits / commits (pull_request) Successful in 11s
2026-10-07 18:13:55 +03:00
ksv741 f27487b6a8 fix(deps): refresh release security baseline
Conventional commits / commits (pull_request) Successful in 11s
2026-10-07 15:36:45 +03:00
ksv741 9fbc23f757 docs: link production deployment repository
Conventional commits / commits (pull_request) Successful in 13s
2026-09-20 18:50:05 +03:00
ksv741 80fa254a31 chore: point container images to Nexus #15
Conventional commits / commits (pull_request) Successful in 10s
2026-09-17 20:41:10 +03:00
17 changed files with 323 additions and 33 deletions
+162
View File
@@ -0,0 +1,162 @@
# Engineering Workflow
Область: пять независимых checkout workspace (`main`, `frontend`, `backend`,
`docs`, `specs`). Репозиторий `deploy` существует в Gitea отдельно и применяет
свои локальные правила. Этот документ — единственный владелец общего процесса;
локальные AGENTS и conventions определяют технические проверки и ограничения.
## Issue Management
| Переход | Условие входа → действие → условие выхода |
| --- | --- |
| Request → Issue | До изменения файлов/конфигурации/спецификаций определить затронутые repos, найти по смыслу открытые и закрытые Issues, проверить актуальность и scope. Взять подходящую открытую Issue (закрытую переоткрыть только для действительно незавершённой работы) либо создать одну новую. Чтение, анализ и предложение изменений разрешены без Issue. |
| Issue → Analysis | В Issue должны быть результат в title, контекст/проблема и ожидаемое поведение, проверяемые Acceptance Criteria. Уточнить неизвестное до зависимого решения. Выбрать тип и приоритет; назначить исполнителя, если известен; milestone только при реальном плане, dependencies/related Issues только при наличии. |
| Analysis → Delivery | Определить область и риски, выбрать lightweight или SDD ниже. Если AC или owner меняются, сначала обновить соответствующую Issue/согласование. |
Типы: `feature`, `bug`, `refactor`, `tech-debt`, `docs`, `test`, `ci`,
`chore`, `performance`. Существующие org labels отражают их без требования
один-к-одному: `Kind/Feature`, `Kind/Bug`, `Kind/Refactor`,
`Kind/Documentation`, `Kind/Testing`, `Kind/Enhancement` (performance);
repo-local `Kind/Process` подходит для ci, chore и process/tech-debt.
Дополнительные `Kind/Security`, `Kind/Investigation`, `Kind/Dependencies`
(последние два — repo-local) — по ситуации. Priority: существующие
`Priority/Critical|High|Medium|Low`.
Gitea assignee, milestone и state не дублируются labels. Для назначаемых
Issue и PR выбирай `hermes-agent`; незанятую задачу не назначай формально.
Шаблоны ускоряют ввод, но не доказывают качество заполнения.
Один координирующий Issue достаточен, если результат и AC едины, одна команда
может принять работу целиком и отдельные repos не требуют независимой поставки.
Иначе Issue в каждом независимо принимаемом repo; ссылаться друг на друга и
указать порядок зависимостей. Номера `#27` локальны: для чужого repo использовать
`WealthLedger/main#27` или полный URL. Не заводить дубль только из-за второго PR.
## Git Branching
| Переход | Условие входа → действие → условие выхода |
| --- | --- |
| Analysis → Branch | Issue и AC определены; проверить `git status`, текущую ветку и `origin/develop`. Использовать существующую подходящую ветку либо создать одну от актуального `develop` каждого affected repo. Чужие изменения не переносить. |
| Branch → Implementation | `<type>/<issue-number>-<english-kebab-description>`; номер принадлежит указанной в PR Issue (для cross-repo — координатору). Примеры: `feature/123-import-transactions`, `fix/124-invalid-balance`, `refactor/125-simplify-api-client`, `docs/126-update-architecture`. |
Префиксы: feature → `feature`, bug → `fix`, refactor/tech-debt →
`refactor`, docs → `docs`, test → `test`, ci → `ci`, chore → `chore`,
performance → `perf`. Номер обязателен для новых рабочих веток; короткий
английский slug в kebab-case. Ветки `main`/`develop` не место для прямой
разработки. Release/hotfix, обратная синхронизация, Renovate и исторические
ветки подчиняются существующему release/automation процессу, а не переименовываются.
## Commit Conventions
| Переход | Условие входа → действие → условие выхода |
| --- | --- |
| Implementation → Commit | Одна связанная задача на commit, проверить staged paths/diff. Заголовок Conventional Commits с осмысленным subject и ссылкой на Issue: `feat(portfolio): add transaction import (#123)` или `ci: align gates (WealthLedger/main#27)`. Scope только при полезной области. |
Commitlint требует распознаваемую conventional-commits-parser ссылку, но не
проверяет числовой формат, существование Issue, её смысл или корректный repo.
Использовать `#N` только для локальной Issue и `WealthLedger/repo#N` для чужой;
это формат команды, проверяемый при review. Не добавлять custom validator
ради более строгой регулярной проверки. Без `fixes`,
`closes`, `resolves` в сообщении: не закрывать задачу первым коммитом.
Ссылка в footer тоже принимается commitlint; размещение в заголовке остаётся
правилом команды. Если заголовок PR после squash станет commit title, оставить
в нём ссылку. `chore(release): X.Y.Z` освобождён только при точном SemVer
заголовке release-it. Стандартные Gitea merge commits освобождаются по точному
шаблону merge message; sync PR используют обычный review/merge process.
Шаблонные сообщения `Revert`/`fixup!`/`squash!` не освобождаются: revert
оформляй как `revert: … (#N)`. Историю не переписывать ради формата.
## Pull Request Process
| Переход | Условие входа → действие → условие выхода |
| --- | --- |
| Validation → PR | Завершить AC и релевантные локальные проверки; PR в `develop` из рабочей ветки, только связанный diff. В теле: Summary, Linked Issue, Changes, Verification (команда/результат/ограничения), Breaking Changes при наличии. Для cross-repo PR указывать полный reference и связанные PR. |
| PR → Review → Merge | Дождаться required checks на финальной ревизии, проверить AC, значимые изменения — review владельца/специалиста. При замечаниях исправить и обновить evidence. Merge только по политике repo. |
| Merge → Issue Closed | Закрыть Issue после принятия **всех** связанных delivery areas, документации и при SDD — обязательной verification/archive; multi-PR Issue остаётся открытой до последнего результата. |
Перед передачей PR на review перенеси в него тип и приоритет связанной Issue,
назначь `hermes-agent`, привяжи к подходящему milestone (если он есть) и к
`WealthLedger — Delivery Board`, колонка «На проверке». Для cross-repo PR
используй milestone его собственного repo. Колонку меняй вместе со стадией:
при блокировке — «Заблокировано», после принятия — «Готово». Не вводи label
этапа вместо встроенной колонки проекта.
Для SDD отдельные pre-archive checks/semantic review выполняются до archive по
локальной schema; порядок merge/archive согласуется с конкретным change, но
Issue закрывается только после обоих событий. Не подменять OpenSpec approval
обычным PR review.
## SDD Integration
Lightweight: локальный bugfix с известным ожидаемым поведением, docs-only,
рефакторинг без изменения контрактов/наблюдаемого поведения и малые CI-правки:
`Issue → Analysis → Branch → Implementation → Validation → PR`.
SDD: новая функциональность, изменение публичного API, бизнес-правил, поведения
нескольких компонентов, архитектуры или неоднозначные требования. После Issue
уточнить намерение и запросить согласование Change Owner на вход в OpenSpec;
OpenSpec lifecycle применяется только по явному запросу/решению владельца.
Использовать **только** store `wealth-ledger-specs` и его локальный lifecycle:
Proposal → Delta Specs → System Analysis → Design + QA Analysis → Docs Impact →
Tasks → Apply (для legacy change — его собственная schema). Явные approvals
перед downstream artifacts и Apply не заменяются Issue/PR. Ветка specs может
появиться для planning; ветки реализации — когда Apply разрешён, без
насильственной общей точки создания всех веток. Связать Issue ↔ change ID ↔
PR текстовыми ссылками; после проверки применить штатные sync/archive и
completion evidence согласно локальной schema. Число файлов не определяет SDD.
Если владелец не согласовал вход в SDD, не начинать зависящую реализацию
контракта/семантики и явно сообщить блокировку.
## AI Agent Responsibilities
Перед edit — поиск подходящей Issue, AC, workflow, branch/status каждого repo;
затем только согласованный scope. По завершении — итоговый diff, проверенные
команды и ограничения, подготовка commit/PR по запросу и статус Issue. Чтение
не требует Issue. Если Gitea недоступна, сообщить об этом до edit и запросить
issue reference; не выдавать локальную заметку за Issue. Агенты используют
локальные инструкции репозитория и его CI inputs, не полагаются на соседние
checkout как обязательную build-зависимость. Этот источник доступен в main;
при недоступной ссылке самостоятельный checkout сохраняет обязательный минимум
в своём AGENTS и не блокирует локальную работу из-за отсутствия root checkout.
## Quality Gates
Итерации: узкие проверки по риску; после логического изменения — релевантные
тесты; перед передачей результата — локальные обязательные gates данного repo
на итоговом diff; CI — независимые полные проверки. Не повторять дорогой verify
после каждого файла; повторить при изменении значимых входов. `main`: `commits`;
остальные: локальные `verify`, `security`, `commits` согласно фактическим CI.
Frontend/backend запускают их как jobs в едином `verify.yml`, docs/specs —
как отдельные workflows; второго CI ради одного правила не требуется.
Для Markdown-only не запускать application build. Результат lint не заменяет
семантическую проверку. Обязательность merge checks зависит от защиты ветки.
| Правило | Уровень на момент принятия документа |
| --- | --- |
| Conventional Commits и parser-recognized Issue reference в PR title/commits | CI-проверка через существующий commitlint; блокировка merge **только если** check обязателен в branch protection. Не гарантирует numeric reference, существование или соответствие Issue. Точный release SemVer title и штатные Gitea merge messages исключены. Локальные hooks не гарантируют server-side. |
| PR вместо прямого push; successful checks перед merge | Enforced только в repos/ветках, где Gitea branch protection настроена и проверена владельцем. YAML сам по себе не защищает ветку. |
| Поиск актуальной Issue, AC, корректный repo, branch name/source, соответствие ссылки, SDD selection, scope, статус | Agent-guided; templates и текст не могут гарантировать соответствие. |
| Значимое review, соответствие AC/контракту, исключения и closure после всех PR | Manual; approval может быть required в Gitea, если есть независимый reviewer. |
## Exceptions and Recovery
Срочный hotfix: немедленно завести/найти Issue, затем исправление в
`release/hotfix-<name>` от актуального `main` по существующему release process;
проверки и PR в `main`, затем вернуть результат в `develop`. Связать Issue
в PR и сопровождающем коммите; специальная release-ветка исключена из обычного
шаблона имён. Не отменять Issue или проверки из-за срочности.
Если CI красный или PR устарел — исправить в той же ветке и перепроверить
актуальный HEAD; если AC изменились — обновить Issue и при SDD вернуть change
к затронутому approval gate. При недоступной Gitea продолжать только анализ.
Изменение PR title после зелёного CI: проверить, что check пересчитан;
если `edited` trigger у существующих checks отсутствует, reviewer проверяет
текущий title вручную. Новые правила не применяются к историческим коммитам
и автоматической обратной синхронизации релиза.
Примеры: фича с новым поведением — Issue → согласованный OpenSpec change →
ветки Apply → PR каждого affected repo → archive → закрытие Issue. Локальный
bugfix — Issue → `fix/124-invalid-balance` → регрессия → PR → закрытие.
Cross-repo контракт — одна Issue с общими AC, `backend` и `frontend` PR с
`WealthLedger/main#27` и взаимными ссылками; если независимые acceptance/owners,
отдельные связанные Issues. Рефакторинг без изменения поведения — lightweight
`refactor/125-simplify-api-client`. Hotfix — Issue → `release/hotfix-*` от
`main` → PR/release → back-merge в `develop` → закрытие.
+4 -2
View File
@@ -2,11 +2,13 @@
- Выполняй Git-команды из репозитория владельца: root, frontend, backend, - Выполняй Git-команды из репозитория владельца: root, frontend, backend,
docs и specs имеют независимые history, index и branches. docs и specs имеют независимые history, index и branches.
- Новая работа: ветка `codex/<task>` от актуального `develop`, затем PR в `develop`. - Новая работа: ветка с номером Issue по [Engineering Workflow](engineering-workflow.md#git-branching)
от актуального `develop`, затем PR в `develop`.
Сохраняй чужие staged/unstaged/untracked изменения; не переноси их в свой commit. Сохраняй чужие staged/unstaged/untracked изменения; не переноси их в свой commit.
- Commit содержит одну связанную задачу и её необходимые проверки/документацию. - Commit содержит одну связанную задачу и её необходимые проверки/документацию.
Межрепозиторное изменение оформляй отдельными commits/PR с взаимными ссылками. Межрепозиторное изменение оформляй отдельными commits/PR с взаимными ссылками.
- Commits и заголовки PR — Conventional Commits; допустим `spec:`. - Commits и заголовки PR — Conventional Commits со ссылкой на Issue;
допустим `spec:`. Исключения release — в README.
Формат проверяет local commitlint; правила других repo принадлежат их AGENTS. Формат проверяет local commitlint; правила других repo принадлежат их AGENTS.
- Перед commit проверь `git diff --cached --name-status` и сам staged diff - Перед commit проверь `git diff --cached --name-status` и сам staged diff
в каждом affected repo. Root tracking ограничен [.gitignore](../../.gitignore): в каждом affected repo. Root tracking ограничен [.gitignore](../../.gitignore):
+2 -2
View File
@@ -1,7 +1,7 @@
# Copy to a restricted, untracked file. Never commit filled values. # Copy to a restricted, untracked file. Never commit filled values.
# Full release image references; use published version tags, not latest. # Full release image references; use published version tags, not latest.
FRONTEND_IMAGE=git.personal.ksv741.ru/wealthledger/frontend:0.1.0 FRONTEND_IMAGE=nexus.ksv741.keenetic.pro/wealthledger/frontend:0.2.0
BACKEND_IMAGE=git.personal.ksv741.ru/wealthledger/backend:0.1.0 BACKEND_IMAGE=nexus.ksv741.keenetic.pro/wealthledger/backend:0.2.0
FRONTEND_PORT=8080 FRONTEND_PORT=8080
FRONTEND_ORIGIN=https://wealthledger.example.com FRONTEND_ORIGIN=https://wealthledger.example.com
# Absolute directory, pre-created with owner UID/GID 1000:1000 and mode 0700. # Absolute directory, pre-created with owner UID/GID 1000:1000 and mode 0700.
+12
View File
@@ -0,0 +1,12 @@
---
name: Bug Report
about: Неверное поведение
---
## Проблема и шаги воспроизведения
## Факт / ожидание
## Acceptance Criteria
- [ ]
## Окружение / ссылки (если применимо)
+10
View File
@@ -0,0 +1,10 @@
---
name: Engineering Task
about: CI, тесты, документация, процесс и прочее
---
## Контекст и результат
## Scope / связанные Issues (если есть)
## Acceptance Criteria
- [ ]
+12
View File
@@ -0,0 +1,12 @@
---
name: Feature Request
about: Новое наблюдаемое поведение
---
## Зачем и какой результат
## Ожидаемое поведение
## Acceptance Criteria
- [ ]
## Зависимости / связанные Issues (если есть)
+12
View File
@@ -0,0 +1,12 @@
---
name: Refactoring / Technical Debt
about: Улучшение без нового поведения
---
## Проблема и результат
## Сохраняемые инварианты / границы
## Acceptance Criteria
- [ ]
## Зависимости / ссылки (если есть)
+11
View File
@@ -0,0 +1,11 @@
## Summary
## Linked Issue
Refs
## Changes
## Verification
- Команда / результат / ограничения:
## Breaking Changes (если есть)
+5 -1
View File
@@ -23,4 +23,8 @@ jobs:
HEAD_SHA: ${{ github.event.pull_request.head.sha }} HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: | run: |
printf '%s\n' "$PR_TITLE" | npm exec --no -- commitlint --strict printf '%s\n' "$PR_TITLE" | npm exec --no -- commitlint --strict
npm exec --no -- commitlint --strict --from "$BASE_SHA" --to "$HEAD_SHA" if [[ "$PR_TITLE" =~ ^chore\(release\):\ [0-9]+\.[0-9]+\.[0-9]+$ ]]; then
npm exec --no -- commitlint --strict --from "$HEAD_SHA^" --to "$HEAD_SHA"
else
npm exec --no -- commitlint --strict --from "$BASE_SHA" --to "$HEAD_SHA"
fi
+9
View File
@@ -12,6 +12,7 @@
!/.ai/conventions/ !/.ai/conventions/
/.ai/conventions/* /.ai/conventions/*
!/.ai/conventions/git.md !/.ai/conventions/git.md
!/.ai/conventions/engineering-workflow.md
!/.ai/conventions/dependencies.md !/.ai/conventions/dependencies.md
!/.ai/conventions/code-health.md !/.ai/conventions/code-health.md
!/.ai/conventions/testing.md !/.ai/conventions/testing.md
@@ -28,9 +29,17 @@
!/.release-it.json !/.release-it.json
!/CHANGELOG.md !/CHANGELOG.md
!/commitlint.config.cjs !/commitlint.config.cjs
!/.gitleaksignore
!/renovate.json !/renovate.json
!/.gitea/ !/.gitea/
/.gitea/* /.gitea/*
!/.gitea/workflows/ !/.gitea/workflows/
/.gitea/workflows/* /.gitea/workflows/*
!/.gitea/workflows/commits.yml !/.gitea/workflows/commits.yml
!/.gitea/ISSUE_TEMPLATE/
/.gitea/ISSUE_TEMPLATE/*
!/.gitea/ISSUE_TEMPLATE/feature.md
!/.gitea/ISSUE_TEMPLATE/bug.md
!/.gitea/ISSUE_TEMPLATE/refactor.md
!/.gitea/ISSUE_TEMPLATE/engineering.md
!/.gitea/PULL_REQUEST_TEMPLATE.md
+3
View File
@@ -0,0 +1,3 @@
# Reviewed historical local-development fixture: base64 of the deterministic
# string 0123456789abcdef repeated twice, never a runtime secret.
7e382d460be296b6c88e17084fff17bb7728f6ea:.env.development.example:generic-api-key:9
+9 -1
View File
@@ -12,6 +12,11 @@ Root tracking ограничен allowlist; локальные данные и n
Публичные API artifacts передаются явно; CI каждого repo использует локальные Публичные API artifacts передаются явно; CI каждого repo использует локальные
входы. Справочные источники не становятся обязательной цепочкой инструкций. входы. Справочные источники не становятся обязательной цепочкой инструкций.
До изменения проекта найди подходящую Gitea Issue (или создай после поиска),
проверь Acceptance Criteria, scope и рабочую ветку. Чтение/анализ допускаются
без Issue. Маршрут, выбор lightweight/SDD и cross-repo ссылки — в
[Engineering Workflow](.ai/conventions/engineering-workflow.md).
Начни с результата и affected areas. До edits проследи поведение/invariants, Начни с результата и affected areas. До edits проследи поведение/invariants,
найди owner и 1–3 примера. Работай напрямую; OpenSpec/SDD — по явному запросу. найди owner и 1–3 примера. Работай напрямую; OpenSpec/SDD — по явному запросу.
@@ -23,7 +28,10 @@ Root tracking ограничен allowlist; локальные данные и n
| Git/branch/commit/PR/tracking | [Git](.ai/conventions/git.md) | | Git/branch/commit/PR/tracking | [Git](.ai/conventions/git.md) |
| Release/hotfix | [README](README.md#релизы-и-ветки) | | Release/hotfix | [README](README.md#релизы-и-ветки) |
Перед Node-командой активируй местную `.nvmrc`: `nvm use --silent`. Перед Node-командой активируй местную `.nvmrc`: если `nvm` не загружен
в non-interactive shell, загрузи установленный `$HOME/.nvm/nvm.sh`, затем
выполни `nvm use --silent` из root. Если `nvm.sh` недоступен, остановись;
не используй системный Node вместо проектного.
При новой границе и перед завершением повтори routing по staged/unstaged/new При новой границе и перед завершением повтори routing по staged/unstaged/new
files; сохраняй чужие изменения. Missing source/конфликт требований сообщи files; сохраняй чужие изменения. Missing source/конфликт требований сообщи
до зависимого решения. После diff выполни до зависимого решения. После diff выполни
+30
View File
@@ -1,5 +1,35 @@
# Changelog # Changelog
## [0.2.2](https://git.personal.ksv741.ru/WealthLedger/main/compare/v0.2.1...v0.2.2) (2026-10-12)
### Bug Fixes
* align workflow commitlint policy ([#27](https://git.personal.ksv741.ru/WealthLedger/main/issues/27)) ([03b3b59](https://git.personal.ksv741.ru/WealthLedger/main/commit/03b3b59e6ff2ba391f9dfc42a039a96d0d84c1c9))
### Documentation
* clarify root Node bootstrap [#24](https://git.personal.ksv741.ru/WealthLedger/main/issues/24) ([1ed4dd5](https://git.personal.ksv741.ru/WealthLedger/main/commit/1ed4dd5a73a250f24f452a26b5f5b0fcbb15f758))
* document PR ownership and board stage ([#27](https://git.personal.ksv741.ru/WealthLedger/main/issues/27)) ([59e0831](https://git.personal.ksv741.ru/WealthLedger/main/commit/59e0831ad28d6990416e651f55d783b8d2ac98c2))
* refine workflow conventions after review ([#27](https://git.personal.ksv741.ru/WealthLedger/main/issues/27)) ([fc589c9](https://git.personal.ksv741.ru/WealthLedger/main/commit/fc589c9130e90480c09f8fe8d47dd871aa05145e))
### Maintenance
* establish engineering workflow ([#27](https://git.personal.ksv741.ru/WealthLedger/main/issues/27)) ([2dc7225](https://git.personal.ksv741.ru/WealthLedger/main/commit/2dc72255fe51bb48a208e10846d42d9f59e2c1af))
## [0.2.1](https://git.personal.ksv741.ru/WealthLedger/main/compare/v0.2.0...v0.2.1) (2026-10-07)
### Bug Fixes
* **deps:** refresh release security baseline ([f27487b](https://git.personal.ksv741.ru/WealthLedger/main/commit/f27487b6a8cb59243a34e392059010dab38efd51))
### Documentation
* link production deployment repository ([9fbc23f](https://git.personal.ksv741.ru/WealthLedger/main/commit/9fbc23f7570ecb6ea13f7fae5490504d1a0d9ba8))
### Maintenance
* point container images to Nexus [#15](https://git.personal.ksv741.ru/WealthLedger/main/issues/15) ([80fa254](https://git.personal.ksv741.ru/WealthLedger/main/commit/80fa254a31d525dbc98bb3fe2d949f78c8e5872b))
## [0.2.0](https://git.personal.ksv741.ru/WealthLedger/main/compare/v0.1.0...v0.2.0) (2026-09-16) ## [0.2.0](https://git.personal.ksv741.ru/WealthLedger/main/compare/v0.1.0...v0.2.0) (2026-09-16)
### Features ### Features
+12 -11
View File
@@ -68,15 +68,14 @@ Nest работает в watch mode. Host `node_modules` и `.env` не монт
Данные development хранятся отдельно в named volume `development-data` проекта `wealthledger-dev`; Данные development хранятся отдельно в named volume `development-data` проекта `wealthledger-dev`;
обычные restart/down их сохраняют. Изменение dependencies/config требует rebuild. обычные restart/down их сохраняют. Изменение dependencies/config требует rebuild.
Production использует `compose.yaml` и restricted env по `.env.compose.example`: Production использует отдельный [репозиторий deploy](https://git.personal.ksv741.ru/WealthLedger/deploy):
две ссылки на опубликованные версии images, persistent absolute host data path, его Git-тег закрепляет пару images, а `./deploy.sh vX.Y.Z` выполняет обновление.
постоянные JWT/encryption secrets и публичный HTTPS origin. Каталог данных Рабочие данные, сертификат T-Bank и постоянные ключи находятся вне checkout.
должен существовать и принадлежать UID/GID 1000:1000. Только frontend публикует Только frontend публикует `127.0.0.1:8080`; серверный Caddy направляет туда весь
`127.0.0.1:8080`; серверный Caddy направляет туда весь домен. Backend port домен. Backend port остаётся внутренним. Корневой Compose сохраняется для development.
остаётся внутренним, migration service использует тот же backend image.
Полная процедура установки, независимых обновлений, stopped-backend backup Пошаговая процедура установки, обновления и восстановления — README `deploy`;
и explicit restore — [документация](https://git.personal.ksv741.ru/WealthLedger/docs), архитектурные границы — [документация](https://git.personal.ksv741.ru/WealthLedger/docs),
страница `architecture/deployment.md`. страница `architecture/deployment.md`.
Перед backend update обязательны остановка, backup и успешная migration. Перед backend update обязательны остановка, backup и успешная migration.
Image rollback не восстанавливает старую базу. Публикация component images Image rollback не восстанавливает старую базу. Публикация component images
@@ -150,6 +149,7 @@ Allowlist root проверяется вручную по staged paths. Backend
T-Bank. Полные команды и ограничения принадлежат README T-Bank. Полные команды и ограничения принадлежат README
[frontend](https://git.personal.ksv741.ru/WealthLedger/frontend/src/commit/9f7e342333b80bfacfd5bc394a2dcd0613d33ff3/README.md#проверка) и [backend](https://git.personal.ksv741.ru/WealthLedger/backend/src/commit/016782657acfd35ff3fd755462007938fac35156/README.md#проверка). [frontend](https://git.personal.ksv741.ru/WealthLedger/frontend/src/commit/9f7e342333b80bfacfd5bc394a2dcd0613d33ff3/README.md#проверка) и [backend](https://git.personal.ksv741.ru/WealthLedger/backend/src/commit/016782657acfd35ff3fd755462007938fac35156/README.md#проверка).
Для изменения проекта начните с [AGENTS](AGENTS.md). Для изменения проекта начните с [AGENTS](AGENTS.md).
Общий маршрут Issue → PR — [Engineering Workflow](.ai/conventions/engineering-workflow.md).
## Релизы и ветки ## Релизы и ветки
@@ -158,8 +158,8 @@ T-Bank. Полные команды и ограничения принадлеж
`vX.Y.Z`. Root-репозиторий называется `main`, его ветки — `main` и `develop`. `vX.Y.Z`. Root-репозиторий называется `main`, его ветки — `main` и `develop`.
`main` хранит принятые релизы, `develop` — интеграцию разработки. Новая задача: `main` хранит принятые релизы, `develop` — интеграцию разработки. Новая задача:
отдельная ветка от свежего `develop`, затем PR в `develop`. Для веток агента отдельная [issue-linked ветка](.ai/conventions/engineering-workflow.md#git-branching)
используется `codex/<task>`; также допустимы `feature/<task>` и `fix/<task>`. от свежего `develop`, затем PR в `develop`.
В `main` напрямую не пушить. Обычные PR можно squash-merge; релизные PR и В `main` напрямую не пушить. Обычные PR можно squash-merge; релизные PR и
обратную синхронизацию `main` с `develop` сливать с сохранением истории. обратную синхронизацию `main` с `develop` сливать с сохранением истории.
@@ -168,7 +168,8 @@ Commits и заголовки PR — Conventional Commits. `feat:` повыша
`docs:`, `spec:`, `chore:`, `build:`, `ci:`, `refactor:`, `test:`, `style:` и `docs:`, `spec:`, `chore:`, `build:`, `ci:`, `refactor:`, `test:`, `style:` и
`revert:` дают patch при выпуске. `chore(release):` — служебная запись, `revert:` дают patch при выпуске. `chore(release):` — служебная запись,
исключённая из changelog и рекомендации версии. Release-it не запускается исключённая из changelog и рекомендации версии. Release-it не запускается
автоматически после каждого commit. Номер связанной issue можно добавить в заголовок. автоматически после каждого commit. Ссылка на Issue — в
[Commit Conventions](.ai/conventions/engineering-workflow.md#commit-conventions).
### Подготовка релиза ### Подготовка релиза
+9 -1
View File
@@ -1,4 +1,12 @@
module.exports = { module.exports = {
extends: ["@commitlint/config-conventional"], extends: ["@commitlint/config-conventional"],
rules: { "type-enum": [2, "always", ["feat", "fix", "perf", "docs", "spec", "refactor", "build", "ci", "test", "style", "chore", "revert"]] }, defaultIgnores: false,
ignores: [
message => /^chore\(release\): \d+\.\d+\.\d+$/.test(message.trim()),
message => /^Merge pull request ['"].+['"] \(#\d+\) from .+ into .+$/.test(message.trim()),
],
rules: {
"type-enum": [2, "always", ["feat", "fix", "perf", "docs", "spec", "refactor", "build", "ci", "test", "style", "chore", "revert"]],
"references-empty": [2, "never"],
},
}; };
+14 -14
View File
@@ -1,12 +1,12 @@
{ {
"name": "wealth-ledger-workspace", "name": "wealth-ledger-workspace",
"version": "0.2.0", "version": "0.2.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "wealth-ledger-workspace", "name": "wealth-ledger-workspace",
"version": "0.2.0", "version": "0.2.2",
"devDependencies": { "devDependencies": {
"@commitlint/cli": "21.2.2", "@commitlint/cli": "21.2.2",
"@commitlint/config-conventional": "21.2.2", "@commitlint/config-conventional": "21.2.2",
@@ -1446,9 +1446,9 @@
} }
}, },
"node_modules/basic-ftp": { "node_modules/basic-ftp": {
"version": "5.3.1", "version": "6.2.2",
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-6.2.2.tgz",
"integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==", "integrity": "sha512-LIkJcf/F6bTTfvE3k2YcTxrJsLKKVXiEpHZYkQP6JoqTb7khng7c13ckRTDQbqRh5IkehVH3F00sSlAa2F6DwA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -2124,9 +2124,9 @@
} }
}, },
"node_modules/fast-uri": { "node_modules/fast-uri": {
"version": "3.1.7", "version": "3.1.8",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
"integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@@ -2355,9 +2355,9 @@
} }
}, },
"node_modules/ip-address": { "node_modules/ip-address": {
"version": "10.7.0", "version": "10.7.3",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.0.tgz", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.3.tgz",
"integrity": "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==", "integrity": "sha512-A1kdq/tSb5QjvKvAMgIoEvDBIgL7qaqVP/jkvSwYYRZ9iEzvPpopxp2wQfu3SuZRHtpHNxMn8Fs0bS+gf5Xmwg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -3439,9 +3439,9 @@
} }
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "7.29.0", "version": "7.29.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz",
"integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
+7 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "wealth-ledger-workspace", "name": "wealth-ledger-workspace",
"version": "0.2.0", "version": "0.2.2",
"private": true, "private": true,
"engines": { "engines": {
"node": "24.21.0" "node": "24.21.0"
@@ -16,5 +16,11 @@
"@release-it/conventional-changelog": "12.0.0", "@release-it/conventional-changelog": "12.0.0",
"conventional-changelog-conventionalcommits": "10.4.0", "conventional-changelog-conventionalcommits": "10.4.0",
"release-it": "21.0.2" "release-it": "21.0.2"
},
"overrides": {
"basic-ftp": "6.2.2",
"fast-uri": "3.1.8",
"ip-address": "10.7.3",
"undici": "7.29.1"
} }
} }