@nitra/cursor 12.8.4 → 12.8.6
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/CHANGELOG.md +12 -0
- package/bin/n-cursor.js +8 -7
- package/package.json +1 -1
- package/rules/abie/js/env_dns.mdc +33 -0
- package/rules/abie/js/firebase_hosting.mdc +3 -0
- package/rules/abie/js/hc_pairing.mdc +23 -0
- package/rules/abie/js/http_route_base.mdc +25 -0
- package/rules/abie/js/ua_http_route.mdc +47 -0
- package/rules/abie/js/ua_node_selector.mdc +27 -0
- package/rules/abie/main.mdc +11 -127
- package/rules/doc-files/js/docs/index.md +15 -15
- package/rules/js/docs/main.md +6 -6
- package/rules/js/js/docs/check.md +11 -10
- package/rules/js/js/docs/tooling.md +7 -7
- package/rules/js/js/docs/utils_imports.md +13 -12
- package/rules/test/js/docs/stryker_config.md +12 -12
- package/rules/test/js/docs/vitest-config-pool-forks.md +13 -7
- package/scripts/auto-rules.mjs +6 -6
- package/scripts/auto-skills.mjs +3 -3
- package/scripts/docs/auto-rules.md +17 -31
- package/scripts/docs/auto-skills.md +18 -163
- package/scripts/docs/sync-setup-bun-deps-action.md +6 -5
- package/scripts/lib/docs/inline-template-links.md +13 -293
- package/scripts/lib/docs/mirror-parity.md +9 -9
- package/scripts/lib/docs/rule-meta.md +12 -12
- package/scripts/lib/docs/skill-meta.md +9 -9
- package/scripts/lib/docs/timing-summary.md +6 -6
- package/scripts/lib/docs/worktree-notice.md +10 -8
- package/scripts/lib/inline-template-links.mjs +31 -0
- package/scripts/lib/mirror-parity.mjs +5 -3
- package/scripts/lib/rule-meta.mjs +6 -6
- package/scripts/lib/skill-meta.mjs +6 -6
- package/scripts/lib/worktree-notice.mjs +2 -2
- package/scripts/utils/docs/resolve-js-root.md +4 -4
- package/types/bin/n-cursor.d.ts +1 -1
|
@@ -10,22 +10,22 @@ docgen:
|
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль
|
|
13
|
+
Модуль перевіряє готовність JavaScript-проєктів до виконання тестів. Він збирає кореневі каталоги проєктів, використовуючи публічну функцію `check` для валідації. Перевірка гарантує наявність необхідних конфігураційних файлів, зокрема `mutation.json` та `package.json`, у кожному знайденому проєкті. Модуль свідомо пропускає каталоги `node_modules`. Він також додає відповідні артефакти тестів до `.gitignore` у коренях проєктів. (test.mdc)
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
1. Викликається `check` для ініціалізації процесу перевірки.
|
|
18
|
-
2. Перевіряється, чи у конфігурації дозволено
|
|
19
|
-
3.
|
|
20
|
-
4. Перевіряється наявність усіх канонічних
|
|
21
|
-
5. Для кожного знайденого кореневого каталогу
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
6. Виконується
|
|
28
|
-
7. Процес завершується з
|
|
18
|
+
2. Перевіряється, чи у конфігурації дозволено виконання перевірок для JavaScript. Якщо ні, процес завершується з кодом, що вказує на пропуск.
|
|
19
|
+
3. Збираються всі кореневі каталоги, що містять JavaScript-проєкти. Якщо жоден не знайдено, процес завершується з повідомленням про помилку (test.mdc).
|
|
20
|
+
4. Перевіряється наявність усіх канонічних файлів конфігурації (baseline) у системі. Якщо хоча б один відсутній, процес завершується з повідомленням про помилку.
|
|
21
|
+
5. Для кожного знайденого кореневого каталогу проєкту виконується наступне:
|
|
22
|
+
а. Визначається, чи містить проєкт файли `.vue`.
|
|
23
|
+
б. Створюється або оновлюється файл `stryker.config.mjs` у корені проєкту, копіюючи відповідний канонічний baseline. У цьому файлі замінюється посилання на конфігурацію Vitest на фактичне ім'я конфігурації проєкту.
|
|
24
|
+
в. Якщо проєкт містить файли `.vue` і файл `stryker.config.mjs` вже існував, виконується аугментація цього файлу. Аугментація додає плагін `vue-macros` до конфігурації, якщо він відсутній, зберігаючи при цьому форматування користувача.
|
|
25
|
+
г. Створюється або оновлюється файл `stryker-vue-macros-ignorer.mjs` у корені проєкту.
|
|
26
|
+
д. Створюється або оновлюється файл конфігурації Vitest у корені проєкту, використовуючи відповідний канонічний baseline.
|
|
27
|
+
6. Виконується гарантування, що файли, що містять артефакти тестів Stryker та покриття (наприклад, `**/reports/stryker/`, `**/coverage/`), додані до `.gitignore` у корені проєкту. Якщо додано нові записи, виводиться повідомлення (test.mdc).
|
|
28
|
+
7. Процес завершується з кодом, що вказує на успішне виконання або на виявлені порушення.
|
|
29
29
|
|
|
30
30
|
## Гарантії поведінки
|
|
31
31
|
|
|
@@ -10,16 +10,22 @@ docgen:
|
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Визначає шлях до конфігураційного файлу Vitest. Перевіряє, чи встановлено в цьому файлі `pool: 'forks'`. (test.mdc)
|
|
14
|
+
|
|
15
|
+
Поведінка:
|
|
16
|
+
|
|
17
|
+
- Якщо конфігураційний файл не знайдено, завершує роботу з кодом, що вказує на помилку. (test.mdc)
|
|
18
|
+
- Якщо конфігураційний файл знайдено, але в ньому відсутній ключ `pool: 'forks'`, завершує роботу з кодом, що вказує на помилку. (test.mdc)
|
|
19
|
+
- Якщо конфігураційний файл знайдено і містить `pool: 'forks'`, завершує роботу з кодом 0. (test.mdc)
|
|
14
20
|
|
|
15
21
|
## Поведінка
|
|
16
22
|
|
|
17
|
-
1. Визначається
|
|
18
|
-
2. Якщо конфігураційний файл відсутній, виконується пропуск перевірки, і повертається код
|
|
19
|
-
3. Якщо
|
|
20
|
-
4. Перевіряється, чи містить вміст конфігураційного файлу рядок, що вказує на
|
|
21
|
-
5. Якщо рядок знайдено,
|
|
22
|
-
6. Якщо рядок не знайдено,
|
|
23
|
+
1. Визначається шлях до файлу конфігурації Vitest, шукаючи спочатку `vitest.config.mjs`, а потім `vitest.config.js` у корені репозиторію.
|
|
24
|
+
2. Якщо конфігураційний файл відсутній, виконується пропуск перевірки, і повертається код виходу 0.
|
|
25
|
+
3. Якщо файл знайдено, його вміст зчитується.
|
|
26
|
+
4. Перевіряється, чи містить вміст конфігураційного файлу рядок, що вказує на встановлення `pool: 'forks'`.
|
|
27
|
+
5. Якщо рядок знайдено, виконується успішне повідомлення (test.mdc).
|
|
28
|
+
6. Якщо рядок не знайдено, виконується повідомлення про помилку (test.mdc), що вказує на необхідність додавання `pool: 'forks'` для захисту від гонки в умовах паралельного виконання тестів.
|
|
23
29
|
7. Функція `check` повертає код виходу, що відображає результат перевірки (0 для успіху/пропуску, 1 для помилки).
|
|
24
30
|
|
|
25
31
|
## Публічний API
|
package/scripts/auto-rules.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Автовизначення правил для `.n-cursor.json` за meta-даними з `npm/rules/<id>/
|
|
2
|
+
* Автовизначення правил для `.n-cursor.json` за meta-даними з `npm/rules/<id>/main.json`.
|
|
3
3
|
*
|
|
4
|
-
* Основна роль: `discoverRuleAutoActivation` читає `npm/rules/<id>/
|
|
4
|
+
* Основна роль: `discoverRuleAutoActivation` читає `npm/rules/<id>/main.json`, виводить
|
|
5
5
|
* `AUTO_RULE_ORDER` (алфавітно) і `AUTO_RULE_DEPENDENCIES` з meta, а потім для кожного правила
|
|
6
6
|
* обчислює spec активації через `specMatches`: `always` — безумовно; `glob` — перевірка
|
|
7
7
|
* файлів через `globToRegex`; `predicate` — незводимий предикат із реєстру `RULE_PREDICATES`
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Враховує винятки `disable-rules`: елементи зі списку не додаються автоматично.
|
|
13
13
|
*
|
|
14
|
-
* Автодетект скілів — у `./auto-skills.mjs` (умови — у `npm/skills/<skill>/
|
|
14
|
+
* Автодетект скілів — у `./auto-skills.mjs` (умови — у `npm/skills/<skill>/main.json`).
|
|
15
15
|
* `mergeConfigWithAutoDetected` нижче приймає вже виявлені rules і skills і вливає
|
|
16
16
|
* їх у конфіг із поправкою на legacy-id (`migrateRuleIds`).
|
|
17
17
|
*/
|
|
@@ -45,7 +45,7 @@ const PACKAGE_ROOT = dirname(dirname(fileURLToPath(import.meta.url)))
|
|
|
45
45
|
const RULES_DIR = join(PACKAGE_ROOT, 'rules')
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
|
-
* Скан `npm/rules/<id>/
|
|
48
|
+
* Скан `npm/rules/<id>/main.json` → мапа id → RuleAutoSpec (лише правила з розпізнаним auto).
|
|
49
49
|
* @param {string} [rulesDir] override для тестів
|
|
50
50
|
* @returns {Record<string, import('./lib/rule-meta.mjs').RuleAutoSpec>} мапа автоактивації
|
|
51
51
|
*/
|
|
@@ -205,7 +205,7 @@ async function processFileEntry(absPath, root, facts) {
|
|
|
205
205
|
* Обходить дерево проєкту, збираючи content-факти для предикатів автоувімкнення.
|
|
206
206
|
*
|
|
207
207
|
* `hasRegoFile` і `hasTempoDir` лишаються для зворотної сумісності з прямими читачами
|
|
208
|
-
* фактів (тести, зовнішній код); саме автоувімкнення тепер data-driven через
|
|
208
|
+
* фактів (тести, зовнішній код); саме автоувімкнення тепер data-driven через main.json.
|
|
209
209
|
* @param {string} root абсолютний шлях кореня репозиторію
|
|
210
210
|
* @returns {Promise<{
|
|
211
211
|
* hasBunSqlImport: boolean,
|
|
@@ -350,7 +350,7 @@ function specMatches(spec, ctx) {
|
|
|
350
350
|
}
|
|
351
351
|
|
|
352
352
|
/**
|
|
353
|
-
* Визначає авто-правила згідно з `rules/<rule>/
|
|
353
|
+
* Визначає авто-правила згідно з `rules/<rule>/main.json`.
|
|
354
354
|
* @param {object} params параметри аналізу
|
|
355
355
|
* @param {string} params.root абсолютний шлях до кореня репозиторію
|
|
356
356
|
* @param {string[]} params.availableRules перелік доступних правил з пакету
|
package/scripts/auto-skills.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Автовизначення skills для `.n-cursor.json` за умовами з `npm/skills/<skill>/
|
|
2
|
+
* Автовизначення skills для `.n-cursor.json` за умовами з `npm/skills/<skill>/main.json`.
|
|
3
3
|
*
|
|
4
|
-
* `
|
|
4
|
+
* `main.json` — джерело правди (а не hardcoded мапа). Підтримуються три варіанти:
|
|
5
5
|
*
|
|
6
6
|
* - `auto: "завжди"` — скіл активується незалежно від інших правил
|
|
7
7
|
* (приклади: `fix`, `lint`, `llm-patch`, `publish-telegram`).
|
|
@@ -26,7 +26,7 @@ const SKILLS_DIR = join(PACKAGE_ROOT, 'skills')
|
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
|
-
* Сканує `npm/skills/<id>/
|
|
29
|
+
* Сканує `npm/skills/<id>/main.json`. Скіли без `main.json` або без розпізнаного
|
|
30
30
|
* `auto` не потрапляють у результат — їх вмикають лише вручну в конфізі.
|
|
31
31
|
* @param {string} [skillsDir] override для тестів
|
|
32
32
|
* @returns {Record<string, SkillAutoSpec>} мапа `skillId → spec`
|
|
@@ -3,48 +3,34 @@ type: JS Module
|
|
|
3
3
|
title: auto-rules.mjs
|
|
4
4
|
resource: npm/scripts/auto-rules.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: ba75c709
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
7
8
|
score: 90
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
## Огляд
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
discoverRuleAutoActivation
|
|
15
|
-
Читає meta-дані з файлів npm/rules/<id>/meta.json для визначення автоактивації правил.
|
|
16
|
-
|
|
17
|
-
AUTO_RULE_ORDER
|
|
18
|
-
Повертає алфавітний порядок для правил.
|
|
13
|
+
Автоматично визначає правила та скіли для конфігурації `.n-cursor.json`, скануючи мета-дані з `npm/rules/<id>/main.json` та аналізуючи структуру проєкту, зокрема `package.json`. Система виводить `AUTO_RULE_ORDER` (алфавітно) та `AUTO_RULE_DEPENDENCIES` для кожного правила. Для кожного правила обчислюється специфікація активації (`specMatches`), яка може бути безумовною (`always`), заснованою на шаблонах файлів (`glob`), або предикатною. Процес враховує винятки (`disable-rules`) та виконує транзитивне розгортання залежностей. Збираються контент-факти (GQL, bun-sql, hasura) для точного застосування правил. Також відбувається автоматичне виявлення скілів з `./auto-skills.mjs`, після чого всі виявлені правила та скіли зливаються у конфіг, враховуючи міграцію ID.
|
|
19
14
|
|
|
20
|
-
|
|
21
|
-
Повертає граф залежностей між правилами.
|
|
22
|
-
|
|
23
|
-
collectAutoRuleFacts
|
|
24
|
-
Збирає контент-факти для предикатів, включаючи сканування GQL, Bun SQL та налаштувань Hasura.
|
|
25
|
-
|
|
26
|
-
detectAutoRules
|
|
27
|
-
Визначає активні правила на основі spec, перевіряючи їх проти згенерованих фактів.
|
|
15
|
+
## Поведінка
|
|
28
16
|
|
|
29
|
-
|
|
30
|
-
|
|
17
|
+
discoverRuleAutoActivation сканує директорію `rules` та виявляє мета-дані для автоматичного визначення правил.
|
|
18
|
+
AUTO_RULE_ORDER надає стабільний алфавітний порядок для всіх правил, виявлених під час автоматичного визначення.
|
|
19
|
+
AUTO_RULE_DEPENDENCIES визначає транзитивні залежності між правилами, виявленими під час автоматичного визначення.
|
|
20
|
+
collectAutoRuleFacts обходить дерево проєкту, збираючи контент-факти про наявність певних структур (наприклад, GQL, Hasura, Rego).
|
|
21
|
+
detectAutoRules визначає список правил, які мають бути активні, на основі мета-даних правил та зібраних контент-фактів, враховуючи виключення.
|
|
22
|
+
mergeConfigWithAutoDetected об'єднує конфігурацію користувача з результатами автоматичного визначення правил та скілів, прибираючи з конфігу ті елементи, яких більше немає у пакеті.
|
|
31
23
|
|
|
32
24
|
## Публічний API
|
|
33
25
|
|
|
34
|
-
discoverRuleAutoActivation —
|
|
35
|
-
AUTO_RULE_ORDER —
|
|
36
|
-
AUTO_RULE_DEPENDENCIES —
|
|
37
|
-
collectAutoRuleFacts —
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
hasBunSqlImport — Булеве значення про імпорт BunSQL.
|
|
41
|
-
hasGqlTaggedTemplates — Булеве значення про наявність GQL-тегів.
|
|
42
|
-
hasHasuraConfig — Булеве значення про конфігурацію Hasura.
|
|
26
|
+
discoverRuleAutoActivation — Зчитує `main.json` для кожного правила у `npm/rules/<id>/` та створює список правил, які можуть активуватися автоматично.
|
|
27
|
+
AUTO_RULE_ORDER — Визначає порядок застосування автоматичних правил за алфавітом.
|
|
28
|
+
AUTO_RULE_DEPENDENCIES — Створює граф залежностей між автоматичними правилами, використовуючи метадані.
|
|
29
|
+
collectAutoRuleFacts — Сканує структуру проєкту та збирає факти про вміст, необхідні для визначення, які автоматичні правила активувати.
|
|
30
|
+
detectAutoRules — Визначає, які автоматичні правила доступні на основі файлу `main.json` кожного правила.
|
|
31
|
+
mergeConfigWithAutoDetected — Обновлює конфігурацію, додаючи автоматично виявлені правила, і очищає список доступних правил/навичок від тих, що більше не існують у пакеті, фіксуючи видалені ID у полі `pruned`.
|
|
43
32
|
|
|
44
33
|
## Гарантії поведінки
|
|
45
34
|
|
|
46
|
-
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
47
35
|
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
48
|
-
- За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
|
|
49
36
|
- Свідомо пропускає шляхи: `.git`, `node_modules`.
|
|
50
|
-
- Не звертається до мережі.
|
|
@@ -3,175 +3,30 @@ type: JS Module
|
|
|
3
3
|
title: auto-skills.mjs
|
|
4
4
|
resource: npm/scripts/auto-skills.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 374d78b5
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
## Огляд
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
Визначає, які скіли мають автоматично активуватися, скануючи `npm/skills/` та аналізуючи `main.json` кожного скілу. Логіка активації базується на конфігурації скілу: скіл може активуватися завжди (`auto: "завжди"`), якщо всі перелічені правила виявлені (`auto: ["rule", …]`), або бути opt-in, якщо поле `auto` відсутнє у `main.json`. Це забезпечує, що визначення автоматичної активації скілів є детермінованим, оскільки `main.json` є джерелом правди. Результати сканування використовуються для встановлення `AUTO_SKILL_ORDER` та `AUTO_SKILL_RULE_DEPENDENCIES`, що впливає на роботу з `.n-cursor.json`.
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
## Поведінка
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
discoverSkillAutoActivation сканує директорію `npm/skills/` і визначає специфікації автоматичної активації скілів на основі вмісту `main.json` кожного скілу.
|
|
18
|
+
AUTO_SKILL_ORDER надає стабільний алфавітний порядок усіх скілів, які мають визначену автоматичну активацію.
|
|
19
|
+
AUTO_SKILL_RULE_DEPENDENCIES надає мапу скілів, які залежать від певних правил, для забезпечення зворотної сумісності.
|
|
20
|
+
detectAutoSkills визначає, які скіли мають бути автоматично активовані, порівнюючи доступні скіли з виявленими правилами та специфікаціями активації.
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
## Публічний API
|
|
20
23
|
|
|
21
|
-
|
|
24
|
+
discoverSkillAutoActivation — Знаходить скіли, які мають файл `main.json` у відповідній директорії, і які мають автоматичну активацію.
|
|
25
|
+
AUTO_SKILL_ORDER — Забезпечує фіксований алфавітний порядок скілів, що автоматично активуються, для підтримки старої версії.
|
|
26
|
+
AUTO_SKILL_RULE_DEPENDENCIES — Створює список скілів, що автоматично активуються і мають визначені правила залежностей.
|
|
27
|
+
detectAutoSkills — Виявляє скіли, які мають автоматичну активацію на основі вмісту файлу `auto.md` у директорії скілу.
|
|
22
28
|
|
|
23
|
-
|
|
29
|
+
## Гарантії поведінки
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
| `discoverSkillAutoActivation(skillsDir?)` | function | Сканує директорію зі скілами та повертає мапу `skillId → SkillAutoSpec`. |
|
|
28
|
-
| `AUTO_SKILL_ORDER` | `readonly string[]` (frozen) | Стабільний алфавітний список id скілів, які мають авто-активацію. |
|
|
29
|
-
| `AUTO_SKILL_RULE_DEPENDENCIES` | `Readonly<Record<string, readonly string[]>>` | Лише ті скіли, у яких `auto: [rule, …]` — мапа `skillId → rules[]`. |
|
|
30
|
-
| `detectAutoSkills({ availableSkills, detectedRules, disableSkills? })` | function | Обчислює фінальний список авто-скілів за станом середовища. |
|
|
31
|
-
|
|
32
|
-
Тип `SkillAutoSpec` (визначається JSDoc-typedef):
|
|
33
|
-
|
|
34
|
-
```js
|
|
35
|
-
/** @typedef {{ always: true } | { rules: readonly string[] }} SkillAutoSpec */
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
Тобто кожен скіл, що пройшов парсинг, або має `always: true`, або несе масив `rules`.
|
|
39
|
-
|
|
40
|
-
## Функції
|
|
41
|
-
|
|
42
|
-
### `discoverSkillAutoActivation(skillsDir = SKILLS_DIR)`
|
|
43
|
-
|
|
44
|
-
**Сигнатура:**
|
|
45
|
-
|
|
46
|
-
```js
|
|
47
|
-
function discoverSkillAutoActivation(skillsDir?: string): Record<string, SkillAutoSpec>
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**Параметри:**
|
|
51
|
-
|
|
52
|
-
- `skillsDir` _(string, optional)_ — шлях до директорії зі скілами. За замовчуванням — `SKILLS_DIR = join(PACKAGE_ROOT, 'skills')`, де `PACKAGE_ROOT = dirname(dirname(fileURLToPath(import.meta.url)))` (тобто корінь npm-пакету). Параметр існує для override у тестах.
|
|
53
|
-
|
|
54
|
-
**Повертає:** `Record<string, SkillAutoSpec>` — мапа `skillId (== ім'я піддиректорії) → spec`.
|
|
55
|
-
|
|
56
|
-
**Поведінка:**
|
|
57
|
-
|
|
58
|
-
1. Якщо `skillsDir` не існує — повертається порожній обʼєкт `{}`.
|
|
59
|
-
2. Інакше викликається `readdirSync(skillsDir, { withFileTypes: true })`.
|
|
60
|
-
3. Для кожного запису:
|
|
61
|
-
- пропускаються файли (не директорії) та все, що починається з `.` (наприклад, приховані).
|
|
62
|
-
- читається `meta.json` через `readSkillMetaRaw(...)`; якщо raw-обʼєкт відсутній (`null`/`undefined`) — скіл пропускається.
|
|
63
|
-
- поле `raw.auto` пропускається через `parseSkillAutoSpec(...)`; якщо розпізнано — записується в `out[entry.name]`.
|
|
64
|
-
4. Скіли без розпізнаного `auto` **не потрапляють у результат** — вони можуть бути ввімкнені лише вручну через `.n-cursor.json:skills`.
|
|
65
|
-
|
|
66
|
-
**Side effects:** sync I/O — `existsSync`, `readdirSync`, читання `meta.json` усередині `readSkillMetaRaw`. Інших побічних ефектів немає.
|
|
67
|
-
|
|
68
|
-
### `detectAutoSkills({ availableSkills, detectedRules, disableSkills })`
|
|
69
|
-
|
|
70
|
-
**Сигнатура:**
|
|
71
|
-
|
|
72
|
-
```js
|
|
73
|
-
function detectAutoSkills(params: {
|
|
74
|
-
availableSkills: string[],
|
|
75
|
-
detectedRules: string[],
|
|
76
|
-
disableSkills?: string[],
|
|
77
|
-
}): { skills: string[] }
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Параметри:**
|
|
81
|
-
|
|
82
|
-
- `availableSkills` _(string[])_ — перелік id скілів, доступних у поточній збірці пакету (без префіксу `n-`). Будь-який скіл, який є в `SKILL_AUTO_ACTIVATION`, але відсутній у `availableSkills`, **не активується**.
|
|
83
|
-
- `detectedRules` _(string[])_ — id правил, що їх виявив auto-rules-крок; використовується як множина "виявлених" залежностей для специфікацій `{ rules: [...] }`.
|
|
84
|
-
- `disableSkills` _(string[], optional)_ — список id скілів із `.n-cursor.json` із прапором `disable-skills`. За замовчуванням — заморожений пустий масив `DEFAULT_DISABLED_LIST`.
|
|
85
|
-
|
|
86
|
-
**Повертає:** `{ skills: string[] }` — список id активованих скілів у **стабільному алфавітному порядку** (через `AUTO_SKILL_ORDER.filter(...)`).
|
|
87
|
-
|
|
88
|
-
**Алгоритм:**
|
|
89
|
-
|
|
90
|
-
1. Нормалізує `availableSkills` у `Set` (lowercase, trim).
|
|
91
|
-
2. Будує `Set` із `disableSkills` та `detectedRules`.
|
|
92
|
-
3. Для кожної пари `[skillId, spec]` у `SKILL_AUTO_ACTIVATION`:
|
|
93
|
-
- якщо скіл не входить у `normalizedSkills` або входить у `disableSkillsSet` — пропуск.
|
|
94
|
-
- якщо `spec` має `always: true` **або** усі `spec.rules` присутні в `detectedRulesSet` — скіл додається до результуючого `detected`.
|
|
95
|
-
4. Фінальний список будується через `AUTO_SKILL_ORDER.filter(id => detected.has(id))`, що гарантує детермінований алфавітний порядок та фільтрацію тільки тих id, які реально мають spec.
|
|
96
|
-
|
|
97
|
-
**Side effects:** немає — функція чиста. Використовує тільки заздалегідь обчислений `SKILL_AUTO_ACTIVATION` і `AUTO_SKILL_ORDER`.
|
|
98
|
-
|
|
99
|
-
## Внутрішні константи модуля
|
|
100
|
-
|
|
101
|
-
- `PACKAGE_ROOT` — корінь npm-пакету: `dirname(dirname(fileURLToPath(import.meta.url)))`. Тобто два рівні вгору від `npm/scripts/auto-skills.mjs` → `npm/`.
|
|
102
|
-
- `SKILLS_DIR` — `join(PACKAGE_ROOT, 'skills')`, тобто `npm/skills/`.
|
|
103
|
-
- `SKILL_AUTO_ACTIVATION` — результат `discoverSkillAutoActivation()` під час імпорту модуля; кеш на час процесу.
|
|
104
|
-
- `AUTO_SKILL_ORDER` — `Object.freeze(Object.keys(SKILL_AUTO_ACTIVATION).toSorted(localeCompare))`. Заморожений алфавітний список усіх скілів з auto-spec.
|
|
105
|
-
- `AUTO_SKILL_RULE_DEPENDENCIES` — `Object.freeze(Object.fromEntries(...))`: похідна view, де лишаються тільки записи зі spec-формою `{ rules }`. Призначена для зворотної сумісності й для автодоку.
|
|
106
|
-
- `DEFAULT_DISABLED_LIST` — `Object.freeze([])`, дефолтне значення для параметра `disableSkills`.
|
|
107
|
-
|
|
108
|
-
## Залежності
|
|
109
|
-
|
|
110
|
-
**Node.js стандартні модулі:**
|
|
111
|
-
|
|
112
|
-
- `node:fs` — `existsSync`, `readdirSync` (синхронне сканування директорії).
|
|
113
|
-
- `node:path` — `dirname`, `join`.
|
|
114
|
-
- `node:url` — `fileURLToPath` (для отримання абсолютного шляху модуля з `import.meta.url`).
|
|
115
|
-
|
|
116
|
-
**Локальні модулі:**
|
|
117
|
-
|
|
118
|
-
- `./lib/skill-meta.mjs` — імпортуються:
|
|
119
|
-
- `readSkillMetaRaw(skillPath)` — читає сирий обʼєкт `meta.json` за шляхом до директорії скілу.
|
|
120
|
-
- `parseSkillAutoSpec(raw.auto)` — нормалізує значення `auto` у `SkillAutoSpec` (`{ always: true }`, `{ rules: [...] }` або `null`).
|
|
121
|
-
|
|
122
|
-
**Файлова система (рантайм-залежності):**
|
|
123
|
-
|
|
124
|
-
- Очікується наявність директорії `npm/skills/` із піддиректоріями `<skillId>/meta.json`. Відсутність директорії оброблена коректно (повертається `{}`).
|
|
125
|
-
|
|
126
|
-
## Потік виконання / Використання
|
|
127
|
-
|
|
128
|
-
### Завантаження модуля (init phase)
|
|
129
|
-
|
|
130
|
-
1. `PACKAGE_ROOT` і `SKILLS_DIR` обчислюються на основі `import.meta.url`.
|
|
131
|
-
2. Викликається `discoverSkillAutoActivation()` — це **синхронне** I/O під час імпорту: читається `npm/skills/`, з кожної піддиректорії — `meta.json`. Результат зберігається у `SKILL_AUTO_ACTIVATION`.
|
|
132
|
-
3. `AUTO_SKILL_ORDER` і `AUTO_SKILL_RULE_DEPENDENCIES` похідні від цього кешу — обчислюються одноразово і заморожуються.
|
|
133
|
-
|
|
134
|
-
### Виклик `detectAutoSkills` (runtime)
|
|
135
|
-
|
|
136
|
-
Зазвичай викликається на етапі генерації / валідації `.n-cursor.json`. Послідовність:
|
|
137
|
-
|
|
138
|
-
1. Зовнішній код визначає `availableSkills` (зі стану пакету / маніфесту) та `detectedRules` (через сусідній auto-rules pipeline).
|
|
139
|
-
2. Опціонально передає `disableSkills` із конфігу користувача.
|
|
140
|
-
3. Функція повертає `{ skills: [...] }` — фінальний відсортований список id, готовий до запису у конфіг.
|
|
141
|
-
|
|
142
|
-
### Приклад використання
|
|
143
|
-
|
|
144
|
-
```js
|
|
145
|
-
import { detectAutoSkills, AUTO_SKILL_ORDER, AUTO_SKILL_RULE_DEPENDENCIES } from './auto-skills.mjs'
|
|
146
|
-
|
|
147
|
-
const { skills } = detectAutoSkills({
|
|
148
|
-
availableSkills: ['fix', 'lint', 'adr-normalize', 'taze', 'publish-telegram'],
|
|
149
|
-
detectedRules: ['adr', 'bun'],
|
|
150
|
-
disableSkills: ['publish-telegram']
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
// skills буде у стабільному алфавітному порядку:
|
|
154
|
-
// напр. ['adr-normalize', 'fix', 'lint', 'taze']
|
|
155
|
-
// (publish-telegram вимкнено через disableSkills)
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Контракти й інваріанти
|
|
159
|
-
|
|
160
|
-
- **Детермінізм:** порядок результату повністю визначається `AUTO_SKILL_ORDER`, який є `localeCompare`-сортованим snapshot-ом на момент імпорту.
|
|
161
|
-
- **Безпека до відсутніх скілів:** скіли, доступні у `SKILL_AUTO_ACTIVATION`, але не присутні у `availableSkills`, ніколи не активуються.
|
|
162
|
-
- **Кеш:** перечитати `npm/skills/` без перезавантаження модуля неможливо — функція `discoverSkillAutoActivation` тут лише для прямого виклику з тестів (передаючи інший `skillsDir`).
|
|
163
|
-
- **Опт-аут:** `disableSkills` має пріоритет над `auto`-активацією.
|
|
164
|
-
|
|
165
|
-
## Rebuild Test
|
|
166
|
-
|
|
167
|
-
Уявімо, що файл загублено. За цим описом його можна відновити так:
|
|
168
|
-
|
|
169
|
-
1. ESM-модуль із Node-імпортами `existsSync, readdirSync` із `node:fs`, `dirname, join` із `node:path`, `fileURLToPath` із `node:url`.
|
|
170
|
-
2. Імпорт `parseSkillAutoSpec, readSkillMetaRaw` із `./lib/skill-meta.mjs`.
|
|
171
|
-
3. Константи `PACKAGE_ROOT = dirname(dirname(fileURLToPath(import.meta.url)))`, `SKILLS_DIR = join(PACKAGE_ROOT, 'skills')`.
|
|
172
|
-
4. Експортована функція `discoverSkillAutoActivation(skillsDir = SKILLS_DIR)`: якщо `!existsSync(skillsDir)` → `{}`; інакше readdirSync з `withFileTypes`, ітерувати, пропускати не-директорії та `name.startsWith('.')`, читати `readSkillMetaRaw(join(skillsDir, entry.name))`, пропускати falsy, парсити `parseSkillAutoSpec(raw.auto)`, додавати в `out[entry.name]` тільки якщо парсер повернув spec.
|
|
173
|
-
5. Константа модуля `SKILL_AUTO_ACTIVATION = discoverSkillAutoActivation()`.
|
|
174
|
-
6. Експорт `AUTO_SKILL_ORDER = Object.freeze(Object.keys(SKILL_AUTO_ACTIVATION).toSorted((a,b) => a.localeCompare(b)))`.
|
|
175
|
-
7. Експорт `AUTO_SKILL_RULE_DEPENDENCIES = Object.freeze(Object.fromEntries(Object.entries(SKILL_AUTO_ACTIVATION).filter(([, spec]) => 'rules' in spec).map(([id, spec]) => [id, spec.rules])))`.
|
|
176
|
-
8. Константа `DEFAULT_DISABLED_LIST = Object.freeze([])`.
|
|
177
|
-
9. Експортована функція `detectAutoSkills({ availableSkills, detectedRules, disableSkills = DEFAULT_DISABLED_LIST })`: побудувати `normalizedSkills = new Set(availableSkills.map(s => s.trim().toLowerCase()))`, `disableSkillsSet`, `detectedRulesSet`; пройти `Object.entries(SKILL_AUTO_ACTIVATION)`, пропустити коли скіл не у `normalizedSkills` або у `disableSkillsSet`, інакше додати до `detected` якщо `'always' in spec` або `spec.rules.every(d => detectedRulesSet.has(d))`; повернути `{ skills: AUTO_SKILL_ORDER.filter(id => detected.has(id)) }`.
|
|
31
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
32
|
+
- Кешує результати в межах одного прогону.
|
|
@@ -10,19 +10,20 @@ docgen:
|
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Копіює composite GitHub Action `setup-bun-deps` з каталогу `github-actions/setup-bun-deps/` у цільовий репозиторій
|
|
13
|
+
Копіює composite GitHub Action `setup-bun-deps` з каталогу `github-actions/setup-bun-deps/` у корені tarball пакету `@nitra/cursor` у цільовий репозиторій за шлях `.github/actions/setup-bun-deps/action.yml`. Це забезпечує можливість для workflow з правил `ga`, `js` або `text` викликати цей action для налаштування залежностей Bun одразу після виконання `actions/checkout@v6`.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
1. Перевіряє наявність шаблону composite action у корені встановленого пакету `@nitra/cursor`.
|
|
18
|
-
2. Створює необхідну директорію
|
|
19
|
-
3. Зчитує вміст шаблону composite action
|
|
20
|
-
4. Записує вміст шаблону у цільовий шлях
|
|
18
|
+
2. Створює необхідну директорію у корені цільового репозиторію для розміщення composite action.
|
|
19
|
+
3. Зчитує вміст шаблону composite action з кореня встановленого пакету.
|
|
20
|
+
4. Записує вміст шаблону composite action у цільовий шлях у корені репозиторію.
|
|
21
21
|
5. Повертає підтвердження успішного запису та повний шлях до файлу.
|
|
22
|
+
6. Не перевіряє шляхи `.github` чи `.git`.
|
|
22
23
|
|
|
23
24
|
## Публічний API
|
|
24
25
|
|
|
25
|
-
syncSetupBunDepsAction — фіксує
|
|
26
|
+
syncSetupBunDepsAction — фіксує у `projectRoot` композитну дію, що вказує на корінь встановленого `@nitra/cursor`.
|
|
26
27
|
|
|
27
28
|
## Гарантії поведінки
|
|
28
29
|
|