Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #1025 +/- ##
==========================================
+ Coverage 82.56% 84.35% +1.78%
==========================================
Files 31 35 +4
Lines 2770 3342 +572
Branches 518 662 +144
==========================================
+ Hits 2287 2819 +532
- Misses 346 361 +15
- Partials 137 162 +25 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
d64904e to
db303db
Compare
Code reviewFound 4 issues:
tmuxp/src/tmuxp/workspace/builder.py Lines 674 to 680 in db303db
Lines 82 to 88 in db303db Lines 81 to 88 in db303db Lines 81 to 88 in db303db Lines 82 to 88 in db303db
Lines 326 to 334 in db303db
tmuxp/src/tmuxp/workspace/importers.py Lines 93 to 107 in db303db 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
60cd8fc to
92ba6f4
Compare
Code reviewNo issues found. Checked for bugs and CLAUDE.md compliance. Review scope (5 parallel agents):
Prior review rounds: 3 rounds of 3-model (Claude/Gemini/GPT) loom reviews found 16 issues, all fixed in subsequent commits on this branch. 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
Code reviewFound 1 issue:
Lines 334 to 337 in aa69986 Lines 403 to 406 in aa69986 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
Code reviewFound 2 issues:
Lines 792 to 819 in 395b1e1
tmuxp/src/tmuxp/workspace/loader.py Lines 43 to 48 in 395b1e1 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
c8dae37 to
3246cb1
Compare
067bc1f to
ac94a3d
Compare
Code reviewNo issues found. Checked for bugs and CLAUDE.md compliance. 🤖 Generated with Claude Code |
Code reviewFound 1 issue:
tmuxp/src/tmuxp/workspace/builder.py Lines 144 to 151 in 3d150bc Call site passing the un-normalized attribute: tmuxp/src/tmuxp/workspace/builder.py Lines 792 to 796 in 3d150bc 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
Code reviewNo issues found. Checked for bugs and CLAUDE.md compliance. 🤖 Generated with Claude Code |
a161cb7 to
13dc17e
Compare
why: tmuxp lacked several tmuxinator and teamocil workflows, so configs
from those tools lost behavior on import and users missed the lifecycle
and session-management commands they relied on.
what:
- Add session lifecycle commands: tmuxp stop / new / copy / delete.
- Add project lifecycle hooks: on_project_start / restart / exit / stop.
- Add {{ variable }} config templating, filled via --set at load time.
- Add pane titles and window keys (synchronize, shell_command_after,
clear).
- Add tmuxp load flags: --here, --no-shell-command-before, --debug.
- Broaden tmuxinator/teamocil imports: hooks, named panes, startup
focus, synchronized windows, tmux CLI args, teamocil v1.x format.
- Extend the builder protocol build() with here= for current-window
loads so all builders share the contract.
Summary
Bring tmuxp to feature parity with tmuxinator and teamocil. This adds the missing CLI commands, config keys, lifecycle hooks, config templating, and importer improvements that users migrating from those tools expect — plus a full feature comparison page and documentation for every new command, flag, and config key.
New CLI commands
tmuxp stop— kill a session with cleanup$ tmuxp stop mysessionRuns the
on_project_stoplifecycle hook before killing the session, giving projects a chance to tear down background services, save state, etc.tmuxp new— create a workspace config$ tmuxp new myprojectCreates a new workspace config from a minimal template and opens it in
$EDITOR.tmuxp copy— copy a workspace config$ tmuxp copy myproject myproject-backupCopies an existing workspace config to a new name. Source is resolved using the same logic as
tmuxp load.tmuxp delete— delete workspace configs$ tmuxp delete old-projectDeletes workspace config files. Prompts for confirmation unless
-yis passed.Lifecycle hooks
Workspace configs now support four hooks, matching tmuxinator's hook system:
on_project_starton_project_restarton_project_exitclient-detachedhook)on_project_stoptmuxp stopkills the sessionConfig templating
Workspace configs now support
{{ variable }}placeholders with values passed via--set. Givenmytemplate.yaml:$ tmuxp load --set project=myapp mytemplate.yamlNew config keys
Pane titles
synchronizeshorthandDesugars
synchronize: before→options: {synchronize-panes: on}andsynchronize: after→options_after: {synchronize-panes: on}.trueis equivalent tobefore.shell_command_afterandclearNew
tmuxp loadflags--here--no-shell-command-beforeshell_command_beforeentries--debug--set KEY=VALUEImporter improvements
tmuxinator
pre→on_project_start,pre_window→shell_command_beforecli_args(-f,-S,-L) parsed into tmuxp equivalentssynchronizewindow key convertedstartup_window/startup_pane→focus: trueon the targettitleon the panestr(fixes numeric/emoji YAML keys)teamocil
windowsat top level,commandskey in panes)focus: trueon windows and panes convertedoptionspassed throughDesign decisions
{{ var }}substitution, not Jinja2 — noconditionals or loops. Keeps configs declarative and avoids a template-engine
dependency;
--setvalues are validated against YAML-unsafe characters.--hereprovisions the reused pane withrespawn-pane -krather thantyping
cd/exportinto the running shell — no POSIX-shell assumption, nokeystrokes landing in foreground programs. tmuxp warns first if the pane has
running child processes, since
-kkills them.on_project_exitrides tmux'sclient-detachedhook, so it fires on anyclient detach — not only
tmuxp-initiated ones.Documentation
docs/comparison.md): Side-by-side of tmuxp vs tmuxinator vs teamocil — architecture, config keys, CLI flags, hooksdocs/configuration/top-level.md): New keys, lifecycle hooks, synchronize, pane titlesdocs/configuration/examples.md): Working examples for each new featureRelated issues
--hereprovisions viaset_environment+respawn-pane)on_project_first_starthook), here mode level 2: eliminate send_keys entirely — split-window/swap-pane/kill-pane #1032 (here mode withoutsend_keys),heremode:send_keysfor env vars and shell replacement diverges from teamocil and is unsafe #1030 (parent)Test plan
uv run py.testpassestmuxp loadwith lifecycle hooks,--here,--debug,--settmuxp stop,tmuxp new,tmuxp copy,tmuxp delete