@nitra/cursor 1.13.68 → 1.13.69
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 +6 -0
- package/bin/n-cursor.js +13 -53
- package/package.json +1 -1
- package/scripts/utils/discover-check-rules-from-cursor.mjs +40 -0
- package/skills/fix/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
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.69] - 2026-05-21
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **CLI `check` без аргументів** більше не парсить `AGENTS.md` — список правил для прогону будується з **`*.mdc` у `.cursor/rules/`** (той самий дисковий індекс, що для `AGENTS.md` / `CLAUDE.md`): `n-bun.mdc` → `check bun`, ручні `conftest.mdc` тощо — за наявності programmatic check у пакеті. Явний `check bun ga` без змін. Зачеплено: [discover-check-rules-from-cursor.mjs](scripts/utils/discover-check-rules-from-cursor.mjs), [n-cursor.js](bin/n-cursor.js), [fix/SKILL.md](skills/fix/SKILL.md).
|
|
12
|
+
|
|
7
13
|
## [1.13.68] - 2026-05-21
|
|
8
14
|
|
|
9
15
|
### Changed
|
package/bin/n-cursor.js
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Використання:
|
|
7
7
|
* `npx \@nitra/cursor` — завантажити cursor-правила
|
|
8
|
-
* `npx \@nitra/cursor check` — перевірити
|
|
8
|
+
* `npx \@nitra/cursor check` — перевірити правила з `.cursor/rules/*.mdc`, для яких у пакеті є check/policy;
|
|
9
9
|
* якщо в корені вже є `.n-cursor.json`, спочатку зчитується конфіг і за потреби дописується `$schema`
|
|
10
|
-
* `npx \@nitra/cursor check bun` — перевірити лише вказані правила (ігнорує
|
|
10
|
+
* `npx \@nitra/cursor check bun` — перевірити лише вказані правила (ігнорує `.cursor/rules/`)
|
|
11
11
|
* `npx \@nitra/cursor rename-yaml-extensions` — k8s `*.yml` → `*.yaml`, `.github` `*.yaml` → `*.yml` (опції: `--dry-run`, `--root=…`; див. bin/rename-yaml-extensions.mjs)
|
|
12
12
|
* `npx \@nitra/cursor stop-hook` — точка входу Stop hook Claude Code (читає stdin, виходить 0 при `stop_hook_active`,
|
|
13
13
|
* інакше викликає `check`); прописується автоматично в `.claude/settings.json`
|
|
@@ -78,6 +78,7 @@ import {
|
|
|
78
78
|
} from '../scripts/auto-rules.mjs'
|
|
79
79
|
import { detectAutoSkills } from '../scripts/auto-skills.mjs'
|
|
80
80
|
import { runStopHookCli } from '../scripts/claude-stop-hook.mjs'
|
|
81
|
+
import { discoverCheckRulesFromCursorRules } from '../scripts/utils/discover-check-rules-from-cursor.mjs'
|
|
81
82
|
import { discoverCheckableRules } from '../scripts/utils/discover-checkable-rules.mjs'
|
|
82
83
|
import { ensureNitraCursorInRootDevDependencies } from '../scripts/ensure-nitra-cursor-dev-dependencies.mjs'
|
|
83
84
|
import { runLintDocker } from '../rules/docker/lint/lint.mjs'
|
|
@@ -978,57 +979,10 @@ function discoverCheckScripts() {
|
|
|
978
979
|
}
|
|
979
980
|
|
|
980
981
|
/**
|
|
981
|
-
*
|
|
982
|
-
* @param {string} mdcBasename наприклад n-bun.mdc або script.mdc
|
|
983
|
-
* @returns {string} id без суфікса .mdc та без префікса n- для керованих правил
|
|
984
|
-
*/
|
|
985
|
-
function mdcBasenameToCheckId(mdcBasename) {
|
|
986
|
-
const base = basename(mdcBasename)
|
|
987
|
-
const withoutExt = base.endsWith('.mdc') ? base.slice(0, -'.mdc'.length) : base
|
|
988
|
-
return withoutExt.startsWith(RULE_PREFIX) ? withoutExt.slice(RULE_PREFIX.length) : withoutExt
|
|
989
|
-
}
|
|
990
|
-
|
|
991
|
-
/**
|
|
992
|
-
* Зчитує AGENTS.md і повертає унікальні id перевірок у порядку згадування, лише ті що є в available
|
|
993
|
-
* @param {string[]} available імена з discoverCheckScripts()
|
|
994
|
-
* @returns {Promise<string[]>} унікальні id перевірок у порядку згадування в AGENTS.md
|
|
995
|
-
*/
|
|
996
|
-
async function discoverCheckRulesFromAgentsMd(available) {
|
|
997
|
-
const agentsPath = join(cwd(), AGENTS_FILE)
|
|
998
|
-
if (!existsSync(agentsPath)) {
|
|
999
|
-
throw new Error(
|
|
1000
|
-
`Немає ${AGENTS_FILE}. Запустіть \`npx ${PACKAGE_NAME}\` або вкажіть правила: \`npx ${PACKAGE_NAME} check bun ga\``
|
|
1001
|
-
)
|
|
1002
|
-
}
|
|
1003
|
-
const text = await readFile(agentsPath, 'utf8')
|
|
1004
|
-
const re = /\.cursor\/rules\/([^\s#`>]+\.mdc)/g
|
|
1005
|
-
const raw = []
|
|
1006
|
-
let m
|
|
1007
|
-
while ((m = re.exec(text)) !== null) {
|
|
1008
|
-
raw.push(m[1])
|
|
1009
|
-
}
|
|
1010
|
-
if (raw.length === 0) {
|
|
1011
|
-
throw new Error(
|
|
1012
|
-
`У ${AGENTS_FILE} немає посилань \`.cursor/rules/….mdc\`. Оновіть файл (\`npx ${PACKAGE_NAME}\`) або передайте правила явно.`
|
|
1013
|
-
)
|
|
1014
|
-
}
|
|
1015
|
-
const seen = new Set()
|
|
1016
|
-
const ordered = []
|
|
1017
|
-
for (const pathFragment of raw) {
|
|
1018
|
-
const id = mdcBasenameToCheckId(pathFragment)
|
|
1019
|
-
if (available.includes(id) && !seen.has(id)) {
|
|
1020
|
-
seen.add(id)
|
|
1021
|
-
ordered.push(id)
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
return ordered
|
|
1025
|
-
}
|
|
1026
|
-
|
|
1027
|
-
/**
|
|
1028
|
-
* Запускає перевірки: без аргументів — за списком у AGENTS.md; з аргументами — лише вказані правила.
|
|
982
|
+
* Запускає перевірки: без аргументів — за `*.mdc` у `.cursor/rules/`; з аргументами — лише вказані правила.
|
|
1029
983
|
* Делегує оркестрацію concern-ів (JS-checks + policy через `runConftestBatch`) у `runRule`;
|
|
1030
984
|
* сам `runChecks` відповідає лише за фільтр id, агрегацію exit-кодів і shared walk-cache на прогон.
|
|
1031
|
-
* @param {string[]} requestedRules імена правил; порожній масив — брати з
|
|
985
|
+
* @param {string[]} requestedRules імена правил; порожній масив — брати з `.cursor/rules/*.mdc`
|
|
1032
986
|
* @returns {Promise<void>}
|
|
1033
987
|
*/
|
|
1034
988
|
async function runChecks(requestedRules) {
|
|
@@ -1054,10 +1008,16 @@ async function runChecks(requestedRules) {
|
|
|
1054
1008
|
if (requestedRules.length > 0) {
|
|
1055
1009
|
idsToCheck = requestedRules
|
|
1056
1010
|
} else {
|
|
1057
|
-
|
|
1011
|
+
const mdcFiles = await listProjectRulesMdcFiles()
|
|
1012
|
+
if (mdcFiles.length === 0) {
|
|
1013
|
+
throw new Error(
|
|
1014
|
+
`Немає файлів *.mdc у ${RULES_DIR}/. Запустіть \`npx ${PACKAGE_NAME}\` або вкажіть правила: \`npx ${PACKAGE_NAME} check bun ga\``
|
|
1015
|
+
)
|
|
1016
|
+
}
|
|
1017
|
+
idsToCheck = discoverCheckRulesFromCursorRules(available, mdcFiles)
|
|
1058
1018
|
if (idsToCheck.length === 0) {
|
|
1059
1019
|
console.log(
|
|
1060
|
-
`\n🔍 ${PACKAGE_NAME} check — у ${
|
|
1020
|
+
`\n🔍 ${PACKAGE_NAME} check — у ${RULES_DIR}/ немає правил з programmatic перевіркою ` +
|
|
1061
1021
|
`(відповідного check-*.mjs або policy/<name>/target.json у пакеті). Нічого не запущено.\n`
|
|
1062
1022
|
)
|
|
1063
1023
|
return
|
package/package.json
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Визначає список id правил для `npx @nitra/cursor check` без аргументів:
|
|
3
|
+
* зчитує базові імена `*.mdc` у `.cursor/rules/` і залишає лише ті id,
|
|
4
|
+
* для яких у пакеті є programmatic перевірка (JS-концерн або policy з target.json).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Префікс керованих правил пакета у `.cursor/rules/`. */
|
|
8
|
+
export const MANAGED_RULE_FILE_PREFIX = 'n-'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Перетворює базове ім'я `.mdc` у id правила для `check <id>`.
|
|
12
|
+
* @param {string} mdcBasename наприклад `n-bun.mdc` або `my-rule.mdc`
|
|
13
|
+
* @returns {string} id без `.mdc`; для `n-*` — без префікса `n-`
|
|
14
|
+
*/
|
|
15
|
+
export function mdcBasenameToCheckId(mdcBasename) {
|
|
16
|
+
const base = mdcBasename.includes('/') ? mdcBasename.slice(mdcBasename.lastIndexOf('/') + 1) : mdcBasename
|
|
17
|
+
const withoutExt = base.endsWith('.mdc') ? base.slice(0, -'.mdc'.length) : base
|
|
18
|
+
return withoutExt.startsWith(MANAGED_RULE_FILE_PREFIX)
|
|
19
|
+
? withoutExt.slice(MANAGED_RULE_FILE_PREFIX.length)
|
|
20
|
+
: withoutExt
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Будує впорядкований список id перевірок за файлами правил на диску.
|
|
25
|
+
* @param {string[]} available id з `discoverCheckableRules` (алфавітний порядок пакета)
|
|
26
|
+
* @param {string[]} mdcBasenames відсортовані імена `*.mdc` з `.cursor/rules/`
|
|
27
|
+
* @returns {string[]} унікальні id у порядку `mdcBasenames`, лише присутні в `available`
|
|
28
|
+
*/
|
|
29
|
+
export function discoverCheckRulesFromCursorRules(available, mdcBasenames) {
|
|
30
|
+
const seen = new Set()
|
|
31
|
+
const ordered = []
|
|
32
|
+
for (const basename of mdcBasenames) {
|
|
33
|
+
const id = mdcBasenameToCheckId(basename)
|
|
34
|
+
if (available.includes(id) && !seen.has(id)) {
|
|
35
|
+
seen.add(id)
|
|
36
|
+
ordered.push(id)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return ordered
|
|
40
|
+
}
|
package/skills/fix/SKILL.md
CHANGED
|
@@ -12,7 +12,7 @@ description: >-
|
|
|
12
12
|
|
|
13
13
|
## Workflow
|
|
14
14
|
|
|
15
|
-
1. **Діагностика** — запусти перевірку (за замовчуванням лише правила з
|
|
15
|
+
1. **Діагностика** — запусти перевірку (за замовчуванням лише правила з `.cursor/rules/*.mdc`, для яких у пакеті є programmatic check; повний набір — явні аргументи: `npx @nitra/cursor check bun ga …`):
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
18
|
npx @nitra/cursor check
|