@nitra/cursor 12.9.0 → 12.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-template/settings.template.json +1 -23
- package/CHANGELOG.md +12 -0
- package/bin/n-cursor.js +8 -43
- package/docs/stryker.config.md +0 -2
- package/lib/docs/llm.md +16 -21
- package/lib/docs/omlx.md +20 -25
- package/lib/llm.mjs +25 -7
- package/lib/omlx.mjs +10 -3
- package/package.json +1 -1
- package/rules/abie/docs/main.md +0 -2
- package/rules/abie/lib/docs/http-route.md +0 -2
- package/rules/abie/main.mdc +0 -22
- package/rules/adr/docs/main.md +0 -2
- package/rules/adr/js/docs/hooks.md +16 -26
- package/rules/adr/js/hooks.mjs +59 -0
- package/rules/adr/main.mdc +0 -9
- package/rules/bun/docs/main.md +0 -2
- package/rules/bun/main.mdc +1 -15
- package/rules/capacitor/docs/main.md +0 -2
- package/rules/capacitor/main.mdc +0 -6
- package/rules/changelog/docs/main.md +0 -2
- package/rules/changelog/js/agent-workflow.mdc +1 -1
- package/rules/changelog/js/consistency.mjs +57 -3
- package/rules/changelog/js/docs/consistency.md +26 -24
- package/rules/changelog/js/docs/index.md +2 -2
- package/rules/changelog/main.mdc +0 -5
- package/rules/ci4/docs/main.md +0 -2
- package/rules/ci4/main.mdc +0 -5
- package/rules/doc-files/docs/main.md +0 -2
- package/rules/doc-files/js/docs/docgen-crc.md +0 -2
- package/rules/doc-files/js/docs/docgen-extract.md +0 -2
- package/rules/doc-files/js/docs/docgen-files-batch.md +0 -2
- package/rules/doc-files/js/docs/docgen-gen.md +0 -2
- package/rules/doc-files/js/docs/docgen-judge-measure.md +0 -2
- package/rules/doc-files/js/docs/docgen-judge.md +0 -2
- package/rules/doc-files/js/docs/docgen-scan.md +0 -2
- package/rules/doc-files/js/docs/run-lint.md +0 -2
- package/rules/docker/docs/main.md +0 -2
- package/rules/docker/js/docs/lint.md +0 -2
- package/rules/docker/lib/docs/docker-hadolint.md +0 -2
- package/rules/docker/main.mdc +1 -21
- package/rules/efes/docs/main.md +0 -2
- package/rules/efes/main.mdc +0 -1
- package/rules/feedback/docs/main.md +0 -2
- package/rules/ga/docs/main.md +0 -2
- package/rules/ga/js/docs/index.md +0 -1
- package/rules/ga/main.mdc +1 -31
- package/rules/graphql/docs/main.md +0 -2
- package/rules/graphql/main.mdc +0 -5
- package/rules/hasura/docs/main.md +0 -2
- package/rules/hasura/js/docs/index.md +3 -3
- package/rules/hasura/js/docs/migrations.md +0 -2
- package/rules/hasura/main.mdc +1 -11
- package/rules/image-avif/docs/main.md +0 -2
- package/rules/image-avif/main.mdc +1 -9
- package/rules/image-compress/docs/main.md +0 -2
- package/rules/image-compress/js/docs/index.md +0 -1
- package/rules/image-compress/main.mdc +1 -9
- package/rules/js/docs/main.md +0 -2
- package/rules/js/js/dep-policy.mjs +8 -4
- package/rules/js/js/docs/check.md +0 -2
- package/rules/js/js/docs/dep-policy.md +10 -12
- package/rules/js/js/docs/index.md +5 -5
- package/rules/js/js/docs/tooling.md +0 -2
- package/rules/js/js/docs/utils_imports.md +0 -2
- package/rules/js/main.mdc +0 -31
- package/rules/js-bun-db/docs/main.md +0 -2
- package/rules/js-bun-db/js/docs/safety.md +18 -23
- package/rules/js-bun-db/js/safety.mjs +31 -3
- package/rules/js-bun-db/lib/bun-sql-scan.mjs +123 -0
- package/rules/js-bun-db/lib/docs/bun-sql-scan.md +37 -331
- package/rules/js-bun-db/main.mdc +1 -23
- package/rules/js-bun-redis/docs/main.md +0 -2
- package/rules/js-bun-redis/main.mdc +0 -5
- package/rules/js-mssql/docs/main.md +0 -2
- package/rules/js-mssql/main.mdc +0 -12
- package/rules/js-run/docs/main.md +0 -2
- package/rules/js-run/js/docs/runtime.md +15 -13
- package/rules/js-run/js/runtime.mjs +48 -4
- package/rules/js-run/main.mdc +0 -25
- package/rules/k8s/docs/main.md +0 -2
- package/rules/k8s/main.mdc +0 -45
- package/rules/nginx-default-tpl/docs/main.md +0 -2
- package/rules/nginx-default-tpl/main.mdc +0 -13
- package/rules/npm-module/docs/main.md +0 -2
- package/rules/npm-module/js/docs/header_doc_pointer.md +0 -2
- package/rules/npm-module/js/docs/rule_meta.md +0 -2
- package/rules/npm-module/js/docs/skill_meta.md +0 -2
- package/rules/npm-module/main.mdc +1 -15
- package/rules/php/docs/main.md +0 -2
- package/rules/php/js/docs/index.md +0 -1
- package/rules/php/main.mdc +1 -9
- package/rules/python/docs/main.md +0 -2
- package/rules/python/js/docs/index.md +0 -1
- package/rules/python/main.mdc +1 -13
- package/rules/python/policy/lint_python_yml/lint_python_yml.rego +9 -0
- package/rules/python/policy/pyproject_toml/pyproject_toml.rego +15 -1
- package/rules/rego/docs/main.md +0 -2
- package/rules/rego/js/docs/index.md +2 -2
- package/rules/rego/js/docs/tooling.md +0 -2
- package/rules/rego/js/tooling.mdc +14 -0
- package/rules/rego/main.mdc +0 -9
- package/rules/rego/policy/package_json/package_json.mdc +12 -0
- package/rules/release/docs/main.md +0 -2
- package/rules/release/main.mdc +2 -2
- package/rules/rust/docs/main.md +0 -2
- package/rules/rust/js/docs/index.md +0 -1
- package/rules/rust/main.mdc +1 -11
- package/rules/rust/policy/package_json/package_json.mdc +12 -0
- package/rules/security/docs/main.md +0 -2
- package/rules/security/js/docs/index.md +0 -1
- package/rules/security/main.mdc +0 -13
- package/rules/style/docs/main.md +0 -2
- package/rules/style/js/docs/index.md +2 -2
- package/rules/style/js/docs/tooling.md +0 -2
- package/rules/style/main.mdc +1 -23
- package/rules/tauri/docs/main.md +0 -2
- package/rules/tauri/main.mdc +1 -11
- package/rules/test/docs/main.md +0 -2
- package/rules/test/js/docs/no-console-store-restore.md +0 -2
- package/rules/test/js/docs/sandbox-aware-test.md +0 -2
- package/rules/test/js/docs/stryker_config.md +0 -2
- package/rules/test/js/docs/vitest-config-pool-forks.md +0 -2
- package/rules/test/main.mdc +1 -21
- package/rules/text/docs/main.md +0 -2
- package/rules/text/js/docs/cspell-fix.md +0 -2
- package/rules/text/js/docs/run-dotenv-linter.md +0 -2
- package/rules/text/js/docs/run-shellcheck.md +0 -2
- package/rules/text/js/docs/run-v8r.md +0 -2
- package/rules/text/main.mdc +0 -33
- package/rules/tool-surface/docs/main.md +0 -2
- package/rules/vue/docs/main.md +0 -2
- package/rules/vue/js/docs/packages.md +12 -17
- package/rules/vue/js/packages.mjs +41 -1
- package/rules/vue/main.mdc +0 -22
- package/rules/worktree/docs/main.md +0 -2
- package/scripts/docs/auto-rules.md +0 -2
- package/scripts/docs/auto-skills.md +0 -2
- package/scripts/docs/hook.md +13 -12
- package/scripts/docs/post-tool-use-check.md +0 -2
- package/scripts/docs/sync-claude-config.md +1 -3
- package/scripts/docs/sync-setup-bun-deps-action.md +0 -2
- package/scripts/hook.mjs +3 -4
- package/scripts/lib/docs/check-mdc-template-refs.md +0 -2
- package/scripts/lib/docs/index.md +35 -35
- package/scripts/lib/docs/inline-template-links.md +6 -8
- package/scripts/lib/docs/list-project-rules-mdc.md +0 -2
- package/scripts/lib/docs/list-rule-ids.md +0 -2
- package/scripts/lib/docs/mirror-parity.md +8 -10
- package/scripts/lib/docs/read-n-cursor-config-lite.md +0 -2
- package/scripts/lib/docs/rule-meta.md +0 -2
- package/scripts/lib/docs/run-lint.md +0 -2
- package/scripts/lib/docs/run-rule-cli.md +0 -2
- package/scripts/lib/docs/run-rule.md +0 -2
- package/scripts/lib/docs/run-standard-lint.md +0 -2
- package/scripts/lib/docs/run-standard-rule.md +0 -2
- package/scripts/lib/docs/skill-meta.md +0 -2
- package/scripts/lib/docs/timing-summary.md +0 -2
- package/scripts/lib/docs/worktree-notice.md +0 -2
- package/scripts/lib/fix/docs/analyze-escalation.md +0 -2
- package/scripts/lib/fix/docs/index.md +1 -0
- package/scripts/lib/fix/docs/llm-worker.md +18 -8
- package/scripts/lib/fix/docs/orchestrator.md +10 -16
- package/scripts/lib/fix/docs/run-conformance-check.md +0 -2
- package/scripts/lib/fix/docs/t0.md +0 -2
- package/scripts/lib/fix/docs/verbose-block.md +27 -0
- package/scripts/lib/fix/llm-worker.mjs +75 -22
- package/scripts/lib/fix/orchestrator.mjs +9 -3
- package/scripts/lib/fix/verbose-block.mjs +82 -0
- package/scripts/lib/inline-template-links.mjs +32 -22
- package/scripts/lib/mirror-parity.mjs +2 -2
- package/scripts/sync-claude-config.mjs +7 -4
- package/scripts/utils/docs/resolve-js-root.md +0 -2
- package/skills/doc-files/SKILL.md +9 -24
- package/skills/llm-patch/SKILL.md +4 -4
package/rules/adr/js/hooks.mjs
CHANGED
|
@@ -55,6 +55,9 @@ function gitignoreLineCoversHookLog(line, logPath) {
|
|
|
55
55
|
if (line === '.claude/hooks/*.log' || line === '.claude/hooks/**/*.log') {
|
|
56
56
|
return true
|
|
57
57
|
}
|
|
58
|
+
if (line === '.claude/hooks/*' || line === '.claude/hooks/**') {
|
|
59
|
+
return true
|
|
60
|
+
}
|
|
58
61
|
if (line === '*.log' || line === '**/*.log') {
|
|
59
62
|
return true
|
|
60
63
|
}
|
|
@@ -264,6 +267,60 @@ function checkLlmCliAvailable(reporter) {
|
|
|
264
267
|
* @param {string} [cwd] корінь репозиторію
|
|
265
268
|
* @returns {Promise<number>} 0 — все OK, 1 — є проблеми
|
|
266
269
|
*/
|
|
270
|
+
/** Файли стану/блокування normalize-хука, які не мають потрапляти в git. */
|
|
271
|
+
const NORMALIZE_STATE_FILES = ['.normalize-state', '.normalize.lock']
|
|
272
|
+
const CLAUDE_HOOKS_REL = '.claude/hooks'
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Перевіряє рядок `.gitignore` на покриття конкретного state/lock файлу.
|
|
276
|
+
* @param {string} line нормалізований (trim) рядок
|
|
277
|
+
* @param {string} statePath відносний шлях файлу (наприклад `.claude/hooks/.normalize-state`)
|
|
278
|
+
* @returns {boolean} true — рядок покриває файл
|
|
279
|
+
*/
|
|
280
|
+
function gitignoreLineCoversStatePath(line, statePath) {
|
|
281
|
+
if (line === statePath) return true
|
|
282
|
+
// .claude/hooks/* або .claude/hooks/**
|
|
283
|
+
if (line === `${CLAUDE_HOOKS_REL}/*` || line === `${CLAUDE_HOOKS_REL}/**`) return true
|
|
284
|
+
return false
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Перевіряє `.gitignore` на наявність рядків для файлів стану normalize-хука.
|
|
289
|
+
* @param {import('../../../scripts/lib/check-reporter.mjs').CheckReporter} reporter
|
|
290
|
+
* @param {string} cwd корінь репозиторію
|
|
291
|
+
* @returns {Promise<void>}
|
|
292
|
+
*/
|
|
293
|
+
async function checkGitignoreForStateFiles(reporter, cwd) {
|
|
294
|
+
const { pass, fail } = reporter
|
|
295
|
+
const gitignoreAbs = join(cwd, '.gitignore')
|
|
296
|
+
const content = existsSync(gitignoreAbs) ? await readFile(gitignoreAbs, 'utf8') : ''
|
|
297
|
+
const lines = content.split(EOL_RE).map(l => l.trim())
|
|
298
|
+
for (const file of NORMALIZE_STATE_FILES) {
|
|
299
|
+
const statePath = `${CLAUDE_HOOKS_REL}/${file}`
|
|
300
|
+
if (lines.some(l => gitignoreLineCoversStatePath(l, statePath))) {
|
|
301
|
+
pass(`.gitignore покриває ${statePath}`)
|
|
302
|
+
} else {
|
|
303
|
+
fail(`.gitignore не ігнорує \`${statePath}\` — додай рядок (adr.mdc)`)
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Перевіряє наявність каталогу `docs/adr/` — обов'язкового місця зберігання ADR-ів.
|
|
310
|
+
* @param {import('../../../scripts/lib/check-reporter.mjs').CheckReporter} reporter
|
|
311
|
+
* @param {string} cwd корінь репозиторію
|
|
312
|
+
* @returns {void}
|
|
313
|
+
*/
|
|
314
|
+
function checkDocsAdrDir(reporter, cwd) {
|
|
315
|
+
const { pass, fail } = reporter
|
|
316
|
+
const adrDir = join(cwd, 'docs', 'adr')
|
|
317
|
+
if (existsSync(adrDir)) {
|
|
318
|
+
pass('docs/adr/ існує (каталог ADR-ів)')
|
|
319
|
+
} else {
|
|
320
|
+
fail('docs/adr/ відсутній — створи каталог для ADR-ів (adr.mdc)')
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
267
324
|
export async function check(cwd = process.cwd()) {
|
|
268
325
|
const reporter = createCheckReporter()
|
|
269
326
|
for (const { scriptName } of HOOK_ARTIFACTS) {
|
|
@@ -272,6 +329,8 @@ export async function check(cwd = process.cwd()) {
|
|
|
272
329
|
checkProjectSettings(reporter, cwd)
|
|
273
330
|
await checkCursorHooks(reporter, cwd)
|
|
274
331
|
await checkGitignore(reporter, cwd)
|
|
332
|
+
await checkGitignoreForStateFiles(reporter, cwd)
|
|
333
|
+
checkDocsAdrDir(reporter, cwd)
|
|
275
334
|
checkLlmCliAvailable(reporter)
|
|
276
335
|
return reporter.getExitCode()
|
|
277
336
|
}
|
package/rules/adr/main.mdc
CHANGED
|
@@ -6,8 +6,6 @@ version: '2.2'
|
|
|
6
6
|
|
|
7
7
|
Правило `adr` автоматично фіксує архітектурні рішення (ADR) після кожної сесії через Stop-хуки і батч-нормалізує чернетки у канонічний формат MADR v4.
|
|
8
8
|
|
|
9
|
-
[adr-madr-format](./js/madr_format.mdc)
|
|
10
|
-
|
|
11
9
|
## Stop-hook у `.claude/settings.json`
|
|
12
10
|
|
|
13
11
|
Канонічний запис, який вставляє sync (поряд із PostToolUse fix-хуком — той живе в іншій події, тут не показаний):
|
|
@@ -76,10 +74,3 @@ Cursor Agent читає project-level **`.cursor/hooks.json`**. `npx @nitra/curs
|
|
|
76
74
|
| `adr.settings_json` | `.claude/settings.json` | Наявність обох Stop-хуків у `hooks.Stop[]` |
|
|
77
75
|
| `adr.settings_local_json` | `.claude/settings.local.json` | Відсутність дублів Stop-хуків у local-файлі |
|
|
78
76
|
|
|
79
|
-
[adr-settings-policy](./js/settings_policy.mdc)
|
|
80
|
-
|
|
81
|
-
[adr-settings_json-policy](./policy/settings_json/settings_json.mdc)
|
|
82
|
-
|
|
83
|
-
[adr-settings_local_json-policy](./policy/settings_local_json/settings_local_json.mdc)
|
|
84
|
-
|
|
85
|
-
[adr-hooks](./js/hooks.mdc)
|
package/rules/bun/docs/main.md
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль валідує дані, застосовуючи правила, визначені у конфігурації meta.json, та збирає посилання на MDC. При виклику публічної функції run він здійснює повний запуск правила, включаючи завантаження конфігурацій та застосування білих списків. Результат виконання повертається як код виходу процесу.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
package/rules/bun/main.mdc
CHANGED
|
@@ -5,18 +5,4 @@ alwaysApply: false
|
|
|
5
5
|
version: '2.1'
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
Проект використовує тільки Bun для керування залежностями та запуску скриптів.
|
|
9
|
-
|
|
10
|
-
[bun-layout](./js/layout.mdc)
|
|
11
|
-
|
|
12
|
-
[bun-bunfig](./js/bunfig.mdc)
|
|
13
|
-
|
|
14
|
-
[bun-package_json](./js/package_json.mdc)
|
|
15
|
-
|
|
16
|
-
[bun-lint](./js/lint.mdc)
|
|
17
|
-
|
|
18
|
-
## Швидкий gate через conftest
|
|
19
|
-
|
|
20
|
-
[bun-policy-bunfig](./policy/bunfig/bunfig.mdc)
|
|
21
|
-
|
|
22
|
-
[bun-policy-package_json](./policy/package_json/package_json.mdc)
|
|
8
|
+
Проект використовує тільки Bun для керування залежностями та запуску скриптів.
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль застосовує політику та логіку, визначену в конфігурації meta.json, для валідації. При запуску як CLI ініціюється повний запуск правила, що включає завантаження конфігурацій, застосування білих списків та підбиття підсумків. Модуль є лише для читання (не виконує записів у файлову систему чи базу даних) і використовує кешування даних у межах одного прогону.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
package/rules/capacitor/main.mdc
CHANGED
|
@@ -7,12 +7,6 @@ version: '1.1'
|
|
|
7
7
|
|
|
8
8
|
Правило перевіряє версію `@capacitor/core` у `package.json` та коректність використання CocoaPods/SPM у iOS-шарі Capacitor-проєкту.
|
|
9
9
|
|
|
10
|
-
[capacitor-version](./js/version.mdc)
|
|
11
|
-
|
|
12
|
-
[capacitor-ios-spm](./js/ios_spm.mdc)
|
|
13
|
-
|
|
14
10
|
## Швидкий gate через conftest
|
|
15
11
|
|
|
16
|
-
[capacitor-package_json](./policy/package_json/package_json.mdc)
|
|
17
|
-
|
|
18
12
|
JS-перевірка (`platforms.mjs`) — authoritative: підтримує `||`-діапазони, hyphen-range, workspace-monorepo та iOS-специфічну логіку (Podfile).
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль відповідає за виконання політики, використовуючи дані з meta.json. Він забезпечує перевірку та застосування логіки, визначеної в конфігурації. Виклик функції run ініціює процес виконання правила, включаючи кешування даних у межах одного прогону.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Якщо в цій сесії ти змінив(ла) файли в пакетному workspace** (код, rego, правила, скіли, скрипти, конфіги, тести — **не** лише `docs/` / `doc/`) — **не завершуй задачу**, поки не виконаєш **усі три** кроки нижче в **тому ж** наборі змін. Це не «опційно після синку» — це частина PR.
|
|
4
4
|
|
|
5
|
-
1. **Поклади change-файл** `<ws>/.changes/YYMMDD-HHMM.md` з frontmatter `bump:` (`major|minor|patch`) + `section:` (`Added|Changed|Fixed|Removed`) і текстом опису. Команда: `npx @
|
|
5
|
+
1. **Поклади change-файл** `<ws>/.changes/YYMMDD-HHMM.md` з frontmatter `bump:` (`major|minor|patch`) + `section:` (`Added|Changed|Fixed|Removed`) і текстом опису. Команда: `npx @7n/n ch [--bump <…>] [--section <…>] [--message "<…>"]` — автоматично знаходить зачеплені workspaces за git status і пише окремий change-файл у кожен; без `--message` генерує опис через omlx з diff.
|
|
6
6
|
2. **Ніколи** не редагуй `version` і `CHANGELOG.md` вручну — навіть для hotfix. Єдиний артефакт зміни — change-файл; `version`/CHANGELOG формує `n-cursor release` у CI на `main` (агрегує change-файли, ставить git-тег `<name>@<version>`). Будь-яка зміна `version` поза CI (drift від бази чи опублікованої) завалює `check changelog` — навіть якщо поряд є change-файл.
|
|
7
7
|
3. **`npx @nitra/cursor fix changelog`** → exit **`0`** (достатньо наявності change-файлу; `version` лишається незмінним).
|
|
8
8
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/** @see ./docs/consistency.md */
|
|
2
2
|
import { execFile } from 'node:child_process'
|
|
3
|
+
import { existsSync } from 'node:fs'
|
|
4
|
+
import { readFile } from 'node:fs/promises'
|
|
3
5
|
import { join } from 'node:path'
|
|
4
6
|
import { promisify } from 'node:util'
|
|
5
7
|
|
|
@@ -379,6 +381,46 @@ function createDefaultGetPublishedVersion() {
|
|
|
379
381
|
* @param {(msg: string) => void} pass параметр
|
|
380
382
|
* @param {(msg: string) => void} fail параметр
|
|
381
383
|
*/
|
|
384
|
+
/**
|
|
385
|
+
* Перевіряє наявність `CHANGELOG.md` у воркспейсі.
|
|
386
|
+
* @param {string} ws відносний шлях воркспейсу від кореня репо
|
|
387
|
+
* @param {string} label мітка для повідомлень
|
|
388
|
+
* @param {string} cwd корінь репозиторію
|
|
389
|
+
* @param {(msg: string) => void} pass
|
|
390
|
+
* @param {(msg: string) => void} fail
|
|
391
|
+
* @returns {boolean} true — файл існує
|
|
392
|
+
*/
|
|
393
|
+
function checkChangelogFileExists(ws, label, cwd, pass, fail) {
|
|
394
|
+
const path = join(cwd, ws, 'CHANGELOG.md')
|
|
395
|
+
if (existsSync(path)) {
|
|
396
|
+
pass(`${label}: CHANGELOG.md існує`)
|
|
397
|
+
return true
|
|
398
|
+
}
|
|
399
|
+
fail(`${label}: CHANGELOG.md відсутній — створи файл за форматом Keep a Changelog (n-changelog.mdc)`)
|
|
400
|
+
return false
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Перевіряє базовий формат `CHANGELOG.md`: наявність H1 `# Changelog`.
|
|
405
|
+
* Версійні секції `## [x.y.z]` не вимагаються для нових workspace-ів без релізів.
|
|
406
|
+
* @param {string} ws відносний шлях воркспейсу від кореня репо
|
|
407
|
+
* @param {string} label мітка для повідомлень
|
|
408
|
+
* @param {string} cwd корінь репозиторію
|
|
409
|
+
* @param {(msg: string) => void} pass
|
|
410
|
+
* @param {(msg: string) => void} fail
|
|
411
|
+
* @returns {Promise<void>}
|
|
412
|
+
*/
|
|
413
|
+
async function checkChangelogFormat(ws, label, cwd, pass, fail) {
|
|
414
|
+
const path = join(cwd, ws, 'CHANGELOG.md')
|
|
415
|
+
const content = await readFile(path, 'utf8')
|
|
416
|
+
const hasH1 = content.split('\n').some(l => l.trimEnd() === '# Changelog')
|
|
417
|
+
if (hasH1) {
|
|
418
|
+
pass(`${label}: CHANGELOG.md має рядок "# Changelog"`)
|
|
419
|
+
} else {
|
|
420
|
+
fail(`${label}: CHANGELOG.md не має рядка "# Changelog" — перший рядок має бути H1-заголовком (n-changelog.mdc)`)
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
382
424
|
function checkNpmFilesArrayContainsChangelog(manifest, pass, fail) {
|
|
383
425
|
if (manifest.kind !== 'npm' || !manifest.npmFiles) return
|
|
384
426
|
const pkgPath = manifestFilePath(manifest.ws, manifest)
|
|
@@ -406,7 +448,7 @@ function workspaceLabel(manifest) {
|
|
|
406
448
|
function missingChangeFileMessage(label, mf) {
|
|
407
449
|
return (
|
|
408
450
|
`${label}: є релевантні зміни, але немає change-файлу (version у ${mf} не чіпай вручну). ` +
|
|
409
|
-
`Поклади change-файл: npx @
|
|
451
|
+
`Поклади change-файл: npx @7n/n ch [--bump <major|minor|patch>] [--section <Added|Changed|Fixed|Removed>] [--message "<…>"]; ` +
|
|
410
452
|
`bump зробить CI на main (n-changelog.mdc)`
|
|
411
453
|
)
|
|
412
454
|
}
|
|
@@ -542,6 +584,10 @@ async function checkPublishedWorkspacePendingGitChanges(manifest, _Vcurrent, sub
|
|
|
542
584
|
async function checkPublishedWorkspace(manifest, subWorkspaces, getPublishedVersion, autofix, pass, fail, cwd) {
|
|
543
585
|
const label = workspaceLabel(manifest)
|
|
544
586
|
const mf = manifestFilePath(manifest.ws, manifest)
|
|
587
|
+
const changelogExists = checkChangelogFileExists(manifest.ws, label, cwd, pass, fail)
|
|
588
|
+
if (changelogExists) {
|
|
589
|
+
await checkChangelogFormat(manifest.ws, label, cwd, pass, fail)
|
|
590
|
+
}
|
|
545
591
|
const Vcurrent = manifest.version
|
|
546
592
|
if (!Vcurrent) {
|
|
547
593
|
fail(`${label}: у ${mf} відсутнє поле version (registry-published воркспейс)`)
|
|
@@ -574,7 +620,7 @@ async function checkPublishedWorkspace(manifest, subWorkspaces, getPublishedVers
|
|
|
574
620
|
fail(
|
|
575
621
|
`${label}: version у ${mf} (${Vcurrent}) випереджає опубліковану (${Vpublished}) — ` +
|
|
576
622
|
`ручний bump поза CI заборонено. Відкоти version і поклади change-файл ` +
|
|
577
|
-
`(npx @
|
|
623
|
+
`(npx @7n/n ch); bump зробить CI на main (n-changelog.mdc)`
|
|
578
624
|
)
|
|
579
625
|
return
|
|
580
626
|
}
|
|
@@ -613,7 +659,7 @@ async function checkLocalOnlyChangedWorkspace(comparisonRef, manifest, baseLabel
|
|
|
613
659
|
if (Vbase !== null && Vcurrent !== null && versionIsAhead(Vcurrent, Vbase)) {
|
|
614
660
|
fail(
|
|
615
661
|
`${label}: version у ${mf} змінено поза CI (${Vbase} → ${Vcurrent}) — ручний bump заборонено (на ${baseLabel} — ${Vbase}). ` +
|
|
616
|
-
`Відкоти version і поклади change-файл (npx @
|
|
662
|
+
`Відкоти version і поклади change-файл (npx @7n/n ch); bump зробить CI (n-changelog.mdc)`
|
|
617
663
|
)
|
|
618
664
|
return
|
|
619
665
|
}
|
|
@@ -635,6 +681,14 @@ async function checkLocalOnlyChangedWorkspace(comparisonRef, manifest, baseLabel
|
|
|
635
681
|
async function runLocalOnlyChecks(localOnly, subWorkspaces, autofix, pass, fail, cwd) {
|
|
636
682
|
if (localOnly.length === 0) return
|
|
637
683
|
|
|
684
|
+
for (const manifest of localOnly) {
|
|
685
|
+
const label = workspaceLabel(manifest)
|
|
686
|
+
const exists = checkChangelogFileExists(manifest.ws, label, cwd, pass, fail)
|
|
687
|
+
if (exists) {
|
|
688
|
+
await checkChangelogFormat(manifest.ws, label, cwd, pass, fail)
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
638
692
|
if (!(await isInsideGitRepo(cwd))) {
|
|
639
693
|
pass('changelog: не git-репозиторій — local-only перевірку пропущено')
|
|
640
694
|
return
|
|
@@ -3,36 +3,38 @@ type: JS Module
|
|
|
3
3
|
title: consistency.mjs
|
|
4
4
|
resource: npm/rules/changelog/js/consistency.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
7
|
-
|
|
6
|
+
crc: a9bebf31
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 95
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Модуль сканує монорепозиторій, ідентифікує проєкти та порівнює їхні версії з даними, отриманими з https://pypi.org/pypi/, для верифікації відповідності версій. Для проєктів, що не призначені для публікації, виконуються локальні перевірки на відповідність файлу `CHANGELOG.md` конфігурації, визначеній у res.json.
|
|
11
14
|
|
|
12
15
|
## Поведінка
|
|
13
16
|
|
|
14
|
-
1.
|
|
15
|
-
2.
|
|
16
|
-
3.
|
|
17
|
-
4.
|
|
18
|
-
5. Для кожного
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
7. Повертає кінцевий код виходу, що відображає результат перевірки.
|
|
17
|
+
1. `check` ініціалізує репортер для збору результатів перевірки.
|
|
18
|
+
2. `check` визначає робочий каталог та режим автоматичного виправлення на основі змінних середовища.
|
|
19
|
+
3. `check` знаходить усі кореневі каталоги проєктів у монорепозиторії.
|
|
20
|
+
4. `check` класифікує знайдені проєкти на ті, що можуть бути опубліковані в реєстрі, та ті, що є локальними.
|
|
21
|
+
5. Для кожного проєкту, що може бути опублікованим, `check` перевіряє його відповідність вимогам:
|
|
22
|
+
а. Перевіряє наявність файлу `CHANGELOG.md`.
|
|
23
|
+
б. Перевіряє базовий формат `CHANGELOG.md` на наявність заголовка `# Changelog`.
|
|
24
|
+
в. Якщо проєкт має поле `version` у маніфесті, `check` порівнює його з опублікованою версією, отриманою через мережевий запит до https://pypi.org/pypi/ або `npm view`.
|
|
25
|
+
г. Якщо версія у проєкті випереджає опубліковану, `check` повідомляє про заборонений ручний bump.
|
|
26
|
+
д. Якщо версія у проєкті відстає від опублікованої, `check` повідомляє про відставання локальної копії від реєстру.
|
|
27
|
+
е. Якщо версії збігаються, `check` перевіряє, чи є незрелі зміни у проєкті відносно базового релізу.
|
|
28
|
+
ж. Якщо проєкт має незрелі зміни, `check` перевіряє наявність change-файлу. Якщо його немає, `check` або повідомляє про необхідність створити його (якщо не в режимі autofix), або автоматично створює його та додає до індексу.
|
|
29
|
+
6. `check` виконує локальні перевірки для проєктів, які не призначені для публікації:
|
|
30
|
+
а. Для кожного локального проєкту `check` перевіряє наявність файлу `CHANGELOG.md` та його формат.
|
|
31
|
+
б. `check` визначає точку порівняння (базу) на основі поточної гілки.
|
|
32
|
+
в. `check` перевіряє, чи є релевантні зміни у проєкті відносно цієї бази.
|
|
33
|
+
г. Якщо зміни є, `check` перевіряє наявність change-файлу. Якщо його немає, `check` або повідомляє про необхідність створити його (якщо не в режимі autofix), або автоматично створює його та додає до індексу.
|
|
34
|
+
7. `check` повертає кінцевий код завершення, що відображає результати всіх перевірок.
|
|
33
35
|
|
|
34
36
|
## Гарантії поведінки
|
|
35
37
|
|
|
36
|
-
- Read-only:
|
|
38
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
37
39
|
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
38
|
-
- За
|
|
40
|
+
- За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
|
package/rules/changelog/main.mdc
CHANGED
|
@@ -6,8 +6,3 @@ alwaysApply: true
|
|
|
6
6
|
|
|
7
7
|
У кожному **пакетному** workspace (каталог із `package.json` або `pyproject.toml`) має бути власний **`CHANGELOG.md`**. Спільного на репозиторій змісту змін **не існує** — кожен пакет веде свій. Маніфест версії: **JS/Bun/npm** — `package.json` (`version`); **Python** — `pyproject.toml` (`[project].version` або `[tool.poetry].version`).
|
|
8
8
|
|
|
9
|
-
[changelog-agent-workflow](./js/agent-workflow.mdc)
|
|
10
|
-
|
|
11
|
-
[changelog-comparison-models](./js/comparison-models.mdc)
|
|
12
|
-
|
|
13
|
-
[changelog-format](./js/changelog-format.mdc)
|
package/rules/ci4/docs/main.md
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль валідує дані відповідно до правил, використовуючи конфігурацію, визначену в meta.json. Він застосовує білий список та виконує логіку перевірки. При запуску як окрема програма, він повертає код виходу, що інформує про успіх чи виявлені порушення. Модуль є Read-only, тобто не здійснює записів у файлову систему чи бази даних. Кешування даних відбувається у межах одного прогону.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
package/rules/ci4/main.mdc
CHANGED
|
@@ -372,8 +372,3 @@ Rego-перевірки, що запускаються через `conftest` у
|
|
|
372
372
|
| --------------------------- | -------------------------------------------------------------------- |
|
|
373
373
|
| `ci4.vscode_extensions` | `.vscode/extensions.json` містить `arr.marksman` у `recommendations` |
|
|
374
374
|
|
|
375
|
-
[ci4-marksman_config](./js/marksman_config.mdc)
|
|
376
|
-
|
|
377
|
-
[ci4-vscode_extensions](./js/vscode_extensions.mdc)
|
|
378
|
-
|
|
379
|
-
[ci4-vscode_extensions-policy](./policy/vscode_extensions/vscode_extensions.mdc)
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 90
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль перевіряє відповідність конфігурацій політики джерелам коду, спираючись на `meta.json`. Він також аналізує документацію на відповідність джерелам коду, виявляючи застарілі або нерелевантні описи.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль забезпечує роботу з метаданими та оцінкою якості документів. Він дозволяє парсити метадані з Markdown-файлів за допомогою `parseDocFrontmatter`, створювати та заповнювати блоки метаданих за допомогою `buildDocFrontmatter`. Документи можуть бути промарковані за допомогою `stampDoc`. Якість документа оцінюється за допомогою `readDocQuality`, а його актуальність визначається функцією `staleness`, яка використовує `crc32` для перевірки хеш-суми. Модель документа зчитується через `readDocModel`.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль витягує структурований факт-лист з вмісту файлів, звертаючись до мережі. Функція `extractFacts` аналізує вміст файлів, визначаючи публічні експорти, локальні символи та поведінкові маркери для Rust та JavaScript/TypeScript файлів. При цьому ігноруються системні та залежності, включаючи каталоги `.github`, `.git`, `node_modules`, `base/`, `ua/` та `.firebase`. Результати аналізу кешуються протягом одного прогону.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль керує життєвим циклом документації. Він вибирає цілі для оновлення за допомогою `selectTargets`, очищає від неіснуючих джерел за допомогою `purgeOrphanedDocs`, запускає генерацію файлів через `runDocFilesGenCli` та `runDocFilesStampCli`, а також виконує пакетну генерацію за допомогою `runGenerationBatch`. Усі операції виконуються з механізмом перехоплення помилок, що запобігає виникненню винятків назовні.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль забезпечує повний цикл роботи з документами: відокремлює захищений блок за допомогою `splitProtected`, вставляє його у визначене місце за допомогою `insertProtected`, генерує повний Markdown-документ через `generateDoc` (з використанням `DEFAULT_LOCAL_MODEL`), а також оцінює якість документа за допомогою `scoreDoc`. Кешування застосовується протягом прогону. (abie.mdc)
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Файл аналізує надані файли коду, створюючи документацію та оцінюючи її якість відповідно до конфігурації, що міститься у report.json. Процес збирає результати для кожного файлу, використовуючи кешування у межах прогону на основі вмісту джерела та вже згенерованої документації. У кінці процес агрегує дані та зберігає повний звіт у report.json, а також виводить його у консоль.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль реалізує механізм оцінки якості документації. Він визначає модель для оцінки за допомогою `JUDGE_MODEL`, перевіряє статус активності гейту через `JUDGE_ENABLED` та встановлює поріг впевненості за допомогою `JUDGE_CONFIDENCE`. Модуль отримує, парсить та визначає фінальний статус документації, викликаючи `judgeDoc` для отримання висновків, а також може використовувати `judgeFailsDoc` для визначення провалу.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль визначає, які файли є кодовим джерелом за допомогою `isSourceFile`. Він обчислює відповідні шляхи до Markdown-документів для коду за допомогою `docPathForSource`. Модуль ідентифікує потенційні кандидати для документування за допомогою `isDocCandidate` та надає опис файлу за допомогою `describeFile`. Для аналізу файлової системи використовуються `scanOrphanedDocs` для пошуку "сирітських" документів та `scanForDocFiles` для сканування файлів. Модуль також може визначати кореневий каталог за допомогою `resolveRoot` та виконувати сканування файлів документації через `runDocFilesScanCli` або перевірку через `runDocFilesCheckCli`.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 80
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Цей модуль надає CLI-обгортку для канонічного `lint-doc-files` (doc-files.mdc): детермінованого детектора застарілості файлових док (`<dir>/docs/<stem>.md`). При відсутності прапорців або при вказанні шляхів (`[paths…]`) виконується повний або точковий детекст застарілості. Якщо знайдено застарілі файли, повертається код виходу 1. Можливі режими: `--missing-only` звужує перевірку до відсутніх файлів. Прапорець `--json` виводить JSON-лістинг усіх кандидатів. Режими `--hook`, `--git` та `--degraded` делегують перевірку через `runDocFilesCheckCli` (hook-протокол: exit 2/0). Повний прогін здійснюється через `runStandardLint` (ключ `lint-doc-files`), тоді як хук/git/degraded форми використовують канон scripts.mdc, не генеруючи логів. Поведінка описується у (doc-files.mdc).
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль аналізує файли `Dockerfile` та `Containerfile` у репозиторії, використовуючи `isDockerfileName` та `findDockerfilePaths` для ідентифікації конфігурацій. Він розбиває знайдені файли на етапи за допомогою `parseFromStages` та `splitDockerfileStages`. Модуль перевіряє конфігурацію, використовуючи `check` та `lint`, щоб оцінити відповідність стандартам, враховуючи дані з `package.json`. Він визначає інформацію про багатоетапну збірку, теги образів та права користувача, відповідно до вимог (docker.mdc).
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 90
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Спільна логіка виклику hadolint для шляхів до Dockerfile. Модуль створює стандартизовані відносні шляхи з прямими слешами. Він ініціює перевірку Dockerfile, використовуючи hadolint як нативний бінарник, який резолвиться через `ensureTool` (PATH → кеш → авто-install brew/scoop/GitHub Release per-platform). Для отримання інформації про встановлення можна звертатися до https://github.com/hadolint/hadolint/releases. Публічна функція `lintDockerfileWithHadolint` виконує перевірку за правилом `n-cursor lint docker` / check-docker.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
package/rules/docker/main.mdc
CHANGED
|
@@ -11,24 +11,4 @@ alwaysApply: false
|
|
|
11
11
|
|
|
12
12
|
## Активація
|
|
13
13
|
|
|
14
|
-
Спрацьовує на всі файли `Dockerfile*`; `check docker` (`fix.mjs`) обробляє також `Containerfile` та `Containerfile.*`.
|
|
15
|
-
|
|
16
|
-
## Швидкий gate через conftest
|
|
17
|
-
|
|
18
|
-
[docker-lint_docker_yml](./policy/lint_docker_yml/lint_docker_yml.mdc)
|
|
19
|
-
|
|
20
|
-
[docker-mirror](./js/mirror.mdc)
|
|
21
|
-
|
|
22
|
-
[docker-multistage](./js/multistage.mdc)
|
|
23
|
-
|
|
24
|
-
[docker-compile](./js/compile.mdc)
|
|
25
|
-
|
|
26
|
-
[docker-native-addon](./js/native-addon.mdc)
|
|
27
|
-
|
|
28
|
-
[docker-non-root](./js/non-root.mdc)
|
|
29
|
-
|
|
30
|
-
[docker-nginx-tag](./js/nginx-tag.mdc)
|
|
31
|
-
|
|
32
|
-
[docker-nginx-user](./js/nginx-user.mdc)
|
|
33
|
-
|
|
34
|
-
[docker-hadolint](./js/hadolint.mdc)
|
|
14
|
+
Спрацьовує на всі файли `Dockerfile*`; `check docker` (`fix.mjs`) обробляє також `Containerfile` та `Containerfile.*`.
|
package/rules/efes/docs/main.md
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль перевіряє відповідність коду визначеним правилам, використовуючи конфігурацію з meta.json. Він виконує аналіз, який може бути ініційований через публічну функцію run. Модуль є read-only, тобто не здійснює записів у файлову систему чи бази даних. Кешування даних відбувається у межах одного прогону. При завершенні роботи як окремий інструмент, він надає підсумковий звіт.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
package/rules/efes/main.mdc
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Модуль перевіряє відповідність даних заданим правилам, використовуючи конфігурації, політики та посилання на MDC, які визначаються у meta.json. Він застосовує білий список для формування підсумку. Публічний інтерфейс run завершує роботу, інформуючи про успішне виконання або виявлені порушення. Модуль є Read-only і не виконує записів у файлову систему чи бази даних.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|
package/rules/ga/docs/main.md
CHANGED
|
@@ -8,8 +8,6 @@ docgen:
|
|
|
8
8
|
score: 90
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## Огляд
|
|
12
|
-
|
|
13
11
|
Цей модуль є CLI-обгорткою над канонічним `lint-ga` (ga.mdc). Він автоматично встановлює `shellcheck` та `conftest` через `ensureTool` (використовуючи brew/scoop/GitHub Release залежно від платформи), перевіряє наявність `uv` (для `uvx zizmor`), а потім послідовно виконує `bunx github-actionlint`, `uvx zizmor --offline --collect=workflows .` та делегує до `rules/ga/check.mjs::check`. Функція `lint` викликає `runLintGaCli`, який є частиною оркестраторного адаптера `n-cursor lint ga`. При відсутності `uv`, користувачеві надається підказка з командою встановлення, наприклад, https://astral.sh/uv/install.sh, оскільки `uv` не в реєстрі `ensureTool`.
|
|
14
12
|
|
|
15
13
|
## Поведінка
|