@nitra/cursor 1.11.16 → 1.13.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/CHANGELOG.md +50 -0
- package/package.json +1 -4
- package/rules/bun/bun.mdc +3 -2
- package/rules/capacitor/capacitor.mdc +3 -2
- package/rules/js-bun-db/js-bun-db.mdc +3 -2
- package/rules/js-bun-redis/js-bun-redis.mdc +3 -2
- package/rules/js-lint/js-lint.mdc +3 -2
- package/rules/js-mssql/js-mssql.mdc +3 -2
- package/rules/js-run/js-run.mdc +3 -2
- package/rules/npm-module/npm-module.mdc +3 -2
- package/rules/security/auto.md +1 -0
- package/rules/security/fix/gitleaks/check.mjs +62 -0
- package/rules/security/policy/package_json/package_json.rego +75 -0
- package/rules/security/policy/package_json/target.json +4 -0
- package/rules/security/security.mdc +77 -0
- package/rules/tauri/tauri.mdc +3 -2
- package/scripts/auto-rules.mjs +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,56 @@
|
|
|
4
4
|
|
|
5
5
|
Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
|
|
6
6
|
|
|
7
|
+
## [1.13.0] - 2026-05-17
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **9 правил переведено з `alwaysApply: true` на `alwaysApply: false` + `globs:`** — AI-контекст у Cursor/Claude Code підвантажується лише при роботі з релевантними файлами; програмна валідація через `npx check <rule>` залишається повністю функціональною незалежно від AI-контексту. Економить контекстне вікно у сесіях, де редагують код, далекий від відповідних конфігів.
|
|
12
|
+
- **`bun`** (`1.7 → 1.8`) — `globs: "**/package.json,**/bunfig.toml,**/bun.lock,**/bun.lockb"`
|
|
13
|
+
- **`capacitor`** (`1.0 → 1.1`) — `globs: "**/capacitor.config.json,**/android/**,**/ios/**"`
|
|
14
|
+
- **`js-bun-db`** (`1.6 → 1.7`) — `globs: "**/package.json,**/src/conn/**"`
|
|
15
|
+
- **`js-bun-redis`** (`1.0 → 1.1`) — `globs: "**/package.json,**/src/conn/**"`
|
|
16
|
+
- **`js-mssql`** (`1.3 → 1.4`) — `globs: "**/package.json,**/src/conn/mssql-*"`
|
|
17
|
+
- **`npm-module`** (`1.12 → 1.13`) — `globs: "npm/**,**/package.json,**/hk.pkl,.github/workflows/npm-publish.yml,**/tsconfig*.json"`
|
|
18
|
+
- **`tauri`** (`1.0 → 1.1`) — `globs: "**/src-tauri/**,**/tauri.conf.json"`
|
|
19
|
+
- **`js-lint`** (`1.21 → 1.22`) — `globs: "**/{.oxlintrc.json,eslint.config.js,.jscpd.json,knip.json,package.json},**/*.{js,mjs,cjs,jsx,ts,tsx}"`
|
|
20
|
+
- **`js-run`** (`1.7 → 1.8`) — `globs: "**/package.json,**/jsconfig.json,**/src/**/*.{js,mjs,cjs,ts,tsx}"`
|
|
21
|
+
- **Мотивація:** усі 9 правил мають повне покриття `npx @nitra/cursor check <rule>` (JS-перевірка + Rego policy). Тримати їх `alwaysApply: true` без потреби палить контекст AI у сесіях, де редагується непов'язаний код. Помилка → check ловить → AI виправляє — той самий цикл, що для `security@1.12.1` і `changelog`/`image-compress`/`php`/`vue`.
|
|
22
|
+
- **Залишено `alwaysApply: true`** — `text` (cross-cutting cspell-словник, апостроф), `adr` (про процес capture/normalize hooks), `ci4` (0 програмних чекерів — без AI-контексту правило мертве), `abie` (має JS `applies`-гейт, у не-abie репо мовчить; файли розкидані).
|
|
23
|
+
|
|
24
|
+
## [1.12.1] - 2026-05-17
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **`npm/rules/security/security.mdc`** — `alwaysApply: true` → `alwaysApply: false` + `globs: "**/.gitleaks.toml,**/package.json,**/.github/workflows/**/*.yml"`. AI-контекст правила тепер підвантажується лише при роботі з релевантними файлами (за зразком `changelog`/`image-compress`/`php`), а не на кожен турн. Програмна валідація через `npx @nitra/cursor check security` залишається завжди увімкненою (через `auto.md = завжди`) і ловить помилки незалежно від AI-контексту. Версія frontmatter `1.0` → `1.1`.
|
|
29
|
+
- **Мотивація:** правило має повне покриття перевіркою (Rego + JS-check); тримати його `alwaysApply: true` не дає AI додаткової цінності понад те, що `check security` ловить програмно — лише марно займає контекстне вікно при роботі з кодом, не повʼязаним з конфігурацією security.
|
|
30
|
+
|
|
31
|
+
## [1.12.0] - 2026-05-16
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- **Нове правило `security`** (увімкнене за замовчуванням, як `text`/`adr`) — секрет-сканер на базі [gitleaks](https://github.com/gitleaks/gitleaks). Вимагає:
|
|
36
|
+
- `scripts.lint-security` у `package.json` з викликом `gitleaks detect` (або `gitleaks git`);
|
|
37
|
+
- `bun run lint-security` всередині агрегованого `scripts.lint` (якщо `lint` є);
|
|
38
|
+
- `.gitleaks.toml` у корені з `useDefault = true` у блоці `[extend]` (без перетирання вбудованих правил);
|
|
39
|
+
- `gitleaks` **не** у `dependencies`/`devDependencies` (інструмент глобальний, як `shellcheck`/`conftest`).
|
|
40
|
+
- **`npm/rules/security/{security.mdc,auto.md,fix/gitleaks/check.mjs,policy/package_json/{package_json.rego,target.json,package_json_test.rego}}`** — повна структура правила за зразком `image-compress` (Rego per-document валідація + JS-частина для FS). 9 rego-тестів + 5 JS-тестів.
|
|
41
|
+
- **`npm/scripts/auto-rules.mjs`** — `'security'` додано в `AUTO_RULE_ORDER` (alphabetical, між `rego` і `style-lint`) і викликається `addRule('security')` без умови. `auto-rules.test.mjs` оновлено.
|
|
42
|
+
|
|
43
|
+
### Motivation
|
|
44
|
+
|
|
45
|
+
Команда вже виявляла секрети у public-репо вручну (gitleaks локально + GitHub Push Protection); правило виносить інструмент у канонічний `bun run lint`, щоб витоки ловилися ще до push. Default-on, бо «опт-ін на secret-scanning» — це anti-pattern: репо, що не вмикав security вручну, найімовірніше і є той, що зливає секрети.
|
|
46
|
+
|
|
47
|
+
## [1.11.17] - 2026-05-16
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- **`npm/rules/js-run/fix/runtime/check-fixture.test.mjs`** — фікстури двох тестів («0, якщо `import { SQL } from 'bun'` у `src/conn/`» і «враховує `package.json#imports['#conn/*']`») приведено у відповідність до канону `js-run`: іменування файлу `pg.js` → `pg-write.js` (шаблон `pg-{read|write}[-<id>]`) та іменований експорт `db` → `pgWrite` (camelCase від basename). Раніше фікстури використовували старий формат і check.mjs справедливо повертав `1`, через що очікування `toBe(0)` падало. Решта тестів conn-канону (`mssql-write.js`/`mssqlWrite` happy-path, `mssqlWriter` negative-path) у тому ж файлі вже були канонічними — їх не торкаюся.
|
|
52
|
+
|
|
53
|
+
### Removed
|
|
54
|
+
|
|
55
|
+
- **`npm/package.json#devDependencies`** — повторно видалено `@nitra/cursor: ^1.11.16` self-reference, який повернувся в коміті `8ae6e9e auto adr` (автоматичний stop-hook fix). Той самий блок уже прибирали в `1.11.14` (див. запис нижче) — потрапив назад через автофікс. `npx @nitra/cursor check npm-module` знову зелений.
|
|
56
|
+
|
|
7
57
|
## [1.11.16] - 2026-05-16
|
|
8
58
|
|
|
9
59
|
### Changed
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nitra/cursor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.0",
|
|
4
4
|
"description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -52,8 +52,5 @@
|
|
|
52
52
|
"engines": {
|
|
53
53
|
"bun": ">=1.3",
|
|
54
54
|
"node": ">=25"
|
|
55
|
-
},
|
|
56
|
-
"devDependencies": {
|
|
57
|
-
"@nitra/cursor": "^1.11.16"
|
|
58
55
|
}
|
|
59
56
|
}
|
package/rules/bun/bun.mdc
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Bun як єдиний package manager у монорепо
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
globs: "**/package.json,**/bunfig.toml,**/bun.lock,**/bun.lockb"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
version: '1.8'
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
Проект використовує тільки Bun для керування залежностями та запуску скриптів.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Перевірка JavaScript коду
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
globs: "**/{.oxlintrc.json,eslint.config.js,.jscpd.json,knip.json,package.json},**/*.{js,mjs,cjs,jsx,ts,tsx}"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
version: '1.22'
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
**oxlint**, **ESLint**, **jscpd**, **knip**. У скрипті **`lint-js`** і в CI — **`bunx oxlint`**, **`bunx eslint`**, **`bunx jscpd`**, **`bunx knip`** (у CI без **`--fix`** для oxlint/eslint — див. приклад workflow нижче). Без **prettier** і **@nitra/prettier-config**. У **`devDependencies`** має бути **`@nitra/eslint-config` мінімум `^3.9.2`** (з **3.8.0** правило `no-restricted-syntax` забороняє `for...in`; з **3.9.2** у `getConfig` вбудовано ignore для **`**/adr/**`** — ADR-документи не валідуються ESLint, локально цей glob додавати не потрібно; також транзитивно йде **`@e18e/eslint-plugin`** для oxlint); пакет **`@e18e/eslint-plugin`** окремо не додавай. Пакети oxlint/eslint/jscpd/knip не додавай без потреби монорепо.
|
package/rules/js-run/js-run.mdc
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Це правила для backend проектів на JavaScript/Node.js, сюди входять і job і WEB сервери.
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
globs: "**/package.json,**/jsconfig.json,**/src/**/*.{js,mjs,cjs,ts,tsx}"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
version: '1.8'
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
## Область застосування
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Оформлення репозиторію для npm модуля
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
globs: "npm/**,**/package.json,**/hk.pkl,.github/workflows/npm-publish.yml,**/tsconfig*.json"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
version: '1.13'
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
Bun monorepo: workspace **`npm/`**, кореневий **`package.json`**, **`.github/workflows/`**; опційно **`demo/`**.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
завжди
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FS-частина правила `security` (security.mdc).
|
|
3
|
+
*
|
|
4
|
+
* **Що тут лишилося** (FS / cross-file):
|
|
5
|
+
* - наявність `package.json` у корені (структуру валідує Rego);
|
|
6
|
+
* - наявність `.gitleaks.toml` у корені — нагадування створити з канону `security.mdc`;
|
|
7
|
+
* - `.gitleaks.toml` має `useDefault = true` у блоці `[extend]` (інакше дефолтні правила
|
|
8
|
+
* gitleaks перетираються і скан стає сліпим до 95% типових витоків).
|
|
9
|
+
*
|
|
10
|
+
* **Що покрила Rego** (`npx \@nitra/cursor check`, `npm/policy/security/package_json/`):
|
|
11
|
+
* - `scripts.lint-security` існує і викликає `gitleaks` з `detect`/`git` subcommand;
|
|
12
|
+
* - агрегований `scripts.lint` (якщо є) містить `bun run lint-security`;
|
|
13
|
+
* - `gitleaks` НЕ у `dependencies` / `devDependencies` (бо це глобальний CLI).
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync } from 'node:fs'
|
|
16
|
+
import { readFile } from 'node:fs/promises'
|
|
17
|
+
|
|
18
|
+
import { createCheckReporter } from '../../../../scripts/utils/check-reporter.mjs'
|
|
19
|
+
|
|
20
|
+
const GITLEAKS_CONFIG = '.gitleaks.toml'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Перевіряє наявність `.gitleaks.toml` у корені та канонічну вимогу `useDefault = true`
|
|
24
|
+
* у блоці `[extend]`. Користувач сам наповнює `[allowlist]` локальними патернами.
|
|
25
|
+
* @param {(msg: string) => void} pass callback при успішній перевірці
|
|
26
|
+
* @param {(msg: string) => void} fail callback при помилці
|
|
27
|
+
* @returns {Promise<void>}
|
|
28
|
+
*/
|
|
29
|
+
async function checkGitleaksConfig(pass, fail) {
|
|
30
|
+
if (!existsSync(GITLEAKS_CONFIG)) {
|
|
31
|
+
fail(`${GITLEAKS_CONFIG} не знайдено в корені — створи за каноном security.mdc (useDefault = true + [allowlist])`)
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
const raw = await readFile(GITLEAKS_CONFIG, 'utf8')
|
|
35
|
+
if (!/useDefault\s*=\s*true/u.test(raw)) {
|
|
36
|
+
fail(
|
|
37
|
+
`${GITLEAKS_CONFIG}: відсутнє \`useDefault = true\` у блоці [extend] — без нього вбудовані ` +
|
|
38
|
+
'gitleaks-правила перетираються і скан стає сліпим (security.mdc)'
|
|
39
|
+
)
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
pass(`${GITLEAKS_CONFIG} існує і успадковує дефолтні gitleaks-правила (useDefault = true)`)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Запускає всі FS-перевірки правила security.
|
|
47
|
+
* @returns {Promise<number>} 0 — все OK, 1 — є зауваження
|
|
48
|
+
*/
|
|
49
|
+
export async function check() {
|
|
50
|
+
const reporter = createCheckReporter()
|
|
51
|
+
const { pass, fail } = reporter
|
|
52
|
+
|
|
53
|
+
if (!existsSync('package.json')) {
|
|
54
|
+
fail('package.json не знайдено в корені — додай (security.mdc)')
|
|
55
|
+
return reporter.getExitCode()
|
|
56
|
+
}
|
|
57
|
+
pass('package.json є (структуру перевіряє npx @nitra/cursor check → security.package_json)')
|
|
58
|
+
|
|
59
|
+
await checkGitleaksConfig(pass, fail)
|
|
60
|
+
|
|
61
|
+
return reporter.getExitCode()
|
|
62
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Перевірка `package.json` для правила security (security.mdc).
|
|
2
|
+
#
|
|
3
|
+
# Запуск (локально):
|
|
4
|
+
# conftest test package.json -p npm/policy/security \
|
|
5
|
+
# --namespace security.package_json
|
|
6
|
+
#
|
|
7
|
+
# Перевіряє: наявність `scripts.lint-security`, виклик `gitleaks detect`,
|
|
8
|
+
# входження `bun run lint-security` у агрегований `scripts.lint` (якщо `lint` є),
|
|
9
|
+
# та заборону `gitleaks` у dependencies/devDependencies (інструмент глобальний).
|
|
10
|
+
#
|
|
11
|
+
# FS-перевірки (наявність `.gitleaks.toml`, `useDefault = true`) — у JS.
|
|
12
|
+
#
|
|
13
|
+
# Структура каталогу збігається зі шляхом пакету (regal: directory-package-mismatch).
|
|
14
|
+
# Конвенція проєкту — `import rego.v1` + multi-value `deny contains msg if { … }`
|
|
15
|
+
# (.cursor/rules/conftest.mdc). Лінт — `bun run lint-rego` (regal).
|
|
16
|
+
package security.package_json
|
|
17
|
+
|
|
18
|
+
import rego.v1
|
|
19
|
+
|
|
20
|
+
gitleaks_pkg := "gitleaks"
|
|
21
|
+
|
|
22
|
+
dep_template := concat(" ", [
|
|
23
|
+
"package.json: %q не повинен бути в %s —",
|
|
24
|
+
"gitleaks встановлюється глобально (security.mdc)",
|
|
25
|
+
])
|
|
26
|
+
|
|
27
|
+
# ── deny: scripts.lint-security ──────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
deny contains msg if {
|
|
30
|
+
scripts := object.get(input, "scripts", {})
|
|
31
|
+
not "lint-security" in object.keys(scripts)
|
|
32
|
+
msg := "package.json: відсутній scripts.lint-security — додай `gitleaks detect --no-banner` (security.mdc)"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
deny contains msg if {
|
|
36
|
+
lint_security := object.get(object.get(input, "scripts", {}), "lint-security", "")
|
|
37
|
+
lint_security != ""
|
|
38
|
+
not contains(lint_security, "gitleaks")
|
|
39
|
+
msg := "package.json: lint-security має викликати `gitleaks` (security.mdc)"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
deny contains msg if {
|
|
43
|
+
lint_security := object.get(object.get(input, "scripts", {}), "lint-security", "")
|
|
44
|
+
contains(lint_security, "gitleaks")
|
|
45
|
+
not has_detect_or_git_subcommand(lint_security)
|
|
46
|
+
msg := "package.json: lint-security має містити `detect` або `git` як gitleaks-subcommand (security.mdc)"
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# ── deny: агрегований `lint` має кликати `bun run lint-security` ─────────
|
|
50
|
+
|
|
51
|
+
deny contains msg if {
|
|
52
|
+
"lint-security" in object.keys(object.get(input, "scripts", {}))
|
|
53
|
+
lint := object.get(object.get(input, "scripts", {}), "lint", "")
|
|
54
|
+
lint != ""
|
|
55
|
+
not contains(lint, "bun run lint-security")
|
|
56
|
+
msg := "package.json: агрегований `lint` має містити `bun run lint-security` (security.mdc)"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# ── deny: `gitleaks` НЕ в dependencies/devDependencies ───────────────────
|
|
60
|
+
|
|
61
|
+
deny contains msg if {
|
|
62
|
+
gitleaks_pkg in object.keys(object.get(input, "dependencies", {}))
|
|
63
|
+
msg := sprintf(dep_template, [gitleaks_pkg, "dependencies"])
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
deny contains msg if {
|
|
67
|
+
gitleaks_pkg in object.keys(object.get(input, "devDependencies", {}))
|
|
68
|
+
msg := sprintf(dep_template, [gitleaks_pkg, "devDependencies"])
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
# ── helpers ──────────────────────────────────────────────────────────────
|
|
72
|
+
|
|
73
|
+
# Чи містить рядок subcommand `detect` або `git` (як слово, не як підрядок випадкового шляху).
|
|
74
|
+
# `gitleaks detect ...`, `gitleaks git --no-banner`, `gitleaks detect --source=.` — усі OK.
|
|
75
|
+
has_detect_or_git_subcommand(s) if regex.match(`\bgitleaks\s+(detect|git)\b`, s)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Локальний та CI-секюріті-лінт через gitleaks — скрипт `lint-security`, `.gitleaks.toml`, інтеграція в агрегований `lint`
|
|
3
|
+
globs: "**/.gitleaks.toml,**/package.json,**/.github/workflows/**/*.yml"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
version: '1.1'
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
[gitleaks](https://github.com/gitleaks/gitleaks) — глобальний CLI (як `shellcheck`, `conftest`); **не** додавай до `dependencies`/`devDependencies`.
|
|
9
|
+
|
|
10
|
+
## Канон `package.json#scripts`
|
|
11
|
+
|
|
12
|
+
```json title="package.json"
|
|
13
|
+
{
|
|
14
|
+
"scripts": {
|
|
15
|
+
"lint-security": "gitleaks detect --no-banner",
|
|
16
|
+
"lint": "bun run lint-rego && bun run lint-js && bun run lint-text && bun run lint-security && oxfmt ."
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- `gitleaks detect` — сканує робоче дерево (uncommitted + tracked); швидше і безпечніше для частого `bun run lint`, ніж `gitleaks git`.
|
|
22
|
+
- `--no-banner` — прибирає ASCII-арт (CI-friendly).
|
|
23
|
+
- Позиція в `lint`: за конвенцією після інших `lint-*` і перед `oxfmt`.
|
|
24
|
+
|
|
25
|
+
## `.gitleaks.toml` (рекомендована основа)
|
|
26
|
+
|
|
27
|
+
```toml title=".gitleaks.toml"
|
|
28
|
+
title = "Project gitleaks config"
|
|
29
|
+
|
|
30
|
+
[extend]
|
|
31
|
+
useDefault = true
|
|
32
|
+
|
|
33
|
+
[allowlist]
|
|
34
|
+
description = "Файли й шляхи, які навмисно містять test-фікстури з паттернами секретів."
|
|
35
|
+
paths = [
|
|
36
|
+
'''(^|/)node_modules(/|$)''',
|
|
37
|
+
'''(^|/)\.git(/|$)''',
|
|
38
|
+
'''(^|/)dist(/|$)''',
|
|
39
|
+
'''(^|/)build(/|$)''',
|
|
40
|
+
'''.*\.lock$''',
|
|
41
|
+
'''.*fixtures?/.*'''
|
|
42
|
+
]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`useDefault = true` — НЕ перетирай дефолтний `rules`-масив; реальні винятки лише через `[allowlist]`.
|
|
46
|
+
|
|
47
|
+
## GitHub Actions (опційно)
|
|
48
|
+
|
|
49
|
+
Окремий workflow не обовʼязковий — `lint-security` уже виконується через агрегований `lint`. Для fast-feedback окремо:
|
|
50
|
+
|
|
51
|
+
```yaml title=".github/workflows/lint-security.yml"
|
|
52
|
+
name: Lint Security
|
|
53
|
+
|
|
54
|
+
on:
|
|
55
|
+
push:
|
|
56
|
+
branches: [dev, main]
|
|
57
|
+
pull_request:
|
|
58
|
+
branches: [dev, main]
|
|
59
|
+
|
|
60
|
+
concurrency:
|
|
61
|
+
group: ${{ github.ref }}-${{ github.workflow }}
|
|
62
|
+
cancel-in-progress: true
|
|
63
|
+
|
|
64
|
+
jobs:
|
|
65
|
+
security:
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
permissions:
|
|
68
|
+
contents: read
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@v6
|
|
71
|
+
with:
|
|
72
|
+
persist-credentials: false
|
|
73
|
+
fetch-depth: 0
|
|
74
|
+
- uses: gitleaks/gitleaks-action@v2
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Для повного скану git-історії потрібен `fetch-depth: 0`.
|
package/rules/tauri/tauri.mdc
CHANGED
package/scripts/auto-rules.mjs
CHANGED
|
@@ -47,6 +47,7 @@ export const AUTO_RULE_ORDER = Object.freeze([
|
|
|
47
47
|
'npm-module',
|
|
48
48
|
'php',
|
|
49
49
|
'rego',
|
|
50
|
+
'security',
|
|
50
51
|
'style-lint',
|
|
51
52
|
'text',
|
|
52
53
|
'vue'
|
|
@@ -659,6 +660,7 @@ export async function detectAutoRules({
|
|
|
659
660
|
}
|
|
660
661
|
}
|
|
661
662
|
addRule('adr')
|
|
663
|
+
addRule('security')
|
|
662
664
|
addRule('text')
|
|
663
665
|
if (facts.hasVueSource) {
|
|
664
666
|
addRule('vue')
|