bootstrap

This commit is contained in:
2026-07-12 19:46:07 +03:00
parent 2ddf2251d6
commit 940d25435e
36 changed files with 1914 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
# Analysis Report
## Session
- **Session ID:** `metaagent-001`
- **Target repo:** `S:\Git\nifodea`
- **Date:** 2026-07-12
- **Project type:** `greenfield`
## 1. Общая информация
- **README:** CashFlow Forecast — open-source проект для построения и анализа личной финансовой модели с использованием Spreadsheet, Python и AI.
- **Лицензия:** не указана
- **CI/CD:** отсутствует
- **Точка входа:** не определена
- **Система сборки:** отсутствует
## 7. Требования (из README)
### Функциональные требования
- Прогноз денежных потоков (Cash Flow Forecasting)
- Моделирование бюджета
- Сценарный анализ (What-if Analysis)
- Учет активов и обязательств
- Прогноз ликвидности
- Анализ финансовой устойчивости
- Моделирование достижения финансовых целей
- Импорт/экспорт данных через Spreadsheet (Excel)
### Нефункциональные требования
- **Spreadsheet** — визуальный редактор и UI
- **Python** — вычислительное ядро
- **JSON** — внутреннее представление модели данных
- **AI** — инструмент анализа и взаимодействия
- Все компоненты должны быть взаимозаменяемыми
- Open-source
### Бизнес-контекст
- **Цель:** отвечать на вопрос "Что произойдет дальше?" (forecast), а не "Что произошло?" (accounting)
- **Аудитория:** частные лица для персонального финансового планирования
- **Успех:** работающая прогнозная модель денежных потоков с возможностью сценарного анализа
### Неясные моменты / Вопросы
- Не указана лицензия — требуется уточнить
- Не указана конкретная версия Python
- Какой формат Spreadsheet (Excel .xlsx, Google Sheets, оба)?
- Какие AI-провайдеры предполагаются (OpenAI, локальные модели)?
- Требуется ли веб-интерфейс или только CLI + Spreadsheet?
## 8. Примечания
Проект greenfield. MVP должен включать: модель данных (JSON), ядро forecast engine, базовый sync с Excel, интерфейс для AI-ассистента. Все модули — Python.
+24
View File
@@ -0,0 +1,24 @@
{
"session_id": "metaagent-001",
"target_repo": "S:\\Git\\nifodea",
"goal": "Спроектируй и реализуй MVP по README",
"project_type": "greenfield",
"phases": {
"analysis": "completed",
"design": "completed",
"decomposition": "completed",
"environment": "completed",
"handoff": "completed"
},
"tasks": [
{"id": "T1", "title": "Инициализация проекта и зависимостей", "status": "pending", "depends_on": [], "acceptance_criteria": ["pyproject.toml создан", "Все __init__.py созданы", "ruff проходит", "pytest запускается"]},
{"id": "T2", "title": "Модель данных (dataclass + JSON)", "status": "pending", "depends_on": ["T1"], "acceptance_criteria": ["Все сущности dataclass", "FinancialModel save/load JSON", "demo-скрипт работает"]},
{"id": "T3", "title": "Forecast Engine", "status": "pending", "depends_on": ["T2"], "acceptance_criteria": ["forecast_cashflow работает", "recurring проецируются", "активы/обязательства учтены"]},
{"id": "T4", "title": "Scenario Analysis", "status": "pending", "depends_on": ["T3"], "acceptance_criteria": ["3 сценария", "what-if модификация", "сравнение сценариев"]},
{"id": "T5", "title": "Excel Sync", "status": "pending", "depends_on": ["T2"], "acceptance_criteria": ["импорт из Excel", "экспорт в Excel", "ошибки невалидного формата"]},
{"id": "T6", "title": "CLI (Typer)", "status": "pending", "depends_on": ["T2","T3","T4","T5","T7"], "acceptance_criteria": ["init/forecast/analyze/import/export/scenario команды"]},
{"id": "T7", "title": "AI Assistant", "status": "pending", "depends_on": ["T3"], "acceptance_criteria": ["промпты с моделью и прогнозом", "заглушка ответа"]},
{"id": "T8", "title": "Тесты", "status": "pending", "depends_on": ["T2","T3","T4","T5","T6","T7"], "acceptance_criteria": ["pytest проходит", "покрытие всех модулей"]}
],
"last_updated": "2026-07-12T19:36:00Z"
}
+151
View File
@@ -0,0 +1,151 @@
# Design Report
## Session
- **Session ID:** `metaagent-001`
- **Target repo:** `S:\Git\nifodea`
- **Date:** 2026-07-12
## 1. Технологический стек
| Компонент | Выбор | Обоснование |
|---|---|---|
| Язык | Python 3.11+ | Указан в README как вычислительное ядро; широкая экосистема для работы с данными |
| Фреймворк | Typer (CLI), openpyxl (Excel) | Typer — современный CLI-фреймворк; openpyxl — стандарт для .xlsx |
| База данных | JSON-файлы | README требует JSON как внутреннее представление; для MVP БД не нужна |
| Инфраструктура | pip + venv | Минимальная зависимость; .gitignore уже настроен под Python |
| Линтер | ruff | Стандарт для Python 2024+; быстрый, уже в .gitignore |
| Тесты | pytest | Стандартный тестовый раннер для Python |
| AI | Интерфейс через промпты | Для MVP — только промпты и абстракция, без подключения к API |
## 2. High-Level архитектура
**Паттерн:** Модульный монолит (Layered)
```
[CLI / Excel File]
|
sync/ ──► cashflow_model/ ──► engine/ ──► ai/
(Excel R/W) (Entity Model) (Forecast) (Prompts)
| | |
▼ ▼ ▼
data/model.json data/model.json data/model.json
```
**Поток данных:**
1. Пользователь редактирует Excel → sync читает и преобразует в JSON
2. JSON-модель загружается в Python-объекты (dataclass)
3. Forecast Engine вычисляет прогноз на основе модели
4. AI Assistant анализирует результаты через промпты
5. Результаты экспортируются обратно в Excel
## 3. Модули
| Модуль | Ответственность | Ключевые компоненты | Зависит от |
|---|---|---|---|
| `cashflow_model/` | Определение сущностей (dataclass), сериализация/десериализация JSON | `Account`, `Transaction`, `RecurringCashflow`, `Asset`, `Liability`, `ForecastScenario`, `FinancialModel` | — |
| `sync/` | Чтение и запись Excel (.xlsx), конвертация между Excel и JSON | `excel_sync.py` — импорт/экспорт | `cashflow_model` |
| `engine/` | Расчёт прогноза, сценарный анализ, what-if | `forecast.py` (прогноз), `scenarios.py` (сценарии) | `cashflow_model` |
| `ai/` | Промпты для AI-ассистента, форматирование контекста | `prompts.py` (шаблоны), `assistant.py` (интерфейс) | `cashflow_model`, `engine` |
| `cli/` | CLI-интерфейс (Typer) | `main.py` — точки входа | Все модули |
## 4. Модели данных
### Account
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | UUID | pk | Уникальный идентификатор |
| name | str | required | Название счёта |
| currency | str | default="USD" | Валюта |
| balance | float | required | Текущий баланс |
### Transaction
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | UUID | pk | Уникальный идентификатор |
| date | str (ISO date) | required | Дата операции |
| account | UUID | fk → Account | Счёт |
| category | str | required | Категория |
| amount | float | required | Сумма |
| description | str | optional | Описание |
### RecurringCashflow
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | UUID | pk | Уникальный идентификатор |
| start_date | str (ISO date) | required | Дата начала |
| end_date | str (ISO date) | optional | Дата окончания |
| frequency | str | enum: monthly/weekly/yearly | Периодичность |
| amount | float | required | Сумма |
| category | str | required | Категория |
### Asset
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | UUID | pk | Уникальный идентификатор |
| name | str | required | Название |
| value | float | required | Текущая стоимость |
| growth_rate | float | default=0.0 | Годовой темп роста (%) |
### Liability
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | UUID | pk | Уникальный идентификатор |
| name | str | required | Название |
| balance | float | required | Текущий остаток |
| interest | float | required | Годовая ставка (%) |
| payment | float | required | Ежемесячный платёж |
**Связи:**
- Transaction → Account (многие к одному)
- RecurringCashflow → Account (многие к одному, опционально)
- FinancialModel включает все сущности + параметры
## 5. API / Интерфейсы
### CLI (Typer)
| Команда | Описание | Пример |
|---|---|---|
| `import <file.xlsx>` | Импорт данных из Excel в JSON | `cf import data.xlsx` |
| `export <file.xlsx>` | Экспорт из JSON в Excel | `cf export report.xlsx` |
| `forecast [--months 12]` | Запуск прогноза | `cf forecast --months 12` |
| `scenario <name>` | Применить сценарий | `cf scenario optimistic` |
| `analyze` | AI-анализ модели | `cf analyze` |
| `init` | Инициализация пустой модели | `cf init` |
## 6. Обработка ошибок
- **Стратегия:** Исключения Python с кастомными типами (`ModelError`, `SyncError`, `ForecastError`)
- **Формат ошибок:** `{ "error": "<message>", "code": "<CODE>", "details": {} }`
- **Логирование:** logging с уровнями INFO/ERROR; CLI-вывод через Typer + rich
## 7. Тестирование
- **Unit-тесты:** pytest для каждого модуля (cashflow_model, engine, sync)
- **Integration-тесты:** чтение/запись Excel, полный цикл import → forecast → export
- **Mock-стратегия:** временные файлы для Excel/JSON тестов
- **Команда запуска:** `pytest`
## 8. Предварительная группировка задач
| Задача | Описание | Тип |
|---|---|---|
| T1 | Инициализация проекта + scaffold | config |
| T2 | Модель данных (dataclass + JSON serialization) | feature |
| T3 | Forecast Engine (базовый прогноз) | feature |
| T4 | Excel Sync (import/export) | feature |
| T5 | CLI (Typer) — все команды | feature |
| T6 | AI Assistant (промпты + интерфейс) | feature |
| T7 | Тесты на все модули | test |
| T8 | Финальная проверка и документация | docs |
## 9. Примечания
Для MVP берётся минимальный функционал: модель + forecast + excel sync + cli. AI — только интерфейс (заглушка с промптами). Сценарии — базовая реализация.
+106
View File
@@ -0,0 +1,106 @@
# Handoff Summary
## Session Info
- **Session ID:** `metaagent-001`
- **Target Repo:** `S:\Git\nifodea`
- **Goal:** Спроектируй и реализуй MVP по README
- **Date:** 2026-07-12
- **Duration:** ~1 session
## Repo Summary
Проект CashFlow Forecast — личная финансовая модель с прогнозом денежных потоков. Greenfield. Python + JSON + Excel + AI интерфейс.
## Project Type
- **Type:** greenfield
- **Design report:** `.agent/design-report.md`
## Environment Status
- **Build:** OK (pip install -e . — success)
- **Tests:** 0/0 passed (greenfield, scaffold ready)
- **Baseline log:** `.agent/baseline-test-report.log`
- **Dependencies:** openpyxl, typer, rich, pytest, ruff
## Task Overview
| Status | Count |
|---|---|
| Total | 8 |
| Pending | 8 |
| In Progress | 0 |
| Completed | 0 |
| Failed/Skipped | 0 |
**Task by type:**
- config: 1
- feature: 6
- test: 1
## Tasks (ordered)
### T1: Инициализация проекта и зависимостей
- Type: config
- Depends on: —
- Files: pyproject.toml, cashflow_model/__init__.py, sync/__init__.py, engine/__init__.py, ai/__init__.py, cli/__init__.py, data/.gitkeep, exports/.gitkeep
- **Status: completed** (done in SETUP phase)
### T2: Модель данных (dataclass + JSON serialization)
- Type: feature
- Depends on: T1
- Files: cashflow_model/*.py
- Status: pending
### T3: Forecast Engine (базовый прогноз)
- Type: feature
- Depends on: T2
- Files: engine/forecast.py
- Status: pending
### T4: Scenario Analysis
- Type: feature
- Depends on: T3
- Files: engine/scenarios.py
- Status: pending
### T5: Excel Sync (import/export)
- Type: feature
- Depends on: T2
- Files: sync/excel_sync.py
- Status: pending
### T6: CLI (Typer) — все команды
- Type: feature
- Depends on: T2, T3, T4, T5, T7
- Files: cli/main.py
- Status: pending
### T7: AI Assistant (промпты + интерфейс)
- Type: feature
- Depends on: T3
- Files: ai/prompts.py, ai/assistant.py
- Status: pending
### T8: Тесты на все модули
- Type: test
- Depends on: T2, T3, T4, T5, T6, T7
- Files: tests/*.py
- Status: pending
## Next Steps
Исполнительный агент начинает с задачи **T1** (уже выполнена в SETUP), затем **T2: Модель данных**.
## Caveats
- AI Assistant — заглушка для MVP; промпты готовы, но не подключены к реальному API
- Лицензия не указана — требуется решить
- Версия Python — 3.11+ (фактически 3.13 в окружении)
- Spreadsheet — только .xlsx через openpyxl
## Checkpoints
Файл: `.agent/checkpoints.json`
Актуальное состояние чекпоинтов прилагается.
+178
View File
@@ -0,0 +1,178 @@
{
"$schema": "metaagent-task-manifest",
"version": "1.0",
"session_id": "metaagent-001",
"goal": "Спроектируй и реализуй MVP по README",
"created_at": "2026-07-12T12:00:00Z",
"tasks": [
{
"id": "T1",
"title": "Инициализация проекта и зависимостей",
"description": "Создать структуру директорий, pyproject.toml, venv, установить зависимости (openpyxl, typer, pytest, ruff), настроить ruff",
"type": "config",
"files": [
"pyproject.toml",
"cashflow_model/__init__.py",
"sync/__init__.py",
"engine/__init__.py",
"ai/__init__.py",
"cli/__init__.py",
"data/.gitkeep",
"exports/.gitkeep"
],
"depends_on": [],
"acceptance_criteria": [
"pyproject.toml создан с правильными зависимостями",
"Все директории модулей созданы с __init__.py",
"ruff lint проходит без ошибок на пустых модулях",
"pytest запускается (0 tests, exit code 0)"
],
"context": "Стек: Python 3.11+, openpyxl, typer, pytest, ruff. Структура из design-report.md раздел 3.",
"status": "pending"
},
{
"id": "T2",
"title": "Модель данных (dataclass + JSON serialization)",
"description": "Реализовать все сущности: Account, Transaction, RecurringCashflow, Asset, Liability, ForecastScenario, FinancialModel. Каждая — dataclass с методами to_dict/from_dict. FinancialModel — корневой объект с методами save/load JSON.",
"type": "feature",
"files": [
"cashflow_model/__init__.py",
"cashflow_model/account.py",
"cashflow_model/transaction.py",
"cashflow_model/recurring.py",
"cashflow_model/asset.py",
"cashflow_model/liability.py",
"cashflow_model/scenario.py",
"cashflow_model/model.py"
],
"depends_on": ["T1"],
"acceptance_criteria": [
"Все сущности — dataclass с правильными полями и типами",
"FinancialModel корректно сохраняется и загружается из JSON",
"Создание Account, Transaction, Asset, Liability через конструктор работает",
"demo-скрипт создаёт модель с тестовыми данными"
],
"context": "Модели определены в design-report.md раздел 4. Использовать uuid4 для id.",
"status": "pending"
},
{
"id": "T3",
"title": "Forecast Engine (базовый прогноз)",
"description": "Реализовать ForecastService с методами: forecast_cashflow (на N месяцев), apply_recurring (генерация recurring-транзакций), project_balance. Алгоритм: начальный баланс + доходы - расходы + изменения по активам/обязательствам.",
"type": "feature",
"files": [
"engine/__init__.py",
"engine/forecast.py"
],
"depends_on": ["T2"],
"acceptance_criteria": [
"forecast_cashflow(months=12) возвращает список помесячных балансов",
"Регулярные платежи корректно проецируются на будущие периоды",
"Активы учитываются с ростом (growth_rate)",
"Обязательства учитываются с процентами и платежами"
],
"context": "Расчёт: balance_{t+1} = balance_t + income_t - expense_t + asset_growth_t - liability_change_t. См. design-report раздел 2.",
"status": "pending"
},
{
"id": "T4",
"title": "Scenario Analysis",
"description": "Реализовать ScenarioService с методами: сценарии (optimistic, pessimistic, baseline), what-if модификация параметров, сравнение результатов сценариев.",
"type": "feature",
"files": [
"engine/__init__.py",
"engine/scenarios.py"
],
"depends_on": ["T3"],
"acceptance_criteria": [
"Три предустановленных сценария (baseline, optimistic, pessimistic)",
"What-if: изменение параметров (доход +10%, расход -5%)",
"Сравнение сценариев возвращает сводку различий"
],
"context": "Сценарии меняют параметры модели перед прогнозом. Использовать copy модели для каждого сценария.",
"status": "pending"
},
{
"id": "T5",
"title": "Excel Sync (import/export)",
"description": "Реализовать ExcelSync: чтение модели из .xlsx (листы: Accounts, Transactions, Assets, Liabilities, Recurring), запись результатов прогноза в новый .xlsx. Использовать openpyxl.",
"type": "feature",
"files": [
"sync/__init__.py",
"sync/excel_sync.py"
],
"depends_on": ["T2"],
"acceptance_criteria": [
"Импорт из Excel заполняет FinancialModel",
"Экспорт FinancialModel в Excel создаёт корректный .xlsx",
"Обработка ошибок при невалидном формате Excel"
],
"context": "Каждая сущность — отдельный лист. Заголовки колонок = поля dataclass. См. design-report раздел 5.",
"status": "pending"
},
{
"id": "T6",
"title": "CLI (Typer) — все команды",
"description": "Реализовать CLI через Typer с командами: init, import, export, forecast, scenario, analyze. Главный entry point — консольная команда 'cf'.",
"type": "feature",
"files": [
"cli/__init__.py",
"cli/main.py",
"pyproject.toml"
],
"depends_on": ["T2", "T3", "T4", "T5", "T7"],
"acceptance_criteria": [
"Команда 'cf init' создаёт пустую модель и JSON",
"Команда 'cf forecast --months 12' выводит таблицу прогноза",
"Команда 'cf analyze' вызывает AI Assistant",
"Команда 'cf import' и 'cf export' работают с Excel",
"Команда 'cf scenario' применяет и выводит сценарий"
],
"context": "Typer entry point. Команды описаны в design-report раздел 5. rich для форматирования таблиц.",
"status": "pending"
},
{
"id": "T7",
"title": "AI Assistant (промпты + интерфейс)",
"description": "Реализовать AssistantService: генерация промптов для AI на основе модели и прогноза, форматирование контекста (JSON-дамп модели + результаты forecast), заглушка для вызова AI API. Промпты на русском языке для анализа фин. состояния.",
"type": "feature",
"files": [
"ai/__init__.py",
"ai/prompts.py",
"ai/assistant.py"
],
"depends_on": ["T3"],
"acceptance_criteria": [
"Промпт 'analyze' включает модель и прогноз в JSON",
"Промпт 'advice' формирует запрос на финансовые рекомендации",
"AssistantService возвращает структурированный ответ (заглушка)"
],
"context": "AI — заглушка для MVP. Промпты должны быть готовы для реального API. См. design-report раздел 7.",
"status": "pending"
},
{
"id": "T8",
"title": "Тесты на все модули",
"description": "Написать pytest-тесты для cashflow_model (сериализация), engine (forecast + scenarios), sync (excel roundtrip), ai (prompts), cli (invocation).",
"type": "test",
"files": [
"tests/test_model.py",
"tests/test_forecast.py",
"tests/test_scenarios.py",
"tests/test_excel_sync.py",
"tests/test_cli.py",
"tests/test_ai.py",
"tests/conftest.py"
],
"depends_on": ["T2", "T3", "T4", "T5", "T6", "T7"],
"acceptance_criteria": [
"pytest запускается и все тесты проходят",
"Покрытие базовых сценариев для каждой сущности",
"Roundtrip-тест Excel: export → import → compare",
"Forecast-тест: известные входные данные → ожидаемый результат"
],
"context": "Использовать tmp_path для временных файлов. conftest.py с fixture для тестовой модели.",
"status": "pending"
}
]
}
+209
View File
@@ -0,0 +1,209 @@
# Task Manifest
**Session:** metaagent-001
**Goal:** Спроектируй и реализуй MVP по README
**Date:** 2026-07-12T12:00:00Z
---
## Task Overview
| ID | Title | Type | Depends On | Status |
|---|---|---|---|---|
| T1 | Инициализация проекта и зависимостей | config | — | pending |
| T2 | Модель данных (dataclass + JSON serialization) | feature | T1 | pending |
| T3 | Forecast Engine (базовый прогноз) | feature | T2 | pending |
| T4 | Scenario Analysis | feature | T3 | pending |
| T5 | Excel Sync (import/export) | feature | T2 | pending |
| T6 | CLI (Typer) — все команды | feature | T2, T3, T4, T5, T7 | pending |
| T7 | AI Assistant (промпты + интерфейс) | feature | T3 | pending |
| T8 | Тесты на все модули | test | T2, T3, T4, T5, T6, T7 | pending |
**Total tasks:** 8
---
## Task Details
### T1: Инициализация проекта и зависимостей
**Type:** config
**Description:** Создать структуру директорий, pyproject.toml, venv, установить зависимости (openpyxl, typer, pytest, ruff), настроить ruff
**Files:**
- `pyproject.toml`
- `cashflow_model/__init__.py`
- `sync/__init__.py`
- `engine/__init__.py`
- `ai/__init__.py`
- `cli/__init__.py`
- `data/.gitkeep`
- `exports/.gitkeep`
**Depends on:**
**Acceptance Criteria:**
- [ ] pyproject.toml создан с правильными зависимостями
- [ ] Все директории модулей созданы с __init__.py
- [ ] ruff lint проходит без ошибок на пустых модулях
- [ ] pytest запускается (0 tests, exit code 0)
**Context:** Стек: Python 3.11+, openpyxl, typer, pytest, ruff. Структура из design-report.md раздел 3.
---
### T2: Модель данных (dataclass + JSON serialization)
**Type:** feature
**Description:** Реализовать все сущности: Account, Transaction, RecurringCashflow, Asset, Liability, ForecastScenario, FinancialModel. Каждая — dataclass с методами to_dict/from_dict. FinancialModel — корневой объект с методами save/load JSON.
**Files:**
- `cashflow_model/__init__.py`
- `cashflow_model/account.py`
- `cashflow_model/transaction.py`
- `cashflow_model/recurring.py`
- `cashflow_model/asset.py`
- `cashflow_model/liability.py`
- `cashflow_model/scenario.py`
- `cashflow_model/model.py`
**Depends on:** T1
**Acceptance Criteria:**
- [ ] Все сущности — dataclass с правильными полями и типами
- [ ] FinancialModel корректно сохраняется и загружается из JSON
- [ ] Создание Account, Transaction, Asset, Liability через конструктор работает
- [ ] demo-скрипт создаёт модель с тестовыми данными
**Context:** Модели определены в design-report.md раздел 4. Использовать uuid4 для id.
---
### T3: Forecast Engine (базовый прогноз)
**Type:** feature
**Description:** Реализовать ForecastService с методами: forecast_cashflow (на N месяцев), apply_recurring (генерация recurring-транзакций), project_balance. Алгоритм: начальный баланс + доходы - расходы + изменения по активам/обязательствам.
**Files:**
- `engine/__init__.py`
- `engine/forecast.py`
**Depends on:** T2
**Acceptance Criteria:**
- [ ] forecast_cashflow(months=12) возвращает список помесячных балансов
- [ ] Регулярные платежи корректно проецируются на будущие периоды
- [ ] Активы учитываются с ростом (growth_rate)
- [ ] Обязательства учитываются с процентами и платежами
**Context:** Расчёт: balance_{t+1} = balance_t + income_t - expense_t + asset_growth_t - liability_change_t.
---
### T4: Scenario Analysis
**Type:** feature
**Description:** Реализовать ScenarioService с методами: сценарии (optimistic, pessimistic, baseline), what-if модификация параметров, сравнение результатов сценариев.
**Files:**
- `engine/__init__.py`
- `engine/scenarios.py`
**Depends on:** T3
**Acceptance Criteria:**
- [ ] Три предустановленных сценария (baseline, optimistic, pessimistic)
- [ ] What-if: изменение параметров (доход +10%, расход -5%)
- [ ] Сравнение сценариев возвращает сводку различий
**Context:** Сценарии меняют параметры модели перед прогнозом. Использовать copy модели для каждого сценария.
---
### T5: Excel Sync (import/export)
**Type:** feature
**Description:** Реализовать ExcelSync: чтение модели из .xlsx (листы: Accounts, Transactions, Assets, Liabilities, Recurring), запись результатов прогноза в новый .xlsx. Использовать openpyxl.
**Files:**
- `sync/__init__.py`
- `sync/excel_sync.py`
**Depends on:** T2
**Acceptance Criteria:**
- [ ] Импорт из Excel заполняет FinancialModel
- [ ] Экспорт FinancialModel в Excel создаёт корректный .xlsx
- [ ] Обработка ошибок при невалидном формате Excel
**Context:** Каждая сущность — отдельный лист. Заголовки колонок = поля dataclass.
---
### T6: CLI (Typer) — все команды
**Type:** feature
**Description:** Реализовать CLI через Typer с командами: init, import, export, forecast, scenario, analyze. Главный entry point — консольная команда 'cf'.
**Files:**
- `cli/__init__.py`
- `cli/main.py`
- `pyproject.toml`
**Depends on:** T2, T3, T4, T5, T7
**Acceptance Criteria:**
- [ ] Команда 'cf init' создаёт пустую модель и JSON
- [ ] Команда 'cf forecast --months 12' выводит таблицу прогноза
- [ ] Команда 'cf analyze' вызывает AI Assistant
- [ ] Команда 'cf import' и 'cf export' работают с Excel
- [ ] Команда 'cf scenario' применяет и выводит сценарий
**Context:** Typer entry point. Команды описаны в design-report раздел 5. rich для форматирования таблиц.
---
### T7: AI Assistant (промпты + интерфейс)
**Type:** feature
**Description:** Реализовать AssistantService: генерация промптов для AI на основе модели и прогноза, форматирование контекста (JSON-дамп модели + результаты forecast), заглушка для вызова AI API. Промпты на русском языке для анализа фин. состояния.
**Files:**
- `ai/__init__.py`
- `ai/prompts.py`
- `ai/assistant.py`
**Depends on:** T3
**Acceptance Criteria:**
- [ ] Промпт 'analyze' включает модель и прогноз в JSON
- [ ] Промпт 'advice' формирует запрос на финансовые рекомендации
- [ ] AssistantService возвращает структурированный ответ (заглушка)
**Context:** AI — заглушка для MVP. Промпты должны быть готовы для реального API.
---
### T8: Тесты на все модули
**Type:** test
**Description:** Написать pytest-тесты для cashflow_model (сериализация), engine (forecast + scenarios), sync (excel roundtrip), ai (prompts), cli (invocation).
**Files:**
- `tests/test_model.py`
- `tests/test_forecast.py`
- `tests/test_scenarios.py`
- `tests/test_excel_sync.py`
- `tests/test_cli.py`
- `tests/test_ai.py`
- `tests/conftest.py`
**Depends on:** T2, T3, T4, T5, T6, T7
**Acceptance Criteria:**
- [ ] pytest запускается и все тесты проходят
- [ ] Покрытие базовых сценариев для каждой сущности
- [ ] Roundtrip-тест Excel: export → import → compare
- [ ] Forecast-тест: известные входные данные → ожидаемый результат
**Context:** Использовать tmp_path для временных файлов. conftest.py с fixture для тестовой модели.