@nitra/cursor 1.29.5 → 1.30.0
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 +5 -0
- package/package.json +1 -1
- package/rules/ci4/ci4.mdc +78 -51
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
Усі помітні зміни цього модуля документуються тут.
|
|
4
4
|
|
|
5
5
|
Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
|
|
6
|
+
# [1.30.0] - 2026-05-29
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- **`rules/ci4/ci4.mdc`** (`version` 2.1 → 3.0) — viewer-story повністю переписано під **Zed + marksman LSP без site-generator-а**. MkDocs Material і pymdownx-розширення (`!!! note`, `??? engineer`, `=== "tab"`, кастомні audience-CSS) прибрані як рекомендація: їх не рендерить вбудований MD-preview Zed, що ламає принцип «відкрив файл = бачу фінальний вигляд». Collapsible-блоки для змішаної аудиторії — через нативний HTML5 `<details>` / `<summary>`, що рендериться скрізь (Zed preview, GitHub, будь-який майбутній збирач) без розширень парсера. Введено **portable-only subset**: CommonMark + GFM + Mermaid у fenced code + KaTeX + `<details>`; заборонені VitePress containers (`::: tip`), MDX/Astro-компоненти, Hugo shortcodes, AsciiDoc-вкраплення, RST-директиви. Конвенція маркера у `<summary>`: перше слово — аудиторія з фіксованого словника (`Engineer:`/`Ops:`/`Security:`/`Manager:`) → детермінований regex для валідатора. Валідатор отримав чотири нові перевірки: жоден `Engineer:`/`Ops:`/`Security:` блок у manager-only проекціях; кожен `<details>` має оточуючі порожні рядки (інакше `<summary>` рендериться як plain HTML); у `docs/` немає заборонених framework-specific конструкцій; inter-doc посилання працюють для marksman LSP (відносні шляхи або wiki-links). Промпт-скелет LLM-проекцій оновлено — генератор видає `<details>`, не `???`, і дотримується списку заборонених синтаксисів. Subset **forward-compatible**: будь-який збирач (MkDocs, VitePress, Antora) підключається пізніше без переписування контенту. Дзеркало `.cursor/rules/n-ci4.mdc` синхронізується наступним прогоном `npx @nitra/cursor`.
|
|
6
11
|
|
|
7
12
|
## [1.29.5] - 2026-05-29
|
|
8
13
|
|
package/package.json
CHANGED
package/rules/ci4/ci4.mdc
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Архітектурна документація продукту — Markdown як джерело істини; рекомендований стек arc42 + Diátaxis + ADR (MADR v4, формат описаний у правилі `adr`) + C4 як набір нотацій; гібридна модель manual + autogen-зон, що регенеруються з accepted ADR;
|
|
2
|
+
description: Архітектурна документація продукту — Markdown як джерело істини; рекомендований стек arc42 + Diátaxis + ADR (MADR v4, формат описаний у правилі `adr`) + C4 як набір нотацій; гібридна модель manual + autogen-зон, що регенеруються з accepted ADR; Zed + marksman LSP як viewer без site-generator-а, portable subset (CommonMark + GFM + Mermaid + KaTeX), collapsible engineer-блоки через нативний `<details>`
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: '
|
|
4
|
+
version: '3.0'
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
Архітектурна документація проєкту живе у Markdown поряд із кодом. Це не довідник «для людей із порталу архітектора» — це **джерело істини**, з якого LLM-агент і людина читають намір системи перед будь-якою зміною коду. Тому правила нижче — не оформлення, а робочий процес: який стек використовуємо, як зберігаємо рішення, як автоматично перегенеровуємо проекції з ADR і як рендеримо для змішаної аудиторії (менеджери + інженери + ops).
|
|
@@ -47,7 +47,7 @@ RAG витягує **фрагменти**, не цілі документи. Т
|
|
|
47
47
|
|
|
48
48
|
Доповнюємо **під domain**:
|
|
49
49
|
|
|
50
|
-
- **DDD Context Maps** — коли є >1 bounded context (типово для multi-agent: agents, orchestration, memory, tooling). Одна Mermaid-діаграма в `explanation/architecture.md`, ховається під
|
|
50
|
+
- **DDD Context Maps** — коли є >1 bounded context (типово для multi-agent: agents, orchestration, memory, tooling). Одна Mermaid-діаграма в `explanation/architecture.md`, ховається під `<details><summary><strong>Engineer:</strong> Context Map</summary>`.
|
|
51
51
|
- **EventModeling** — для event-driven систем (агентські pipeline, CQRS, Event Sourcing). Структура: trigger → command → event → read model. Читається менеджером як наратив, інженером — як креслення.
|
|
52
52
|
- **Business Capability Map** — верхньорівневий manager-overview. Autogen через семантичну класифікацію accepted ADR за тематикою.
|
|
53
53
|
- **Wardley Map** — стратегічний артефакт для board/інвесторів. Manual, не autogen. Квартальне оновлення. Живе в `explanation/strategy.md`.
|
|
@@ -108,7 +108,7 @@ docs/
|
|
|
108
108
|
|
|
109
109
|
## Гібрид manual + autogen
|
|
110
110
|
|
|
111
|
-
Реальні проєкти мають legacy docs, написані до появи ADR. Розв'язок — **зони** через HTML-коментарі (виживають у Markdown, не рендеряться у
|
|
111
|
+
Реальні проєкти мають legacy docs, написані до появи ADR. Розв'язок — **зони** через HTML-коментарі (виживають у Markdown, не рендеряться у жодному MD viewer — ні в Zed built-in preview, ні на GitHub, ні в будь-якому майбутньому site-generator-і):
|
|
112
112
|
|
|
113
113
|
```markdown
|
|
114
114
|
# User Service
|
|
@@ -191,61 +191,68 @@ User Service відповідає за автентифікацію та про
|
|
|
191
191
|
- **Incremental**: LLM отримує поточний doc + новий ADR (або `## Update`) — видає diff. Дешевше, але дрейф накопичується.
|
|
192
192
|
- **Компроміс**: incremental + періодичний full rebuild (раз на місяць або після N нових ADR).
|
|
193
193
|
|
|
194
|
-
##
|
|
194
|
+
## Viewer/editor: Zed + marksman LSP
|
|
195
195
|
|
|
196
|
-
|
|
196
|
+
Окремого site-generator-а **немає** — каталог `docs/` сам є інтерфейсом читання. Інженер відкриває `.md`-файл у Zed і одразу бачить рендер через built-in preview (`cmd+shift+m`). Між сторінками рухається через **`marksman`** LSP: `cmd+click` по `[link](file.md)` і `[[wiki-link]]`, автокомпліт заголовків, find-references, refactor-перейменування заголовків з оновленням посилань у всьому `docs/`.
|
|
197
197
|
|
|
198
|
-
|
|
198
|
+
`~/.config/zed/settings.json`:
|
|
199
199
|
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"languages": {
|
|
203
|
+
"Markdown": {
|
|
204
|
+
"language_servers": ["marksman"],
|
|
205
|
+
"soft_wrap": "editor_width"
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
206
210
|
|
|
207
|
-
|
|
208
|
-
- admonition
|
|
209
|
-
- pymdownx.details
|
|
210
|
-
- pymdownx.superfences
|
|
211
|
-
- pymdownx.tabbed: { alternate_style: true }
|
|
212
|
-
- attr_list
|
|
211
|
+
**Portable-only синтаксис.** Усе, що пишемо в `docs/`, обмежене **CommonMark + GFM + Mermaid у fenced code (` ```mermaid `) + KaTeX (`$...$`) + нативний HTML5 `<details>`**. Заборонено:
|
|
213
212
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
213
|
+
- pymdownx admonitions (`!!! note`, `??? engineer`, `=== "tab"`)
|
|
214
|
+
- VitePress containers (`::: tip`, `::: details`)
|
|
215
|
+
- MDX/Astro-компоненти (`<MyComponent />`)
|
|
216
|
+
- Hugo shortcodes (`{{< youtube id >}}`)
|
|
217
|
+
- AsciiDoc-вкраплення, RST-директиви
|
|
218
|
+
|
|
219
|
+
Усе вище не рендериться у Zed built-in preview і ламає головний принцип: **«відкрив файл = побачив фінальний вигляд»**. Обмеження **forward-compatible**: portable subset рендериться у GitHub, MkDocs, VitePress, Antora — підключення збирача в майбутньому не потребує переписування контенту.
|
|
217
220
|
|
|
218
|
-
|
|
221
|
+
## Collapsible-блоки для змішаної аудиторії
|
|
222
|
+
|
|
223
|
+
Менеджер читає прозу зверху, інженер розгортає деталі. Реалізація — нативний HTML5 `<details>` / `<summary>`, що рендериться **скрізь**: Zed preview, GitHub, будь-який майбутній збирач. Жодних розширень парсера не треба.
|
|
219
224
|
|
|
220
225
|
```markdown
|
|
221
226
|
User Service автентифікує користувачів і керує профілями.
|
|
222
227
|
Підтримуємо OIDC-логін та email/password.
|
|
223
228
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
229
|
+
<details>
|
|
230
|
+
<summary><strong>Engineer:</strong> Технічна реалізація автентифікації</summary>
|
|
231
|
+
|
|
232
|
+
OIDC-сервер на Fastify з PKCE flow [oidc-pkce-flow].
|
|
233
|
+
Refresh-токени з rotation, TTL 30 днів, Redis storage.
|
|
234
|
+
|
|
235
|
+
</details>
|
|
227
236
|
|
|
228
237
|
Профілі зберігаються в основній БД, кешуються в Redis на 5 хв.
|
|
229
238
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
239
|
+
<details>
|
|
240
|
+
<summary><strong>Ops:</strong> Деталі кешу та інвалідації</summary>
|
|
241
|
+
|
|
242
|
+
Cache key: `user:profile:{userId}:v2`.
|
|
243
|
+
Інвалідація — NATS подія `user.profile.updated` [user-profile-events].
|
|
244
|
+
|
|
245
|
+
</details>
|
|
233
246
|
```
|
|
234
247
|
|
|
235
|
-
|
|
248
|
+
**Конвенція маркера у `<summary>`:** перше слово — аудиторія з фіксованого словника (`Engineer:`, `Ops:`, `Security:`, `Manager:`), далі — описова назва. Це дає валідатору детермінований regex для перевірок типу «жоден `Engineer:`-блок не з'являється в manager-only проекціях».
|
|
236
249
|
|
|
237
|
-
|
|
250
|
+
**Технічні нюанси `<details>`:**
|
|
238
251
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
}
|
|
244
|
-
.md-typeset details.ops > summary {
|
|
245
|
-
background-color: rgba(255, 152, 0, 0.1);
|
|
246
|
-
border-color: #ff9800;
|
|
247
|
-
}
|
|
248
|
-
```
|
|
252
|
+
- порожній рядок до `<details>` і після `<summary>` обов'язковий — інакше Markdown-парсер не активує блочний рендер усередині
|
|
253
|
+
- за замовчуванням блок згорнутий; `<details open>` — розгорнутий
|
|
254
|
+
- візуальна типізація аудиторій робиться **через текст `<summary>`**, не через CSS — у Zed preview кастомні стилі недоступні
|
|
255
|
+
- `<details>` ≠ HTML-обгортка з правила «жодних `<div>`/`<span>`»: це **семантичний** HTML5-елемент, а не презентаційний; його token-cost мізерний
|
|
249
256
|
|
|
250
257
|
## Промпт для LLM-проекцій
|
|
251
258
|
|
|
@@ -259,21 +266,35 @@ User Service автентифікує користувачів і керує п
|
|
|
259
266
|
як пов'язано з іншими частинами продукту. Без технологій, версій, коду.
|
|
260
267
|
|
|
261
268
|
2. Технічні деталі — тільки всередині блоків:
|
|
262
|
-
|
|
263
|
-
|
|
269
|
+
<details>
|
|
270
|
+
<summary><strong>Engineer:</strong> Описова назва блоку</summary>
|
|
271
|
+
|
|
272
|
+
Код, конфіги, версії, посилання на ADR.
|
|
273
|
+
|
|
274
|
+
</details>
|
|
264
275
|
|
|
265
276
|
3. Operational деталі:
|
|
266
|
-
|
|
277
|
+
<details>
|
|
278
|
+
<summary><strong>Ops:</strong> Що моніторити та як реагувати</summary>
|
|
279
|
+
|
|
280
|
+
Метрики, алерти, runbook-кроки.
|
|
281
|
+
|
|
282
|
+
</details>
|
|
267
283
|
|
|
268
284
|
Правила:
|
|
269
|
-
- Якщо прибрати всі
|
|
270
|
-
-
|
|
285
|
+
- Якщо прибрати всі <details>-блоки, текст лишається зв'язним менеджерським документом.
|
|
286
|
+
- Перше слово у <summary> — аудиторія з фіксованого словника
|
|
287
|
+
(Engineer:/Ops:/Security:/Manager:), далі — описова назва
|
|
288
|
+
(наприклад «<strong>Engineer:</strong> Чому Percona, а не MariaDB»).
|
|
289
|
+
- Порожній рядок до і після вмісту <details> обов'язковий.
|
|
290
|
+
- Кожен факт з ADR маркуй [<slug>] всередині <details>-блоку — slug це ім'я clean ADR
|
|
271
291
|
без розширення (наприклад `[ланцюжок-запуску-abie]`).
|
|
272
|
-
- Назви блоків — описові («Чому Percona, а не MariaDB»).
|
|
273
292
|
- НЕ виходь за межі <!-- AUTOGEN:start --> ... <!-- AUTOGEN:end -->.
|
|
274
293
|
- ADR без рядка `**Status:** Accepted` ігноруй.
|
|
275
294
|
- Якщо в ADR є `## Update YYYY-MM-DD` секції — враховуй найсвіжіший стан рішення,
|
|
276
295
|
старі формулювання вважай застарілими.
|
|
296
|
+
- Заборонені framework-specific synaxes: !!! note, ??? engineer, ::: tip,
|
|
297
|
+
MDX-компоненти, Hugo shortcodes — тільки CommonMark + GFM + Mermaid + <details>.
|
|
277
298
|
```
|
|
278
299
|
|
|
279
300
|
## Типові поломки LLM і захист
|
|
@@ -293,7 +314,10 @@ User Service автентифікує користувачів і керує п
|
|
|
293
314
|
- Усі `[<slug>]` посилання вказують на існуючі файли `docs/adr/<slug>.md` із рядком `**Status:** Accepted`
|
|
294
315
|
- Усі `AUTOGEN:start` мають парний `AUTOGEN:end` з тим самим `id`
|
|
295
316
|
- Hash у `manifest.json` відповідає фактичному контенту зон
|
|
296
|
-
- Жоден
|
|
317
|
+
- Жоден `<details>`-блок з `<summary>` що починається на `Engineer:` / `Ops:` / `Security:` не з'являється в manager-only проекціях
|
|
318
|
+
- Кожен `<details>` має оточуючі порожні рядки (інакше `<summary>`-вміст рендериться як plain HTML, не collapsible)
|
|
319
|
+
- У `docs/` немає заборонених framework-specific конструкцій: `!!! note`, `??? `, `::: tip`, `::: details`, MDX-теги `<[A-Z][a-zA-Z]*`, Hugo shortcodes `{{< `
|
|
320
|
+
- Усі inter-doc посилання працюють для `marksman` LSP (відносні шляхи `[text](./other.md)` або `[[wiki-link]]`, не absolute URLs усередині `docs/`)
|
|
297
321
|
- Якщо в зоні згадано компонент — він є в `docs/glossary.md`
|
|
298
322
|
- ADR без `**Status:** Accepted` не потрапили у проекцію
|
|
299
323
|
|
|
@@ -317,7 +341,7 @@ ADR (`docs/adr/<slug>.md`) — джерело правди для autogen-про
|
|
|
317
341
|
|
|
318
342
|
## Зв'язок із документацією
|
|
319
343
|
|
|
320
|
-
Архітектурні артефакти — частина **користувацької документації**, а не закритий артефакт для команди. Контекстна діаграма (C4 рівень 1) і контейнерна (рівень 2) живуть там, де читач шукає вступ у проєкт — у `explanation/architecture.md`, не у відокремленій теці «for-architects».
|
|
344
|
+
Архітектурні артефакти — частина **користувацької документації**, а не закритий артефакт для команди. Контекстна діаграма (C4 рівень 1) і контейнерна (рівень 2) живуть там, де читач шукає вступ у проєкт — у `explanation/architecture.md`, не у відокремленій теці «for-architects». Нативний `<details>`-блок дає collapsible-вигляд у будь-якому MD-viewer (Zed built-in preview, GitHub web UI, потенційний майбутній site-generator) без залежності від конкретного фреймворку — менеджер бачить прозу, інженер розгортає деталі.
|
|
321
345
|
|
|
322
346
|
## Зв'язок із `.cursor/rules`
|
|
323
347
|
|
|
@@ -330,8 +354,11 @@ ADR (`docs/adr/<slug>.md`) — джерело правди для autogen-про
|
|
|
330
354
|
- **Claude Code** як runner — slash-команда `/regen-docs` або post-commit hook на зміни `docs/adr/**`
|
|
331
355
|
- **capture-decisions.sh** + **normalize-decisions.sh** — Stop-hooks створення ADR (керує правило `adr`)
|
|
332
356
|
- **gray-matter** на Bun — лише для парсингу draft frontmatter; clean ADR парситься regexp по `**Status:**` / `**Date:**`
|
|
333
|
-
- **
|
|
334
|
-
- **
|
|
357
|
+
- **Zed** як viewer/editor — built-in MD preview (`cmd+shift+m`) рендерить кожен файл без site-generator-а; `<details>` для collapsible-блоків
|
|
358
|
+
- **marksman** LSP як шар навігації — `cmd+click` по `[text](file.md)`/`[[wiki-link]]`, find-references, refactor-перейменування заголовків
|
|
359
|
+
- **Mermaid** для C4-діаграм, EventModeling, Context Maps — рендериться у Zed preview напряму з ` ```mermaid ` fenced code, без розширень
|
|
360
|
+
- **KaTeX** (опційно) — інлайн-математика `$...$` для метрик/формул; рендериться у Zed preview
|
|
361
|
+
- Site-generator (MkDocs Material / VitePress / Antora) — **не використовується**; portable subset гарантує, що його можна підключити пізніше без переписування контенту
|
|
335
362
|
|
|
336
363
|
## Query mode як бонус
|
|
337
364
|
|