@nitra/cursor 1.8.86 → 1.8.88
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/mdc/abie.mdc +3 -3
- package/mdc/k8s.mdc +5 -36
- package/package.json +1 -1
- package/scripts/check-abie.mjs +5 -3
- package/scripts/check-k8s.mjs +4 -0
package/mdc/abie.mdc
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Правила для проєктів AbInBev Efes
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: '1.
|
|
4
|
+
version: '1.11'
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
Правило **abie** для споживачів **@nitra/cursor**: **k8s** (Deployment + **HealthCheckPolicy** у **`hc.yaml`**, overlay **ua** / **ru** — **nodeSelector**, **HTTPRoute** (будь-який непорожній **`target.name`**, для спільних сервісів **`auth-run-hl`** / **`filelint-hl`** — **`namespace: dev`** у base та patch **`…/backendRefs/…/namespace`** у **ua** / **ru**), видалення **HealthCheckPolicy** у **ru**), гілки **dev**, **ua**, **ru** у **clean-merged-branch**, а також заборона артефактів **Firebase Hosting** у корені репозиторію.
|
|
@@ -12,7 +12,7 @@ version: '1.10'
|
|
|
12
12
|
|
|
13
13
|
## k8s: `hc.yaml` поруч із Deployment
|
|
14
14
|
|
|
15
|
-
Якщо під **`k8s`** є **Deployment**, у **тій самій директорії** має бути **`hc.yaml`** з **HealthCheckPolicy** (**`networking.gke.io/v1`**): коректний modeline **`$schema`**, **`/healthz`**, порт **8080**, **`targetRef.name`**
|
|
15
|
+
Якщо під **`k8s`** є **Deployment**, у **тій самій директорії** має бути **`hc.yaml`** з **HealthCheckPolicy** (**`networking.gke.io/v1`**): коректний modeline **`$schema`**, **`/healthz`**, порт **8080**, **`targetRef.name`** — **headless** **Service** з суфіксом **`-hl`** (узгоджено з парою **`svc.yaml`** / **`svc-hl.yaml`** у **k8s.mdc**): або **`${metadata.name}-hl`**, або те саме ім’я, якщо **`metadata.name`** уже з **`-hl`**.
|
|
16
16
|
|
|
17
17
|
```yaml title="hc.yaml"
|
|
18
18
|
# yaml-language-server: $schema=https://datreeio.github.io/CRDs-catalog/networking.gke.io/healthcheckpolicy_v1.json
|
|
@@ -31,7 +31,7 @@ spec:
|
|
|
31
31
|
targetRef:
|
|
32
32
|
group: ''
|
|
33
33
|
kind: Service
|
|
34
|
-
name:
|
|
34
|
+
name: СЕРВІС-hl
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
## k8s: overlay **HTTPRoute** (**ua** / **ru**)
|
package/mdc/k8s.mdc
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: K8s YAML — $schema (yaml-language-server); lint-k8s (kubeconform, kubescape); check-k8s
|
|
3
|
-
version: '1.
|
|
3
|
+
version: '1.25'
|
|
4
4
|
globs: "**/k8s/**/*.yaml"
|
|
5
5
|
alwaysApply: false
|
|
6
6
|
---
|
|
@@ -253,44 +253,13 @@ spec:
|
|
|
253
253
|
|
|
254
254
|
Для `$schema` у першому рядку див. приклад **HealthCheckPolicy** у тому ж розділі (datree CRDs-catalog).
|
|
255
255
|
|
|
256
|
+
**`spec.targetRef`** (типово **`kind: Service`**) має вказувати на **headless** сервіс — ім’я з суфіксом **`-hl`** (див. **«Service: `svc.yaml` і `svc-hl.yaml`»**); для проєктів **abie** точні умови — **`check-abie.mjs`** / **abie.mdc**.
|
|
257
|
+
|
|
256
258
|
За потреби розшир **`target`** (`name`, `namespace`), щоб однозначно вказати об’єкт.
|
|
257
259
|
|
|
258
260
|
**`check k8s`:** заборонено **`kind: Ingress`**.
|
|
259
261
|
|
|
260
|
-
3.
|
|
261
|
-
|
|
262
|
-
```yaml title="base/rg.yaml"
|
|
263
|
-
# yaml-language-server: $schema=https://datreeio.github.io/CRDs-catalog/gateway.networking.k8s.io/referencegrant_v1beta1.json
|
|
264
|
-
apiVersion: gateway.networking.k8s.io/v1beta1
|
|
265
|
-
kind: ReferenceGrant
|
|
266
|
-
metadata:
|
|
267
|
-
name: contract-to-dev
|
|
268
|
-
namespace: dev
|
|
269
|
-
spec:
|
|
270
|
-
from:
|
|
271
|
-
- group: gateway.networking.k8s.io
|
|
272
|
-
kind: HTTPRoute
|
|
273
|
-
namespace: contract
|
|
274
|
-
to:
|
|
275
|
-
- group: ''
|
|
276
|
-
kind: Service
|
|
277
|
-
# Якщо name не вказано, доступ дозволено до всіх Service в цьому namespace
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
**ReferenceGrant** має бути в **namespace** тих **Service**, до яких відкривається доступ (у прикладі — **`dev`**). Якщо **`namespace:`** у **overlay** не збігається з **namespace** гранта, **не** додавай **`base/rg.yaml`** у **`resources:`** того overlay — Kustomize може перезаписати **`metadata.namespace`** гранта. Натомість застосуй **`patches`** (JSON patch), щоб явно виставити потрібний **namespace**:
|
|
281
|
-
|
|
282
|
-
```yaml title="overlay/kustomization.yaml (фрагмент)"
|
|
283
|
-
patches:
|
|
284
|
-
- target:
|
|
285
|
-
kind: ReferenceGrant
|
|
286
|
-
name: contract-to-dev
|
|
287
|
-
patch: |-
|
|
288
|
-
- op: replace
|
|
289
|
-
path: /metadata/namespace
|
|
290
|
-
value: dev
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
4. **JSON patch у kustomization:** де можливо, змінюй ресурс через **`op: replace`** (одна операція на `path`), а не пару **`remove` + `add`** на той самий шлях. **`add`** / **`remove`** лишай лише коли **`replace`** не підходить (наприклад додати новий ключ або прибрати поле без заміни).
|
|
262
|
+
3. **JSON patch у kustomization:** де можливо, змінюй ресурс через **`op: replace`** (одна операція на `path`), а не пару **`remove` + `add`** на той самий шлях. **`add`** / **`remove`** лишай лише коли **`replace`** не підходить (наприклад додати новий ключ або прибрати поле без заміни).
|
|
294
263
|
|
|
295
264
|
```yaml title="overlay/kustomization.yaml (фрагмент)"
|
|
296
265
|
patches:
|
|
@@ -308,7 +277,7 @@ patches:
|
|
|
308
277
|
|
|
309
278
|
**`npx @nitra/cursor check k8s`** — програмні критерії в **JSDoc на початку** **`npm/scripts/check-k8s.mjs`**. Якщо під **`k8s`** немає **`*.yaml`** — крок пропущено. Канон **`$schema`** для редактора — розділ **«Визначення схеми YAML`** нижче.
|
|
310
279
|
|
|
311
|
-
**Не входить у check k8s:** наприклад
|
|
280
|
+
**Не входить у check k8s:** наприклад повна структура **`HTTPRoute`** для **Hasura** (канон — у розділі про **`hasura/graphql-engine`**), **kubeconform** / **kubescape** — це **`bun run lint-k8s`**.
|
|
312
281
|
|
|
313
282
|
## Коли застосовувати (агентам)
|
|
314
283
|
|
package/package.json
CHANGED
package/scripts/check-abie.mjs
CHANGED
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
*
|
|
13
13
|
* **k8s:** якщо під деревом із сегментом **`k8s`** є YAML з **`kind: Deployment`**, у тій самій директорії
|
|
14
14
|
* має існувати **`hc.yaml`** із **`HealthCheckPolicy`** (**`networking.gke.io/v1`**), modeline **`$schema`**
|
|
15
|
-
* як у abie.mdc, **`/healthz`**, порт **8080**, **`targetRef`** на **Service** з
|
|
15
|
+
* як у abie.mdc, **`/healthz`**, порт **8080**, **`targetRef`** на **headless Service** (ім’я з суфіксом **`-hl`**):
|
|
16
|
+
* якщо **`metadata.name`** уже закінчується на **`-hl`**, **`targetRef.name`** має збігатися з ним; інакше **`targetRef.name`** = **`${metadata.name}-hl`**.
|
|
16
17
|
* Загальні вимоги до **`# yaml-language-server: $schema`** для інших YAML під **`k8s`** — у **check-k8s.mjs** / **k8s.mdc** (наприклад **HttpBackendGroup** `alb.yc.io/v1alpha1` — **без** modeline).
|
|
17
18
|
* Якщо в дереві **k8s** є **HealthCheckPolicy**, перевіряється **`ru/kustomization.yaml`** з patch **`$patch: delete`**
|
|
18
19
|
* (логіка вмісту — **`ruKustomizationHasHealthCheckDeletePatch`** у **check-k8s.mjs**, узгоджено з **k8s.mdc**).
|
|
@@ -900,8 +901,9 @@ export function validateAbieHcYaml(raw, relPath) {
|
|
|
900
901
|
return `${relPath}: targetRef.kind має бути Service (abie.mdc)`
|
|
901
902
|
}
|
|
902
903
|
const svcName = targetRef.name
|
|
903
|
-
|
|
904
|
-
|
|
904
|
+
const expectedHl = name.endsWith('-hl') ? name : `${name}-hl`
|
|
905
|
+
if (typeof svcName !== 'string' || svcName !== expectedHl) {
|
|
906
|
+
return `${relPath}: targetRef.name має посилатися на headless Service (очікується ${expectedHl}, суфікс -hl) (abie.mdc)`
|
|
905
907
|
}
|
|
906
908
|
return null
|
|
907
909
|
}
|
package/scripts/check-k8s.mjs
CHANGED
|
@@ -1148,6 +1148,9 @@ export function serviceSvcHlYamlHeadlessViolation(manifest) {
|
|
|
1148
1148
|
|
|
1149
1149
|
/**
|
|
1150
1150
|
* Чи об’єкт схожий на **backendRef** до **Kubernetes Service** у Gateway API.
|
|
1151
|
+
*
|
|
1152
|
+
* Вимагає числовий **`port`**, щоб не плутати з **`HTTPHeaderMatch`** тощо (там теж є **`name`**, але без **`port`**).
|
|
1153
|
+
*
|
|
1151
1154
|
* @param {unknown} obj вузол у дереві **`spec`**
|
|
1152
1155
|
* @returns {boolean} true, якщо враховуємо поле **`name`** як посилання на Service
|
|
1153
1156
|
*/
|
|
@@ -1155,6 +1158,7 @@ function isGatewayApiBackendRefToService(obj) {
|
|
|
1155
1158
|
if (obj === null || obj === undefined || typeof obj !== 'object' || Array.isArray(obj)) return false
|
|
1156
1159
|
const o = /** @type {Record<string, unknown>} */ (obj)
|
|
1157
1160
|
if (typeof o.name !== 'string') return false
|
|
1161
|
+
if (typeof o.port !== 'number') return false
|
|
1158
1162
|
const kind = o.kind
|
|
1159
1163
|
if (kind !== undefined && kind !== 'Service') return false
|
|
1160
1164
|
const group = o.group
|