@nitra/cursor 1.8.157 → 1.8.158
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 +7 -0
- package/mdc/hasura.mdc +2 -0
- package/package.json +2 -1
- package/scripts/check-hasura.mjs +17 -10
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
|
|
6
6
|
|
|
7
|
+
## [1.8.158] - 2026-05-01
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- `check-hasura.mjs`: файл `.env` без імені (локальний файл розробника) виключено з перевірки `HASURA_GRAPHQL_ENDPOINT` — скануються лише `*.env` із префіксом (`dev.env`, `production.env` тощо).
|
|
12
|
+
- `hasura.mdc`: явно зафіксовано виключення для `.env` без імені.
|
|
13
|
+
|
|
7
14
|
## [1.8.157] - 2026-04-30
|
|
8
15
|
|
|
9
16
|
### Added
|
package/mdc/hasura.mdc
CHANGED
|
@@ -24,6 +24,8 @@ HASURA_GRAPHQL_ENDPOINT=http://contract-h.ua-contract.svc.abie-ua.internal:8080
|
|
|
24
24
|
|
|
25
25
|
Правило застосовується для проєктів **nitra** (у кореневому `package.json` `"repository": "https://github.com/nitra/*"`) і **abie** (`"repository": "https://github.com/abinbevefes/*"`); для інших репозиторіїв перевірка пропускається.
|
|
26
26
|
|
|
27
|
+
Файл .env це (без імені) це виключення з цього правила, його змінювати не потрібно
|
|
28
|
+
|
|
27
29
|
## Перевірка
|
|
28
30
|
|
|
29
31
|
`npx @nitra/cursor check hasura`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nitra/cursor",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.158",
|
|
4
4
|
"description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"yaml": "^2.8.3"
|
|
45
45
|
},
|
|
46
46
|
"engines": {
|
|
47
|
+
"bun": ">=1.3",
|
|
47
48
|
"node": ">=25"
|
|
48
49
|
}
|
|
49
50
|
}
|
package/scripts/check-hasura.mjs
CHANGED
|
@@ -18,8 +18,9 @@
|
|
|
18
18
|
* звіряються конкретні `<service>` і `<namespace>` з ними.
|
|
19
19
|
*
|
|
20
20
|
* Скануються всі файли `*.env` (наприклад `dev.env`, `production.env`); файл
|
|
21
|
-
* `.env` без
|
|
22
|
-
* `.git`, `dist`, `coverage`,
|
|
21
|
+
* `.env` без імені — виключення з правила (локальний файл розробника), його
|
|
22
|
+
* не перевіряємо. Пропускаються `node_modules`, `.git`, `dist`, `coverage`,
|
|
23
|
+
* `.turbo`, `.next` (як у `walkDir`).
|
|
23
24
|
*/
|
|
24
25
|
import { existsSync } from 'node:fs'
|
|
25
26
|
import { readFile } from 'node:fs/promises'
|
|
@@ -40,6 +41,7 @@ const HASURA_NAMESPACE_FILE = `${HASURA_BASE_DIR}/namespace.yaml`
|
|
|
40
41
|
|
|
41
42
|
const ENV_FILE_RE = /\.env$/u
|
|
42
43
|
const HASURA_ENDPOINT_LINE_RE = /^[ \t]*(?:export[ \t]+)?HASURA_GRAPHQL_ENDPOINT[ \t]*=[ \t]*['"]?([^'"\r\n#]+)/mu
|
|
44
|
+
const INTERNAL_HASURA_URL_RE = /^http:\/\/([^./]+)\.([^./]+)\.svc\.([^./]+)\.internal:(\d+)\/?$/u
|
|
43
45
|
|
|
44
46
|
/**
|
|
45
47
|
* Розбір значення `HASURA_GRAPHQL_ENDPOINT` як внутрішнього кластерного URL.
|
|
@@ -47,11 +49,10 @@ const HASURA_ENDPOINT_LINE_RE = /^[ \t]*(?:export[ \t]+)?HASURA_GRAPHQL_ENDPOINT
|
|
|
47
49
|
* `<service>.<namespace>.svc.<cluster>.internal` та явного порту.
|
|
48
50
|
* @param {string} url значення з `.env` (без огорнутих лапок)
|
|
49
51
|
* @returns {{ ok: true, service: string, namespace: string, cluster: string, port: string } | { ok: false }}
|
|
50
|
-
*
|
|
52
|
+
* розібрані сегменти або `{ ok: false }`, якщо формат не відповідає внутрішньому кластерному URL
|
|
51
53
|
*/
|
|
52
54
|
export function parseInternalHasuraEndpoint(url) {
|
|
53
|
-
const
|
|
54
|
-
const m = trimmed.match(/^http:\/\/([^./]+)\.([^./]+)\.svc\.([^./]+)\.internal:(\d+)\/?$/u)
|
|
55
|
+
const m = url.trim().match(INTERNAL_HASURA_URL_RE)
|
|
55
56
|
if (!m) {
|
|
56
57
|
return { ok: false }
|
|
57
58
|
}
|
|
@@ -84,12 +85,17 @@ async function readYamlMetadataName(absPath, kind) {
|
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
/**
|
|
87
|
-
* Чи відносний шлях вказує на `*.env
|
|
88
|
+
* Чи відносний шлях вказує на `*.env`, який треба перевіряти hasura.mdc.
|
|
89
|
+
* Файл рівно `.env` (без імені) — виключення з правила (локальний файл
|
|
90
|
+
* розробника, hasura.mdc його не зачіпає), тому повертає false.
|
|
88
91
|
* @param {string} relPath posix-шлях відносно кореня
|
|
89
|
-
* @returns {boolean} true для
|
|
92
|
+
* @returns {boolean} true для `dev.env`, `nitra.env`; false для `.env`
|
|
90
93
|
*/
|
|
91
94
|
export function isEnvFile(relPath) {
|
|
92
|
-
|
|
95
|
+
if (!ENV_FILE_RE.test(relPath)) {
|
|
96
|
+
return false
|
|
97
|
+
}
|
|
98
|
+
return basename(relPath) !== '.env'
|
|
93
99
|
}
|
|
94
100
|
|
|
95
101
|
/**
|
|
@@ -127,9 +133,10 @@ async function checkEnvFile(relPath, expected, reporter) {
|
|
|
127
133
|
const value = m[1].trim()
|
|
128
134
|
const parsed = parseInternalHasuraEndpoint(value)
|
|
129
135
|
if (!parsed.ok) {
|
|
136
|
+
// eslint-disable-next-line @microsoft/sdl/no-insecure-url, sonarjs/no-clear-text-protocols -- hasura.mdc вимагає саме http:// для кластерного URL (TLS не використовується)
|
|
137
|
+
const example = 'http://<service>.<namespace>.svc.<cluster>.internal:<port>'
|
|
130
138
|
fail(
|
|
131
|
-
`${relPath}: HASURA_GRAPHQL_ENDPOINT="${value}" — потрібен внутрішній кластерний URL виду `
|
|
132
|
-
`https://<service>.<namespace>.svc.<cluster>.internal:<port> (hasura.mdc)`
|
|
139
|
+
`${relPath}: HASURA_GRAPHQL_ENDPOINT="${value}" — потрібен внутрішній кластерний URL виду ${example} (hasura.mdc)`
|
|
133
140
|
)
|
|
134
141
|
return
|
|
135
142
|
}
|