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
a7af908
ai(rules[check:*,implement]) Add tmuxinator parity commands
tony Feb 8, 2026
2f88eca
docs(comparison) Add feature comparison table for tmuxp/tmuxinator/te…
tony Feb 8, 2026
e1bd915
notes(parity) Add tmuxinator parity analysis
tony Feb 8, 2026
6cdf3a3
notes(parity) Add teamocil parity analysis
tony Feb 8, 2026
dc181ee
notes(import) Add tmuxinator import behavior analysis
tony Feb 8, 2026
15d0968
notes(import) Add teamocil import behavior analysis
tony Feb 8, 2026
e1ead8b
fix(docs): Correct parity docs from verification pass
tony Feb 8, 2026
236738f
fix(comparison): Correct tmuxinator min tmux and detach flag
tony Feb 8, 2026
d733d55
fix(import-tmuxinator): Add missing socket_path entry
tony Feb 8, 2026
c1a2d19
fix(import-teamocil): Reclassify with_env_var and cmd_separator
tony Feb 8, 2026
7de85d8
fix(comparison): Correct tmuxinator version ref and clarify details
tony Feb 8, 2026
6124577
fix(comparison): Annotate startup_window/startup_pane with tmuxp focu…
tony Feb 8, 2026
4d67554
fix(parity-docs): Correct before_script hook mapping and --here details
tony Feb 8, 2026
1ddc50b
fix(parity-docs): Correct line number references in teamocil notes
tony Feb 8, 2026
fc9c055
fix(comparison): Correct tmuxinator min tmux, add session rename note…
tony Feb 8, 2026
82b89d1
fix(parity-tmuxinator): Fix startup_window/pane semantics, pre_window…
tony Feb 8, 2026
8404945
fix(parity-teamocil): Add session rename behavior, fix with_env_var/c…
tony Feb 8, 2026
6516fe2
fix(import-tmuxinator): Correct pre/pre_window semantics and cli_args…
tony Feb 8, 2026
33f348b
fix(import-teamocil): Mark with_env_var/cmd_separator as unverified s…
tony Feb 8, 2026
1cca65b
docs(plan): Add parity implementation plan with API blockers
tony Feb 8, 2026
298bec9
fix(plan): Correct line refs, add isinstance bug, expand T4/T8/L2 det…
tony Feb 8, 2026
429f43e
fix(plan): Correct L1/T1/T3 details from tmux source verification
tony Feb 8, 2026
be020d5
fix(plan): Correct T2 insertion points and I7 line references
tony Feb 8, 2026
d980806
fix(plan): Add tmux 3.2 sync scope detail and before_script limitation
tony Feb 8, 2026
cc51dad
fix(plan): Add missing width drop note and importer update dependencies
tony Feb 8, 2026
2575819
fix(plan): Fix phase numbering and add missing L3 to phase listing
tony Feb 8, 2026
be67c12
fix(plan): Correct L3 logging description and I2 bug example
tony Feb 8, 2026
2578572
docs(comparison): Update version, fix hook descriptions, add auto-det…
tony Mar 6, 2026
8baa6bf
docs(parity-tmuxinator): Update version, add template execution order
tony Mar 6, 2026
db2ff86
docs(parity-teamocil): Update version and timestamp
tony Mar 6, 2026
e360360
docs(import): Update timestamps for import behavior notes
tony Mar 6, 2026
4ea61b9
docs(teamocil): Verify v0.x features from 0.4-stable branch
tony Mar 6, 2026
c83e64b
docs(comparison): Add teamocil v0.x pane sizing keys
tony Mar 6, 2026
ef6ed48
docs(comparison): Refine auto-detection algorithm with v0.x fallback
tony Mar 6, 2026
3e69a9c
docs(import-teamocil): Document accidental focus/target passthrough
tony Mar 6, 2026
72bdfde
docs(parity-teamocil): Add accidental v0.x focus/target passthrough
tony Mar 6, 2026
d1d607b
docs(comparison): Fix pre-build script and deprecated hook mappings
tony Mar 6, 2026
e743534
docs(import-tmuxinator): Document pre→before_script semantic bug
tony Mar 6, 2026
87d0ee1
docs(parity-tmuxinator): Add pre→before_script scope bug to importer …
tony Mar 6, 2026
a99ea47
docs(plan): Add solo pre→before_script scope bug and update I1 analysis
tony Mar 7, 2026
369230d
docs(plan): Expand L4 APIs, fix I7 stale claim, add height/with_env_v…
tony Mar 7, 2026
6bafbad
docs(plan): Add missing post and target keys from parity cross-reference
tony Mar 7, 2026
49d206b
docs(comparison): Add synchronize deprecation, pane shell_command_bef…
tony Mar 7, 2026
3df2f4e
docs(parity-tmuxinator): Add synchronize deprecation and pane_title_f…
tony Mar 7, 2026
f9d139a
docs(parity-teamocil): Add v1.0 rewrite context from README
tony Mar 7, 2026
f9390f8
docs(import-tmuxinator): Note synchronize deprecation in summary table
tony Mar 7, 2026
57f7fbf
docs(import-teamocil): Update date after source verification
tony Mar 7, 2026
2347a74
docs(plan): Add synchronize deprecation context to T1
tony Mar 7, 2026
712b6c0
docs(plan): Fix accuracy issues from issue #1016 review
tony Mar 7, 2026
4b4d1a2
docs(parity-tmuxinator): Fix fallback order, add missing CLI details
tony Mar 7, 2026
72caf2c
docs(parity-teamocil): Add layout-per-pane behavior and path expansion
tony Mar 7, 2026
299095b
docs(plan): Add test coverage gaps section from fixture analysis
tony Mar 7, 2026
1fe1fb4
docs(import-tmuxinator): Add YAML aliases and numeric/emoji name find…
tony Mar 7, 2026
2469261
ai(claude[command]): Add /check:audit parity audit command
tony Mar 7, 2026
b08f405
ai(claude[command]): Add /check:plan parity plan command
tony Mar 7, 2026
5e9522c
fix(importers[import_tmuxinator]): Fix pre/pre_window mapping to corr…
tony Mar 7, 2026
b85aed7
feat(importers[import_tmuxinator]): Use shlex.split for cli_args/tmux…
tony Mar 7, 2026
74bbfed
fix(importers[import_teamocil]): Replace filter loop with direct assi…
tony Mar 7, 2026
4e07da6
test(importers[import_teamocil]): Add v1.x format test fixture
tony Mar 7, 2026
bfd8972
feat(importers[import_tmuxinator]): Add rvm, pre_tab, startup, and sy…
tony Mar 7, 2026
ec92b3b
feat(importers[import_teamocil]): Add focus, options, and height hand…
tony Mar 7, 2026
8980424
feat(importers): Add logging for unsupported/dropped keys and remove …
tony Mar 7, 2026
e8b14d0
docs(notes[plan]): Mark L1/L2/L3 as resolved in libtmux v0.55.0 and r…
tony Mar 15, 2026
e264620
docs(notes[plan]): Fix stale libtmux and builder line references
tony Mar 15, 2026
31a73f4
feat(loader[expand]): Desugar synchronize shorthand into options/opti…
tony Mar 15, 2026
bceb861
test(builder,loader): Add synchronize config key tests
tony Mar 15, 2026
3561c58
docs(notes[plan]): Mark T1 synchronize as complete
tony Mar 15, 2026
58459d0
feat(builder[config_after_window],loader[expand]): Add shell_command_…
tony Mar 15, 2026
c4d1870
test(builder,loader): Add shell_command_after tests
tony Mar 15, 2026
fe7a1b7
docs(notes[plan]): Mark T3 shell_command_after as complete
tony Mar 15, 2026
61cde49
feat(loader[expand],builder[iter_create_panes]): Add pane title confi…
tony Mar 15, 2026
9e24307
test(builder,loader): Add pane title config key tests
tony Mar 15, 2026
d094bc6
docs(notes[plan]): Mark T2 pane titles as complete
tony Mar 15, 2026
38b9050
feat(cli[load],builder): Add --here flag to reuse current window
tony Mar 15, 2026
6cbfc61
test(builder): Add here mode integration test
tony Mar 15, 2026
9b4d5b7
docs(notes[plan]): Mark T4 --here CLI flag as complete
tony Mar 15, 2026
70253cc
feat(cli[stop]): Add tmuxp stop command to kill sessions
tony Mar 15, 2026
97ba607
test(cli[stop]): Add stop command tests
tony Mar 15, 2026
4a63c21
docs(notes[plan]): Mark T5 stop command as complete
tony Mar 15, 2026
86ea1a6
test(cli[stop]): Register stop in help examples validation tests
tony Mar 15, 2026
03c2795
feat(cli[new,copy,delete]): Add config management commands
tony Mar 15, 2026
a5636df
test(cli[new,copy,delete]): Add config management command tests
tony Mar 15, 2026
f668a92
docs(notes[plan]): Mark T10 config management commands as complete
tony Mar 15, 2026
72abede
feat(cli[load]): Add --no-shell-command-before flag
tony Mar 15, 2026
b5e6204
test(cli[load]): Add --no-shell-command-before flag tests
tony Mar 15, 2026
53c25e2
docs(notes[plan]): Mark T7 --no-shell-command-before as complete
tony Mar 15, 2026
978062b
feat(cli[load]): Add --debug flag to show tmux commands during build
tony Mar 15, 2026
60251fa
test(cli[load]): Add --debug flag tests
tony Mar 15, 2026
f0bf464
docs(notes[plan]): Mark T9 --debug CLI flag as complete
tony Mar 15, 2026
996b125
feat(util,builder,cli[load,stop],loader): Add lifecycle hook config keys
tony Mar 15, 2026
a6cfc65
test(util,builder,cli[load,stop],loader): Add lifecycle hook tests
tony Mar 15, 2026
eb94f86
docs(notes[plan]): Mark T6 lifecycle hook config keys as complete
tony Mar 15, 2026
764c72f
fix(importers[tmuxinator]): Convert startup_window/startup_pane to fo…
tony Mar 15, 2026
a87209a
test(importers[tmuxinator]): Add startup_window/startup_pane focus tests
tony Mar 15, 2026
cf64c03
docs(notes[plan]): Mark I1-I7 importer fixes as complete, update prio…
tony Mar 15, 2026
9af85bd
feat(builder[config_after_window]): Handle clear config key for windo…
tony Mar 16, 2026
7221a59
test(builder): Add clear config key tests
tony Mar 16, 2026
71940c9
docs(notes[plan]): Mark clear config key as complete
tony Mar 16, 2026
ab394fb
fix(cli[load]): Read socket_name, socket_path, config from workspace …
tony Mar 16, 2026
1d14adc
test(cli[load]): Add config key precedence tests for load_workspace
tony Mar 16, 2026
a43efb5
docs(notes[plan]): Mark dead config keys (config, socket_name) as com…
tony Mar 16, 2026
ca37fa0
feat(loader,cli[load]): Add {{ variable }} config templating with --s…
tony Mar 16, 2026
933d803
test(loader,cli[load]): Add config templating and --set flag tests
tony Mar 16, 2026
371ad61
docs(notes[plan]): Mark T8 config templating as complete
tony Mar 16, 2026
d647045
fix(importers[tmuxinator]): Coerce window names to str, convert named…
tony Mar 16, 2026
f6245b5
test(importers[tmuxinator]): Add edge case tests for window names, al…
tony Mar 16, 2026
6c8d8ee
docs(notes[plan]): Mark edge case test coverage as complete
tony Mar 16, 2026
c750734
fix(cli[load]): Only fire on_project_start when load proceeds
tony Mar 16, 2026
cfe49ce
fix(cli[load]): Only fire on_project_restart after user confirms
tony Mar 16, 2026
2bbf180
docs(cli[copy,delete,new,stop]): Add doctests to create_*_subparser f…
tony Mar 16, 2026
34066ca
docs(CHANGES): Add 1.68.0 release notes for parity features
tony Mar 16, 2026
0ec5a24
docs(cli[stop,new,copy,delete]): Add command docs and API pages
tony Mar 16, 2026
e7e143c
docs(cli[load]): Document new flags and config templating
tony Mar 16, 2026
68ee235
docs(config[top-level]): Document new config keys and lifecycle hooks
tony Mar 16, 2026
335a764
docs(config[examples]): Add examples and tests for new features
tony Mar 16, 2026
f08e587
docs(comparison): Update feature tables for parity
tony Mar 16, 2026
3189038
docs(index,import): Add comparison to toctree and update import notes
tony Mar 16, 2026
0ffd181
cli(stop,new,copy,delete[help]): Show help when called with no arguments
tony Mar 17, 2026
0df3a51
fix(builder[here]): Use shlex.quote for start_directory in --here mode
tony Mar 21, 2026
0f5e30c
docs(cli[copy,delete,new,stop]): Add doctests to command_* entrypoints
tony Mar 21, 2026
4002238
docs(cli[load]): Add doctest to _load_here_in_current_session
tony Mar 21, 2026
82caf18
fix(importers[tmuxinator]): Warn when explicit socket_name overrides …
tony Mar 21, 2026
6479faf
fix(util[run_hook_commands]): Add 120s timeout to hook subprocess
tony Mar 21, 2026
e767428
fix(importers[tmuxinator]): Join list pre values before assigning to …
tony Mar 21, 2026
c29c83f
fix(builder[here]): Clean existing panes before rebuilding in --here …
tony Mar 21, 2026
b7e4580
fix(cli[load]): Clean up debug handler on early parse/expand failures
tony Mar 21, 2026
699a8f4
fix(cli[new]): Split EDITOR env var with shlex for flag support
tony Mar 21, 2026
c9626fe
fix(importers[tmuxinator]): Pass through pane title and lifecycle hoo…
tony Mar 21, 2026
5ff9cab
fix(importers[tmuxinator]): Warn on silently dropped tmux_command, at…
tony Mar 21, 2026
a23b97a
fix(loader[expand]): Validate pane_title_position against top/bottom/off
tony Mar 21, 2026
2be6c67
test(cli[load]): Assert --no-shell-command-before actually strips com…
tony Mar 21, 2026
a8e29bd
fix(cli[new]): Handle missing EDITOR binary gracefully
tony Mar 21, 2026
71f68d2
fix(importers[tmuxinator]): Map standalone pre_window/pre_tab without…
tony Mar 22, 2026
b9c9d40
fix(importers[tmuxinator]): Log info on numeric startup_window/pane i…
tony Mar 22, 2026
439cfa8
fix(builder[here]): Detect duplicate session name before renaming in …
tony Mar 22, 2026
e4e654c
fix(builder[here]): Provision environment and window_shell in --here …
tony Mar 22, 2026
908b99d
fix(cli[copy]): Respect TMUXP_CONFIGDIR even when directory doesn't e…
tony Mar 22, 2026
0097c12
fix(importers[tmuxinator]): Drop dead on_project_first_start key from…
tony Mar 22, 2026
3bd52eb
fix(importers[tmuxinator]): Join pre_window list with "; " when pre i…
tony Mar 22, 2026
373fad7
docs(cli[import]): Fix pre mapping description (before_script, not on…
tony Mar 22, 2026
fcb2ea4
fix(util[run_hook_commands]): Catch OSError for nonexistent cwd
tony Mar 22, 2026
a1533ed
fix(cli[stop]): Enable current-session fallback when no args given
tony Mar 22, 2026
2eaef7a
fix(cli[stop]): Require TMUX env for no-args current-session fallback
tony Mar 22, 2026
b1de241
fix(importers[tmuxinator]): Use exclusive rbenv/rvm/pre_tab/pre_windo…
tony Mar 22, 2026
eb03fa0
fix(builder[hooks]): Add cwd to on_project_exit run-shell command
tony Mar 22, 2026
a1dc078
fix(cli[load]): Make --here and --append mutually exclusive
tony Mar 22, 2026
a6e9d0d
fix(cli[load]): Warn when --here used outside tmux
tony Mar 22, 2026
018888b
test(cli[help]): Add safety test for dangerous subprocess tmuxp calls
tony Mar 22, 2026
aa0aa50
fix(importers[tmuxinator]): Map pre to on_project_start instead of be…
tony Mar 23, 2026
bae9cc3
fix(builder[here]): Move rename-conflict check before session mutation
tony Mar 23, 2026
e00c3f6
fix(cli[stop]): Exit with code 1 on SessionNotFound
tony Mar 23, 2026
704a42a
fix(cli[load]): Add --detached to --here/--append mutual exclusion group
tony Mar 23, 2026
191bea0
fix(builder[hooks]): Fix double-escaping in on_project_exit cwd
tony Mar 28, 2026
4150d4f
fix(importers[tmuxinator]): Preserve passthrough on_project_start ove…
tony Mar 28, 2026
658337f
docs(cli[load]): Correct --debug output stream from stderr to stdout
tony Mar 28, 2026
f4231fe
docs(audit): Correct I1 pre mapping to on_project_start
tony Mar 28, 2026
d5ba99c
fix(cli[load]): Add doctest for _TmuxCommandDebugHandler.emit()
tony Mar 28, 2026
a842767
fix(cli[load]): Replace callable() doctests with real exercising doct…
tony Mar 28, 2026
d2ba82b
fix(importers[tmuxinator]): Rename window_dict shadowing to tmuxp_window
tony Mar 28, 2026
fac8e53
fix(loader): Guard expandshell against None window names
tony Mar 28, 2026
bacbbd8
fix(cli[load]): Rename t variable to srv to avoid typing module shadow
tony Mar 28, 2026
d552e70
fix(cli[copy,delete,new]): Exit with code 1 on error paths
tony Mar 28, 2026
3b045da
fix(cli[copy]): Preserve source file extension for pure-name destinat…
tony Mar 28, 2026
f6e9895
fix(cli[new]): Validate workspace name against path traversal and YAM…
tony Mar 28, 2026
32ef91c
fix(util): Log hook stdout/stderr at DEBUG level on non-zero exit
tony Mar 28, 2026
e08faef
docs(cli[load],CHANGES): Clarify template syntax is simple variable s…
tony Mar 28, 2026
4c51882
docs(configuration): Add note that on_project_exit fires on any clien…
tony Mar 28, 2026
8e5a264
docs(comparison,cli[load]): Add --debug semantic footnote, --here she…
tony Mar 28, 2026
b2e5e36
chore: Exclude notes/ and .claude/commands/ from version control
tony Mar 28, 2026
c4f3e18
fix(cli[load]): Skip (k)ill option in --here error recovery
tony Mar 29, 2026
3d6bcf0
fix(util): Raise SessionNotFound instead of falling back to sessions[0]
tony Mar 29, 2026
7ba6275
fix(cli[load],docs): Tighten lifecycle hook semantics and parity claims
tony Mar 29, 2026
4945c16
fix(importers): Warn on numeric startup_window/startup_pane index res…
tony Mar 29, 2026
c8022ca
fix(cli[new]): Reject quotes in workspace names to prevent invalid YAML
tony Mar 29, 2026
dc03d99
fix(cli[copy]): Guard against self-copy with resolved real path check
tony Mar 29, 2026
dfd07a8
fix(importers): Handle attached POSIX flags in cli_args parsing
tony Mar 29, 2026
7422ea8
fix(loader): Validate --set template values against YAML-unsafe chara…
tony Mar 29, 2026
2f15d45
docs(cli[load]): Document --no-shell-command-before as intentionally …
tony Mar 29, 2026
16a7c86
fix(builder): Guard on_project_exit hook with session_attached check
tony Mar 29, 2026
beb6cf2
refactor(importers): Move _TMUXINATOR_UNMAPPED_KEYS to module level
tony Mar 29, 2026
9fcbdbb
fix(util,cli[stop]): Require pane resolution for destructive get_session
tony Mar 29, 2026
5cf4bb4
fix(builder[here]): Use respawn-pane and set_environment instead of s…
tony Mar 29, 2026
dec0d7e
fix(builder[here]): Warn when respawn-pane will kill running processes
tony Mar 29, 2026
cecdcdc
test(builder,cli[load]): Add robust tests for --here respawn-pane and…
tony Mar 29, 2026
2be5464
cli/load(fix[hooks]): Run on_project_start only for new session builds
tony Mar 29, 2026
2b8a511
CHANGES(docs): Correct lifecycle hook semantics
tony Mar 29, 2026
9c6354e
WorkspaceBuilder(fix[here]): Preserve reused sessions on startup fail…
tony Mar 29, 2026
77b7ddf
cli/load(fix[here]): Reject multi-workspace here invocations
tony Mar 29, 2026
1a82b3a
Tmuxinator(fix[startup_targets]): Respect tmux base indices during im…
tony Mar 29, 2026
c8dae37
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