Задачи
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, иначе remoteorigin). 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_create | title (обязательный), description, parent | task create |
task_list | status (список или строка через запятую), all, parent | task list |
task_get | id (обязательный) | task show |
task_status | id (обязательный), status, force | task status |
task_next | нет | task next |
task_ready | нет | task ready |
task_claim | id, agent | task claim |
task_release | id (обязательный), agent, force | task release |
task_dep | id (обязательный), blocker (обязательный) | task dep |
task_priority | id (обязательный), level (обязательный, 0–4) | task priority |
task_conflict | id (обязательный), other (обязательный), remove | task conflict |
task_parallel | id (обязательный), 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" завершается ошибкой, которая это сообщает. Их разделы появятся на этой странице, когда они будут готовы.