Repository navigation
Conversation
tony
force-pushed
the
bump-min-tmux-001
branch
from
October 17, 2026 12:34
f795558 to
0b2d32c
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## bump-min-tmux-000 #140 +/- ##
=====================================================
+ Coverage 86.52% 86.73% +0.21%
=====================================================
Files 46 46
Lines 4053 4057 +4
Branches 606 607 +1
=====================================================
+ Hits 3507 3519 +12
+ Misses 381 374 -7
+ Partials 165 164 -1 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
tony
force-pushed
the
bump-min-tmux-000
branch
from
October 17, 2026 12:40
39cc1a7 to
918119a
Compare
tony
force-pushed
the
bump-min-tmux-001
branch
from
October 17, 2026 12:40
0b2d32c to
268e3cc
Compare
why: Matching package versions do not identify the new guards. what: - Pin the published policy-2 source in project metadata and lock. - Retain the matching package range and other locked dependencies.
why: MCP-owned children bypass parent methods, and paste needs a safe
cleanup path before it creates a native buffer.
what:
- Require policy 2 before helper version checks and forward literal checks.
- Carry optional minimums within existing owned-child time budgets.
- Require 3.4 for nonempty managed paste before native staging.
- Keep empty paste and ordinary buffer operations on tmux 3.3a.
- Exercise refusal, unchanged user buffers and retained layout behavior.
why: Tool availability depends on its operation and the daemon's version. what: - Document individual buffer, output and layout requirements. - Explain the coordinated policy-2 source installation.
why: Callers need the operation-specific compatibility changes. what: - Record optional refusal, safe cleanup and retained baseline behavior.
load_buffer stages a named libtmux_mcp_* buffer. On a 3.3a daemon delete_buffer is refused (exact named deletion needs 3.4) and paste_buffer has no delete-after path, so every call left a buffer the agent could not remove, and tmux limits only automatic buffers, so repeated calls grew the daemon without bound. Contract 0002 asks to check staging before creating state whose cleanup cannot be guaranteed: give load_buffer the same 3.4 minimum paste_text has, so an older daemon refuses before the buffer exists. Tests: workflows that stage a buffer skip below 3.4; the dedicated test asserts the refusal and that only the user's buffer remains on 3.3a, and the stage-read-delete path on 3.4 and newer. Removing the minimum fails the 3.3a test with DID NOT RAISE.
libtmux no longer exposes an integer policy marker; the owned helpers need libtmux._internal.support.require_commands. A backend without it is refused before any native child starts, with LibTmuxException. The staging test now asserts that no buffer is created on a daemon that cannot delete it.
load_buffer is no longer called inert: it stages a named buffer and needs 3.4, like exact deletion. Replace the policy-marker wording with the require_commands requirement.
Note that load_buffer joins paste_text and exact deletion at 3.4 and that the backend contract is libtmux._internal.support.require_commands. Keep the release note separate from runtime changes.
The owned helpers run libtmux's command policy, so window and session names holding ':' or '.' are refused on 3.7 and pass on 3.7a with no extra code. Removing the require_commands call in the fence fails the new test.
tony
force-pushed
the
bump-min-tmux-000
branch
2 times, most recently
from
October 17, 2026 17:57
653f6d5 to
a2b4b3a
Compare
tony
force-pushed
the
bump-min-tmux-001
branch
from
October 17, 2026 17:58
268e3cc to
ba573fe
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Keep ordinary MCP tools on tmux 3.3a while refusing unsafe optional operations before their effects. This is stacked on the core minimum change.
run_command,show_bufferand directpaste_bufferload_buffer(stages a named buffer) anddelete_buffer(exact named deletion)paste_text(its temporary buffer needs exact named cleanup on failure)select-layouton 3.3aload_bufferjoined the 3.4 group after review: it staged a named buffer that a 3.3a daemon could never delete, and tmux limits only automatic buffers, so repeated calls grew the daemon. Owned subprocesses bypass the parent library's methods, so the dispatcher forwards each literal argv to libtmux's command policy (libtmux._internal.support.require_commands) and carries an optional minimum through the existing process budget. Startup and every tool refuse a libtmux without that function. Emptypaste_texthas no input effect on any release and returns before touching tmux.Not applicable here, because the server has no such code: library-owned control acquisition (tools poll; nothing attaches a control client), captured
run-shellstdout (run_commandtypes into a pane),break-pane, a rawsplit-window -p, and a private control socket alias. Session and window renames on exact 3.7 reach tmux, which rejects:and.in names with no effect; a native probe confirmed both refusals leave the names unchanged. Per-feature support states are in the compatibility reference; none raises the server's minimum.The package requires
libtmux>=0.63.0(see #139), and the development lock pins the implementation from Python feature PR780 (5df9cb3e) until that release exists.Merge and release order: libtmux 0.63.0 is released first, from #779 and #780. This PR, stacked on #139, requires
libtmux>=0.63.0, which no installer can satisfy until then, so it merges only after that release, in the same change that drops the development[tool.uv.sources]pin. Nothing in this PR tags or releases.Validation:
uv lock --checkpass.a2b4b3af(run); the restacked headba573feeis not claimed green.paste_textstaging failstest_managed_paste_checks_cleanup_before_staging. Removing the 3.4 minimum fromload_bufferfailstest_load_buffer_stages_only_where_it_can_be_deletedwithDID NOT RAISE, which asserts that only the user's buffer remains. The unmodified tree passes.display-messagecall is put back into the probe.Support is qualified on Linux/WSL by local native runs and the hosted Linux matrix; macOS and Windows are not claimed. Opaque tmux or shell programs and configured alias bodies keep native semantics, and library-owned metadata and guard commands assume native built-in semantics.
Closes #138.