@nitra/cursor 1.37.0 → 1.39.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 +13 -0
- package/README.md +6 -0
- package/bin/n-cursor.js +7 -1
- 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 +34 -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/scripts/lib/worktree.mjs +73 -0
- package/scripts/worktree-cli.mjs +200 -0
- package/skills/worktree/SKILL.md +38 -0
- package/skills/worktree/meta.json +1 -0
- 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.0] - 2026-05-31
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- worktree skill: додати auto завжди до meta.json
|
|
8
|
+
- rules: автодетект перенесено з хардкоду auto-rules.mjs + auto.md на data-driven meta.json (glob/predicate/deps); увімкнено автодетект tauri
|
|
9
|
+
|
|
10
|
+
## [1.38.0] - 2026-05-31
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- worktree: кросплатформний CLI n-cursor worktree (add/remove/list/prune) — виконавець конвенції .worktrees/ з інвентарним файлом-описом; тонкий skill worktree; pure-doc правило worktree
|
|
15
|
+
|
|
3
16
|
## [1.37.0] - 2026-05-31
|
|
4
17
|
|
|
5
18
|
### Changed
|
package/README.md
CHANGED
|
@@ -68,6 +68,12 @@
|
|
|
68
68
|
npx @nitra/cursor
|
|
69
69
|
npx @nitra/cursor fix
|
|
70
70
|
npx @nitra/cursor fix bun ga
|
|
71
|
+
|
|
72
|
+
# Керування git-worktree (.worktrees/ + інвентарний файл-опис)
|
|
73
|
+
npx @nitra/cursor worktree add <branch> "<опис>"
|
|
74
|
+
npx @nitra/cursor worktree list
|
|
75
|
+
npx @nitra/cursor worktree remove <branch> [--force]
|
|
76
|
+
npx @nitra/cursor worktree prune
|
|
71
77
|
```
|
|
72
78
|
|
|
73
79
|
Команда `check` запускає programmatic перевірки з каталогу `scripts/` пакету. Якщо в корені репозиторію вже є `.n-cursor.json`, перед перевірками виконується зчитування конфігу — зокрема додається або виправляється поле `$schema`, якщо воно відсутнє або не збігається з очікуваним URL.
|
package/bin/n-cursor.js
CHANGED
|
@@ -103,6 +103,7 @@ import { syncClaudeConfig } from '../scripts/sync-claude-config.mjs'
|
|
|
103
103
|
import { upgradeNitraCursorToLatestAndBunInstall } from '../scripts/upgrade-nitra-cursor-and-install.mjs'
|
|
104
104
|
import { runRenameYamlExtensionsCli } from './rename-yaml-extensions.mjs'
|
|
105
105
|
import { runSkillsCli } from '../scripts/skills-cli.mjs'
|
|
106
|
+
import { runWorktreeCli } from '../scripts/worktree-cli.mjs'
|
|
106
107
|
import { syncSetupBunDepsAction } from '../scripts/sync-setup-bun-deps-action.mjs'
|
|
107
108
|
import { runLintCli } from '../scripts/lib/run-lint-cli.mjs'
|
|
108
109
|
import { formatTimingSummary } from '../scripts/lib/timing-summary.mjs'
|
|
@@ -1525,6 +1526,11 @@ try {
|
|
|
1525
1526
|
|
|
1526
1527
|
break
|
|
1527
1528
|
}
|
|
1529
|
+
case 'worktree': {
|
|
1530
|
+
process.exitCode = await runWorktreeCli(args)
|
|
1531
|
+
|
|
1532
|
+
break
|
|
1533
|
+
}
|
|
1528
1534
|
case undefined:
|
|
1529
1535
|
case '': {
|
|
1530
1536
|
await runSync()
|
|
@@ -1534,7 +1540,7 @@ try {
|
|
|
1534
1540
|
default: {
|
|
1535
1541
|
console.error(`❌ Невідома команда: ${command}`)
|
|
1536
1542
|
console.error(
|
|
1537
|
-
` Очікується: (без аргументів) синхронізація правил, check, rename-yaml-extensions, post-tool-use-fix, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, coverage, change, release, skill`
|
|
1543
|
+
` Очікується: (без аргументів) синхронізація правил, check, rename-yaml-extensions, post-tool-use-fix, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, coverage, change, release, skill, worktree`
|
|
1538
1544
|
)
|
|
1539
1545
|
process.exitCode = 1
|
|
1540
1546
|
}
|
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
|
+
{}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Конвенція git-worktree у цьому репо — створення, інвентаризація та прибирання через n-cursor worktree CLI.
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Worktree-конвенція
|
|
8
|
+
|
|
9
|
+
Усі git-worktree створюй і прибирай через CLI `n-cursor worktree` — він кладе їх у
|
|
10
|
+
`.worktrees/` (gitignored) і веде інвентарний файл-опис поруч.
|
|
11
|
+
|
|
12
|
+
## Розташування
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
.worktrees/
|
|
16
|
+
feat-skill-meta/ ← git worktree checkout
|
|
17
|
+
feat-skill-meta.md ← інвентарний опис поруч (gitignored через .worktrees/)
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Слеш у гілці перетворюється на дефіс: `feat/skill-meta` → `.worktrees/feat-skill-meta/`.
|
|
21
|
+
Git-гілка лишається з оригінальним імʼям (`feat/skill-meta`).
|
|
22
|
+
|
|
23
|
+
## Команди
|
|
24
|
+
|
|
25
|
+
- **Створити** (опис обовʼязковий): `npx @nitra/cursor worktree add <branch> "<навіщо>"`
|
|
26
|
+
- **Інвентаризація**: `npx @nitra/cursor worktree list`
|
|
27
|
+
- **Прибрати**: `npx @nitra/cursor worktree remove <branch> [--force]`
|
|
28
|
+
- **Прибрати осиротілі**: `npx @nitra/cursor worktree prune`
|
|
29
|
+
|
|
30
|
+
## Заборони
|
|
31
|
+
|
|
32
|
+
- Не клади worktree в `.claude/worktrees/` — це приватна директорія харнесу Claude Code.
|
|
33
|
+
- Не клади worktree в батьківський каталог `../cursor-<name>` — ускладнює інвентаризацію.
|
|
34
|
+
- Не створюй worktree вручну (`git worktree add`) повз CLI — інакше не буде інвентарного опису.
|
|
@@ -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
|
}
|