@nitra/cursor 1.13.42 → 1.13.44
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 +14 -1
- package/bin/n-cursor.js +1 -2
- package/package.json +1 -1
- package/rules/abie/abie.mdc +10 -1
- package/rules/abie/policy/package_json_docs/package_json_docs.rego +16 -0
- package/rules/abie/policy/package_json_docs/target.json +5 -0
- package/rules/efes/efes.mdc +18 -2
- package/rules/efes/policy/package_json_docs/package_json_docs.rego +16 -0
- package/rules/efes/policy/package_json_docs/target.json +5 -0
- package/rules/ga/lint/lint.mjs +1 -4
- package/rules/k8s/policy/network_policy/network_policy.rego +2 -2
- package/rules/text/lint/lint.mjs +14 -13
- package/schemas/n-cursor.json +1 -1
- package/skills/efes-create-env/SKILL.md +1 -1
- package/.claude-template/npm-CLAUDE.md +0 -40
package/CHANGELOG.md
CHANGED
|
@@ -4,11 +4,24 @@
|
|
|
4
4
|
|
|
5
5
|
Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
|
|
6
6
|
|
|
7
|
+
## [1.13.44] - 2026-05-18
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `abie` rule: новий policy-концерн `abie.package_json_docs` — у кореневому `package.json` `devDependencies` має містити `@nitra/abie-docs` (presence-only, версію не фіксуємо). Реалізація: `npm/rules/abie/policy/package_json_docs/` (target.json + .rego + _test.rego). Bump `abie.mdc` `1.20` → `1.21`.
|
|
12
|
+
- `efes` rule: перший policy-концерн `efes.package_json_docs` — у кореневому `package.json` `devDependencies` має містити `@nitra/efes-docs` (узгоджено з `graphql.mdc`, де схема береться з `node_modules/@nitra/efes-docs/schema/maya.graphql`). Реалізація: `npm/rules/efes/policy/package_json_docs/`. Bump `efes.mdc` `1.0` → `1.1`.
|
|
13
|
+
|
|
14
|
+
## [1.13.43] - 2026-05-18
|
|
15
|
+
|
|
16
|
+
### Removed
|
|
17
|
+
|
|
18
|
+
- `npm/CLAUDE.md` як path-scoped нагадування для роботи в `npm/` повністю прибрано — фінальне завершення міграції з `1.13.42` (де вже прибрали `syncNpmClaudeMd` + Rego-first STOP перенесли у `scripts.mdc`): видалено сам `npm/CLAUDE.md`, темплейт `npm/.claude-template/npm-CLAUDE.md`, останні згадки в `bin/n-cursor.js` (повідомлення про `npm/CLAUDE.md` після sync; JSDoc) і опис у `schemas/n-cursor.json` `claude-config`. Реліз-правила (PR-bump + CHANGELOG) і так живуть у `n-changelog.mdc`/`n-npm-module.mdc` (alwaysApply).
|
|
19
|
+
|
|
7
20
|
## [1.13.42] - 2026-05-18
|
|
8
21
|
|
|
9
22
|
### Added
|
|
10
23
|
|
|
11
|
-
- `efes` rule: новий (поки що порожній) пакет правил для проєктів **github.com/efes-cloud
|
|
24
|
+
- `efes` rule: новий (поки що порожній) пакет правил для проєктів **github.com/efes-cloud/\***. Автодетект у `auto-rules.mjs` через `EFES_REPOSITORY_URL_MARKER` (`https://github.com/efes-cloud/`) — аналогічно до `abie`. Додано `npm/rules/efes/efes.mdc` + `auto.md`, прописано порядок в `AUTO_RULE_ORDER` і покрито тестами в `auto-rules.test.mjs`.
|
|
12
25
|
- `efes-create-env` skill: повʼязано з правилом `efes` через `skills/efes-create-env/auto.md` (`[efes]`) — активується автоматично, коли репозиторій відповідає efes-маркеру. Тести в `auto-skills.test.mjs` фіксують позитивний і негативний випадки.
|
|
13
26
|
|
|
14
27
|
## [1.13.41] - 2026-05-18
|
package/bin/n-cursor.js
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* Agent інтеграція: під час синку, окрім `.cursor/rules` і `.claude/commands` (з skills), CLI ще раз
|
|
24
24
|
* синхронізує `.claude/settings.json` (hooks + permissions; merge — користувацькі поля зберігаються),
|
|
25
25
|
* `.cursor/hooks.json` (Cursor Agent hooks; merge — користувацькі hooks зберігаються),
|
|
26
|
-
*
|
|
26
|
+
* і slash-команди checks (`/n-check`).
|
|
27
27
|
* Опт-аут — поле `claude-config: false` у `.n-cursor.json`.
|
|
28
28
|
*
|
|
29
29
|
* Якщо у корені репозиторію немає .n-cursor.json, спочатку перейменовується за наявності nitra-cursor.json;
|
|
@@ -1315,7 +1315,6 @@ async function runSync() {
|
|
|
1315
1315
|
const parts = []
|
|
1316
1316
|
if (result.settings) parts.push('.claude/settings.json')
|
|
1317
1317
|
if (result.cursorHooks) parts.push('.cursor/hooks.json')
|
|
1318
|
-
if (result.npmClaudeMd) parts.push('npm/CLAUDE.md')
|
|
1319
1318
|
if (result.commands.length > 0) parts.push(`${result.commands.length} slash-commands`)
|
|
1320
1319
|
if (result.adrHook) parts.push('.claude/hooks/capture-decisions.sh')
|
|
1321
1320
|
if (result.adrNormalizeHook) parts.push('.claude/hooks/normalize-decisions.sh')
|
package/package.json
CHANGED
package/rules/abie/abie.mdc
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Правила для проєктів AbInBev Efes
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: '1.
|
|
4
|
+
version: '1.21'
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
Правило **abie** для споживачів **@nitra/cursor**: **k8s** (Deployment + **HealthCheckPolicy** у **`hc.yaml`**, overlay **ua** — **nodeSelector**, **HTTPRoute** (будь-який непорожній **`target.name`**, для спільних сервісів **`auth-run-hl`** / **`file-link-hl`** — **`namespace: dev`** у base та patch **`…/backendRefs/…/namespace`** у **ua**)), гілки **dev**, **ua** у **clean-merged-branch**, а також заборона тримати артефакти **Firebase Hosting** у **підкаталогах першого рівня** (безпосередні діти кореня репозиторію; у самому корені ці імена не вимагаються до видалення).
|
|
@@ -140,6 +140,14 @@ KVCMS_URL=http://kvcms-hl.ua-apruv.svc.abie-ua.internal:8080
|
|
|
140
140
|
|
|
141
141
|
Загальне правило про **внутрішній** URL (не публічний домен) для `HASURA_GRAPHQL_ENDPOINT` лишається у **`hasura.mdc`** (для nitra і abie) — `check-hasura.mjs` приймає кластерний DNS-формат `<cluster>.internal`.
|
|
142
142
|
|
|
143
|
+
## `@nitra/abie-docs` у `devDependencies`
|
|
144
|
+
|
|
145
|
+
У кореневому **`package.json`** abie-проєкту в **`devDependencies`** має бути **`@nitra/abie-docs`** — пакет з канонічними контрактами/схемами abie-сервісів (наприклад, шляхи `node_modules/@nitra/abie-docs/...` для імпорту схем). Версію правило не фіксує — лише presence. Додати:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
bun add -d @nitra/abie-docs
|
|
149
|
+
```
|
|
150
|
+
|
|
143
151
|
## Firebase Hosting
|
|
144
152
|
|
|
145
153
|
У **кожному** підкаталозі, що лежить **безпосередньо** в корені репозиторію, не тримати конфіг і кеш **Firebase Hosting**: у таких каталогах не повинно бути **`.firebaserc`**, **`firebase.json`** та каталогу **`.firebase/`** (у **самому** корені репозиторію ці імена перевіркою abie **не** розглядаються; `node_modules` / `.git` зі скану вилучаються).
|
|
@@ -160,5 +168,6 @@ KVCMS_URL=http://kvcms-hl.ua-apruv.svc.abie-ua.internal:8080
|
|
|
160
168
|
- **`health_check_policy/`** → `abie.health_check_policy` — структура HealthCheckPolicy: `apiVersion: networking.gke.io/v1`, `metadata.name`, `spec.default.config.type: HTTP`, `httpHealthCheck.requestPath` починається з `/`, `port: 8080`, `targetRef.kind: Service`, `targetRef.name` має суфікс `-hl`. **Цільові файли:** `…/k8s/.../hc.yaml`.
|
|
161
169
|
- **`base_deployment_preem/`** → `abie.base_deployment_preem` — Deployment у base/ має `spec.template.spec.nodeSelector.preem` зі значенням `true` (boolean або рядок). **Цільові файли:** ресурсні YAML під `…/k8s/.../base/...`.
|
|
162
170
|
- **`clean_merged_ignore_branches/`** → `abie.clean_merged_ignore_branches` — у workflow `.github/workflows/clean-merged-branch.yml` крок з `uses: phpdocker-io/github-actions-delete-abandoned-branches` має `with.ignore_branches`, що містить токени `dev,ua` (case-insensitive). **Цільові файли:** `.github/workflows/clean-merged-branch.yml`.
|
|
171
|
+
- **`package_json_docs/`** → `abie.package_json_docs` — у кореневому `package.json` `devDependencies` має містити `@nitra/abie-docs` (presence-only, версію не фіксуємо). **Цільові файли:** `package.json`.
|
|
163
172
|
|
|
164
173
|
Cross-file логіка (парність HCP↔Deployment у каталозі, обчислений `<deployment.name>-hl` для `targetRef.name`, валідація ua-overlay JSON6902 patches на HTTPRoute, env→cluster DNS, аналіз cross-namespace backendRefs у пакетах) лишається у **`check-abie.mjs`** — Rego не читає файлову систему й не робить cross-document резолюцію.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Перевірка кореневого `package.json` abie-проєкту: у `devDependencies` має бути
|
|
2
|
+
# `@nitra/abie-docs` (контракти/схеми abie-сервісів — наприклад
|
|
3
|
+
# `node_modules/@nitra/abie-docs/...`). Версію не фіксуємо — лише presence.
|
|
4
|
+
#
|
|
5
|
+
# Inverse-presence перевірка — лишається inline у rego (як `@nitra/cspell-dict`
|
|
6
|
+
# у `text.package_json`), бо у template/ зберігаємо позитивні snippet/deny канони,
|
|
7
|
+
# а не одиничний required-ключ.
|
|
8
|
+
package abie.package_json_docs
|
|
9
|
+
|
|
10
|
+
import rego.v1
|
|
11
|
+
|
|
12
|
+
deny contains msg if {
|
|
13
|
+
dev := object.get(input, "devDependencies", {})
|
|
14
|
+
not "@nitra/abie-docs" in object.keys(dev)
|
|
15
|
+
msg := "package.json: devDependencies має містити @nitra/abie-docs — bun add -d @nitra/abie-docs (abie.mdc)"
|
|
16
|
+
}
|
package/rules/efes/efes.mdc
CHANGED
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Правила для проєктів Efes (репозиторії під github.com/efes-cloud)
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: '1.
|
|
4
|
+
version: '1.1'
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Правило **efes** для споживачів **@nitra/cursor** у репозиторіях під **`github.com/efes-cloud/*`**.
|
|
7
|
+
Правило **efes** для споживачів **@nitra/cursor** у репозиторіях під **`github.com/efes-cloud/*`**.
|
|
8
|
+
|
|
9
|
+
## `@nitra/efes-docs` у `devDependencies`
|
|
10
|
+
|
|
11
|
+
У кореневому **`package.json`** efes-проєкту в **`devDependencies`** має бути **`@nitra/efes-docs`** — пакет з канонічними контрактами/схемами efes-сервісів (зокрема використовується у `graphql.mdc` як `node_modules/@nitra/efes-docs/schema/maya.graphql`). Версію правило не фіксує — лише presence. Додати:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
bun add -d @nitra/efes-docs
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Швидкий gate через conftest (Rego)
|
|
18
|
+
|
|
19
|
+
Пер-документні перевірки efes — rego-полісі у **`npm/rules/efes/policy/`** (запускається через **`npx @nitra/cursor check efes`**; синтаксичний lint — через **`bun run lint-rego`**). Деталі шаблону — у **conftest.mdc** / **n-rego.mdc**.
|
|
20
|
+
|
|
21
|
+
Пакети (директорія в **`npm/rules/efes/policy/`** → namespace → що перевіряє):
|
|
22
|
+
|
|
23
|
+
- **`package_json_docs/`** → `efes.package_json_docs` — у кореневому `package.json` `devDependencies` має містити `@nitra/efes-docs` (presence-only, версію не фіксуємо). **Цільові файли:** `package.json`.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Перевірка кореневого `package.json` efes-проєкту: у `devDependencies` має бути
|
|
2
|
+
# `@nitra/efes-docs` (контракти/схеми efes-сервісів — використовується, зокрема,
|
|
3
|
+
# у `graphql.mdc` як `node_modules/@nitra/efes-docs/schema/maya.graphql`). Версію
|
|
4
|
+
# не фіксуємо — лише presence.
|
|
5
|
+
#
|
|
6
|
+
# Inverse-presence перевірка лишається inline у rego (як `@nitra/cspell-dict`
|
|
7
|
+
# у `text.package_json`).
|
|
8
|
+
package efes.package_json_docs
|
|
9
|
+
|
|
10
|
+
import rego.v1
|
|
11
|
+
|
|
12
|
+
deny contains msg if {
|
|
13
|
+
dev := object.get(input, "devDependencies", {})
|
|
14
|
+
not "@nitra/efes-docs" in object.keys(dev)
|
|
15
|
+
msg := "package.json: devDependencies має містити @nitra/efes-docs — bun add -d @nitra/efes-docs (efes.mdc)"
|
|
16
|
+
}
|
package/rules/ga/lint/lint.mjs
CHANGED
|
@@ -81,10 +81,7 @@ const CONFTEST_PREFLIGHT = {
|
|
|
81
81
|
'Без нього не запускається пер-документна валідація через rego-полісі (npm/rules/*/policy/)',
|
|
82
82
|
'у кроці check-ga — `runConftestBatch` завершується hard-fail.'
|
|
83
83
|
].join('\n '),
|
|
84
|
-
install: [
|
|
85
|
-
'macOS: brew install conftest',
|
|
86
|
-
'Universal: https://www.conftest.dev/install/'
|
|
87
|
-
],
|
|
84
|
+
install: ['macOS: brew install conftest', 'Universal: https://www.conftest.dev/install/'],
|
|
88
85
|
successMsg: '✅ conftest знайдено в PATH — check-ga виконає rego-полісі через runConftestBatch'
|
|
89
86
|
}
|
|
90
87
|
|
|
@@ -130,7 +130,7 @@ egress_has_internet_http_https(spec) if {
|
|
|
130
130
|
is_object(peer)
|
|
131
131
|
ipb := object.get(peer, "ipBlock", null)
|
|
132
132
|
is_object(ipb)
|
|
133
|
-
|
|
133
|
+
ipb.cidr == "0.0.0.0/0"
|
|
134
134
|
ports := object.get(rule, "ports", null)
|
|
135
135
|
is_array(ports)
|
|
136
136
|
egress_ports_include(ports, 80)
|
|
@@ -140,7 +140,7 @@ egress_has_internet_http_https(spec) if {
|
|
|
140
140
|
egress_ports_include(ports, want) if {
|
|
141
141
|
some p in ports
|
|
142
142
|
is_object(p)
|
|
143
|
-
|
|
143
|
+
p.port == want
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
egress_has_cluster_namespace_selector(spec) if {
|
package/rules/text/lint/lint.mjs
CHANGED
|
@@ -51,13 +51,10 @@ const SHELLCHECK_PREFLIGHT = {
|
|
|
51
51
|
/** @type {PreflightDep} */
|
|
52
52
|
const PATCH_PREFLIGHT = {
|
|
53
53
|
bin: 'patch',
|
|
54
|
-
explanation: [
|
|
55
|
-
'
|
|
56
|
-
|
|
57
|
-
install: [
|
|
58
|
-
'macOS: зазвичай уже є в системі',
|
|
59
|
-
'Debian/Ubuntu: sudo apt-get install -y patch'
|
|
60
|
-
],
|
|
54
|
+
explanation: ['Без `patch` не застосуються авто-виправлення shellcheck (`shellcheck -f diff` + `patch -p1`).'].join(
|
|
55
|
+
'\n '
|
|
56
|
+
),
|
|
57
|
+
install: ['macOS: зазвичай уже є в системі', 'Debian/Ubuntu: sudo apt-get install -y patch'],
|
|
61
58
|
successMsg: '✅ patch знайдено в PATH — shellcheck auto-fix працюватиме'
|
|
62
59
|
}
|
|
63
60
|
|
|
@@ -78,8 +75,9 @@ const DOTENV_LINTER_PREFLIGHT = {
|
|
|
78
75
|
}
|
|
79
76
|
|
|
80
77
|
/**
|
|
81
|
-
*
|
|
82
|
-
* @
|
|
78
|
+
* Шукає шлях до бінарника `dep.bin` у `PATH`; на Windows додатково перебирає `dep.winBins`.
|
|
79
|
+
* @param {PreflightDep} dep опис залежності з canon-списку preflight-перевірок
|
|
80
|
+
* @returns {string | null} абсолютний шлях до знайденого бінарника або `null`, якщо не знайдено
|
|
83
81
|
*/
|
|
84
82
|
function resolvePreflightBin(dep) {
|
|
85
83
|
if (platform === 'win32' && dep.winBins) {
|
|
@@ -92,8 +90,9 @@ function resolvePreflightBin(dep) {
|
|
|
92
90
|
}
|
|
93
91
|
|
|
94
92
|
/**
|
|
95
|
-
*
|
|
96
|
-
* @
|
|
93
|
+
* Друкує stderr-повідомлення про відсутній бінарник з install-hint'ами і посиланням на правило.
|
|
94
|
+
* @param {PreflightDep} dep опис залежності — джерело пояснення й install-команд
|
|
95
|
+
* @returns {void} нічого не повертає; виводить рядки в `console.error`
|
|
97
96
|
*/
|
|
98
97
|
function printPreflightMissingMessage(dep) {
|
|
99
98
|
console.error(`❌ ${dep.bin} не знайдено в PATH.`)
|
|
@@ -106,8 +105,10 @@ function printPreflightMissingMessage(dep) {
|
|
|
106
105
|
}
|
|
107
106
|
|
|
108
107
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
108
|
+
* Виконує preflight-перевірку: повертає `true` і друкує `successMsg`, якщо бінарник знайдено,
|
|
109
|
+
* інакше друкує install-hint у stderr і повертає `false`.
|
|
110
|
+
* @param {PreflightDep} dep опис залежності для перевірки наявності в `PATH`
|
|
111
|
+
* @returns {boolean} `true` — бінарник знайдено, `false` — відсутній
|
|
111
112
|
*/
|
|
112
113
|
function preflight(dep) {
|
|
113
114
|
if (resolvePreflightBin(dep)) {
|
package/schemas/n-cursor.json
CHANGED
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
},
|
|
58
58
|
"claude-config": {
|
|
59
59
|
"type": "boolean",
|
|
60
|
-
"description": "Чи синхронізувати `.claude/settings.json` (hooks + permissions, merge зі збереженням користувацьких полів)
|
|
60
|
+
"description": "Чи синхронізувати `.claude/settings.json` (hooks + permissions, merge зі збереженням користувацьких полів) і slash-команди checks. За замовчуванням true.",
|
|
61
61
|
"default": true
|
|
62
62
|
}
|
|
63
63
|
},
|
|
@@ -136,7 +136,7 @@ cp site/k8s/$BASE/kustomization.yaml site/k8s/$ENV/kustomization.yaml
|
|
|
136
136
|
У секцію `"scripts"` додай рядок (зберігай порядок поряд із сусідніми `start-remote-*`):
|
|
137
137
|
|
|
138
138
|
```json
|
|
139
|
-
"start-remote-$ENV": "vite dev --mode remote-$ENV"
|
|
139
|
+
{ "scripts": { "start-remote-$ENV": "vite dev --mode remote-$ENV" } }
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
### 4. Зареєструвати `$ENV` у CI/CD branch-списках
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
<!-- Файл генерується автоматично через `npx @nitra/cursor`. Не редагуй вручну. -->
|
|
2
|
-
|
|
3
|
-
# Робота в `npm/`
|
|
4
|
-
|
|
5
|
-
Path-scoped нагадування для агента: підвантажується автоматично, коли редагуємо файли під `npm/`.
|
|
6
|
-
|
|
7
|
-
## Перед PR з коміт-релевантними змінами в `npm/`
|
|
8
|
-
|
|
9
|
-
1. Підвищ `version` у `npm/package.json` (build-bump, не більше одного кроку відносно `HEAD`).
|
|
10
|
-
2. Додай запис у `npm/CHANGELOG.md` форматом Keep a Changelog: `## [версія] - YYYY-MM-DD` + секції `### Added/Changed/Fixed/Removed`.
|
|
11
|
-
3. Переконайся, що `"CHANGELOG.md"` є в масиві `files` у `npm/package.json` (правило `changelog`).
|
|
12
|
-
|
|
13
|
-
Логіка PR-scoped: bump і запис достатньо зробити **один раз — як суму по всьому PR** (порівняння йде з гілкою `dev`), а не на кожен коміт.
|
|
14
|
-
|
|
15
|
-
Без оновленого CHANGELOG `npx @nitra/cursor check changelog` падає, а `Stop` hook блокує завершення ходу.
|
|
16
|
-
|
|
17
|
-
## Перевірка локально
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
npx @nitra/cursor check changelog
|
|
21
|
-
npx @nitra/cursor check npm-module
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Перш ніж писати / розширювати `check-*.mjs`
|
|
25
|
-
|
|
26
|
-
**STOP — спершу пройди алгоритм Rego-first** (`.cursor/rules/conftest.mdc`, alwaysApply). Це стосується **і нової** перевірки, **і додавання нового deny у вже існуючий** `check-<rule>.mjs`: подивись `npm/policy/<rule>/`, чи задача не лягає у вже існуючий rego-пакет як ще одне `deny contains`.
|
|
27
|
-
|
|
28
|
-
Швидкий self-check для нової перевірки (порядок важливий):
|
|
29
|
-
|
|
30
|
-
1. **Це пер-документна перевірка одного JSON/YAML?** (наявність / форма поля, regex по значенню, перелік дозволених літералів). → **Rego, без JS-коду.** Пиши у `npm/policy/<rule>/<name>/<name>.rego` + `<name>_test.rego`.
|
|
31
|
-
2. Потрібен `readdir`, `stat`, парність файлів, AST-парсинг JS/TS, autofix, modeline до YAML-body? → **JS** у `check-<rule>.mjs`. Per-document частина (якщо є) усе одно лишається у rego — JS викликає її через `runConftestBatch`.
|
|
32
|
-
3. Не впевнений? Подивись референс **`npm/policy/k8s/*`** ↔ **`npm/scripts/check-k8s.mjs`** (Plan B: Rego-authoritative + JS-orchestrator) і список «що Rego об'єктивно не вміє» у `conftest.mdc`.
|
|
33
|
-
|
|
34
|
-
**Червоний прапор:** дописуєш `if (pkg.<field>) fail(…)` у JS — майже завжди це варто було робити як `deny contains msg if { … }` у відповідному rego-пакеті. Перевір `npm/policy/<rule>/` **перед** редагуванням `check-<rule>.mjs`.
|
|
35
|
-
|
|
36
|
-
## Джерело правил
|
|
37
|
-
|
|
38
|
-
- `.cursor/rules/n-changelog.mdc` — правило про CHANGELOG (PR-scoped, для всіх воркспейсів)
|
|
39
|
-
- `.cursor/rules/n-npm-module.mdc` — правило публікації пакета (типи, hk, npm-publish workflow)
|
|
40
|
-
- `npm/scripts/check-changelog.mjs`, `npm/scripts/check-npm-module.mjs` — алгоритми перевірки
|