@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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [12.8.2] - 2026-06-22
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- ♻️ refactor(docs): Оновлення логіки та формату в документації
|
|
8
|
+
|
|
9
|
+
## [12.8.1] - 2026-06-22
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- ♻️ refactor(docs): Оновлення логіки та формату в документації
|
|
14
|
+
|
|
3
15
|
## [12.8.0] - 2026-06-21
|
|
4
16
|
|
|
5
17
|
### Added
|
package/package.json
CHANGED
|
@@ -115,9 +115,11 @@ export function scanOrphanedDocs(root) {
|
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
/**
|
|
118
|
+
/**
|
|
119
|
+
* Обходить дерево, шукаючи docs/-директорії для orphan-перевірки.
|
|
119
120
|
* docs/ — входимо завжди (батьківська пройшла ignore-перевірку);
|
|
120
|
-
* інші — перевіряємо через isDocgenIgnored.
|
|
121
|
+
* інші — перевіряємо через isDocgenIgnored.
|
|
122
|
+
*/
|
|
121
123
|
function walk(dir) {
|
|
122
124
|
let entries
|
|
123
125
|
try {
|
|
@@ -17,17 +17,17 @@ docgen:
|
|
|
17
17
|
1. Витягує факт-лист з вмісту файлу.
|
|
18
18
|
2. Визначає мову файлу за розширенням.
|
|
19
19
|
3. Якщо мова — Rust, виконує аналіз Rust-коду:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
а. Витягує модульний заголовок (`//!`).
|
|
21
|
+
б. Визначає публічні експорти (структури, функції, класи), виходячи з префіксів `pub` та атрибутів експозиції.
|
|
22
|
+
в. Визначає локальні (приватні) символи, які не є публічними.
|
|
23
|
+
г. Класифікує імпорти (`use`) як стандартні, зовнішні чи внутрішні.
|
|
24
|
+
д. Визначає поведінкові маркери (наприклад, чи є код лише для читання, чи обробляє помилки).
|
|
25
25
|
4. Якщо мова — JavaScript/TypeScript/MJS, виконує аналіз JS-коду:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
а. Витягує заголовок файлу.
|
|
27
|
+
б. Визначає публічні експорти з їхнім JSDoc.
|
|
28
|
+
в. Класифікує імпорти як стандартні, npm або внутрішні.
|
|
29
|
+
г. Визначає локальні символи (службові функції).
|
|
30
|
+
д. Визначає поведінкові маркери (наприклад, чи є код лише для читання, чи звертається до мережі).
|
|
31
31
|
5. Усі аналізи свідомо ігнорують шляхи: `.github`, `.git`, `node_modules`, `base/`, `ua/`, `.firebase`.
|
|
32
32
|
6. Повертає структуру фактів, що містить інформацію про файл.
|
|
33
33
|
|
|
@@ -10,21 +10,21 @@ docgen:
|
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Файл аналізує надані файли коду, створюючи документацію та оцінюючи її якість відповідно до конфігурації, що міститься у report.json. Процес збирає результати для кожного файлу, використовуючи кешування у межах прогону на основі вмісту джерела та вже згенерованої документації. У кінці процес агрегує дані та зберігає повний звіт у report.json, а також виводить його у консоль.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
1. Зчитує список файлів для аналізу з аргументів командного рядка.
|
|
18
18
|
2. Для кожного файлу зчитує його вміст.
|
|
19
|
-
3. Генерує документацію для файлу, використовуючи
|
|
20
|
-
4. Якщо
|
|
21
|
-
5. Якщо
|
|
22
|
-
6.
|
|
23
|
-
7.
|
|
24
|
-
8.
|
|
25
|
-
9.
|
|
26
|
-
10.
|
|
27
|
-
11.
|
|
19
|
+
3. Генерує документацію для файлу, використовуючи кешування за вмістом джерела.
|
|
20
|
+
4. Якщо генерація документації успішна і отриманий бал перевищує встановлений поріг, переходить до етапу оцінки.
|
|
21
|
+
5. Якщо бал не перевищує порогу, файл вважається "degraded" (зниженою якістю) і не підлягає подальшій оцінці.
|
|
22
|
+
6. Якщо бал перевищує поріг, документація передається для оцінки потужній моделі, використовуючи кешування за вмістом джерела та згенерованою документацією.
|
|
23
|
+
7. Оцінка повертає вердикт ("accurate", "generic" або "inaccurate"), впевненість та причину.
|
|
24
|
+
8. Збираються результати для кожного файлу.
|
|
25
|
+
9. Після обробки всіх файлів агрегуються результати: підраховуються загальні показники (кількість файлів, помилки генерації, кількість пройшлих тестів, розподіл вердиктів).
|
|
26
|
+
10. Зберігається звіт у файл `report.json` у каталозі кешу.
|
|
27
|
+
11. Виводиться консольний звіт про результати вимірювання.
|
|
28
28
|
|
|
29
29
|
## Гарантії поведінки
|
|
30
30
|
|
|
@@ -3,30 +3,32 @@ type: JS Module
|
|
|
3
3
|
title: docgen-judge.mjs
|
|
4
4
|
resource: npm/rules/doc-files/js/docgen-judge.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: fcbf72fa
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Модуль реалізує механізм оцінки якості документації. Він визначає модель для оцінки за допомогою `JUDGE_MODEL`, перевіряє статус активності гейту через `JUDGE_ENABLED` та встановлює поріг впевненості за допомогою `JUDGE_CONFIDENCE`. Модуль отримує, парсить та визначає фінальний статус документації, викликаючи `judgeDoc` для отримання висновків, а також може використовувати `judgeFailsDoc` для визначення провалу.
|
|
12
14
|
|
|
13
15
|
## Поведінка
|
|
14
16
|
|
|
15
17
|
JUDGE_MODEL — Вказує модель, яку використовує суддя для оцінки документації.
|
|
16
|
-
JUDGE_ENABLED — Позначає, чи
|
|
17
|
-
JUDGE_CONFIDENCE — Визначає
|
|
18
|
-
parseDocVerdict — Витягує та валідує об'єкт
|
|
19
|
-
judgeDoc —
|
|
18
|
+
JUDGE_ENABLED — Позначає, чи активний семантичний гейт судді.
|
|
19
|
+
JUDGE_CONFIDENCE — Визначає мінімальну впевненість, необхідну для позначення документації як деградованої.
|
|
20
|
+
parseDocVerdict — Витягує та валідує об'єкт оцінки з сирого текстового виводу судді.
|
|
21
|
+
judgeDoc — Зіставляє вміст вихідного файлу та згенеровану документацію, щоб отримати оцінку від судді.
|
|
20
22
|
judgeFailsDoc — Визначає, чи слід вважати документацію деградованою на основі оцінки судді.
|
|
21
23
|
|
|
22
24
|
## Публічний API
|
|
23
25
|
|
|
24
26
|
JUDGE_MODEL — Визначає модель-суддю як `N_CLOUD_MIN_MODEL` (хмарний мінімальний рівень).
|
|
25
|
-
JUDGE_ENABLED — Автоматично вмикає механізм
|
|
26
|
-
JUDGE_CONFIDENCE — Встановлює мінімальний рівень
|
|
27
|
-
parseDocVerdict — Витягує та перевіряє
|
|
28
|
-
judgeDoc — Оцінює згенерований документ потужною
|
|
29
|
-
judgeFailsDoc — Визначає, чи повинен документ бути позначений як
|
|
27
|
+
JUDGE_ENABLED — Автоматично вмикає механізм суддівства, якщо обрано `N_CLOUD_MIN_MODEL`.
|
|
28
|
+
JUDGE_CONFIDENCE — Встановлює мінімальний рівень впевненості для позначення документа як погіршеного (degraded) через неточність.
|
|
29
|
+
parseDocVerdict — Витягує та перевіряє JSON-вердикт із відповіді великої мовної моделі.
|
|
30
|
+
judgeDoc — Оцінює згенерований документ потужною моделлю порівняно з оригінальним джерелом.
|
|
31
|
+
judgeFailsDoc — Визначає, чи повинен документ бути позначений як погіршений, якщо вердикт є `inaccurate` і впевненість достатня.
|
|
30
32
|
|
|
31
33
|
## Гарантії поведінки
|
|
32
34
|
|
|
@@ -3,47 +3,48 @@ type: JS Module
|
|
|
3
3
|
title: docgen-scan.mjs
|
|
4
4
|
resource: npm/rules/doc-files/js/docgen-scan.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 563b7722
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль
|
|
13
|
+
Модуль визначає, які файли є кодовим джерелом за допомогою `isSourceFile`. Він обчислює відповідні шляхи до Markdown-документів для коду за допомогою `docPathForSource`. Модуль ідентифікує потенційні кандидати для документування за допомогою `isDocCandidate` та надає опис файлу за допомогою `describeFile`. Для аналізу файлової системи використовуються `scanOrphanedDocs` для пошуку "сирітських" документів та `scanForDocFiles` для сканування файлів. Модуль також може визначати кореневий каталог за допомогою `resolveRoot` та виконувати сканування файлів документації через `runDocFilesScanCli` або перевірку через `runDocFilesCheckCli`.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
isSourceFile визначає, чи є ім'я файлу кодовим джерелом для документування.
|
|
18
|
-
docPathForSource обчислює шлях до відповідного
|
|
19
|
-
isDocCandidate визначає, чи
|
|
20
|
-
describeFile описує кодовий файл, надаючи
|
|
21
|
-
scanOrphanedDocs знаходить
|
|
22
|
-
scanForDocFiles рекурсивно
|
|
23
|
-
resolveRoot
|
|
18
|
+
docPathForSource обчислює шлях до відповідного md-документа для заданого кодового файлу.
|
|
19
|
+
isDocCandidate визначає, чи є файл кандидатом на документування, враховуючи розширення, статус тесту та ігнорування.
|
|
20
|
+
describeFile описує кодовий файл, надаючи шлях джерела, шлях доки та стан застарілості.
|
|
21
|
+
scanOrphanedDocs знаходить md-документи, які посилаються на джерела, що більше не існують.
|
|
22
|
+
scanForDocFiles рекурсивно сканує дерево і повертає список кодових файлів зі станом застарілості, відфільтрований за ігноруванням Git.
|
|
23
|
+
resolveRoot визначає абсолютний корінь обходу, використовуючи аргументи або поточний робочий каталог.
|
|
24
24
|
runDocFilesScanCli сканує дерево і друкує JSON-масив усіх кодових файлів зі станом застарілості.
|
|
25
|
-
runDocFilesCheckCli виконує перевірку застарілості,
|
|
25
|
+
runDocFilesCheckCli виконує перевірку застарілості, що може бути використана для хуків, Git-гейтів або ручного переліку шляхів.
|
|
26
26
|
|
|
27
27
|
## Публічний API
|
|
28
28
|
|
|
29
|
-
isSourceFile — визначає, чи є файл
|
|
30
|
-
docPathForSource — визначає шлях до
|
|
31
|
-
isDocCandidate — вирішує, чи повинен кодовий файл бути
|
|
32
|
-
describeFile — надає опис кодового файлу, включаючи його
|
|
33
|
-
scanOrphanedDocs —
|
|
34
|
-
scanForDocFiles — рекурсивно
|
|
35
|
-
resolveRoot — встановлює кореневу директорію для сканування, використовуючи аргумент командного рядка або поточну
|
|
36
|
-
runDocFilesScanCli — сканує дерево та виводить JSON-масив усіх кодових файлів зі статусом
|
|
37
|
-
runDocFilesCheckCli — виконує перевірку застарілості для
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
isSourceFile — визначає, чи є файл вихідним кодом для створення документації.
|
|
30
|
+
docPathForSource — визначає шлях до файлу документації, розміщений у теці `docs/` відносно коду.
|
|
31
|
+
isDocCandidate — вирішує, чи повинен кодовий файл бути документований (правильне розширення, не тест, не ігнорується, не системний).
|
|
32
|
+
describeFile — надає опис кодового файлу, включаючи його шлях та статус застарілості.
|
|
33
|
+
scanOrphanedDocs — знаходить файли документації, які посилаються на вихідний код, що більше не існує.
|
|
34
|
+
scanForDocFiles — рекурсивно шукає всі кодові файли у заданому дереві та визначає їхній статус застарілості.
|
|
35
|
+
resolveRoot — встановлює кореневу директорію для сканування, використовуючи аргумент командного рядка або поточну директорію.
|
|
36
|
+
runDocFilesScanCli — сканує дерево та виводить JSON-масив усіх кодових файлів зі статусом застарілості.
|
|
37
|
+
runDocFilesCheckCli — виконує перевірку застарілості файлів для хуків та командного інтерфейсу.
|
|
38
|
+
|
|
39
|
+
**Режими роботи:**
|
|
40
|
+
`--hook` — перевіряє один файл, отриманий із вхідного JSON, у контексті хука.
|
|
41
|
+
`--git` — порівнює файли у `git diff` та блокує виконання, якщо знайдено застарілі файли, перевищуючи встановлений ліміт.
|
|
42
|
+
`--degraded` — генерує звіт про файли документації, які не відповідають встановленому рівню якості.
|
|
43
|
+
`<paths…>` — обробляє лише вказані явно шляхи-джерела.
|
|
44
|
+
|
|
45
|
+
**Коди виходу:**
|
|
46
|
+
Вихід 2 — вказує на знаходження застарілих файлів (для блокування хука).
|
|
47
|
+
Вихід 0 — вказує на відсутність застарілих файлів або проходження перевірки згідно з лімітом.
|
|
47
48
|
|
|
48
49
|
## Гарантії поведінки
|
|
49
50
|
|
|
@@ -6,20 +6,19 @@ resource: npm/rules/doc-files/js/
|
|
|
6
6
|
|
|
7
7
|
# npm/rules/doc-files/js
|
|
8
8
|
|
|
9
|
-
| Файл
|
|
10
|
-
|
|
11
|
-
| [docgen-crc.mjs](docgen-crc.md)
|
|
9
|
+
| Файл | Тип |
|
|
10
|
+
|---|---|
|
|
11
|
+
| [docgen-crc.mjs](docgen-crc.md) | JS Module |
|
|
12
12
|
| [docgen-extract-anchors.mjs](docgen-extract-anchors.md) | JS Module |
|
|
13
|
-
| [docgen-extract.mjs](docgen-extract.md)
|
|
14
|
-
| [docgen-files-batch.mjs](docgen-files-batch.md)
|
|
15
|
-
| [docgen-gen.mjs](docgen-gen.md)
|
|
16
|
-
| [docgen-ignore.mjs](docgen-ignore.md)
|
|
17
|
-
| [docgen-judge-measure.mjs](docgen-judge-measure.md)
|
|
18
|
-
| [docgen-judge.mjs](docgen-judge.md)
|
|
19
|
-
| [docgen-prompts.mjs](docgen-prompts.md)
|
|
20
|
-
| [docgen-scan.mjs](docgen-scan.md)
|
|
21
|
-
| [lint.mjs](lint.md)
|
|
22
|
-
| [
|
|
23
|
-
| [units-
|
|
24
|
-
| [units
|
|
25
|
-
| [units.mjs](units.md) | JS Module |
|
|
13
|
+
| [docgen-extract.mjs](docgen-extract.md) | JS Module |
|
|
14
|
+
| [docgen-files-batch.mjs](docgen-files-batch.md) | JS Module |
|
|
15
|
+
| [docgen-gen.mjs](docgen-gen.md) | JS Module |
|
|
16
|
+
| [docgen-ignore.mjs](docgen-ignore.md) | JS Module |
|
|
17
|
+
| [docgen-judge-measure.mjs](docgen-judge-measure.md) | JS Module |
|
|
18
|
+
| [docgen-judge.mjs](docgen-judge.md) | JS Module |
|
|
19
|
+
| [docgen-prompts.mjs](docgen-prompts.md) | JS Module |
|
|
20
|
+
| [docgen-scan.mjs](docgen-scan.md) | JS Module |
|
|
21
|
+
| [run-lint.mjs](run-lint.md) | JS Module |
|
|
22
|
+
| [units-js.mjs](units-js.md) | JS Module |
|
|
23
|
+
| [units-rs.mjs](units-rs.md) | JS Module |
|
|
24
|
+
| [units.mjs](units.md) | JS Module |
|
|
@@ -29,7 +29,7 @@ version: '1.0'
|
|
|
29
29
|
Кожен пункт — за схемою:
|
|
30
30
|
|
|
31
31
|
- **target** — `rule` | `skill` | `check`
|
|
32
|
-
- **id** — який саме (`lint`, `text`, `js
|
|
32
|
+
- **id** — який саме (`lint`, `text`, `js`, …)
|
|
33
33
|
- **kind** — `ambiguous-doc` | `missing-check` | `false-positive` | `no-autofix` | `recurring-pattern`
|
|
34
34
|
- **evidence** — конкретний `файл:рядок` або вивід команди з цього запуску
|
|
35
35
|
- **suggestion** — запропонована зміна
|
|
@@ -42,8 +42,8 @@ version: '1.0'
|
|
|
42
42
|
- skill `n-lint`, `ambiguous-doc` — крок 2 не каже, як діяти при частковому autofix
|
|
43
43
|
evidence: `oxlint --fix` лишив 3 no-autofix-помилки
|
|
44
44
|
suggestion: додати в SKILL.md підпункт про частковий autofix
|
|
45
|
-
- rule `js
|
|
46
|
-
evidence: jscpd впав, але `check js
|
|
45
|
+
- rule `js`, `missing-check` — немає програмної перевірки jscpd-порогу
|
|
46
|
+
evidence: jscpd впав, але `check js` цього не ловить
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
## Ефемерність — обовʼязково
|
package/rules/ga/ga.mdc
CHANGED
|
@@ -138,4 +138,4 @@ CLI робить preflight на `shellcheck` і `uv` (`uvx`) у `PATH`, поті
|
|
|
138
138
|
|
|
139
139
|
**MegaLinter:** не використовувати; прибрати workflow, конфіги (`.mega-linter.yml`, `.megalinter.yaml`, `.mega-linter.yaml`), залежності та згадки в CI / pre-commit / документації.
|
|
140
140
|
|
|
141
|
-
**`depcheck`:** не використовувати у `.github/workflows/*.yml` — мігровано на `knip` (див. `js
|
|
141
|
+
**`depcheck`:** не використовувати у `.github/workflows/*.yml` — мігровано на `knip` (див. `js.mdc`). Перевірка невикористаних залежностей виконується разом з рештою лінтерів у `lint-js`, окремий крок `npx depcheck` у workflow не потрібен і блокується полісі `ga.workflow_common`.
|
|
@@ -34,7 +34,7 @@ forbidden_step_substrings := {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
# Заборонені бінарки у `run:` кроках (ga.mdc). `depcheck` мігровано на `knip`
|
|
37
|
-
# у `
|
|
37
|
+
# у `js.mdc` — окремий крок у workflow не потрібен. Регексп ловить виклики
|
|
38
38
|
# через `npx`, `bunx`, `npm exec`, або як standalone-команду на початку рядка.
|
|
39
39
|
forbidden_run_command_patterns := {"depcheck": `(?:^|[\s;&|])(?:npx|bunx|npm exec|pnpm exec)?[ \t]*depcheck\b`}
|
|
40
40
|
|
|
@@ -62,7 +62,7 @@ min_uses_version_template := concat(" ", [
|
|
|
62
62
|
|
|
63
63
|
forbidden_run_command_template := concat(" ", [
|
|
64
64
|
"jobs.%s.steps[%d]: `%s` заборонено у workflow —",
|
|
65
|
-
"мігровано на knip (js
|
|
65
|
+
"мігровано на knip (js.mdc, ga.mdc)",
|
|
66
66
|
])
|
|
67
67
|
|
|
68
68
|
# ── Аліаси на input ────────────────────────────────────────────────────────
|
|
@@ -90,7 +90,7 @@ deny contains msg if {
|
|
|
90
90
|
|
|
91
91
|
# ── deny: depcheck у будь-якому `run:` ────────────────────────────────────
|
|
92
92
|
#
|
|
93
|
-
# `depcheck` мігровано на `knip` (js
|
|
93
|
+
# `depcheck` мігровано на `knip` (js.mdc); `knip` вже запускається у lint-js
|
|
94
94
|
# CI як частина `bunx knip` у скрипті, тож окремий depcheck-крок зайвий і має
|
|
95
95
|
# бути видалений з workflow-файлів.
|
|
96
96
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* JS-провайдер для `n-cursor coverage`: збирає метрики покриття (`vitest run --coverage`)
|
|
3
3
|
* і мутаційного тестування (Stryker з vitest-runner + perTest) для JS/TS коду.
|
|
4
|
-
* Активується через `js
|
|
4
|
+
* Активується через `js` правило в `.n-cursor.json#rules`; реальна applies-логіка
|
|
5
5
|
* — у `detect(cwd)`.
|
|
6
6
|
*
|
|
7
7
|
* Контракт провайдера — у docs/superpowers/specs/2026-05-24-coverage-rule-design.md.
|
|
@@ -42,7 +42,7 @@ export function scopeToRoot(changedFiles, cwd, jsRoot) {
|
|
|
42
42
|
return out
|
|
43
43
|
}
|
|
44
44
|
const VITEST_HINT =
|
|
45
|
-
'js
|
|
45
|
+
'js coverage: vitest відсутній у package.json — додай `vitest`, `@vitest/coverage-v8` та `@stryker-mutator/vitest-runner` у devDependencies (див. test.mdc)'
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* Чи у пакеті встановлено vitest (через dependencies або devDependencies).
|
|
@@ -334,7 +334,7 @@ async function collectOneRoot(jsRoot, cwd, runner, scope = null) {
|
|
|
334
334
|
const mutateSrc = scope ? scope.files.filter(f => !TEST_FILE.test(f)) : null
|
|
335
335
|
|
|
336
336
|
// 1. Coverage через vitest run --passWithNoTests --coverage (+ --changed у changed-режимі)
|
|
337
|
-
const lcovDir = await mkdtemp(join(tmpdir(), 'js-
|
|
337
|
+
const lcovDir = await mkdtemp(join(tmpdir(), 'js-cov-'))
|
|
338
338
|
let coverage
|
|
339
339
|
try {
|
|
340
340
|
const code = await runner.runJsCoverage(scope ? { cwd: jsRoot, lcovDir, base: scope.base } : { cwd: jsRoot, lcovDir })
|
|
@@ -364,7 +364,7 @@ async function collectOneRoot(jsRoot, cwd, runner, scope = null) {
|
|
|
364
364
|
const mutationPath = join(jsRoot, 'reports', 'stryker', 'mutation.json')
|
|
365
365
|
if (!existsSync(mutationPath)) {
|
|
366
366
|
throw new Error(
|
|
367
|
-
'js
|
|
367
|
+
'js coverage: stryker не залишив mutation.json — ' +
|
|
368
368
|
'запусти `npx @nitra/cursor fix test` для встановлення canonical stryker.config.mjs, ' +
|
|
369
369
|
'або налаштуй його вручну'
|
|
370
370
|
)
|
|
@@ -411,7 +411,7 @@ export async function collect(cwd, opts = {}) {
|
|
|
411
411
|
const runner = opts.runner ?? defaultRunner
|
|
412
412
|
const changed = Array.isArray(opts.changedFiles)
|
|
413
413
|
const jsRoots = await resolveAllJsRoots(cwd)
|
|
414
|
-
if (jsRoots.length === 0) throw new Error('js
|
|
414
|
+
if (jsRoots.length === 0) throw new Error('js coverage: package.json не знайдено')
|
|
415
415
|
|
|
416
416
|
const results = []
|
|
417
417
|
for (const jsRoot of jsRoots) {
|
|
@@ -429,9 +429,9 @@ export async function collect(cwd, opts = {}) {
|
|
|
429
429
|
// Changed-режим: нема змінених JS у жодному root → тихо порожньо (це pass, не помилка).
|
|
430
430
|
if (changed) return []
|
|
431
431
|
console.error(
|
|
432
|
-
'js
|
|
432
|
+
'js coverage: жоден workspace не має тестів ' +
|
|
433
433
|
'(`*.test.{js,mjs}` у `tests/` або поряд із джерелом) — ' +
|
|
434
|
-
'додай тести або вилучи `js
|
|
434
|
+
'додай тести або вилучи `js` з .n-cursor.json#rules'
|
|
435
435
|
)
|
|
436
436
|
return []
|
|
437
437
|
}
|
|
@@ -24,7 +24,7 @@ async function checkEslintConfig(passFn, failFn, cwd) {
|
|
|
24
24
|
eslintPath = 'eslint.config.mjs'
|
|
25
25
|
passFn('eslint.config.mjs існує')
|
|
26
26
|
} else {
|
|
27
|
-
failFn('Відсутній eslint.config.js або eslint.config.mjs — flat config з getConfig (js
|
|
27
|
+
failFn('Відсутній eslint.config.js або eslint.config.mjs — flat config з getConfig (js.mdc)')
|
|
28
28
|
return
|
|
29
29
|
}
|
|
30
30
|
const eslintRaw = await readFile(join(cwd, eslintPath), 'utf8')
|
|
@@ -32,7 +32,7 @@ async function checkEslintConfig(passFn, failFn, cwd) {
|
|
|
32
32
|
{
|
|
33
33
|
needle: 'getConfig',
|
|
34
34
|
ok: `${eslintPath}: містить getConfig`,
|
|
35
|
-
err: `${eslintPath}: потрібен виклик getConfig (js
|
|
35
|
+
err: `${eslintPath}: потрібен виклик getConfig (js.mdc)`
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
needle: '@nitra/eslint-config',
|
|
@@ -42,7 +42,7 @@ async function checkEslintConfig(passFn, failFn, cwd) {
|
|
|
42
42
|
{
|
|
43
43
|
needle: '**/auto-imports.d.ts',
|
|
44
44
|
ok: `${eslintPath}: ignores містить **/auto-imports.d.ts`,
|
|
45
|
-
err: `${eslintPath}: додай у ignores запис **/auto-imports.d.ts (js
|
|
45
|
+
err: `${eslintPath}: додай у ignores запис **/auto-imports.d.ts (js.mdc)`
|
|
46
46
|
}
|
|
47
47
|
]
|
|
48
48
|
for (const { needle, ok, err } of checks) {
|
|
@@ -71,7 +71,7 @@ function checkPackageJsonTypeModule(label, pkg, passFn, failFn) {
|
|
|
71
71
|
if (pkg.type === 'module') {
|
|
72
72
|
passFn(`${label}: "type": "module"`)
|
|
73
73
|
} else {
|
|
74
|
-
failFn(`${label}: має містити "type": "module" (js
|
|
74
|
+
failFn(`${label}: має містити "type": "module" (js.mdc)`)
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -163,7 +163,7 @@ async function checkPackageJsonJsLint(passFn, failFn, cwd) {
|
|
|
163
163
|
async function checkOxlintRc(passFn, failFn, cwd) {
|
|
164
164
|
const oxPath = join(cwd, '.oxlintrc.json')
|
|
165
165
|
if (!existsSync(oxPath)) {
|
|
166
|
-
failFn('.oxlintrc.json не існує — додай конфіг oxlint (js
|
|
166
|
+
failFn('.oxlintrc.json не існує — додай конфіг oxlint (js.mdc)')
|
|
167
167
|
return
|
|
168
168
|
}
|
|
169
169
|
let oxCfg
|
|
@@ -204,14 +204,14 @@ async function checkLintJsWorkflows(passFn, failFn, cwd) {
|
|
|
204
204
|
if (existsSync(join(cwd, '.github/workflows/lint-js.yml'))) {
|
|
205
205
|
passFn('.github/workflows/lint-js.yml є (структуру перевіряє npx @nitra/cursor fix → js_lint.lint_js_yml)')
|
|
206
206
|
} else {
|
|
207
|
-
failFn('.github/workflows/lint-js.yml не існує — створи його (js
|
|
207
|
+
failFn('.github/workflows/lint-js.yml не існує — створи його (js.mdc)')
|
|
208
208
|
}
|
|
209
209
|
|
|
210
210
|
const lintYmlPath = join(cwd, '.github/workflows/lint.yml')
|
|
211
211
|
if (existsSync(lintYmlPath)) {
|
|
212
212
|
const lintYml = await readFile(lintYmlPath, 'utf8')
|
|
213
213
|
if (lintYml.includes('bunx oxlint') && lintYml.includes('bunx eslint') && lintYml.includes('jscpd')) {
|
|
214
|
-
failFn('.github/workflows/lint.yml дублює кроки lint-js.yml — залиш один workflow на лінт JS (js
|
|
214
|
+
failFn('.github/workflows/lint.yml дублює кроки lint-js.yml — залиш один workflow на лінт JS (js.mdc)')
|
|
215
215
|
} else {
|
|
216
216
|
passFn('.github/workflows/lint.yml не дублює oxlint/eslint/jscpd з lint-js.yml')
|
|
217
217
|
}
|
|
@@ -223,7 +223,7 @@ async function checkLintJsWorkflows(passFn, failFn, cwd) {
|
|
|
223
223
|
* копіює канонічний `knip-canonical.json` з пакета `@nitra/cursor` як стартовий
|
|
224
224
|
* baseline; зміст подальших модифікацій локально не валідується (`entry` /
|
|
225
225
|
* `project` / `ignore` / `ignoreDependencies` / `ignoreBinaries` дозволені
|
|
226
|
-
* будь-які; це side effect — описано у js
|
|
226
|
+
* будь-які; це side effect — описано у js.mdc).
|
|
227
227
|
* @param {(msg: string) => void} passFn callback при успішній перевірці
|
|
228
228
|
* @param {(msg: string) => void} failFn callback при помилці
|
|
229
229
|
* @param {string} cwd корінь репозиторію
|
|
@@ -242,11 +242,11 @@ async function checkKnipConfig(passFn, failFn, cwd) {
|
|
|
242
242
|
return
|
|
243
243
|
}
|
|
244
244
|
await copyFile(KNIP_CANONICAL_JSON_PATH, knipPath)
|
|
245
|
-
passFn('knip.json створено з канонічного npm/rules/js
|
|
245
|
+
passFn('knip.json створено з канонічного npm/rules/js/js/data/tooling/knip-canonical.json (js.mdc)')
|
|
246
246
|
}
|
|
247
247
|
|
|
248
248
|
/**
|
|
249
|
-
* Перевіряє відповідність проєкту правилам js
|
|
249
|
+
* Перевіряє відповідність проєкту правилам js.mdc
|
|
250
250
|
* @param {string} [cwd] корінь репозиторію
|
|
251
251
|
* @returns {Promise<number>} 0 — все OK, 1 — є проблеми
|
|
252
252
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: JS Module
|
|
3
3
|
title: check.mjs
|
|
4
|
-
resource: npm/rules/js
|
|
4
|
+
resource: npm/rules/js/js/check.mjs
|
|
5
5
|
docgen:
|
|
6
6
|
crc: f61768f2
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
@@ -10,7 +10,7 @@ docgen:
|
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль виконує перевірку конфігураційних файлів проєкту, забезпечуючи їхню відповідність встановленим стандартам. Він читає та аналізує конфігураційні файли, включаючи `package.json`, `.oxlintrc.json`, `knip.json`, `knip-canonical.json` та `.eslintrc.json`. Перевірка ґрунтується на логіці, визначеній у (js
|
|
13
|
+
Модуль виконує перевірку конфігураційних файлів проєкту, забезпечуючи їхню відповідність встановленим стандартам. Він читає та аналізує конфігураційні файли, включаючи `package.json`, `.oxlintrc.json`, `knip.json`, `knip-canonical.json` та `.eslintrc.json`. Перевірка ґрунтується на логіці, визначеній у (js.mdc) та (text.mdc). Функціонал реалізований у режимі лише читання, що означає відсутність змін у файловій системі чи базах даних. При виявленні проблем, система перехоплює помилки, працюючи у режимі fail-safe. Свідомо ігноруються шляхи `.github` та `.git`.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
@@ -30,7 +30,7 @@ docgen:
|
|
|
30
30
|
|
|
31
31
|
## Публічний API
|
|
32
32
|
|
|
33
|
-
check — забезпечує відповідність проєкту вимогам, описаним у js
|
|
33
|
+
check — забезпечує відповідність проєкту вимогам, описаним у js.mdc.
|
|
34
34
|
|
|
35
35
|
## Гарантії поведінки
|
|
36
36
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: Directory Index
|
|
3
|
-
title: npm/rules/js
|
|
4
|
-
resource: npm/rules/js
|
|
3
|
+
title: npm/rules/js/js
|
|
4
|
+
resource: npm/rules/js/js/
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# npm/rules/js
|
|
7
|
+
# npm/rules/js/js
|
|
8
8
|
|
|
9
9
|
| Файл | Тип |
|
|
10
10
|
| ------------------------------------- | --------- |
|