PRD: Интерактивный пост-PRD wizard «Что дальше?»
Problem Statement
После того как пользователь сгенерировал PRD через interactive menu Whilly (whilly без аргументов → пункт меню для PRD wizard), он остаётся без явного следующего шага. Чтобы запустить генерацию тасок и их выполнение, нужно вернуться в меню и вручную выбрать другие пункты — это лишние действия и потерянный контекст «я только что создал PRD, что делать дальше?».
Сейчас неинтерактивная цепочка whilly --init "desc" --plan --go решает эту задачу для CLI-сценария, но в interactive menu flow аналога нет. Пользователю нужен дружелюбный диалоговый шаг, который сразу после создания PRD предложит логичные продолжения.
Objectives
- Сократить количество ручных шагов в happy path PRD → tasks → run с 3 (выбор пункта меню × 3) до 2 (создать PRD + Enter).
- Дать пользователю «точку отмены» перед дорогой операцией (
run_plan, который тратит бюджет). - Сохранить совместимость с headless / non-interactive режимами — новая логика работает только в interactive menu и не затрагивает
--init,--prd-wizard,--all,--headless.
Target Users
- Разработчик, использующий
whillyбез аргументов в TTY для запуска interactive menu. - Сценарий: «Сгенерировал PRD через мастер → хочет быстро проверить таски → возможно запустить выполнение».
Requirements
Functional Requirements
FR-1. Триггер появления диалога
- Диалог «Что дальше?» появляется только после успешной генерации PRD через interactive menu Whilly (пункт PRD wizard).
- Диалог НЕ появляется при использовании CLI-флагов:
--init,--prd-wizard <slug>,--all,--plan,--go,--headless. - Диалог НЕ появляется в non-TTY режиме (когда stdout не tty или
WHILLY_HEADLESS=1).
FR-2. Формат основного вопроса
- Используется
rich.prompt.IntPrompt(тот же стиль, что и существующее главное меню). - Заголовок: «Что дальше?» (или аналогичная Rich-панель).
- Опции:
1) Создать таски и запустить— генерируетtasks.jsonчерезprd_to_tasks.generate_tasks()и сразу вызываетrun_plan.2) Только создать таски— генерируетtasks.jsonи переходит к follow-up вопросу (FR-4).3) В главное меню— возврат в_interactive_menuбез действий.
- Дефолтный выбор:
1(Enter без ввода = опция 1).
FR-3. Pre-prompt сводка и превью
- Перед опциями 1/2/3 пользователю показывается:
- Сводка: путь к созданному PRD-файлу, его размер (в KB), предполагаемый путь к будущему
tasks.json(slug из имени PRD). - Превью PRD: первые 10–15 строк PRD через
rich.markdown.Markdownс маркером… (ещё N строк), если PRD длиннее.
- Сводка: путь к созданному PRD-файлу, его размер (в KB), предполагаемый путь к будущему
FR-4. Follow-up вопрос для опции 2
- После успешной генерации
tasks.json(без запуска): дополнительный prompt «Запустить выполнение сейчас? [Y/n]» (rich.prompt.ConfirmилиIntPrompt). - Дефолт:
Y(yes). - При
Yes→run_plan(...)со сгенерированнымtasks.json. - При
No→ возврат в главное меню.
FR-5. Конфликт существующего tasks.json
- Перед перезаписью существующего
tasks.json(для опций 1 и 2) показывается prompt:- Заголовок: «Файл
tasks.jsonуже существует» - Краткая meta-инфа: количество задач, количество
done, дата последней модификации. - Confirm prompt: «Перезаписать? [y/N]» (дефолт
N— безопасный).
- Заголовок: «Файл
- При
No→ возврат в главное меню (генерация отменена). - При
Yes→ перезапись черезprd_to_tasks.generate_tasks().
FR-6. Обработка ошибок генерации PRD
- Если PRD wizard завершился с ошибкой (Claude CLI упал, пользователь нажал Ctrl+C в wizard’е, PRD-файл не создан) — диалог «Что дальше?» не показывается.
- Вместо этого: сообщение об ошибке + автоматический возврат в главное меню.
FR-7. Обработка ошибок генерации тасок
- Если
prd_to_tasks.generate_tasks()упал (rate limit, malformed JSON, timeout) — показывается retry-prompt: «Повторить генерацию? [Y/n]» (дефолтY). - При
Yes→ повторный вызов генерации (без лимита на количество retry — пользователь сам решает). - При
No→ возврат в главное меню.
FR-8. Обработка Ctrl+C
- Любой
KeyboardInterruptво время основного prompt’а или любого follow-up’а → корректный полный выход из Whilly с exit code0(стандартное поведение для пользовательского прерывания). - PRD-файл и
tasks.json(если уже сгенерированы) остаются на диске — при следующем запускеwhillyпользователь увидит их в discovery.
FR-9. Логирование событий
- Каждый выбор пользователя (1/2/3, Y/n в follow-up’ах) логируется в
whilly_logs/whilly_events.jsonlс типом события (prd_followup_choice) и метаданными (slug, путь к PRD, выбранная опция).
Non-Functional Requirements
- Совместимость: изменения не должны ломать существующие CLI-флаги, headless-режим, JSON-output,
--resume. - Visual consistency: используются те же Rich-стили, цвета, шрифты, что и в
_interactive_menu. - Latency: pre-prompt сводка (FR-3) показывается мгновенно — без дополнительных Claude CLI вызовов.
- Recoverability: на любом шаге пользователь может выйти (Ctrl+C) или вернуться в меню без потери уже созданных артефактов.
Technical Constraints
- Интеграция в
whilly/cli.py— в обработчик пункта меню, отвечающего за PRD wizard (рядом с существующимprd_wizard/prd_launcher). - Использование существующих модулей:
prd_to_tasks.generate_tasks(),task_manager.TaskManager,cli.run_plan(). - Новых зависимостей не добавляется — только
rich.prompt,rich.markdown(уже в проекте). - Slug для
tasks.jsonберётся из имени PRD-файла (PRD-<slug>.md→.planning/<slug>-tasks.jsonили эквивалент существующей конвенции).
Success Criteria
- SC-1: От старта
whilly(без аргументов) до запущенногоrun_planв happy path требуется ≤ 3 нажатий: выбор пункта меню → завершение wizard’а → Enter (default1). - SC-2: При ошибке генерации PRD пользователь корректно возвращается в меню без traceback’а в stdout (≥ 95% случаев в ручном тестировании).
- SC-3: Headless-режим (
WHILLY_HEADLESS=1или non-TTY) и все CLI-флаги (--init,--prd-wizard,--all) ведут себя идентично текущему поведению — никаких новых интерактивных промптов. - SC-4: Все события (выбор 1/2/3, retry, overwrite) присутствуют в
whilly_events.jsonlс типомprd_followup_choiceдля аудита. - SC-5: Pytest-тесты покрывают: happy path (опция 1), branch (опция 2 → Y), branch (опция 2 → N), branch (опция 3), retry на task gen failure, overwrite confirmation, Ctrl+C handling.
Out of Scope
- Изменения логики
--init,--prd-wizard,--all,--headless,--resume. - Поддержка диалога в headless / non-TTY режиме (намеренно отключено).
- Превью или редактирование
tasks.jsonперед запуском (сохраняется как существующая возможность через ручной выбор плана из меню). - Изменение алгоритма генерации PRD или тасок (
prd_wizard,prd_to_tasksостаются как есть). - Уведомления / интеграция с Telegram / Slack.
Risks and Assumptions
Risks
- R-1: Пользователь может случайно перезаписать
tasks.jsonс прогрессом (done/in_progressзадачи) → митигация: explicit confirm prompt с meta-инфой (FR-5), дефолтN. - R-2: Rich-prompt в TTY-среде может конфликтовать с
Liveдашбордом, если он уже запущен → митигация: вопрос задаётся до стартаrun_plan/ Dashboard, никогда параллельно. - R-3: Длинный PRD (>500 строк) может «забить» preview → митигация: жёсткий лимит 10–15 строк с маркером
… (ещё N строк)(FR-3). - R-4: Retry на task generation без лимита может зациклить пользователя при стабильной ошибке → митигация: пользователь явно выбирает Yes/No каждый раз, видит сообщение об ошибке между попытками.
Assumptions
- В Whilly есть стабильное соглашение об именовании: PRD
docs/PRD-<slug>.md→tasks.jsonсо slug-производным путём (нужно подтвердить при реализации, посмотревprd_to_tasks). - Существующее главное меню
_interactive_menuиспользуетrich.prompt.IntPromptи корректно обрабатываетKeyboardInterrupt(нужно подтвердить при реализации). - Пункт меню «PRD wizard» в interactive menu возвращает либо путь к созданному PRD, либо ошибку/None — реализатору нужно проверить контракт.
Timeline
Фича компактная — оценка 0.5–1 день разработки + 0.5 дня тестов и docs:
- M1 (день 1, утро): чтение
whilly/cli.py::_interactive_menu+prd_to_tasks+prd_wizard, уточнение контрактов и slug-конвенции. - M2 (день 1, вторая половина): реализация диалога, follow-up’ов, обработки ошибок, логирования.
- M3 (день 2, утро): pytest-тесты по SC-5, ручное тестирование happy / sad paths в TTY.
- M4 (день 2, обед): обновление
README.md,docs/Whilly-Usage.md, ruff check + format, PR.