@nitra/cursor 1.8.84 → 1.8.85

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/k8s.mdc CHANGED
@@ -15,6 +15,8 @@ alwaysApply: false
15
15
 
16
16
  Далі — вміст маніфесту. Зайвий порожній рядок між коментарем і YAML не додавай, якщо в проєкті не прийнято інше.
17
17
 
18
+ **Виняток — без modeline:** `apiVersion: alb.yc.io/v1alpha1`, `kind: HttpBackendGroup` (Yandex ALB) — рядка **`# yaml-language-server: $schema=…`** у файлі **не** має бути (ні в першому рядку, ні далі). Перший рядок — одразу YAML (`apiVersion:` тощо). Перевірка — **`check-k8s.mjs`**.
19
+
18
20
  **Розширення:** усі маніфести під **`k8s`**, включно з **`kustomization.yaml`**, — лише **`.yaml`** (розширення **`.yml`** не використовуй).
19
21
 
20
22
  **Dockerfile / hadolint** — окреме правило **`docker.mdc`** і **`npx @nitra/cursor check docker`**.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.8.84",
3
+ "version": "1.8.85",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -13,6 +13,7 @@
13
13
  * **k8s:** якщо під деревом із сегментом **`k8s`** є YAML з **`kind: Deployment`**, у тій самій директорії
14
14
  * має існувати **`hc.yaml`** із **`HealthCheckPolicy`** (**`networking.gke.io/v1`**), modeline **`$schema`**
15
15
  * як у abie.mdc, **`/healthz`**, порт **8080**, **`targetRef`** на **Service** з тим самим **`metadata.name`**.
16
+ * Загальні вимоги до **`# yaml-language-server: $schema`** для інших YAML під **`k8s`** — у **check-k8s.mjs** / **k8s.mdc** (наприклад **HttpBackendGroup** `alb.yc.io/v1alpha1` — **без** modeline).
16
17
  * Якщо в дереві **k8s** є **HealthCheckPolicy**, перевіряється **`ru/kustomization.yaml`** з patch **`$patch: delete`**
17
18
  * (логіка вмісту — **`ruKustomizationHasHealthCheckDeletePatch`** у **check-k8s.mjs**, узгоджено з **k8s.mdc**).
18
19
  *
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Перший рядок `# yaml-language-server: $schema=…`, без дублікатів, розширення `.yaml`
5
5
  * (окрім `kustomization.yaml`); URL схеми за першим документом — kustomization / yannh / datree
6
+ * (**виняток:** `apiVersion: alb.yc.io/v1alpha1`, `kind: HttpBackendGroup` — рядка `# yaml-language-server:` у файлі бути не має).
6
7
  * (datree за замовчуванням: GitHub Pages `https://datreeio.github.io/CRDs-catalog/…`).
7
8
  *
8
9
  * Додатково: у кожному YAML-документі з **`kind: Deployment`** у кожного контейнера
@@ -671,6 +672,18 @@ function extractApiVersionAndKind(doc) {
671
672
  }
672
673
  }
673
674
 
675
+ /**
676
+ * Чи перший YAML-документ (до `---`) — **HttpBackendGroup** з API **alb.yc.io/v1alpha1** (Yandex ALB).
677
+ * Для таких файлів **check-k8s** не вимагає modeline `# yaml-language-server: $schema=…` і забороняє його.
678
+ * @param {string} yamlBody вміст файлу або фрагмент після modeline
679
+ * @returns {boolean} true, якщо `apiVersion`/`kind` першого документа збігаються з винятком
680
+ */
681
+ export function k8sYamlFirstDocIsAlbYcHttpBackendGroup(yamlBody) {
682
+ const first = firstYamlDocument(yamlBody)
683
+ const { apiVersion, kind } = extractApiVersionAndKind(first)
684
+ return apiVersion === 'alb.yc.io/v1alpha1' && kind === 'HttpBackendGroup'
685
+ }
686
+
674
687
  /**
675
688
  * Чи вміст overlay **`ru/kustomization.yaml`** містить Kustomize patch видалення **HealthCheckPolicy**.
676
689
  * @param {string} raw повний текст файлу
@@ -1599,12 +1612,38 @@ async function checkK8sYamlFile(abs, root, fail, pass, kustomizeManagedRel) {
1599
1612
  return
1600
1613
  }
1601
1614
 
1602
- const m = lines[0].match(MODELINE_RE)
1603
- if (!m) {
1615
+ const firstLineIsModeline = MODELINE_RE.test(lines[0])
1616
+ const bodyForFirstDoc = k8sYamlBodyForDocumentParse(lines)
1617
+ const isAlbHttpBackendGroup = k8sYamlFirstDocIsAlbYcHttpBackendGroup(bodyForFirstDoc)
1618
+
1619
+ if (isAlbHttpBackendGroup) {
1620
+ if (firstLineIsModeline) {
1621
+ fail(
1622
+ `${rel}: для kind HttpBackendGroup (apiVersion alb.yc.io/v1alpha1) не задавай # yaml-language-server: $schema — прибери перший рядок modeline (k8s.mdc)`
1623
+ )
1624
+ return
1625
+ }
1626
+ if (countSchemaModelines(lines) > 0) {
1627
+ fail(
1628
+ `${rel}: для kind HttpBackendGroup (apiVersion alb.yc.io/v1alpha1) не використовуй # yaml-language-server: $schema у файлі (k8s.mdc)`
1629
+ )
1630
+ return
1631
+ }
1632
+ const body = lines.join('\n')
1633
+ scanIngressInYamlDocuments(rel, body, fail)
1634
+ pass(`${rel}: HttpBackendGroup (alb.yc.io/v1alpha1) — modeline $schema не застосовується (k8s.mdc)`)
1635
+ const kustomizeManaged = kustomizeManagedRel.has(rel)
1636
+ validateK8sYamlPolicyDocuments(rel, baseLower, body, fail, kustomizeManaged)
1637
+ scanGatewayApiRouteBackendRefsInYamlBody(rel, body, fail)
1638
+ return
1639
+ }
1640
+
1641
+ if (!firstLineIsModeline) {
1604
1642
  fail(`${rel}: перший рядок має бути коментарем # yaml-language-server: $schema=<url> (без префіксів перед #)`)
1605
1643
  return
1606
1644
  }
1607
1645
 
1646
+ const m = /** @type {RegExpMatchArray} */ (lines[0].match(MODELINE_RE))
1608
1647
  const schemaUrl = m[1]
1609
1648
  if (countSchemaModelines(lines) > 1) {
1610
1649
  fail(`${rel}: кілька рядків yaml-language-server $schema — лиш один modeline на файл (див. k8s.mdc)`)