@7n/rules 1.30.0 → 1.32.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/CHANGELOG.md +13 -0
- package/package.json +1 -1
- package/rules/{style → k8s/dremio_logging}/docs/index.md +2 -4
- package/rules/k8s/dremio_logging/docs/main.md +31 -0
- package/rules/k8s/dremio_logging/dremio_logging.mdc +1 -0
- package/scripts/docs/upgrade-n-rules-and-install.md +2 -1
- package/scripts/upgrade-n-rules-and-install.mjs +86 -19
- package/skills/taze/js/docs/index.md +4 -6
- package/skills/taze/js/docs/migration-cache.md +38 -0
- package/skills/taze/js/docs/orchestrate.md +1 -1
- package/rules/style/admin_table/admin_table.mdc +0 -88
- package/rules/style/admin_table/concern.json +0 -7
- package/rules/style/admin_table/docs/index.md +0 -9
- package/rules/style/admin_table/docs/main.md +0 -14
- package/rules/style/admin_table/main.mjs +0 -46
- package/rules/style/colors/colors.mdc +0 -21
- package/rules/style/colors/concern.json +0 -3
- package/rules/style/gap/concern.json +0 -7
- package/rules/style/gap/docs/index.md +0 -9
- package/rules/style/gap/docs/main.md +0 -15
- package/rules/style/gap/gap.mdc +0 -22
- package/rules/style/gap/main.mjs +0 -51
- package/rules/style/lint/concern.json +0 -7
- package/rules/style/lint/docs/fix-lint.md +0 -29
- package/rules/style/lint/docs/index.md +0 -11
- package/rules/style/lint/docs/main.md +0 -29
- package/rules/style/lint/fix-lint.mjs +0 -66
- package/rules/style/lint/main.mjs +0 -68
- package/rules/style/main.json +0 -1
- package/rules/style/main.mdc +0 -12
- package/rules/style/package_json/concern.json +0 -9
- package/rules/style/package_json/docs/fix-package_json.md +0 -27
- package/rules/style/package_json/docs/index.md +0 -9
- package/rules/style/package_json/fix-package_json.mjs +0 -3
- package/rules/style/package_json/package_json.mdc +0 -18
- package/rules/style/package_json/package_json.rego +0 -31
- package/rules/style/package_json/template/package.json.snippet.json +0 -5
- package/rules/style/quasar/concern.json +0 -3
- package/rules/style/quasar/quasar.mdc +0 -7
- package/rules/style/quasar_fixes/concern.json +0 -7
- package/rules/style/quasar_fixes/docs/index.md +0 -9
- package/rules/style/quasar_fixes/docs/main.md +0 -16
- package/rules/style/quasar_fixes/main.mjs +0 -57
- package/rules/style/quasar_fixes/quasar_fixes.mdc +0 -32
- package/rules/style/tooling/concern.json +0 -14
- package/rules/style/tooling/docs/fix-tooling.md +0 -29
- package/rules/style/tooling/docs/index.md +0 -12
- package/rules/style/tooling/docs/main.md +0 -34
- package/rules/style/tooling/fix-tooling.mjs +0 -58
- package/rules/style/tooling/main.mjs +0 -73
- package/rules/style/tooling/tooling.mdc +0 -85
- package/rules/style/vscode_extensions/concern.json +0 -9
- package/rules/style/vscode_extensions/docs/fix-vscode_extensions.md +0 -25
- package/rules/style/vscode_extensions/docs/index.md +0 -11
- package/rules/style/vscode_extensions/fix-vscode_extensions.mjs +0 -1
- package/rules/style/vscode_extensions/template/extensions.json.snippet.json +0 -1
- package/rules/style/vscode_extensions/vscode_extensions.mdc +0 -13
- package/rules/style/vscode_extensions/vscode_extensions.rego +0 -13
- package/rules/style/vscode_settings/concern.json +0 -9
- package/rules/style/vscode_settings/docs/fix-vscode_settings.md +0 -27
- package/rules/style/vscode_settings/docs/index.md +0 -9
- package/rules/style/vscode_settings/fix-vscode_settings.mjs +0 -5
- package/rules/style/vscode_settings/template/settings.json.snippet.json +0 -5
- package/rules/style/vscode_settings/vscode_settings.mdc +0 -19
- package/rules/style/vscode_settings/vscode_settings.rego +0 -15
- package/rules/test/cargo_mutants_config/cargo_mutants_config.mdc +0 -18
- package/rules/test/cargo_mutants_config/concern.json +0 -8
- package/rules/test/cargo_mutants_config/data/cargo_mutants_config/mutants.toml.baseline +0 -7
- package/rules/test/cargo_mutants_config/docs/fix-cargo_mutants_config.md +0 -31
- package/rules/test/cargo_mutants_config/docs/index.md +0 -12
- package/rules/test/cargo_mutants_config/docs/main.md +0 -36
- package/rules/test/cargo_mutants_config/fix-cargo_mutants_config.mjs +0 -49
- package/rules/test/cargo_mutants_config/main.mjs +0 -62
- package/rules/test/docs/index.md +0 -11
- package/rules/test/lib/collect-test-file-offenders.mjs +0 -49
- package/rules/test/lib/docs/collect-test-file-offenders.md +0 -30
- package/rules/test/lib/docs/index.md +0 -9
- package/rules/test/location/concern.json +0 -8
- package/rules/test/location/docs/index.md +0 -11
- package/rules/test/location/docs/main.md +0 -36
- package/rules/test/location/location.mdc +0 -52
- package/rules/test/location/main.mjs +0 -70
- package/rules/test/main.json +0 -1
- package/rules/test/main.mdc +0 -26
- package/rules/test/no-bun-test-import/concern.json +0 -7
- package/rules/test/no-bun-test-import/docs/fix-no-bun-test-import.md +0 -31
- package/rules/test/no-bun-test-import/docs/index.md +0 -10
- package/rules/test/no-bun-test-import/docs/main.md +0 -36
- package/rules/test/no-bun-test-import/fix-no-bun-test-import.mjs +0 -51
- package/rules/test/no-bun-test-import/main.mjs +0 -105
- package/rules/test/no-bun-test-import/no-bun-test-import.mdc +0 -9
- package/rules/test/no-console-store-restore/concern.json +0 -7
- package/rules/test/no-console-store-restore/docs/index.md +0 -11
- package/rules/test/no-console-store-restore/docs/main.md +0 -44
- package/rules/test/no-console-store-restore/main.mjs +0 -55
- package/rules/test/no-console-store-restore/no-console-store-restore.mdc +0 -11
- package/rules/test/no-process-chdir/concern.json +0 -7
- package/rules/test/no-process-chdir/docs/index.md +0 -11
- package/rules/test/no-process-chdir/docs/main.md +0 -32
- package/rules/test/no-process-chdir/main.mjs +0 -40
- package/rules/test/no-process-chdir/no-process-chdir.mdc +0 -15
- package/rules/test/no-relative-fs-path/concern.json +0 -7
- package/rules/test/no-relative-fs-path/docs/index.md +0 -11
- package/rules/test/no-relative-fs-path/docs/main.md +0 -34
- package/rules/test/no-relative-fs-path/main.mjs +0 -239
- package/rules/test/no-relative-fs-path/no-relative-fs-path.mdc +0 -22
- package/rules/test/package_json/concern.json +0 -11
- package/rules/test/package_json/package_json.mdc +0 -18
- package/rules/test/package_json/package_json.rego +0 -25
- package/rules/test/package_json/template/package.json.contains.json +0 -6
- package/rules/test/sandbox-aware-test/concern.json +0 -7
- package/rules/test/sandbox-aware-test/docs/index.md +0 -11
- package/rules/test/sandbox-aware-test/docs/main.md +0 -55
- package/rules/test/sandbox-aware-test/main.mjs +0 -89
- package/rules/test/sandbox-aware-test/sandbox-aware-test.mdc +0 -28
- package/rules/test/stryker_config/concern.json +0 -8
- package/rules/test/stryker_config/data/stryker_config/docs/index.md +0 -13
- package/rules/test/stryker_config/data/stryker_config/docs/stryker-vue-macros-ignorer.md +0 -31
- package/rules/test/stryker_config/data/stryker_config/docs/stryker.config.baseline.md +0 -31
- package/rules/test/stryker_config/data/stryker_config/docs/stryker.config.vue.baseline.md +0 -35
- package/rules/test/stryker_config/data/stryker_config/stryker-vue-macros-ignorer.mjs +0 -48
- package/rules/test/stryker_config/data/stryker_config/stryker.config.baseline.mjs +0 -18
- package/rules/test/stryker_config/data/stryker_config/stryker.config.vue.baseline.mjs +0 -23
- package/rules/test/stryker_config/data/vitest_config/docs/index.md +0 -11
- package/rules/test/stryker_config/data/vitest_config/docs/vitest.config.baseline.md +0 -35
- package/rules/test/stryker_config/data/vitest_config/vitest.config.baseline.js +0 -22
- package/rules/test/stryker_config/docs/fix-stryker_config.md +0 -42
- package/rules/test/stryker_config/docs/index.md +0 -12
- package/rules/test/stryker_config/docs/main.md +0 -38
- package/rules/test/stryker_config/fix-stryker_config.mjs +0 -76
- package/rules/test/stryker_config/main.mjs +0 -504
- package/rules/test/stryker_config/stryker_config.mdc +0 -26
- package/rules/test/vitest-api-conventions/concern.json +0 -7
- package/rules/test/vitest-api-conventions/docs/index.md +0 -9
- package/rules/test/vitest-api-conventions/docs/main.md +0 -40
- package/rules/test/vitest-api-conventions/main.mjs +0 -153
- package/rules/test/vitest-api-conventions/vitest-api-conventions.mdc +0 -129
- package/rules/test/vitest-config-pool-forks/concern.json +0 -7
- package/rules/test/vitest-config-pool-forks/docs/index.md +0 -11
- package/rules/test/vitest-config-pool-forks/docs/main.md +0 -42
- package/rules/test/vitest-config-pool-forks/main.mjs +0 -41
- package/rules/test/vitest-config-pool-forks/vitest-config-pool-forks.mdc +0 -34
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/** @see ./docs/tooling.md */
|
|
2
|
-
import { existsSync } from 'node:fs'
|
|
3
|
-
import { readFile } from 'node:fs/promises'
|
|
4
|
-
import { join } from 'node:path'
|
|
5
|
-
|
|
6
|
-
import { createViolationReporter } from '../../../scripts/lib/lint-surface/violation-reporter.mjs'
|
|
7
|
-
|
|
8
|
-
// Зовнішні файли конфігу stylelint, які підхоплює cosmiconfig. Канон нових
|
|
9
|
-
// JS-конфігів — `.mjs`/`.cjs` (js.mdc), legacy `.js` лишається валідним.
|
|
10
|
-
const STYLELINT_CONFIG_FILES = [
|
|
11
|
-
'.stylelintrc.json',
|
|
12
|
-
'.stylelintrc.js',
|
|
13
|
-
'.stylelintrc.cjs',
|
|
14
|
-
'.stylelintrc.mjs',
|
|
15
|
-
'stylelint.config.js',
|
|
16
|
-
'stylelint.config.cjs',
|
|
17
|
-
'stylelint.config.mjs'
|
|
18
|
-
]
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Альтернатива полю `stylelint` у `package.json` — зовнішній файл конфігу. Якщо
|
|
22
|
-
* поля немає і файлу немає, фейлимося; якщо є хоч щось — пропускаємо. Поле
|
|
23
|
-
* `stylelint.extends == "@nitra/stylelint-config"` сам формат — у Rego.
|
|
24
|
-
* @param {ReturnType<typeof createViolationReporter>} reporter репортер
|
|
25
|
-
* @param {string} cwd корінь репозиторію
|
|
26
|
-
*/
|
|
27
|
-
async function checkStylelintConfigPresence(reporter, cwd) {
|
|
28
|
-
const { pass, fail } = reporter
|
|
29
|
-
const pkgPath = join(cwd, 'package.json')
|
|
30
|
-
if (!existsSync(pkgPath)) return
|
|
31
|
-
const pkg = JSON.parse(await readFile(pkgPath, 'utf8'))
|
|
32
|
-
const hasField = pkg.stylelint && typeof pkg.stylelint === 'object'
|
|
33
|
-
const hasExternalCfg = STYLELINT_CONFIG_FILES.some(name => existsSync(join(cwd, name)))
|
|
34
|
-
if (hasField || hasExternalCfg) {
|
|
35
|
-
pass('Конфіг stylelint є — у package.json або окремим файлом')
|
|
36
|
-
} else {
|
|
37
|
-
fail('Немає конфігу stylelint — додай "stylelint": { "extends": "@nitra/stylelint-config" } до package.json')
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// `.vscode/extensions.json` (`stylelint.vscode-stylelint`) і `.vscode/settings.json`
|
|
42
|
-
// (`css.validate`/`scss.validate`/`less.validate: false`) — у rego-пакетах
|
|
43
|
-
// `style_lint.vscode_extensions` і `style_lint.vscode_settings`, прогоняє
|
|
44
|
-
// `npx @7n/rules fix`. JS-копії видалено, щоб не було двох джерел істини.
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Перевіряє відповідність проєкту правилам style.mdc
|
|
48
|
-
* @param {import('../../../scripts/lib/lint-surface/types.mjs').LintContext} ctx контекст lint-прогону (cwd тощо)
|
|
49
|
-
* @returns {Promise<import('../../../scripts/lib/lint-surface/types.mjs').LintResult>} результат зі зібраними violations
|
|
50
|
-
*/
|
|
51
|
-
export async function lint(ctx) {
|
|
52
|
-
const cwd = ctx.cwd
|
|
53
|
-
const reporter = createViolationReporter(ctx)
|
|
54
|
-
const { pass, fail } = reporter
|
|
55
|
-
|
|
56
|
-
await checkStylelintConfigPresence(reporter, cwd)
|
|
57
|
-
|
|
58
|
-
const ignorePath = join(cwd, '.stylelintignore')
|
|
59
|
-
if (existsSync(ignorePath)) {
|
|
60
|
-
const ignoreContent = await readFile(ignorePath, 'utf8')
|
|
61
|
-
if (ignoreContent.split('\n').some(line => line.trim() === 'dist/')) {
|
|
62
|
-
pass('.stylelintignore існує і містить dist/')
|
|
63
|
-
} else {
|
|
64
|
-
fail('.stylelintignore не містить рядка dist/ — додай його (style.mdc)')
|
|
65
|
-
}
|
|
66
|
-
} else {
|
|
67
|
-
fail('.stylelintignore не існує — створи з вмістом: dist/')
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Existence/структуру lint-style.yml вимагає провайдер-плагін @7n/rules-ci-github
|
|
71
|
-
// (mixin style/lint_style_yml) — ядро провайдер-агностичне.
|
|
72
|
-
return reporter.result()
|
|
73
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
## Генерація та редагування стилів (Cursor і інші агенти)
|
|
2
|
-
|
|
3
|
-
- **Джерело правил:** перед тим як писати або суттєво змінювати **`.css`**, **`.scss`** або стилі в **`.vue`**, переглянь у корені проєкту (і в релевантних пакетах монорепо, якщо є) поле **`stylelint`** у **`package.json`** (зокрема `extends`), наявні **`.stylelintrc.*`**, **`stylelint.config.*`** та **`.stylelintignore`**. Не покладайся на «типові» правила stylelint з пам'яті — дотримуйся **проєктного** **`@nitra/stylelint-config`** і будь-яких локальних доповнень у репозиторії.
|
|
4
|
-
- **Форматування** узгоджуй з **`n-text.mdc`** (oxfmt / `.oxfmtrc.json` для css, scss тощо), щоб форматер і stylelint не суперечили один одному.
|
|
5
|
-
- **Запуск stylelint:** лише через **`n-rules lint style`** (локально — з auto-fix; у CI — `--no-fix`, нуль мутацій). Під капотом — `npx stylelint`; **не** використовуй **`bunx stylelint`**. Після змін запускай **`n-rules lint style`** і виправляй усе, що лишилось після auto-fix; за потреби — повний прогін `n-rules lint --full`.
|
|
6
|
-
- **Не розширюй винятки:** не додавай зайві **`stylelint-disable`** без потреби; краще підлаштувати стилі під правила проєкту.
|
|
7
|
-
|
|
8
|
-
## Канон налаштувань
|
|
9
|
-
|
|
10
|
-
### `package.json`
|
|
11
|
-
|
|
12
|
-
- `stylelint.extends`: [package.json.snippet.json](./policy/package_json/template/package.json.snippet.json)
|
|
13
|
-
|
|
14
|
-
Окремого `lint-style` скрипта немає — запуск через **`n-rules lint style`** (CI — `--no-fix`).
|
|
15
|
-
|
|
16
|
-
```json title="package.json"
|
|
17
|
-
"devDependencies": {
|
|
18
|
-
"@nitra/stylelint-config": "^1.4.0"
|
|
19
|
-
},
|
|
20
|
-
"stylelint": {
|
|
21
|
-
"extends": "@nitra/stylelint-config"
|
|
22
|
-
},
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
У корені проєкту має бути **`.stylelintignore`**:
|
|
26
|
-
|
|
27
|
-
```text title=".stylelintignore"
|
|
28
|
-
dist/
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### `.vscode/extensions.json`
|
|
32
|
-
|
|
33
|
-
- Канон `recommendations`: [extensions.json.snippet.json](./policy/vscode_extensions/template/extensions.json.snippet.json)
|
|
34
|
-
|
|
35
|
-
### `.vscode/settings.json`
|
|
36
|
-
|
|
37
|
-
- Вимкнення вбудованої CSS-валідації VS Code: [settings.json.snippet.json](./policy/vscode_settings/template/settings.json.snippet.json)
|
|
38
|
-
|
|
39
|
-
### CI: `.github/workflows/lint-style.yml`
|
|
40
|
-
|
|
41
|
-
- Канон: [lint-style.yml.snippet.yml](./policy/lint_style_yml/template/lint-style.yml.snippet.yml)
|
|
42
|
-
|
|
43
|
-
Додай **`.github/workflows/lint-style.yml`** (лише **`.yml`**, **`ga.mdc`**): після **`checkout`** — локальний composite **`setup-bun-deps`**, далі `n-rules lint style --no-fix` у кроці **`run`**. **Не** дублюй окремі кроки **`setup-node`** / **`oven-sh/setup-bun`** / кеш / **`npm install`**.
|
|
44
|
-
|
|
45
|
-
```yaml title=".github/workflows/lint-style.yml"
|
|
46
|
-
name: StyleLint
|
|
47
|
-
|
|
48
|
-
on:
|
|
49
|
-
push:
|
|
50
|
-
branches:
|
|
51
|
-
- dev
|
|
52
|
-
- main
|
|
53
|
-
paths:
|
|
54
|
-
- '**/*.css'
|
|
55
|
-
- '**/*.scss'
|
|
56
|
-
- '**/*.vue'
|
|
57
|
-
|
|
58
|
-
pull_request:
|
|
59
|
-
branches:
|
|
60
|
-
- dev
|
|
61
|
-
- main
|
|
62
|
-
paths:
|
|
63
|
-
- '**/*.css'
|
|
64
|
-
- '**/*.scss'
|
|
65
|
-
- '**/*.vue'
|
|
66
|
-
|
|
67
|
-
concurrency:
|
|
68
|
-
group: ${{ github.ref }}-${{ github.workflow }}
|
|
69
|
-
cancel-in-progress: true
|
|
70
|
-
|
|
71
|
-
jobs:
|
|
72
|
-
stylelint:
|
|
73
|
-
runs-on: ubuntu-latest
|
|
74
|
-
permissions:
|
|
75
|
-
contents: read
|
|
76
|
-
steps:
|
|
77
|
-
- uses: actions/checkout@v6
|
|
78
|
-
with:
|
|
79
|
-
persist-credentials: false
|
|
80
|
-
|
|
81
|
-
- uses: ./.github/actions/setup-bun-deps
|
|
82
|
-
|
|
83
|
-
- name: StyleLint
|
|
84
|
-
run: npx stylelint '**/*.{css,scss,vue}'
|
|
85
|
-
```
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: fix-vscode_extensions.mjs
|
|
4
|
-
resource: npm/rules/style/vscode_extensions/fix-vscode_extensions.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 3353fe17
|
|
7
|
-
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
tier: local-min
|
|
9
|
-
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.99
|
|
11
|
-
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Огляд
|
|
15
|
-
|
|
16
|
-
Файл ініціює процес інтеграції визначених шаблонів у розширення VS Code шляхом запуску зовнішнього скрипта. Цей скрипт забезпечує впровадження архітектурних патернів у ці розширення.
|
|
17
|
-
|
|
18
|
-
## Поведінка
|
|
19
|
-
|
|
20
|
-
1. Ініціює процес застосування визначених шаблонів до розширень VS Code.
|
|
21
|
-
2. Використовує зовнішній скрипт для додавання необхідних патернів до розширень.
|
|
22
|
-
|
|
23
|
-
## Гарантії поведінки
|
|
24
|
-
|
|
25
|
-
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: Directory Index
|
|
3
|
-
title: npm/rules/style/vscode_extensions
|
|
4
|
-
resource: npm/rules/style/vscode_extensions/
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# npm/rules/style/vscode_extensions
|
|
8
|
-
|
|
9
|
-
| Файл | Тип |
|
|
10
|
-
| ----------------------------------------------------- | --------- |
|
|
11
|
-
| [fix-vscode_extensions.mjs](fix-vscode_extensions.md) | JS Module |
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { patterns } from '../../../scripts/lib/fix/vscode-ext-add.mjs'
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "recommendations": ["stylelint.vscode-stylelint"] }
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
## .vscode/extensions.json: розширення для stylelint
|
|
2
|
-
|
|
3
|
-
Rego-пакет: `style_lint.vscode_extensions`
|
|
4
|
-
|
|
5
|
-
Цільовий файл: `.vscode/extensions.json`
|
|
6
|
-
|
|
7
|
-
Перевіряє, що масив `recommendations` містить усі записи з канонічного template (subset-check). Додаткові розширення поза списком — дозволені.
|
|
8
|
-
|
|
9
|
-
Канонічний template: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
|
|
10
|
-
|
|
11
|
-
**✓ Правильно** — `recommendations` містить `"stylelint.vscode-stylelint"` (може бути і більше елементів).
|
|
12
|
-
|
|
13
|
-
**✗ Неправильно** — `recommendations` відсутній або не містить `"stylelint.vscode-stylelint"`.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Перевірка `.vscode/extensions.json` для style (style.mdc).
|
|
2
|
-
#
|
|
3
|
-
# Канон надходить через --data: { "template": { "snippet": ... } }
|
|
4
|
-
# Структура --data сформована з template/extensions.json.snippet.json.
|
|
5
|
-
package style.vscode_extensions
|
|
6
|
-
|
|
7
|
-
import rego.v1
|
|
8
|
-
|
|
9
|
-
deny contains msg if {
|
|
10
|
-
some rec in data.template.snippet.recommendations
|
|
11
|
-
not rec in {r | some r in object.get(input, "recommendations", [])}
|
|
12
|
-
msg := sprintf(".vscode/extensions.json: recommendations має містити %q (style.mdc)", [rec])
|
|
13
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: fix-vscode_settings.mjs
|
|
4
|
-
resource: npm/rules/style/vscode_settings/fix-vscode_settings.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: eee71672
|
|
7
|
-
model: openai-codex/gpt-5.4-mini
|
|
8
|
-
tier: cloud-min
|
|
9
|
-
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.98
|
|
11
|
-
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Огляд
|
|
15
|
-
|
|
16
|
-
`patterns` описує узгоджені шаблони для `settings.json` і визначає, які значення в ньому мають відповідати очікуваному формату. Це потрібно, щоб конфіг лишався передбачуваним і однаково трактувався в різних місцях, де його використовують.
|
|
17
|
-
|
|
18
|
-
## Поведінка
|
|
19
|
-
|
|
20
|
-
1. `patterns` описує набір правил для приведення `.vscode/settings.json` до узгодженого стану з шаблонним стилем проєкту.
|
|
21
|
-
2. На основі цього набору система знаходить конфігурацію `settings.json` і підтягує її в механізм виправлення, щоб зберігати єдиний формат налаштувань у робочому середовищі.
|
|
22
|
-
3. Результат роботи `patterns` використовується як джерело стандарту для перевірки та вирівнювання вмісту `settings.json` без ручного втручання.
|
|
23
|
-
4. Модуль не змінює файлову систему чи бази даних; він лише надає опис поведінки для подальшого застосування.
|
|
24
|
-
|
|
25
|
-
## Гарантії поведінки
|
|
26
|
-
|
|
27
|
-
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: Directory Index
|
|
3
|
-
title: npm/rules/style/vscode_settings
|
|
4
|
-
resource: npm/rules/style/vscode_settings/
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
| Файл | Тип |
|
|
8
|
-
| ------------------------------------------------- | --------- |
|
|
9
|
-
| [fix-vscode_settings.mjs](fix-vscode_settings.md) | JS Module |
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
## .vscode/settings.json: вимкнення вбудованих CSS/SCSS/Less валідаторів
|
|
2
|
-
|
|
3
|
-
Rego-пакет: `style_lint.vscode_settings`
|
|
4
|
-
|
|
5
|
-
Цільовий файл: `.vscode/settings.json`
|
|
6
|
-
|
|
7
|
-
Leaf-by-leaf walker: перевіряє кожен ключ з template — його значення у `settings.json` має точно збігатися. Додаткові ключі у файлі — дозволені.
|
|
8
|
-
|
|
9
|
-
Канонічний template: [settings.json.snippet.json](./template/settings.json.snippet.json)
|
|
10
|
-
|
|
11
|
-
Обов'язкові значення:
|
|
12
|
-
|
|
13
|
-
- `"css.validate": false`
|
|
14
|
-
- `"less.validate": false`
|
|
15
|
-
- `"scss.validate": false`
|
|
16
|
-
|
|
17
|
-
**✓ Правильно** — усі три ключі присутні зі значенням `false`; можуть бути й інші ключі.
|
|
18
|
-
|
|
19
|
-
**✗ Неправильно** — будь-який з ключів відсутній, має значення `true` або рядок (`"off"`).
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Перевірка `.vscode/settings.json` для style (style.mdc).
|
|
2
|
-
#
|
|
3
|
-
# Канон надходить через --data: { "template": { "snippet": ... } }
|
|
4
|
-
# Структура --data сформована з template/settings.json.snippet.json.
|
|
5
|
-
# Top-level літеральні keys — leaf-by-leaf walker.
|
|
6
|
-
package style.vscode_settings
|
|
7
|
-
|
|
8
|
-
import rego.v1
|
|
9
|
-
|
|
10
|
-
deny contains msg if {
|
|
11
|
-
some key, expected_value in data.template.snippet
|
|
12
|
-
actual := object.get(input, key, null)
|
|
13
|
-
actual != expected_value
|
|
14
|
-
msg := sprintf(".vscode/settings.json: \"%s\" має бути %v (style.mdc)", [key, expected_value])
|
|
15
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
## Налаштування mutation-testing для Rust: `.cargo/mutants.toml`
|
|
2
|
-
|
|
3
|
-
Якщо у `.n-rules.json#rules` присутнє правило `rust` — правило `test` створює `.cargo/mutants.toml` у каталозі **кожного** Cargo.toml-маніфесту: кореневий `Cargo.toml`, `<workspace>/src-tauri/Cargo.toml` (Tauri-патерн) і `<workspace>/Cargo.toml` (flat workspace).
|
|
4
|
-
|
|
5
|
-
Канон cargo-mutants config: [mutants.toml.baseline](./data/cargo_mutants_config/mutants.toml.baseline)
|
|
6
|
-
|
|
7
|
-
**Customization** (mutate patterns, exclude rules, timeout) — відповідальність проєкту-споживача; концерн лише забезпечує наявність файлу як стартового baseline в кожному з виявлених workspace-каталогів.
|
|
8
|
-
|
|
9
|
-
### Універсальний baseline і framework-specific tuning
|
|
10
|
-
|
|
11
|
-
Правило `test` відповідає лише за **універсальний baseline** mutation-testing:
|
|
12
|
-
|
|
13
|
-
- створює `.cargo/mutants.toml` для Rust crates (порожній, з коментарем);
|
|
14
|
-
- не робить припущень про framework/app shell;
|
|
15
|
-
- не виключає platform glue, generated wrappers або binary entrypoints;
|
|
16
|
-
- framework-specific tuning (`--lib`/`--tests`, `exclude_globs` для app-shell і platform bridge файлів) належить відповідним правилам (`tauri`, `capacitor` тощо).
|
|
17
|
-
|
|
18
|
-
Якщо інше правило спеціалізує mutation-behavior — воно зобов'язане **доповнювати** існуючий `.cargo/mutants.toml` без дублювання (додавати лише відсутні ключі) і **не перетирати** ручні налаштування. Послідовний запуск `npx @7n/rules fix test` після `fix tauri` не має скидати tauri-tuning, і навпаки — повторний `fix tauri` не дублює секції.
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
# .cargo/mutants.toml — universal cargo-mutants baseline (test.mdc).
|
|
2
|
-
# Цей baseline нейтральний: він не робить припущень про framework/app shell,
|
|
3
|
-
# не виключає platform glue, generated wrappers або binary entrypoints.
|
|
4
|
-
# Framework-specific tuning (Tauri, Capacitor тощо) належить відповідним
|
|
5
|
-
# правилам — вони без дублювання доповнюють цей файл, не перетирають його.
|
|
6
|
-
# cargo-mutants має робочі defaults; цей файл — стартова точка для customization.
|
|
7
|
-
# Документація: https://mutants.rs/
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: fix-cargo_mutants_config.mjs
|
|
4
|
-
resource: npm/rules/test/cargo_mutants_config/fix-cargo_mutants_config.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: cf485f41
|
|
7
|
-
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
tier: local-min-retry
|
|
9
|
-
score: 100
|
|
10
|
-
issues: judge:inaccurate:0.99
|
|
11
|
-
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Огляд
|
|
15
|
-
|
|
16
|
-
Для виконання завдання мені потрібен **код або контекст** файлу `test/cargo_mutants_config`, щоб я міг переписати секцію "Overview" відповідно до наданих "ВІДОМИХ ФАКТІВ" та уникнути помилок із "ЧЕРНЕТКОЮ".
|
|
17
|
-
|
|
18
|
-
## Поведінка
|
|
19
|
-
|
|
20
|
-
1. Перевіряє, чи не виявлено порушення, пов'язане з відсутністю конфігураційного файлу для мутантів у Cargo-проекті.
|
|
21
|
-
2. Якщо конфігураційний файл не існує в каталозі з резервною копією, виконується наступне:
|
|
22
|
-
3. Збираються шляхи до всіх Cargo-маніфестів у робочому каталозі.
|
|
23
|
-
4. Для кожного знайденого Cargo-маніфеста визначається цільовий шлях до файлу `mutants.toml`.
|
|
24
|
-
5. Якщо цільовий файл не існує, система позначає його для запису.
|
|
25
|
-
6. Створюється директорія, якщо вона відсутня.
|
|
26
|
-
7. З резервної копії копіюється вміст конфігураційного файлу до цільового шляху.
|
|
27
|
-
8. Якщо жоден файл не було створено, операція завершується без змін.
|
|
28
|
-
|
|
29
|
-
## Гарантії поведінки
|
|
30
|
-
|
|
31
|
-
- (специфічних машинно-виведених гарантій немає)
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: Directory Index
|
|
3
|
-
title: npm/rules/test/cargo_mutants_config
|
|
4
|
-
resource: npm/rules/test/cargo_mutants_config/
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# npm/rules/test/cargo_mutants_config
|
|
8
|
-
|
|
9
|
-
| Файл | Тип |
|
|
10
|
-
| ----------------------------------------------------------- | --------- |
|
|
11
|
-
| [fix-cargo_mutants_config.mjs](fix-cargo_mutants_config.md) | JS Module |
|
|
12
|
-
| [main.mjs](main.md) | JS Module |
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: main.mjs
|
|
4
|
-
resource: npm/rules/test/cargo_mutants_config/main.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 817124cc
|
|
7
|
-
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
score: 95
|
|
9
|
-
judgeModel: openai-codex/gpt-5.4-mini
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Огляд
|
|
13
|
-
|
|
14
|
-
Огляд: Файл перевіряє конфігурацію проекту, зокрема налаштування для мови Rust. Він забезпечує, що у директоріях, що містять файли маніфестів Cargo, існує файл `mutants.toml`, копіюючи базовий файл, якщо він відсутній.
|
|
15
|
-
|
|
16
|
-
Поведінка:
|
|
17
|
-
|
|
18
|
-
1. Перевіряється, чи активована логіка для мови Rust.
|
|
19
|
-
2. Ідентифікуються всі файли маніфестів Cargo.
|
|
20
|
-
3. Перевіряється наявність базового файлу `mutants.toml.baseline`.
|
|
21
|
-
4. Для кожного знайденого файлу маніфесту Cargo, якщо файл `.cargo/mutants.toml` відсутній, він створюється, копіюючи вміст базового файлу. **[test.mdc]**
|
|
22
|
-
5. Процес завершується з кодом 0, якщо всі перевірки виконані або відповідні файли не виявлені/немає порушень; з кодом 1 у разі виявлення порушень.
|
|
23
|
-
|
|
24
|
-
## Поведінка
|
|
25
|
-
|
|
26
|
-
Поведінка:
|
|
27
|
-
|
|
28
|
-
1. Перевіряється, увімкнено чи ні правило для мови Rust.
|
|
29
|
-
2. З'ясовуються всі файли маніфестів Cargo.
|
|
30
|
-
3. Перевіряється наявність канонічного базового файлу `mutants.toml.baseline`.
|
|
31
|
-
4. Для кожного знайденого файлу маніфесту Cargo, якщо файл `.cargo/mutants.toml` відсутній, він створюється, копіюючи вміст базового файлу.
|
|
32
|
-
5. Процес завершується з кодом 0, якщо всі перевірки пройдені або якщо відповідні файли не знайдено/немає порушень; з кодом 1 у разі виявлення порушень.
|
|
33
|
-
|
|
34
|
-
## Гарантії поведінки
|
|
35
|
-
|
|
36
|
-
- (специфічних машинно-виведених гарантій немає)
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* T0-autofix для `test/cargo_mutants_config` — детерміноване створення
|
|
3
|
-
* `<cargoDir>/.cargo/mutants.toml` з canonical neutral baseline там, де його ще
|
|
4
|
-
* немає. Логіку перенесено з detector-а (read-only contract: detector лише звітує
|
|
5
|
-
* `mutants-config-missing`, запис — тут).
|
|
6
|
-
*
|
|
7
|
-
* Unified lint surface: structured violations (test(violations)/apply(violations,ctx)).
|
|
8
|
-
* Цільові каталоги резолвимо повторним скануванням Cargo-маніфестів від `ctx.cwd`
|
|
9
|
-
* (idempotent: existing target пропускаємо → touchedFiles лишається порожнім).
|
|
10
|
-
*/
|
|
11
|
-
import { existsSync } from 'node:fs'
|
|
12
|
-
import { copyFile, mkdir } from 'node:fs/promises'
|
|
13
|
-
import { dirname, join } from 'node:path'
|
|
14
|
-
import { fileURLToPath } from 'node:url'
|
|
15
|
-
|
|
16
|
-
import { resolveAllCargoManifests } from '../../../scripts/utils/resolve-cargo-manifest.mjs'
|
|
17
|
-
|
|
18
|
-
import { MUTANTS_CONFIG_MISSING } from './main.mjs'
|
|
19
|
-
|
|
20
|
-
const BASELINE_PATH = join(
|
|
21
|
-
dirname(fileURLToPath(import.meta.url)),
|
|
22
|
-
'data',
|
|
23
|
-
'cargo_mutants_config',
|
|
24
|
-
'mutants.toml.baseline'
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
/** @type {import('../../../scripts/lib/lint-surface/types.mjs').T0Pattern[]} */
|
|
28
|
-
export const patterns = [
|
|
29
|
-
{
|
|
30
|
-
id: 'test-cargo-mutants-config-create',
|
|
31
|
-
test: violations => violations.some(v => v.reason === MUTANTS_CONFIG_MISSING),
|
|
32
|
-
apply: async (violations, ctx) => {
|
|
33
|
-
if (!existsSync(BASELINE_PATH)) return { touchedFiles: [] }
|
|
34
|
-
const cwd = ctx.cwd
|
|
35
|
-
const manifests = await resolveAllCargoManifests(cwd)
|
|
36
|
-
const touchedFiles = []
|
|
37
|
-
for (const manifestPath of manifests) {
|
|
38
|
-
const target = join(dirname(manifestPath), '.cargo', 'mutants.toml')
|
|
39
|
-
if (existsSync(target)) continue
|
|
40
|
-
ctx.recordWrite?.(target)
|
|
41
|
-
await mkdir(dirname(target), { recursive: true })
|
|
42
|
-
await copyFile(BASELINE_PATH, target)
|
|
43
|
-
touchedFiles.push(target)
|
|
44
|
-
}
|
|
45
|
-
if (touchedFiles.length === 0) return { touchedFiles: [] }
|
|
46
|
-
return { touchedFiles, message: `створено .cargo/mutants.toml: ${touchedFiles.join(', ')}` }
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
]
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @see ./docs/cargo_mutants_config.md
|
|
3
|
-
*
|
|
4
|
-
* Read-only detector: лише ЗВІТУЄ про відсутній `<cargoDir>/.cargo/mutants.toml`.
|
|
5
|
-
* Створення canonical baseline — окремий T0-fix (`fix-cargo_mutants_config.mjs`),
|
|
6
|
-
* не в detector-і (`lint --no-fix` ніколи не мутує дерево).
|
|
7
|
-
*/
|
|
8
|
-
import { existsSync } from 'node:fs'
|
|
9
|
-
import { dirname, join, relative } from 'node:path'
|
|
10
|
-
import { fileURLToPath } from 'node:url'
|
|
11
|
-
|
|
12
|
-
import { createViolationReporter } from '../../../scripts/lib/lint-surface/violation-reporter.mjs'
|
|
13
|
-
import { readNRulesConfigLite } from '../../../scripts/lib/read-n-rules-config-lite.mjs'
|
|
14
|
-
import { resolveAllCargoManifests } from '../../../scripts/utils/resolve-cargo-manifest.mjs'
|
|
15
|
-
|
|
16
|
-
const HERE = dirname(fileURLToPath(import.meta.url))
|
|
17
|
-
const BASELINE_PATH = join(HERE, 'data', 'cargo_mutants_config', 'mutants.toml.baseline')
|
|
18
|
-
|
|
19
|
-
/** Стабільний reason для відсутнього `.cargo/mutants.toml` (T0 матчиться за ним). */
|
|
20
|
-
export const MUTANTS_CONFIG_MISSING = 'mutants-config-missing'
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @param {import('../../../scripts/lib/lint-surface/types.mjs').LintContext} ctx Контекст лінту (cwd, перелік файлів тощо).
|
|
24
|
-
* @returns {Promise<import('../../../scripts/lib/lint-surface/types.mjs').LintResult>} Результат лінту з переліком порушень.
|
|
25
|
-
*/
|
|
26
|
-
export async function lint(ctx) {
|
|
27
|
-
const reporter = createViolationReporter(ctx)
|
|
28
|
-
const cwd = ctx.cwd
|
|
29
|
-
const config = await readNRulesConfigLite(cwd)
|
|
30
|
-
|
|
31
|
-
// Self-gate: rust має бути enabled
|
|
32
|
-
if (!config.rules.includes('rust') || config.disableRules.includes('rust')) {
|
|
33
|
-
return reporter.result()
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const manifests = await resolveAllCargoManifests(cwd)
|
|
37
|
-
if (manifests.length === 0) {
|
|
38
|
-
// rust enabled, але Cargo.toml ще немає — silently skip (manifest може з'явитися пізніше)
|
|
39
|
-
return reporter.result()
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (!existsSync(BASELINE_PATH)) {
|
|
43
|
-
reporter.fail(`.cargo/mutants.toml canonical baseline не знайдено (${BASELINE_PATH}) — перевстанови @7n/rules`)
|
|
44
|
-
return reporter.result()
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
for (const manifestPath of manifests) {
|
|
48
|
-
const cargoDir = dirname(manifestPath)
|
|
49
|
-
const target = join(cargoDir, '.cargo', 'mutants.toml')
|
|
50
|
-
|
|
51
|
-
if (existsSync(target)) {
|
|
52
|
-
reporter.pass(`.cargo/mutants.toml існує (${relative(cwd, target)})`)
|
|
53
|
-
continue
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
reporter.fail(
|
|
57
|
-
`.cargo/mutants.toml відсутній (${relative(cwd, target)}) — запусти \`npx @7n/rules lint test\` для генерації canonical baseline (test.mdc)`,
|
|
58
|
-
{ reason: MUTANTS_CONFIG_MISSING, file: relative(cwd, target) }
|
|
59
|
-
)
|
|
60
|
-
}
|
|
61
|
-
return reporter.result()
|
|
62
|
-
}
|
package/rules/test/docs/index.md
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/** @see ../docs/collect-test-file-offenders.md */
|
|
2
|
-
import { readFile } from 'node:fs/promises'
|
|
3
|
-
import { basename, relative } from 'node:path'
|
|
4
|
-
|
|
5
|
-
import { loadCursorIgnorePaths } from '../../../scripts/lib/load-cursor-config.mjs'
|
|
6
|
-
import { walkDir } from '../../../scripts/utils/walkDir.mjs'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Чи файл — JS-тест (`*.test.mjs` / `*.test.js`).
|
|
10
|
-
* @param {string} absPath абсолютний шлях
|
|
11
|
-
* @returns {boolean} `true` для `.test.{mjs,js}` файлів
|
|
12
|
-
*/
|
|
13
|
-
export function isTestFile(absPath) {
|
|
14
|
-
const name = basename(absPath)
|
|
15
|
-
return name.endsWith('.test.mjs') || name.endsWith('.test.js')
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Обходить репо (поважаючи `.n-rules.json:ignore`), збирає `*.test.{mjs,js}` файли
|
|
20
|
-
* і прогонить кожен через `findOffenders(body)` — спільний скелет для per-file
|
|
21
|
-
* regex/parse-based test-конвенцій (напр. `no-console-store-restore`, `vitest-api-conventions`).
|
|
22
|
-
* @param {string} cwd корінь репозиторію
|
|
23
|
-
* @param {(body: string) => Array<{line: number}>} findOffenders детектор порушень у тілі файлу
|
|
24
|
-
* @returns {Promise<{ testFiles: string[], offenders: Array<{file: string, line: number}> }>} усі тестові файли й знайдені порушення (з relative-шляхом)
|
|
25
|
-
*/
|
|
26
|
-
export async function collectTestFileOffenders(cwd, findOffenders) {
|
|
27
|
-
const ignorePaths = await loadCursorIgnorePaths(cwd)
|
|
28
|
-
|
|
29
|
-
/** @type {string[]} */
|
|
30
|
-
const testFiles = []
|
|
31
|
-
await walkDir(
|
|
32
|
-
cwd,
|
|
33
|
-
absPath => {
|
|
34
|
-
if (isTestFile(absPath)) testFiles.push(absPath)
|
|
35
|
-
},
|
|
36
|
-
ignorePaths
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
/** @type {Array<{file: string, line: number}>} */
|
|
40
|
-
const offenders = []
|
|
41
|
-
for (const absPath of testFiles) {
|
|
42
|
-
const body = await readFile(absPath, 'utf8')
|
|
43
|
-
for (const o of findOffenders(body)) {
|
|
44
|
-
offenders.push({ file: relative(cwd, absPath), ...o })
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return { testFiles, offenders }
|
|
49
|
-
}
|