teamctl 0.10.0
A big one. This release makes your team's state legible across the whole machine, gives the Telegram bot a proper visual voice, and finally lands real cost tracking β plus a long tail of crash-loop fixes and TUI polish.
Rich Telegram messages, on by default. Your managers' messages now render with real formatting β tables, headings, lists, fenced code, and block quotes appear natively in Telegram instead of as flattened text. Threaded replies keep their threading (and still render bold, italic, code, lists, and links); if a rich send ever fails it transparently falls back to plain HTML, so nothing gets dropped. Prefer the old behavior? --no-rich-messages (or TEAMCTL_TELEGRAM_NO_RICH=1) turns it off.
System-wide team state. teamctl ps now lists every running team and its working directory from anywhere on the machine β no compose root required. The same registry powers two safety wins: orphaned tmux sessions get reaped when you remove an agent and run down/reload, and a same-name launch guard stops two projects with the same id from aliasing each other's sessions before any damage is done. The old per-agent table now lives under teamctl status.
Real per-turn cost tracking. teamctl budget used to always read $0.00. Now a Stop hook prices each finished turn from the session transcript and records it, so teams running opus, sonnet, or haiku see real USD figures immediately.
A sharper TUI and fewer crash-loops. The mailbox collapses to a single time-ordered Inbox plus Sent, stream-keys typing is now lag-free and gives the detail pane near-full height, and idle panes stop burning CPU on redundant captures. Under the hood, the agent wrapper now self-heals failed session resumes instead of respawning into the same failure every five seconds.
To upgrade: run teamctl update (or reinstall via the install script), then teamctl whatsnew --since 0.9.1 for the full list.
Release Notes
Added
- Rich Telegram messages are now on by default β the bot renders tables, headings, lists, fenced code, and block quotes natively via Bot API 10.1
sendRichMessage. Replies still use the HTML sender to preserve threading, and any rich-send failure transparently falls back to HTML so no message is ever dropped. Set--no-rich-messages(orTEAMCTL_TELEGRAM_NO_RICH=1) to revert to plain HTML. (#484, #488) - Inbound reply and quote context β when a user tap-replies or hold-quotes an earlier Telegram message, the bot prefixes the inbound mailbox body with a Markdown blockquote naming the sender and the quoted text, so the agent sees what the message refers back to. Plain messages are forwarded unchanged. (#444)
- Boot-context wake notice on every session start β a managed
SessionStarthook tells a freshly launched or resumed pane which transition just happened (startup, resume, cleared context, or compacted) with a UTC timestamp; the hook script is written and kept current automatically onteamctl up. Agents also receive a coarse downtime sentence on startup (e.g. "You were down for about 2 hours") and a re-anchor note after a context compaction reminding them to re-read their working files. (#436, #443) teamctl reload --forcerestarts every in-scope agent regardless of whether its config fingerprint changed, giving operators a clean bounce after a host restart or suspected hung state without resorting todown+up. It composes with--freshand--dry-run; forced agents render asreloaded Β· <id> (forced). (#438)- Per-agent
ultracodeopt-in inteam-compose.yamlβ setultracode: trueon an agent to enable Claude Code's ultracode orchestration mode for it. The key is injected into that agent's rendered settings only and is ignored (with a warning) on non-Claude runtimes. (#464) teamctl rl-hitsubcommand records a rate-limit hit from a Claude CodeStopFailurehook, giving headless agents (not wrapped in therl-watchPTY) a durable rate-limit signal the TUI can observe. (#441)- Guide to existing MCP servers β a curated, operator-facing catalog of 10 community and Anthropic MCP servers usable in a per-agent
mcps:block today, each with a paste-ready stdio snippet and an honest validated-vs-desk-checked verification badge. (#452)
Changed
teamctl psis now system-wide, listing every running team and its working directory from anywhere, with no compose root required. The project-local per-agent table previously reached viapsis now its ownteamctl statuscommand; both support--json. (#475)- TUI mailbox collapses to Inbox and Sent tabs β inbound DMs, channel posts, and wire broadcasts now merge into a single time-ordered, deduplicated Inbox (with
[#channel]labels), replacing the previous four-tab split by channel type; everything the agent sent stays under Sent. (#465) - Detail pane grows and Mailbox shrinks in stream-keys mode β entering stream-keys expands the Detail pane to near-full height and collapses the Mailbox to a compact strip for maximum room to watch live output; the normal 60/40 split restores on exit. (#463)
- Stream-keys input is now realtime β forwarded keystrokes are enqueued on a background worker instead of blocking the render loop on each
tmux send-keyscall, eliminating per-keystroke typing lag. Keys are still delivered in arrival order and flushed on quit, and the idle redraw cadence tightens from 50ms to 33ms for snappier refreshes. (#440) - Focused-pane detail view skips redundant captures when a pane is idle β a cheap tmux activity probe gates the heavy 3,000-line scrollback capture, so an idle detail pane no longer re-captures ten times a second, cutting CPU while keeping output fresh when it is actually flowing. (#454)
- Per-agent rate-limit indicator on by default β the TUI status-bar indicator is now enabled by default; set
TEAMCTL_UI_RATE_LIMIT_INDICATOR=0to opt out. (#441) - Agents are guided to carry
thread_idforward on replies β thedmandreply_to_usertool descriptions and the MCPinitializeinstructions now frame carrying the inboundthread_idas the default for replies, so multi-agent conversations stay threaded instead of fragmenting. (#450) - Quieter post-update output β
teamctl updateno longer dumps the whole changelog after upgrading; it prints a single nudge with a pre-filledteamctl whatsnew --since <old>command so the release notes are one copy-paste away on demand. (#445) - Runtime docs match Claude Code's resume-if-exists behavior β the runtimes pages now describe how the wrapper creates a session with
--session-idon first spawn and attaches with--resumeon later spawns, self-healing back to--session-idif the session file is removed. (#451)
Fixed
teamctl budgetnow records real cost instead of always reporting$0.00β the budget table had a reader and a schema but nothing ever wrote rows, so the cost column was permanently zero. A Claude Code Stop hook now parses each finished turn's token usage from the session transcript, prices it, and writes a cost row; teams running opus/sonnet/haiku get real figures immediately (unknown models price to $0 until their rate is added). (#455)- Orphaned agent sessions are reaped on
downandreloadβ when an agent is removed from a team's YAML, its leftover tmux session is now drained instead of being left running forever. (#476) - Same-name launch guard stops
teamctl upandteamctl reloadbefore any side effects when a project with the sameproject_idis already running from a different folder, naming the conflicting directory and how to resolve it instead of letting the teams alias each other's sessions and crash-loop. (#482) - Agent wrapper self-heals resume failures β when a session resume exits non-zero, it retries once immediately with a fresh cwd-scoped session id instead of respawning into the same failing
--resumeevery five seconds, so a session-id collision can no longer become a permanent crash-loop. (#472) - Unique session IDs per install of the
ideate-and-buildtemplate β the template no longer hard-codesproject.id: main, so installing it twice in different folders no longer produces colliding session UUIDs that silently resume the wrong team's sessions and crash-loop. (#470) - Detail pane stays live during fast activity β fixes a regression where the detail view froze at roughly 1Hz while typing quickly in stream-keys mode or watching a rapidly streaming pane; it now refreshes at the full tick rate during bursts while preserving the idle-CPU savings. (#460)
- NO_COLOR is now honored everywhere β the root-source warning, the bot-setup wizard, and the
teamctl initteam-structure preview now emit plain text underNO_COLORor when piped, closing the last ANSI gaps in the CLI. (#448) - Voice messages confirm their route β after a voice note is transcribed and lands in the mailbox, the Telegram bot now echoes the
β {manager}routing target, so operators see that the transcript actually reached an agent. (#446) - Trailing comments survive YAML edits β programmatic edits such as
teamctl bot setup --forceno longer delete operator comments and blank lines that follow a replaced block when that block is the last one in the file. (#442) - Corrected
versionfield docs forteam-compose.yamlβ the reference now distinguishes the global semverversion: "2.0.0"from the per-project integerversion: 2, and fixes a per-project example that previously failed to parse. (#457)
Internal
- Durable system-wide team registry β
teamctl uprecords each running team's project id and root path to~/.config/teamctl/teams.jsonanddownclears it; the plumbing under system-wideps, orphan reaping, and the same-name guard. (#471) - Local and publish-side MSRV floor guard β a
just msrv-checkrecipe and a pre-publish CI step build the shipped CLI crate on the declared Rust 1.86 floor, so a release cannot ship a crate that no longer compiles on its advertised minimum. (#453) - Registry round-trip test no longer depends on the shipped
ideate-and-buildtemplate, using a self-contained inline compose fixture. (#474) - Pinned the read-only-filesystem graceful degrade for legacy
version: 2rewrites with a unix anti-regression test; no production logic changes. (#449)
team-bot 0.10.0
Install team-bot 0.10.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Alireza29675/teamctl/releases/download/v0.10.0/team-bot-installer.sh | shDownload team-bot 0.10.0
| File | Platform | Checksum |
|---|---|---|
| team-bot-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| team-bot-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| team-bot-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| team-bot-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
team-mcp 0.10.0
Install team-mcp 0.10.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Alireza29675/teamctl/releases/download/v0.10.0/team-mcp-installer.sh | shDownload team-mcp 0.10.0
| File | Platform | Checksum |
|---|---|---|
| team-mcp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| team-mcp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| team-mcp-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| team-mcp-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
teamctl 0.10.0
Install teamctl 0.10.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Alireza29675/teamctl/releases/download/v0.10.0/teamctl-installer.sh | shDownload teamctl 0.10.0
| File | Platform | Checksum |
|---|---|---|
| teamctl-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| teamctl-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| teamctl-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| teamctl-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
teamctl-ui 0.10.0
Install teamctl-ui 0.10.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Alireza29675/teamctl/releases/download/v0.10.0/teamctl-ui-installer.sh | shDownload teamctl-ui 0.10.0
| File | Platform | Checksum |
|---|---|---|
| teamctl-ui-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| teamctl-ui-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| teamctl-ui-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| teamctl-ui-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |