# Mymeet Snapshot

> Настроить или починить локальное зеркало расшифровок встреч из mymeet.ai (mymeet-snapshot) на устройстве. Использовать когда пользователь говорит "настрой mymeet-snapshot", "подключи mymeet к проекту", "где взять api-ключ mymeet", "mymeet-snapshot тянет чужие встречи", "встречи кладутся не в ту папку", или когда первый запуск scripts/mymeet-snapshot.py упал на авторизации/конфиге.

- **Type:** Skill
- **Install:** `agentstack add skill-dewil-claude-toolkit-mymeet-snapshot`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [dewil](https://agentstack.voostack.com/s/dewil)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [dewil](https://github.com/dewil)
- **Source:** https://github.com/dewil/claude-toolkit/tree/main/skills/mymeet-snapshot

## Install

```sh
agentstack add skill-dewil-claude-toolkit-mymeet-snapshot
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# mymeet-snapshot

Скилл для первой настройки или починки локального snapshot расшифровок встреч из mymeet.ai через REST API. Скрипт тянет MD-отчеты проектных встреч и раскладывает по папкам `Встречи/` - для чтения, написания `.summary.md` и работы без захода в web-UI mymeet.

Скрипт-эталон лежит в каноне в `scripts/mymeet-snapshot.py` (top-level папка `scripts/`, не внутри папки скилла). Bootstrap-03-management копирует его в `scripts/` в корне проекта - оттуда же, где его ожидает запуск (`python3 scripts/mymeet-snapshot.py`).

Архитектура повторяет `telegram-snapshot` / `redmine-snapshot`: общий секрет на устройстве, проектные указатели - в репозитории проекта.

## Когда применять

- Пользователь впервые настраивает `scripts/mymeet-snapshot.py` на новом устройстве.
- Подключается новый проект - нужно создать `.mymeet-snapshot.json` и проверить, что общая авторизация на устройстве уже есть.
- Скрипт тянет чужие (непроектные) встречи или кладет встречи не в ту папку - надо настроить правила `rules`.
- Первый запуск падает на авторизации (401) или на неизвестных полях ответа.

## Когда НЕ применять

- Обычный регулярный pull новых встреч - это просто Bash-команда (`python3 scripts/mymeet-snapshot.py`), отдельный скилл не нужен.
- Анализ самих расшифровок - они уже лежат `.md` в `Встречи/`, читай напрямую.
- Чтение истории чатов - это `telegram-snapshot`. Задачи - `redmine-snapshot`.

## Что делает скрипт (модель)

1. `GET /api/workspaces/active/all-meetings` (пагинация `page`/`perPage`) - список встреч аккаунта.
2. Аккаунт mymeet общий, встреч много и не только этого проекта. Фильтр - **whitelist по правилам**: title встречи матчится подстроками из `rules[].match`; первое подошедшее правило задает папку (`rules[].dest`).
3. Подошла под правило + статус не "в обработке/ошибка" (готовы и `processed`, и `new`) + есть дата -> качает MD (`GET /api/storage/download?format=md`) в `//ГГГГ-ММ-ДД.md` (коллизия в один день -> `-2`, `-3`).
4. НЕ подошла ни под одно правило -> в review-файл (`/_mymeet-review.txt`) строкой `meeting_id | дата | title`. Человек глазами решает: проектную - добавить паттерн / дернуть вручную, чужую - игнорировать.
5. Что уже видел - помнит в `/_mymeet-index.json`, повторно не качает.

JSON-отчет по умолчанию НЕ качается (для рутины хватает MD, на объемах JSON - оверхед). По требованию: `python3 scripts/mymeet-snapshot.py --json ` - положит `.json` рядом с MD этой встречи. Отдельного `-deltas` скрипта нет: новые встречи = то, что прогон только что скачал (печатается в конце), а не diff мутирующего файла, как у telegram/redmine.

Режимы (основной - точечный по id; аккаунт mymeet общий на проекты, поэтому балк по умолчанию выключен):
- `--pull ` - **основной режим**: точечно скачать одну встречу по правилам. Принимает и голый `meeting_id`, и URL встречи целиком (id берется из адреса - его видно в адресной строке mymeet). Рабочий цикл: пользователь правит имена спикеров на mymeet -> дает id/URL -> `--pull`.
- `--json ` - добрать JSON конкретной встречи (тоже принимает URL).
- `--list` - dry-run: что нашлось бы и куда легло, без скачивания.
- `--seed` - baseline: отметить все текущие встречи аккаунта как виденные, ничего не качая. Нужен на старте, если история уже скачана вручную: иначе балк создаст дубли существующих файлов (`-2`/`-3`).
- `--all` - балк: забрать ВСЕ новые проектные встречи разом (имена сырые, как распознал mymeet). По умолчанию НЕ запускается - голый прогон без аргументов печатает справку, чтобы на общем мульти-проектном аккаунте случайный запуск не нагреб чужое.

Формат ответа API (подтверждено живым прогоном 2026-06-25): список - `GET all-meetings` -> `{followups: [...], total}`; у встречи поля `id`, `name` (title), `status` (`new`/`processed`/...), `date` в RFC 2822 (`"Thu, 25 Jun 2026 12:02:06 GMT"`). Скрипт читает их толерантно (перебор `*_KEYS`), дату парсит и ISO, и RFC 2822, и epoch.

## Алгоритм настройки

### Шаг 1. Проверить общую авторизацию устройства

```bash
ls ~/.config/mymeet-snapshot/
```

Должен быть `auth.json` (api_key, опционально base_url) с правами 600. Если файла нет - шаг 2.

### Шаг 2. Получить API-ключ mymeet

1. Залогиниться в mymeet.ai.
2. Settings -> API key (`https://app.mymeet.ai/ru/settings/api-key`).
3. Скопировать ключ. Доступно на тарифах Lite, Pro, Business.

### Шаг 3. Заполнить auth.json

```bash
mkdir -p ~/.config/mymeet-snapshot
chmod 700 ~/.config/mymeet-snapshot
```

Содержимое `~/.config/mymeet-snapshot/auth.json`:
```json
{
  "api_key": "",
  "base_url": "https://backend.mymeet.ai",
  "use_curl": true
}
```

- `base_url` можно опустить - дефолт `https://backend.mymeet.ai`.
- `use_curl` - поднять в `true`, если Python падает на SSL (`CERTIFICATE_VERIFY_FAILED`). Сборка python.org на macOS не имеет CA-бандла и не проверяет даже валидный публичный сертификат `backend.mymeet.ai`; curl берет сертификат из системного хранилища. На практике на macOS нужен `true`.

```bash
chmod 600 ~/.config/mymeet-snapshot/auth.json
```

### Шаг 4. Подключить проект (.mymeet-snapshot.json)

В корне проекта - `.mymeet-snapshot.json`:
```json
{
  "meetings_root": "Встречи",
  "rules": [
    { "match": ["синк", "заказчик"], "dest": "с заказчиком/{YYYY}/{MM}" },
    { "match": ["дейли", "дейлик", "команд"], "dest": "с командой/{YYYY}/{MM}" },
    { "match": ["1-1", "one-on-one"], "dest": "1-1/_inbox" }
  ],
  "review_file": "Встречи/_mymeet-review.txt"
}
```

- `meetings_root` - корневая папка встреч относительно корня проекта.
- `rules` - список `{match: [подстроки title], dest: путь-шаблон}`. Первое правило, чья подстрока нашлась в title (регистронезависимо), задает папку. `dest` поддерживает `{YYYY}`/`{MM}`/`{DD}` из даты встречи.
- `review_file` - куда писать непроектные/нераспознанные встречи.

Файл - **не секрет** (ключа нет), коммитится.

> **Важно про title.** mymeet галлюцинирует в шапке (путает имена/стороны), поэтому матчинг по title не стопроцентный. Это осознанный компромисс: вместо тихого пропуска все непонятное падает в review-файл, где видно глазами. Не вылизывай правила до идеала - расширяй по мере того, как реальные встречи попадают в review. 1-1 по title в папку конкретного сотрудника не развести - кладем в `1-1/_inbox`, дальше руками.

### Шаг 5. Dry-run, потом первый pull

Сначала **всегда** `--list` - покажет, что API реально отдает и куда ляжет, ничего не качая:

```bash
cd 
python3 scripts/mymeet-snapshot.py --list
```

Сверь: проектные встречи распознались и нацелены в верные папки, чужое ушло бы в review. Если поля даты/title/id читаются неверно (видно по "дата?" или пустым title) - см. "Типичные ошибки". Когда раскладка верная:

```bash
python3 scripts/mymeet-snapshot.py
```

Зависимостей нет - чистый stdlib (`urllib`).

### Шаг 6. Типичные ошибки

**`ssl.SSLCertVerificationError: CERTIFICATE_VERIFY_FAILED`.** Python не видит CA-бандл (типично для python.org-сборки на macOS). В `~/.config/mymeet-snapshot/auth.json` выставить `"use_curl": true` - запросы пойдут через curl, который берет сертификат из системного хранилища. Перезапустить.

**`401 Unauthorized`.** Неверный/просроченный api_key - перевыпустить (шаг 2). Проверить тариф (нужен Lite/Pro/Business).

**В `--list` у всех "дата?".** В ответе списка поле даты названо не так, как перебирает скрипт (`DATE_KEYS`). Посмотреть сырой ответ: `curl -H "X-API-KEY: " "https://backend.mymeet.ai/api/workspaces/active/all-meetings?page=0&perPage=5"`, найти ключ с датой, добавить его первым в `DATE_KEYS` в скрипте (и оформить как upstream-правку в канон).

**Пустые title / не тот id.** Аналогично - проверить реальные имена полей в сыром ответе и поправить `TITLE_KEYS` / `ID_KEYS`.

**Все ушло в review, хотя встречи проектные.** Правила `rules[].match` не совпали с реальными title - расширить подстроки под то, как mymeet называет встречи (видно в review-файле).

**MD пришел пустой / это JSON.** `download?format=md` мог вернуть не файл, а JSON со ссылкой на storage - скрипт это обрабатывает (следует по `url`/`download_url`/`link`). Если формат ответа иной - глянуть сырой ответ download и поправить `download_md`.

## Жесткие правила

1. **auth.json - НЕ в проектную папку.** Проект на Yandex.Disk; утечка api_key в облако недопустима. Только `~/.config/mymeet-snapshot/` (локально на устройство).
2. **api_key - секрет.** В `.mymeet-snapshot.json`, который коммитится, ключа быть не должно.
3. **Whitelist, не pull-all.** Аккаунт общий; качать все подряд нельзя. Непроектное - в review, не на диск.
4. **JSON - по требованию.** Рутинно держим только MD. JSON (`--json`) - точечно, когда нужна программная обработка (`word_timings`/`chapters`).

## Связанные файлы

- `scripts/mymeet-snapshot.py` в корне проекта - pull MD проектных встреч по whitelist, `--list` (dry-run), `--json ` (добор JSON).
- `~/.config/mymeet-snapshot/auth.json` - локальные credentials на устройство (api_key, base_url). Не в проекте.
- `.mymeet-snapshot.json` в корне проекта - проектные указатели `{meetings_root, rules, review_file}`. Не секрет.
- `/_mymeet-index.json` - реестр уже скачанных встреч (что не качать повторно).
- `/_mymeet-review.txt` - очередь непроектных/нераспознанных встреч на ручное решение.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [dewil](https://github.com/dewil)
- **Source:** [dewil/claude-toolkit](https://github.com/dewil/claude-toolkit)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-dewil-claude-toolkit-mymeet-snapshot
- Seller: https://agentstack.voostack.com/s/dewil
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
