From a200ce5806017fee2e20a99202cd0bd34cb117f5 Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Tue, 21 Jul 2026 16:04:02 +0300 Subject: [PATCH 1/2] =?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 a7d450d1a66e86904599ca6b475cb626c696fa12 Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Sun, 26 Jul 2026 14:29:33 +0300 Subject: [PATCH 2/2] chore(rules): sync Rust workspace-root conventions --- .cursor/rules/n-ga.mdc | 137 ----------------------------------------- 1 file changed, 137 deletions(-) diff --git a/.cursor/rules/n-ga.mdc b/.cursor/rules/n-ga.mdc index 9e80a7b..f7a3557 100644 --- a/.cursor/rules/n-ga.mdc +++ b/.cursor/rules/n-ga.mdc @@ -191,143 +191,6 @@ 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`: