@nitra/cursor 12.6.1 → 12.7.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 -1
- package/CHANGELOG.md +10 -0
- package/bin/docs/n-cursor.md +4 -20
- package/bin/n-cursor.js +7 -53
- package/docs/stryker.config.md +20 -28
- package/package.json +1 -1
- package/rules/abie/docs/index.md +1 -0
- package/rules/abie/docs/main.md +29 -0
- package/rules/abie/{fix.mjs → main.mjs} +5 -3
- package/rules/adr/docs/index.md +1 -0
- package/rules/adr/docs/main.md +29 -0
- package/rules/adr/{fix.mjs → main.mjs} +5 -3
- package/rules/bun/docs/index.md +1 -0
- package/rules/bun/docs/main.md +30 -0
- package/rules/bun/js/docs/layout.md +11 -36
- package/rules/bun/{fix.mjs → main.mjs} +5 -3
- package/rules/capacitor/docs/index.md +1 -0
- package/rules/capacitor/docs/main.md +29 -0
- package/rules/capacitor/{fix.mjs → main.mjs} +5 -3
- package/rules/changelog/docs/index.md +1 -0
- package/rules/changelog/docs/main.md +27 -0
- package/rules/changelog/main.mjs +20 -0
- package/rules/ci4/docs/index.md +1 -0
- package/rules/ci4/docs/main.md +30 -0
- package/rules/ci4/main.mjs +20 -0
- package/rules/doc-files/docs/index.md +1 -0
- package/rules/doc-files/docs/main.md +31 -0
- package/rules/doc-files/js/docgen-files-batch.mjs +47 -3
- package/rules/doc-files/js/docgen-scan.mjs +89 -9
- package/rules/doc-files/js/docs/docgen-files-batch.md +15 -15
- package/rules/doc-files/js/docs/docgen-scan.md +34 -34
- package/rules/doc-files/js/docs/index.md +1 -0
- package/rules/doc-files/js/docs/run-lint.md +27 -0
- package/rules/doc-files/{lint/lint.mjs → js/run-lint.mjs} +23 -9
- package/rules/doc-files/{js/lint.mjs → main.mjs} +60 -10
- package/rules/docker/docs/index.md +1 -0
- package/rules/docker/docs/main.md +28 -0
- package/rules/docker/js/docs/lint.md +26 -54
- package/rules/docker/js/lint.mjs +11 -0
- package/rules/docker/lib/docker-hadolint.mjs +1 -1
- package/rules/docker/lib/docs/docker-hadolint.md +16 -173
- package/rules/docker/main.mjs +20 -0
- package/rules/efes/docs/index.md +1 -0
- package/rules/efes/docs/main.md +29 -0
- package/rules/efes/main.mjs +20 -0
- package/rules/feedback/docs/index.md +1 -0
- package/rules/feedback/docs/main.md +30 -0
- package/rules/feedback/main.mjs +20 -0
- package/rules/ga/docs/index.md +1 -0
- package/rules/ga/docs/main.md +29 -0
- package/rules/ga/{lint/lint.mjs → main.mjs} +36 -10
- package/rules/graphql/docs/index.md +1 -0
- package/rules/graphql/docs/main.md +36 -0
- package/rules/graphql/main.mjs +20 -0
- package/rules/hasura/docs/index.md +1 -0
- package/rules/hasura/docs/main.md +30 -0
- package/rules/hasura/main.mjs +20 -0
- package/rules/image-avif/docs/index.md +1 -0
- package/rules/image-avif/docs/main.md +30 -0
- package/rules/image-avif/js/docs/avif_generation.md +20 -233
- package/rules/image-avif/main.mjs +20 -0
- package/rules/image-compress/docs/index.md +1 -0
- package/rules/image-compress/docs/main.md +29 -0
- package/rules/image-compress/js/docs/package_setup.md +12 -11
- package/rules/image-compress/{js/lint.mjs → main.mjs} +21 -5
- package/rules/js-bun-db/docs/index.md +1 -0
- package/rules/js-bun-db/docs/main.md +30 -0
- package/rules/js-bun-db/main.mjs +20 -0
- package/rules/js-bun-redis/docs/index.md +1 -0
- package/rules/js-bun-redis/docs/main.md +29 -0
- package/rules/js-bun-redis/main.mjs +20 -0
- package/rules/js-lint/docs/index.md +1 -0
- package/rules/js-lint/docs/main.md +29 -0
- package/rules/js-lint/js/check.mjs +268 -0
- package/rules/js-lint/js/docs/check.md +39 -0
- package/rules/js-lint/js/docs/index.md +1 -1
- package/rules/js-lint/js/docs/tooling.md +12 -32
- package/rules/js-lint/js/tooling.mjs +1 -265
- package/rules/js-lint/{js/lint.mjs → main.mjs} +19 -2
- package/rules/js-lint-ci/docs/index.md +1 -0
- package/rules/js-lint-ci/docs/main.md +27 -0
- package/rules/js-lint-ci/main.mjs +33 -0
- package/rules/js-mssql/docs/index.md +1 -0
- package/rules/js-mssql/docs/main.md +30 -0
- package/rules/js-mssql/main.mjs +20 -0
- package/rules/js-run/docs/index.md +1 -0
- package/rules/js-run/docs/main.md +30 -0
- package/rules/js-run/main.mjs +20 -0
- package/rules/k8s/docs/index.md +1 -0
- package/rules/k8s/docs/main.md +40 -0
- package/rules/k8s/js/docs/index.md +12 -0
- package/rules/k8s/{lint/lint.mjs → main.mjs} +32 -10
- package/rules/nginx-default-tpl/docs/index.md +1 -0
- package/rules/nginx-default-tpl/docs/main.md +30 -0
- package/rules/nginx-default-tpl/main.mjs +20 -0
- package/rules/npm-module/docs/index.md +1 -0
- package/rules/npm-module/docs/main.md +29 -0
- package/rules/npm-module/js/docs/rule_meta.md +17 -16
- package/rules/npm-module/js/rule_meta.mjs +13 -3
- package/rules/npm-module/main.mjs +20 -0
- package/rules/php/docs/index.md +1 -0
- package/rules/php/docs/main.md +33 -0
- package/rules/php/js/docs/tooling.md +10 -10
- package/rules/php/{lint/lint.mjs → main.mjs} +32 -6
- package/rules/python/docs/index.md +1 -0
- package/rules/python/docs/main.md +31 -0
- package/rules/python/js/docs/tooling.md +17 -17
- package/rules/python/{lint/lint.mjs → main.mjs} +29 -5
- package/rules/rego/docs/index.md +1 -0
- package/rules/rego/docs/main.md +37 -0
- package/rules/rego/{lint/lint.mjs → main.mjs} +27 -5
- package/rules/release/docs/index.md +1 -0
- package/rules/release/docs/main.md +29 -0
- package/rules/release/docs/release.md +0 -3
- package/rules/release/release.mdc +10 -0
- package/rules/rust/docs/index.md +1 -0
- package/rules/rust/docs/main.md +27 -0
- package/rules/rust/{js/lint.mjs → main.mjs} +20 -3
- package/rules/security/docs/index.md +1 -0
- package/rules/security/docs/main.md +28 -0
- package/rules/security/main.mjs +45 -0
- package/rules/style-lint/docs/index.md +1 -0
- package/rules/style-lint/docs/main.md +29 -0
- package/rules/style-lint/{js/lint.mjs → main.mjs} +19 -1
- package/rules/tauri/docs/index.md +1 -0
- package/rules/tauri/docs/main.md +29 -0
- package/rules/tauri/main.mjs +20 -0
- package/rules/test/docs/index.md +1 -0
- package/rules/test/docs/main.md +30 -0
- package/rules/test/main.mjs +20 -0
- package/rules/text/docs/index.md +1 -0
- package/rules/text/docs/main.md +29 -0
- package/rules/text/js/docs/cspell-fix.md +30 -0
- package/rules/text/js/docs/formatting.md +12 -45
- package/rules/text/js/docs/index.md +4 -0
- package/rules/text/js/docs/run-dotenv-linter.md +31 -0
- package/rules/text/js/docs/run-shellcheck.md +28 -0
- package/rules/text/js/docs/run-v8r.md +29 -0
- package/rules/text/{lint/lint.mjs → main.mjs} +38 -9
- package/rules/tool-surface/docs/index.md +1 -0
- package/rules/tool-surface/docs/main.md +29 -0
- package/rules/tool-surface/main.mjs +20 -0
- package/rules/vue/docs/index.md +1 -0
- package/rules/vue/docs/main.md +29 -0
- package/rules/vue/main.mjs +20 -0
- package/rules/worktree/docs/index.md +1 -0
- package/rules/worktree/docs/main.md +28 -0
- package/rules/worktree/main.mjs +20 -0
- package/scripts/docs/index.md +1 -0
- package/scripts/docs/post-tool-use-check.md +29 -0
- package/scripts/docs/sync-claude-config.md +64 -92
- package/scripts/lib/adr/docs/normalize-cli.md +0 -3
- package/scripts/lib/adr/docs/normalize-pipeline.md +0 -3
- package/scripts/lib/docs/gha-workflow.md +25 -317
- package/scripts/lib/docs/index.md +1 -0
- package/scripts/lib/docs/list-project-rules-mdc.md +5 -4
- package/scripts/lib/docs/list-rule-ids.md +15 -148
- package/scripts/lib/docs/read-n-cursor-config-lite.md +12 -16
- package/scripts/lib/docs/run-lint-step.md +13 -13
- package/scripts/lib/docs/run-lint.md +30 -0
- package/scripts/lib/docs/run-rule-cli.md +14 -10
- package/scripts/lib/docs/run-standard-lint.md +27 -10
- package/scripts/lib/docs/run-standard-rule.md +12 -11
- package/scripts/lib/docs/timing-summary.md +11 -12
- package/scripts/lib/docs/worktree-notice.md +0 -3
- package/scripts/lib/fix/docs/index.md +1 -0
- package/scripts/lib/fix/docs/orchestrator.md +23 -18
- package/scripts/lib/fix/docs/run-conformance-check.md +32 -0
- package/scripts/lib/fix/docs/t0.md +10 -9
- package/scripts/lib/fix/orchestrator.mjs +5 -5
- package/scripts/lib/fix/{run-fix-check.mjs → run-conformance-check.mjs} +13 -13
- package/scripts/lib/fix/t0.mjs +3 -3
- package/scripts/lib/list-project-rules-mdc.mjs +1 -1
- package/scripts/lib/list-rule-ids.mjs +12 -3
- package/scripts/lib/read-n-cursor-config-lite.mjs +2 -2
- package/{rules/lint/js/orchestrate.mjs → scripts/lib/run-lint.mjs} +42 -20
- package/scripts/lib/run-rule-cli.mjs +4 -4
- package/scripts/lib/run-standard-lint.mjs +19 -6
- package/scripts/lib/run-standard-rule.mjs +4 -4
- package/scripts/lib/timing-summary.mjs +1 -1
- package/scripts/{post-tool-use-fix.mjs → post-tool-use-check.mjs} +9 -9
- package/scripts/sync-claude-config.mjs +2 -2
- package/rules/changelog/fix.mjs +0 -18
- package/rules/ci4/fix.mjs +0 -18
- package/rules/doc-files/fix.mjs +0 -19
- package/rules/doc-files/js/docs/lint.md +0 -34
- package/rules/doc-files/lint/docs/index.md +0 -11
- package/rules/doc-files/lint/docs/lint.md +0 -35
- package/rules/docker/fix.mjs +0 -18
- package/rules/docker/lint/docs/index.md +0 -11
- package/rules/docker/lint/docs/lint.md +0 -200
- package/rules/docker/lint/lint.mjs +0 -95
- package/rules/efes/fix.mjs +0 -18
- package/rules/feedback/fix.mjs +0 -18
- package/rules/ga/fix.mjs +0 -18
- package/rules/ga/js/docs/lint.md +0 -20
- package/rules/ga/js/lint.mjs +0 -12
- package/rules/ga/lint/docs/index.md +0 -11
- package/rules/ga/lint/docs/lint.md +0 -31
- package/rules/graphql/fix.mjs +0 -18
- package/rules/hasura/fix.mjs +0 -18
- package/rules/image-avif/fix.mjs +0 -18
- package/rules/image-compress/fix.mjs +0 -18
- package/rules/image-compress/js/docs/lint.md +0 -24
- package/rules/js-bun-db/fix.mjs +0 -18
- package/rules/js-bun-redis/fix.mjs +0 -18
- package/rules/js-lint/fix.mjs +0 -18
- package/rules/js-lint/js/docs/lint.md +0 -32
- package/rules/js-lint-ci/fix.mjs +0 -18
- package/rules/js-lint-ci/js/docs/lint.md +0 -22
- package/rules/js-lint-ci/js/lint.mjs +0 -15
- package/rules/js-mssql/fix.mjs +0 -18
- package/rules/js-run/fix.mjs +0 -18
- package/rules/k8s/fix.mjs +0 -18
- package/rules/k8s/js/lint.mjs +0 -14
- package/rules/k8s/lint/docs/index.md +0 -11
- package/rules/k8s/lint/docs/lint.md +0 -413
- package/rules/lint/docs/fix.md +0 -25
- package/rules/lint/docs/index.md +0 -11
- package/rules/lint/fix.mjs +0 -18
- package/rules/lint/js/docs/index.md +0 -11
- package/rules/lint/js/docs/orchestrate.md +0 -31
- package/rules/lint/meta.json +0 -1
- package/rules/nginx-default-tpl/fix.mjs +0 -18
- package/rules/npm-module/fix.mjs +0 -18
- package/rules/php/fix.mjs +0 -18
- package/rules/php/js/docs/lint.md +0 -20
- package/rules/php/js/lint.mjs +0 -15
- package/rules/php/lint/docs/index.md +0 -11
- package/rules/php/lint/docs/lint.md +0 -219
- package/rules/python/fix.mjs +0 -18
- package/rules/python/js/docs/lint.md +0 -21
- package/rules/python/js/lint.mjs +0 -14
- package/rules/python/lint/docs/index.md +0 -11
- package/rules/python/lint/docs/lint.md +0 -29
- package/rules/rego/fix.mjs +0 -18
- package/rules/rego/js/docs/lint.md +0 -21
- package/rules/rego/js/lint.mjs +0 -12
- package/rules/rego/lint/docs/index.md +0 -11
- package/rules/rego/lint/docs/lint.md +0 -208
- package/rules/rust/fix.mjs +0 -18
- package/rules/rust/js/docs/lint.md +0 -21
- package/rules/security/fix.mjs +0 -18
- package/rules/security/js/docs/lint.md +0 -175
- package/rules/security/js/lint.mjs +0 -26
- package/rules/style-lint/fix.mjs +0 -18
- package/rules/style-lint/js/docs/lint.md +0 -31
- package/rules/tauri/fix.mjs +0 -18
- package/rules/test/fix.mjs +0 -18
- package/rules/text/fix.mjs +0 -18
- package/rules/text/js/docs/lint.md +0 -23
- package/rules/text/js/lint.mjs +0 -15
- package/rules/text/lint/docs/cspell-fix.md +0 -32
- package/rules/text/lint/docs/index.md +0 -15
- package/rules/text/lint/docs/lint.md +0 -36
- package/rules/text/lint/docs/run-dotenv-linter.md +0 -161
- package/rules/text/lint/docs/run-shellcheck.md +0 -216
- package/rules/text/lint/docs/run-v8r.md +0 -201
- package/rules/tool-surface/fix.mjs +0 -18
- package/rules/vue/fix.mjs +0 -18
- package/rules/worktree/fix.mjs +0 -18
- /package/rules/release/{fix.mjs → main.mjs} +0 -0
- /package/rules/text/{lint → js}/cspell-fix.mjs +0 -0
- /package/rules/text/{lint → js}/run-dotenv-linter.mjs +0 -0
- /package/rules/text/{lint → js}/run-shellcheck.mjs +0 -0
- /package/rules/text/{lint → js}/run-v8r.mjs +0 -0
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: lint.mjs
|
|
4
|
-
resource: npm/rules/rego/lint/lint.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 1059537a
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
Модуль реалізує лінт-крок для Rego-полісі пакета `@nitra/cursor`, який живуть у каталозі
|
|
10
|
-
`npm/rules/<id>/policy/<concern>/`. Він послідовно запускає три інструменти й повертає код
|
|
11
|
-
виходу першого, що впав:
|
|
12
|
-
|
|
13
|
-
1. `opa check --strict` — компіляція Rego з типами та строгим режимом (ловить мертвий код,
|
|
14
|
-
неоднозначні правила, незадекларовані змінні).
|
|
15
|
-
2. `regal lint` — статичний лінтер стилю/ідіоматичності Rego (v0-синтаксис, неявні set-rules,
|
|
16
|
-
відхилення від `rego.v1`, плюс правила категорій bugs/idiomatic/performance — див.
|
|
17
|
-
`https://docs.styra.com/regal`).
|
|
18
|
-
3. `conftest verify` — опційно: виконує `test_*` правила у `*_test.rego` (юніт-тести
|
|
19
|
-
полісі). Якщо `conftest` відсутній у `PATH`, крок пропускається без помилки (з
|
|
20
|
-
повідомленням, як його встановити).
|
|
21
|
-
|
|
22
|
-
Бінарники `opa` й `regal` резолвляться через `ensureTool` (`PATH` → локальний кеш → автоматичне
|
|
23
|
-
встановлення через `brew`/`scoop`/GitHub Release → hard-fail). `conftest` шукається лише в
|
|
24
|
-
`PATH` через `resolveCmd` без авто-install.
|
|
25
|
-
|
|
26
|
-
Канон патерну `lint-*` (серіалізація через `runStandardLint`, без прямого `withLock`) описаний
|
|
27
|
-
у `.cursor/rules/scripts.mdc`, секція «Серіалізація важких CLI-команд». Публічна CLI-форма
|
|
28
|
-
обгорнута в `withLock('lint-rego')` з дедуплікацією за станом git-дерева.
|
|
29
|
-
|
|
30
|
-
Файл одночасно є ESM-модулем (експортує функції) і CLI-точкою входу: якщо запущений напряму
|
|
31
|
-
(`isRunAsCli`), виконує `await runLintRego()` і виставляє `process.exitCode`.
|
|
32
|
-
|
|
33
|
-
## Експорти / API
|
|
34
|
-
|
|
35
|
-
Модуль експортує два символи:
|
|
36
|
-
|
|
37
|
-
| Експорт | Тип | Призначення |
|
|
38
|
-
| ------------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
39
|
-
| `runLintRegoSteps` | named function | Внутрішня форма без локу: запускає три кроки в заданому `cwd`. Призначена для тестів у тимчасових каталогах, де потрібен fresh-прогон без дедуплікації. |
|
|
40
|
-
| `runLintRego` | named const (arrow function) | Публічна CLI-форма: серіалізує виконання через `withLock('lint-rego')` + дедуп за станом git-дерева (через `runStandardLint`). |
|
|
41
|
-
|
|
42
|
-
Також модуль має side-effect при прямому запуску: якщо `isRunAsCli(import.meta.url)` повертає
|
|
43
|
-
`true`, виконується `await runLintRego()` із записом результату в `process.exitCode`.
|
|
44
|
-
|
|
45
|
-
## Функції
|
|
46
|
-
|
|
47
|
-
### `runStep(bin, args, cwd)`
|
|
48
|
-
|
|
49
|
-
Внутрішня (не експортована) допоміжна функція. Запускає процес із успадкованим `stdio`, щоб
|
|
50
|
-
вивід виглядав як прямий виклик у shell, і пре-логує команду користувачу.
|
|
51
|
-
|
|
52
|
-
- **Сигнатура:** `runStep(bin: string, args: string[], cwd: string) => number`
|
|
53
|
-
- **Параметри:**
|
|
54
|
-
- `bin` — абсолютний шлях до бінарника (`opa`, `regal`, `conftest`).
|
|
55
|
-
- `args` — масив аргументів командного рядка.
|
|
56
|
-
- `cwd` — робочий каталог для дочірнього процесу.
|
|
57
|
-
- **Повертає:** код виходу (`0` — OK). Якщо `spawnSync` не зміг запустити бінарник
|
|
58
|
-
(`result.error`), повертає `1`.
|
|
59
|
-
- **Side effects:**
|
|
60
|
-
- Друкує рядок `▶ <bin> <args...>` у `stdout` (логування команди).
|
|
61
|
-
- У випадку помилки запуску пише `❌ Не вдалося запустити <bin>: <message>\n` у `stderr`.
|
|
62
|
-
- Породжує дочірній процес через `spawnSync` з `stdio: 'inherit'` і `env: process.env`
|
|
63
|
-
(наслідування поточного середовища).
|
|
64
|
-
|
|
65
|
-
### `runLintRegoSteps(cwd?)`
|
|
66
|
-
|
|
67
|
-
Експортована функція, що виконує послідовність кроків лінту без локу.
|
|
68
|
-
|
|
69
|
-
- **Сигнатура:** `runLintRegoSteps(cwd?: string) => number`
|
|
70
|
-
- **Параметри:**
|
|
71
|
-
- `cwd` — робочий каталог (за замовчуванням `process.cwd()`).
|
|
72
|
-
- **Повертає:** число — код виходу.
|
|
73
|
-
- `0` — усі кроки OK або жодної цілі не знайдено (skip).
|
|
74
|
-
- Ненульове — код виходу першого кроку, що впав (раннє повернення).
|
|
75
|
-
- **Алгоритм:**
|
|
76
|
-
1. Резолвить `root = resolve(cwd)`.
|
|
77
|
-
2. `opa = ensureTool('opa')` — гарантує наявність `opa` (інакше `ensureTool` hard-fail).
|
|
78
|
-
3. `regal = ensureTool('regal')` — те саме для `regal`.
|
|
79
|
-
4. Фільтрує `LINT_TARGETS` за наявністю на диску (через `existsSync`). Якщо порожньо —
|
|
80
|
-
повертає `0` (skip).
|
|
81
|
-
5. `runStep(opa, ['check', '--strict', ...targets], root)` — якщо `!== 0`, повертає цей код.
|
|
82
|
-
6. `runStep(regal, ['lint', ...targets], root)` — якщо `!== 0`, повертає цей код.
|
|
83
|
-
7. `conftest = resolveCmd('conftest')` — якщо `null`, друкує інформативне повідомлення про
|
|
84
|
-
пропуск кроку й рекомендацію зі встановлення, повертає `0`.
|
|
85
|
-
8. Інакше `runStep(conftest, ['verify', ...targets.flatMap(t => ['-p', t])], root)` —
|
|
86
|
-
повертає його код виходу.
|
|
87
|
-
- **Side effects:** виконує `ensureTool` (може встановити бінарник або hard-fail), породжує
|
|
88
|
-
дочірні процеси з успадкованим `stdio`, пише в `stdout`/`stderr`.
|
|
89
|
-
|
|
90
|
-
### `runLintRego()`
|
|
91
|
-
|
|
92
|
-
Експортована публічна CLI-форма (arrow-const).
|
|
93
|
-
|
|
94
|
-
- **Сигнатура:** `runLintRego() => Promise<number>`
|
|
95
|
-
- **Параметри:** немає.
|
|
96
|
-
- **Повертає:** `Promise<number>` — код виходу.
|
|
97
|
-
- **Поведінка:** делегує в `runStandardLint(import.meta.dirname, () => runLintRegoSteps())`.
|
|
98
|
-
`runStandardLint` забезпечує:
|
|
99
|
-
- Серіалізацію через `withLock('lint-rego')` (іменем серіалізатора виступає назва каталогу
|
|
100
|
-
`lint`, отримана з `import.meta.dirname` — конвенція `runStandardLint`).
|
|
101
|
-
- Дедуплікацію проти попереднього прогону за станом git-дерева.
|
|
102
|
-
- **Side effects:** через делегування — ті самі, що в `runLintRegoSteps`, плюс файлові
|
|
103
|
-
side-effects лок-файлу й кешу станів від `runStandardLint`.
|
|
104
|
-
|
|
105
|
-
### CLI-вхід (на верхньому рівні модуля)
|
|
106
|
-
|
|
107
|
-
```js
|
|
108
|
-
if (isRunAsCli(import.meta.url)) {
|
|
109
|
-
process.exitCode = await runLintRego()
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
- Виконується лише при прямому запуску модуля як скрипта (а не при імпорті).
|
|
114
|
-
- Очікує проміс `runLintRego()` і записує отриманий код у `process.exitCode` (не викликає
|
|
115
|
-
`process.exit` явно, щоб лог-флаш не обрізався).
|
|
116
|
-
|
|
117
|
-
## Залежності
|
|
118
|
-
|
|
119
|
-
### Стандартна бібліотека Node.js
|
|
120
|
-
|
|
121
|
-
- `node:child_process` → `spawnSync` — синхронний запуск дочірніх процесів із `stdio: 'inherit'`.
|
|
122
|
-
- `node:fs` → `existsSync` — перевірка наявності каталогів-цілей.
|
|
123
|
-
- `node:path` → `resolve` — нормалізація абсолютних шляхів.
|
|
124
|
-
|
|
125
|
-
### Внутрішні модулі (відносні шляхи від `npm/rules/rego/lint/lint.mjs`)
|
|
126
|
-
|
|
127
|
-
- `../../../scripts/cli-entry.mjs` → `isRunAsCli` — детектор «запущений напряму як CLI».
|
|
128
|
-
- `../../../scripts/lib/ensure-tool.mjs` → `ensureTool` — резолв бінарників (`PATH` → кеш →
|
|
129
|
-
авто-install brew/scoop/GitHub Release → hard-fail).
|
|
130
|
-
- `../../../scripts/utils/resolve-cmd.mjs` → `resolveCmd` — м'який пошук команди в `PATH`
|
|
131
|
-
(повертає шлях або `null`, без авто-install і без hard-fail).
|
|
132
|
-
- `../../../scripts/lib/run-standard-lint.mjs` → `runStandardLint` — обгортка з локом і
|
|
133
|
-
дедуплікацією для лінт-кроків.
|
|
134
|
-
|
|
135
|
-
### Зовнішні бінарники (системні)
|
|
136
|
-
|
|
137
|
-
- `opa` — обов'язковий, авто-install через `ensureTool` (Open Policy Agent CLI).
|
|
138
|
-
- `regal` — обов'язковий, авто-install через `ensureTool` (Styra Regal lint CLI).
|
|
139
|
-
- `conftest` — опційний, лише з `PATH` (без авто-install). За відсутності — `verify`
|
|
140
|
-
пропускається.
|
|
141
|
-
|
|
142
|
-
### Константи модуля
|
|
143
|
-
|
|
144
|
-
- `LINT_TARGETS = ['npm/rules']` — список відносних шляхів-цілей, що передаються в усі три
|
|
145
|
-
інструменти. Перед запуском фільтрується за `existsSync`.
|
|
146
|
-
|
|
147
|
-
## Потік виконання / Використання
|
|
148
|
-
|
|
149
|
-
### Як модуль (програмний імпорт)
|
|
150
|
-
|
|
151
|
-
```js
|
|
152
|
-
import { runLintRego, runLintRegoSteps } from './npm/rules/rego/lint/lint.mjs'
|
|
153
|
-
|
|
154
|
-
// CLI-форма (з локом і дедуплікацією) — рекомендована для оркестрації
|
|
155
|
-
const code = await runLintRego()
|
|
156
|
-
|
|
157
|
-
// Внутрішня форма (без локу) — для тестів у тимчасових каталогах
|
|
158
|
-
const codeFresh = runLintRegoSteps('/tmp/fixture-cwd')
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### Як CLI (прямий запуск)
|
|
162
|
-
|
|
163
|
-
```sh
|
|
164
|
-
node npm/rules/rego/lint/lint.mjs
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
При прямому запуску модуль викликає `runLintRego()` і виставляє `process.exitCode` відповідно
|
|
168
|
-
до результату. Це дозволяє оркестратору лінту (наприклад, кореневому `bun run lint`)
|
|
169
|
-
підхопити цей файл як один із кроків і отримати правильний код виходу процесу.
|
|
170
|
-
|
|
171
|
-
### Логічний потік (один прогон `runLintRegoSteps`)
|
|
172
|
-
|
|
173
|
-
1. Резолв `cwd → root`.
|
|
174
|
-
2. `ensureTool('opa')` — повертає шлях до бінарника або hard-fail (з повідомленням
|
|
175
|
-
`ensureTool`).
|
|
176
|
-
3. `ensureTool('regal')` — те саме.
|
|
177
|
-
4. Перевірка цілей: `LINT_TARGETS.filter(existsSync)`. Порожньо → `return 0` (skip).
|
|
178
|
-
5. `opa check --strict <targets...>` → `runStep`. `!== 0` → early-return з цим кодом.
|
|
179
|
-
6. `regal lint <targets...>` → `runStep`. `!== 0` → early-return з цим кодом.
|
|
180
|
-
7. `resolveCmd('conftest')`:
|
|
181
|
-
- `null` → інформативний `console.log` із рекомендацією встановлення, `return 0`.
|
|
182
|
-
- інакше → `conftest verify -p <t1> -p <t2> ...` через `runStep`; повертається його код.
|
|
183
|
-
8. Повернутий код піднімається до `runLintRego` → у `runStandardLint` → у `process.exitCode`
|
|
184
|
-
(для CLI-режиму).
|
|
185
|
-
|
|
186
|
-
### Семантика помилок і пропусків
|
|
187
|
-
|
|
188
|
-
- **Усі цілі відсутні** → skip із кодом `0` (немає чого лінтити на ранніх стадіях/у мінімальних
|
|
189
|
-
фікстурах).
|
|
190
|
-
- **`opa`/`regal` відсутні** → hard-fail усередині `ensureTool` (без авто-install або з
|
|
191
|
-
невдалим авто-install).
|
|
192
|
-
- **`opa check` або `regal lint` повернули `!== 0`** → раннє повернення з цим кодом; наступні
|
|
193
|
-
кроки не виконуються.
|
|
194
|
-
- **`conftest` відсутній у `PATH`** → лог-нотатка про пропуск, фінальний код `0` (вважається
|
|
195
|
-
не помилкою — юніт-тести полісі опційні в локальному середовищі; у CI рекомендовано
|
|
196
|
-
встановлювати `conftest`).
|
|
197
|
-
- **`spawnSync` не зміг запустити бінарник** (`result.error`) → лог `❌ Не вдалося запустити
|
|
198
|
-
...` у `stderr`, `runStep` повертає `1`.
|
|
199
|
-
|
|
200
|
-
### Контекст у проєкті
|
|
201
|
-
|
|
202
|
-
- Цілі лінту — каталог `npm/rules` пакета `@nitra/cursor`, де живуть Rego-полісі у
|
|
203
|
-
`npm/rules/<id>/policy/<concern>/`. Усі три інструменти приймають один шлях і рекурсивно
|
|
204
|
-
знаходять `.rego`, ігноруючи інші розширення (наприклад, `target.json` чи template-фіх).
|
|
205
|
-
- `opa` додатково потрібен VS Code-розширенню `tsandall.opa` (LSP, format-on-save через
|
|
206
|
-
`opa fmt`) — деталі в `mdc/rego.mdc`.
|
|
207
|
-
- Канон патерну `lint-*` із серіалізацією через `runStandardLint` (а не прямий `withLock`) —
|
|
208
|
-
див. `.cursor/rules/scripts.mdc`, секція «Серіалізація важких CLI-команд».
|
package/rules/rust/fix.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: lint.mjs
|
|
4
|
-
resource: npm/rules/rust/js/lint.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 5d7c4123
|
|
7
|
-
score: 100
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
Оркестраторний адаптер правила `rust` для `n-cursor lint`: rustfmt + clippy через `cargo`. Запускається на `n-cursor lint rust`. За відсутності `Cargo.toml` у корені — no-op (вихід 0). `cargo`/`rustfmt`/`clippy` резолвляться з PATH (Rust toolchain через rustup), не з npm-залежностей; якщо `cargo` відсутній за наявного `Cargo.toml` — помилка.
|
|
11
|
-
|
|
12
|
-
## Поведінка
|
|
13
|
-
|
|
14
|
-
1. `readOnly` (CI): `cargo fmt --all -- --check` + `cargo clippy --all-targets --all-features -- -D warnings` — детект без мутацій.
|
|
15
|
-
2. fix-режим: `cargo fmt --all` + `cargo clippy --fix` + фінальний `cargo clippy … -D warnings`.
|
|
16
|
-
3. Перший ненульовий cargo-крок спиняє ланцюг і повертає його код.
|
|
17
|
-
|
|
18
|
-
## Гарантії поведінки
|
|
19
|
-
|
|
20
|
-
- Read-only за наявності `readOnly`: cargo не мутує робоче дерево (`--check`, без `--fix`).
|
|
21
|
-
- Не звертається до мережі напряму (cargo-кроки можуть тягнути crates, але це поведінка тулчейну).
|
package/rules/security/fix.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: lint.mjs
|
|
4
|
-
resource: npm/rules/security/js/lint.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: f3265f82
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
Файл `npm/rules/security/js/lint.mjs` реалізує CI-крок правила **security** для пошуку секретів у репозиторії. Це обгортка над зовнішнім інструментом [TruffleHog](https://github.com/trufflesecurity/trufflehog), яка запускає сканування всього робочого дерева (`filesystem` mode) і повертає його exit-код як результат лінтингу.
|
|
10
|
-
|
|
11
|
-
Особливості:
|
|
12
|
-
|
|
13
|
-
- **Repo-wide, а не per-file.** Модуль свідомо ігнорує перший аргумент `_files` — TruffleHog у режимі `filesystem` обробляє кореневу теку цілком і завжди сканує однаковий набір шляхів, незалежно від того, які саме файли передає рушій правил. Тому пер-файлового різновиду немає; результат однаковий для будь-якого підмножина файлів.
|
|
14
|
-
- **Один прохід на сесію.** Сканер виконується синхронно через `spawnSync`, що відповідає правилу «без паралельних лінт-запусків» у монорепо.
|
|
15
|
-
- **Контрактний інтерфейс.** Експорт `lint(files, cwd)` сумісний із загальним контрактом per-rule lint-функцій (`(files?, cwd?) => Promise<number>`), що дозволяє інтегрувати security-правило в загальний раннер однаково з іншими.
|
|
16
|
-
|
|
17
|
-
Файл не має побічних ефектів на момент імпорту: запуск зовнішнього процесу відбувається лише при виклику `lint()`.
|
|
18
|
-
|
|
19
|
-
## Експорти / API
|
|
20
|
-
|
|
21
|
-
| Експорт | Тип | Призначення |
|
|
22
|
-
| ------- | ------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
23
|
-
| `lint` | `function` (named export) | Запускає TruffleHog filesystem-скан із кореня `cwd` і повертає `Promise<number>` із exit-кодом процесу. |
|
|
24
|
-
|
|
25
|
-
Default-експорту немає. Імпорт відбувається у вигляді:
|
|
26
|
-
|
|
27
|
-
```js
|
|
28
|
-
import { lint } from './lint.mjs'
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Функції
|
|
32
|
-
|
|
33
|
-
### `lint(_files, cwd?)`
|
|
34
|
-
|
|
35
|
-
**Сигнатура:**
|
|
36
|
-
|
|
37
|
-
```js
|
|
38
|
-
export function lint(_files, cwd = process.cwd()) => Promise<number>
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**Параметри:**
|
|
42
|
-
|
|
43
|
-
| Параметр | Тип | Обовʼязковий | За замовчанням | Опис |
|
|
44
|
-
| -------- | ----------------------- | ------------ | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
45
|
-
| `_files` | `string[] \| undefined` | ні | — | Список файлів від рушія правил. **Ігнорується**: TruffleHog у `filesystem`-режимі сканує дерево цілком. Префікс `_` у JSDoc сигналізує про навмисне ігнорування. |
|
|
46
|
-
| `cwd` | `string` | ні | `process.cwd()` | Робоча тека, у якій запускається TruffleHog. Сканування `.` виконуватиметься відносно неї. |
|
|
47
|
-
|
|
48
|
-
**Повертає:**
|
|
49
|
-
|
|
50
|
-
`Promise<number>` — exit-код процесу TruffleHog:
|
|
51
|
-
|
|
52
|
-
- `0` — секретів не знайдено (успіх).
|
|
53
|
-
- Будь-яке інше число — або знайдено секрети, що відповідають критеріям `--results=verified,unknown` (через флаг `--fail`), або TruffleHog не зміг запуститись/упав.
|
|
54
|
-
- `1` — fallback, який повертається, якщо `r.status` не є числом (наприклад, процес було вбито сигналом і `status === null`).
|
|
55
|
-
|
|
56
|
-
**Side effects:**
|
|
57
|
-
|
|
58
|
-
1. Запускає синхронний дочірній процес `trufflehog` через `node:child_process#spawnSync`.
|
|
59
|
-
2. `stdio: 'inherit'` — stdout/stderr/stdin успадковуються з батьківського процесу; вивід TruffleHog потрапляє безпосередньо в консоль CI-runner.
|
|
60
|
-
3. Блокує event loop до завершення процесу (`spawnSync` синхронний; результат лише обгортається у `Promise.resolve`).
|
|
61
|
-
4. Не записує файли, не модифікує env, не змінює стан модуля.
|
|
62
|
-
|
|
63
|
-
**Внутрішня механіка:**
|
|
64
|
-
|
|
65
|
-
Викликається TruffleHog із набором аргументів:
|
|
66
|
-
|
|
67
|
-
| Аргумент | Значення |
|
|
68
|
-
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
69
|
-
| Команда | `trufflehog` (резолвиться через `PATH`) |
|
|
70
|
-
| Subcommand | `filesystem` |
|
|
71
|
-
| Шлях | `.` (відносно `cwd`) |
|
|
72
|
-
| `--no-update` | Не намагатися автооновити сам TruffleHog у CI. |
|
|
73
|
-
| `--exclude-paths` | `.trufflehog-exclude` — файл зі шляхами/патернами, які виключити зі сканування. Має лежати в `cwd`. |
|
|
74
|
-
| `--results=verified,unknown` | Звітувати лише **верифіковані** секрети та секрети **невідомого** статусу верифікації (відсікти `unverified`, щоб зменшити шум). |
|
|
75
|
-
| `--fail` | Завершуватись із ненульовим exit-кодом, якщо знайдено результати, що відповідають фільтру вище. |
|
|
76
|
-
|
|
77
|
-
Параметри `spawnSync`:
|
|
78
|
-
|
|
79
|
-
- `cwd` — переданий або `process.cwd()`.
|
|
80
|
-
- `stdio: 'inherit'` — прямий проброс I/O.
|
|
81
|
-
|
|
82
|
-
Після завершення:
|
|
83
|
-
|
|
84
|
-
```js
|
|
85
|
-
return Promise.resolve(typeof r.status === 'number' ? r.status : 1)
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
— безпечна нормалізація: якщо `status` відсутній (наприклад, процес перерваний сигналом → `r.status === null`, `r.signal === 'SIGTERM'`), функція повертає `1` як індикатор помилки.
|
|
89
|
-
|
|
90
|
-
**Контрактні нотатки:**
|
|
91
|
-
|
|
92
|
-
- Функція **не кидає виключення** для звичайних випадків (TruffleHog знайшов секрети або не запустився) — все нормалізується в exit-код через `Promise.resolve`. Якщо `spawnSync` сам кине синхронне виключення (наприклад, ENOENT через відсутність бінарника та некоректну поведінку runtime), воно пробʼється вгору — але стандартна поведінка Node для відсутнього виконуваного файлу — повернути `r.error`, а `r.status === null`, тому функція дасть `1`.
|
|
93
|
-
- Поверне `Promise`, навіть якщо все відбулось синхронно — це потрібно для уніфікованого `await` у виклику з рушія правил.
|
|
94
|
-
|
|
95
|
-
## Залежності
|
|
96
|
-
|
|
97
|
-
### Зовнішні (npm) бібліотеки
|
|
98
|
-
|
|
99
|
-
Жодних — модуль не імпортує сторонні пакети.
|
|
100
|
-
|
|
101
|
-
### Стандартна бібліотека Node.js
|
|
102
|
-
|
|
103
|
-
- **`node:child_process`** — використовується `spawnSync` для синхронного запуску `trufflehog`. Імпорт із префіксом `node:` обовʼязковий за правилами проекту.
|
|
104
|
-
|
|
105
|
-
### Системні залежності
|
|
106
|
-
|
|
107
|
-
- **`trufflehog`** (бінарник) — має бути доступний у `PATH` середовища, де запускається CI-крок. Інакше `spawnSync` поверне об'єкт із `error` (ENOENT) та `status === null`, і функція віддасть `1`.
|
|
108
|
-
- **Файл `.trufflehog-exclude`** — очікується у корені `cwd`. Це plaintext-файл із патернами шляхів для виключення (формат TruffleHog `--exclude-paths`). Якщо файл відсутній, TruffleHog може завершитись із ненульовим кодом — це теж буде повернуто як exit-код.
|
|
109
|
-
|
|
110
|
-
### Внутрішні модулі
|
|
111
|
-
|
|
112
|
-
- Зовнішніх внутрішньопроєктних імпортів модуль не має. Він самодостатній і викликається рушієм правил security (`npm/rules/security/...`), який інтегрує його у загальний lint-пайплайн.
|
|
113
|
-
|
|
114
|
-
## Потік виконання / Використання
|
|
115
|
-
|
|
116
|
-
### Загальний потік
|
|
117
|
-
|
|
118
|
-
1. Рушій правил (npm-пакет, що оркеструє лінтери) виявляє правило `security` для активного workspace.
|
|
119
|
-
2. Викликає `lint(files, cwd)` із `files` (списком змінених/вибраних файлів) та `cwd` (коренем workspace або репо).
|
|
120
|
-
3. `lint`:
|
|
121
|
-
- Ігнорує `files`.
|
|
122
|
-
- Викликає `spawnSync('trufflehog', [...], { cwd, stdio: 'inherit' })`.
|
|
123
|
-
- Користувач/CI бачить весь stdout/stderr TruffleHog у реальному часі.
|
|
124
|
-
- Після завершення процесу повертає `Promise<exitCode>`.
|
|
125
|
-
4. Рушій правил агрегує exit-коди всіх лінтерів і визначає загальний результат (зазвичай: будь-яке ненульове значення = провал CI).
|
|
126
|
-
|
|
127
|
-
### Типовий виклик з коду
|
|
128
|
-
|
|
129
|
-
```js
|
|
130
|
-
import { lint } from './lint.mjs'
|
|
131
|
-
|
|
132
|
-
const exitCode = await lint(undefined, process.cwd())
|
|
133
|
-
if (exitCode !== 0) {
|
|
134
|
-
console.error('[security] TruffleHog знайшов секрети або не зміг виконатись')
|
|
135
|
-
process.exitCode = exitCode
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### CI-сценарій
|
|
140
|
-
|
|
141
|
-
1. CI-runner клонує репозиторій і встановлює бінарник `trufflehog` (через apt/brew/curl/прекомпільований release).
|
|
142
|
-
2. Запускається `n-cursor lint` (або еквівалент), який обходить правила.
|
|
143
|
-
3. Для правила `security` рушій кличе цю `lint`-функцію.
|
|
144
|
-
4. TruffleHog рекурсивно сканує всі файли під `cwd`, окрім перелічених у `.trufflehog-exclude`.
|
|
145
|
-
5. Якщо знайдено **верифіковані** або **unknown**-секрети — повертається ненульовий exit-код, флаг `--fail` гарантує цю поведінку.
|
|
146
|
-
6. CI завершується із помилкою, кроки нижче не виконуються.
|
|
147
|
-
|
|
148
|
-
### Граничні випадки
|
|
149
|
-
|
|
150
|
-
| Ситуація | Поведінка |
|
|
151
|
-
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
152
|
-
| `trufflehog` відсутній у `PATH` | `spawnSync` повертає `r.status === null`, функція віддає `1`. У stderr (через `inherit`) може зʼявитись повідомлення Node про відсутність бінарника, залежно від платформи. |
|
|
153
|
-
| `.trufflehog-exclude` відсутній | TruffleHog зазвичай помиляється з ненульовим кодом — функція поверне його як є. |
|
|
154
|
-
| Процес вбито сигналом | `r.status === null` → повертається `1`. |
|
|
155
|
-
| Секретів немає | TruffleHog повертає `0` → функція повертає `0`. |
|
|
156
|
-
| Передано `files=[...]` | Аргумент проігноровано; сканування все одно зачіпає всю теку `cwd`. |
|
|
157
|
-
| `cwd` не вказано | Використовується `process.cwd()` поточного Node-процесу. |
|
|
158
|
-
|
|
159
|
-
### Конфігураційні «крутилки»
|
|
160
|
-
|
|
161
|
-
Самі прапори зашиті в код і не параметризуються через аргументи функції. Якщо потрібно змінити поведінку (інший шлях `--exclude-paths`, інші типи результатів, увімкнути `--update`), правки робляться безпосередньо в `lint.mjs` — це навмисно, щоб уніфіковано тримати security-політику для всього монорепо.
|
|
162
|
-
|
|
163
|
-
## Rebuild Test
|
|
164
|
-
|
|
165
|
-
Перевірка контракту (для майбутніх refactor-ів — поведінка має зберігатись):
|
|
166
|
-
|
|
167
|
-
1. **Експорт** named `lint` присутній; default-експорту немає.
|
|
168
|
-
2. **Сигнатура** `lint(_files, cwd = process.cwd())` повертає `Promise<number>`.
|
|
169
|
-
3. **Викликана команда** — рівно `trufflehog` із аргументами у точному порядку:
|
|
170
|
-
`filesystem`, `.`, `--no-update`, `--exclude-paths`, `.trufflehog-exclude`, `--results=verified,unknown`, `--fail`.
|
|
171
|
-
4. **Options** для `spawnSync`: `{ cwd, stdio: 'inherit' }`.
|
|
172
|
-
5. **Нормалізація exit-коду**: число → пробрасується; не число → `1`.
|
|
173
|
-
6. **`_files` ігнорується** — наявність/відсутність/вміст не змінює викликаних аргументів TruffleHog.
|
|
174
|
-
7. **Імпорт `child_process`** — лише через `node:`-префікс.
|
|
175
|
-
8. **Жодних побічних ефектів на імпорті** — `lint` запускає процес лише при виклику.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ci-крок security: trufflehog filesystem скан усього репо (per-file немає).
|
|
3
|
-
*/
|
|
4
|
-
import { spawnSync } from 'node:child_process'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @param {string[] | undefined} _files ігнорується
|
|
8
|
-
* @param {string} [cwd] корінь
|
|
9
|
-
* @returns {Promise<number>} exit code
|
|
10
|
-
*/
|
|
11
|
-
export function lint(_files, cwd = process.cwd()) {
|
|
12
|
-
const r = spawnSync(
|
|
13
|
-
'trufflehog',
|
|
14
|
-
[
|
|
15
|
-
'filesystem',
|
|
16
|
-
'.',
|
|
17
|
-
'--no-update',
|
|
18
|
-
'--exclude-paths',
|
|
19
|
-
'.trufflehog-exclude',
|
|
20
|
-
'--results=verified,unknown',
|
|
21
|
-
'--fail'
|
|
22
|
-
],
|
|
23
|
-
{ cwd, stdio: 'inherit' }
|
|
24
|
-
)
|
|
25
|
-
return Promise.resolve(typeof r.status === 'number' ? r.status : 1)
|
|
26
|
-
}
|
package/rules/style-lint/fix.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: lint.mjs
|
|
4
|
-
resource: npm/rules/style-lint/js/lint.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: 2013a66b
|
|
7
|
-
score: 100
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
filterStyleFiles
|
|
11
|
-
Вибирає файли, що мають розширення .css, .scss або .vue.
|
|
12
|
-
|
|
13
|
-
lint
|
|
14
|
-
Запускає команду stylelint з опцією --fix для перевірки та виправлення стилів.
|
|
15
|
-
|
|
16
|
-
## Поведінка
|
|
17
|
-
|
|
18
|
-
filterStyleFiles
|
|
19
|
-
фільтрує список файлів, повертаючи лише ті, що закінчуються на .css, .scss або .vue
|
|
20
|
-
|
|
21
|
-
lint
|
|
22
|
-
запускає команду stylelint з опцією --fix для перевірки та виправлення стилів
|
|
23
|
-
|
|
24
|
-
## Публічний API
|
|
25
|
-
|
|
26
|
-
filterStyleFiles відбирає файли за стилем
|
|
27
|
-
|
|
28
|
-
## Гарантії поведінки
|
|
29
|
-
|
|
30
|
-
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
31
|
-
- Не звертається до мережі.
|
package/rules/tauri/fix.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
package/rules/test/fix.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
package/rules/text/fix.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { isRunAsCli, runRuleCli } from '../../scripts/lib/run-rule-cli.mjs'
|
|
2
|
-
import { runStandardRule } from '../../scripts/lib/run-standard-rule.mjs'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
6
|
-
* Library mode: викликається CLI orchestration через `import + run(ctx)`.
|
|
7
|
-
* @param {import('../../scripts/lib/run-standard-rule.mjs').RuleContext} [ctx] контекст прогону (walkCache тощо)
|
|
8
|
-
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
9
|
-
*/
|
|
10
|
-
export function run(ctx) {
|
|
11
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (isRunAsCli(import.meta.url)) {
|
|
15
|
-
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
|
-
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
process.exitCode = await runRuleCli(import.meta.dirname)
|
|
18
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: JS Module
|
|
3
|
-
title: lint.mjs
|
|
4
|
-
resource: npm/rules/text/js/lint.mjs
|
|
5
|
-
docgen:
|
|
6
|
-
crc: eca3c531
|
|
7
|
-
score: 100
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
Файл надає функцію lint, яка делегує завдання CLI правилам. Функція не підтримує режим per-file, і параметр files ігнорується. Функція повертає Promise з кодом виходу.
|
|
11
|
-
|
|
12
|
-
## Поведінка
|
|
13
|
-
|
|
14
|
-
1. Викликається функція lint з аргументом files.
|
|
15
|
-
2. Функція lint делегує виконання у CLI правила.
|
|
16
|
-
3. Режим per-file не підтримується.
|
|
17
|
-
4. Параметр files ігнорується.
|
|
18
|
-
5. Функція повертає Promise з кодом виходу.
|
|
19
|
-
|
|
20
|
-
## Гарантії поведінки
|
|
21
|
-
|
|
22
|
-
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
23
|
-
- Не звертається до мережі.
|
package/rules/text/js/lint.mjs
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Крок text: делегує у наявний CLI правила (per-file режиму немає — `files` ігнорується).
|
|
3
|
-
*/
|
|
4
|
-
import { runLintTextCli } from '../lint/lint.mjs'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @param {string[] | undefined} _files ігнорується (whole-repo аналіз)
|
|
8
|
-
* @param {string} [_cwd] корінь (ігнорується — CLI працює від process.cwd())
|
|
9
|
-
* @param {{ readOnly?: boolean, llmFix?: boolean }} [opts] readOnly → детект без авто-фіксу (нуль мутацій);
|
|
10
|
-
* llmFix → opt-in omlx-класифікація cspell (з `meta.json: llmFix:true`)
|
|
11
|
-
* @returns {Promise<number>} exit code
|
|
12
|
-
*/
|
|
13
|
-
export function lint(_files, _cwd, opts = {}) {
|
|
14
|
-
return runLintTextCli({ readOnly: opts.readOnly === true, llmFix: opts.llmFix === true })
|
|
15
|
-
}
|