Skip to content

Releases: WireCatLabs/tg-cli

0.71.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 22:04
6bdf8bd

Changed — may break callers

  • In a group tagged watch-tasks, any member's reply closes a question (cli-core 0.325.0): a direct reply from
    someone other than the asker settles it; a later message that does not reply closes nothing.
  • tg <bot> bot mcp tools are the bot commands themselves (cli-core 0.325.0): an agent's arguments are the
    command's own, in snake_case — messages send and messages edit take md or html in place of format,
    messages delete takes messages (a list), search messages takes query, chats members remove takes
    person. New: chats rules show, and offline on every read. Sending files, --allow-dangerous and
    chats moderate --max-actions stay with the owner. The catalogue is pinned in contracts/bot-catalogue.snap.

0.70.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 15:07
7883848

Added

  • tg <profile> contacts link <person> me (cli-core 0.323.0): say that a contact is you — for an account of
    yours the store cannot match by itself, such as zoom:<id>.

Fixed

  • Mentions find fewer wrong names (cli-core 0.323.0). A word of a contact's name counts on its own only as a first
    name or a surname; 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 («Saint Michael's Bridge») and a city after «в»/«во»
    («во Владимире») are not names either.
  • Your own accounts are you (cli-core 0.323.0): an account's own identity is linked to you on its next sync, so your
    name in your messages is no longer someone else's.
  • An address keeps its city (cli-core 0.323.0): the same street in two cities is two places; an address written
    without a city still matches its place on that street.

After updating, read old messages again once: tg <profile> mentions rebuild person-name place.

Security

  • TG_READ_ONLY now stops logging in and out, and changes to the message store: session start, session end
    and setup refuse with permission_error before they connect, and so do store reset, restore, clear,
    migrate, repair, copies delete and decrypt. session end used to log out and delete the session under the
    lock.

0.69.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 13:00
b2a41aa

Changed — may break scripts

  • An agent can no longer delete for everyone (cli-core 0.321.0). The MCP messages delete takes no
    for_everyone, and passing it is refused as an unknown argument; the owner still has
    tg <profile> messages delete --for-everyone.
  • mcp --permission only tightens (cli-core 0.321.0). An override that would loosen the profile's level, such as
    messages.send=allow on a read-only profile, is refused at startup with the key it names; to allow more, change the
    profile's permissions. --permission messages.send=deny and other narrowing overrides work as before.

Fixed

  • An agent's deny on chats send-as and chats members list now applies (cli-core 0.321.0). Over MCP these
    commands read their levels from other keys, so chats.send-as and chats.members.list did not reach them.

0.68.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 12:17

Changed — may break scripts

  • Tasks open only where something is asked of you (cli-core 0.318.0). In a one-to-one chat every question
    you did not answer opens one, as before; in a group only a question in reply to your message and a mention of
    you; in a channel or Saved Messages nothing. On the owner's store, 300 posts of one channel would have opened 85.
  • tasks apply is now tasks scan (cli-core 0.320.0); MCP tasks_scan, permission key tasks.scan.
  • No setting picks a profile any more (cli-core 0.319.0). A command names its profile with the first word or
    TG_PROFILE. A config file that still has default_profile stops a command that names no profile, with the profile
    to type and tg config unset default_profile; tg config set default_profile is refused. A profile called default
    is an ordinary name: tg default mcp config names its server tg-default, not tg.

What's new

  • Tasks have assignees (cli-core 0.320.0): tasks add and tasks plan take --assignee sender (whoever sent
    the message) or --assignee person:<id>; none clears it. tasks list "assignee:any state:open" is what others
    owe you.
  • tg <profile> tags add --chat <group> watch-tasks records every question in that group as a task, whoever it
    is for.

Fixed

  • tg upgrade's "held back" hint names the package and keeps pnpm's release-age exemption (cli-core 0.320.0).

0.67.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 10:40
da792c6

Security

  • Internal attachment references stay out of JSON, JSON lines, MCP and live-event output (Core0.315.0); provider media keys and credentials remain inside the client.

  • WhatsApp state files cannot be uploaded as attachments (Core 0.314.0), including configured state paths and symbolic links. Ordinary neighbouring files remain allowed.

0.66.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 01:46
a0282d6

Changed — may break scripts

  • The first sync opens no task from history (cli-core 0.309.0). After an account's first sync, the task rules
    open at most task_first_pass_per_chat tasks per chat, and the default is 0. The sync answer's tasks counts
    what it held back (held, held_chats), and a note names tasks apply. Later syncs still open tasks from new
    messages. tg <profile> config set task_first_pass_per_chat 50 brings back the old behaviour.

What's new

  • tg <profile> tasks apply <chat...> (cli-core 0.309.0): the task rules over a chat's newest stored messages
    (--last, 50 by default), for a chat whose history you want as tasks. It lists what would open and changes
    nothing unless --yes. Local store only. MCP: tasks_apply.

  • Mentions find street addresses, and names of people the store does not know yet (cli-core 0.308.0).
    tg <profile> mentions places lists confirmed addresses across every account. The store moves to version 18,
    with a places table, the first time a command opens it.

Fixed

  • tg upgrade through pnpm installs the newest version (cli-base 0.40.2). pnpm 11 installs only versions a day
    old, so the upgrade could install an older tg than the one you had. It now exempts @wirecat/* from that wait;
    every other package keeps it.
  • mentions help summaries fit the shared 80-character limit (cli-core 0.311.0).
  • The duplicate check compares tasks by when their messages were sent (cli-core 0.310.0), not by when a task
    was written. Tasks written from history in one go no longer all look alike.
  • Old messages fetched into a quiet chat open no tasks (cli-core 0.309.0): a sync pass skips a chat with
    nothing sent since the last one.
  • No [client] cannot reach Telegram lines while tg cannot connect. 0.64.0 began printing each of mtcute's
    background errors as one line; while the network is down, that is one line per connection attempt. They show only
    with --verbose now. A request that fails still reports its own error.

0.65.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 00:25
148e691

What's new

  • A closed task's card shows the task that follows it up (cli-core 0.305.0). tasks show prints
    task:<id> follow-up-of this task, and --json and MCP return linked_from. Before, only the new task named the
    closed one.

Changed — may break scripts

  • The daily "a newer version exists" line also stays quiet for --json=…, --timeout=… and the other quiet options
    written with =
    (cli-core 0.307.0). Before, only the bare option silenced it. tg now takes this notice from
    cli-core, shared with max and memo.

Fixed

  • tg setup --app auto reads the app keys from the redesigned my.telegram.org. The site now shows the
    api_hash as dots and keeps its value in the page's copy and show buttons, so 0.64.0 stopped with "could not read
    its keys". The keys are read from there now (checked on the real page), a create counts as done when the site
    answers OK, and the site's own error text is shown instead of its JSON.

  • A broken config file is named in a short error (cli-core 0.304.0): the first bad key, never its value.

0.64.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 20:56
7cc0c1b

What's new

  • Imported Drive documents retain their Google URL and edit time in shared search (cli-core 0.301.0). --source drive:<profile> selects a registered Drive profile; chat document lists can show the imported title after Drive sync links the stored messages.

  • The MCP server loads only when MCP is served (cli-core 0.300.0), so other commands start with about a tenth
    fewer files to load.

Fixed

  • tg setup --app auto no longer tries to create a second app when the account already has one. It read the
    app's keys only from one exact page layout; when my.telegram.org showed the app's page in another shape, it took
    the account for one with no app and asked the site to create another (Telegram allows one per number). Keys are
    now read from the page's text, and an app page whose keys cannot be read stops with "use --app browser". An
    error from the site no longer quotes a whole page — which could hold the app's api_hash — only its title. The
    hint after a failed app step names the command that was run (tg <profile> setup --app browser), and too many
    tries at the site's code is rate_limited.

  • A login with a 2FA password no longer prints mtcute's "unhandled error: ConnectionClosedError" stack. When a
    login succeeds, mtcute replaces its connections on purpose. The old connection then reported itself closed, and with no
    listener mtcute printed that as a red stack trace, with the account id, right after the hidden password prompt.
    tg now listens for these background errors: the expected close shows only with --verbose, and any other appears
    as one line in tg's own words.

  • bin/release restarts itself once when the release brings a newer bin/release: folding the changelog and
    raising the version both fast-forward main, and the shell went on reading the old script from the byte it had
    reached, so the rest of the run was a mix of old and new text. It now starts the new script over with the same
    arguments; a second change during that run stops it with run it again. The restart also works when
    bin/release was started from another folder by a relative path. Only the repository's own release is affected;
    the published package does not change.

0.63.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 16:05
9984e59

What's new

  • tg starts about a fifth faster after its first run. It keeps Node's compiled code in a cache, in the
    system's temporary folder (NODE_COMPILE_CACHE moves it): tg --help went from about 0.60 to 0.49 seconds.
  • The task category list lives in one file tg, MAX and memo share (cli-core 0.298.0):
    ~/.config/WireCat/config.json, section task_categories. It holds only your changes to the default list:
    "garden": "plants | seedling, es:planta" adds or replaces a category, "religion": null drops a default one,
    and categories a later release adds still arrive. tasks categories (MCP tasks_categories) names the file in
    file, and config show marks the categories that come from it. A file that is not valid JSON or names a bad
    category is refused with its path. A store moved by MESSAGING_STORE reads the config.json beside it;
    WIRECAT_CONFIG_DIR moves the file.

Changed — may break scripts

  • config set task_categories.<name> and config unset task_categories.<name> now write
    ~/.config/WireCat/config.json instead of the store
    , keeping the file's other sections;
    config unset task_categories drops the section. A list that an older tg saved in the store moves into the file
    on the next config set or unset of a category; until then the store's list still applies. Older tg builds do
    not read the file.

0.62.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 13:52
4bb5ee1

What's new

  • An agent's close can wait for you (cli-core 0.295.0): tasks close run by an AI agent (AI_AGENT or
    CLAUDECODE set) states its certainty with --certainty <0..1>. Below the store's threshold
    (config set task_agent_close_min, 0.8 by default), or with config set task_agent_close off, the task stays open
    with a close suggestion; tasks list close:suggested and tasks agenda show it. Confirm it with
    tasks close <task> or refuse it with the new tasks reject <task>. --as-owner closes as you.
  • A new task about a task closed in the last 14 days opens as its follow-up, linked follow-up-of the closed
    one, instead of being refused as a duplicate. It is still refused while an open task may be the same job.
  • tasks categories names categories that left the list while tasks still carry them, with open and total
    counts (unlisted); tasks agenda lists the ones open tasks carry (unlisted_categories).

Changed — may break scripts

  • An agent's tasks close must pass --certainty (MCP tasks_close: the required certainty), or it fails
    with task.certainty-required. Below the threshold the answer has state: open and close_suggestion set
    instead of a closed task. A script run from an agent's terminal that closes tasks needs --certainty, or
    --as-owner when the owner asked for the close.
  • tasks add may now refuse a task whose message shares words with an open task's message (exit code 2,
    task.duplicate-candidates): the duplicate check also reads a task's source message and its newest linked
    messages, so a rule's task with an empty title is compared by its message. Repeat with --into <task> or --new.
  • 59 default task categories instead of 7, such as bills, health, travel, fitness and subscriptions;
    tasks categories prints each with its meaning and trigger words. The old seven keep their names, so stored
    tasks stay valid, but a rule now picks the narrower name: a utility bill is bills, not money. A filter such as
    category:personal therefore catches fewer new tasks. A store that saved its own list keeps it;
    config unset task_categories takes the new default. A list holds up to 80 categories.

Fixed

  • Spanish task text is read better: a rule's category matches other forms of a Spanish trigger word
    (pagues hits pagar), and the duplicate check reads Spanish due dates such as mañana or el viernes.