@nitra/cursor 12.8.0 → 12.8.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 +12 -0
- package/package.json +1 -1
- package/rules/doc-files/js/docgen-scan.mjs +4 -2
- package/rules/doc-files/js/docs/docgen-extract.md +10 -10
- package/rules/doc-files/js/docs/docgen-judge-measure.md +10 -10
- package/rules/doc-files/js/docs/docgen-judge.md +13 -11
- package/rules/doc-files/js/docs/docgen-scan.md +28 -27
- package/rules/doc-files/js/docs/index.md +15 -16
- package/rules/feedback/feedback.mdc +3 -3
- package/rules/ga/ga.mdc +1 -1
- package/rules/ga/policy/workflow_common/workflow_common.rego +3 -3
- package/rules/{js-lint → js}/coverage/coverage.mjs +7 -7
- package/rules/{js-lint → js}/docs/fix.md +1 -1
- package/rules/{js-lint → js}/docs/index.md +3 -3
- package/rules/{js-lint → js}/docs/main.md +1 -1
- package/rules/{js-lint → js}/js/check.mjs +10 -10
- package/rules/{js-lint → js}/js/docs/check.md +3 -3
- package/rules/{js-lint → js}/js/docs/index.md +3 -3
- package/rules/{js-lint → js}/js/docs/lint-findings.md +1 -1
- package/rules/{js-lint → js}/js/docs/tooling.md +1 -1
- package/rules/{js-lint → js}/js/docs/utils_imports.md +8 -8
- package/rules/{js-lint → js}/js/tooling.mjs +1 -1
- package/rules/{js-lint → js}/js/utils_imports.mjs +3 -3
- package/rules/{js-lint/js-lint.mdc → js/js.mdc} +30 -6
- package/rules/{js-lint → js}/main.mjs +22 -5
- package/rules/{js-lint → js}/policy/jscpd/jscpd.rego +4 -4
- package/rules/{js-lint → js}/policy/jscpd/target.json +1 -1
- package/rules/{js-lint → js}/policy/lint_js_yml/lint_js_yml.rego +6 -6
- package/rules/{js-lint → js}/policy/lint_js_yml/template/lint-js.yml.snippet.yml +1 -1
- package/rules/{js-lint → js}/policy/package_json/package_json.rego +7 -7
- package/rules/{js-lint → js}/policy/vscode_extensions/target.json +1 -1
- package/rules/{js-lint → js}/policy/vscode_extensions/vscode_extensions.rego +2 -2
- package/rules/js-run/lib/docs/conn-file-rules.md +1 -1
- package/rules/npm-module/js/docs/header_doc_pointer.md +23 -13
- package/rules/python/docs/main.md +10 -10
- package/rules/rust/docs/main.md +7 -7
- package/rules/style-lint/js/tooling.mjs +1 -1
- package/rules/test/js/docs/stryker_config.md +1 -1
- package/rules/test/js/stryker_config.mjs +4 -4
- package/rules/test/js/vitest-config-pool-forks.mjs +1 -1
- package/rules/test/test.mdc +4 -4
- package/rules/text/docs/main.md +8 -8
- package/rules/text/js/docs/cspell-fix.md +8 -8
- package/rules/text/js/docs/index.md +0 -1
- package/scripts/lib/docs/discover-checkable-rules.md +2 -2
- package/scripts/lib/docs/run-lint.md +6 -6
- package/scripts/lib/fix/docs/analyze-escalation.md +28 -15
- package/scripts/lib/fix/docs/orchestrator.md +14 -15
- package/scripts/lib/fix/docs/t0.md +8 -7
- package/scripts/lib/gha-workflow.mjs +1 -1
- package/scripts/lib/timing-summary.mjs +1 -1
- package/scripts/sync-setup-bun-deps-action.mjs +1 -1
- package/scripts/utils/resolve-js-root.mjs +1 -1
- package/skills/coverage-fix/meta.json +1 -1
- package/skills/lint/SKILL.md +2 -2
- package/skills/llm-patch/SKILL.md +1 -1
- package/rules/js-lint-ci/docs/fix.md +0 -28
- package/rules/js-lint-ci/docs/index.md +0 -12
- package/rules/js-lint-ci/docs/main.md +0 -27
- package/rules/js-lint-ci/js/docs/index.md +0 -11
- package/rules/js-lint-ci/js-lint-ci.mdc +0 -45
- package/rules/js-lint-ci/main.mjs +0 -33
- package/rules/js-lint-ci/meta.json +0 -1
- /package/rules/{js-lint → js}/js/data/tooling/knip-canonical.json +0 -0
- /package/rules/{js-lint → js}/js/data/tooling/oxlint-canonical.json +0 -0
- /package/rules/{js-lint → js}/js/lint-findings.mjs +0 -0
- /package/rules/{js-lint → js}/meta.json +0 -0
- /package/rules/{js-lint → js}/policy/jscpd/template/.jscpd.json.snippet.json +0 -0
- /package/rules/{js-lint → js}/policy/lint_js_yml/target.json +0 -0
- /package/rules/{js-lint → js}/policy/package_json/target.json +0 -0
- /package/rules/{js-lint → js}/policy/package_json/template/package.json.snippet.json +0 -0
- /package/rules/{js-lint → js}/policy/vscode_extensions/template/extensions.json.snippet.json +0 -0
|
@@ -18,7 +18,7 @@ const STRYKER_VUE_PLUGIN_PATH = join(HERE, 'data', 'stryker_config', 'stryker-vu
|
|
|
18
18
|
const STRYKER_VUE_PLUGIN_FILENAME = 'stryker-vue-macros-ignorer.mjs'
|
|
19
19
|
const VITEST_BASELINE_PATH = join(HERE, 'data', 'vitest_config', 'vitest.config.baseline.js')
|
|
20
20
|
|
|
21
|
-
// Канонічна назва vitest-конфіга — `.mjs` (нові файли, js
|
|
21
|
+
// Канонічна назва vitest-конфіга — `.mjs` (нові файли, js.mdc); legacy
|
|
22
22
|
// `.js` лишається валідним. Перший знайдений виграє (.mjs пріоритетніший).
|
|
23
23
|
const VITEST_CONFIG_NAMES = ['vitest.config.mjs', 'vitest.config.js']
|
|
24
24
|
// Заміна literal `configFile` у скопійованому stryker-baseline на фактичне
|
|
@@ -332,14 +332,14 @@ export async function check(cwd = process.cwd()) {
|
|
|
332
332
|
const reporter = createCheckReporter()
|
|
333
333
|
const config = await readNCursorConfigLite(cwd)
|
|
334
334
|
|
|
335
|
-
// Self-gate: js
|
|
336
|
-
if (!config.rules.includes('js
|
|
335
|
+
// Self-gate: js має бути enabled
|
|
336
|
+
if (!config.rules.includes('js') || config.disableRules.includes('js')) {
|
|
337
337
|
return reporter.getExitCode()
|
|
338
338
|
}
|
|
339
339
|
|
|
340
340
|
const jsRoots = await resolveAllJsRoots(cwd)
|
|
341
341
|
if (jsRoots.length === 0) {
|
|
342
|
-
reporter.fail('test: js
|
|
342
|
+
reporter.fail('test: js enabled, але кореневий package.json не знайдено (test.mdc)')
|
|
343
343
|
return reporter.getExitCode()
|
|
344
344
|
}
|
|
345
345
|
|
|
@@ -8,7 +8,7 @@ import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
|
|
|
8
8
|
/** Subтring-pattern: `pool: 'forks'` або `pool: "forks"` (з опційним whitespace). */
|
|
9
9
|
const POOL_FORKS_RE = /pool\s*:\s*['"]forks['"]/u
|
|
10
10
|
|
|
11
|
-
// Канонічна назва — `.mjs` (нові файли, js
|
|
11
|
+
// Канонічна назва — `.mjs` (нові файли, js.mdc), але legacy `.js` лишається
|
|
12
12
|
// валідним. Перший знайдений виграє: `.mjs` пріоритетніший.
|
|
13
13
|
const VITEST_CONFIG_NAMES = ['vitest.config.mjs', 'vitest.config.js']
|
|
14
14
|
|
package/rules/test/test.mdc
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: JS-тести (*.test.mjs) живуть у tests/. Правило `test` керує stryker.config.mjs + vitest.config.mjs (якщо js
|
|
2
|
+
description: JS-тести (*.test.mjs) живуть у tests/. Правило `test` керує stryker.config.mjs + vitest.config.mjs (якщо js enabled) і .cargo/mutants.toml (якщо rust enabled).
|
|
3
3
|
version: '2.8'
|
|
4
4
|
globs: "**/{.n-cursor.json,package.json,Cargo.toml,stryker.config.mjs,vitest.config.mjs,vitest.config.js,.cargo/mutants.toml},**/*.test.mjs"
|
|
5
5
|
alwaysApply: false
|
|
@@ -132,7 +132,7 @@ test.skipIf(env.STRYKER_MUTATOR_WORKER)('узгоджені з поточним
|
|
|
132
132
|
|
|
133
133
|
**Scoped-режим `--changed`:** `n-cursor coverage --changed` звужує scope до файлів, змінених від git merge-base поточної гілки з `main` або `origin/main`; якщо обидва refs відсутні — до робочого дерева vs HEAD. `git diff <base>` проти робочого дерева ловить committed і uncommitted однаково, тож результат не залежить від того, чи крок уже закомічено. Недосяжний `base` (rebase/force-update) — fail-closed (помилка, не тихий pass). JS-провайдер ганяє `vitest --changed <base>` (лише зачеплені тести) і Stryker `--mutate` по змінених production-файлах (тест-файли відкидаються); roots без змінених JS пропускаються. Rust-провайдер пропускається, якщо не змінено `.rs`/`Cargo.*` (інакше — повний crate-прогін; per-file scoping cargo-mutants — окремий крок). Порожній scope (нема релевантних змін) — pass. У changed-режимі `COVERAGE.md` **не** перезаписується (рішення гейту — лише exit-код) і LLM-класифікація не запускається. Швидкі gate-и викликають саме `coverage --changed`; повний coverage (увесь проєкт, запис `COVERAGE.md`) лишається для `bun run coverage` / `/n-coverage-fix`.
|
|
134
134
|
|
|
135
|
-
Провайдери живуть у `npm/rules/<rule>/coverage/coverage.mjs` (постачаються правилами мови/рантайму: `js
|
|
135
|
+
Провайдери живуть у `npm/rules/<rule>/coverage/coverage.mjs` (постачаються правилами мови/рантайму: `js`, `rust`, у майбутньому `python` тощо). Оркестратор — у `npm/rules/test/coverage/coverage.mjs`.
|
|
136
136
|
|
|
137
137
|
У `package.json` (корінь) має бути `scripts.coverage` із викликом `n-cursor coverage`:
|
|
138
138
|
|
|
@@ -144,7 +144,7 @@ test.skipIf(env.STRYKER_MUTATOR_WORKER)('узгоджені з поточним
|
|
|
144
144
|
|
|
145
145
|
## Налаштування mutation-testing
|
|
146
146
|
|
|
147
|
-
Якщо у `.n-cursor.json#rules` присутнє правило `js
|
|
147
|
+
Якщо у `.n-cursor.json#rules` присутнє правило `js` — правило `test` створює canonical baseline `stryker.config.mjs` + `vitest.config.mjs` у **кожному** JS-root проєкту: у кожному workspace з власним `package.json` (або в корені для single-package). У monorepo з `workspaces: ['app', 'scripts']` отримаєте `app/stryker.config.mjs` + `app/vitest.config.mjs` і `scripts/stryker.config.mjs` + `scripts/vitest.config.mjs`. Якщо у JS-root уже лежить legacy `vitest.config.js` — він лишається валідним, новий `.mjs` поряд не створюється, а `vitest.configFile` у скопійованому `stryker.config.mjs` приводиться до фактичного імені.
|
|
148
148
|
|
|
149
149
|
Канон Stryker config (Vitest runner + perTest): [stryker.config.baseline.mjs](./js/data/stryker_config/stryker.config.baseline.mjs)
|
|
150
150
|
|
|
@@ -202,7 +202,7 @@ Customization (mutate patterns, exclude rules, timeout) — відповідал
|
|
|
202
202
|
|
|
203
203
|
Якщо інше правило спеціалізує mutation-behavior — воно зобов'язане **доповнювати** існуючий `.cargo/mutants.toml` без дублювання (додавати лише відсутні ключі) і **не перетирати** ручні налаштування. Послідовний запуск `npx @nitra/cursor fix test` після `fix tauri` не має скидати tauri-tuning, і навпаки — повторний `fix tauri` не дублює секції.
|
|
204
204
|
|
|
205
|
-
Додатково: коли `js
|
|
205
|
+
Додатково: коли `js` enabled, концерн `stryker_config` без дублювання додає у кореневий `.gitignore` тест-патерни:
|
|
206
206
|
|
|
207
207
|
- `**/reports/stryker/` — увесь каталог Stryker-output-у (backup'и `tempDirName`, `mutation.json`, HTML/dashboard-репорти якщо додасте інші reporter-и).
|
|
208
208
|
- `**/coverage/` — весь output vitest v8 coverage (`lcov.info` + HTML `lcov-report/`). Ефемерний: регенерується кожним прогоном, фінальні метрики живуть у `COVERAGE.md`. Gitignore не заважає `n-cursor coverage` читати `lcov.info` у тому ж прогоні.
|
package/rules/text/docs/main.md
CHANGED
|
@@ -3,26 +3,26 @@ type: JS Module
|
|
|
3
3
|
title: main.mjs
|
|
4
4
|
resource: npm/rules/text/main.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 8a0470de
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 90
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
CLI
|
|
13
|
+
Цей модуль є CLI-обгорткою над канонічним `lint-text` (text.mdc) та викликається через `n-cursor lint text` (оркестраторний адаптер `lint`). Він автоматично встановлює необхідні інструменти (`shellcheck`, `dotenv-linter`) через `ensureTool` (brew/scoop/GitHub Release per-platform) та перевіряє наявність `patch` (для авто-фіксу shellcheck). Функція `runLintTextCli` послідовно виконує: 1) перевірку правопису з `@nitra/cspell-dict` (`cspell .`); 2) авто-фікс та фінальну перевірку `.sh` файлів (`shellcheck`); 3) авто-фікс та фінальну перевірку `.env*` файлів (`dotenv-linter`); 4) авто-фікс Markdown-документів (`markdownlint-cli2 --fix "**\/*.md" "**\/*.mdc"`); 5) schema-валідацію JSON/YAML/TOML через `v8r`. При першому ненульовому коді з ланцюжка повертається код виходу, і наступні кроки не запускаються. Конфігурації, на які спирається код: meta.json.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
|
-
run
|
|
18
|
-
runLintTextCli
|
|
19
|
-
lint
|
|
17
|
+
run виконує стандартну перевірку, використовуючи контекст прогону.
|
|
18
|
+
runLintTextCli виконує повний ланцюжок перевірок тексту (cspell, shellcheck, dotenv-linter, markdownlint, v8r), автоматично встановлюючи необхідні інструменти, і повертає код першого порушення.
|
|
19
|
+
lint делегує виклик `runLintTextCli` для виконання повного ланцюжка перевірок тексту.
|
|
20
20
|
|
|
21
21
|
## Публічний API
|
|
22
22
|
|
|
23
|
-
run —
|
|
24
|
-
runLintTextCli —
|
|
25
|
-
lint —
|
|
23
|
+
run — Основна точка входу правила, що виконує перевірку логіки (JS-занепокоєння $\rightarrow$ політика $\rightarrow$ маркування повідомлень).
|
|
24
|
+
runLintTextCli — Публічний інтерфейс командного рядка для лінтингу тексту, що серіалізує через блокування та усуває дублікати на основі стану Git.
|
|
25
|
+
lint — Координатор, що передає завдання лінтингу тексту до `runLintTextCli`.
|
|
26
26
|
|
|
27
27
|
## Гарантії поведінки
|
|
28
28
|
|
|
@@ -3,26 +3,26 @@ type: JS Module
|
|
|
3
3
|
title: cspell-fix.mjs
|
|
4
4
|
resource: npm/rules/text/js/cspell-fix.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: e00c233e
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Модуль інтегрує cspell у ланцюжку lint-text для класифікації невідомих слів згідно зі схемою docs/specs/2026-06-15-opportunistic-llm-fix-tier.md. Він виявляє невідомі слова, класифікує їх за допомогою LLM у межах omlx-класифікації. Валідні слова автоматично дописуються до `.cspell.json#words` (відповідно до конфігурацій .cspell.json та meta.json). Невалідні знахідки залишаються для ручного рев'ю. Процес є read-only (нуль мутацій), оскільки fix-режим не переписує файли, а лише класифікує знахідки. Після дописування словника виконується re-detect. Гейт-механізм гарантує, що cspell поверне ненульовий код, якщо нерозкласифіковані або потенційні одруки залишилися.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
|
-
unknownWords витягує унікальні
|
|
18
|
-
appendWordsToDict
|
|
19
|
-
runCspellText запускає cspell
|
|
17
|
+
unknownWords витягує унікальні «Unknown word» з виводу cspell.
|
|
18
|
+
appendWordsToDict дописує класифіковані валідні слова у `.cspell.json#words`, сортуючи та усуваючи дублікати.
|
|
19
|
+
runCspellText запускає cspell, класифікує знахідки за допомогою LLM (якщо `llmFix` встановлено), дописує валідні слова у словник та повторно запускає cspell для перевірки, повертаючи код виходу.
|
|
20
20
|
|
|
21
21
|
## Публічний API
|
|
22
22
|
|
|
23
|
-
unknownWords — Збирає унікальні слова, які не були знайдені у
|
|
24
|
-
appendWordsToDict — Додає зібрані слова до
|
|
25
|
-
runCspellText — Виконує перевірку тексту за допомогою cspell
|
|
23
|
+
unknownWords — Збирає унікальні слова, які не були знайдені у cspell.
|
|
24
|
+
appendWordsToDict — Додає зібрані слова до словника `.cspell.json` у відсортованому та унікальному вигляді.
|
|
25
|
+
runCspellText — Виконує перевірку тексту за допомогою cspell для формування словника за новою схемою.
|
|
26
26
|
|
|
27
27
|
## Гарантії поведінки
|
|
28
28
|
|
|
@@ -11,7 +11,6 @@ resource: npm/rules/text/js/
|
|
|
11
11
|
| [cspell-fix.mjs](cspell-fix.md) | JS Module |
|
|
12
12
|
| [forbidden-prettier.mjs](forbidden-prettier.md) | JS Module |
|
|
13
13
|
| [formatting.mjs](formatting.md) | JS Module |
|
|
14
|
-
| [lint.mjs](lint.md) | JS Module |
|
|
15
14
|
| [run-dotenv-linter.mjs](run-dotenv-linter.md) | JS Module |
|
|
16
15
|
| [run-shellcheck.mjs](run-shellcheck.md) | JS Module |
|
|
17
16
|
| [run-v8r.mjs](run-v8r.md) | JS Module |
|
|
@@ -145,8 +145,8 @@ for (const rule of rules) {
|
|
|
145
145
|
```javascript
|
|
146
146
|
import { discoverOneRule } from './discover-checkable-rules.mjs'
|
|
147
147
|
|
|
148
|
-
const rule = await discoverOneRule('/abs/path/to/npm/rules/n-js
|
|
149
|
-
// rule.id === 'n-js
|
|
148
|
+
const rule = await discoverOneRule('/abs/path/to/npm/rules/n-js', 'n-js')
|
|
149
|
+
// rule.id === 'n-js'
|
|
150
150
|
// rule.jsConcerns — список JS-концернів у js/
|
|
151
151
|
// rule.policyConcerns — список policy-концернів у policy/
|
|
152
152
|
```
|
|
@@ -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: 24827b04
|
|
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` та `.n-cursor.json`. Публічна функція `selectLintRules` виконує вибір правил. Публічна функція `runLint` ініціює повний цикл лінтування, який може включати перевірку змінених файлів або всього репозиторію.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
|
-
selectLintRules вибирає і алфавітно сортує ідентифікатори правил для
|
|
18
|
-
runLint запускає
|
|
17
|
+
selectLintRules вибирає і алфавітно сортує ідентифікатори правил для лінтування, ґрунтуючись на наявності в конфігурації та заданому обсязі перевірки.
|
|
18
|
+
runLint запускає повну оркестрацію лінтування, виконуючи перевірку змінених файлів або весь репозиторій, залежно від параметрів, і може включати фази конформності та форматування.
|
|
19
19
|
|
|
20
20
|
## Публічний API
|
|
21
21
|
|
|
22
22
|
selectLintRules — обирає ідентифікатори правил для контексту, розташовуючи їх в алфавітному порядку.
|
|
23
23
|
runLint — ініціює процес лінтування.
|
|
24
24
|
full — сканує весь репозиторій, порівнюючи його з початковим станом.
|
|
25
|
-
readOnly — лише виявляє
|
|
26
|
-
rules — виконує повне сканування
|
|
25
|
+
readOnly — лише виявляє проблеми, не вносячи змін, порівнюючи з початковим станом.
|
|
26
|
+
rules — виконує повне сканування лише для вказаних правил у заданому обсязі.
|
|
27
27
|
|
|
28
28
|
## Гарантії поведінки
|
|
29
29
|
|
|
@@ -3,31 +3,44 @@ type: JS Module
|
|
|
3
3
|
title: analyze-escalation.mjs
|
|
4
4
|
resource: npm/scripts/lib/fix/analyze-escalation.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: f26cd4c7
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Аналізує записи рунгів драбини з `escalation-log.mjs` для виявлення шляхів зменшення LLM-залежності у fix-конформності. Лог обробляється за один прогін (від байтового зсуву) або повністю, ділячись на чанки для аналізу хмарною **avg**-моделлю. Мета аналізу — визначити конкретні правки пакета `@nitra/cursor`: (A) новий ДЕТЕРМІНОВАНИЙ T0-патерн (`t0.mjs`), (B) уточнення `.mdc`-інструкцій правила, або (C) зміна скрипта/чека. Результат зберігається у markdown-звіт `.n-cursor/fix-escalation-analysis.md` (append із timestamp) після виклику CLI `n-cursor analyze-escalation`.
|
|
12
14
|
|
|
13
15
|
## Поведінка
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
analysisEnabled визначає, чи дозволено виконувати автоматичний аналіз ескалації наприкінці процесу `lint`.
|
|
18
|
+
escalationLogSize повертає розмір файлу логу ескалації у байтах.
|
|
19
|
+
readEscalationRecords читає записи логу ескалації, починаючи з заданого байтового зсуву, та повертає їх як масив об'єктів.
|
|
20
|
+
summarizeCalls рахує кількість викликів моделей для різних рівнів (локальний, cloud-min, cloud-avg) у наданих записах.
|
|
21
|
+
reportRunStats друкує резюме кількості викликів моделей для поточного прогону, використовуючи заданий байтовий зсув.
|
|
22
|
+
chunkRecords ділить масив стиснених записів на менші чанки, щоб кожен чанк не перевищив заданий бюджет символів.
|
|
23
|
+
analyzeEscalations аналізує надані записи, ділить їх на чанки, викликає модель для аналізу кожного чанка, а потім синтезує фінальний звіт.
|
|
24
|
+
analysisReportPath повертає шлях до файлу, де зберігається звіт аналізу ескалації.
|
|
25
|
+
writeAnalysisReport дописує згенерований звіт у markdown-файл у відповідному шляху, додаючи до нього мітку часу.
|
|
26
|
+
runEscalationAnalysisCli виконує повний аналіз всього логу ескалації та записує звіт.
|
|
27
|
+
maybeAnalyzeEscalation виконує аналіз ескалацій лише для записів поточного прогону, якщо дозволено та є необхідні умови.
|
|
16
28
|
|
|
17
29
|
## Публічний API
|
|
18
30
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
analysisEnabled — Вмикає автоматичний аналіз після завершення lint.
|
|
32
|
+
escalationLogSize — Визначає максимальний розмір escalation-логу в байтах.
|
|
33
|
+
readEscalationRecords — Зчитує записи з логу, починаючи з заданого байтового зсуву.
|
|
34
|
+
summarizeCalls — Підраховує реальні виклики моделей за тирами, ігноруючи записи про середнє кешування.
|
|
35
|
+
reportRunStats — Виводить підсумок викликів моделей за поточний запуск.
|
|
36
|
+
chunkRecords — Розбиває записи на менші частини, щоб розмір JSON кожного чанку не перевищував заданий ліміт.
|
|
37
|
+
analyzeEscalations — Обробляє записи: розбиває їх на чанки, викликає модель для кожного чанку та синтезує результат, якщо чанків більше одного.
|
|
38
|
+
analysisReportPath — Вказує шлях для збереження markdown-звіту аналізу.
|
|
39
|
+
writeAnalysisReport — Додає звіт до markdown-файлу, додаючи до нього мітку часу.
|
|
40
|
+
runEscalationAnalysisCli — Виконує повний аналіз всього логу escalation через інтерфейс командного рядка.
|
|
41
|
+
maybeAnalyzeEscalation — Запускає аналіз записів поточного прогону після `lint --full`, якщо це дозволено налаштуваннями.
|
|
29
42
|
|
|
30
43
|
## Гарантії поведінки
|
|
31
44
|
|
|
32
|
-
-
|
|
33
|
-
-
|
|
45
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
46
|
+
- За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
|
|
@@ -3,38 +3,37 @@ type: JS Module
|
|
|
3
3
|
title: orchestrator.mjs
|
|
4
4
|
resource: npm/scripts/lib/fix/orchestrator.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 3bb1b761
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль
|
|
13
|
+
Модуль відповідає за управління процесом виправлення порушень. Він будує послідовність тирів ескалації за допомогою `buildLadder`, парсить аргументи командного рядка за допомогою `parseOrchestratorArgs` та запускає повний цикл виправлення за допомогою `runOrchestratorCli`. Цей цикл включає автоматичний фікс та ескалацію через LLM-моделі, що реалізується функцією `escalateRule`.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
buildLadder будує послідовність тирів ескалації для вирішення порушень, від локальних мінімальних моделей до хмарних середніх моделей.
|
|
18
|
-
escalateRule
|
|
19
|
-
parseOrchestratorArgs парсить аргументи командного рядка для визначення максимального
|
|
20
|
-
runOrchestratorCli
|
|
18
|
+
escalateRule виконує один прогін по послідовності тирів, намагаючись вирішити порушення, використовуючи LLM-моделі та фіксуючи результат.
|
|
19
|
+
parseOrchestratorArgs парсить аргументи командного рядка для визначення максимального ліміту викликів хмарної моделі та фільтра правил.
|
|
20
|
+
runOrchestratorCli керує повним процесом виправлення порушень: виконує початкову перевірку, застосовує детермінований фікс (T0-auto), а потім ініціює LLM-драбину ескалації для невирішених правил.
|
|
21
21
|
|
|
22
22
|
## Публічний API
|
|
23
23
|
|
|
24
|
-
buildLadder — Створює послідовність моделей для ескалації,
|
|
24
|
+
buildLadder — Створює послідовність моделей для ескалації, обмежуючись лише тирами, які доступні.
|
|
25
25
|
|
|
26
|
-
local-min —
|
|
27
|
-
local-min-retry — Повторює локальний прохід, використовуючи
|
|
28
|
-
cloud-min —
|
|
29
|
-
cloud-avg —
|
|
26
|
+
local-min — Виконує перший прохід з локальною мінімальною моделлю.
|
|
27
|
+
local-min-retry — Повторює локальний прохід, використовуючи результати попереднього рунгу.
|
|
28
|
+
cloud-min — Виконує прохід з хмарною мінімальною моделлю, використовуючи результати попереднього рунгу.
|
|
29
|
+
cloud-avg — Виконує прохід з хмарною середньою моделлю, використовуючи результати попереднього рунгу та обмеження середнього.
|
|
30
30
|
|
|
31
|
-
escalateRule —
|
|
32
|
-
Кожен рунг —
|
|
33
|
-
Достроковий вихід — Зупиняє процес при певних умовах (відсутність ключа, пропуск моделі на системному рівні) або при досягненні ліміту середнього.
|
|
31
|
+
escalateRule — Застосовує одне правило по драбині ескалації до першого позитивного результату.
|
|
32
|
+
Кожен рунг — Викликає модель з попереднім відгуком, перевіряє правило, фіксує результат у лозі. Зупиняється при певних умовах (відсутність ключа, пропуск моделі, перевищення бюджету).
|
|
34
33
|
|
|
35
|
-
parseOrchestratorArgs — Витягує максимальне значення середнього та
|
|
34
|
+
parseOrchestratorArgs — Витягує максимальне значення середнього та список фільтрів правил з командного рядка.
|
|
36
35
|
|
|
37
|
-
runOrchestratorCli — Запускає
|
|
36
|
+
runOrchestratorCli — Запускає основну логіку оркестратора на основі аргументів командного рядка.
|
|
38
37
|
|
|
39
38
|
## Гарантії поведінки
|
|
40
39
|
|
|
@@ -3,26 +3,27 @@ type: JS Module
|
|
|
3
3
|
title: t0.mjs
|
|
4
4
|
resource: npm/scripts/lib/fix/t0.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: cfb0d5c9
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль керує автоматичним застосуванням T0-auto
|
|
13
|
+
Модуль керує автоматичним застосуванням паттернів T0-auto до виводів порушень. Він використовує конфігурації з `extensions.json` та `package-lock.json` для визначення правил. Модуль фільтрує правила, які можуть бути автоматично оброблені, застосовує паттерни за допомогою `applyT0Auto`, а потім запускає повний цикл перевірки для всіх провальних правил через `runT0AutoCli`. Усі операції виконуються з механізмом fail-safe, що запобігає виникненню винятків назовні.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
Поведінка
|
|
18
|
+
applyT0Auto застосовує всі визначені T0-auto паттерни до одного виводу порушення, повертаючи результат застосування та список виконаних дій.
|
|
19
|
+
filterT0AutoRules повертає список ID правил, для яких існує хоча б один T0-auto паттерн, виходячи з виводу порушення.
|
|
20
|
+
runT0AutoCli запускає T0-auto для всіх провальних правил, повторно перевіряє конформність та виводить підсумок щодо закритого чи незакритого порушень.
|
|
20
21
|
|
|
21
22
|
## Публічний API
|
|
22
23
|
|
|
23
24
|
applyT0Auto — вносить зміни до виводу порушень, використовуючи всі визначені T0-auto шаблони.
|
|
24
|
-
filterT0AutoRules — визначає, які правила мають
|
|
25
|
-
runT0AutoCli — виконує команду `n-cursor fix-t0 [rule...]`,
|
|
25
|
+
filterT0AutoRules — визначає, які правила мають відповідні T0-auto шаблони, аналізуючи вивід порушень, отриманий з `fix --json`.
|
|
26
|
+
runT0AutoCli — виконує команду `n-cursor fix-t0 [rule...]`, що включає застосування T0-auto до кожного порушення, повторну перевірку check-gate та виведення результату.
|
|
26
27
|
|
|
27
28
|
## Гарантії поведінки
|
|
28
29
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Допоміжні функції для аналізу GitHub Actions workflow (`.yml`) після структурного розбору YAML.
|
|
3
3
|
*
|
|
4
|
-
* Використовується в check-ga, check-js
|
|
4
|
+
* Використовується в check-ga, check-js, check-text, check-style-lint, check-npm-module замість
|
|
5
5
|
* пошуку підрядків у сирому тексті там, де важливі лише значення `uses:` та `run:` кроків.
|
|
6
6
|
*
|
|
7
7
|
* Для `run:` також виявляється shell-продовження рядка через `\\` перед переносом (антипатерн у ga.mdc).
|
|
@@ -41,7 +41,7 @@ export function formatDurationMs(ms) {
|
|
|
41
41
|
* ```
|
|
42
42
|
*
|
|
43
43
|
* Ширина колонки id вирівнюється під найдовший id у списку. Мінімальна ширина risk — 14
|
|
44
|
-
* (узгоджено з типовою довжиною заголовків `fix-js
|
|
44
|
+
* (узгоджено з типовою довжиною заголовків `fix-js` / `lint-security`).
|
|
45
45
|
* @param {string} title заголовок таблиці (наприклад, `Fix timing` або `Lint timing`)
|
|
46
46
|
* @param {TimingEntry[]} timings записи в порядку запуску — друкуються як є, не сортуються
|
|
47
47
|
* @returns {string} готовий до stdout текст з кінцевим `\n`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Копіює composite GitHub Action `setup-bun-deps` з установленого пакету `@nitra/cursor`
|
|
3
3
|
* у цільовий репозиторій (`.github/actions/setup-bun-deps/action.yml`).
|
|
4
4
|
*
|
|
5
|
-
* Використовується CLI `npx \@nitra/cursor`, щоб workflows з правил `ga` / `js
|
|
5
|
+
* Використовується CLI `npx \@nitra/cursor`, щоб workflows з правил `ga` / `js` / `text`
|
|
6
6
|
* могли одразу викликати `uses: ./.github/actions/setup-bun-deps` після кроку `actions/checkout@v6` (без checkout runner не знайде action.yml).
|
|
7
7
|
*
|
|
8
8
|
* Джерело: каталог `github-actions/setup-bun-deps/` у корені tarball пакету (поруч із `mdc/`, `bin/`).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Резолвить корінь JS-коду в проєкті: для workspace-projects — перший workspace
|
|
3
3
|
* (з підтримкою glob-патернів типу `cf/*`), для single-package — корінь cwd.
|
|
4
|
-
* Спільна утиліта для coverage-провайдера js
|
|
4
|
+
* Спільна утиліта для coverage-провайдера js і test-концерну stryker_config (DRY).
|
|
5
5
|
*/
|
|
6
6
|
import { existsSync } from 'node:fs'
|
|
7
7
|
import { glob, readFile } from 'node:fs/promises'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "auto": ["js
|
|
1
|
+
{ "auto": ["js"], "worktree": true }
|
package/skills/lint/SKILL.md
CHANGED
|
@@ -52,7 +52,7 @@ bun run lint
|
|
|
52
52
|
| **oxlint / ESLint** | `.oxlintrc.json` → `ignorePatterns`; `eslint.config.js` → `ignores`; `eslint-disable` / `oxlint-disable` у коді |
|
|
53
53
|
| **інше** | `.v8rignore`, `.stylelintignore`, `.trufflehog-exclude`, розширення `ignores` у workflow-конфігах |
|
|
54
54
|
|
|
55
|
-
Політика узгоджена з **`.cursor/rules/`** (зокрема **n-js
|
|
55
|
+
Політика узгоджена з **`.cursor/rules/`** (зокрема **n-js**, **n-text**): виняток допустимий лише з **обґрунтованою** причиною, не як заміна рефакторингу для справжніх клонів / дублікатів.
|
|
56
56
|
|
|
57
57
|
### Коли обовʼязково питати користувача
|
|
58
58
|
|
|
@@ -109,7 +109,7 @@ bun run lint
|
|
|
109
109
|
- **oxlint**: **`--threads=1`**, якщо потрібно зменшити навантаження на CPU.
|
|
110
110
|
- **ESLint cache**: **`--cache`** / **`--cache-location .eslintcache`** — менше повторного читання з диска.
|
|
111
111
|
|
|
112
|
-
Канонічний рядок **`lint-js`** у репозиторіях з **`check js
|
|
112
|
+
Канонічний рядок **`lint-js`** у репозиторіях з **`check js`** фіксований; додаткові прапорці — з узгодженням канону або в споживацькому проєкті окремо.
|
|
113
113
|
|
|
114
114
|
## Примітка
|
|
115
115
|
|
|
@@ -242,7 +242,7 @@ description: >-
|
|
|
242
242
|
|
|
243
243
|
# Обмеження
|
|
244
244
|
|
|
245
|
-
- Дотриматись `.cursor/rules/n-js
|
|
245
|
+
- Дотриматись `.cursor/rules/n-js.mdc` і `.cursor/rules/n-changelog.mdc`
|
|
246
246
|
(зміни у workspace = change-файл, не ручний CHANGELOG/version bump).
|
|
247
247
|
- Якщо `eslint ^9` офіційно не підтримує Node 25 — підняти peer range.
|
|
248
248
|
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: fix.mjs
|
|
4
|
-
resource: npm/rules/js-lint-ci/fix.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 38cf876b
|
|
7
|
-
score: 100
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
Файл застосовує визначене правило до вхідного контексту прогону. Застосовує правило та повертає отриманий результат.
|
|
11
|
-
|
|
12
|
-
## Поведінка
|
|
13
|
-
|
|
14
|
-
1. Запуск правила.
|
|
15
|
-
- Приймає контекст прогону.
|
|
16
|
-
- Виконує правило.
|
|
17
|
-
- Повертає результат.
|
|
18
|
-
|
|
19
|
-
## Публічний API
|
|
20
|
-
|
|
21
|
-
run — запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
22
|
-
Library mode — викликається CLI orchestration через `import + run`.
|
|
23
|
-
|
|
24
|
-
## Гарантії поведінки
|
|
25
|
-
|
|
26
|
-
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
27
|
-
- Кешує результати в межах одного прогону.
|
|
28
|
-
- Не звертається до мережі.
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: Directory Index
|
|
3
|
-
title: npm/rules/js-lint-ci
|
|
4
|
-
resource: npm/rules/js-lint-ci/
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# npm/rules/js-lint-ci
|
|
8
|
-
|
|
9
|
-
| Файл | Тип |
|
|
10
|
-
| ------------------- | --------- |
|
|
11
|
-
| [fix.mjs](fix.md) | JS Module |
|
|
12
|
-
| [main.mjs](main.md) | JS Module |
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: main.mjs
|
|
4
|
-
resource: npm/rules/js-lint-ci/main.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 59cd2fd3
|
|
7
|
-
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
score: 100
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
|
-
Модуль надає інструменти для глибокого аналізу коду. Функція `run` виконує перевірку коду відповідно до заданого контексту прогону. Функція `lint` порівнює файли репозиторію для виявлення дублікатів та неіспользумого коду.
|
|
14
|
-
|
|
15
|
-
## Поведінка
|
|
16
|
-
|
|
17
|
-
run виконує перевірку на основі контексту прогону.
|
|
18
|
-
lint виконує крос-файловий аналіз репозиторію на дублікати та мертвий код.
|
|
19
|
-
|
|
20
|
-
## Публічний API
|
|
21
|
-
|
|
22
|
-
run — точка входу для виконання правила, що включає перевірку логіки застосування (JS-занепокложення $\to$ політика $\to$ посилання MDC) та аналіз коду (jscpd + knip) по всьому репозиторію.
|
|
23
|
-
lint — аналіз коду по всьому репозиторію на наявність дублікатів (jscpd) та мертвого коду (knip).
|
|
24
|
-
|
|
25
|
-
## Гарантії поведінки
|
|
26
|
-
|
|
27
|
-
- Read-only: не виконує операцій запису (ФС/БД).
|