Задачи

From docs/ru/tasks.md at cc732c3 View on GitHub

rtok ведёт один пронумерованный план на проект. Каждый checkout, worktree и агент проекта берёт номера задач из одного счётчика, поэтому два агента не выбирают один и тот же id. Здесь описаны команды задач и MCP-инструменты; ключи конфигурации — в config.md, а id агентов и worktree, с которыми работают агенты, — в agents-and-worktrees.md.

Id

  • Id верхнего уровня — префикс из ASCII-букв и число, например A12. Подзадача добавляет одно число через точку: A12.3.
  • Глубина два уровня. У задачи могут быть подзадачи; у подзадачи своих подзадач быть не может.
  • Префикс задаётся в [tasks] prefix, от 1 до 8 букв. Если он пустой, rtok берёт первую букву имени проекта в верхнем регистре (rtok даёт R).
  • Ввод не чувствителен к регистру. Вывод — в верхнем регистре.
  • Id берутся из счётчика проекта в хранилище rtok. Перед каждым новым id счётчик поднимается выше наибольшего id, который уже есть у адаптера, поэтому задача, пришедшая через pull, не получит повторный номер. Счётчик учитывает id с любым префиксом, так что смена префикса не сбрасывает нумерацию. Номера подзадач считаются отдельно для каждого родителя.

Статусы

СтатусЗначение
openв плане, не начата
in-progressв плане, в работе
doneзавершена; выходит из плана
closedне будем делать; выходит из плана
  • open и in-progress — активные. list показывает только активные задачи, если не указан --all, который добавляет завершённые.
  • Родитель с активными подзадачами завершить нельзя. Перевод в done или closed отклоняется, а ошибка перечисляет подзадачи, если не указан --force.
  • Парсер также принимает слова, которыми часто пользуются агенты: todo и pending вместо open, completed вместо done, wontdo, won't-do и not-planned вместо closed. Подчёркивание вместо дефиса тоже работает, так что in_progress принимается.

Адаптер disk

Адаптер disk используется по умолчанию. Каждая задача — один Markdown-файл в каталоге tasks в корне checkout:

tasks/A12 - ship-the-thing.md
tasks/done/A7 - old-work.md
  • Имя файла — <id> - <slug>.md. Slug — строчные латинские буквы и цифры, соединённые дефисами, не длиннее 48 символов. Заголовок в имени не хранится, он в front matter.
  • Front matter содержит id, title, status, parent (только у подзадач), created_at и updated_at (Unix-секунды). Захват добавляет assignee, blocked_by и priority (0–4, поле опускается, когда оно равно 2). Адаптер disk хранит ещё conflicts_with и parallel, пустые поля опускаются; GitHub и GitLab хранят их метками rtok:conflicts:<id> и rtok:parallel рядом с rtok:needs:<id> и rtok:p:<n>, собственные метки пользователя не затрагиваются. Файлы, записанные до этих ключей, по-прежнему читаются. Описание — тело файла под front matter.
  • Файлы относятся к тому checkout, в котором запущена команда. Номера общие через хранилище, но worktree читает и пишет файлы задач на своей ветке, поэтому они попадают в другие checkout через git.
  • Завершённые и закрытые задачи переносятся в tasks/done/, так что план — это листинг каталога.
  • Запись идёт во временный файл, который затем переименовывается на место.
  • Файлы, не совпадающие с шаблоном <id> - <slug>.md, игнорируются, поэтому README рядом с задачами не мешает.

Пример файла задачи:

---
id: A12
title: Ship the thing
status: open
created_at: 1790000000
updated_at: 1790000000
---

Why the task exists and what done means.

Команды

КомандаЧто делает
rtok task init [--adapter disk|github|gitlab] [--prefix <letters>]записывает [tasks] в .rtok.toml checkout и печатает следующий id; префикс по умолчанию — первая буква имени проекта
rtok task create <title> [-d <text> | --body-file <path|->] [--parent <id>] [--json]добавляет задачу под следующий свободный id (A12, или A12.3 при --parent); --body-file - читает описание из stdin
rtok task list [--status <s,…>] [--all] [--parent <id>] [--json]активные задачи, подзадачи выводятся с отступом под родителем; --status принимает список через запятую
rtok task show <id> [--json]одна задача с подзадачами, ссылкой и описанием
rtok task status <id> [<status>] [--force] [--json]читает статус или задаёт open, in-progress, done или closed
rtok task next [--json]первая готовая задача. Если блокеров нет, это по-прежнему открытая задача с наименьшим номером без активной подзадачи
rtok task ready [--json]все задачи, которые можно взять, сначала с высшим приоритетом (0 раньше 2)
rtok task claim [id] [--agent <id>] [--json]взять id или первую готовую задачу. Нужен --agent или RTOK_AGENT_ID. В GitHub и GitLab запись исполнителя — последняя запись побеждает, это не compare-and-set
rtok task release <id> [--agent <id>] [--force] [--json]снять исполнителя и вернуть статус open. Только держатель, если не указан --force
rtok task dep <id> <blocker> [--json]id ждёт, пока blocker не станет done или closed. Цикл отклоняется, и ничего не записывается
rtok task priority <id> <0-4> [--json]задать приоритет. 0 — высший, 2 — значение по умолчанию, оно не хранится
rtok task conflict <id> <other> [--remove] [--json]две задачи затрагивают одни и те же файлы, поэтому их не стоит вести одновременно. Связь симметрична: записываются оба файла. task ready помечает задачу, чей партнёр в работе, и всё равно её показывает. В GitHub и GitLab хранится метками rtok:conflicts:<id>
rtok task parallel <id> [--off] [--json]пометить задачу как безопасную для работы рядом с любой другой. В GitHub и GitLab хранится меткой rtok:parallel

| rtok task export github\|linear [--dry-run] [--json] | односторонне отразить задачи с диска в GitHub Issues или Linear (см. Экспорт) |

Без --json команды печатают текст. С --json печатают задачу как JSON.

Экспорт

rtok task export <backend> копирует задачи с диска в трекер, чтобы людям, которые живут в нём, был виден план. Работает только с адаптером disk: файлы задач остаются источником истины, rtok никогда не читает issue обратно в задачи. Правки, сделанные в трекере, перезаписываются при следующем запуске.

  • GitHub (github): одна issue на задачу в [tasks.export.github] repo (иначе [tasks.github] repo, иначе remote origin). Issue пишется так же, как её пишет адаптер github: заголовок <id>. <title>, метки rtok и rtok:<id>, метки исполнителя и зависимостей (rtok:owner:…, rtok:needs:…, rtok:p:…, rtok:in-progress). Подзадача связывается как sub-issue родителя. Токен: GH_TOKEN, GITHUB_TOKEN, иначе gh auth token.
  • Linear (linear): одна issue на задачу в команде, которую по короткому ключу (например ENG) называет [tasks.export.linear] team; с пустым ключом экспорт не запускается. Токен: личный API-ключ в LINEAR_API_KEY (резервного CLI нет). Issue несёт тот же заголовок и те же метки, что и в GitHub; недостающую метку rtok создаёт сам. Статус — это workflow state Linear, выбранный по типу: open — первое состояние unstarted команды (иначе backlog), in-progress — started, done — completed, closed — canceled; состояние меняется только когда статус отличается, поэтому issue, которую человек положил в другую колонку unstarted или started, остаётся там. Подзадача создаётся как sub-issue родителя в Linear. Личный ключ Linear ограничен 2 500 запросами в час; отклонённый запрос падает с причиной и URL.
  • Задача без issue получает её. Если заголовок, описание, статус, приоритет, исполнитель, блокеры или маркеры конфликта и параллельности задачи отличаются от issue, issue обновляется. done закрывает issue как completed, closed — как not_planned, а снова активная задача переоткрывает issue. Issue без метки rtok:<id> не трогаются, issue, чья задача пропала, остаётся как есть.
  • Завершённая задача без issue не экспортируется (старая история в трекер не попадает), если только под ней нет активной подзадачи.
  • Запуск идемпотентен: повторный запуск на том же состоянии не отправляет ни одной записи. --dry-run читает трекер, печатает запланированные создания, обновления, закрытия и переоткрытия и ничего не отправляет. --json печатает тот же план в JSON.
  • Записи идут не чаще одной в секунду. Сбой останавливает запуск, в ошибке указаны бэкенд, задача и URL запроса; записи до сбоя остаются, следующий запуск продолжает с этого места.

Доска задач

В rtok web есть страница Tasks только для чтения (g b), в rtok tui — вкладка tasks. Обе показывают задачи проекта, в котором запущен процесс, через тот же адаптер и в том же виде, что и rtok task list --all --json. Ничего на странице не меняет задачи.

  • Доска: по колонке на статус (open, in progress, done, closed). Карточка показывает id, заголовок, родителя (in R2), исполнителя и ссылку на issue у задачи github или gitlab, а также маркеры: приоритет, если он не равен стандартному P2, needs <id> для блокеров, conflicts <id> и parallel. Карточки в колонке упорядочены по приоритету, затем по id.
  • Список: таблица, рядом с ней подробности выбранной задачи. Строки доступны по Tab; Enter или Space выбирает строку. Выбор доски или списка запоминается в браузере. Поле фильтра ищет по id, заголовку, родителю и исполнителю.
  • Нет секции [tasks] ни в пользовательском конфиге, ни в .rtok.toml проекта: страница сообщает об этом и подсказывает rtok task init. Проект без задач или недоступный адаптер (нет токена, нет сети) — это сообщение на странице, а не ошибка дашборда.
  • Размер и свежесть: done и closed ограничены 50 новейшими в каждой колонке, остальные считает пометка; rtok task list --all показывает все. Адаптер disk читается каждые 5 секунд, github и gitlab — каждые 2 минуты, чтобы страница не тратила лимит API. Ссылки на issue ведут только на адреса http и https.

MCP-инструменты

rtok mcp отдаёт те же операции как инструменты. Каждый возвращает тот же JSON, что и соответствующий флаг --json.

MCP-инструментАргументыТо же, что
task_createtitle (обязательный), description, parenttask create
task_liststatus (список или строка через запятую), all, parenttask list
task_getid (обязательный)task show
task_statusid (обязательный), status, forcetask status
task_nextнетtask next
task_readyнетtask ready
task_claimid, agenttask claim
task_releaseid (обязательный), agent, forcetask release
task_depid (обязательный), blocker (обязательный)task dep
task_priorityid (обязательный), level (обязательный, 0–4)task priority
task_conflictid (обязательный), other (обязательный), removetask conflict
task_parallelid (обязательный), on (по умолчанию true)task parallel

Конфигурация

Задайте [tasks] для каждого проекта в .rtok.toml; rtok task init записывает его туда. Ключи и значения по умолчанию взяты из crates/rtok-config/default.toml:

[tasks]                               # task adapters; usually set per project in .rtok.toml
# adapter = "disk"                    # disk | github | gitlab
# prefix  = ""                        # task id prefix (R → R12); empty: first letter of the project name

[tasks.disk]
# dir = "tasks"                       # one Markdown file per task, relative to the project root; done ones go to <dir>/done

[tasks.github]
# repo    = ""                        # owner/name; empty: the origin remote
# project = 0                         # Projects v2 number whose Status field tracks tasks; 0 = issues only

[tasks.gitlab]
# url     = "https://gitlab.com"      # base URL; set it for a self-hosted instance
# project = ""                        # group/name or numeric id; empty: the origin remote

Адаптеры GitHub и GitLab ещё не собраны (T441.7 и T441.8). До этого команда задач с adapter = "github" или "gitlab" завершается ошибкой, которая это сообщает. Их разделы появятся на этой странице, когда они будут готовы.