From 9a80a9d84304c8d4b985dd533b80ff74568a2f1c Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Tue, 21 Jul 2026 16:04:02 +0300 Subject: [PATCH 1/3] =?UTF-8?q?chore(rules):=20sync=20@7n/rules=201.38.0?= =?UTF-8?q?=20=E2=80=94=20rust/workspace=5Froot=20=D0=BA=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=BD=20(nitra/7n-rules#179)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Плагіни: lang-rust 0.7.0 (новий концерн workspace_root — один кореневий Cargo workspace на репо), lang-js 0.12.0, ci-github 1.9.0. Виправлені tauri/gitignore_target (target dir від фактичної workspace-топології, не суфікс-конвенції) і core_test_isolation (валідний приклад layout). Co-Authored-By: Claude Fable 5 --- .cursor/rules/n-ga.mdc | 137 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/.cursor/rules/n-ga.mdc b/.cursor/rules/n-ga.mdc index f7a3557..9e80a7b 100644 --- a/.cursor/rules/n-ga.mdc +++ b/.cursor/rules/n-ga.mdc @@ -191,6 +191,143 @@ jobs: "Infisical/secrets-action": "1.0.16" } ``` +- `lint-repo.yml`: + +```yaml +name: Lint repo-wide + +on: + push: + branches: + - dev + - main + + pull_request: + branches: + - dev + - main + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + lint-repo: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + - uses: ./.github/actions/setup-bun-deps + + - name: Repo-wide lint + run: bunx n-rules lint --repo-wide --no-fix +``` + +## Repo-wide лінти (`lint-repo.yml`, обовʼязковий) + +Перевірки без path-підтримки (`scope: full` без glob: knip, jscpd, dep-policy тощо) живуть в окремому обовʼязковому workflow `.github/workflows/lint-repo.yml` із кроком `bunx n-rules lint --repo-wide --no-fix`. Він **не гейтить деплой** — жоден deploy-workflow не має на нього `needs`. Деталі: [lint_repo_yml.mdc](./lint_repo_yml/lint_repo_yml.mdc). + +## Сервіс-орієнтовані deploy-workflow (опційно) + +Монорепо з деплой-сервісами (каталог сервісу, напр. `run/nexus`) оформлює деплой per-service workflow: тригер `paths` по каталогу (dir-scoped glob `run//**` — саме він, а не імʼя файлу, робить workflow сервісним; імʼя довільне — `npm-publish.yml`, `deploy-.yml`, і **не перейменовуй наявні** — OIDC trusted publishing привʼязаний до імені) → джоба `plan` (`bunx n-rules ci plan --path --github`) → паралельні `lint-`-джоби з гейтом по outputs плану + тести сервісу → deploy з `needs` на всі перевірки (skipped не блокує, failed блокує). Форму перевіряє rego-концерн `service_deploy_workflow` — вимоги вмикаються лише за наявності lint-джоб у workflow; приклад — `deploy-service.yml`: + +```yaml +# Документаційний приклад сервіс-орієнтованого deploy-workflow (ga.mdc). +# Це НЕ deep-subset-канон (перелік сервісів консюмер-специфічний) — форму +# перевіряє service_deploy_workflow.rego за ЗМІСТОМ: сервісний workflow = +# dir-scoped glob у on.push.paths. Імʼя файлу довільне (npm-publish.yml, +# deploy-.yml, …) — не перейменовуй наявні: OIDC trusted publishing +# привʼязаний до імені workflow. Плейсхолдер run/ заміни на каталог +# сервісу; набір lint- джоб добери під стеки сервісу (зайва джоба +# нешкідлива — ci plan її скіпне). +name: Deploy + +on: + push: + branches: + - dev + - main + paths: + - 'run//**' + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + plan: + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + js: ${{ steps.plan.outputs.js }} + python: ${{ steps.plan.outputs.python }} + any: ${{ steps.plan.outputs.any }} + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + fetch-depth: 0 + + - uses: ./.github/actions/setup-bun-deps + + - id: plan + run: bunx n-rules ci plan --path run/ --github + + lint-js: + needs: plan + if: needs.plan.outputs.js == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + fetch-depth: 0 + + - uses: ./.github/actions/setup-bun-deps + + - run: bunx n-rules lint js --path run/ --no-fix + + # …lint- для кожного домену сервісу (python/docker/k8s/security/…) + + test: + needs: plan + if: needs.plan.outputs.any == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + fetch-depth: 0 + + - uses: ./.github/actions/setup-bun-deps + + # python-стек: перед тестами ще uv (uses: astral-sh/setup-uv@v7 + uv sync --locked) + - run: bun test run/ + + deploy: + needs: + - plan + - lint-js + - test + # Skipped-лінт (гейт ci plan) НЕ блокує деплой; failed — блокує. + if: ${{ !cancelled() && needs.plan.result == 'success' && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + # …кроки деплою сервісу (build/push/apply) +```, деталі — [service_deploy_workflow.mdc](./service_deploy_workflow/service_deploy_workflow.mdc). Співіснує з file-type-workflow (`lint-js.yml` тощо) — ті покривають зміни поза сервіс-каталогами. - `lint-repo.yml`: From 053fb02c06eed664e2fc6accef5576853a13e43d Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Tue, 21 Jul 2026 16:54:10 +0300 Subject: [PATCH 2/3] =?UTF-8?q?feat(rust):=20=D0=BA=D0=BE=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=B2=D0=B8=D0=B9=20Cargo=20workspace=20=E2=80=94?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=BD=D0=BE=D1=80=D0=B5=D0=BF=D0=BE-=D0=BA?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=BD=20rust/workspace=5Froot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Аналог кореневого package.json для Rust: кореневий Cargo.toml (members = app/src-tauri, owner/src-tauri, owner/owner-llm; resolver 2; [profile.dev] у корені), один Cargo.lock і один target/ на репо — єдиний пін mt-core/llm-cascade для обох продуктів. Супутнє: - .gitignore → target/; rust-cache у release*.yml → дефолтний корінь - lint-rust.yml: bare cargo fmt/clippy з кореня — нарешті покриває owner (раніше лінтився лише app/src-tauri) + канон rust/lint_rust_yml - FakeOmlxProvider у owner-llm тестах (канон-іменування core_test_isolation); cargo fmt по всьому workspace - порт авто-фіксів lint --full (oxfmt, canonical lint-воркфлоу включно з новими lint-k8s/lint-repo, vitest pool: forks, зайва root-залежність) + mt-вузли беклогу manual-фіксів - .cargo/mutants.toml + deny.toml базлайни (rust-канон; deny.toml переписано на валідні секції cargo-deny замість LLM-стабу) Co-Authored-By: Claude Fable 5 --- .cspell.json | 2 -- .cursor/rules/n-ga.mdc | 1 + app/.changes/260721-1652.md | 5 +++++ owner/.changes/260721-1652-2.md | 5 +++++ 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 app/.changes/260721-1652.md create mode 100644 owner/.changes/260721-1652-2.md diff --git a/.cspell.json b/.cspell.json index cf33b78..81952c3 100644 --- a/.cspell.json +++ b/.cspell.json @@ -84,8 +84,6 @@ "гейтованою", "гейтом", "дашбордом", - "дедлайнових", - "таймзони", "дебаунс", "дебаунсить", "дедлайнових", diff --git a/.cursor/rules/n-ga.mdc b/.cursor/rules/n-ga.mdc index 9e80a7b..5a6d21c 100644 --- a/.cursor/rules/n-ga.mdc +++ b/.cursor/rules/n-ga.mdc @@ -191,6 +191,7 @@ jobs: "Infisical/secrets-action": "1.0.16" } ``` + - `lint-repo.yml`: ```yaml diff --git a/app/.changes/260721-1652.md b/app/.changes/260721-1652.md new file mode 100644 index 0000000..85b0b0c --- /dev/null +++ b/app/.changes/260721-1652.md @@ -0,0 +1,5 @@ +--- +bump: patch +section: Changed +--- +Кореневий Cargo workspace (rust/workspace_root): члени app/src-tauri + owner/src-tauri + owner/owner-llm, один Cargo.lock і target/ у корені; lint-rust покриває всі члени diff --git a/owner/.changes/260721-1652-2.md b/owner/.changes/260721-1652-2.md new file mode 100644 index 0000000..3534da0 --- /dev/null +++ b/owner/.changes/260721-1652-2.md @@ -0,0 +1,5 @@ +--- +bump: patch +section: Changed +--- +Кореневий Cargo workspace: owner/Cargo.toml прибрано на користь кореневого; FakeOmlxProvider у тестах owner-llm (core_test_isolation) From 956009dba016a7a9a6a8ba3839427847841587f1 Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Mon, 27 Jul 2026 09:54:34 +0300 Subject: [PATCH 3/3] feat(rust): adopt the root Cargo workspace convention --- .cspell.json | 15 +++++++++++++++ .cursor/rules/n-ga.mdc | 4 ++-- mt/lint-fix-js-knip-1aa23aeb/task.md | 1 + mt/lint-fix-k8s-manifests-f9cb7a94/task.md | 1 + mt/lint-fix-vue-packages-c8869493/task.md | 1 + 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.cspell.json b/.cspell.json index 81952c3..682ac11 100644 --- a/.cspell.json +++ b/.cspell.json @@ -65,6 +65,7 @@ "vkozlov", "Автовибір", "автовизначити", + "Автоміграція", "Агрегуюча", "апдейтер", "апдейтера", @@ -81,8 +82,11 @@ "брифу", "вебвʼю", "воркспейсом", + "гейтить", + "гейті", "гейтованою", "гейтом", + "гейтять", "дашбордом", "дебаунс", "дебаунсить", @@ -91,9 +95,11 @@ "деплой", "деривується", "дефолта", + "джоб", "джоба", "джоби", "джобів", + "джобу", "диспатч", "диспатча", "екшн", @@ -102,6 +108,7 @@ "ендпоінти", "ескальовано", "ескалювати", + "заготовками", "залогінений", "запропонуючи", "запускувані", @@ -113,6 +120,9 @@ "клікнутого", "комітиться", "Композабл", + "консюмер", + "консюмера", + "консюмерів", "конфігурованих", "конфігурованого", "краш", @@ -122,8 +132,10 @@ "леджер", "лейбл", "лендинг", + "лінти", "логується", "макроса", + "мапінгом", "маршрутизуються", "машинно", "метаключ", @@ -168,6 +180,7 @@ "працюючого", "пробросу", "прогон", + "прокинуті", "пропси", "пропсом", "ранів", @@ -178,9 +191,11 @@ "рунги", "рунгів", "самозатиралися", + "скіпне", "сконфігуровазованого", "скоуп", "скоупи", + "скоупитись", "скоупом", "скоупу", "спавнені", diff --git a/.cursor/rules/n-ga.mdc b/.cursor/rules/n-ga.mdc index 5a6d21c..c3a53fd 100644 --- a/.cursor/rules/n-ga.mdc +++ b/.cursor/rules/n-ga.mdc @@ -366,11 +366,11 @@ jobs: run: bunx n-rules lint --repo-wide --no-fix ``` -## Repo-wide лінти (`lint-repo.yml`, обовʼязковий) +## Repo-wide лінти у прикладі (`lint-repo.yml`, обовʼязковий) Перевірки без path-підтримки (`scope: full` без glob: knip, jscpd, dep-policy тощо) живуть в окремому обовʼязковому workflow `.github/workflows/lint-repo.yml` із кроком `bunx n-rules lint --repo-wide --no-fix`. Він **не гейтить деплой** — жоден deploy-workflow не має на нього `needs`. Деталі: [lint_repo_yml.mdc](./lint_repo_yml/lint_repo_yml.mdc). -## Сервіс-орієнтовані deploy-workflow (опційно) +## Сервіс-орієнтовані deploy-workflow у прикладі (опційно) Монорепо з деплой-сервісами (каталог сервісу, напр. `run/nexus`) оформлює деплой per-service workflow: тригер `paths` по каталогу (dir-scoped glob `run//**` — саме він, а не імʼя файлу, робить workflow сервісним; імʼя довільне — `npm-publish.yml`, `deploy-.yml`, і **не перейменовуй наявні** — OIDC trusted publishing привʼязаний до імені) → джоба `plan` (`bunx n-rules ci plan --path --github`) → паралельні `lint-`-джоби з гейтом по outputs плану + тести сервісу → deploy з `needs` на всі перевірки (skipped не блокує, failed блокує). Форму перевіряє rego-концерн `service_deploy_workflow` — вимоги вмикаються лише за наявності lint-джоб у workflow; приклад — `deploy-service.yml`: diff --git a/mt/lint-fix-js-knip-1aa23aeb/task.md b/mt/lint-fix-js-knip-1aa23aeb/task.md index 29d0d7e..eabfd35 100644 --- a/mt/lint-fix-js-knip-1aa23aeb/task.md +++ b/mt/lint-fix-js-knip-1aa23aeb/task.md @@ -21,5 +21,6 @@ npx @7n/rules lint --no-fix --cwd ../.. js ## Inputs Target-файли: + - `.pi/extensions/n-rules-adr/index.ts` - `.pi/extensions/rtk.ts` diff --git a/mt/lint-fix-k8s-manifests-f9cb7a94/task.md b/mt/lint-fix-k8s-manifests-f9cb7a94/task.md index a3e8c68..cc55db9 100644 --- a/mt/lint-fix-k8s-manifests-f9cb7a94/task.md +++ b/mt/lint-fix-k8s-manifests-f9cb7a94/task.md @@ -21,4 +21,5 @@ npx @7n/rules lint --no-fix --cwd ../.. k8s ## Inputs Target-файли: + - (whole-repo concern) diff --git a/mt/lint-fix-vue-packages-c8869493/task.md b/mt/lint-fix-vue-packages-c8869493/task.md index 3196253..6447c5e 100644 --- a/mt/lint-fix-vue-packages-c8869493/task.md +++ b/mt/lint-fix-vue-packages-c8869493/task.md @@ -21,4 +21,5 @@ npx @7n/rules lint --no-fix --cwd ../.. vue ## Inputs Target-файли: + - (whole-repo concern)