* 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>
6.2 KiB
6.2 KiB
| 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-dictation→opencode voice dictation. - camelCase / UPPER → lowercase:
MyRepo→myrepo. - Числа сохраняются:
video-uniq-2→video uniq 2. - Если имя длиннее ~40 символов → спроси у пользователя сокращение.
Flow
- Read repo — прочитай
README.md, манифест (package.json/pyproject.toml/ иной), пробегись поsrc/(топ-уровень). Определи purpose репо. - Infer — выведи:
title(по правилам выше), candidateicon(по purpose, напр. voice-dictation →mic), candidatesub-icon(по brand-принадлежности из README/манифеста). - Ask user — задай 2-3 вопроса ТОЛЬКО по контенту, который не удалось вывести: подтвердить/скорректировать
icon,sub-icon,title. НЕ задавай вопросов по стилю — стиль захардкожен. - Pre-check — если
assets/cover.pngуже существует, спроси «перезаписать?» перед рендером. - Ensure
assets/dir — если директорииassets/нет, создай её автоматически. - Render — вызови tool
draw-image:
НЕ передавайdraw-image({ template: "cover", title: "<lowercase english>", slots: "icon=<value>,sub-icon=<value>", out: "assets/cover.png" })subtitle. Если tooldraw-imageнедоступен — остановись с ошибкой: «draw-image tool недоступен — невозможно сгенерировать кавер». - Validate README — проверь, что в
README.mdесть. Если нет — добавь ссылку сразу после заголовка H1. Можно использоватьcreate-readme validateили прямую проверку; еслиcreate-readme validateпадает (README без delimiter tags) — предупреди, но кавер всё равно остаётся отрендеренным (кавер ≠ README). - 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 (
MyRepo→myrepo). - Имя репо с числами → сохраняются (
video-uniq-2→video uniq 2). - Имя репо > ~40 символов → спроси сокращение.
- Пользователь хочет не-Lime кавер → отказ: «команда /cover поддерживает только Lime-стиль. Кастомизация вне scope.»
- Существующий
assets/cover.png→ спроси «перезаписать?» перед рендером. - Lucide-иконка не найдена → ошибка со списком похожих иконок (fuzzy match по имени в
icons/lucide/). create-readme validateпадает (README без delimiter tags) → предупреди, но кавер рендерится.draw-imagetool недоступен → ясная ошибка, рендер невозможен.assets/директория отсутствует → создаётся автоматически.