--- pr: 199 title: "feat(cover): add /cover command and VERCEL_TOKEN placeholder" --- ## Что сделано Добавил команду `/cover` для генерации брендового кавера 1024×1024 в захардкоженном Lime-стиле (issue #198) + optional-плейсхолдер `VERCEL_TOKEN` в `.env.example`. Структурное изменение: новый файл `.opencode/commands/cover.md`. 1. **`.opencode/commands/cover.md`** — новая команда `/cover` (frontmatter `agent: build`, description). Стиль захардкожен и НЕ спрашивается: `template=cover`, Lime-палитра из `draw-image/brand.json` (base `#0a0a0a`, accent `#ccff00`, fg `#ededed`), title — один заголовок lowercase English (авто-деривация из имени репо: `opencode-voice-dictation` → `opencode voice dictation`), subtitle запрещён стандартом, `out=assets/cover.png`. Слоты: `icon` (обязательный — Lucide из `icons/lucide/` или brand-logo из `brand-logos/`), `sub-icon` (опц.), `badge` (опц.). Flow: read repo → infer → ask 2-3 content-вопроса (НЕ по стилю) → `draw-image` tool → validate README `![Cover](assets/cover.png)`. Extension = добавление brand-logo SVG в `draw-image/brand-logos/`, а не изменение команды (OpenCode упомянут только как пример). Граничные случаи: нет README/манифеста, camelCase→lowercase, числа сохраняются, длинное имя (>~40 символов)→сокращение, не-Lime запрос→отказ, существующий cover.png→спросить перезапись, Lucide не найден→fuzzy-подсказки, `draw-image` недоступен→ошибка, `assets/` нет→автосоздание. 2. **`.env.example`** — добавлен optional-плейсхолдер `VERCEL_TOKEN=` после секции Cloudflare Tunnel, в стиле соседних optional-секций (комментарий «Vercel (optional — placeholder example, not currently wired to code)»). В коде пока не задействован — placeholder-пример. Существующие записи не изменены; тесты `tests/test_permissions.py` не затронуты. 3. Добавлен handoff + ADR-088. ## Почему Детерминированный способ генерации кавера одной командой вместо повторного объяснения Lime-стиля в каждом новом чате. Стандарт захардкожен — пользователь не может сломать витрину slaid098.dev кастомной палитрой/путём. `VERCEL_TOKEN` добавлен как placeholder, чтобы не забыть про переменную при будущей интеграции (доп. scope, одобрено пользователем — тот же PR). ## Pending — (после merge: при будущей Vercel-интеграции — заполнить `VERCEL_TOKEN` в `.env` и завести код, читающий переменную) ## Watch out - **Скилла `cover` нет по спеке** — команда самодостаточна (вне scope issue #198). Не путать с `repo-readme` skill, который формирует cover-pipeline в своём workflow (PR#158) — `/cover` переиспользует тот же `draw-image` tool, но не зависит от skill. - **`subtitle` запрещён стандартом** — передача `--subtitle` / параметра `subtitle` = ошибка команды. Это сознательное решение (ADR-088): продакшн `templates/cover.svg` уже упрощён до icon+title (PR#197), subtitle-слот удалён из продакшн-шаблона. - **`VERCEL_TOKEN` — placeholder, не wired** — переменная объявлена в `.env.example`, но код её не читает. Тесты `tests/test_permissions.py` (`CONTEXT7_API_KEY`, `OPENCODE_SERVER_USERNAME`) не затронуты и проходят. - **Extension-механизм** — команда НЕ хардкодит бренды. OpenCode упоминается в `cover.md` только как ПРИМЕР (`sub-icon=opencode`). Для любого бренда: добавить SVG в `draw-image/brand-logos/` — команда подхватит через `draw-image` slot resolver.