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 длиннее.

FR-4. Follow-up вопрос для опции 2

  • После успешной генерации tasks.json (без запуска): дополнительный prompt «Запустить выполнение сейчас? [Y/n]» (rich.prompt.Confirm или IntPrompt).
  • Дефолт: Y (yes).
  • При Yesrun_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 code 0 (стандартное поведение для пользовательского прерывания).
  • 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 (default 1).
  • 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>.mdtasks.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.