Repository navigation
Releases: WireCatLabs/tg-cli
Release list
0.71.0
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 mcptools are the bot commands themselves (cli-core 0.325.0): an agent's arguments are the
command's own, in snake_case —messages sendandmessages edittakemdorhtmlin place offormat,
messages deletetakesmessages(a list),search messagestakesquery,chats members removetakes
person. New:chats rules show, andofflineon every read. Sending files,--allow-dangerousand
chats moderate --max-actionsstay with the owner. The catalogue is pinned incontracts/bot-catalogue.snap.
0.70.0
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 aszoom:<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_ONLYnow stops logging in and out, and changes to the message store:session start,session end
andsetuprefuse withpermission_errorbefore they connect, and so dostore reset,restore,clear,
migrate,repair,copies deleteanddecrypt.session endused to log out and delete the session under the
lock.
0.69.0
Changed — may break scripts
- An agent can no longer delete for everyone (cli-core 0.321.0). The MCP
messages deletetakes no
for_everyone, and passing it is refused as an unknown argument; the owner still has
tg <profile> messages delete --for-everyone. mcp --permissiononly tightens (cli-core 0.321.0). An override that would loosen the profile's level, such as
messages.send=allowon a read-only profile, is refused at startup with the key it names; to allow more, change the
profile's permissions.--permission messages.send=denyand other narrowing overrides work as before.
Fixed
- An agent's deny on
chats send-asandchats members listnow applies (cli-core 0.321.0). Over MCP these
commands read their levels from other keys, sochats.send-asandchats.members.listdid not reach them.
0.68.0
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 applyis nowtasks scan(cli-core 0.320.0); MCPtasks_scan, permission keytasks.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 hasdefault_profilestops a command that names no profile, with the profile
to type andtg config unset default_profile;tg config set default_profileis refused. A profile calleddefault
is an ordinary name:tg default mcp confignames its servertg-default, nottg.
What's new
- Tasks have assignees (cli-core 0.320.0):
tasks addandtasks plantake--assignee sender(whoever sent
the message) or--assignee person:<id>;noneclears it.tasks list "assignee:any state:open"is what others
owe you. tg <profile> tags add --chat <group> watch-tasksrecords 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
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
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 mosttask_first_pass_per_chattasks per chat, and the default is 0. The sync answer'staskscounts
what it held back (held,held_chats), and a note namestasks apply. Later syncs still open tasks from new
messages.tg <profile> config set task_first_pass_per_chat 50brings 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 placeslists confirmed addresses across every account. The store moves to version 18,
with aplacestable, the first time a command opens it.
Fixed
tg upgradethrough pnpm installs the newest version (cli-base 0.40.2). pnpm 11 installs only versions a day
old, so the upgrade could install an oldertgthan the one you had. It now exempts@wirecat/*from that wait;
every other package keeps it.mentionshelp 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 Telegramlines 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--verbosenow. A request that fails still reports its own error.
0.65.0
What's new
- A closed task's card shows the task that follows it up (cli-core 0.305.0).
tasks showprints
task:<id> follow-up-of this task, and--jsonand MCP returnlinked_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 autoreads 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
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 autono 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'sapi_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 israte_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/releaserestarts itself once when the release brings a newerbin/release: folding the changelog and
raising the version both fast-forwardmain, 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 withrun it again. The restart also works when
bin/releasewas 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
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_CACHEmoves it):tg --helpwent 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, sectiontask_categories. It holds only your changes to the default list:
"garden": "plants | seedling, es:planta"adds or replaces a category,"religion": nulldrops a default one,
and categories a later release adds still arrive.tasks categories(MCPtasks_categories) names the file in
file, andconfig showmarks 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 byMESSAGING_STOREreads theconfig.jsonbeside it;
WIRECAT_CONFIG_DIRmoves the file.
Changed — may break scripts
config set task_categories.<name>andconfig unset task_categories.<name>now write
~/.config/WireCat/config.jsoninstead of the store, keeping the file's other sections;
config unset task_categoriesdrops the section. A list that an older tg saved in the store moves into the file
on the nextconfig setorunsetof a category; until then the store's list still applies. Older tg builds do
not read the file.
0.62.0
What's new
- An agent's close can wait for you (cli-core 0.295.0):
tasks closerun by an AI agent (AI_AGENTor
CLAUDECODEset) states its certainty with--certainty <0..1>. Below the store's threshold
(config set task_agent_close_min, 0.8 by default), or withconfig set task_agent_close off, the task stays open
with a close suggestion;tasks list close:suggestedandtasks agendashow it. Confirm it with
tasks close <task>or refuse it with the newtasks reject <task>.--as-ownercloses as you. - A new task about a task closed in the last 14 days opens as its follow-up, linked
follow-up-ofthe closed
one, instead of being refused as a duplicate. It is still refused while an open task may be the same job. tasks categoriesnames categories that left the list while tasks still carry them, with open and total
counts (unlisted);tasks agendalists the ones open tasks carry (unlisted_categories).
Changed — may break scripts
- An agent's
tasks closemust pass--certainty(MCPtasks_close: the requiredcertainty), or it fails
withtask.certainty-required. Below the threshold the answer hasstate: openandclose_suggestionset
instead of a closed task. A script run from an agent's terminal that closes tasks needs--certainty, or
--as-ownerwhen the owner asked for the close. tasks addmay 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,fitnessandsubscriptions;
tasks categoriesprints 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 isbills, notmoney. A filter such as
category:personaltherefore catches fewer new tasks. A store that saved its own list keeps it;
config unset task_categoriestakes 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
(pagueshitspagar), and the duplicate check reads Spanish due dates such asmañanaorel viernes.