Metadata-Version: 2.4
Name: pocketcoder-gost
Version: 0.1.1
Summary: MCP server that generates Russian GOST/ESKD technical documents (passport, manual, TU, mounting, form, label) in md/docx/pdf from product data
Project-URL: Homepage, https://github.com/pocketcoder-ch/pocketcoder-gost
Project-URL: Repository, https://github.com/pocketcoder-ch/pocketcoder-gost
Project-URL: Issues, https://github.com/pocketcoder-ch/pocketcoder-gost/issues
Author-email: Dmitrii Chashchin <cdv.inbox@gmail.com>
License: MIT
License-File: LICENSE
Keywords: ai,eskd,gost,mcp,passport,pocketcoder,technical-documentation,tu
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Manufacturing
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: Russian
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Documentation
Classifier: Topic :: Office/Business
Requires-Python: >=3.10
Requires-Dist: jinja2>=3.1
Requires-Dist: mcp>=1.0
Requires-Dist: pydantic>=2.5
Requires-Dist: pyyaml>=6.0
Requires-Dist: rich>=13.7
Requires-Dist: typer>=0.12
Provides-Extra: all
Requires-Dist: litellm>=1.40; extra == 'all'
Requires-Dist: mypy>=1.10; extra == 'all'
Requires-Dist: pdfplumber>=0.11; extra == 'all'
Requires-Dist: pypdfium2>=4.30; extra == 'all'
Requires-Dist: pytest-cov>=5.0; extra == 'all'
Requires-Dist: pytest>=8.0; extra == 'all'
Requires-Dist: ruff>=0.5; extra == 'all'
Provides-Extra: dev
Requires-Dist: mypy>=1.10; extra == 'dev'
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: ruff>=0.5; extra == 'dev'
Provides-Extra: llm
Requires-Dist: litellm>=1.40; extra == 'llm'
Provides-Extra: pdf
Requires-Dist: pdfplumber>=0.11; extra == 'pdf'
Requires-Dist: pypdfium2>=4.30; extra == 'pdf'
Description-Content-Type: text/markdown

# pocketcoder-gost

> MCP-сервер для генерации технических документов по ГОСТ/ЕСКД.
> Шесть текстовых ЭД (паспорт, РЭ, ТУ, ИМ, ФО, этикетка) × три формата (md, docx, pdf) из одного `product_data`.

Подключается к Claude Code, Cursor или Claude Desktop по протоколу MCP. LLM-инференс — на стороне твоего агента, сервер делает «руки»: знает структуру ГОСТов, штамп ЕСКД, нумерацию, склонения, и собирает финальные файлы под нормоконтроль.

## Зачем

Конструктор пишет ТУ или паспорт неделю — copy-paste из соседнего изделия, ручная сверка с ГОСТом, правка нумерации. С `pocketcoder-gost` весь скелет ЕСКД-документа собирается за секунды из одной структуры `product_data`, а агент дописывает только техническую конкретику.

## Установка

```bash
pip install pocketcoder-gost
```

Опциональные toolchains для рендера в docx/pdf:

| Формат | Что нужно | Установка |
|--------|-----------|-----------|
| `md`   | ничего сверх пакета | — |
| `docx` | `pandoc` | `brew install pandoc` &nbsp;\|&nbsp; `apt install pandoc` |
| `pdf`  | `xelatex` + класс `eskdx` | `brew install --cask mactex-no-gui` &nbsp;\|&nbsp; `apt install texlive-xetex texlive-lang-cyrillic && tlmgr install eskdx` |

Если toolchain отсутствует — `generate_document` вернёт `{error, hint}` с per-OS подсказкой, не упадёт.

## Подключение к MCP-клиенту

Добавь в конфиг клиента:

**Claude Desktop** — `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) / `%APPDATA%\Claude\claude_desktop_config.json` (Windows):

```json
{
  "mcpServers": {
    "pocketcoder-gost": {
      "command": "pocketcoder-gost",
      "args": ["mcp"]
    }
  }
}
```

**Cursor** — `~/.cursor/mcp.json` (или `.cursor/mcp.json` в проекте):

```json
{
  "mcpServers": {
    "pocketcoder-gost": {
      "command": "pocketcoder-gost",
      "args": ["mcp"]
    }
  }
}
```

**Claude Code** — `.mcp.json` в корне проекта или `~/.claude.json`:

```json
{
  "mcpServers": {
    "pocketcoder-gost": {
      "command": "pocketcoder-gost",
      "args": ["mcp"]
    }
  }
}
```

После перезапуска клиента в чате доступны 5 tools (`list_standards`, `get_standard_section`, `get_document_structure`, `generate_document`, `validate_normcontrol`).

## Доступные tools

| Tool | Назначение |
|------|------------|
| `list_standards()` | Список ГОСТов, входящих в MVP |
| `get_standard_section(standard_id, section)` | Текст конкретного раздела ГОСТ. `section` = номер (`4.2`), `toc`, `meta` |
| `get_document_structure(doc_type)` | Скелет разделов: `passport` \| `manual` \| `tu` \| `mounting` \| `form` \| `label` |
| `generate_document(doc_type, product_data, format, output_path?)` | Рендер документа. `format` = `md` \| `docx` \| `pdf`. Возвращает путь или `{error, hint}` |
| `validate_normcontrol(text, standards)` | Заглушка под валидатор нормоконтроля (полноценный — в v0.2) |

## Пример: попросить агента сгенерировать паспорт

В чате клиента:

> Сделай паспорт на изделие «Блок управления БУС-12», обозначение ЭПТ.421457.001 ПС, разработчик — ООО «Эпотос», в формате PDF.

Агент составит `product_data` (универсальная модель `ProductBase` + открытая таблица ТТХ через `parameters[]`), вызовет `generate_document` и сохранит `passport.pdf` в указанный каталог.

## Что внутри

```
pocketcoder_gost/
├── models/           ProductBase, Person, Parameter (pydantic v2)
├── templates/        15 .j2 шаблонов: 6 doc-types × {md,tex} + штамп ЕСКД + таблица ТТХ
├── generators/       md + docx (pandoc) + pdf (xelatex) пайплайны
├── parsers/          парсеры ГОСТ-разделов
├── loaders/          загрузчики product_data
├── standards/        мета-данные стандартов
└── mcp/              FastMCP-сервер, 5 tools
```

**Стандарты, по которым штампует:**
- ГОСТ 2.114-2016 (ТУ)
- ГОСТ 2.610-2019 (паспорт, РЭ, ИМ, ФО, этикетка)
- ГОСТ 2.104-2006 (штамп ЕСКД)
- ГОСТ 2.601-2019 (ЭД на изделие)
- ГОСТ 15150-69 (условия хранения)
- ГОСТ 14254-2015 / IEC 60529 (степень защиты IP)
- ГОСТ 8.417-2002 (единицы величин)

## Открытая таблица ТТХ

`ProductBase` содержит универсальные поля (наименование, обозначение, питание, габариты и т.д.). Доменно-специфичные ТТХ (масса ОТВ, класс пожара, цвет огнетушащего вещества — что угодно) передаются через массив `parameters[]` с опциональными группами и сносками. Шаблоны автоматически рендерят группированную или плоскую таблицу.

```python
{
  "parameters": [
    {"name": "Огнетушащее вещество", "value": "Аэрозоль", "group": "ТТХ"},
    {"name": "Масса заряда ОТВ", "value": "1,2 кг", "group": "ТТХ"},
    {"name": "Время работы", "value": "8 с", "group": "Эксплуатация", "note": "1"}
  ]
}
```

## Разработка

```bash
git clone https://github.com/pocketcoder-ch/pocketcoder-gost.git
cd pocketcoder-gost
uv sync
pytest                       # 125 unit + e2e тестов
python tools/mcp_smoke.py    # 24 live MCP-вызова
```

## Лицензия

MIT. Автор и единственный мейнтейнер — **Dmitrii Chashchin** ([cdv.inbox@gmail.com](mailto:cdv.inbox@gmail.com)).

## Roadmap

- **v0.1** — MCP + 6 ЕСКД-шаблонов в md/docx/pdf, открытая таблица ТТХ ← _текущий_
- **v0.2** — валидатор нормоконтроля (ЕСПД 1986, коды 01–47): ёлочки, тире, единицы СИ, мёртвые ссылки на пункты/таблицы, обязательные разделы
- **v0.3+** — облако `pocketcoder.tech`: HTTP-backend через `POCKETCODER_API_KEY`, биллинг, коммерческие шаблоны (КП, ТКП, договор)
