@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.
- package/CHANGELOG.md +12 -0
- package/bin/n-cursor.js +0 -15
- package/package.json +1 -1
- package/rules/adr/js/docs/hooks.md +0 -2
- package/rules/bun/docs/index.md +2 -2
- package/rules/bun/docs/main.md +9 -9
- package/rules/bun/js/docs/fix-layout.md +25 -0
- package/rules/bun/js/docs/index.md +3 -2
- package/rules/bun/js/fix-layout.mjs +55 -0
- package/rules/bun/main.json +1 -1
- package/rules/bun/main.mjs +53 -3
- package/rules/changelog/js/docs/fix-consistency.md +27 -0
- package/rules/changelog/js/docs/index.md +1 -0
- package/rules/changelog/js/fix-consistency.mjs +50 -0
- package/rules/ci4/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/ci4/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/ci4/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/ga/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
- package/rules/ga/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/ga/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/graphql/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/graphql/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/graphql/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/js/js/dep-policy.mdc +19 -0
- package/rules/js/js/dep-policy.mjs +14 -6
- package/rules/js/js/docs/dep-policy.md +12 -10
- package/rules/js/js/docs/index.md +5 -5
- package/rules/js/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
- package/rules/js/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/js/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/js-run/js/docs/fix-runtime.md +25 -0
- package/rules/js-run/js/docs/index.md +3 -2
- package/rules/js-run/js/fix-runtime.mjs +41 -0
- package/rules/nginx-default-tpl/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/nginx-default-tpl/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/nginx-default-tpl/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/python/docs/index.md +2 -2
- package/rules/python/docs/main.md +12 -10
- package/rules/python/main.mjs +1 -0
- package/rules/rego/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
- package/rules/rego/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/rego/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/rust/docs/index.md +2 -2
- package/rules/rust/docs/main.md +8 -6
- package/rules/rust/main.mjs +11 -0
- package/rules/rust/policy/vscode_extensions/docs/fix-vscode_extensions.md +22 -0
- package/rules/rust/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/rust/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/style/js/docs/fix-tooling.md +29 -0
- package/rules/style/js/docs/index.md +3 -2
- package/rules/style/js/fix-tooling.mjs +46 -0
- package/rules/style/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/style/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/style/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/tauri/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/tauri/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/tauri/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/text/policy/vscode_extensions/docs/fix-vscode_extensions.md +21 -0
- package/rules/text/policy/vscode_extensions/docs/index.md +11 -0
- package/rules/text/policy/vscode_extensions/fix-vscode_extensions.mjs +1 -0
- package/rules/vue/js/docs/packages.md +0 -2
- package/scripts/docs/index.md +0 -2
- package/scripts/lib/discover-checkable-rules.mjs +1 -0
- package/scripts/lib/docs/discover-checkable-rules.md +13 -155
- package/scripts/lib/docs/index.md +35 -35
- package/scripts/lib/fix/discover-t0-patterns.mjs +83 -0
- package/scripts/lib/fix/docs/discover-t0-patterns.md +37 -0
- package/scripts/lib/fix/docs/index.md +12 -10
- package/scripts/lib/fix/docs/llm-fix-apply.md +12 -10
- package/scripts/lib/fix/docs/llm-worker.md +6 -14
- package/scripts/lib/fix/docs/orchestrator.md +0 -2
- package/scripts/lib/fix/docs/t0.md +11 -10
- package/scripts/lib/fix/docs/vscode-ext-add.md +29 -0
- package/scripts/lib/fix/t0.mjs +8 -234
- package/scripts/lib/fix/vscode-ext-add.mjs +45 -0
- package/skills/doc-aggregate/SKILL.md +8 -18
- package/skills/doc-aggregate/js/docs/index.md +0 -1
- package/rules/test/coverage/coverage.mjs +0 -317
- package/scripts/coverage-classify/apply.mjs +0 -67
- package/scripts/coverage-classify/cache.mjs +0 -77
- package/scripts/coverage-classify/docs/apply.md +0 -206
- package/scripts/coverage-classify/docs/cache.md +0 -207
- package/scripts/coverage-classify/docs/index.md +0 -14
- package/scripts/coverage-classify/docs/prompt.md +0 -136
- package/scripts/coverage-classify/docs/verdict-schema.md +0 -28
- package/scripts/coverage-classify/index.mjs +0 -114
- package/scripts/coverage-classify/prompt.mjs +0 -126
- package/scripts/coverage-classify/verdict-schema.mjs +0 -35
- package/scripts/coverage-fix-extract.mjs +0 -122
- package/scripts/coverage-fix.mjs +0 -119
- package/scripts/docs/coverage-fix-extract.md +0 -36
- package/scripts/docs/coverage-fix.md +0 -181
- package/skills/coverage-fix/SKILL.md +0 -131
- package/skills/coverage-fix/main.json +0 -1
- package/skills/doc-aggregate/js/docgen-scan.mjs +0 -195
- 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
|
@@ -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
|
## Поведінка
|
package/rules/bun/docs/index.md
CHANGED
package/rules/bun/docs/main.md
CHANGED
|
@@ -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:
|
|
6
|
+
crc: a2cfc572
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
score:
|
|
8
|
+
score: 90
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Модуль виконує перевірку відповідності коду встановленим політикам, використовуючи маркер повідомлень (bun.mdc). Він також аналізує ліцензії залежностей, спираючись на конфігурацію .licensee.json. Модуль надає функції для запуску перевірок (run) та лінтингу (lint).
|
|
12
14
|
|
|
13
15
|
## Поведінка
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
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
|
+
- (специфічних машинно-виведених гарантій немає)
|
|
@@ -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
|
+
]
|
package/rules/bun/main.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "auto": { "glob": "package.json" } }
|
|
1
|
+
{ "auto": { "glob": "package.json" }, "lint": "full" }
|
package/rules/bun/main.mjs
CHANGED
|
@@ -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).
|
|
7
|
-
* (
|
|
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).
|
|
@@ -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
|
-
/**
|
|
20
|
-
|
|
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
|
-
|
|
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:
|
|
6
|
+
crc: a2417b44
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
|
|
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.
|
|
19
|
-
5. Для кожного
|
|
19
|
+
3. Зчитує списки шляхів, які слід ігнорувати.
|
|
20
|
+
4. Знаходить усі файли з розширеннями JS/TS у кореневій директорії, дотримуючись списку ігнорування.
|
|
21
|
+
5. Для кожного знайденого файлу:
|
|
20
22
|
а. Зчитує вміст файлу.
|
|
21
|
-
б. Витягує
|
|
22
|
-
в.
|
|
23
|
-
г. Якщо специфікатор заборонений, реєструє помилку у звіті, вказуючи шлях до файлу та
|
|
24
|
-
6. Якщо порушень не знайдено, реєструє повідомлення про
|
|
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)
|
|
12
|
-
| [dep-policy.mjs](dep-policy.md)
|
|
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)
|
|
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: не виконує операцій запису (ФС/БД).
|