@nitra/cursor 5.3.4 → 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 +11 -0
- package/bin/n-cursor.js +43 -22
- 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/{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 +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-gen.md +1 -1
- 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/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-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-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,228 +1,31 @@
|
|
|
1
|
-
# tooling.mjs — перевірка інструментарію Tauri
|
|
2
|
-
|
|
3
|
-
## Огляд
|
|
4
|
-
|
|
5
|
-
Модуль `npm/rules/tauri/js/tooling.mjs` реалізує JS-orchestrator для правила `tauri.mdc`. Його єдина мета — перевірити, чи правильно налаштовано VSCode-конфіг `.vscode/extensions.json` у проєктах, де є Tauri.
|
|
6
|
-
|
|
7
|
-
Особливості:
|
|
8
|
-
|
|
9
|
-
- **Cross-file gating**. Перевірка вмикається лише за наявності маркера Tauri у проєкті. Якщо проєкт не використовує Tauri — модуль одразу повертає успіх і нічого не валідує.
|
|
10
|
-
- **Маркер Tauri** шукається в усіх workspace-пакетах монорепо (включно з кореневим) через `getMonorepoPackageRootDirs()` за п'ятьма ознаками: наявність каталогу `src-tauri/`, файлів `src-tauri/Cargo.toml`, `src-tauri/tauri.conf.json`, `tauri.conf.json` (legacy flat-layout) або префікса `@tauri-apps/` у `dependencies`/`devDependencies` файла `package.json`.
|
|
11
|
-
- **Plan B архітектура**. Це conditional-правило: Rego-полісі лежить глобально без `target.json` поруч і **не** є auto-discoverable через `n-cursor fix`. Тому JS-orchestrator робить FS-існування файла самостійно, а content-валідацію делегує в Rego через `runConftestBatch` (namespace `tauri.vscode_extensions`).
|
|
12
|
-
- **Звітування** іде через `createCheckReporter` — стандартний reporter з `pass`/`fail` повідомленнями та `getExitCode()` (0 — OK, 1 — є порушення).
|
|
13
|
-
|
|
14
|
-
## Експорти / API
|
|
15
|
-
|
|
16
|
-
| Символ | Тип | Опис |
|
|
17
|
-
| ------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
18
|
-
| `check` | `() => Promise<number>` | **Єдиний публічний експорт.** Запускає перевірку правил `tauri.mdc` і повертає exit-код процесу: `0` — все добре або Tauri-маркера немає, `1` — порушення. |
|
|
19
|
-
|
|
20
|
-
Внутрішні (не експортовані) функції модуля:
|
|
21
|
-
|
|
22
|
-
- `packageHasTauriDep(pkg)` — детектор `@tauri-apps/*` залежностей у `package.json`.
|
|
23
|
-
- `workspaceHasTauriMarker(cwd, ws)` — перевірка одного workspace-пакета на ознаки Tauri.
|
|
24
|
-
- `projectHasTauriMarker()` — обхід усіх workspaces для агрегованого результату.
|
|
25
|
-
|
|
26
|
-
## Функції
|
|
27
|
-
|
|
28
|
-
### `packageHasTauriDep(pkg)`
|
|
29
|
-
|
|
30
|
-
**Сигнатура.**
|
|
31
|
-
|
|
32
|
-
```js
|
|
33
|
-
function packageHasTauriDep(pkg: Record<string, unknown> | null | undefined): boolean
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**Параметри.**
|
|
37
|
-
|
|
38
|
-
- `pkg` — розпарсений вміст `package.json`. Допускає `null`, `undefined` або не-об'єктне значення — у цих випадках повертається `false`.
|
|
39
|
-
|
|
40
|
-
**Повертає.**
|
|
41
|
-
|
|
42
|
-
- `boolean` — `true`, якщо серед ключів `pkg.dependencies` або `pkg.devDependencies` знайдено хоча б один ключ із префіксом `@tauri-apps/`. Інакше — `false`.
|
|
43
|
-
|
|
44
|
-
**Логіка.**
|
|
45
|
-
|
|
46
|
-
1. Якщо `pkg` falsy або не object — `false`.
|
|
47
|
-
2. Перебирає два поля: `'dependencies'` і `'devDependencies'`.
|
|
48
|
-
3. Для кожного, якщо поле є object — ітерує `Object.keys()` і перевіряє `name.startsWith('@tauri-apps/')`.
|
|
49
|
-
4. Перший збіг → негайне `true` (early return).
|
|
50
|
-
|
|
51
|
-
**Side effects.** Немає — чиста функція. Працює лише з вхідним об'єктом.
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
### `workspaceHasTauriMarker(cwd, ws)`
|
|
56
|
-
|
|
57
|
-
**Сигнатура.**
|
|
58
|
-
|
|
59
|
-
```js
|
|
60
|
-
async function workspaceHasTauriMarker(cwd: string, ws: string): Promise<boolean>
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**Параметри.**
|
|
64
|
-
|
|
65
|
-
- `cwd` — абсолютний шлях до кореня репо (зазвичай `process.cwd()`).
|
|
66
|
-
- `ws` — відносний шлях workspace-пакета від кореня. Спеціальне значення `'.'` означає сам корінь (тоді `base = cwd`); для решти — `base = join(cwd, ws)`.
|
|
67
|
-
|
|
68
|
-
**Повертає.**
|
|
69
|
-
|
|
70
|
-
- `Promise<boolean>` — `true`, якщо в зазначеному workspace знайдено будь-який з маркерів Tauri:
|
|
71
|
-
1. Існує каталог `<base>/src-tauri/` (`existsSync` + `statSync(...).isDirectory()`).
|
|
72
|
-
2. Існує файл `<base>/src-tauri/Cargo.toml`.
|
|
73
|
-
3. Існує файл `<base>/src-tauri/tauri.conf.json`.
|
|
74
|
-
4. Існує файл `<base>/tauri.conf.json` (legacy flat-layout).
|
|
75
|
-
5. `<base>/package.json` існує, парситься як JSON і `packageHasTauriDep(pkg)` повертає `true`.
|
|
76
|
-
|
|
77
|
-
Якщо `package.json` не існує — повертає `false` (умова `if (!existsSync(pkgPath)) return false`).
|
|
78
|
-
|
|
79
|
-
**Side effects.**
|
|
80
|
-
|
|
81
|
-
- Синхронні FS-виклики `existsSync`, `statSync` для каталогів і файлів.
|
|
82
|
-
- Асинхронне читання файла `readFile(pkgPath, 'utf8')`.
|
|
83
|
-
- `JSON.parse` — кидає виключення на некоректному JSON у `package.json` (без явного `try/catch` всередині). Викидається вгору як rejected promise.
|
|
84
|
-
|
|
85
1
|
---
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
```js
|
|
92
|
-
async function projectHasTauriMarker(): Promise<boolean>
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
**Параметри.** Немає.
|
|
96
|
-
|
|
97
|
-
**Повертає.**
|
|
98
|
-
|
|
99
|
-
- `Promise<boolean>` — `true`, якщо хоча б один workspace (включаючи корінь) має маркер Tauri.
|
|
100
|
-
|
|
101
|
-
**Логіка.**
|
|
102
|
-
|
|
103
|
-
1. Бере `cwd = process.cwd()`.
|
|
104
|
-
2. Викликає `getMonorepoPackageRootDirs(cwd)` — отримує масив workspace-шляхів (корінь `'.'` + всі workspaces з `package.json#workspaces`).
|
|
105
|
-
3. Послідовно (через `for...of`) перевіряє кожен workspace через `workspaceHasTauriMarker`. На першому `true` — короткозамикає й повертає `true`.
|
|
106
|
-
4. Якщо жоден workspace не має маркера — повертає `false`.
|
|
107
|
-
|
|
108
|
-
**Side effects.** Опосередковано — через FS-виклики у `workspaceHasTauriMarker` та `getMonorepoPackageRootDirs`.
|
|
109
|
-
|
|
2
|
+
docgen:
|
|
3
|
+
source: npm/rules/tauri/js/tooling.mjs
|
|
4
|
+
crc: 8f7bbb45
|
|
5
|
+
score: 90
|
|
110
6
|
---
|
|
111
7
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
**Сигнатура.**
|
|
115
|
-
|
|
116
|
-
```js
|
|
117
|
-
export async function check(): Promise<number>
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**Параметри.** Немає.
|
|
121
|
-
|
|
122
|
-
**Повертає.**
|
|
123
|
-
|
|
124
|
-
- `Promise<number>` — exit-код перевірки, отриманий через `reporter.getExitCode()`:
|
|
125
|
-
- `0` — успіх (немає маркера Tauri, або всі канонічні конфіги відповідають правилам).
|
|
126
|
-
- `1` — є помилки (наприклад, `.vscode/extensions.json` не існує або не пройшов Rego-валідацію).
|
|
8
|
+
# tooling.mjs
|
|
127
9
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
1. Створює reporter: `const reporter = createCheckReporter()` і виймає шорткати `{ pass, fail }`.
|
|
131
|
-
2. Викликає `projectHasTauriMarker()`. Якщо маркера немає:
|
|
132
|
-
- Записує `pass('Немає маркера Tauri (src-tauri/, tauri.conf.json, @tauri-apps/*) — tauri-tooling не вимагається')`.
|
|
133
|
-
- Повертає `reporter.getExitCode()` — зазвичай `0` (бо тільки `pass`).
|
|
134
|
-
3. Якщо маркер є — записує `pass('Знайдено маркер Tauri — перевіряємо канонічні конфіги tauri.mdc')` і починає валідацію `.vscode/extensions.json`.
|
|
135
|
-
4. Перевіряє існування файла `.vscode/extensions.json` (відносний шлях від CWD):
|
|
136
|
-
- Якщо файла немає — `fail(...)` з повідомленням, що треба створити з `recommendations "tauri-apps.tauri-vscode"`, і повертає `reporter.getExitCode()` (тут уже буде `1`).
|
|
137
|
-
5. Якщо файл існує — викликає `runConftestBatch({ policyDirRel: 'tauri/vscode_extensions', namespace: 'tauri.vscode_extensions', files: ['.vscode/extensions.json'] })`. Отримує масив `violations`.
|
|
138
|
-
6. Залежно від результату:
|
|
139
|
-
- `violations.length === 0` → `pass(`${extPath} відповідає tauri.vscode_extensions (rego)`)`.
|
|
140
|
-
- Інакше — для кожного `v` із `violations` викликає `fail(v.message)`.
|
|
141
|
-
7. Повертає `reporter.getExitCode()` — `0` або `1` залежно від накопичених `fail`-викликів.
|
|
142
|
-
|
|
143
|
-
**Side effects.**
|
|
144
|
-
|
|
145
|
-
- Читає `process.cwd()` (через залежні функції).
|
|
146
|
-
- FS-доступ: `existsSync`, `statSync`, `readFile` (через детектори маркера) і `existsSync` для `.vscode/extensions.json`.
|
|
147
|
-
- Запускає зовнішній двійковий процес `conftest` (опосередковано через `runConftestBatch`).
|
|
148
|
-
- Накопичує повідомлення в reporter (stdout / накопичувач залежить від реалізації `createCheckReporter`).
|
|
149
|
-
|
|
150
|
-
## Залежності
|
|
151
|
-
|
|
152
|
-
Імпорти модуля:
|
|
153
|
-
|
|
154
|
-
- **Стандартна бібліотека Node.js:**
|
|
155
|
-
- `existsSync`, `statSync` із `node:fs` — синхронні FS-перевірки існування файлів/каталогів і типу запису.
|
|
156
|
-
- `readFile` із `node:fs/promises` — асинхронне читання `package.json`.
|
|
157
|
-
- `join` із `node:path` — побудова шляхів.
|
|
158
|
-
- **Локальні утиліти (з `../../../scripts/lib/`):**
|
|
159
|
-
- `createCheckReporter` із `check-reporter.mjs` — фабрика звітувача з `pass`/`fail`/`getExitCode`.
|
|
160
|
-
- `runConftestBatch` із `run-conftest-batch.mjs` — синхронний (за використанням у коді) виклик `conftest` для batch-валідації набору файлів проти Rego-полісі.
|
|
161
|
-
- `getMonorepoPackageRootDirs` із `workspaces.mjs` — асинхронне отримання шляхів усіх workspace-пакетів монорепо (включаючи корінь `'.'`).
|
|
162
|
-
|
|
163
|
-
Зовнішні runtime-передумови:
|
|
164
|
-
|
|
165
|
-
- Виконуваний `conftest` має бути доступний у `PATH` (інакше `runConftestBatch` зафейлиться).
|
|
166
|
-
- Rego-полісі для namespace `tauri.vscode_extensions` має бути зареєстрований у глобальній теці полісі (без `target.json` поруч — це conditional-правило).
|
|
167
|
-
|
|
168
|
-
## Потік виконання / Використання
|
|
169
|
-
|
|
170
|
-
**Типове призначення.** Модуль викликається CLI-агрегатором правил (наприклад, `n-cursor` чи аналогом) у режимі перевірки. Він — один із багатьох `check()`-модулів, кожен з яких відповідає одному `.mdc`-правилу. `tooling.mjs` відповідає за частину `tauri.mdc`, що стосується VSCode tooling.
|
|
171
|
-
|
|
172
|
-
**Приклад прямого виклику:**
|
|
173
|
-
|
|
174
|
-
```js
|
|
175
|
-
import { check } from './npm/rules/tauri/js/tooling.mjs'
|
|
176
|
-
|
|
177
|
-
const code = await check()
|
|
178
|
-
process.exit(code)
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
**Послідовність виконання `check()`:**
|
|
182
|
-
|
|
183
|
-
1. **Ініціалізація reporter** → готовий до накопичення `pass`/`fail`.
|
|
184
|
-
2. **Gating (cross-file)** → `projectHasTauriMarker()`:
|
|
185
|
-
- `getMonorepoPackageRootDirs(cwd)` повертає шляхи всіх workspaces.
|
|
186
|
-
- Для кожного workspace перевіряємо 5 ознак (каталог `src-tauri/`, `Cargo.toml`, `tauri.conf.json` у двох локаціях, `@tauri-apps/*` у `package.json`).
|
|
187
|
-
- Перший знайдений маркер → переходимо до валідації; інакше — `pass` + exit `0`.
|
|
188
|
-
3. **FS-існування** `.vscode/extensions.json` — якщо немає, `fail` з підказкою про канонічний контент і exit `1`.
|
|
189
|
-
4. **Делегування в Rego** через `runConftestBatch`:
|
|
190
|
-
- `policyDirRel: 'tauri/vscode_extensions'` — відносний шлях до полісі.
|
|
191
|
-
- `namespace: 'tauri.vscode_extensions'` — Rego-namespace для оцінки.
|
|
192
|
-
- `files: ['.vscode/extensions.json']` — вхідні файли для batch-валідації.
|
|
193
|
-
5. **Звіт** — `pass` за нуль порушень, `fail(v.message)` для кожного `violation`.
|
|
194
|
-
6. **Повернення exit-коду** через `reporter.getExitCode()`.
|
|
10
|
+
## Огляд
|
|
195
11
|
|
|
196
|
-
|
|
12
|
+
Огляд
|
|
13
|
+
Файл виконує перевірку наявності залежностей Tauri у `package.json`, одиничного workspace-пакета Tauri, маркера Tauri та конфігурації `extensions.json`. Перевірка проводиться відповідно до правил, визначених у `tauri.mdc`.
|
|
197
14
|
|
|
198
|
-
|
|
199
|
-
- Якщо `conftest` не встановлено — помилку викине `runConftestBatch` (поведінка залежить від його реалізації).
|
|
15
|
+
## Поведінка
|
|
200
16
|
|
|
201
|
-
|
|
17
|
+
1. Перевіряє наявність залежностей Tauri у `package.json`
|
|
18
|
+
2. Перевіряє наявність одиничного workspace-пакета Tauri
|
|
19
|
+
3. Перевіряє наявність маркера Tauri у проєкті
|
|
20
|
+
4. Перевіряє наявність файлу `.vscode/extensions.json`
|
|
21
|
+
5. Перевіряє відповідність `extensions.json` правилам `tauri.mdc`
|
|
202
22
|
|
|
203
|
-
|
|
204
|
-
- Rego-полісі — десь у глобальній теці полісі під `tauri/vscode_extensions/` (адресовано через `policyDirRel`).
|
|
205
|
-
- Це conditional-правило: воно **не** реєструється автоматично в `n-cursor fix` як target-discoverable; орchestrator `tooling.mjs` сам гейтить виконання й сам викликає `conftest`.
|
|
23
|
+
## Публічний API
|
|
206
24
|
|
|
207
|
-
|
|
25
|
+
check — Перевіряє відповідність проєкту правилам tauri.mdc.
|
|
208
26
|
|
|
209
|
-
|
|
27
|
+
## Гарантії поведінки
|
|
210
28
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
- `readFile` із `node:fs/promises`;
|
|
215
|
-
- `join` із `node:path`;
|
|
216
|
-
- `createCheckReporter` з `../../../scripts/lib/check-reporter.mjs`;
|
|
217
|
-
- `runConftestBatch` з `../../../scripts/lib/run-conftest-batch.mjs`;
|
|
218
|
-
- `getMonorepoPackageRootDirs` з `../../../scripts/lib/workspaces.mjs`.
|
|
219
|
-
3. Реалізувати `packageHasTauriDep(pkg)` — defensive guard + цикл по `['dependencies', 'devDependencies']` + перевірка `name.startsWith('@tauri-apps/')`.
|
|
220
|
-
4. Реалізувати `workspaceHasTauriMarker(cwd, ws)` — `base = ws === '.' ? cwd : join(cwd, ws)`, послідовні `existsSync`/`statSync` для каталогу `src-tauri/`, файлів `src-tauri/Cargo.toml`, `src-tauri/tauri.conf.json`, `tauri.conf.json`; fallback на `readFile(<base>/package.json)` + `JSON.parse` + `packageHasTauriDep`.
|
|
221
|
-
5. Реалізувати `projectHasTauriMarker()` — `process.cwd()`, `await getMonorepoPackageRootDirs(cwd)`, `for...of` з раннім `return true`.
|
|
222
|
-
6. Експортувати `async function check()`:
|
|
223
|
-
- Створити reporter, дістати `pass`/`fail`.
|
|
224
|
-
- Перевірити маркер; якщо немає — `pass(...)` + `return reporter.getExitCode()`.
|
|
225
|
-
- Якщо є — `pass(...)`, потім гейт `.vscode/extensions.json`: відсутній → `fail(...)` + return.
|
|
226
|
-
- Викликати `runConftestBatch({ policyDirRel: 'tauri/vscode_extensions', namespace: 'tauri.vscode_extensions', files: [extPath] })`.
|
|
227
|
-
- На порожньому масиві порушень — `pass(...)`; інакше — цикл `fail(v.message)`.
|
|
228
|
-
- Повернути `reporter.getExitCode()`.
|
|
29
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
30
|
+
- За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
|
|
31
|
+
- Не звертається до мережі.
|
package/rules/test/docs/fix.md
CHANGED
|
@@ -1,141 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/rules/test/fix.mjs
|
|
4
|
-
crc:
|
|
4
|
+
crc: 38cf876b
|
|
5
|
+
score: 80
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
# fix.mjs
|
|
8
|
+
# fix.mjs
|
|
8
9
|
|
|
9
10
|
## Огляд
|
|
10
11
|
|
|
11
|
-
Файл
|
|
12
|
+
Файл ініціює виконання визначеного правила. Він передає контекст прогону і викликає `runStandardRule` для отримання результату.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
2. **Standalone mode** — якщо файл запущено напряму (`bun npm/rules/test/fix.mjs`), він самостійно виконує повний еквівалент CLI-команди `npx @nitra/cursor fix test`: підвантажує конфіг, застосовує whitelist, друкує підсумок і повертає коректний exit-code для CI/IDE.
|
|
14
|
+
## Поведінка
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
1. Запуск правила.
|
|
17
|
+
* Передача контексту прогону.
|
|
18
|
+
* Виклик `runStandardRule` з використанням шляху до модуля.
|
|
19
|
+
* Повернення результату.
|
|
20
|
+
2. Запуск у режимі CLI.
|
|
21
|
+
* Виклик `runRuleCli` з використанням шляху до модуля.
|
|
22
|
+
* Встановлення коду виходу процесу на результат.
|
|
17
23
|
|
|
18
|
-
|
|
24
|
+
## Публічний API
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
run — запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
27
|
+
Library mode — викликається CLI orchestration через `import + run`.
|
|
21
28
|
|
|
22
|
-
|
|
23
|
-
| ------- | ---------------------------------------- | --------------------------------------------------------------------------------------------- |
|
|
24
|
-
| `run` | `(ctx?: RuleContext) => Promise<number>` | Library-функція запуску правила. Повертає exit-code: `0` — порушень немає, `1` — є порушення. |
|
|
29
|
+
## Гарантії поведінки
|
|
25
30
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Декларується у `../../scripts/lib/run-standard-rule.mjs` і реекспортується через JSDoc. Найважливіше поле:
|
|
31
|
-
|
|
32
|
-
- `walkCache` — спільний кеш обходу файлової системи, який орекстратор передає між правилами в одному прогоні, щоб не сканувати дерево повторно.
|
|
33
|
-
|
|
34
|
-
Контекст є **необов'язковим**: при standalone-запуску `runRuleCli` сам створює свіжий контекст; при library-запуску ctx підставляє зовнішній orchestrator.
|
|
35
|
-
|
|
36
|
-
## Функції
|
|
37
|
-
|
|
38
|
-
### `run(ctx)`
|
|
39
|
-
|
|
40
|
-
```js
|
|
41
|
-
/**
|
|
42
|
-
*
|
|
43
|
-
*/
|
|
44
|
-
export function run(ctx) {
|
|
45
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
- **Сигнатура:** `run(ctx?: RuleContext): Promise<number>`
|
|
50
|
-
- **Параметри:**
|
|
51
|
-
- `ctx` _(опціональний)_ — `RuleContext`, контекст прогону. Може містити `walkCache` та інші поля, які стандартний пайплайн використовує для оптимізацій і передачі стану між правилами в межах однієї CLI-сесії.
|
|
52
|
-
- **Повертає:** `Promise<number>` — exit-code:
|
|
53
|
-
- `0` — правило відпрацювало без порушень;
|
|
54
|
-
- `1` — виявлено порушення (хоча б на одному з кроків applies/JS-concerns/policy/mdc-refs).
|
|
55
|
-
- **Side effects:** усі побічні ефекти делеговані `runStandardRule`. Зокрема: читання файлової системи (через walker), друк звіту в stdout/stderr, можливі правки файлів (якщо правило підтримує auto-fix), оновлення `walkCache`.
|
|
56
|
-
- **Ідентифікація правила:** правило ідентифікується **директорією** через `import.meta.dirname` — тобто абсолютним шляхом до теки `npm/rules/test/`. Зміна шляху чи переіменування директорії змінить ідентичність правила.
|
|
57
|
-
|
|
58
|
-
### Top-level standalone-блок
|
|
59
|
-
|
|
60
|
-
```js
|
|
61
|
-
if (isRunAsCli(import.meta.url)) {
|
|
62
|
-
process.exit(await runRuleCli(import.meta.dirname))
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
- **Тип:** не функція, а top-level `if`-блок із top-level `await`.
|
|
67
|
-
- **Умова входу:** `isRunAsCli(import.meta.url)` — повертає `true`, лише якщо цей модуль запущено як головний скрипт (а не імпортовано як залежність). Реалізація утиліти живе в `../../scripts/lib/run-rule-cli.mjs`.
|
|
68
|
-
- **Дія:** викликає `runRuleCli(import.meta.dirname)` — повний CLI-флоу одного правила (config-loading, whitelist, summary), очікує його `Promise<number>` і передає результат у `process.exit(...)`.
|
|
69
|
-
- **Side effects:** **завершує процес** через `process.exit(...)`. Тому інклюди коментарі-disable для ESLint-правил `n/no-process-exit` та `unicorn/no-process-exit` — це свідомий виняток для standalone entry-point.
|
|
70
|
-
- **Чому `await` дозволено на top-level:** файл є ESM-модулем (`.mjs`), а ESM підтримує top-level `await` нативно.
|
|
71
|
-
|
|
72
|
-
## Залежності
|
|
73
|
-
|
|
74
|
-
### Внутрішні модулі (relative imports)
|
|
75
|
-
|
|
76
|
-
| Шлях | Імпортовані сутності | Призначення |
|
|
77
|
-
| ----------------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
78
|
-
| `../../scripts/lib/run-rule-cli.mjs` | `isRunAsCli`, `runRuleCli` | Standalone CLI-обгортка: детект `import.meta.url === entry` і запуск повного CLI-флоу з config/whitelist/summary. |
|
|
79
|
-
| `../../scripts/lib/run-standard-rule.mjs` | `runStandardRule` | Стандартний пайплайн правила: послідовно прогоняє кроки `applies` → `JS-concerns` → `policy` → `mdc-refs`. Експортує тип `RuleContext`. |
|
|
80
|
-
|
|
81
|
-
Шляхи `../../scripts/lib/...` ведуть із `npm/rules/test/` у `npm/scripts/lib/` — тобто до **спільної інфраструктури правил** усередині пакета `@nitra/cursor`.
|
|
82
|
-
|
|
83
|
-
### Зовнішні залежності
|
|
84
|
-
|
|
85
|
-
Прямих імпортів зовнішніх npm-пакетів немає. Усі зовнішні залежності (наприклад, file-walker, glob-matcher, ESLint-utils) інкапсульовані всередині `runStandardRule` / `runRuleCli`.
|
|
86
|
-
|
|
87
|
-
### Платформенні API
|
|
88
|
-
|
|
89
|
-
- `import.meta.dirname` — Node.js/Bun-фіча ESM, що повертає абсолютний шлях до теки поточного модуля. Доступна в Node.js ≥ 20.11 та сучасних версіях Bun.
|
|
90
|
-
- `import.meta.url` — стандартний ESM-атрибут, URL поточного модуля (використовується для CLI-детекту).
|
|
91
|
-
- `process.exit(code)` — глобальний Node.js/Bun API.
|
|
92
|
-
- Top-level `await` — стандарт ESM (ES2022).
|
|
93
|
-
|
|
94
|
-
## Потік виконання / Використання
|
|
95
|
-
|
|
96
|
-
### Сценарій 1: Library mode (виклик з оркестратора)
|
|
97
|
-
|
|
98
|
-
1. Зовнішній CLI (`npx @nitra/cursor fix` або композитний прогон) визначає список активних правил.
|
|
99
|
-
2. Для правила `test` він `import`-ить `npm/rules/test/fix.mjs`.
|
|
100
|
-
3. Top-level `if (isRunAsCli(...))` повертає `false` (бо модуль імпортовано, а не запущено напряму) — standalone-гілка пропускається, процес не завершується.
|
|
101
|
-
4. Оркестратор викликає `run(ctx)` із підготовленим контекстом (`walkCache` тощо).
|
|
102
|
-
5. `run` делегує виклик `runStandardRule(import.meta.dirname, ctx)`.
|
|
103
|
-
6. `runStandardRule` послідовно виконує кроки пайплайна правила, читаючи допоміжні файли з директорії правила.
|
|
104
|
-
7. Результат (`Promise<number>`) повертається в оркестратор, який агрегує exit-коди усіх правил.
|
|
105
|
-
|
|
106
|
-
### Сценарій 2: Standalone mode (пряме виконання)
|
|
107
|
-
|
|
108
|
-
Команда: `bun npm/rules/test/fix.mjs` (або `node npm/rules/test/fix.mjs` за умови підтримки `import.meta.dirname`).
|
|
109
|
-
|
|
110
|
-
1. Bun/Node запускає модуль як головний.
|
|
111
|
-
2. Виконується top-level код: `isRunAsCli(import.meta.url)` → `true`.
|
|
112
|
-
3. Викликається `runRuleCli(import.meta.dirname)`:
|
|
113
|
-
- підвантажується конфіг проєкту,
|
|
114
|
-
- застосовується whitelist (якщо є),
|
|
115
|
-
- запускається пайплайн правила (фактично — той самий `runStandardRule` під капотом, але обгорнутий у CLI-логіку: парсинг прапорців, друк summary, обробка помилок),
|
|
116
|
-
- повертається `Promise<number>` із exit-code.
|
|
117
|
-
4. `await` чекає завершення Promise.
|
|
118
|
-
5. `process.exit(code)` завершує процес із отриманим кодом — це робить файл придатним для CI/pre-commit/IDE-інтеграцій, які покладаються саме на exit-code.
|
|
119
|
-
|
|
120
|
-
### Сценарій 3: Через `npx @nitra/cursor fix test`
|
|
121
|
-
|
|
122
|
-
Це **гібридний** сценарій:
|
|
123
|
-
|
|
124
|
-
1. CLI пакета `@nitra/cursor` запускається користувачем.
|
|
125
|
-
2. Він знаходить директорію правила за id (`test`) і динамічно імпортує `fix.mjs`.
|
|
126
|
-
3. CLI викликає експортовану функцію `run(ctx)` — тобто це Library mode (Сценарій 1), просто ініційований CLI-командою верхнього рівня. Standalone-гілка в самому `fix.mjs` при цьому **не активується**.
|
|
127
|
-
|
|
128
|
-
### Інваріанти та контракти
|
|
129
|
-
|
|
130
|
-
- `run` **мусить** повертати `Promise<number>` із значенням `0` або `1` — інакше CLI-оркестратор може некоректно агрегувати результати.
|
|
131
|
-
- Файл **не повинен** містити власної логіки правила: усе делегується `runStandardRule`. Конкретна перевірка живе у супутніх файлах директорії (`check-test.mjs`, `mdc-refs.json`, тощо — згідно конвенції проєкту).
|
|
132
|
-
- Top-level `await` дозволено лише в standalone-блоці й лише тому, що модуль ESM (`.mjs`).
|
|
133
|
-
- `process.exit` викликається **лише** в standalone-режимі — у library-режимі (Сценарій 1) виклик `process.exit` був би порушенням (тому існує `isRunAsCli`-guard і ESLint-disable коментар із обґрунтуванням).
|
|
134
|
-
|
|
135
|
-
### Розширення та модифікація
|
|
136
|
-
|
|
137
|
-
Файл є **темплейтним** і свідомо мінімальним. Щоб змінити поведінку правила `test`, **не редагуйте `fix.mjs`** — замість цього:
|
|
138
|
-
|
|
139
|
-
- логіку перевірок змінюйте у `check-*.mjs` тієї ж директорії;
|
|
140
|
-
- посилання на правила Cursor оновлюйте в `mdc-refs.json`;
|
|
141
|
-
- спільні зміни пайплайна вносьте в `npm/scripts/lib/run-standard-rule.mjs` (тоді вони застосуються до **всіх** правил одночасно).
|
|
31
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
32
|
+
- Кешує результати в межах одного прогону.
|
|
33
|
+
- Не звертається до мережі.
|
|
@@ -1,140 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/rules/test/js/data/stryker_config/stryker.config.baseline.mjs
|
|
4
|
-
crc:
|
|
4
|
+
crc: 2c7c9c37
|
|
5
|
+
score: 90
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# stryker.config.baseline.mjs
|
|
8
9
|
|
|
9
10
|
## Огляд
|
|
10
11
|
|
|
11
|
-
Файл
|
|
12
|
+
Файл ініціює процес тестування. Він визначає конфігурацію, область покриття, директорію для тимчасових файлів та формує ім'я файлу для JSON-звіту. Він керує збереженням результатів між запусками.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
## Поведінка
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
1. Запуск тестування.
|
|
17
|
+
2. Вибір конфігурації для тестового раннера.
|
|
18
|
+
3. Визначення області покриття тестування.
|
|
19
|
+
4. Визначення директорії для тимчасових файлів.
|
|
20
|
+
5. Вибір методів звітування.
|
|
21
|
+
6. Формування імені файлу для JSON-звіту.
|
|
22
|
+
7. Увімкнення можливості збереження результатів між запусками.
|
|
23
|
+
8. Визначення файлу для збереження результатів між запусками.
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
## Гарантії поведінки
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Файл має один експорт — **default export**.
|
|
26
|
-
|
|
27
|
-
| Експорт | Тип | Опис |
|
|
28
|
-
| --------- | --------------------------------------------------- | ---------------------------- |
|
|
29
|
-
| `default` | `PartialStrykerOptions` (з `@stryker-mutator/core`) | Об'єкт конфігурації Stryker. |
|
|
30
|
-
|
|
31
|
-
### Структура експортованого об'єкта
|
|
32
|
-
|
|
33
|
-
| Ключ | Тип | Значення | Призначення |
|
|
34
|
-
| ------------------ | ---------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
35
|
-
| `testRunner` | `string` | `'vitest'` | Test-runner-плагін, через який Stryker виконує тести проти мутантів. |
|
|
36
|
-
| `vitest` | `object` | `{ configFile: 'vitest.config.js' }` | Налаштування Vitest-runner-а. Поле `configFile` вказує шлях до конфігурації Vitest, яку Stryker реюзає. |
|
|
37
|
-
| `coverageAnalysis` | `string` | `'perTest'` | Режим аналізу покриття. `perTest` — Stryker для кожного мутанта запускає лише ті тести, що покривають мутовану лінію коду. |
|
|
38
|
-
| `tempDirName` | `string` | `'reports/stryker/.tmp'` | Тимчасова директорія для проміжних файлів Stryker під час прогону. |
|
|
39
|
-
| `reporters` | `string[]` | `['json', 'clear-text']` | Список увімкнених репортерів. `json` пише машинно-читний звіт, `clear-text` виводить у термінал. |
|
|
40
|
-
| `jsonReporter` | `object` | `{ fileName: 'reports/stryker/mutation.json' }` | Налаштування JSON-репортера; `fileName` — шлях для запису підсумкового звіту. |
|
|
41
|
-
| `incremental` | `boolean` | `true` | Вмикає incremental-режим: Stryker зберігає результати між запусками й перевикористовує їх. |
|
|
42
|
-
| `incrementalFile` | `string` | `'reports/stryker/incremental.json'` | Шлях до файлу зі станом incremental-режиму (попередні результати мутацій). |
|
|
43
|
-
|
|
44
|
-
## Функції
|
|
45
|
-
|
|
46
|
-
Файл **не містить функцій, класів чи виконуваного коду** — це чисто декларативний конфігураційний модуль. Він лише експортує літерал-об'єкт.
|
|
47
|
-
|
|
48
|
-
### Side effects
|
|
49
|
-
|
|
50
|
-
Side effects на рівні модуля **відсутні**:
|
|
51
|
-
|
|
52
|
-
- немає звернень до файлової системи в момент імпорту;
|
|
53
|
-
- немає викликів зовнішніх API;
|
|
54
|
-
- немає мутацій глобальних об'єктів;
|
|
55
|
-
- немає динамічних `import()` чи `require`.
|
|
56
|
-
|
|
57
|
-
Усі ефекти виникають **пізніше** — коли Stryker CLI читає цей модуль і застосовує його опції під час запуску mutation-тестування.
|
|
58
|
-
|
|
59
|
-
## Залежності
|
|
60
|
-
|
|
61
|
-
### Runtime-залежності
|
|
62
|
-
|
|
63
|
-
Файл **не імпортує** жодних модулів і не має runtime-залежностей.
|
|
64
|
-
|
|
65
|
-
### Type-only залежності (через JSDoc)
|
|
66
|
-
|
|
67
|
-
| Пакет | Імпортований символ | Призначення |
|
|
68
|
-
| ----------------------- | ----------------------- | -------------------------------------------------------------------------------------------------- |
|
|
69
|
-
| `@stryker-mutator/core` | `PartialStrykerOptions` | Тип для type-checking структури об'єкта конфігурації в IDE/TypeScript. На runtime не підтягується. |
|
|
70
|
-
|
|
71
|
-
### Опосередковані залежності (потрібні Stryker-у під час прогону)
|
|
72
|
-
|
|
73
|
-
Хоча файл їх не імпортує, для виконання конфігурації в робочому проєкті мають бути встановлені:
|
|
74
|
-
|
|
75
|
-
| Пакет | Роль |
|
|
76
|
-
| -------------------------------- | -------------------------------------------------------------------------------------- |
|
|
77
|
-
| `@stryker-mutator/core` | Ядро Stryker. |
|
|
78
|
-
| `@stryker-mutator/vitest-runner` | Плагін test-runner-а для Vitest (підвантажується за значенням `testRunner: 'vitest'`). |
|
|
79
|
-
| `vitest` | Сам Vitest з конфігом `vitest.config.js` у корені проєкту. |
|
|
80
|
-
|
|
81
|
-
### Файлові залежності
|
|
82
|
-
|
|
83
|
-
- `vitest.config.js` (відносний шлях від робочого каталогу запуску Stryker-у) — Vitest-конфіг, який Stryker реюзає.
|
|
84
|
-
|
|
85
|
-
### Вихідні артефакти (створюються Stryker-ом)
|
|
86
|
-
|
|
87
|
-
| Шлях | Що містить |
|
|
88
|
-
| ---------------------------------- | -------------------------------------------------------------- |
|
|
89
|
-
| `reports/stryker/.tmp/` | Тимчасові файли під час прогону (видаляються/перезаписуються). |
|
|
90
|
-
| `reports/stryker/mutation.json` | Підсумковий JSON-звіт із результатами всіх мутантів. |
|
|
91
|
-
| `reports/stryker/incremental.json` | Стан incremental-режиму для прискорення наступних прогонів. |
|
|
92
|
-
|
|
93
|
-
## Потік виконання / Використання
|
|
94
|
-
|
|
95
|
-
### Як файл використовується
|
|
96
|
-
|
|
97
|
-
Файл розміщений у тестовій директорії `npm/rules/test/js/data/stryker_config/` і призначений як **тестова фікстура / еталон** для перевірочних правил (rule-checks), що валідують Stryker-конфіги в реальних воркспейсах монорепо. Тобто rule-checker може:
|
|
98
|
-
|
|
99
|
-
1. читати цей файл як «known good» приклад;
|
|
100
|
-
2. порівнювати з ним конфіги воркспейсів;
|
|
101
|
-
3. виявляти відхилення (відсутність `incremental`, неправильний `coverageAnalysis`, неправильний `testRunner` тощо).
|
|
102
|
-
|
|
103
|
-
### Якби файл застосовувався як справжній Stryker-конфіг
|
|
104
|
-
|
|
105
|
-
Якщо покласти його в корінь воркспейсу під ім'ям `stryker.config.mjs`, Stryker CLI підхопить його автоматично. Запуск:
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
bunx stryker run
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Потік виконання:
|
|
112
|
-
|
|
113
|
-
1. **Завантаження конфігу.** Stryker CLI читає `stryker.config.mjs`, бере дефолтний експорт як `PartialStrykerOptions`.
|
|
114
|
-
2. **Розв'язання test-runner-а.** За значенням `testRunner: 'vitest'` Stryker динамічно підвантажує `@stryker-mutator/vitest-runner`.
|
|
115
|
-
3. **Ініціалізація Vitest.** Vitest-runner читає `vitest.config.js` (поле `vitest.configFile`) і налаштовує Vitest-інстанс.
|
|
116
|
-
4. **Перевірка incremental-стану.** Якщо файл `reports/stryker/incremental.json` існує (`incremental: true`), Stryker завантажує попередні результати й пропускає ті мутанти, що не змінилися (дає **~262×** прискорення на noop-прогонах згідно коментаря в коді, з посиланням на `benchmarks/runner-comparison/SPIKE.md`).
|
|
117
|
-
5. **Coverage analysis.** Stryker генерує coverage-карту й для кожного мутанта (`perTest`) обирає лише підмножину тестів, що покривають мутовану лінію, замість прогону всього test-suite.
|
|
118
|
-
6. **Прогон мутантів.** Concurrency за замовчуванням — `os.cpus().length - 1` (як зазначено в коментарях; явно в конфізі не задано). vitest-runner ізолює мутантів **у пам'яті через AST-patching** — не копіює `node_modules` у sandbox, що було проблемою command-runner-а в Bun-монорепо.
|
|
119
|
-
7. **Тимчасові артефакти.** Усе проміжне пишеться у `reports/stryker/.tmp/`.
|
|
120
|
-
8. **Звітування.** Після завершення:
|
|
121
|
-
- `clear-text` репортер друкує підсумок у термінал;
|
|
122
|
-
- `jsonReporter` пише машинний звіт у `reports/stryker/mutation.json`;
|
|
123
|
-
- оновлюється `reports/stryker/incremental.json` для майбутніх прогонів.
|
|
124
|
-
|
|
125
|
-
### Ключові архітектурні рішення (з коментарів у файлі)
|
|
126
|
-
|
|
127
|
-
- **`perTest` замість `all` / `off`** — головний приріст швидкості проти `commandRunner`, де треба ганяти весь test-suite на кожного мутанта.
|
|
128
|
-
- **Без `inPlace`** — vitest-runner ізолює мутантів через AST-patching у пам'яті, тому копіювання робочої директорії не потрібне (стара проблема command-runner-а у Bun monorepo).
|
|
129
|
-
- **`incremental: true`** — критично для CI/локальних повторних прогонів: відновлює стан після крашу/kill і дає ~262× прискорення на noop-прогонах.
|
|
130
|
-
|
|
131
|
-
### Передумови запуску (контракт середовища)
|
|
132
|
-
|
|
133
|
-
- існує `vitest.config.js` у CWD;
|
|
134
|
-
- встановлені `@stryker-mutator/core`, `@stryker-mutator/vitest-runner`, `vitest`;
|
|
135
|
-
- тека `reports/stryker/` доступна для запису (Stryker створює її автоматично);
|
|
136
|
-
- наявні тести під Vitest, що покривають кодову базу, яку планується мутувати.
|
|
137
|
-
|
|
138
|
-
### Інтеграція з правилами проєкту
|
|
139
|
-
|
|
140
|
-
Через шлях `npm/rules/test/js/data/...` файл є вхідними даними для тестів rule-чекерів (див. `.cursor/rules/n-test.mdc`, `.cursor/rules/n-bun.mdc`). Ці чекери, ймовірно, валідують Stryker-конфіги воркспейсів на відповідність цьому baseline (наприклад, що `testRunner === 'vitest'`, `coverageAnalysis === 'perTest'`, `incremental === true`).
|
|
27
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
28
|
+
- Не звертається до мережі.
|