@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
|
|
86
|
+
You analyze an AI coding session transcript and produce durable decision documentation.
|
|
87
87
|
|
|
88
|
-
LANGUAGE: Write the
|
|
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
|
-
##
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
104
|
-
- Runbook
|
|
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
|
|
127
|
+
- A pure question/answer with no durable decision
|
|
110
128
|
- An aborted/empty session
|
|
111
129
|
|
|
112
|
-
When in doubt, emit a
|
|
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` — драфт має самостійну
|
|
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
|
-
- Далі
|
|
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
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/`**.
|
|
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 з промптом
|
|
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
|
|
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`.
|