@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Правила для проєктів AbInBev Efes
3
3
  alwaysApply: true
4
- version: '1.10'
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`** = **`metadata.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.24'
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. Якщо **HTTPRoute** посилається на **Service** в іншому **namespace**, потрібен **ReferenceGrant** (дозвіл). Наприклад **HTTPRoute** в **`contract`** і **Service** в **`dev`** додай маніфест на кшталт **`base/rg.yaml`** (фрагмент нижче).
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:** наприклад **ReferenceGrant** і доступ між **namespace** (лише рекомендації тут), повна структура **`HTTPRoute`** для **Hasura** (канон — у розділі про **`hasura/graphql-engine`**), **kubeconform** / **kubescape** — це **`bun run lint-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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.8.86",
3
+ "version": "1.8.88",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -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** з тим самим **`metadata.name`**.
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
- if (typeof svcName !== 'string' || svcName !== name) {
904
- return `${relPath}: targetRef.name має збігатися з metadata.name (${name}) (abie.mdc)`
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
  }
@@ -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