Генерация финального документа (DOCX/PDF/MD) с изображениями
Scanned 5/27/2026
Install via CLI
openskills install id-andyyy/LabAI---
name: lab-report
description: Генерация финального документа (DOCX/PDF/MD) с изображениями
---
Пользователь хочет сгенерировать финальный документ отчёта. На этом этапе report.md уже должен быть готов (создан через
/lab-draft и доработан через /lab-improve, /lab-research, /lab-conclusion).
## Что делать
### Этап 1. Проверка полноты
1. Прочитай `.claude/lab/config.json`. Если не найден — сообщи: «Сначала запусти `/lab-setup`.» и остановись.
2. Проверь наличие `report.md`. Если не найден — сообщи: «Сначала создай черновик отчёта через `/lab-draft`.» и
остановись.
3. Прочитай `report.md` и проверь:
- Есть ли раздел дополнительного исследования (если `config.preferences.needs_research` = true) — предупредить, если
нет (но не блокировать).
- Есть ли итоговый вывод — предупредить, если нет (но не блокировать).
4. Спроси пользователя: продолжить генерацию или сначала доработать отчёт?
### Этап 2. Работа с изображениями
1. Проверь наличие папки `images/` в корне проекта.
2. Если папка существует и содержит файлы:
a. **Прочитай каждый файл изображения через Read tool (vision).**
b. **Проанализируй содержимое каждого изображения** — текст, интерфейс, данные, графики, что изображено.
c. **Сопоставь содержимое изображений с подписями рисунков в report.md по СМЫСЛУ, а не по имени файла или дате.**
КРИТИЧЕСКИ ВАЖНО: нельзя бездумно сопоставлять рисунки по порядку (по алфавиту имён, по дате создания).
Нужно именно анализировать содержимое каждого изображения и находить, какой подписи в report.md оно соответствует.
Например: если подпись «Рисунок 3. Настройка DNS», а на изображении видно окно настройки DNS-сервера — это совпадение.
d. Создай `.claude/lab/image_map.json` — маппинг номера рисунка на файл:
```json
{
"1": "images/screenshot1.png",
"2": "images/network_config.jpg"
}
```
e. Если автоматическое сопоставление не удалось для некоторых изображений — покажи пользователю список нераспознанных
файлов и подписей, спроси о соответствии.
f. **Перепроверь ещё раз**, правильно ли ты соотнёс каждое изображение с местом, куда его вставлять. Открой каждое
изображение повторно и убедись, что оно действительно соответствует подписи.
3. Если папка `images/` пуста или не существует — предупредить (плейсхолдеры останутся в документе).
### Этап 3. Резервная копия шаблона
Если используется шаблон-пустышка (`config.template.has_template` = true):
1. Скопируй шаблон в резервную копию: `cp <template_path> <template_path>.backup`
2. Сообщи пользователю, что резервная копия создана.
Это позволяет заново запустить генерацию, восстановив шаблон из бэкапа, если результат неудачный.
### Этап 4. Генерация документа
Определи формат из `config.preferences.report_format` и имя файла из `config.preferences.output_filename` (по умолчанию
`report`).
**ВАЖНО:** report.md — это черновик. Этот этап НЕ меняет содержание report.md. Генерация итогового файла — это только
форматирование: подстановка изображений, отступы, стили, титульный лист.
**Шаблон-пустышка (почти всегда):** скорее всего пользователь уже предоставил шаблон report.docx. Путь к нему в
`config.template.example_path`. Правила работы с шаблоном:
- Вставлять текст отчёта между заготовленными секциями.
- Титульный лист — не трогать.
- Заголовки секций (Цели работы, Ход работы, и т.д.) — не трогать.
- Все подзаголовки создавать с тем же стилем, что и заголовки шаблона.
**Формат MD:**
- Скопировать report.md в `{output_filename}.md` (если имя отличается от `report`; иначе — в `output.md`, чтобы не
перезаписать черновик).
- Заменить плейсхолдеры `[ВСТАВИТЬ РИСУНОК N ЗДЕСЬ]` на `` (используя
image_map.json).
**Формат DOCX:**
1. Проверь наличие venv: `.claude/lab/venv/bin/python --version` (или `Scripts/python.exe` на Windows).
2. Если venv есть — запусти генератор:
```
.claude/lab/venv/bin/python .claude/lab/scripts/generate_docx.py \
--config .claude/lab/config.json \
--report report.md \
--output {output_filename}.docx \
--images images/ \
--image-map .claude/lab/image_map.json
```
Если есть шаблон-пустышка (`config.template.has_template` = true и `config.template.example_path` не null):
```
--template <путь из config.template.example_path>
```
Если без титульного листа (`config.preferences.no_title_page` = true, без шаблона):
```
--no-title-page
```
Возможности скрипта:
- **Режим шаблона**: не трогает титульный лист и заголовки секций, вставляет содержимое между секциями, копирует стиль заголовков из шаблона для подзаголовков (НЕ использует Heading 1/2)
- **Markdown-таблицы**: автоматически конвертируются в Word-таблицы (Table Grid, шрифт 14 пт по ГОСТ)
- **Списки**: маркированные (`- item`) и нумерованные (`N) item`) — с правильными отступами
- **Заголовки**: поддерживаются оба формата — нумерованный (`1.`, `1.1.`, `1.1.1.`) и markdown (`##`, `###`, `####`)
- **Титульный лист**: тип работы из `config.course.lab_type`, преподаватель из `config.course.reviewer`
- Не применяет жирный шрифт в тексте (только в заголовках)
- Пропускает блоки кода (```) — в документ попадают только однострочные выражения
- После каждого рисунка (подписи) вставляет пустую строку
- Красная строка 1,5 см, выравнивание по ширине, contextualSpacing
- Изображения масштабируются до макс. 15,5 см (не выходят за правое поле)
3. Если venv нет — сообщи, что DOCX-генерация невозможна без Python. Предложи формат MD.
**Формат PDF:**
1. Сначала сгенерируй DOCX (как описано выше).
2. Проверь наличие LibreOffice: `libreoffice --version`.
3. Если LibreOffice есть — конвертируй: `libreoffice --headless --convert-to pdf {output_filename}.docx`.
4. Если LibreOffice нет — сообщи пользователю, что PDF-конвертация невозможна. Предложи открыть DOCX и сохранить как PDF
вручную.
### Этап 5. Подтверждение
Сообщи пользователю:
- Путь к сгенерированному файлу (report.docx / report.pdf / report.md).
- Количество вставленных изображений (если были).
- Количество оставшихся плейсхолдеров (если изображения не найдены).
- Рекомендацию проверить документ перед сдачей.
- Напомни, что если результат неудачный, шаблон можно восстановить из бэкапа (.backup) и запустить `/lab-report` заново.
## Дополнительный контекст от пользователя
$ARGUMENTS
No comments yet. Be the first to comment!