@nitra/cursor 1.38.0 → 1.39.1
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 +13 -0
- package/package.json +1 -1
- package/rules/abie/meta.json +1 -0
- package/rules/adr/meta.json +1 -0
- package/rules/bun/meta.json +1 -0
- package/rules/capacitor/meta.json +1 -0
- package/rules/changelog/meta.json +1 -0
- package/rules/ci4/meta.json +1 -0
- package/rules/docker/meta.json +1 -0
- package/rules/efes/meta.json +1 -0
- package/rules/feedback/meta.json +1 -0
- package/rules/ga/meta.json +1 -0
- package/rules/graphql/meta.json +1 -0
- package/rules/hasura/meta.json +1 -0
- package/rules/image-avif/meta.json +1 -0
- package/rules/image-compress/meta.json +1 -0
- package/rules/js-bun-db/meta.json +1 -0
- package/rules/js-bun-redis/meta.json +1 -0
- package/rules/js-lint/meta.json +1 -0
- package/rules/js-mssql/meta.json +1 -0
- package/rules/js-run/meta.json +1 -0
- package/rules/k8s/meta.json +1 -0
- package/rules/nginx-default-tpl/meta.json +1 -0
- package/rules/npm-module/js/rule_meta.mjs +63 -0
- package/rules/npm-module/meta.json +1 -0
- package/rules/php/meta.json +1 -0
- package/rules/rego/meta.json +1 -0
- package/rules/release/meta.json +1 -0
- package/rules/rust/meta.json +1 -0
- package/rules/security/meta.json +1 -0
- package/rules/style-lint/meta.json +1 -0
- package/rules/tauri/meta.json +1 -0
- package/rules/test/meta.json +1 -0
- package/rules/text/meta.json +1 -0
- package/rules/vue/meta.json +1 -0
- package/rules/worktree/fix.mjs +19 -0
- package/rules/worktree/meta.json +1 -0
- package/rules/worktree/worktree.mdc +14 -0
- package/schemas/rule-meta.json +39 -0
- package/schemas/v8r-catalog.json +5 -0
- package/scripts/auto-rules.mjs +151 -449
- package/scripts/lib/rule-meta-helpers.mjs +103 -0
- package/scripts/lib/rule-meta.mjs +66 -0
- package/scripts/lib/rule-predicates.mjs +147 -0
- package/skills/worktree/meta.json +1 -1
- package/rules/abie/auto.md +0 -1
- package/rules/adr/auto.md +0 -1
- package/rules/bun/auto.md +0 -1
- package/rules/capacitor/auto.md +0 -1
- package/rules/changelog/auto.md +0 -1
- package/rules/docker/auto.md +0 -1
- package/rules/efes/auto.md +0 -1
- package/rules/ga/auto.md +0 -1
- package/rules/graphql/auto.md +0 -1
- package/rules/hasura/auto.md +0 -1
- package/rules/image-avif/auto.md +0 -1
- package/rules/image-compress/auto.md +0 -1
- package/rules/js-bun-db/auto.md +0 -1
- package/rules/js-bun-redis/auto.md +0 -1
- package/rules/js-lint/auto.md +0 -1
- package/rules/js-mssql/auto.md +0 -1
- package/rules/js-run/auto.md +0 -1
- package/rules/k8s/auto.md +0 -1
- package/rules/nginx-default-tpl/auto.md +0 -1
- package/rules/npm-module/auto.md +0 -1
- package/rules/php/auto.md +0 -1
- package/rules/rego/auto.md +0 -1
- package/rules/rust/auto.md +0 -1
- package/rules/security/auto.md +0 -1
- package/rules/style-lint/auto.md +0 -1
- package/rules/tauri/auto.md +0 -1
- package/rules/test/auto.md +0 -1
- package/rules/text/auto.md +0 -1
- package/rules/vue/auto.md +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.39.1] - 2026-05-31
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- worktree rule: при завершенні гілки worktree за замовчуванням пропонувати squash-merge (один коміт)
|
|
8
|
+
|
|
9
|
+
## [1.39.0] - 2026-05-31
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- worktree skill: додати auto завжди до meta.json
|
|
14
|
+
- rules: автодетект перенесено з хардкоду auto-rules.mjs + auto.md на data-driven meta.json (glob/predicate/deps); увімкнено автодетект tauri
|
|
15
|
+
|
|
3
16
|
## [1.38.0] - 2026-05-31
|
|
4
17
|
|
|
5
18
|
### Added
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "repoUrlMarker", "arg": "https://github.com/abinbevefes/" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": "завжди" }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": "package.json" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": "**/capacitor.config.json" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": ["bun"] }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": ["**/Dockerfile", "**/Dockerfile.*"] } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "repoUrlMarker", "arg": "https://github.com/efes-cloud/" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": ".github/workflows/**" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "gqlTaggedTemplate" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "hasuraConfigMarker" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": ["vue", "image-compress"] }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": ["bun"] }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "jsBunDbSignal" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "depInAnyPackageJson", "arg": ["ioredis", "node-redis"] } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": ["**/*.mjs", "**/*.cjs", "**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "depInAnyPackageJson", "arg": ["mssql"] } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "nestedPackageWithoutVite" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": "**/k8s/**" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": ["**/default.conf.template", "**/default.conf", "**/nginx.conf"] } }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Перевірка метаданих правил пакета `@nitra/cursor` (концерн правила npm-module).
|
|
3
|
+
*
|
|
4
|
+
* Кожен `npm/rules/<id>/` має містити валідний `meta.json`:
|
|
5
|
+
* - `auto` (якщо присутнє) — розпізнане `parseRuleAutoSpec` (завжди / масив / glob / predicate);
|
|
6
|
+
* - для `predicate` — імʼя є в реєстрі `RULE_PREDICATES`;
|
|
7
|
+
* - залишковий `auto.md` заборонено (міграція на meta.json завершена).
|
|
8
|
+
*
|
|
9
|
+
* Застосовний лише в репо пакета (де є `npm/rules/`); у споживача каталогу нема — пропуск.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readdirSync } from 'node:fs'
|
|
12
|
+
import { join } from 'node:path'
|
|
13
|
+
|
|
14
|
+
import { createCheckReporter } from '../../../scripts/lib/check-reporter.mjs'
|
|
15
|
+
import { parseRuleAutoSpec, readRuleMetaRaw } from '../../../scripts/lib/rule-meta.mjs'
|
|
16
|
+
import { RULE_PREDICATES } from '../../../scripts/lib/rule-predicates.mjs'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Валідує всі `npm/rules/<id>/meta.json`.
|
|
20
|
+
* @param {string} [cwd] корінь репозиторію
|
|
21
|
+
* @returns {Promise<number>} 0 — OK, 1 — порушення
|
|
22
|
+
*/
|
|
23
|
+
export function check(cwd = process.cwd()) {
|
|
24
|
+
const reporter = createCheckReporter()
|
|
25
|
+
const rulesDir = join(cwd, 'npm', 'rules')
|
|
26
|
+
if (!existsSync(rulesDir)) {
|
|
27
|
+
reporter.pass('npm/rules/ відсутній — немає правил для валідації')
|
|
28
|
+
return Promise.resolve(reporter.getExitCode())
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
for (const entry of readdirSync(rulesDir, { withFileTypes: true })) {
|
|
32
|
+
if (!entry.isDirectory() || entry.name.startsWith('.')) continue
|
|
33
|
+
const id = entry.name
|
|
34
|
+
const ruleDir = join(rulesDir, id)
|
|
35
|
+
let ruleOk = true
|
|
36
|
+
|
|
37
|
+
if (existsSync(join(ruleDir, 'auto.md'))) {
|
|
38
|
+
reporter.fail(`rules/${id}: залишковий auto.md — видали (метадані тепер у meta.json)`)
|
|
39
|
+
ruleOk = false
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const raw = readRuleMetaRaw(ruleDir)
|
|
43
|
+
if (!raw) {
|
|
44
|
+
reporter.fail(`rules/${id}: відсутній або невалідний meta.json`)
|
|
45
|
+
continue
|
|
46
|
+
}
|
|
47
|
+
if (raw.auto !== undefined) {
|
|
48
|
+
const spec = parseRuleAutoSpec(raw.auto)
|
|
49
|
+
if (spec === null) {
|
|
50
|
+
reporter.fail(`rules/${id}: meta.json.auto нерозпізнане (очікується "завжди" / масив / {glob} / {predicate})`)
|
|
51
|
+
ruleOk = false
|
|
52
|
+
} else if ('predicate' in spec && !Object.hasOwn(RULE_PREDICATES, spec.predicate)) {
|
|
53
|
+
reporter.fail(`rules/${id}: невідомий predicate "${spec.predicate}" (немає в RULE_PREDICATES)`)
|
|
54
|
+
ruleOk = false
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (ruleOk) {
|
|
58
|
+
reporter.pass(`rules/${id}: meta.json валідний`)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return Promise.resolve(reporter.getExitCode())
|
|
63
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": "npm/**" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": "composer.json" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": "**/*.rego" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": "**/Cargo.toml" } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": "завжди" }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": ["**/*.css", "**/*.vue"] } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "predicate": "depInAnyPackageJson", "arg": ["@tauri-apps/api"] } }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": "завжди" }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": "завжди" }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "auto": { "glob": "**/*.vue" } }
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
// eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
|
+
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -27,6 +27,20 @@ Git-гілка лишається з оригінальним імʼям (`feat/
|
|
|
27
27
|
- **Прибрати**: `npx @nitra/cursor worktree remove <branch> [--force]`
|
|
28
28
|
- **Прибрати осиротілі**: `npx @nitra/cursor worktree prune`
|
|
29
29
|
|
|
30
|
+
## Завершення гілки worktree
|
|
31
|
+
|
|
32
|
+
Коли робота у worktree завершена і її треба влити в базову гілку — **за замовчуванням пропонуй
|
|
33
|
+
squash-merge** (уся гілка одним комітом), а не fast-forward чи merge-комітом. Worktree — це одна
|
|
34
|
+
логічна задача, тож в історії базової гілки їй відповідає **один** коміт; проміжні TDD-коміти
|
|
35
|
+
(«додав парсер», «видалив auto.md» тощо) у базовій гілці не потрібні. Реліз і `CHANGELOG`
|
|
36
|
+
агрегуються за change-файлом, не за кількістю комітів, тож squash нічого не ламає.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
git checkout <base> && git merge --squash <branch> && git commit
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Якщо користувач явно просить зберегти поетапну історію — лише тоді fast-forward / merge-коміт.
|
|
43
|
+
|
|
30
44
|
## Заборони
|
|
31
45
|
|
|
32
46
|
- Не клади worktree в `.claude/worktrees/` — це приватна директорія харнесу Claude Code.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://unpkg.com/@nitra/cursor/schemas/rule-meta.json",
|
|
4
|
+
"title": "n-cursor rule meta",
|
|
5
|
+
"description": "Метадані правила @nitra/cursor: умова автоактивації (auto). Файл npm/rules/<id>/meta.json.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"auto": {
|
|
10
|
+
"description": "Умова автоактивації правила: \"завжди\", масив id правил-залежностей, glob, або іменований предикат.",
|
|
11
|
+
"oneOf": [
|
|
12
|
+
{ "const": "завжди" },
|
|
13
|
+
{ "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 },
|
|
14
|
+
{
|
|
15
|
+
"type": "object",
|
|
16
|
+
"required": ["glob"],
|
|
17
|
+
"additionalProperties": false,
|
|
18
|
+
"properties": {
|
|
19
|
+
"glob": {
|
|
20
|
+
"oneOf": [
|
|
21
|
+
{ "type": "string", "minLength": 1 },
|
|
22
|
+
{ "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 }
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"type": "object",
|
|
29
|
+
"required": ["predicate"],
|
|
30
|
+
"additionalProperties": false,
|
|
31
|
+
"properties": {
|
|
32
|
+
"predicate": { "type": "string", "minLength": 1 },
|
|
33
|
+
"arg": {}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
package/schemas/v8r-catalog.json
CHANGED
|
@@ -30,6 +30,11 @@
|
|
|
30
30
|
"name": "n-cursor skill meta",
|
|
31
31
|
"fileMatch": ["npm/skills/*/meta.json"],
|
|
32
32
|
"url": "https://unpkg.com/@nitra/cursor/schemas/skill-meta.json"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "n-cursor rule meta",
|
|
36
|
+
"fileMatch": ["npm/rules/*/meta.json"],
|
|
37
|
+
"url": "https://unpkg.com/@nitra/cursor/schemas/rule-meta.json"
|
|
33
38
|
}
|
|
34
39
|
]
|
|
35
40
|
}
|