@nitra/cursor 5.3.4 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/.claude-template/settings.template.json +2 -2
  2. package/.pi-template/extensions/n-cursor-adr/docs/index.md +13 -24
  3. package/CHANGELOG.md +11 -0
  4. package/bin/n-cursor.js +43 -22
  5. package/lib/docs/models.md +29 -18
  6. package/lib/docs/omlx-trace.md +51 -0
  7. package/lib/docs/omlx.md +31 -15
  8. package/lib/omlx.mjs +2 -5
  9. package/package.json +1 -1
  10. package/rules/abie/docs/fix.md +17 -11
  11. package/rules/adr/docs/fix.md +25 -140
  12. package/rules/bun/docs/fix.md +18 -151
  13. package/rules/capacitor/docs/fix.md +16 -13
  14. package/rules/capacitor/js/docs/platforms.md +31 -43
  15. package/rules/changelog/docs/fix.md +25 -169
  16. package/rules/ci4/docs/fix.md +11 -14
  17. package/rules/doc-files/doc-files.mdc +60 -0
  18. package/rules/doc-files/docs/fix.md +31 -0
  19. package/rules/doc-files/fix.mjs +19 -0
  20. package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
  21. package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
  22. package/{skills → rules}/doc-files/js/docgen-scan.mjs +9 -1
  23. package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
  24. package/{skills → rules}/doc-files/js/docs/docgen-extract-anchors.md +1 -1
  25. package/{skills → rules}/doc-files/js/docs/docgen-extract.md +2 -2
  26. package/{skills → rules}/doc-files/js/docs/docgen-files-batch.md +1 -1
  27. package/{skills → rules}/doc-files/js/docs/docgen-gen.md +1 -1
  28. package/{skills → rules}/doc-files/js/docs/docgen-ignore.md +4 -4
  29. package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
  30. package/rules/doc-files/js/docs/docgen-scan.md +54 -0
  31. package/rules/doc-files/js/docs/lint.md +36 -0
  32. package/rules/doc-files/js/docs/units-js.md +31 -0
  33. package/rules/doc-files/js/docs/units-rs.md +35 -0
  34. package/rules/doc-files/js/docs/units.md +30 -0
  35. package/rules/doc-files/js/lint.mjs +96 -0
  36. package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
  37. package/rules/doc-files/lint/docs/lint.md +37 -0
  38. package/rules/doc-files/lint/lint.mjs +105 -0
  39. package/rules/doc-files/meta.json +1 -0
  40. package/rules/docker/docs/fix.md +21 -161
  41. package/rules/efes/docs/fix.md +23 -194
  42. package/rules/feedback/docs/fix.md +10 -8
  43. package/rules/ga/docs/fix.md +10 -5
  44. package/rules/graphql/docs/fix.md +23 -119
  45. package/rules/hasura/docs/fix.md +19 -5
  46. package/rules/hasura/js/docs/internal_urls.md +34 -307
  47. package/rules/image-avif/docs/fix.md +16 -127
  48. package/rules/image-compress/docs/fix.md +20 -141
  49. package/rules/image-compress/js/docs/package_setup.md +22 -182
  50. package/rules/js-bun-db/docs/fix.md +23 -139
  51. package/rules/js-bun-db/js/docs/safety.md +33 -221
  52. package/rules/js-bun-redis/docs/fix.md +25 -114
  53. package/rules/js-bun-redis/js/docs/imports.md +18 -166
  54. package/rules/js-lint/docs/fix.md +30 -108
  55. package/rules/js-lint/js/docs/lint-findings.md +37 -17
  56. package/rules/js-lint/js/docs/lint.md +22 -238
  57. package/rules/js-lint/js/docs/tooling.md +34 -331
  58. package/rules/js-lint-ci/docs/fix.md +16 -149
  59. package/rules/js-lint-ci/js/docs/lint.md +16 -136
  60. package/rules/js-mssql/docs/fix.md +18 -123
  61. package/rules/js-mssql/js/docs/deps.md +28 -251
  62. package/rules/js-run/docs/fix.md +23 -138
  63. package/rules/js-run/js/docs/runtime.md +24 -378
  64. package/rules/k8s/docs/fix.md +18 -123
  65. package/rules/nginx-default-tpl/docs/fix.md +22 -118
  66. package/rules/nginx-default-tpl/js/docs/template.md +38 -360
  67. package/rules/npm-module/docs/fix.md +27 -89
  68. package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
  69. package/rules/npm-module/js/docs/package_structure.md +36 -258
  70. package/rules/npm-module/js/docs/rule_meta.md +25 -127
  71. package/rules/npm-module/js/docs/skill_meta.md +18 -180
  72. package/rules/php/docs/fix.md +21 -98
  73. package/rules/php/js/docs/tooling.md +20 -143
  74. package/rules/python/docs/fix.md +25 -157
  75. package/rules/python/js/docs/applies.md +20 -98
  76. package/rules/python/js/docs/tooling.md +27 -144
  77. package/rules/rego/docs/fix.md +24 -112
  78. package/rules/rego/js/docs/applies.md +20 -164
  79. package/rules/rego/js/docs/lint.md +15 -110
  80. package/rules/release/docs/fix.md +16 -114
  81. package/rules/rust/docs/fix.md +24 -119
  82. package/rules/rust/js/docs/applies.md +20 -129
  83. package/rules/security/docs/fix.md +21 -78
  84. package/rules/security/js/docs/sample_secret.md +23 -182
  85. package/rules/security/js/docs/trufflehog.md +19 -128
  86. package/rules/style-lint/docs/fix.md +16 -150
  87. package/rules/style-lint/js/docs/lint.md +21 -172
  88. package/rules/style-lint/js/docs/tooling.md +19 -184
  89. package/rules/tauri/docs/fix.md +26 -152
  90. package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
  91. package/rules/tauri/js/docs/tooling.md +20 -217
  92. package/rules/test/docs/fix.md +19 -127
  93. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
  94. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
  95. package/rules/test/js/docs/cargo_mutants_config.md +24 -164
  96. package/rules/test/js/docs/location.md +24 -126
  97. package/rules/test/js/docs/no-process-chdir.md +20 -151
  98. package/rules/test/js/docs/no-relative-fs-path.md +24 -261
  99. package/rules/test/js/docs/stryker_config.md +48 -148
  100. package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
  101. package/rules/text/docs/fix.md +25 -113
  102. package/rules/text/js/docs/forbidden-prettier.md +21 -132
  103. package/rules/text/js/docs/formatting.md +60 -251
  104. package/rules/text/js/docs/lint.md +17 -114
  105. package/rules/vue/docs/fix.md +25 -118
  106. package/rules/vue/js/docs/packages.md +25 -323
  107. package/rules/worktree/docs/fix.md +31 -150
  108. package/scripts/coverage-classify/docs/index.md +23 -209
  109. package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
  110. package/scripts/dispatcher/docs/trace.md +35 -0
  111. package/scripts/docs/auto-rules.md +37 -361
  112. package/scripts/docs/lint-cli.md +12 -13
  113. package/scripts/docs/post-tool-use-fix.md +16 -15
  114. package/scripts/docs/skills-cli.md +26 -23
  115. package/scripts/docs/sync-claude-config.md +94 -34
  116. package/scripts/docs/worktree-cli.md +11 -34
  117. package/scripts/lib/docs/assert-project-root.md +14 -16
  118. package/scripts/lib/docs/changed-files.md +24 -139
  119. package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
  120. package/scripts/lib/docs/rule-predicates.md +20 -17
  121. package/scripts/lib/docs/run-rule-cli.md +14 -18
  122. package/scripts/lib/docs/run-rule.md +13 -20
  123. package/scripts/lib/docs/run-standard-rule.md +12 -15
  124. package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
  125. package/scripts/lib/rule-predicates.mjs +1 -1
  126. package/scripts/sync-claude-config.mjs +4 -1
  127. package/scripts/utils/docs/with-lock.md +19 -12
  128. package/scripts/utils/with-lock.mjs +4 -2
  129. package/skills/doc-aggregate/SKILL.md +2 -2
  130. package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
  131. package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
  132. package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
  133. package/skills/doc-files/.changes/260612-0031.md +5 -0
  134. package/skills/doc-files/.changes/260612-0036.md +5 -0
  135. package/skills/doc-files/.changes/260612-0114.md +5 -0
  136. package/skills/doc-files/SKILL.md +6 -6
  137. package/skills/fix/js/docs/llm-worker.md +17 -15
  138. package/skills/fix/js/docs/orchestrator.md +30 -23
  139. package/skills/fix/js/docs/t0.md +26 -16
  140. package/skills/start-check/js/docs/check.md +26 -22
  141. package/skills/taze/js/docs/diff.md +44 -20
  142. package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
  143. package/skills/doc-files/js/docs/docgen-scan.md +0 -25
  144. package/skills/doc-files/js/docs/units-rs.md +0 -35
  145. /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
  146. /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
  147. /package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +0 -0
  148. /package/{skills → rules}/doc-files/js/docgen-gen.mjs +0 -0
  149. /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
  150. /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
  151. /package/{skills → rules}/doc-files/js/units.mjs +0 -0
@@ -1,263 +1,40 @@
1
- # deps.mjs — перевірка правила js-mssql.mdc
1
+ ---
2
+ docgen:
3
+ source: npm/rules/js-mssql/js/deps.mjs
4
+ crc: d5bc32ba
5
+ score: 100
6
+ ---
2
7
 
3
- ## Огляд
4
-
5
- Модуль `npm/rules/js-mssql/js/deps.mjs` — це автоматичний `check`-скрипт для правила `js-mssql.mdc`. Він виконує дві логічно різні перевірки на корені репозиторію:
6
-
7
- 1. **Версійний аудит** усіх `package.json` (у тому числі workspace-пакетів): якщо в секції `dependencies` присутній пакет `mssql`, його semver-діапазон має давати ефективну версію не нижче `12.5.0`.
8
- 2. **Статичний аналіз вихідного коду** (JS/TS) на безпечне використання драйвера `mssql`:
9
- - заборона створення `new sql.ConnectionPool(...)` всередині функцій (пул має бути singleton на рівні модуля);
10
- - заборона спільного (shared) `Request`, наприклад `export const request = pool.request()`;
11
- - заборона викликів `query(\`...\`)`як звичайної функції — потрібен tagged template`query\`...\``;
12
- - заборона динамічних SQL-списків через `.join(',')` у конструкціях `IN (...)` / `VALUES (...)` (треба TVP, `sql.Table`);
13
- - вимога числового парсингу значень у `IN (${...})` (`parseInt` / `Number` / `BigInt` / `parseFloat` + фільтр від `NaN`);
14
- - вимога винести значення для `IN (${...})` в окрему змінну і додати guard на пустоту з `throw`.
15
-
16
- Скрипт використовує спільну інфраструктуру репорту (`createCheckReporter`) і повертає числовий exit code, придатний для CI. Усі повідомлення префіксовані `js-mssql:` для зручної фільтрації.
17
-
18
- Файл є ESM-модулем (`.mjs`), без top-level side effects: експортується лише асинхронна функція `check()`, яка ініціює виконання.
19
-
20
- ## Експорти / API
21
-
22
- | Символ | Тип | Призначення |
23
- | ------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
24
- | `check` | `async function(): Promise<number>` | Єдиний публічний експорт. Виконує повну перевірку правила `js-mssql.mdc` у поточному `process.cwd()` і повертає `0` (OK) або `1` (є порушення). |
25
-
26
- Інші функції в модулі (`findAllSourcePathsForMssqlScan`, `asObject`, `getMssqlDependencyRange`, `parseLeadingSemver`, `semverGte`, `auditMssqlVersionInPackageJson`, `aggregateMssqlVersionsAcrossPackages`, `scanMssqlOneSourceFile`, `reportZeroMssqlSourceViolations`, `auditMssqlSources`) є **внутрішніми** — не експортуються і призначені лише для декомпозиції логіки `check()`.
27
-
28
- ### Константи
29
-
30
- | Константа | Значення | Опис |
31
- | ------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------ |
32
- | `VERSION_PREFIX_RE` | `/^[\^~>=<]+\s*/u` | Регулярка для відрізання префіксів semver-діапазону (`^`, `~`, `>`, `=`, `<` та комбінацій) перед парсингом. |
33
- | `SEMVER_RE` | `/^(\d+)\.(\d+)\.(\d+)/u` | Регулярка для захоплення першої semver-трійки `major.minor.patch` після очищення префіксу. |
34
- | `MIN_MSSQL_VERSION` | `{ major: 12, minor: 5, patch: 0 }` | Мінімально дозволена версія `mssql`, як її задає правило `js-mssql.mdc`. |
35
-
36
- ## Функції
37
-
38
- ### `findAllSourcePathsForMssqlScan(repoRoot, ignorePaths)`
39
-
40
- Внутрішня. Збирає абсолютні шляхи всіх JS/TS-файлів-кандидатів для скану `mssql`.
41
-
42
- - **Сигнатура:** `async function findAllSourcePathsForMssqlScan(repoRoot: string, ignorePaths: string[]): Promise<string[]>`
43
- - **Параметри:**
44
- - `repoRoot` — абсолютний шлях до кореня репозиторію;
45
- - `ignorePaths` — масив абсолютних шляхів каталогів, які повністю виключаються з обходу (зчитується з `.cursorignore`).
46
- - **Повертає:** масив абсолютних шляхів файлів, відсортований за відносним шляхом (`localeCompare`), щоб порядок звітів був детермінованим.
47
- - **Side effects:** читає файлову систему через `walkDir`; нормалізує windows-роздільники `\` у POSIX `/` перед перевіркою `isMssqlScanSourceFile`.
48
-
49
- ### `asObject(v)`
50
-
51
- Внутрішня. Безпечне приведення невідомого значення до plain-object.
52
-
53
- - **Сигнатура:** `function asObject(v: unknown): Record<string, unknown>`
54
- - **Логіка:** повертає `{}`, якщо `v` falsy, не `object`, або масив; інакше повертає сам `v` як `Record<string, unknown>` (через JSDoc-cast).
55
- - **Side effects:** немає.
56
-
57
- ### `getMssqlDependencyRange(deps)`
58
-
59
- Внутрішня. Витягає рядок версії `dependencies.mssql`.
60
-
61
- - **Сигнатура:** `function getMssqlDependencyRange(deps: unknown): string | null`
62
- - **Параметри:** `deps` — значення поля `dependencies` з `package.json` (може бути будь-чим).
63
- - **Повертає:** триманий (`trim`) рядок версії, або `null`, якщо ключ відсутній / значення не є непорожнім рядком.
64
- - **Side effects:** немає.
65
-
66
- ### `parseLeadingSemver(range)`
67
-
68
- Внутрішня. Парсить першу semver-трійку з діапазону виду `"^12.5.0"`, `">=12.5.0"`, `"12.5.0"`.
69
-
70
- - **Сигнатура:** `function parseLeadingSemver(range: string): { major: number, minor: number, patch: number } | null`
71
- - **Параметри:** `range` — версійний діапазон у синтаксисі npm.
72
- - **Повертає:** об'єкт `{ major, minor, patch }` або `null`, якщо не вдалось розпарсити (або будь-який компонент — `NaN`).
73
- - **Алгоритм:**
74
- 1. `String(range).trim()` → видалення префіксів через `VERSION_PREFIX_RE`;
75
- 2. `match(SEMVER_RE)` → захоплення трьох чисел;
76
- 3. конвертація через `Number`, перевірка `Number.isNaN`.
77
- - **Side effects:** немає.
78
-
79
- ### `semverGte(a, b)`
80
-
81
- Внутрішня. Порівняння semver "більше або дорівнює".
82
-
83
- - **Сигнатура:** `function semverGte(a: SemverObj, b: SemverObj): boolean`
84
- - **Параметри:** обидві трійки `{ major, minor, patch }`.
85
- - **Повертає:** `true`, якщо `a >= b` за лексикографічним порядком `(major, minor, patch)`.
86
- - **Side effects:** немає.
87
-
88
- ### `auditMssqlVersionInPackageJson(rel, parsed, pass, fail)`
89
-
90
- Внутрішня. Аудит одного `package.json` на `dependencies.mssql`.
91
-
92
- - **Сигнатура:** `function auditMssqlVersionInPackageJson(rel: string, parsed: unknown, pass: (msg: string) => void, fail: (msg: string) => void): { found: 0 | 1, bad: 0 | 1 }`
93
- - **Параметри:**
94
- - `rel` — людино-читабельний шлях (відносний, з `/` як роздільник);
95
- - `parsed` — розпарсений JSON `package.json`;
96
- - `pass`, `fail` — колбеки звіту з `createCheckReporter`.
97
- - **Повертає:** інкремент лічильників:
98
- - `found` — `1`, якщо в `dependencies` знайдено ключ `mssql`, інакше `0`;
99
- - `bad` — `1`, якщо знайдено, але версія нечитабельна або менша за `MIN_MSSQL_VERSION`.
100
- - **Side effects:** виклики `pass(...)` / `fail(...)` з конкретними повідомленнями (формат `js-mssql: <rel>: ... (js-mssql.mdc)`).
8
+ # deps.mjs
101
9
 
102
- ### `aggregateMssqlVersionsAcrossPackages(repoRoot, pkgJsonPaths, pass, fail)`
103
-
104
- Внутрішня. Прогін усіх `package.json` із підсумками.
105
-
106
- - **Сигнатура:** `async function aggregateMssqlVersionsAcrossPackages(repoRoot: string, pkgJsonPaths: string[], pass: (msg: string) => void, fail: (msg: string) => void): Promise<{ found: number, bad: number }>`
107
- - **Параметри:**
108
- - `repoRoot` — корінь репозиторію;
109
- - `pkgJsonPaths` — абсолютні шляхи до всіх знайдених `package.json`.
110
- - **Повертає:** сукупні лічильники `{ found, bad }` по всіх файлах.
111
- - **Side effects:**
112
- - читає кожен `package.json` через `readFile`;
113
- - якщо файл — невалідний JSON, викликає `fail('js-mssql: <rel> — невалідний JSON')` і пропускає його (`continue`);
114
- - акумулює інкременти з `auditMssqlVersionInPackageJson`.
115
-
116
- ### `scanMssqlOneSourceFile(rel, content, counters, fail)`
117
-
118
- Внутрішня. Прогін **одного** JS/TS-файлу через шість сканерів з `../lib/mssql-pool-scan.mjs`.
119
-
120
- - **Сигнатура:** `function scanMssqlOneSourceFile(rel: string, content: string, counters: Record<string, number>, fail: (msg: string) => void): void`
121
- - **Параметри:**
122
- - `rel` — relative-шлях файлу (для повідомлень);
123
- - `content` — повний вихідний код файлу;
124
- - `counters` — мутабельний агрегатор лічильників (див. нижче);
125
- - `fail` — колбек звіту про порушення.
126
- - **Лічильники в `counters` (інкрементуються по одному за порушення):**
127
- - `violations` — `new sql.ConnectionPool(...)` всередині функції;
128
- - `sharedRequestViolations` — shared `Request` (наприклад `export const request = pool.request()`);
129
- - `unsafeQueryCalls` — `query(\`...\`)` як виклик функції замість tagged template;
130
- - `unsafeDynamicSqlLists` — динамічні SQL-списки через `.join(',')` у `IN/VALUES`;
131
- - `unparsedInLists` — `IN (${...})` без числового парсера значень;
132
- - `inListGuardViolations` — відсутній або неправильно розташований guard на пустоту IN-списку (розгалуження за `v.reason === 'missing_guard'` дає різні тексти повідомлень).
133
- - **Side effects:** виклики `fail(...)` з конкретним `:line` та `snippet` для кожного знайденого порушення; мутує `counters`.
134
-
135
- ### `reportZeroMssqlSourceViolations(counters, pass)`
136
-
137
- Внутрішня. Для кожного лічильника, що залишився `0`, дає один `pass`-рядок.
138
-
139
- - **Сигнатура:** `function reportZeroMssqlSourceViolations(counters: Record<string, number>, pass: (msg: string) => void): void`
140
- - **Семантика:** перетворює "відсутність порушень" на явні позитивні рядки звіту — щоб у вихідному логу було видно, які саме інваріанти виконано (а не лише сумарний `OK`).
141
- - **Side effects:** виклики `pass(...)` (від 0 до 6, залежно від лічильників).
142
-
143
- ### `auditMssqlSources(repoRoot, ignorePaths, pass, fail)`
144
-
145
- Внутрішня. Повний аудит усіх JS/TS-джерел репо щодо безпечного використання `mssql`.
146
-
147
- - **Сигнатура:** `async function auditMssqlSources(repoRoot: string, ignorePaths: string[], pass: (msg: string) => void, fail: (msg: string) => void): Promise<void>`
148
- - **Алгоритм:**
149
- 1. збирає список файлів через `findAllSourcePathsForMssqlScan`;
150
- 2. якщо файлів немає — один `pass`-рядок `'js-mssql: немає JS/TS файлів для скану singleton ConnectionPool'` і `return`;
151
- 3. ініціалізує `counters` нулями (`violations`, `sharedRequestViolations`, `unsafeQueryCalls`, `unsafeDynamicSqlLists`, `unparsedInLists`, `inListGuardViolations`);
152
- 4. послідовно читає кожен файл через `readFile(absPath, 'utf8')`, нормалізує `rel` і викликає `scanMssqlOneSourceFile`;
153
- 5. в кінці викликає `reportZeroMssqlSourceViolations(counters, pass)`.
154
- - **Side effects:** I/O (читання файлів); виклики `pass` / `fail`.
155
-
156
- ### `check()` _(export)_
157
-
158
- Публічна. Виконує повну перевірку правила.
159
-
160
- - **Сигнатура:** `export async function check(): Promise<number>`
161
- - **Параметри:** немає (працює відносно `process.cwd()`).
162
- - **Повертає:** `number` — exit code від `reporter.getExitCode()` (`0` — OK, `1` — є проблеми).
163
- - **Алгоритм:**
164
- 1. створює репортер: `createCheckReporter()` → деструктурує `{ pass, fail }`;
165
- 2. `repoRoot = process.cwd()`;
166
- 3. **early-return**: якщо в корені немає `package.json` (`existsSync`), записує `pass('js-mssql: package.json у корені відсутній — перевірку пропущено')` і повертає поточний exit code;
167
- 4. зчитує `ignorePaths` через `loadCursorIgnorePaths(repoRoot)`;
168
- 5. збирає всі `package.json` у репозиторії через `findAllPackageJsonPaths(repoRoot, ignorePaths)`;
169
- 6. **early-return**: якщо `package.json` не знайдено зовсім — `pass('js-mssql: package.json не знайдено — перевірку пропущено')` + повернення exit code;
170
- 7. виконує `aggregateMssqlVersionsAcrossPackages(...)` → `{ found, bad }`;
171
- 8. **early-return**: якщо `found === 0`, `pass('js-mssql: пакет mssql не знайдено в dependencies жодного package.json')` + повернення exit code (статичний аналіз не запускається, бо `mssql` у проєкті не використовується);
172
- 9. якщо `bad === 0` — `pass('js-mssql: всі знайдені dependencies.mssql відповідають мінімальній версії 12.5.0 (<found>)')`;
173
- 10. виконує `auditMssqlSources(repoRoot, ignorePaths, pass, fail)`;
174
- 11. повертає `reporter.getExitCode()`.
175
- - **Side effects:** I/O (читання FS), звітування через `pass`/`fail` репортера.
176
-
177
- ## Залежності
178
-
179
- ### Стандартні модулі Node.js
180
-
181
- | Імпорт | Звідки | Використання |
182
- | ------------------ | ------------------ | ---------------------------------------------------------------------------------- |
183
- | `existsSync` | `node:fs` | Перевірка наявності `package.json` у корені (швидкий синхронний guard). |
184
- | `readFile` | `node:fs/promises` | Асинхронне читання `package.json` та джерельних файлів у UTF-8. |
185
- | `join`, `relative` | `node:path` | Побудова шляху до `package.json` та нормалізація відносних шляхів для повідомлень. |
186
-
187
- ### Внутрішні модулі репозиторію
188
-
189
- | Імпорт | Звідки | Призначення |
190
- | ---------------------------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
191
- | `createCheckReporter` | `../../../scripts/lib/check-reporter.mjs` | Уніфікований репортер для всіх `check`-скриптів: накопичує `pass`/`fail` рядки і формує exit code. |
192
- | `findAllPackageJsonPaths` | `../../../scripts/utils/find-package-json-paths.mjs` | Рекурсивний пошук усіх `package.json` (моно-репо/workspaces) з урахуванням ignore-шляхів. |
193
- | `findMssqlPerRequestConnectionInText` | `../lib/mssql-pool-scan.mjs` | Пошук `new sql.ConnectionPool(...)` всередині функцій. |
194
- | `findSharedMssqlRequestInText` | `../lib/mssql-pool-scan.mjs` | Пошук shared `Request` (наприклад `export const request = pool.request()`). |
195
- | `findUnsafeMssqlQueryTemplateCallInText` | `../lib/mssql-pool-scan.mjs` | Пошук `query(\`...\`)` як звичайного виклику замість tagged template. |
196
- | `findUnsafeMssqlDynamicSqlListInText` | `../lib/mssql-pool-scan.mjs` | Пошук динамічних SQL-списків через `.join(',')` у `IN/VALUES`. |
197
- | `findUnsafeMssqlInListUnparsedInText` | `../lib/mssql-pool-scan.mjs` | Пошук `IN (${...})` без числового парсингу значень. |
198
- | `findUnsafeMssqlInListMissingEmptyGuardInText` | `../lib/mssql-pool-scan.mjs` | Пошук IN-списків без guard'у на пустоту з `throw`. |
199
- | `isMssqlScanSourceFile` | `../lib/mssql-pool-scan.mjs` | Фільтр-предикат: чи треба сканувати файл за його relative-шляхом. |
200
- | `loadCursorIgnorePaths` | `../../../scripts/lib/load-cursor-config.mjs` | Завантаження `.cursorignore` → масив абсолютних ignore-шляхів. |
201
- | `walkDir` | `../../../scripts/utils/walkDir.mjs` | Рекурсивний обхід файлової системи з callback на кожен файл і ignore-каталогами. |
202
-
203
- ### Очікувана форма колбеків репортера
204
-
205
- ```js
206
- const reporter = createCheckReporter()
207
- // reporter: { pass(msg: string): void, fail(msg: string): void, getExitCode(): number }
208
- ```
209
-
210
- `pass` додає позитивне повідомлення (не впливає на exit code), `fail` — фіксує порушення і змушує `getExitCode()` повернути `1`.
211
-
212
- ## Потік виконання / Використання
213
-
214
- ### Сценарій інтеграції
215
-
216
- Модуль є частиною інфраструктури `n-cursor` правил `npm/rules/js-mssql/`. Він викликається універсальним runner'ом правил (наприклад через `bun run` або `n-cursor` CLI), який імпортує `check` і використовує її exit code як підсумок.
217
-
218
- Типове використання:
219
-
220
- ```js
221
- import { check } from './deps.mjs'
10
+ ## Огляд
222
11
 
223
- const exitCode = await check()
224
- process.exit(exitCode)
225
- ```
12
+ request
13
+ Витягує рядок версії `dependencies.mssql` з `package.json` (js-mssql.mdc)
226
14
 
227
- ### Послідовність дій усередині `check()`
15
+ check
16
+ Перевіряє використання `mssql` у джерелах коду та порівнює його версію з версією у `package.json` (package.json)
228
17
 
229
- 1. **Ініціалізація репортера.** Створюється локальний `reporter` через `createCheckReporter()`.
230
- 2. **Guard 1 — кореневий `package.json`.** Якщо в `process.cwd()` немає `package.json`, перевірка вважається непридатною; виставляється `pass` і повертається exit code (зазвичай `0`).
231
- 3. **Завантаження ignore-шляхів.** Зчитуються через `loadCursorIgnorePaths(repoRoot)`.
232
- 4. **Збір усіх `package.json`.** `findAllPackageJsonPaths(repoRoot, ignorePaths)` повертає масив абсолютних шляхів усіх `package.json` репозиторію (з урахуванням workspace-пакетів і ignore).
233
- 5. **Guard 2 — порожній список.** Якщо `package.json` зовсім немає — пропуск перевірки з відповідним `pass`.
234
- 6. **Версійний аудит.** `aggregateMssqlVersionsAcrossPackages` обходить кожен `package.json`, парсить JSON, для кожного знайденого `dependencies.mssql` запускає `auditMssqlVersionInPackageJson`. Підсумок — `{ found, bad }`.
235
- 7. **Guard 3 — `mssql` не використовується.** Якщо `found === 0`, фіксується позитивний рядок `'js-mssql: пакет mssql не знайдено в dependencies жодного package.json'` і виконання завершується — статичний аналіз джерел **не запускається** (немає сенсу шукати порушення для пакета, якого немає в залежностях).
236
- 8. **Підсумковий pass про версії.** Якщо `bad === 0` (всі версії OK), додається підсумковий `pass` з кількістю знайдених.
237
- 9. **Аудит джерел.** `auditMssqlSources` сканує всі JS/TS-файли (через `walkDir` + `isMssqlScanSourceFile`), застосовує шість сканерів безпеки і фіксує кожне порушення через `fail`. Відсутність порушень за кожним типом конвертується у явний `pass` через `reportZeroMssqlSourceViolations`.
238
- 10. **Повернення exit code.** `reporter.getExitCode()` → `0` якщо жодного `fail` не було, інакше `1`.
18
+ ## Поведінка
239
19
 
240
- ### Формати повідомлень
20
+ request
21
+ Витягує рядок версії `dependencies.mssql` з package.json
241
22
 
242
- Усі повідомлення мають префікс `js-mssql:` і додатково цитують правило `js-mssql.mdc` у негативних випадках. Приклади:
23
+ request
24
+ Витягує рядок версії `dependencies.mssql` з package.json
243
25
 
244
- - **Версія OK:** `js-mssql: package.json: dependencies.mssql "^12.5.0" (>=12.5.0)`
245
- - **Версія нижче мінімуму:** `js-mssql: package.json: dependencies.mssql "^11.0.0" має бути >=12.5.0 (js-mssql.mdc)`
246
- - **Невалідний JSON:** `js-mssql: package.json — невалідний JSON`
247
- - **Per-request pool:** `js-mssql: src/db.js:42 — не створюй new sql.ConnectionPool(...) на кожен запит; використовуй singleton sql.ConnectionPool: <snippet>`
248
- - **Відсутній guard для IN:** `js-mssql: src/db.js:58 — перед IN-списком "ids" потрібна перевірка на пустоту з throw (наприклад if (!ids.length) throw ...), інакше можливі некоректні запити (js-mssql.mdc): <snippet>`
26
+ check
27
+ Аудитує використання mssql у джерелах коду та перевіряє відповідність версії mssql у package.json
249
28
 
250
- ### Платформо-незалежна нормалізація шляхів
29
+ ## Публічний API
251
30
 
252
- У всіх місцях, де формується `rel`, послідовно застосовується `relative(repoRoot, absPath).split('\\').join('/')`. Це робить повідомлення стабільними на Windows і POSIX одночасно й узгодженими з шаблонами `isMssqlScanSourceFile`.
31
+ request: Створює запит для бази даних
32
+ request: Формує запит для бази даних
33
+ check: Перевіряє відповідність проєкту правилу js-mssql.mdc
253
34
 
254
- ### Корнер-кейси
35
+ ## Гарантії поведінки
255
36
 
256
- - **Відсутній `package.json` у корені** перевірка повністю пропускається з позитивним `pass`.
257
- - **Жодного `package.json`** (наприклад, у нестандартному репо без npm) — перевірка пропускається.
258
- - **`dependencies` відсутній або не object** `getMssqlDependencyRange` повертає `null` через `asObject`, лічильник не збільшується.
259
- - **Нечитабельна версія** (наприклад `"latest"`, `"workspace:*"`, `"git+..."` без чистого `MAJOR.MINOR.PATCH`) — `parseLeadingSemver` повертає `null`, фіксується `fail` "має нечитабельну версію".
260
- - **Версія дорівнює мінімуму** — `semverGte(parsedVer, MIN_MSSQL_VERSION)` дає `true`, фіксується `pass`.
261
- - **`mssql` відсутній у всіх `package.json`** — статичний аналіз не запускається (оптимізація для проєктів, які не використовують MSSQL).
262
- - **Файл — невалідний JSON** — фіксується `fail`, обхід продовжується (`continue`).
263
- - **Жодного JS/TS-файлу** у репо для скану — фіксується позитивний `pass`, виконання продовжується нормально.
37
+ - Read-only: файл не виконує операцій запису у файлову систему.
38
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
39
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
40
+ - Не звертається до мережі.
@@ -1,153 +1,38 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/js-run/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
+ score: 100
5
6
  ---
6
7
 
7
- # fix.mjs — точка входу правила `js-run`
8
+ # fix.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл `npm/rules/js-run/fix.mjs` це **диспетчер правила** `js-run` у пакеті `@nitra/cursor`. Він виконує дві ролі одночасно:
12
+ Виконує застосування політики JS-занепокоєних до mdc-refs на вхідному контексті прогону та повертає результат.
12
13
 
13
- 1. **Library-режим** експортує функцію `run(ctx)`, яку викликає зовнішній CLI-оркестратор (`npx @nitra/cursor fix <id>`) під час пакетного прогону всіх правил. У цьому режимі модуль не торкається `process.exit` і повертає `Promise<number>` із кодом виходу.
14
- 2. **Standalone-режим** — якщо файл запущено напряму (`bun rules/js-run/fix.mjs`), він поводиться як повноцінний entry-point: завантажує конфіг, застосовує whitelist, друкує підсумок і завершує процес із відповідним exit-code.
14
+ Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`, завантажує конфігурацію, перевіряє дозволені елементи та повертає код виходу.
15
15
 
16
- Усю фактичну логіку (визначення `applies`, JS-concerns, policy-перевірки, mdc-references) інкапсулює спільна функція `runStandardRule`. `fix.mjs` лише прокидає `import.meta.dirname` (директорія правила) до неї або до CLI-обгортки `runRuleCli`. Файл не містить власних доменних перевірок — він суто структурний і дотримується конвенції «двох ролей `fix.mjs`», прийнятої в `@nitra/cursor` для всіх стандартних правил.
16
+ ## Поведінка
17
17
 
18
- Назву правила (`js-run`) система визначає не з вмісту цього файлу, а з імені директорії, в якій він лежить (`npm/rules/js-run/`). Це дозволяє створювати ідентичні `fix.mjs` для багатьох правил, не дублюючи логіку.
18
+ 1. Запуск правила.
19
+ * Приймає контекст прогону.
20
+ * Виконує застосування JS-занепокоєних до політики до mdc-refs.
21
+ * Повертає результат прогону.
22
+ 2. Запуск правила у режимі CLI.
23
+ * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
+ * Виконує завантаження конфігурації.
25
+ * Виконує перевірку дозволених елементів.
26
+ * Виконує підбиття підсумків.
27
+ * Повертає код виходу.
19
28
 
20
- ## Експорти / API
29
+ ## Публічний API
21
30
 
22
- | Експорт | Тип | Призначення |
23
- | ------- | ---------------------------------------------- | ------------------------------------------------------------------------------------ |
24
- | `run` | `function(ctx?: RuleContext): Promise<number>` | Library entry-point правила — викликається зовнішнім оркестратором у тому ж процесі. |
31
+ run запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
32
+ Library mode викликається CLI orchestration через `import + run`.
25
33
 
26
- Додатково в модулі присутній **side-effect блок** на рівні модуля: якщо `isRunAsCli(import.meta.url)` повертає `true`, модуль виконує `await runRuleCli(...)` і завершує процес через `process.exit(...)`. Цей блок не є експортом, але є частиною публічної поведінки файлу.
34
+ ## Гарантії поведінки
27
35
 
28
- Файл не має default-експорту і не реекспортує нічого зі своїх залежностей.
29
-
30
- ## Функції
31
-
32
- ### `run(ctx)`
33
-
34
- ```js
35
- /**
36
- *
37
- */
38
- export function run(ctx) {
39
- return runStandardRule(import.meta.dirname, ctx)
40
- }
41
- ```
42
-
43
- - **Сигнатура:** `run(ctx?: RuleContext): Promise<number>`
44
- - **Параметри:**
45
- - `ctx` _(необовʼязковий)_ — обʼєкт контексту прогону. Тип імпортується з `../../scripts/lib/run-standard-rule.mjs` як `RuleContext`. Зазвичай містить розділяємий між правилами кеш обходу файлової системи (`walkCache`) та інші cross-rule артефакти, які дозволяють зекономити IO при батч-прогоні. Якщо аргумент не передано, `runStandardRule` створює локальний контекст самостійно.
46
- - **Повертає:** `Promise<number>` — exit-code прогону:
47
- - `0` — порушень не знайдено (OK);
48
- - `1` — знайдено хоча б одне порушення.
49
- - **Side effects:** делегуються в `runStandardRule`. Можливі: читання файлів проєкту, читання `meta.json` правила, друк діагностики у stdout/stderr, запис у спільні структури `ctx`. Сам `run` `process.exit` не викликає — це принципово для library-режиму, де декілька правил мають викликатись підряд в одному процесі.
50
- - **Алгоритм:** одна делегація — `runStandardRule(import.meta.dirname, ctx)`. `import.meta.dirname` — абсолютний шлях до директорії, в якій лежить `fix.mjs` (тобто `.../npm/rules/js-run/`). За цим шляхом `runStandardRule` знаходить `meta.json`, підправила в `js/`, `policy/`, а також `.mdc`-документ правила.
51
-
52
- ### Top-level CLI-блок
53
-
54
- ```js
55
- if (isRunAsCli(import.meta.url)) {
56
- process.exit(await runRuleCli(import.meta.dirname))
57
- }
58
- ```
59
-
60
- - **Умова активації:** `isRunAsCli(import.meta.url)` — повертає `true`, якщо файл запущено напряму як скрипт (`node`/`bun fix.mjs`), а не імпортовано як модуль. Конкретний механізм перевірки інкапсульований у `run-rule-cli.mjs`.
61
- - **Що робить:** очікує (`await`) завершення `runRuleCli(import.meta.dirname)`, який окрім логіки `runStandardRule` додатково:
62
- - завантажує конфіг проєкту (whitelist, exclusions);
63
- - вирівнює аргументи CLI;
64
- - друкує summary в кінці прогону;
65
- - повертає exit-code.
66
- - **Завершення:** `process.exit(<code>)` — обовʼязкове для standalone-режиму, бо CI/IDE очікують саме exit-code, а не повернене значення з `import()`.
67
- - **ESLint suppression:** коментар `// eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit` свідомо вимикає правила, які забороняють `process.exit` у бібліотечному коді. Виключення виправдане роллю файлу як standalone-entry-point — це не лібра у вузькому сенсі.
68
-
69
- ## Залежності
70
-
71
- Файл має рівно **дві** внутрішні залежності, обидві з `npm/scripts/lib/`:
72
-
73
- | Імпорт | Звідки | Що звідти використовується |
74
- | ----------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
75
- | `isRunAsCli` | `../../scripts/lib/run-rule-cli.mjs` | Предикат: чи модуль запущено як CLI, а не імпортовано як бібліотека. Приймає `import.meta.url`. |
76
- | `runRuleCli` | `../../scripts/lib/run-rule-cli.mjs` | Повна CLI-обгортка над `runStandardRule`: конфіг + whitelist + summary + повернення exit-code. Приймає `import.meta.dirname`. |
77
- | `runStandardRule` | `../../scripts/lib/run-standard-rule.mjs` | Універсальний раннер «стандартного» правила: applies → JS-concerns → policy → mdc-refs. Приймає `(dirname, ctx?)`. |
78
-
79
- Зовнішніх npm-залежностей файл не має. Опосередковано він залежить від:
80
-
81
- - структури директорії правила (`meta.json`, підтеки `js/`, `policy/`, `.mdc`-файл);
82
- - існування файлу `js-run.mdc` поруч (документ правила, на який спирається mdc-refs);
83
- - API-контракту `RuleContext`, який тримається в `run-standard-rule.mjs`.
84
-
85
- ## Потік виконання / Використання
86
-
87
- ### Library-режим (батч-прогон правил)
88
-
89
- ```js
90
- // Десь у CLI-оркестраторі @nitra/cursor
91
- import { run as runJsRun } from '@nitra/cursor/rules/js-run/fix.mjs'
92
-
93
- const ctx = createSharedContext() // walkCache, тощо
94
- const code = await runJsRun(ctx) // 0 або 1
95
- if (code !== 0) failures.push('js-run')
96
- ```
97
-
98
- Послідовність:
99
-
100
- 1. Оркестратор створює спільний `ctx` (один на всі правила в прогоні).
101
- 2. Імпортує `run` з `fix.mjs` потрібного правила.
102
- 3. Викликає `run(ctx)` і чекає `Promise<number>`.
103
- 4. `run` делегує в `runStandardRule(dirname, ctx)`, яка читає `meta.json`, виконує applies → JS-concerns → policy → mdc-refs.
104
- 5. Результат — exit-code — повертається оркестратору, який агрегує всі коди й вирішує, з чим завершити сам процес.
105
-
106
- ### Standalone-режим (локальний дебаг або CI per-rule)
107
-
108
- ```bash
109
- bun npm/rules/js-run/fix.mjs
110
- # або
111
- node npm/rules/js-run/fix.mjs
112
- ```
113
-
114
- Послідовність:
115
-
116
- 1. Інтерпретатор завантажує модуль.
117
- 2. Виконується top-level код: `isRunAsCli(import.meta.url)` повертає `true` (бо файл — entrypoint).
118
- 3. Викликається `await runRuleCli(import.meta.dirname)`:
119
- - читає конфіг проєкту і whitelist;
120
- - усередині запускає еквівалент `runStandardRule(dirname, ctx)`;
121
- - друкує summary у stdout.
122
- 4. Повернений exit-code передається в `process.exit(...)`, який завершує процес з ним же.
123
- 5. CI/IDE/Husky отримують exit-code і вирішують, чи фейлити крок.
124
-
125
- ### Розширення / модифікація
126
-
127
- - Щоб **додати специфічну логіку** для `js-run` за межами «стандартної» воронки — не правити цей файл, а додати чек у `js/` або `policy/` директорію правила. `runStandardRule` сам їх підхопить.
128
- - Щоб **використати власний контекст** — передавати `ctx` із полем `walkCache: Map<string, FsEntry[]>` для шарингу обходу між правилами.
129
- - Щоб **тимчасово виключити правило з batch** — оркестратор просто не імпортує `run` цього файлу. Сам файл такої логіки не містить.
130
-
131
- ### Інваріанти, які слід зберігати при змінах
132
-
133
- 1. Library-функція `run` **ніколи не викликає** `process.exit` — інакше зламається батч-прогон.
134
- 2. CLI-блок виконується **тільки** під охороною `isRunAsCli(import.meta.url)` — інакше імпорт зробить exit у чужому процесі.
135
- 3. У `runStandardRule` і `runRuleCli` передається `import.meta.dirname`, а не `import.meta.url` — це шлях, а не URL. Підміна типу зламає резолвінг `meta.json` і підправил.
136
- 4. Назва правила береться з імені директорії — не дублюй її рядком у цьому файлі.
137
-
138
- ## Rebuild Test
139
-
140
- Виходячи з цього документа можна відновити еквівалентний файл `fix.mjs`:
141
-
142
- 1. Імпортувати `isRunAsCli` і `runRuleCli` з `../../scripts/lib/run-rule-cli.mjs`.
143
- 2. Імпортувати `runStandardRule` з `../../scripts/lib/run-standard-rule.mjs`.
144
- 3. Експортувати функцію `run(ctx)`, яка повертає `runStandardRule(import.meta.dirname, ctx)`.
145
- 4. Додати top-level `if (isRunAsCli(import.meta.url)) { process.exit(await runRuleCli(import.meta.dirname)) }` з ESLint-suppression-коментарем для `n/no-process-exit` і `unicorn/no-process-exit`.
146
- 5. JSDoc для `run`: параметр `ctx?: RuleContext` (тип із `run-standard-rule.mjs`), повертає `Promise<number>` (0 — OK, 1 — порушення).
147
-
148
- Поведінкові ознаки для перевірки відновленого файлу:
149
-
150
- - `import { run } from './fix.mjs'` працює без побічних ефектів (CLI-блок не активується).
151
- - `bun fix.mjs` запускає повний CLI-прогон і завершує процес із кодом `0` або `1`.
152
- - `run(ctx)` повертає `Promise`, який резолвиться у число.
153
- - Файл не містить більше ніяких експортів і ніяких власних доменних перевірок.
36
+ - Read-only: файл не виконує операцій запису у файлову систему.
37
+ - Кешує результати в межах одного прогону.
38
+ - Не звертається до мережі.