@nitra/cursor 1.8.161 → 1.8.164
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 +20 -0
- package/mdc/abie.mdc +14 -2
- package/mdc/js-lint.mdc +1 -1
- package/mdc/text.mdc +2 -2
- package/package.json +4 -1
- package/scripts/check-abie.mjs +91 -3
- package/scripts/check-js-lint.mjs +29 -0
- package/scripts/check-text.mjs +3 -3
- package/scripts/utils/oxlint-canonical-skeleton.json +1 -1
- package/scripts/utils/oxlint-canonical.json +16 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,26 @@
|
|
|
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.164] - 2026-05-01
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `abie.mdc` (v1.16) / `check-abie.mjs`: нова перевірка `.github/actionlint.yaml`. Якщо файл відсутній — `npx @nitra/cursor check abie` створює його з канонічним вмістом (`self-hosted-runner.labels: ['ua', 'dev', 'ru']`); якщо є — звіряє, що в `self-hosted-runner.labels` присутні мітки `ua`, `dev`, `ru` (порядок, інші мітки й формат лапок дозволені). Експортовано `ABIE_REQUIRED_ACTIONLINT_LABELS`, `parseActionlintSelfHostedLabels`, `abieMissingActionlintLabels`.
|
|
12
|
+
|
|
13
|
+
## [1.8.163] - 2026-05-01
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- `check-js-lint.mjs`: `ignorePatterns` у `.oxlintrc.json` тепер звіряється як `rules` — канонічні патерни мають бути присутні, додаткові локальні glob-и дозволені (раніше була строга рівність — будь-який зайвий запис зламував перевірку).
|
|
18
|
+
- `check-text.mjs`: `OXFMT_REQUIRED_IGNORE_PATTERNS` доповнено `**/auto-imports.d.ts` (узгоджено з каноном oxlint); перевірка `.oxfmtrc.json` уже працює як subset, тому локальні розширення не падають.
|
|
19
|
+
- `js-lint.mdc` / `n-js-lint.mdc`, `text.mdc` / `n-text.mdc`: документовано, що канон задає мінімум `ignorePatterns`, локальне розширення дозволене.
|
|
20
|
+
|
|
21
|
+
## [1.8.162] - 2026-05-01
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- `oxlint-canonical-skeleton.json` (та перебудований `oxlint-canonical.json`): `ignorePatterns` тепер містить `["**/schema.graphql", "**/auto-imports.d.ts"]` (узгоджено з `.oxfmtrc.json`). Споживачі мають синхронізувати корінь `.oxlintrc.json` із каноном — `check-js-lint` падатиме, поки масив не збігається.
|
|
26
|
+
|
|
7
27
|
## [1.8.161] - 2026-05-01
|
|
8
28
|
|
|
9
29
|
### Added
|
package/mdc/abie.mdc
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Правила для проєктів AbInBev Efes
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: '1.
|
|
4
|
+
version: '1.16'
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Правило **abie** для споживачів **@nitra/cursor**: **k8s** (Deployment + **HealthCheckPolicy** у **`hc.yaml`**, overlay **ua** / **ru** — **nodeSelector**, **HTTPRoute** (будь-який непорожній **`target.name`**, для спільних сервісів **`auth-run-hl`** / **`file-link-hl`** — **`namespace: dev`** у base та patch **`…/backendRefs/…/namespace`** у **ua** / **ru**), у overlay **ru** — кожен **Service** (у т. ч. **headless** / **`-hl`**) → **`spec.type: NodePort`** через **JSON6902** у **`kustomization.yaml`**, видалення **HealthCheckPolicy** у **ru**), гілки **dev**, **ua**, **ru** у **clean-merged-branch**, а також заборона тримати артефакти **Firebase Hosting** у **підкаталогах першого рівня** (безпосередні діти кореня репозиторію; у самому корені ці імена не вимагаються до видалення).
|
|
7
|
+
Правило **abie** для споживачів **@nitra/cursor**: **k8s** (Deployment + **HealthCheckPolicy** у **`hc.yaml`**, overlay **ua** / **ru** — **nodeSelector**, **HTTPRoute** (будь-який непорожній **`target.name`**, для спільних сервісів **`auth-run-hl`** / **`file-link-hl`** — **`namespace: dev`** у base та patch **`…/backendRefs/…/namespace`** у **ua** / **ru**), у overlay **ru** — кожен **Service** (у т. ч. **headless** / **`-hl`**) → **`spec.type: NodePort`** через **JSON6902** у **`kustomization.yaml`**, видалення **HealthCheckPolicy** у **ru**), гілки **dev**, **ua**, **ru** у **clean-merged-branch**, **`.github/actionlint.yaml`** із мітками **`self-hosted-runner`** **ua** / **dev** / **ru** (створюється автоматично за відсутності), а також заборона тримати артефакти **Firebase Hosting** у **підкаталогах першого рівня** (безпосередні діти кореня репозиторію; у самому корені ці імена не вимагаються до видалення).
|
|
8
8
|
|
|
9
9
|
**`npx @nitra/cursor check abie`** виконується лише якщо в **`.n-cursor.json`** у **`rules`** є **`abie`** — інакше вихід **0** без зауважень.
|
|
10
10
|
|
|
@@ -336,6 +336,18 @@ spec:
|
|
|
336
336
|
|
|
337
337
|
У **кожному** підкаталозі, що лежить **безпосередньо** в корені репозиторію, не тримати конфіг і кеш **Firebase Hosting**: у таких каталогах не повинно бути **`.firebaserc`**, **`firebase.json`** та каталогу **`.firebase/`** (у **самому** корені репозиторію ці імена перевіркою abie **не** розглядаються; `node_modules` / `.git` зі скану вилучаються).
|
|
338
338
|
|
|
339
|
+
## actionlint: self-hosted-runner labels
|
|
340
|
+
|
|
341
|
+
У **`.github/actionlint.yaml`** має бути блок **`self-hosted-runner.labels`** з присутніми мітками **`ua`**, **`dev`**, **`ru`**. Якщо файлу немає — **`npx @nitra/cursor check abie`** створює його з канонічним вмістом. Інші мітки, інший порядок та формат лапок дозволені — перевіряється лише наявність трьох обов'язкових міток (деталі — **`check-abie.mjs`**).
|
|
342
|
+
|
|
343
|
+
```yaml title=".github/actionlint.yaml"
|
|
344
|
+
self-hosted-runner:
|
|
345
|
+
labels:
|
|
346
|
+
- 'ua'
|
|
347
|
+
- 'dev'
|
|
348
|
+
- 'ru'
|
|
349
|
+
```
|
|
350
|
+
|
|
339
351
|
## Git branches
|
|
340
352
|
|
|
341
353
|
У **`.github/workflows/clean-merged-branch.yml`** у кроці **`phpdocker-io/github-actions-delete-abandoned-branches`** значення **`with.ignore_branches`** має містити **dev**, **ua** та **ru** (разом з іншими гілками, якщо потрібно):
|
package/mdc/js-lint.mdc
CHANGED
|
@@ -30,7 +30,7 @@ version: '1.16'
|
|
|
30
30
|
}
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
У корені має бути **`.oxlintrc.json`**, який **збігається з каноном** oxlint з пакета **`@nitra/cursor`**: файл **`npm/scripts/utils/oxlint-canonical.json`** (plugins, jsPlugins з **`@e18e/eslint-plugin`**, categories, повний набір **rules** із канону — додаткові записи в **`rules`** дозволені; також **`settings`**, **`env`**, **`globals
|
|
33
|
+
У корені має бути **`.oxlintrc.json`**, який **збігається з каноном** oxlint з пакета **`@nitra/cursor`**: файл **`npm/scripts/utils/oxlint-canonical.json`** (plugins, jsPlugins з **`@e18e/eslint-plugin`**, categories, повний набір **rules** із канону — додаткові записи в **`rules`** дозволені; також **`settings`**, **`env`**, **`globals`**). Поле **`ignorePatterns`** працює як **`rules`**: канонічні патерни з **`oxlint-canonical.json`** (наразі **`**/schema.graphql`**, **`**/auto-imports.d.ts`**) мають бути присутні, додаткові локальні glob-и дозволені. Оновити канон можна з репозиторію пакета або скопіювавши файл після **`bun ./scripts/utils/rebuild-oxlint-canonical.mjs`** (джерело правил — **`oxlint-rules.tsv`** + скелет **`oxlint-canonical-skeleton.json`**). Модуль **`@e18e/eslint-plugin`** не оголошуй окремо в **`package.json`** — він уже в залежностях **`@nitra/eslint-config`** (з **3.8.0**), oxlint підвантажує його з **`node_modules`**.
|
|
34
34
|
|
|
35
35
|
Мінімум для розуміння структури (реальний корінь конфігу має збігатися з каноном повністю):
|
|
36
36
|
|
package/mdc/text.mdc
CHANGED
|
@@ -82,7 +82,7 @@ version: '1.25'
|
|
|
82
82
|
|
|
83
83
|
```json title=".oxfmtrc.json"
|
|
84
84
|
{
|
|
85
|
-
"ignorePatterns": ["**/hasura/metadata/**", "**/schema.graphql"],
|
|
85
|
+
"ignorePatterns": ["**/hasura/metadata/**", "**/schema.graphql", "**/auto-imports.d.ts"],
|
|
86
86
|
"arrowParens": "avoid",
|
|
87
87
|
"printWidth": 120,
|
|
88
88
|
"bracketSpacing": true,
|
|
@@ -104,7 +104,7 @@ version: '1.25'
|
|
|
104
104
|
}
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
Поле **`ignorePatterns`** обовʼязкове: у масиві мають бути **`**/hasura/metadata
|
|
107
|
+
Поле **`ignorePatterns`** обовʼязкове: у масиві мають бути **`**/hasura/metadata/**`**, **`**/schema.graphql`** і **`**/auto-imports.d.ts`**; інші glob-и додавай за потреби (згенеровані каталоги тощо) — канон задає мінімум, локальні розширення дозволені.
|
|
108
108
|
|
|
109
109
|
Також потрібно прибрати, якщо є в проєкті, модуль **`@nitra/prettier-config`**, **prettier** та всі виклики prettier і налаштування для нього.
|
|
110
110
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nitra/cursor",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.164",
|
|
4
4
|
"description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -47,5 +47,8 @@
|
|
|
47
47
|
"engines": {
|
|
48
48
|
"bun": ">=1.3",
|
|
49
49
|
"node": ">=25"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@nitra/cursor": "^1.8.164"
|
|
50
53
|
}
|
|
51
54
|
}
|
package/scripts/check-abie.mjs
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* у файлі **`k8s/ru/kustomization.yaml`** того ж пакета (overlay середовища **ru**) — inline **JSON6902** на **`kind: Service`** з тим самим **`target.name`**: **`path: /spec/type`**, **`value: NodePort`**; якщо в base було **`spec.clusterIP: None`** — **`op: remove`** для **`/spec/clusterIP`**; якщо в base **явно** задано **`spec.clusterIPs`** — також **`remove`** для **`/spec/clusterIPs`** (інакше **API** може залишити **`None`** для **NodePort**; без ключа **`clusterIPs`** у base **`remove`** на **`/spec/clusterIPs`** ламає **`kubectl kustomize`**).
|
|
40
40
|
*/
|
|
41
41
|
import { existsSync } from 'node:fs'
|
|
42
|
-
import { readdir, readFile } from 'node:fs/promises'
|
|
42
|
+
import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises'
|
|
43
43
|
import { dirname, join, relative } from 'node:path'
|
|
44
44
|
|
|
45
45
|
import { parseAllDocuments } from 'yaml'
|
|
@@ -118,6 +118,20 @@ const HTTPROUTE_BACKENDREF_PORT_8081_VALUE_FIRST_RE =
|
|
|
118
118
|
/** Гілки, які мають бути в **`ignore_branches`** за abie.mdc. */
|
|
119
119
|
export const ABIE_REQUIRED_IGNORE_BRANCHES = ['dev', 'ua', 'ru']
|
|
120
120
|
|
|
121
|
+
/** Канонічний шлях до конфігу actionlint у репо (abie.mdc). */
|
|
122
|
+
const ABIE_ACTIONLINT_PATH = '.github/actionlint.yaml'
|
|
123
|
+
|
|
124
|
+
/** Канонічний вміст **`.github/actionlint.yaml`**, який ми створюємо за відсутності файлу (abie.mdc). */
|
|
125
|
+
const ABIE_ACTIONLINT_TEMPLATE = `self-hosted-runner:
|
|
126
|
+
labels:
|
|
127
|
+
- 'ua'
|
|
128
|
+
- 'dev'
|
|
129
|
+
- 'ru'
|
|
130
|
+
`
|
|
131
|
+
|
|
132
|
+
/** Мітки **`self-hosted-runner.labels`**, які мають бути присутні в **`.github/actionlint.yaml`** (abie.mdc). */
|
|
133
|
+
export const ABIE_REQUIRED_ACTIONLINT_LABELS = Object.freeze(['ua', 'dev', 'ru'])
|
|
134
|
+
|
|
121
135
|
/**
|
|
122
136
|
* Чи відносний шлях вказує на **`ru/kustomization.yaml`** (сегмент **`ru`** перед ім'ям файлу) — специфіка abie overlay.
|
|
123
137
|
* @param {string} rel шлях від кореня репозиторію
|
|
@@ -1717,9 +1731,82 @@ async function ensureNoFirebaseHostingArtifacts(root, passFn, failFn) {
|
|
|
1717
1731
|
}
|
|
1718
1732
|
|
|
1719
1733
|
/**
|
|
1720
|
-
*
|
|
1721
|
-
* @
|
|
1734
|
+
* Витягує мітки **`self-hosted-runner.labels`** з тексту `.github/actionlint.yaml`.
|
|
1735
|
+
* @param {string} raw повний вміст файлу (YAML)
|
|
1736
|
+
* @returns {string[] | null} масив рядків-міток або null, якщо ключа/масиву не знайдено
|
|
1737
|
+
*/
|
|
1738
|
+
export function parseActionlintSelfHostedLabels(raw) {
|
|
1739
|
+
let docs
|
|
1740
|
+
try {
|
|
1741
|
+
docs = parseAllDocuments(raw)
|
|
1742
|
+
} catch {
|
|
1743
|
+
return null
|
|
1744
|
+
}
|
|
1745
|
+
for (const doc of docs) {
|
|
1746
|
+
if (doc.errors.length > 0) continue
|
|
1747
|
+
const root = doc.toJSON()
|
|
1748
|
+
if (root === null || typeof root !== 'object' || Array.isArray(root)) continue
|
|
1749
|
+
const block = /** @type {Record<string, unknown>} */ (root)['self-hosted-runner']
|
|
1750
|
+
if (block === null || typeof block !== 'object' || Array.isArray(block)) continue
|
|
1751
|
+
const labels = /** @type {Record<string, unknown>} */ (block).labels
|
|
1752
|
+
if (!Array.isArray(labels)) continue
|
|
1753
|
+
return labels.filter(l => typeof l === 'string')
|
|
1754
|
+
}
|
|
1755
|
+
return null
|
|
1756
|
+
}
|
|
1757
|
+
|
|
1758
|
+
/**
|
|
1759
|
+
* Які з **`ABIE_REQUIRED_ACTIONLINT_LABELS`** відсутні в наданому списку міток (abie.mdc).
|
|
1760
|
+
* @param {string[]} labels мітки **`self-hosted-runner.labels`**
|
|
1761
|
+
* @returns {string[]} відсутні мітки (порожньо — все ок)
|
|
1722
1762
|
*/
|
|
1763
|
+
export function abieMissingActionlintLabels(labels) {
|
|
1764
|
+
const present = new Set(labels.map(l => l.trim()))
|
|
1765
|
+
return ABIE_REQUIRED_ACTIONLINT_LABELS.filter(r => !present.has(r))
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1768
|
+
/**
|
|
1769
|
+
* Гарантує наявність **`.github/actionlint.yaml`** із потрібними мітками **`self-hosted-runner`** (abie.mdc):
|
|
1770
|
+
* створює файл із канонічним вмістом, якщо його немає; якщо є — звіряє мітки.
|
|
1771
|
+
* @param {string} root корінь репозиторію
|
|
1772
|
+
* @param {(msg: string) => void} pass callback при успішній перевірці
|
|
1773
|
+
* @param {(msg: string) => void} fail callback при помилці
|
|
1774
|
+
*/
|
|
1775
|
+
async function ensureAbieActionlintConfig(root, pass, fail) {
|
|
1776
|
+
const abs = join(root, ABIE_ACTIONLINT_PATH)
|
|
1777
|
+
if (!existsSync(abs)) {
|
|
1778
|
+
try {
|
|
1779
|
+
await mkdir(dirname(abs), { recursive: true })
|
|
1780
|
+
await writeFile(abs, ABIE_ACTIONLINT_TEMPLATE, 'utf8')
|
|
1781
|
+
} catch (error) {
|
|
1782
|
+
const msg = error instanceof Error ? error.message : String(error)
|
|
1783
|
+
fail(`${ABIE_ACTIONLINT_PATH}: не вдалося створити (${msg}) — abie.mdc`)
|
|
1784
|
+
return
|
|
1785
|
+
}
|
|
1786
|
+
pass(`${ABIE_ACTIONLINT_PATH}: створено з self-hosted-runner.labels [ua, dev, ru] (abie.mdc)`)
|
|
1787
|
+
return
|
|
1788
|
+
}
|
|
1789
|
+
let raw
|
|
1790
|
+
try {
|
|
1791
|
+
raw = await readFile(abs, 'utf8')
|
|
1792
|
+
} catch (error) {
|
|
1793
|
+
const msg = error instanceof Error ? error.message : String(error)
|
|
1794
|
+
fail(`${ABIE_ACTIONLINT_PATH}: не вдалося прочитати (${msg}) — abie.mdc`)
|
|
1795
|
+
return
|
|
1796
|
+
}
|
|
1797
|
+
const labels = parseActionlintSelfHostedLabels(raw)
|
|
1798
|
+
if (labels === null) {
|
|
1799
|
+
fail(`${ABIE_ACTIONLINT_PATH}: не знайдено self-hosted-runner.labels — додай мітки ua, dev, ru (abie.mdc)`)
|
|
1800
|
+
return
|
|
1801
|
+
}
|
|
1802
|
+
const missing = abieMissingActionlintLabels(labels)
|
|
1803
|
+
if (missing.length > 0) {
|
|
1804
|
+
fail(`${ABIE_ACTIONLINT_PATH}: у self-hosted-runner.labels бракує ${missing.join(', ')} (abie.mdc)`)
|
|
1805
|
+
return
|
|
1806
|
+
}
|
|
1807
|
+
pass(`${ABIE_ACTIONLINT_PATH}: self-hosted-runner.labels містить ua, dev, ru (abie.mdc)`)
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1723
1810
|
/**
|
|
1724
1811
|
* Перевіряє clean-merged-branch.yml на ignore_branches.
|
|
1725
1812
|
* @param {string} root корінь репозиторію
|
|
@@ -2091,6 +2178,7 @@ export async function check() {
|
|
|
2091
2178
|
pass('Правило abie увімкнено — виконуємо перевірки')
|
|
2092
2179
|
await ensureNoFirebaseHostingArtifacts(root, pass, fail)
|
|
2093
2180
|
await checkCleanMergedBranch(root, pass, fail)
|
|
2181
|
+
await ensureAbieActionlintConfig(root, pass, fail)
|
|
2094
2182
|
|
|
2095
2183
|
const yamlFiles = await findK8sYamlFiles(root)
|
|
2096
2184
|
const deploymentDirs = await collectDeploymentDirs(root, yamlFiles, fail)
|
|
@@ -133,6 +133,30 @@ function compareOxlintRules(expected, actual, failures) {
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Звіряє блок `ignorePatterns`: кожен патерн із канону має бути присутній в actual; додаткові локальні
|
|
138
|
+
* патерни дозволені (канон задає мінімум, проєкт може розширити).
|
|
139
|
+
* @param {unknown} expected канонічний масив `ignorePatterns`
|
|
140
|
+
* @param {unknown} actual поточний `ignorePatterns` із `.oxlintrc.json`
|
|
141
|
+
* @param {string[]} failures буфер для помилок
|
|
142
|
+
*/
|
|
143
|
+
function compareOxlintIgnorePatterns(expected, actual, failures) {
|
|
144
|
+
if (!Array.isArray(expected)) {
|
|
145
|
+
return
|
|
146
|
+
}
|
|
147
|
+
if (!Array.isArray(actual)) {
|
|
148
|
+
failures.push('.oxlintrc.json: поле "ignorePatterns" має бути масивом (канон задає мінімум, додаткові патерни дозволені)')
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
const set = new Set(actual)
|
|
152
|
+
const missing = expected.filter(p => !set.has(p))
|
|
153
|
+
if (missing.length > 0) {
|
|
154
|
+
failures.push(
|
|
155
|
+
`.oxlintrc.json: ignorePatterns має містити канонічні патерни — додай: ${missing.map(p => JSON.stringify(p)).join(', ')}`
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
136
160
|
/**
|
|
137
161
|
* Перевіряє `.oxlintrc.json` проти канону пакета `@nitra/cursor` (усі правила з канону та інші поля з `oxlint-canonical.json`).
|
|
138
162
|
* Додаткові ключі лише в `rules` дозволені; інші поля мають збігатися з каноном.
|
|
@@ -160,6 +184,11 @@ export function verifyOxlintRcAgainstCanonical(cfg, canonical) {
|
|
|
160
184
|
continue
|
|
161
185
|
}
|
|
162
186
|
|
|
187
|
+
if (key === 'ignorePatterns') {
|
|
188
|
+
compareOxlintIgnorePatterns(expected, actual, failures)
|
|
189
|
+
continue
|
|
190
|
+
}
|
|
191
|
+
|
|
163
192
|
if (!deepEqualOxlintCanonical(actual, expected)) {
|
|
164
193
|
failures.push(
|
|
165
194
|
`.oxlintrc.json: поле "${key}" має збігатися з каноном пакета @nitra/cursor (npm/scripts/utils/oxlint-canonical.json)`
|
package/scripts/check-text.mjs
CHANGED
|
@@ -29,8 +29,8 @@ const SEMVER_RE = /^(\d+)\.(\d+)\.(\d+)/
|
|
|
29
29
|
/** Заголовок абзацу про апостроф у text.mdc / n-text.mdc. */
|
|
30
30
|
const UK_APOSTROPHE_HEADING = '**Український апостроф:**'
|
|
31
31
|
|
|
32
|
-
/** Мінімальні glob-и в `ignorePatterns` у `.oxfmtrc.json` (text.mdc)
|
|
33
|
-
const OXFMT_REQUIRED_IGNORE_PATTERNS = ['**/hasura/metadata/**', '**/schema.graphql']
|
|
32
|
+
/** Мінімальні glob-и в `ignorePatterns` у `.oxfmtrc.json` (text.mdc) — додаткові патерни локально дозволені. */
|
|
33
|
+
const OXFMT_REQUIRED_IGNORE_PATTERNS = ['**/hasura/metadata/**', '**/schema.graphql', '**/auto-imports.d.ts']
|
|
34
34
|
|
|
35
35
|
/** Канонічні записи `ignorePaths` у `.cspell.json` (text.mdc) — кожен має бути присутнім. */
|
|
36
36
|
const CSPELL_REQUIRED_IGNORE_PATHS = [
|
|
@@ -211,7 +211,7 @@ async function checkOxfmtRc(passFn, failFn) {
|
|
|
211
211
|
const set = new Set(cfg.ignorePatterns)
|
|
212
212
|
const missingPatterns = OXFMT_REQUIRED_IGNORE_PATTERNS.filter(p => !set.has(p))
|
|
213
213
|
if (missingPatterns.length === 0) {
|
|
214
|
-
passFn('.oxfmtrc.json: ignorePatterns містить hasura/metadata
|
|
214
|
+
passFn('.oxfmtrc.json: ignorePatterns містить hasura/metadata, schema.graphql і auto-imports.d.ts')
|
|
215
215
|
} else {
|
|
216
216
|
failFn(
|
|
217
217
|
`.oxfmtrc.json ignorePatterns: додай відсутні елементи: ${missingPatterns.join(', ')} (канонічний приклад у text.mdc)`
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
3
|
-
"plugins": [
|
|
4
|
-
|
|
3
|
+
"plugins": [
|
|
4
|
+
"unicorn",
|
|
5
|
+
"oxc",
|
|
6
|
+
"import",
|
|
7
|
+
"jsdoc",
|
|
8
|
+
"promise",
|
|
9
|
+
"node",
|
|
10
|
+
"vue"
|
|
11
|
+
],
|
|
12
|
+
"jsPlugins": [
|
|
13
|
+
"@e18e/eslint-plugin"
|
|
14
|
+
],
|
|
5
15
|
"categories": {},
|
|
6
16
|
"rules": {
|
|
7
17
|
"e18e/prefer-includes": "error",
|
|
@@ -383,5 +393,8 @@
|
|
|
383
393
|
"builtin": true
|
|
384
394
|
},
|
|
385
395
|
"globals": {},
|
|
386
|
-
"ignorePatterns": [
|
|
396
|
+
"ignorePatterns": [
|
|
397
|
+
"**/schema.graphql",
|
|
398
|
+
"**/auto-imports.d.ts"
|
|
399
|
+
]
|
|
387
400
|
}
|