@7n/rules 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/bin/n-rules.js +65 -17
  3. package/package.json +11 -1
  4. package/rules/abie/clean_merged_ignore_branches/concern.json +3 -0
  5. package/rules/docker/lint_docker_yml/concern.json +3 -0
  6. package/rules/js/check/docs/main.md +1 -1
  7. package/rules/js/check/main.mjs +1 -1
  8. package/rules/js/lint_js_yml/concern.json +3 -0
  9. package/rules/js/tooling/docs/main.md +1 -1
  10. package/rules/js/tooling/main.mjs +1 -1
  11. package/rules/k8s/lint_k8s_yml/concern.json +3 -0
  12. package/rules/npm-module/npm_publish_yml/concern.json +3 -0
  13. package/rules/php/lint_php_yml/concern.json +3 -0
  14. package/rules/python/lint_python_yml/concern.json +3 -0
  15. package/rules/rust/lint_rust_yml/concern.json +3 -0
  16. package/rules/rust/toolchain_cache/concern.json +10 -1
  17. package/rules/security/lint_security_yml/concern.json +3 -0
  18. package/rules/style/lint_style_yml/concern.json +3 -0
  19. package/rules/tauri/main.mdc +1 -1
  20. package/rules/tauri/release/release.mdc +15 -0
  21. package/rules/text/lint_text/concern.json +3 -0
  22. package/schemas/concern.json +86 -16
  23. package/schemas/n-rules.json +11 -1
  24. package/schemas/v8r-catalog.json +123 -27
  25. package/scripts/auto-rules.mjs +47 -6
  26. package/scripts/docs/auto-rules.md +3 -1
  27. package/scripts/docs/skills-cli.md +3 -2
  28. package/scripts/docs/upgrade-n-rules-and-install.md +3 -1
  29. package/scripts/lib/acp-runner.mjs +174 -0
  30. package/scripts/lib/concern-meta.mjs +8 -1
  31. package/scripts/lib/docs/acp-runner.md +58 -0
  32. package/scripts/lib/docs/concern-meta.md +1 -1
  33. package/scripts/lib/docs/read-n-rules-config-lite.md +3 -1
  34. package/scripts/lib/docs/resolve-plugins.md +17 -0
  35. package/scripts/lib/docs/run-conftest-batch.md +3 -1
  36. package/scripts/lib/lint-surface/docs/policy-lint-adapter.md +3 -1
  37. package/scripts/lib/lint-surface/docs/run-detectors.md +5 -1
  38. package/scripts/lib/lint-surface/policy-lint-adapter.mjs +2 -0
  39. package/scripts/lib/lint-surface/run-detectors.mjs +72 -5
  40. package/scripts/lib/read-n-rules-config-lite.mjs +5 -3
  41. package/scripts/lib/resolve-plugins.mjs +248 -0
  42. package/scripts/lib/run-conftest-batch.mjs +3 -1
  43. package/scripts/skills-cli.mjs +30 -52
  44. package/scripts/upgrade-n-rules-and-install.mjs +5 -4
  45. package/rules/ga/clean_ga_workflows/clean_ga_workflows.mdc +0 -20
  46. package/rules/ga/clean_ga_workflows/clean_ga_workflows.rego +0 -112
  47. package/rules/ga/clean_ga_workflows/concern.json +0 -10
  48. package/rules/ga/clean_ga_workflows/docs/fix-clean_ga_workflows.md +0 -33
  49. package/rules/ga/clean_ga_workflows/docs/index.md +0 -9
  50. package/rules/ga/clean_ga_workflows/fix-clean_ga_workflows.mjs +0 -8
  51. package/rules/ga/clean_ga_workflows/template/clean-ga-workflows.yml.snippet.yml +0 -26
  52. package/rules/ga/clean_merged_branch/clean_merged_branch.mdc +0 -24
  53. package/rules/ga/clean_merged_branch/clean_merged_branch.rego +0 -163
  54. package/rules/ga/clean_merged_branch/concern.json +0 -10
  55. package/rules/ga/clean_merged_branch/docs/fix-clean_merged_branch.md +0 -27
  56. package/rules/ga/clean_merged_branch/docs/index.md +0 -9
  57. package/rules/ga/clean_merged_branch/fix-clean_merged_branch.mjs +0 -8
  58. package/rules/ga/clean_merged_branch/template/clean-merged-branch.yml.snippet.yml +0 -37
  59. package/rules/ga/docs/index.md +0 -11
  60. package/rules/ga/git_ai/concern.json +0 -11
  61. package/rules/ga/git_ai/docs/fix-git_ai.md +0 -30
  62. package/rules/ga/git_ai/docs/index.md +0 -9
  63. package/rules/ga/git_ai/fix-git_ai.mjs +0 -5
  64. package/rules/ga/git_ai/git_ai.mdc +0 -19
  65. package/rules/ga/git_ai/git_ai.rego +0 -76
  66. package/rules/ga/git_ai/template/git-ai.yml.snippet.yml +0 -30
  67. package/rules/ga/lint_ga/concern.json +0 -10
  68. package/rules/ga/lint_ga/docs/fix-lint_ga.md +0 -32
  69. package/rules/ga/lint_ga/docs/index.md +0 -9
  70. package/rules/ga/lint_ga/fix-lint_ga.mjs +0 -5
  71. package/rules/ga/lint_ga/lint_ga.mdc +0 -21
  72. package/rules/ga/lint_ga/lint_ga.rego +0 -132
  73. package/rules/ga/lint_ga/template/lint-ga.yml.snippet.yml +0 -41
  74. package/rules/ga/main.json +0 -1
  75. package/rules/ga/main.mdc +0 -17
  76. package/rules/ga/vscode_extensions/concern.json +0 -11
  77. package/rules/ga/vscode_extensions/docs/fix-vscode_extensions.md +0 -25
  78. package/rules/ga/vscode_extensions/docs/index.md +0 -11
  79. package/rules/ga/vscode_extensions/fix-vscode_extensions.mjs +0 -1
  80. package/rules/ga/vscode_extensions/template/extensions.json.snippet.json +0 -1
  81. package/rules/ga/vscode_extensions/vscode_extensions.mdc +0 -9
  82. package/rules/ga/vscode_extensions/vscode_extensions.rego +0 -18
  83. package/rules/ga/vscode_settings/concern.json +0 -11
  84. package/rules/ga/vscode_settings/docs/fix-vscode_settings.md +0 -26
  85. package/rules/ga/vscode_settings/docs/index.md +0 -9
  86. package/rules/ga/vscode_settings/fix-vscode_settings.mjs +0 -5
  87. package/rules/ga/vscode_settings/template/settings.json.snippet.json +0 -1
  88. package/rules/ga/vscode_settings/vscode_settings.mdc +0 -9
  89. package/rules/ga/vscode_settings/vscode_settings.rego +0 -22
  90. package/rules/ga/workflow_common/concern.json +0 -9
  91. package/rules/ga/workflow_common/template/uses-min-versions.snippet.json +0 -4
  92. package/rules/ga/workflow_common/workflow_common.mdc +0 -18
  93. package/rules/ga/workflow_common/workflow_common.rego +0 -288
  94. package/rules/ga/workflows/concern.json +0 -8
  95. package/rules/ga/workflows/docs/fix-workflows.md +0 -37
  96. package/rules/ga/workflows/docs/main.md +0 -38
  97. package/rules/ga/workflows/fix-workflows.mjs +0 -212
  98. package/rules/ga/workflows/main.mjs +0 -433
  99. package/rules/ga/workflows/workflows.mdc +0 -33
  100. package/rules/ga/zizmor_yml/concern.json +0 -11
  101. package/rules/ga/zizmor_yml/docs/fix-zizmor_yml.md +0 -28
  102. package/rules/ga/zizmor_yml/docs/index.md +0 -9
  103. package/rules/ga/zizmor_yml/fix-zizmor_yml.mjs +0 -3
  104. package/rules/ga/zizmor_yml/template/zizmor.yml.snippet.yml +0 -5
  105. package/rules/ga/zizmor_yml/zizmor_yml.mdc +0 -9
  106. package/rules/ga/zizmor_yml/zizmor_yml.rego +0 -27
@@ -1,37 +0,0 @@
1
- name: Clean abandoned branches
2
-
3
- on:
4
- # Run daily at midnight
5
- schedule:
6
- - cron: '0 1 15 * *'
7
-
8
- # Allow workflow to be manually run from the GitHub UI
9
- workflow_dispatch: {}
10
-
11
- concurrency:
12
- group: ${{ github.ref }}-${{ github.workflow }}
13
- cancel-in-progress: true
14
-
15
- jobs:
16
- cleanup_old_branches:
17
- runs-on: ubuntu-latest
18
- permissions:
19
- contents: write
20
- pull-requests: read
21
- steps:
22
- - id: delete_stuff
23
- name: Delete those pesky dead branches
24
- uses: phpdocker-io/github-actions-delete-abandoned-branches@v2.0.3
25
- with:
26
- github_token: ${{ github.token }}
27
- last_commit_age_days: 90
28
- ignore_branches: main,dev
29
- # Action CLI accepts only yes/no. Go-yaml in conftest parses `no` as
30
- # boolean false, so the Rego policy normalizes both forms.
31
- dry_run: no
32
-
33
- - name: Get output
34
- env:
35
- DELETED_BRANCHES: ${{ steps.delete_stuff.outputs.deleted_branches }}
36
- run: |
37
- echo "Deleted branches: ${DELETED_BRANCHES}"
@@ -1,11 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/ga
4
- resource: npm/rules/ga/
5
- ---
6
-
7
- # npm/rules/ga
8
-
9
- | Файл | Тип |
10
- | ------------------- | --------- |
11
- | [main.mjs](main.md) | JS Module |
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
- "fixability": "config",
4
- "policy": {
5
- "files": {
6
- "single": ".github/workflows/git-ai.yml",
7
- "required": true
8
- },
9
- "missingMessage": ".github/workflows/git-ai.yml не існує — створи за каноном ga.mdc"
10
- }
11
- }
@@ -1,30 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: fix-git_ai.mjs
4
- resource: npm/rules/ga/git_ai/fix-git_ai.mjs
5
- docgen:
6
- crc: 58c702af
7
- model: openai-codex/gpt-5.5
8
- score: 100
9
- issues: judge:inaccurate:0.98
10
- judgeModel: openai-codex/gpt-5.4-mini
11
- ---
12
-
13
- ## Огляд
14
-
15
- `patterns` визначає шаблони пошуку для перевірки проєктних файлів і свідомо не охоплює службові шляхи `.github` та `.git`.
16
-
17
- Модуль має read-only поведінку без запису у файлову систему чи базу даних, щоб перевірка лише виявляла релевантні збіги й не змінювала стан репозиторію.
18
-
19
- ## Поведінка
20
-
21
- 1. `patterns` визначає автоматичне виправлення для підтримки стандартного workflow Git AI у репозиторії.
22
-
23
- 2. `patterns` забезпечує наявність очікуваного файлу `.github/workflows/git-ai.yml`, щоб перевірка правила могла запропонувати єдиний канонічний варіант налаштування.
24
-
25
- 3. Під час пошуку цільових файлів свідомо пропускаються службові шляхи `.github` і `.git`, щоб не аналізувати технічні директорії як звичайний проєктний код.
26
-
27
- ## Гарантії поведінки
28
-
29
- - Read-only: не виконує операцій запису (ФС/БД).
30
- - Свідомо пропускає шляхи: `.github`, `.git`.
@@ -1,9 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/ga/git_ai
4
- resource: npm/rules/ga/git_ai/
5
- ---
6
-
7
- | Файл | Тип |
8
- | ------------------------------- | --------- |
9
- | [fix-git_ai.mjs](fix-git_ai.md) | JS Module |
@@ -1,5 +0,0 @@
1
- import { createTemplateFixPattern } from '../../../scripts/lib/fix/template-deep-merge.mjs'
2
-
3
- export const patterns = [
4
- createTemplateFixPattern({ id: 'ga-git_ai-template', targetPath: '.github/workflows/git-ai.yml' })
5
- ]
@@ -1,19 +0,0 @@
1
- ## Структура `git-ai.yml` — автоматичний запуск git-ai після мержу PR
2
-
3
- Rego-пакет: `ga.git_ai`
4
-
5
- **Цільовий файл:** `.github/workflows/git-ai.yml`
6
-
7
- ### Що перевіряється
8
-
9
- - `name` — точна відповідність значенню з template (`Git AI`)
10
- - `on.pull_request.types` — має містити `closed`
11
- - `jobs.git-ai` — job має існувати
12
- - `jobs.git-ai.if` — містить `github.event.pull_request.merged == true`
13
- - `jobs.git-ai.permissions.contents` — за template (`write`)
14
- - `steps[*].run` (сукупно) — містить substring `https://usegitai.com/install.sh` (інсталяція)
15
- - `steps[*].run` (сукупно) — містить substring `git-ai ci github run` (запуск)
16
-
17
- Substring-перевірки замість exact-match через крихкість multi-line `run:` блоків.
18
-
19
- Канон: [git-ai.yml.snippet.yml](./template/git-ai.yml.snippet.yml)
@@ -1,76 +0,0 @@
1
- # Перевірка `.github/workflows/git-ai.yml` (ga.mdc).
2
- #
3
- # Канон надходить через --data: { "template": { "snippet": ... } }
4
- # Структура --data сформована з template/git-ai.yml.snippet.yml.
5
- # Substring-перевірки (`if:`, `run:` блоки) — на основі ключових фраз з template
6
- # steps, бо повний multi-line `run:` дуже крихкий для exact-match.
7
- package ga.git_ai
8
-
9
- import rego.v1
10
-
11
- # ── Аліаси ─────────────────────────────────────────────────────────────────
12
-
13
- gha_on := input["true"]
14
-
15
- job := input.jobs["git-ai"]
16
-
17
- job_run_blob := concat("\n", [run |
18
- run := job.steps[_].run
19
- ])
20
-
21
- expected_name := data.template.snippet.name
22
-
23
- expected_types := {t | some t in data.template.snippet.on.pull_request.types}
24
-
25
- expected_if := data.template.snippet.jobs["git-ai"].if
26
-
27
- expected_perms := data.template.snippet.jobs["git-ai"].permissions
28
-
29
- # Substring-маркери з template `run:` блоків — ключові команди, наявність яких
30
- # гарантує що workflow робить очікувані дії. Конкретний multi-line — не порівнюємо.
31
- install_substring := "https://usegitai.com/install.sh"
32
-
33
- run_substring := "git-ai ci github run"
34
-
35
- # ── deny rules ─────────────────────────────────────────────────────────────
36
-
37
- deny contains msg if {
38
- input.name != expected_name
39
- msg := sprintf("git-ai.yml: name має бути %q (ga.mdc)", [expected_name])
40
- }
41
-
42
- deny contains msg if {
43
- not "closed" in {t | some t in gha_on.pull_request.types}
44
- msg := "git-ai.yml: on.pull_request.types має містити closed (ga.mdc)"
45
- }
46
-
47
- deny contains msg if {
48
- not job
49
- msg := "git-ai.yml: jobs.git-ai відсутній (ga.mdc)"
50
- }
51
-
52
- deny contains msg if {
53
- not contains(job_if_str, expected_if)
54
- msg := sprintf("git-ai.yml: job має містити if: %s (ga.mdc)", [expected_if])
55
- }
56
-
57
- deny contains msg if {
58
- job.permissions.contents != expected_perms.contents
59
- msg := sprintf("git-ai.yml: permissions.contents має бути %s (ga.mdc)", [expected_perms.contents])
60
- }
61
-
62
- deny contains msg if {
63
- not contains(job_run_blob, install_substring)
64
- msg := "git-ai.yml: має встановлювати git-ai через curl | bash (ga.mdc)"
65
- }
66
-
67
- deny contains msg if {
68
- not contains(job_run_blob, run_substring)
69
- msg := sprintf("git-ai.yml: має виконувати %s (ga.mdc)", [run_substring])
70
- }
71
-
72
- # ── helpers ────────────────────────────────────────────────────────────────
73
-
74
- default job_if_str := ""
75
-
76
- job_if_str := sprintf("%v", [job.if])
@@ -1,30 +0,0 @@
1
- name: Git AI
2
-
3
- on:
4
- pull_request:
5
- types: [closed]
6
-
7
- concurrency:
8
- group: ${{ github.ref }}-${{ github.workflow }}
9
- cancel-in-progress: true
10
-
11
- jobs:
12
- git-ai:
13
- if: github.event.pull_request.merged == true
14
- runs-on: ubuntu-latest
15
- permissions:
16
- contents: write
17
-
18
- steps:
19
- - name: Install git-ai
20
- run: |
21
- curl -fsSL https://usegitai.com/install.sh | bash
22
- echo "$HOME/.git-ai/bin" >> $GITHUB_PATH
23
- - name: Run git-ai
24
- id: run-git-ai
25
- env:
26
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
27
- run: |
28
- git config --global user.name "github-actions[bot]"
29
- git config --global user.email "github-actions[bot]@users.noreply.github.com"
30
- git-ai ci github run
@@ -1,10 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
- "policy": {
4
- "files": {
5
- "single": ".github/workflows/lint-ga.yml",
6
- "required": true
7
- },
8
- "missingMessage": ".github/workflows/lint-ga.yml не існує — створи за каноном ga.mdc"
9
- }
10
- }
@@ -1,32 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: fix-lint_ga.mjs
4
- resource: npm/rules/ga/lint_ga/fix-lint_ga.mjs
5
- docgen:
6
- crc: fd87bb0c
7
- model: openai-codex/gpt-5.5
8
- score: 100
9
- issues: judge:inaccurate:0.98
10
- judgeModel: openai-codex/gpt-5.4-mini
11
- ---
12
-
13
- ## Огляд
14
-
15
- `patterns` описує перевірку очікуваного вмісту для `.github/workflows/lint-ga.yml`, щоб lint workflow для Google Analytics залишався узгодженим із шаблоном.
16
-
17
- Секція має read-only призначення: вона фіксує очікувану поведінку без запису у файлову систему чи базу даних. Під час загального обходу свідомо не враховуються службові шляхи `.github` і `.git`.
18
-
19
- ## Поведінка
20
-
21
- 1. `patterns` оголошує правило автоматичного виправлення для workflow lint-перевірки Google Analytics.
22
-
23
- 2. `patterns` забезпечує приведення `.github/workflows/lint-ga.yml` до очікуваного шаблонного стану, щоб CI мав стабільну перевірку GA-правил.
24
-
25
- 3. `patterns` не виконує запис самостійно: воно лише описує доступне виправлення для зовнішнього механізму застосування.
26
-
27
- 4. `patterns` свідомо не охоплює службові шляхи `.github` і `.git` як вхідні області для загального обходу, окрім цільового workflow-файлу, який має бути синхронізований із шаблоном.
28
-
29
- ## Гарантії поведінки
30
-
31
- - Read-only: не виконує операцій запису (ФС/БД).
32
- - Свідомо пропускає шляхи: `.github`, `.git`.
@@ -1,9 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/ga/lint_ga
4
- resource: npm/rules/ga/lint_ga/
5
- ---
6
-
7
- | Файл | Тип |
8
- | --------------------------------- | --------- |
9
- | [fix-lint_ga.mjs](fix-lint_ga.md) | JS Module |
@@ -1,5 +0,0 @@
1
- import { createTemplateFixPattern } from '../../../scripts/lib/fix/template-deep-merge.mjs'
2
-
3
- export const patterns = [
4
- createTemplateFixPattern({ id: 'ga-lint_ga-template', targetPath: '.github/workflows/lint-ga.yml' })
5
- ]
@@ -1,21 +0,0 @@
1
- ## Структура `lint-ga.yml` — CI-лінт GitHub Actions файлів
2
-
3
- Rego-пакет: `ga.lint_ga`
4
-
5
- **Цільовий файл:** `.github/workflows/lint-ga.yml`
6
-
7
- ### Що перевіряється
8
-
9
- - `name` — точна відповідність значенню з template (`Lint GA`)
10
- - `on.push.branches` — superset: містить `dev` і `main`
11
- - `on.pull_request.branches` — superset: містить `dev` і `main`
12
- - `on.push.paths` — superset: містить `.github/actions/**` і `.github/workflows/**`
13
- - `jobs.lint-ga` — job має існувати
14
- - `jobs.lint-ga.runs-on` — за template (`ubuntu-latest`)
15
- - `jobs.lint-ga.permissions.contents` — `read`
16
- - `jobs.lint-ga.steps` — не порожній
17
- - `steps[*].uses` — кожен `uses:` з template має бути присутнім у кроках; SHA-пін того самого action (`owner/action@<40-hex SHA>`, з тег-коментарем `# vX` чи без) задовольняє канонічний тег — НЕ замінюй наявний SHA-пін тегом
18
- - `steps[*].run` (сукупно) — містить `open-policy-agent/conftest` (Install conftest)
19
- - `steps[*].run` (сукупно) — містить `n-rules lint ga --no-fix`
20
-
21
- Канон: [lint-ga.yml.snippet.yml](./template/lint-ga.yml.snippet.yml)
@@ -1,132 +0,0 @@
1
- # Перевірка `.github/workflows/lint-ga.yml` (ga.mdc).
2
- #
3
- # Канон надходить через --data: { "template": { "snippet": ... } }
4
- # Структура --data сформована з template/lint-ga.yml.snippet.yml.
5
- package ga.lint_ga
6
-
7
- import rego.v1
8
-
9
- # ── Аліаси ─────────────────────────────────────────────────────────────────
10
-
11
- gha_on := input["true"]
12
-
13
- job := input.jobs["lint-ga"]
14
-
15
- job_uses_set contains job.steps[_].uses
16
-
17
- job_run_blob := concat("\n", [run |
18
- run := job.steps[_].run
19
- ])
20
-
21
- expected_name := data.template.snippet.name
22
-
23
- expected_push_branches := {b | some b in data.template.snippet.on.push.branches}
24
-
25
- expected_pr_branches := {b | some b in data.template.snippet.on.pull_request.branches}
26
-
27
- expected_push_paths := {p | some p in data.template.snippet.on.push.paths}
28
-
29
- expected_runs_on := data.template.snippet.jobs["lint-ga"]["runs-on"]
30
-
31
- expected_perms := data.template.snippet.jobs["lint-ga"].permissions
32
-
33
- # Required `uses:` зі template — фільтруємо тільки кроки що мають `uses`.
34
- expected_uses_set contains u if {
35
- some step in data.template.snippet.jobs["lint-ga"].steps
36
- u := object.get(step, "uses", "")
37
- u != ""
38
- }
39
-
40
- # Required `run:` substrings — collected from steps with `run`.
41
- expected_run_blob := concat("\n", [r |
42
- some step in data.template.snippet.jobs["lint-ga"].steps
43
- r := object.get(step, "run", "")
44
- r != ""
45
- ])
46
-
47
- # ── deny rules ─────────────────────────────────────────────────────────────
48
-
49
- deny contains msg if {
50
- input.name != expected_name
51
- msg := sprintf("lint-ga.yml: name має бути %q (ga.mdc)", [expected_name])
52
- }
53
-
54
- deny contains msg if {
55
- not branches_superset_of(gha_on.push.branches, expected_push_branches)
56
- msg := "lint-ga.yml: on.push.branches має містити dev і main (ga.mdc)"
57
- }
58
-
59
- deny contains msg if {
60
- not branches_superset_of(gha_on.pull_request.branches, expected_pr_branches)
61
- msg := "lint-ga.yml: on.pull_request.branches має містити dev і main (ga.mdc)"
62
- }
63
-
64
- deny contains msg if {
65
- not paths_superset_of(gha_on.push.paths, expected_push_paths)
66
- msg := "lint-ga.yml: on.push.paths має містити .github/actions/** і .github/workflows/** (ga.mdc)"
67
- }
68
-
69
- deny contains msg if {
70
- not job
71
- msg := "lint-ga.yml: jobs.lint-ga відсутній (ga.mdc)"
72
- }
73
-
74
- deny contains msg if {
75
- job["runs-on"] != expected_runs_on
76
- msg := sprintf("lint-ga.yml: runs-on має бути %s (ga.mdc)", [expected_runs_on])
77
- }
78
-
79
- deny contains msg if {
80
- job.permissions.contents != expected_perms.contents
81
- msg := sprintf("lint-ga.yml: permissions.contents має бути %s (ga.mdc)", [expected_perms.contents])
82
- }
83
-
84
- deny contains msg if {
85
- count(job.steps) == 0
86
- msg := "lint-ga.yml: jobs.lint-ga.steps відсутні (ga.mdc)"
87
- }
88
-
89
- deny contains msg if {
90
- some required_use in expected_uses_set
91
- not job_has_use_satisfying(required_use)
92
- msg := sprintf("lint-ga.yml: має бути uses: %s (ga.mdc)", [required_use])
93
- }
94
-
95
- deny contains msg if {
96
- expected_run_blob != ""
97
- not contains(job_run_blob, "open-policy-agent/conftest")
98
- msg := "lint-ga.yml: має бути крок Install conftest (ga.mdc)"
99
- }
100
-
101
- deny contains msg if {
102
- expected_run_blob != ""
103
- not contains(job_run_blob, "n-rules lint ga --no-fix")
104
- msg := "lint-ga.yml: має бути крок run: n-rules lint ga --no-fix (ga.mdc)"
105
- }
106
-
107
- # ── helpers ────────────────────────────────────────────────────────────────
108
-
109
- # `uses:` з input задовольняє канонічний `owner/action@tag`: точний збіг…
110
- uses_satisfies(actual, expected) if actual == expected
111
-
112
- # …або той самий action-slug і ref — повний 40-hex commit SHA (zizmor ref-pin).
113
- # SHA-пін відповідної версії задовольняє вимогу тега — не даунгрейдимо до тега.
114
- uses_satisfies(actual, expected) if {
115
- slug := split(expected, "@")[0]
116
- startswith(actual, concat("", [slug, "@"]))
117
- parts := split(actual, "@")
118
- regex.match(`^[0-9a-fA-F]{40}$`, parts[count(parts) - 1])
119
- }
120
-
121
- job_has_use_satisfying(required) if {
122
- some u in job_uses_set
123
- uses_satisfies(u, required)
124
- }
125
-
126
- branches_superset_of(actual, expected) if {
127
- expected & {b | some b in actual} == expected
128
- }
129
-
130
- paths_superset_of(actual, expected) if {
131
- expected & {p | some p in actual} == expected
132
- }
@@ -1,41 +0,0 @@
1
- name: Lint GA
2
-
3
- on:
4
- push:
5
- branches:
6
- - dev
7
- - main
8
- paths:
9
- - '.github/actions/**'
10
- - '.github/workflows/**'
11
- pull_request:
12
- branches:
13
- - dev
14
- - main
15
-
16
- concurrency:
17
- group: ${{ github.ref }}-${{ github.workflow }}
18
- cancel-in-progress: true
19
-
20
- jobs:
21
- lint-ga:
22
- runs-on: ubuntu-latest
23
- permissions:
24
- contents: read
25
- steps:
26
- - uses: actions/checkout@v6
27
- with:
28
- persist-credentials: false
29
-
30
- - uses: ./.github/actions/setup-bun-deps
31
-
32
- - uses: astral-sh/setup-uv@v8.0.0
33
-
34
- - name: Install conftest
35
- run: >-
36
- curl -fsSL
37
- https://github.com/open-policy-agent/conftest/releases/download/v0.62.0/conftest_0.62.0_Linux_x86_64.tar.gz
38
- | sudo tar -xz -C /usr/local/bin conftest
39
-
40
- - name: Lint GA
41
- run: bunx n-rules lint ga --no-fix
@@ -1 +0,0 @@
1
- { "auto": { "glob": ".github/workflows/**" } }
package/rules/ga/main.mdc DELETED
@@ -1,17 +0,0 @@
1
- ---
2
- description: Правила форматів для .github/workflows
3
- version: '1.10'
4
- globs: ".github/workflows/*.yml"
5
- alwaysApply: false
6
- ---
7
-
8
- Правило **ga** перевіряє структуру `.github/workflows/`, наявність обов'язкових workflow-файлів і їх відповідність канонам, а також налаштування VS Code та zizmor для роботи з GitHub Actions.
9
-
10
- - [settings.json.snippet.json](./vscode_settings/template/settings.json.snippet.json)
11
- - [git-ai.yml.snippet.yml](./git_ai/template/git-ai.yml.snippet.yml)
12
- - [clean-ga-workflows.yml.snippet.yml](./clean_ga_workflows/template/clean-ga-workflows.yml.snippet.yml)
13
- - [lint-ga.yml.snippet.yml](./lint_ga/template/lint-ga.yml.snippet.yml)
14
- - [zizmor.yml.snippet.yml](./zizmor_yml/template/zizmor.yml.snippet.yml)
15
- - [clean-merged-branch.yml.snippet.yml](./clean_merged_branch/template/clean-merged-branch.yml.snippet.yml)
16
- - [extensions.json.snippet.json](./vscode_extensions/template/extensions.json.snippet.json)
17
- - [uses-min-versions.snippet.json](./workflow_common/template/uses-min-versions.snippet.json)
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
- "fixability": "config",
4
- "policy": {
5
- "files": {
6
- "single": ".vscode/extensions.json",
7
- "required": true
8
- },
9
- "missingMessage": ".vscode/extensions.json не існує — додай github.vscode-github-actions (ga.mdc)"
10
- }
11
- }
@@ -1,25 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: fix-vscode_extensions.mjs
4
- resource: npm/rules/ga/vscode_extensions/fix-vscode_extensions.mjs
5
- docgen:
6
- crc: 3353fe17
7
- model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- tier: local-min
9
- score: 100
10
- issues: judge:inaccurate:0.99
11
- judgeModel: openai-codex/gpt-5.4-mini
12
- ---
13
-
14
- ## Огляд
15
-
16
- Файл сканує код розширення VS Code на наявність типових помилок. Він застосовує виправлення до знайдених зразків відповідно до визначеної логіки.
17
-
18
- ## Поведінка
19
-
20
- 1. Виявляє зразки, що потребують виправлення у розширень VS Code.
21
- 2. Застосовує виправлення, використовуючи логіку, визначену в скрипті `../../../scripts/lib/fix/vscode-ext-add.mjs`.
22
-
23
- ## Гарантії поведінки
24
-
25
- - Read-only: не виконує операцій запису (ФС/БД).
@@ -1,11 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/ga/vscode_extensions
4
- resource: npm/rules/ga/vscode_extensions/
5
- ---
6
-
7
- # npm/rules/ga/vscode_extensions
8
-
9
- | Файл | Тип |
10
- | ----------------------------------------------------- | --------- |
11
- | [fix-vscode_extensions.mjs](fix-vscode_extensions.md) | JS Module |
@@ -1 +0,0 @@
1
- export { patterns } from '../../../scripts/lib/fix/vscode-ext-add.mjs'
@@ -1 +0,0 @@
1
- { "recommendations": ["github.vscode-github-actions"] }
@@ -1,9 +0,0 @@
1
- ## `.vscode/extensions.json` — розширення для GitHub Actions
2
-
3
- Rego-пакет: `ga.vscode_extensions`
4
-
5
- **Цільовий файл:** `.vscode/extensions.json`
6
-
7
- Кожне розширення з template має бути присутнє у `recommendations`. Додаткові розширення від інших правил — допустимі (subset-перевірка).
8
-
9
- Канон: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
@@ -1,18 +0,0 @@
1
- # Перевірка `.vscode/extensions.json` для GitHub Actions (ga.mdc).
2
- #
3
- # Канон надходить через --data: { "template": { "snippet": ... } }
4
- # Структура --data сформована з template/extensions.json.snippet.json.
5
- # `recommendations` — subset-of: кожна рекомендація з template має бути у input.
6
- # Додаткові рекомендації від інших правил дозволені.
7
- #
8
- # Конвенція проєкту — `import rego.v1` + multi-value `deny contains msg if { … }`
9
- # (.cursor/rules/conftest.mdc). Лінт — `bun run lint-rego` (regal).
10
- package ga.vscode_extensions
11
-
12
- import rego.v1
13
-
14
- deny contains msg if {
15
- some rec in data.template.snippet.recommendations
16
- not rec in {r | some r in object.get(input, "recommendations", [])}
17
- msg := sprintf(".vscode/extensions.json: recommendations має містити %q (ga.mdc)", [rec])
18
- }
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
3
- "fixability": "config",
4
- "policy": {
5
- "files": {
6
- "single": ".vscode/settings.json",
7
- "required": true
8
- },
9
- "missingMessage": ".vscode/settings.json не існує — додай [github-actions-workflow].editor.defaultFormatter (ga.mdc)"
10
- }
11
- }
@@ -1,26 +0,0 @@
1
- ---
2
- type: JS Module
3
- title: fix-vscode_settings.mjs
4
- resource: npm/rules/ga/vscode_settings/fix-vscode_settings.mjs
5
- docgen:
6
- crc: f3ea1fe1
7
- model: openai-codex/gpt-5.4-mini
8
- score: 100
9
- issues: judge:inaccurate:0.97
10
- judgeModel: openai-codex/gpt-5.4-mini
11
- ---
12
-
13
- ## Огляд
14
-
15
- `patterns` перевіряє та впорядковує `.vscode/settings.json` на відповідність очікуваному проєктному формату, спираючись на `settings.json`. Це потрібно, щоб редакторні налаштування залишалися в передбачуваному стані без ручних правок.
16
-
17
- ## Поведінка
18
-
19
- 1. `patterns` визначає набір правил для узгодження `.vscode/settings.json` з очікуваним шаблоном проєкту.
20
- 2. `patterns` потрібен, щоб автоматично тримати налаштування редактора в погодженому стані без ручного редагування кожного разу.
21
- 3. `patterns` працює лише з конфігурацією `.vscode/settings.json`; інших шляхів або файлів у межах цього модуля не охоплює.
22
- 4. `patterns` не виконує записів у файлову систему чи базу даних і не покладається на кешування.
23
-
24
- ## Гарантії поведінки
25
-
26
- - Read-only: не виконує операцій запису (ФС/БД).
@@ -1,9 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/ga/vscode_settings
4
- resource: npm/rules/ga/vscode_settings/
5
- ---
6
-
7
- | Файл | Тип |
8
- | ------------------------------------------------- | --------- |
9
- | [fix-vscode_settings.mjs](fix-vscode_settings.md) | JS Module |