From 7acdb31f05029feae1bf59cd38ca1598f889ce77 Mon Sep 17 00:00:00 2001 From: leemour Date: Sat, 17 Oct 2026 23:33:14 +0200 Subject: [PATCH 1/2] docs(tasks): describe max 0.60.0 task rules, watch-tasks, assignees and tasks scan The shared Tasks pages still described max as it was at v0.58.0 (cli-core 0.315.0). max 0.59.0 and 0.60.0 run the same cli-core task code as tg, so the "tg only" and "tasks apply in max" lines are wrong for them. EN/RU/ES Tasks and How tasks work: - Rules open tasks by chat kind in tg and max (max maps DIALOG to a one-to-one chat, CHAT to a group, CHANNEL to a channel, anything else to unknown). Drop "in max every unanswered question opens a task, in any chat". - watch-tasks works in max (tags add --chat; the shared rules read the tag). - max has tasks scan (MCP tasks_scan); drop every "tasks apply in max". - max has --assignee on tasks add and tasks plan. - max reads task_categories from ~/.config/WireCat/config.json; only memo keeps its own list. - Two tasks from one message are compared by their own words in max too. - New caveat: max serve runs only the auto-reply rules' task action, so question and mention tasks open on the next sync or review. Merge after max 0.60.0 is on npm, with the max pin moved to v0.60.0. Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/tasks-architecture.es.mdx | 41 +++++++++-------- content/docs/tasks-architecture.mdx | 32 ++++++------- content/docs/tasks-architecture.ru.mdx | 36 +++++++-------- content/docs/tasks.es.md | 62 +++++++++++++------------- content/docs/tasks.md | 55 +++++++++++------------ content/docs/tasks.ru.md | 58 +++++++++++------------- 6 files changed, 137 insertions(+), 147 deletions(-) diff --git a/content/docs/tasks-architecture.es.mdx b/content/docs/tasks-architecture.es.mdx index c2b82d25..2dd68010 100644 --- a/content/docs/tasks-architecture.es.mdx +++ b/content/docs/tasks-architecture.es.mdx @@ -10,11 +10,8 @@ duplicados con un ejemplo resuelto. Para el uso diario, empieza por [Tareas](./t El diseño viene del plan de tareas aprobado en cli-core ([WireCatLabs/cli-core#1216](https://github.com/WireCatLabs/cli-core/pull/1216)). Todo está ya hecho -en cli-core salvo las partes marcadas como **aún no está hecho**. `tg` y `max` lo tienen todo, salvo que solo `tg` lee la lista de categorías del archivo de ajustes compartido, -abre tareas en un grupo solo por lo que va dirigido al propietario (y cada pregunta en un grupo con la -etiqueta `watch-tasks`), registra responsables en las tareas encontradas en mensajes y compara dos tareas -de un mismo mensaje por sus propias palabras. En `max` la revisión del historial se llama `tasks apply`; -en `tg`, `tasks scan`. `memo` no tiene los cierres de agente por certeza, los seguimientos, la lista de 59 categorías con sus categorías fuera de la lista ni la lectura de mensajes vinculados en la detección de duplicados; tiene categorías (`tasks plan --category`, `category:`), etiquetas y la detección de duplicados en `tasks add`, pero +en cli-core salvo las partes marcadas como **aún no está hecho**. `tg` y `max` lo tienen todo, salvo que `serve` en `max` abre solo las tareas de las reglas de respuesta +automática. `memo` no tiene los cierres de agente por certeza, los seguimientos, la lista de 59 categorías con sus categorías fuera de la lista ni la lectura de mensajes vinculados en la detección de duplicados; tiene categorías (`tasks plan --category`, `category:`), etiquetas y la detección de duplicados en `tasks add`, pero aún no `tasks categories`, la reserva, `tasks related`, `tasks duplicates` ni `tasks merge`. ## Los datos @@ -140,8 +137,8 @@ agente: vio la respuesta del propietario y cierra sin certeza. ## Categorías La lista de categorías es una para todas las herramientas, no una por perfil ni por aplicación, porque -las reglas se ejecutan en `tg`, `max`, `memo` y `messages sync` y tienen que coincidir. `tg` lee los -cambios del propietario de un archivo de ajustes compartido, `~/.config/WireCat/config.json` (en +las reglas se ejecutan en `tg`, `max`, `memo` y `messages sync` y tienen que coincidir. `tg` y `max` leen +los cambios del propietario de un archivo de ajustes compartido, `~/.config/WireCat/config.json` (en Windows, `%APPDATA%\WireCat\Config\config.json`), sección `task_categories`. La sección solo guarda cambios sobre la lista por defecto: `"": " | "` añade o sustituye una categoría (una nueva va antes de `other`), y `null` quita una por defecto, así que las categorías que añada una @@ -173,12 +170,11 @@ palabra como `la`, `que` o `para`. Una lista admite hasta 80 categorías. `tasks agenda category: tag:` filtra la agenda con campos de consulta (MCP `tasks_agenda` los recibe en `query`). Cambiar la lista no cambia la categoría de las tareas que ya existen. -Antes de que `tg` leyera el archivo, la lista se guardaba en el almacén (`store_settings`). Esa lista +Antes de que las herramientas leyeran el archivo, la lista se guardaba en el almacén (`store_settings`). Esa lista guardada sigue siendo la base bajo los cambios del archivo hasta que el siguiente `config set` o -`unset` de una categoría la pasa al archivo y la quita del almacén. `max` y `memo` aún no leen el -archivo: usan una lista guardada en el almacén o la lista por defecto de la herramienta que abre el -almacén. Así que, después de que `tg` pase una lista guardada al archivo, `max` y `memo` usan su propia -lista por defecto. `tasks categories` (MCP `tasks_categories`) indica el archivo en `file`. Una categoría que salió de la lista mientras las tareas aún la llevan se nombra: +`unset` de una categoría la pasa al archivo y la quita del almacén. `memo` aún no lee el archivo: usa +una lista guardada en el almacén o su propia lista por defecto. Así que, después de que `tg` o `max` +pase una lista guardada al archivo, `memo` usa su propia lista por defecto. `tasks categories` (MCP `tasks_categories`) indica el archivo en `file`. Una categoría que salió de la lista mientras las tareas aún la llevan se nombra: `tasks categories` la lista en `unlisted` con el número de tareas abiertas y el total (también MCP `tasks_categories`), un `config set` o `unset` de `task_categories` termina su nota con las mismas líneas, y `tasks agenda` nombra las que llevan las tareas abiertas (`unlisted_categories`). @@ -251,7 +247,7 @@ La lista por defecto en `tg` y `max`: ## Dónde abren tareas las reglas Una tarea es lo que el propietario tiene que hacer o lo que alguien le debe, no cada pregunta de cada -chat. En `tg`, las reglas abren tareas según el tipo de chat: +chat. En `tg` y `max`, las reglas abren tareas según el tipo de chat: | Tipo de chat | Qué abre una tarea | | --- | --- | @@ -261,13 +257,16 @@ chat. En `tg`, las reglas abren tareas según el tipo de chat: | Canal, Mensajes guardados | nada | Es una etiqueta de chat normal: `tags add --chat watch-tasks`. En un chat individual o en un -canal no cambia nada. La leen `review`, `serve`, la pasada al sincronizar y `tasks scan`. Una regla +canal no cambia nada. La leen `review`, `serve` en `tg`, la pasada al sincronizar y `tasks scan`. Una regla cierra una tarea solo en un chat donde puede abrirla, con la respuesta del propietario. En un grupo vigilado, también la cierra una respuesta directa a la pregunta de cualquier miembro que no sea quien preguntó, con la resolución «answered in the group»; un mensaje posterior que no responde a la pregunta no cierra nada. Una pregunta es un mensaje con signo de interrogación o una respuesta a un -mensaje del propietario; una petición o promesa sin él la añade el agente. En `max`, cada pregunta que el propietario no -respondió abre una tarea en cualquier chat. +mensaje del propietario; una petición o promesa sin él la añade el agente. `max` lee los diálogos de MAX como chats +individuales, sus chats de grupo como grupos y sus canales como canales; cualquier otro chat es de un +tipo que el almacén no conoce. En `max`, `serve` solo ejecuta la acción `task` de las reglas de +respuesta automática, así que una pregunta que llega mientras funciona abre su tarea en la siguiente +sincronización o en `review`. Por qué: en un almacén real, las 300 publicaciones más recientes de un canal habrían abierto 85 tareas con la regla anterior, que abría una tarea por cualquier pregunta sin respuesta en cualquier chat. @@ -275,7 +274,7 @@ Ahora un canal no abre ninguna. ## Responsables -En `tg`, una tarea encontrada en un mensaje puede indicar quién debe hacerla, con las mismas filas de +En `tg` y `max`, una tarea encontrada en un mensaje puede indicar quién debe hacerla, con las mismas filas de asignación que las tareas de proyecto (rol `assignee`). Una tarea abierta con responsable es lo que esa persona le debe al propietario. @@ -303,7 +302,7 @@ sincronización. Nada se une por su cuenta salvo una coincidencia segura (paso 2 En `tg` y `max`, la primera pasada de una cuenta además abre como mucho `task_first_pass_per_chat` tareas por chat, primero las más recientes; por defecto, 0. Una primera sincronización lee el historial, y qué chats merece la pena convertir en tareas lo decide el propietario. Las tareas retenidas se cuentan en `tasks` -como `held`, en `held_chats` chats, y una nota nombra `tasks scan` (`tasks apply` en `max`). En `tg`, +como `held`, en `held_chats` chats, y una nota nombra `tasks scan`. `held` no cuenta un chat donde las reglas no abren nada, como un canal. Los cierres siguen funcionando: una pregunta que el propietario respondió cierra su tarea abierta. El ajuste vale para todo el almacén y se guarda en `store_settings`, como los ajustes de cierre de agente; es un número entero de 0 a 1000, y @@ -319,8 +318,8 @@ almacén local. Sin el `--yes` global (MCP `yes`) no cambia nada y lista, por ch y cada tarea que se abriría, con su origen, tipo y categoría; con él, las tareas se abren pasando por la detección de duplicados, como en una sincronización, y las preguntas respondidas se cierran. Un mensaje que ya tiene tarea no se vuelve a listar. La descripción de la herramienta MCP pide al agente que -pregunte al propietario antes de crear las tareas de un chat. En `max` el comando sigue llamándose -`tasks apply` (MCP `tasks_apply`); `tg` no conserva el nombre antiguo. +pregunte al propietario antes de crear las tareas de un chat. Ni `tg` ni `max` conservan el +nombre antiguo `tasks apply`. | Comando | Qué hace | | --- | --- | @@ -364,7 +363,7 @@ puede subir la puntuación de un par, nunca bajarla. El importe y la fecha lími cuentan cuando el texto de la tarea no los tiene, y su «mañana» se cuenta desde cuándo se envió. Los mensajes se leen del almacén al comparar; una tarea no guarda el texto de los mensajes. -**Dos tareas de un mismo mensaje.** En `tg`, cuando dos tareas tienen el mismo mensaje de origen, como +**Dos tareas de un mismo mensaje.** En `tg` y `max`, cuando dos tareas tienen el mismo mensaje de origen, como una promesa y una petición que un agente sacó de un mensaje largo, se comparan solo por su título y su descripción. El mensaje compartido haría que dos trabajos distintos parecieran uno. diff --git a/content/docs/tasks-architecture.mdx b/content/docs/tasks-architecture.mdx index bcca9031..2a3b979e 100644 --- a/content/docs/tasks-architecture.mdx +++ b/content/docs/tasks-architecture.mdx @@ -10,9 +10,7 @@ use, start with [Tasks](./tasks.md). The design comes from the approved tasks plan in cli-core ([WireCatLabs/cli-core#1216](https://github.com/WireCatLabs/cli-core/pull/1216)). All of it is built -in cli-core except the parts marked **not built yet**. `tg` and `max` have all of it, except that only `tg` reads the category list from the shared settings file, -opens tasks in a group only for what is addressed to the owner (and every question in a group tagged `watch-tasks`), has assignees on tasks -found in messages, and compares two tasks from one message by their own words. `max` names the history scan `tasks apply`; in `tg` it is `tasks scan`. `memo` lacks agent closes by certainty, follow-ups, the list of 59 categories with its unlisted categories, and duplicate checks that read linked messages; it has categories +in cli-core except the parts marked **not built yet**. `tg` and `max` have all of it, except that `serve` in `max` opens only the tasks of auto-reply rules. `memo` lacks agent closes by certainty, follow-ups, the list of 59 categories with its unlisted categories, and duplicate checks that read linked messages; it has categories (`tasks plan --category`, `category:`), tags and the duplicate check in `tasks add`, but not yet `tasks categories`, claims, `tasks related`, `tasks duplicates` or `tasks merge`. @@ -131,7 +129,7 @@ with no certainty. ## Categories The category list is one list for every tool, not one per profile or per app, because the rules run in -`tg`, `max`, `memo` and `messages sync` and must agree. `tg` reads the owner's changes from a shared +`tg`, `max`, `memo` and `messages sync` and must agree. `tg` and `max` read the owner's changes from a shared settings file, `~/.config/WireCat/config.json` (on Windows, `%APPDATA%\WireCat\Config\config.json`), section `task_categories`. The section holds only changes on top of the default list: `"": " | "` adds or replaces a category (a new one goes before `other`), and `null` @@ -160,11 +158,11 @@ accent, `ñ`, `¿` or `¡`, or a word such as `la`, `que` or `para`. A list hold with meanings and words. `tasks agenda category: tag:` filters the agenda with query fields (MCP `tasks_agenda` takes them in `query`). Changing the list does not change the category of existing tasks. -Before `tg` read the file, the list was saved in the store (`store_settings`). Such a saved list is +Before the tools read the file, the list was saved in the store (`store_settings`). Such a saved list is still the base under the file's changes until the next `config set` or `unset` of a category moves it -into the file and drops it from the store. `max` and `memo` do not read the file yet: they use a list -saved in the store, or the default list of the tool that opens the store. So after `tg` moves a saved -list into the file, `max` and `memo` use their own default list. `tasks categories` (MCP +into the file and drops it from the store. `memo` does not read the file yet: it uses a list saved in +the store, or its own default list. So after `tg` or `max` moves a saved list into the file, `memo` uses +its own default list. `tasks categories` (MCP `tasks_categories`) names the file in `file`. A category that left the list while tasks still carry it is named: `tasks categories` lists it under `unlisted` with open and total task counts (MCP `tasks_categories` too), a `config set` or `unset` of `task_categories` ends its @@ -239,7 +237,7 @@ The default list in `tg` and `max`: ## Where the rules open tasks A task is what the owner must do or what someone owes the owner, not every question in every chat. In -`tg`, the rules open tasks by the kind of chat: +`tg` and `max`, the rules open tasks by the kind of chat: | Chat kind | What opens a task | | --- | --- | @@ -249,20 +247,22 @@ A task is what the owner must do or what someone owes the owner, not every quest | Channel, Saved Messages | nothing | The tag is an ordinary chat tag: `tags add --chat watch-tasks`. It changes nothing in a -one-to-one chat or a channel. `review`, `serve`, the pass on sync and `tasks scan` all read it. A rule +one-to-one chat or a channel. `review`, `serve` in `tg`, the pass on sync and `tasks scan` all read it. A rule closes a task only in a chat where it may open one, on the owner's answer. In a watched group, a direct reply to the question from any member other than the asker also closes it, with the resolution "answered in the group"; a later message that does not reply to the question closes nothing. A question is a message with a question mark, or a reply to the owner's message; a request or promise without one is -an agent's to add. In `max`, every question the owner did not answer -opens a task, in any chat. +an agent's to add. `max` reads MAX's dialogs as one-to-one chats, its group chats as groups and its +channels as channels; any other chat is of a kind the store does not know. In `max`, `serve` runs only +the auto-reply rules' `task` action, so a question that arrives while it runs opens its task on the +next sync or `review`. Why: on a real store, the newest 300 posts of one channel would have opened 85 tasks under the earlier rule, which opened a task for any unanswered question in any chat. Now a channel opens none. ## Assignees -In `tg`, a task found in a message can name who should do it, through the same assignment rows as +In `tg` and `max`, a task found in a message can name who should do it, through the same assignment rows as project tasks (role `assignee`). An open task with an assignee is what that person owes the owner. | Command | What it does | @@ -288,7 +288,7 @@ a failed sync. Nothing is attached on its own beyond a certain match (step 2 bel In `tg` and `max`, the first pass of an account also opens at most `task_first_pass_per_chat` tasks per chat, the newest first; the default is 0. A first sync reads history, and which chats are worth turning into tasks is the owner's choice. The tasks it held back are counted in `tasks` as `held`, in -`held_chats` chats, and a note names `tasks scan` (`tasks apply` in `max`). In `tg`, `held` does not +`held_chats` chats, and a note names `tasks scan`. `held` does not count a chat where the rules open nothing, such as a channel. Closes still run: a question the owner answered closes its open task. The setting is store-wide, kept in `store_settings` like the agent-close settings, a whole number from 0 to 1000; `config unset task_first_pass_per_chat` goes back to 0. @@ -302,7 +302,7 @@ Without the global `--yes` (MCP `yes`) it changes nothing and lists, per chat, t each task that would open, with its source, type and category; with it, the tasks open through the duplicate check, as on a sync, and answered questions close. A message that already has a task is not listed again. The MCP tool's description tells an agent to ask the owner before it builds a chat's -tasks. In `max` the command is still `tasks apply` (MCP `tasks_apply`); `tg` keeps no old name. +tasks. Neither `tg` nor `max` keeps the old name `tasks apply`. | Command | What it does | | --- | --- | @@ -345,7 +345,7 @@ come from the same message. A message can raise a pair's score, never lower it. due date count only when the task's own text has none, and its "tomorrow" is read from when it was sent. Messages are read from the store at compare time; a task stores no message text. -**Two tasks from one message.** In `tg`, when two tasks have the same source message, such as a +**Two tasks from one message.** In `tg` and `max`, when two tasks have the same source message, such as a promise and a request an agent took from one long message, they are compared by their own title and description only. The shared message would make two different jobs look like one. diff --git a/content/docs/tasks-architecture.ru.mdx b/content/docs/tasks-architecture.ru.mdx index ccaed3ec..1a618d06 100644 --- a/content/docs/tasks-architecture.ru.mdx +++ b/content/docs/tasks-architecture.ru.mdx @@ -10,10 +10,7 @@ description: "Техническая сторона задач: одна таб Устройство описано в утверждённом плане задач в cli-core ([WireCatLabs/cli-core#1216](https://github.com/WireCatLabs/cli-core/pull/1216)). Всё это уже есть в -cli-core, кроме частей с пометкой **ещё не сделано**. В `tg` и `max` есть всё это, только лишь `tg` пока читает список категорий из общего файла настроек, -открывает задачи в группе только по тому, что адресовано владельцу (и каждый вопрос в группе с тегом -`watch-tasks`), записывает исполнителей задач из сообщений и сравнивает две задачи из одного сообщения -по их собственным словам. В `max` проверка истории называется `tasks apply`, в `tg` — `tasks scan`. В `memo` нет закрытия агентом по уверенности, продолжений, списка из 59 категорий с категориями вне списка и чтения привязанных сообщений при проверке на дубликаты; в нём есть +cli-core, кроме частей с пометкой **ещё не сделано**. В `tg` и `max` есть всё это, только `serve` в `max` открывает лишь задачи правил автоответа. В `memo` нет закрытия агентом по уверенности, продолжений, списка из 59 категорий с категориями вне списка и чтения привязанных сообщений при проверке на дубликаты; в нём есть категории (`tasks plan --category`, `category:`), теги и проверка на дубликаты в `tasks add`, но пока нет `tasks categories`, брони, `tasks related`, `tasks duplicates` и `tasks merge`. @@ -137,7 +134,7 @@ SQLite пускает только одного писателя за раз в ## Категории Список категорий один для всех инструментов, а не для профиля или приложения: правила работают в -`tg`, `max`, `memo` и `messages sync` и должны совпадать. `tg` читает изменения владельца из общего +`tg`, `max`, `memo` и `messages sync` и должны совпадать. `tg` и `max` читают изменения владельца из общего файла настроек `~/.config/WireCat/config.json` (в Windows — `%APPDATA%\WireCat\Config\config.json`), раздел `task_categories`. В разделе только изменения поверх списка по умолчанию: `"": " | "` добавляет или заменяет категорию (новая встаёт перед `other`), а @@ -168,12 +165,11 @@ SQLite пускает только одного писателя за раз в `tasks_categories`) печатает список со смыслом и словами. `tasks agenda category: tag:` фильтрует план полями запроса (MCP `tasks_agenda` принимает их в `query`). Изменение списка не меняет категорию существующих задач. -До того как `tg` стал читать файл, список сохранялся в хранилище (`store_settings`). Такой +До того как инструменты стали читать файл, список сохранялся в хранилище (`store_settings`). Такой сохранённый список остаётся основой под изменениями из файла, пока следующая `config set` или `unset` -для категории не перенесёт его в файл и не уберёт из хранилища. `max` и `memo` пока не читают файл: -они берут список, сохранённый в хранилище, или список по умолчанию того инструмента, который открыл -хранилище. Поэтому после того как `tg` перенёс сохранённый список в файл, `max` и `memo` берут свой -список по умолчанию. `tasks categories` (MCP `tasks_categories`) называет файл в `file`. Категория, которой больше нет в списке, но которая стоит у задач, называется: +для категории не перенесёт его в файл и не уберёт из хранилища. `memo` пока не читает файл: он берёт +список, сохранённый в хранилище, или свой список по умолчанию. Поэтому после того как `tg` или `max` +перенёс сохранённый список в файл, `memo` берёт свой список по умолчанию. `tasks categories` (MCP `tasks_categories`) называет файл в `file`. Категория, которой больше нет в списке, но которая стоит у задач, называется: `tasks categories` показывает её в разделе `unlisted` с числом открытых задач и всего (MCP `tasks_categories` тоже), `config set` или `unset` для `task_categories` заканчивает свою заметку теми же строками, а `tasks agenda` называет те, что стоят у открытых задач (`unlisted_categories`). @@ -246,7 +242,7 @@ SQLite пускает только одного писателя за раз в ## Где правила открывают задачи Задача — это то, что должен сделать владелец, или то, что кто-то должен владельцу, а не каждый вопрос в -каждом чате. В `tg` правила открывают задачи в зависимости от вида чата: +каждом чате. В `tg` и `max` правила открывают задачи в зависимости от вида чата: | Вид чата | Что открывает задачу | | --- | --- | @@ -256,13 +252,15 @@ SQLite пускает только одного писателя за раз в | Канал, «Избранное» | ничего | Это обычный тег чата: `tags add --chat watch-tasks`. В личном чате и в канале он ничего не -меняет. Его читают `review`, `serve`, проход при синхронизации и `tasks scan`. Правило закрывает задачу +меняет. Его читают `review`, `serve` в `tg`, проход при синхронизации и `tasks scan`. Правило закрывает задачу только в чате, где может её открыть, по ответу владельца. В группе с тегом её закрывает и прямой ответ (reply) на вопрос от любого участника, кроме спросившего, с причиной «answered in the group»; более позднее сообщение, которое не отвечает на вопрос, ничего не закрывает. Вопрос — это сообщение с вопросительным знаком или ответ на сообщение владельца; просьбу или обещание без знака -добавляет агент. В `max` каждый вопрос, на который владелец не ответил, открывает -задачу в любом чате. +добавляет агент. `max` считает диалоги MAX личными чатами, его групповые чаты — группами, а каналы — +каналами; вид любого другого чата хранилищу неизвестен. В `max` `serve` выполняет только действие +`task` правил автоответа, поэтому вопрос, который пришёл, пока он работает, откроет задачу при +следующей синхронизации или `review`. Зачем: в реальном хранилище 300 последних постов одного канала открыли бы 85 задач по прежнему правилу, которое открывало задачу на любой вопрос без ответа в любом чате. Теперь канал не открывает @@ -270,7 +268,7 @@ SQLite пускает только одного писателя за раз в ## Исполнители -В `tg` у задачи из сообщения можно указать, кто должен её сделать, — через те же строки назначений, +В `tg` и `max` у задачи из сообщения можно указать, кто должен её сделать, — через те же строки назначений, что и у задач проекта (роль `assignee`). Открытая задача с исполнителем — это то, что этот человек должен владельцу. @@ -298,7 +296,7 @@ MCP `tasks_add` и `tasks_plan` принимают `assignee`, а карточк В `tg` и `max` первый проход аккаунта к тому же открывает не больше `task_first_pass_per_chat` задач на чат, начиная с самых новых; по умолчанию 0. Первая синхронизация читает историю, а какие чаты стоит превратить в задачи, решает владелец. Отложенные задачи считаются в `tasks` как `held`, в `held_chats` -чатах, а заметка называет `tasks scan` (`tasks apply` в `max`). В `tg` `held` не считает чат, где +чатах, а заметка называет `tasks scan`. `held` не считает чат, где правила ничего не открывают, например канал. Закрытия по-прежнему работают: вопрос, на который владелец ответил, закрывает свою открытую задачу. Настройка действует на всё хранилище и хранится в `store_settings`, как настройки закрытия агентом; это целое число от 0 до 1000, а @@ -314,8 +312,8 @@ MCP `tasks_add` и `tasks_plan` принимают `assignee`, а карточк каждого чата число прочитанных сообщений и каждую задачу, которая откроется, с источником, типом и категорией; с ним задачи открываются через проверку на дубликаты, как при синхронизации, а отвеченные вопросы закрываются. Сообщение, у которого уже есть задача, повторно не показывается. Описание -инструмента MCP просит агента спросить владельца, прежде чем строить задачи чата. В `max` команда -по-прежнему называется `tasks apply` (MCP `tasks_apply`); в `tg` старого имени нет. +инструмента MCP просит агента спросить владельца, прежде чем строить задачи чата. Ни в `tg`, ни в +`max` старого имени `tasks apply` нет. | Команда | Что делает | | --- | --- | @@ -360,7 +358,7 @@ graph TD «завтра» отсчитывается от времени отправки. Сообщения читаются из хранилища во время сравнения; задача не хранит текст сообщений. -**Две задачи из одного сообщения.** В `tg`, когда у двух задач одно исходное сообщение, например +**Две задачи из одного сообщения.** В `tg` и `max`, когда у двух задач одно исходное сообщение, например обещание и просьба, которые агент взял из одного длинного сообщения, они сравниваются только по своим названиям и описаниям. Общее сообщение сделало бы два разных дела похожими на одно. diff --git a/content/docs/tasks.es.md b/content/docs/tasks.es.md index 130a6f5b..5c543415 100644 --- a/content/docs/tasks.es.md +++ b/content/docs/tasks.es.md @@ -14,33 +14,32 @@ Las categorías, las etiquetas en las tareas, las claves por tipo, la reserva de de duplicados ya están en el núcleo común de las herramientas (cli-core). `tg` y `max` las tienen todas; `memo` aún no tiene la reserva ni la revisión de duplicados. Los cierres que te esperan cuando un agente no está seguro, las tareas de seguimiento, la lista de 59 categorías y la detección de -duplicados que lee los mensajes vinculados están en `tg` y `max`; `memo` aún no los tiene. Por ahora -solo `tg` lee la lista de categorías del archivo de ajustes compartido. En `tg` y `max` la primera +duplicados que lee los mensajes vinculados están en `tg` y `max`; `memo` aún no los tiene. `tg` y +`max` leen la lista de categorías del archivo de ajustes compartido. En ellos la primera sincronización no abre tareas de tu historial, y las tareas de un chat se crean cuando lo pides -(`tasks scan` en `tg`; en `max` el comando aún se llama `tasks apply`). Solo `tg` abre tareas en un -grupo únicamente por lo que te preguntan a ti, y registra quién debe hacer una tarea encontrada en un -mensaje. +(`tasks scan`). Abren tareas en un grupo únicamente por lo que te preguntan a ti, y registran quién +debe hacer una tarea encontrada en un mensaje. [Cómo funcionan las tareas](./tasks-architecture.mdx) da el detalle técnico. ## De dónde salen las tareas -- **Las reglas las encuentran en los mensajes, donde se te pide algo.** En `tg` decide el tipo de chat: +- **Las reglas las encuentran en los mensajes, donde se te pide algo.** En `tg` y `max` decide el tipo de chat: - **Un chat individual:** cada pregunta que no respondiste se convierte en una tarea de tipo `question`. - **Un grupo:** solo una pregunta que responde a tu mensaje. Las preguntas de otras personas no son tus tareas. - - **Un canal o Mensajes guardados:** nada. + - **Un canal, o Mensajes guardados en Telegram:** nada. Un mensaje que te menciona se convierte en una tarea `mention`, en un chat individual o en un grupo; la mención la debe marcar el servicio de mensajería, un nombre escrito sin más no cuenta. Un chat - cuyo tipo la herramienta no conoce cuenta como grupo. En `max`, cada pregunta que no respondiste - sigue abriendo una tarea en cualquier chat. Una regla de + cuyo tipo la herramienta no conoce cuenta como grupo. Una regla de respuesta automática con la acción `task` abre una tarea `request` por cada mensaje que coincide ([Telegram](./tg/replies.md), [MAX](./max/replies.md)). Las reglas se ejecutan cuando tu agente sincroniza o revisa tus chats y mientras la herramienta funciona en segundo plano (`messages sync`, - `review` y `serve`). Una regla elige la categoría de la tarea por las palabras del mensaje. + `review` y `serve`). En `max`, `serve` abre solo las tareas de las reglas de respuesta automática; las + demás reglas se ejecutan en la siguiente sincronización o revisión. Una regla elige la categoría de la tarea por las palabras del mensaje. - **Un grupo vigilado te da todas las preguntas.** Si quieres como tarea cada pregunta sin respuesta de - un grupo, sea para quien sea, ponle al grupo la etiqueta `watch-tasks` (`tg`; consulta + un grupo, sea para quien sea, ponle al grupo la etiqueta `watch-tasks` (consulta [Todas las preguntas de un grupo](#todas-las-preguntas-de-un-grupo)). - **Tus mensajes antiguos esperan tu decisión.** En `tg` y `max`, la primera sincronización de una cuenta no abre tareas de tu historial. Las sincronizaciones siguientes abren tareas a partir de mensajes nuevos. @@ -101,8 +100,8 @@ tres tareas. Una tarea trata de una cosa, no de un chat ni de una persona. Una tarea no es solo lo que tienes que hacer tú. Cuando alguien te promete algo, como «mañana te mando las fotos», guárdalo también como tarea, con esa persona como su **responsable**: quien debe hacerla. -Así puedes preguntar a tu agente qué te deben otros y reclamar lo que se retrasa. En `tg`, una tarea -encontrada en un mensaje puede tener responsables; las tareas de proyecto de `memo` tienen los suyos. +Así puedes preguntar a tu agente qué te deben otros y reclamar lo que se retrasa. En `tg` y `max`, una +tarea encontrada en un mensaje puede tener responsables; las tareas de proyecto de `memo` tienen los suyos. `tasks add` y `tasks plan` aceptan `--assignee`: @@ -135,12 +134,12 @@ tg personal tags add --chat "Renovation" watch-tasks tg personal tags remove --chat "Renovation" watch-tasks ``` -La etiqueta funciona en `tg` y solo en grupos; un canal nunca abre tareas. Lo que cambia: +La etiqueta funciona en `tg` y `max`, y solo en grupos; un canal nunca abre tareas. Lo que cambia: - **Cada pregunta que no respondiste abre una tarea, sea para quien sea.** Una regla reconoce una pregunta por su signo de interrogación o por una respuesta a tu mensaje. -- **Solo mensajes nuevos.** Las tareas se abren después de cada sincronización, en `review` y mientras - `serve` está en marcha. Para los mensajes antiguos del grupo, usa +- **Solo mensajes nuevos.** Las tareas se abren después de cada sincronización, en `review` y, en + `tg`, mientras `serve` está en marcha. Para los mensajes antiguos del grupo, usa [`tasks scan`](#tareas-del-historial-de-un-chat). - **Preguntas, no todos los mensajes.** Una petición o una promesa sin signo de interrogación, como «mándame el archivo» o «lo hago mañana», no es tarea de una regla. Tu agente la añade con @@ -242,7 +241,7 @@ tg personal tasks close tg personal tasks reject ``` -`` es la clave de la tarea, tal como la imprime `tasks agenda`, o su id completo. `max` tiene los mismos comandos, incluidos los cierres sugeridos, salvo `--assignee`. +`` es la clave de la tarea, tal como la imprime `tasks agenda`, o su id completo. `max` tiene los mismos comandos, incluidos los cierres sugeridos y `--assignee`. @@ -252,13 +251,13 @@ tg personal tasks reject - **add** necesita un tipo. También necesita una categoría (`--category`), y se niega si ya existe una tarea parecida; consulta [Sin tareas duplicadas](#sin-tareas-duplicadas). -- **plan** fija el título, la descripción, la fecha límite, la próxima revisión y, en `tg`, los +- **plan** fija el título, la descripción, la fecha límite, la próxima revisión y los responsables. La próxima revisión es cuándo tu agente debe volver a mirar la tarea; no te avisa a ti. - **link** añade a una tarea mensajes, chats, personas, documentos, notas o direcciones. - **show** muestra una tarea con su plan y todo lo vinculado. - **scan** ejecuta las reglas de tareas sobre los mensajes guardados más recientes de un chat y lista - las tareas que abrirían. Solo las abre con `--yes`. En `max` este comando es `tasks apply`. Consulta + las tareas que abrirían. Solo las abre con `--yes`. Consulta [Tareas del historial de un chat](#tareas-del-historial-de-un-chat). - **close** cierra una tarea como `done` o `dismissed`. Una tarea cerrada se queda cerrada. Solo `tasks unmerge` vuelve a abrir una tarea, y solo una que cerró una fusión. El cierre de un agente @@ -287,7 +286,7 @@ apareció mientras se trabajaba en otra. tareas sobre lo que guardó, desde donde se detuvo la vez anterior. La primera vez lee solo los chats con algún mensaje de los últimos 14 días. En `tg` y `max`, además, la primera vez no abre ninguna tarea de esos mensajes: la respuesta cuenta las tareas que dejó sin abrir y nombra - `tasks scan` (`tasks apply` en `max`). Una sincronización posterior se salta un chat en el que no se envió nada nuevo, así que los mensajes + `tasks scan`. Una sincronización posterior se salta un chat en el que no se envió nada nuevo, así que los mensajes antiguos que descarga no abren tareas. La respuesta dice cuántas tareas se abrieron, cuántas se cerraron y cuántas fueron a la lista de revisión. 2. Lee la agenda y contrasta cada tarea nueva con sus mensajes. @@ -309,11 +308,10 @@ chats merecen el trabajo. abren pasando por la comprobación de duplicados, como en una sincronización, y se cierra la tarea abierta de una pregunta que ya respondiste. -La revisión usa las mismas reglas que una sincronización: en `tg`, un canal no abre nada, y un grupo +La revisión usa las mismas reglas que una sincronización: un canal no abre nada, y un grupo solo lo que te preguntan a ti, salvo que le pusieras la etiqueta `watch-tasks`. `tasks scan` lee solo los mensajes guardados en tu ordenador y no envía nada. Los agentes que usan el servidor MCP tienen la -misma herramienta, `tasks_scan`, con `yes` en lugar de `--yes`. En `max`, el comando es `tasks apply` -y la herramienta, `tasks_apply`. +misma herramienta, `tasks_scan`, con `yes` en lugar de `--yes`. Si quieres que la primera sincronización abra tareas del historial, `config set task_first_pass_per_chat ` le permite abrir hasta n tareas por chat, primero las más @@ -377,7 +375,7 @@ herramienta comprueba cada tarea nueva antes de crearla: La comprobación compara las palabras (también otras formas de una palabra y errores de escritura), la persona, el importe, la fecha límite, la categoría, las respuestas y el tiempo. En `tg` y `max`, el tiempo es cuándo se enviaron los mensajes de las tareas, no cuándo se escribieron las tareas, así que -las tareas escritas de una vez a partir del historial no parecen iguales. En `tg`, dos tareas sacadas +las tareas escritas de una vez a partir del historial no parecen iguales. En `tg` y `max`, dos tareas sacadas de un mismo mensaje, como una promesa y una petición en un mensaje largo, se comparan solo por su título y su descripción: el mensaje compartido no dice si son el mismo trabajo. Lee el título y la descripción de cada tarea, su mensaje de origen y sus 5 mensajes vinculados más recientes, así que una @@ -421,12 +419,12 @@ primero, cada una con una banda (`likely`, `maybe` o `different`) y los motivos. que no está en la lista. Una regla elige la categoría por las palabras del mensaje, la más concreta si encajan dos (una factura de suministros es `bills`, no `money`), u `other` si ninguna coincide; tu agente la corrige con `tasks plan --category`. -- **Una lista en un archivo de ajustes compartido.** `tg` lee tus cambios a la lista de +- **Una lista en un archivo de ajustes compartido.** `tg` y `max` leen tus cambios a la lista de `~/.config/WireCat/config.json`, sección `task_categories`. No es el archivo de ajustes de un perfil, - así que la lista es la misma en todos los perfiles, y «finanzas» y «pagos» nunca conviven. `max` y - `memo` aún no leen este archivo. Usan una lista guardada en el almacén o su propia lista por defecto: - `max` tiene las mismas 59 categorías, y `memo` aún tiene las siete anteriores (`money`, `documents`, - `meeting`, `delivery`, `access`, `personal` y `other`). + así que la lista es la misma en todos los perfiles, y «finanzas» y «pagos» nunca conviven. `memo` + aún no lee este archivo. Usa una lista guardada en el almacén o su propia lista por defecto, que aún + tiene las siete categorías anteriores (`money`, `documents`, `meeting`, `delivery`, `access`, + `personal` y `other`). - **Puedes cambiar la lista.** Cada categoría tiene un significado y las palabras por las que la elige una regla. Una palabra coincide también con sus otras formas; una palabra puede indicar su idioma, como `es:vuelo`, y entonces una palabra española como `es:pagar` coincide también con `pagues` en un @@ -437,7 +435,7 @@ primero, cada una con una banda (`likely`, `maybe` o `different`) y los motivos. es JSON válido o que nombra una categoría incorrecta se rechaza indicando su ruta. - **Una lista guardada en el almacén pasa al archivo.** Una lista que `tg` guardó en el almacén antes de usar el archivo sigue valiendo. El siguiente `config set` o `config unset` de una categoría la pasa - al archivo y la quita del almacén; desde entonces, `max` y `memo` vuelven a usar su propia lista por + al archivo y la quita del almacén; desde entonces, `memo` vuelve a usar su propia lista por defecto. `config unset task_categories` quita la sección del archivo y da la lista por defecto actual. - **Una categoría que salió de la lista.** Las tareas conservan su categoría cuando sale de la lista. `tasks categories` nombra esas categorías en `unlisted`, con sus tareas abiertas y el total, y @@ -463,7 +461,7 @@ config unset task_categories config show ``` -En `tg` también puedes editar el archivo a mano. Un nombre con su significado y sus palabras añade o +En `tg` y `max` también puedes editar el archivo a mano. Un nombre con su significado y sus palabras añade o sustituye una categoría, y `null` quita una de la lista por defecto: ```json @@ -507,7 +505,7 @@ tasks agenda claimed:any Los agentes que usan el servidor MCP tienen las mismas herramientas, como `tasks_claim`, `tasks_release`, `tasks_categories`, `tasks_related`, `tasks_duplicates`, `tasks_merge` y `tasks_unmerge`. En `tg` y `max`, `tasks_close` necesita `certainty`, igual que el `tasks close` de un agente. -`tasks_scan` (`tasks_apply` en `max`) crea las tareas de un chat a partir de su historial. +`tasks_scan` crea las tareas de un chat a partir de su historial. ## Aún no está hecho diff --git a/content/docs/tasks.md b/content/docs/tasks.md index 301e4ae9..810ea300 100644 --- a/content/docs/tasks.md +++ b/content/docs/tasks.md @@ -15,29 +15,28 @@ core of the tools (cli-core). `tg` and `max` have all of them; `memo` does not h duplicate review yet. Closes that wait for you when an agent is unsure, follow-up tasks, the list of 59 categories and the duplicate check that reads linked messages are in `tg` and `max`; `memo` does not have them yet. -Only `tg` reads the category list from the shared settings file so far. `tg` and `max` keep a first -sync from opening tasks from your history, and build a chat's tasks when you ask (`tasks scan` in -`tg`; `max` still calls it `tasks apply`). Only `tg` opens tasks in a group just for what is asked of -you, and records who should do a task found in a message. +`tg` and `max` read the category list from the shared settings file. They keep a first sync from +opening tasks from your history, and build a chat's tasks when you ask (`tasks scan`). They open tasks +in a group just for what is asked of you, and record who should do a task found in a message. [How tasks work](./tasks-architecture.mdx) gives the technical detail. ## Where tasks come from -- **Rules find them in messages, where something is asked of you.** In `tg`, the kind of chat decides: +- **Rules find them in messages, where something is asked of you.** In `tg` and `max`, the kind of chat decides: - **A one-to-one chat:** every question you did not answer becomes a task of type `question`. - **A group:** only a question that replies to your message. Other people's questions are not your tasks. - - **A channel or Saved Messages:** nothing. + - **A channel, or Saved Messages in Telegram:** nothing. A message that mentions you becomes a `mention` task, in a one-to-one chat or a group; the messenger must mark the mention, a typed name alone is not seen. A chat whose kind the tool does - not know counts as a group. In `max`, every question you did not answer still opens a task, in any - chat. An auto-reply rule with the `task` action opens a `request` task for each + not know counts as a group. An auto-reply rule with the `task` action opens a `request` task for each matching message ([Telegram](./tg/replies.md), [MAX](./max/replies.md)). The rules run when your agent syncs or reviews your chats, and while the tool runs in the background (`messages sync`, - `review` and `serve`). A rule picks the task's category from the words of the message. + `review` and `serve`). In `max`, `serve` opens only the tasks of auto-reply rules; the other rules + run on the next sync or review. A rule picks the task's category from the words of the message. - **A group you watch gives you every question.** When you want every unanswered question of a group - as a task, whoever it is for, tag the group `watch-tasks` (`tg`; see + as a task, whoever it is for, tag the group `watch-tasks` (see [Watch every question in a group](#watch-every-question-in-a-group)). - **Old messages wait for your choice.** In `tg` and `max`, the first sync of an account opens no task from your history. Later syncs open tasks from new messages. When you want a chat's history as tasks, your agent @@ -97,8 +96,8 @@ three tasks. A task is about one thing, not about one chat or one person. A task is not only what you must do. When someone promises you something, such as "I will send the photos tomorrow", keep it as a task too, with that person as its **assignee**: the person who should -do it. Then you can ask your agent what others owe you and chase what is late. In `tg`, a task found -in a message can have assignees; project tasks in `memo` have their own. +do it. Then you can ask your agent what others owe you and chase what is late. In `tg` and `max`, a task +found in a message can have assignees; project tasks in `memo` have their own. `tasks add` and `tasks plan` take `--assignee`: @@ -131,11 +130,11 @@ tg personal tags add --chat "Renovation" watch-tasks tg personal tags remove --chat "Renovation" watch-tasks ``` -The tag works in `tg`, on groups only; a channel never opens tasks. What it changes: +The tag works in `tg` and `max`, on groups only; a channel never opens tasks. What it changes: - **Every question you did not answer opens a task, whoever it is for.** A rule sees a question by its question mark, or by a reply to your message. -- **New messages only.** Tasks open after each sync, in `review` and while `serve` runs. For the +- **New messages only.** Tasks open after each sync, in `review` and, in `tg`, while `serve` runs. For the group's older messages, use [`tasks scan`](#tasks-from-a-chats-history). - **Questions, not every message.** A request or a promise without a question mark, such as "send me the file" or "I will do it tomorrow", is not a rule's task. Your agent adds it with `tasks add`, with @@ -234,7 +233,7 @@ tg personal tasks close tg personal tasks reject ``` -`` is the task's key, as `tasks agenda` prints it, or its full id. `max` has the same commands, including suggested closes, except `--assignee`. +`` is the task's key, as `tasks agenda` prints it, or its full id. `max` has the same commands, including suggested closes and `--assignee`. @@ -242,12 +241,12 @@ tg personal tasks reject answer and chats where you wait for one. It warns when the store has not saved anything for a while. - **add** needs a type. It also needs a category (`--category`), and it refuses when a similar task exists; see [No duplicate tasks](#no-duplicate-tasks). -- **plan** sets the title, the description, the due date, the next check and, in `tg`, the assignees. +- **plan** sets the title, the description, the due date, the next check and the assignees. The next check is when your agent should look at the task again; it does not remind you. - **link** adds messages, chats, people, documents, notes or addresses to a task. - **show** prints one task with its plan and everything linked to it. - **scan** runs the task rules over a chat's newest stored messages and lists the tasks they would - open. It opens them only with `--yes`. In `max` this command is `tasks apply`. See + open. It opens them only with `--yes`. See [Tasks from a chat's history](#tasks-from-a-chats-history). - **close** closes a task as `done` or `dismissed`. A closed task stays closed. Only `tasks unmerge` reopens a task, and only one that a merge closed. An agent's close may wait for you; see @@ -273,7 +272,7 @@ while working on another. 1. Your agent fetches new messages (`messages sync`). The sync runs the task rules on what it stored, from where the last run stopped. The first run reads only chats with a message in the last 14 days. In `tg` and `max`, the first run also opens no task from those messages: the answer counts the - tasks it held back and names `tasks scan` (`tasks apply` in `max`). A later sync skips a chat where + tasks it held back and names `tasks scan`. A later sync skips a chat where nothing new was sent, so old messages that it fetches open no tasks. The answer says how many tasks were opened, how many were closed and how many went to the review list. 2. It reads the agenda and checks each new task against its messages. @@ -294,10 +293,10 @@ the work. 2. Check the list. If you agree, the agent runs the same command with `--yes`. The tasks open through the duplicate check, as on a sync, and an open task whose question you have already answered closes. -The scan uses the same rules as a sync: in `tg`, a channel opens nothing, and a group opens only what +The scan uses the same rules as a sync: a channel opens nothing, and a group opens only what is asked of you unless you tagged it `watch-tasks`. `tasks scan` reads only the messages stored on your computer and sends nothing. Agents that use the MCP server have the same tool, `tasks_scan`, with -`yes` in place of `--yes`. In `max`, the command is `tasks apply` and the tool is `tasks_apply`. +`yes` in place of `--yes`. If you want the first sync to open tasks from history, `config set task_first_pass_per_chat ` lets it open up to n tasks per chat, the newest first (0 by default, at most 1000). This setting is for the @@ -358,7 +357,7 @@ new task before it creates it: The check compares words (including other forms of a word and typos), the person, the amount of money, the due date, the category, replies and the time. In `tg` and `max`, the time is when the tasks' messages were sent, not when the tasks were written, so tasks written from history in one go do not -look alike. In `tg`, two tasks taken from one message, such as a promise and a request in one long +look alike. In `tg` and `max`, two tasks taken from one message, such as a promise and a request in one long message, are compared by their own title and description only: the shared message says nothing about whether they are one job. It reads each task's title and description, @@ -401,12 +400,12 @@ tasks unmerge REQ-23 that is not on the list. A rule picks the category from the words of the message, the narrower one when two fit (a utility bill is `bills`, not `money`), or `other` when no word matches; your agent corrects it with `tasks plan --category`. -- **One list in a shared settings file.** `tg` reads your changes to the list from +- **One list in a shared settings file.** `tg` and `max` read your changes to the list from `~/.config/WireCat/config.json`, section `task_categories`. This file is not a profile's settings file, so the list is the same in every profile, and "finance" and "payments" never live side by - side. `max` and `memo` do not read this file yet. They use a list saved in the store, or their own - default list: `max` has the same 59 categories, and `memo` still has the earlier seven (`money`, - `documents`, `meeting`, `delivery`, `access`, `personal` and `other`). + side. `memo` does not read this file yet. It uses a list saved in the store, or its own default list, + which still has the earlier seven categories (`money`, `documents`, `meeting`, `delivery`, `access`, + `personal` and `other`). - **You can change the list.** Each category has a meaning and the words a rule picks it by. A word matches its other forms too; a word can name its language, such as `es:vuelo`, and a Spanish word such as `es:pagar` then also matches `pagues` in a Spanish message. You can add or change a category, @@ -416,7 +415,7 @@ tasks unmerge REQ-23 it. A file that is not valid JSON, or names a bad category, is refused with its path. - **A list saved in the store moves to the file.** A list that `tg` saved in the store before it used the file still applies. The next `config set` or `config unset` of a category moves it into the file - and removes it from the store; after that, `max` and `memo` use their own default list again. + and removes it from the store; after that, `memo` uses its own default list again. `config unset task_categories` removes the section from the file and gives the current default list. - **A category that left the list.** Tasks keep their category when it leaves the list. `tasks categories` names such categories under `unlisted`, with their open and total tasks, and @@ -441,7 +440,7 @@ config unset task_categories config show ``` -In `tg`, you can also edit the file yourself. A name with its meaning and words adds or replaces a +In `tg` and `max`, you can also edit the file yourself. A name with its meaning and words adds or replaces a category, and `null` removes a default one: ```json @@ -485,7 +484,7 @@ tasks agenda claimed:any Agents that use the MCP server have the same tools, such as `tasks_claim`, `tasks_release`, `tasks_categories`, `tasks_related`, `tasks_duplicates`, `tasks_merge` and `tasks_unmerge`. In `tg` and `max`, `tasks_close` needs `certainty`, as an agent's `tasks close` does. `tasks_scan` -(`tasks_apply` in `max`) builds a chat's tasks from its history. +builds a chat's tasks from its history. ## Not built yet diff --git a/content/docs/tasks.ru.md b/content/docs/tasks.ru.md index f35ee0d4..8a2047ff 100644 --- a/content/docs/tasks.ru.md +++ b/content/docs/tasks.ru.md @@ -15,29 +15,28 @@ description: "Вопросы, просьбы и обещания из ваших дубликатов. Закрытия, которые ждут вас, когда агент не уверен, задачи-продолжения, список из 59 категорий и проверка на дубликаты, которая читает привязанные сообщения, есть в `tg` и `max`; в `memo` их пока нет. -Список категорий из общего файла настроек пока читает только `tg`. В `tg` и `max` первая синхронизация -не открывает задач из вашей истории, а задачи чата строятся по вашей просьбе (`tasks scan` в `tg`; в -`max` команда пока называется `tasks apply`). Только `tg` открывает в группе задачи лишь по тому, что -спрашивают у вас, и записывает, кто должен сделать задачу из сообщения. +`tg` и `max` читают список категорий из общего файла настроек. В них первая синхронизация не открывает +задач из вашей истории, а задачи чата строятся по вашей просьбе (`tasks scan`). Они открывают в группе +задачи лишь по тому, что спрашивают у вас, и записывают, кто должен сделать задачу из сообщения. Технические подробности — на странице [Как устроены задачи](./tasks-architecture.mdx). ## Откуда берутся задачи -- **Правила находят их в сообщениях — там, где что-то спрашивают у вас.** В `tg` всё решает вид чата: +- **Правила находят их в сообщениях — там, где что-то спрашивают у вас.** В `tg` и `max` всё решает вид чата: - **Личный чат:** каждый вопрос, на который вы не ответили, становится задачей типа `question`. - **Группа:** только вопрос, который отвечает на ваше сообщение. Вопросы других людей — не ваши задачи. - - **Канал или «Избранное»:** ничего. + - **Канал или «Избранное» в Telegram:** ничего. Сообщение с упоминанием вас становится задачей `mention` — в личном чате или в группе; упоминание должен отметить сам мессенджер, просто написанное имя не учитывается. Чат, вид которого инструменту - неизвестен, считается группой. В `max` по-прежнему каждый вопрос, на который вы не ответили, - открывает задачу в любом чате. Правило автоответа с действием `task` открывает + неизвестен, считается группой. Правило автоответа с действием `task` открывает задачу `request` на каждое подходящее сообщение ([Telegram](./tg/replies.md), [MAX](./max/replies.md)). Правила работают, когда агент синхронизирует или разбирает ваши чаты, и пока инструмент работает в - фоне (`messages sync`, `review` и `serve`). Правило выбирает категорию задачи по словам сообщения. + фоне (`messages sync`, `review` и `serve`). В `max` `serve` открывает только задачи правил автоответа; + остальные правила сработают при следующей синхронизации или разборе. Правило выбирает категорию задачи по словам сообщения. - **Группа под наблюдением даёт все вопросы.** Если вы хотите получать задачей каждый вопрос группы - без ответа, кому бы он ни был адресован, поставьте группе тег `watch-tasks` (`tg`; см. + без ответа, кому бы он ни был адресован, поставьте группе тег `watch-tasks` (см. [Все вопросы группы](#все-вопросы-группы)). - **Старые сообщения ждут вашего решения.** В `tg` и `max` первая синхронизация аккаунта не открывает задач из вашей истории. Следующие синхронизации открывают задачи из новых сообщений. Если вы хотите @@ -98,7 +97,7 @@ description: "Вопросы, просьбы и обещания из ваших Задача — не только то, что должны сделать вы. Когда кто-то вам что-то обещает, например «пришлю фото завтра», сохраните это тоже как задачу, а этого человека укажите её **исполнителем** — тем, кто должен её сделать. Тогда можно спросить агента, что вам должны другие, и напомнить о просроченном. В -`tg` исполнители бывают у задач из сообщений; у задач проектов в `memo` — свои. +`tg` и `max` исполнители бывают у задач из сообщений; у задач проектов в `memo` — свои. `tasks add` и `tasks plan` принимают `--assignee`: @@ -131,12 +130,12 @@ tg personal tags add --chat "Renovation" watch-tasks tg personal tags remove --chat "Renovation" watch-tasks ``` -Тег работает в `tg` и только для групп; канал задач не открывает никогда. Что он меняет: +Тег работает в `tg` и `max` и только для групп; канал задач не открывает никогда. Что он меняет: - **Каждый вопрос, на который вы не ответили, открывает задачу, кому бы он ни был адресован.** Правило узнаёт вопрос по вопросительному знаку или по ответу на ваше сообщение. -- **Только новые сообщения.** Задачи появляются после каждой синхронизации, в `review` и пока - работает `serve`. Для старых сообщений группы используйте [`tasks scan`](#задачи-из-истории-чата). +- **Только новые сообщения.** Задачи появляются после каждой синхронизации, в `review` и, в `tg`, + пока работает `serve`. Для старых сообщений группы используйте [`tasks scan`](#задачи-из-истории-чата). - **Вопросы, а не все сообщения.** Просьба или обещание без вопросительного знака, например «пришли файл» или «сделаю завтра», правило задачей не делает. Их добавляет агент через `tasks add`, с `--assignee sender`, если это обещание самого отправителя. @@ -236,7 +235,7 @@ tg personal tasks close tg personal tasks reject ``` -`` — ключ задачи, как его печатает `tasks agenda`, или её полный id. В `max` те же команды, включая предложенные закрытия, кроме `--assignee`. +`` — ключ задачи, как его печатает `tasks agenda`, или её полный id. В `max` те же команды, включая предложенные закрытия и `--assignee`. @@ -244,12 +243,12 @@ tg personal tasks reject где ответа ждут от вас, и чаты, где ждёте вы. Предупреждает, если хранилище давно ничего не сохраняло. - **add** требует тип и категорию (`--category`) и отказывает, если уже есть похожая задача; см. [Без дубликатов](#без-дубликатов). -- **plan** задаёт название, описание, срок, следующую проверку и, в `tg`, исполнителей. Следующая проверка — когда агенту +- **plan** задаёт название, описание, срок, следующую проверку и исполнителей. Следующая проверка — когда агенту стоит снова посмотреть на задачу; вам она не напоминает. - **link** привязывает к задаче сообщения, чаты, людей, документы, заметки или адреса. - **show** показывает одну задачу с планом и всем, что к ней привязано. - **scan** запускает правила задач на последних сохранённых сообщениях чата и показывает задачи, - которые они откроют. Открывает их только с `--yes`. В `max` эта команда называется `tasks apply`. См. + которые они откроют. Открывает их только с `--yes`. См. [Задачи из истории чата](#задачи-из-истории-чата). - **close** закрывает задачу как `done` или `dismissed`. Закрытая задача остаётся закрытой. Открыть её снова может только `tasks unmerge`, и только если задачу закрыло объединение. Закрытие агентом @@ -276,8 +275,7 @@ tg personal tasks reject 1. Агент загружает новые сообщения (`messages sync`). Синхронизация запускает правила задач на сохранённом, с того места, где остановился прошлый запуск. Первый запуск читает только чаты с сообщениями за последние 14 дней. В `tg` и `max` первый запуск к тому же не открывает задач из этих - сообщений: ответ считает задачи, которые он отложил, и называет `tasks scan` (`tasks apply` в - `max`). Следующая синхронизация пропускает чат, где ничего нового не отправляли, поэтому загруженные ею старые + сообщений: ответ считает задачи, которые он отложил, и называет `tasks scan`. Следующая синхронизация пропускает чат, где ничего нового не отправляли, поэтому загруженные ею старые сообщения не открывают задач. В ответе сказано, сколько задач открыто, сколько закрыто и сколько пар ушло в список на проверку. 2. Читает план и сверяет каждую новую задачу с её сообщениями. @@ -299,11 +297,10 @@ tg personal tasks reject через проверку на дубликаты, как при синхронизации, а открытая задача по вопросу, на который вы уже ответили, закрывается. -Проверка идёт по тем же правилам, что и синхронизация: в `tg` канал не открывает ничего, а группа — +Проверка идёт по тем же правилам, что и синхронизация: канал не открывает ничего, а группа — только то, что спрашивают у вас, если вы не поставили ей тег `watch-tasks`. `tasks scan` читает только сообщения, сохранённые на вашем компьютере, и ничего не отправляет. У агентов, которые работают через -MCP-сервер, есть такой же инструмент, `tasks_scan`, с `yes` вместо `--yes`. В `max` команда называется -`tasks apply`, а инструмент — `tasks_apply`. +MCP-сервер, есть такой же инструмент, `tasks_scan`, с `yes` вместо `--yes`. Если вы хотите, чтобы первая синхронизация открывала задачи из истории, команда `config set task_first_pass_per_chat ` разрешает ей открыть до n задач на чат, начиная с самых @@ -367,7 +364,7 @@ config set task_agent_close off Проверка сравнивает слова (в том числе другие формы слова и опечатки), человека, сумму денег, срок, категорию, ответы и время. В `tg` и `max` время — это когда были отправлены сообщения задач, а не когда -задачи записаны, поэтому задачи, записанные из истории за один раз, не выглядят похожими. В `tg` две +задачи записаны, поэтому задачи, записанные из истории за один раз, не выглядят похожими. В `tg` и `max` две задачи из одного сообщения, например обещание и просьба из одного длинного сообщения, сравниваются только по своим названиям и описаниям: общее сообщение ничего не говорит о том, одно ли это дело. Она читает название и описание задачи, её исходное сообщение и 5 новейших привязанных сообщений, поэтому задача, которую правило открыло с пустым названием, сравнивается по @@ -411,12 +408,11 @@ tasks unmerge REQ-23 выбирает категорию по словам сообщения, из двух подходящих — более узкую (счёт за коммунальные услуги — `bills`, а не `money`), или `other`, если ни одно слово не подошло; агент исправляет её через `tasks plan --category`. -- **Один список в общем файле настроек.** `tg` читает ваши изменения списка из +- **Один список в общем файле настроек.** `tg` и `max` читают ваши изменения списка из `~/.config/WireCat/config.json`, раздел `task_categories`. Это не файл настроек профиля, поэтому - список одинаков во всех профилях, а «финансы» и «платежи» не появятся рядом. `max` и `memo` пока не - читают этот файл. Они берут список, сохранённый в хранилище, или свой список по умолчанию: в `max` те - же 59 категорий, а в `memo` пока прежние семь (`money`, `documents`, `meeting`, `delivery`, `access`, - `personal` и `other`). + список одинаков во всех профилях, а «финансы» и «платежи» не появятся рядом. `memo` пока не читает + этот файл. Он берёт список, сохранённый в хранилище, или свой список по умолчанию, в котором пока + прежние семь категорий (`money`, `documents`, `meeting`, `delivery`, `access`, `personal` и `other`). - **Список можно менять.** У каждой категории есть смысл и слова, по которым её выбирает правило. Слово совпадает и с другими своими формами; слово может указать свой язык, например `es:vuelo`, и тогда испанское слово вроде `es:pagar` совпадает и с `pagues` в испанском сообщении. Можно добавить @@ -427,7 +423,7 @@ tasks unmerge REQ-23 указанием его пути. - **Список из хранилища переходит в файл.** Список, который `tg` сохранил в хранилище до перехода на файл, по-прежнему действует. Следующая `config set` или `config unset` для категории переносит его в - файл и убирает из хранилища; после этого `max` и `memo` снова берут свой список по умолчанию. + файл и убирает из хранилища; после этого `memo` снова берёт свой список по умолчанию. `config unset task_categories` убирает раздел из файла и даёт текущий список по умолчанию. - **Категория, которой нет в списке.** Задачи сохраняют свою категорию, когда её убирают из списка. `tasks categories` называет такие категории в разделе `unlisted`, с числом открытых задач и всего, а @@ -452,7 +448,7 @@ config unset task_categories config show ``` -В `tg` файл можно править и вручную. Имя со смыслом и словами добавляет или заменяет категорию, а +В `tg` и `max` файл можно править и вручную. Имя со смыслом и словами добавляет или заменяет категорию, а `null` убирает категорию из списка по умолчанию: ```json @@ -496,7 +492,7 @@ tasks agenda claimed:any У агентов, которые работают через MCP-сервер, есть те же инструменты, например `tasks_claim`, `tasks_release`, `tasks_categories`, `tasks_related`, `tasks_duplicates`, `tasks_merge` и `tasks_unmerge`. В `tg` и `max` `tasks_close` требует `certainty`, как и `tasks close` от агента. `tasks_scan` -(`tasks_apply` в `max`) строит задачи чата из его истории. +строит задачи чата из его истории. ## Ещё не сделано From ef04ed037d1f84105416e5f43b43f5a81a9c09b0 Mon Sep 17 00:00:00 2001 From: leemour Date: Sun, 18 Oct 2026 01:48:32 +0200 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20max=200.60.0=20=E2=80=94=20pin,=20t?= =?UTF-8?q?ranslations,=20permissions=20only=20tighten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - tools.json: max docsRef v0.58.0 → v0.60.0 (Core 0.326.0, Base 0.43.5). - translations/max: commands (EN/ES/RU: tasks scan, --assignee, no defaultProfile, --permission tightens), bot, profiles, sessions, usage, configuration, configuration-reference, mcp, permissions, remote, cli-contract; changelog 0.59.0 and 0.60.0; fingerprints accepted after review and docs:translation check. - permissions and browser-apps (EN/RU/ES): the flag only tightens in both tools; the "max still accepts a looser level" sentence is gone. - lib/command-rules.ts: no defaultProfile setting for tg or max. - docs-corrections: retire the max/commands defaultProfile correction; localise the <профиль> placeholder in the max changelog. - release-notes-review: max → v0.60.0; review record docs/reviews/2026-10-18-max-060-release.md. Co-Authored-By: Claude Opus 5.5 (1M context) --- content/docs/browser-apps.es.mdx | 2 +- content/docs/browser-apps.mdx | 2 +- content/docs/browser-apps.ru.mdx | 2 +- content/docs/permissions.es.mdx | 5 +- content/docs/permissions.mdx | 5 +- content/docs/permissions.ru.mdx | 5 +- docs/release-notes-review.json | 6 +- docs/reviews/2026-10-18-max-060-release.md | 56 +++++++++++ lib/command-rules.ts | 6 +- scripts/docs-corrections.json | 43 ++++----- tools.json | 2 +- translations/max/bot.en.md | 4 +- translations/max/bot.es.md | 4 +- translations/max/changelog.en.md | 91 +++++++++++++++++- translations/max/changelog.es.md | 94 ++++++++++++++++++- translations/max/cli-contract.en.md | 2 +- translations/max/cli-contract.es.md | 2 +- translations/max/commands.en.md | 28 +++--- translations/max/commands.es.md | 28 +++--- translations/max/commands.ru.md | 28 +++--- .../max/configuration-reference.en.md | 10 +- .../max/configuration-reference.es.md | 10 +- translations/max/configuration.en.md | 4 - translations/max/configuration.es.md | 4 - translations/max/mcp.en.md | 2 +- translations/max/mcp.es.md | 2 +- translations/max/permissions.en.md | 2 +- translations/max/permissions.es.md | 2 +- translations/max/profiles.en.md | 2 +- translations/max/profiles.es.md | 2 +- translations/max/remote.en.md | 10 +- translations/max/remote.es.md | 10 +- translations/max/sessions.en.md | 4 +- translations/max/sessions.es.md | 4 +- translations/max/usage.en.md | 7 +- translations/max/usage.es.md | 7 +- translations/sources.json | 46 ++++----- 37 files changed, 380 insertions(+), 163 deletions(-) create mode 100644 docs/reviews/2026-10-18-max-060-release.md diff --git a/content/docs/browser-apps.es.mdx b/content/docs/browser-apps.es.mdx index 0f329eb4..917ef22c 100644 --- a/content/docs/browser-apps.es.mdx +++ b/content/docs/browser-apps.es.mdx @@ -193,7 +193,7 @@ Después pide un borrador o, cuando quieras enviar, indica el destinatario y el ## Elegir qué puede hacer el agente El servidor puede hacer lo que permiten los permisos guardados del perfil. Para restringirlos solo en este proceso, -añade `--permission messages.send=deny` o `--permission messages=readonly` al comando de inicio; en `tg` la opción +añade `--permission messages.send=deny` o `--permission messages=readonly` al comando de inicio; la opción solo endurece, y una anulación que aflojaría el perfil se rechaza al iniciar. Para permitir el envío, cambia los permisos del perfil. La app controla sus aprobaciones. Por MCP, `ask` no fuerza una confirmación del servidor. Para solo leer, elige un perfil de solo lectura. diff --git a/content/docs/browser-apps.mdx b/content/docs/browser-apps.mdx index b82828ec..8b21fd5a 100644 --- a/content/docs/browser-apps.mdx +++ b/content/docs/browser-apps.mdx @@ -193,7 +193,7 @@ Then ask for a draft or, when you intend to send, name the recipient and exact t ## Choose what the agent may do The server can do what the profile's saved permissions allow. To narrow them for this running server only, add -`--permission messages.send=deny` or `--permission messages=readonly` to the startup command; in `tg` the flag only +`--permission messages.send=deny` or `--permission messages=readonly` to the startup command; the flag only tightens, and an override that would loosen the profile is refused at startup. To allow sending, change the profile's permissions. The app controls its own approval prompts. Over MCP, `ask` does not force a server confirmation. For a connection that only reads, use a read-only profile. diff --git a/content/docs/browser-apps.ru.mdx b/content/docs/browser-apps.ru.mdx index b5b5a914..6672af8b 100644 --- a/content/docs/browser-apps.ru.mdx +++ b/content/docs/browser-apps.ru.mdx @@ -194,7 +194,7 @@ tg personal mcp --http --port 8765 --public-url "$mcpPublicUrl" ## Выбрать права агента Сервер может делать то, что разрешают сохранённые права профиля. Чтобы сузить их только для этого процесса, добавьте -в команду запуска `--permission messages.send=deny` или `--permission messages=readonly`; в `tg` флаг только +в команду запуска `--permission messages.send=deny` или `--permission messages=readonly`; флаг только ужесточает, а переопределение, которое ослабило бы профиль, отклоняется при запуске. Чтобы разрешить отправку, измените права профиля. Приложение управляет собственными подтверждениями. Через MCP уровень `ask` не требует подтверждения сервера. Для подключения только на чтение выберите профиль с такими правами. diff --git a/content/docs/permissions.es.mdx b/content/docs/permissions.es.mdx index 02351036..26daaf99 100644 --- a/content/docs/permissions.es.mdx +++ b/content/docs/permissions.es.mdx @@ -57,9 +57,8 @@ Las instrucciones están en la seguridad de [Telegram](./tg/security.md) y [MAX] ## Cambiar temporalmente un servidor MCP Añade `--permission messages.send=deny` al inicio del servidor para impedir enviar durante -ese proceso. No cambia los ajustes guardados. En `tg` la opción solo endurece: una anulación que aflojaría el nivel -del perfil se rechaza al iniciar, así que para permitir más cambia los permisos del perfil. `max` todavía acepta un -nivel más permisivo para un proceso, como `--permission messages.send=allow`. Por MCP, `ask` no exige un formulario de confirmación en el servidor: la app +ese proceso. No cambia los ajustes guardados. La opción solo endurece: una anulación que aflojaría el nivel +del perfil se rechaza al iniciar, así que para permitir más cambia los permisos del perfil. Por MCP, `ask` no exige un formulario de confirmación en el servidor: la app controla sus aprobaciones y puede permitir otra llamada sin preguntar. Usa `deny` o `readonly` para impedir cambios. Consulta [la conexión web](./browser-apps.mdx). ## Límites y reglas detalladas diff --git a/content/docs/permissions.mdx b/content/docs/permissions.mdx index fdd78b92..bccc73a6 100644 --- a/content/docs/permissions.mdx +++ b/content/docs/permissions.mdx @@ -59,9 +59,8 @@ for the commands to manage these controls. ## A temporary change for an MCP server Add `--permission messages.send=deny` to the server startup command to refuse sending for that -process. Saved settings stay the same. In `tg` the flag only tightens: an override that would loosen the profile's -level is refused at startup, so to allow more, change the profile's permissions. `max` still accepts a looser level -for one process, such as `--permission messages.send=allow`. Over MCP, `ask` does not require a confirmation form on the server: the app controls +process. Saved settings stay the same. The flag only tightens: an override that would loosen the profile's +level is refused at startup, so to allow more, change the profile's permissions. Over MCP, `ask` does not require a confirmation form on the server: the app controls its own approvals and may allow a call without asking again. Use `deny` or `readonly` to refuse changes. [Browser setup](./browser-apps.mdx) explains the full connection. ## Limits and detailed rules diff --git a/content/docs/permissions.ru.mdx b/content/docs/permissions.ru.mdx index ff2c3ccd..eee0aadd 100644 --- a/content/docs/permissions.ru.mdx +++ b/content/docs/permissions.ru.mdx @@ -57,9 +57,8 @@ max support config set sends_per_hour 30 --bot ## Временно изменить права MCP-сервера Добавьте `--permission messages.send=deny` к запуску сервера, чтобы запретить отправку -этому процессу. Сохранённые настройки не меняются. В `tg` флаг только ужесточает: переопределение, которое ослабило -бы уровень профиля, отклоняется при запуске, поэтому, чтобы разрешить больше, измените права профиля. `max` пока -принимает более мягкий уровень для одного процесса, например `--permission messages.send=allow`. Через MCP уровень `ask` не требует формы подтверждения на сервере: +этому процессу. Сохранённые настройки не меняются. Флаг только ужесточает: переопределение, которое ослабило +бы уровень профиля, отклоняется при запуске, поэтому, чтобы разрешить больше, измените права профиля. Через MCP уровень `ask` не требует формы подтверждения на сервере: приложение управляет своими подтверждениями и может разрешить вызов без нового вопроса. Чтобы запретить изменения, используйте `deny` или `readonly`. [Настройка браузера](./browser-apps.mdx) объясняет подключение целиком. diff --git a/docs/release-notes-review.json b/docs/release-notes-review.json index 15f80d74..539054cc 100644 --- a/docs/release-notes-review.json +++ b/docs/release-notes-review.json @@ -6,10 +6,10 @@ "conclusion": "Reviewed Telegram0.69-0.71 with Core0.326.0/Base0.43.0: an agent can no longer delete for everyone; mcp --permission only tightens (a looser override is refused at startup, so shared browser and permission pages no longer start tg with messages.send=allow); TG_READ_ONLY also stops login/logout and store changes; contacts link me; fewer wrong mention names, own accounts linked, addresses keep their city; in a watch-tasks group any member's reply closes a question while a later non-reply closes nothing; bot MCP tools are the bot commands with their own snake_case arguments. Roadmap unchanged: multi-photo sending, private chat notes and listed MAX-only capabilities remain planned." }, "max": { - "version": "v0.58.0", + "version": "v0.60.0", "roadmapSha256": "f1628c3c19b2ea49f41fb57147b92bb0f9d29081ed577d1be3755a8a35b2a961", - "reviewedAt": "2026-10-17", - "conclusion": "Reviewed MAX0.57-0.58 with Core0.315.0/Base0.40.2: attachment provider credentials are removed from read/event output; protected WhatsApp state uploads are refused. Updated command references cover stored Drive links, tasks apply and first-pass settings, names/places, comma-separated deletes, and supported MAX-only flags. Search notes uses source query terms; configuration errors omit values and doctor can report invalid settings. Roadmap unchanged: optional local-copy mode, event actions, video circles/cloud password and standalone installers remain planned." + "reviewedAt": "2026-10-18", + "conclusion": "Reviewed MAX0.59-0.60 at c41c9ea with Core0.326.0/Base0.43.5: tasks open only where something was asked of you; tasks apply is tasks scan and tasks take an assignee; default_profile is no longer read and a profile is never assumed; mcp --permission only tightens and an agent never deletes for everyone; bot MCP tools are built from the bot commands; MAX_READ_ONLY refuses login/logout, bot writes and store changes. Shared Tasks, Permissions and browser pages and the command-rules block updated; defaultProfile correction retired. Roadmap unchanged." }, "zm": { "version": "v0.23.2", diff --git a/docs/reviews/2026-10-18-max-060-release.md b/docs/reviews/2026-10-18-max-060-release.md new file mode 100644 index 00000000..a437dda9 --- /dev/null +++ b/docs/reviews/2026-10-18-max-060-release.md @@ -0,0 +1,56 @@ +# MAX 0.60.0 release review: task rules, `tasks scan`, assignees, no default profile, `mcp --permission` only tightens + +Reviewer: Claude. Portal base: `6e31928`. +Reviewed runtime: MAX `v0.60.0`, commit `c41c9ea05df2de66132f6edb7ba87f8704f59855`, Core `0.326.0`, Base `0.43.5`. +Compared native guides and changelog against the previous pin `v0.58.0`, so this review covers 0.59.0–0.60.0. +Other runtime pins are unchanged. + +Readers of the MAX pages now learn that tasks open only where something was asked of them, that `tasks apply` is +`tasks scan` and a task has an assignee, that a profile is never assumed and `default_profile` is no longer read, +that `mcp --permission` only narrows a profile, that an agent never deletes for everyone, and what 0.59.0 and 0.60.0 +changed. The shared Tasks pages describe MAX's task rules as they are at this pin. + +## Evidence + +- MAX tagged diff `v0.58.0..v0.60.0`: `CHANGELOG.md` (0.59.0, 0.60.0), `docs/commands.md` (generated: profile + introduction without `defaultProfile`, `tasks scan`, `--assignee` on `tasks add` and `tasks plan`, + `contacts link … me`, `--transcribe` wording, `--permission` tightens), `docs/bot.md`, `docs/profiles.md`, + `docs/sessions.md`, `docs/usage.md`, `docs/configuration.md`, `docs/configuration-reference.md` (`default_profile` + gone), `docs/mcp.md`, `docs/permissions.md`, `docs/remote.md` (`--permission` only tightens; startup commands no + longer pass `messages.send=allow`; agent never deletes for everyone). `docs/roadmap.md` unchanged. `README.md` + changed but is not a portal page. +- The `v0.60.0` tag commit differs from `3e7a09e3` (the commit the Tasks claims were checked against in this PR) + only by max#720: the cli-base 0.43.0 → 0.43.5 bump, the lockfile and one test line. No source or docs change. +- cli-core `v0.326.0` `src/sends/permissions.ts:469`: a `--permission key=level` that would loosen the profile's + level is refused. + +## Reader paths + +| Page / locale | Changed fact | Result / owner | +| --- | --- | --- | +| tasks, tasks-architecture / EN, RU, ES | MAX task rules: where tasks open, `watch-tasks`, `tasks scan`, assignees, `serve` caveat | Reviewed / Claude | +| permissions / EN, RU, ES | Temporary MCP change: the flag only tightens in both tools; the "`max` still accepts a looser level" sentence removed | Reviewed / Claude | +| browser-apps / EN, RU, ES | "in `tg` the flag only tightens" now applies to both tools | Reviewed / Claude | +| Command rules block (`lib/command-rules.ts`) / EN, RU, ES | No `defaultProfile` setting: the profile comes from the first word or `_PROFILE` (tg and MAX) | Reviewed / Claude | +| max commands / EN, ES, RU | `tasks scan`, `--assignee`, profile introduction, `contacts link … me`, `--transcribe`, `--permission` | Reviewed / Claude | +| max bot, profiles, sessions, usage / EN, ES | Profile from the first word or `MAX_PROFILE` only | Reviewed / Claude | +| max configuration, configuration-reference / EN, ES | `default_profile` removed; key table says it is not read; `config unset default_profile`; `--permission` tightens | Reviewed / Claude | +| max mcp, permissions, remote / EN, ES | `--permission` only tightens; agent never deletes for everyone; startup commands without `messages.send=allow` | Reviewed / Claude | +| max changelog / EN, ES | 0.59.0 and 0.60.0 entries | Reviewed / Claude | +| max cli-contract / EN, ES | Versioned link moved to v0.60.0 | Reviewed / Claude | + +## Portal corrections + +- Removed: max/commands EN/RU/ES `defaultProfile` clause. The native introduction no longer has it at v0.60.0. + +## Remaining items + +- Native, cli-core: the `config set` / `config unset` setting list in the generated `commands.md` still includes + `default_profile` (same as tg at v0.71.0). +- Native, MAX: `serve` opens only auto-reply rule tasks; question and mention tasks open on the next sync or `review` + (`src/` never calls `applyTaskRulesOnArrival`). The Tasks pages state this caveat. +- The shared Mentions page was not re-read against the 0.60.0 name and address matching changes (Core 0.323.0). + +## Validation + +Portal check results are recorded in the PR. No account or message data was used. diff --git a/lib/command-rules.ts b/lib/command-rules.ts index 36039e60..6ad4da53 100644 --- a/lib/command-rules.ts +++ b/lib/command-rules.ts @@ -10,7 +10,7 @@ const messenger = (tool: string): Record => { shape: `${tool} [profile] [options] [arguments]`, items: [ "Resource first, then the action. The resource is what you work with: `chats`, `messages`, `contacts`. The action is what you do with it: `list`, `show`, `send`.", - `Name the profile as the first word: \`${tool} work chats list\` lists the chats of profile \`work\`. No profile is ever assumed: a command that needs an account and gets none from the first word, \`${tool.toUpperCase()}_PROFILE\` or the \`defaultProfile\` setting stops and lists your profiles, even when there is only one.`, + `Name the profile as the first word: \`${tool} work chats list\` lists the chats of profile \`work\`. No profile is ever assumed: a command that needs an account and gets none from the first word or \`${tool.toUpperCase()}_PROFILE\` stops and lists your profiles, even when there is only one.`, "Global options work with every command: `--json` for scripts and agents, `--dry-run` to check a command without running it, `--offline` to answer from the local copy only.", `A command that changes something is marked in the reference: “Changes something in ${name}” changes data in the messenger, “Changes something on this computer only” changes only files on this computer.`, "Permission levels can make a write ask for confirmation first. `--yes` gives that confirmation in advance.", @@ -22,7 +22,7 @@ const messenger = (tool: string): Record => { shape: `${tool} [профиль] [опции] <ресурс> <действие> [аргументы]`, items: [ "Сначала ресурс, потом действие. Ресурс — то, с чем вы работаете: `chats`, `messages`, `contacts`. Действие — что с ним сделать: `list`, `show`, `send`.", - `Называйте профиль первым словом: \`${tool} work chats list\` показывает чаты профиля \`work\`. Профиль никогда не подставляется сам: если команде нужен аккаунт, а профиль не задан ни первым словом, ни \`${tool.toUpperCase()}_PROFILE\`, ни настройкой \`defaultProfile\`, она останавливается и перечисляет ваши профили, даже если профиль один.`, + `Называйте профиль первым словом: \`${tool} work chats list\` показывает чаты профиля \`work\`. Профиль никогда не подставляется сам: если команде нужен аккаунт, а профиль не задан ни первым словом, ни \`${tool.toUpperCase()}_PROFILE\`, она останавливается и перечисляет ваши профили, даже если профиль один.`, "Общие параметры работают с любой командой: `--json` для скриптов и агентов, `--dry-run` для проверки без выполнения, `--offline` для ответа только из локальной копии.", `Команда, которая что-то меняет, отмечена в справочнике: «Changes something in ${name}» меняет данные в мессенджере, «Changes something on this computer only» меняет только файлы на этом компьютере.`, "Уровни разрешений могут требовать подтверждения перед записью. `--yes` даёт это подтверждение заранее.", @@ -34,7 +34,7 @@ const messenger = (tool: string): Record => { shape: `${tool} [perfil] [opciones] [argumentos]`, items: [ "Primero el recurso, después la acción. El recurso es aquello con lo que trabajas: `chats`, `messages`, `contacts`. La acción es lo que haces con él: `list`, `show`, `send`.", - `Indica el perfil como primera palabra: \`${tool} work chats list\` muestra los chats del perfil \`work\`. Nunca se asume un perfil: si un comando necesita una cuenta y no recibe perfil por la primera palabra, \`${tool.toUpperCase()}_PROFILE\` ni el ajuste \`defaultProfile\`, se detiene y muestra tus perfiles, aunque solo haya uno.`, + `Indica el perfil como primera palabra: \`${tool} work chats list\` muestra los chats del perfil \`work\`. Nunca se asume un perfil: si un comando necesita una cuenta y no recibe perfil por la primera palabra ni por \`${tool.toUpperCase()}_PROFILE\`, se detiene y muestra tus perfiles, aunque solo haya uno.`, "Las opciones globales funcionan con cualquier comando: `--json` para scripts y agentes, `--dry-run` para comprobar un comando sin ejecutarlo, `--offline` para responder solo desde la copia local.", `Un comando que cambia algo está marcado en la referencia: «Changes something in ${name}» cambia datos en el mensajero, «Changes something on this computer only» cambia solo archivos en este ordenador.`, "Los niveles de permisos pueden pedir confirmación antes de una escritura. `--yes` da esa confirmación por adelantado.", diff --git a/scripts/docs-corrections.json b/scripts/docs-corrections.json index eac5138a..fe46807f 100644 --- a/scripts/docs-corrections.json +++ b/scripts/docs-corrections.json @@ -579,7 +579,7 @@ { "tool": "max", "slug": "changelog", - "reason": "The source placeholders <слова>, <состояние> and <операция> are Russian; English and Spanish readers get placeholders in their language. Command tokens are unchanged.", + "reason": "The source placeholders <слова>, <состояние>, <операция> and <профиль> are Russian; English and Spanish readers get placeholders in their language. Command tokens are unchanged.", "replacements": { "en": [ { @@ -593,6 +593,14 @@ { "before": "`max bot api <операция>` calls", "after": "`max bot api ` calls" + }, + { + "before": "— `max <профиль> …` —", + "after": "— `max …` —" + }, + { + "before": "`max <профиль> messages delete --for-everyone`", + "after": "`max messages delete --for-everyone`" } ], "es": [ @@ -607,6 +615,14 @@ { "before": "`max bot api <операция>` ejecuta", "after": "`max bot api ` ejecuta" + }, + { + "before": "(`max <профиль> …`)", + "after": "(`max …`)" + }, + { + "before": "`max <профиль> messages delete --for-everyone`", + "after": "`max messages delete --for-everyone`" } ] } @@ -2163,30 +2179,5 @@ } ] } - }, - { - "tool": "max", - "slug": "commands", - "reason": "default_profile is gone: cli-core refuses to set it and a command always names its profile, so the defaultProfile setting no longer exists.", - "replacements": { - "en": [ - { - "before": ", and `defaultProfile` in the settings file sets it permanently (`max config set defaultProfile personal`).", - "after": "." - } - ], - "es": [ - { - "before": ", y `defaultProfile` en el archivo de configuración lo fija de forma permanente (`max config set defaultProfile personal`).", - "after": "." - } - ], - "ru": [ - { - "before": ", а `defaultProfile` в файле настроек — насовсем (`max config set defaultProfile personal`).", - "after": "." - } - ] - } } ] diff --git a/tools.json b/tools.json index d8fe5cc3..ba9666bb 100644 --- a/tools.json +++ b/tools.json @@ -9,7 +9,7 @@ "ru": "MAX в терминале: боты через официальный Bot API и ваш личный аккаунт.", "es": "MAX Messenger desde la terminal: bots con la Bot API oficial y tu cuenta personal." }, - "docsRef": "v0.58.0" + "docsRef": "v0.60.0" }, { "name": "tg", diff --git a/translations/max/bot.en.md b/translations/max/bot.en.md index 718e3fb9..95d62c6d 100644 --- a/translations/max/bot.en.md +++ b/translations/max/bot.en.md @@ -68,7 +68,7 @@ max support bot messages send user:4815162342 "Ваша заявка приня max sales bot list --check # все имена с токеном бота и какой бот за каждым ``` -A profile name is required: the first word, `MAX_PROFILE` for the whole shell session, or the `default_profile` setting. Without one, a bot command stops and lists the profiles. +A profile name is required: the first word or `MAX_PROFILE` for the whole shell session. Without one, a bot command stops and lists the profiles. ## Token storage @@ -316,7 +316,7 @@ max sales bot api answer-on-callback --callback-id f9LHodD0cOL5 --body '{"notifi max sales bot api send-message --user-id 4815162342 --body-file message.json ``` -Path and request parameters are flags, body is JSON in `--body`, `--body -` (from the pipe) or `--body-file`. `--body-file -` also reads stdin. The native parameter `timeout` is called `--poll-timeout`, and the global `--timeout` limits the entire command. The general option `--store-token ` is not available for current MAX methods: they all reject it before performing the operation. Before sending, the body is checked against the schema, and the error message contains the field and what was expected in it, without the value itself. A list of all operations and which ones read and which ones write is [Bot API coverage](https://github.com/WireCatLabs/max-cli/blob/v0.58.0/docs/dev/bot-api-coverage.md). +Path and request parameters are flags, body is JSON in `--body`, `--body -` (from the pipe) or `--body-file`. `--body-file -` also reads stdin. The native parameter `timeout` is called `--poll-timeout`, and the global `--timeout` limits the entire command. The general option `--store-token ` is not available for current MAX methods: they all reject it before performing the operation. Before sending, the body is checked against the schema, and the error message contains the field and what was expected in it, without the value itself. A list of all operations and which ones read and which ones write is [Bot API coverage](https://github.com/WireCatLabs/max-cli/blob/v0.60.0/docs/dev/bot-api-coverage.md). diff --git a/translations/max/bot.es.md b/translations/max/bot.es.md index 89fb15c3..42a6fcfc 100644 --- a/translations/max/bot.es.md +++ b/translations/max/bot.es.md @@ -71,7 +71,7 @@ max support bot messages send user:4815162342 "Ваша заявка приня max sales bot list --check # все имена с токеном бота и какой бот за каждым ``` -El nombre del perfil es obligatorio: la primera palabra, `MAX_PROFILE` para toda la sesión del terminal o el ajuste `default_profile`. Sin él, el comando del bot se detiene y enumera los perfiles. +El nombre del perfil es obligatorio: la primera palabra o `MAX_PROFILE` para toda la sesión del terminal. Sin él, el comando del bot se detiene y enumera los perfiles. ## Token @@ -319,7 +319,7 @@ max sales bot api answer-on-callback --callback-id f9LHodD0cOL5 --body '{"notifi max sales bot api send-message --user-id 4815162342 --body-file message.json ``` -Los parámetros de ruta y consulta son opciones; el cuerpo es JSON en `--body`, `--body -` (tubería) o `--body-file`. `--body-file -` también lee stdin. El parámetro nativo `timeout` se llama `--poll-timeout`; el global `--timeout` limita todo el comando. `--store-token ` no está disponible en los métodos MAX actuales: todos lo rechazan antes de ejecutar. Se valida el cuerpo contra el esquema y los errores muestran el campo y lo esperado, sin revelar su valor. Lista de operaciones y clasificación lectura/escritura: [cobertura Bot API](https://github.com/WireCatLabs/max-cli/blob/v0.58.0/docs/dev/bot-api-coverage.md). +Los parámetros de ruta y consulta son opciones; el cuerpo es JSON en `--body`, `--body -` (tubería) o `--body-file`. `--body-file -` también lee stdin. El parámetro nativo `timeout` se llama `--poll-timeout`; el global `--timeout` limita todo el comando. `--store-token ` no está disponible en los métodos MAX actuales: todos lo rechazan antes de ejecutar. Se valida el cuerpo contra el esquema y los errores muestran el campo y lo esperado, sin revelar su valor. Lista de operaciones y clasificación lectura/escritura: [cobertura Bot API](https://github.com/WireCatLabs/max-cli/blob/v0.60.0/docs/dev/bot-api-coverage.md). diff --git a/translations/max/changelog.en.md b/translations/max/changelog.en.md index bbf46dfe..e780a13d 100644 --- a/translations/max/changelog.en.md +++ b/translations/max/changelog.en.md @@ -4,6 +4,95 @@ title: "Changelog" Notable changes to `@wirecat/max-cli`, one section per version, newest first. Versions follow [Semantic Versioning](https://semver.org/lang/ru/); the command interface may still change before `1.0.0`. +## 0.60.0 — 17.10.2026 + +### Added + +- **`stats messages top --measure reactions` shows reactions by emoji** (cli-core 0.324.0): next to the total — + `👍 4 · 😂 3` (up to five emoji, then `+N`), and in `--json` each row has `reactions: [{reaction, count}]`. +- **`max contacts link me`** (cli-core 0.323.0): mark a contact as you, for an account of yours + that the store does not recognise by itself, such as `zoom:`. + +### Changed — may break scripts + +- **`max bot mcp` tools are now built from the `max bot` commands themselves** (cli-core 0.325.0) and run through + them. Arguments are named as the command's: `messages send` and `messages edit` take `md` / `html` instead of + `format`, `messages delete` a list `messages`, `search messages` `query`, `chats members remove` `person`. + New: `chats rules show`, `offline` on commands that read MAX, and the arguments `page`, `newest`, `notify`, + `no_block`, `sync_first`. A write at level `ask` is allowed for the agent: there is nobody to answer the question. +- **Not offered to the agent**: `session`, `setup`, `config`, `doctor report`, `bot uploads`, and + `--allow-dangerous` on `bot comments delete` and on `bot api`. Only the owner still runs them. + +### Fixed + +- **Mentions find fewer false names** (cli-core 0.323.0). A word from a contact's name counts on its own only as + a first or last name; a contact named like a company ("Smart Agents") is found only by the whole name, and the + polite «Ваш», «Вам», «Вас» never count. A saint's name in a place name ("Saint Michael's Bridge") and a city after + «в»/«во» («во Владимире») are not names either. +- **Your accounts are you** (cli-core 0.323.0): an account's own identity is linked to you on the next sync, and your + name in your messages no longer belongs to another person. +- **An address keeps its city** (cli-core 0.323.0): one street in two cities is two places; an address without a + city still finds its place on that street. +- **In a group tagged `watch-tasks`, any member's reply closes a question** (cli-core 0.325.0). A direct reply to the + question (a reply with a quote) from anyone other than the asker closes the task marked "answered in the group". + Before, only your reply closed it, and questions others had already answered stayed open. A message that does not + reply to the question closes nothing. In one-to-one chats and untagged groups only your reply still counts. + +After updating, re-read old messages once: `max mentions rebuild person-name place`. + +### Security + +- **`MAX_READ_ONLY` now refuses login and logout, writes as the bot and store changes**: `session start`, + `session end` and `setup` refuse with `permission_error` before connecting. So do `bot api` (every operation that + changes something, and `get-updates`), `bot comments send|edit|delete`, `bot chats members add`, + `bot uploads put`, and `store reset`, `restore`, `clear`, `migrate`, `repair`, `copies delete` and `decrypt`. + Before, `session end` under this guard logged out of MAX and forgot the session, and these bot commands sent a + request to MAX. `store repair --dry-run` under the guard still shows what would be repaired. +- **A Bot API write that max does not know how to journal is refused** with `configuration_error` instead of going + to MAX past the recipient list and the send journal. So an operation that a future Bot API schema update adds + cannot slip past the checks. Only `get-updates` passes without a journal: it sends nothing to anyone. + +## 0.59.0 — 17.10.2026 + +### Added + +- **A task has an assignee** (cli-core 0.320.0): `tasks add --assignee`, `tasks plan --assignee` and the + `assignee:` filter in `tasks list` — a task can also be something someone owes you. A group tagged `watch-tasks` + gets a task for every unanswered question, whoever it was asked of. + +### Changed — may break scripts + +- **No default profile is chosen any more** (cli-core 0.319.0). The `default_profile` setting is not read: + if it is still in the settings file, a command without a profile name stops and suggests what to type. + Name the profile as the first word — `max <профиль> …` — or set `MAX_PROFILE`, and remove the old setting: + `max config unset default_profile`. `max config set default_profile` now refuses. +- **A profile named `default` is an ordinary name.** `max default mcp config` names the MCP server `max-default`, + not `max`; an entry written earlier works until `mcp setup` rewrites it under the new name. +- **`tasks apply` is now `tasks scan`** (cli-core 0.320.0). The MCP tool is `tasks_scan`, the permission key + `tasks.scan`. It works the same: it shows which tasks a chat's history would open and creates them only with `--yes`. +- **An agent can no longer delete a message for everyone** (cli-core 0.321.0). The MCP tool `messages delete` does + not accept `for_everyone`: the argument is rejected as unknown. The owner still deletes for everyone with + `max <профиль> messages delete --for-everyone`. +- **`mcp --permission` only tightens permissions** (cli-core 0.321.0). An override that would loosen the profile's + level, such as `messages.send=allow` for a profile with `readonly`, is refused at server startup, naming the key. + To allow more, change the profile's permissions; `--permission messages.send=deny` and other narrowings work + as before. + +### Fixed + +- **Denying an agent `chats members list` now takes effect** (cli-core 0.321.0). Over MCP the command took its level + from the `chats.members` key, and a denial on `chats.members.list` did not reach it. +- **`tasks show HRB-12` shows a project task** (cli-core 0.320.0). Before, a task of a project rather than an + account was reported as not found. +- **Tasks open only where something was asked of you** (cli-core 0.317.0). In a one-to-one chat, as before, every + unanswered question; in a group only a reply to your message and a mention of you; in a channel and Saved + messages nothing. Before, any unanswered question in any chat became your task. +- **Editing a message does not erase what the edit lacks** (cli-core 0.317.0): the send time, reactions and service + fields of the stored message stay as they were. +- **`max bot mcp` tools respect the server's environment.** Before, a call bypassed the variables the server was + started with: for example, with `MAX_READ_ONLY=1` the bot still sent a message. Now a call over MCP behaves the + same as the same command in a terminal. + ## 0.58.0 — 17.10.2026 ### Security @@ -1356,7 +1445,7 @@ Commands follow one naming rule: subject first, then action. Old names no longer ### New -- **`max bot` uses the official Bot API.** `max bot auth set` verifies and stores its token separately in the keyring. Profiles go first: `max рабочий bot me`. `max bot me` shows the bot; `max bot api <операция>` calls any of 33 operations with parameter flags and JSON bodies, generated from the [official schema](https://github.com/WireCatLabs/max-cli/blob/v0.58.0/docs/dev/bot-api-coverage.md). IDs above 2^53 are strings; scripts must treat them accordingly. +- **`max bot` uses the official Bot API.** `max bot auth set` verifies and stores its token separately in the keyring. Profiles go first: `max рабочий bot me`. `max bot me` shows the bot; `max bot api <операция>` calls any of 33 operations with parameter flags and JSON bodies, generated from the [official schema](https://github.com/WireCatLabs/max-cli/blob/v0.60.0/docs/dev/bot-api-coverage.md). IDs above 2^53 are strings; scripts must treat them accordingly. - **Convenient bot commands.** `max <имя> bot messages send <чат> <текст>` sends to a chat by number, to a person as `user:<номер>`, or by the title of a chat the bot has seen; `edit`, `delete`, `list` and `get` are also available. `max <имя> bot chats list` shows chats the bot has seen, alongside `chats get|pin|unpin|leave|action`. `max bot list` shows every name with a bot token. Why “has seen”: MAX has no bot chat list, so `max` remembers chats itself. - **Bot recipients and logs:** `max <имя> bot recipients add|list|remove|off`, `max <имя> bot sends list`. Every write, including `bot api`, checks recipients. No hourly bot limit existed until 0.17.0. See [Bots](./bot.md). diff --git a/translations/max/changelog.es.md b/translations/max/changelog.es.md index 191b9c7f..25332669 100644 --- a/translations/max/changelog.es.md +++ b/translations/max/changelog.es.md @@ -4,6 +4,98 @@ title: "Historial de cambios" Cambios destacados de `@wirecat/max-cli`, con una sección por versión, recientes primero. Se utiliza [versionado semántico](https://semver.org/lang/ru/); antes de `1.0.0`, la interfaz de comandos todavía puede cambiar. +## 0.60.0 — 17.10.2026 + +### Novedades + +- **`stats messages top --measure reactions` muestra las reacciones por emoji** (cli-core 0.324.0): junto al total, + `👍 4 · 😂 3` (hasta cinco emoji, después `+N`), y en `--json` cada fila tiene `reactions: [{reaction, count}]`. +- **`max contacts link me`** (cli-core 0.323.0): marca que un contacto eres tú, para una cuenta tuya + que el archivo no reconoce por sí solo, como `zoom:`. + +### Cambios — pueden romper scripts + +- **Las herramientas de `max bot mcp` se construyen ahora a partir de los propios comandos `max bot`** (cli-core 0.325.0) + y se ejecutan a través de ellos. Los argumentos se llaman como en el comando: `messages send` y `messages edit` + aceptan `md` / `html` en lugar de `format`, `messages delete` una lista `messages`, `search messages` `query`, + `chats members remove` `person`. Se añaden `chats rules show`, `offline` en los comandos que leen MAX y los + argumentos `page`, `newest`, `notify`, `no_block`, `sync_first`. Una escritura con nivel `ask` está permitida al + agente: no hay nadie que responda a la pregunta. +- **No se ofrecen al agente**: `session`, `setup`, `config`, `doctor report`, `bot uploads`, ni `--allow-dangerous` + en `bot comments delete` y en `bot api`. Solo el propietario sigue ejecutándolos. + +### Correcciones + +- **Las menciones encuentran menos nombres falsos** (cli-core 0.323.0). Una palabra del nombre de un contacto cuenta + por sí sola solo como nombre o apellido; un contacto con nombre de empresa («Smart Agents») se encuentra solo por el + nombre completo, y los corteses «Ваш», «Вам», «Вас» nunca cuentan. El nombre de un santo en el nombre de un lugar + («Saint Michael's Bridge») y una ciudad después de «в»/«во» («во Владимире») tampoco son nombres. +- **Tus cuentas eres tú** (cli-core 0.323.0): la identidad propia de una cuenta se vincula contigo en la siguiente + sincronización, y tu nombre en tus mensajes ya no pertenece a otra persona. +- **Una dirección conserva su ciudad** (cli-core 0.323.0): una misma calle en dos ciudades son dos lugares; una + dirección sin ciudad sigue encontrando su lugar en esa calle. +- **En un grupo con la etiqueta `watch-tasks`, la respuesta de cualquier miembro cierra una pregunta** (cli-core + 0.325.0). Una respuesta directa a la pregunta (una respuesta con cita) de alguien que no sea quien preguntó cierra + la tarea con la marca «answered in the group». Antes solo la cerraba tu respuesta, y las preguntas que otros ya + habían respondido seguían abiertas. Un mensaje que no responde a la pregunta no cierra nada. En los chats + individuales y en los grupos sin la etiqueta sigue contando solo tu respuesta. + +Después de actualizar, vuelve a leer una vez los mensajes antiguos: `max mentions rebuild person-name place`. + +### Seguridad + +- **`MAX_READ_ONLY` ahora impide iniciar y cerrar sesión, escribir como bot y modificar el archivo**: `session start`, + `session end` y `setup` se niegan con `permission_error` antes de conectarse. También se niegan `bot api` (cada + operación que cambia algo, y `get-updates`), `bot comments send|edit|delete`, `bot chats members add`, + `bot uploads put`, así como `store reset`, `restore`, `clear`, `migrate`, `repair`, `copies delete` y `decrypt`. + Antes, `session end` bajo esta restricción cerraba la sesión en MAX y la olvidaba, y estos comandos del bot enviaban + una solicitud a MAX. `store repair --dry-run` bajo la restricción sigue mostrando lo que se repararía. +- **Una escritura en la Bot API que max no sabe registrar en el diario se rechaza** con `configuration_error`, en lugar + de llegar a MAX sin pasar por la lista de destinatarios ni el diario de envíos. Así, una operación que añada una + futura actualización del esquema de la Bot API no se salta las comprobaciones. Sin diario solo pasa `get-updates`: + no envía nada a nadie. + +## 0.59.0 — 17.10.2026 + +### Novedades + +- **Una tarea tiene responsable** (cli-core 0.320.0): `tasks add --assignee`, `tasks plan --assignee` y el filtro + `assignee:` en `tasks list`; una tarea también puede ser algo que alguien te debe. Un grupo con la etiqueta + `watch-tasks` recibe una tarea por cada pregunta sin respuesta, se le haya hecho a quien se le haya hecho. + +### Cambios — pueden romper scripts + +- **Ya no se elige un perfil por defecto** (cli-core 0.319.0). El ajuste `default_profile` no se lee: si sigue en el + archivo de configuración, un comando sin nombre de perfil se detiene e indica qué escribir. Nombra el perfil como + primera palabra (`max <профиль> …`) o define `MAX_PROFILE`, y elimina el ajuste antiguo: + `max config unset default_profile`. `max config set default_profile` ahora se niega. +- **Un perfil llamado `default` es un nombre normal.** `max default mcp config` llama al servidor MCP `max-default`, + no `max`; una entrada escrita antes funciona hasta que `mcp setup` la reescriba con el nuevo nombre. +- **`tasks apply` ahora es `tasks scan`** (cli-core 0.320.0). La herramienta MCP es `tasks_scan` y la clave de permiso, + `tasks.scan`. Funciona igual: muestra qué tareas abriría el historial de un chat y las crea solo con `--yes`. +- **Un agente ya no puede borrar un mensaje para todos** (cli-core 0.321.0). La herramienta MCP `messages delete` no + acepta `for_everyone`: ese argumento se rechaza como desconocido. El propietario sigue borrando para todos con + `max <профиль> messages delete --for-everyone`. +- **`mcp --permission` solo endurece los permisos** (cli-core 0.321.0). Una anulación que aflojaría el nivel del + perfil, como `messages.send=allow` para un perfil con `readonly`, se rechaza al iniciar el servidor indicando la + clave. Para permitir más, cambia los permisos del perfil; `--permission messages.send=deny` y otras restricciones + funcionan como antes. + +### Correcciones + +- **Prohibir al agente `chats members list` ahora surte efecto** (cli-core 0.321.0). Por MCP, el comando tomaba su + nivel de la clave `chats.members`, y una prohibición en `chats.members.list` no le llegaba. +- **`tasks show HRB-12` muestra una tarea de proyecto** (cli-core 0.320.0). Antes, una tarea de un proyecto, y no de + una cuenta, se daba por no encontrada. +- **Las tareas se abren solo donde se te ha preguntado algo** (cli-core 0.317.0). En un chat individual, como antes, + cada pregunta sin respuesta; en un grupo, solo una respuesta a tu mensaje y una mención tuya; en un canal y en + Mensajes guardados, nada. Antes, cualquier pregunta sin respuesta en cualquier chat se convertía en tu tarea. +- **Editar un mensaje no borra lo que la edición no incluye** (cli-core 0.317.0): la hora de envío, las reacciones y + los campos de servicio del mensaje guardado se mantienen. +- **Las herramientas de `max bot mcp` respetan el entorno del servidor.** Antes, una llamada ignoraba las variables + con las que se inició el servidor: por ejemplo, con `MAX_READ_ONLY=1` el bot enviaba el mensaje igualmente. Ahora + una llamada por MCP se comporta igual que el mismo comando en el terminal. + ## 0.58.0 — 17.10.2026 ### Seguridad @@ -1348,7 +1440,7 @@ Los comandos siguen una misma regla: primero el objeto y después la acción. Lo ### Novedades -- **`max bot` usa el Bot API oficial.** `max bot auth set` valida y guarda el token separado de la cuenta personal. Perfil primero: `max рабочий bot me`. `max bot me` muestra el bot; `max bot api <операция>` ejecuta las 33 operaciones con parámetros y cuerpo JSON, generadas desde la [especificación oficial](https://github.com/WireCatLabs/max-cli/blob/v0.58.0/docs/dev/bot-api-coverage.md). IDs mayores que 2^53 son cadenas para conservar dígitos; los scripts deben tratarlos así. +- **`max bot` usa el Bot API oficial.** `max bot auth set` valida y guarda el token separado de la cuenta personal. Perfil primero: `max рабочий bot me`. `max bot me` muestra el bot; `max bot api <операция>` ejecuta las 33 operaciones con parámetros y cuerpo JSON, generadas desde la [especificación oficial](https://github.com/WireCatLabs/max-cli/blob/v0.60.0/docs/dev/bot-api-coverage.md). IDs mayores que 2^53 son cadenas para conservar dígitos; los scripts deben tratarlos así. - **Comandos prácticos para bots.** `max <имя> bot messages send <чат> <текст>` envía a un chat por número, a una persona como `user:<номер>` o por el título de un chat que el bot ya ha visto; también hay `edit`, `delete`, `list` y `get`. `max <имя> bot chats list` muestra los chats que ha visto el bot; también están `chats get|pin|unpin|leave|action`. `max bot list` muestra todos los nombres con un token de bot. Por qué «que ha visto»: MAX no ofrece una lista de chats del bot, por lo que `max` los recuerda por su cuenta. - **Destinatarios y registro del bot.** `max <имя> bot recipients add|list|remove|off`, `max <имя> bot sends list`. Se comprueban todas las escrituras, incluidas `bot api`. Aún no hay límite por hora; llega en 0.17.0. Consulta [Bots](./bot.md). diff --git a/translations/max/cli-contract.en.md b/translations/max/cli-contract.en.md index 287043cd..7edcbe1b 100644 --- a/translations/max/cli-contract.en.md +++ b/translations/max/cli-contract.en.md @@ -97,6 +97,6 @@ Ask your agent to show the messages counted and the saved history coverage. An u ## Rules we follow -`max` follows applicable parts of [POSIX](https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap12.html), [GNU](https://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html) and [Command Line Interface Guidelines](https://clig.dev/), as well as [JSON Schema](https://json-schema.org/specification), [MCP](https://modelcontextprotocol.io/specification/2025-11-25/server/tools) and [Agent Skills](https://agentskills.io/specification). The [architecture](https://github.com/WireCatLabs/max-cli/blob/v0.58.0/docs/dev/ARCHITECTURE.md) and [shared CLI standard](https://github.com/WireCatLabs/cli-core/blob/main/docs/dev/STANDARD.md) explain how these apply and intentional exceptions. We do not claim full third-party certification. +`max` follows applicable parts of [POSIX](https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap12.html), [GNU](https://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html) and [Command Line Interface Guidelines](https://clig.dev/), as well as [JSON Schema](https://json-schema.org/specification), [MCP](https://modelcontextprotocol.io/specification/2025-11-25/server/tools) and [Agent Skills](https://agentskills.io/specification). The [architecture](https://github.com/WireCatLabs/max-cli/blob/v0.60.0/docs/dev/ARCHITECTURE.md) and [shared CLI standard](https://github.com/WireCatLabs/cli-core/blob/main/docs/dev/STANDARD.md) explain how these apply and intentional exceptions. We do not claim full third-party certification. See [configuration](./configuration.md) for setup steps and the [configuration reference](./configuration-reference.md) for all keys and environment variables. diff --git a/translations/max/cli-contract.es.md b/translations/max/cli-contract.es.md index a8d71e98..acce6a90 100644 --- a/translations/max/cli-contract.es.md +++ b/translations/max/cli-contract.es.md @@ -101,6 +101,6 @@ Pide al agente los mensajes que ha contado y cuánto historial tiene guardado. U ## Reglas que seguimos -`max` sigue las partes aplicables de [POSIX](https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap12.html), [GNU](https://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html), [Command Line Interface Guidelines](https://clig.dev/), [JSON Schema](https://json-schema.org/specification), [MCP](https://modelcontextprotocol.io/specification/2025-11-25/server/tools) y [Agent Skills](https://agentskills.io/specification). La [arquitectura](https://github.com/WireCatLabs/max-cli/blob/v0.58.0/docs/dev/ARCHITECTURE.md) y el [estándar CLI compartido](https://github.com/WireCatLabs/cli-core/blob/main/docs/dev/STANDARD.md) explican su aplicación y las excepciones deliberadas. No afirmamos disponer de certificación externa completa. +`max` sigue las partes aplicables de [POSIX](https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap12.html), [GNU](https://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html), [Command Line Interface Guidelines](https://clig.dev/), [JSON Schema](https://json-schema.org/specification), [MCP](https://modelcontextprotocol.io/specification/2025-11-25/server/tools) y [Agent Skills](https://agentskills.io/specification). La [arquitectura](https://github.com/WireCatLabs/max-cli/blob/v0.60.0/docs/dev/ARCHITECTURE.md) y el [estándar CLI compartido](https://github.com/WireCatLabs/cli-core/blob/main/docs/dev/STANDARD.md) explican su aplicación y las excepciones deliberadas. No afirmamos disponer de certificación externa completa. Configuración paso a paso: consulte [guía de configuración](./configuration.md); Todas las claves y variables de entorno se encuentran en el [referencia de configuración](./configuration-reference.md). diff --git a/translations/max/commands.en.md b/translations/max/commands.en.md index 4299a046..d67f4427 100644 --- a/translations/max/commands.en.md +++ b/translations/max/commands.en.md @@ -15,7 +15,7 @@ Command syntax: max [профиль] [опции] <команда> <действие> [аргументы] ``` -**The first word is a profile name** unless it matches a command name: `max personal chats list` reads chats for the `personal` profile. The `MAX_PROFILE` environment variable sets the profile for the whole shell session, and `defaultProfile` in the settings file sets it permanently (`max config set defaultProfile personal`). +**The first word is a profile name** unless it matches a command name: `max personal chats list` reads chats for the `personal` profile. The `MAX_PROFILE` environment variable sets the profile for the whole shell session. **A profile is never assumed**: without one, a command that needs an account stops and lists the profiles on this computer, even when there is only one. The first login names one too: `max personal setup`. Without a profile, only commands that need no account work: `--help`, `--version`, `commands`, `skill show`, `account list`, `config show`. ⚠ Command and option descriptions below match `max --help` exactly. They come from the program itself, ensuring that help and this reference stay consistent. @@ -1299,7 +1299,7 @@ max contacts link | Argument | | Meaning | |---|---|---| | `person` | required | their id, @username, or part of their name. | -| `other` | required | the same in another messenger of the store, as : — max:Ana. | +| `other` | required | the same in another messenger of the store, as : — max:Ana; me: it is you, as zoom: me. | ### `max contacts unlink` @@ -1336,7 +1336,7 @@ max messages list [query] [options] |---|---| | `--limit ` | how many. | | `--cursor ` | go on from where the last page stopped; page.next gives it. | -| `--transcribe` | turn voice messages not heard yet into text — by the messenger, or a model on this machine; can take minutes. | +| `--transcribe` | turn voice messages not heard yet into text — by the messenger where it can, else by a model on this machine; can take minutes. | | `--model ` | which downloaded speech model hears them, with --transcribe; `models audio list` shows them. | | `--mark-read` | also mark the chat read up to the newest message shown; the other person sees it. | @@ -2357,10 +2357,11 @@ max tasks add [options] | `--description ` | the detail, in Markdown: who owes whom, done when, next step, keywords. | | `--due