architect/standards/5-format/format-questions.md

type: standard
aspect: format
title: "СТАНДАРТ ВОПРОСОВ"
version: 1.0.0
date: 2026-02-19
status: active


СТАНДАРТ ВОПРОСОВ

Версия: 1.0.0
Дата: 2025-12-24
Статус: Обязательный


ПРИНЦИП

ВСЕ вопросы в системе задаются ТОЛЬКО с номерованными вариантами.

Каждый вариант должен быть:
- Однозначным (нет двусмысленности)
- Конкретным (понятно что произойдёт)
- Пронумерованным (1, 2, 3...)


ПРАВИЛА

1. ФОРМАТ ВОПРОСА

<Вопрос>?
  1) <Вариант 1>
  2) <Вариант 2>
  3) <Вариант 3>
  0) Отмена / Выход

Выбор [номер]:

2. ОБЯЗАТЕЛЬНЫЕ ЭЛЕМЕНТЫ

Элемент Требование
Вопрос Короткий, понятный, со знаком ?
Варианты Минимум 2, максимум 9
Нумерация 1, 2, 3... (НЕ a, b, c)
Отмена Всегда есть 0) для выхода/отмены
Промпт ввода Выбор [номер]: или Выбор:

3. ЗАПРЕЩЁННЫЕ ФОРМАТЫ

Yes/No вопросы

# ПЛОХО
read -p "Продолжить? (y/n): " confirm

Буквенные варианты

# ПЛОХО
echo "a) Вариант A"
echo "b) Вариант B"

Свободный ввод без вариантов

# ПЛОХО
read -p "Что делать?: " action

Неявные варианты

# ПЛОХО
read -p "Введите команду: " cmd

ПРИМЕРЫ

✅ ПРАВИЛЬНО: Recovery меню

echo "Что восстановить?"
echo ""
echo "  1) Полное восстановление"
echo "  2) Только workspace"
echo "  3) Только критические данные"
echo "  4) Только Docker volumes"
echo "  0) Отмена"
echo ""
read -p "Выбор: " choice

case $choice in
    1) restore_full ;;
    2) restore_workspace ;;
    3) restore_critical ;;
    4) restore_docker ;;
    0) exit 0 ;;
    *) echo "Неверный выбор" ;;
esac

✅ ПРАВИЛЬНО: Подтверждение операции

echo "Будет выполнено:"
echo "  • Удаление всех данных"
echo "  • Восстановление из бэкапа"
echo ""
echo "Продолжить?"
echo "  1) Да, продолжить"
echo "  2) Нет, отменить"
echo ""
read -p "Выбор: " confirm

case $confirm in
    1) execute_operation ;;
    2) echo "Отменено"; exit 0 ;;
    *) echo "Неверный выбор"; exit 1 ;;
esac

✅ ПРАВИЛЬНО: Выбор модели

echo "Выберите модель:"
echo "  1) Opus 4.5 (архитектура)"
echo "  2) Sonnet 4 (разработка)"
echo "  3) Haiku 4.5 (поиск)"
echo "  0) Отмена"
echo ""
read -p "Выбор: " model

case $model in
    1) use_opus ;;
    2) use_sonnet ;;
    3) use_haiku ;;
    0) exit 0 ;;
esac

❌ ПЛОХО: Yes/No вопрос

# Неоднозначно, пользователь может ввести y/Y/yes/YES/1
read -p "Продолжить? (y/n): " confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
    execute
fi

ИСПРАВЛЕНО:

echo "Продолжить выполнение?"
echo "  1) Да, продолжить"
echo "  2) Нет, отменить"
read -p "Выбор: " choice

case $choice in
    1) execute ;;
    2) exit 0 ;;
esac

❌ ПЛОХО: Свободный ввод

# Пользователь может ввести что угодно
read -p "Введите имя архива: " name

ИСПРАВЛЕНО:

echo "Выберите архив:"
i=1
for f in *.tar.gz; do
    echo "  $i) $(basename $f)"
    ((i++))
done
echo "  0) Отмена"
read -p "Выбор: " choice

ДОПОЛНИТЕЛЬНЫЕ ТРЕБОВАНИЯ

1. Контекст перед вопросом

Всегда показывать ЧТО будет сделано:

echo "ОПЕРАЦИЯ: Полное восстановление"
echo ""
echo "Будет выполнено:"
echo "  1. Восстановление из GOLDEN"
echo "  2. Переустановка npm"
echo "  3. Перезапуск сервисов"
echo ""
echo "⚠ Время выполнения: ~5 минут"
echo ""
echo "Продолжить?"
echo "  1) Да, выполнить"
echo "  2) Нет, отменить"

2. Валидация ввода

Всегда проверять ввод:

read -p "Выбор: " choice

case $choice in
    1|2|3)
        # Валидный выбор
        ;;
    0)
        echo "Отменено"
        exit 0
        ;;
    *)
        echo "❌ Неверный выбор: $choice"
        echo "Допустимые значения: 1, 2, 3, 0"
        exit 1
        ;;
esac

3. Значение по умолчанию

Если есть рекомендуемый вариант:

echo "Выберите действие:"
echo "  1) Быстрое восстановление (рекомендуется)"
echo "  2) Полное восстановление"
echo "  3) Выборочное восстановление"
echo "  0) Отмена"
echo ""
read -p "Выбор [1]: " choice
choice=${choice:-1}  # По умолчанию 1

ПРИМЕНЕНИЕ

Где использовать этот стандарт:

  1. Bash скрипты — все интерактивные меню
  2. Python CLI — argparse с choices или input()
  3. Промпты Claude — при делегировании выбора пользователю
  4. Документация — примеры использования

Исключения:

Стандарт НЕ применяется к:
- Параметрам командной строки (--flag)
- API endpoints
- Конфигурационным файлам
- Логам


МИГРАЦИЯ СУЩЕСТВУЮЩИХ СКРИПТОВ

Алгоритм:

  1. Найти все read -p с y/n
  2. Заменить на номерованные варианты
  3. Добавить 0) Отмена если нет
  4. Добавить валидацию case с *)
  5. Протестировать

Поиск кандидатов:

# Найти все y/n вопросы
grep -r "read -p.*y/n" --include="*.sh"

# Найти все read без case
grep -A5 "read -p" *.sh | grep -v "case"

ПРИМЕР ПОЛНОГО МЕНЮ

#!/bin/bash
# Пример правильного меню

show_menu() {
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "  ГЛАВНОЕ МЕНЮ"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo ""
    echo "  1  Начать работу"
    echo "  2  Настройки"
    echo "  3  Статус системы"
    echo "  4  Восстановление"
    echo "  0  Выход"
    echo ""
    echo -n "  Выбор: "
}

main() {
    while true; do
        show_menu
        read choice

        case $choice in
            1)
                start_work
                ;;
            2)
                settings_menu
                ;;
            3)
                show_status
                ;;
            4)
                recovery_menu
                ;;
            0)
                echo "Выход..."
                exit 0
                ;;
            *)
                echo "❌ Неверный выбор: $choice"
                echo "Нажмите Enter для продолжения..."
                read
                ;;
        esac
    done
}

main "$@"

ПРОВЕРКА СООТВЕТСТВИЯ

Чеклист для review:


ССЫЛКИ


Версия: 1.0.0