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

4.6 KiB
Raw Blame History

pr title
199 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-dictationopencode 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.