@nitra/cursor 12.8.8 → 12.8.9
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
package/package.json
CHANGED
|
@@ -6,40 +6,40 @@ resource: npm/scripts/lib/
|
|
|
6
6
|
|
|
7
7
|
# npm/scripts/lib
|
|
8
8
|
|
|
9
|
-
| Файл
|
|
10
|
-
|
|
11
|
-
| [assert-project-root.mjs](assert-project-root.md)
|
|
12
|
-
| [changed-files.mjs](changed-files.md)
|
|
13
|
-
| [check-mdc-template-refs.mjs](check-mdc-template-refs.md)
|
|
14
|
-
| [check-reporter.mjs](check-reporter.md)
|
|
15
|
-
| [diff-added-lines.mjs](diff-added-lines.md)
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
|---|---|
|
|
11
|
+
| [assert-project-root.mjs](assert-project-root.md) | JS Module |
|
|
12
|
+
| [changed-files.mjs](changed-files.md) | JS Module |
|
|
13
|
+
| [check-mdc-template-refs.mjs](check-mdc-template-refs.md) | JS Module |
|
|
14
|
+
| [check-reporter.mjs](check-reporter.md) | JS Module |
|
|
15
|
+
| [diff-added-lines.mjs](diff-added-lines.md) | JS Module |
|
|
16
16
|
| [discover-check-rules-from-cursor.mjs](discover-check-rules-from-cursor.md) | JS Module |
|
|
17
|
-
| [discover-checkable-rules.mjs](discover-checkable-rules.md)
|
|
18
|
-
| [ensure-tool.mjs](ensure-tool.md)
|
|
19
|
-
| [generated-markdown.mjs](generated-markdown.md)
|
|
20
|
-
| [gha-workflow.mjs](gha-workflow.md)
|
|
21
|
-
| [inline-template-links.mjs](inline-template-links.md)
|
|
22
|
-
| [list-project-rules-mdc.mjs](list-project-rules-mdc.md)
|
|
23
|
-
| [list-rule-ids.mjs](list-rule-ids.md)
|
|
24
|
-
| [load-cursor-config.mjs](load-cursor-config.md)
|
|
25
|
-
| [mirror-parity.mjs](mirror-parity.md)
|
|
26
|
-
| [read-n-cursor-config-lite.mjs](read-n-cursor-config-lite.md)
|
|
27
|
-
| [resolve-target-files.mjs](resolve-target-files.md)
|
|
28
|
-
| [root-notice.mjs](root-notice.md)
|
|
29
|
-
| [rule-meta-helpers.mjs](rule-meta-helpers.md)
|
|
30
|
-
| [rule-meta.mjs](rule-meta.md)
|
|
31
|
-
| [rule-predicates.mjs](rule-predicates.md)
|
|
32
|
-
| [run-conftest-batch.mjs](run-conftest-batch.md)
|
|
33
|
-
| [run-lint-step.mjs](run-lint-step.md)
|
|
34
|
-
| [run-lint.mjs](run-lint.md)
|
|
35
|
-
| [run-rule-cli.mjs](run-rule-cli.md)
|
|
36
|
-
| [run-rule.mjs](run-rule.md)
|
|
37
|
-
| [run-standard-lint.mjs](run-standard-lint.md)
|
|
38
|
-
| [run-standard-rule.mjs](run-standard-rule.md)
|
|
39
|
-
| [skill-meta.mjs](skill-meta.md)
|
|
40
|
-
| [sync-gitignore-worktree.mjs](sync-gitignore-worktree.md)
|
|
41
|
-
| [template.mjs](template.md)
|
|
42
|
-
| [timing-summary.mjs](timing-summary.md)
|
|
43
|
-
| [workspaces.mjs](workspaces.md)
|
|
44
|
-
| [worktree-notice.mjs](worktree-notice.md)
|
|
45
|
-
| [worktree.mjs](worktree.md)
|
|
17
|
+
| [discover-checkable-rules.mjs](discover-checkable-rules.md) | JS Module |
|
|
18
|
+
| [ensure-tool.mjs](ensure-tool.md) | JS Module |
|
|
19
|
+
| [generated-markdown.mjs](generated-markdown.md) | JS Module |
|
|
20
|
+
| [gha-workflow.mjs](gha-workflow.md) | JS Module |
|
|
21
|
+
| [inline-template-links.mjs](inline-template-links.md) | JS Module |
|
|
22
|
+
| [list-project-rules-mdc.mjs](list-project-rules-mdc.md) | JS Module |
|
|
23
|
+
| [list-rule-ids.mjs](list-rule-ids.md) | JS Module |
|
|
24
|
+
| [load-cursor-config.mjs](load-cursor-config.md) | JS Module |
|
|
25
|
+
| [mirror-parity.mjs](mirror-parity.md) | JS Module |
|
|
26
|
+
| [read-n-cursor-config-lite.mjs](read-n-cursor-config-lite.md) | JS Module |
|
|
27
|
+
| [resolve-target-files.mjs](resolve-target-files.md) | JS Module |
|
|
28
|
+
| [root-notice.mjs](root-notice.md) | JS Module |
|
|
29
|
+
| [rule-meta-helpers.mjs](rule-meta-helpers.md) | JS Module |
|
|
30
|
+
| [rule-meta.mjs](rule-meta.md) | JS Module |
|
|
31
|
+
| [rule-predicates.mjs](rule-predicates.md) | JS Module |
|
|
32
|
+
| [run-conftest-batch.mjs](run-conftest-batch.md) | JS Module |
|
|
33
|
+
| [run-lint-step.mjs](run-lint-step.md) | JS Module |
|
|
34
|
+
| [run-lint.mjs](run-lint.md) | JS Module |
|
|
35
|
+
| [run-rule-cli.mjs](run-rule-cli.md) | JS Module |
|
|
36
|
+
| [run-rule.mjs](run-rule.md) | JS Module |
|
|
37
|
+
| [run-standard-lint.mjs](run-standard-lint.md) | JS Module |
|
|
38
|
+
| [run-standard-rule.mjs](run-standard-rule.md) | JS Module |
|
|
39
|
+
| [skill-meta.mjs](skill-meta.md) | JS Module |
|
|
40
|
+
| [sync-gitignore-worktree.mjs](sync-gitignore-worktree.md) | JS Module |
|
|
41
|
+
| [template.mjs](template.md) | JS Module |
|
|
42
|
+
| [timing-summary.mjs](timing-summary.md) | JS Module |
|
|
43
|
+
| [workspaces.mjs](workspaces.md) | JS Module |
|
|
44
|
+
| [worktree-notice.mjs](worktree-notice.md) | JS Module |
|
|
45
|
+
| [worktree.mjs](worktree.md) | JS Module |
|
|
@@ -3,29 +3,30 @@ type: JS Module
|
|
|
3
3
|
title: rule-meta.mjs
|
|
4
4
|
resource: npm/scripts/lib/rule-meta.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: dd8fe34a
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Парсер метаданих правил з `npm/rules/<id>/main.json` інтерпретує специфікації активації (`auto`) та області дії (`lint`). Він нормалізує логіку, визначену у `main.json.auto`, яка може бути константою `RULE_ALWAYS="завжди"`, списком залежностей, об'єктом з шаблоном `glob`, або предикатом. Код лише зчитує дані та не виконує операцій з файловою системою чи базами даних. При виникненні помилок він перехоплює їх, повертаючи безпечне значення замість винятків.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
RULE_ALWAYS — Константа, що позначає безумовну активацію правила.
|
|
18
18
|
parseRuleAutoSpec — Нормалізує значення поля `auto` з `main.json` у дискриміновану специфікацію активації правила.
|
|
19
|
-
parseRuleLintSpec — Нормалізує значення поля `lint` з `main.json` у специфікацію області
|
|
20
|
-
readRuleMetaRaw — Зчитує та парсить вміст `main.json` з каталогу правила, повертаючи його як об'єкт або `null
|
|
19
|
+
parseRuleLintSpec — Нормалізує значення поля `lint` з `main.json` у специфікацію області дії детектора.
|
|
20
|
+
readRuleMetaRaw — Зчитує та парсить вміст `main.json` з каталогу правила, повертаючи його як об'єкт або `null`.
|
|
21
21
|
|
|
22
22
|
## Публічний API
|
|
23
23
|
|
|
24
|
-
RULE_ALWAYS —
|
|
25
|
-
parseRuleAutoSpec — перетворює налаштування автоматичного
|
|
26
|
-
parseRuleLintSpec — перетворює налаштування
|
|
27
|
-
"per-file" — визначає, що детектор аналізує
|
|
28
|
-
"full" — визначає, що детектор
|
|
24
|
+
RULE_ALWAYS — константа, що вказує на безумовну активацію.
|
|
25
|
+
parseRuleAutoSpec — перетворює налаштування автоматичного сканування з `main.json` у структурований формат.
|
|
26
|
+
parseRuleLintSpec — перетворює налаштування лінтування з `main.json` у визначення області дії детектора.
|
|
27
|
+
"per-file" — визначає, що детектор аналізує лише змінені файли (порівнюючи їх з оригіналом).
|
|
28
|
+
"full" — визначає, що детектор сканує весь репозиторій; у режимі змін тригериться лише при перетині змінених файлів з шаблоном `auto.glob`.
|
|
29
|
+
Об'єктна форма `{scope, ci}` скасована — оскільки режим CI (`--read-only --full`) сканує весь репозиторій, окремі перевизначення CI для кожного правила не потрібні.
|
|
29
30
|
readRuleMetaRaw — зчитує та розбирає метадані одного правила з `main.json`.
|
|
30
31
|
|
|
31
32
|
## Гарантії поведінки
|
|
@@ -3,27 +3,27 @@ type: JS Module
|
|
|
3
3
|
title: run-lint.mjs
|
|
4
4
|
resource: npm/scripts/lib/run-lint.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 7d8f3637
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль ініціалізує та керує процесом лінтування коду. Він
|
|
13
|
+
Модуль ініціалізує та керує процесом лінтування коду. Він визначає набір правил лінтування, спираючись на конфігурацію, описану в `meta.json`, та прапорець `full`, використовуючи активні правила з `.n-cursor.json`. Після визначення правил, він запускає лінтер-оркестрацію для виконання лінтування по всьому репозиторію або в режимі дельти. Модуль підтримує автоматичне форматування коду за допомогою `oxfmt`.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
|
-
selectLintRules вибирає і
|
|
18
|
-
runLint запускає
|
|
17
|
+
selectLintRules вибирає і відсортовує ідентифікатори правил для лінтування на основі їхньої конфігурації лінту та прапорця `full`, враховуючи активні правила з `.n-cursor.json`.
|
|
18
|
+
runLint запускає лінтер-оркестрацію, виконуючи лінтування в режимі дельти або по всьому репозиторію, залежно від прапорця `full`, і може виконувати форматування за допомогою `oxfmt` у режимі фіксації.
|
|
19
19
|
|
|
20
20
|
## Публічний API
|
|
21
21
|
|
|
22
|
-
selectLintRules —
|
|
22
|
+
selectLintRules — вибирає ідентифікатори правил для контексту, розташовуючи їх в алфавітному порядку.
|
|
23
23
|
runLint — ініціює процес лінтування.
|
|
24
|
-
full — сканує весь репозиторій, порівнюючи його з
|
|
25
|
-
readOnly — лише виявляє
|
|
26
|
-
rules — виконує повне сканування лише для
|
|
24
|
+
full — сканує весь репозиторій, порівнюючи його з базовою версією.
|
|
25
|
+
readOnly — лише виявляє проблеми без внесення змін, порівнюючи з базовою версією.
|
|
26
|
+
rules — виконує повне сканування лише для заданого набору правил.
|
|
27
27
|
|
|
28
28
|
## Гарантії поведінки
|
|
29
29
|
|
|
@@ -54,7 +54,8 @@ const LINT_SCOPES = new Set(['per-file', 'full'])
|
|
|
54
54
|
/**
|
|
55
55
|
* Нормалізує значення `main.json.lint` у scope детектора.
|
|
56
56
|
* - `"per-file"` — детектор декомпозується на змінені файли (дельта vs origin);
|
|
57
|
-
* - `"full"` —
|
|
57
|
+
* - `"full"` — крос-файловий: у `--full` ганяє весь репо; у delta-режимі тригериться
|
|
58
|
+
* лише якщо змінені файли перетинаються з `auto.glob` правила (whole-repo scan).
|
|
58
59
|
* Об'єктна форма `{scope, ci}` скасована: CI=`--read-only --full` ганяє все повністю,
|
|
59
60
|
* тож per-rule CI-override не потрібен (spec 2026-06-14-lint-rule-consolidation §3-А).
|
|
60
61
|
* @param {unknown} value значення поля `lint`
|
package/scripts/lib/run-lint.mjs
CHANGED
|
@@ -5,7 +5,9 @@ import { fileURLToPath } from 'node:url'
|
|
|
5
5
|
import { cwd as processCwd } from 'node:process'
|
|
6
6
|
import { spawnSync } from 'node:child_process'
|
|
7
7
|
|
|
8
|
-
import
|
|
8
|
+
import picomatch from 'picomatch'
|
|
9
|
+
|
|
10
|
+
import { parseRuleAutoSpec, parseRuleLintSpec, readRuleMetaRaw } from './rule-meta.mjs'
|
|
9
11
|
import { collectChangedFilesSince, resolveChangedBase } from './changed-files.mjs'
|
|
10
12
|
import { resolveCmd } from '../utils/resolve-cmd.mjs'
|
|
11
13
|
import { isRuleEnabled, readNCursorConfigLite } from './read-n-cursor-config-lite.mjs'
|
|
@@ -78,6 +80,30 @@ export function selectLintRules(metaById, full, enabledRuleIds) {
|
|
|
78
80
|
return out.toSorted((a, b) => a.localeCompare(b))
|
|
79
81
|
}
|
|
80
82
|
|
|
83
|
+
/**
|
|
84
|
+
* Визначає `full`-scope правила для запуску у delta-режимі.
|
|
85
|
+
* Правило включається, якщо хоча б один зі змінених файлів відповідає `auto.glob` правила.
|
|
86
|
+
* Предикат-auto (repo-level сигнал, не file-level) — пропускається.
|
|
87
|
+
* @param {Record<string, Record<string, unknown>>} metaById
|
|
88
|
+
* @param {string[]} changed змінені файли (posix-відносні від кореня)
|
|
89
|
+
* @param {string[]} enabledRuleIds активні rule-id
|
|
90
|
+
* @returns {string[]} відсортовані id
|
|
91
|
+
*/
|
|
92
|
+
function selectFullRulesForDelta(metaById, changed, enabledRuleIds) {
|
|
93
|
+
if (changed.length === 0) return []
|
|
94
|
+
const enabled = new Set(enabledRuleIds)
|
|
95
|
+
const out = []
|
|
96
|
+
for (const [id, raw] of Object.entries(metaById)) {
|
|
97
|
+
if (!enabled.has(id)) continue
|
|
98
|
+
if (parseRuleLintSpec(raw?.lint) !== 'full') continue
|
|
99
|
+
const autoSpec = parseRuleAutoSpec(raw?.auto)
|
|
100
|
+
if (!autoSpec || !('glob' in autoSpec)) continue
|
|
101
|
+
const isMatch = picomatch(autoSpec.glob, { dot: true })
|
|
102
|
+
if (changed.some(f => isMatch(f))) out.push(id)
|
|
103
|
+
}
|
|
104
|
+
return out.toSorted((a, b) => a.localeCompare(b))
|
|
105
|
+
}
|
|
106
|
+
|
|
81
107
|
/**
|
|
82
108
|
* Активні правила для unscoped linter-фази. `.n-cursor.json` — єдине джерело
|
|
83
109
|
* whitelist/disable, `meta.json#lint` нижче використовується лише як scope (`per-file`/`full`).
|
|
@@ -244,6 +270,18 @@ export async function runLint(opts = {}) {
|
|
|
244
270
|
if (perFile.stop) return perFile.code
|
|
245
271
|
let worst = perFile.code
|
|
246
272
|
|
|
273
|
+
// Delta-режим: `full`-scope правила, чиї glob-и перетинаються з changed.
|
|
274
|
+
// Запускаємо з `changed=undefined` (whole-repo scan як зазвичай) — так уникаємо
|
|
275
|
+
// прогону docker/ga/k8s… коли жоден їхній файл не змінився.
|
|
276
|
+
if (!full && changed.length > 0) {
|
|
277
|
+
const fullIds = selectFullRulesForDelta(metaById, changed, enabledRuleIds)
|
|
278
|
+
if (fullIds.length > 0) {
|
|
279
|
+
const fullResult = await runPerFileRules(fullIds, { rulesDir, changed: undefined, cwd, readOnly, metaById, log })
|
|
280
|
+
if (fullResult.stop) return fullResult.code
|
|
281
|
+
if (fullResult.code !== 0) worst = fullResult.code
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
247
285
|
// Конформність-фаза: whole-repo, лише у `--full`. Кастомний rulesDir (юніт-тести
|
|
248
286
|
// селектора) — реальний пакет недоступний, тож пропускаємо.
|
|
249
287
|
if (full && opts.rulesDir === undefined) {
|