Releases: tmux-python/tmuxp
tmuxp v1.63.1
v1.63.0 - CLI Colors
What's Changed
Features
CLI Colors (#1006)
Semantic color output for all CLI commands with a new --color flag (auto/always/never):
- Respects
NO_COLORandFORCE_COLORenvironment variables per no-color.org - All commands updated:
load,ls,freeze,convert,import,edit,shell,debug-info - Beautiful
--helpoutput with usage examples PrivatePathutility masks home directory as~for privacy
Search Command (#1006)
New tmuxp search command for finding workspace files:
- Field-scoped search:
name:,session:,path:,window:,pane: - Matching options:
-i(ignore-case),-S(smart-case),-F(fixed-strings),-w(word) - Logic operators:
--anyfor OR,-vfor invert match - Output formats: human (with match highlighting),
--json,--ndjson
Enhanced ls Command (#1006)
--tree: Display workspaces grouped by directory--full: Include complete parsed config content--json/--ndjson: Machine-readable output forjqpipelines- Local workspace discovery from current directory and parents
- "Global workspace directories" section shows XDG vs legacy paths
JSON Output for debug-info (#1006)
tmuxp debug-info --json: Structured output for automation and issue reporting
Development
- Makefile → Justfile (#1005): Migrate to
justfor development tasks
Documentation
- pretty_argparse extension (#1007): Sphinx extension with CLI usage syntax highlighting, ANSI stripping, and enhanced example formatting
- Migrate docs deployment to AWS OIDC authentication
Full Changelog: v1.62.0...v1.63.0
tmuxp v1.63.0a0
What's Changed
Features
CLI Colors (#1006)
Semantic color output for all CLI commands with a new --color flag (auto/always/never):
- Respects
NO_COLORandFORCE_COLORenvironment variables per no-color.org - All commands updated:
load,ls,freeze,convert,import,edit,shell,debug-info - Beautiful
--helpoutput with usage examples PrivatePathutility masks home directory as~for privacy
Search Command (#1006)
New tmuxp search command for finding workspace files:
- Field-scoped search:
name:,session:,path:,window:,pane: - Matching options:
-i(ignore-case),-S(smart-case),-F(fixed-strings),-w(word) - Logic operators:
--anyfor OR,-vfor invert match - Output formats: human (with match highlighting),
--json,--ndjson
Enhanced ls Command (#1006)
--tree: Display workspaces grouped by directory--full: Include complete parsed config content--json/--ndjson: Machine-readable output forjqpipelines- Local workspace discovery from current directory and parents
- "Global workspace directories" section shows XDG vs legacy paths
JSON Output for debug-info (#1006)
tmuxp debug-info --json: Structured output for automation and issue reporting
Development
- Makefile → Justfile (#1005): Migrate to
justfor development tasks
Documentation
- pretty_argparse extension (#1007): Sphinx extension with CLI usage syntax highlighting, ANSI stripping, and enhanced example formatting
- Migrate docs deployment to AWS OIDC authentication
Full Changelog: v1.62.0...v1.63.0a0
v1.62.0: Fix `tmuxp load` traceback after session kill
Highlights
This release fixes an important bug where users would see a TmuxObjectDoesNotExist traceback after detaching from a session that was killed during use. The fix comes via the libtmux 0.53.0 dependency update.
Bug Fixes
Fixed traceback on session load (#1002, #1003)
Fixed an issue where tmuxp load would display a traceback after users detached from a killed session.
The Problem
After running tmuxp load, users would see this traceback printed to their terminal after detaching:
Traceback (most recent call last):
File "~/.local/bin/tmuxp", line 7, in <module>
sys.exit(cli.cli())
...
File ".../tmuxp/cli/load.py", line 152, in _load_attached
builder.session.attach()
File ".../libtmux/session.py", line 332, in attach
self.refresh()
File ".../libtmux/neo.py", line 242, in fetch_obj
raise exc.TmuxObjectDoesNotExist(...)
libtmux.exc.TmuxObjectDoesNotExist: Could not find object
When It Occurred
Users encountered this when they:
- Loaded a tmux session via
tmuxp load - Worked in the session
- Killed the session (e.g., closed all windows) before detaching
- Detached from tmux
Root Cause
The issue was in libtmux's Session.attach() method, which called refresh() after the attach-session command returned. Since attach-session is a blocking interactive command, the session state can change arbitrarily during attachment — including being killed entirely. Attempting to refresh a non-existent session caused the exception.
Timeline
- Feb 2024: libtmux added
Session.attach()with therefresh()call - Nov 2025: tmuxp switched from the older
attach_session()toattach() - Users started experiencing the bug
Resolution
Fixed in libtmux 0.53.0 (libtmux#616) by removing the unnecessary refresh() call from Session.attach().
Dependency Updates
libtmux 0.52.1 → 0.53.0
Breaking Change: Minimum libtmux version bumped from 0.52.1 to 0.53.0.
libtmux 0.53.0 includes:
- Fix for
Session.attach(): Removes therefresh()call that causedTmuxObjectDoesNotExistexceptions when sessions were killed during attachment
Development Updates
- Bumped development dependencies
- Updated uv from 0.9.16 to 0.9.17
Installation
pip:
pip install --upgrade tmuxpuv:
uv add tmuxpuvx (one-time use):
uvx tmuxp load <config>pipx:
pipx upgrade tmuxpWhat's Changed
Full Changelog: v1.61.0...v1.62.0
v1.61.0 - libtmux via trusted publisher
Breaking changes
-
py(deps) libtmux 0.51.0 -> 0.52.1, gp-libs 0.0.17 by @tony in #1001
Both packages are now published via PyPI Trusted Publishers
Full Changelog: v1.60.1...v1.61.0
v1.60.1 - Trusted publishing for PyPI
Deployment
Full Changelog: v1.60.0...v1.60.1
v1.60.0 - libtmux bump
Breaking changes
-
py(deps) libtmux 0.50.1 -> 0.51.0 by @tony in #999
This libtmux bump will have a hard exception raised for legacy APIs - rather than just a warning.
Full Changelog: v1.59.1...v1.60.0
v1.59.1 - Maintenance released
What's Changed
Full Changelog: v1.59.0...v1.59.1
v1.59.0 - Maintenance release
Breaking changes
libtmux 0.50.0 (#996)
libtmux minimum version bumped from 0.49.0 -> 0.50.0.
Internal updates to use libtmux's new unified options API:
Session.attach_session()→Session.attach()Window.show_window_option()→Window.show_option()Window.show_window_options()→Window.show_options()Window.set_window_option()→Window.set_option()g=Trueparameter →global_=True
Note: Options now return Python-native types (True/False instead of
"on"/"off", int instead of numeric strings).
What's Changed
Full Changelog:
v1.58.0...v1.59.0
v1.58.0 - Drop tmux < 3.2
Breaking Changes
- Drop support for tmux versions < 3.2 by @tony in #993
- py(deps) libtmux 0.48.0 -> 0.49.0 by @tony in #992
Full Changelog: v1.57.0...v1.58.0