@nitra/cursor 1.9.8 → 1.9.9
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 +9 -2
- package/mdc/js-lint.mdc +1 -1
- package/package.json +1 -1
- package/policy/ga/workflow_common/workflow_common.rego +6 -1
- package/scripts/build-agents-commands.mjs +2 -1
- package/scripts/check-ga.mjs +0 -1
- package/scripts/check-npm-module.mjs +4 -0
- package/scripts/claude-stop-hook.mjs +1 -1
- package/scripts/lint-ga.mjs +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,11 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
|
|
6
6
|
|
|
7
|
+
## [1.9.9] - 2026-05-13
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **AGENTS.md — додано `bunx knip` до секції Commands:** `build-agents-commands.mjs` тепер завжди додає рядок `- **knip (невикористані залежності та експорти)**: \`bunx knip\``після`npx @nitra/cursor check`; оновлено тест (`items.length`3 → 4, перевірка`toContain('bunx knip')`).
|
|
12
|
+
- **`knip.json` — `graphql` у `ignoreDependencies`:** повернуто `graphql` до кореневого `ignoreDependencies` (peer-залежність, яку knip фолсово репортить як unused; вимога `js-lint.mdc` / `check-js-lint.mjs`).
|
|
13
|
+
|
|
7
14
|
## [1.9.8] - 2026-05-12
|
|
8
15
|
|
|
9
16
|
### Changed
|
|
10
17
|
|
|
11
|
-
- **Корінь монорепо:**
|
|
18
|
+
- **Корінь монорепо:** локальне перевизначення `sonarjs/cognitive-complexity` у `eslint.config.js` прибрано — поріг і severity задаються в `@nitra/eslint-config`.
|
|
12
19
|
|
|
13
20
|
## [1.9.7] - 2026-05-12
|
|
14
21
|
|
|
@@ -18,7 +25,7 @@
|
|
|
18
25
|
|
|
19
26
|
- **ga (mdc v1.8 → v1.9) — заборона `depcheck` у workflow-файлах:** додано полісі `ga.workflow_common.deny` на будь-який виклик `depcheck` (через `npx`/`bunx`/`npm exec`/`pnpm exec` чи як standalone-команду) у `run:` кроку `.github/workflows/*.yml`. Перевірка невикористаних залежностей виконується разом з рештою лінтерів у `bun run lint-js` (`bunx knip`), окремий depcheck-крок у workflow зайвий. У `npm/mdc/ga.mdc` додано буліт «`depcheck`: не використовувати» з посиланням на `js-lint.mdc` і `ga.workflow_common`.
|
|
20
27
|
|
|
21
|
-
- **ci (тільки в цьому репо) — lint-ga встановлює conftest; knip.json налаштовано під монорепо:** `.github/workflows/lint-ga.yml` отримав крок `Install conftest` (curl
|
|
28
|
+
- **ci (тільки в цьому репо) — lint-ga встановлює conftest; knip.json налаштовано під монорепо:** `.github/workflows/lint-ga.yml` отримав крок `Install conftest` (curl-витяг релізу), бо `check-ga.mjs::runAllGaRego` ходить у `runConftestBatch` і hard-fail без бінарника. Кореневий `knip.json` розширено `workspaces.npm.entry` (всі CLI/scripts/tests як entry points — інакше knip false-positive репортить їх як unused), `ignoreBinaries` для `cspell`/`oxfmt`/`stylelint`/`vite` (всі через `bunx`/`npx`, не з deps), і `ignoreDependencies` для workspace self-refs. Це налаштування специфічне для цього репо; інші проєкти налаштовують `knip.json` під свою структуру.
|
|
22
29
|
|
|
23
30
|
### Removed
|
|
24
31
|
|
package/mdc/js-lint.mdc
CHANGED
package/package.json
CHANGED
|
@@ -55,6 +55,11 @@ setup_bun_no_checkout_template := concat(" ", [
|
|
|
55
55
|
"інакше runner не знайде action.yml (ga.mdc)",
|
|
56
56
|
])
|
|
57
57
|
|
|
58
|
+
forbidden_run_command_template := concat(" ", [
|
|
59
|
+
"jobs.%s.steps[%d]: `%s` заборонено у workflow —",
|
|
60
|
+
"мігровано на knip (js-lint.mdc, ga.mdc)",
|
|
61
|
+
])
|
|
62
|
+
|
|
58
63
|
# ── Аліаси на input ────────────────────────────────────────────────────────
|
|
59
64
|
|
|
60
65
|
# Усі jobs (з гарантією, що це обʼєкт) — щоб не падати на нетипових YAML.
|
|
@@ -88,7 +93,7 @@ deny contains msg if {
|
|
|
88
93
|
some entry in all_flat_steps
|
|
89
94
|
some name, pattern in forbidden_run_command_patterns
|
|
90
95
|
regex.match(pattern, step_run_text(entry.step))
|
|
91
|
-
msg := sprintf(
|
|
96
|
+
msg := sprintf(forbidden_run_command_template, [entry.job_id, entry.step_index, name])
|
|
92
97
|
}
|
|
93
98
|
|
|
94
99
|
# ── deny: shell-продовження `\` перед переносом рядка у `run:` ─────────────
|
|
@@ -81,7 +81,8 @@ export async function buildAgentsCommandBulletItems(projectRoot) {
|
|
|
81
81
|
{
|
|
82
82
|
name: `- **Оновити правила та ${AGENTS_MD}** (після змін у правилах/шаблоні CLI): \`npx ${PACKAGE_NAME}\``
|
|
83
83
|
},
|
|
84
|
-
{ name: `- **Перевірки правил (programmatic)**: \`npx ${PACKAGE_NAME} check\`` }
|
|
84
|
+
{ name: `- **Перевірки правил (programmatic)**: \`npx ${PACKAGE_NAME} check\`` },
|
|
85
|
+
{ name: `- **knip (невикористані залежності та експорти)**: \`bunx knip\`` }
|
|
85
86
|
)
|
|
86
87
|
|
|
87
88
|
return items
|
package/scripts/check-ga.mjs
CHANGED
|
@@ -48,7 +48,6 @@ function gitHasAnyTrackedFileMatchingGlob(globPattern) {
|
|
|
48
48
|
if (!p) return false
|
|
49
49
|
if (p.startsWith('!')) return true
|
|
50
50
|
try {
|
|
51
|
-
// eslint-disable-next-line sonarjs/no-os-command-from-path -- git як стандартне dev-середовище через PATH; альтернативи (хардкод шляху) непортативні
|
|
52
51
|
const out = execFileSync('git', ['ls-files', '-z', '--', `:(glob)${p}`], { encoding: 'utf8' })
|
|
53
52
|
return out.length > 0
|
|
54
53
|
} catch {
|
|
@@ -366,6 +366,10 @@ export function globToRegex(glob) {
|
|
|
366
366
|
re = re.replace(GLOBSTAR_LEADING_RE, '(?:.*/)?')
|
|
367
367
|
re = re.replace(GLOBSTAR_TRAILING_RE, '(?:/.*)?')
|
|
368
368
|
re = re.replaceAll('__GLOBSTAR__', '.*')
|
|
369
|
+
// Дозволено: уся функція існує саме для конструкції RegExp з glob-pattern
|
|
370
|
+
// у `files` (значення з npm/package.json, не від кінцевого користувача), і
|
|
371
|
+
// спецсимволи вже екрановано через `REGEX_SPECIAL_IN_GLOB` вище.
|
|
372
|
+
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
369
373
|
return new RegExp(`^${re}$`, 'u')
|
|
370
374
|
}
|
|
371
375
|
|
|
@@ -62,7 +62,7 @@ export async function runStopHookCli() {
|
|
|
62
62
|
if (isRecursiveStopHookCall(stdin)) {
|
|
63
63
|
return 0
|
|
64
64
|
}
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
const child = spawn('npx', ['--no', '@nitra/cursor', 'check'], { stdio: 'inherit' })
|
|
67
67
|
try {
|
|
68
68
|
const [code] = await once(child, 'exit')
|
package/scripts/lint-ga.mjs
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* `check-ga.mjs::check()` як перший крок — `lint-ga.mjs` про це не знає. Раніше `lint-ga.mjs` сам
|
|
9
9
|
* спавнив conftest для `ga.<name>` per-workflow і `ga.workflow_common` (PoC); тепер ця логіка
|
|
10
10
|
* централізована у `check-ga.mjs`, тож одне джерело істини, без дублювання між
|
|
11
|
-
* `lint-ga` і `npx
|
|
11
|
+
* `lint-ga` і `npx \@nitra/cursor check ga`.
|
|
12
12
|
*
|
|
13
13
|
* Без preflight `actionlint` (через `bunx github-actionlint`) мовчки пропускає shell-перевірки в
|
|
14
14
|
* `run:` блоках, коли `shellcheck` відсутній у PATH; локально `bun lint-ga` лишається зеленим, а CI
|
|
@@ -143,7 +143,7 @@ function runStep(title, cmd, args) {
|
|
|
143
143
|
* 2) `bunx github-actionlint`;
|
|
144
144
|
* 3) `uvx zizmor --offline --collect=workflows .`;
|
|
145
145
|
* 4) `check-ga.mjs::check()` — Rego-полісі (батч conftest з `npm/policy/ga/`) + JS cross-file
|
|
146
|
-
* перевірки правил `ga.mdc`. Це **те саме**, що робить `npx
|
|
146
|
+
* перевірки правил `ga.mdc`. Це **те саме**, що робить `npx \@nitra/cursor check ga`, тож
|
|
147
147
|
* `lint-ga` тепер є суперсетом перевірки правила: external-tools + check.
|
|
148
148
|
*
|
|
149
149
|
* Якщо хоча б один preflight не пройшов — виходимо одразу з кодом 1, **до** запуску actionlint/zizmor,
|