type: standard
aspect: format
title: "Стандарт формата Markdown"
version: 1.0.0
date: 2026-02-19
status: active
dialect: GFM + Pandoc + Custom
Комбинированный диалект для иерархической документации платформы.
GFM (GitHub Flavored Markdown) — база
↓
Pandoc extensions — расширения
↓
Custom transclusion — компиляция
| Компонент | Источник | Зачем |
|---|---|---|
| GFM | GitHub, CommonMark | Таблицы, чеклисты, code blocks, совместимость |
| YAML frontmatter | Pandoc | Метаданные документов |
| Footnotes | Pandoc | Сноски для теории |
| Definition lists | Pandoc | Терминология |
| Math | Pandoc | Формулы (Меркаба диаграммы) |
| Fenced divs | Pandoc | Блоки примеров |
| Transclusion | Custom | Иерархическая компиляция |
| Платформа | Поддержка |
|---|---|
| GitHub | ✅ Полная (GFM native) |
| docs.0kt.ru | ✅ Полная (Datasette рендерит GFM) |
| VSCode | ✅ Полная (с расширениями) |
| Pandoc | ✅ Полная (все расширения) |
| Компиляция | ✅ Preprocessor (Python) |
# H1 — Название документа
## H2 — Раздел
### H3 — Подраздел
#### H4 — Пункт
##### H5 — Подпункт
###### H6 — Детализация
Правила:
- Один H1 в документе (название)
- Пропуск уровней запрещён (H1 → H3)
- Используем ## а не подчёркивание
Параграф 1. Текст текст текст.
Параграф 2. Новый абзац.
Принудительный перенос —
добавить два пробела в конце строки.
Маркированные:
- Элемент 1
- Элемент 2
- Подэлемент 2.1
- Подэлемент 2.2
- Элемент 3
Нумерованные:
1. Первый
2. Второй
1. Подпункт 2.1
2. Подпункт 2.2
3. Третий
Правило: Используем - (не * или +) для маркированных списков.
- [ ] Задача не выполнена
- [x] Задача выполнена
- [ ] Частично:
- [x] Подзадача 1
- [ ] Подзадача 2
| Заголовок 1 | Заголовок 2 | Заголовок 3 |
|-------------|-------------|-------------|
| Ячейка 1 | Ячейка 2 | Ячейка 3 |
| Данные | Данные | Данные |
Выравнивание:
| Лево | Центр | Право |
|:-----|:-----:|------:|
| L | C | R |
Inline:
Команда `git status` показывает статус.
Code blocks:
```python
def hello():
print("Hello, World!")
```
С подсветкой синтаксиса:
```bash
echo "Hello"
ls -la
```
Inline:
[Текст ссылки](https://example.com)
[Относительная ссылка](./path/to/file.md)
[С якорем](./file.md#section-name)
Reference:
[Текст ссылки][ref]
[ref]: https://example.com "Optional title"
Автоссылки:
<https://example.com>
<email@example.com>


**Жирный** или __жирный__
*Курсив* или _курсив_
***Жирный курсив***
~~Зачёркнутый~~
`Код`
> Цитата уровень 1
>
> > Цитата уровень 2
---
Правило: Используем --- (не *** или ___).
Обязательный для всех документов:
---
type: standard|concept|theory|pattern|template
aspect: structure|lifecycle|process|policy|format|naming|typology|operation|guidance
title: "Название документа"
version: X.Y.Z
date: YYYY-MM-DD
status: draft|active|deprecated|archived
---
Расширенные поля:
---
type: standard
aspect: format
title: "Название"
version: 1.0.0
date: 2026-02-19
status: active
author: architect
related:
- path/to/related.md
- path/to/another.md
depends_on:
- path/to/dependency.md
tags:
- markdown
- documentation
- hierarchy
---
Текст с сноской[^1] и ещё одной[^note].
[^1]: Текст сноски.
[^note]: Длинная сноска
с несколькими параграфами.
Термин 1
: Определение термина 1.
Термин 2
: Первое определение термина 2.
: Второе определение термина 2.
Inline:
Формула $E = mc^2$ в строке.
Display:
$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$
::: warning
**Внимание:** Это важное предупреждение.
:::
::: example
Пример кода:
```python
print("Hello")
:::
::: note
Примечание для читателя.
:::
### Line Blocks
```markdown
| Строка 1
| Строка 2
| Отступ
| Строка 4
3 уровня документов:
MASTER.md ← Верхний уровень (обзор)
↓ ссылка
DETAIL_1.md ← Средний уровень (детали)
↓ ссылка
SUBDETAIL_1.1.md ← Нижний уровень (реализация)
Два режима просмотра:
1. Уровневый — читать только MASTER.md (ссылки на детали)
2. Компилированный — собрать все уровни в один документ
Для чтения (обычная ссылка):
## Детали
См. детальную документацию:
- [Детали структуры](./details/STRUCTURE_DETAILS.md)
- [Детали процесса](./details/PROCESS_DETAILS.md)
Для компиляции (директива включения):
## Детали
<!-- INCLUDE: ./details/STRUCTURE_DETAILS.md -->
Комбинированный подход (рекомендуется):
## Детали структуры
[→ Читать отдельно](./details/STRUCTURE_DETAILS.md)
<!-- INCLUDE: ./details/STRUCTURE_DETAILS.md -->
При обычном просмотре — видна ссылка.
При компиляции — вставляется содержимое.
ТОЛЬКО относительные пути:
✅ Правильно:
./file.md
./details/DETAIL.md
../sibling/FILE.md
../../parent/FILE.md
❌ Неправильно:
/opt/claude-workspace/architect/standards/file.md
C:\Users\...\file.md
~/workspace/file.md
Причина: Портативность — документы должны работать в любой папке.
Автоматические якоря (из заголовков):
## Раздел с пробелами
Ссылка: [Текст](#раздел-с-пробелами)
Правила преобразования:
- Пробелы → дефисы
- Регистр → lowercase
- Спецсимволы → удаляются
Примеры:
## ЧТО это → #что-это
## Раздел 1.2.3 → #раздел-123
## Что/Как/Где → #чтокакгде
PROJECT.md ← MASTER (обзор проекта)
├── details/
│ ├── ARCHITECTURE.md ← DETAIL (архитектура)
│ │ └── impl/
│ │ ├── BACKEND.md ← SUBDETAIL (бэкенд)
│ │ └── FRONTEND.md ← SUBDETAIL (фронтенд)
│ ├── DATABASE.md ← DETAIL (БД)
│ └── API.md ← DETAIL (API)
└── compiled/
└── PROJECT_FULL.md ← Скомпилированная версия
Скрипт: architect/tools/md-compile.py
#!/usr/bin/env python3
"""
Markdown Preprocessor — компиляция иерархических документов.
Использование:
./md-compile.py INPUT.md OUTPUT.md
./md-compile.py PROJECT.md compiled/PROJECT_FULL.md
"""
import re
import sys
from pathlib import Path
def include_file(match, base_dir, depth=0, max_depth=10):
"""
Обработка директивы <!-- INCLUDE: path -->.
Args:
match: regex match object
base_dir: базовая директория
depth: текущая глубина вложенности
max_depth: максимальная глубина (защита от циклов)
Returns:
Содержимое включаемого файла или ошибка
"""
if depth >= max_depth:
return f"<!-- ERROR: Maximum include depth ({max_depth}) exceeded -->\n"
include_path = match.group(1).strip()
file_path = (base_dir / include_path).resolve()
if not file_path.exists():
return f"<!-- ERROR: File not found: {include_path} -->\n"
try:
content = file_path.read_text(encoding='utf-8')
# Убрать frontmatter из включаемых файлов
content = re.sub(r'^---\n.*?\n---\n', '', content, flags=re.DOTALL)
# Рекурсивная обработка вложенных INCLUDE
new_base = file_path.parent
content = re.sub(
r'<!--\s*INCLUDE:\s*(.+?)\s*-->',
lambda m: include_file(m, new_base, depth + 1, max_depth),
content
)
return content
except Exception as e:
return f"<!-- ERROR: {str(e)} -->\n"
def compile_document(input_path, output_path):
"""
Компиляция документа с обработкой всех INCLUDE директив.
Args:
input_path: путь к исходному .md файлу
output_path: путь к скомпилированному .md файлу
"""
input_file = Path(input_path)
output_file = Path(output_path)
if not input_file.exists():
print(f"ERROR: Input file not found: {input_path}")
sys.exit(1)
# Создать выходную папку
output_file.parent.mkdir(parents=True, exist_ok=True)
# Читать исходный файл
content = input_file.read_text(encoding='utf-8')
# Обработать все INCLUDE директивы
base_dir = input_file.parent
compiled = re.sub(
r'<!--\s*INCLUDE:\s*(.+?)\s*-->',
lambda m: include_file(m, base_dir),
content
)
# Записать результат
output_file.write_text(compiled, encoding='utf-8')
print(f"✓ Compiled: {output_path}")
print(f" Source: {input_path}")
print(f" Lines: {len(content.splitlines())} → {len(compiled.splitlines())}")
if __name__ == '__main__':
if len(sys.argv) != 3:
print("Usage: md-compile.py INPUT.md OUTPUT.md")
sys.exit(1)
compile_document(sys.argv[1], sys.argv[2])
Компиляция одного документа:
python3 architect/tools/md-compile.py \
architect/standards/PROJECT.md \
architect/standards/compiled/PROJECT_FULL.md
Компиляция всех в папке:
for file in architect/standards/*.md; do
python3 architect/tools/md-compile.py \
"$file" \
"architect/standards/compiled/$(basename $file)"
done
Автокомпиляция (pre-commit hook):
#!/bin/bash
# .git/hooks/pre-commit
# Найти изменённые .md файлы
changed=$(git diff --cached --name-only --diff-filter=ACM | grep '\.md$')
for file in $changed; do
# Если файл содержит INCLUDE директивы
if grep -q '<!-- INCLUDE:' "$file"; then
compiled="compiled/$(basename $file)"
python3 architect/tools/md-compile.py "$file" "$compiled"
git add "$compiled"
fi
done
MASTER: PROJECT.md
---
type: project
title: "Проект Платформа"
version: 1.0.0
date: 2026-02-19
---
# Проект Платформа
Комплексная платформа для автоматизации бизнеса.
## Архитектура
Платформа состоит из 5 подсистем.
[→ Детальная архитектура](./details/ARCHITECTURE.md)
<!-- INCLUDE: ./details/ARCHITECTURE.md -->
## База данных
Используем PostgreSQL + NocoDB.
[→ Детали БД](./details/DATABASE.md)
<!-- INCLUDE: ./details/DATABASE.md -->
DETAIL: details/ARCHITECTURE.md
---
type: detail
title: "Архитектура платформы"
parent: ../PROJECT.md
---
# Архитектура платформы
## Backend
Серверная часть на FastAPI.
[→ Детали бэкенда](./impl/BACKEND.md)
<!-- INCLUDE: ./impl/BACKEND.md -->
## Frontend
Клиентская часть на React.
[→ Детали фронтенда](./impl/FRONTEND.md)
<!-- INCLUDE: ./impl/FRONTEND.md -->
SUBDETAIL: details/impl/BACKEND.md
---
type: implementation
title: "Backend реализация"
parent: ../ARCHITECTURE.md
---
# Backend реализация
## Структура API
/api/v1/
/users/
/products/
/orders/
## Эндпоинты
### GET /api/v1/users
Получить список пользователей.
**Response:**
```json
{
"users": [...]
}
### Результат компиляции
```bash
python3 md-compile.py PROJECT.md compiled/PROJECT_FULL.md
compiled/PROJECT_FULL.md содержит:
- PROJECT.md (без frontmatter)
- details/ARCHITECTURE.md (без frontmatter)
- details/impl/BACKEND.md (без frontmatter)
- details/impl/FRONTEND.md (без frontmatter)
- details/DATABASE.md (без frontmatter)
Все уровни в одном документе, готовом к чтению.
Обязательные поля:
---
type: standard|concept|theory|pattern|template|project|detail|implementation
title: "Название документа"
version: X.Y.Z
date: YYYY-MM-DD
---
Для DETAIL и SUBDETAIL:
---
type: detail
title: "Название"
parent: ../MASTER.md # ссылка на родителя
version: 1.0.0
date: 2026-02-19
---
title в frontmatter)Внутренние (в пределах платформы):
[Стандарт структуры](PROJECT_STANDARD.md)
Внешние:
[GitHub](https://github.com)
Якоря:
[Перейти к разделу](#название-раздела)
python,bash, ```yaml- (не * или +)1. (авто-нумерация)- [ ] / - [x]Было:
# Название документа
Текст...
Стало:
---
type: standard
aspect: structure
title: "Название документа"
version: 1.0.0
date: 2026-02-19
status: active
---
# Название документа
Текст...
Было (абсолютные):
[Файл](/opt/claude-workspace/architect/standards/file.md)
Стало (относительные):
[Файл](./file.md)
Было (только ссылка):
## Детали
См. [детальный документ](./details/DETAIL.md).
Стало (ссылка + включение):
## Детали
[→ Читать отдельно](./details/DETAIL.md)
<!-- INCLUDE: ./details/DETAIL.md -->
#!/bin/bash
# migrate-md.sh — добавить frontmatter ко всем .md без него
for file in architect/standards/**/*.md; do
# Проверить наличие frontmatter
if ! head -n1 "$file" | grep -q '^---$'; then
# Извлечь название из H1
title=$(grep -m1 '^# ' "$file" | sed 's/^# //')
# Определить аспект из пути
aspect=$(dirname "$file" | grep -oP '\d-\K\w+')
# Создать временный файл с frontmatter
cat > "$file.tmp" <<EOF
---
type: standard
aspect: $aspect
title: "$title"
version: 1.0.0
date: $(date +%Y-%m-%d)
status: active
---
EOF
# Добавить содержимое
cat "$file" >> "$file.tmp"
# Заменить файл
mv "$file.tmp" "$file"
echo "✓ Added frontmatter: $file"
fi
done
Проверка frontmatter:
# Найти все .md без frontmatter
grep -L '^---$' architect/standards/**/*.md
Проверка относительных путей:
# Найти абсолютные пути
grep -r '\](/\|file://\|C:\\' architect/standards/**/*.md
Проверка битых ссылок:
# Использовать markdown-link-check
npm install -g markdown-link-check
markdown-link-check architect/standards/**/*.md
Pandoc (полный рендеринг):
pandoc -f markdown -t html5 \
--standalone \
--css=style.css \
--mathjax \
input.md -o output.html
Pandoc → PDF:
pandoc -f markdown -t pdf \
--pdf-engine=xelatex \
--variable mainfont="DejaVu Sans" \
input.md -o output.pdf
Рекомендуемые:
- yzhang.markdown-all-in-one — shortcuts, TOC, preview
- DavidAnson.vscode-markdownlint — линтер
- shd101wyy.markdown-preview-enhanced — расширенный preview
- bierner.markdown-mermaid — диаграммы Mermaid
Версия: 1.0.0
Статус: active
Владелец: architect