Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
190 commits
Select commit Hold shift + click to select a range
4acfd6a
ai(rules[check:*,implement]) Add tmuxinator parity commands
tony Feb 8, 2026
ebef8b2
docs(comparison) Add feature comparison table for tmuxp/tmuxinator/te…
tony Feb 8, 2026
6fb6e7d
notes(parity) Add tmuxinator parity analysis
tony Feb 8, 2026
ea12106
notes(parity) Add teamocil parity analysis
tony Feb 8, 2026
7c468c1
notes(import) Add tmuxinator import behavior analysis
tony Feb 8, 2026
954a489
notes(import) Add teamocil import behavior analysis
tony Feb 8, 2026
745acd0
fix(docs): Correct parity docs from verification pass
tony Feb 8, 2026
36d6c23
fix(comparison): Correct tmuxinator min tmux and detach flag
tony Feb 8, 2026
977caa1
fix(import-tmuxinator): Add missing socket_path entry
tony Feb 8, 2026
851d863
fix(import-teamocil): Reclassify with_env_var and cmd_separator
tony Feb 8, 2026
4de3477
fix(comparison): Correct tmuxinator version ref and clarify details
tony Feb 8, 2026
d9c115e
fix(comparison): Annotate startup_window/startup_pane with tmuxp focu…
tony Feb 8, 2026
dd3a39b
fix(parity-docs): Correct before_script hook mapping and --here details
tony Feb 8, 2026
0dfb9a2
fix(parity-docs): Correct line number references in teamocil notes
tony Feb 8, 2026
225224e
fix(comparison): Correct tmuxinator min tmux, add session rename note…
tony Feb 8, 2026
38f2300
fix(parity-tmuxinator): Fix startup_window/pane semantics, pre_window…
tony Feb 8, 2026
b9df99c
fix(parity-teamocil): Add session rename behavior, fix with_env_var/c…
tony Feb 8, 2026
8ae3a75
fix(import-tmuxinator): Correct pre/pre_window semantics and cli_args…
tony Feb 8, 2026
97b01fd
fix(import-teamocil): Mark with_env_var/cmd_separator as unverified s…
tony Feb 8, 2026
1b8dcee
docs(plan): Add parity implementation plan with API blockers
tony Feb 8, 2026
667d53a
fix(plan): Correct line refs, add isinstance bug, expand T4/T8/L2 det…
tony Feb 8, 2026
08fb6ea
fix(plan): Correct L1/T1/T3 details from tmux source verification
tony Feb 8, 2026
79dcba9
fix(plan): Correct T2 insertion points and I7 line references
tony Feb 8, 2026
d1151ed
fix(plan): Add tmux 3.2 sync scope detail and before_script limitation
tony Feb 8, 2026
1b70abd
fix(plan): Add missing width drop note and importer update dependencies
tony Feb 8, 2026
429b83d
fix(plan): Fix phase numbering and add missing L3 to phase listing
tony Feb 8, 2026
4016c69
fix(plan): Correct L3 logging description and I2 bug example
tony Feb 8, 2026
1b6fb1d
docs(comparison): Update version, fix hook descriptions, add auto-det…
tony Mar 6, 2026
9a0ef3a
docs(parity-tmuxinator): Update version, add template execution order
tony Mar 6, 2026
f56297f
docs(parity-teamocil): Update version and timestamp
tony Mar 6, 2026
698fe3a
docs(import): Update timestamps for import behavior notes
tony Mar 6, 2026
23e8b95
docs(teamocil): Verify v0.x features from 0.4-stable branch
tony Mar 6, 2026
1a21a2d
docs(comparison): Add teamocil v0.x pane sizing keys
tony Mar 6, 2026
a28ef57
docs(comparison): Refine auto-detection algorithm with v0.x fallback
tony Mar 6, 2026
f4f93aa
docs(import-teamocil): Document accidental focus/target passthrough
tony Mar 6, 2026
344e030
docs(parity-teamocil): Add accidental v0.x focus/target passthrough
tony Mar 6, 2026
3b117b7
docs(comparison): Fix pre-build script and deprecated hook mappings
tony Mar 6, 2026
246b6f3
docs(import-tmuxinator): Document pre→before_script semantic bug
tony Mar 6, 2026
f37aa8b
docs(parity-tmuxinator): Add pre→before_script scope bug to importer …
tony Mar 6, 2026
51286af
docs(plan): Add solo pre→before_script scope bug and update I1 analysis
tony Mar 7, 2026
0b93dc7
docs(plan): Expand L4 APIs, fix I7 stale claim, add height/with_env_v…
tony Mar 7, 2026
3b9593e
docs(plan): Add missing post and target keys from parity cross-reference
tony Mar 7, 2026
1435105
docs(comparison): Add synchronize deprecation, pane shell_command_bef…
tony Mar 7, 2026
754beb2
docs(parity-tmuxinator): Add synchronize deprecation and pane_title_f…
tony Mar 7, 2026
cdacae9
docs(parity-teamocil): Add v1.0 rewrite context from README
tony Mar 7, 2026
8f4c0f0
docs(import-tmuxinator): Note synchronize deprecation in summary table
tony Mar 7, 2026
ef6652e
docs(import-teamocil): Update date after source verification
tony Mar 7, 2026
f6249ac
docs(plan): Add synchronize deprecation context to T1
tony Mar 7, 2026
d096c8a
docs(plan): Fix accuracy issues from issue #1016 review
tony Mar 7, 2026
1fff4fa
docs(parity-tmuxinator): Fix fallback order, add missing CLI details
tony Mar 7, 2026
dde28e4
docs(parity-teamocil): Add layout-per-pane behavior and path expansion
tony Mar 7, 2026
3a5edde
docs(plan): Add test coverage gaps section from fixture analysis
tony Mar 7, 2026
bc5ae1e
docs(import-tmuxinator): Add YAML aliases and numeric/emoji name find…
tony Mar 7, 2026
91e48e6
ai(claude[command]): Add /check:audit parity audit command
tony Mar 7, 2026
b46cb76
ai(claude[command]): Add /check:plan parity plan command
tony Mar 7, 2026
3c684b0
fix(importers[import_tmuxinator]): Fix pre/pre_window mapping to corr…
tony Mar 7, 2026
681965d
feat(importers[import_tmuxinator]): Use shlex.split for cli_args/tmux…
tony Mar 7, 2026
92a7159
fix(importers[import_teamocil]): Replace filter loop with direct assi…
tony Mar 7, 2026
d1ca884
test(importers[import_teamocil]): Add v1.x format test fixture
tony Mar 7, 2026
7c6b2ab
feat(importers[import_tmuxinator]): Add rvm, pre_tab, startup, and sy…
tony Mar 7, 2026
aef6a37
feat(importers[import_teamocil]): Add focus, options, and height hand…
tony Mar 7, 2026
1d3d29c
feat(importers): Add logging for unsupported/dropped keys and remove …
tony Mar 7, 2026
fe1e182
docs(notes[plan]): Mark L1/L2/L3 as resolved in libtmux v0.55.0 and r…
tony Mar 15, 2026
fb1ffd4
docs(notes[plan]): Fix stale libtmux and builder line references
tony Mar 15, 2026
0320161
feat(loader[expand]): Desugar synchronize shorthand into options/opti…
tony Mar 15, 2026
d0c1838
test(builder,loader): Add synchronize config key tests
tony Mar 15, 2026
7c8da21
docs(notes[plan]): Mark T1 synchronize as complete
tony Mar 15, 2026
ddae3aa
feat(builder[config_after_window],loader[expand]): Add shell_command_…
tony Mar 15, 2026
f0eaad5
test(builder,loader): Add shell_command_after tests
tony Mar 15, 2026
e71288b
docs(notes[plan]): Mark T3 shell_command_after as complete
tony Mar 15, 2026
e943893
feat(loader[expand],builder[iter_create_panes]): Add pane title confi…
tony Mar 15, 2026
8ab92e9
test(builder,loader): Add pane title config key tests
tony Mar 15, 2026
a46cd2c
docs(notes[plan]): Mark T2 pane titles as complete
tony Mar 15, 2026
dcf6323
feat(cli[load],builder): Add --here flag to reuse current window
tony Mar 15, 2026
d4f57e1
test(builder): Add here mode integration test
tony Mar 15, 2026
72dbe45
docs(notes[plan]): Mark T4 --here CLI flag as complete
tony Mar 15, 2026
db731a7
feat(cli[stop]): Add tmuxp stop command to kill sessions
tony Mar 15, 2026
c1ee07c
test(cli[stop]): Add stop command tests
tony Mar 15, 2026
1afacb6
docs(notes[plan]): Mark T5 stop command as complete
tony Mar 15, 2026
61cb223
test(cli[stop]): Register stop in help examples validation tests
tony Mar 15, 2026
d2118fd
feat(cli[new,copy,delete]): Add config management commands
tony Mar 15, 2026
0888898
test(cli[new,copy,delete]): Add config management command tests
tony Mar 15, 2026
5a85fcd
docs(notes[plan]): Mark T10 config management commands as complete
tony Mar 15, 2026
34c0241
feat(cli[load]): Add --no-shell-command-before flag
tony Mar 15, 2026
4ed5eb6
test(cli[load]): Add --no-shell-command-before flag tests
tony Mar 15, 2026
6a6eb29
docs(notes[plan]): Mark T7 --no-shell-command-before as complete
tony Mar 15, 2026
479980c
feat(cli[load]): Add --debug flag to show tmux commands during build
tony Mar 15, 2026
4bb2448
test(cli[load]): Add --debug flag tests
tony Mar 15, 2026
1b66cf8
docs(notes[plan]): Mark T9 --debug CLI flag as complete
tony Mar 15, 2026
7b4d905
feat(util,builder,cli[load,stop],loader): Add lifecycle hook config keys
tony Mar 15, 2026
9c9159e
test(util,builder,cli[load,stop],loader): Add lifecycle hook tests
tony Mar 15, 2026
638a739
docs(notes[plan]): Mark T6 lifecycle hook config keys as complete
tony Mar 15, 2026
f4ea30f
fix(importers[tmuxinator]): Convert startup_window/startup_pane to fo…
tony Mar 15, 2026
01bb03e
test(importers[tmuxinator]): Add startup_window/startup_pane focus tests
tony Mar 15, 2026
269aeaf
docs(notes[plan]): Mark I1-I7 importer fixes as complete, update prio…
tony Mar 15, 2026
2ab9a77
feat(builder[config_after_window]): Handle clear config key for windo…
tony Mar 16, 2026
1248115
test(builder): Add clear config key tests
tony Mar 16, 2026
9d053c0
docs(notes[plan]): Mark clear config key as complete
tony Mar 16, 2026
2dd194d
fix(cli[load]): Read socket_name, socket_path, config from workspace …
tony Mar 16, 2026
26d3fb4
test(cli[load]): Add config key precedence tests for load_workspace
tony Mar 16, 2026
815a884
docs(notes[plan]): Mark dead config keys (config, socket_name) as com…
tony Mar 16, 2026
c7457ca
feat(loader,cli[load]): Add {{ variable }} config templating with --s…
tony Mar 16, 2026
cd26a32
test(loader,cli[load]): Add config templating and --set flag tests
tony Mar 16, 2026
fd2e5cf
docs(notes[plan]): Mark T8 config templating as complete
tony Mar 16, 2026
a7f0cd4
fix(importers[tmuxinator]): Coerce window names to str, convert named…
tony Mar 16, 2026
3e0cc89
test(importers[tmuxinator]): Add edge case tests for window names, al…
tony Mar 16, 2026
c73e5d7
docs(notes[plan]): Mark edge case test coverage as complete
tony Mar 16, 2026
48751cc
fix(cli[load]): Only fire on_project_start when load proceeds
tony Mar 16, 2026
c3a6754
fix(cli[load]): Only fire on_project_restart after user confirms
tony Mar 16, 2026
555e758
docs(cli[copy,delete,new,stop]): Add doctests to create_*_subparser f…
tony Mar 16, 2026
476bc70
docs(CHANGES): Add 1.68.0 release notes for parity features
tony Mar 16, 2026
810d91c
docs(cli[stop,new,copy,delete]): Add command docs and API pages
tony Mar 16, 2026
7b70642
docs(cli[load]): Document new flags and config templating
tony Mar 16, 2026
7d10aca
docs(config[top-level]): Document new config keys and lifecycle hooks
tony Mar 16, 2026
50dc70f
docs(config[examples]): Add examples and tests for new features
tony Mar 16, 2026
db7f17f
docs(comparison): Update feature tables for parity
tony Mar 16, 2026
8a8dd81
docs(index,import): Add comparison to toctree and update import notes
tony Mar 16, 2026
f18b38a
cli(stop,new,copy,delete[help]): Show help when called with no arguments
tony Mar 17, 2026
876bdb6
fix(builder[here]): Use shlex.quote for start_directory in --here mode
tony Mar 21, 2026
48dcd54
docs(cli[copy,delete,new,stop]): Add doctests to command_* entrypoints
tony Mar 21, 2026
14f4189
docs(cli[load]): Add doctest to _load_here_in_current_session
tony Mar 21, 2026
2e07235
fix(importers[tmuxinator]): Warn when explicit socket_name overrides …
tony Mar 21, 2026
c098a77
fix(util[run_hook_commands]): Add 120s timeout to hook subprocess
tony Mar 21, 2026
477ddcb
fix(importers[tmuxinator]): Join list pre values before assigning to …
tony Mar 21, 2026
cd91a1f
fix(builder[here]): Clean existing panes before rebuilding in --here …
tony Mar 21, 2026
702c441
fix(cli[load]): Clean up debug handler on early parse/expand failures
tony Mar 21, 2026
e342362
fix(cli[new]): Split EDITOR env var with shlex for flag support
tony Mar 21, 2026
9e2e61c
fix(importers[tmuxinator]): Pass through pane title and lifecycle hoo…
tony Mar 21, 2026
e57d33a
fix(importers[tmuxinator]): Warn on silently dropped tmux_command, at…
tony Mar 21, 2026
14154ab
fix(loader[expand]): Validate pane_title_position against top/bottom/off
tony Mar 21, 2026
365c0ed
test(cli[load]): Assert --no-shell-command-before actually strips com…
tony Mar 21, 2026
f18263f
fix(cli[new]): Handle missing EDITOR binary gracefully
tony Mar 21, 2026
2038a17
fix(importers[tmuxinator]): Map standalone pre_window/pre_tab without…
tony Mar 22, 2026
bef6d33
fix(importers[tmuxinator]): Log info on numeric startup_window/pane i…
tony Mar 22, 2026
54140eb
fix(builder[here]): Detect duplicate session name before renaming in …
tony Mar 22, 2026
642e881
fix(builder[here]): Provision environment and window_shell in --here …
tony Mar 22, 2026
361d558
fix(cli[copy]): Respect TMUXP_CONFIGDIR even when directory doesn't e…
tony Mar 22, 2026
5dd2138
fix(importers[tmuxinator]): Drop dead on_project_first_start key from…
tony Mar 22, 2026
be3f12c
fix(importers[tmuxinator]): Join pre_window list with "; " when pre i…
tony Mar 22, 2026
9a6018f
docs(cli[import]): Fix pre mapping description (before_script, not on…
tony Mar 22, 2026
b5672de
fix(util[run_hook_commands]): Catch OSError for nonexistent cwd
tony Mar 22, 2026
febcb97
fix(cli[stop]): Enable current-session fallback when no args given
tony Mar 22, 2026
b3b59f7
fix(cli[stop]): Require TMUX env for no-args current-session fallback
tony Mar 22, 2026
4a32fb1
fix(importers[tmuxinator]): Use exclusive rbenv/rvm/pre_tab/pre_windo…
tony Mar 22, 2026
2b25980
fix(builder[hooks]): Add cwd to on_project_exit run-shell command
tony Mar 22, 2026
1cf1afe
fix(cli[load]): Make --here and --append mutually exclusive
tony Mar 22, 2026
4be2ec1
fix(cli[load]): Warn when --here used outside tmux
tony Mar 22, 2026
1d023da
test(cli[help]): Add safety test for dangerous subprocess tmuxp calls
tony Mar 22, 2026
6d46347
fix(importers[tmuxinator]): Map pre to on_project_start instead of be…
tony Mar 23, 2026
17a8983
fix(builder[here]): Move rename-conflict check before session mutation
tony Mar 23, 2026
c331229
fix(cli[stop]): Exit with code 1 on SessionNotFound
tony Mar 23, 2026
fd2fef8
fix(cli[load]): Add --detached to --here/--append mutual exclusion group
tony Mar 23, 2026
f2f9696
fix(builder[hooks]): Fix double-escaping in on_project_exit cwd
tony Mar 28, 2026
94aa764
fix(importers[tmuxinator]): Preserve passthrough on_project_start ove…
tony Mar 28, 2026
32b3c4b
docs(cli[load]): Correct --debug output stream from stderr to stdout
tony Mar 28, 2026
ed07238
docs(audit): Correct I1 pre mapping to on_project_start
tony Mar 28, 2026
f79d094
fix(cli[load]): Add doctest for _TmuxCommandDebugHandler.emit()
tony Mar 28, 2026
436c12f
fix(cli[load]): Replace callable() doctests with real exercising doct…
tony Mar 28, 2026
6680bfe
fix(importers[tmuxinator]): Rename window_dict shadowing to tmuxp_window
tony Mar 28, 2026
aa5fa47
fix(loader): Guard expandshell against None window names
tony Mar 28, 2026
2afa56d
fix(cli[load]): Rename t variable to srv to avoid typing module shadow
tony Mar 28, 2026
36068a1
fix(cli[copy,delete,new]): Exit with code 1 on error paths
tony Mar 28, 2026
f9f4684
fix(cli[copy]): Preserve source file extension for pure-name destinat…
tony Mar 28, 2026
0d359ac
fix(cli[new]): Validate workspace name against path traversal and YAM…
tony Mar 28, 2026
2f1c7cf
fix(util): Log hook stdout/stderr at DEBUG level on non-zero exit
tony Mar 28, 2026
67f0855
docs(cli[load],CHANGES): Clarify template syntax is simple variable s…
tony Mar 28, 2026
75ffb2f
docs(configuration): Add note that on_project_exit fires on any clien…
tony Mar 28, 2026
b3b0e18
docs(comparison,cli[load]): Add --debug semantic footnote, --here she…
tony Mar 28, 2026
4e3cef0
chore: Exclude notes/ and .claude/commands/ from version control
tony Mar 28, 2026
4336b7a
fix(cli[load]): Skip (k)ill option in --here error recovery
tony Mar 29, 2026
8bd59b2
fix(util): Raise SessionNotFound instead of falling back to sessions[0]
tony Mar 29, 2026
da6a76f
fix(cli[load],docs): Tighten lifecycle hook semantics and parity claims
tony Mar 29, 2026
79a8961
fix(importers): Warn on numeric startup_window/startup_pane index res…
tony Mar 29, 2026
d6526e9
fix(cli[new]): Reject quotes in workspace names to prevent invalid YAML
tony Mar 29, 2026
440dd94
fix(cli[copy]): Guard against self-copy with resolved real path check
tony Mar 29, 2026
5a4072c
fix(importers): Handle attached POSIX flags in cli_args parsing
tony Mar 29, 2026
1fdc5da
fix(loader): Validate --set template values against YAML-unsafe chara…
tony Mar 29, 2026
874a874
docs(cli[load]): Document --no-shell-command-before as intentionally …
tony Mar 29, 2026
5d6e8e6
fix(builder): Guard on_project_exit hook with session_attached check
tony Mar 29, 2026
7e6f277
refactor(importers): Move _TMUXINATOR_UNMAPPED_KEYS to module level
tony Mar 29, 2026
98cd534
fix(util,cli[stop]): Require pane resolution for destructive get_session
tony Mar 29, 2026
dc8df50
fix(builder[here]): Use respawn-pane and set_environment instead of s…
tony Mar 29, 2026
b418a97
fix(builder[here]): Warn when respawn-pane will kill running processes
tony Mar 29, 2026
ba3f56d
test(builder,cli[load]): Add robust tests for --here respawn-pane and…
tony Mar 29, 2026
5acef6f
cli/load(fix[hooks]): Run on_project_start only for new session builds
tony Mar 29, 2026
f4f2e7f
CHANGES(docs): Correct lifecycle hook semantics
tony Mar 29, 2026
9a5c7c3
WorkspaceBuilder(fix[here]): Preserve reused sessions on startup fail…
tony Mar 29, 2026
b2a1420
cli/load(fix[here]): Reject multi-workspace here invocations
tony Mar 29, 2026
4a8ee6d
Tmuxinator(fix[startup_targets]): Respect tmux base indices during im…
tony Mar 29, 2026
3246cb1
WorkspaceBuilder(fix[reused_sessions]): Keep existing session hooks a…
tony Mar 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,7 @@ docs/_static/css/fonts.css
**/CLAUDE.local.md
**/CLAUDE.*.md
**/.claude/settings.local.json
.claude/commands/

# Development notes
notes/
92 changes: 88 additions & 4 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,95 @@ $ pipx install \

## tmuxp 1.68.0 (Yet to be released)

<!-- To maintainers and contributors: Please add notes for the forthcoming version below -->
### New commands

<!-- KEEP THIS PLACEHOLDER - DO NOT REMOVE OR MODIFY THIS LINE -->
_Notes on the upcoming release will go here._
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->
#### `tmuxp stop` — kill a tmux session (#1025)
Stop (kill) a running tmux session by name. Runs the `on_project_stop`
lifecycle hook before killing the session, giving your project a chance
to clean up.

```console
$ tmuxp stop mysession
```

#### `tmuxp new` — create a workspace config (#1025)
Create a new workspace configuration file from a minimal template and
open it in `$EDITOR`.

```console
$ tmuxp new myproject
```

#### `tmuxp copy` — copy a workspace config (#1025)
Copy an existing workspace config to a new name. Source is resolved
using the same logic as `tmuxp load`.

```console
$ tmuxp copy myproject myproject-backup
```

#### `tmuxp delete` — delete workspace configs (#1025)
Delete one or more workspace config files. Prompts for confirmation
unless `-y` is passed.

```console
$ tmuxp delete old-project
```

### Lifecycle hooks (#1025)
Workspace configs now support four lifecycle hooks inspired by tmuxinator:

- `on_project_start` — runs before session build (new session creation only)
- `on_project_restart` — runs when reattaching to an existing session (confirmed attach only)
- `on_project_exit` — runs when the last client detaches (via tmux `client-detached` hook)
- `on_project_stop` — runs before `tmuxp stop` kills the session

### Config templating (#1025)
Workspace configs now support simple `{{ variable }}` placeholders for variable substitution.
Pass values via `--set KEY=VALUE` on the command line:

```console
$ tmuxp load --set project=myapp mytemplate.yaml
```

### New config keys (#1025)
- **`enable_pane_titles`** / **`pane_title_position`** / **`pane_title_format`** —
session-level keys that enable tmux pane border titles.
- **`title`** — pane-level key to set individual pane titles via
`select-pane -T`.
- **`synchronize`** — window-level shorthand (`before` / `after` / `true`)
that sets `synchronize-panes` without needing `options_after`.
- **`shell_command_after`** — window-level key; commands sent to every pane
after the window is fully built.
- **`clear`** — window-level boolean; sends `clear` to every pane after
commands complete.

### New `tmuxp load` flags (#1025)
- `--here` — reuse the current tmux window instead of creating a new session.
- `--no-shell-command-before` — skip all `shell_command_before` entries.
- `--debug` — show tmux commands as they execute (disables progress spinner).
- `--set KEY=VALUE` — pass template variables for config templating.

### Importer improvements (#1025)
#### tmuxinator

- Map `pre` → `on_project_start`, `pre_window` → `shell_command_before`.
- Parse `cli_args` (`-f`, `-S`, `-L`) into tmuxp equivalents.
- Convert `synchronize` window key.
- Convert `startup_window` / `startup_pane` → `focus: true`.
- Convert named panes (hash-key syntax) → `title` on the pane.

#### teamocil

- Support v1.x format (`windows` at top level, `commands` key in panes).
- Convert `focus: true` on windows and panes.
- Pass through window `options`.

### Bug fixes

- Only fire `on_project_start` hook when load actually proceeds (not on
cancellation) (#1025)
- Only fire `on_project_restart` after the user confirms reattach (#1025)

## tmuxp 1.67.0 (2026-03-08)

Expand Down
3 changes: 3 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ def socket_name(request: pytest.FixtureRequest) -> str:

# Modules that actually need tmux fixtures in their doctests
DOCTEST_NEEDS_TMUX = {
"tmuxp.cli.load",
"tmuxp.cli.stop",
"tmuxp.util",
"tmuxp.workspace.builder",
}

Expand Down
25 changes: 25 additions & 0 deletions docs/cli/copy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
(cli-copy)=

(cli-copy-reference)=

# tmuxp copy

Copy an existing workspace config to a new name. Source is resolved using the same logic as `tmuxp load` (supports names, paths, and extensions).

## Command

```{eval-rst}
.. argparse::
:module: tmuxp.cli
:func: create_parser
:prog: tmuxp
:path: copy
```

## Basic usage

Copy a workspace:

```console
$ tmuxp copy myproject myproject-backup
```
37 changes: 37 additions & 0 deletions docs/cli/delete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
(cli-delete)=

(cli-delete-reference)=

# tmuxp delete

Delete one or more workspace config files. Prompts for confirmation unless `-y` is passed.

## Command

```{eval-rst}
.. argparse::
:module: tmuxp.cli
:func: create_parser
:prog: tmuxp
:path: delete
```

## Basic usage

Delete a workspace:

```console
$ tmuxp delete old-project
```

Delete without confirmation:

```console
$ tmuxp delete -y old-project
```

Delete multiple workspaces:

```console
$ tmuxp delete proj1 proj2
```
18 changes: 18 additions & 0 deletions docs/cli/import.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@ $ tmuxp import teamocil /path/to/file.json

````

### Importer improvements

The teamocil importer now supports:

- **v1.x format** — `windows` at top level with `commands` key in panes
- **Focus** — `focus: true` on windows and panes is preserved
- **Window options** — `options` on windows are passed through

(import-tmuxinator)=

## From tmuxinator
Expand Down Expand Up @@ -71,3 +79,13 @@ $ tmuxp import tmuxinator /path/to/file.json
```

````

### Importer improvements

The tmuxinator importer now supports:

- **Hook mapping** — `pre` maps to `on_project_start`, `pre_window` maps to `shell_command_before`
- **CLI args** — `cli_args` values (`-f`, `-S`, `-L`) are parsed into tmuxp config equivalents
- **Synchronize** — `synchronize` window key is converted
- **Startup focus** — `startup_window` / `startup_pane` convert to `focus: true`
- **Named panes** — hash-key pane syntax converts to `title` on the pane
4 changes: 4 additions & 0 deletions docs/cli/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ load
shell
ls
search
stop
```

```{toctree}
Expand All @@ -63,6 +64,9 @@ edit
import
convert
freeze
new
copy
delete
```

```{toctree}
Expand Down
64 changes: 64 additions & 0 deletions docs/cli/load.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,3 +253,67 @@ When progress is disabled, logging flows normally to the terminal and no spinner
### Before-script behavior

During `before_script` execution, the progress bar shows a marching animation and a ⏸ status icon, indicating that tmuxp is waiting for the script to finish before continuing with pane creation.

## Here mode

The `--here` flag reuses the current tmux window instead of creating a new session. This is similar to teamocil's `--here` flag.

```console
$ tmuxp load --here .
```

When used, tmuxp builds the workspace panes inside the current window rather than spawning a new session.

`--here` only supports a single workspace file per invocation.

```{note}
When `--here` needs to provision a directory, environment, or shell, tmuxp uses tmux primitives (`set-environment` and `respawn-pane`) instead of typing `cd` / `export` into the pane. If provisioning is needed, tmux will replace the active pane process before the workspace commands run, so long-running child processes in that pane can be terminated.
```

## Skipping shell_command_before

The `--no-shell-command-before` flag skips all `shell_command_before` entries at every level (session, window, pane). This is useful for quick reloads when the setup commands (virtualenv activation, etc.) are already active.

```console
$ tmuxp load --no-shell-command-before myproject
```

```{note}
This flag is intentionally broader than tmuxinator's `--no-pre-window`, which only disables the window-level `pre_window` chain. tmuxp's flag strips `shell_command_before` at all levels for a clean reload experience.
```

## Debug mode

The `--debug` flag shows tmux commands as they execute. This disables the progress spinner and attaches a debug handler to libtmux's logger, printing each tmux command to stdout.

```console
$ tmuxp load --debug myproject
```

## Config templating

Workspace configs support simple `{{ variable }}` placeholders for variable substitution. Pass values via `--set KEY=VALUE`:

```console
$ tmuxp load --set project=myapp mytemplate.yaml
```

Multiple variables can be passed:

```console
$ tmuxp load --set project=myapp --set env=staging mytemplate.yaml
```

In the config file, use double-brace syntax:

```yaml
session_name: "{{ project }}"
windows:
- window_name: "{{ project }}-main"
panes:
- echo "Working on {{ project }}"
```

```{note}
Values containing `{{ }}` must be quoted in YAML to avoid parse errors.
```
25 changes: 25 additions & 0 deletions docs/cli/new.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
(cli-new)=

(cli-new-reference)=

# tmuxp new

Create a new workspace configuration file from a minimal template and open it in `$EDITOR`. If the workspace already exists, it opens for editing.

## Command

```{eval-rst}
.. argparse::
:module: tmuxp.cli
:func: create_parser
:prog: tmuxp
:path: new
```

## Basic usage

Create a new workspace:

```console
$ tmuxp new myproject
```
37 changes: 37 additions & 0 deletions docs/cli/stop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
(cli-stop)=

(cli-stop-reference)=

# tmuxp stop

Stop (kill) a running tmux session. If `on_project_stop` is defined in the workspace config, that hook runs before the session is killed.

## Command

```{eval-rst}
.. argparse::
:module: tmuxp.cli
:func: create_parser
:prog: tmuxp
:path: stop
```

## Basic usage

Stop a session by name:

```console
$ tmuxp stop mysession
```

Stop the currently attached session:

```console
$ tmuxp stop
```

Use a custom socket:

```console
$ tmuxp stop -L mysocket mysession
```
Loading
Loading