# AGENTS.md
tmuxp is a session manager for tmux: it saves and loads tmux sessions,
windows, and panes from declarative YAML or JSON workspace files, built on
[libtmux](https://github.com/tmux-python/libtmux).
Follow the conventions already in the tree, and keep a change scoped to what
was asked for.
## What is here
| Path | What it is |
| ------------------------- | ------------------------------------------------- |
| `src/tmuxp/cli/` | Subcommands: load, freeze, convert, import, edit, ls, search, shell, debug-info |
| `src/tmuxp/workspace/` | `ConfigReader`, `WorkspaceBuilder`, workspace finders and freezer |
| `src/tmuxp/plugin.py` | `TmuxpPlugin` base class and hook dispatch |
| `src/tmuxp/exc.py` | Exception hierarchy rooted at `TmuxpException` |
| `src/tmuxp/_internal/` | `ConfigReader` backend, `Colors`, non-public helpers |
| `tests/` | pytest suite; runs against a real tmux server |
| `docs/` | Sphinx documentation source |
| `CHANGES` | Changelog, rendered as the docs changelog page |
| `MIGRATION` | Deprecation and migration notes |
| `.tmuxp.yaml` | This project's own dev workspace file (`tmuxp load .`) |
## Which policy applies
- Documentation, user-facing text, `CHANGES`, release notes, commit messages,
docstrings, and source comments:
[.github/WRITING.md](.github/WRITING.md)
- Environment, the gates, tests, documentation builds, releases, and pull
requests: [.github/CONTRIBUTING.md](.github/CONTRIBUTING.md)
Each of those is the single home for its subject. Where a rule seems to be
stated twice, the file listed above is the one that governs.
Logging conventions and CLI color semantics are scoped to `src/tmuxp/` and
live in [src/tmuxp/AGENTS.md](src/tmuxp/AGENTS.md).
## Change discipline
- Make the smallest coherent change that solves the verified problem; keep
unrelated cleanup out of it.
- Reuse an existing file, helper, API, or test before adding a new one.
- Add a file only for a durable boundary — a distinct responsibility,
independent reuse, or splitting an oversized module — not for a
single-use helper or a one-line re-export.
- Add a test for every user-visible behaviour change, and a `CHANGES` entry
for every change to the public API, CLI, configuration, or output.
- A passing gate is evidence only once it has been shown capable of failing.
Pair a new test with a deliberate break that proves it bites.
## Domain facts
- tmux 3.2+, Python 3.10+ (`requires-python` in `pyproject.toml`); mypy runs
in strict mode.
- One console script (`tmuxp`) and one plugin entry-point group
(`tmuxp.workspace_builders`).
- A workspace file is YAML or JSON; values trickle down session → window →
pane, so a key set at the session level is a default a window or pane can
override.
## References
- Changelog: `CHANGES` (rendered at )
- Docs:
- Upstream: