@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 +6 -0
- package/mdc/k8s.mdc +6 -4
- package/package.json +1 -1
- package/scripts/check-k8s.mjs +27 -11
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.
|
|
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
|
-
|
|
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** — не
|
|
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
package/scripts/check-k8s.mjs
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Перевіряє Kubernetes YAML у шляхах з сегментом `k8s` (див. k8s.mdc).
|
|
3
3
|
*
|
|
4
|
-
* Перший рядок `# yaml-language-server: $schema
|
|
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
|
-
|
|
3597
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|