opencode-config/docs/handoff/pr-199-cover-command.md
Sergey 87d6c4464b
feat(cover): add /cover command and VERCEL_TOKEN placeholder (#199)
* feat(cover): add /cover command for branded cover generation

* chore(env): add VERCEL_TOKEN placeholder to .env.example

* docs(project-map): add cover command, ADR-088 and handoff for PR #199

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 02:07:34 +03:00

23 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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.