opencode-config/.opencode/commands/cover.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

6.2 KiB
Raw Blame History

description agent
Generate a branded 1024×1024 cover (Lime style) via draw-image build

Generate a repository cover image following the hardcoded slaid098 Lime standard. Style is NEVER asked of the user and NEVER overridden — only content questions are asked.

Hardcoded standard (НЕ спрашивается, НЕ переопределяется)

  • template = cover (1024×1024, единственный доступный шаблон в .opencode/draw-image/templates/cover.svg).
  • Palette = Lime from .opencode/draw-image/brand.json: base #0a0a0a, surface #121212, accent #ccff00 (icons), fg #ededed (text), muted #a1a1aa.
  • title: ровно ОДИН заголовок, lowercase English, без исключений. Авто-деривация из имени репо (см. правила ниже).
  • subtitle: ОТСУТСТВУЕТ. Флаг --subtitle / параметр subtitle запрещён стандартом. Передача subtitle = ошибка команды.
  • out = assets/cover.png (относительно корня репо). Глобальный путь для витрины slaid098.dev — без исключений.

Slots

  • iconобязательный. Lucide-иконка из .opencode/draw-image/icons/lucide/ (2007 шт.) ИЛИ brand-logo из .opencode/draw-image/brand-logos/. Передаётся без расширения (напр. mic, не mic.svg).
  • sub-iconопциональный. Brand-logo из .opencode/draw-image/brand-logos/ для показа brand-принадлежности.
  • badgeопциональный. Путь к SVG-бейджу.

Title derivation rules

  • Имя репо → lowercase, дефисы/подчёркивания → пробелы: opencode-voice-dictationopencode voice dictation.
  • camelCase / UPPER → lowercase: MyRepomyrepo.
  • Числа сохраняются: video-uniq-2video uniq 2.
  • Если имя длиннее ~40 символов → спроси у пользователя сокращение.

Flow

  1. Read repo — прочитай README.md, манифест (package.json / pyproject.toml / иной), пробегись по src/ (топ-уровень). Определи purpose репо.
  2. Infer — выведи: title (по правилам выше), candidate icon (по purpose, напр. voice-dictation → mic), candidate sub-icon (по brand-принадлежности из README/манифеста).
  3. Ask user — задай 2-3 вопроса ТОЛЬКО по контенту, который не удалось вывести: подтвердить/скорректировать icon, sub-icon, title. НЕ задавай вопросов по стилю — стиль захардкожен.
  4. Pre-check — если assets/cover.png уже существует, спроси «перезаписать?» перед рендером.
  5. Ensure assets/ dir — если директории assets/ нет, создай её автоматически.
  6. Render — вызови tool draw-image:
    draw-image({ template: "cover", title: "<lowercase english>", slots: "icon=<value>,sub-icon=<value>", out: "assets/cover.png" })
    
    НЕ передавай subtitle. Если tool draw-image недоступен — остановись с ошибкой: «draw-image tool недоступен — невозможно сгенерировать кавер».
  7. Validate README — проверь, что в README.md есть ![Cover](assets/cover.png). Если нет — добавь ссылку сразу после заголовка H1. Можно использовать create-readme validate или прямую проверку; если create-readme validate падает (README без delimiter tags) — предупреди, но кавер всё равно остаётся отрендеренным (кавер ≠ README).
  8. Done — сообщи путь к готовому PNG.

Extension mechanism (НЕ хардкод брендов)

Команда НЕ хардкодит конкретные бренды. OpenCode упоминается ниже только как ПРИМЕР — это не special-case в коде. Для любого бренда: если в .opencode/draw-image/brand-logos/ есть SVG, его можно использовать как sub-icon. Расширение = добавление brand-logo SVG в draw-image/brand-logos/, а НЕ изменение этой команды.

Пример: README указывает на принадлежность к OpenCode-ecosystem → предложи sub-icon=opencode (файл brand-logos/opencode.svg). Для не-OpenCode репо sub-icon пропускается.

Граничные случаи

  • Нет README / нет манифеста → purpose не выводится → спроси пользователя icon + title напрямую (без infer).
  • Имя репо camelCase / UPPER → нормализуется в lowercase (MyRepomyrepo).
  • Имя репо с числами → сохраняются (video-uniq-2video uniq 2).
  • Имя репо > ~40 символов → спроси сокращение.
  • Пользователь хочет не-Lime кавер → отказ: «команда /cover поддерживает только Lime-стиль. Кастомизация вне scope.»
  • Существующий assets/cover.png → спроси «перезаписать?» перед рендером.
  • Lucide-иконка не найдена → ошибка со списком похожих иконок (fuzzy match по имени в icons/lucide/).
  • create-readme validate падает (README без delimiter tags) → предупреди, но кавер рендерится.
  • draw-image tool недоступен → ясная ошибка, рендер невозможен.
  • assets/ директория отсутствует → создаётся автоматически.