@7n/rules-ci-github 1.2.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.
- package/CHANGELOG.md +15 -0
- package/package.json +49 -0
- package/rules/abie/clean_merged_ignore_branches/clean_merged_ignore_branches.mdc +19 -0
- package/rules/abie/clean_merged_ignore_branches/clean_merged_ignore_branches.rego +81 -0
- package/rules/abie/clean_merged_ignore_branches/concern.json +8 -0
- package/rules/abie/clean_merged_ignore_branches/docs/fix-clean_merged_ignore_branches.md +30 -0
- package/rules/abie/clean_merged_ignore_branches/docs/index.md +9 -0
- package/rules/abie/clean_merged_ignore_branches/fix-clean_merged_ignore_branches.mjs +8 -0
- package/rules/abie/clean_merged_ignore_branches/template/clean-merged-branch.yml.snippet.yml +9 -0
- package/rules/docker/lint_docker_yml/concern.json +11 -0
- package/rules/docker/lint_docker_yml/docs/fix-lint_docker_yml.md +30 -0
- package/rules/docker/lint_docker_yml/docs/index.md +9 -0
- package/rules/docker/lint_docker_yml/fix-lint_docker_yml.mjs +5 -0
- package/rules/docker/lint_docker_yml/lint_docker_yml.mdc +14 -0
- package/rules/docker/lint_docker_yml/lint_docker_yml.rego +79 -0
- package/rules/docker/lint_docker_yml/template/lint-docker.yml.snippet.yml +41 -0
- package/rules/ga/clean_ga_workflows/clean_ga_workflows.mdc +20 -0
- package/rules/ga/clean_ga_workflows/clean_ga_workflows.rego +112 -0
- package/rules/ga/clean_ga_workflows/concern.json +10 -0
- package/rules/ga/clean_ga_workflows/docs/fix-clean_ga_workflows.md +33 -0
- package/rules/ga/clean_ga_workflows/docs/index.md +9 -0
- package/rules/ga/clean_ga_workflows/fix-clean_ga_workflows.mjs +8 -0
- package/rules/ga/clean_ga_workflows/template/clean-ga-workflows.yml.snippet.yml +26 -0
- package/rules/ga/clean_merged_branch/clean_merged_branch.mdc +24 -0
- package/rules/ga/clean_merged_branch/clean_merged_branch.rego +163 -0
- package/rules/ga/clean_merged_branch/concern.json +10 -0
- package/rules/ga/clean_merged_branch/docs/fix-clean_merged_branch.md +27 -0
- package/rules/ga/clean_merged_branch/docs/index.md +9 -0
- package/rules/ga/clean_merged_branch/fix-clean_merged_branch.mjs +8 -0
- package/rules/ga/clean_merged_branch/template/clean-merged-branch.yml.snippet.yml +37 -0
- package/rules/ga/docs/index.md +11 -0
- package/rules/ga/git_ai/concern.json +11 -0
- package/rules/ga/git_ai/docs/fix-git_ai.md +30 -0
- package/rules/ga/git_ai/docs/index.md +9 -0
- package/rules/ga/git_ai/fix-git_ai.mjs +5 -0
- package/rules/ga/git_ai/git_ai.mdc +19 -0
- package/rules/ga/git_ai/git_ai.rego +76 -0
- package/rules/ga/git_ai/template/git-ai.yml.snippet.yml +30 -0
- package/rules/ga/lint_ga/concern.json +10 -0
- package/rules/ga/lint_ga/docs/fix-lint_ga.md +32 -0
- package/rules/ga/lint_ga/docs/index.md +9 -0
- package/rules/ga/lint_ga/fix-lint_ga.mjs +5 -0
- package/rules/ga/lint_ga/lint_ga.mdc +21 -0
- package/rules/ga/lint_ga/lint_ga.rego +132 -0
- package/rules/ga/lint_ga/template/lint-ga.yml.snippet.yml +41 -0
- package/rules/ga/main.json +1 -0
- package/rules/ga/main.mdc +17 -0
- package/rules/ga/vscode_extensions/concern.json +11 -0
- package/rules/ga/vscode_extensions/docs/fix-vscode_extensions.md +25 -0
- package/rules/ga/vscode_extensions/docs/index.md +11 -0
- package/rules/ga/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/ga/vscode_extensions/template/extensions.json.snippet.json +1 -0
- package/rules/ga/vscode_extensions/vscode_extensions.mdc +9 -0
- package/rules/ga/vscode_extensions/vscode_extensions.rego +18 -0
- package/rules/ga/vscode_settings/concern.json +11 -0
- package/rules/ga/vscode_settings/docs/fix-vscode_settings.md +26 -0
- package/rules/ga/vscode_settings/docs/index.md +9 -0
- package/rules/ga/vscode_settings/fix-vscode_settings.mjs +5 -0
- package/rules/ga/vscode_settings/template/settings.json.snippet.json +1 -0
- package/rules/ga/vscode_settings/vscode_settings.mdc +9 -0
- package/rules/ga/vscode_settings/vscode_settings.rego +22 -0
- package/rules/ga/workflow_common/concern.json +9 -0
- package/rules/ga/workflow_common/template/uses-min-versions.snippet.json +4 -0
- package/rules/ga/workflow_common/workflow_common.mdc +18 -0
- package/rules/ga/workflow_common/workflow_common.rego +288 -0
- package/rules/ga/workflows/concern.json +8 -0
- package/rules/ga/workflows/docs/fix-workflows.md +37 -0
- package/rules/ga/workflows/docs/main.md +40 -0
- package/rules/ga/workflows/fix-workflows.mjs +212 -0
- package/rules/ga/workflows/main.mjs +436 -0
- package/rules/ga/workflows/workflows.mdc +33 -0
- package/rules/ga/zizmor_yml/concern.json +11 -0
- package/rules/ga/zizmor_yml/docs/fix-zizmor_yml.md +28 -0
- package/rules/ga/zizmor_yml/docs/index.md +9 -0
- package/rules/ga/zizmor_yml/fix-zizmor_yml.mjs +3 -0
- package/rules/ga/zizmor_yml/template/zizmor.yml.snippet.yml +5 -0
- package/rules/ga/zizmor_yml/zizmor_yml.mdc +9 -0
- package/rules/ga/zizmor_yml/zizmor_yml.rego +27 -0
- package/rules/js/lint_js_yml/concern.json +11 -0
- package/rules/js/lint_js_yml/docs/fix-lint_js_yml.md +27 -0
- package/rules/js/lint_js_yml/docs/index.md +9 -0
- package/rules/js/lint_js_yml/fix-lint_js_yml.mjs +5 -0
- package/rules/js/lint_js_yml/lint_js_yml.mdc +14 -0
- package/rules/js/lint_js_yml/lint_js_yml.rego +117 -0
- package/rules/js/lint_js_yml/template/lint-js.yml.snippet.yml +40 -0
- package/rules/k8s/lint_k8s_yml/concern.json +11 -0
- package/rules/k8s/lint_k8s_yml/docs/fix-lint_k8s_yml.md +30 -0
- package/rules/k8s/lint_k8s_yml/docs/index.md +9 -0
- package/rules/k8s/lint_k8s_yml/fix-lint_k8s_yml.mjs +5 -0
- package/rules/k8s/lint_k8s_yml/lint_k8s_yml.rego +57 -0
- package/rules/k8s/lint_k8s_yml/template/lint-k8s.yml.snippet.yml +43 -0
- package/rules/npm-module/npm_publish_yml/concern.json +12 -0
- package/rules/npm-module/npm_publish_yml/docs/fix-npm_publish_yml.md +27 -0
- package/rules/npm-module/npm_publish_yml/docs/index.md +9 -0
- package/rules/npm-module/npm_publish_yml/fix-npm_publish_yml.mjs +8 -0
- package/rules/npm-module/npm_publish_yml/template/npm-publish.yml.snippet.yml +49 -0
- package/rules/php/lint_php_yml/concern.json +11 -0
- package/rules/php/lint_php_yml/docs/fix-lint_php_yml.md +27 -0
- package/rules/php/lint_php_yml/docs/index.md +9 -0
- package/rules/php/lint_php_yml/fix-lint_php_yml.mjs +5 -0
- package/rules/php/lint_php_yml/lint_php_yml.mdc +23 -0
- package/rules/php/lint_php_yml/lint_php_yml.rego +34 -0
- package/rules/php/lint_php_yml/template/lint-php.yml.snippet.yml +47 -0
- package/rules/python/lint_python_yml/concern.json +11 -0
- package/rules/python/lint_python_yml/docs/fix-lint_python_yml.md +26 -0
- package/rules/python/lint_python_yml/docs/index.md +9 -0
- package/rules/python/lint_python_yml/fix-lint_python_yml.mjs +5 -0
- package/rules/python/lint_python_yml/lint_python_yml.mdc +12 -0
- package/rules/python/lint_python_yml/lint_python_yml.rego +68 -0
- package/rules/python/lint_python_yml/template/lint-python.yml.snippet.yml +41 -0
- package/rules/rust/lint_rust_yml/concern.json +11 -0
- package/rules/rust/lint_rust_yml/docs/fix-lint_rust_yml.md +27 -0
- package/rules/rust/lint_rust_yml/docs/index.md +9 -0
- package/rules/rust/lint_rust_yml/fix-lint_rust_yml.mjs +5 -0
- package/rules/rust/lint_rust_yml/lint_rust_yml.mdc +17 -0
- package/rules/rust/lint_rust_yml/lint_rust_yml.rego +79 -0
- package/rules/rust/lint_rust_yml/template/lint-rust.yml.snippet.yml +44 -0
- package/rules/rust/toolchain_cache/concern.json +11 -0
- package/rules/rust/toolchain_cache/docs/fix-toolchain_cache.md +35 -0
- package/rules/rust/toolchain_cache/docs/index.md +12 -0
- package/rules/rust/toolchain_cache/docs/main.md +57 -0
- package/rules/rust/toolchain_cache/fix-toolchain_cache.mjs +117 -0
- package/rules/rust/toolchain_cache/main.mjs +177 -0
- package/rules/rust/toolchain_cache/toolchain_cache.mdc +23 -0
- package/rules/security/lint_security_yml/concern.json +11 -0
- package/rules/security/lint_security_yml/docs/fix-lint_security_yml.md +30 -0
- package/rules/security/lint_security_yml/docs/index.md +9 -0
- package/rules/security/lint_security_yml/fix-lint_security_yml.mjs +8 -0
- package/rules/security/lint_security_yml/lint_security_yml.mdc +7 -0
- package/rules/security/lint_security_yml/lint_security_yml.rego +33 -0
- package/rules/security/lint_security_yml/template/lint-security.yml.snippet.yml +31 -0
- package/rules/style/lint_style_yml/concern.json +11 -0
- package/rules/style/lint_style_yml/docs/fix-lint_style_yml.md +30 -0
- package/rules/style/lint_style_yml/docs/index.md +9 -0
- package/rules/style/lint_style_yml/fix-lint_style_yml.mjs +5 -0
- package/rules/style/lint_style_yml/lint_style_yml.mdc +13 -0
- package/rules/style/lint_style_yml/lint_style_yml.rego +38 -0
- package/rules/style/lint_style_yml/template/lint-style.yml.snippet.yml +39 -0
- package/rules/text/lint_text/concern.json +10 -0
- package/rules/text/lint_text/docs/fix-lint_text.md +27 -0
- package/rules/text/lint_text/docs/index.md +9 -0
- package/rules/text/lint_text/fix-lint_text.mjs +5 -0
- package/rules/text/lint_text/lint_text.mdc +19 -0
- package/rules/text/lint_text/lint_text.rego +104 -0
- package/rules/text/lint_text/template/lint-text.yml.snippet.yml +61 -0
|
@@ -0,0 +1,132 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": "завжди" }
|
|
@@ -0,0 +1,17 @@
|
|
|
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)
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: fix-vscode_extensions.mjs
|
|
4
|
+
resource: plugins/ci-github/rules/ga/vscode_extensions/fix-vscode_extensions.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: b6cffd44
|
|
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: не виконує операцій запису (ФС/БД).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Directory Index
|
|
3
|
+
title: plugins/ci-github/rules/ga/vscode_extensions
|
|
4
|
+
resource: plugins/ci-github/rules/ga/vscode_extensions/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# plugins/ci-github/rules/ga/vscode_extensions
|
|
8
|
+
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
| ----------------------------------------------------- | --------- |
|
|
11
|
+
| [fix-vscode_extensions.mjs](fix-vscode_extensions.md) | JS Module |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { patterns } from '@7n/rules/scripts/lib/fix/vscode-ext-add.mjs'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "recommendations": ["github.vscode-github-actions"] }
|
|
@@ -0,0 +1,9 @@
|
|
|
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)
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: fix-vscode_settings.mjs
|
|
4
|
+
resource: plugins/ci-github/rules/ga/vscode_settings/fix-vscode_settings.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 712711ff
|
|
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: не виконує операцій запису (ФС/БД).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Directory Index
|
|
3
|
+
title: plugins/ci-github/rules/ga/vscode_settings
|
|
4
|
+
resource: plugins/ci-github/rules/ga/vscode_settings/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
| Файл | Тип |
|
|
8
|
+
| ------------------------------------------------- | --------- |
|
|
9
|
+
| [fix-vscode_settings.mjs](fix-vscode_settings.md) | JS Module |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "[github-actions-workflow]": { "editor.defaultFormatter": "oxc.oxc-vscode" } }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## `.vscode/settings.json` — налаштування форматування GitHub Actions workflow
|
|
2
|
+
|
|
3
|
+
Rego-пакет: `ga.vscode_settings`
|
|
4
|
+
|
|
5
|
+
**Цільовий файл:** `.vscode/settings.json`
|
|
6
|
+
|
|
7
|
+
Перевіряє 2-рівневу структуру: для кожного `<block-key>` з template кожен `<leaf-key>` у відповідному блоці input має точно відповідати очікуваному значенню. Ключі можуть містити дужки та крапки (VS Code-конвенція, наприклад `[github-actions-workflow]`).
|
|
8
|
+
|
|
9
|
+
Канон: [settings.json.snippet.json](./template/settings.json.snippet.json)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Перевірка `.vscode/settings.json` для GitHub Actions workflow (ga.mdc).
|
|
2
|
+
#
|
|
3
|
+
# Канон надходить через --data: { "template": { "snippet": ... } }
|
|
4
|
+
# Структура --data сформована з template/settings.json.snippet.json.
|
|
5
|
+
# Snippet — 2-рівнева мапа: <language-block-key>.<setting-key> = <expected>
|
|
6
|
+
# (VS Code-конвенція: ключі типу `[github-actions-workflow]` і `editor.defaultFormatter`
|
|
7
|
+
# — це літеральні string-keys із дужками/крапкою, не вкладені обʼєкти).
|
|
8
|
+
#
|
|
9
|
+
# Конвенція проєкту — `import rego.v1` + multi-value `deny contains msg if { … }`
|
|
10
|
+
# (.cursor/rules/conftest.mdc). Лінт — `bun run lint-rego` (regal).
|
|
11
|
+
package ga.vscode_settings
|
|
12
|
+
|
|
13
|
+
import rego.v1
|
|
14
|
+
|
|
15
|
+
deny contains msg if {
|
|
16
|
+
some block_key, expected_inner in data.template.snippet
|
|
17
|
+
inner := object.get(input, block_key, {})
|
|
18
|
+
some leaf_key, expected_value in expected_inner
|
|
19
|
+
actual := object.get(inner, leaf_key, null)
|
|
20
|
+
actual != expected_value
|
|
21
|
+
msg := sprintf(".vscode/settings.json: %s.%s має бути %q (ga.mdc)", [block_key, leaf_key, expected_value])
|
|
22
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## Універсальні Rego-перевірки для всіх workflow-файлів
|
|
2
|
+
|
|
3
|
+
Rego-пакет: `ga.workflow_common`
|
|
4
|
+
|
|
5
|
+
**Цільові файли:** `.github/workflows/*.yml` (кожен файл окремо)
|
|
6
|
+
|
|
7
|
+
### Що перевіряється
|
|
8
|
+
|
|
9
|
+
- **concurrency** — обов'язкова наявність блоку; `group` = `${{ github.ref }}-${{ github.workflow }}`; `cancel-in-progress: true`
|
|
10
|
+
- **Заборонені кроки** — `oven-sh/setup-bun`, `actions/cache`, `bun install` у будь-якому `uses:`/`run:` (мають бути інкапсульовані у composite `setup-bun-deps`)
|
|
11
|
+
- **Порядок кроків** — якщо є `setup-bun-deps`, перед ним обов'язковий `actions/checkout@`
|
|
12
|
+
- **Shell-продовження** — `\` перед переносом рядка у `run:` заборонено; треба `run: >-`
|
|
13
|
+
- **Заборонені команди** — `depcheck` у `run:` (мігровано на `knip`)
|
|
14
|
+
- **Мінімальні версії** — `uses:` з marketplace-actions перевіряються за канонічним JSON; SHA-пін (`owner/action@<40-hex SHA>`) задовольняє вимогу мінімальної версії — НЕ замінюй наявний SHA-пін тегом
|
|
15
|
+
|
|
16
|
+
Канон мінімальних версій: [uses-min-versions.snippet.json](./template/uses-min-versions.snippet.json)
|
|
17
|
+
|
|
18
|
+
Детальна документація поведінки — у [ga-workflow_common](../../js/workflow_common.mdc).
|