# Mod Observatory

**Локальный анализатор коллекций игровых модов.** Собирает карту модпака из папок и ZIP-архивов, показывает объявленные зависимости, порядок загрузки и совпадающие пути, а затем сравнивает два снимка.

[Открыть приложение](https://ghostnever-lkm.github.io/mod-observatory/) · [Скачать последнюю версию](https://github.com/GhosTnever-lkm/mod-observatory/releases/latest) · [Сообщить об ошибке](https://github.com/GhosTnever-lkm/mod-observatory/issues)

## Возможности

- Импорт выбранных папок, ZIP-архивов или ранее экспортированного JSON-снимка.
- Индекс путей без учёта регистра и граф связей по распознанным метаданным.
- Поиск отсутствующих и выключенных зависимостей, циклов зависимостей и порядка загрузки, объявленных конфликтов, общих путей, совпадений SHA-256 и небезопасных относительных путей.
- Сравнение двух снимков: добавленные, удалённые и изменённые моды, файлы, зависимости и порядок.
- Фильтры по игре, моду и пути; экспорт JSON без содержимого файлов.

Приложение не устанавливает, не включает, не переставляет, не исправляет и не изменяет моды. Общий путь — повод проверить совместимость вручную, а не доказательство конфликта. Синтаксис версий и зависимостей у разных игр отличается: неизвестные форматы не угадываются.

## Быстрый старт

1. Откройте [веб-приложение](https://ghostnever-lkm.github.io/mod-observatory/).
2. Выберите папку мода или ZIP. Можно добавить несколько файлов для анализа коллекции.
3. Просмотрите сводку, находки, граф связей и общие пути.
4. Нажмите **«Экспорт отчёта»**, чтобы скачать JSON-снимок. Для сравнения выберите **«Импорт JSON»** и загрузите прежний снимок.

Файлы читаются локально в текущей вкладке. Для запуска копии с диска используйте локальный HTTP-сервер (например, `python -m http.server 8000`) и откройте `http://localhost:8000`. Прямое открытие `index.html` через `file://` может блокировать ES-модули.

## Поддержка форматов

Первая версия читает из Paradox `descriptor.mod` имя и имена зависимостей. Зависимость связывается с импортированным модом только при единственном совпадении имени. Остальные файлы индексируются, но поведение переопределений, специфичное для конкретной игры, не моделируется.

| Источник | Обрабатывается | Ограничения |
| --- | --- | --- |
| Папка | Относительные пути, размер, SHA-256 при поддержке браузером, `descriptor.mod` | Группировка по верхней папке выбора; неизвестные манифесты не разбираются |
| ZIP | Записи без сжатия и DEFLATE, проверка размера и CRC, текст поддерживаемого дескриптора | ZIP64, шифрование и другие методы сжатия не поддерживаются; содержимое не извлекается на диск |
| JSON-снимок | ID и метаданные модов, порядок, зависимости, файлы и сохранённые хеши | Отсутствующие в снимке хеши нельзя восстановить; импортированный JSON считается пользовательским вводом |

Подробные ограничения и смысл находок описаны в [SUPPORT.md](SUPPORT.md).

## Приватность и безопасность

- Нет сервера загрузки, аналитики, сторонних скриптов и сетевых запросов приложения.
- Выбранные файлы обрабатываются в активной вкладке; экспорт содержит метаданные и отчёт, но не содержимое файлов.
- Скрипты, DLL, плагины и код модов не исполняются.
- ZIP-записи не распаковываются на диск. Проверки размера и CRC помогают обнаружить повреждение, но не подтверждают безопасность архива.
- Лимит импорта — 50 000 файлов и 512 МиБ; JSON — до 25 МиБ и 50 000 модов.
- Коллекция автоматически не сохраняется. Для переноса или хранения используйте явный экспорт/импорт JSON.

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

Для регрессионного набора нужен Node.js 20 или новее. Сборка и зависимости времени выполнения не требуются.

```sh
npm run check:version
npm test
```

После фиксации подготовленных файлов в Git архив для выпуска можно собрать командой `npm run release:bundle`. Архив и SHA-256 появятся в `release/`; файлы этой папки не включаются в репозиторий. Скрипт намеренно упаковывает состояние `HEAD`, чтобы незакоммиченные изменения случайно не попали в дистрибутив.

Для изменений интерфейса см. [CONTRIBUTING.md](CONTRIBUTING.md). Статус проекта и запланированные изменения ведутся в [CHANGELOG.md](CHANGELOG.md).

## Бесплатная и Pro-версии

Основное приложение бесплатно и распространяется под MIT. Поддержать автора можно через [Buy Me a Coffee](https://buymeacoffee.com/azizazimov8), [Boosty](https://boosty.to/azimovian) или [Gumroad](https://azimovian22.gumroad.com/).

Pro-версия пока находится в разработке концепции. Рассматриваются сохранённые рабочие пространства, история нескольких снимков, дополнительные форматы отчётов и адаптеры других игр. Продажа начнётся после реализации и подготовки доставки этих функций.

## Лицензия

MIT. Подробности — в [LICENSE](LICENSE).
