# Каталог программ Siemens

Дистрибутивы хранятся в `catalog`, формат метаданных описан в
`schema/index.schema.json`. Названия и описания — на русском языке.

## Структура

```text
catalog/
├── index.md
├── files.yaml
└── category/
    ├── index.md
    └── program/
        ├── index.md
        ├── files/
        └── img/
```

Каждая категория и программа имеет один `index.md`. YAML Front Matter содержит
метаданные, тело файла — описание в Markdown. Дочерние элементы определяются по
папкам и не перечисляются в метаданных. Все версии программы находятся в одном
индексном файле.

## Категория

```md
---
format: 1
type: category
name: Название категории
order: -10
---

Описание категории.
```

`order` необязателен; меньшее значение выводится раньше.

## Программа

```md
---
format: 1
type: program
name: Название программы
summary: Короткое назначение программы для списка категории.
homepage: https://example.org
source: https://github.com/example/project
forum: https://example.org/forum/topic
author: Автор
screenshots:
  - img/screenshot.png
versions:
  - version: "1.2.0"
    status: current
    released: "2007-08-14"
    files:
      - path: files/program-1.2.0.zip
        description: Дистрибутив
        platform: win32
additional_files:
  - path: files/manual.pdf
    description: Руководство пользователя
---

Полное описание программы в Markdown.
```

Обязательные поля программы: `format`, `type`, `name`, `summary`, `screenshots`,
`versions`. Тело Markdown также обязательно. Значения `platform`: `win32`,
`win64`, `dos`, `java`, `j2me`. Значения `status`: `current`, `archived`.

Файлы версий указываются в `versions[].files`, общие файлы — в
`additional_files`. Пути файлов начинаются с `files/`, скриншотов — с `img/`.
Дистрибутивы хранятся в совместимых с Windows XP ZIP-архивах через Git LFS;
отдельные EXE также упаковываются в ZIP.

Размеры и SHA-256 всех файлов находятся в автоматически создаваемом
`catalog/files.yaml`, а не в индексах программ.

## Команды

```shell
pnpm install
pnpm extract-archives /path/to/output
pnpm fill-metadata
pnpm fill-metadata:check
pnpm repack-archive path/to/archive.rar
pnpm screenshots --help
pnpm tree
pnpm typecheck
```

`extract-archives` рекурсивно распаковывает ZIP из `catalog` в заданный каталог,
сохраняет структуру категорий и программ и не перезаписывает существующие пути.
`fill-metadata` пересобирает
`catalog/files.yaml`. `tree` принимает путь и флаги
`--paths`, `--versions`. `repack-archive` принимает архив, EXE или папку,
создаёт совместимый с Windows XP ZIP и проверяет содержимое и timestamps; флаг
`--replace` удаляет исходный файл только после успешной проверки. Временный
каталог задаётся через `--temp-dir /tmp/codex/<task_name>`. `screenshots`
запускает программы на Windows-машине по SSH и снимает их окна.
