@nitra/cursor 1.11.14 → 1.11.16

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.
@@ -145,7 +145,33 @@ if ! printf '%s' "$RESPONSE_TRIMMED" | grep -q '^## '; then
145
145
  fi
146
146
 
147
147
  TS=$(date +%Y%m%d-%H%M%S)
148
- OUT="$ADR_DIR/$TS-${SESSION_ID:0:8}.md"
148
+
149
+ # Slug із першого `## [ADR|Runbook|Knowledge] <heading>`-рядка відповіді.
150
+ # Логіка локальна (без додаткового LLM-виклику): використовуємо вже згенерований heading.
151
+ # Конвенція кебаб-slug-у — як у normalize-decisions.sh:171: малі літери, дозволено цифри, дефіс,
152
+ # кирилиця; англомовні технічні терміни лишаються англійською без транслітерації.
153
+ HEADING=$(printf '%s' "$RESPONSE_TRIMMED" \
154
+ | awk '/^## (\[?(ADR|Runbook|Knowledge)\]?)/{ sub(/^## /,""); sub(/^\[?(ADR|Runbook|Knowledge)\]?[[:space:]]*:?[[:space:]]*/,""); print; exit }')
155
+ SLUG=$(printf '%s' "$HEADING" \
156
+ | tr '[:upper:]' '[:lower:]' \
157
+ | sed -E 's/[`«»"]//g; s/[ /,.:;()—–]+/-/g; s/[^a-zа-яёіїєґ0-9-]//g; s/-+/-/g; s/^-//; s/-$//' \
158
+ | cut -c1-60 \
159
+ | sed -E 's/-$//')
160
+
161
+ if [[ -z "$SLUG" ]]; then
162
+ # Fallback на старий формат, якщо heading не спарсився
163
+ OUT="$ADR_DIR/$TS-${SESSION_ID:0:8}.md"
164
+ else
165
+ # Колізії: <timestamp>-<slug>-<n>.md (n=2,3,...), як у normalize-decisions.sh:244-257
166
+ BASE="$ADR_DIR/$TS-$SLUG.md"
167
+ OUT="$BASE"
168
+ n=2
169
+ while [[ -e "$OUT" ]]; do
170
+ OUT="$ADR_DIR/$TS-$SLUG-$n.md"
171
+ n=$((n+1))
172
+ done
173
+ fi
174
+
149
175
  {
150
176
  printf -- '---\nsession: %s\ncaptured: %s\ntranscript: %s\n---\n\n' \
151
177
  "$SESSION_ID" "$(date -Iseconds)" "$TRANSCRIPT_PATH"
package/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@
4
4
 
5
5
  Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
6
6
 
7
+ ## [1.11.16] - 2026-05-16
8
+
9
+ ### Changed
10
+
11
+ - **`npm/rules/adr/adr.mdc`**, **`npm/scripts/auto-rules.mjs`**, **`npm/rules/adr/auto.md`** — правило `adr` тепер **увімкнене за замовчуванням** (`addRule('adr')` без умови, поруч з `addRule('text')`; `auto.md` = `завжди`). Раніше — opt-in вручну через `"adr"` у `rules`. Щоб вимкнути для конкретного репо — `"adr"` у `disable-rules`. Текст правила і JSDoc у `sync-claude-config.mjs` оновлено відповідно. Існуючі `.n-cursor.json` із явним `"adr"` у `rules` лишаються валідними (`mergeConfigWithAutoDetected` дедуплікує).
12
+ - **Мотивація:** ADR/Runbook/Knowledge capture виявився корисним для всіх проєктів команди, а не лише тих, де його свідомо ввімкнули; opt-out зручніший за opt-in, бо інтегрує hooks у новий репо з коробки.
13
+
14
+ ## [1.11.15] - 2026-05-16
15
+
16
+ ### Changed
17
+
18
+ - **`npm/.claude-template/hooks/capture-decisions.sh`** (+`.claude/hooks/capture-decisions.sh` синк) — Stop-hook тепер генерує **slug-name** для чернетки замість session-hash суфікса. Раніше: `<timestamp>-<session-id[0:8]>.md` (наприклад `20260516-090349-e513a1f0.md`). Тепер: `<timestamp>-<slug>.md` (наприклад `20260516-090349-структура-директорій-правила-fix-lint-policy.md`). **Slug береться з вже згенерованого LLM-заголовка** першого `## [ADR|Runbook|Knowledge] <heading>` блоку — без додаткового LLM-виклику, та сама вартість Stop-hook. Конвенція slug-у синхронізована з `normalize-decisions.sh:171`: малі літери, цифри, дефіс, кирилиця; англомовні технічні терміни лишаються англійською (`fix`, `lint`, `policy` — не транслітеруються). Колізії в межах однієї секунди — суфікс `-2`, `-3`, …, як у `normalize-decisions.sh:244-257`. Fallback на старий `<timestamp>-<session-id[0:8]>.md` якщо heading не спарсився (response без `## ADR|Runbook|Knowledge` префікса).
19
+ - **Мотивація:** після прогону `normalize-decisions.sh` нові чернетки створювалися з абстрактними session-hash іменами і знову вимагали LLM-`rewrite`-операцію щоб отримати читабельний slug. Тепер capture одразу пише читабельний slug → наступна нормалізація обмежується лише `delete`/`merge-into` для дублікатів (rename-операції стають рідкісними).
20
+
7
21
  ## [1.11.14] - 2026-05-16
8
22
 
9
23
  ### Removed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.11.14",
3
+ "version": "1.11.16",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -52,5 +52,8 @@
52
52
  "engines": {
53
53
  "bun": ">=1.3",
54
54
  "node": ">=25"
55
+ },
56
+ "devDependencies": {
57
+ "@nitra/cursor": "^1.11.16"
55
58
  }
56
59
  }
package/rules/adr/adr.mdc CHANGED
@@ -4,9 +4,9 @@ alwaysApply: true
4
4
  version: '2.0'
5
5
  ---
6
6
 
7
- Правило вмикається **вручну**додай `"adr"` у масив `rules` файлу `.n-cursor.json`. У `auto-rules.md` його немає, бо корисність залежить від робочого процесу команди (не кожен проєкт хоче літати ADR-чернеткам у `docs/`).
7
+ Правило увімкнене **за замовчуванням** (як [[text]]) `npx @nitra/cursor` сам додає `"adr"` у `rules` файлу `.n-cursor.json`. Щоб вимкнути для конкретного репо (не кожен проєкт хоче літати ADR-чернеткам у `docs/`), додай `"adr"` у `disable-rules`.
8
8
 
9
- Коли правило увімкнене, **`npx @nitra/cursor`** автоматично:
9
+ Коли правило увімкнене (за замовчуванням), **`npx @nitra/cursor`** автоматично:
10
10
 
11
11
  - копіює канонічний bash-скрипт у **`.claude/hooks/capture-decisions.sh`** (executable, повністю керується пакетом — на кожен sync перезаписується);
12
12
  - копіює канонічний bash-скрипт у **`.claude/hooks/normalize-decisions.sh`** (батч-нормалізація чернеток через LLM);
@@ -0,0 +1 @@
1
+ завжди
@@ -27,6 +27,7 @@ import { contentForVueImportScan } from './utils/vue-forbidden-imports.mjs'
27
27
  /** Порядок автододавання правил відповідно до `rules/<rule>/auto.md`. */
28
28
  export const AUTO_RULE_ORDER = Object.freeze([
29
29
  'abie',
30
+ 'adr',
30
31
  'bun',
31
32
  'capacitor',
32
33
  'changelog',
@@ -657,6 +658,7 @@ export async function detectAutoRules({
657
658
  addRule(item.id)
658
659
  }
659
660
  }
661
+ addRule('adr')
660
662
  addRule('text')
661
663
  if (facts.hasVueSource) {
662
664
  addRule('vue')
@@ -12,8 +12,9 @@
12
12
  * - `.claude/commands/n-check.md` — fully owned slash-команда.
13
13
  * - `.claude/hooks/capture-decisions.sh` — fully owned bash-скрипт ADR capture Stop-hook;
14
14
  * копіюється з `.claude-template/hooks/`, лише коли в `.n-cursor.json` `rules`
15
- * присутнє `adr` (правило вмикається вручну). Якщо правила немає, керована
16
- * ADR-група в hooks так само автоматично прибирається з settings.json.
15
+ * присутнє `adr` (правило увімкнене за замовчуванням; вимикається через
16
+ * `disable-rules: ["adr"]`). Якщо правила немає, керована ADR-група в hooks
17
+ * так само автоматично прибирається з settings.json.
17
18
  * - `.claude/hooks/normalize-decisions.sh` — fully owned bash-скрипт ADR normalize
18
19
  * Stop-hook (батч-нормалізація чернеток); умови — ті самі, що для `capture`.
19
20
  *