@nitra/cursor 1.8.120 → 1.8.122

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/bin/n-cursor.js CHANGED
@@ -384,6 +384,20 @@ function skillDescriptionSafeForMarkdownInline(desc) {
384
384
  return desc.replaceAll('<id>', '{id}')
385
385
  }
386
386
 
387
+ /**
388
+ * YAML frontmatter для `.claude/commands/*.md`: поле `description` потрібне розширенню VSCode,
389
+ * щоб команди з’являлись у списку. Текст збігається з полем `description` у frontmatter `SKILL.md`.
390
+ * @param {string} descriptionRaw значення з `extractSkillDescription` (може бути порожнім)
391
+ * @returns {string} блок `---` … `---` і порожній рядок після
392
+ */
393
+ function formatClaudeCommandFrontmatter(descriptionRaw) {
394
+ let text = skillDescriptionSafeForMarkdownInline(String(descriptionRaw || '').trim())
395
+ if (!text) {
396
+ text = 'Див. SKILL.md у каталозі скілу в .cursor/skills.'
397
+ }
398
+ return `---\ndescription: >-\n ${text}\n---\n\n`
399
+ }
400
+
387
401
  /**
388
402
  * Розгортає в шаблоні блок Mustache {{#section}} … {{/section}} для масиву елементів
389
403
  * @param {string} template вихідний текст шаблону
@@ -683,7 +697,8 @@ async function syncSkills(configSkills, bundledSkillsDir = BUNDLED_SKILLS_DIR) {
683
697
 
684
698
  /**
685
699
  * Синхронізує .claude/commands/n-<id>.md зі skills пакету.
686
- * Кожен файл містить посилання на відповідний cursor skill, а не копію інструкцій.
700
+ * У кожному файлі обов’язково YAML frontmatter з `description` (як у `SKILL.md`), інакше команди
701
+ * не з’являються у розширенні VSCode; далі — заголовок H1 лише з імені команди (без повтору опису) і посилання на `.cursor/skills/…/SKILL.md`.
687
702
  * @param {string[]} configSkills id без префікса n-
688
703
  * @param {string} [bundledSkillsDir] каталог `skills/` у корені пакету-джерела
689
704
  * @returns {Promise<{ success: number, fail: number }>} лічильники успішних і невдалих записів
@@ -710,9 +725,9 @@ async function syncCommands(configSkills, bundledSkillsDir = BUNDLED_SKILLS_DIR)
710
725
  try {
711
726
  const raw = await readFile(srcSkillMd, 'utf8')
712
727
  const descRaw = extractSkillDescription(raw)
713
- const desc = descRaw ? skillDescriptionSafeForMarkdownInline(descRaw) : ''
714
- const header = desc ? `# ${RULE_PREFIX}${id} — ${desc}\n\n` : ''
715
- const body = `${header}Виконай інструкції зі скілу \`.cursor/skills/${destDirName}/SKILL.md\`.\n`
728
+ const frontmatter = formatClaudeCommandFrontmatter(descRaw || '')
729
+ const header = `# ${RULE_PREFIX}${id}\n\n`
730
+ const body = `${frontmatter}${header}Виконай інструкції зі скілу \`.cursor/skills/${destDirName}/SKILL.md\`.\n`
716
731
  await writeFile(destFile, body, 'utf8')
717
732
  console.log(`✅`)
718
733
  success++
@@ -754,7 +769,7 @@ async function removeOrphanManagedCommandFiles(commandsDir, configSkills) {
754
769
 
755
770
  /**
756
771
  * Синхронізує .claude/commands/{dirName}.md для всіх локальних скілів з .cursor/skills/
757
- * що не керуються пакетом (відсутні в configSkills).
772
+ * що не керуються пакетом (відсутні в configSkills). Frontmatter `description` — як у відповідному SKILL.md.
758
773
  * @param {string[]} configSkills id керованих skills (вже оброблені syncCommands)
759
774
  * @returns {Promise<{ success: number, fail: number }>} лічильники успішних і невдалих записів
760
775
  */
@@ -778,14 +793,15 @@ async function syncLocalOnlySkillCommands(configSkills) {
778
793
 
779
794
  process.stdout.write(` ⬇ ${dirName} → ${COMMANDS_DIR}/${dirName}.md ... `)
780
795
  try {
781
- let desc = ''
796
+ let descRaw = ''
782
797
  if (existsSync(skillMdPath)) {
783
798
  const raw = await readFile(skillMdPath, 'utf8')
784
799
  const parsed = extractSkillDescription(raw)
785
- if (parsed) desc = skillDescriptionSafeForMarkdownInline(parsed)
800
+ if (parsed) descRaw = parsed
786
801
  }
787
- const header = desc ? `# ${dirName} — ${desc}\n\n` : ''
788
- const body = `${header}Виконай інструкції зі скілу \`${SKILLS_DIR}/${dirName}/SKILL.md\`.\n`
802
+ const frontmatter = formatClaudeCommandFrontmatter(descRaw)
803
+ const header = `# ${dirName}\n\n`
804
+ const body = `${frontmatter}${header}Виконай інструкції зі скілу \`${SKILLS_DIR}/${dirName}/SKILL.md\`.\n`
789
805
  await writeFile(destFile, body, 'utf8')
790
806
  console.log(`✅`)
791
807
  success++
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.8.120",
3
+ "version": "1.8.122",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -2,12 +2,15 @@
2
2
  name: n-abie-kustomize
3
3
  description: >-
4
4
  Трансформація дерев k8s у Kustomize (base + overlays): dev → base, без окремої dev/; директорія
5
- users/ у середовищах не входить у kustomization (окремі маніфести між середовищами)
6
- version: '1.1'
5
+ users/ у середовищах не входить у kustomization (окремі маніфести між середовищами); дерево з
6
+ CNPG Cluster (postgresql.cnpg.io/v1) не трансформувати
7
+ version: '1.2'
7
8
  ---
8
9
 
9
10
  Спочатку знайди всі директорії `k8s/` у проєкті. Виконуй трансформацію лише для тих, у яких **немає** директорії `base/`. Якщо `base/` вже існує — пропускай цю директорію і рухайся далі.
10
11
 
12
+ Якщо в дереві тієї директорії `k8s/`, яку збираєшся трансформувати (рекурсивно по `*.yaml`), є маніфест з **`apiVersion: postgresql.cnpg.io/v1`** і **`kind: Cluster`** (CloudNativePG) — **не застосовуй** до цього дерева описану трансформацію base/overlays: залиш структуру як є і переходь до наступної директорії `k8s/`.
13
+
11
14
  Трансформуй директорії, щоб виділити спільне за допомогою kustomize. За основу беремо все, що в середовищі dev, і саме в такому вигляді з dev воно має стати **base**; якщо вже є base і немає dev — це нормально, рухайся далі.
12
15
 
13
16
  У інших середовищах має бути лише `kustomization.yaml` і зміни через оверрайди.
@@ -26,6 +29,10 @@ README має бути в директорії **k8s**.
26
29
 
27
30
  Для overlays **ru** та **ua** `namespace` задавай у `kustomization.yaml` (без окремих patch лише на зміну namespace). Деталі — **n-k8s** / **abie** у `.cursor/rules/`, якщо ці правила увімкнені в проєкті.
28
31
 
32
+ ## Виключення: CNPG `Cluster`
33
+
34
+ Ресурс **`Cluster`** оператора CloudNativePG (`postgresql.cnpg.io/v1`) має власні правила життєвого циклу та іменування; шаблон «dev → base + overlays» для нього не застосовується.
35
+
29
36
  ## Виключення: директорії `users/`
30
37
 
31
38
  Директорія `users/` у кожному середовищі — **окремий шар маніфестів**, який **не входить у Kustomize**. Так зроблено навмисно: вміст часто **різний між середовищами**, тож немає сенсу виносити його в `base` чи патчити через overlays.