Требования
Сделайте CLI-дневник тренировок с командами add, list, update, delete и find и хранением в JSON. Общий флаг --data задаёт путь к хранилищу, по умолчанию workouts.json в текущей директории. Тренировка имеет уникальный ID, дату YYYY-MM-DD, тип занятия, длительность в целых минутах, заметку и список упражнений. Упражнение содержит название и список подходов; подход задаётся числом повторений и весом в килограммах. Для упражнений с собственным весом вес допускается равным нулю. Дата, тип и хотя бы одно упражнение обязательны. Количество повторений должно быть положительным целым, вес и длительность — неотрицательными, длительность занятия — положительной.
Add получает основные поля флагами, а упражнения и подходы — из отдельного JSON-файла, указанного через --details. Программа проверяет даты по календарю. List допускает --from и --to как включительный диапазон; записи сортируются по дате убыванию, а при равной дате по ID возрастанию. Find ищет подстроку без учёта регистра в типе, заметке и названиях упражнений. Update по --id меняет дату, тип, длительность или заметку по отдельности; состав упражнений обновляется только при явном --details. Удаление требует подтверждающий флаг --yes, чтобы случайный вызов не удалил запись.
При первом запуске отсутствующий JSON-файл считается пустой историей. При любом изменении файл проверяется целиком и записывается атомарно. Повреждённое хранилище нельзя исправлять молча; данные должны остаться нетронутыми при ошибке. Ошибки аргументов, даты и ссылок на ID возвращают ненулевой код с сообщением в stderr. Не делайте графики или спортивные рекомендации: программа хранит и показывает записи. В README укажите примеры команд, а тесты покройте на временном хранилище.
Структура программы
Поместите проверку тренировки, календарных дат, фильтрацию и порядок записей в internal/workout. Отдельный файл отвечает за чтение и атомарную запись JSON; main.go разбирает команды add/list/update/delete/find и передаёт данные этим функциям. Разделите декодирование details-файла и доменную проверку, чтобы core-тесты не запускали CLI и не читали реальные файлы.