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
670a31e
ai(rules[check:*,implement]) Add tmuxinator parity commands
tony Feb 8, 2026
786d52d
docs(comparison) Add feature comparison table for tmuxp/tmuxinator/te…
tony Feb 8, 2026
7f064e7
notes(parity) Add tmuxinator parity analysis
tony Feb 8, 2026
2558d91
notes(parity) Add teamocil parity analysis
tony Feb 8, 2026
61be52d
notes(import) Add tmuxinator import behavior analysis
tony Feb 8, 2026
4ac0022
notes(import) Add teamocil import behavior analysis
tony Feb 8, 2026
e748db8
fix(docs): Correct parity docs from verification pass
tony Feb 8, 2026
ac3c7ab
fix(comparison): Correct tmuxinator min tmux and detach flag
tony Feb 8, 2026
437ea9d
fix(import-tmuxinator): Add missing socket_path entry
tony Feb 8, 2026
b0825d8
fix(import-teamocil): Reclassify with_env_var and cmd_separator
tony Feb 8, 2026
ab3b751
fix(comparison): Correct tmuxinator version ref and clarify details
tony Feb 8, 2026
fd0c350
fix(comparison): Annotate startup_window/startup_pane with tmuxp focu…
tony Feb 8, 2026
9a828f9
fix(parity-docs): Correct before_script hook mapping and --here details
tony Feb 8, 2026
d92ebf2
fix(parity-docs): Correct line number references in teamocil notes
tony Feb 8, 2026
749d407
fix(comparison): Correct tmuxinator min tmux, add session rename note…
tony Feb 8, 2026
1595005
fix(parity-tmuxinator): Fix startup_window/pane semantics, pre_window…
tony Feb 8, 2026
4a2ae8a
fix(parity-teamocil): Add session rename behavior, fix with_env_var/c…
tony Feb 8, 2026
6f2dcc3
fix(import-tmuxinator): Correct pre/pre_window semantics and cli_args…
tony Feb 8, 2026
471396f
fix(import-teamocil): Mark with_env_var/cmd_separator as unverified s…
tony Feb 8, 2026
769d6bd
docs(plan): Add parity implementation plan with API blockers
tony Feb 8, 2026
f8aee4c
fix(plan): Correct line refs, add isinstance bug, expand T4/T8/L2 det…
tony Feb 8, 2026
b4962b6
fix(plan): Correct L1/T1/T3 details from tmux source verification
tony Feb 8, 2026
a183a02
fix(plan): Correct T2 insertion points and I7 line references
tony Feb 8, 2026
f98e00a
fix(plan): Add tmux 3.2 sync scope detail and before_script limitation
tony Feb 8, 2026
5a50a4f
fix(plan): Add missing width drop note and importer update dependencies
tony Feb 8, 2026
7622da0
fix(plan): Fix phase numbering and add missing L3 to phase listing
tony Feb 8, 2026
cefe50f
fix(plan): Correct L3 logging description and I2 bug example
tony Feb 8, 2026
d30c5cf
docs(comparison): Update version, fix hook descriptions, add auto-det…
tony Mar 6, 2026
61c1ad0
docs(parity-tmuxinator): Update version, add template execution order
tony Mar 6, 2026
3959e2b
docs(parity-teamocil): Update version and timestamp
tony Mar 6, 2026
d56fe21
docs(import): Update timestamps for import behavior notes
tony Mar 6, 2026
bab64e6
docs(teamocil): Verify v0.x features from 0.4-stable branch
tony Mar 6, 2026
c49b3ed
docs(comparison): Add teamocil v0.x pane sizing keys
tony Mar 6, 2026
70c8acc
docs(comparison): Refine auto-detection algorithm with v0.x fallback
tony Mar 6, 2026
9e67b2c
docs(import-teamocil): Document accidental focus/target passthrough
tony Mar 6, 2026
f48400f
docs(parity-teamocil): Add accidental v0.x focus/target passthrough
tony Mar 6, 2026
69083c3
docs(comparison): Fix pre-build script and deprecated hook mappings
tony Mar 6, 2026
20383f8
docs(import-tmuxinator): Document pre→before_script semantic bug
tony Mar 6, 2026
c039d4e
docs(parity-tmuxinator): Add pre→before_script scope bug to importer …
tony Mar 6, 2026
b042967
docs(plan): Add solo pre→before_script scope bug and update I1 analysis
tony Mar 7, 2026
a5f2b6b
docs(plan): Expand L4 APIs, fix I7 stale claim, add height/with_env_v…
tony Mar 7, 2026
954eb89
docs(plan): Add missing post and target keys from parity cross-reference
tony Mar 7, 2026
152eaa3
docs(comparison): Add synchronize deprecation, pane shell_command_bef…
tony Mar 7, 2026
6362ce9
docs(parity-tmuxinator): Add synchronize deprecation and pane_title_f…
tony Mar 7, 2026
f8b61df
docs(parity-teamocil): Add v1.0 rewrite context from README
tony Mar 7, 2026
f92d395
docs(import-tmuxinator): Note synchronize deprecation in summary table
tony Mar 7, 2026
6e96332
docs(import-teamocil): Update date after source verification
tony Mar 7, 2026
289ad85
docs(plan): Add synchronize deprecation context to T1
tony Mar 7, 2026
7efc727
docs(plan): Fix accuracy issues from issue #1016 review
tony Mar 7, 2026
42efb9c
docs(parity-tmuxinator): Fix fallback order, add missing CLI details
tony Mar 7, 2026
c100b75
docs(parity-teamocil): Add layout-per-pane behavior and path expansion
tony Mar 7, 2026
a831820
docs(plan): Add test coverage gaps section from fixture analysis
tony Mar 7, 2026
c52d4dc
docs(import-tmuxinator): Add YAML aliases and numeric/emoji name find…
tony Mar 7, 2026
f15dea5
ai(claude[command]): Add /check:audit parity audit command
tony Mar 7, 2026
77d7cce
ai(claude[command]): Add /check:plan parity plan command
tony Mar 7, 2026
b60caa4
fix(importers[import_tmuxinator]): Fix pre/pre_window mapping to corr…
tony Mar 7, 2026
a1c41f7
feat(importers[import_tmuxinator]): Use shlex.split for cli_args/tmux…
tony Mar 7, 2026
18a915d
fix(importers[import_teamocil]): Replace filter loop with direct assi…
tony Mar 7, 2026
72cc7ed
test(importers[import_teamocil]): Add v1.x format test fixture
tony Mar 7, 2026
f67a0ca
feat(importers[import_tmuxinator]): Add rvm, pre_tab, startup, and sy…
tony Mar 7, 2026
70b347c
feat(importers[import_teamocil]): Add focus, options, and height hand…
tony Mar 7, 2026
0b744f4
feat(importers): Add logging for unsupported/dropped keys and remove …
tony Mar 7, 2026
045ecca
docs(notes[plan]): Mark L1/L2/L3 as resolved in libtmux v0.55.0 and r…
tony Mar 15, 2026
be6495d
docs(notes[plan]): Fix stale libtmux and builder line references
tony Mar 15, 2026
bef9a62
feat(loader[expand]): Desugar synchronize shorthand into options/opti…
tony Mar 15, 2026
30399bd
test(builder,loader): Add synchronize config key tests
tony Mar 15, 2026
440b8b3
docs(notes[plan]): Mark T1 synchronize as complete
tony Mar 15, 2026
f354232
feat(builder[config_after_window],loader[expand]): Add shell_command_…
tony Mar 15, 2026
0bfbef2
test(builder,loader): Add shell_command_after tests
tony Mar 15, 2026
2653bd6
docs(notes[plan]): Mark T3 shell_command_after as complete
tony Mar 15, 2026
887c309
feat(loader[expand],builder[iter_create_panes]): Add pane title confi…
tony Mar 15, 2026
fc09f0e
test(builder,loader): Add pane title config key tests
tony Mar 15, 2026
dbf32da
docs(notes[plan]): Mark T2 pane titles as complete
tony Mar 15, 2026
27914b0
feat(cli[load],builder): Add --here flag to reuse current window
tony Mar 15, 2026
be8b0f7
test(builder): Add here mode integration test
tony Mar 15, 2026
d9cd2b9
docs(notes[plan]): Mark T4 --here CLI flag as complete
tony Mar 15, 2026
74e91e8
feat(cli[stop]): Add tmuxp stop command to kill sessions
tony Mar 15, 2026
1232dc0
test(cli[stop]): Add stop command tests
tony Mar 15, 2026
95c746d
docs(notes[plan]): Mark T5 stop command as complete
tony Mar 15, 2026
e7c6972
test(cli[stop]): Register stop in help examples validation tests
tony Mar 15, 2026
c3cb7b4
feat(cli[new,copy,delete]): Add config management commands
tony Mar 15, 2026
43fb11c
test(cli[new,copy,delete]): Add config management command tests
tony Mar 15, 2026
77c2788
docs(notes[plan]): Mark T10 config management commands as complete
tony Mar 15, 2026
afe2c1e
feat(cli[load]): Add --no-shell-command-before flag
tony Mar 15, 2026
1f8e1b7
test(cli[load]): Add --no-shell-command-before flag tests
tony Mar 15, 2026
e117fbe
docs(notes[plan]): Mark T7 --no-shell-command-before as complete
tony Mar 15, 2026
e8d4583
feat(cli[load]): Add --debug flag to show tmux commands during build
tony Mar 15, 2026
4b3a777
test(cli[load]): Add --debug flag tests
tony Mar 15, 2026
7c545c8
docs(notes[plan]): Mark T9 --debug CLI flag as complete
tony Mar 15, 2026
6498a25
feat(util,builder,cli[load,stop],loader): Add lifecycle hook config keys
tony Mar 15, 2026
3db53d7
test(util,builder,cli[load,stop],loader): Add lifecycle hook tests
tony Mar 15, 2026
b775418
docs(notes[plan]): Mark T6 lifecycle hook config keys as complete
tony Mar 15, 2026
33a3831
fix(importers[tmuxinator]): Convert startup_window/startup_pane to fo…
tony Mar 15, 2026
1788be3
test(importers[tmuxinator]): Add startup_window/startup_pane focus tests
tony Mar 15, 2026
4e5c196
docs(notes[plan]): Mark I1-I7 importer fixes as complete, update prio…
tony Mar 15, 2026
052c01d
feat(builder[config_after_window]): Handle clear config key for windo…
tony Mar 16, 2026
9341725
test(builder): Add clear config key tests
tony Mar 16, 2026
75bfe60
docs(notes[plan]): Mark clear config key as complete
tony Mar 16, 2026
46414e0
fix(cli[load]): Read socket_name, socket_path, config from workspace …
tony Mar 16, 2026
dd92f4b
test(cli[load]): Add config key precedence tests for load_workspace
tony Mar 16, 2026
e3d66f9
docs(notes[plan]): Mark dead config keys (config, socket_name) as com…
tony Mar 16, 2026
5a5965f
feat(loader,cli[load]): Add {{ variable }} config templating with --s…
tony Mar 16, 2026
6fbb0af
test(loader,cli[load]): Add config templating and --set flag tests
tony Mar 16, 2026
32cde0f
docs(notes[plan]): Mark T8 config templating as complete
tony Mar 16, 2026
9d3bf08
fix(importers[tmuxinator]): Coerce window names to str, convert named…
tony Mar 16, 2026
ad4c200
test(importers[tmuxinator]): Add edge case tests for window names, al…
tony Mar 16, 2026
3a490d3
docs(notes[plan]): Mark edge case test coverage as complete
tony Mar 16, 2026
663a69f
fix(cli[load]): Only fire on_project_start when load proceeds
tony Mar 16, 2026
1e3f767
fix(cli[load]): Only fire on_project_restart after user confirms
tony Mar 16, 2026
d093a35
docs(cli[copy,delete,new,stop]): Add doctests to create_*_subparser f…
tony Mar 16, 2026
a917a69
docs(CHANGES): Add 1.68.0 release notes for parity features
tony Mar 16, 2026
ce4e8d4
docs(cli[stop,new,copy,delete]): Add command docs and API pages
tony Mar 16, 2026
19d60d2
docs(cli[load]): Document new flags and config templating
tony Mar 16, 2026
ea5333b
docs(config[top-level]): Document new config keys and lifecycle hooks
tony Mar 16, 2026
f000736
docs(config[examples]): Add examples and tests for new features
tony Mar 16, 2026
323de4d
docs(comparison): Update feature tables for parity
tony Mar 16, 2026
b8e7a74
docs(index,import): Add comparison to toctree and update import notes
tony Mar 16, 2026
a04f8ba
cli(stop,new,copy,delete[help]): Show help when called with no arguments
tony Mar 17, 2026
d0cfc02
fix(builder[here]): Use shlex.quote for start_directory in --here mode
tony Mar 21, 2026
342fd8a
docs(cli[copy,delete,new,stop]): Add doctests to command_* entrypoints
tony Mar 21, 2026
db727af
docs(cli[load]): Add doctest to _load_here_in_current_session
tony Mar 21, 2026
6fcbcf8
fix(importers[tmuxinator]): Warn when explicit socket_name overrides …
tony Mar 21, 2026
c4c6898
fix(util[run_hook_commands]): Add 120s timeout to hook subprocess
tony Mar 21, 2026
614faab
fix(importers[tmuxinator]): Join list pre values before assigning to …
tony Mar 21, 2026
5ade494
fix(builder[here]): Clean existing panes before rebuilding in --here …
tony Mar 21, 2026
507ae07
fix(cli[load]): Clean up debug handler on early parse/expand failures
tony Mar 21, 2026
673bdea
fix(cli[new]): Split EDITOR env var with shlex for flag support
tony Mar 21, 2026
8843c71
fix(importers[tmuxinator]): Pass through pane title and lifecycle hoo…
tony Mar 21, 2026
72cfe3f
fix(importers[tmuxinator]): Warn on silently dropped tmux_command, at…
tony Mar 21, 2026
be47a0c
fix(loader[expand]): Validate pane_title_position against top/bottom/off
tony Mar 21, 2026
57d2bcf
test(cli[load]): Assert --no-shell-command-before actually strips com…
tony Mar 21, 2026
6e43951
fix(cli[new]): Handle missing EDITOR binary gracefully
tony Mar 21, 2026
40d15a0
fix(importers[tmuxinator]): Map standalone pre_window/pre_tab without…
tony Mar 22, 2026
7dd272d
fix(importers[tmuxinator]): Log info on numeric startup_window/pane i…
tony Mar 22, 2026
a9ec851
fix(builder[here]): Detect duplicate session name before renaming in …
tony Mar 22, 2026
7d47d1b
fix(builder[here]): Provision environment and window_shell in --here …
tony Mar 22, 2026
79de8d6
fix(cli[copy]): Respect TMUXP_CONFIGDIR even when directory doesn't e…
tony Mar 22, 2026
164d7bb
fix(importers[tmuxinator]): Drop dead on_project_first_start key from…
tony Mar 22, 2026
fe5a546
fix(importers[tmuxinator]): Join pre_window list with "; " when pre i…
tony Mar 22, 2026
9d79e37
docs(cli[import]): Fix pre mapping description (before_script, not on…
tony Mar 22, 2026
4c56932
fix(util[run_hook_commands]): Catch OSError for nonexistent cwd
tony Mar 22, 2026
72a8da3
fix(cli[stop]): Enable current-session fallback when no args given
tony Mar 22, 2026
68f72a5
fix(cli[stop]): Require TMUX env for no-args current-session fallback
tony Mar 22, 2026
2e05abb
fix(importers[tmuxinator]): Use exclusive rbenv/rvm/pre_tab/pre_windo…
tony Mar 22, 2026
f4594ab
fix(builder[hooks]): Add cwd to on_project_exit run-shell command
tony Mar 22, 2026
0f61906
fix(cli[load]): Make --here and --append mutually exclusive
tony Mar 22, 2026
bfbf4e4
fix(cli[load]): Warn when --here used outside tmux
tony Mar 22, 2026
8852efc
test(cli[help]): Add safety test for dangerous subprocess tmuxp calls
tony Mar 22, 2026
9c85a0f
fix(importers[tmuxinator]): Map pre to on_project_start instead of be…
tony Mar 23, 2026
25b87b1
fix(builder[here]): Move rename-conflict check before session mutation
tony Mar 23, 2026
fa37667
fix(cli[stop]): Exit with code 1 on SessionNotFound
tony Mar 23, 2026
c0db2c8
fix(cli[load]): Add --detached to --here/--append mutual exclusion group
tony Mar 23, 2026
7f8cbc9
fix(builder[hooks]): Fix double-escaping in on_project_exit cwd
tony Mar 28, 2026
c335c24
fix(importers[tmuxinator]): Preserve passthrough on_project_start ove…
tony Mar 28, 2026
493d978
docs(cli[load]): Correct --debug output stream from stderr to stdout
tony Mar 28, 2026
ec1415d
docs(audit): Correct I1 pre mapping to on_project_start
tony Mar 28, 2026
084b465
fix(cli[load]): Add doctest for _TmuxCommandDebugHandler.emit()
tony Mar 28, 2026
7bab718
fix(cli[load]): Replace callable() doctests with real exercising doct…
tony Mar 28, 2026
388e33c
fix(importers[tmuxinator]): Rename window_dict shadowing to tmuxp_window
tony Mar 28, 2026
2206d17
fix(loader): Guard expandshell against None window names
tony Mar 28, 2026
b7729b3
fix(cli[load]): Rename t variable to srv to avoid typing module shadow
tony Mar 28, 2026
475b5d4
fix(cli[copy,delete,new]): Exit with code 1 on error paths
tony Mar 28, 2026
b6ed25e
fix(cli[copy]): Preserve source file extension for pure-name destinat…
tony Mar 28, 2026
fe0efb9
fix(cli[new]): Validate workspace name against path traversal and YAM…
tony Mar 28, 2026
0aab228
fix(util): Log hook stdout/stderr at DEBUG level on non-zero exit
tony Mar 28, 2026
84adc15
docs(cli[load],CHANGES): Clarify template syntax is simple variable s…
tony Mar 28, 2026
6ab11f1
docs(configuration): Add note that on_project_exit fires on any clien…
tony Mar 28, 2026
c691903
docs(comparison,cli[load]): Add --debug semantic footnote, --here she…
tony Mar 28, 2026
c7eb952
chore: Exclude notes/ and .claude/commands/ from version control
tony Mar 28, 2026
6fa7731
fix(cli[load]): Skip (k)ill option in --here error recovery
tony Mar 29, 2026
218a725
fix(util): Raise SessionNotFound instead of falling back to sessions[0]
tony Mar 29, 2026
fa68a2e
fix(cli[load],docs): Tighten lifecycle hook semantics and parity claims
tony Mar 29, 2026
3c7a3aa
fix(importers): Warn on numeric startup_window/startup_pane index res…
tony Mar 29, 2026
7ebc314
fix(cli[new]): Reject quotes in workspace names to prevent invalid YAML
tony Mar 29, 2026
86dda4f
fix(cli[copy]): Guard against self-copy with resolved real path check
tony Mar 29, 2026
a8cccd1
fix(importers): Handle attached POSIX flags in cli_args parsing
tony Mar 29, 2026
05beb6a
fix(loader): Validate --set template values against YAML-unsafe chara…
tony Mar 29, 2026
ec00ef7
docs(cli[load]): Document --no-shell-command-before as intentionally …
tony Mar 29, 2026
692fd38
fix(builder): Guard on_project_exit hook with session_attached check
tony Mar 29, 2026
11816d0
refactor(importers): Move _TMUXINATOR_UNMAPPED_KEYS to module level
tony Mar 29, 2026
d24b293
fix(util,cli[stop]): Require pane resolution for destructive get_session
tony Mar 29, 2026
91618bb
fix(builder[here]): Use respawn-pane and set_environment instead of s…
tony Mar 29, 2026
c771175
fix(builder[here]): Warn when respawn-pane will kill running processes
tony Mar 29, 2026
ccfb6ce
test(builder,cli[load]): Add robust tests for --here respawn-pane and…
tony Mar 29, 2026
5ecf128
cli/load(fix[hooks]): Run on_project_start only for new session builds
tony Mar 29, 2026
f57e60a
CHANGES(docs): Correct lifecycle hook semantics
tony Mar 29, 2026
21ef854
WorkspaceBuilder(fix[here]): Preserve reused sessions on startup fail…
tony Mar 29, 2026
7694a42
cli/load(fix[here]): Reject multi-workspace here invocations
tony Mar 29, 2026
aa896b5
Tmuxinator(fix[startup_targets]): Respect tmux base indices during im…
tony Mar 29, 2026
94e14b9
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)

### Documentation

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