@nitra/cursor 1.6.4 → 1.6.5

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/README.md CHANGED
@@ -14,6 +14,7 @@
14
14
 
15
15
  ```json
16
16
  {
17
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/n-cursor.json",
17
18
  "rules": ["js-format", "npm-module", "text"]
18
19
  }
19
20
  ```
@@ -30,6 +31,7 @@
30
31
 
31
32
  ```json
32
33
  {
34
+ "$schema": "https://unpkg.com/@nitra/cursor/schemas/n-cursor.json",
33
35
  "version": "2.5.0",
34
36
  "rules": ["js-format", "text"]
35
37
  }
@@ -39,11 +41,15 @@
39
41
 
40
42
  ```bash
41
43
  npx @nitra/cursor
44
+ npx @nitra/cursor check
45
+ npx @nitra/cursor check bun ga
42
46
  ```
43
47
 
44
- CLI автоматично:
48
+ Команда `check` запускає programmatic перевірки з каталогу `scripts/` пакету. Якщо в корені репозиторію вже є `.n-cursor.json`, перед перевірками виконується зчитування конфігу — зокрема додається або виправляється поле `$schema`, якщо воно відсутнє або не збігається з очікуваним URL.
45
49
 
46
- 1. Знайде або створить `.n-cursor.json` у поточній директорії
50
+ CLI автоматично (команда завантаження правил без підкоманди `check`):
51
+
52
+ 1. Знайде або створить `.n-cursor.json` у поточній директорії (із полем `$schema` на JSON Schema пакету; якщо файл уже є без коректного `$schema`, поле буде додано або оновлено при зчитуванні конфігу)
47
53
  2. Створить директорію `.cursor/rules/`, якщо її ще немає
48
54
  3. Завантажить кожне з перелічених у конфігу правило з unpkg.com і збереже файли з префіксом `n-`
49
55
  4. Після оновлення файлів на диску згенерує в корені проєкту **`AGENTS.md`**: повний вміст береться з шаблону пакету `AGENTS.template.md`, а список правил у шаблоні формується з **усіх наявних файлів `*.mdc`** у `.cursor/rules/` (відсортовано за ім’ям)
package/bin/n-cursor.js CHANGED
@@ -5,12 +5,14 @@
5
5
  *
6
6
  * Використання:
7
7
  * `npx \@nitra/cursor` — завантажити cursor-правила
8
- * `npx \@nitra/cursor check` — перевірити правила, перелічені в AGENTS.md (якщо є check-*.mjs)
8
+ * `npx \@nitra/cursor check` — перевірити правила, перелічені в AGENTS.md (якщо є check-*.mjs);
9
+ * якщо в корені вже є `.n-cursor.json`, спочатку зчитується конфіг і за потреби дописується `$schema`
9
10
  * `npx \@nitra/cursor check bun` — перевірити лише вказані правила (ігнорує AGENTS.md)
10
11
  *
11
12
  * Якщо у корені репозиторію немає .n-cursor.json, спочатку перейменовується за наявності nitra-cursor.json;
12
13
  * у `.cursor/rules` файли `nitra-*.mdc` перейменовуються на `n-*.mdc`; інакше конфіг створюється автоматично
13
- * з усіма правилами з каталогу mdc пакету (їх можна відредагувати після створення).
14
+ * з усіма правилами з каталогу mdc пакету (їх можна відредагувати після створення). У файлі завжди має бути
15
+ * поле `$schema` з посиланням на JSON Schema пакету; при зчитуванні конфігу воно додається або виправляється на диску, якщо відсутнє або некоректне.
14
16
  *
15
17
  * Файл AGENTS.md у корені: щоразу повністю перезаписується змістом з AGENTS.template.md
16
18
  * пакету; список правил у шаблоні будується з файлів *.mdc у .cursor/rules поточного проєкту.
@@ -33,6 +35,8 @@ import { fileURLToPath } from 'node:url'
33
35
  const PACKAGE_NAME = '@nitra/cursor'
34
36
  const UNPKG_BASE = 'https://unpkg.com'
35
37
  const CONFIG_FILE = '.n-cursor.json'
38
+ /** URL JSON Schema для `.n-cursor.json` (поле `$schema` у файлі конфігурації) */
39
+ const CONFIG_SCHEMA_URL = `${UNPKG_BASE}/${PACKAGE_NAME}/schemas/n-cursor.json`
36
40
  const AGENTS_FILE = 'AGENTS.md'
37
41
  const AGENTS_TEMPLATE_FILE = 'AGENTS.template.md'
38
42
  const RULES_DIR = '.cursor/rules'
@@ -144,7 +148,7 @@ async function migrateLegacyConfigIfNeeded() {
144
148
 
145
149
  /**
146
150
  * Зчитує конфіг .n-cursor.json з поточної директорії
147
- * @returns {Promise<{rules: string[], skills: string[], version?: string}>} rules, skills (id без префікса n-), опційно version; при відсутності файлу створює дефолтний конфіг
151
+ * @returns {Promise<{ $schema: string, rules: string[], skills: string[], version?: string } & Record<string, unknown>>} rules, skills (id без префікса n-), опційно version; при відсутності файлу створює дефолтний конфіг
148
152
  */
149
153
  async function readConfig() {
150
154
  await migrateLegacyConfigIfNeeded()
@@ -152,7 +156,7 @@ async function readConfig() {
152
156
  if (!existsSync(configPath)) {
153
157
  const rules = await discoverBundledRuleNames()
154
158
  const skills = await discoverBundledSkillNames()
155
- const defaultConfig = { rules, skills }
159
+ const defaultConfig = { $schema: CONFIG_SCHEMA_URL, rules, skills }
156
160
  await writeFile(configPath, `${JSON.stringify(defaultConfig, null, 2)}\n`, 'utf8')
157
161
  console.log(
158
162
  `📝 Створено ${CONFIG_FILE} з усіма правилами (${rules.length}) і skills (${skills.length}) з пакету. За потреби відредагуйте списки.\n`
@@ -175,6 +179,15 @@ async function readConfig() {
175
179
  }
176
180
  config.skills = await discoverBundledSkillNames()
177
181
  }
182
+
183
+ if (config.$schema !== CONFIG_SCHEMA_URL) {
184
+ const { $schema: _omit, ...rest } = config
185
+ const normalized = { $schema: CONFIG_SCHEMA_URL, ...rest }
186
+ await writeFile(configPath, `${JSON.stringify(normalized, null, 2)}\n`, 'utf8')
187
+ console.log(`📝 Оновлено поле $schema у ${CONFIG_FILE}\n`)
188
+ return normalized
189
+ }
190
+
178
191
  return config
179
192
  }
180
193
 
@@ -546,6 +559,17 @@ async function runChecks(requestedRules) {
546
559
  throw new Error('No check scripts found')
547
560
  }
548
561
 
562
+ const root = cwd()
563
+ const legacyConfigPath = join(root, 'nitra-cursor.json')
564
+ if (existsSync(join(root, CONFIG_FILE)) || existsSync(legacyConfigPath)) {
565
+ try {
566
+ await readConfig()
567
+ } catch (error) {
568
+ console.error(`❌ ${error.message}`)
569
+ throw error
570
+ }
571
+ }
572
+
549
573
  let rulesToCheck
550
574
  if (requestedRules.length > 0) {
551
575
  rulesToCheck = requestedRules
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.6.4",
3
+ "version": "1.6.5",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -6,6 +6,10 @@
6
6
  "type": "object",
7
7
  "additionalProperties": true,
8
8
  "properties": {
9
+ "$schema": {
10
+ "type": "string",
11
+ "description": "Посилання на JSON Schema для автодоповнення та валідації в IDE; має збігатися з $id цієї схеми (рекомендовано завжди вказувати)."
12
+ },
9
13
  "rules": {
10
14
  "type": "array",
11
15
  "description": "Ідентифікатори правил без префікса n- (відповідають файлам n-<id>.mdc).",