@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.
Files changed (79) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +6 -0
  3. package/bin/n-cursor.js +7 -1
  4. package/package.json +1 -1
  5. package/rules/abie/meta.json +1 -0
  6. package/rules/adr/meta.json +1 -0
  7. package/rules/bun/meta.json +1 -0
  8. package/rules/capacitor/meta.json +1 -0
  9. package/rules/changelog/meta.json +1 -0
  10. package/rules/ci4/meta.json +1 -0
  11. package/rules/docker/meta.json +1 -0
  12. package/rules/efes/meta.json +1 -0
  13. package/rules/feedback/meta.json +1 -0
  14. package/rules/ga/meta.json +1 -0
  15. package/rules/graphql/meta.json +1 -0
  16. package/rules/hasura/meta.json +1 -0
  17. package/rules/image-avif/meta.json +1 -0
  18. package/rules/image-compress/meta.json +1 -0
  19. package/rules/js-bun-db/meta.json +1 -0
  20. package/rules/js-bun-redis/meta.json +1 -0
  21. package/rules/js-lint/meta.json +1 -0
  22. package/rules/js-mssql/meta.json +1 -0
  23. package/rules/js-run/meta.json +1 -0
  24. package/rules/k8s/meta.json +1 -0
  25. package/rules/nginx-default-tpl/meta.json +1 -0
  26. package/rules/npm-module/js/rule_meta.mjs +63 -0
  27. package/rules/npm-module/meta.json +1 -0
  28. package/rules/php/meta.json +1 -0
  29. package/rules/rego/meta.json +1 -0
  30. package/rules/release/meta.json +1 -0
  31. package/rules/rust/meta.json +1 -0
  32. package/rules/security/meta.json +1 -0
  33. package/rules/style-lint/meta.json +1 -0
  34. package/rules/tauri/meta.json +1 -0
  35. package/rules/test/meta.json +1 -0
  36. package/rules/text/meta.json +1 -0
  37. package/rules/vue/meta.json +1 -0
  38. package/rules/worktree/fix.mjs +19 -0
  39. package/rules/worktree/meta.json +1 -0
  40. package/rules/worktree/worktree.mdc +34 -0
  41. package/schemas/rule-meta.json +39 -0
  42. package/schemas/v8r-catalog.json +5 -0
  43. package/scripts/auto-rules.mjs +151 -449
  44. package/scripts/lib/rule-meta-helpers.mjs +103 -0
  45. package/scripts/lib/rule-meta.mjs +66 -0
  46. package/scripts/lib/rule-predicates.mjs +147 -0
  47. package/scripts/lib/worktree.mjs +73 -0
  48. package/scripts/worktree-cli.mjs +200 -0
  49. package/skills/worktree/SKILL.md +38 -0
  50. package/skills/worktree/meta.json +1 -0
  51. package/rules/abie/auto.md +0 -1
  52. package/rules/adr/auto.md +0 -1
  53. package/rules/bun/auto.md +0 -1
  54. package/rules/capacitor/auto.md +0 -1
  55. package/rules/changelog/auto.md +0 -1
  56. package/rules/docker/auto.md +0 -1
  57. package/rules/efes/auto.md +0 -1
  58. package/rules/ga/auto.md +0 -1
  59. package/rules/graphql/auto.md +0 -1
  60. package/rules/hasura/auto.md +0 -1
  61. package/rules/image-avif/auto.md +0 -1
  62. package/rules/image-compress/auto.md +0 -1
  63. package/rules/js-bun-db/auto.md +0 -1
  64. package/rules/js-bun-redis/auto.md +0 -1
  65. package/rules/js-lint/auto.md +0 -1
  66. package/rules/js-mssql/auto.md +0 -1
  67. package/rules/js-run/auto.md +0 -1
  68. package/rules/k8s/auto.md +0 -1
  69. package/rules/nginx-default-tpl/auto.md +0 -1
  70. package/rules/npm-module/auto.md +0 -1
  71. package/rules/php/auto.md +0 -1
  72. package/rules/rego/auto.md +0 -1
  73. package/rules/rust/auto.md +0 -1
  74. package/rules/security/auto.md +0 -1
  75. package/rules/style-lint/auto.md +0 -1
  76. package/rules/tauri/auto.md +0 -1
  77. package/rules/test/auto.md +0 -1
  78. package/rules/text/auto.md +0 -1
  79. 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.37.0",
3
+ "version": "1.39.0",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -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
+ }
@@ -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
  }