@nitra/cursor 5.3.3 → 5.4.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 +17 -0
- package/bin/n-cursor.js +43 -22
- package/lib/docs/llm.md +23 -12
- 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-ignore.mjs +2 -1
- package/{skills → rules}/doc-files/js/docgen-scan.mjs +9 -1
- package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
- package/rules/doc-files/js/docs/docgen-extract-anchors.md +45 -0
- package/rules/doc-files/js/docs/docgen-extract.md +39 -0
- package/rules/doc-files/js/docs/docgen-files-batch.md +35 -0
- package/rules/doc-files/js/docs/docgen-gen.md +46 -0
- package/rules/doc-files/js/docs/docgen-ignore.md +37 -0
- 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/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-ci/docs/fix.md +16 -149
- package/rules/js-lint-ci/js/docs/lint.md +16 -136
- 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/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/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/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/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/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-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-predicates.mjs +1 -1
- 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-0012.md +5 -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-extract-anchors.md +0 -27
- package/skills/doc-files/js/docs/docgen-extract.md +0 -29
- package/skills/doc-files/js/docs/docgen-files-batch.md +0 -25
- package/skills/doc-files/js/docs/docgen-gen.md +0 -30
- 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-files-batch.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-gen.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,152 +1,29 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
docgen:
|
|
3
|
+
source: npm/rules/php/js/tooling.mjs
|
|
4
|
+
crc: a3e6a475
|
|
5
|
+
score: 95
|
|
6
|
+
---
|
|
2
7
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Модуль `tooling.mjs` реалізує локальну перевірку відповідності PHP-проєкту вимогам внутрішнього правила `php.mdc`. Це частина системи правил Cursor: під кожне правило існує парний `check`-модуль, що повертає exit-code, придатний для запуску в CI або з CLI.
|
|
6
|
-
|
|
7
|
-
Цей конкретний модуль покриває **лише ту частину вимог, яку неможливо (або недоречно) перевірити через Rego/conftest** — а саме факт існування файлів у файловій системі:
|
|
8
|
-
|
|
9
|
-
- наявність `composer.json` у корені репозиторію;
|
|
10
|
-
- наявність `package.json` у корені (його структуру, зокрема скрипт `lint-php`, перевіряє вже Rego-політика `npm/policy/php/package_json/`);
|
|
11
|
-
- наявність файлу GitHub Actions workflow `.github/workflows/lint-php.yml` (його вміст, зокрема крок `run: bun run lint-php`, перевіряє Rego-політика `npm/policy/php/lint_php_yml/`).
|
|
12
|
-
|
|
13
|
-
Тобто `tooling.mjs` — це **FS-existence чек**. Структурний аналіз JSON/YAML делегований на `npx @nitra/cursor check` (Rego). Така декомпозиція явно прописана в JSDoc-заголовку файлу.
|
|
14
|
-
|
|
15
|
-
Модуль є **ESM** (`.mjs`), не має побічних ефектів на рівні імпорту: уся робота виконується всередині експортованої функції `check()`. Робоча директорія — поточна (`process.cwd()`), оскільки всі шляхи передаються в `existsSync` як відносні.
|
|
16
|
-
|
|
17
|
-
## Експорти / API
|
|
18
|
-
|
|
19
|
-
| Експорт | Тип | Призначення |
|
|
20
|
-
| --------- | ---------- | ------------------------------------------------------------------ |
|
|
21
|
-
| `check()` | `function` | Запускає перевірку правила `php.mdc` у поточній робочій директорії |
|
|
22
|
-
|
|
23
|
-
Інших експортів немає (default-експорту немає). Імпорт здійснюється як іменований:
|
|
24
|
-
|
|
25
|
-
```js
|
|
26
|
-
import { check } from './tooling.mjs'
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Функції
|
|
30
|
-
|
|
31
|
-
### `check()`
|
|
32
|
-
|
|
33
|
-
**Сигнатура:**
|
|
34
|
-
|
|
35
|
-
```js
|
|
36
|
-
export function check(): number
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Параметри:** немає.
|
|
40
|
-
|
|
41
|
-
**Повертає:** `number` — exit-code:
|
|
42
|
-
|
|
43
|
-
- `0` — усі перевірки пройшли (`composer.json`, `package.json` та `.github/workflows/lint-php.yml` існують у поточній директорії);
|
|
44
|
-
- `1` — хоча б одна перевірка провалилася (`fail` був викликаний принаймні один раз).
|
|
45
|
-
|
|
46
|
-
Конкретне значення exit-code формує об’єкт-репортер через `reporter.getExitCode()` — модуль `tooling.mjs` не визначає логіку підрахунку самостійно, а делегує її в `createCheckReporter()`.
|
|
47
|
-
|
|
48
|
-
**Алгоритм (по кроках):**
|
|
49
|
-
|
|
50
|
-
1. Створює локальний репортер: `const reporter = createCheckReporter()`.
|
|
51
|
-
2. Розпаковує методи `pass` і `fail` з репортера: `const { pass, fail } = reporter`.
|
|
52
|
-
3. Перевіряє наявність `composer.json` у CWD:
|
|
53
|
-
- якщо файл існує → `pass('composer.json існує')`;
|
|
54
|
-
- інакше → `fail('composer.json не знайдено в корені — додай (php.mdc)')`.
|
|
55
|
-
4. Перевіряє наявність `package.json` у CWD:
|
|
56
|
-
- якщо файл існує → `pass('package.json є (наявність lint-php перевіряє npx @nitra/cursor fix → php.package_json)')`;
|
|
57
|
-
- інакше → `fail('package.json не знайдено в корені — додай (php.mdc)')`.
|
|
58
|
-
5. Перевіряє наявність workflow-файлу `.github/workflows/lint-php.yml`:
|
|
59
|
-
- якщо файл існує → `pass(`${wfPath} є (структуру перевіряє npx @nitra/cursor fix → php.lint_php_yml)`)`;
|
|
60
|
-
- інакше → `fail(`${wfPath} не існує — створи згідно php.mdc`)`.
|
|
61
|
-
6. Повертає `reporter.getExitCode()`.
|
|
62
|
-
|
|
63
|
-
**Side effects:**
|
|
64
|
-
|
|
65
|
-
- **Файлова система:** виключно **читання** (`existsSync`). Жодних записів/створень файлів.
|
|
66
|
-
- **Stdout/stderr:** опосередковано через `pass`/`fail` репортера. Сам модуль не звертається напряму до `console.log` / `process.stdout`. Конкретний канал, формат і обсяг виводу визначає реалізація `createCheckReporter()`.
|
|
67
|
-
- **Process exit:** функція **не викликає** `process.exit()` самостійно — вона лише повертає число. Виклик `process.exit(check())` (або еквівалент) — відповідальність викликаючої сторони.
|
|
68
|
-
- **Глобальний стан:** не змінюється.
|
|
69
|
-
- **CWD-залежність:** усі шляхи відносні, тому результат залежить від поточної робочої директорії на момент виклику.
|
|
8
|
+
# tooling.mjs
|
|
70
9
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
**Ідемпотентність:** так, виклик не змінює стан системи; повторні виклики дадуть той самий результат за тих самих файлів у CWD.
|
|
74
|
-
|
|
75
|
-
## Залежності
|
|
76
|
-
|
|
77
|
-
### Зовнішні (Node.js builtin)
|
|
78
|
-
|
|
79
|
-
- **`node:fs`** → іменований імпорт `existsSync`. Використовується для синхронної перевірки наявності файлу/директорії за вказаним шляхом. Імпортується саме через префікс `node:` (явна вказівка на builtin-модуль).
|
|
80
|
-
|
|
81
|
-
### Внутрішні (відносні)
|
|
82
|
-
|
|
83
|
-
- **`../../../scripts/lib/check-reporter.mjs`** → іменований імпорт `createCheckReporter`. Фабрика репортера для check-модулів. Очікуваний контракт (виведений із використання в цьому файлі):
|
|
84
|
-
- повертає об’єкт із методами `pass(message: string): void` та `fail(message: string): void`;
|
|
85
|
-
- має метод `getExitCode(): number`, який повертає `0` за відсутності провалів і `1` (або інше ненульове) за наявності хоча б одного `fail`.
|
|
86
|
-
|
|
87
|
-
Шлях `../../../scripts/lib/check-reporter.mjs` відраховується від розташування файлу `npm/rules/php/js/tooling.mjs` й веде до `npm/scripts/lib/check-reporter.mjs`.
|
|
88
|
-
|
|
89
|
-
### Зв’язки з правилами та політиками (контекст екосистеми)
|
|
90
|
-
|
|
91
|
-
Модуль явно посилається на сусідні артефакти, які виконують споріднену перевірку (вони **не** імпортуються кодом, але є частиною повного контракту правила `php.mdc`):
|
|
92
|
-
|
|
93
|
-
- `npm/policy/php/package_json/` — Rego-політика, що перевіряє наявність скрипта `lint-php` у `package.json`;
|
|
94
|
-
- `npm/policy/php/lint_php_yml/` — Rego-політика, що перевіряє крок `run: bun run lint-php` у workflow `lint-php.yml`;
|
|
95
|
-
- запускається разом із цим модулем через CLI `npx @nitra/cursor check`.
|
|
96
|
-
|
|
97
|
-
## Потік виконання / Використання
|
|
98
|
-
|
|
99
|
-
### Очікуваний контекст запуску
|
|
100
|
-
|
|
101
|
-
Файл є **check-модулем правила `php.mdc`** і інтегрується в систему `@nitra/cursor`. Виклик відбувається з кореня PHP-проєкту, де очікуються:
|
|
102
|
-
|
|
103
|
-
- `composer.json` у корені;
|
|
104
|
-
- `package.json` у корені (зі скриптом `lint-php`);
|
|
105
|
-
- `.github/workflows/lint-php.yml` із кроком, який виконує `bun run lint-php`.
|
|
106
|
-
|
|
107
|
-
### Типовий програмний виклик
|
|
108
|
-
|
|
109
|
-
```js
|
|
110
|
-
import { check } from './npm/rules/php/js/tooling.mjs'
|
|
111
|
-
|
|
112
|
-
const code = check()
|
|
113
|
-
process.exit(code)
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Сценарій 1 — усе на місці
|
|
117
|
-
|
|
118
|
-
CWD містить `composer.json`, `package.json` і `.github/workflows/lint-php.yml`. Репортер отримує три `pass`-повідомлення, жодного `fail`. `check()` повертає `0`.
|
|
119
|
-
|
|
120
|
-
### Сценарій 2 — немає одного з файлів
|
|
121
|
-
|
|
122
|
-
Наприклад, відсутній `.github/workflows/lint-php.yml`. Репортер отримує два `pass` і один `fail` із вказівкою «`.github/workflows/lint-php.yml` не існує — створи згідно php.mdc». `check()` повертає `1`.
|
|
10
|
+
## Огляд
|
|
123
11
|
|
|
124
|
-
|
|
12
|
+
Огляд
|
|
13
|
+
Файл перевіряє наявність конфігураційних файлів для визначення залежностей та робочих потоків. Файл використовується для встановлення наявності певних файлів у репозиторії.
|
|
125
14
|
|
|
126
|
-
|
|
15
|
+
## Поведінка
|
|
127
16
|
|
|
128
|
-
|
|
17
|
+
1. Перевірити наявність composer.json
|
|
18
|
+
2. Перевірити наявність package.json
|
|
19
|
+
3. Перевірити наявність .github/workflows/lint-php.yml
|
|
129
20
|
|
|
130
|
-
|
|
131
|
-
- Не перевіряється, що `composer.json` — валідний JSON або містить обов’язкові поля.
|
|
132
|
-
- Не перевіряється наявність директорії `vendor/`, версії PHP чи що-небудь, пов’язане з виконанням Composer.
|
|
133
|
-
- Усі шляхи відносні до `process.cwd()`. Виклик з іншої директорії дасть інший результат.
|
|
21
|
+
## Публічний API
|
|
134
22
|
|
|
135
|
-
|
|
23
|
+
check — Перевіряє відповідність проєкту правилам php.mdc.
|
|
136
24
|
|
|
137
|
-
|
|
138
|
-
npm/
|
|
139
|
-
├── rules/
|
|
140
|
-
│ └── php/
|
|
141
|
-
│ └── js/
|
|
142
|
-
│ └── tooling.mjs ← цей файл (FS-existence checks)
|
|
143
|
-
├── policy/
|
|
144
|
-
│ └── php/
|
|
145
|
-
│ ├── package_json/ ← Rego: lint-php у package.json
|
|
146
|
-
│ └── lint_php_yml/ ← Rego: крок bun run lint-php у workflow
|
|
147
|
-
└── scripts/
|
|
148
|
-
└── lib/
|
|
149
|
-
└── check-reporter.mjs ← фабрика репортера (createCheckReporter)
|
|
150
|
-
```
|
|
25
|
+
## Гарантії поведінки
|
|
151
26
|
|
|
152
|
-
|
|
27
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
28
|
+
- Свідомо пропускає шляхи: `.github`, `.git`.
|
|
29
|
+
- Не звертається до мережі.
|
package/rules/python/docs/fix.md
CHANGED
|
@@ -1,172 +1,40 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/rules/python/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
|
+
Виконує застосування JS-занепокоєних на вхідному контексті, застосовує визначену політику, генерує посилання на MDC та повертає результат прогону
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
2. **Standalone mode** — коли файл запускається безпосередньо (`bun npm/rules/python/fix.mjs`), він самостійно ініціалізує CLI-шар (завантаження конфіга, whitelist цілей, summary-звіт) і завершує процес із коректним exit-code для CI/IDE.
|
|
14
|
+
## Поведінка
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
1. Запуск правила.
|
|
17
|
+
* Приймає контекст прогону.
|
|
18
|
+
* Виконує застосування JS-занепокоєних.
|
|
19
|
+
* Застосовує політику.
|
|
20
|
+
* Генерує посилання на MDC.
|
|
21
|
+
* Повертає результат прогону.
|
|
17
22
|
|
|
18
|
-
|
|
23
|
+
2. Виконання у режимі CLI.
|
|
24
|
+
* Виконується як автономний скрипт.
|
|
25
|
+
* Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
|
|
26
|
+
* Виконує завантаження конфігурації.
|
|
27
|
+
* Виконує перевірку дозволів.
|
|
28
|
+
* Виконує підбирання списку.
|
|
29
|
+
* Виконує підбирання резюме.
|
|
19
30
|
|
|
20
|
-
##
|
|
31
|
+
## Публічний API
|
|
21
32
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
| `run` | named export, `function` | Library API правила `python`. Викликається CLI-оркестратором або іншим кодом для прогону правила в межах вже існуючого контексту. |
|
|
33
|
+
run — запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
34
|
+
Library mode — викликається CLI orchestration через `import + run`.
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
## Гарантії поведінки
|
|
27
37
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
### `run(ctx)`
|
|
33
|
-
|
|
34
|
-
Public-функція правила, делегатор до `runStandardRule`.
|
|
35
|
-
|
|
36
|
-
**Сигнатура**
|
|
37
|
-
|
|
38
|
-
```js
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
*/
|
|
42
|
-
export function run(ctx) {
|
|
43
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**Параметри**
|
|
48
|
-
|
|
49
|
-
- `ctx` _(optional)_ — об'єкт типу `RuleContext` (визначений у `../../scripts/lib/run-standard-rule.mjs`). Несе спільний для одного прогону стан: зокрема `walkCache` (закешований обхід дерева файлів, щоб не пере-сканувати робочу копію між правилами) та інші поля, які додає оркестратор. Якщо параметр опущений — `runStandardRule` створить дефолтний контекст самостійно.
|
|
50
|
-
|
|
51
|
-
**Повертає**
|
|
52
|
-
|
|
53
|
-
- `Promise<number>` — exit-code прогону:
|
|
54
|
-
- `0` — порушень не знайдено (правило пройшло),
|
|
55
|
-
- `1` — знайдено хоча б одне порушення.
|
|
56
|
-
|
|
57
|
-
Хоча тіло функції `return runStandardRule(...)` синхронне, сам `runStandardRule` повертає `Promise`, тому викликач має `await`-ити результат.
|
|
58
|
-
|
|
59
|
-
**Side effects**
|
|
60
|
-
|
|
61
|
-
Безпосередньо у `run` побічних ефектів немає — усі вони виконуються всередині `runStandardRule`:
|
|
62
|
-
|
|
63
|
-
- читання файлів проекту (через `walkCache`/файлову систему),
|
|
64
|
-
- запуск підправил (applies/JS-concerns/policy/mdc-refs),
|
|
65
|
-
- запис у `stdout`/`stderr` діагностики (summary вмикається лише в standalone-режимі через `runRuleCli`).
|
|
66
|
-
|
|
67
|
-
Сам `run` **не викликає** `process.exit` — це обов'язок зовнішнього оркестратора. Це принципово, бо `run` має бути безпечним для виклику з іншого правила або тесту.
|
|
68
|
-
|
|
69
|
-
### Standalone-блок (anonymous side-effect)
|
|
70
|
-
|
|
71
|
-
```js
|
|
72
|
-
if (isRunAsCli(import.meta.url)) {
|
|
73
|
-
// eslint-disable-next-line n/no-process-exit
|
|
74
|
-
process.exit(await runRuleCli(import.meta.dirname))
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Не функція, а top-level async-блок (використовує `await` на рівні модуля, що валідно для ES-модулів).
|
|
79
|
-
|
|
80
|
-
**Як працює**
|
|
81
|
-
|
|
82
|
-
1. `isRunAsCli(import.meta.url)` — повертає `true`, тільки якщо модуль є entry-point процесу (`bun rules/python/fix.mjs`, а не імпорт). При імпорті з іншого модуля гілка не виконується.
|
|
83
|
-
2. `runRuleCli(import.meta.dirname)` — повний CLI-цикл одного правила: завантажує конфіг проекту, формує whitelist цілей, прогоняє `run` (через `runStandardRule`), друкує summary.
|
|
84
|
-
3. `process.exit(<exit-code>)` — терміново завершує процес кодом, який повернув `runRuleCli`. Дві ESLint-директиви (`n/no-process-exit`, `unicorn/no-process-exit`) явно дозволяють виклик `process.exit` саме тут, бо standalone entry-point повинен повернути код процесу для CI/IDE-інтеграції.
|
|
85
|
-
|
|
86
|
-
**Side effects**
|
|
87
|
-
|
|
88
|
-
- Завершує Node/Bun-процес (`process.exit`).
|
|
89
|
-
- Усе, що робить `runRuleCli` (читання конфіга, файлові обходи, лог summary).
|
|
90
|
-
|
|
91
|
-
## Залежності
|
|
92
|
-
|
|
93
|
-
Усі залежності — внутрішні модулі того ж пакету (`@nitra/cursor`):
|
|
94
|
-
|
|
95
|
-
| Модуль | Імпортовані символи | Роль |
|
|
96
|
-
| ----------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
97
|
-
| `../../scripts/lib/run-rule-cli.mjs` | `isRunAsCli`, `runRuleCli` | Детектор standalone-запуску й повний CLI-цикл одного правила (config + whitelist + summary). |
|
|
98
|
-
| `../../scripts/lib/run-standard-rule.mjs` | `runStandardRule` | Стандартний раннер правила: обходить підпапки `applies → js → policy → mdc-refs` у фіксованому порядку й агрегує exit-code. Також експортує тип `RuleContext` (використовується в JSDoc). |
|
|
99
|
-
|
|
100
|
-
Зовнішніх npm-залежностей у файлі немає. Файл покладається лише на ES-модульні runtime-API:
|
|
101
|
-
|
|
102
|
-
- `import.meta.dirname` — абсолютний шлях до теки модуля (`.../npm/rules/python/`). Передається як «корінь правила» в обидва раннери, щоб вони знали, де шукати підпапки.
|
|
103
|
-
- `import.meta.url` — URL модуля (`file://...`), потрібен `isRunAsCli`, щоб порівняти з `process.argv[1]`.
|
|
104
|
-
- `process.exit` — глобальний Node/Bun API.
|
|
105
|
-
- Top-level `await` — стандарт ESM.
|
|
106
|
-
|
|
107
|
-
## Потік виконання / Використання
|
|
108
|
-
|
|
109
|
-
### Сценарій 1. Виклик з оркестратора (library mode)
|
|
110
|
-
|
|
111
|
-
Коли користувач запускає `npx @nitra/cursor fix python` (або просто `npx @nitra/cursor fix`, де `python` потрапляє у whitelist), CLI-оркестратор пакету:
|
|
112
|
-
|
|
113
|
-
1. Імпортує `run` із цього файлу: `const { run } = await import('.../npm/rules/python/fix.mjs')`.
|
|
114
|
-
2. Створює спільний `RuleContext` (зокрема `walkCache`).
|
|
115
|
-
3. Викликає `await run(ctx)` і збирає exit-code.
|
|
116
|
-
|
|
117
|
-
У цьому сценарії `if (isRunAsCli(...))` повертає `false`, бо модуль імпортовано — standalone-блок не виконується, `process.exit` не викликається.
|
|
118
|
-
|
|
119
|
-
### Сценарій 2. Прямий запуск (standalone mode)
|
|
120
|
-
|
|
121
|
-
```bash
|
|
122
|
-
bun npm/rules/python/fix.mjs
|
|
123
|
-
# або еквівалент:
|
|
124
|
-
npx @nitra/cursor fix python
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
1. Модуль виконується як entry-point — `isRunAsCli(import.meta.url)` → `true`.
|
|
128
|
-
2. Викликається `runRuleCli(import.meta.dirname)`:
|
|
129
|
-
- завантажує конфіг проекту,
|
|
130
|
-
- формує whitelist цілей,
|
|
131
|
-
- усередині сам викликає `run(ctx)` (через `runStandardRule`),
|
|
132
|
-
- друкує summary-звіт.
|
|
133
|
-
3. `process.exit` із отриманим exit-code (`0` або `1`) — придатно для CI (`bun npm/rules/python/fix.mjs && echo OK`).
|
|
134
|
-
|
|
135
|
-
### Внутрішній порядок підправил
|
|
136
|
-
|
|
137
|
-
Згідно з JSDoc до `run`, `runStandardRule` запускає послідовність:
|
|
138
|
-
|
|
139
|
-
1. **applies** — фільтр «чи правило взагалі застосовне до проекту» (читає метадані `meta.json` / контекст).
|
|
140
|
-
2. **JS-concerns** — JS-перевірки (у цьому правилі живуть у `./js/`).
|
|
141
|
-
3. **policy** — політики (у цьому правилі — `./policy/`).
|
|
142
|
-
4. **mdc-refs** — перевірка посилань усередині `python.mdc`.
|
|
143
|
-
|
|
144
|
-
Будь-яке порушення на будь-якому етапі підвищує exit-code до `1`, але всі етапи прогоняються — щоб користувач бачив повний список порушень за один прохід, а не виправляв їх по одному.
|
|
145
|
-
|
|
146
|
-
### Чому дві ролі в одному файлі
|
|
147
|
-
|
|
148
|
-
Це угода всього пакету `@nitra/cursor`: кожне правило має один `fix.mjs`, який:
|
|
149
|
-
|
|
150
|
-
- легко імпортувати з іншого правила/коду (named export `run`),
|
|
151
|
-
- легко запустити вручну для діагностики конкретного правила (`bun rules/<id>/fix.mjs`),
|
|
152
|
-
- однаково поводиться під CLI-оркестратором і в standalone.
|
|
153
|
-
|
|
154
|
-
Сусідні правила (наприклад, `npm/rules/n-bun/fix.mjs`, `npm/rules/n-adr/fix.mjs`) мають той самий шаблон — це дає змогу мати один універсальний loader і не дублювати CLI-код у кожному правилі.
|
|
155
|
-
|
|
156
|
-
## Rebuild Test
|
|
157
|
-
|
|
158
|
-
Контрольний перелік, за яким можна відтворити файл «з нуля», маючи лише цю документацію:
|
|
159
|
-
|
|
160
|
-
1. Файл — ES-модуль (`.mjs`), без default-експорту, із одним named export `run`.
|
|
161
|
-
2. Імпорти (у такому порядку):
|
|
162
|
-
- `isRunAsCli` та `runRuleCli` з `../../scripts/lib/run-rule-cli.mjs`,
|
|
163
|
-
- `runStandardRule` з `../../scripts/lib/run-standard-rule.mjs`.
|
|
164
|
-
3. Функція `run(ctx)`:
|
|
165
|
-
- `export function run(ctx)`,
|
|
166
|
-
- тіло: `return runStandardRule(import.meta.dirname, ctx)`,
|
|
167
|
-
- JSDoc із описом «applies → JS-concerns → policy → mdc-refs», згадкою про library mode, `@param {RuleContext} [ctx]` і `@returns {Promise<number>}` (0 — OK, 1 — порушення).
|
|
168
|
-
4. Standalone-блок:
|
|
169
|
-
- `if (isRunAsCli(import.meta.url)) { ... }`,
|
|
170
|
-
- усередині: `process.exit(await runRuleCli(import.meta.dirname))`,
|
|
171
|
-
- над `process.exit` — коментар-пояснення дволикої ролі fix.mjs та `eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit` із причиною.
|
|
172
|
-
5. Файл не містить жодної додаткової логіки — усі перевірки правила живуть у сусідніх теках (`./js/`, `./lint/`, `./policy/`) та `./python.mdc`.
|
|
38
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
39
|
+
- Кешує результати в межах одного прогону.
|
|
40
|
+
- Не звертається до мережі.
|
|
@@ -1,108 +1,30 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
docgen:
|
|
3
|
+
source: npm/rules/python/js/applies.mjs
|
|
4
|
+
crc: ed79bd71
|
|
5
|
+
score: 100
|
|
6
|
+
---
|
|
2
7
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Модуль `applies.mjs` реалізує **applies-гейт** для правила `python` (`python.mdc`) у системі правил `n-cursor`. Його єдина роль — відповісти на питання: «чи варто застосовувати правило `python.mdc` до поточного репозиторію?».
|
|
6
|
-
|
|
7
|
-
Критерій застосовності — наявність файлу `pyproject.toml` у корені репозиторію. Якщо файл відсутній, CLI `n-cursor` пропускає всі concerns цього правила (як JS-перевірки, так і policy-перевірки Rego). Це усуває хибне спрацювання rego-правила `python/package_json`, яке вимагало б наявність npm-скрипта `scripts.lint-python` навіть у репозиторіях, що не пов'язані з Python.
|
|
8
|
-
|
|
9
|
-
Сам JS-файл не виконує жодних інших FS-перевірок: усі подальші перевірки (`uv.lock`, `package.json`, `lint-python.yml`, заборона Poetry тощо) розміщені окремо у `tooling.mjs`. Окрім гейта `applies()`, файл містить тонкий стаб `check()`, який друкує context-pass через стандартний reporter.
|
|
10
|
-
|
|
11
|
-
## Експорти / API
|
|
12
|
-
|
|
13
|
-
Модуль експортує дві named-функції (ESM):
|
|
14
|
-
|
|
15
|
-
| Експорт | Тип / сигнатура | Призначення |
|
|
16
|
-
| --------- | ------------------------------------ | --------------------------------------------------------------------- |
|
|
17
|
-
| `applies` | `(cwd?: string) => Promise<boolean>` | Гейт застосовності правила: `true`, якщо в корені є `pyproject.toml`. |
|
|
18
|
-
| `check` | `() => number` | Друкує context-pass через `check-reporter`, повертає exit-code (`0`). |
|
|
19
|
-
|
|
20
|
-
Default-export відсутній.
|
|
21
|
-
|
|
22
|
-
## Функції
|
|
23
|
-
|
|
24
|
-
### `applies(cwd = process.cwd())`
|
|
25
|
-
|
|
26
|
-
Гейт застосовності правила `python.mdc` для конкретного репозиторію.
|
|
27
|
-
|
|
28
|
-
- **Сигнатура:** `export function applies(cwd?: string): Promise<boolean>`
|
|
29
|
-
- **Параметри:**
|
|
30
|
-
- `cwd` _(string, опційний)_ — абсолютний (або відносний) шлях до кореня репозиторію, у якому виконується перевірка. За замовчуванням — результат `process.cwd()`. У звичайному прогоні CLI це робочий каталог, з якого запущено команду.
|
|
31
|
-
- **Повертає:** `Promise<boolean>`
|
|
32
|
-
- `true` — у `cwd` існує файл `pyproject.toml`, правило `python.mdc` слід застосовувати (CLI запустить решту concerns).
|
|
33
|
-
- `false` — `pyproject.toml` відсутній, правило треба повністю пропустити.
|
|
34
|
-
- **Алгоритм:**
|
|
35
|
-
1. Будує абсолютний шлях `join(cwd, 'pyproject.toml')`.
|
|
36
|
-
2. Викликає синхронну `existsSync()` з `node:fs`.
|
|
37
|
-
3. Загортає синхронний boolean у `Promise.resolve(...)`, щоб відповідати очікуваному CLI-контракту `Promise<boolean>`.
|
|
38
|
-
- **Side effects:** немає — лише читання метаданих файлової системи (`stat`-like виклик). Файл не відкривається й не читається; запис не виконується; глобальний стан не змінюється.
|
|
39
|
-
- **Помилки:** функція не очікує винятків; `existsSync` сам по собі не кидає для відсутніх шляхів — повертає `false`. Промісована обгортка зберігає таку ж поведінку.
|
|
40
|
-
|
|
41
|
-
### `check()`
|
|
8
|
+
# applies.mjs
|
|
42
9
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
- **Сигнатура:** `export function check(): number`
|
|
46
|
-
- **Параметри:** немає.
|
|
47
|
-
- **Повертає:** `number` — exit-code, отриманий з `reporter.getExitCode()`. Оскільки викликається лише `reporter.pass(...)`, код завжди `0` (немає фейлів).
|
|
48
|
-
- **Алгоритм:**
|
|
49
|
-
1. Створює інстанс reporter-а через `createCheckReporter()`.
|
|
50
|
-
2. Викликає `reporter.pass('pyproject.toml знайдено в корені — застосовую python.mdc')`, що друкує позитивний рядок у стандартному форматі n-cursor reporter-а.
|
|
51
|
-
3. Повертає `reporter.getExitCode()`.
|
|
52
|
-
- **Side effects:** пише в `stdout` (через reporter). Не виконує FS-операцій, не змінює стану процесу, не кидає винятків.
|
|
53
|
-
- **Передумова:** функцію має сенс викликати лише після того, як `applies()` повернула `true` (інакше повідомлення про «знайдено» було б оманливим). CLI `n-cursor` забезпечує цей контракт.
|
|
54
|
-
|
|
55
|
-
## Залежності
|
|
56
|
-
|
|
57
|
-
### Зовнішні (стандартна бібліотека Node.js)
|
|
58
|
-
|
|
59
|
-
- `node:fs`
|
|
60
|
-
- `existsSync(path)` — синхронна перевірка існування шляху. Використовується для виявлення `pyproject.toml`.
|
|
61
|
-
- `node:path`
|
|
62
|
-
- `join(...segments)` — нормалізована побудова шляху, незалежна від OS-роздільника.
|
|
63
|
-
|
|
64
|
-
### Внутрішні (репозиторій)
|
|
65
|
-
|
|
66
|
-
- `../../../scripts/lib/check-reporter.mjs`
|
|
67
|
-
- `createCheckReporter()` — фабрика стандартного reporter-а для `check.mjs`-скриптів правил. Очікувані методи: `pass(message)` (друк позитивного рядка) та `getExitCode()` (повертає накопичений exit-код, `0` для успіху).
|
|
68
|
-
- Відносний шлях вказує на спільну бібліотеку скриптів правил у тому ж `npm/`-пакеті (`npm/scripts/lib/check-reporter.mjs` відносно файлу `npm/rules/python/js/applies.mjs`).
|
|
69
|
-
|
|
70
|
-
Інших залежностей (зокрема — TOML-парсера, інших правил, `tooling.mjs`) у цьому файлі немає.
|
|
71
|
-
|
|
72
|
-
## Потік виконання / Використання
|
|
73
|
-
|
|
74
|
-
### Місце в архітектурі правил
|
|
75
|
-
|
|
76
|
-
У системі правил `n-cursor` кожне правило (наприклад, `python.mdc`) описується трьома шарами:
|
|
77
|
-
|
|
78
|
-
1. **`*.mdc`** — людинозрозумілий опис правила, без алгоритму перевірки.
|
|
79
|
-
2. **`js/applies.mjs`** — гейт застосовності правила до конкретного репозиторію (поточний файл).
|
|
80
|
-
3. **`js/<concern>.mjs`** і Rego-policy — фактичні перевірки (`tooling.mjs`, `package_json.rego` тощо).
|
|
10
|
+
## Огляд
|
|
81
11
|
|
|
82
|
-
|
|
12
|
+
Файл перевіряє наявність файлу pyproject.toml у корені репозиторію.
|
|
83
13
|
|
|
84
|
-
|
|
14
|
+
## Поведінка
|
|
85
15
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
3. CLI імпортує `npm/rules/python/js/applies.mjs` і викликає `applies(process.cwd())`.
|
|
89
|
-
4. Якщо `pyproject.toml` присутній — CLI продовжує: запускає `check()` (друк context-pass) та інші concerns правила (`tooling.mjs`, Rego-policy).
|
|
90
|
-
5. Якщо `pyproject.toml` відсутній — CLI повністю пропускає `python` для цього прогону. `check()` у такому разі не викликається.
|
|
16
|
+
applies
|
|
17
|
+
Перевіряє наявність pyproject.toml в корені репозиторію
|
|
91
18
|
|
|
92
|
-
|
|
19
|
+
check
|
|
20
|
+
Друкує повідомлення про знахідку pyproject.toml для застосування python.mdc
|
|
93
21
|
|
|
94
|
-
|
|
95
|
-
import { applies, check } from './applies.mjs'
|
|
22
|
+
## Публічний API
|
|
96
23
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
process.exitCode = code
|
|
100
|
-
}
|
|
101
|
-
```
|
|
24
|
+
applies — формує намір файлу
|
|
25
|
+
check — виводить короткий контекст-прохід
|
|
102
26
|
|
|
103
|
-
|
|
27
|
+
## Гарантії поведінки
|
|
104
28
|
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
- `check()` не дублює перевірку `pyproject.toml`: вона вже відбулась у `applies()`. Якщо `check()` викликається без попереднього `applies()`, повідомлення «pyproject.toml знайдено в корені» може ввести в оману, але exit-code від цього не залежить.
|
|
108
|
-
- Файл свідомо не імпортує `tooling.mjs` чи інші concerns — кожен concern завантажується CLI окремо.
|
|
29
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
30
|
+
- Не звертається до мережі.
|