@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 +25 -9
- package/package.json +1 -1
- package/skills/abie-kustomize/SKILL.md +9 -2
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
|
-
*
|
|
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
|
|
714
|
-
const header =
|
|
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
|
|
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)
|
|
800
|
+
if (parsed) descRaw = parsed
|
|
786
801
|
}
|
|
787
|
-
const
|
|
788
|
-
const
|
|
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
|
@@ -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
|
-
|
|
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.
|