Skip to content

Repository files navigation

Life Planning System

Персональная система планирования жизни на базе 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 (ваши данные)

При первом запуске система сама создаст каталог vault и 8 сфер жизни.

Способ Когда
Ничего не делать Пустой vault в ./data — подходит для старта с нуля
scripts/init_vault.ps1 / init_vault.sh Скопировать sample_vault/ с двумя демо-задачами
VAULT_PATH=/path/to/vault в .env Свой путь (например, существующий Obsidian vault)

.env

Переменная Описание
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.

Локальная Ollama (необязательно)

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/ не читается.

Запуск

Windows — одним кликом

Дважды щёлкните LifePlanner.bat в корне репозитория (или создайте ярлык на рабочем столе).

Скрипт сам:

  • создаст .venv и установит зависимости при первом запуске;
  • скопирует .env.example.env, если .env ещё нет;
  • откроет браузер на http://127.0.0.1:8765 и запустит сервер.

Ярлык на рабочем столе: ПКМ по LifePlanner.bat → «Создать ярлык» → перетащите на рабочий стол. В свойствах ярлыка поле «Рабочая папка» должно указывать на корень репозитория.

Альтернатива в PowerShell: .\run_web.ps1 (вызывает тот же scripts/start_web.ps1).

Web-интерфейс (вручную)

.\run_web.ps1        # откроет http://127.0.0.1:8765 в браузере
# или: python main.py --web [--port 8765]

Шесть вкладок (порядок и номер = хоткей; отсортированы по частоте использования):

  1. 🧘 Дзен — выгрузка мыслей: редактируемый заголовок, одна строка ввода, список «живущих в уме», подсказки слияния с похожими задачами, выбор Inbox или сферы.
  2. 📋 План дня — канбан из трёх колонок: 🎲 Кандидаты (только готовые атомарные действия до 4ч; у каждого видно «почему сейчас»: срок, обещание, сегодняшнее продолжение, явный выбор или голод сферы), 🎯 Колода на сегодня (осознанно взятое в работу, жёсткий лимит 5 задач + мягкое предупреждение при переборе часов), ✅ Сделано сегодня (done + сессии). Кандидату можно одним кликом ответить «не задача», «слишком крупно», «позже» или «в работу»; исходная запись не удаляется. В шапке каждой колонки — инлайн-дамп прямо в неё. Раз в ~7 дней — банер «разбор недели»: сколько показано/взято/сделано, кто систематически откладывается, что идёт «как по маслу» (system/plan_history.yaml). Архитектура шлюза: ADR-0004.
  3. 🌳 Дерево — интерактивный mindmap (mind-elixir): сферы → узлы → задачи. Узлы явно кодируют ○ не тронуто, ◉ работал, ● недавно и ✓ готово, рядом видны сессии, суммарное время и дата последнего касания. Контейнер показывает абсолютный прогресс ветки ◉ касались / ✓ сделано / Σ всего без ложного процента. Кодировка продублирована текстом, цветом и легендой. Перетаскивание меняет родителя/сферу, Tab — новая подзадача, Enter — соседняя, Del — в архив (восстановимо). Сделанные по умолчанию скрыты переключателем.
  4. 🎯 Матрица — Эйзенхауэр 3×3 + колонка «📥 нераспределённые» (задачи без явной расстановки); drag в ячейку ставит срочность/важность, drag назад — снимает.
  5. 📖 Журнал — ретроспектива (§9.2): по дням что сделано (с Δ факт/план), недельный срез часов по сферам, тренд калибровки k, настроение.
  6. ☸️ Колесо — радар удовлетворённости (§9.1) в единой шкале 0–10: зелёная область — удовлетворённость, синяя/фиолетовая линии — внимание план/факт 7д (формы сравнимы: разошлись — видно, какую сферу жизнь съедает), серый пунктир — колесо месяц назад, настроение — по клику в легенде; флаги 🍽/🔍 прямо на подписях розы. Строки сфер: 100 очков внимания, факт-часы, настроение, 🔮 видения, ⭐ искорки за 30 дней. История колеса пишется снимками (system/wheel_history.yaml, при правке сфер + ежедневный recalc) и append-only событиями (system/wheel_events.yaml). Изменение оценки сохраняется сразу, после него можно inline ответить «Что повлияло?»; 💬 сохраняет отдельный инсайт даже без движения ползунка.
  7. 🔮 Будущее — философский контур (§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) — удобнее при слабом зрении.
  • Контент и правая панель задачи используют контрастные цвета без тёмных фонов.

CLI-режим

python main.py

Windows-заметка: консоль по умолчанию использует cp1251 и падает на эмодзи/юникоде в логах. Используйте run.ps1 (выставляет PYTHONUTF8=1) или запускайте вручную:

$env:PYTHONUTF8 = "1"; python main.py

Команды CLI:

  • plan — план на сегодня
  • status — сводка задач
  • spheres — сферы жизни
  • dump <текст> — brain dump (одна задача)
  • batch — пакетный ввод: одна задача на строку, выход — пустая строка или Ctrl+D/Ctrl+C
  • triage — интерактивная раскладка задач без родителя по сферам/дереву: сфера — цифрой, родитель — номером узла из показанного списка (или new:Название — создать узел на лету)
  • done <id> [минуты] — отметить выполнение
  • link <id> <parent_id> — сделать задачу подзадачей другой (иерархия)
  • unlink <id> — отвязать от родителя
  • depend <id> <dep_id> — заблокировать задачу до выполнения dep_id
  • tree [id] — дерево задач по иерархии (без id — всё дерево, с id — поддерево)
  • recalc — пересчитать метрики
  • quit — выход

Telegram-бот — будущая разработка; модуль telegram_bot.py в репозитории не запускается.

Реализованные фичи (MVP)

M1 — Скелет

  • Vault-структура (markdown + YAML frontmatter)
  • Ingest текстовых дампов
  • Машина состояний (inbox → validated → atomic/composite → done → archived)
  • Morning/evening пинги
  • Дневной лог

M2 — Мозги

  • PERT-оценки + калибровка k
  • Приоритет по формуле ТЗ 7.2
  • Кандидаты дня (≤12) + fallback топ-5
  • Правило пробоя квоты (urgency=3)
  • Валидатор инвариантов

M3 — Выживаемость (minimal)

  • Confidence + свежесть (полураспад)
  • Stale-разметка (conf < 0.5)
  • Авто-архив (conf < 0.25)
  • Протокол возвращения (soft/hard/deep)
  • Устойчивость к забросу
  • Фоновый recalc в веб-режиме (lifespan-рутина: confidence/архив/k без перезапуска)

Веб-интерфейс (сверх исходного MVP)

  • 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)

Принципы системы

  1. Код по умолчанию, ИИ по исключению — в MVP ИИ заменён mock'ами
  2. Vault — единственный источник истины — plain markdown, читается в Obsidian
  3. Система переживает заброс — confidence + авто-архив
  4. Цена участия ≤ 2 минут — только brain dump
  5. Деградация без ИИ — fallback на кодовые расчёты

Лицензия

MIT — используйте свободно; ваши данные в vault остаются вашими.

Документация

About

Personal life planning on Obsidian vault — web UI, Telegram bot, deterministic core

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages