# AGENTS.md — генератор DocxGenerator `DocxGenerator` — автономный инструмент, который собирает отчёт в формате **DOCX** из обычных **Markdown**-файлов по фиксированному дизайну СТО 02068410-004-2018. Поведение полностью задаётся файлом `config.yaml`. Документ создан и для людей, и для ИИ-агентов: он описывает CLI, формат контента, схему конфига и порядок сборки `.exe`. --- ## 1. Требования - Windows (собранный `.exe` под `win-x64`). - Node.js **только для сборки** `.exe` из исходников. Конечному пользователю Node.js не нужен. - Готовые PNG вставляются без внешних зависимостей. Для рендеринга PlantUML (`.puml`) нужны установленная Java (JRE 11+) и файл `plantuml.jar` (см. п. 4, `plantuml`). ## 2. Состав дистрибутива ``` DocxGenerator.exe # исполняемый файл config.yaml # настройки (создаётся автоматически при первом запуске) content/ # Markdown-файлы документа и ресурсы *.md assets/ images/ # PNG для рисунков (готовятся заранее) и исходники .puml title-page.docx # титульный лист (по умолчанию content/assets/title-page.docx) tools/ plantuml.jar # рендерер PlantUML (для файлов .puml) report.docx # результат сборки (путь задаётся document.output) ``` Все относительные пути в `config.yaml` считаются **от каталога самого `config.yaml`**. Сам `config.yaml` и папки ищутся **рядом с `DocxGenerator.exe`**. В монорепозитории общий `plantuml.jar` лежит в корне, в `tools/plantuml.jar`, поэтому репозиторный `config.yaml` задаёт `plantuml.jar: ../tools/plantuml.jar`. Для автономного дистрибутива положите `tools/plantuml.jar` рядом с `.exe` (значение по умолчанию при `--init` — `tools/plantuml.jar`). ## 3. Командная строка ``` DocxGenerator [опции] --config <путь> путь к config.yaml (по умолчанию рядом с exe) --content каталог с config.yaml, content/ и assets/ (по умолчанию рядом с exe) --output <путь> переопределить путь выходного .docx --check только проверить конфиг и ссылки, без записи файла --init создать шаблон config.yaml/content/assets и выйти --verbose подробный вывод --version показать версию --help справка ``` Поведение: - Если `config.yaml` не найден, инструмент **сам создаёт** `config.yaml`, примеры `content/*.md` и `assets/images/placeholder.png`, печатает подсказку и завершается. - `--check` не пишет DOCX, но сообщает обо всех ошибках (битые ссылки, выход `[@n]` за границы списка источников, отсутствующие картинки и т.п.). Типичный цикл работы: ```powershell .\DocxGenerator.exe --init # первый запуск: получить шаблон # ... правим config.yaml и content/*.md ... .\DocxGenerator.exe --check # проверить .\DocxGenerator.exe # собрать report.docx ``` ## 4. Схема `config.yaml` Любой ключ можно опустить — берётся значение по умолчанию (см. `src/config/defaults.js`). ### document | Ключ | Тип | Смысл | |------|-----|-------| | `output` | string | путь выходного `.docx` | | `titlePage` | string/null | путь к готовому `title-page.docx` (по умолчанию `content/assets/title-page.docx`); `null` — без титульника | | `features.updateFields` | bool | обновлять поля (в т.ч. оглавление) при открытии в Word | **Титульный лист.** Берётся готовый DOCX по пути `document.titlePage` и склеивается перед документом; между титульником и основным текстом вставляется разрыв страницы. При `--init` создаётся пример `content/assets/title-page.docx` — замените его своим. Значение `null` отключает титульный лист. ### paths | Ключ | Смысл | |------|-------| | `assets` | корень ресурсов; `file=images/x.png` в директивах ищется здесь (по умолчанию `content/assets`) | ### output Путь и имя выходного `.docx` задаются ключом `document.output` (по умолчанию `report.docx`). Путь считается от каталога `config.yaml` и может быть переопределён флагом `--output`. ### page `width`, `height` (DXA, 1/20 pt), `margins: {left,right,top,bottom}` (twips). A4 и поля СТО заданы по умолчанию. ### typography | Ключ | Смысл | |------|-------| | `font` | гарнитура (по умолчанию Times New Roman) | | `sizeBody` / `sizeTable` / `sizeSmall` | размеры в half-points (28 = 14 pt) | | `lineSpacing` | множитель межстрочного интервала (1.5 = полуторный) | | `color` | цвет текста (hex, без `#`) | | `useBold` | разрешить полужирный (СТО: `false`) | | `allowEmphasis` | разрешить курсив (СТО: `false`) | ### headings Интервалы/выравнивание для `struct`, `section`, `subsection`, `point` (twips). ### captions `figure`, `table`, `tableContinue` — префиксы и тире подписей (`Рисунок`, `Таблица`, `—`). ### lists `bulletChar`, `letterSuffix`, `numberSuffix`, `nestedLevelStep`, `forbiddenLetters`. ### numbering `figures`, `tables`, `formulas`: `global` (сквозная по документу) или `section` (в пределах раздела, вид `1.1`). Приложения всегда имеют префикс буквы (`А.1`). ### formula `spacingBeforeAfter`, `whereTabPosition`. ### table `font`, `size`, `borderColor`, `borderSize`, `cellMargins: {top,bottom,left,right}`, `headerFill`, `cellFill`. ### figure `maxWidth` (px; `null` — по ширине полосы), `maxHeight` (px). ### plantuml Генерация рисунков из исходников PlantUML (см. п. 5, «Рисунки»). | Ключ | Тип | Смысл | |------|-----|-------| | `enabled` | bool | включить рендеринг `.puml`; `false` — считать ошибкой при наличии `.puml` | | `java` | string | исполняемый файл Java; `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 | таймаут рендера одной диаграммы, мс | Ошибки рендера (нет `jar`, нет Java, синтаксическая ошибка) — **фатальные**: сборка прекращается с кодом выхода `1`. Требуется установленная Java (JRE 11+) и файл `plantuml.jar`; для части типов диаграмм нужен Graphviz либо встроенный Smlayout. ### pageNumber `align`, `format`, `startFrom`. ### toc `enabled` (bool), `title`, `depth` (1..3). Оглавление вставляется записью `sections: [{ type: toc }]`. ### bibliography / citation / appendix `bibliography.title`, `citation: {bracketOpen,bracketClose,pagePrefix}`, `appendix: {labelPrefix, forbiddenLetters}`. ### sections — структура документа Упорядоченный список частей: ```yaml sections: - { type: toc } # поле оглавления - { file: content/01-introduction.md, type: structural, title: Введение } - { file: content/02-main.md, type: numbered } # # = 1, ## = 1.1, ### = 1.1.1 - { file: content/03-conclusion.md, type: structural, title: Заключение } - { file: content/04-bibliography.md, type: bibliography } - { file: content/05-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` заголовок берётся из конфига, а заголовки внутри файла рендерятся как обычные заголовки без номера. ### Абзацы, списки Обычные абзацы и списки 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` — относительно `config.paths.assets`. Если файла нет — предупреждение, подпись всё равно выводится. **PlantUML.** Если `file` оканчивается на `.puml` (`.plantuml`, `.pu`, `.iuml`), то файл считается исходником PlantUML: инструмент рендерит его в PNG через локальный `plantuml.jar` (см. `plantuml` в конфиге) и вставляет результат как обычный рисунок. Нумерация, ссылки `@fig:id` и примечания работают так же. Пример: ```md ::: figure "Диаграмма последовательности" id=seq file=images/seq.puml а) запрос клиента; б) ответ сервера. ::: ``` Ошибка рендера — фатальная (код выхода `1`), `--check` тоже рендерит `.puml`. **Подписи по СТО.** Подпись ставится **под** рисунком по центру: `Рисунок N — Наименование` (с прописной буквы, без точки в конце). Если на рисунке обозначены отдельные детали, пояснительные данные размещают **над подписью** и оформляют перечислением `а)`, `б)`, `в)` — именно так, как показано в примере выше. Если рисунок общий и пояснять нечего, указывают только подпись `Рисунок N — Наименование`, а тело директивы оставляют пустым: ```md ::: figure "Общая схема системы" id=common file=images/common.png ::: ``` В приложениях номер рисунка получает префикс буквы: `Рисунок А.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. Проверка и ошибки `DocxGenerator --check` проверяет: - корректность `config.yaml` (типы, существование файлов, допустимые буквы приложений); - наличие всех `sections[].file`; - существование меток в `@fig/@tbl/@eq`; - диапазон ссылок `[@n]`; - рендеринг всех `::: figure ... file=*.puml` (PlantUML). Ошибки печатаются списком и возвращают код выхода `1`. Предупреждения (например, отсутствующий PNG) не останавливают сборку; ошибки PlantUML — фатальные. ## 7. Сборка `.exe` из исходников ```powershell npm install npm run build:exe # -> DocxGenerator.exe в корне (target node24-win-x64) npm run generate # локальная сборка (node src/cli.js) npm run check # проверка конфига и ссылок ``` Упаковка выполняется через `@yao-pkg/pkg`. Чтобы уменьшить размер, можно добавить `--compress Brotli` в команду `build:exe`. ### Подготовка диаграмм Готовые PNG кладутся в `content/assets/images/`. Для исходников PlantUML (`*.puml`) инструмент рендерит PNG сам: положите исходник в `content/assets/images/`, укажите его в `::: figure ... file=images/<имя>.puml` и поместите `plantuml.jar` в `tools/plantuml.jar` (или задайте путь в `plantuml.jar`). Диаграммы других форматов (Mermaid, draw.io) готовятся внешними средствами и вставляются как PNG. ## 8. Замечания по дизайну - Дизайн фиксирован под СТО 02068410-004-2018; меняются только параметры из `config.yaml`. - Полужирный и курсив по умолчанию отключены (`typography.useBold`, `allowEmphasis`). - Шрифт, размеры, интервалы, отступы и подписи настраиваются в конфиге. - Оглавление — поле Word; при открытии нажмите «Обновить поле», либо включено `document.features.updateFields`.