@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.
Files changed (72) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +1 -1
  3. package/rules/doc-files/js/docgen-scan.mjs +4 -2
  4. package/rules/doc-files/js/docs/docgen-extract.md +10 -10
  5. package/rules/doc-files/js/docs/docgen-judge-measure.md +10 -10
  6. package/rules/doc-files/js/docs/docgen-judge.md +13 -11
  7. package/rules/doc-files/js/docs/docgen-scan.md +28 -27
  8. package/rules/doc-files/js/docs/index.md +15 -16
  9. package/rules/feedback/feedback.mdc +3 -3
  10. package/rules/ga/ga.mdc +1 -1
  11. package/rules/ga/policy/workflow_common/workflow_common.rego +3 -3
  12. package/rules/{js-lint → js}/coverage/coverage.mjs +7 -7
  13. package/rules/{js-lint → js}/docs/fix.md +1 -1
  14. package/rules/{js-lint → js}/docs/index.md +3 -3
  15. package/rules/{js-lint → js}/docs/main.md +1 -1
  16. package/rules/{js-lint → js}/js/check.mjs +10 -10
  17. package/rules/{js-lint → js}/js/docs/check.md +3 -3
  18. package/rules/{js-lint → js}/js/docs/index.md +3 -3
  19. package/rules/{js-lint → js}/js/docs/lint-findings.md +1 -1
  20. package/rules/{js-lint → js}/js/docs/tooling.md +1 -1
  21. package/rules/{js-lint → js}/js/docs/utils_imports.md +8 -8
  22. package/rules/{js-lint → js}/js/tooling.mjs +1 -1
  23. package/rules/{js-lint → js}/js/utils_imports.mjs +3 -3
  24. package/rules/{js-lint/js-lint.mdc → js/js.mdc} +30 -6
  25. package/rules/{js-lint → js}/main.mjs +22 -5
  26. package/rules/{js-lint → js}/policy/jscpd/jscpd.rego +4 -4
  27. package/rules/{js-lint → js}/policy/jscpd/target.json +1 -1
  28. package/rules/{js-lint → js}/policy/lint_js_yml/lint_js_yml.rego +6 -6
  29. package/rules/{js-lint → js}/policy/lint_js_yml/template/lint-js.yml.snippet.yml +1 -1
  30. package/rules/{js-lint → js}/policy/package_json/package_json.rego +7 -7
  31. package/rules/{js-lint → js}/policy/vscode_extensions/target.json +1 -1
  32. package/rules/{js-lint → js}/policy/vscode_extensions/vscode_extensions.rego +2 -2
  33. package/rules/js-run/lib/docs/conn-file-rules.md +1 -1
  34. package/rules/npm-module/js/docs/header_doc_pointer.md +23 -13
  35. package/rules/python/docs/main.md +10 -10
  36. package/rules/rust/docs/main.md +7 -7
  37. package/rules/style-lint/js/tooling.mjs +1 -1
  38. package/rules/test/js/docs/stryker_config.md +1 -1
  39. package/rules/test/js/stryker_config.mjs +4 -4
  40. package/rules/test/js/vitest-config-pool-forks.mjs +1 -1
  41. package/rules/test/test.mdc +4 -4
  42. package/rules/text/docs/main.md +8 -8
  43. package/rules/text/js/docs/cspell-fix.md +8 -8
  44. package/rules/text/js/docs/index.md +0 -1
  45. package/scripts/lib/docs/discover-checkable-rules.md +2 -2
  46. package/scripts/lib/docs/run-lint.md +6 -6
  47. package/scripts/lib/fix/docs/analyze-escalation.md +28 -15
  48. package/scripts/lib/fix/docs/orchestrator.md +14 -15
  49. package/scripts/lib/fix/docs/t0.md +8 -7
  50. package/scripts/lib/gha-workflow.mjs +1 -1
  51. package/scripts/lib/timing-summary.mjs +1 -1
  52. package/scripts/sync-setup-bun-deps-action.mjs +1 -1
  53. package/scripts/utils/resolve-js-root.mjs +1 -1
  54. package/skills/coverage-fix/meta.json +1 -1
  55. package/skills/lint/SKILL.md +2 -2
  56. package/skills/llm-patch/SKILL.md +1 -1
  57. package/rules/js-lint-ci/docs/fix.md +0 -28
  58. package/rules/js-lint-ci/docs/index.md +0 -12
  59. package/rules/js-lint-ci/docs/main.md +0 -27
  60. package/rules/js-lint-ci/js/docs/index.md +0 -11
  61. package/rules/js-lint-ci/js-lint-ci.mdc +0 -45
  62. package/rules/js-lint-ci/main.mjs +0 -33
  63. package/rules/js-lint-ci/meta.json +0 -1
  64. /package/rules/{js-lint → js}/js/data/tooling/knip-canonical.json +0 -0
  65. /package/rules/{js-lint → js}/js/data/tooling/oxlint-canonical.json +0 -0
  66. /package/rules/{js-lint → js}/js/lint-findings.mjs +0 -0
  67. /package/rules/{js-lint → js}/meta.json +0 -0
  68. /package/rules/{js-lint → js}/policy/jscpd/template/.jscpd.json.snippet.json +0 -0
  69. /package/rules/{js-lint → js}/policy/lint_js_yml/target.json +0 -0
  70. /package/rules/{js-lint → js}/policy/package_json/target.json +0 -0
  71. /package/rules/{js-lint → js}/policy/package_json/template/package.json.snippet.json +0 -0
  72. /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-lint.mdc); legacy
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-lint має бути enabled
336
- if (!config.rules.includes('js-lint') || config.disableRules.includes('js-lint')) {
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-lint enabled, але кореневий package.json не знайдено (test.mdc)')
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-lint.mdc), але legacy `.js` лишається
11
+ // Канонічна назва — `.mjs` (нові файли, js.mdc), але legacy `.js` лишається
12
12
  // валідним. Перший знайдений виграє: `.mjs` пріоритетніший.
13
13
  const VITEST_CONFIG_NAMES = ['vitest.config.mjs', 'vitest.config.js']
14
14
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: JS-тести (*.test.mjs) живуть у tests/. Правило `test` керує stryker.config.mjs + vitest.config.mjs (якщо js-lint enabled) і .cargo/mutants.toml (якщо rust enabled).
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-lint`, `rust`, у майбутньому `python` тощо). Оркестратор — у `npm/rules/test/coverage/coverage.mjs`.
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-lint` — правило `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` приводиться до фактичного імені.
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-lint` enabled, концерн `stryker_config` без дублювання додає у кореневий `.gitignore` тест-патерни:
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` у тому ж прогоні.
@@ -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: deba6201
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-обгортка над канонічним `lint-text` (text.mdc) забезпечує послідовний пайплайн перевірок для текстових файлів. Вона автоматично встановлює необхідні інструменти (`shellcheck`, `dotenv-linter`) через `ensureTool` (brew/scoop/GitHub Release per-platform) та перевіряє наявність `patch` для авто-фіксу. Пайплайн послідовно виконує: перевірку правопису (`cspell` з `@nitra/cspell-dict`), синтаксичну перевірку скриптів (`shellcheck` з авто-фіксом), перевірку конфігураційних файлів (`dotenv-linter` з авто-фіксом), форматування Markdown (`markdownlint-cli2` з авто-фіксом) та валідацію схем (`v8r`). Перший ненульовий код, отриманий у ланцюжку, повертається як код виходу, припиняючи подальші кроки. Функціональність експортується як `runLintTextCli` та викликається через `n-cursor lint text` (оркестраторний адаптер `lint`). Конфігурації, на які спирається код: meta.json.
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: Викликається як check-поверхня, виконуючи стандартне правило.
18
- runLintTextCli: Виконує повний ланцюжок перевірок для тексту: `cspell`, `shellcheck`, `dotenv-linter`, `markdownlint-cli2` та валідацію схем через `v8r`. Автоматично встановлює `shellcheck` та `dotenv-linter` при першому прогоні. Повертає код першого кроку, що не пройшов.
19
- lint: Делегує виконання повного ланцюжка перевірок тексту через `runLintTextCli`, дозволяючи вказати режим лише детектування без авто-фіксу.
17
+ run виконує стандартну перевірку, використовуючи контекст прогону.
18
+ runLintTextCli виконує повний ланцюжок перевірок тексту (cspell, shellcheck, dotenv-linter, markdownlint, v8r), автоматично встановлюючи необхідні інструменти, і повертає код першого порушення.
19
+ lint делегує виклик `runLintTextCli` для виконання повного ланцюжка перевірок тексту.
20
20
 
21
21
  ## Публічний API
22
22
 
23
- run — Точка входу правила, що виконує перевірку логіки (JS-занепокложення політика посилання text.mdc).
24
- runLintTextCli — Публічна команда для CLI, яка серіалізує завдання лінтування з блокуванням та усуває дублікати на основі стану репозиторію.
25
- lint — Адаптер, що керує запуском лінтування тексту через `n-cursor lint text`, делегуючи роботу `runLintTextCli`.
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: 7b40e8f9
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
- Виявляє невідомі слова у тексті у ланцюжку lint-text із omlx-класифікацією (спека docs/specs/2026-06-15-opportunistic-llm-fix-tier.md), використовуючи конфігурації .cspell.json та meta.json. Класифікує знахідки за схемою omlx-класифікація, дописуючи валідні терміни до словника .cspell.json. Ймовірні одруки залишаються списком на рев'ю, оскільки fix-режим не переписує файли. Завершує процес повторною перевіркою, щоб визначити, чи залишилися нерозкласифіковані або ймовірні одруки. Перехоплює помилки (fail-safe), не кидаючи винятків назовні.
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 витягує унікальні невідомі слова з виводу cspell.
18
- appendWordsToDict додає класифіковані валідні слова до файлу .cspell.json, оновлюючи його словник.
19
- runCspellText запускає cspell для виявлення невідомих слів, а при увімкненні omlx-класифікації класифікує їх та дописує валідні слова у словник, після чого повторно перевіряє наявність помилок.
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 — Збирає унікальні слова, які не були знайдені у словнику cspell.
24
- appendWordsToDict — Додає зібрані слова до файлу `.cspell.json#words` у відсортованому та унікальному вигляді для перегляду у Git.
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-lint', 'n-js-lint')
149
- // rule.id === 'n-js-lint'
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: dd80d058
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
- Модуль керує вибором та виконанням правил лінтування. Він визначає набір правил для лінтування, спираючись на конфігурації `meta.json` та `.n-cursor.json`. Публічна функція `selectLintRules` вибирає та сортує ці правила на основі їхньої лінт-поверхні. Публічна функція `runLint` ініціює виконання визначеного набору правил, перевіряючи змінені файли або весь репозиторій.
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: 5a586df6
6
+ crc: f26cd4c7
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Аналітика escalation-логу fix-конформності. Читає записи рунгів драбини (`escalation-log.mjs`) — весь лог або записи одного прогону (від байтового зсуву), — ділить на чанки за бюджетом символів і просить хмарну **avg**-модель запропонувати, як зменшити LLM-залежність: нові детерміновані T0-патерни, уточнення `.mdc`-інструкцій або зміни скриптів пакета. Результат — markdown-звіт у `.n-cursor/fix-escalation-analysis.md` (append із timestamp). Викликається CLI `n-cursor analyze-escalation` (весь лог) і наприкінці `lint --full` (записи прогону).
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
- `readEscalationRecords` читає JSONL від байтового зсуву (зсув на межі рядка — мультибайт не б'ється; биті рядки пропускаються); `escalationLogSize` дає зсув для scope «цей прогін». `chunkRecords` стискає записи й ділить на чанки, щоб JSON кожного не перевищив бюджет. `analyzeEscalations` (синхронний — callLlm spawnSync-based) робить виклик avg-моделі по кожному чанку, а за кількох чанків — фінальний синтез; помилки моделі ковтаються в `null` (аналіз не валить lint). `maybeAnalyzeEscalation` — хук lint: gated kill-switch `N_CURSOR_FIX_ANALYZE`, наявністю `CLOUD_AVG` і записів.
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
- - `summarizeCalls(records)` лічильники фактичних викликів за тирами `{ local, cloudMin, cloudAvg }` (skip-записи avg-кепу не рахуються).
20
- - `reportRunStats(sinceOffset, log)` друкує резюме викликів моделей за прогін (no-op, якщо викликів не було).
21
- - `analysisEnabled()` чи дозволено авто-аналіз (kill-switch `N_CURSOR_FIX_ANALYZE`).
22
- - `escalationLogSize(path?)` розмір логу в байтах (since-offset).
23
- - `readEscalationRecords(path, sinceOffset?)` записи від зсуву.
24
- - `chunkRecords(records, maxChars?)` чанки стиснених записів.
25
- - `analyzeEscalations(records, opts?)` `{ report, chunks, reason }`; `opts.callLlm` інжектовний.
26
- - `analysisReportPath(cwd?)` / `writeAnalysisReport(report, cwd, ts)` шлях/запис звіту.
27
- - `runEscalationAnalysisCli(args, cwd?)` CLI: весь лог звіт.
28
- - `maybeAnalyzeEscalation(cwd, sinceOffset, log)` хук наприкінці `lint --full`.
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
- - Звертається до мережі лише при виклику avg-моделі (через pi/omlx за префіксом model-id).
33
- - Помилки виклику моделі перехоплює (fail-safe): аналіз не впливає на exit-код lint.
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: fbc91330
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
- Модуль керує процесом вирішення порушень за допомогою багаторівневої системи ескалації. Він збирає послідовність рівнів моделей, починаючи з локальних і закінчуючи хмарними. Модуль парсить параметри запуску за допомогою `parseOrchestratorArgs` та виконує повний цикл фіксації, застосовуючи детермінований фікс. Для невирішених проблем застосовується ескалація правил через `escalateRule`, а фінальний запуск оркестратора здійснюється через `runOrchestratorCli`, який використовує структуру, побудовану за допомогою `buildLadder`.
13
+ Модуль відповідає за управління процесом виправлення порушень. Він будує послідовність тирів ескалації за допомогою `buildLadder`, парсить аргументи командного рядка за допомогою `parseOrchestratorArgs` та запускає повний цикл виправлення за допомогою `runOrchestratorCli`. Цей цикл включає автоматичний фікс та ескалацію через LLM-моделі, що реалізується функцією `escalateRule`.
14
14
 
15
15
  ## Поведінка
16
16
 
17
17
  buildLadder будує послідовність тирів ескалації для вирішення порушень, від локальних мінімальних моделей до хмарних середніх моделей.
18
- escalateRule проводить один прохід по послідовності тирів, намагаючись вирішити порушення, і повертає статус вирішення та використаний бюджет хмарних викликів.
19
- parseOrchestratorArgs парсить аргументи командного рядка для визначення максимального бюджету хмарних викликів та фільтра правил.
20
- runOrchestratorCli виконує повний цикл фіксації: перевіряє правила, застосовує детермінований фікс (T0-auto), а потім використовує LLM-драбину ескалації для невирішених порушень.
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: 49c0669b
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 паттернів до виводів порушень. Він визначає, які правила можуть бути оброблені автоматично, використовуючи конфігурації з `extensions.json` та `package-lock.json`. Функціонал реалізовано через публічні функції: `filterT0AutoRules` для визначення правил, `applyT0Auto` для автоматичного застосування паттернів до виводів, та `runT0AutoCli` для запуску процесу. Модуль працює у режимі fail-safe, перехоплюючи помилки та не кидаючи винятків назовні, надаючи звіт про застосовані автоматичні виправлення.
13
+ Модуль керує автоматичним застосуванням паттернів T0-auto до виводів порушень. Він використовує конфігурації з `extensions.json` та `package-lock.json` для визначення правил. Модуль фільтрує правила, які можуть бути автоматично оброблені, застосовує паттерни за допомогою `applyT0Auto`, а потім запускає повний цикл перевірки для всіх провальних правил через `runT0AutoCli`. Усі операції виконуються з механізмом fail-safe, що запобігає виникненню винятків назовні.
14
14
 
15
15
  ## Поведінка
16
16
 
17
- applyT0Auto застосовує всі визначені T0-auto паттерни до одного виводу порушення, повертаючи результат застосування.
18
- filterT0AutoRules повертає список ID правил, для яких існує хоча б один T0-auto паттерн, виходячи з виводів порушень.
19
- runT0AutoCli запускає T0-auto для кожного провального правила, повторно перевіряє конформність та виводить підсумок.
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 — визначає, які правила мають принаймні один T0-auto шаблон, ґрунтуючись на виводі порушень у форматі JSON.
25
- runT0AutoCli — виконує команду `n-cursor fix-t0 [rule...]`, яка застосовує T0-auto до кожного порушення, повторно перевіряє check-gate та надає звіт.
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-lint, check-text, check-style-lint, check-npm-module замість
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-lint` / `lint-security`).
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-lint` / `text`
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-lint і test-концерну stryker_config (DRY).
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-lint"], "worktree": true }
1
+ { "auto": ["js"], "worktree": true }
@@ -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-lint**, **n-text**): виняток допустимий лише з **обґрунтованою** причиною, не як заміна рефакторингу для справжніх клонів / дублікатів.
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-lint`** фіксований; додаткові прапорці — з узгодженням канону або в споживацькому проєкті окремо.
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-lint.mdc` і `.cursor/rules/n-changelog.mdc`
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: не виконує операцій запису (ФС/БД).
@@ -1,11 +0,0 @@
1
- ---
2
- type: Directory Index
3
- title: npm/rules/js-lint-ci/js
4
- resource: npm/rules/js-lint-ci/js/
5
- ---
6
-
7
- # npm/rules/js-lint-ci/js
8
-
9
- | Файл | Тип |
10
- | ------------------- | --------- |
11
- | [lint.mjs](lint.md) | JS Module |