@nitra/cursor 5.3.4 → 6.0.0
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/.claude-template/settings.template.json +2 -2
- package/.pi-template/extensions/n-cursor-adr/docs/index.md +13 -24
- package/CHANGELOG.md +21 -0
- package/bin/n-cursor.js +47 -24
- package/lib/docs/models.md +29 -18
- package/lib/docs/omlx-trace.md +51 -0
- package/lib/docs/omlx.md +31 -15
- package/lib/omlx.mjs +2 -5
- package/package.json +1 -1
- package/rules/abie/docs/fix.md +17 -11
- package/rules/adr/docs/fix.md +25 -140
- package/rules/bun/docs/fix.md +18 -151
- package/rules/capacitor/docs/fix.md +16 -13
- package/rules/capacitor/js/docs/platforms.md +31 -43
- package/rules/changelog/docs/fix.md +25 -169
- package/rules/ci4/docs/fix.md +11 -14
- package/rules/doc-files/doc-files.mdc +60 -0
- package/rules/doc-files/docs/fix.md +31 -0
- package/rules/doc-files/fix.mjs +19 -0
- package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
- package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +18 -5
- package/{skills → rules}/doc-files/js/docgen-gen.mjs +46 -5
- package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
- package/{skills → rules}/doc-files/js/docgen-scan.mjs +11 -3
- package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-extract-anchors.md +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-extract.md +2 -2
- package/{skills → rules}/doc-files/js/docs/docgen-files-batch.md +2 -2
- package/{skills → rules}/doc-files/js/docs/docgen-gen.md +2 -2
- package/{skills → rules}/doc-files/js/docs/docgen-ignore.md +4 -4
- package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
- package/rules/doc-files/js/docs/docgen-scan.md +54 -0
- package/rules/doc-files/js/docs/lint.md +36 -0
- package/rules/doc-files/js/docs/units-js.md +31 -0
- package/rules/doc-files/js/docs/units-rs.md +35 -0
- package/rules/doc-files/js/docs/units.md +30 -0
- package/rules/doc-files/js/lint.mjs +96 -0
- package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
- package/rules/doc-files/lint/docs/lint.md +37 -0
- package/rules/doc-files/lint/lint.mjs +105 -0
- package/rules/doc-files/meta.json +1 -0
- package/rules/docker/docs/fix.md +21 -161
- package/rules/efes/docs/fix.md +23 -194
- package/rules/feedback/docs/fix.md +10 -8
- package/rules/ga/docs/fix.md +10 -5
- package/rules/ga/meta.json +1 -1
- package/rules/graphql/docs/fix.md +23 -119
- package/rules/hasura/docs/fix.md +19 -5
- package/rules/hasura/js/docs/internal_urls.md +34 -307
- package/rules/image-avif/docs/fix.md +16 -127
- package/rules/image-compress/docs/fix.md +20 -141
- package/rules/image-compress/js/docs/package_setup.md +22 -182
- package/rules/js-bun-db/docs/fix.md +23 -139
- package/rules/js-bun-db/js/docs/safety.md +33 -221
- package/rules/js-bun-redis/docs/fix.md +25 -114
- package/rules/js-bun-redis/js/docs/imports.md +18 -166
- package/rules/js-lint/docs/fix.md +30 -108
- package/rules/js-lint/js/docs/lint-findings.md +37 -17
- package/rules/js-lint/js/docs/lint.md +22 -238
- package/rules/js-lint/js/docs/tooling.md +34 -331
- package/rules/js-lint/js/lint.mjs +19 -12
- package/rules/js-lint/js-lint.mdc +1 -1
- package/rules/js-lint/meta.json +1 -1
- package/rules/js-lint-ci/docs/fix.md +16 -149
- package/rules/js-lint-ci/js/docs/lint.md +16 -136
- package/rules/js-lint-ci/js-lint-ci.mdc +1 -1
- package/rules/js-lint-ci/meta.json +1 -1
- package/rules/js-mssql/docs/fix.md +18 -123
- package/rules/js-mssql/js/docs/deps.md +28 -251
- package/rules/js-run/docs/fix.md +23 -138
- package/rules/js-run/js/docs/runtime.md +24 -378
- package/rules/k8s/docs/fix.md +18 -123
- package/rules/nginx-default-tpl/docs/fix.md +22 -118
- package/rules/nginx-default-tpl/js/docs/template.md +38 -360
- package/rules/npm-module/docs/fix.md +27 -89
- package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
- package/rules/npm-module/js/docs/package_structure.md +36 -258
- package/rules/npm-module/js/docs/rule_meta.md +25 -127
- package/rules/npm-module/js/docs/skill_meta.md +18 -180
- package/rules/npm-module/js/rule_meta.mjs +3 -3
- package/rules/php/docs/fix.md +21 -98
- package/rules/php/js/docs/tooling.md +20 -143
- package/rules/python/docs/fix.md +25 -157
- package/rules/python/js/docs/applies.md +20 -98
- package/rules/python/js/docs/tooling.md +27 -144
- package/rules/rego/docs/fix.md +24 -112
- package/rules/rego/js/docs/applies.md +20 -164
- package/rules/rego/js/docs/lint.md +15 -110
- package/rules/rego/meta.json +1 -1
- package/rules/release/docs/fix.md +16 -114
- package/rules/rust/docs/fix.md +24 -119
- package/rules/rust/js/docs/applies.md +20 -129
- package/rules/security/docs/fix.md +21 -78
- package/rules/security/js/docs/sample_secret.md +23 -182
- package/rules/security/js/docs/trufflehog.md +19 -128
- package/rules/security/meta.json +1 -1
- package/rules/style-lint/docs/fix.md +16 -150
- package/rules/style-lint/js/docs/lint.md +21 -172
- package/rules/style-lint/js/docs/tooling.md +19 -184
- package/rules/style-lint/js/lint.mjs +4 -3
- package/rules/style-lint/meta.json +1 -1
- package/rules/tauri/docs/fix.md +26 -152
- package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
- package/rules/tauri/js/docs/tooling.md +20 -217
- package/rules/test/docs/fix.md +19 -127
- package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
- package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
- package/rules/test/js/docs/cargo_mutants_config.md +24 -164
- package/rules/test/js/docs/location.md +24 -126
- package/rules/test/js/docs/no-process-chdir.md +20 -151
- package/rules/test/js/docs/no-relative-fs-path.md +24 -261
- package/rules/test/js/docs/stryker_config.md +48 -148
- package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
- package/rules/text/docs/fix.md +25 -113
- package/rules/text/js/docs/forbidden-prettier.md +21 -132
- package/rules/text/js/docs/formatting.md +60 -251
- package/rules/text/js/docs/lint.md +17 -114
- package/rules/text/js/lint.mjs +5 -3
- package/rules/text/lint/docs/lint.md +1 -1
- package/rules/text/lint/docs/run-dotenv-linter.md +1 -1
- package/rules/text/lint/docs/run-shellcheck.md +1 -1
- package/rules/text/lint/lint.mjs +13 -9
- package/rules/text/lint/run-dotenv-linter.mjs +13 -10
- package/rules/text/lint/run-shellcheck.mjs +10 -6
- package/rules/text/meta.json +1 -1
- package/rules/vue/docs/fix.md +25 -118
- package/rules/vue/js/docs/packages.md +25 -323
- package/rules/worktree/docs/fix.md +31 -150
- package/scripts/coverage-classify/docs/index.md +23 -209
- package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
- package/scripts/dispatcher/docs/trace.md +35 -0
- package/scripts/docs/auto-rules.md +37 -361
- package/scripts/docs/lint-cli.md +12 -13
- package/scripts/docs/post-tool-use-fix.md +16 -15
- package/scripts/docs/skills-cli.md +26 -23
- package/scripts/docs/sync-claude-config.md +94 -34
- package/scripts/docs/worktree-cli.md +11 -34
- package/scripts/lib/docs/assert-project-root.md +14 -16
- package/scripts/lib/docs/changed-files.md +24 -139
- package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
- package/scripts/lib/docs/rule-meta.md +1 -1
- package/scripts/lib/docs/rule-predicates.md +20 -17
- package/scripts/lib/docs/run-rule-cli.md +14 -18
- package/scripts/lib/docs/run-rule.md +13 -20
- package/scripts/lib/docs/run-standard-rule.md +12 -15
- package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
- package/scripts/lib/rule-meta.mjs +10 -6
- package/scripts/lib/rule-predicates.mjs +1 -1
- package/scripts/lint-cli.mjs +28 -20
- package/scripts/sync-claude-config.mjs +4 -1
- package/scripts/utils/docs/with-lock.md +19 -12
- package/scripts/utils/with-lock.mjs +4 -2
- package/skills/doc-aggregate/SKILL.md +2 -2
- package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
- package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
- package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
- package/skills/doc-files/.changes/260612-0031.md +5 -0
- package/skills/doc-files/.changes/260612-0036.md +5 -0
- package/skills/doc-files/.changes/260612-0114.md +5 -0
- package/skills/doc-files/SKILL.md +6 -6
- package/skills/fix/js/docs/llm-worker.md +17 -15
- package/skills/fix/js/docs/orchestrator.md +30 -23
- package/skills/fix/js/docs/t0.md +26 -16
- package/skills/start-check/js/docs/check.md +26 -22
- package/skills/taze/js/docs/diff.md +44 -20
- package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
- package/skills/doc-files/js/docs/docgen-scan.md +0 -25
- package/skills/doc-files/js/docs/units-rs.md +0 -35
- /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
- /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
- /package/{skills → rules}/doc-files/js/units.mjs +0 -0
|
@@ -1,163 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/rules/js-lint-ci/fix.mjs
|
|
4
|
-
crc:
|
|
4
|
+
crc: 38cf876b
|
|
5
|
+
score: 100
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
# fix.mjs
|
|
8
|
+
# fix.mjs
|
|
8
9
|
|
|
9
10
|
## Огляд
|
|
10
11
|
|
|
11
|
-
Файл
|
|
12
|
+
Файл застосовує визначене правило до вхідного контексту прогону. Застосовує правило та повертає отриманий результат.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
2. **Standalone mode** — якщо файл запущено напряму через `bun rules/js-lint-ci/fix.mjs`, виконується повний еквівалент CLI-команди `npx @nitra/cursor fix js-lint-ci` (з завантаженням конфігу, whitelist, summary та exit-кодом для CI).
|
|
14
|
+
## Поведінка
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
1. Запуск правила.
|
|
17
|
+
* Приймає контекст прогону.
|
|
18
|
+
* Виконує правило.
|
|
19
|
+
* Повертає результат.
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
applies → JS-concerns → policy → mdc-refs
|
|
20
|
-
```
|
|
21
|
+
## Публічний API
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
run — запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
24
|
+
Library mode — викликається CLI orchestration через `import + run`.
|
|
23
25
|
|
|
24
|
-
##
|
|
26
|
+
## Гарантії поведінки
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Інших іменованих чи default-експортів файл не містить.
|
|
31
|
-
|
|
32
|
-
### Сигнатура `run`
|
|
33
|
-
|
|
34
|
-
```js
|
|
35
|
-
export function run(ctx)
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
#### Параметри
|
|
39
|
-
|
|
40
|
-
- `ctx` (необов’язковий) — об’єкт контексту прогону типу `RuleContext` (визначення в модулі `../../scripts/lib/run-standard-rule.mjs`). Через цей контекст передаються спільні для одного запуску артефакти, такі як кеш обходу файлової системи (`walkCache`) тощо. Якщо контекст відсутній, `runStandardRule` створює власний.
|
|
41
|
-
|
|
42
|
-
#### Повертає
|
|
43
|
-
|
|
44
|
-
- `Promise<number>` — асинхронно резолвиться у **exit-код**:
|
|
45
|
-
- `0` — порушень немає, правило пройшло успішно;
|
|
46
|
-
- `1` — виявлено порушення (правило завершилось зі статусом FAIL).
|
|
47
|
-
|
|
48
|
-
#### Side effects
|
|
49
|
-
|
|
50
|
-
Сам по собі `run` не має прямих побічних ефектів, але через делегування у `runStandardRule` ініціює:
|
|
51
|
-
|
|
52
|
-
- читання конфігураційних файлів правила (зокрема `meta.json`, файлів `applies/*`, `policy/*`, `mdc-refs/*` тощо — згідно конвенції стандартного правила);
|
|
53
|
-
- обхід файлів проєкту відповідно до `applies`-патернів;
|
|
54
|
-
- виконання JS-перевірок (наприклад, запуск ESLint у відповідному режимі) та політики;
|
|
55
|
-
- запис до stdout/stderr діагностики, summary та результатів;
|
|
56
|
-
- може кешувати/читати з `walkCache` всередині `ctx`.
|
|
57
|
-
|
|
58
|
-
## Функції
|
|
59
|
-
|
|
60
|
-
### `run(ctx)`
|
|
61
|
-
|
|
62
|
-
```js
|
|
63
|
-
/**
|
|
64
|
-
*
|
|
65
|
-
*/
|
|
66
|
-
export function run(ctx) {
|
|
67
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
- **Сигнатура:** `run(ctx?: RuleContext): Promise<number>`.
|
|
72
|
-
- **Параметри:**
|
|
73
|
-
- `ctx` — опційний контекст прогону (див. вище).
|
|
74
|
-
- **Повертає:** `Promise<number>` — exit-код прогону правила (0/1).
|
|
75
|
-
- **Реалізація:** єдиний виклик `runStandardRule(import.meta.dirname, ctx)`. Перший аргумент `import.meta.dirname` — абсолютний шлях до каталогу, у якому розташований цей файл (`.../npm/rules/js-lint-ci/`). Таким чином `runStandardRule` дізнається, **яке саме правило** виконувати: всі його артефакти (`meta.json`, `applies`, `policy`, `mdc-refs` тощо) лежать поряд з `fix.mjs`.
|
|
76
|
-
- **Side effects:** делеговані у `runStandardRule` (див. секцію _Експорти / API_ вище).
|
|
77
|
-
|
|
78
|
-
### Standalone-блок (top-level `if`)
|
|
79
|
-
|
|
80
|
-
```js
|
|
81
|
-
if (isRunAsCli(import.meta.url)) {
|
|
82
|
-
process.exit(await runRuleCli(import.meta.dirname))
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
- Це не функція, а **умовний top-level statement**, що виконується лише коли модуль завантажено як головний (а не як імпортований модуль).
|
|
87
|
-
- **Умова:** `isRunAsCli(import.meta.url)` — повертає `true`, якщо поточний модуль є точкою входу процесу (тобто запущено `bun rules/js-lint-ci/fix.mjs`, а не `import` з іншого файлу).
|
|
88
|
-
- **Дія:** виконує `await runRuleCli(import.meta.dirname)` — повний CLI-сценарій (config-loading, whitelist, summary), а потім завершує процес `process.exit(<exit-code>)` з тим самим кодом, що повернув `runRuleCli` (0 або 1) — це критично для CI/IDE, які орієнтуються на код виходу.
|
|
89
|
-
- **Side effects:** завершення процесу (`process.exit`), вся I/O `runRuleCli`. Виклики `process.exit` тут спеціально дозволені директивою:
|
|
90
|
-
```js
|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Залежності
|
|
95
|
-
|
|
96
|
-
### Внутрішні (модулі того ж пакета)
|
|
97
|
-
|
|
98
|
-
- `../../scripts/lib/run-rule-cli.mjs` — імпортуються:
|
|
99
|
-
- `isRunAsCli(metaUrl)` — детектор того, що поточний ESM-модуль запущено як CLI-entry;
|
|
100
|
-
- `runRuleCli(dirname)` — full standalone CLI-runner правила, що дзеркалить поведінку `npx @nitra/cursor fix <id>` (config-loading + whitelist + summary).
|
|
101
|
-
- `../../scripts/lib/run-standard-rule.mjs` — імпортується:
|
|
102
|
-
- `runStandardRule(dirname, ctx?)` — стандартний бібліотечний конвеєр правила (`applies → JS-concerns → policy → mdc-refs`).
|
|
103
|
-
|
|
104
|
-
### Зовнішні (поза репозиторієм)
|
|
105
|
-
|
|
106
|
-
- Стандартні Node/Bun-глобали: `process` (для `process.exit`), `import.meta.dirname`, `import.meta.url`.
|
|
107
|
-
- Прямих залежностей від npm-пакетів у самому файлі немає (вони — транзитивні через `run-rule-cli.mjs` / `run-standard-rule.mjs`).
|
|
108
|
-
|
|
109
|
-
### Типи (через JSDoc)
|
|
110
|
-
|
|
111
|
-
- `import('../../scripts/lib/run-standard-rule.mjs').RuleContext` — імпорт типу для параметра `ctx`.
|
|
112
|
-
|
|
113
|
-
## Потік виконання / Використання
|
|
114
|
-
|
|
115
|
-
### Сценарій 1. Library mode (виклик з оркестратора)
|
|
116
|
-
|
|
117
|
-
Виконується, коли інший модуль імпортує цей файл та викликає `run(ctx)`:
|
|
118
|
-
|
|
119
|
-
```js
|
|
120
|
-
import { run } from '@nitra/cursor/rules/js-lint-ci/fix.mjs'
|
|
121
|
-
|
|
122
|
-
const exitCode = await run(ctx)
|
|
123
|
-
if (exitCode !== 0) {
|
|
124
|
-
// правило виявило порушення
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
Послідовність:
|
|
129
|
-
|
|
130
|
-
1. Оркестратор передає (опційно) спільний `ctx` (наприклад, з `walkCache`).
|
|
131
|
-
2. `run` викликає `runStandardRule(import.meta.dirname, ctx)`.
|
|
132
|
-
3. `runStandardRule` зчитує конфіг правила з каталогу `npm/rules/js-lint-ci/` і послідовно проганяє ланцюжок:
|
|
133
|
-
- `applies` — визначає список файлів, до яких застосовне правило;
|
|
134
|
-
- `JS-concerns` — JS-специфічні перевірки;
|
|
135
|
-
- `policy` — політика правила;
|
|
136
|
-
- `mdc-refs` — звірення з посиланнями `.mdc`.
|
|
137
|
-
4. Повертається `Promise<number>` з exit-кодом.
|
|
138
|
-
|
|
139
|
-
У цьому сценарії `process.exit` **не** викликається — exit-код повертається у викликача, який сам вирішує, що з ним робити (наприклад, агрегує з кодами інших правил).
|
|
140
|
-
|
|
141
|
-
### Сценарій 2. Standalone mode (прямий запуск)
|
|
142
|
-
|
|
143
|
-
Виконується командою:
|
|
144
|
-
|
|
145
|
-
```sh
|
|
146
|
-
bun npm/rules/js-lint-ci/fix.mjs
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
Послідовність:
|
|
150
|
-
|
|
151
|
-
1. ESM-модуль завантажується як головний, `import.meta.url` дорівнює URL процесу.
|
|
152
|
-
2. Виконується top-level `if (isRunAsCli(import.meta.url))` — умова істинна.
|
|
153
|
-
3. Запускається `await runRuleCli(import.meta.dirname)` — повний CLI-сценарій (config, whitelist, summary), еквівалентний `npx @nitra/cursor fix js-lint-ci`.
|
|
154
|
-
4. `process.exit(<code>)` завершує процес з отриманим exit-кодом (0/1) — для коректної інтеграції з CI та IDE.
|
|
155
|
-
|
|
156
|
-
> Експортована функція `run` у цьому сценарії **не** викликається напряму — `runRuleCli` сам інкапсулює всю CLI-логіку, включно з потрібними викликами `runStandardRule` всередині.
|
|
157
|
-
|
|
158
|
-
### Чому існують обидві ролі
|
|
159
|
-
|
|
160
|
-
- **Library `run`** потрібна, щоб агрегатор (`npx @nitra/cursor fix` без id або фоновий runner) міг прогнати багато правил у спільному контексті — з кешуванням обходу ФС, єдиним підсумком тощо, без породження окремого процесу на кожне правило.
|
|
161
|
-
- **Standalone-блок** потрібен, щоб правило було самодостатнім: розробник може запустити його в IDE «як файл» і отримати повноцінний CLI-сценарій з коректним exit-кодом. Це особливо зручно для дебагу окремого правила без переходу через головний CLI пакета.
|
|
162
|
-
|
|
163
|
-
Файл свідомо тримається **мінімальним**: він є лише адаптером (entry-point), уся доменна логіка — у бібліотечних функціях `runStandardRule` та `runRuleCli`. Це уніфікує всі правила з каталогу `npm/rules/*` — їхні `fix.mjs` мають однакову структуру і відрізняються лише шляхом каталогу, у якому лежать (через `import.meta.dirname`).
|
|
28
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
29
|
+
- Кешує результати в межах одного прогону.
|
|
30
|
+
- Не звертається до мережі.
|
|
@@ -1,144 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
docgen:
|
|
3
|
+
source: npm/rules/js-lint-ci/js/lint.mjs
|
|
4
|
+
crc: 5d06673f
|
|
5
|
+
score: 100
|
|
6
|
+
---
|
|
7
|
+
|
|
1
8
|
# lint.mjs
|
|
2
9
|
|
|
3
10
|
## Огляд
|
|
4
11
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
1. **jscpd** — детектор дубльованого коду (copy-paste detector). Знаходить ідентичні або дуже схожі блоки коду між файлами.
|
|
8
|
-
2. **knip** — детектор «мертвого» коду: невикористаних експортів, файлів, залежностей.
|
|
9
|
-
|
|
10
|
-
Модуль експортує одну функцію `lint`, яка ігнорує переданий список файлів (через природу інструментів — вони сканують усе репо) і повертає ненульовий код виходу при першому ж порушенні. Це класичний «fail-fast» патерн: якщо `jscpd` знайшов клони — `knip` навіть не запускається, репорт першого інструмента залишається на stdout/stderr CI-логу.
|
|
11
|
-
|
|
12
|
-
Файл є частиною контракту правил `n-cursor` для лінтингу: правило з суфіксом `-ci` означає, що воно виконується лише в `lint-ci`-фазі (на CI або при явному виклику), а не в інкрементальному per-file lint-сценарії.
|
|
13
|
-
|
|
14
|
-
## Експорти / API
|
|
15
|
-
|
|
16
|
-
| Експорт | Тип | Призначення |
|
|
17
|
-
| ------- | ------------------------- | ------------------------------------------------------------------------- |
|
|
18
|
-
| `lint` | `function` (named export) | Єдина точка входу — виконує jscpd → knip і повертає підсумковий exit code |
|
|
19
|
-
|
|
20
|
-
Default-експорту немає. Контракт named-експорту `lint` — обов'язковий для всіх файлів `rules/<rule>/js/lint.mjs` у системі правил `n-cursor`.
|
|
21
|
-
|
|
22
|
-
## Функції
|
|
23
|
-
|
|
24
|
-
### `lint(_files, cwd)`
|
|
25
|
-
|
|
26
|
-
#### Сигнатура
|
|
27
|
-
|
|
28
|
-
```js
|
|
29
|
-
export function lint(_files, cwd = process.cwd()): Promise<number>
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
#### Параметри
|
|
33
|
-
|
|
34
|
-
| Параметр | Тип | За замовчуванням | Опис |
|
|
35
|
-
| -------- | ----------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
36
|
-
| `_files` | `string[] \| undefined` | — | Список файлів для перевірки. **Ігнорується** — і jscpd, і knip працюють лише по всьому репозиторію. Префікс `_` у назві сигналізує, що аргумент не використовується. Згідно з коментарем-шапкою, функція викликається лише з `lint-ci` і завжди з `undefined`. |
|
|
37
|
-
| `cwd` | `string` | `process.cwd()` | Корінь репозиторію — робоча директорія, з якої запускаються `bunx jscpd .` та `bunx knip`. Усі шляхи всередині інструментів резолвляться відносно `cwd`. |
|
|
38
|
-
|
|
39
|
-
#### Що повертає
|
|
40
|
-
|
|
41
|
-
`Promise<number>` — резолвиться з exit code:
|
|
42
|
-
|
|
43
|
-
- `0` — обидва інструменти завершилися успішно, порушень не знайдено.
|
|
44
|
-
- Ненульове число (`jscpd.status` або `knip.status`) — перший інструмент, що завершився з помилкою, диктує підсумковий код виходу.
|
|
45
|
-
- `1` — fallback, коли `spawnSync` не повернув числовий `status` (наприклад, процес було вбито сигналом і `.status` дорівнює `null`).
|
|
46
|
-
|
|
47
|
-
Хоча функція синхронно виконує дочірні процеси через `spawnSync`, результат загорнуто у `Promise.resolve(...)` — це уніфікує контракт із асинхронними `lint`-функціями інших правил, де можуть використовуватись `spawn` чи інший асинхронний код.
|
|
48
|
-
|
|
49
|
-
#### Логіка крок-за-кроком
|
|
50
|
-
|
|
51
|
-
1. Запустити `bunx jscpd .` у директорії `cwd` з `stdio: 'inherit'` — увесь вивід інструмента йде безпосередньо в термінал/CI-лог.
|
|
52
|
-
2. Нормалізувати `jscpd.status`: якщо це число — взяти як є; інакше — `1`.
|
|
53
|
-
3. Якщо `jc !== 0` — **рано вийти** з цим кодом, не запускаючи knip.
|
|
54
|
-
4. Інакше — запустити `bunx knip --no-config-hints` (прапор пригнічує підказки про конфіг, щоб лог був чистішим).
|
|
55
|
-
5. Повернути `Promise.resolve(knip.status ?? 1)` за тим же правилом нормалізації.
|
|
56
|
-
|
|
57
|
-
#### Side effects
|
|
58
|
-
|
|
59
|
-
- **Запуск дочірніх процесів**: `spawnSync('bunx', ...)` блокує поточний потік до завершення процесу. Це навмисно — `lint` повинен дочекатися результату й повернути exit code.
|
|
60
|
-
- **Запис у stdout/stderr**: завдяки `stdio: 'inherit'` весь вивід jscpd і knip потрапляє в термінал викликаючого процесу. Жодних буферизованих рядків `lint` не повертає.
|
|
61
|
-
- **Файлова система — лише читання**: ні jscpd, ні knip із наведеними прапорами не модифікують код; вони генерують репорти в stdout (jscpd за замовчуванням також може писати HTML-репорт у `report/` директорію — це визначається його конфігом, не цим файлом).
|
|
62
|
-
- **Залежності від оточення**: `bunx` повинен бути доступний у `PATH` процесу. Якщо `bunx` відсутній, `spawnSync` поверне `status: null` і `error` — функція віддасть `1`.
|
|
63
|
-
|
|
64
|
-
## Залежності
|
|
65
|
-
|
|
66
|
-
### Stdlib (Node.js / Bun)
|
|
67
|
-
|
|
68
|
-
- `node:child_process` — використовується іменований імпорт `spawnSync`. Це синхронний варіант `spawn`, який повертає об'єкт із полями `status`, `signal`, `stdout`, `stderr`, `error` після завершення дочірнього процесу.
|
|
69
|
-
|
|
70
|
-
### Зовнішні CLI-інструменти (запускаються через `bunx`)
|
|
71
|
-
|
|
72
|
-
- **`jscpd`** — Copy/Paste Detector. Запускається з аргументом `.` (поточна директорія = `cwd`). Конфіг (правила обходу, пороги схожості, ігнор-патерни) інструмент шукає сам у `.jscpd.json`, `package.json#jscpd` тощо.
|
|
73
|
-
- **`knip`** — Detect unused files, dependencies and exports. Запускається з прапором `--no-config-hints`, який вимикає підказки про відсутній/неоптимальний конфіг.
|
|
74
|
-
|
|
75
|
-
### Runtime-залежності
|
|
76
|
-
|
|
77
|
-
- **`bunx`** — раннер, що йде в комплекті з Bun і виконує бінарники з node_modules або тимчасово завантажує пакет, якщо його немає локально.
|
|
78
|
-
|
|
79
|
-
### Не імпортується
|
|
80
|
-
|
|
81
|
-
- Жодних інших модулів проекту цей файл не використовує — він свідомо мінімалістичний і не залежить від інфраструктури `n-cursor` (логерів, конфіг-парсерів, fs-хелперів).
|
|
82
|
-
|
|
83
|
-
## Потік виконання / Використання
|
|
84
|
-
|
|
85
|
-
### Контекст виклику
|
|
86
|
-
|
|
87
|
-
Функція `lint` із цього файлу викликається механізмом правил `n-cursor` (зокрема, командою `lint-ci`). Конвенція така: для кожного правила `rules/<rule-id>/js/lint.mjs` рушій імпортує named export `lint(files, cwd)` і викликає його. Для правила `js-lint-ci` другий аргумент — корінь репо, а перший — завжди `undefined`, бо це крос-файловий аналіз.
|
|
88
|
-
|
|
89
|
-
### Псевдокод виклику ззовні
|
|
90
|
-
|
|
91
|
-
```js
|
|
92
|
-
import { lint } from './npm/rules/js-lint-ci/js/lint.mjs'
|
|
93
|
-
|
|
94
|
-
const code = await lint(undefined, '/path/to/repo')
|
|
95
|
-
if (code !== 0) process.exit(code)
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Сценарій 1: усе чисто
|
|
99
|
-
|
|
100
|
-
1. `bunx jscpd .` → exit 0, у логи виводиться репорт без знайдених клонів.
|
|
101
|
-
2. `bunx knip --no-config-hints` → exit 0, у логи — порожній/чистий звіт.
|
|
102
|
-
3. `lint` повертає `Promise.resolve(0)`.
|
|
103
|
-
4. CI-крок проходить.
|
|
104
|
-
|
|
105
|
-
### Сценарій 2: jscpd знайшов клони
|
|
106
|
-
|
|
107
|
-
1. `bunx jscpd .` → exit ≠ 0, у логи — список клонованих блоків.
|
|
108
|
-
2. `lint` рано виходить із цим кодом, **knip не запускається**.
|
|
109
|
-
3. CI-крок падає. Розробник бачить лише репорт jscpd.
|
|
110
|
-
|
|
111
|
-
### Сценарій 3: jscpd чистий, knip знайшов мертвий код
|
|
112
|
-
|
|
113
|
-
1. `bunx jscpd .` → exit 0.
|
|
114
|
-
2. `bunx knip --no-config-hints` → exit ≠ 0, у логи — список невикористаних експортів/файлів.
|
|
115
|
-
3. `lint` повертає цей код.
|
|
116
|
-
4. CI-крок падає з репортом knip.
|
|
117
|
-
|
|
118
|
-
### Сценарій 4: інструмент крашнувся (сигнал, відсутній bunx)
|
|
119
|
-
|
|
120
|
-
1. `spawnSync(...).status` повертає `null` (`signal` буде заповнений).
|
|
121
|
-
2. Перевірка `typeof ... === 'number'` дає `false` → fallback `1`.
|
|
122
|
-
3. `lint` повертає `1`. CI бачить generic-fail без чіткого репорту — це слабке місце, але навмисно зведене до мінімуму.
|
|
123
|
-
|
|
124
|
-
### Чому ігнорується `_files`
|
|
125
|
-
|
|
126
|
-
Файлово-орієнтовані аналізатори (eslint, stylelint, ...) працюють і per-file, і crosswise. Натомість `jscpd` і `knip` принципово міжфайлові: щоб знайти дубль або невикористаний експорт, треба бачити **всі** файли одночасно. Тому виконувати їх на підмножині не має сенсу — і per-file шлях для цього правила відсутній. Це підкреслено й у JSDoc, і в підкресленні `_` у назві аргумента.
|
|
127
|
-
|
|
128
|
-
### Спостережувані виходи
|
|
12
|
+
Інструмент виконує аналіз коду за допомогою jscpd та knip. Інструменти ініціюються для проведення перевірок. Результати перевірок фіксуються.
|
|
129
13
|
|
|
130
|
-
|
|
131
|
-
- **Exit code**: єдиний канал зворотного зв'язку від `lint` до раннера — числовий код.
|
|
14
|
+
## Поведінка
|
|
132
15
|
|
|
133
|
-
|
|
16
|
+
1. Запуск інструменту jscpd для перевірки коду.
|
|
17
|
+
2. Перевірка статусу виводу jscpd.
|
|
18
|
+
3. Запуск інструменту knip для перевірки коду.
|
|
19
|
+
4. Перевірка статусу виводу knip.
|
|
134
20
|
|
|
135
|
-
|
|
21
|
+
## Гарантії поведінки
|
|
136
22
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
3. Запустити `bunx jscpd .` синхронно з `cwd` і `stdio: 'inherit'`.
|
|
140
|
-
4. Нормалізувати exit (`typeof status === 'number' ? status : 1`) і рано вийти при ≠ 0.
|
|
141
|
-
5. Інакше — запустити `bunx knip --no-config-hints` за тим же протоколом і повернути нормалізований exit.
|
|
142
|
-
6. Загорнути результат у `Promise.resolve(...)`.
|
|
143
|
-
7. Ігнорувати перший аргумент (префікс `_`).
|
|
144
|
-
8. Не імпортувати жодних інших модулів і не виконувати ніяких записів у файлову систему.
|
|
23
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
24
|
+
- Не звертається до мережі.
|
|
@@ -10,7 +10,7 @@ version: '1.0'
|
|
|
10
10
|
`jscpd` і `knip` аналізують увесь граф проєкту, тож мають сенс лише у повному прогоні
|
|
11
11
|
`npx @nitra/cursor lint-ci` (не у швидкому `lint` по змінених файлах). Per-file режиму нема.
|
|
12
12
|
|
|
13
|
-
Швидкий етап js-lint (oxlint/eslint) — у правилі `js-lint` (`lint:
|
|
13
|
+
Швидкий етап js-lint (oxlint/eslint) — у правилі `js-lint` (`lint: per-file`).
|
|
14
14
|
|
|
15
15
|
## Залежнісна політика (що не додавати)
|
|
16
16
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "auto": { "glob": ["**/*.mjs", "**/*.cjs", "**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] }, "lint": "
|
|
1
|
+
{ "auto": { "glob": ["**/*.mjs", "**/*.cjs", "**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] }, "lint": "full" }
|
|
@@ -1,137 +1,32 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/rules/js-mssql/fix.mjs
|
|
4
|
-
crc:
|
|
4
|
+
crc: 38cf876b
|
|
5
|
+
score: 100
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
#
|
|
8
|
+
# fix.mjs
|
|
8
9
|
|
|
9
10
|
## Огляд
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
Виконує застосування JS-занепокоєних на наданому контексті прогону. Застосовує визначену політику та генерує посилання MDC. Повертає результат прогону.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
2. **Standalone mode** — якщо файл запущено напряму (`bun rules/js-mssql/fix.mjs`), він самотужки виконує повний CLI-цикл правила (завантаження конфігу, whitelist, summary) — еквівалент `npx @nitra/cursor fix js-mssql`.
|
|
14
|
+
## Поведінка
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
1. Запуск правила.
|
|
17
|
+
* Приймає контекст прогону.
|
|
18
|
+
* Виконує застосування JS-занепокоєних.
|
|
19
|
+
* Застосовує політику.
|
|
20
|
+
* Генерує посилання MDC.
|
|
21
|
+
* Повертає результат прогону.
|
|
17
22
|
|
|
18
|
-
|
|
23
|
+
## Публічний API
|
|
19
24
|
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
- `meta.json` — мета-інформація правила (id, version, тощо).
|
|
23
|
-
- `js/` — JS-concerns: фіксери/чекери, що працюють на рівні окремих JS/MJS/TS-файлів.
|
|
24
|
-
- `policy/` — policy-перевірки на рівні всього проєкту (зріз даних, агреговані інваріанти).
|
|
25
|
-
- `lib/` — допоміжні модулі правила.
|
|
25
|
+
run — запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
26
|
+
Library mode — викликається CLI orchestration через `import + run`.
|
|
26
27
|
|
|
27
|
-
##
|
|
28
|
+
## Гарантії поведінки
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
Окрім експорту, файл має **top-level side-effect** під CLI-режимом — див. секцію «Потік виконання».
|
|
34
|
-
|
|
35
|
-
### `run(ctx)`
|
|
36
|
-
|
|
37
|
-
```js
|
|
38
|
-
/**
|
|
39
|
-
*
|
|
40
|
-
*/
|
|
41
|
-
export function run(ctx) {
|
|
42
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
- **Сигнатура:** `run(ctx?: RuleContext): Promise<number>`
|
|
47
|
-
- **Параметри:**
|
|
48
|
-
- `ctx` _(optional)_ — об’єкт контексту прогону, який передає CLI-оркестратор. Тип імпортується JSDoc-посиланням з `../../scripts/lib/run-standard-rule.mjs` (`RuleContext`). Зазвичай несе спільні кешовані ресурси між правилами (наприклад, `walkCache` — кеш обходу файлів), щоб не повторювати дорогі IO-операції для кожного правила окремо.
|
|
49
|
-
- **Повертає:** `Promise<number>` — exit-code:
|
|
50
|
-
- `0` — порушень не знайдено;
|
|
51
|
-
- `1` — є порушення (правило фейлиться).
|
|
52
|
-
- **Side effects:** залежать від `runStandardRule`: читання файлів проєкту, потенційні автофікси на диску (якщо правило підтримує fix-mode), запис у summary-репорти, оновлення кешів у `ctx`.
|
|
53
|
-
- **Як визначається «корінь правила»:** через `import.meta.dirname` — повний шлях до директорії, де лежить цей `fix.mjs` (тобто `…/npm/rules/js-mssql/`). Саме цей шлях `runStandardRule` використовує, щоб знайти суміжні підтеки `js/`, `policy/`, файл `js-mssql.mdc` та `meta.json`.
|
|
54
|
-
|
|
55
|
-
## Функції
|
|
56
|
-
|
|
57
|
-
### `run(ctx)` — див. вище
|
|
58
|
-
|
|
59
|
-
Єдина функція, оголошена в цьому файлі. Жодних інших публічних чи приватних функцій модуль не містить — уся доменна логіка винесена у бібліотеку `scripts/lib/`.
|
|
60
|
-
|
|
61
|
-
## Залежності
|
|
62
|
-
|
|
63
|
-
### Внутрішні (відносні імпорти)
|
|
64
|
-
|
|
65
|
-
- `../../scripts/lib/run-rule-cli.mjs`
|
|
66
|
-
- `isRunAsCli(importMetaUrl): boolean` — детектує, чи запущено модуль як CLI-ентрі (а не імпортовано як бібліотеку). Порівнює `import.meta.url` поточного модуля з `process.argv[1]` (URL viewpoint).
|
|
67
|
-
- `runRuleCli(ruleDir): Promise<number>` — повний standalone-цикл одного правила: config-loading, whitelist, summary, повернення exit-коду.
|
|
68
|
-
- `../../scripts/lib/run-standard-rule.mjs`
|
|
69
|
-
- `runStandardRule(ruleDir, ctx?): Promise<number>` — узагальнений «standard» pipeline правила: `applies → JS-concerns → policy → mdc-refs`. Використовує `ctx` (наприклад, спільний `walkCache`), коли його передає зовнішній оркестратор.
|
|
70
|
-
- Експортує JSDoc-тип `RuleContext`, на який посилається анотація `run`.
|
|
71
|
-
|
|
72
|
-
### Зовнішні (npm)
|
|
73
|
-
|
|
74
|
-
Прямих імпортів з npm у цьому файлі **немає**. Усі зовнішні залежності інкапсульовані в `scripts/lib/*`.
|
|
75
|
-
|
|
76
|
-
### Платформенні / runtime
|
|
77
|
-
|
|
78
|
-
- **Bun ≥ 1.x** (або Node.js з підтримкою `import.meta.dirname`) — використовується `import.meta.dirname` та `import.meta.url`.
|
|
79
|
-
- **ESM** — файл написано як ES-модуль (`.mjs`), використовується `export` + top-level `await`.
|
|
80
|
-
- `process.exit` — глобал Node/Bun, явно лінт-проігноровано для CLI-сценарію.
|
|
81
|
-
|
|
82
|
-
## Потік виконання / Використання
|
|
83
|
-
|
|
84
|
-
### Library mode (типовий шлях у CI/IDE)
|
|
85
|
-
|
|
86
|
-
1. CLI `bun n-cursor fix` (або `check`) сканує `npm/rules/*/fix.mjs`.
|
|
87
|
-
2. Для кожного правила робить `import('…/fix.mjs')` і викликає `mod.run(ctx)` з підготовленим спільним контекстом.
|
|
88
|
-
3. Для `js-mssql`: `run(ctx)` робить **один-рядковий** делегат у `runStandardRule(import.meta.dirname, ctx)`.
|
|
89
|
-
4. `runStandardRule` усередині:
|
|
90
|
-
1. Читає `meta.json` і `*.mdc` поруч із `fix.mjs`.
|
|
91
|
-
2. Етап **applies** — визначає, чи правило взагалі застосовне до поточного дерева.
|
|
92
|
-
3. Етап **JS-concerns** — викликає всі чекери/фіксери з `./js/`.
|
|
93
|
-
4. Етап **policy** — викликає policy-перевірки з `./policy/` (агреговані інваріанти проєкту).
|
|
94
|
-
5. Етап **mdc-refs** — звіряє наявні зв’язки/посилання у `.mdc`-документі.
|
|
95
|
-
5. Повертає `0` / `1`, оркестратор зводить це у спільний звіт.
|
|
96
|
-
|
|
97
|
-
### Standalone mode (точкова перевірка людиною)
|
|
98
|
-
|
|
99
|
-
1. Розробник запускає файл напряму, наприклад:
|
|
100
|
-
```bash
|
|
101
|
-
bun npm/rules/js-mssql/fix.mjs
|
|
102
|
-
```
|
|
103
|
-
2. Перевірка `isRunAsCli(import.meta.url)` повертає `true`.
|
|
104
|
-
3. Виконується top-level `await runRuleCli(import.meta.dirname)`:
|
|
105
|
-
- Завантажує конфіг проєкту.
|
|
106
|
-
- Застосовує whitelist (які файли/директорії перевіряти).
|
|
107
|
-
- Викликає той самий стандартний pipeline (під капотом — `runStandardRule`).
|
|
108
|
-
- Друкує людиночитний summary.
|
|
109
|
-
4. Результат передається в `process.exit(...)` — потрібний для IDE-інтеграції та CI-pipeline’ів, щоб non-zero exit-code сигналізував про порушення.
|
|
110
|
-
|
|
111
|
-
### Чому окремо `run` і CLI-блок
|
|
112
|
-
|
|
113
|
-
Розділення на дві ролі дозволяє:
|
|
114
|
-
|
|
115
|
-
- **уникати дубльованого I/O** у бібліотечному режимі (один обхід дерева, кеш у `ctx`);
|
|
116
|
-
- **зберігати самодостатність** файлу для швидкого «прогнати правило одне, без всього іншого»;
|
|
117
|
-
- **тримати entry-point незмінним** для CLI-оркестратора — той знає лише, що у файлі є експорт `run`.
|
|
118
|
-
|
|
119
|
-
### Лінт-винятки
|
|
120
|
-
|
|
121
|
-
Рядок `process.exit(await runRuleCli(import.meta.dirname))` має директивну «глушилку»:
|
|
122
|
-
|
|
123
|
-
- `n/no-process-exit` (eslint-plugin-n) — за замовчуванням забороняє `process.exit`.
|
|
124
|
-
- `unicorn/no-process-exit` (eslint-plugin-unicorn) — аналогічно.
|
|
125
|
-
|
|
126
|
-
Обидва правила свідомо відключені **лише** для standalone entry-point: CLI/IDE очікують exit-код для рішення «зелено/червоно».
|
|
127
|
-
|
|
128
|
-
## Rebuild Test
|
|
129
|
-
|
|
130
|
-
З опису у цьому документі файл `fix.mjs` для правила `js-mssql` можна відтворити так:
|
|
131
|
-
|
|
132
|
-
1. Створити ES-модуль `.mjs`.
|
|
133
|
-
2. Імпортувати з `../../scripts/lib/run-rule-cli.mjs` дві іменовані функції: `isRunAsCli` та `runRuleCli`.
|
|
134
|
-
3. Імпортувати з `../../scripts/lib/run-standard-rule.mjs` функцію `runStandardRule`.
|
|
135
|
-
4. Оголосити іменований експорт `run(ctx)`, який повертає `runStandardRule(import.meta.dirname, ctx)`. JSDoc описує `ctx` як `RuleContext` (з того ж модуля) і повернення як `Promise<number>` (`0` — OK, `1` — порушення).
|
|
136
|
-
5. Після експорту перевірити `isRunAsCli(import.meta.url)`; якщо `true` — виконати `process.exit(await runRuleCli(import.meta.dirname))`, попередньо вимкнувши коментарем правила `n/no-process-exit` та `unicorn/no-process-exit` для цього рядка (зі стислою причиною: standalone entry-point потребує exit-коду для CI/IDE).
|
|
137
|
-
6. Не додавати жодних інших експортів і жодної доменної логіки — увесь pipeline `applies → JS-concerns → policy → mdc-refs` лишається в `runStandardRule`.
|
|
30
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
31
|
+
- Кешує результати в межах одного прогону.
|
|
32
|
+
- Не звертається до мережі.
|