# AGENTS.md — работа с документом DOCX
Генератор `docx/` собирает отчёт в формате **DOCX** из обычных **Markdown**-файлов
по фиксированному дизайну СТО 02068410-004-2018. Этот файл — инструкция агенту по
созданию и правке конкретного документа. Поведение полностью задаётся `config.yaml`
проекта, менять код генератора не нужно.
## 1. Требования
- Node.js 18+, зависимости ставятся командой `npm install` в папке `docx/`.
- Windows/macOS/Linux.
- Готовые PNG вставляются без внешних зависимостей. Для рендеринга PlantUML
(`.puml`) нужны Java 11+ и файл `plantuml.jar` (см. `plantuml` в конфиге).
## 2. Раскладка проекта
Проект лежит в `content/<проект>/docx/` рядом с `config.yaml`:
```
content/<проект>/
├── assets/ # общие ресурсы проекта (общие с pptx)
│ ├── title-page.docx # титульный лист
│ └── images/ # PNG-рисунки и исходники .puml
└── docx/
├── config.yaml # настройки документа
├── 01-introduction.md
├── 02-*.md
└── 05-bibliography.md
```
Все относительные пути в `config.yaml` считаются **от каталога самого
`config.yaml`**. Если ресурсы общие с презентацией, указывайте их через `../assets`
(например, `paths.assets: ../assets`, `document.titlePage: ../assets/title-page.docx`).
Отчёт собирается в папку проекта и называется по имени проекта:
`content/<проект>/<проект>.docx`. Значение ключа `document.output` при такой
раскладке — `../<проект>.docx`.
Структуру проекта создавайте командой `--init`: она формирует `config.yaml`,
примеры `*.md` и общий каталог `content/<проект>/assets/` (титульный лист,
изображения), который используется и генератором `pptx`.
Готовый пример со всеми возможностями — `content/example/docx/`.
## 3. Командная строка
Из корня репозитория:
```
node docx/src/cli.js [опции]
--config <путь> путь к config.yaml (по умолчанию config.yaml в текущем каталоге)
--content
каталог проекта: config.yaml, *.md и assets/ (по умолчанию текущий)
--output <путь> переопределить путь выходного .docx
--check только проверить конфиг и ссылки, без записи файла
--init создать шаблон config.yaml/*.md/assets и выйти
--verbose подробный вывод
--version показать версию
--help справка
```
Типичный цикл:
```powershell
node docx/src/cli.js --content content/<проект>/docx --init # создать структуру проекта
node docx/src/cli.js --content content/<проект>/docx --check # проверить
node docx/src/cli.js --content content/<проект>/docx # собрать
```
После любого изменения исходников (`config.yaml`, `*.md`, ресурсов `assets/`)
**пересоберите документ**, чтобы результат соответствовал исходникам.
Если `config.yaml` не найден, инструмент сам создаёт шаблон (`config.yaml`,
примеры Markdown и общий `assets/`) и завершается.
## 4. Схема `config.yaml`
Любой ключ можно опустить — берётся значение по умолчанию (см.
`docx/src/config/defaults.js`).
### document
| Ключ | Тип | Смысл |
|------|-----|-------|
| `output` | string | путь выходного `.docx` (относительно `config.yaml`) |
| `titlePage` | string/null | путь к готовому `title-page.docx`; `null` — без титульника |
| `features.updateFields` | bool | обновлять поля (в т.ч. оглавление) при открытии в Word |
Титульный лист склеивается перед документом, между ним и текстом вставляется
разрыв страницы. При `--init` создаётся пример `assets/title-page.docx`.
### paths
| Ключ | Смысл |
|------|-------|
| `assets` | корень ресурсов; `file=images/x.png` в директивах ищется здесь |
### Структура и оформление
| Раздел | Назначение |
|--------|-----------|
| `page` | `width`, `height` (DXA), `margins` (twips) |
| `typography` | `font`, `sizeBody`/`sizeTable`/`sizeSmall`, `lineSpacing`, `color`, `useBold`, `allowEmphasis`, `language` |
| `headings` | интервалы/выравнивание `struct`, `section`, `subsection`, `point` |
| `captions` | префиксы и тире подписей `figure`, `table`, `tableContinue` |
| `lists` | `bulletChar`, `letterSuffix`, `numberSuffix`, `nestedLevelStep`, `forbiddenLetters` |
| `numbering` | `figures`, `tables`, `formulas`: `global` или `section` |
| `formula` | `spacingBeforeAfter`, `whereTabPosition` |
| `table` | `font`, `size`, `borderColor`, `borderSize`, `cellMargins`, `headerFill`, `cellFill` |
| `figure` | `maxWidth` (px, `null` — по ширине), `maxHeight` (px) |
| `pageNumber` | `align`, `format`, `startFrom` |
| `toc` | `enabled`, `title`, `depth` (1..3) |
| `bibliography` | `title` |
| `citation` | `bracketOpen`, `bracketClose`, `pagePrefix` |
| `appendix` | `labelPrefix`, `forbiddenLetters` |
### plantuml
| Ключ | Тип | Смысл |
|------|-----|-------|
| `enabled` | bool | включить рендеринг `.puml`; `false` — считать ошибкой |
| `java` | string | `auto` — `%JAVA_HOME%\bin\java`, иначе `java` из PATH |
| `jar` | string | путь к `plantuml.jar` (относительно `config.yaml`) |
| `format` | string | только `png` |
| `charset` | string | кодировка исходника (по умолчанию `UTF-8`) |
| `cache` | bool | не перерисовывать неизменённый исходник |
| `cacheDir` | string | каталог кэша PNG (относительно `config.yaml`) |
| `timeoutMs` | int | таймаут рендера одной диаграммы, мс |
Общий `plantuml.jar` репозитория лежит в `tools/plantuml.jar`; из проекта путь
вида `../../../tools/plantuml.jar`. Ошибки рендера (нет `jar`, нет Java,
синтаксическая ошибка) — фатальные: сборка останавливается с кодом `1`.
### sections — структура документа
Упорядоченный список частей:
```yaml
sections:
- { type: toc } # поле оглавления
- { file: 01-introduction.md, type: structural, title: Введение }
- { file: 02-main.md, type: numbered } # # = 1, ## = 1.1, ### = 1.1.1
- { file: 04-conclusion.md, type: structural, title: Заключение }
- { file: 05-bibliography.md, type: bibliography }
- { file: 06-appendix-a.md, type: appendix, letter: А, title: Приложение }
```
| type | Поведение |
|------|-----------|
| `toc` | вставляет оглавление (не требует `file`) |
| `structural` | ненумерованный раздел (Введение/Заключение): заголовок = `title`, ЗАГЛАВНЫМИ, по центру, с новой страницы |
| `numbered` | нумеруемый раздел; `#` = раздел, `##`/`###` = подраздел/пункт |
| `bibliography` | список источников; нумеруется автоматически |
| `appendix` | приложение: заголовок «ПРИЛОЖЕНИЕ » + `title`, буквенный префикс у рисунков/таблиц |
## 5. Формат контента
### Заголовки
В файле `type: numbered`:
```md
# НАЗВАНИЕ РАЗДЕЛА -> 1 НАЗВАНИЕ РАЗДЕЛА (с новой страницы)
## Подраздел -> 1.1 Подраздел
### Пункт -> 1.1.1 Пункт
```
Номера подставляются автоматически (Word-numbering). В `structural`/`appendix`
заголовок берётся из `title`, а заголовки внутри файла рендерятся без номера.
### Абзацы и списки
Обычные абзацы и списки Markdown. Пример:
```md
- первый пункт;
- второй пункт:
1. вложенный пункт (выведется как «а) вложенный пункт»);
2. ещё один.
```
Маркер вложенности выбирается автоматически: тире → `а)` → `1)`. Полужирный и
курсив по умолчанию игнорируются (СТО).
### Таблицы
- Обычная GFM-таблица без директивы — таблица **без подписи и номера**.
- С подписью и автономером — директива `::: table`:
```md
::: table "Название таблицы" id=params note="примечание"
| Параметр | Значение |
|---|---|
| A | 1 |
| B | 2 |
:::
```
### Рисунки
```md
::: figure "Название рисунка" id=arch file=images/arch.png
а) первый поясняемый элемент;
б) второй поясняемый элемент.
:::
```
`file` — относительно `paths.assets`. Если файла нет — предупреждение, подпись
всё равно выводится. Подпись ставится под рисунком по центру:
`Рисунок N — Наименование`. Если пояснять нечего, тело директивы оставляют
пустым:
```md
::: figure "Общая схема системы" id=common file=images/common.png
:::
```
**PlantUML.** Если `file` оканчивается на `.puml` (`.plantuml`, `.pu`, `.iuml`),
файл рендерится в PNG через `plantuml.jar` и вставляется как обычный рисунок:
```md
::: figure "Диаграмма последовательности" id=seq file=images/seq.puml
а) запрос клиента;
б) ответ сервера.
:::
```
Ошибка рендера фатальна, `--check` тоже рендерит `.puml`.
В приложениях номер рисунка получает префикс буквы: `Рисунок А.1 — Наименование`.
### Формулы
```md
::: formula id=line
y = a*x + b
:::
::: where
y — результат;
x — аргумент;
a — коэффициент.
:::
```
Поддерживается простой синтаксис: `^` (степень), `_` (индекс), `/` (дробь). Номер
формулы ставится автоматически справа.
### Примечания и термины
```md
::: note
Текст примечания.
:::
::: notes
- первое примечание;
- второе примечание.
:::
::: definitions
Термин — определение;
Ещё термин — определение.
:::
```
### Разрыв страницы
```md
::: pagebreak
:::
```
Тематический разрыв `---` также трактуется как разрыв страницы.
### Ссылки на источники
`[@1]` — ссылка на 1-й источник, `[@1, с. 96]` — с номером страницы. Список
источников — Markdown-список в файле `type: bibliography`; порядок строк = номера.
Ссылка вне диапазона — ошибка в `--check`.
### Перекрёстные ссылки
`@fig:id`, `@tbl:id`, `@eq:id` подставляют актуальный номер рисунка/таблицы/
формулы (например `2`, `1.1`, `А.1`). `id` задаётся в директиве.
### Блоки кода
Fenced-блоки ``` игнорируются с предупреждением (функция листингов удалена).
## 6. Проверка и ошибки
`--check` проверяет:
- корректность `config.yaml` (типы, существование файлов, буквы приложений);
- наличие всех `sections[].file`;
- существование меток в `@fig/@tbl/@eq`;
- диапазон ссылок `[@n]`;
- рендеринг всех `::: figure ... file=*.puml`.
Ошибки печатаются списком и возвращают код выхода `1`. Предупреждения (например,
отсутствующий PNG) не останавливают сборку; ошибки PlantUML — фатальные.
## 7. Подготовка диаграмм
Готовые PNG кладутся в общий каталог ресурсов (`content/<проект>/assets/images/`).
Исходники PlantUML (`.puml`) кладутся туда же и указываются в
`::: figure ... file=images/<имя>.puml`. Диаграммы других форматов (Mermaid,
draw.io) готовятся внешними средствами и вставляются как PNG.
## 8. Замечания по дизайну
- Дизайн фиксирован под СТО 02068410-004-2018; меняются только параметры из
`config.yaml`.
- Полужирный и курсив по умолчанию отключены (`typography.useBold`,
`allowEmphasis`).
- Оглавление — поле Word; при открытии нажмите «Обновить поле» либо включите
`document.features.updateFields`.