@nitra/cursor 1.38.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 (73) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +1 -1
  3. package/rules/abie/meta.json +1 -0
  4. package/rules/adr/meta.json +1 -0
  5. package/rules/bun/meta.json +1 -0
  6. package/rules/capacitor/meta.json +1 -0
  7. package/rules/changelog/meta.json +1 -0
  8. package/rules/ci4/meta.json +1 -0
  9. package/rules/docker/meta.json +1 -0
  10. package/rules/efes/meta.json +1 -0
  11. package/rules/feedback/meta.json +1 -0
  12. package/rules/ga/meta.json +1 -0
  13. package/rules/graphql/meta.json +1 -0
  14. package/rules/hasura/meta.json +1 -0
  15. package/rules/image-avif/meta.json +1 -0
  16. package/rules/image-compress/meta.json +1 -0
  17. package/rules/js-bun-db/meta.json +1 -0
  18. package/rules/js-bun-redis/meta.json +1 -0
  19. package/rules/js-lint/meta.json +1 -0
  20. package/rules/js-mssql/meta.json +1 -0
  21. package/rules/js-run/meta.json +1 -0
  22. package/rules/k8s/meta.json +1 -0
  23. package/rules/nginx-default-tpl/meta.json +1 -0
  24. package/rules/npm-module/js/rule_meta.mjs +63 -0
  25. package/rules/npm-module/meta.json +1 -0
  26. package/rules/php/meta.json +1 -0
  27. package/rules/rego/meta.json +1 -0
  28. package/rules/release/meta.json +1 -0
  29. package/rules/rust/meta.json +1 -0
  30. package/rules/security/meta.json +1 -0
  31. package/rules/style-lint/meta.json +1 -0
  32. package/rules/tauri/meta.json +1 -0
  33. package/rules/test/meta.json +1 -0
  34. package/rules/text/meta.json +1 -0
  35. package/rules/vue/meta.json +1 -0
  36. package/rules/worktree/fix.mjs +19 -0
  37. package/rules/worktree/meta.json +1 -0
  38. package/schemas/rule-meta.json +39 -0
  39. package/schemas/v8r-catalog.json +5 -0
  40. package/scripts/auto-rules.mjs +151 -449
  41. package/scripts/lib/rule-meta-helpers.mjs +103 -0
  42. package/scripts/lib/rule-meta.mjs +66 -0
  43. package/scripts/lib/rule-predicates.mjs +147 -0
  44. package/skills/worktree/meta.json +1 -1
  45. package/rules/abie/auto.md +0 -1
  46. package/rules/adr/auto.md +0 -1
  47. package/rules/bun/auto.md +0 -1
  48. package/rules/capacitor/auto.md +0 -1
  49. package/rules/changelog/auto.md +0 -1
  50. package/rules/docker/auto.md +0 -1
  51. package/rules/efes/auto.md +0 -1
  52. package/rules/ga/auto.md +0 -1
  53. package/rules/graphql/auto.md +0 -1
  54. package/rules/hasura/auto.md +0 -1
  55. package/rules/image-avif/auto.md +0 -1
  56. package/rules/image-compress/auto.md +0 -1
  57. package/rules/js-bun-db/auto.md +0 -1
  58. package/rules/js-bun-redis/auto.md +0 -1
  59. package/rules/js-lint/auto.md +0 -1
  60. package/rules/js-mssql/auto.md +0 -1
  61. package/rules/js-run/auto.md +0 -1
  62. package/rules/k8s/auto.md +0 -1
  63. package/rules/nginx-default-tpl/auto.md +0 -1
  64. package/rules/npm-module/auto.md +0 -1
  65. package/rules/php/auto.md +0 -1
  66. package/rules/rego/auto.md +0 -1
  67. package/rules/rust/auto.md +0 -1
  68. package/rules/security/auto.md +0 -1
  69. package/rules/style-lint/auto.md +0 -1
  70. package/rules/tauri/auto.md +0 -1
  71. package/rules/test/auto.md +0 -1
  72. package/rules/text/auto.md +0 -1
  73. package/rules/vue/auto.md +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
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
+
3
10
  ## [1.38.0] - 2026-05-31
4
11
 
5
12
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.38.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,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
  }