feat(create-readme): block manual License section and align repo README tagline (#153)

* feat(create-readme): flag manual License section as ERROR

* fix(readme): wrap tagline delimiters and remove License section

* docs(repo-readme): document License check in SKILL.md

* docs(handoff): add handoff and ADR for license-block PR

* docs(handoff): set PR number

---------

Co-authored-by: opencode-agent <agent@opencode.local>
This commit is contained in:
Sergey 2026-07-30 18:06:15 +03:00 committed by GitHub
parent 6c80eb8458
commit 7330f05055
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 75 additions and 6 deletions

View file

@ -159,7 +159,9 @@ repos/{owner}/{repo}/contents/README.md` с base64-контентом и SHA.
features), непустой контент между ними, H1 title prefix `# 🚀 `, ссылку features), непустой контент между ними, H1 title prefix `# 🚀 `, ссылку
`slaid098.dev/support`, секции Quick Start (EN) и Быстрый старт (RU), language `slaid098.dev/support`, секции Quick Start (EN) и Быстрый старт (RU), language
switcher `[English]` / `[Русский]`, заголовок `## 🇷🇺 Русский` (не "Русская switcher `[English]` / `[Русский]`, заголовок `## 🇷🇺 Русский` (не "Русская
версия"), anchor `[Русский](#-русский)` (не `#-русская-версия`). Шаги версия"), anchor `[Русский](#-русский)` (не `#-русская-версия`). Флагирует
ручной заголовок `## License` / `## LICENSE` / `## Лицензия` как ERROR —
дубликат GitHub sidebar (GitHub рендерит license из LICENSE-файла). Шаги
`quick_start_steps_*` не влияют на валидацию — они рендерятся вне delimiter-пар `quick_start_steps_*` не влияют на валидацию — они рендерятся вне delimiter-пар
(summary/features). (summary/features).

View file

@ -171,6 +171,8 @@ function validateReadme(content: string): { ok: boolean; issues: string[] } {
if (!content.includes("# 🚀 ")) if (!content.includes("# 🚀 "))
issues.push("Missing H1 title prefix '# 🚀 '") issues.push("Missing H1 title prefix '# 🚀 '")
if (/^##\s+(License|LICENSE|Лицензия)\s*$/m.test(content))
issues.push("Manual License section found — remove it (GitHub renders license from LICENSE file)")
if (!content.includes("slaid098.dev/support")) if (!content.includes("slaid098.dev/support"))
issues.push("Missing Support link (slaid098.dev/support)") issues.push("Missing Support link (slaid098.dev/support)")
if (!content.includes("Quick Start")) if (!content.includes("Quick Start"))

View file

@ -1,5 +1,10 @@
# 🚀 opencode-config # 🚀 opencode-config
<!-- tagline-en:start -->
> Portable AI coding assistant config with memory & subagent pipeline > Portable AI coding assistant config with memory & subagent pipeline
<!-- tagline-en:end -->
<!-- tagline-ru:start -->
> Переносимый конфиг AI-ассистента для кодинга с памятью и пайплайном subagent'ов
<!-- tagline-ru:end -->
[English](#-english) | [Русский](#-русский) [English](#-english) | [Русский](#-русский)
@ -86,7 +91,3 @@ docker compose up -d
## 💬 Support and contacts / Поддержка и контакты ## 💬 Support and contacts / Поддержка и контакты
👉 **[slaid098.dev/support](https://slaid098.dev/support)** 👉 **[slaid098.dev/support](https://slaid098.dev/support)**
## License
MIT — see [LICENSE](LICENSE).

View file

@ -0,0 +1,37 @@
# ADR-065: Block manual License section in validateReadme
## Статус
Accepted (2026-07-30)
## Контекст
`validateReadme` (тулза `create-readme`) проверяла структуру README для парсинга витриной slaid098.dev, но не контролировала дублирование License-секции. GitHub автоматически рендерит license в sidebar репозитория (из LICENSE-файла и/или настроек repo). Ручной `## License` в README — дубликат, который расходится с источником правды и засоряет валидацию стандарта.
Часть README этого репо содержала ручной `## License` + `MIT — see [LICENSE](LICENSE).`, который нужно убрать одновременно с приведением tagline к новому стандарту (PR #151).
## Решение
Добавить в `validateReadme` ERROR-чек после H1 prefix check:
```ts
if (/^##\s+(License|LICENSE|Лицензия)\s*$/m.test(content))
issues.push("Manual License section found — remove it (GitHub renders license from LICENSE file)")
```
Ключевые свойства regex `^##\s+(License|LICENSE|Лицензия)\s*$` с `m`-флагом:
- Матчит только заголовки секций в начале строки (`## License`, `## LICENSE`, `## Лицензия`).
- НЕ матчит упоминания "license" внутри текста, features-таблиц или custom-sections — `^`/`$` с `m`-флагом ограничивают совпадение целой строкой.
- Регистро-варианты `License`/`LICENSE` покрыты явно; кириллический `Лицензия` — отдельно.
Source of truth для license — файл `LICENSE` + GitHub repo settings, не README.
## Альтернативы
- **Не валидировать license** (status quo) — оставляет дубликаты, расходится с принципом "README = только showcase-контент, метаданные — в GitHub".
- **Удалять `## License` автоматически в create-режиме** — слишком магически; валидатор + явная правка надёжнее и прозрачнее для аудита.
- **Через `includes("## License")`** вместо regex — словило бы `## License` в любом контексте и `### Subsection under License`, плюс false-positive на упоминания. Regex с `^...$` + `m`-флагом точнее.
## Известные последствия (backward compatibility)
Новый license-check помечает `invalid` существующие README других репо slaid098, где есть ручной `## License`/`## Лицензия`. Это intentional — такие README регенерируются/чищутся отдельным шагом после merge (зафиксировано в handoff, секция Pending).

View file

@ -0,0 +1,27 @@
---
pr: 153
title: "feat(create-readme): block manual License section and align repo README tagline"
---
## Что сделано
- `validateReadme` (`.opencode/tools/create-readme.ts`): новый ERROR-чек после H1 prefix check — regex `^##\s+(License|LICENSE|Лицензия)\s*$` с `m`-флагом флагирует ручной заголовок License-секции как дубликат GitHub sidebar.
- `README.md` (3 правки):
- EN tagline (line 2) обёрнут в `<!-- tagline-en:start -->` / `<!-- tagline-en:end -->`.
- Добавлен RU tagline `> Переносимый конфиг AI-ассистента для кодинга с памятью и пайплайном subagent'ов` в `<!-- tagline-ru:start -->` / `<!-- tagline-ru:end -->`.
- Удалена ручная License-секция (`## License` + `MIT — see [LICENSE](LICENSE).`); файл LICENSE в репо остаётся, GitHub рендерит license в sidebar.
- `.opencode/skills/repo-readme/SKILL.md`: в список checks `validate` добавлен пункт про флаг `## License` / `## LICENSE` / `## Лицензия` как ERROR (дубликат GitHub sidebar).
- Smoke-тест (temp, удалён): 10 assertions / 4 сценария — updated README → ok; +`## License` → flagged; old format без tagline delimiters → 4 tagline issues (regression); "license" в features-table без `## License` заголовка → false-positive не триггерит. ALL PASS.
## Почему
Issue #152. После PR #151 (`tagline``tagline_en` + `tagline_ru` с delimiter-тегами) README этого репо не соответствовал новому стандарту: EN tagline был без delimiterов, RU tagline отсутствовал. Параллельно валидатор не ловил ручную License-секцию — дубликат GitHub sidebar (GitHub рендерит license из LICENSE-файла). Объединено по решению пользователя: обе части про соответствие стандарту README.
## Pending
— После merge: другие репо slaid098 с ручным `## License` в README станут invalid при `validate`. Регенерация/чистка делается отдельным шагом (не в этом PR).
## Watch out
- Новый license-check — intentional breaking change для существующих README с ручным `## License`. См. ADR-065.
- Regex матчит только заголовки в начале строки (`^##\s+...` с `m`-флагом), НЕ упоминания "license" в тексте/таблицах — проверено smoke-тестом scenario 4.