Skip to content

Commit ab82ad9

Browse files
committed
Tag v0.1.0a19 (wait_for_text sees the entry cursor row)
Freeze the wait overhaul from the unreleased section into the dated 0.1.0a19 entry, and bump the package version across pyproject.toml, __about__.py, and uv.lock. The release carries breaking API changes -- `pattern` becomes `patterns`, `wait_for_content_change` is removed, `WaitForTextResult` reports an `outcome`, and the wait ceiling now applies to run_command and wait_for_channel as well -- so MIGRATION gains a 0.1.0a19 section covering each with before/after. That file had no unreleased heading to retitle; the section is new, matching the per-version shape 0.1.0a6 established.
1 parent a6e4117 commit ab82ad9

5 files changed

Lines changed: 66 additions & 3 deletions

File tree

CHANGES

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
_Notes on upcoming releases will be added here_
77
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->
88

9+
## libtmux-mcp 0.1.0a19 (2026-07-25)
10+
11+
libtmux-mcp 0.1.0a19 makes {tooliconl}`wait-for-text` see the output it was asked to watch for, and puts a ceiling under every wait. The tool anchored one row below the cursor's position at entry, which on a quiescent pane is exactly where the next line lands, so the case it exists for — output you did not author, a daemon printing a single `ready` line — could not match at all. Waits are now bounded by a server ceiling, cancellable without orphaning their tmux child, and report an `outcome` that distinguishes a command that never ran from output that did not match from a pager owning the pane. The wait API changes shape in the process: `pattern` becomes `patterns`, `stop` markers end a wait early, and `wait_for_content_change` is removed in favour of `wait_for_text(patterns=null)`.
12+
913
### Breaking changes
1014

1115
**{tooliconl}`wait-for-text` takes a list of patterns, and no wait outruns the

MIGRATION

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,65 @@ for the full release log.
1919
[tracker]: https://github.com/tmux-python/libtmux-mcp/discussions
2020
```
2121

22+
## libtmux-mcp 0.1.0a19 (2026-07-25)
23+
24+
### `wait_for_text` takes `patterns`, and `wait_for_content_change` is gone
25+
26+
`wait_for_text` accepted a single `pattern` string. It now takes `patterns`, a
27+
list — or `null` to wait for any new output at all. The schema rejects the old
28+
argument rather than silently ignoring it, so a call written against the old
29+
signature fails loudly with `Remove or correct the unrecognized argument(s):
30+
pattern`.
31+
32+
#### Before
33+
34+
```json
35+
{"tool": "wait_for_text", "arguments": {"pane_id": "%1", "pattern": "ready"}}
36+
```
37+
38+
#### After
39+
40+
```json
41+
{"tool": "wait_for_text", "arguments": {"pane_id": "%1", "patterns": ["ready"]}}
42+
```
43+
44+
`wait_for_content_change` and its `ContentChangeResult` are removed. Pass
45+
`patterns: null` instead — it waits for any new output and additionally
46+
excludes pre-existing scrollback and stale paint from the change predicate,
47+
which the old tool did not.
48+
49+
```json
50+
{"tool": "wait_for_text", "arguments": {"pane_id": "%1", "patterns": null}}
51+
```
52+
53+
### Waits are capped by the server
54+
55+
`wait_for_text`, `wait_for_channel`, and `run_command` are all bounded by
56+
`LIBTMUX_MCP_WAIT_MAX_SECONDS` (30 seconds by default, clamped to `[1, 120]`).
57+
An over-large `timeout` is **clamped, not rejected** — the call succeeds and
58+
reports the value actually enforced, so read `effective_timeout` rather than
59+
assuming your value was honoured. A wait that previously blocked for an hour
60+
now returns at the ceiling.
61+
62+
Raise the ceiling with the environment variable if your workload needs it, or
63+
call again — the command keeps running in the pane between calls.
64+
65+
### `WaitForTextResult` reports an `outcome`
66+
67+
The result's loose booleans are replaced by one `outcome` field taking
68+
`matched`, `any_output`, `stopped`, `alternate_screen`, or `timeout`.
69+
`risk_band_warned` is removed; the history-limit trim signal is delivered as an
70+
MCP warning notification instead. Clients that cannot surface notifications
71+
should compose `tmux wait-for -S` into the command and use `wait_for_channel`,
72+
which does not read the pane at all.
73+
74+
### Self-bounded tools cannot be batched
75+
76+
`run_command`, `wait_for_text`, and `wait_for_channel` are rejected by the
77+
batch wrappers per operation, because batching one multiplied the wait ceiling
78+
by the operation count. Use `send_keys_batch` for command sequences, or call
79+
the tool directly.
80+
2281
## libtmux-mcp 0.1.0a6 (2026-05-09)
2382

2483
### Recommended registration slug: `libtmux` → `tmux`

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "libtmux-mcp"
3-
version = "0.1.0a18"
3+
version = "0.1.0a19"
44
description = "MCP server for tmux, powered by libtmux"
55
requires-python = ">=3.10,<4.0"
66
authors = [

src/libtmux_mcp/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
__title__ = "libtmux-mcp"
66
__package_name__ = "libtmux_mcp"
7-
__version__ = "0.1.0a18"
7+
__version__ = "0.1.0a19"
88
__description__ = "MCP server for tmux, powered by libtmux"
99
__author__ = "Tony Narlock"
1010
__email__ = "tony@git-pull.com"

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)