Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
cdb0405
ai(rules[check:*,implement]) Add tmuxinator parity commands
tony Feb 8, 2026
7db7032
docs(comparison) Add feature comparison table for tmuxp/tmuxinator/te…
tony Feb 8, 2026
d80e36b
notes(parity) Add tmuxinator parity analysis
tony Feb 8, 2026
58b1eec
notes(parity) Add teamocil parity analysis
tony Feb 8, 2026
d276980
notes(import) Add tmuxinator import behavior analysis
tony Feb 8, 2026
cd8d34a
notes(import) Add teamocil import behavior analysis
tony Feb 8, 2026
4e2a07d
fix(docs): Correct parity docs from verification pass
tony Feb 8, 2026
b713f0b
fix(comparison): Correct tmuxinator min tmux and detach flag
tony Feb 8, 2026
7be8982
fix(import-tmuxinator): Add missing socket_path entry
tony Feb 8, 2026
0086afc
fix(import-teamocil): Reclassify with_env_var and cmd_separator
tony Feb 8, 2026
f7369b2
fix(comparison): Correct tmuxinator version ref and clarify details
tony Feb 8, 2026
102348c
fix(comparison): Annotate startup_window/startup_pane with tmuxp focu…
tony Feb 8, 2026
c51aad6
fix(parity-docs): Correct before_script hook mapping and --here details
tony Feb 8, 2026
7259733
fix(parity-docs): Correct line number references in teamocil notes
tony Feb 8, 2026
ca0f67a
fix(comparison): Correct tmuxinator min tmux, add session rename note…
tony Feb 8, 2026
a653ba3
fix(parity-tmuxinator): Fix startup_window/pane semantics, pre_window…
tony Feb 8, 2026
d024897
fix(parity-teamocil): Add session rename behavior, fix with_env_var/c…
tony Feb 8, 2026
53cf10e
fix(import-tmuxinator): Correct pre/pre_window semantics and cli_args…
tony Feb 8, 2026
82205c8
fix(import-teamocil): Mark with_env_var/cmd_separator as unverified s…
tony Feb 8, 2026
6bb063d
docs(plan): Add parity implementation plan with API blockers
tony Feb 8, 2026
d9350e1
fix(plan): Correct line refs, add isinstance bug, expand details
tony Feb 8, 2026
8cce569
fix(plan): Correct details from tmux source verification
tony Feb 8, 2026
e3715eb
fix(plan): Correct pane-title insertion points and teamocil line refe…
tony Feb 8, 2026
755af27
fix(plan): Add tmux 3.2 sync scope detail and before_script limitation
tony Feb 8, 2026
b8d3691
fix(plan): Add missing width drop note and importer update dependencies
tony Feb 8, 2026
a0a65bd
fix(plan): Fix phase numbering and add missing L3 to phase listing
tony Feb 8, 2026
414349a
fix(plan): Correct logging description and shlex bug example
tony Feb 8, 2026
cf0783f
docs(comparison): Update version, fix hook descriptions, add auto-det…
tony Mar 6, 2026
b320670
docs(parity-tmuxinator): Update version, add template execution order
tony Mar 6, 2026
e8a5ca3
docs(parity-teamocil): Update version and timestamp
tony Mar 6, 2026
6d69f0d
docs(import): Update timestamps for import behavior notes
tony Mar 6, 2026
42fea4d
docs(teamocil): Verify v0.x features from 0.4-stable branch
tony Mar 6, 2026
85477ff
docs(comparison): Add teamocil v0.x pane sizing keys
tony Mar 6, 2026
e7ead9d
docs(comparison): Refine auto-detection algorithm with v0.x fallback
tony Mar 6, 2026
2f1c32c
docs(import-teamocil): Document accidental focus/target passthrough
tony Mar 6, 2026
cf124f8
docs(parity-teamocil): Add accidental v0.x focus/target passthrough
tony Mar 6, 2026
450df97
docs(comparison): Fix pre-build script and deprecated hook mappings
tony Mar 6, 2026
f684c41
docs(import-tmuxinator): Document pre→before_script semantic bug
tony Mar 6, 2026
91bb744
docs(parity-tmuxinator): Add pre→before_script scope bug to importer …
tony Mar 6, 2026
a442594
docs(plan): Add solo pre-to-before_script scope bug and update analysis
tony Mar 7, 2026
389c67f
docs(plan): Expand available libtmux APIs, fix stale teamocil claim, …
tony Mar 7, 2026
d61b0a9
docs(plan): Add missing post and target keys from parity cross-reference
tony Mar 7, 2026
481e43c
docs(comparison): Add synchronize deprecation, pane shell_command_bef…
tony Mar 7, 2026
7333f2f
docs(parity-tmuxinator): Add synchronize deprecation and pane_title_f…
tony Mar 7, 2026
0c5ae9c
docs(parity-teamocil): Add v1.0 rewrite context from README
tony Mar 7, 2026
0496aac
docs(import-tmuxinator): Note synchronize deprecation in summary table
tony Mar 7, 2026
4e47d5e
docs(import-teamocil): Update date after source verification
tony Mar 7, 2026
805357c
docs(plan): Add synchronize deprecation context
tony Mar 7, 2026
1dc238d
docs(plan): Fix accuracy issues from issue #1016 review
tony Mar 7, 2026
022f8ad
docs(parity-tmuxinator): Fix fallback order, add missing CLI details
tony Mar 7, 2026
2da8043
docs(parity-teamocil): Add layout-per-pane behavior and path expansion
tony Mar 7, 2026
b5ba20d
docs(plan): Add test coverage gaps section from fixture analysis
tony Mar 7, 2026
40a6899
docs(import-tmuxinator): Add YAML aliases and numeric/emoji name find…
tony Mar 7, 2026
41959fe
docs(notes[plan]): Mark L1/L2/L3 resolved, fix stale line numbers, re…
tony Mar 15, 2026
1f6efa8
fix(import[teamocil]): Replace redundant filter loops with direct ass…
tony May 9, 2026
6865b9c
fix(import[tmuxinator]): Map pre to before_script, warn on shell cons…
tony May 9, 2026
35dcfb2
tests(import[tmuxinator]): Cover pre-to-before_script fix and shell-m…
tony May 9, 2026
15a8dbe
fix(import[tmuxinator]): Use shlex to parse cli_args/tmux_options
tony May 9, 2026
73f08ef
tests(import[tmuxinator]): Cover cli_args/tmux_options shlex parsing
tony May 9, 2026
5cf5805
feat(import[tmuxinator]): Add rvm, pre_tab, startup_*, socket_path, a…
tony May 9, 2026
9189bd3
tests(import[tmuxinator]): Cover rvm, startup_*, socket_path, attach
tony May 9, 2026
a6b4e5a
feat(import[teamocil]): Implement with_env_var, warn on cmd_separator…
tony May 9, 2026
11f74cf
tests(import[teamocil]): Cover with_env_var and TODO triage warnings
tony May 9, 2026
3ba3cac
fix(import[teamocil]): Detect v0.x by markers when session wrapper om…
tony May 9, 2026
aee111e
tests(import[teamocil]): Cover v1.x format dispatch and pane shorthand
tony May 9, 2026
42ccba8
fix(import[teamocil]): Pop v0.x pane width/height/target with warning
tony May 9, 2026
cb8ee1a
tests(import[teamocil]): Cover v0.x pane geometry-key drop warnings
tony May 9, 2026
7f0c465
docs(notes[plan]): Mark importer fixes resolved with implementation s…
tony May 9, 2026
59304a5
docs(CHANGES): Note tmuxinator/teamocil import behavior changes
tony May 9, 2026
cdebd7a
feat(builder): Handle synchronize config key with before/true/after
tony May 9, 2026
9949e16
tests(builder): Cover synchronize-panes config key
tony May 9, 2026
d6e75b9
feat(builder): Read window-level shell_command_after and send to each…
tony May 9, 2026
3263663
tests(builder): Cover window-level shell_command_after
tony May 9, 2026
3aeb5cc
feat(cli[load]): Add --no-shell-command-before flag
tony May 9, 2026
e7bb925
fix(loader): Apply no_shell_command_before guard to trickle propagation
tony May 9, 2026
89a49f1
feat(builder): Pane title config keys + per-pane title
tony May 9, 2026
4f7eb0a
tests(builder): Cover pane titles + fix global_=True for window scope
tony May 9, 2026
5e8edd8
feat(builder): Wire on_project_start/first_start/restart lifecycle hooks
tony May 9, 2026
0da05d6
tests(util): Cover run_lifecycle_hook helper
tony May 9, 2026
75551a1
feat(cli[manage]): Add new/copy/delete/implode workspace commands
tony May 9, 2026
d3f8418
tests(cli[manage]): Cover new/copy/delete/implode
tony May 9, 2026
d08e9de
feat(template): In-house ${var} engine + load -D KEY=VALUE plumbing
tony May 9, 2026
0359aa4
tests(_internal/template): Cover render + parse_cli_vars
tony May 9, 2026
c1d64b4
feat(cli[stop]): Add tmuxp stop with on_project_stop hook
tony May 9, 2026
cfc415e
tests(cli[stop]): Cover tmuxp stop session kill + hook order
tony May 9, 2026
03cbea0
feat(cli[load]): Add --here flag (load workspace into current session)
tony May 9, 2026
a33d32b
tests(cli[load]): Cover --here precondition errors
tony May 9, 2026
127c50e
feat(cli[load]): Add --dry-run via isolated tmux socket
tony May 9, 2026
2619a55
docs(CHANGES,notes[plan]): Document parity features and mark limitati…
tony May 9, 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
Prev Previous commit
Next Next commit
tests(builder): Cover window-level shell_command_after
why: Lock in the new builder behavior — the after-commands must
actually appear in every pane's output.

what:
- New fixture shell_command_after.yaml: 1 window with
  shell_command_after: [echo TMUXP_T3_MARKER] and 2 panes.
- New test_shell_command_after_runs_in_each_pane uses retry_until on
  pane.capture-pane to check for the marker in each pane.
- @pytest.mark.flaky(reruns=5) since send_keys output capture is
  timing-sensitive (matches existing test_window_options_after).

ref: notes/plan.md T3
  • Loading branch information
tony committed Jul 4, 2026
commit 3263663b736f476cbc7694dd787bd63acb7d98bb
10 changes: 10 additions & 0 deletions tests/fixtures/workspace/builder/shell_command_after.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
session_name: shell-command-after
windows:
- window_name: w1
shell_command_after:
- echo TMUXP_T3_MARKER
panes:
- shell_command:
- echo first
- shell_command:
- echo second
27 changes: 27 additions & 0 deletions tests/workspace/test_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -1998,3 +1998,30 @@ def test_synchronize_panes_true_treated_as_before(
window = builder.session.windows[-1]
assert bool(window.show_option("synchronize-panes")) is True
builder.session.kill()


@pytest.mark.flaky(reruns=5)
def test_shell_command_after_runs_in_each_pane(
session: Session,
) -> None:
"""Window-level `shell_command_after` runs in every pane post-build."""
workspace = ConfigReader._from_file(
test_utils.get_workspace_file("workspace/builder/shell_command_after.yaml"),
)
workspace = loader.expand(workspace)
builder = WorkspaceBuilder(session_config=workspace, server=session.server)
builder.build(session=session)

def saw_marker(p: Pane) -> bool:
def f() -> bool:
captured = p.cmd("capture-pane", "-p", "-J").stdout
return any("TMUXP_T3_MARKER" in line for line in captured)

return retry_until(f, raises=False)

window = builder.session.windows[-1]
for pane in window.panes:
assert saw_marker(pane), (
f"shell_command_after did not run in pane {pane.pane_id}"
)
builder.session.kill()