Markdown UI для ClaudeCode: трекинг задач AI-агента
Как построить локальный Markdown-интерфейс для ClaudeCode: отслеживание задач AI-агента, персистентность сессий, slash-команды и state machine.
Markdown UI для ClaudeCode: как я построил локальный трекер задач для AI-агента
Вы запускаете ClaudeCode, ставите задачу, агент начинает работать — а через 20 минут контекстное окно заполняется, сессия закрывается, и всё, что агент помнил про прогресс задачи, испаряется. Знакомо?
Предыдущая система трекинга задач Todos имела критическое ограничение: элементы списка жили в памяти сессии и исчезали при её закрытии. Именно это разочарование толкнуло сообщество разработчиков на создание собственных локальных Markdown-интерфейсов для управления задачами AI-агента. В этой статье разберём, как устроены такие системы, почему Markdown — идеальный формат хранилища, и как собрать рабочий workflow своими руками.
Почему стандартные инструменты не работают с AI-агентом
ClaudeCode — это агентный инструмент для написания кода, который читает кодовую базу, редактирует файлы, выполняет команды и интегрируется с инструментами разработчика. Он доступен в терминале, IDE, десктопном приложении и браузере.
Но у агентного подхода есть особенность: ClaudeCode способен автономно работать над задачей примерно 10–20 минут, после чего эффективность падает по мере заполнения контекста.
Это означает, что для любого серьёзного проекта нужна внешняя персистентная память — место, где хранится состояние задач вне контекстного окна агента.
Многие разработчики сталкиваются с ограничениями контекстного окна и персистентности сессий, теряя прогресс между сессиями. Именно поэтому нужны механизмы трекинга зависимостей, параллельного выполнения подзадач и многосессионного сотрудничества.
Традиционные инструменты вроде Trello, Jira или Linear хороши для команд, но плохо вписываются в цикл «агент читает файл → агент пишет файл». Типичная проблема: задачи и заметки оказываются заперты внутри стороннего инструмента, а графический интерфейс создаёт лишнее трение.
Решение оказалось элегантно простым — локальные Markdown-файлы.
Архитектура локального Markdown-воркфлоу
Суть подхода описывается тремя принципами:
Храните спецификацию проекта в Markdown-файлах. В начале каждой сессии «гидрируйте» список задач из спецификации. По мере выполнения синхронизируйте прогресс обратно в файлы спецификации.
Типичная структура директорий выглядит так:
my-project/
├── CLAUDE.md # Инструкции для агента
├── ROADMAP.md # Общий роадмап проекта
├── .claude/
│ ├── session.md # Текущий статус сессии
│ ├── commands/ # Slash-команды
│ └── agents/ # Специализированные агенты
└── tasks/
├── 001-auth.md # Отдельная задача
├── 002-api.md
└── today-2026-05-27.md # Дневной список
CLAUDE.md — мозг системы
CLAUDE.md — это Markdown-файл, который вы добавляете в корень проекта. ClaudeCode читает его в начале каждой сессии. Используйте его для стандартов кодирования, архитектурных решений, предпочтительных библиотек и чеклистов проверки.
В project-specific claude.md-файле можно определить таксономию тегов, чтобы Claude автоматически и последовательно категоризировал новые задачи.
Отдельный файл на каждую задачу
Каждая задача — это отдельный Markdown-файл, хранящийся локально (например, в Obsidian vault). Это делает данные полностью переносимыми, доступными для поиска и понятными для Claude. Каждый файл задачи использует YAML front matter для структурирования метаданных.
Пример структуры файла задачи:
---
title: "Реализовать JWT-аутентификацию"
status: "in-progress"
priority: "high"
due: "2026-05-30"
tags: ["auth", "backend", "security"]
created: "2026-05-27"
---
## Описание
Добавить JWT-авторизацию для API endpoints.
## Шаги
- [ ] Установить зависимости
- [ ] Создать middleware
- [ ] Написать тесты
- [ ] Задокументировать
## Заметки агента
_Обновляется ClaudeCode автоматически_
agent_notes в YAML front matter. Агент будет записывать туда краткое состояние работы после каждого шага — это позволит быстро восстановить контекст в новой сессии без чтения всего файла.Slash-команды: движок воркфлоу
Движок системы — это кастомная slash-команда в терминале. Команда /today запускает Python-скрипт. Задача скрипта — просканировать все файлы задач (хранящихся как Markdown) и сгенерировать новый Markdown-файл для текущего дня, включающий задачи на сегодня, просроченные элементы и идеи в работе.
Дневной файл, который генерирует /today, содержит несколько секций:
Задачи на сегодня — чеклист элементов с текущей датой выполнения; просроченные задачи — постоянный список всего незавершённого; идеи в работе — долгосрочные проекты для работы после завершения ежедневных задач; Research Digest — ссылка на автоматически найденные материалы по теме.
Адд задачи превращается в разговорный процесс:
Чтобы добавить задачу, просто введите инструкцию на естественном языке. Claude разберёт запрос, создаст новый Markdown-файл с корректными YAML-метаданными и добавит его в ваш ежедневный список дел.
Пример базового скрипта /today на Python:
#!/usr/bin/env python3
import os
import glob
from datetime import date
import yaml
def scan_tasks(tasks_dir="tasks/"):
today = date.today().isoformat()
due_today, overdue, in_progress = [], [], []
for filepath in glob.glob(f"{tasks_dir}*.md"):
with open(filepath) as f:
content = f.read()
# Простой парсинг YAML front matter
if content.startswith("---"):
_, fm, body = content.split("---", 2)
meta = yaml.safe_load(fm)
status = meta.get("status", "")
due = meta.get("due", "")
if status == "in-progress":
in_progress.append((meta["title"], filepath))
elif due == today:
due_today.append((meta["title"], filepath))
elif due and due < today and status != "done":
overdue.append((meta["title"], filepath))
return due_today, overdue, in_progress
def generate_today_file():
today = date.today().isoformat()
due_today, overdue, in_progress = scan_tasks()
output = f"# Задачи на {today}\n\n"
output += "## ✅ На сегодня\n"
for title, path in due_today:
output += f"- [ ] [{title}]({path})\n"
output += "\n## 🔴 Просрочено\n"
for title, path in overdue:
output += f"- [ ] [{title}]({path})\n"
output += "\n## 🔄 В работе\n"
for title, path in in_progress:
output += f"- [ ] [{title}]({path})\n"
with open(f"tasks/today-{today}.md", "w") as f:
f.write(output)
print(f"Создан файл: tasks/today-{today}.md")
if __name__ == "__main__":
generate_today_file()
.zshrc, .bash_profile и т.д.).
Добавьте строку: alias today="python3 ~/scripts/today.py" — и команда будет доступна из любой директории.State Machine: как заставить агента строго следовать процессу
Самая сложная часть — добиться от LLM детерминированного поведения. Простое описание процесса в текстовом виде не всегда работает.
Добиться того, чтобы Claude следовал воркфлоу, потребовало многих итераций и было близко к провалу несколько раз. Работа с одним лишь текстовым описанием не давала результата. Решением стал подход с конечным автоматом (state machine) — диаграмма в сочетании с письменной спецификацией состояний.
Вот как выглядит state machine для задачного воркфлоу:
graph TD
A[Начало сессии] --> B[CHECK_STATUS]
B --> C{Читаем .claude/session.md}
C -->|Status = in-progress| D[WORKING]
C -->|Status = Complete| E[AWAITING_COMMIT]
C -->|Файл отсутствует| F[CREATE_PLAN]
D --> G[Выполняем шаги задачи]
G --> H[Обновляем session.md]
H --> I{Задача завершена?}
I -->|Нет| D
I -->|Да| E
E --> J[git commit]
J --> K[Обновляем ROADMAP.md ✅]
F --> L[Пишем план в task-файл]
L --> D
Файл session.md — место, где Claude предоставляет краткие обновления по текущей задаче, чтобы при закрытии и перезапуске разговора можно было продолжить с того места, где остановились. Далее — конечный автомат, который указывает Claude, когда и почему трогать эти файлы, и принудительно задаёт ожидаемые поведения.
Пример содержимого .claude/session.md:
---
Status: in-progress
Task: tasks/002-api.md
Last Step: Создан базовый роутер, тесты написаны
Next Step: Добавить middleware авторизации
---
Сравнение подходов к хранению состояния задач
За последний год сообщество выработало несколько паттернов. Вот сравнение ключевых:
| Подход | Персистентность | Читаемость агентом | Читаемость человеком | Сложность настройки |
|---|---|---|---|---|
todo.md / plan.md (монолит) | ✅ Да | ✅ Высокая | ✅ Высокая | 🟢 Низкая |
Отдельный .md на задачу + YAML | ✅ Да | ✅ Высокая | ✅ Высокая | 🟡 Средняя |
session.md + State Machine | ✅ Да | ✅ Очень высокая | 🟡 Средняя | 🔴 Высокая |
| JSON Tasks API (ClaudeCode v2.1+) | ✅ Да | ✅ Нативная | 🟡 Средняя | 🟢 Низкая |
| Внешний трекер (Jira/Linear) | ✅ Да | 🟡 Через MCP | ✅ Высокая | 🔴 Высокая |
Лучший выбор — гибрид: YAML-файлы задач для человекочитаемой спецификации +
session.mdдля машинного состояния агента.
Что появилось в ClaudeCode v2.1+
22 января 2026 года Anthropic выпустила ClaudeCode 2.1 с функцией, фундаментально меняющей работу с AI-ассистентом по написанию кода. Новая система Task management заменила ограниченную функциональность Todos полноценным слоем оркестрации, способным управлять сложными многосессионными проектами.
Task management в ClaudeCode значительно эволюционировал в v2.1.16 с введением Tasks API, дополняющего оригинальный инструмент TodoWrite. Этот воркфлоу учит, когда использовать каждую систему и как задействовать многосессионную координацию задач для сложных проектов.
Разделение планирования и исполнения: ключевой принцип
Один из важнейших инсайтов, который разработчики выявили на практике:
Ключевая идея — разделить планирование и исполнение.
На практике это выглядит так:
Фаза 1: Планирование (отдельная сессия с чистым контекстом)
Попросите агента написать подробный план в отдельных файлах задач внутри папки tasks. В ROADMAP.md добавьте инструкцию агенту — изучить существующую кодовую базу и понять текущее состояние, прежде чем составлять план. Это направляет агента на получение релевантного контекста до начала планирования.
Фаза 2: Проверка плана человеком
Проверьте сгенерированный план — на правильном ли он пути. При необходимости попросите агента внести правки. Как только вы удовлетворены планом, закройте текущую сессию или очистите контекст агента и начните новую сессию со свежим контекстом, чтобы получить максимальное контекстное окно для реальной реализации.
Фаза 3: Исполнение с контролем
При реализации: следуйте спецификациям в файле задачи, реализуйте функциональность, обновляйте прогресс по шагам в файле задачи после каждого шага, останавливайтесь после завершения каждого шага и ожидайте дальнейших инструкций.
Прочитай .claude/session.md и ROADMAP.md.
Продолжи работу с задачи tasks/003-notifications.md.
После каждого шага обновляй session.md и останавливайся для подтверждения.
Такая инструкция гарантирует, что агент начнёт с нужного контекста, а не с нуля.
Nimbalyst и другие визуальные UI поверх ClaudeCode
Если CLI-подход кажется слишком суровым, существуют готовые решения с графическим интерфейсом.
Nimbalyst — это AI-native workspace, построенный поверх ClaudeCode — более широкий, чем традиционная Claude Code IDE. Наряду с полноценным редактором кода с inline AI diff review, он предоставляет визуальные редакторы для Markdown, макетов, диаграмм и data models, kanban-доску сессий, трекинг задач и мобильное приложение-компаньон.
Сессии организованы на канбан-доске по фазам — backlog, planning, implementing, complete. Весь рабочий поток виден с первого взгляда.
Ключевой принцип: вы должны владеть своими инструментами и файлами. Десктопное приложение, открытые форматы файлов, исходный код на GitHub.
Однако у готовых UI есть обратная сторона — они добавляют зависимость от третьего инструмента. Самодельный Markdown-воркфлоу работает в любом редакторе и не требует подписки.
Заключение: почему Markdown побеждает
Локальный Markdown-воркфлоу для ClaudeCode — это не хак и не временное решение. Это архитектурный выбор, продиктованный природой AI-агентов:
- Персистентность: файлы переживают любую сессию и любой контекстный лимит
- Портативность: данные не заперты в SaaS-инструменте
- Читаемость: и человек, и агент работают с одним форматом
- Версионность: файлы задач коммитятся вместе с кодом — история сохраняется
- Расширяемость: можно добавить скрипты, MCP-интеграции, автоматические дайджесты
Это действительно интересно — у нас есть возможность проектировать кастомные воркфлоу для каждого проекта: как реализовывать задачи, как их валидировать. Вместо движения к жёстким spec-driven фреймворкам можно идти в обратную сторону и радикально проектировать собственный процесс под конкретный вид работы.
Начните с малого: создайте CLAUDE.md, добавьте папку tasks/, опишите первую задачу в YAML-файле. Уже через одну сессию вы почувствуете разницу между агентом, работающим «вслепую», и агентом с полным контекстом о том, что нужно сделать.