@7n/rules-ci-github 2.2.1 → 2.3.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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.0] - 2026-08-01
4
+
5
+ ### Added
6
+
7
+ - `ga/workflow_common`: маркер `n-rules:allow-<pattern>` у тілі кроку знімає заборону конкретного підрядка саме для цього кроку — потрібно там, де composite `setup-bun-deps` принципово не підходить (він робить `--frozen-lockfile`, а крок навмисно перегенеровує lock)
8
+
3
9
  ## [2.2.1] - 2026-07-30
4
10
 
5
11
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/rules-ci-github",
3
- "version": "2.2.1",
3
+ "version": "2.3.0",
4
4
  "description": "Плагін @7n/rules: канон GitHub Actions (.github/workflows) — обов'язкові workflow, zizmor, VS Code",
5
5
  "keywords": [
6
6
  "github-actions",
@@ -93,12 +93,23 @@ all_flat_steps contains entry if {
93
93
  }
94
94
 
95
95
  # ── deny: заборонені setup-bun/cache/install у будь-якому кроці ────────────
96
+ #
97
+ # Санкціонований виняток — маркер `n-rules:allow-<pattern>` у самому кроці
98
+ # (`bun install` → `n-rules:allow-bun-install`). Потрібен там, де composite
99
+ # `setup-bun-deps` принципово не підходить: він робить `--frozen-lockfile`, а
100
+ # крок навмисно ПЕРЕгенеровує lock (реліз-синк платформних пінів). Маркер
101
+ # живе в тілі кроку, тож виняток вузький (лише цей крок), видимий у diff-і й
102
+ # вимагає свідомого рішення автора — на відміну від синоніма команди, який
103
+ # обходив би правило нишком.
104
+ allow_marker(pattern) := sprintf("n-rules:allow-%s", [replace(pattern, " ", "-")])
96
105
 
97
106
  deny contains msg if {
98
107
  some entry in all_flat_steps
99
108
  some pattern, hint in forbidden_step_substrings
100
- step_uses_or_run_blob(entry.step) != ""
101
- contains(step_uses_or_run_blob(entry.step), pattern)
109
+ blob := step_uses_or_run_blob(entry.step)
110
+ blob != ""
111
+ contains(blob, pattern)
112
+ not contains(blob, allow_marker(pattern))
102
113
  msg := sprintf("jobs.%s.steps[%d]: %s (ga.mdc)", [entry.job_id, entry.step_index, hint])
103
114
  }
104
115