# -*- coding: utf-8 -*- """Generate TTRPG-Release-Instructions.docx (run: python scripts/generate-release-docx.py).""" from __future__ import annotations from pathlib import Path from docx import Document from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.shared import Pt ROOT = Path(__file__).resolve().parents[1] OUT_PATHS = [ ROOT / "docs" / "TTRPG-Release-Instructions.docx", Path(r"D:\TTRPG-Release\TTRPG-Release-Instructions.docx"), ] def add_bullet(doc: Document, text: str, level: int = 0) -> None: style = "List Bullet" if level == 0 else "List Bullet 2" doc.add_paragraph(text, style=style) def add_step(doc: Document, title: str, body: str) -> None: p = doc.add_paragraph() p.add_run(f"{title}. ").bold = True p.add_run(body) def build_document() -> Document: doc = Document() normal = doc.styles["Normal"] normal.font.name = "Calibri" normal.font.size = Pt(11) title = doc.add_heading("TTRPG Player — сборка и публикация обновлений", level=0) title.alignment = WD_ALIGN_PARAGRAPH.CENTER doc.add_paragraph( "Одна версия на все платформы. Сначала вручную поднимается версия и собирается macOS; " "затем на Windows скрипт собирает Win/Linux без повторного bump и выкладывает на " "https://updates.mailib.ru/" ) doc.add_heading("Рекомендуемый порядок", level=1) add_step( doc, "Шаг 1. Поднять версию", "В каталоге проекта dnd_player: bump-version.cmd (D:\\TTRPG-Release) " "или npm version patch --no-git-tag-version. " "Закоммитить package.json при необходимости до сборки на Mac.", ) add_step( doc, "Шаг 2. Собрать macOS (только на Mac)", "npm ci && npm run build && npm run pack:mac", ) add_step( doc, "Шаг 3. Скопировать Mac-артефакты в D:\\TTRPG-Release", "latest-mac.yml (только свежий с Mac), TTRPGPlayer-x64.zip, TTRPGPlayer-arm64.zip; " "опционально TTRPGPlayer-x64.dmg, TTRPGPlayer-arm64.dmg. " "Версия в latest-mac.yml должна совпадать с package.json.", ) add_step( doc, "Шаг 4. Сборка Win/Linux и публикация (Windows)", "release-all.cmd — по умолчанию режим -AfterMac: без bump, проверка Mac-файлов, " "сборка Windows и Linux (WSL), копирование в D:\\TTRPG-Release, upload на сервер.", ) doc.add_heading("Скрипты (D:\\TTRPG-Release)", level=1) table = doc.add_table(rows=7, cols=2) table.style = "Table Grid" table.rows[0].cells[0].text = "Команда" table.rows[0].cells[1].text = "Назначение" rows = [ ("bump-version.cmd", "Только patch в package.json (шаг 1)"), ("release-all.cmd", "Шаг 4: Win/Linux + publish, без bump (-AfterMac)"), ("prepare-release.cmd -AfterMac", "Только сборка Win/Linux и копирование"), ("publish.cmd", "Только проверка и upload на VPS"), ("publish.cmd -SkipMac", "Выложить Win/Linux, если Mac ещё не готов"), ("release-all-bump.cmd", "Устаревший режим: bump в скрипте, Mac потом"), ] for i, (cmd, desc) in enumerate(rows, start=1): table.rows[i].cells[0].text = cmd table.rows[i].cells[1].text = desc doc.add_heading("Флаги prepare-release", level=2) for line in [ "-AfterMac — не менять версию; требовать Mac-файлы в папке релиза (по умолчанию в release-all)", "-Bump — поднять patch и собрать (старый порядок)", "-SkipGit, -SkipLinux, -NoBump, -Version X.Y.Z, -Minor", ]: add_bullet(doc, line) doc.add_heading("Флаги publish", level=2) add_bullet(doc, "-CheckOnly — проверить файлы, без upload") add_bullet(doc, "-SkipMac — не проверять и не заливать macOS") doc.add_heading("Артефакты (имена без версии)", level=1) art = doc.add_table(rows=4, cols=2) art.style = "Table Grid" art.rows[0].cells[0].text = "Платформа" art.rows[0].cells[1].text = "Файлы" artifacts = [ ( "Windows", "latest.yml, TTRPGPlayer-Setup.exe, TTRPGPlayer-Setup.exe.blockmap", ), ( "Linux", "latest-linux.yml, latest-linux-arm64.yml, " "TTRPGPlayer-x64.AppImage, TTRPGPlayer-arm64.AppImage", ), ( "macOS", "latest-mac.yml, TTRPGPlayer-x64.zip, TTRPGPlayer-arm64.zip " "(zip — автообновление; dmg — опционально, вручную)", ), ] for i, (plat, files) in enumerate(artifacts, start=1): art.rows[i].cells[0].text = plat art.rows[i].cells[1].text = files doc.add_heading("Требования", level=1) for line in [ "Windows: Node.js 20.19+ (или 22.12+), git, OpenSSH, WSL2 с nvm (Node 22, .nvmrc в проекте)", "Проект: D:\\Work\\my_projects\\dnd_project\\dnd_player", "Папка релиза: D:\\TTRPG-Release", "SSH: %USERPROFILE%\\.ssh\\ttrpg_updates_root → root@185.173.94.234", "Mac: Node 20+, сборка только на macOS", ]: add_bullet(doc, line) doc.add_heading("Проверка после выкладки", level=1) for url in [ "https://updates.mailib.ru/latest.yml", "https://updates.mailib.ru/latest-linux.yml", "https://updates.mailib.ru/latest-mac.yml", ]: add_bullet(doc, url) doc.add_heading("Частые проблемы", level=1) problems = [ ( "Win/Linux на версию выше Mac", "Не использовать release-all-bump.cmd. Сначала bump + Mac, потом release-all.cmd.", ), ( "macOS: missing TTRPGPlayer-1.0.xx-mac.zip", "Устаревший latest-mac.yml — пересобрать на Mac или publish.cmd -SkipMac.", ), ( "git push Failed to authenticate", "Скрипт повторит push с токеном Gitea; или настроить credentials для git.mailib.ru.", ), ( "WSL Linux build / Node 18", "Нужен nvm и Node 22 (scripts/wsl-pack-linux.sh).", ), ( "AfterMac: version mismatch", "Версии в package.json и latest-mac.yml должны совпадать до запуска release-all.", ), ] for prob, fix in problems: p = doc.add_paragraph() p.add_run(f"{prob}. ").bold = True p.add_run(fix) p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER p.add_run("Конфиг: release-config.json, publish-config.json в D:\\TTRPG-Release").italic = True return doc def main() -> None: doc = build_document() for path in OUT_PATHS: path.parent.mkdir(parents=True, exist_ok=True) doc.save(str(path)) print(f"Wrote {path}") if __name__ == "__main__": main()