@nitra/cursor 1.13.1 → 1.13.2

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.
@@ -83,33 +83,51 @@ if [[ -z "$TRANSCRIPT" ]]; then
83
83
  fi
84
84
 
85
85
  PROMPT=$(cat <<'EOF'
86
- You analyze a Claude Code session transcript and produce a durable knowledge artifact (ADR, Runbook, or Knowledge note) capturing what was done and why.
86
+ You analyze an AI coding session transcript and produce durable decision documentation.
87
87
 
88
- LANGUAGE: Write the ENTIRE output in Ukrainian. This applies to the title, all section content, prose, and rationale. Keep code identifiers, file paths, commands, and tool or library names in their original form (do not translate `walkDir`, `package.json`, `npm`, etc.) — only translate the natural-language prose around them. Section labels themselves stay in Ukrainian per the template below.
88
+ LANGUAGE: Write the content in Ukrainian. Keep MADR section headings in English exactly as shown below. Keep code identifiers, file paths, commands, and tool or library names in their original form (do not translate `walkDir`, `package.json`, `npm`, etc.).
89
89
 
90
90
  IMPORTANT: by "decision" we mean the design choice expressed in the session — even if the user pre-specified it in their brief. The user dictating the approach IS the decision; capture it, including the rationale they gave or that became apparent during implementation. Do NOT return NONE just because the user gave detailed instructions upfront.
91
91
 
92
+ ANTI-HALLUCINATION RULES:
93
+ - Use only facts present in the transcript, tool calls, changed file paths, or direct implications of those facts.
94
+ - Do not invent decision makers, stakeholders, business context, requirements, alternatives, or consequences.
95
+ - If alternatives were not discussed, write exactly: "Інші варіанти в transcript не обговорювалися."
96
+ - If a consequence is unknown, write it as "Neutral, because transcript не містить підтвердження наслідку."
97
+ - Prefer specific file paths and commands from the transcript over generic prose.
98
+
92
99
  OUTPUT RULES:
93
100
  - Emit one or more markdown blocks in this exact shape (no preamble, no trailing prose):
94
101
 
95
- ## [ADR|Runbook|Knowledge] <короткий заголовок українською>
96
- **Контекст:** <яка проблема / ситуація це спричинила — 1-2 речення>
97
- **Рішення/Процедура/Факт:** <що було зроблено — конкретно: змінені файли, введена семантика, кроки>
98
- **Обґрунтування:** <чому саме такий підхід з ТЗ користувача або міркувань асистента>
99
- **Розглянуті альтернативи:** <перелік явно обговорених, або «не обговорювалися»>
100
- **Зачіпає:** <файли, модулі, публічні API, конфіги>
102
+ ## ADR <короткий заголовок українською>
103
+
104
+ ## Context and Problem Statement
105
+ <1-3 речення: яка проблема / ситуація спричинила рішення.>
106
+
107
+ ## Considered Options
108
+ * <назва явно обговореного варіанта>
109
+ * <або "Інші варіанти в transcript не обговорювалися.">
110
+
111
+ ## Decision Outcome
112
+ Chosen option: "<назва обраного варіанта>", because <коротке обґрунтування з transcript>.
113
+
114
+ ### Consequences
115
+ * Good, because <підтверджений позитивний наслідок або "transcript фіксує очікувану користь: ...">.
116
+ * Bad, because <підтверджений негативний наслідок або "transcript не містить підтверджених негативних наслідків.">.
117
+
118
+ ## More Information
119
+ <файли, команди, публічні API, конфіги, transcript facts. Якщо нема — "Додаткової інформації в transcript не зафіксовано.">
101
120
 
102
121
  WHEN TO PICK EACH TYPE:
103
- - ADR: a design choice (library, schema, pattern, semantics of a field/API). Most substantive code work qualifies.
104
- - Runbook: a procedure to operate, fix, deploy, or reproduce something.
105
- - Knowledge: a non-obvious constraint, gotcha, or invariant uncovered (without a corresponding code change).
122
+ - Emit ADR for design choices: library, schema, pattern, file layout, hook semantics, API behavior, validation semantics.
123
+ - Do not emit Runbook or Knowledge blocks here. This hook stores MADR-style decision records only.
106
124
 
107
125
  OUTPUT NONE ONLY IF the session is genuinely trivial:
108
126
  - A single typo fix, comment edit, or lint cleanup with no design content
109
- - A pure question/answer with no code change and no surprising fact
127
+ - A pure question/answer with no durable decision
110
128
  - An aborted/empty session
111
129
 
112
- When in doubt, emit a block. Capturing too much is acceptable; missing real work is not.
130
+ When in doubt, emit a conservative ADR with explicit "not discussed" placeholders rather than inventing missing details.
113
131
 
114
132
  TRANSCRIPT FOLLOWS:
115
133
  ---
@@ -160,7 +160,7 @@ PROMPT_HEADER=$(cat <<'EOF'
160
160
  {
161
161
  "operations": [
162
162
  { "op": "delete", "file": "<basename>.md", "reason": "..." },
163
- { "op": "rewrite", "file": "<basename>.md", "slug": "<kebab-case-ukrainian>", "content": "<повний markdown файлу>" },
163
+ { "op": "rewrite", "file": "<basename>.md", "slug": "<kebab-case-ukrainian>", "content": "<повний markdown файлу у MADR 4.0.0>" },
164
164
  { "op": "merge-into", "file": "<basename>.md", "target": "<slug>.md", "additions": "<markdown для дописування>" }
165
165
  ]
166
166
  }
@@ -169,11 +169,15 @@ PROMPT_HEADER=$(cat <<'EOF'
169
169
 
170
170
  1. `delete` — драфт тривіальний / повністю покритий іншим існуючим clean-ADR-ом / порожній. Поясни короткою причиною українською.
171
171
 
172
- 2. `rewrite` — драфт має самостійну цінність. Повертай у `content` повний фінальний вміст файлу:
172
+ 2. `rewrite` — драфт має самостійну цінність як decision record. Повертай у `content` повний фінальний вміст файлу у форматі MADR 4.0.0 minimal:
173
173
  - Без YAML frontmatter (жодного `session:`, `captured:`, `transcript:`).
174
174
  - Заголовок `# <Title>` українською.
175
175
  - Один рядок `**Status:** Accepted` і один рядок `**Date:** YYYY-MM-DD` — дату беремо з поля `captured:` оригінальної чернетки (перші 10 символів ISO-дати).
176
- - Далі розділи **Контекст**, **Рішення/Процедура/Факт**, **Обґрунтування**, **Розглянуті альтернативи**, **Зачіпає** як у драфті, але причесані: цілісні речення, без скорочень, без слідів автогенерованого тегу типу `## Knowledge`.
176
+ - Далі секції з точними MADR headings англійською: `## Context and Problem Statement`, `## Considered Options`, `## Decision Outcome`, `### Consequences`, `## More Information`.
177
+ - У `## Considered Options` перелічуй лише варіанти, які є в драфті/transcript. Якщо альтернатив не було, додай bullet `Інші варіанти в transcript не обговорювалися.`
178
+ - У `## Decision Outcome` використовуй форму `Chosen option: "<option>", because <reason>.` Причина має спиратися на драфт/transcript, без вигаданого business/context.
179
+ - У `### Consequences` пиши bullets `Good, because ...`, `Bad, because ...`, `Neutral, because ...`. Якщо наслідок не зафіксований, явно пиши `transcript не містить підтвердження ...`, не вигадуй.
180
+ - У `## More Information` перенеси файли, команди, публічні API, конфіги й transcript facts. Якщо нема — `Додаткової інформації в transcript не зафіксовано.`
177
181
  - `slug` — kebab-case українською (наприклад `ланцюжок-запуску-abie`, `npm-publish-flow`). Без розширення `.md`. Літери малі, дозволено цифри, дефіс, кирилиця. Якщо тема технічна англійською (назва пакету, ключове слово) — лиши англійською без транслітерації.
178
182
 
179
183
  3. `merge-into` — драфт повторює тему вже існуючого clean-файлу зі списку нижче. `target` — точна назва файлу зі списку (з `.md`). `additions` — лише новий зміст, який варто дописати в кінець target-файлу під підзаголовком `## Update YYYY-MM-DD` (date з `captured` драфта). Якщо нічого нового додати — використовуй `delete`.
@@ -184,6 +188,7 @@ PROMPT_HEADER=$(cat <<'EOF'
184
188
  - Кожен файл з вхідного списку має зʼявитися у `operations` рівно один раз.
185
189
  - Слаги не повторювати між операціями того самого батча. Якщо дві чернетки про одну тему — одна `rewrite`, інша `merge-into target: <slug>.md` з тим самим slug-ом.
186
190
  - Не вигадуй target, якого нема у списку clean-файлів.
191
+ - Не вигадуй альтернативи, decision drivers, наслідки, людей або зовнішній контекст. Якщо даних бракує — явно напиши, що transcript цього не містить.
187
192
 
188
193
  Вхідні драфти і clean-список — нижче.
189
194
  EOF
package/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@
4
4
 
5
5
  Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
6
6
 
7
+ ## [1.13.2] - 2026-05-17
8
+
9
+ ### Changed
10
+
11
+ - **`adr` hook output тепер MADR v4.0.0 minimal** — capture/normalize prompts генерують ADR-и з canonical headings `Context and Problem Statement`, `Considered Options`, `Decision Outcome`, `Consequences`, `More Information`. Prompts стали evidence-bound: якщо transcript не містить альтернатив або підтверджених наслідків, hook явно пише, що даних немає, замість вигадування деталей.
12
+
7
13
  ## [1.13.1] - 2026-05-17
8
14
 
9
15
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.13.1",
3
+ "version": "1.13.2",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
package/rules/adr/adr.mdc CHANGED
@@ -4,9 +4,19 @@ alwaysApply: true
4
4
  version: '2.0'
5
5
  ---
6
6
 
7
- ## Дві фази, один каталог
7
+ ## MADR v4 і дві фази
8
8
 
9
- ADR живуть у єдиному каталозі **`docs/adr/`**. Є два стани файлу, які відрізняються YAML frontmatter:
9
+ ADR живуть у єдиному каталозі **`docs/adr/`**. Clean ADR-и мають формат **MADR v4.0.0 minimal** з точними section headings англійською:
10
+
11
+ - `## Context and Problem Statement`
12
+ - `## Considered Options`
13
+ - `## Decision Outcome`
14
+ - `### Consequences`
15
+ - `## More Information`
16
+
17
+ Вміст секцій — українською, code identifiers / paths / commands — як у transcript. Якщо transcript не містить альтернатив або підтверджених наслідків, hook має явно писати `Інші варіанти в transcript не обговорювалися.` або `transcript не містить підтвердження ...`, а не вигадувати відсутні факти.
18
+
19
+ Є два стани файлу, які відрізняються YAML frontmatter:
10
20
 
11
21
  - **Draft** — файл з frontmatter `session: …`, `captured: …`, `transcript: …` та timestamp-іменем `YYYYMMDD-HHMMSS-<sid>.md`. Пише `capture-decisions.sh` після кожної сесії.
12
22
  - **Clean** — файл без frontmatter, з kebab-case-іменем `<slug>.md` (наприклад `ланцюжок-запуску-abie.md`). Створює `normalize-decisions.sh` або людина руками.
@@ -15,7 +25,7 @@ ADR живуть у єдиному каталозі **`docs/adr/`**. Є два
15
25
 
16
26
  ### Фаза 1 — Capture
17
27
 
18
- Stop-hook `capture-decisions.sh` зчитує JSONL-транскрипт сесії (через `jq`), витягає текст, `thinking`-блоки та назви `tool_use`-викликів, передає компактний дайджест у LLM CLI з промптом українською і записує результат у **`docs/adr/<timestamp>-<session>.md`**, якщо модель повернула блок з шапкою `## ADR|Runbook|Knowledge …`. Якщо модель повернула `NONE` (тривіальна сесія) — нічого не пишеться. Рекурсію з внутрішнього виклику моделі блокує env-var `CAPTURE_DECISIONS_RUNNING=1`.
28
+ Stop-hook `capture-decisions.sh` зчитує JSONL-транскрипт сесії (через `jq`), витягає текст, `thinking`-блоки та назви `tool_use`-викликів, передає компактний дайджест у LLM CLI з evidence-bound промптом і записує результат у **`docs/adr/<timestamp>-<session>.md`**, якщо модель повернула MADR-блок з шапкою `## ADR …`. Якщо модель повернула `NONE` (тривіальна сесія) — нічого не пишеться. Рекурсію з внутрішнього виклику моделі блокує env-var `CAPTURE_DECISIONS_RUNNING=1`.
19
29
 
20
30
  Для Cursor payload скрипт бере `transcript_path`, `conversation_id` / `generation_id` і `workspace_roots[0]`; для Claude Code — `transcript_path`, `session_id` і `CLAUDE_PROJECT_DIR`.
21
31
 
@@ -34,7 +44,7 @@ LLM повертає масив операцій:
34
44
  | `op` | Семантика | Поля |
35
45
  | --- | --- | --- |
36
46
  | `delete` | Чернетка тривіальна / повністю покрита іншим clean-ADR-ом. | `file`, `reason` |
37
- | `rewrite` | Чернетка стає окремим clean-файлом: frontmatter знімається, ім'я → `<slug>.md`, додаються `**Status: Accepted**` і `**Date:**` з `captured`. | `file`, `slug`, `content` |
47
+ | `rewrite` | Чернетка стає окремим clean-файлом MADR v4 minimal: frontmatter знімається, ім'я → `<slug>.md`, додаються `**Status:** Accepted`, `**Date:**` з `captured` і canonical MADR headings. | `file`, `slug`, `content` |
38
48
  | `merge-into` | Чернетка повторює тему вже існуючого clean-файлу; дописуємо `## Update YYYY-MM-DD` у кінець `target`. | `file`, `target`, `additions` |
39
49
 
40
50
  `slug` — kebab-case українською (`ланцюжок-запуску-abie`, `npm-publish-flow`); англійські технічні терміни лишаються англійською без транслітерації. Колізія slug-ів обробляється детермінованим суфіксом `-2`, `-3`.