Урок 13 из 16•20 мин
Архитектура Task CLI
Цели урока
После прохождения этого урока вы сможете:
- 1Понять архитектуру CLI приложения
- 2Изучить Typer и Rich для Python
- 3Разобрать структуру проекта
Что такое Task CLI
Task CLI — это консольный менеджер задач с приоритетами и дедлайнами. Мы создадим его, чтобы показать, как навыки интегрируются в реальные приложения.
Функциональность
- Добавление задач с приоритетом и дедлайном
- Список задач с фильтрацией
- Отметка задач как выполненных
- Удаление задач
- Хранение в JSON файле
Технологический стек
| Технология | Назначение |
|---|---|
| Python 3.11+ | Язык программирования |
| Typer | Фреймворк для CLI |
| Rich | Красивый вывод в консоли |
| JSON | Хранение данных |
| uv | Менеджер зависимостей |
Структура проекта
plaintext
task-cli/
├── pyproject.toml # Конфигурация проекта
├── README.md # Документация
├── .claude/
│ └── skills/
│ └── task-manager/ # Навык для управления задачами
│ └── SKILL.md
└── src/
└── task_cli/
├── __init__.py
├── main.py # Точка входа
├── commands.py # Команды CLI
├── models.py # Модели данных
└── storage.py # Работа с JSONПример использования
bash
# Добавить задачу
task add "Написать отчёт" --priority high --due 2026-02-15
# Список задач
task list
# Список только высокоприоритетных
task list --priority high
# Отметить выполненной
task done 1
# Удалить
task delete 2Модель данных
python
from dataclasses import dataclass
from datetime import date
from enum import Enum
class Priority(Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
@dataclass
class Task:
title: str
completed: bool = False
priority: Priority = Priority.MEDIUM
created_at: date = None
due_date: date = None
def __post_init__(self):
if self.created_at is None:
self.created_at = date.today()Команда add
python
import typer
from rich.console import Console
from .models import Task, Priority
from .storage import save_tasks, load_tasks
app = typer.Typer()
console = Console()
@app.command()
def add(
title: str,
priority: str = typer.Option("medium", "--priority", "-p"),
due: str = typer.Option(None, "--due", "-d")
):
"""Добавить новую задачу."""
tasks = load_tasks()
task = Task(
title=title,
priority=Priority(priority.lower()),
due_date=date.fromisoformat(due) if due else None
)
tasks.append(task)
save_tasks(tasks)
console.print(f"[green]✓[/green] Задача добавлена: {title}")Typer автоматически генерирует справку (--help) и валидацию параметров из аннотаций типов Python.
Вопросы для размышления
- •Какие команды вы бы добавили в Task CLI?
- •Какие данные важно хранить для каждой задачи?
