Персональная система планирования жизни на базе Obsidian vault: веб-интерфейс, CLI, детерминированное ядро приоритетов и устойчивость к «забросу» системы. Реализует M1+M2+M3(minimal) из ТЗ. Telegram-бот — в roadmap (код сохранён, не запускается).
Приватность: ваши задачи и заметки живут локально в
data/(или в путиVAULT_PATH). Эта папка не попадает в git — см. SECURITY.md. В репозитории только код и обезличенный пример в sample_vault/.
data/ # Obsidian vault (источник истины, путь задаётся VAULT_PATH)
inbox/ # Сырые входящие
tasks/ # Атомарные задачи
projects/ # Композитные проекты
spheres/ # 8 сфер жизни
horizons/ # Итоги визардов
log/ # Daily notes
archive/ # Архив
system/ # Профиль, параметры, состояние
src/life_system/ # Python-пакет
core/
config.py # Конфигурация
models.py # Pydantic-модели (Task, Sphere, Vision, ...)
notes.py # Заметки-блоки с меткой времени, дневник эмоций
utils.py # Утилиты
engine/
calculator.py # PERT, K, priority, confidence
candidates.py # Кандидаты дня
scheduler.py # Рутины (recalc/stale/absence/зомби-детектор)
similar.py # Похожие завершённые задачи (TF-IDF)
state_machine.py # Машина состояний
interfaces/
ai_gateway.py # Опциональный локальный Ollama + safe fallback
cli_commands.py # CLI-команды
ingest.py # Обработка входящих
serializers.py # task_to_dict — общий формат JSON для роутеров
telegram_bot.py # FUTURE: Telegram-бот (не подключён)
web_app.py # Сборка FastAPI-приложения (тонкая)
routers/ # REST по доменам — один файл, одна область
tasks.py # CRUD, split/merge, done/session, блоки
spheres.py # CRUD сфер
visions.py # Точки Б, пути, обратимые шаги
plan_journal.py # /state, /dump, /plan, /journal
persistence/
vault_manager.py # VaultManager (CRUD)
tests/ # pytest, изолированный vault на каждый тест (tmp_path)
e2e/ # Playwright: 7 критических UX-маршрутов в реальном браузере
main.py # Точка входа
Python-пакет в src/ подчиняется PEP 8:
- 🗂 Папки верхнего уровня (
data,docs,scripts,tests,deploy) и данные внутриdata/— lower_snake_case, как того требует сам Python-пакет и совместимость с Obsidian. - 📄 Python-модули (
src/life_system/**/*.py) — snake_case, по PEP 8 (обязательное требование для импортируемых пакетов). - 📝 Документы (
.mdвdocs/,README.md,DEPLOY.md) — snake_case для новых файлов;README.md/DEPLOY.md/SPEC.md— устоявшиеся англоязычные исключения. - 🗃 Файлы данных в
data/tasks/,data/inbox/— генерируются кодом по шаблонуt-YYYY-MM-DD-HHMM.md/dump-YYYY-MM-DD-HHMMSS.md, вручную не переименовывать.
Требования: Python 3.11+.
Код лежит в src/life_system/, поэтому нужна editable-установка пакета (см. pyproject.toml), иначе main.py не найдёт life_system.
git clone https://github.com/chudodey/life-planner.git && cd life-planner
python -m venv .venv
.venv\Scripts\activate # Windows (PowerShell: .venv\Scripts\Activate.ps1)
# source .venv/bin/activate # Linux/Mac
pip install -r requirements.txt
pip install -e .
cp .env.example .env
# Отредактировать .env — см. нижеПри первом запуске система сама создаст каталог vault и 8 сфер жизни.
| Способ | Когда |
|---|---|
| Ничего не делать | Пустой vault в ./data — подходит для старта с нуля |
scripts/init_vault.ps1 / init_vault.sh |
Скопировать sample_vault/ с двумя демо-задачами |
VAULT_PATH=/path/to/vault в .env |
Свой путь (например, существующий Obsidian vault) |
| Переменная | Описание |
|---|---|
VAULT_PATH |
Путь к vault (по умолчанию ./data) |
AI_PROVIDER |
mock (по умолчанию) или локальный ollama |
OLLAMA_BASE_URL |
Адрес локальной Ollama (http://127.0.0.1:11434) |
OLLAMA_MODEL |
Генеративная модель, по умолчанию qwen3:4b |
OLLAMA_TIMEOUT_SECONDS |
Таймаут короткой AI-операции, по умолчанию 45 секунд |
TELEGRAM_* в .env.example закомментированы — бот отключён, см. roadmap.
AI-контур полностью локальный и выключен по умолчанию. Установка модели один раз:
ollama pull qwen3:4bПосле загрузки укажите AI_PROVIDER=ollama в .env. Модель занимает около
2,5 ГБ и подходит для видеокарты с 8 ГБ VRAM. Если Ollama остановлена, модель
не установлена или вернула плохой JSON, дамп не теряется и не попадает в План:
gateway возвращает безопасное предложение «оставить во входящих».
В web-интерфейсе обычный и Дзен-дамп сначала сохраняются, а затем разбираются в фоне. Одно уверенное предложение применяется автоматически; низкая уверенность или несколько смыслов показываются в карточке для проверки и не попадают в План. Повторный неизменный текст берётся из локального SHA-256-кэша, который не содержит исходных записей.
Для проекта или проблемы в карточке доступна кнопка «✨ следующий шаг». Локальный агент задаёт не более одного уточняющего вопроса либо предлагает 1–3 маленьких действия. До нажатия «создать выбранные шаги» новые задачи не возникают; подтверждённые действия становятся дочерними узлами и попадают в План. В Markdown хранится компактное резюме хода, а не полная переписка.
Архитектурные решения: ADR-0001 и ADR-0003.
pip install -e ".[dev]"
pytestКаждый тест получает свой изолированный vault во временной директории
(pytest tmp_path) с дефолтными сферами — реальные данные (data/)
тесты не трогают никогда и ни при каких обстоятельствах.
Критический браузерный контур запускается одной командой. Runner использует Playwright Chromium или установленный Chrome, а если браузера нет — скачивает Chromium:
pip install -e ".[dev,e2e]"
python scripts/run_e2e.pyСемь E2E-сценариев проверяют дамп→классификацию→план,
кандидата→сессию→выполнение, перенос узла дерева, заметку Колеса и сохранение
сырой мечты, подтверждаемую декомпозицию проекта и след работы в дереве. Для каждого сценария поднимается отдельный временный web-сервер с
одноразовым vault и детерминированным fake-Ollama; личный data/ не читается.
Дважды щёлкните LifePlanner.bat в корне репозитория (или создайте ярлык на рабочем столе).
Скрипт сам:
- создаст
.venvи установит зависимости при первом запуске; - скопирует
.env.example→.env, если.envещё нет; - откроет браузер на http://127.0.0.1:8765 и запустит сервер.
Ярлык на рабочем столе: ПКМ по LifePlanner.bat → «Создать ярлык» → перетащите на рабочий стол. В свойствах ярлыка поле «Рабочая папка» должно указывать на корень репозитория.
Альтернатива в PowerShell: .\run_web.ps1 (вызывает тот же scripts/start_web.ps1).
.\run_web.ps1 # откроет http://127.0.0.1:8765 в браузере
# или: python main.py --web [--port 8765]Шесть вкладок (порядок и номер = хоткей; отсортированы по частоте использования):
- 🧘 Дзен — выгрузка мыслей: редактируемый заголовок, одна строка ввода, список «живущих в уме», подсказки слияния с похожими задачами, выбор Inbox или сферы.
- 📋 План дня — канбан из трёх колонок: 🎲 Кандидаты (только готовые атомарные действия до 4ч; у каждого видно «почему сейчас»: срок, обещание, сегодняшнее продолжение, явный выбор или голод сферы), 🎯 Колода на сегодня (осознанно взятое в работу, жёсткий лимит 5 задач + мягкое предупреждение при переборе часов), ✅ Сделано сегодня (done + сессии). Кандидату можно одним кликом ответить «не задача», «слишком крупно», «позже» или «в работу»; исходная запись не удаляется. В шапке каждой колонки — инлайн-дамп прямо в неё. Раз в ~7 дней — банер «разбор недели»: сколько показано/взято/сделано, кто систематически откладывается, что идёт «как по маслу» (
system/plan_history.yaml). Архитектура шлюза: ADR-0004. - 🌳 Дерево — интерактивный mindmap (mind-elixir): сферы → узлы → задачи. Узлы явно кодируют
○ не тронуто,◉ работал,● недавнои✓ готово, рядом видны сессии, суммарное время и дата последнего касания. Контейнер показывает абсолютный прогресс ветки◉ касались / ✓ сделано / Σ всегобез ложного процента. Кодировка продублирована текстом, цветом и легендой. Перетаскивание меняет родителя/сферу,Tab— новая подзадача,Enter— соседняя,Del— в архив (восстановимо). Сделанные по умолчанию скрыты переключателем. - 🎯 Матрица — Эйзенхауэр 3×3 + колонка «📥 нераспределённые» (задачи без явной расстановки); drag в ячейку ставит срочность/важность, drag назад — снимает.
- 📖 Журнал — ретроспектива (§9.2): по дням что сделано (с Δ факт/план), недельный срез часов по сферам, тренд калибровки k, настроение.
- ☸️ Колесо — радар удовлетворённости (§9.1) в единой шкале 0–10: зелёная область — удовлетворённость, синяя/фиолетовая линии — внимание план/факт 7д (формы сравнимы: разошлись — видно, какую сферу жизнь съедает), серый пунктир — колесо месяц назад, настроение — по клику в легенде; флаги 🍽/🔍 прямо на подписях розы. Строки сфер: 100 очков внимания, факт-часы, настроение, 🔮 видения, ⭐ искорки за 30 дней. История колеса пишется снимками (
system/wheel_history.yaml, при правке сфер + ежедневный recalc) и append-only событиями (system/wheel_events.yaml). Изменение оценки сохраняется сразу, после него можно inline ответить «Что повлияло?»; 💬 сохраняет отдельный инсайт даже без движения ползунка. - 🔮 Будущее — философский контур (§8), конвейер работы с мечтами: мечтальня (сырая выгрузка без сфер/горизонтов) → ✨ очищение (интервью: что за мечтой на самом деле — «хочу машину» = «хочу статус»; джин-вопрос «а если без ограничений?») → лестница горизонтов (наследие→жизнь→10л→3г→год, связанные точки Б через
parent_id: «⤵ ступень ниже» — backcasting) → первый обратимый шаг в план дня. У точки Б ≥2 путей; «отпустить» — честный исход, не провал. Карточки во вкладке — место размышлений; долгосрочная работа с видением — в панели (↗): заметки-блоки с меткой времени, ⭐ искорки сбычи (мечта сбывается касаниями, как задача — сессиями: у мечты нет знаменателя-оценки, поэтому не «% готовности», а счётчик радостей), 🌠 нежданные пути и — внизу, без давления — судьба видения (достигнута/отпустить).
Командная строка внизу экрана (Norton Commander-стиль): дамп задачи, мысль или команда (план/дерево/матрица/журнал/колесо/будущее/справка) — подсказки по мере набора, как формулы в Google Sheets. Vault остаётся единственным источником истины: web-интерфейс — слой поверх тех же markdown-файлов.
Карточка задачи (клик по задаче в любой вкладке): заметки — блоками с автоматической меткой времени (## ДАТА ЧЧ:ММ в markdown, видны в Obsidian) + дневник эмоций (эмодзи-настроение у блока); сфера, срочность/важность, дедлайн, оценка в очках Фибоначчи (1-13, k-калибровка переводит в часы), обещание; кнопки «✓ сделано», «⏱ сессия» (время потрачено, задача не закрыта — для долгих дел), «+ подзадачи», «⇩ слить сюда», «🗄 архив». Пустая панель — тоже точка создания задачи.
Быстрый синтаксис дампа (работает в web и CLI; все токены набираются в русской раскладке):
Позвонить в банк №финансы !3 =30м до+2 → сфера, срочность 3 (= сразу в план дня), оценка, дедлайн. Токены: #сфера/№сфера, !1..!3 (срочность), !p/!п (обещание), ~30м/=30м/=2ч (оценка), @2026-07-15/до+7/до15.07 (дедлайн), +45м/+ (уже произошло — сразу done, ретро-фиксация отвлечений без вопросов).
Обычный текст без плановых токенов сохраняется как неразобранное входящее и не попадает в План. В карточке можно одним кликом отметить его готовым действием или выбрать тип: проект, мысль, проблема, событие либо мечта. Дословный исходный дамп остаётся доступен в раскрываемом блоке независимо от правок заголовка.
Горячие клавиши: 1-7 — вкладки (номера видны на табах), / — командная строка, Esc — снять выделение, ? — подсказка. В дереве: Tab — подзадача, Enter — соседняя, Del — в архив.
- Светлая тема на всех вкладках, включая дерево (mindmap) и командную строку внизу экрана.
- Увеличенные шрифты (базовый 16px, минимум 13px) — удобнее при слабом зрении.
- Контент и правая панель задачи используют контрастные цвета без тёмных фонов.
python main.pyWindows-заметка: консоль по умолчанию использует cp1251 и падает на эмодзи/юникоде в логах. Используйте run.ps1 (выставляет PYTHONUTF8=1) или запускайте вручную:
$env:PYTHONUTF8 = "1"; python main.pyКоманды CLI:
plan— план на сегодняstatus— сводка задачspheres— сферы жизниdump <текст>— brain dump (одна задача)batch— пакетный ввод: одна задача на строку, выход — пустая строка или Ctrl+D/Ctrl+Ctriage— интерактивная раскладка задач без родителя по сферам/дереву: сфера — цифрой, родитель — номером узла из показанного списка (илиnew:Название— создать узел на лету)done <id> [минуты]— отметить выполнениеlink <id> <parent_id>— сделать задачу подзадачей другой (иерархия)unlink <id>— отвязать от родителяdepend <id> <dep_id>— заблокировать задачу до выполнения dep_idtree [id]— дерево задач по иерархии (без id — всё дерево, с id — поддерево)recalc— пересчитать метрикиquit— выход
Telegram-бот — будущая разработка; модуль telegram_bot.py в репозитории не запускается.
- Vault-структура (markdown + YAML frontmatter)
- Ingest текстовых дампов
- Машина состояний (inbox → validated → atomic/composite → done → archived)
- Morning/evening пинги
- Дневной лог
- PERT-оценки + калибровка k
- Приоритет по формуле ТЗ 7.2
- Кандидаты дня (≤12) + fallback топ-5
- Правило пробоя квоты (urgency=3)
- Валидатор инвариантов
- Confidence + свежесть (полураспад)
- Stale-разметка (conf < 0.5)
- Авто-архив (conf < 0.25)
- Протокол возвращения (soft/hard/deep)
- Устойчивость к забросу
- Фоновый recalc в веб-режиме (lifespan-рутина: confidence/архив/k без перезапуска)
- 6 вкладок: план (с быстрым добавлением и «сделано сегодня»), дерево, матрица (+нераспределённые), журнал, колесо (очки внимания, настроение), будущее (мечтальня → очищение → лестница горизонтов → обратимые шаги)
- Командная строка с подсказками и командами; все токены дампа — в русской раскладке
- Заметки-блоки с меткой времени + дневник эмоций; «⏱ сессия» для долгих задач
- Ретро-фиксация отвлечений (
+45м) без влияния на план - Очки трудозатрат Фибоначчи + честная k-калибровка (n=X показывается)
- «Похожие завершённые» в карточке — reference class forecasting, уровень 1 (лексика, без ИИ); уровни 2-3 — docs/roadmap.md
- mtime-инвалидация кэша (правки в Obsidian подхватываются на лету)
- Telegram-бот (код есть, не подключён — roadmap)
- Голосовой ввод (STT)
- OCR для фото
- Реальные ИИ-точки (A1-A9) — сейчас mock (в т.ч. зомби-допрос агентности)
- Диалоговые визарды недели/квартала/года (частично покрыто вкладками Колесо/Будущее)
- iCal интеграция
- Energy-паттерны
- Проактивные пинги / job queue (вместе с Telegram)
- Код по умолчанию, ИИ по исключению — в MVP ИИ заменён mock'ами
- Vault — единственный источник истины — plain markdown, читается в Obsidian
- Система переживает заброс — confidence + авто-архив
- Цена участия ≤ 2 минут — только brain dump
- Деградация без ИИ — fallback на кодовые расчёты
MIT — используйте свободно; ваши данные в vault остаются вашими.