@nitra/cursor 12.11.1 → 12.11.3

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 (96) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/bin/n-cursor.js +0 -15
  3. package/package.json +1 -1
  4. package/rules/adr/js/docs/hooks.md +0 -2
  5. package/rules/bun/docs/index.md +2 -2
  6. package/rules/bun/docs/main.md +9 -9
  7. package/rules/bun/js/docs/fix-layout.md +25 -0
  8. package/rules/bun/js/docs/index.md +3 -2
  9. package/rules/bun/js/fix-layout.mjs +55 -0
  10. package/rules/bun/main.json +1 -1
  11. package/rules/bun/main.mjs +53 -3
  12. package/rules/changelog/js/docs/fix-consistency.md +27 -0
  13. package/rules/changelog/js/docs/index.md +1 -0
  14. package/rules/changelog/js/fix-consistency.mjs +50 -0
  15. package/rules/ci4/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  16. package/rules/ci4/policy/vscode_extensions/docs/index.md +11 -0
  17. package/rules/ci4/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  18. package/rules/ga/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
  19. package/rules/ga/policy/vscode_extensions/docs/index.md +11 -0
  20. package/rules/ga/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  21. package/rules/graphql/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  22. package/rules/graphql/policy/vscode_extensions/docs/index.md +11 -0
  23. package/rules/graphql/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  24. package/rules/js/js/dep-policy.mdc +19 -0
  25. package/rules/js/js/dep-policy.mjs +14 -6
  26. package/rules/js/js/docs/dep-policy.md +12 -10
  27. package/rules/js/js/docs/index.md +5 -5
  28. package/rules/js/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
  29. package/rules/js/policy/vscode_extensions/docs/index.md +11 -0
  30. package/rules/js/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  31. package/rules/js-run/js/docs/fix-runtime.md +25 -0
  32. package/rules/js-run/js/docs/index.md +3 -2
  33. package/rules/js-run/js/fix-runtime.mjs +41 -0
  34. package/rules/nginx-default-tpl/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  35. package/rules/nginx-default-tpl/policy/vscode_extensions/docs/index.md +11 -0
  36. package/rules/nginx-default-tpl/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  37. package/rules/python/docs/index.md +2 -2
  38. package/rules/python/docs/main.md +12 -10
  39. package/rules/python/main.mjs +1 -0
  40. package/rules/rego/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
  41. package/rules/rego/policy/vscode_extensions/docs/index.md +11 -0
  42. package/rules/rego/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  43. package/rules/rust/docs/index.md +2 -2
  44. package/rules/rust/docs/main.md +8 -6
  45. package/rules/rust/main.mjs +11 -0
  46. package/rules/rust/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
  47. package/rules/rust/policy/vscode_extensions/docs/index.md +11 -0
  48. package/rules/rust/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  49. package/rules/style/js/docs/fix-tooling.md +29 -0
  50. package/rules/style/js/docs/index.md +3 -2
  51. package/rules/style/js/fix-tooling.mjs +46 -0
  52. package/rules/style/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  53. package/rules/style/policy/vscode_extensions/docs/index.md +11 -0
  54. package/rules/style/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  55. package/rules/tauri/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  56. package/rules/tauri/policy/vscode_extensions/docs/index.md +11 -0
  57. package/rules/tauri/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  58. package/rules/text/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
  59. package/rules/text/policy/vscode_extensions/docs/index.md +11 -0
  60. package/rules/text/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
  61. package/rules/vue/js/docs/packages.md +0 -2
  62. package/scripts/docs/index.md +0 -2
  63. package/scripts/lib/discover-checkable-rules.mjs +1 -0
  64. package/scripts/lib/docs/discover-checkable-rules.md +13 -155
  65. package/scripts/lib/docs/index.md +35 -35
  66. package/scripts/lib/fix/discover-t0-patterns.mjs +83 -0
  67. package/scripts/lib/fix/docs/discover-t0-patterns.md +37 -0
  68. package/scripts/lib/fix/docs/index.md +12 -10
  69. package/scripts/lib/fix/docs/llm-fix-apply.md +12 -10
  70. package/scripts/lib/fix/docs/llm-worker.md +6 -14
  71. package/scripts/lib/fix/docs/orchestrator.md +0 -2
  72. package/scripts/lib/fix/docs/t0.md +11 -10
  73. package/scripts/lib/fix/docs/vscode-ext-add.md +29 -0
  74. package/scripts/lib/fix/t0.mjs +8 -234
  75. package/scripts/lib/fix/vscode-ext-add.mjs +45 -0
  76. package/skills/doc-aggregate/SKILL.md +8 -18
  77. package/skills/doc-aggregate/js/docs/index.md +0 -1
  78. package/rules/test/coverage/coverage.mjs +0 -317
  79. package/scripts/coverage-classify/apply.mjs +0 -67
  80. package/scripts/coverage-classify/cache.mjs +0 -77
  81. package/scripts/coverage-classify/docs/apply.md +0 -206
  82. package/scripts/coverage-classify/docs/cache.md +0 -207
  83. package/scripts/coverage-classify/docs/index.md +0 -14
  84. package/scripts/coverage-classify/docs/prompt.md +0 -136
  85. package/scripts/coverage-classify/docs/verdict-schema.md +0 -28
  86. package/scripts/coverage-classify/index.mjs +0 -114
  87. package/scripts/coverage-classify/prompt.mjs +0 -126
  88. package/scripts/coverage-classify/verdict-schema.mjs +0 -35
  89. package/scripts/coverage-fix-extract.mjs +0 -122
  90. package/scripts/coverage-fix.mjs +0 -119
  91. package/scripts/docs/coverage-fix-extract.md +0 -36
  92. package/scripts/docs/coverage-fix.md +0 -181
  93. package/skills/coverage-fix/SKILL.md +0 -131
  94. package/skills/coverage-fix/main.json +0 -1
  95. package/skills/doc-aggregate/js/docgen-scan.mjs +0 -195
  96. package/skills/doc-aggregate/js/docs/docgen-scan.md +0 -76
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [12.11.3] - 2026-06-25
4
+
5
+ ### Changed
6
+
7
+ - rm doc-aggregate; dep policy
8
+
9
+ ## [12.11.2] - 2026-06-25
10
+
11
+ ### Changed
12
+
13
+ - docs: файлова документація для fix-<concern>.mjs та суміжних файлів; feat(fix): розкладаємо T0-паттерни по правилах — fix-<concern>.mjs конвенція
14
+
3
15
  ## [12.11.1] - 2026-06-25
4
16
 
5
17
  ### Changed
package/bin/n-cursor.js CHANGED
@@ -14,7 +14,6 @@
14
14
  * весь репо (`per-file` ∪ `full`); `--read-only` = без мутацій/LLM (CI); позиційні
15
15
  * (не-флаг) аргументи — фільтр правил конформності (мапить колишній `fix <rule>`).
16
16
  * CI = `lint --read-only --full` (весь репо, нуль мутацій/LLM).
17
- * `npx \@nitra/cursor doc-aggregate modules` — JSON-лістинг логічних модулів (межі за `package.json`) для Tier 2 скілу doc-aggregate
18
17
  * `npx \@nitra/cursor skill list` — скіли пакета без синку в проєкт
19
18
  * `npx \@nitra/cursor skill taze` — промпт на stdout
20
19
  * `npx \@nitra/cursor skill cursor taze ["task"]` — Cursor CLI (`cursor-agent -p`)
@@ -1593,20 +1592,6 @@ try {
1593
1592
 
1594
1593
  break
1595
1594
  }
1596
- case 'doc-aggregate': {
1597
- // n-cursor doc-aggregate modules — детермінований лістинг логічних модулів
1598
- // (межі за package.json) для Tier 2 module-summary скілу doc-aggregate.
1599
- // Друкує JSON; module-summary і доменні доки пише скіл, диспатчачи субагентів.
1600
- const { runDocAggregateModulesCli } = await import('../skills/doc-aggregate/js/docgen-scan.mjs')
1601
- if (args[0] === 'modules') {
1602
- process.exitCode = await runDocAggregateModulesCli(args.slice(1))
1603
- } else {
1604
- console.error('Usage: npx @nitra/cursor doc-aggregate <modules> [--root <dir>]')
1605
- process.exitCode = 1
1606
- }
1607
-
1608
- break
1609
- }
1610
1595
  case undefined:
1611
1596
  case '': {
1612
1597
  await runSync()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "12.11.1",
3
+ "version": "12.11.3",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль перевіряє стан проєкту, валідуючи конфігураційні файли (`settings.json`, `hooks.json`, `settings.local.json`) та перевіряючи наявність структур для документації (adr.mdc). Перевірка включає перевірку наявності необхідних елементів, при цьому шляхи `.git` свідомо ігноруються.
14
12
 
15
13
  ## Поведінка
@@ -6,6 +6,6 @@ resource: npm/rules/bun/
6
6
 
7
7
  # npm/rules/bun
8
8
 
9
- | Файл | Тип |
10
- | ------------------- | --------- |
9
+ | Файл | Тип |
10
+ |---|---|
11
11
  | [main.mjs](main.md) | JS Module |
@@ -3,24 +3,24 @@ type: JS Module
3
3
  title: main.mjs
4
4
  resource: npm/rules/bun/main.mjs
5
5
  docgen:
6
- crc: 762b6875
6
+ crc: a2cfc572
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 100
8
+ score: 90
9
9
  ---
10
10
 
11
- Модуль валідує дані, застосовуючи правила, визначені у конфігурації meta.json, та збирає посилання на MDC. При виклику публічної функції run він здійснює повний запуск правила, включаючи завантаження конфігурацій та застосування білих списків. Результат виконання повертається як код виходу процесу.
11
+ ## Огляд
12
+
13
+ Модуль виконує перевірку відповідності коду встановленим політикам, використовуючи маркер повідомлень (bun.mdc). Він також аналізує ліцензії залежностей, спираючись на конфігурацію .licensee.json. Модуль надає функції для запуску перевірок (run) та лінтингу (lint).
12
14
 
13
15
  ## Поведінка
14
16
 
15
- 1. Викликається функція `run` для виконання перевірки.
16
- 2. Виконання перевірки включає застосування правил, обробку логіки, визначену в конфігурації `meta.json`, та збір посилань на MDC.
17
- 3. Якщо код виконується як окремий інструмент (standalone), ініціюється повний запуск правила.
18
- 4. Повний запуск правила включає завантаження конфігурацій, застосування білих списків та підбиття підсумків.
19
- 5. Результат виконання повертається як код виходу процесу.
17
+ run виконує перевірку коду, застосовуючи політики та посилання MDC.
18
+ lint виконує перевірку ліцензій npm-залежностей, якщо існує файл .licensee.json у корені проєкту.
20
19
 
21
20
  ## Публічний API
22
21
 
23
- run — виконує основну логіку правила: застосовує перевірки до коду, аналізує відповідність політиці та перевіряє посилання на метадані.
22
+ run — Основний вхідний пункт правила, який виконує перевірку: застосовує логіку, перевіряє відповідність політикам та згадки в (bun.mdc).
23
+ lint — Інструмент для перевірки ліцензій npm-залежностей у всьому репозиторії, що активується через конфігурацію (.licensee.json).
24
24
 
25
25
  ## Гарантії поведінки
26
26
 
@@ -0,0 +1,25 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-layout.mjs
4
+ resource: npm/rules/bun/js/fix-layout.mjs
5
+ docgen:
6
+ crc: 168821f1
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Файл T0-autofix паттерни для `bun/js/layout.mjs` детермінують FS-виправлення, які видаляють заборонені файли залежностей (наприклад, package-lock.json), створюють відсутній bunfig.toml та рекурсивно видаляють каталог .yarn. Ці виправлення спираються на конфіги, зокрема package-lock.json.
14
+
15
+ ## Поведінка
16
+
17
+ patterns
18
+
19
+ 1. Перевіряє вивід на наявність повідомлення про знайдений заборонений файл. Якщо знайдено, ідентифікує всі заборонені файли. Для кожного ідентифікованого файлу, якщо він існує, видаляє його. Повертає результат, що вказує на успішне видалення файлів або відсутність відповідності.
20
+ 2. Перевіряє вивід на наявність повідомлення про відсутність `bunfig.toml`. Якщо повідомлення знайдено, і якщо файл `bunfig.toml` не існує, створює його з базовим вмістом. Повертає результат, що вказує на успішне створення файлу або на те, що він вже існує.
21
+ 3. Перевіряє вивід на наявність повідомлення про знайдену директорію `.yarn`. Якщо повідомлення знайдено, і якщо директорія `.yarn` існує, рекурсивно видаляє її. Повертає результат, що вказує на успішне видалення директорії або на її відсутність.
22
+
23
+ ## Гарантії поведінки
24
+
25
+ - (специфічних машинно-виведених гарантій немає)
@@ -6,6 +6,7 @@ resource: npm/rules/bun/js/
6
6
 
7
7
  # npm/rules/bun/js
8
8
 
9
- | Файл | Тип |
10
- | ----------------------- | --------- |
9
+ | Файл | Тип |
10
+ |---|---|
11
+ | [fix-layout.mjs](fix-layout.md) | JS Module |
11
12
  | [layout.mjs](layout.md) | JS Module |
@@ -0,0 +1,55 @@
1
+ /**
2
+ * T0-autofix паттерни для `bun/js/layout.mjs` — детерміновані FS-виправлення
3
+ * заборонених файлів (package-lock.json, yarn.lock тощо), відсутнього bunfig.toml
4
+ * та каталогу .yarn без звернення до LLM.
5
+ */
6
+ import { existsSync, rmSync, writeFileSync } from 'node:fs'
7
+ import { join } from 'node:path'
8
+
9
+ const FORBIDDEN_FILE_RE = /Знайдено заборонений файл: \S+/
10
+ const FORBIDDEN_FILE_MATCH_ALL_RE = /Знайдено заборонений файл: (\S+)/g
11
+
12
+ /** @type {import('../../../scripts/lib/fix/discover-t0-patterns.mjs').T0Pattern[]} */
13
+ export const patterns = [
14
+ {
15
+ id: 'rm-forbidden-file',
16
+ test: out => FORBIDDEN_FILE_RE.test(out),
17
+ apply: (out, cwd) => {
18
+ const matches = [...out.matchAll(FORBIDDEN_FILE_MATCH_ALL_RE)]
19
+ if (matches.length === 0) return { ok: false, action: 'no match' }
20
+
21
+ const removed = []
22
+ for (const m of matches) {
23
+ const filePath = join(cwd, m[1])
24
+ if (existsSync(filePath)) {
25
+ rmSync(filePath, { force: true })
26
+ removed.push(m[1])
27
+ }
28
+ }
29
+ if (removed.length === 0) return { ok: false, action: 'файлів не знайдено' }
30
+ return { ok: true, action: `видалено: ${removed.join(', ')}` }
31
+ }
32
+ },
33
+
34
+ {
35
+ id: 'bun-bunfig-create',
36
+ test: out => /Відсутній bunfig\.toml/.test(out),
37
+ apply: (_out, cwd) => {
38
+ const target = join(cwd, 'bunfig.toml')
39
+ if (existsSync(target)) return { ok: false, action: 'bunfig.toml вже існує' }
40
+ writeFileSync(target, '[install]\nlinker = "hoisted"\n', 'utf8')
41
+ return { ok: true, action: 'створено bunfig.toml' }
42
+ }
43
+ },
44
+
45
+ {
46
+ id: 'bun-yarn-dir-remove',
47
+ test: out => /Знайдено директорію \.yarn/.test(out),
48
+ apply: (_out, cwd) => {
49
+ const target = join(cwd, '.yarn')
50
+ if (!existsSync(target)) return { ok: false, action: '.yarn не знайдено' }
51
+ rmSync(target, { recursive: true, force: true })
52
+ return { ok: true, action: 'видалено .yarn/' }
53
+ }
54
+ }
55
+ ]
@@ -1 +1 @@
1
- { "auto": { "glob": "package.json" } }
1
+ { "auto": { "glob": "package.json" }, "lint": "full" }
@@ -1,11 +1,17 @@
1
+ import { existsSync } from 'node:fs'
2
+ import { join } from 'node:path'
3
+ import { spawnSync } from 'node:child_process'
4
+
5
+ import { createCheckReporter } from '../../scripts/lib/check-reporter.mjs'
6
+ import { runStandardLint } from '../../scripts/lib/run-standard-lint.mjs'
7
+ import { resolveCmd } from '../../scripts/utils/resolve-cmd.mjs'
1
8
  import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
2
9
  import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
3
10
 
4
11
  /**
5
12
  * Єдиний entrypoint правила (ADR 2026-06-21). `run()` — check-поверхня: applies →
6
- * JS-concerns → policy → mdc-refs (через runStandardRule). Lint-поверхні правило не має
7
- * (`meta.json` без `lint`), тож експорту `lint` тут немає.
8
- * Library mode: викликається CLI orchestration через `import + run(ctx)`.
13
+ * JS-concerns → policy → mdc-refs (через runStandardRule). `lint()` lint-поверхня
14
+ * (licensee перевірка ліцензій npm-залежностей, лише у `--full`).
9
15
  * @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
10
16
  * @returns {Promise<number>} 0 — OK, 1 — порушення
11
17
  */
@@ -13,6 +19,50 @@ export function run(ctx) {
13
19
  return runStandardRule(import.meta.dirname, ctx)
14
20
  }
15
21
 
22
+ /**
23
+ * Перевірка ліцензій npm-залежностей через `licensee`. Opt-in: пропускається якщо
24
+ * `.licensee.json` відсутній у cwd (проєкт не налаштував allowlist). `bun x licensee`
25
+ * не потребує локальної установки — bunx завантажує пакет ad-hoc.
26
+ * @param {string} [cwd] корінь проєкту
27
+ * @returns {number} 0 — OK, 1 — порушення
28
+ */
29
+ function runLicenseeSteps(cwd = process.cwd()) {
30
+ const reporter = createCheckReporter()
31
+ const { pass, fail } = reporter
32
+
33
+ if (!existsSync(join(cwd, '.licensee.json'))) {
34
+ pass('lint-bun: licensee — немає .licensee.json, перевірку ліцензій пропущено')
35
+ return reporter.getExitCode()
36
+ }
37
+
38
+ const bun = resolveCmd('bun')
39
+ if (!bun) {
40
+ fail('lint-bun: `bun` не знайдено в PATH (bun.mdc)')
41
+ return reporter.getExitCode()
42
+ }
43
+
44
+ const r = spawnSync(bun, ['x', 'licensee', '--production', '--quiet'], { cwd, stdio: 'inherit', shell: false })
45
+ if (r.status === 0) {
46
+ pass('lint-bun: licensee — ліцензії OK')
47
+ } else {
48
+ const code = typeof r.status === 'number' ? r.status : 1
49
+ fail(`lint-bun: licensee — порушення ліцензій (код ${code}, bun.mdc)`)
50
+ }
51
+ return reporter.getExitCode()
52
+ }
53
+
54
+ /**
55
+ * Оркестраторний адаптер `n-cursor lint bun`: licensee-перевірка ліцензій npm-залежностей.
56
+ * Whole-repo (ігнорує `_files`). Opt-in через `.licensee.json` у cwd.
57
+ * @param {string[] | undefined} _files ігнорується
58
+ * @param {string} [cwd] корінь
59
+ * @param {{ readOnly?: boolean }} [_opts] не використовується (licensee завжди read-only)
60
+ * @returns {Promise<number>} exit code
61
+ */
62
+ export function lint(_files, cwd = process.cwd(), _opts = {}) {
63
+ return runStandardLint(import.meta.dirname, () => runLicenseeSteps(cwd))
64
+ }
65
+
16
66
  if (isRunAsCli(import.meta.url)) {
17
67
  // Standalone: bun rules/<id>/main.mjs — повний еквівалент `npx @nitra/cursor check <id>`
18
68
  // (config-loading + whitelist + summary): library-роль (run) + standalone-роль (CLI-блок).
@@ -0,0 +1,27 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-consistency.mjs
4
+ resource: npm/rules/changelog/js/fix-consistency.mjs
5
+ docgen:
6
+ crc: f8727498
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
9
+ ---
10
+
11
+ ## Огляд
12
+
13
+ Створює change-файл для воркспейсів у `changelog/js/consistency.mjs`, коли відсутній відповідний файл. Опис change-файлу береться з суб'єкта останнього git-коміту, а рівень зміни (`bump`) завжди встановлюється як `patch`.
14
+
15
+ ## Поведінка
16
+
17
+ 1. Визначає шаблони для автоматичного виправлення.
18
+ 2. `patterns` містить один шаблон, який перевіряє наявність повідомлення про відсутність change-файлу.
19
+ 3. Якщо шаблон спрацьовує, він виявляє всі воркспейси, які потребують створення change-файлу.
20
+ 4. Визначає опис для change-файлу на основі суб'єкта останнього git-коміту в корені репозиторію. Якщо суб'єкт відсутній, використовується зарезервоване повідомлення.
21
+ 5. Для кожного виявленого воркспейсу створюється change-файл з рівнем `patch` та розділом `Changed`, використовуючи визначений опис.
22
+ 6. Повертає результат, що вказує на успішне створення change-файлів для відповідних воркспейсів.
23
+
24
+ ## Гарантії поведінки
25
+
26
+ - Read-only: не виконує операцій запису (ФС/БД).
27
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
@@ -9,3 +9,4 @@ resource: npm/rules/changelog/js/
9
9
  | Файл | Тип |
10
10
  |---|---|
11
11
  | [consistency.mjs](consistency.md) | JS Module |
12
+ | [fix-consistency.mjs](fix-consistency.md) | JS Module |
@@ -0,0 +1,50 @@
1
+ /**
2
+ * T0-autofix для `changelog/js/consistency.mjs` — детерміноване створення
3
+ * change-файлу для воркспейсів з релевантними змінами без change-файлу.
4
+ * Subject останнього git-коміту стає описом; bump завжди `patch`.
5
+ */
6
+ import { spawnSync } from 'node:child_process'
7
+ import { join } from 'node:path'
8
+
9
+ import { writeChange } from '../../release/change.mjs'
10
+
11
+ const MISSING_CHANGE_RE = /є релевантні зміни, але немає change-файлу/
12
+ const MISSING_CHANGE_MATCH_ALL_RE = /(?:^|\s)([\w./@-]+): є релевантні зміни, але немає change-файлу/gm
13
+
14
+ const CHANGE_BUMP = 'patch'
15
+ const CHANGE_SECTION = 'Changed'
16
+ const CHANGE_FALLBACK_MESSAGE = 'оновлення'
17
+
18
+ /**
19
+ * @param {string} cwd корінь репозиторію
20
+ * @returns {string} непорожній опис
21
+ */
22
+ function autoChangeMessage(cwd) {
23
+ const r = spawnSync('git', ['log', '-1', '--format=%s'], { cwd, encoding: 'utf8' })
24
+ const subject = r.status === 0 ? (r.stdout ?? '').trim() : ''
25
+ return subject || CHANGE_FALLBACK_MESSAGE
26
+ }
27
+
28
+ /** @type {import('../../../scripts/lib/fix/discover-t0-patterns.mjs').T0Pattern[]} */
29
+ export const patterns = [
30
+ {
31
+ id: 'changelog-create-change-file',
32
+ test: out => MISSING_CHANGE_RE.test(out),
33
+ apply: async (out, cwd) => {
34
+ const workspaces = Array.from(out.matchAll(MISSING_CHANGE_MATCH_ALL_RE), m => m[1])
35
+ if (workspaces.length === 0) return { ok: false, action: 'no match' }
36
+
37
+ const message = autoChangeMessage(cwd)
38
+ const created = []
39
+ for (const ws of workspaces) {
40
+ try {
41
+ const rel = await writeChange({ bump: CHANGE_BUMP, section: CHANGE_SECTION, message, ws, cwd })
42
+ created.push(ws === '.' ? rel : join(ws, rel))
43
+ } catch (error) {
44
+ return { ok: false, action: `writeChange ${ws}: ${error.message}` }
45
+ }
46
+ }
47
+ return { ok: true, action: `створено change-файл (${CHANGE_BUMP}/${CHANGE_SECTION}): ${created.join(', ')}` }
48
+ }
49
+ }
50
+ ]
@@ -0,0 +1,21 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-vscode_extensions.mjs
4
+ resource: npm/rules/ci4/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 з іншого скрипта.
18
+
19
+ ## Гарантії поведінки
20
+
21
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/rules/ci4/policy/vscode_extensions
4
+ resource: npm/rules/ci4/policy/vscode_extensions/
5
+ ---
6
+
7
+ # npm/rules/ci4/policy/vscode_extensions
8
+
9
+ | Файл | Тип |
10
+ | ----------------------------------------------------- | --------- |
11
+ | [fix-vscode_extensions.mjs](fix-vscode_extensions.md) | JS Module |
@@ -0,0 +1 @@
1
+ export { patterns } from '../../../../scripts/lib/fix/vscode-ext-add.mjs'
@@ -0,0 +1,22 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-vscode_extensions.mjs
4
+ resource: npm/rules/ga/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.
18
+ 2. Використовує імпортовані шаблони для виконання логіки виправлення розширень VS Code.
19
+
20
+ ## Гарантії поведінки
21
+
22
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/rules/ga/policy/vscode_extensions
4
+ resource: npm/rules/ga/policy/vscode_extensions/
5
+ ---
6
+
7
+ # npm/rules/ga/policy/vscode_extensions
8
+
9
+ | Файл | Тип |
10
+ | ----------------------------------------------------- | --------- |
11
+ | [fix-vscode_extensions.mjs](fix-vscode_extensions.md) | JS Module |
@@ -0,0 +1 @@
1
+ export { patterns } from '../../../../scripts/lib/fix/vscode-ext-add.mjs'
@@ -0,0 +1,21 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-vscode_extensions.mjs
4
+ resource: npm/rules/graphql/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 з іншого скрипта.
18
+
19
+ ## Гарантії поведінки
20
+
21
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/rules/graphql/policy/vscode_extensions
4
+ resource: npm/rules/graphql/policy/vscode_extensions/
5
+ ---
6
+
7
+ # npm/rules/graphql/policy/vscode_extensions
8
+
9
+ | Файл | Тип |
10
+ | ----------------------------------------------------- | --------- |
11
+ | [fix-vscode_extensions.mjs](fix-vscode_extensions.md) | JS Module |
@@ -0,0 +1 @@
1
+ export { patterns } from '../../../../scripts/lib/fix/vscode-ext-add.mjs'
@@ -2,6 +2,25 @@
2
2
 
3
3
  `@e18e/eslint-plugin` окремо не додавай — він уже в залежностях `@nitra/eslint-config` (з **3.8.0**), oxlint підвантажує його з `node_modules`. Пакети `oxlint`/`eslint`/`jscpd`/`knip` теж не додавай у `devDependencies` без потреби монорепо — `bunx` тягне їх ad-hoc.
4
4
 
5
+ ### Заборона `ua-parser-js`
6
+
7
+ Пакет **`ua-parser-js`** заборонений починаючи з версії **2.x**, де ліцензія змінилась з MIT на **AGPL-3.0** — несумісну з комерційним використанням у закритому SaaS. Замінити на **`bowser`** (MIT, ~6 KB gzip):
8
+
9
+ ```javascript title="❌ до"
10
+ import { UAParser } from 'ua-parser-js'
11
+ const parser = new UAParser(userAgent)
12
+ const result = parser.getResult()
13
+ const browserName = result.browser.name
14
+ ```
15
+
16
+ ```javascript title="✅ після"
17
+ import Bowser from 'bowser'
18
+ const browser = Bowser.getParser(userAgent)
19
+ const browserName = browser.getBrowserName()
20
+ ```
21
+
22
+ Bowser надає ті самі поля: `getBrowserName()`, `getOSName()`, `getPlatform().vendor`. Міграція займає кілька рядків; логіка не змінюється.
23
+
5
24
  ### Заборона `@nitra/as-integrations-fastify`
6
25
 
7
26
  Пакет **`@nitra/as-integrations-fastify`** заборонений у **`dependencies`**, **`peerDependencies`** та в import-specifier-ах. Це чистий републіш upstream, застряглий на peer `@apollo/server: "^4.0.0"`, тож на Apollo 5 `bun install` дає `warn: incorrect peer dependency`. Заміна — upstream **`@as-integrations/fastify`** (**`^3.1.0`**): peer `@apollo/server: "^4.0.0 || ^5.0.0"` + `fastify: "^5.3.0"`.
@@ -16,8 +16,17 @@ import {
16
16
 
17
17
  const JS_SOURCE_RE = /\.(?:[cm]?[jt]sx?)$/u
18
18
 
19
- /** Пакети, заборонені як import-specifier у будь-якому JS/TS-файлі. */
20
- const BANNED_SPECIFIERS = new Set(['@nitra/as-integrations-fastify'])
19
+ /**
20
+ * Пакети, заборонені як import-specifier у будь-якому JS/TS-файлі.
21
+ * Ключ — specifier, значення — підказка про заміну.
22
+ */
23
+ const BANNED_SPECIFIERS = new Map([
24
+ ['@nitra/as-integrations-fastify', 'використовуй @as-integrations/fastify'],
25
+ [
26
+ 'ua-parser-js',
27
+ 'замінити на bowser (MIT, ~6 KB) — npm i bowser. ua-parser-js v2 змінив ліцензію на AGPL-3.0, несумісну з комерційним використанням'
28
+ ]
29
+ ])
21
30
 
22
31
  /**
23
32
  * Витягає з джерела всі import-specifier'и (static + dynamic + require).
@@ -73,11 +82,10 @@ export async function check(cwdParam = process.cwd()) {
73
82
  const source = await readFile(absPath, 'utf8')
74
83
  const specifiers = extractImportSpecifiers(source, absPath)
75
84
  for (const spec of specifiers) {
76
- if (BANNED_SPECIFIERS.has(spec)) {
85
+ const hint = BANNED_SPECIFIERS.get(spec)
86
+ if (hint !== undefined) {
77
87
  const rel = relative(cwd, absPath)
78
- reporter.fail(
79
- `${rel}: заборонений import '${spec}' — використовуй @as-integrations/fastify (js.mdc dep-policy)`
80
- )
88
+ reporter.fail(`${rel}: заборонений import '${spec}' — ${hint} (js.mdc dep-policy)`)
81
89
  violations += 1
82
90
  }
83
91
  }
@@ -3,26 +3,28 @@ type: JS Module
3
3
  title: dep-policy.mjs
4
4
  resource: npm/rules/js/js/dep-policy.mjs
5
5
  docgen:
6
- crc: 020620cb
6
+ crc: a2417b44
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Модуль сканує файли з розширеннями JS/TS у проєкті. Він перевіряє, чи не містять ці файли імпортів, заборонених відповідно до політики (dep-policy.mdc). Модуль виконує перевірку у режимі лише для читання. У разі виявлення порушень, він реєструє їх у звіті. Модуль перехоплює всі можливі помилки (fail-safe) і не генерує винятків назовні. Результат роботи відображається через код виходу, що інформує про статус перевірки (js.mdc).
11
+ ## Огляд
12
+
13
+ Модуль аналізує вміст файлів з розширеннями JS/TS у проєкті. Він перевіряє, чи містять ці файли імпорти, які заборонені відповідно до політики, визначеної в (dep-policy.mdc). При виявленні заборонених специфікаторів, модуль реєструє помилку у звіті та надає рекомендацію щодо заміни, згідно з (js.mdc). Модуль перехоплює всі внутрішні помилки під час сканування, забезпечуючи безпечну роботу.
12
14
 
13
15
  ## Поведінка
14
16
 
15
17
  1. Ініціалізує звітність.
16
18
  2. Визначає кореневу директорію проєкту.
17
- 3. Завантажує списки шляхів, які слід ігнорувати.
18
- 4. Збирає список усіх файлів з розширеннями JS/TS у кореневій директорії, ігноруючи визначені шляхи.
19
- 5. Для кожного зібраного файлу:
19
+ 3. Зчитує списки шляхів, які слід ігнорувати.
20
+ 4. Знаходить усі файли з розширеннями JS/TS у кореневій директорії, дотримуючись списку ігнорування.
21
+ 5. Для кожного знайденого файлу:
20
22
  а. Зчитує вміст файлу.
21
- б. Витягує з вмісту всі імпортовані специфікатори (статичні, динамічні та через `require`).
22
- в. Для кожного витягнутого специфікатора перевіряє, чи він є забороненим відповідно до політики (dep-policy.mdc).
23
- г. Якщо специфікатор заборонений, реєструє помилку у звіті, вказуючи шлях до файлу та заборонений імпорт. Збільшує лічильник порушень.
24
- 6. Якщо порушень не знайдено, реєструє повідомлення про успішну перевірку (js.mdc).
25
- 7. Повертає код виходу звіту.
23
+ б. Витягує всі імпортовані специфікатори з файлу.
24
+ в. Перевіряє кожен витягнутий специфікатор на наявність у списку заборонених специфікаторів (dep-policy.mdc).
25
+ г. Якщо специфікатор заборонений, реєструє помилку у звіті, вказуючи відносний шлях до файлу та підказку про заміну (js.mdc).
26
+ 6. Якщо жодних порушень не знайдено, реєструє успішне повідомлення про перевірку.
27
+ 7. Повертає код виходу з репортера.
26
28
 
27
29
  ## Публічний API
28
30
 
@@ -6,10 +6,10 @@ resource: npm/rules/js/js/
6
6
 
7
7
  # npm/rules/js/js
8
8
 
9
- | Файл | Тип |
10
- | ------------------------------------- | --------- |
11
- | [check.mjs](check.md) | JS Module |
12
- | [dep-policy.mjs](dep-policy.md) | JS Module |
9
+ | Файл | Тип |
10
+ |---|---|
11
+ | [check.mjs](check.md) | JS Module |
12
+ | [dep-policy.mjs](dep-policy.md) | JS Module |
13
13
  | [lint-findings.mjs](lint-findings.md) | JS Module |
14
- | [tooling.mjs](tooling.md) | JS Module |
14
+ | [tooling.mjs](tooling.md) | JS Module |
15
15
  | [utils_imports.mjs](utils_imports.md) | JS Module |
@@ -0,0 +1,22 @@
1
+ ---
2
+ type: JS Module
3
+ title: fix-vscode_extensions.mjs
4
+ resource: npm/rules/js/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.
18
+ 2. Використовує імпортовані шаблони для виконання логіки виправлення розширень VS Code.
19
+
20
+ ## Гарантії поведінки
21
+
22
+ - Read-only: не виконує операцій запису (ФС/БД).