* 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>
4.6 KiB
4.6 KiB
| 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.
.opencode/commands/cover.md— новая команда/cover(frontmatteragent: 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-imagetool → validate README. Extension = добавление brand-logo SVG вdraw-image/brand-logos/, а не изменение команды (OpenCode упомянут только как пример). Граничные случаи: нет README/манифеста, camelCase→lowercase, числа сохраняются, длинное имя (>~40 символов)→сокращение, не-Lime запрос→отказ, существующий cover.png→спросить перезапись, Lucide не найден→fuzzy-подсказки,draw-imageнедоступен→ошибка,assets/нет→автосоздание..env.example— добавлен optional-плейсхолдерVERCEL_TOKEN=после секции Cloudflare Tunnel, в стиле соседних optional-секций (комментарий «Vercel (optional — placeholder example, not currently wired to code)»). В коде пока не задействован — placeholder-пример. Существующие записи не изменены; тестыtests/test_permissions.pyне затронуты.- Добавлен handoff + ADR-088.
Почему
Детерминированный способ генерации кавера одной командой вместо повторного объяснения Lime-стиля в каждом новом чате. Стандарт захардкожен — пользователь не может сломать витрину slaid098.dev кастомной палитрой/путём. VERCEL_TOKEN добавлен как placeholder, чтобы не забыть про переменную при будущей интеграции (доп. scope, одобрено пользователем — тот же PR).
Pending
— (после merge: при будущей Vercel-интеграции — заполнить VERCEL_TOKEN в .env и завести код, читающий переменную)
Watch out
- Скилла
coverнет по спеке — команда самодостаточна (вне scope issue #198). Не путать сrepo-readmeskill, который формирует cover-pipeline в своём workflow (PR#158) —/coverпереиспользует тот жеdraw-imagetool, но не зависит от 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-imageslot resolver.