architect/standards/5-format/format-markdown.md

type: standard
aspect: format
title: "Стандарт формата Markdown"
version: 1.0.0
date: 2026-02-19
status: active
dialect: GFM + Pandoc + Custom


Стандарт формата Markdown

Комбинированный диалект для иерархической документации платформы.


СОСТАВ ДИАЛЕКТА

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)

БАЗОВЫЙ СИНТАКСИС (GFM)

Заголовки

# 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. Третий

Правило: Используем - (не * или +) для маркированных списков.

Чеклисты (GFM)

- [ ] Задача не выполнена
- [x] Задача выполнена
- [ ] Частично:
  - [x] Подзадача 1
  - [ ] Подзадача 2

Таблицы (GFM)

| Заголовок 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>

Изображения

![Alt text](./images/diagram.png)
![Alt text](./images/diagram.png "Optional title")

Форматирование

**Жирный** или __жирный__
*Курсив* или _курсив_
***Жирный курсив***
~~Зачёркнутый~~
`Код`

Цитаты

> Цитата уровень 1
>
> > Цитата уровень 2

Горизонтальная линия

---

Правило: Используем --- (не *** или ___).


РАСШИРЕНИЯ PANDOC

YAML Frontmatter

Обязательный для всех документов:

---
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
---

Footnotes

Текст с сноской[^1] и ещё одной[^note].

[^1]: Текст сноски.
[^note]: Длинная сноска
    с несколькими параграфами.

Definition Lists

Термин 1
:   Определение термина 1.

Термин 2
:   Первое определение термина 2.
:   Второе определение термина 2.

Math (LaTeX)

Inline:

Формула $E = mc^2$ в строке.

Display:

$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$

Fenced Divs

::: 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         Скомпилированная версия

КОМПИЛЯЦИЯ ДОКУМЕНТОВ

Preprocessor (Python)

Скрипт: 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

ПРИМЕРЫ ИЕРАРХИИ

Пример 1: Трёхуровневая документация

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)

Все уровни в одном документе, готовом к чтению.


ПРАВИЛА НАПИСАНИЯ

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
---

Заголовки

Ссылки

Внутренние (в пределах платформы):

[Стандарт структуры](PROJECT_STANDARD.md)

Внешние:

[GitHub](https://github.com)

Якоря:

[Перейти к разделу](#название-раздела)

Таблицы

Код

Списки


МИГРАЦИЯ СУЩЕСТВУЮЩИХ ФАЙЛОВ

Добавить Frontmatter

Было:

# Название документа

Текст...

Стало:

---
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

VSCode расширения

Рекомендуемые:
- yzhang.markdown-all-in-one — shortcuts, TOC, preview
- DavidAnson.vscode-markdownlint — линтер
- shd101wyy.markdown-preview-enhanced — расширенный preview
- bierner.markdown-mermaid — диаграммы Mermaid


CHANGELOG

2026-02-19 — v1.0.0


Версия: 1.0.0
Статус: active
Владелец: architect