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:
parent
6c80eb8458
commit
7330f05055
5 changed files with 75 additions and 6 deletions
|
|
@ -159,7 +159,9 @@ repos/{owner}/{repo}/contents/README.md` с base64-контентом и SHA.
|
|||
features), непустой контент между ними, H1 title prefix `# 🚀 `, ссылку
|
||||
`slaid098.dev/support`, секции Quick Start (EN) и Быстрый старт (RU), language
|
||||
switcher `[English]` / `[Русский]`, заголовок `## 🇷🇺 Русский` (не "Русская
|
||||
версия"), anchor `[Русский](#-русский)` (не `#-русская-версия`). Шаги
|
||||
версия"), anchor `[Русский](#-русский)` (не `#-русская-версия`). Флагирует
|
||||
ручной заголовок `## License` / `## LICENSE` / `## Лицензия` как ERROR —
|
||||
дубликат GitHub sidebar (GitHub рендерит license из LICENSE-файла). Шаги
|
||||
`quick_start_steps_*` не влияют на валидацию — они рендерятся вне delimiter-пар
|
||||
(summary/features).
|
||||
|
||||
|
|
|
|||
|
|
@ -171,6 +171,8 @@ function validateReadme(content: string): { ok: boolean; issues: string[] } {
|
|||
|
||||
if (!content.includes("# 🚀 "))
|
||||
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"))
|
||||
issues.push("Missing Support link (slaid098.dev/support)")
|
||||
if (!content.includes("Quick Start"))
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
# 🚀 opencode-config
|
||||
<!-- tagline-en:start -->
|
||||
> Portable AI coding assistant config with memory & subagent pipeline
|
||||
<!-- tagline-en:end -->
|
||||
<!-- tagline-ru:start -->
|
||||
> Переносимый конфиг AI-ассистента для кодинга с памятью и пайплайном subagent'ов
|
||||
<!-- tagline-ru:end -->
|
||||
|
||||
[English](#-english) | [Русский](#-русский)
|
||||
|
||||
|
|
@ -86,7 +91,3 @@ docker compose up -d
|
|||
## 💬 Support and contacts / Поддержка и контакты
|
||||
|
||||
👉 **[slaid098.dev/support](https://slaid098.dev/support)**
|
||||
|
||||
## License
|
||||
|
||||
MIT — see [LICENSE](LICENSE).
|
||||
37
docs/decisions/065-pr-153-block-license-align-readme.md
Normal file
37
docs/decisions/065-pr-153-block-license-align-readme.md
Normal 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).
|
||||
27
docs/handoff/pr-153-block-license-align-readme.md
Normal file
27
docs/handoff/pr-153-block-license-align-readme.md
Normal 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.
|
||||
Loading…
Add table
Reference in a new issue