kodu 2.1.1 → 2.1.3

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.
Files changed (32) hide show
  1. package/AGENTS.md +23 -1
  2. package/__tests__/core/fs/fs.service.test.ts +72 -0
  3. package/__tests__/shared/cleaner/cleaner.service.test.ts +102 -0
  4. package/__tests__/shared/git/git.service.test.ts +84 -0
  5. package/__tests__/shared/tokenizer/tokenizer.service.test.ts +45 -0
  6. package/dist/package.json +14 -3
  7. package/dist/src/commands/init/init.command.d.ts +1 -0
  8. package/dist/src/commands/init/init.command.js +34 -1
  9. package/dist/src/commands/init/init.command.js.map +1 -1
  10. package/dist/src/core/config/config.service.js +2 -4
  11. package/dist/src/core/config/config.service.js.map +1 -1
  12. package/dist/tsconfig.build.tsbuildinfo +1 -1
  13. package/lefthook.yml +9 -2
  14. package/package.json +14 -3
  15. package/skills/doc-gen/SKILL.md +490 -0
  16. package/skills/doc-gen/scripts/doc_gen.py +911 -0
  17. package/skills/implement-project/SKILL.md +409 -0
  18. package/skills/liteend-init/SKILL.md +84 -0
  19. package/skills/litefront-init/SKILL.md +96 -0
  20. package/skills/litefront-prototype/SKILL.md +484 -0
  21. package/skills/project-setup-standardizer/SKILL.md +285 -0
  22. package/skills/start/SKILL.md +319 -0
  23. package/skills/tech-blueprint/SKILL.md +890 -0
  24. package/skills/tech-blueprint/scripts/blueprint_validator.py +417 -0
  25. package/src/commands/init/init.command.ts +43 -1
  26. package/src/core/config/config.service.ts +3 -6
  27. package/tsconfig.build.json +3 -0
  28. package/tsconfig.json +5 -2
  29. package/dist/scripts/generate-json-schema.d.ts +0 -1
  30. package/dist/scripts/generate-json-schema.js +0 -17
  31. package/dist/scripts/generate-json-schema.js.map +0 -1
  32. package/skills/kodu-ops/SKILL.md +0 -184
package/lefthook.yml CHANGED
@@ -1,4 +1,11 @@
1
1
  pre-commit:
2
- jobs:
3
- - name: Check project
2
+ parallel: false
3
+ commands:
4
+ check:
4
5
  run: npm run check
6
+
7
+ pre-push:
8
+ parallel: false
9
+ commands:
10
+ test:
11
+ run: npm run test
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kodu",
3
- "version": "2.1.1",
3
+ "version": "2.1.3",
4
4
  "description": "High-performance CLI to prepare codebase for LLMs, automate reviews, and draft commits.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,6 +34,7 @@
34
34
  "generate:schema": "ts-node scripts/generate-json-schema.ts",
35
35
  "postbuild": "npm run generate:schema",
36
36
  "start:prod": "node dist/main.js",
37
+ "start:dev": "nest start --watch",
37
38
  "new:command": "nest g -c nest-commander-schematics command",
38
39
  "new:question": "nest g -c nest-commander-schematics question",
39
40
  "________________ FORMAT AND LINT ________________": "",
@@ -43,8 +44,14 @@
43
44
  "ts:check": "tsc --noEmit",
44
45
  "knip": "knip --production",
45
46
  "check": "run-p ts:check lint:fix knip",
47
+ "________________ TEST ________________": "",
48
+ "test": "vitest run",
49
+ "test:watch": "vitest",
50
+ "test:cov": "vitest run --coverage",
46
51
  "________________ OTHER ________________": "",
47
- "prepare": "lefthook install"
52
+ "prepare": "is-ci || lefthook install",
53
+ "update": "npx npm-check-updates -u && rimraf node_modules package-lock.json && npm i",
54
+ "postupdate": "npm run lint:fix && npm run check"
48
55
  },
49
56
  "dependencies": {
50
57
  "@inquirer/confirm": "^6.0.4",
@@ -73,13 +80,17 @@
73
80
  "@nestjs/schematics": "^11.0.0",
74
81
  "@nestjs/testing": "^11.0.1",
75
82
  "@types/node": "^22.10.7",
83
+ "is-ci": "^4.1.0",
76
84
  "knip": "^5.82.1",
77
85
  "lefthook": "^2.0.15",
78
86
  "nest-commander-schematics": "^3.2.0",
87
+ "npm-check-updates": "^18.3.1",
79
88
  "npm-run-all": "^4.1.5",
89
+ "rimraf": "^6.1.3",
80
90
  "ts-loader": "^9.5.2",
81
91
  "ts-node": "^10.9.2",
82
92
  "tsconfig-paths": "^4.2.0",
83
- "typescript": "^5.7.3"
93
+ "typescript": "^5.7.3",
94
+ "vitest": "^3.2.4"
84
95
  }
85
96
  }
@@ -0,0 +1,490 @@
1
+ ---
2
+ name: doc-gen
3
+ description: Генерирует документацию продукта уровня MVP+. Запускай когда пользователь явно планирует новый продукт/сервис/приложение или просит помочь со структурой проекта. НЕ запускай при вопросах о существующем коде, разовых задачах («напиши скрипт», «исправь баг») или учебных упражнениях.
4
+ license: MIT
5
+ compatibility: opencode
6
+ metadata:
7
+ level: multi
8
+ output: папка с markdown-файлами
9
+ ---
10
+
11
+ ## Назначение
12
+
13
+ Скилл создаёт два документа, которые полностью описывают продукт для разработки:
14
+ - **Концепция** (VISION.md) — зачем создаётся продукт и для кого
15
+ - **Спецификация** (SPEC.md) — из чего состоит продукт, достаточно для начала разработки
16
+
17
+ **Когда запускать:**
18
+ - Пользователь описывает **новый продукт** или **сервис** и планирует его строить
19
+ - Пользователь просит **структурировать проект** или описать архитектуру
20
+ - Пользователь говорит «хочу сделать X» в контексте продукта или сервиса
21
+
22
+ **Когда НЕ запускать:**
23
+ - Вопрос о коде существующего проекта
24
+ - Разовая задача («напиши скрипт», «добавь функцию»)
25
+ - Учебный или тестовый проект без цели развивать
26
+
27
+ ---
28
+
29
+ ## Входные данные
30
+
31
+ Пользователь предоставляет **минимальное описание**:
32
+ 1. Какую проблему решает продукт
33
+ 2. Кто будет пользоваться
34
+ 3. Что должно работать в первую очередь
35
+
36
+ Если данных недостаточно — задать **не более 2 уточняющих вопросов**.
37
+
38
+ ---
39
+
40
+ ## Структура вывода
41
+
42
+ ```
43
+ <имя проекта>/
44
+ ├── INDEX.md — оглавление
45
+ ├── 1_PRODUCT_VISION/
46
+ │ └── VISION.md — концепция продукта
47
+ ├── 2_PRODUCT_SPEC/
48
+ │ └── SPEC.md — спецификация продукта
49
+ └── 3_ARTIFACTS/ — вспомогательные материалы
50
+ ├── legal/ — юридические документы (договоры, оферты, политики конфиденциальности)
51
+ ├── media/
52
+ │ ├── images/ — изображения (логотипы, скриншоты, схемы, мокапы)
53
+ │ └── video/ — видеоматериалы (демо, инструкции)
54
+ ├── content/ — тексты для страниц и маркетинговые материалы
55
+ └── examples/ — примеры контента, шаблоны, тестовые данные
56
+ ```
57
+
58
+ ---
59
+
60
+ ## Артефакты (3_ARTIFACTS/)
61
+
62
+ Артефакты — вспомогательные материалы, на которые ссылаются документы. Это не исходный код и не дополнительная документация — это конкретные файлы, нужные для разработки или запуска продукта.
63
+
64
+ ### Организация папок
65
+
66
+ | Папка | Что хранить |
67
+ |-------|-------------|
68
+ | `legal/` | Договоры, оферты, политики конфиденциальности, условия использования, лицензионные соглашения |
69
+ | `media/images/` | Логотипы, брендинг, скриншоты интерфейсов, схемы архитектуры, мокапы страниц |
70
+ | `media/video/` | Демо продукта, обучающие видео, презентации |
71
+ | `content/` | Тексты для страниц сайта, маркетинговые тексты, email-шаблоны, FAQ |
72
+ | `examples/` | Примеры заполнения форм, шаблоны контента, тестовые наборы данных |
73
+
74
+ ### Правила работы с артефактами
75
+
76
+ - **Папку `3_ARTIFACTS/` и подпапки создавать только при наличии реального файла для размещения.** Пустые папки запрещены.
77
+ - **Каждый артефакт** должен быть явно упомянут хотя бы в одном документе (VISION.md, SPEC.md или INDEX.md)
78
+ - **SPEC.md** должен содержать раздел `## Артефакты` со ссылками на все файлы из `3_ARTIFACTS/`
79
+ - **INDEX.md** должен содержать быстрые ссылки на ключевые артефакты
80
+ - Ссылки — **относительные**, например `../3_ARTIFACTS/legal/privacy-policy.md`
81
+ - Имена файлов — латинские буквы, дефисы, без пробелов: `privacy-policy.pdf`, `logo-main.svg`
82
+ - **Не добавлять в SPEC.md ссылки-заглушки** на файлы, которых ещё не существует
83
+
84
+ ---
85
+
86
+ ## Процесс работы
87
+
88
+ > **Скрипт:** `~/.config/opencode/skills/doc-gen/scripts/doc_gen.py`
89
+ > Скрипт НЕ копируется в проект — используется напрямую из папки скилла.
90
+ > Далее в примерах: `{DOC_GEN}` = полный путь выше.
91
+
92
+ ### Шаг 1. Сбор информации
93
+ Задать не более **2 уточняющих вопросов**. Если заявленный функционал явно избыточен для первой версии — указать до начала генерации.
94
+
95
+ ### Шаг 2. Создание структуры файлов
96
+ ```bash
97
+ python3 {DOC_GEN} generate "НазваниеПроекта"
98
+
99
+ # Только концепция (VISION.md):
100
+ python3 {DOC_GEN} generate "НазваниеПроекта" --only L1
101
+
102
+ # Только спецификация (SPEC.md):
103
+ python3 {DOC_GEN} generate "НазваниеПроекта" --only L2
104
+
105
+ # Дополнение без перезаписи существующих файлов:
106
+ python3 {DOC_GEN} generate "НазваниеПроекта" --update
107
+ ```
108
+
109
+ Команда `generate` **не создаёт** папку `3_ARTIFACTS/` автоматически. Папка и подпапки создаются **только при размещении реального файла-артефакта**. Если артефактов нет — раздел `## Артефакты` в SPEC.md **должен присутствовать** с явной пометкой: «Артефактов нет.»
110
+
111
+ ### Шаг 3. Заполнение документов
112
+ Заполнять **строго в порядке**: VISION.md → SPEC.md. Все ссылки — относительные.
113
+
114
+ **Обязательные правила заполнения:**
115
+ - Незаполненных заглушек (текст в `[квадратных скобках]`) быть не должно
116
+ - Каждый раздел либо **заполнен конкретным содержимым**, либо **явно содержит отрицание** (например: «Интеграций нет.»)
117
+ - **Запрещено** писать «при необходимости», «опционально», «возможно» — только конкретные утверждения
118
+ - Нет опциональных решений: либо что-то **есть** в продукте, либо **явно написано**, что его нет
119
+
120
+ ### Шаг 4. Полная проверка: структура + согласованность **(обязательно)**
121
+ После **любого** изменения документации запускать полную валидацию:
122
+ ```bash
123
+ python3 {DOC_GEN} validate "НазваниеПроекта"
124
+ ```
125
+ **Документация не считается готовой, пока валидация не пройдена без ошибок.**
126
+
127
+ Скрипт выполняет **два блока проверок последовательно**:
128
+
129
+ **Блок 1 — Структура и содержимое:**
130
+ - Все обязательные файлы существуют
131
+ - Все обязательные разделы присутствуют в каждом файле
132
+ - Строки **Статус** и **Дата** присутствуют
133
+ - Незаполненных заглушек `[...]` нет
134
+ - Запрещённые слова/фразы отсутствуют («возможно», «удобно», «быстро», «опционально» и др.)
135
+ - Разделы VISION/SPEC не слишком короткие (минимум 60 символов)
136
+ - Целевые значения в «Метрики успеха» содержат числа
137
+ - Раздел `## Артефакты` присутствует в SPEC.md (либо с ссылками, либо с «Артефактов нет.»)
138
+ - Каждый файл в `3_ARTIFACTS/` упомянут хотя бы в одном документе (нет «мёртвых» артефактов)
139
+
140
+ **Блок 2 — Согласованность и противоречия (автоматически):**
141
+ - `[VISION]` Попарная проверка: «Что входит» ↔ «Что НЕ входит» (≥2 общих слова у пары → флаг)
142
+ - `[VISION]` Попарно: «Цель» конфликтует с «Что НЕ входит»
143
+ - `[VISION→SPEC]` Исключённые элементы VISION обнаружены в SPEC операциях/страницах
144
+ - `[VISION→SPEC]` Ключевые возможности VISION не отражены в SPEC (<40% ключевых слов)
145
+ - `[VISION→SPEC]` Пункты «Что входит» не покрыты в SPEC (<35% ключевых слов)
146
+ - `[SPEC]` Сущности не упоминаются в «Ключевые операции»
147
+ - `[SPEC]` Отсутствуют обязательные подразделы «Тестирование»
148
+ - `[SPEC]` Термины глоссария нигде не используются
149
+
150
+ Для изолированного запуска только анализа согласованности:
151
+ ```bash
152
+ python3 {DOC_GEN} consistency "НазваниеПроекта"
153
+ ```
154
+
155
+ ### Шаг 5. AI-проверка качества **(обязательно)**
156
+ После успешного `validate` — выполнить вручную. Скрипт эти вещи не проверяет.
157
+
158
+ **Читаемость и форматирование:**
159
+ 1. Каждая возможность в «Ключевые возможности» имеет **жирное название** (`**Название**:`) и стрелку `→` — формат «пользователь делает X → получает Y»
160
+ 2. Разделы «Проблема», «Целевая аудитория», «Цель», «Как устроена система» содержат хотя бы одно **жирное** ключевое утверждение для быстрого сканирования
161
+ 3. Нет монолитных абзацев — предложения разбиты; ни одно предложение не длиннее 2–3 строк
162
+ 4. Разделы «Ключевые возможности», «Что входит», «Что НЕ входит», «Ключевые операции» оформлены именно как списки, а не сплошной текст
163
+ 5. Жирным не выделено всё подряд — только ключевые слова/действия (не более 30% строк в разделе)
164
+
165
+ **Логика и смысл:**
166
+ 6. «Цель» конкретно решает «Проблему» — нет разрыва между описанием боли и описанием продукта
167
+ 7. Каждая метрика успеха измеряет именно заявленную «Цель», а не общий рост бизнеса
168
+ 8. «Что НЕ входит» не противоречит «Ключевым возможностям» по смыслу (не только по ключевым словам — проверить значение)
169
+ 9. Сценарии тестирования охватывают реальные риски данного домена, а не только шаблонные кейсы
170
+
171
+ **Язык:**
172
+ 10. «Ключевые операции» описывают **результат для пользователя**, не технический процесс («пользователь видит список заказов», а не «система возвращает массив объектов»)
173
+ 11. Термины в «Глоссарии» действительно требуют пояснения — не добавлены очевидные слова типа «пользователь» или «система»
174
+ 12. Нигде нет технического жаргона (эндпоинт, CRUD, ORM, REST, JSON и т.п.) — исключение: продукт-API, там это допустимо в разделе «Страницы и экраны»
175
+
176
+ ### Шаг 6. Git-коммит **(обязательно)**
177
+ После каждого изменения документации создавать **коммит**:
178
+ ```bash
179
+ git add docs/
180
+ git commit -m "docs: обновление документации <НазваниеПроекта>"
181
+ ```
182
+ Если **git-репозитория нет** — создать его до первого коммита:
183
+ ```bash
184
+ git init
185
+ git add .
186
+ git commit -m "docs: начальная документация <НазваниеПроекта>"
187
+ ```
188
+ **Git-репозиторий обязателен.** Без него история изменений недоступна.
189
+
190
+ ---
191
+
192
+ ## Команды управления
193
+
194
+ ### Статус документации
195
+ ```bash
196
+ # Все проекты в папке docs/:
197
+ python3 {DOC_GEN} status
198
+
199
+ # Конкретный проект:
200
+ python3 {DOC_GEN} status "НазваниеПроекта"
201
+ ```
202
+ Выводит таблицу: проект / файл / статус / дата.
203
+
204
+ ### Обновление статуса
205
+ ```bash
206
+ python3 {DOC_GEN} update-status "НазваниеПроекта" "на ревью"
207
+ python3 {DOC_GEN} update-status "НазваниеПроекта" "утверждён"
208
+ python3 {DOC_GEN} update-status "НазваниеПроекта" "черновик"
209
+ ```
210
+ Атомарно обновляет **Статус** и **Дата** во всех трёх файлах (INDEX.md, VISION.md, SPEC.md). После — создать git-коммит.
211
+
212
+ ### Только анализ согласованности
213
+ ```bash
214
+ python3 {DOC_GEN} consistency "НазваниеПроекта"
215
+ ```
216
+ Запускает только Блок 2 без структурной проверки. Полезно при итеративной правке содержимого.
217
+
218
+ ---
219
+
220
+ ## Управление статусом документов
221
+
222
+ Каждый документ содержит строку статуса в начале:
223
+ ```
224
+ **Статус:** черновик | **Дата:** YYYY-MM-DD
225
+ ```
226
+
227
+ | Статус | Условие перехода |
228
+ |--------|-----------------|
229
+ | `черновик` | Документ создан, не проверен командой |
230
+ | `на ревью` | Документ отправлен на проверку |
231
+ | `утверждён` | Документ согласован и готов к разработке |
232
+
233
+ **Дату** обновлять при каждом значимом изменении. История изменений — `git log -- <файл>`.
234
+
235
+ ---
236
+
237
+ ## Правила написания концепции (VISION.md)
238
+
239
+ **Плохой пример:**
240
+ - «Сделать авторизацию»
241
+ - «Приложение для заметок»
242
+
243
+ **Хороший пример:**
244
+ - «Вход через внешние сервисы (Google, GitHub) без хранения паролей»
245
+ - «Мобильное приложение для заметок с работой без интернета для пользователей с нестабильным подключением»
246
+
247
+ ### Обязательная структура VISION.md
248
+
249
+ ```markdown
250
+ # <Название продукта>
251
+
252
+ **Статус:** черновик | **Дата:** YYYY-MM-DD
253
+
254
+ ## Проблема
255
+ Что конкретно неудобно или не работает. Контекст. 2–4 предложения.
256
+
257
+ ## Целевая аудитория
258
+ Роль и контекст работы пользователя. Не «все пользователи», а конкретный тип. 2–4 предложения.
259
+
260
+ ## Цель
261
+ Что именно создаём и для кого. 2–4 предложения.
262
+
263
+ ## Ключевые возможности
264
+ 1. **<Название>**: пользователь выполняет X → получает Y
265
+ 2. ...
266
+
267
+ ## Метрики успеха
268
+ | Метрика | Целевое значение |
269
+ |---------|------------------|
270
+ | ... | конкретное число |
271
+
272
+ ## Что входит (границы проекта)
273
+ Функциональность, которая будет реализована:
274
+ 1. ...
275
+
276
+ ## Что НЕ входит
277
+ Явные исключения для предотвращения расширения границ проекта:
278
+ - Не включает X
279
+ - Не включает Y
280
+ ```
281
+
282
+ ### Правила раздела
283
+
284
+ - Без упоминания **технологий и стека** разработки
285
+ - **Конкретные метрики** с числами (не «быстрее» — а «менее 2 секунд»)
286
+ - Каждая возможность объясняет **ценность для пользователя**
287
+ - Оба раздела границ проекта заполнены
288
+
289
+ ---
290
+
291
+ ## Правила написания спецификации (SPEC.md)
292
+
293
+ Документ описывает **из чего состоит продукт** в терминах бизнеса. Без технических деталей реализации — но **достаточно конкретно**, чтобы разработчик мог начать без дополнительных вопросов.
294
+
295
+ **Обязательные разделы:** Ссылки, Как устроена система, Глоссарий, Сущности, Страницы и экраны, Ключевые операции, Интеграции, Тестирование.
296
+
297
+ ### Обязательная структура SPEC.md
298
+
299
+ ```markdown
300
+ # Продуктовая спецификация: <Название продукта>
301
+
302
+ **Статус:** черновик | **Дата:** YYYY-MM-DD
303
+
304
+ ## Ссылки
305
+ - Концепция: [VISION.md](../1_PRODUCT_VISION/VISION.md)
306
+
307
+ ## Как устроена система
308
+ Краткое описание из каких частей состоит продукт и как они взаимодействуют.
309
+ Пример: «Веб-приложение с личным кабинетом и административной панелью. Данные хранятся
310
+ централизованно, доступ — через браузер без установки приложений.»
311
+
312
+ ## Глоссарий
313
+ Ключевые понятия продукта. Каждый термин имеет одно точное определение без синонимов.
314
+
315
+ | Термин | Определение |
316
+ |--------|-------------|
317
+ | ... | ... |
318
+
319
+ ## Сущности
320
+ Основные объекты, с которыми работает система. В терминах бизнеса, не базы данных.
321
+
322
+ | Сущность | Описание | Ключевые свойства |
323
+ |----------|----------|-------------------|
324
+ | Пользователь | Зарегистрированный участник системы | Имя, email, роль, дата регистрации |
325
+ | ... | ... | ... |
326
+
327
+ ### Жизненный цикл сущностей
328
+ Для каждой ключевой сущности — допустимые статусы и переходы между ними.
329
+
330
+ | Сущность | Статусы | Переходы |
331
+ |----------|---------|----------|
332
+ | Заказ | черновик → подтверждён → выполнен → отменён | черновик→подтверждён: пользователь нажимает «Оформить» |
333
+
334
+ ## Страницы и экраны
335
+ Исчерпывающий список страниц и экранов, которые должны быть созданы.
336
+
337
+ | Страница | Назначение | Ключевые элементы |
338
+ |----------|------------|-------------------|
339
+ | Главная | Точка входа, обзор возможностей | Навигация, блок преимуществ, кнопка действия |
340
+ | Регистрация | Создание аккаунта | Форма, валидация, подтверждение email |
341
+ | ... | ... | ... |
342
+
343
+ ## Ключевые операции
344
+ Что пользователи могут делать в системе. Группировать по ролям при наличии нескольких типов.
345
+
346
+ **<Роль или «Все пользователи»>:**
347
+ - Операция 1: краткое описание результата
348
+ - Операция 2: краткое описание результата
349
+
350
+ ## Интеграции
351
+ Внешние сервисы, без которых продукт не работает.
352
+ Если интеграций нет — написать: «Интеграций нет.»
353
+
354
+ | Сервис | Назначение |
355
+ |--------|------------|
356
+ | ... | ... |
357
+
358
+ ## Тестирование
359
+ Функциональность, покрытая тестами.
360
+
361
+ **Критические сценарии** (обязаны работать без ошибок):
362
+ - Пользователь регистрируется и входит в систему
363
+ - ...
364
+
365
+ **Бизнес-правила** (корректность расчётов и ограничений):
366
+ - Расчёт X при условии Y
367
+ - Валидация Z
368
+ - ...
369
+
370
+ **Негативные сценарии** (поведение системы при ошибках и отменах):
371
+ - Пользователь вводит неверный пароль → система отображает «Неверный логин или пароль», доступ не предоставляется
372
+ - Пользователь отменяет заказ → статус меняется на «отменён», деньги возвращаются в течение 3 рабочих дней
373
+ - ...
374
+
375
+ ## Артефакты
376
+ Вспомогательные материалы для разработки и запуска продукта.
377
+ Если артефактов нет — написать: «Артефактов нет.»
378
+
379
+ | Файл | Тип | Назначение |
380
+ |------|-----|-----------|
381
+ | [privacy-policy.md](../3_ARTIFACTS/legal/privacy-policy.md) | Юридический | Политика конфиденциальности |
382
+ | [logo-main.svg](../3_ARTIFACTS/media/images/logo-main.svg) | Изображение | Основной логотип продукта |
383
+ | [homepage-copy.md](../3_ARTIFACTS/content/homepage-copy.md) | Контент | Тексты для главной страницы |
384
+ | ... | ... | ... |
385
+ ```
386
+
387
+ ### Правила раздела
388
+
389
+ - Язык бизнеса, не разработчика: «список товаров», не «массив объектов»
390
+ - Страницы — **исчерпывающий** список, ни одна не пропущена
391
+ - Сущности — только те, что **реально нужны** продукту
392
+ - Операции описывают **результат**, не техническую реализацию
393
+ - Тестирование описывает **что проверять**, не как это реализовать
394
+ - Без стека, фреймворков, архитектурных паттернов
395
+ - **Негативные сценарии обязательны**: что происходит при ошибках, отменах, конфликтах
396
+
397
+ ---
398
+
399
+ ## INDEX.md — Оглавление
400
+
401
+ ```markdown
402
+ # Документация продукта: <Название>
403
+
404
+ **Статус:** черновик | **Дата:** YYYY-MM-DD
405
+
406
+ ## Навигация
407
+
408
+ | Документ | Описание |
409
+ |----------|----------|
410
+ | [Концепция](./1_PRODUCT_VISION/VISION.md) | Проблема, аудитория, цель, границы проекта |
411
+ | [Спецификация](./2_PRODUCT_SPEC/SPEC.md) | Сущности, страницы, операции, тестирование |
412
+
413
+ ## Быстрые ссылки
414
+
415
+ - [Ключевые возможности](./1_PRODUCT_VISION/VISION.md#ключевые-возможности)
416
+ - [Страницы и экраны](./2_PRODUCT_SPEC/SPEC.md#страницы-и-экраны)
417
+ - [Тестирование](./2_PRODUCT_SPEC/SPEC.md#тестирование)
418
+ - [Артефакты](./2_PRODUCT_SPEC/SPEC.md#артефакты)
419
+
420
+ ## Артефакты
421
+
422
+ | Файл | Описание |
423
+ |------|----------|
424
+ | [Политика конфиденциальности](./3_ARTIFACTS/legal/privacy-policy.md) | Условия обработки персональных данных |
425
+ | ... | ... |
426
+ ```
427
+
428
+ *Если артефактов нет, раздел «Артефакты» и таблицу удалить. В «Быстрых ссылках» строку «Артефакты» тоже удалить.*
429
+
430
+ ---
431
+
432
+ ## Edge Cases
433
+
434
+ ### Продукт без UI (API, CLI, библиотека)
435
+ Раздел «Страницы и экраны» заменить на «Эндпоинты и команды» с аналогичной структурой таблицы. В начале SPEC.md явно указать: «Продукт не имеет пользовательского интерфейса.» Валидатор пропускает переименованный раздел — обязательный заголовок `## Страницы и экраны` всё равно должен присутствовать, содержание заменяется.
436
+
437
+ ### Несколько типов пользователей (ролей)
438
+ В «Ключевые операции» — подраздел для каждой роли. В Глоссарии — определение каждой роли. Сущность «Пользователь» отражает разделение ролей (свойство «роль»). Метрики успеха — для каждой роли отдельно.
439
+
440
+ ### Противоречие между VISION.md и SPEC.md
441
+ Скрипт (`validate` / `consistency`) обнаруживает противоречия автоматически. Приоритет разрешения — VISION.md. Уточнить с пользователем до финализации SPEC.md. Нельзя считать документацию готовой, если `validate` завершается с ошибками блока «Согласованность».
442
+
443
+ ### Пользователь меняет требования после генерации
444
+ 1. Обновить VISION.md.
445
+ 2. Проверить согласованность с SPEC.md (чеклист из Шага 5).
446
+ 3. Запустить валидацию.
447
+ 4. Создать коммит с описанием что и почему изменилось.
448
+ Не пересоздавать файлы — использовать `--update` или редактировать напрямую.
449
+
450
+ ### Имя проекта с пробелами или спецсимволами
451
+ Использовать CamelCase или дефис: `МойПроект`, `my-project`. Пробелы и символы `/ \ : * ? " < > |` недопустимы — doc_gen.py откажет с ошибкой.
452
+
453
+ ### Продукт без интеграций
454
+ Удалить таблицу. Написать явно: «Интеграций нет.» Это единственный раздел, где допустимо явное отрицание вместо таблицы.
455
+
456
+ ### Продукт с несколькими подпродуктами (монорепо)
457
+ Запускать `doc_gen.py generate` отдельно для каждого подпродукта с разными именами. Общий INDEX.md на верхнем уровне создаётся вручную со ссылками на каждую папку.
458
+
459
+ ### Смена концепции (pivot)
460
+ Создать ветку git. Переписать VISION.md с нуля. Пересмотреть SPEC.md полностью. Не смешивать старую и новую концепции в одном документе — старая версия хранится в git-истории.
461
+
462
+ ### Артефакты ещё не созданы
463
+ Пока файл не создан физически в `3_ARTIFACTS/` — **не упоминать его в SPEC.md и не создавать подпапку под него**. Раздел `## Артефакты` содержит только уже существующие ссылки или «Артефактов нет.». Правило: сначала есть реальный файл — потом создаётся папка и добавляется ссылка. Никак не наоборот.
464
+
465
+ ### Слишком много артефактов одного типа
466
+ При большом количестве файлов одного типа — создавать вложенные подпапки внутри стандартных:
467
+ `media/images/screenshots/`, `media/images/mockups/`, `legal/agreements/`, `content/emails/`.
468
+ Структура должна быть очевидной без объяснений — не создавать подпапку ради одного файла.
469
+
470
+ ### Артефакты без документации
471
+ Артефакт не может существовать без упоминания в документе. Если файл в `3_ARTIFACTS/` нигде не ссылается — либо удалить его, либо добавить ссылку в SPEC.md. «Мёртвые» артефакты не допускаются.
472
+
473
+ ### Ложные срабатывания валидатора на заглушки
474
+ Паттерн `[текст]` без следующей `(` считается заглушкой. Исключения: ссылки `[текст](url)` — не заглушка. Если в содержимом нужны квадратные скобки не как заглушка (например, `[RFC 7231]`), использовать HTML-эскейп: `&#91;RFC 7231&#93;`.
475
+
476
+ ---
477
+
478
+ ## Ключевые ограничения
479
+
480
+ - Без технологий и стека — документ реализуем на **любом** языке и платформе
481
+ - Язык понятен владельцу бизнеса **без технического образования**
482
+ - Каждая страница в SPEC.md **связана** с возможностью из VISION.md
483
+ - Незаполненных заглушек быть не должно
484
+ - **Нет опциональных решений**: либо явно описано, либо явно сказано «нет»
485
+ - Язык документации — **русский**
486
+ - Все ссылки — **относительные**
487
+ - После каждого изменения — **валидация** (`{DOC_GEN} validate`) и **git-коммит**
488
+ - **`3_ARTIFACTS/` не создаётся автоматически** — только при размещении реального файла
489
+ - **Каждый артефакт** в `3_ARTIFACTS/` упомянут хотя бы в одном документе
490
+ - **SPEC.md обязан** содержать раздел `## Артефакты` (либо с таблицей ссылок, либо с «Артефактов нет.»)