NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1371 most downloaded on PyPI
Typed library that provides an ORM wrapper for tmux, a terminal multiplexer.
Last release 2 months ago
12 Jul 2026
Release timing varies
gaps range from 8 days to 5 months
Nearly every release is documented
notes for 58 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
10 years old
166 releases · first in 2016
QueryList: Generic fixes by @tony in https://github.com/tmux-python/libtmux/pull/515
QueryList: Generic fixes by @tony in https://github.com/tmux-python/libtmux/pull/515
This improves the annotations in descendant objects such as:
Server.sessionsSession.windowsWindow.panesBolster tests (ported from libvcs): doctests and pytests
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.26.0...v0.27.0
libtmux 0.27.0 improves typed collection access.
QueryList annotations cover descendant collections (#515){class}~libtmux.common.QueryList typing improved for
{attr}~libtmux.Server.sessions, {attr}~libtmux.Session.windows, and
{attr}~libtmux.Window.panes, with doctests and pytest coverage ported from
libvcs.
libtmux 0.27.0 improves typed collection access.
QueryList typing improved for sessions , windows , and panes , with doctests and pytest coverage ported from libvcs.
One column per quarter.
get_by_id() (already deprecated) keyword argument renamed from id to Server.get_by_id(session_id), Session.get_by_id(window_id), and Window.get_by_id(…
get_by_id() (already deprecated) keyword argument renamed from id to
Server.get_by_id(session_id), Session.get_by_id(window_id), and Window.get_by_id(pane_id) (#514)Strengthen linting (#514)
Add flake8-commas (COM)
Add flake8-builtins (A)
Add flake8-errmsg (EM)
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.25.0...v0.26.0
libtmux 0.26.0 tightens a deprecated lookup signature and strengthens linting.
get_by_id() keyword names became explicit (#514)The already-deprecated get_by_id() helpers now use object-specific keyword
names: session_id, window_id, and pane_id.
Several docstrings were corrected and clarified.
The project enabled flake8-commas, flake8-builtins, and flake8-errmsg rules through Ruff, and CodeQL moved from an advanced configuration file to GitHub's default setup.
Fixed __eq__ for windows. by @m1guelperez in https://github.com/tmux-python/libtmux/pull/505
__eq__ for windows. by @m1guelperez in https://github.com/tmux-python/libtmux/pull/505False if type mismatched by @tony in https://github.com/tmux-python/libtmux/pull/510Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.24.1...v0.25.0
libtmux 0.25.0 makes equality comparisons safer and continues docstring coverage work.
False on type mismatch (#505, #510){meth}~libtmux.Server.__eq__, {meth}~libtmux.Session.__eq__,
{meth}~libtmux.Window.__eq__, and {meth}~libtmux.Pane.__eq__ now return
False instead of raising {class}AssertionError when compared with another
type. Thanks @m1guelperez for the window implementation.
Functions, methods, classes, and packages gained docstrings.
CI now includes the pydocstyle rule set.
libtmux 0.25.0 makes equality comparisons safer and continues docstring coverage work.
eq() , eq() , eq() , and eq() now return False instead of raising AssertionError when compared with another type. Thanks @m1guelperez for the window implementation.
Functions, methods, classes, and packages gained docstrings.
CI now includes the pydocstyle rule set.
packaging: Remove requirements/ folder. Unused. by @tony in https://github.com/tmux-python/libtmux/pull/507
gp-libs to test dependency groupFull Changelog: https://github.com/tmux-python/libtmux/compare/v0.24.0...v0.24.1
libtmux 0.24.1 removes obsolete packaging files.
The unused requirements/ directory was removed in favor of pyproject.toml,
and gp-libs was added to the test dependency group.
_Maintenance only, no bug fixes or new features_
Maintenance only, no bug fixes or new features
packaging(pytest): Move configuration to pyproject.toml by @tony in https://github.com/tmux-python/libtmux/pull/499
Poetry: 1.5.1 -> 1.6.1 (#497), 1.6.1 -> 1.7.0 (direct to trunk)
See also: https://github.com/python-poetry/poetry/blob/1.7.0/CHANGELOG.md
Packaging (poetry): Fix development dependencies
Per Poetry's docs on managing dependencies and poetry check, we had it wrong: Instead of using extras, we should create these:
[tool.poetry.group.group-name.dependencies]
dev-dependency = "1.0.0"
Which we now do.
Formatting: black -> ruff format by @tony in https://github.com/tmux-python/libtmux/pull/506
CI: Update action packages to fix warnings
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.23.2...v0.24.0
libtmux 0.24.0 drops Python 3.7 and moves more configuration into modern project files.
Python 3.7 reached end of life on June 27, 2023. A 0.23.x branch can be kept for limited security maintenance if needed.
pyproject.toml (#499)pytest configuration moved into pyproject.toml, Poetry moved through the
1.6/1.7 line, and development dependencies now use Poetry dependency groups.
Formatting moved from Black to ruff format, keeping the same style while
removing a separate dependency.
dorny/paths-filter and codecov/codecov-action were updated.
_Maintenance only, no bug fixes or new features_
Maintenance only, no bug fixes or new features
Final Python 3.7 Release (End of life was June 27th, 2023)
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.23.1...v0.23.2
libtmux 0.23.2 marks the final Python 3.7 cut of the 0.23.x line.
This release exists as the final Python 3.7-compatible point before the project moves forward.
_Maintenance only, no bug fixes, or new features_
Maintenance only, no bug fixes, or new features
Automated typo fixes from typos-cli:
typos --format brief --write-changes
ruff's linter for code comments, ERA (eradicate), has been removed
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.23.0...v0.23.1
libtmux 0.23.1 is a typo and lint-rule maintenance release.
Automated typo fixes were applied with typos-cli. The Ruff ERA / eradicate rule was removed because its false positives were too costly.
More fixes missing code comments from ruff run.
Maintenance release
ruff run.Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.23.0post1...v0.23.0post2
More fixes missing code comments from ruff run.
Maintenance release
ruff run.Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.23.0post0...v0.23.0post1
Fixes missing code comments from ruff run.
Maintenance release
Fixes missing code comments from ruff run.
A decision will be made later on completely eliminating these types of comments.
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.23.0...v0.23.0post0
_This maintenance release covers only developer quality of life improvements, no bug fixes or new features_
This maintenance release covers only developer quality of life improvements, no bug fixes or new features
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.22.2...v0.23.0
libtmux 0.23.0 is a Ruff-driven code-quality release.
Additional Ruff rules, including import sorting, were applied by hand and with automated fixes.
Code comments missed during the initial Ruff QA pass were repaired.
Additional ERA001 cleanups were applied.
More ERA001 cleanups followed.
_This maintenance release covers only developer quality of life improvements, no bug fixes or new features_
This maintenance release covers only developer quality of life improvements, no bug fixes or new features
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.22.2...v0.23.0a0
_Maintenance only, no bug fixes or features for this release_
Maintenance only, no bug fixes or features for this release
ci: Remove setuptools requirement for build-system in https://github.com/tmux-python/libtmux/pull/495
In relation to:
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.22.1...v0.22.2
libtmux 0.22.2 removes an obsolete build dependency.
setuptools is no longer required (#495)The build system no longer requires setuptools. Related to #493 and #494.
_Maintenance only, no bug fixes, or new features_
Maintenance only, no bug fixes, or new features
Add back black dev dependency
Until ruff replaces black's formatting
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.22.0...v0.22.1
libtmux 0.22.1 keeps Black available while Ruff formatting matures.
Black was added back temporarily until Ruff fully replaced it for formatting.
Internal improvements only, no bug fixes or new features
Internal improvements only, no bug fixes or new features
Move formatting, import sorting, and linting to ruff.
This rust-based checker has dramatically improved performance. Linting and formatting can be done almost instantly.
This change replaces black, isort, flake8 and flake8 plugins.
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.21.1...v0.22.0
libtmux 0.22.0 starts the migration to Ruff for linting, import sorting, and formatting.
Ruff replaces Black, isort, flake8, and several flake8 plugins for the main quality loop. Poetry also moved from 1.4.0 to 1.5.0.
libtmux 0.21.1 keeps mypy compatibility current.
libtmux 0.21.1 keeps mypy compatibility current.
The repr mixin typing was fixed for mypy 1.2.0.
The type checker dependency was updated.
Default format separator (LIBTMUX_TMUX_FORMAT_SEPARATOR): | -> ␞ (#475, in re: #471, #472)
libtmux 0.21.0 changes the internal separator used for tmux format parsing.
| to ␞ (#475)LIBTMUX_TMUX_FORMAT_SEPARATOR now defaults to the record-separator glyph,
fixing buffer_sample and similar tmux format values that legitimately contain
pipes. Related to #471 and #472.
feat(new_session): add width/height parameters by @rockandska in https://github.com/tmux-python/libtmux/pull/469
session_params by @tony in https://github.com/tmux-python/libtmux/pull/470Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.19.1...v0.20.0
libtmux 0.20.0 improves session sizing and test fixture customization.
{meth}~libtmux.Server.new_session accepts x and y for tmux session size.
Thanks @rockandska.
session_params fixture can override session creation (#470){fixture}session_params is a dictionary consumed directly by the
{fixture}session pytest fixture.
libtmux 0.20.0 improves session sizing and test fixture customization.
new_session() accepts x and y for tmux session size. Thanks @rockandska.
session_params is a dictionary consumed directly by the session pytest fixture.
feat(pytest_plugin): Add session_params by @tony in https://github.com/tmux-python/libtmux/pull/470
session_params by @tony in https://github.com/tmux-python/libtmux/pull/470Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.20.0a0...v0.20.0a1
feat(new_session): add width/height parameters by @rockandska in https://github.com/tmux-python/libtmux/pull/469
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.19.1...v0.20.0a0
fix(Window.set_window_option): Remove .refresh() by @tony in https://github.com/tmux-python/libtmux/pull/467
fix(Window.set_window_option): Remove .refresh() by @tony in https://github.com/tmux-python/libtmux/pull/467
See also: https://github.com/tmux-python/tmuxp/issues/860
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.19.0...v0.19.1
libtmux 0.19.1 removes a problematic refresh from window option setting.
Window.set_window_option() no longer refreshes (#467)The compatibility method stopped refreshing after setting a window option, matching downstream tmuxp expectations.
feat(pane): add capability to use [-SE] flags to capture_pane by @rockandska in https://github.com/tmux-python/libtmux/pull/465
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.18.3...v0.19.0
libtmux 0.19.0 adds ranged pane capture.
Pane.capture_pane() accepts start and end (#465){meth}~libtmux.Pane.capture_pane can capture a specific line range.
Raise ObjectDoesNotExist if object not found by @tony in https://github.com/tmux-python/libtmux/pull/466
fetch_objsRaise ObjectDoesNotExist if object not found by @tony in https://github.com/tmux-python/libtmux/pull/466
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.18.2...v0.18.3
libtmux 0.18.3 improves failed-object lookup errors.
fetch_objs() reports lookup details (#466){func}~libtmux.neo.fetch_objs now raises lookup errors with details about the
failed search.
fix(Server): Fix launching default server by @tony in https://github.com/tmux-python/libtmux/pull/464
fix(Server): Fix launching default server by @tony in https://github.com/tmux-python/libtmux/pull/464
Related to tmuxp bug at https://github.com/tmux-python/tmuxp/issues/856
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.18.1...v0.18.2
libtmux 0.18.2 fixes default-socket session creation.
Creating a new session on the default socket was repaired.
_Maintenance only, no bug fixes or new features_
Maintenance only, no bug fixes or new features
Code documentation touches (for relational filters, remove unused docs)
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.18.0...v0.18.1
libtmux 0.18.1 is a documentation cleanup release.
Window.panes docstrings and unused documentation were cleaned up.
Server: Add __repr__, __eq__, set socket_path if none set.
Server reprServer: Add __repr__, __eq__, set socket_path if none set.
Before (0.17 and below):
<libtmux.server.Server object at ...>
New __repr__ (0.18+):
Server(socket_name=test)
Server(socket_path=/tmp/tmux-1000/default)
by @tony in https://github.com/tmux-python/libtmux/pull/463
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.17.2...v0.18.0
libtmux 0.18.0 gives servers useful representations and default socket paths.
Server.__repr__ now reports socket identity{meth}~libtmux.Server.__repr__ reports socket_name or socket_path instead
of the default Python object repr.
Server: Deprecate _list_panes() and _update_panes()
Server: Deprecate _list_panes() and _update_panes()
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.17.1...v0.17.2
libtmux 0.17.2 continues moving pane listing internals behind deprecation paths.
Server._list_panes and Server._update_panes moved to the deprecated API
surface.
Deprecate Server.children, Session.children, Window.children
ServerServer.children, Session.children, Window.childrenFull Changelog: https://github.com/tmux-python/libtmux/compare/v0.17.0...v0.17.1
libtmux 0.17.1 tightens documentation and child-collection deprecations.
Documentation was fixed, and Server.children, Session.children, and
Window.children now warn.
0.16 and below: session._windows(), session.list_windows(), etc.
Finding objects / relations
0.16 and below: session._windows(), session.list_windows(), etc.
0.17 and after: session.windows
0.16 and below: session.find_where({'window_name': my_window})
0.17 and after: session.windows.get(window_name=my_window, default=None)
If not found and not default, raises ObjectDoesNotExist
If multiple objects found, raises MultipleObjectsReturned
0.16 and below: session.where({'window_name': my_window})
0.17 and after: session.windows.filter(window_name=my_window)
Accessing attributes
0.16 and below: window['id']
0.17 and after: window.id
0.16 and below: window.get('id')
0.17 and after: window.id
0.16 and below: window.get('id', None)
0.17 and after: getattr(window, 'id', None)
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.16.1...v0.17.0
libtmux 0.17.0 introduces the modern collection and attribute access model.
Use relation attributes such as {attr}~libtmux.Session.windows instead of
methods such as session.list_windows() or session._windows().
# 0.16 and earlier
session.find_where({"window_name": my_window})
# 0.17 and later
session.windows.get(window_name=my_window, default=None)
Missing results raise
{exc}~libtmux._internal.query_list.ObjectDoesNotExist; ambiguous results raise
{exc}~libtmux._internal.query_list.MultipleObjectsReturned.
Use attributes such as window.id instead of window["id"] or
window.get("id"). Optional access can use Python's getattr().
{meth}~libtmux.Server.is_alive and
{meth}~libtmux.Server.raise_if_dead report whether the tmux server is
available.
sphinx-click was removedThe unused development dependency was dropped.
0.16 and below: session._windows(), session.list_windows(), etc.
Finding objects / relations
0.16 and below: session._windows(), session.list_windows(), etc.
0.17 and after: session.windows
0.16 and below: session.find_where({'window_name': my_window})
0.17 and after: session.windows.get(window_name=my_window, default=None)
If not found and not default, raises ObjectDoesNotExist
If multiple objects found, raises MultipleObjectsReturned
0.16 and below: session.where({'window_name': my_window})
0.17 and after: session.windows.filter(window_name=my_window)
Accessing attributes
0.16 and below: window['id']
0.17 and after: window.id
0.16 and below: window.get('id')
0.17 and after: window.id
0.16 and below: window.get('id', None)
0.17 and after: getattr(window, 'id', None)
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.17.0a0...v0.17.0a1
Server: Behavior when no server exists by @tony in https://github.com/tmux-python/libtmux/pull/448
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.16.1...v0.17.0a0
Vendorize Version by @tony in https://github.com/tmux-python/libtmux/pull/461
Version by @tony in https://github.com/tmux-python/libtmux/pull/461Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.16.0...v0.16.1
libtmux 0.16.1 removes an unnecessary version-parsing dependency.
packaging.version.Version is no longer required (#461)libtmux now avoids strict packaging version parsing so it does not pin or
interfere with unrelated application dependencies.
Feature: Allow setting up custom environment when creating windows and/or panes by @zappolowski in https://github.com/tmux-python/libtmux/pull/453
distutils.version.LooseVersion, fix warning by @tony in https://github.com/tmux-python/libtmux/pull/351Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.10...v0.16.0
libtmux 0.16.0 removes distutils version parsing and improves environment
support for new windows.
distutils (#351)The project vendorizes legacy version handling instead of using
distutils.version.LooseVersion, which cannot correctly model tmux versions
such as 3.1a.
{meth}~libtmux.Window.split_window and
{meth}~libtmux.Session.new_window can pass environment variables into new tmux
processes. Thanks @zappolowski.
Replacement for distutils.version.LooseVersion, fix warning by @tony in https://github.com/tmux-python/libtmux/pull/351
distutils.version.LooseVersion, fix warning by @tony in https://github.com/tmux-python/libtmux/pull/351Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.16.0a0...v0.16.0a1
Feature: allow setting up custom environment when creating windows and/or panes by @zappolowski in https://github.com/tmux-python/libtmux/pull/453
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.10...v0.16.0a0
_There will be more improvements over the coming weeks and months to shore up flakiness across shells and environments._
There will be more improvements over the coming weeks and months to shore up flakiness across shells and environments.
env by @zappolowski in https://github.com/tmux-python/libtmux/pull/452Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.9...v0.15.10
libtmux 0.15.10 continues shell/environment test stabilization.
test_capture_pane and environment tests were made more portable, and more
Bash-specific assumptions were removed. Thanks @zappolowski.
build: Add CITATION.cff by @tony in https://github.com/tmux-python/libtmux/pull/449
tmux_cmd): Fix error in raise by @tony in https://github.com/tmux-python/libtmux/pull/450Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.8...v0.15.9
libtmux 0.15.9 fixes command-not-found behavior and updates Python metadata.
tmux_cmd() raises TmuxCommandNotFound correctly (#450){func}~libtmux.common.tmux_cmd now reports missing tmux binaries through
{exc}~libtmux.exc.TmuxCommandNotFound.
CI uses Python 3.11, trove classifiers include it, and local version-tooling configuration was updated.
Allow empty window name, e.g. window_name: '' in tmuxp by @trankchung in https://github.com/tmux-python/libtmux/pull/444
Allow empty window name, e.g. window_name: '' in tmuxp by @trankchung in https://github.com/tmux-python/libtmux/pull/444
https://github.com/tmux-python/libtmux/pull/445 may have follow up fixes / triaging info on empty strings ''
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.7...v0.15.8
libtmux 0.15.8 improves compatibility with tmuxp's empty window names.
window_name is supported in Session.new_window() (#444){meth}~libtmux.Session.new_window handles window_name="" more reliably for
downstream tmuxp. Thanks @trankchung.
build: Remove .coveragerc, use pyproject.toml by @tony in https://github.com/tmux-python/libtmux/pull/443
Maintenance only
.coveragerc, use pyproject.toml by @tony in https://github.com/tmux-python/libtmux/pull/443Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.6...v0.15.7
libtmux 0.15.7 consolidates coverage configuration.
pyproject.toml (#443)The separate .coveragerc file was removed.
_Maintenance only, no bug fixes or features this releease_
Maintenance only, no bug fixes or features this releease
Remove MANIFEST.in
This is handled by poetry via pyproject.toml's include
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.6...v0.15.6
libtmux 0.15.6 removes an obsolete manifest file.
MANIFEST.in was removedPoetry's pyproject.toml include configuration now owns source distribution
contents.
_Maintenance only, no bug fixes or features this releease_
Maintenance only, no bug fixes or features this releease
.tmuxp-before-script.shFull Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.4...v0.15.5
libtmux 0.15.5 cleans up tmuxp workspace metadata.
.tmuxp-before-script.sh was removed from .tmuxp.yamlThe tmuxp workspace config no longer references that helper.
fix(pytest_plugin): Pytester import, use public APIs from pytest by @tony in https://github.com/tmux-python/libtmux/pull/442
pytest_plugin): Pytester import, use public APIs from pytest by @tony in https://github.com/tmux-python/libtmux/pull/442Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.3...v0.15.4
libtmux 0.15.4 fixes packaging and pytest compatibility.
pytest API imports now use stable paths where possible, helping downstream packages such as Arch.
.tmuxp-before-script.sh and conftest.py are included in source
distributions.
https://docs.pytest.org/en/stable/deprecations.html#pytest-plugins-in-non-top-level-conftest-files
Examples for pytest plugin (#439)
Move conftest.py to root level (#440)
PRs
libtmux.tests by @tony in https://github.com/tmux-python/libtmux/pull/437conftest.py to root by @tony in https://github.com/tmux-python/libtmux/pull/440Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.2...v0.15.3
libtmux 0.15.3 improves pytest plugin examples and doctest discovery.
Examples for the pytest plugin were added, and conftest.py moved to the repo
root so README doctests can run without proxying through docs/index.md.
_Maintenance only: No bugfixes for features_
Maintenance only: No bugfixes for features
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.1...v0.15.2
libtmux 0.15.2 is a maintenance release for test plugin coverage and CI speed.
The pytest plugin gained initial self-tests, trove classifiers note pytest support, and CI avoids unnecessary package downloads while splitting release work into a separate job.
Nothing published for this version
Minor pyproject.toml tweaks, clean up Quickstart page
Minor pyproject.toml tweaks, clean up Quickstart page
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.0...v0.15.1
libtmux 0.15.1 is a small packaging and docs cleanup.
The quickstart page was simplified.
Old issue package metadata and an extra package grouping were removed.
Fix a docstring in the readme. Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.0...v0.15.0post0
Fix a docstring in the readme.
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.0...v0.15.0post0
Added a pytest plugin, [](https://github.com/tmux-python/libtmux/issues/411)#411.
Remove common.which() in favor of shutil.which(), Credit: @rocksandska, via #407
Fixes #402: common.tmux_cmd() will only strip trailing empty lines. Before this change, all empty lines were filtered out. This will lead to a more accurate behavior when using Pane.capture_pane(). Credit: @rockandska, via #405.
Source files for libtmux modules moved to src/, via #414.
Add flake8-bugbear (#408)
Add flake8-comprehensions (#409)
Move to sphinx-autoissues, #406
Examples updated for correctness, #412 (cherry-picked from #410)
Render changelog in linkify_issues (#410)
Fix Table of contents rendering with sphinx autodoc with sphinx_toctree_autodoc_fix (#410)
pytest plugin by @tony in https://github.com/tmux-python/libtmux/pull/411gp-libs: Test docs via doctest, table of contents for sphinx.ext.autodoc, change issues module by @tony in https://github.com/tmux-python/libtmux/pull/410Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.14.2...v0.15.0
libtmux 0.15.0 adds the pytest plugin and moves the package into the modern
src/ layout.
common.which() was replaced with shutil.which() (#407)The project now relies on {func}shutil.which for executable lookup. Thanks
@rocksandska.
tmux_cmd preserves interior empty lines (#405){func}~libtmux.common.tmux_cmd now strips only trailing empty lines. This
better matches {meth}~libtmux.Pane.capture_pane output. Fixes #402. Thanks
@rockandska.
src/ (#414)The package adopted the src/ layout.
libtmux now ships a pytest plugin for tests that need tmux fixtures.
Documentation examples were corrected, doctests are exercised through pytest-doctest-docutils, changelog issue references are linkified, and autodoc table-of-contents rendering was repaired.
flake8-bugbear and flake8-comprehensions joined the development toolchain.
We moved to src/ layout in #414
We moved to src/ layout in #414
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.0a3...v0.15.0a4
gp-libs is now used for sphinx plugins
gp-libs is now used for sphinx plugins
Render changelog in linkify_issues (#410)
Fix Table of contents rendering with sphinx autodoc with sphinx_toctree_autodoc_fix (#410)
doctests in documentation via pytest-doctest-docutils (#410)Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.0a2...v0.15.0a3
build(deps): Add flake8-comprehensions, #409
pytest plugin #411Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.0a1...v0.15.0a2
fix(tmux_cmd): use shutil.which and only PATH to discover tmux by @rockandska in https://github.com/tmux-python/libtmux/pull/407
shutil.which and only PATH to discover tmux by @rockandska in https://github.com/tmux-python/libtmux/pull/407Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.15.0a0...v0.15.0a1
fix(tmux_cmd): remove only trailing new lines in stdout by @rockandska in #405
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.14.2...v0.15.0a0
fix(Server.session_name): Handle empty session names better by @tony in #401, follow up to #400, for #399
Server.session_name): Handle empty session names better by @tony in #401, follow up to #400, for #399Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.14.1...v0.14.2
libtmux 0.14.2 completes the new_session() fix started in 0.14.1.
Server.new_session() works without session_name (#401){meth}~libtmux.Server.new_session no longer passes None as the session
name. Fixes #399.
Fix: Server.new_session: Create session w/o name by @tony in #400, for #399
Fix: Server.new_session: Create session w/o name by @tony in #400, for #399
Note this isn't really fixed until v0.14.2 since it still uses None e.g. new-session -sNone
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.14.0...v0.14.1
libtmux 0.14.1 starts fixing unnamed session creation.
Server.new_session() accepts omitted session_name (#400){meth}~libtmux.Server.new_session can be called without session_name,
although 0.14.2 completed the remaining None handling. Fixes #399.
[Pane.send_keys()](https://libtmux.git-pull.com/reference/panes.html#libtmux.Pane.send_keys): suppress_history default value changed from True to Fals
Pane.send_keys()](https://libtmux.git-pull.com/reference/panes.html#libtmux.Pane.send_keys): suppress_history default value changed from True to False, #395Fix bug in temp_window() context manager, #394
Pytest configuration conftest.py moved to libtmux/conftest.py, so doctest can detect the fixtures #394
Pane.send_keys): Default suppress_history value to False by @tony in https://github.com/tmux-python/libtmux/pull/395Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.13.0...v0.14.0
libtmux 0.14.0 changes the send_keys history default and sets up executable
doctests.
Pane.send_keys(suppress_history) defaults to False (#395){meth}~libtmux.Pane.send_keys no longer suppresses shell history unless asked
to do so.
Initial doctest examples landed, temp_window() was fixed, and pytest config
moved so doctests can discover the libtmux fixtures.
refactor!(Pane.send_keys): Default suppress_history value to False by @tony in #395
Pane.send_keys): Default suppress_history value to False by @tony in #395Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.14.0a0...v0.14.0a1
Basic doctest by @tony in https://github.com/tmux-python/libtmux/pull/394
Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.13.0...v0.14.0a0
Deprecated individual item lookups
Deprecated individual item lookups (#390)
Removed key lookups from libtmux.common.EnvironmentMixin.show_environment()
Only EnvironmentMixin.show_environment() (without an argument) exists, and it still returns a dict.
Add key lookups via libtmux.common.EnvironmentMixin.getenv()
Before:
server.show_environment('DISPLAY')
After:
server.getenv('DISPLAY')
Before:
session.show_environment('DISPLAY')
After:
session.getenv('DISPLAY')
Removed key lookups from Session.show_options()
session.show_options() # still returns dict, without an argument
Old:
session.show_options('DISPLAY')
Now:
session.show_option('DISPLAY')
Removed key lookups from Window.show_window_options()
window.show_window_options() # still returns dict, without an argument
Old:
window.show_window_options('DISPLAY')
window.show_window_option('DISPLAY')
Improved typings
Now mypy --strict compliant (#383)
findWhere() (#391)findWhere -> find_where by @tony in https://github.com/tmux-python/libtmux/pull/391EnvironmentMixin by @tony in https://github.com/tmux-python/libtmux/pull/390Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.12.0...v0.13.0
libtmux 0.13.0 reaches strict mypy compliance and removes older item-lookup shortcuts.
Bulk methods such as show_environment() and show_options() now keep their
dictionary-returning behavior, while single-key access moves to explicit
methods such as getenv() and show_option().
# Before
server.show_environment("DISPLAY")
# After
server.getenv("DISPLAY")
# Before
session.show_options("base-index")
# After
session.show_option("base-index")
libtmux.test.retry() was removed after its 0.12 deprecation period (#393).
mypy --strict (#383, #392)Core modules now satisfy strict mypy checks.
The incorrect findWhere() spelling was corrected.
chore!(test): Remove libtmux.test.retry(), deprecated in 0.13 by @tony in https://github.com/tmux-python/libtmux/pull/393
libtmux.test.retry(), deprecated in 0.13 by @tony in https://github.com/tmux-python/libtmux/pull/393Full Changelog: https://github.com/tmux-python/libtmux/compare/v0.13.0a0...v0.13.0a1
Your coding agent can read these notes before it upgrades. Set up the MCP server →