@nitra/cursor 1.8.105 → 1.8.108

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/bin/auto-rules.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Правила, які автоматично додається до .n-cursor.json
6
6
 
7
- abie - якщо в кореневому package.json в секції "repository" присутній текст "https://github.com/abinbevefes/**/"
7
+ abie - якщо в кореневому package.json в секції "repository" присутній текст "<https://github.com/abinbevefes/**/>"
8
8
 
9
9
  bun - якщо в корені проекту є package.json
10
10
 
@@ -32,7 +32,7 @@ vue - якщо присутній хоч один vue файл
32
32
 
33
33
  ## Скіли, які автоматично додається до .n-cursor.json
34
34
 
35
- abie-kustomize - якщо в кореневому package.json в секції "repository" присутній текст "https://github.com/abinbevefes/**/"
35
+ abie-kustomize - якщо в кореневому package.json в секції "repository" присутній текст "<https://github.com/abinbevefes/**/>"
36
36
 
37
37
  fix - завжди
38
38
 
package/bin/n-cursor.js CHANGED
@@ -75,12 +75,7 @@ const NEWLINE_RE = /\r?\n/
75
75
  const LEADING_SPACES_RE = /^\s+/
76
76
 
77
77
  /** Ключі `.n-cursor.json`, де значення — масиви id; після запуску CLI сортуються за алфавітом */
78
- const CONFIG_SORTED_ARRAY_KEYS = /** @type {const} */ ([
79
- 'rules',
80
- 'skills',
81
- 'disable-rules',
82
- 'disable-skills'
83
- ])
78
+ const CONFIG_SORTED_ARRAY_KEYS = /** @type {const} */ (['rules', 'skills', 'disable-rules', 'disable-skills'])
84
79
 
85
80
  /**
86
81
  * Сортує масиви id у конфігу за алфавітом (`localeCompare`), щоб порядок у файлі був стабільним після синку.
@@ -90,14 +85,10 @@ const CONFIG_SORTED_ARRAY_KEYS = /** @type {const} */ ([
90
85
  function sortConfigIdArrays(config) {
91
86
  const out = { ...config }
92
87
  for (const key of CONFIG_SORTED_ARRAY_KEYS) {
93
- if (!(key in out)) {
94
- continue
95
- }
96
88
  const v = out[key]
97
- if (!Array.isArray(v)) {
98
- continue
89
+ if (key in out && Array.isArray(v)) {
90
+ out[key] = v.map(String).toSorted((a, b) => a.localeCompare(b))
99
91
  }
100
- out[key] = v.map(x => String(x)).toSorted((a, b) => a.localeCompare(b))
101
92
  }
102
93
  return out
103
94
  }
@@ -970,9 +961,8 @@ async function runSync() {
970
961
  console.log(`\n🔧 ${PACKAGE_NAME} — завантаження cursor-правил\n`)
971
962
 
972
963
  const projectRoot = cwd()
973
- const effectivePackageRoot = await runSyncStep(
974
- `❌ Не вдалося оновити ${PACKAGE_NAME} або виконати bun i: `,
975
- () => upgradeNitraCursorToLatestAndBunInstall(projectRoot, BUNDLED_PACKAGE_ROOT)
964
+ const effectivePackageRoot = await runSyncStep(`❌ Не вдалося оновити ${PACKAGE_NAME} або виконати bun i: `, () =>
965
+ upgradeNitraCursorToLatestAndBunInstall(projectRoot, BUNDLED_PACKAGE_ROOT)
976
966
  )
977
967
 
978
968
  const bundledMdcDir = join(effectivePackageRoot, 'mdc')
package/mdc/js-pino.mdc CHANGED
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  description: Використання @nitra/pino
3
3
  alwaysApply: true
4
- version: '1.0'
4
+ version: '1.1'
5
5
  ---
6
6
 
7
7
  Проект використовує @nitra/pino для логування.
8
- Якщо в проекті присутній @nitra/bunyan, то він повинен бути замінений на @nitra/pino.
8
+ Якщо в проекті присутній @nitra/bunyan, то він повинен бути замінений на @nitra/pino — як у `package.json`, так і в коді: усі `import` / `require` / динамічні `import()` з `@nitra/bunyan` (і застарілого `bunyan`) треба замінити на `@nitra/pino` і за потреби адаптувати виклики під його API.
9
9
 
10
10
  В **/k8s/base/configmap.yaml повинен бути заданий OTEL_RESOURCE_ATTRIBUTES: 'service.name=<project_name>,service.namespace=<project_namespace>'
11
11
  а в директоріях з kustomize повинні бути перевизначені значення OTEL_RESOURCE_ATTRIBUTES і в них service.namespace повинен відповідати namespace, в якому знаходиться дана директорія.
package/mdc/k8s.mdc CHANGED
@@ -110,7 +110,16 @@ resources: {}
110
110
 
111
111
  ### HTTPRoute для Deployment з `hasura/graphql-engine`
112
112
 
113
- Якщо для такого **Deployment** описано **`HTTPRoute`**, **`spec.rules`** мають відповідати канону нижче: редірект **`/ql`** та **`/ql/`** на **`/ql/console`** (**`302`**), правило з **`PathPrefix` `/ql`**, **`URLRewrite`** префікса на **`/`**, окреме правило для **WebSocket** (**`Upgrade: websocket`**) з **`RequestHeaderModifier`** (прибрати **`Authorization`** авторизація для WebSocket іде всередині messages), далі **`PathPrefix` `/`** на той самий backend.
113
+ **Прив'язка:** **check k8s** вважає **HTTPRoute** Hasura-маршрутом, якщо в **тому самому каталозі** є **`Deployment`** з образом **`hasura/graphql-engine`**, а його **`metadata.name`** збігається з **`metadata.name`** цього **`HTTPRoute`**. Саме за цією конвенцією скрипт шукає пари для звірки канону.
114
+
115
+ **Префікс параметризовано:** **`<prefix>`** — рядок перед **`/ql`** у першому Hasura-правилі (**`Exact <prefix>/ql`**). Може бути порожнім (**`<prefix>`** = **``**, шлях **`/ql`**) або непорожнім (наприклад **`<prefix>`** = **`/notify`**, шлях **`/notify/ql`**). Усі інші Hasura-правила цього **HTTPRoute** мають містити той самий **`<prefix>`**.
116
+
117
+ **Канон — 4 правила у цьому порядку** (додаткові правила поверх канону дозволені — вони просто ігноруються під час зіставлення):
118
+
119
+ 1. **`Exact <prefix>/ql`** → **`RequestRedirect`** **`ReplaceFullPath <prefix>/ql/console`** **`statusCode: 302`**.
120
+ 2. **`Exact <prefix>/ql/`** → те саме (редирект на **`<prefix>/ql/console`** 302).
121
+ 3. **`PathPrefix <prefix>/ql`** → **`URLRewrite`** **`ReplacePrefixMatch /`**, один **`backendRef`** на headless **Service** (**`-hl`**).
122
+ 4. **WebSocket:** **`PathPrefix <prefix>/ql`** + header **`Upgrade: websocket`** → **`URLRewrite`** **`ReplacePrefixMatch /`** + **`RequestHeaderModifier`** **`remove: [Authorization]`** (авторизація для WebSocket іде всередині messages). Той самий **`backendRef`**.
114
123
 
115
124
  **`parentRefs`**, **`hostnames`**, **`metadata.namespace`** / **`name`** підлаштуй під середовище. У **`backendRefs.name`** вказуй **headless** **Service** з суфіксом **`-hl`** (див. розділ **«Service: `svc.yaml` і `svc-hl.yaml`»**); у прикладі **`db-h-hl`** заміни на фактичне ім’я.
116
125
 
@@ -123,7 +132,9 @@ metadata:
123
132
  namespace: dev
124
133
  spec:
125
134
  parentRefs:
126
- - name: gw
135
+ - group: gateway.networking.k8s.io
136
+ kind: Gateway
137
+ name: gw
127
138
  namespace: dev
128
139
  sectionName: https
129
140
  hostnames:
@@ -164,16 +175,22 @@ spec:
164
175
  backendRefs:
165
176
  - name: db-h-hl
166
177
  port: 8080
167
- # У WebSocket авторизація йде всередині messages
178
+ # у websocket авторизація йде всередині messages
179
+ # Той самий URLRewrite, що й для HTTP: інакше бекенд бачить /ql/v1/graphql замість /v1/graphql
168
180
  - matches:
169
181
  - path:
170
182
  type: PathPrefix
171
- value: /
183
+ value: /ql
172
184
  headers:
173
185
  - type: Exact
174
186
  name: Upgrade
175
187
  value: websocket
176
188
  filters:
189
+ - type: URLRewrite
190
+ urlRewrite:
191
+ path:
192
+ type: ReplacePrefixMatch
193
+ replacePrefixMatch: /
177
194
  - type: RequestHeaderModifier
178
195
  requestHeaderModifier:
179
196
  remove:
@@ -181,13 +198,6 @@ spec:
181
198
  backendRefs:
182
199
  - name: db-h-hl
183
200
  port: 8080
184
- - matches:
185
- - path:
186
- type: PathPrefix
187
- value: /
188
- backendRefs:
189
- - name: db-h-hl
190
- port: 8080
191
201
  ```
192
202
 
193
203
  ## Service: заборонені анотації GKE
@@ -277,7 +287,7 @@ patches:
277
287
 
278
288
  **`npx @nitra/cursor check k8s`** — програмні критерії в **JSDoc на початку** **`npm/scripts/check-k8s.mjs`**. Якщо під **`k8s`** немає **`*.yaml`** — крок пропущено. Канон **`$schema`** для редактора — розділ **«Визначення схеми YAML`** нижче.
279
289
 
280
- **Не входить у check k8s:** наприклад повна структура **`HTTPRoute`** для **Hasura** (канон — у розділі про **`hasura/graphql-engine`**), **kubeconform** / **kubescape** — це **`bun run lint-k8s`**.
290
+ **Не входить у check k8s:** **kubeconform** / **kubescape** — це **`bun run lint-k8s`**.
281
291
 
282
292
  ## Коли застосовувати (агентам)
283
293
 
package/mdc/text.mdc CHANGED
@@ -120,7 +120,7 @@ version: '1.25'
120
120
  "lint-text": "npx cspell . && bunx markdownlint-cli2 --fix \"**/*.md\" \"**/*.mdc\" && bun ./npm/scripts/run-v8r.mjs"
121
121
  },
122
122
  "devDependencies": {
123
- "@nitra/cspell-dict": "^2.0.0"
123
+ "@nitra/cspell-dict": "^2.1.0"
124
124
  }
125
125
  }
126
126
  ```
@@ -235,7 +235,7 @@ jobs:
235
235
  "lint-text": "npx cspell . && bunx markdownlint-cli2 --fix \"**/*.md\" \"**/*.mdc\" && bun ./npm/scripts/run-v8r.mjs"
236
236
  },
237
237
  "devDependencies": {
238
- "@nitra/cspell-dict": "^2.0.0"
238
+ "@nitra/cspell-dict": "^2.1.0"
239
239
  }
240
240
  }
241
241
  ```
@@ -252,7 +252,7 @@ jobs:
252
252
  "lint-text": "npx cspell . && bunx markdownlint-cli2 --fix \"**/*.md\" \"**/*.mdc\" && bun ./npm/scripts/run-v8r.mjs"
253
253
  },
254
254
  "devDependencies": {
255
- "@nitra/cspell-dict": "^2.0.0"
255
+ "@nitra/cspell-dict": "^2.1.0"
256
256
  }
257
257
  }
258
258
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.8.105",
3
+ "version": "1.8.108",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",