@7n/rules 1.20.1 → 1.21.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 +6 -0
- package/package.json +1 -1
- package/scripts/lib/docs/resolve-plugins.md +1 -1
- package/rules/python/applies/concern.json +0 -4
- package/rules/python/applies/docs/main.md +0 -29
- package/rules/python/applies/main.mjs +0 -24
- package/rules/python/docs/index.md +0 -11
- package/rules/python/lib/docs/index.md +0 -9
- package/rules/python/lib/docs/uv-run.md +0 -31
- package/rules/python/lib/uv-run.mjs +0 -52
- package/rules/python/main.json +0 -1
- package/rules/python/main.mdc +0 -8
- package/rules/python/mypy/concern.json +0 -7
- package/rules/python/mypy/docs/main.md +0 -32
- package/rules/python/mypy/main.mjs +0 -37
- package/rules/python/project/concern.json +0 -6
- package/rules/python/project/docs/main.md +0 -42
- package/rules/python/project/main.mjs +0 -125
- package/rules/python/pyproject_toml/concern.json +0 -9
- package/rules/python/pyproject_toml/pyproject_toml.mdc +0 -29
- package/rules/python/pyproject_toml/pyproject_toml.rego +0 -53
- package/rules/python/pyproject_toml/template/pyproject.toml.deny.toml +0 -2
- package/rules/python/pyproject_toml/template/pyproject.toml.snippet.toml +0 -12
- package/rules/python/ruff/concern.json +0 -7
- package/rules/python/ruff/docs/fix-ruff.md +0 -33
- package/rules/python/ruff/docs/main.md +0 -35
- package/rules/python/ruff/fix-ruff.mjs +0 -65
- package/rules/python/ruff/main.mjs +0 -53
- package/rules/python/tooling/concern.json +0 -15
- package/rules/python/tooling/docs/index.md +0 -11
- package/rules/python/tooling/docs/main.md +0 -35
- package/rules/python/tooling/main.mjs +0 -45
- package/rules/python/tooling/tooling.mdc +0 -22
- package/rules/rust/applies/concern.json +0 -4
- package/rules/rust/applies/docs/index.md +0 -11
- package/rules/rust/applies/docs/main.md +0 -30
- package/rules/rust/applies/main.mjs +0 -28
- package/rules/rust/check/check.mdc +0 -16
- package/rules/rust/check/concern.json +0 -7
- package/rules/rust/check/docs/fix-check.md +0 -30
- package/rules/rust/check/docs/index.md +0 -11
- package/rules/rust/check/docs/main.md +0 -37
- package/rules/rust/check/fix-check.mjs +0 -80
- package/rules/rust/check/main.mjs +0 -87
- package/rules/rust/docs/index.md +0 -11
- package/rules/rust/lib/docs/has-cargo-toml.md +0 -134
- package/rules/rust/lib/docs/index.md +0 -11
- package/rules/rust/lib/has-cargo-toml.mjs +0 -37
- package/rules/rust/main.json +0 -1
- package/rules/rust/main.mdc +0 -8
- package/rules/rust/package_json/concern.json +0 -10
- package/rules/rust/package_json/package_json.mdc +0 -12
- package/rules/rust/package_json/package_json.rego +0 -20
- package/rules/rust/vscode_extensions/concern.json +0 -11
- package/rules/rust/vscode_extensions/docs/fix-vscode_extensions.md +0 -25
- package/rules/rust/vscode_extensions/docs/index.md +0 -11
- package/rules/rust/vscode_extensions/fix-vscode_extensions.mjs +0 -1
- package/rules/rust/vscode_extensions/template/extensions.json.snippet.json +0 -1
- package/rules/rust/vscode_extensions/vscode_extensions.mdc +0 -9
- package/rules/rust/vscode_extensions/vscode_extensions.rego +0 -15
package/rules/rust/docs/index.md
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: has-cargo-toml.mjs
|
|
4
|
-
resource: npm/rules/rust/lib/has-cargo-toml.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: f55fc57e
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
Модуль `has-cargo-toml.mjs` — rule-local утиліта для правил Rust, що визначає наявність маніфесту Cargo (`Cargo.toml`) у дереві файлової системи, починаючи з заданого кореневого каталогу. Використовується як applies-walker на рівні правила: дозволяє правилу Rust динамічно вирішувати, чи варто застосовуватися до конкретного workspace/cwd, шукаючи `Cargo.toml` у поточному каталозі або в будь-якому з підкаталогів.
|
|
10
|
-
|
|
11
|
-
Реалізація — синхронний рекурсивний обхід каталогів з раннім поверненням (`early return`) при першому ж знайденому `Cargo.toml`, без читання вмісту файлів. Імена директорій, у які заходити не треба (наприклад, `node_modules`, `.git`, `.next`, `.turbo`), передаються ззовні через `Set<string>` — модуль свідомо не містить власного списку, щоб список ігнорувань був єдиним з тим, що в `npm/scripts/auto-rules.mjs` (на рівні виклику).
|
|
12
|
-
|
|
13
|
-
Утиліта навмисно тримається rule-local (у каталозі правила `rust/lib/`), оскільки на момент написання її єдиний споживач — правило `rust`. У документуючому коментарі модуля зазначено: якщо з'явиться другий споживач — утиліту слід підняти у спільний `npm/scripts/lib/`.
|
|
14
|
-
|
|
15
|
-
## Експорти / API
|
|
16
|
-
|
|
17
|
-
Модуль експортує одну іменовану функцію:
|
|
18
|
-
|
|
19
|
-
- `hasCargoTomlInTree(root, ignoredDirNames)` — `function`, named export.
|
|
20
|
-
|
|
21
|
-
Інших експортів (default, типів, констант) у модулі немає.
|
|
22
|
-
|
|
23
|
-
## Функції
|
|
24
|
-
|
|
25
|
-
### `hasCargoTomlInTree(root, ignoredDirNames)`
|
|
26
|
-
|
|
27
|
-
**Сигнатура:**
|
|
28
|
-
|
|
29
|
-
```js
|
|
30
|
-
export function hasCargoTomlInTree(root: string, ignoredDirNames: Set<string>): boolean
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
**Параметри:**
|
|
34
|
-
|
|
35
|
-
- `root` — `string`. Абсолютний шлях до кореневого каталогу, з якого починається пошук. Передається у внутрішню функцію `walk` як стартова точка обходу.
|
|
36
|
-
- `ignoredDirNames` — `Set<string>`. Множина імен директорій (саме базових імен — не шляхів), у які НЕ слід заходити під час обходу. Перевірка виконується через `ignoredDirNames.has(entry.name)`. Типові значення, які формує викликова сторона: `'node_modules'`, `'.git'`, `'.next'`, `'.turbo'`.
|
|
37
|
-
|
|
38
|
-
**Повертає:**
|
|
39
|
-
|
|
40
|
-
- `boolean` — `true`, якщо в піддереві з коренем `root` (включно з самим `root`) знайдено хоча б один файл з ім'ям `Cargo.toml`. `false` — якщо такого файла немає, або якщо корінь недоступний для читання.
|
|
41
|
-
|
|
42
|
-
**Алгоритм:**
|
|
43
|
-
|
|
44
|
-
1. Викликається внутрішня функція `walk(root)`.
|
|
45
|
-
2. Усередині `walk(dir)` робиться спроба отримати вміст каталогу через `readdirSync(dir, { withFileTypes: true })`, що повертає масив об'єктів `Dirent`.
|
|
46
|
-
3. Якщо `readdirSync` кидає виключення (наприклад, `EACCES`, `ENOENT`, `ENOTDIR`) — воно мовчки ловиться `catch {}` і функція повертає `false` для цього каталогу (обхід продовжується для інших гілок, якщо вони є).
|
|
47
|
-
4. Виконується ітерація по `entries`:
|
|
48
|
-
- Якщо запис — це файл і його ім'я дорівнює рівно `'Cargo.toml'`, негайно повертається `true` (early return).
|
|
49
|
-
- Якщо запис — це каталог і його ім'я не входить у `ignoredDirNames`, рекурсивно викликається `walk(join(dir, entry.name))`; при `true` від рекурсії — негайно повертається `true`.
|
|
50
|
-
5. Якщо жоден запис не дав `true`, повертається `false`.
|
|
51
|
-
|
|
52
|
-
Порядок обходу — детерміністичний у межах одного запуску і визначається порядком, який повертає `readdirSync` (як правило, залежить від ФС/ОС). Це означає, що логічний результат (boolean) детерміністичний, але швидкість виявлення `Cargo.toml` залежить від порядку записів.
|
|
53
|
-
|
|
54
|
-
Алгоритм має властивість «depth-first з раннім return»: знайшовши `Cargo.toml` у першій же підгілці, функція не обходить решту дерева.
|
|
55
|
-
|
|
56
|
-
**Side effects:**
|
|
57
|
-
|
|
58
|
-
- Виключно синхронні I/O-операції читання вмісту директорій через `readdirSync` із Node.js `fs`. Не читає вміст файлів, не пише на диск, не звертається до мережі, не змінює глобальний стан.
|
|
59
|
-
- При помилках доступу до окремого каталогу не пробрасує виключення назовні — глушить їх через `try/catch` і повертає `false` лише для проблемної гілки.
|
|
60
|
-
- Блокує event loop на час обходу (синхронне API). Для дуже великих дерев це може бути помітним; ризик частково мітигує ранній return і список `ignoredDirNames`, що відсікає типові важкі директорії на кшталт `node_modules`.
|
|
61
|
-
|
|
62
|
-
**Внутрішня функція `walk(dir)`:**
|
|
63
|
-
|
|
64
|
-
- `dir` — `string`, абсолютний шлях каталогу для обходу.
|
|
65
|
-
- Повертає `boolean` — `true`, якщо в піддереві `dir` є `Cargo.toml`.
|
|
66
|
-
- Замикається на параметр `ignoredDirNames` зовнішньої функції (тобто множина передається один раз і використовується на всіх рівнях рекурсії без повторної параметризації).
|
|
67
|
-
|
|
68
|
-
## Залежності
|
|
69
|
-
|
|
70
|
-
Зовнішні npm-залежності — відсутні. Модуль працює виключно на стандартній бібліотеці Node.js:
|
|
71
|
-
|
|
72
|
-
- `node:fs` — імпортується `readdirSync` для синхронного читання вмісту каталогу з опцією `withFileTypes: true`, що повертає `Dirent[]` (для уникнення додаткових `statSync` на кожен запис).
|
|
73
|
-
- `node:path` — імпортується `join` для безпечного склеювання шляхів `dir + entry.name` із врахуванням розділювача ОС.
|
|
74
|
-
|
|
75
|
-
Імпорти використовують префікс `node:` (`node:fs`, `node:path`) — це канонічна форма посилання на вбудовані модулі Node.js, що відрізняє їх від npm-пакунків.
|
|
76
|
-
|
|
77
|
-
Модуль написаний як ES Module (`.mjs`): використовуються `import` та `export`.
|
|
78
|
-
|
|
79
|
-
Внутрішніх залежностей від інших файлів проєкту немає — модуль повністю самодостатній.
|
|
80
|
-
|
|
81
|
-
## Потік виконання / Використання
|
|
82
|
-
|
|
83
|
-
### Контекст застосування
|
|
84
|
-
|
|
85
|
-
Функція проектована як applies-walker для правил Rust: правило викликає її, щоб дізнатися, чи має воно сенс у поточному репозиторії/workspace. Якщо `Cargo.toml` ніде не знайдено — правило застосовувати не треба.
|
|
86
|
-
|
|
87
|
-
### Типовий виклик
|
|
88
|
-
|
|
89
|
-
```js
|
|
90
|
-
import { hasCargoTomlInTree } from './lib/has-cargo-toml.mjs'
|
|
91
|
-
|
|
92
|
-
const IGNORED = new Set(['node_modules', '.git', '.next', '.turbo'])
|
|
93
|
-
|
|
94
|
-
if (hasCargoTomlInTree(process.cwd(), IGNORED)) {
|
|
95
|
-
// правило Rust застосовується: десь у дереві є Cargo.toml
|
|
96
|
-
} else {
|
|
97
|
-
// Rust-проєкту не виявлено — правило пропускається
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Список ігнорованих директорій формується викликовою стороною й має співпадати зі списком, який використовує `npm/scripts/auto-rules.mjs` (це вимога з заголовного коментаря модуля — щоб поведінка обходу була узгоджена між скриптом авто-правил і rule-local утилітою).
|
|
102
|
-
|
|
103
|
-
### Розгортання потоку виконання
|
|
104
|
-
|
|
105
|
-
1. Споживач (правило Rust) формує `Set<string>` ігнорованих імен директорій.
|
|
106
|
-
2. Споживач викликає `hasCargoTomlInTree(root, ignoredDirNames)` із кореневим шляхом (зазвичай — поточний workspace або репозиторій).
|
|
107
|
-
3. Усередині функції стартує `walk(root)`:
|
|
108
|
-
- Якщо `root` сам містить `Cargo.toml` як файл першого рівня — повертається `true` без рекурсії далі по цьому ж рівню (інші записи не перевіряються після першого ж `Cargo.toml`).
|
|
109
|
-
- Якщо `Cargo.toml` на першому рівні немає — обхід заглиблюється у кожен підкаталог, якого немає в `ignoredDirNames`.
|
|
110
|
-
- Перший же `true` із рекурсії припиняє обхід і пробрасує `true` нагору.
|
|
111
|
-
4. Якщо все дерево пройдене без знахідки — повертається `false`.
|
|
112
|
-
5. Споживач використовує boolean-результат для прийняття рішення про застосування правила.
|
|
113
|
-
|
|
114
|
-
### Граничні випадки
|
|
115
|
-
|
|
116
|
-
- **Порожній `ignoredDirNames`** (`new Set()`): функція обходить геть усе дерево, включно з `node_modules` тощо — це коректно, але повільно.
|
|
117
|
-
- **Неіснуючий `root`**: `readdirSync` кидає `ENOENT`, помилка ловиться, функція повертає `false`.
|
|
118
|
-
- **`root` не є директорією** (наприклад, шлях до файлу): `readdirSync` кидає `ENOTDIR`, ловиться `catch`, повертається `false`.
|
|
119
|
-
- **Cargo.toml як директорія**: пропускається, бо перевірка йде через `entry.isFile() && entry.name === 'Cargo.toml'` — потрібен саме файл.
|
|
120
|
-
- **Симлінки**: `withFileTypes: true` повертає `Dirent` з власними методами; `entry.isFile()` для симлінка поверне `false`, `entry.isDirectory()` — теж `false` (метод `isSymbolicLink()` тут не перевіряється), тож симлінки фактично не переходяться. Це свідомий вибір — захист від циклів через симлінки.
|
|
121
|
-
- **Cargo.toml у самому корені**: знаходиться на першому ж рівні без рекурсії.
|
|
122
|
-
- **Cargo.toml виключно всередині `node_modules`** (за умови, що `node_modules` у `ignoredDirNames`): не знаходиться, функція повертає `false`. Це навмисна поведінка: ні правила, ні авто-обхід не повинні «бачити» вендоровані Rust-маніфести з npm-залежностей.
|
|
123
|
-
|
|
124
|
-
### Контекст у проєкті
|
|
125
|
-
|
|
126
|
-
Згідно з заголовним коментарем файлу:
|
|
127
|
-
|
|
128
|
-
- Утиліта живе у `npm/rules/rust/lib/` як rule-local — лише `rust`-правило її використовує.
|
|
129
|
-
- Список ігнорованих директорій має узгоджуватися зі списком у `npm/scripts/auto-rules.mjs`.
|
|
130
|
-
- Інваріант масштабування: при появі другого споживача — підняти модуль у спільний `npm/scripts/lib/`.
|
|
131
|
-
|
|
132
|
-
## Rebuild Test
|
|
133
|
-
|
|
134
|
-
За цією документацією модуль можна відтворити: один ES-модуль з імпортами `readdirSync` із `node:fs` та `join` із `node:path`, що експортує іменовану функцію `hasCargoTomlInTree(root, ignoredDirNames)`. Усередині — внутрішня рекурсивна функція `walk(dir)` із синхронним `readdirSync(dir, { withFileTypes: true })`, обгорнутим у `try/catch`, ітерацією по `Dirent`-записах, перевіркою `isFile() && name === 'Cargo.toml'` для негайного `true`, та рекурсією у підкаталоги через `join(dir, entry.name)` за умови `isDirectory() && !ignoredDirNames.has(name)`. Поведінкові інваріанти: ранній return при знахідці; повернення `false` при помилці читання каталогу; пропуск ігнорованих директорій; обхід не йде у симлінки (бо `isDirectory()` для симлінка повертає `false`); жодних побічних ефектів окрім читання структури директорій. Сигнатура: `(string, Set<string>) => boolean`.
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule-level applies-walker правила rust: рекурсивно шукає Cargo.toml у
|
|
3
|
-
* cwd або будь-якому workspace-підкаталозі. Пропускає `node_modules`, `.git`,
|
|
4
|
-
* `.next`, `.turbo` за тим самим списком, що `npm/scripts/auto-rules.mjs`.
|
|
5
|
-
*
|
|
6
|
-
* Утиліта rule-local, бо лише `rust` потребує "знайти Cargo.toml у дереві";
|
|
7
|
-
* якщо з'явиться другий споживач — підняти у `npm/scripts/lib/`.
|
|
8
|
-
*/
|
|
9
|
-
import { readdirSync } from 'node:fs'
|
|
10
|
-
import { join } from 'node:path'
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Чи присутній хоч один Cargo.toml у дереві `root` (синхронно, з раннім return).
|
|
14
|
-
* @param {string} root абсолютний шлях кореня
|
|
15
|
-
* @param {Set<string>} ignoredDirNames імена директорій, в які НЕ заходимо
|
|
16
|
-
* @returns {boolean} true, якщо знайдено Cargo.toml
|
|
17
|
-
*/
|
|
18
|
-
export function hasCargoTomlInTree(root, ignoredDirNames) {
|
|
19
|
-
/**
|
|
20
|
-
* @param {string} dir абсолютний шлях каталогу для обходу
|
|
21
|
-
* @returns {boolean} true якщо в піддереві є Cargo.toml
|
|
22
|
-
*/
|
|
23
|
-
function walk(dir) {
|
|
24
|
-
let entries
|
|
25
|
-
try {
|
|
26
|
-
entries = readdirSync(dir, { withFileTypes: true })
|
|
27
|
-
} catch {
|
|
28
|
-
return false
|
|
29
|
-
}
|
|
30
|
-
for (const entry of entries) {
|
|
31
|
-
if (entry.isFile() && entry.name === 'Cargo.toml') return true
|
|
32
|
-
if (entry.isDirectory() && !ignoredDirNames.has(entry.name) && walk(join(dir, entry.name))) return true
|
|
33
|
-
}
|
|
34
|
-
return false
|
|
35
|
-
}
|
|
36
|
-
return walk(root)
|
|
37
|
-
}
|
package/rules/rust/main.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "auto": { "glob": ["**/Cargo.toml", "deny.toml"] } }
|
package/rules/rust/main.mdc
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Перевірка Rust коду
|
|
3
|
-
globs: "**/{Cargo.toml,Cargo.lock,rustfmt.toml,clippy.toml,.vscode/extensions.json,package.json},**/*.rs"
|
|
4
|
-
alwaysApply: false
|
|
5
|
-
version: '1.4'
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
Правило забезпечує форматування (rustfmt), лінт (clippy), CI workflow та покриття для Rust-проєктів.
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
## Rego-gate: `cargo`, `rustfmt`, `clippy` заборонені у `package.json`
|
|
2
|
-
|
|
3
|
-
Rego-пакет: `rust.package_json`
|
|
4
|
-
|
|
5
|
-
Цільовий файл: `package.json`
|
|
6
|
-
|
|
7
|
-
`cargo`, `rustfmt` і `clippy` — це частина **Rust toolchain**, а не npm-пакети. Вони **не додаються** у `dependencies`, `devDependencies` або `peerDependencies`. Встановлення:
|
|
8
|
-
|
|
9
|
-
- **локально** — через `rustup` (`rustup component add rustfmt clippy`);
|
|
10
|
-
- **у CI** — через крок `dtolnay/rust-toolchain@stable` із `with.components: rustfmt, clippy`.
|
|
11
|
-
|
|
12
|
-
Gate видає deny, якщо `cargo`, `rustfmt` або `clippy` з'являється у будь-якій секції залежностей `package.json`.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# Перевірка `package.json` для Rust-проєктів (rust.mdc / lint.mdc).
|
|
2
|
-
#
|
|
3
|
-
# `cargo`, `rustfmt`, `clippy` — частина Rust toolchain (rustup), не npm-залежностей.
|
|
4
|
-
# Вони мають бути у PATH через `rustup` локально або `dtolnay/rust-toolchain@stable` у CI.
|
|
5
|
-
package rust.package_json
|
|
6
|
-
|
|
7
|
-
import rego.v1
|
|
8
|
-
|
|
9
|
-
banned_rust_tools := {"cargo", "rustfmt", "clippy"}
|
|
10
|
-
|
|
11
|
-
deny contains msg if {
|
|
12
|
-
some field in {"dependencies", "devDependencies", "peerDependencies"}
|
|
13
|
-
deps := object.get(input, field, {})
|
|
14
|
-
some name, _ in deps
|
|
15
|
-
name in banned_rust_tools
|
|
16
|
-
msg := sprintf(
|
|
17
|
-
"package.json: %s.%s заборонений — Rust toolchain встановлюється через rustup / dtolnay/rust-toolchain@stable, не через npm (rust.mdc)",
|
|
18
|
-
[field, name],
|
|
19
|
-
)
|
|
20
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://unpkg.com/@7n/rules/schemas/concern.json",
|
|
3
|
-
"fixability": "config",
|
|
4
|
-
"policy": {
|
|
5
|
-
"files": {
|
|
6
|
-
"single": ".vscode/extensions.json",
|
|
7
|
-
"required": true
|
|
8
|
-
},
|
|
9
|
-
"missingMessage": ".vscode/extensions.json не існує — створи з recommendations \"rust-lang.rust-analyzer\" і \"tamasfe.even-better-toml\" (rust.mdc)"
|
|
10
|
-
}
|
|
11
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: fix-vscode_extensions.mjs
|
|
4
|
-
resource: npm/rules/rust/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.98
|
|
11
|
-
judgeModel: openai-codex/gpt-5.4-mini
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Огляд
|
|
15
|
-
|
|
16
|
-
Надайте мені чорнетку секції "overview", яку потрібно переписати, щоб я міг застосувати ваші інструкції.
|
|
17
|
-
|
|
18
|
-
## Поведінка
|
|
19
|
-
|
|
20
|
-
1. Ініціалізує логіку для виправлення VS Code Extensions.
|
|
21
|
-
2. Імпортує шаблони логіки для додавання до VS Code Extensions з файлу `../../../scripts/lib/fix/vscode-ext-add.mjs`.
|
|
22
|
-
|
|
23
|
-
## Гарантії поведінки
|
|
24
|
-
|
|
25
|
-
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: Directory Index
|
|
3
|
-
title: npm/rules/rust/vscode_extensions
|
|
4
|
-
resource: npm/rules/rust/vscode_extensions/
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# npm/rules/rust/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": ["rust-lang.rust-analyzer", "tamasfe.even-better-toml"] }
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
## Перевірка `.vscode/extensions.json` (Rego-gate)
|
|
2
|
-
|
|
3
|
-
Rego-пакет: `rust.vscode_extensions`
|
|
4
|
-
|
|
5
|
-
Цільовий файл: `.vscode/extensions.json`
|
|
6
|
-
|
|
7
|
-
Семантика `contains`: кожен запис з канону має бути присутнім у `recommendations` — додаткові розширення дозволені. Канон завантажується через `--data` з template-сніпету.
|
|
8
|
-
|
|
9
|
-
Канонічний template: [extensions.json.snippet.json](./template/extensions.json.snippet.json)
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Перевірка `.vscode/extensions.json` для правила rust (rust.mdc).
|
|
2
|
-
#
|
|
3
|
-
# Канон надходить через --data: { "template": { "snippet": ... } }
|
|
4
|
-
# Структура --data сформована з template/extensions.json.snippet.json.
|
|
5
|
-
# Semantics: subset-of для recommendations — кожен з канону має бути присутнім,
|
|
6
|
-
# інші екстеншени дозволені.
|
|
7
|
-
package rust.vscode_extensions
|
|
8
|
-
|
|
9
|
-
import rego.v1
|
|
10
|
-
|
|
11
|
-
deny contains msg if {
|
|
12
|
-
some rec in data.template.snippet.recommendations
|
|
13
|
-
not rec in {r | some r in object.get(input, "recommendations", [])}
|
|
14
|
-
msg := sprintf(".vscode/extensions.json: recommendations має містити %q (rust.mdc)", [rec])
|
|
15
|
-
}
|