* fix(create-readme): allow empty quick_start with steps-only Quick Start * docs(handoff): add handoff + ADR for empty-quick-start * docs(handoff): set PR number * docs(project-map): update create-readme.ts role for PR#149 --------- Co-authored-by: opencode-agent <agent@opencode.local>
5.5 KiB
ADR-063: Allow empty quick_start with steps-only Quick Start (PR-149)
Статус
Accepted (2026-07-30)
Контекст
ADR-062 (PR-146) добавил параметры quick_start_steps_en/ru и условный
hasBashBlock (include_clone !== false || quick_start !== ""), чтобы
поддержать userscript-README с кликабельными шагами вместо bash-команды. Однако
валидация в execute() (mode create) по-прежнему требовала непустой
quick_start через falsy-чек !v в required-Record — пустая строка ""
считалась отсутствующей, тулза возвращала quick_start is required for create mode. Скилл repo-readme (раздел 8 «Кейс: userscript / web-app / npm-package»)
документирует комбинацию include_clone: false + quick_start: "" +
quick_start_steps_* как supported — но тулза её отвергала. Дополнительно:
hasBashBlock использовал args.quick_start !== "", что для undefined
давало true (undefined !== ""), и bash-блок рендерил literal undefined
в теле code-fence. ADR-062 явно отметил в «Альтернативах», что ослабление
required-чек — отдельное решение вне scope того PR.
Решение
CreateArgs.quick_start— сделан optional (quick_start?: string), чтобы отражать реальную опциональность параметра.- Required-валидация в
execute()—quick_startубран из required-Record. Вместо него добавлен guard после общих required-чеков:hasBash = include_clone !== false || (quick_start ?? "") !== ""hasStepsEn = !!quick_start_steps_en && length > 0hasStepsRu = !!quick_start_steps_ru && length > 0- Если
!hasBash && !hasStepsEn→ ошибкаquick_start or quick_start_steps_en required (Quick Start EN would be empty) - Если
!hasBash && !hasStepsRu→ аналогичная ошибка для RU. Guard гарантирует, что Quick Start секция не пуста в ОБОИХ языках. Если bash-блок рендерится — steps опциональны (backward compat).
hasBashBlockи тела bash-блоков —args.quick_start ?? ""вместоargs.quick_start: обрабатываетundefined(когда параметр не передан вообще), иначеundefined !== ""даётtrueи bash-блок рендерит literalundefined. Локальная переменнаяqs = args.quick_start ?? ""переиспользуется в обоих bash-блоках (EN/RU).- Schema
.describe()— убрано "Required for create mode.", добавлено пояснение: параметр optional, пустая строка/absent допустимы когда естьquick_start_steps_*, bash-блок опускается при пустом ANDinclude_clone=false. validateReadme— без изменений: проверяет наличие строк "Quick Start" / "Быстрый старт" в заголовках (### ⚡ Quick Start/### ⚡ Быстрый старт), которые рендерятся всегда. README без bash-блока (только steps) проходит валидацию. Подтверждено smoke-тестом (сценарий 1).- Backward compatibility — все существующие вызовы с непустым
quick_startи без steps работают идентично (сценарий 2 smoke-теста: git clone + pip install, без шагов, безundefined).
Альтернативы
- Сделать
quick_startrequired только когда нет steps — отвергнуто: сложная условная required-логика в одном Record, тяжело читать. Cleaner — убрать из required и добавить явный guard с понятными сообщениями ошибок для каждого языка отдельно. - Один общий guard «есть bash ИЛИ (steps EN И steps RU)» — отвергнуто:
это допустило бы пустую RU-секцию когда есть bash + steps EN (но это
backward-compat кейс, где bash рендерится в обеих секциях). Текущий guard
(
!hasBash && !hasStepsX) срабатывает ТОЛЬКО когда bash-блока нет — тогда steps нужны в обоих языках. Когда bash есть — steps опциональны. - Валидировать steps в
validateReadme— отвергнуто: validate проверяет структуру delimiter-пар и наличие секций, не содержимое Quick Start. Заголовки рендерятся всегда; проверять пустоту секции — responsibilityexecute(), неvalidateReadme. - Не вводить
qsлокальную переменную — отвергнуто: повторениеargs.quick_start ?? ""в трёх местах (hasBashBlock + 2 bash-блока) хуже для читаемости, чем одна переменная.