@nitra/cursor 12.11.1 → 12.11.2

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.
Files changed (63) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/package.json +1 -1
  3. package/rules/adr/js/docs/hooks.md +0 -2
  4. package/rules/bun/js/docs/fix-layout.md +25 -0
  5. package/rules/bun/js/fix-layout.mjs +55 -0
  6. package/rules/changelog/js/docs/fix-consistency.md +27 -0
  7. package/rules/changelog/js/docs/index.md +2 -2
  8. package/rules/changelog/js/fix-consistency.mjs +50 -0
  9. package/rules/ci4/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  10. package/rules/ci4/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  11. package/rules/ga/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
  12. package/rules/ga/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  13. package/rules/graphql/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  14. package/rules/graphql/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  15. package/rules/js/js/docs/dep-policy.md +12 -10
  16. package/rules/js/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
  17. package/rules/js/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  18. package/rules/js-run/js/docs/fix-runtime.md +25 -0
  19. package/rules/js-run/js/fix-runtime.mjs +41 -0
  20. package/rules/nginx-default-tpl/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  21. package/rules/nginx-default-tpl/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  22. package/rules/rego/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
  23. package/rules/rego/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  24. package/rules/rust/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
  25. package/rules/rust/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  26. package/rules/style/js/docs/fix-tooling.md +29 -0
  27. package/rules/style/js/fix-tooling.mjs +46 -0
  28. package/rules/style/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  29. package/rules/style/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  30. package/rules/tauri/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  31. package/rules/tauri/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  32. package/rules/text/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  33. package/rules/text/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  34. package/rules/vue/js/docs/packages.md +0 -2
  35. package/scripts/docs/index.md +0 -2
  36. package/scripts/lib/discover-checkable-rules.mjs +1 -0
  37. package/scripts/lib/docs/discover-checkable-rules.md +13 -155
  38. package/scripts/lib/fix/discover-t0-patterns.mjs +83 -0
  39. package/scripts/lib/fix/docs/discover-t0-patterns.md +37 -0
  40. package/scripts/lib/fix/docs/llm-fix-apply.md +12 -10
  41. package/scripts/lib/fix/docs/llm-worker.md +6 -14
  42. package/scripts/lib/fix/docs/orchestrator.md +0 -2
  43. package/scripts/lib/fix/docs/t0.md +11 -10
  44. package/scripts/lib/fix/docs/vscode-ext-add.md +29 -0
  45. package/scripts/lib/fix/t0.mjs +8 -234
  46. package/scripts/lib/fix/vscode-ext-add.mjs +45 -0
  47. package/rules/test/coverage/coverage.mjs +0 -317
  48. package/scripts/coverage-classify/apply.mjs +0 -67
  49. package/scripts/coverage-classify/cache.mjs +0 -77
  50. package/scripts/coverage-classify/docs/apply.md +0 -206
  51. package/scripts/coverage-classify/docs/cache.md +0 -207
  52. package/scripts/coverage-classify/docs/index.md +0 -14
  53. package/scripts/coverage-classify/docs/prompt.md +0 -136
  54. package/scripts/coverage-classify/docs/verdict-schema.md +0 -28
  55. package/scripts/coverage-classify/index.mjs +0 -114
  56. package/scripts/coverage-classify/prompt.mjs +0 -126
  57. package/scripts/coverage-classify/verdict-schema.mjs +0 -35
  58. package/scripts/coverage-fix-extract.mjs +0 -122
  59. package/scripts/coverage-fix.mjs +0 -119
  60. package/scripts/docs/coverage-fix-extract.md +0 -36
  61. package/scripts/docs/coverage-fix.md +0 -181
  62. package/skills/coverage-fix/SKILL.md +0 -131
  63. package/skills/coverage-fix/main.json +0 -1
@@ -0,0 +1,21 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-vscode_extensions.mjs
4
+ resource: npm/rules/text/policy/vscode_extensions/fix-vscode_extensions.mjs
5
+ docgen:
6
+ crc: 319883fc
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Файл імпортує шаблони для виправлення розширень VS Code. Ці шаблони використовуються для корекції розширень.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Імпортує шаблони для виправлення розширень VS Code з файлу `../../../../scripts/lib/fix/vscode-ext-add.mjs`.
18
+
19
+ ## Гарантії поведінки
20
+
21
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1 @@
1
+ export { patterns } from '../../../../scripts/lib/fix/vscode-ext-add.mjs'
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль визначає, чи є пакет бібліотекою компонентів Vue, виходячи з даних у `package.json`, `jsconfig.json`, `package-lock.json`, `extensions.json`. Він також перевіряє відповідність усіх пакетів, що залежать від `vue`, критеріям, описаним у `vue.mdc`, і повертає код виходу.
14
12
 
15
13
  ## Поведінка
@@ -12,8 +12,6 @@ resource: npm/scripts/
12
12
  | [auto-skills.mjs](auto-skills.md) | JS Module |
13
13
  | [build-agents-commands.mjs](build-agents-commands.md) | JS Module |
14
14
  | [cli-entry.mjs](cli-entry.md) | JS Module |
15
- | [coverage-fix-extract.mjs](coverage-fix-extract.md) | JS Module |
16
- | [coverage-fix.mjs](coverage-fix.md) | JS Module |
17
15
  | [ensure-nitra-cursor-dev-dependencies.mjs](ensure-nitra-cursor-dev-dependencies.md) | JS Module |
18
16
  | [hook.mjs](hook.md) | JS Module |
19
17
  | [post-tool-use-check.mjs](post-tool-use-check.md) | JS Module |
@@ -51,6 +51,7 @@ async function listJsConcerns(jsDir) {
51
51
  if (!entry.isFile()) continue
52
52
  if (!entry.name.endsWith('.mjs')) continue
53
53
  if (entry.name.endsWith('.test.mjs')) continue
54
+ if (entry.name.startsWith('fix-')) continue
54
55
  if (entry.name.startsWith('_')) continue
55
56
  if (entry.name.startsWith('.')) continue
56
57
  const name = entry.name.slice(0, -'.mjs'.length)
@@ -3,167 +3,25 @@ type: JS Module
3
3
  title: discover-checkable-rules.mjs
4
4
  resource: npm/scripts/lib/discover-checkable-rules.mjs
5
5
  docgen:
6
- crc: 39016d17
6
+ crc: 403ab2ee
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
7
9
  ---
8
10
 
9
- Модуль `discover-checkable-rules.mjs` — це discovery-шар для CLI-команди `fix`. Його завдання — швидко просканувати файлову структуру каталогу `npm/rules/` та виявити «прогонні» правила, тобто правила, у яких є щонайменше один JS-концерн або policy-концерн. Правила, які складаються тільки з декларативних артефактів (`.mdc` + `auto.md`) без жодного прогонного концерну, відсіюються.
11
+ ## Огляд
10
12
 
11
- Виокремлюються два типи концернів:
13
+ Шукає правила, для яких є щось «прогонне» у визначених структурах. Виявляє JS-концерни за шляхами `rules/<id>/js/<concern>.mjs` та Policy-концерни, які мають пару з `<concern>.rego` (зв'язану з конфігурацією `target.json`). Ігнорує файли з префіксом `_` та `*.test.mjs`, а також каталоги `_lib/`. Виконання є швидким скануванням структури (шляхи та назви) без парсингу вмісту.
12
14
 
13
- - **JS concerns** — окремі файли `rules/<id>/js/<concern>.mjs`. Кожен файл — один концерн (flat-конвенція).
14
- - **Policy concerns** — підкаталоги `rules/<id>/policy/<concern>/`, у яких присутній файл `target.json` (поруч із якого зазвичай лежить `<concern>.rego`).
15
+ ## Поведінка
15
16
 
16
- Модуль свідомо не парсить вміст `target.json` і не читає JS-файли це лише швидкий «структурний» скан (шляхи + назви) без I/O-вмісту. Парсинг покладено на runner.
17
+ discoverOneRule описує набір JS-концернів та policy-концернів для одного каталогу правила, використовуючи шлях до цього каталогу та його ідентифікатор.
18
+ discoverCheckableRules сканує каталог з усіма правилами та повертає список правил, які мають JS-концерни або policy-концерни, фільтруючи ті, що не містять прогонного контенту.
17
19
 
18
- Файли-помічники з префіксом `_` (зокрема каталог `_lib/`), тестові файли `*.test.mjs`, а також приховані файли/каталоги (`.`-префікс) ігноруються.
20
+ ## Публічний API
19
21
 
20
- Історичний контекст конвенції розкладки JS-концернів:
22
+ discoverOneRule створює об'єкт перевірки для одного каталогу правила.
23
+ discoverCheckableRules — знаходити правила у каталозі `rules/`, які мають відповідні скрипти у `js/` або політики у `policy/`.
21
24
 
22
- - `js/<concern>/check.mjs` — версії 1.13.80–1.13.89 (вкладений каталог на концерн);
23
- - `js/<concern>.mjs` — версії 1.13.90+ (flat: концерн = файл, а не каталог).
25
+ ## Гарантії поведінки
24
26
 
25
- Допоміжні файли, тести, шаблони й дані винесені в окремі топ-level папки правила: `js/_lib/`, `tests/`, `templates/`, `data/`.
26
-
27
- ## Експорти / API
28
-
29
- Модуль експортує дві асинхронні функції:
30
-
31
- | Експорт | Тип | Призначення |
32
- | ----------------------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
33
- | `discoverOneRule(ruleDir, ruleId)` | `async (string, string) => Promise<CheckableRule>` | Будує опис одного правила за заданим шляхом каталогу та id, без обходу `rules/`. |
34
- | `discoverCheckableRules(bundledRulesDir)` | `async (string) => Promise<CheckableRule[]>` | Сканує цілий каталог `npm/rules/` і повертає масив правил, для яких є JS- або policy-концерни. |
35
-
36
- Внутрішніми (не експортованими) залишаються функції `listJsConcerns` і `listPolicyConcerns`.
37
-
38
- ### Типи (JSDoc `@typedef`)
39
-
40
- ```text
41
- JsConcern { name: string } // basename файла js/<name>.mjs без розширення
42
- PolicyConcern { name: string } // imʼя підкаталогу policy/<name>/
43
- CheckableRule {
44
- id: string, // = basename каталогу rules/<id>/
45
- jsConcerns: JsConcern[], // алфавітно
46
- policyConcerns: PolicyConcern[], // алфавітно
47
- }
48
- ```
49
-
50
- ## Функції
51
-
52
- ### `listJsConcerns(jsDir)` (internal)
53
-
54
- - **Сигнатура:** `async function listJsConcerns(jsDir: string): Promise<JsConcern[]>`
55
- - **Параметри:**
56
- - `jsDir` — абсолютний шлях до каталогу `rules/<id>/js/`.
57
- - **Повертає:** масив `JsConcern[]`, відсортований алфавітно за `name` через `Array.prototype.toSorted` із компаратором `localeCompare`.
58
- - **Логіка:**
59
- 1. Якщо каталог `jsDir` не існує (`existsSync` повертає `false`) — повертається `[]`.
60
- 2. Читається вміст через `readdir(jsDir, { withFileTypes: true })` — тобто отримуються `Dirent`-обʼєкти з метаінформацією.
61
- 3. Пропускаються:
62
- - сутності, що не є файлом (`!entry.isFile()`);
63
- - файли без розширення `.mjs`;
64
- - тестові файли `*.test.mjs`;
65
- - службові файли з префіксом `_` (наприклад вміст `_lib/`, хоча сам `_lib` як каталог не буде файлом і відсіється раніше);
66
- - приховані файли з префіксом `.`.
67
- 4. Для решти файлів обчислюється `name = entry.name.slice(0, -'.mjs'.length)` — basename без розширення.
68
- - **Side effects:** лише файлові читання (`existsSync`, `readdir`), без запису.
69
-
70
- ### `listPolicyConcerns(policyDir)` (internal)
71
-
72
- - **Сигнатура:** `async function listPolicyConcerns(policyDir: string): Promise<PolicyConcern[]>`
73
- - **Параметри:**
74
- - `policyDir` — абсолютний шлях до каталогу `rules/<id>/policy/`.
75
- - **Повертає:** масив `PolicyConcern[]`, відсортований алфавітно за `name`.
76
- - **Логіка:**
77
- 1. Якщо `policyDir` не існує — повертається `[]`.
78
- 2. Читається вміст з `withFileTypes: true`.
79
- 3. Пропускаються будь-які записи, що не є каталогом, а також приховані каталоги (префікс `.`).
80
- 4. Для кожного підкаталогу перевіряється наявність файла `target.json` через `existsSync(join(policyDir, entry.name, 'target.json'))`. Якщо `target.json` є — підкаталог зараховується як policy-концерн.
81
- - **Side effects:** лише файлові читання, без запису.
82
-
83
- ### `discoverOneRule(ruleDir, ruleId)` (exported)
84
-
85
- - **Сигнатура:** `export async function discoverOneRule(ruleDir: string, ruleId: string): Promise<CheckableRule>`
86
- - **Параметри:**
87
- - `ruleDir` — абсолютний шлях до каталогу правила `rules/<id>/`;
88
- - `ruleId` — ідентифікатор правила, зазвичай `basename(ruleDir)`. Передається явно, бо функція не виводить його з шляху самостійно.
89
- - **Повертає:** обʼєкт `CheckableRule` з полями `id`, `jsConcerns`, `policyConcerns`. На відміну від `discoverCheckableRules`, тут не виконується фільтрація «має бути хоч щось» — повертається опис як є (можуть бути порожні масиви концернів).
90
- - **Логіка:** паралельно (точніше — послідовно `await`-ить) запускає `listJsConcerns(join(ruleDir, 'js'))` і `listPolicyConcerns(join(ruleDir, 'policy'))` та збирає результати в обʼєкт.
91
- - **Використання:** викликається `runStandardRule`-flow для per-rule entry-point, коли потрібно отримати опис конкретного правила, а не сканувати весь каталог.
92
- - **Side effects:** лише читання файлової системи.
93
-
94
- ### `discoverCheckableRules(bundledRulesDir)` (exported)
95
-
96
- - **Сигнатура:** `export async function discoverCheckableRules(bundledRulesDir: string): Promise<CheckableRule[]>`
97
- - **Параметри:**
98
- - `bundledRulesDir` — абсолютний шлях до кореневого каталогу всіх правил (зазвичай `npm/rules/`).
99
- - **Повертає:** масив `CheckableRule[]`, відсортований алфавітно за `id`. Включаються тільки правила, у яких `jsConcerns.length > 0 || policyConcerns.length > 0`.
100
- - **Логіка:**
101
- 1. Якщо `bundledRulesDir` не існує — повертається `[]`.
102
- 2. Читається вміст каталогу з `withFileTypes: true`.
103
- 3. Пропускаються сутності, які не є каталогом, та приховані каталоги (префікс `.`).
104
- 4. Для кожного підкаталогу формується `ruleDir = join(bundledRulesDir, entry.name)` і викликається `discoverOneRule(ruleDir, entry.name)`.
105
- 5. Правила, у яких немає жодного JS- або policy-концерну (декларативні-only), відсіюються.
106
- - **Side effects:** лише читання файлової системи (без запису, без мережевих викликів).
107
-
108
- ## Залежності
109
-
110
- Виключно зовнішні стандартні модулі Node.js:
111
-
112
- - `node:fs` → `existsSync` — синхронна перевірка існування шляху;
113
- - `node:fs/promises` → `readdir` — асинхронне читання вмісту каталогу (з `withFileTypes: true` повертає `Dirent[]`);
114
- - `node:path` → `join` — кросплатформова конкатенація шляхів.
115
-
116
- Внутрішніх імпортів з інших модулів проєкту немає. Це робить модуль чистим discovery-шаром без бізнес-логіки, що дозволяє безпечно його тестувати ізольовано (потрібна лише підготовлена файлова структура у тимчасовому каталозі).
117
-
118
- Зворотні залежності (хто використовує цей модуль): runner-флоу CLI `fix` (зокрема `runStandardRule`), який після discovery читає `target.json` для policy-концернів і виконує JS-концерни.
119
-
120
- ## Потік виконання / Використання
121
-
122
- ### Типовий сценарій 1. Повний скан правил для CLI `fix`
123
-
124
- ```javascript
125
- import { discoverCheckableRules } from './discover-checkable-rules.mjs'
126
-
127
- const rules = await discoverCheckableRules('/abs/path/to/npm/rules')
128
- for (const rule of rules) {
129
- // rule.id, rule.jsConcerns, rule.policyConcerns
130
- }
131
- ```
132
-
133
- Послідовність дій усередині:
134
-
135
- 1. `discoverCheckableRules` перевіряє існування кореневого каталогу.
136
- 2. Перебирає підкаталоги верхнього рівня (= потенційні правила).
137
- 3. Для кожного підкаталогу викликає `discoverOneRule`, який своєю чергою:
138
- - сканує `rules/<id>/js/` через `listJsConcerns`;
139
- - сканує `rules/<id>/policy/` через `listPolicyConcerns`;
140
- 4. Якщо знайдено хоч один концерн — правило додається у вихідний масив.
141
- 5. Масив сортується за `id`.
142
-
143
- ### Типовий сценарій 2. Per-rule entry-point
144
-
145
- ```javascript
146
- import { discoverOneRule } from './discover-checkable-rules.mjs'
147
-
148
- const rule = await discoverOneRule('/abs/path/to/npm/rules/n-js', 'n-js')
149
- // rule.id === 'n-js'
150
- // rule.jsConcerns — список JS-концернів у js/
151
- // rule.policyConcerns — список policy-концернів у policy/
152
- ```
153
-
154
- Цей шлях оминає енумерацію всього `rules/`, що корисно коли id правила вже відомий (наприклад, передано аргументом CLI).
155
-
156
- ### Гарантії та обмеження
157
-
158
- - **Чистота:** функції — read-only (не пишуть у ФС, не виконують код концернів). Це дозволяє безпечно викликати їх повторно.
159
- - **Сортування:** усі результати алфавітно відсортовані через `toSorted` із `localeCompare`. Це робить вивід детермінованим між запусками й між платформами (хоч порядок `readdir` залежить від ФС).
160
- - **Толерантність до відсутніх каталогів:** будь-яка з директорій (`rules/`, `js/`, `policy/`) може бути відсутня — повертається порожній масив без помилки.
161
- - **Тести/хелпери:** файли з префіксом `_` і `*.test.mjs` гарантовано виключаються із JS-концернів.
162
- - **Що _не_ робиться:** не валідуються імена концернів, не парситься `target.json`, не перевіряється наявність `<name>.rego` поруч із `target.json`. Це робота runner-а.
163
-
164
- ### Eage cases
165
-
166
- - Файл з префіксом `.` у `js/` — пропускається.
167
- - Підкаталог у `js/` (наприклад `_lib/`) — не є файлом, відсіюється першою перевіркою `entry.isFile()`.
168
- - Підкаталог у `policy/` без `target.json` — пропускається; наявність `<name>.rego` без `target.json` не зараховується.
169
- - Порожнє правило (тільки `.mdc`/`auto.md` без `js/` і `policy/`) — не потрапляє у вихід `discoverCheckableRules`, але буде повернене з порожніми масивами в `discoverOneRule`.
27
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Discovery T0-autofix паттернів з rule-level `fix-*.mjs` файлів.
3
+ *
4
+ * Сканує `npm/rules/{rule}/js/fix-*.mjs` і `npm/rules/{rule}/policy/{concern}/fix-*.mjs`
5
+ * по всіх правилах, динамічно імпортує кожен і збирає масиви `patterns`.
6
+ * `t0.mjs` ініціалізує результат через top-level await (один раз при завантаженні модуля).
7
+ */
8
+ import { existsSync } from 'node:fs'
9
+ import { readdir } from 'node:fs/promises'
10
+ import { join } from 'node:path'
11
+
12
+ /**
13
+ * @typedef {{ id: string, test: (output: string) => boolean, apply: (output: string, cwd: string) => Promise<{ok: boolean, action: string}> | {ok: boolean, action: string} }} T0Pattern
14
+ */
15
+
16
+ /**
17
+ * Повертає абсолютні шляхи до `fix-*.mjs` файлів у директорії (плоско, без рекурсії).
18
+ * @param {string} dir абсолютний шлях до директорії
19
+ * @returns {Promise<string[]>}
20
+ */
21
+ async function findFixFiles(dir) {
22
+ if (!existsSync(dir)) return []
23
+ const entries = await readdir(dir, { withFileTypes: true })
24
+ return entries
25
+ .filter(e => e.isFile() && e.name.startsWith('fix-') && e.name.endsWith('.mjs'))
26
+ .map(e => join(dir, e.name))
27
+ }
28
+
29
+ /**
30
+ * Повертає абсолютні шляхи до `policy/{concern}/fix-*.mjs` у правилі.
31
+ * @param {string} policyDir абсолютний шлях `rules/{rule}/policy/`
32
+ * @returns {Promise<string[]>}
33
+ */
34
+ async function findPolicyFixFiles(policyDir) {
35
+ if (!existsSync(policyDir)) return []
36
+ const entries = await readdir(policyDir, { withFileTypes: true })
37
+ const paths = []
38
+ for (const entry of entries) {
39
+ if (!entry.isDirectory()) continue
40
+ paths.push(...(await findFixFiles(join(policyDir, entry.name))))
41
+ }
42
+ return paths
43
+ }
44
+
45
+ /**
46
+ * Збирає всі T0-паттерни з `fix-*.mjs` файлів усіх правил у `rulesDir`.
47
+ * @param {string} rulesDir абсолютний шлях до `npm/rules/`
48
+ * @returns {Promise<T0Pattern[]>} об'єднаний масив паттернів
49
+ */
50
+ export async function discoverT0Patterns(rulesDir) {
51
+ if (!existsSync(rulesDir)) return []
52
+ const ruleEntries = await readdir(rulesDir, { withFileTypes: true })
53
+ /** @type {T0Pattern[]} */
54
+ const allPatterns = []
55
+
56
+ for (const ruleEntry of ruleEntries) {
57
+ if (!ruleEntry.isDirectory() || ruleEntry.name.startsWith('.')) continue
58
+ const ruleDir = join(rulesDir, ruleEntry.name)
59
+
60
+ const fixPaths = [
61
+ ...(await findFixFiles(join(ruleDir, 'js'))),
62
+ ...(await findPolicyFixFiles(join(ruleDir, 'policy')))
63
+ ]
64
+
65
+ for (const fixPath of fixPaths) {
66
+ try {
67
+ const mod = await import(fixPath)
68
+ if (Array.isArray(mod.patterns)) allPatterns.push(...mod.patterns)
69
+ } catch (err) {
70
+ console.error(`[discover-t0-patterns] не вдалося імпортувати ${fixPath}: ${err.message}`)
71
+ }
72
+ }
73
+ }
74
+
75
+ // Дедуплікація за id: shared утиліти (напр. vscode-ext-add) re-export'яться з ≥2 правил
76
+ // і потрапляють у список кілька разів — залишаємо перше входження.
77
+ const seen = new Set()
78
+ return allPatterns.filter(p => {
79
+ if (seen.has(p.id)) return false
80
+ seen.add(p.id)
81
+ return true
82
+ })
83
+ }
@@ -0,0 +1,37 @@
1
+ ---
2
+ type: JS Module
3
+ title: discover-t0-patterns.mjs
4
+ resource: npm/scripts/lib/fix/discover-t0-patterns.mjs
5
+ docgen:
6
+ crc: f2a262bb
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Модуль сканує директорію правил для пошуку файлів `fix-*.mjs`, що містять визначення T0-паттернів. Він динамічно імпортує ці файли з папок `js` та `policy/{concern}` для кожного правила. Ініціалізація результату відбувається за допомогою _top-level await_ у `t0.mjs`. Функція збирає масив об'єктів, що описують усі знайдені паттерни.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Перевіряє існування директорії, вказаної як `rulesDir`. Якщо директорія не існує, повертає порожній масив.
18
+ 2. Зчитує список усіх елементів у директорії `rulesDir`.
19
+ 3. Для кожного елемента, який є директорією та не починається з крапки, виконується наступне:
20
+ а. Визначається повний шлях до директорії правила.
21
+ б. Знаходяться всі файли `fix-*.mjs` у піддиректорії `js` цього правила.
22
+ в. Знаходяться всі файли `fix-*.mjs` у піддиректоріях `policy/{concern}` цього правила.
23
+ г. Для кожного знайденого файлу `fix-*.mjs` виконується динамічний імпорт.
24
+ д. Якщо імпорт успішний, збирається масив `patterns` з імпортованого модуля та додається до загального списку паттернів.
25
+ е. У разі помилки імпорту, помилка виводиться в консоль, але процес продовжується.
26
+ 4. Після обробки всіх правил, виконується дедуплікація загального списку паттернів за їхніми ідентифікаторами.
27
+ 5. Повертається фінальний, унікальний масив T0-паттернів.
28
+
29
+ ## Публічний API
30
+
31
+ discoverT0Patterns — збирає всі T0-паттерни з файлів `fix-*.mjs` у директорії правил.
32
+
33
+ ## Гарантії поведінки
34
+
35
+ - Read-only: не виконує операцій запису (ФС/БД).
36
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
37
+ - За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
@@ -3,27 +3,29 @@ type: JS Module
3
3
  title: llm-fix-apply.mjs
4
4
  resource: npm/scripts/lib/fix/llm-fix-apply.mjs
5
5
  docgen:
6
- crc: 62e475fa
6
+ crc: 49f989ca
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Модуль є спільним ядром для застосування виправлень, згенерованих LLM, використовуючи конформні (`llm-worker.mjs`) та інструментальні (`llm-lint-fix.mjs`) механізми для уникнення дублювання логіки парсингу та застосування змін. Він парсить структуровану відповідь моделі, що містить список змін у форматі `{changes:[{path,content}]}`. Далі, він зчитує вміст файлів, зазначених у цих змінах, та застосовує оновлений вміст до відповідних файлів. Усі операції реалізовані з механізмом fail-safe: при невдачах функції повертають значення помилки (false/null/Err) замість викидання винятків.
11
+ ## Огляд
12
+
13
+ Це спільне ядро LLM-фіксу, призначене для оркестрації процесу застосування змін, згенерованих моделлю. Модуль використовує `llm-worker.mjs` та `llm-lint-fix.mjs` для забезпечення конформності та виконання лінтер-фіксів. Основний функціонал включає: парсинг відповіді LLM за схемою `{changes:[{path,content}]}` (через `parseChangesResponse`), зчитування необхідних файлів (`readFilesForFix`), та безпечне застосування змін (`applyChanges`). Система реалізує механізм fail-safe, перехоплюючи помилки та повертаючи `null` замість винятків для певних сценаріїв. При цьому шляхи `.git` та `node_modules` свідомо ігноруються.
12
14
 
13
15
  ## Поведінка
14
16
 
15
- parseChangesResponse парсить сирий текст відповіді моделі, щоб витягнути структуру змін у форматі патчу або повернути null у разі невдачі парсингу.
16
- readFilesForFix зчитує вміст файлів, зазначених у списку відносних шляхів, відносно кореня проєкту, повертаючи список об'єктів з шляхом та вмістом або null для неіснуючих файлів.
17
- applyChanges записує нові вмісти в файли, використовуючи наданий список змін, відносно кореня проєкту; перед записом створює батьківську теку (`mkdirSync recursive`) — модель може запропонувати новий файл у ще неіснуючому каталозі. Повертає статус успіху або помилки.
17
+ parseChangesResponse парсить сирий текст відповіді моделі, витягуючи структуру змін у форматі патчу, або повертає null, якщо парсинг неможливий.
18
+ readFilesForFix читає вміст файлів, вказаних у списку, відносно кореня проєкту. Якщо прямий шлях не знайдено, шукає файл за його базовим ім'ям у проєкті, ігноруючи каталоги `.git` та `node_modules`.
19
+ applyChanges записує вміст, наданий у змінних, у відповідні файли проєкту, створюючи необхідні каталоги, якщо вони відсутні.
18
20
 
19
21
  ## Публічний API
20
22
 
21
- parseChangesResponse — витягує структуру змін із JSON-відповіді моделі.
22
- readFilesForFix — зчитує вміст файлів за заданими шляхами для використання у запиті.
23
- applyChanges — замінює вміст файлів на нові дані, отримані у змінних змін.
23
+ parseChangesResponse — розбирає JSON-відповідь моделі, витягуючи вміст першого об'єкта.
24
+ readFilesForFix — зчитує вміст файлів за заданими шляхами, шукаючи їх у системі, якщо прямий шлях не знайдено.
25
+ applyChanges — замінює вміст файлів на новий, наданий у змінній `changes`.
24
26
 
25
27
  ## Гарантії поведінки
26
28
 
27
29
  - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
28
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
29
- - Не звертається до мережі.
30
+ - За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
31
+ - Свідомо пропускає шляхи: `.git`, `node_modules`.
@@ -3,32 +3,24 @@ type: JS Module
3
3
  title: llm-worker.mjs
4
4
  resource: npm/scripts/lib/fix/llm-worker.mjs
5
5
  docgen:
6
- crc: d6c0b516
6
+ crc: 55419474
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
11
  ## Огляд
12
12
 
13
- Модуль взаємодіє з мовною моделлю для обробки правил та файлів. Він формує запит до моделі, отримує пропозиції щодо змін, які не застосовуються до файлової системи. Функція обробки гарантує перехоплення помилок (fail-safe) та не генерує винятків назовні.
13
+ Модуль виділяє унікальні відносні шляхи файлів, пов'язаних із порушеннями. Він також виконує роботу з великою мовною моделлю для аналізу даних про порушення, зчитуючи правила та обробляючи відповідні файли.
14
14
 
15
15
  ## Поведінка
16
16
 
17
- 1. Викликає runLlmWorker для виправлення однієї проблеми.
18
- 2. Зчитує вміст відповідного файлу правила.
19
- 3. Витягує шляхи до файлів, які порушені, з вихідних даних про порушення.
20
- 4. Зчитує вміст цих файлів.
21
- 5. Формує повний текстовий запит для моделі, включаючи правило, вихідні дані про порушення, вміст файлів та, за наявності, контекст попередньої спроби.
22
- 6. Відправляє цей запит моделі.
23
- 7. У разі помилки при виклику моделі, повертає статус невдачі з деталями помилки.
24
- 8. Якщо модель відповідає, парсить її відповідь, щоб отримати діагноз та список змін.
25
- 9. У разі неможливості розібрати відповідь або відсутності змін, повертає статус невдачі.
26
- 10. Якщо зміни успішно отримані, застосовує ці зміни до файлової системи проєкту.
27
- 11. Повертає результат, що містить статус успіху, список застосованих змін, діагноз та метадані про запит.
17
+ extractFilePaths витягує унікальні відносні шляхи файлів із вихідних даних про порушення, розпізнаючи як явні файли, що потребують виправлення, так і файли, що надають контекст.
18
+ runLlmWorker викликає LLM для виправлення одного порушення, зчитує відповідне правило, аналізує файли, формує промпт, отримує відповідь від моделі та застосовує виправлення.
28
19
 
29
20
  ## Публічний API
30
21
 
31
- runLlmWorkerвиправляє одне порушення правила, використовуючи шаблон C1. Повертає результати виправлення чи діагнозу незалежно від успіху, що дозволяє наступним етапам системи отримувати інформацію про спробу. Поля про міркування та підсумок запиту використовуються для детального виводу в режимі `--full`. Дозволяє перевизначити модель, передати контекст попередніх спроб, позначити джерело виклику та встановити ліміти часу для кожного рівня виконання. Керує обсягом токенів, доступних для процесу мислення.
22
+ extractFilePathsвиділяє відносні шляхи файлів з виводу помилок, обробляючи префікс робочого простору та пріоритетно парсячи рядки, що вказують на необхідність виправлення.
23
+ runLlmWorker — виправляє одне порушення правила за допомогою LLM, повертаючи результати змін чи діагнозу, що слугує інформацією для наступних етапів процесу.
32
24
 
33
25
  ## Гарантії поведінки
34
26
 
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль відповідає за управління процесом вирішення порушень. Він будує послідовність тирів ескалації за допомогою `buildLadder`. Функція `parseOrchestratorArgs` визначає бюджет LLM та фільтр правил. Далі, `runOrchestratorCli` виконує процес виправлення правил, послідовно застосовуючи `escalateRule` по тирах до досягнення першого успішного вирішення.
14
12
 
15
13
  ## Поведінка
@@ -3,26 +3,27 @@ type: JS Module
3
3
  title: t0.mjs
4
4
  resource: npm/scripts/lib/fix/t0.mjs
5
5
  docgen:
6
- crc: cfb0d5c9
6
+ crc: 92c9348d
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Модуль керує автоматичним застосуванням паттернів T0-auto до виводів порушень. Він використовує конфігурації з `extensions.json` та `package-lock.json` для визначення правил. Модуль фільтрує правила, які можуть бути автоматично оброблені, застосовує паттерни за допомогою `applyT0Auto`, а потім запускає повний цикл перевірки для всіх провальних правил через `runT0AutoCli`. Усі операції виконуються з механізмом fail-safe, що запобігає виникненню винятків назовні.
11
+ ## Огляд
12
+
13
+ Модуль забезпечує механізм автоматичного застосування паттернів T0-auto. Він дозволяє відфільтровувати правила, до яких застосовуються ці паттерни, та запускає повний цикл перевірки конформності з автоматичним виправленням через `runT0AutoCli`.
12
14
 
13
15
  ## Поведінка
14
16
 
15
- Поведінка
16
- applyT0Auto застосовує всі визначені T0-auto паттерни до одного виводу порушення, повертаючи результат застосування та список виконаних дій.
17
- filterT0AutoRules повертає список ID правил, для яких існує хоча б один T0-auto паттерн, виходячи з виводу порушення.
18
- runT0AutoCli запускає T0-auto для всіх провальних правил, повторно перевіряє конформність та виводить підсумок щодо закритого чи незакритого порушень.
17
+ applyT0Auto застосовує всі T0-auto паттерни до одного виявленого порушення, повертаючи результат застосування та список виконаних дій.
18
+ filterT0AutoRules повертає список ID правил, для яких існують відповідні T0-auto паттерни, виходячи з виявлених порушень.
19
+ runT0AutoCli запускає процес T0-auto: виконує перевірку конформності, застосовує T0-auto до порушень, повторно перевіряє змінені правила та виводить підсумок.
19
20
 
20
21
  ## Публічний API
21
22
 
22
- applyT0Auto — вносить зміни до виводу порушень, використовуючи всі визначені T0-auto шаблони.
23
- filterT0AutoRules — визначає, які правила мають відповідні T0-auto шаблони, аналізуючи вивід порушень, отриманий з `fix --json`.
24
- runT0AutoCli — виконує команду `n-cursor fix-t0 [rule...]`, що включає застосування T0-auto до кожного порушення, повторну перевірку check-gate та виведення результату.
23
+ applyT0Auto — застосовує всі T0-auto шаблони до вихідних даних про порушення.
24
+ filterT0AutoRules — визначає і повертає ідентифікатори правил, які мають принаймні один T0-auto шаблон, виходячи з результату `fix --json`.
25
+ runT0AutoCli — виконує команду `n-cursor fix-t0 [rule...]`, яка запускає `fix --json`, застосовує T0-auto до кожного порушення, повторно перевіряє check-gate та виводить звіт.
25
26
 
26
27
  ## Гарантії поведінки
27
28
 
28
- - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
29
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,29 @@
1
+ ---
2
+ type: JS Module
3
+ title: vscode-ext-add.mjs
4
+ resource: npm/scripts/lib/fix/vscode-ext-add.mjs
5
+ docgen:
6
+ crc: 950e9098
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Реалізує Shared T0-autofix паттерн для правил із `vscode_extensions.rego`. Механізм витягує назви розширень із повідомлень про порушення та додає їх до секції `recommendations` у конфігурації `.vscode/extensions.json`, якщо вони відсутні. Паттерн універсальний для правил, що емітують вимогу «recommendations має містити "…"». Функціональність надається через публічні функції `patterns` та забезпечує перехоплення помилок для запобігання виняткам.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Перевіряє, чи повідомлення про порушення містить шаблон, що вказує на необхідність додати рекомендації.
18
+ 2. Витягує назви розширень з повідомлення про порушення.
19
+ 3. Перевіряє наявність файлу `.vscode/extensions.json` у поточній робочій директорії.
20
+ 4. Зчитує вміст `.vscode/extensions.json` та парсить його як JSON.
21
+ 5. Ініціалізує список існуючих рекомендацій.
22
+ 6. Визначає назви розширень, які потрібно додати, відфільтровувавши ті, що вже присутні.
23
+ 7. Якщо є розширення для додавання, оновлює список рекомендацій у парсереному об'єкті.
24
+ 8. Записує оновлений JSON-об'єкт назад у `.vscode/extensions.json`.
25
+ 9. Повертає результат виконання операції.
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).