@nitra/cursor 1.9.1 → 1.9.2

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
@@ -4,6 +4,12 @@
4
4
 
5
5
  Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
6
6
 
7
+ ## [1.9.2] - 2026-05-11
8
+
9
+ ### Changed
10
+
11
+ - **k8s — modeline `$schema` тепер опційний; `file:…` заборонено як заглушку:** правило `k8s.mdc` уточнено — рядок `# yaml-language-server: $schema=…` обов'язковий **лише** коли для поєднання `apiVersion`/`kind` існує надійна публічна схема (kustomization / yannh / datree CRDs-catalog). Якщо публічної схеми немає, modeline **не додається зовсім** (раніше п. 5 розділу «Визначення схеми YAML» допускав `file:` за узгодженням — це створювало фальшиву видимість валідації, а автовиправлення n-fix залишало заглушковий `# yaml-language-server: $schema=file:.`). У `check-k8s.mjs`: (1) файли без modeline більше не падають як «перший рядок має бути коментарем», натомість `pass` із позначкою «без modeline — перевірка $schema пропущена»; (2) `$schema=file:…` тепер реєструється як помилка з підказкою прибрати modeline; (3) modeline нижче першого рядка все ще порушення; (4) `HttpBackendGroup` (Yandex ALB) як виняток без modeline залишається без змін. `lint-k8s` (kubeconform з прапорцем ignore-missing-schemas) продовжує покривати валідацію і для файлів без modeline. JSDoc на початку `check-k8s.mjs` оновлено.
12
+
7
13
  ## [1.9.1] - 2026-05-11
8
14
 
9
15
  ### Added
package/mdc/k8s.mdc CHANGED
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  description: K8s YAML — $schema (yaml-language-server); lint-k8s (kubeconform, kubescape); check-k8s
3
- version: '1.27'
3
+ version: '1.28'
4
4
  globs: "**/k8s/**/*.yaml"
5
5
  alwaysApply: false
6
6
  ---
7
7
 
8
8
  # Kubernetes YAML у шляхах з `k8s`
9
9
 
10
- Для кожного файлу `*.yaml`, у шляху якого є сегмент директорії **`k8s`** (наприклад `site/k8s/base/deployment.yaml`), **перший рядок** — коментар-директива для [YAML Language Server](https://github.com/redhat-developer/yaml-language-server):
10
+ Для кожного файлу `*.yaml`, у шляху якого є сегмент директорії **`k8s`** (наприклад `site/k8s/base/deployment.yaml`), якщо існує **публічна** схема (kustomization / yannh / datree CRDs-catalog — див. «Визначення схеми YAML»), **перший рядок** — коментар-директива для [YAML Language Server](https://github.com/redhat-developer/yaml-language-server) з URL за `https://`:
11
11
 
12
12
  ```yaml
13
13
  # yaml-language-server: $schema=https://...
@@ -15,7 +15,9 @@ 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`**.
18
+ **Modelineопційний:** якщо для конкретного поєднання `apiVersion`/`kind` **немає** надійної публічної схеми (yannh/datree/schemastore не покривають), залиш файл **без** рядка `# yaml-language-server: $schema=…`. **Заборонено** ставити `$schema=file:…` як заглушку це створює видимість валідації без неї. Без modeline `check-k8s` не валідує URL, але **`lint-k8s`** (kubeconform/kubescape) продовжить роботу. Якщо modeline присутній він обов'язково перший рядок і **тільки** `https://` URL, який відповідає очікуваному за `apiVersion`/`kind`.
19
+
20
+ **Виняток — modeline заборонено:** `apiVersion: alb.yc.io/v1alpha1`, `kind: HttpBackendGroup` (Yandex ALB) — рядка **`# yaml-language-server: $schema=…`** у файлі **не** має бути (ні в першому рядку, ні далі). Перший рядок — одразу YAML (`apiVersion:` тощо). Перевірка — **`check-k8s.mjs`**.
19
21
 
20
22
  **Розширення:** усі маніфести під **`k8s`**, включно з **`kustomization.yaml`**, — лише **`.yaml`** (розширення **`.yml`** не використовуй).
21
23
 
@@ -695,7 +697,7 @@ patch: |-
695
697
  # yaml-language-server: $schema=https://datreeio.github.io/CRDs-catalog/networking.gke.io/healthcheckpolicy_v1.json
696
698
  ```
697
699
 
698
- 5. **Немає надійного публічного URL** — не вигадуй: залиш коректний `$schema` або `file:` за узгодженням.
700
+ 5. **Немає надійного публічного URL** — не вигадуй URL і **не** використовуй `$schema=file:…` як заглушку (фальшива валідація). Залиш файл **без** рядка `# yaml-language-server: $schema=…` зовсім — `check-k8s` пропустить перевірку URL для таких файлів, а `lint-k8s` (kubeconform з `-ignore-missing-schemas`) усе ще покриє валідацію.
699
701
 
700
702
  ## Багатодокументні YAML
701
703
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.9.1",
3
+ "version": "1.9.2",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -1,11 +1,16 @@
1
1
  /**
2
2
  * Перевіряє Kubernetes YAML у шляхах з сегментом `k8s` (див. k8s.mdc).
3
3
  *
4
- * Перший рядок `# yaml-language-server: $schema=…`, без дублікатів, розширення `.yaml`
4
+ * Перший рядок `# yaml-language-server: $schema=…` (URL за `https://`), без дублікатів, розширення `.yaml`
5
5
  * (окрім `kustomization.yaml`); URL схеми за першим документом — kustomization / yannh / datree
6
6
  * (**виняток:** `apiVersion: alb.yc.io/v1alpha1`, `kind: HttpBackendGroup` — рядка `# yaml-language-server:` у файлі бути не має).
7
7
  * (datree за замовчуванням: GitHub Pages `https://datreeio.github.io/CRDs-catalog/…`).
8
8
  *
9
+ * Modeline **опційний**: якщо публічної схеми немає (yannh/datree/schemastore не покривають це поєднання
10
+ * apiVersion/kind), залиш файл **без** рядка `# yaml-language-server: $schema=…` — `check-k8s` пропустить
11
+ * перевірку URL. **Заборонено** ставити `$schema=file:…` як заглушку (це фальшива валідація). Якщо modeline
12
+ * присутній, він має бути **першим рядком** і містити `https://` URL, що відповідає очікуваному за apiVersion/kind.
13
+ *
9
14
  * Додатково: у кожному YAML-документі з **`kind: Deployment`** у кожного контейнера
10
15
  * **`spec.template.spec.containers[]`** має бути **`resources.requests.cpu`** і **`resources.requests.memory`**
11
16
  * (непорожні скаляри). У шарі **`…/k8s/…/base/…`** значення жорстко **`cpu: '0.02'`**, **`memory: '128Mi'`**
@@ -3593,8 +3598,13 @@ function checkK8sYamlFileWithSchemaModeline(abs, rel, baseLower, lines, fail, pa
3593
3598
  // topologySpread, HCP, svc/svc-hl) — делегована rego, виконано у `runAllK8sRego` вище.
3594
3599
 
3595
3600
  if (schemaUrl.startsWith('file:')) {
3596
- pass(`${rel}: локальна схема (file:) — перевірка URL за apiVersion/kind пропущена`)
3597
- } else if (HTTPS_SCHEMA_RE.test(schemaUrl)) {
3601
+ fail(
3602
+ `${rel}: $schema=file:… заборонено (фальшива валідація без публічної схеми). ` +
3603
+ `Якщо публічної схеми для цього apiVersion/kind немає — прибери modeline зовсім (k8s.mdc)`
3604
+ )
3605
+ return
3606
+ }
3607
+ if (HTTPS_SCHEMA_RE.test(schemaUrl)) {
3598
3608
  const doc = firstYamlDocument(body)
3599
3609
  const { expected, reason } = expectedSchemaUrl(abs, doc)
3600
3610
 
@@ -3610,7 +3620,9 @@ function checkK8sYamlFileWithSchemaModeline(abs, rel, baseLower, lines, fail, pa
3610
3620
 
3611
3621
  pass(`${rel}: $schema узгоджено (${reason})`)
3612
3622
  } else {
3613
- fail(`${rel}: $schema має бути https URL або file: (див. k8s.mdc)`)
3623
+ fail(
3624
+ `${rel}: $schema має бути https URL (file: і інші схеми заборонені — якщо публічної схеми немає, прибери modeline; k8s.mdc)`
3625
+ )
3614
3626
  }
3615
3627
  }
3616
3628
 
@@ -3641,12 +3653,7 @@ async function checkK8sYamlFile(abs, root, fail, pass) {
3641
3653
  }
3642
3654
 
3643
3655
  const lines = toLines(raw)
3644
- if (lines.length === 0 || lines[0].trim() === '') {
3645
- fail(`${rel}: перший рядок порожній — потрібен # yaml-language-server: $schema=…`)
3646
- return
3647
- }
3648
-
3649
- const firstLineIsModeline = MODELINE_RE.test(lines[0])
3656
+ const firstLineIsModeline = lines.length > 0 && MODELINE_RE.test(lines[0])
3650
3657
  const bodyForFirstDoc = k8sYamlBodyForDocumentParse(lines)
3651
3658
  const isAlbHttpBackendGroup = k8sYamlFirstDocIsAlbYcHttpBackendGroup(bodyForFirstDoc)
3652
3659
 
@@ -3668,7 +3675,16 @@ async function checkK8sYamlFile(abs, root, fail, pass) {
3668
3675
  }
3669
3676
 
3670
3677
  if (!firstLineIsModeline) {
3671
- fail(`${rel}: перший рядок має бути коментарем # yaml-language-server: $schema=<url> (без префіксів перед #)`)
3678
+ // Modeline опційний: дозволено, якщо публічної схеми для apiVersion/kind немає (k8s.mdc).
3679
+ // Але `# yaml-language-server: $schema=…` дозволено **лише** у першому рядку — якщо він
3680
+ // зустрічається нижче, це порушення (yaml-language-server чекає на нього у заголовку файлу).
3681
+ if (countSchemaModelines(lines) > 0) {
3682
+ fail(
3683
+ `${rel}: рядок # yaml-language-server: $schema=… має бути першим у файлі (без префіксів перед #; k8s.mdc)`
3684
+ )
3685
+ return
3686
+ }
3687
+ pass(`${rel}: без modeline — перевірка $schema пропущена (немає публічної схеми; k8s.mdc)`)
3672
3688
  return
3673
3689
  }
3674
3690