Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
152 commits
Select commit Hold shift + click to select a range
0868c75
ai(rules[check:*,implement]) Add tmuxinator parity commands
tony Feb 8, 2026
45c9361
docs(comparison) Add feature comparison table for tmuxp/tmuxinator/te…
tony Feb 8, 2026
0c87206
notes(parity) Add tmuxinator parity analysis
tony Feb 8, 2026
fbd7f4c
notes(parity) Add teamocil parity analysis
tony Feb 8, 2026
d73686f
notes(import) Add tmuxinator import behavior analysis
tony Feb 8, 2026
9e6e058
notes(import) Add teamocil import behavior analysis
tony Feb 8, 2026
bfbd8c9
fix(docs): Correct parity docs from verification pass
tony Feb 8, 2026
03b01f7
fix(comparison): Correct tmuxinator min tmux and detach flag
tony Feb 8, 2026
9538289
fix(import-tmuxinator): Add missing socket_path entry
tony Feb 8, 2026
788c8a5
fix(import-teamocil): Reclassify with_env_var and cmd_separator
tony Feb 8, 2026
f50679e
fix(comparison): Correct tmuxinator version ref and clarify details
tony Feb 8, 2026
d785144
fix(comparison): Annotate startup_window/startup_pane with tmuxp focu…
tony Feb 8, 2026
32e1f59
fix(parity-docs): Correct before_script hook mapping and --here details
tony Feb 8, 2026
188ea76
fix(parity-docs): Correct line number references in teamocil notes
tony Feb 8, 2026
b66dc78
fix(comparison): Correct tmuxinator min tmux, add session rename note…
tony Feb 8, 2026
5b5355e
fix(parity-tmuxinator): Fix startup_window/pane semantics, pre_window…
tony Feb 8, 2026
2785db4
fix(parity-teamocil): Add session rename behavior, fix with_env_var/c…
tony Feb 8, 2026
9b83c74
fix(import-tmuxinator): Correct pre/pre_window semantics and cli_args…
tony Feb 8, 2026
ad16216
fix(import-teamocil): Mark with_env_var/cmd_separator as unverified s…
tony Feb 8, 2026
2f7df66
docs(plan): Add parity implementation plan with API blockers
tony Feb 8, 2026
1eeb6b3
fix(plan): Correct line refs, add isinstance bug, expand T4/T8/L2 det…
tony Feb 8, 2026
fc5f87d
fix(plan): Correct L1/T1/T3 details from tmux source verification
tony Feb 8, 2026
f465705
fix(plan): Correct T2 insertion points and I7 line references
tony Feb 8, 2026
bfa55fa
fix(plan): Add tmux 3.2 sync scope detail and before_script limitation
tony Feb 8, 2026
30d5ea3
fix(plan): Add missing width drop note and importer update dependencies
tony Feb 8, 2026
2fb56dd
fix(plan): Fix phase numbering and add missing L3 to phase listing
tony Feb 8, 2026
f8b4cbc
fix(plan): Correct L3 logging description and I2 bug example
tony Feb 8, 2026
b5bb31b
docs(comparison): Update version, fix hook descriptions, add auto-det…
tony Mar 6, 2026
fafec7c
docs(parity-tmuxinator): Update version, add template execution order
tony Mar 6, 2026
c799c7e
docs(parity-teamocil): Update version and timestamp
tony Mar 6, 2026
0d80141
docs(import): Update timestamps for import behavior notes
tony Mar 6, 2026
6785e73
docs(teamocil): Verify v0.x features from 0.4-stable branch
tony Mar 6, 2026
a093f9e
docs(comparison): Add teamocil v0.x pane sizing keys
tony Mar 6, 2026
87c069e
docs(comparison): Refine auto-detection algorithm with v0.x fallback
tony Mar 6, 2026
454f650
docs(import-teamocil): Document accidental focus/target passthrough
tony Mar 6, 2026
5a164d9
docs(parity-teamocil): Add accidental v0.x focus/target passthrough
tony Mar 6, 2026
78eb1f2
docs(comparison): Fix pre-build script and deprecated hook mappings
tony Mar 6, 2026
2136cb1
docs(import-tmuxinator): Document pre→before_script semantic bug
tony Mar 6, 2026
aa7f3f0
docs(parity-tmuxinator): Add pre→before_script scope bug to importer …
tony Mar 6, 2026
172c2da
docs(plan): Add solo pre→before_script scope bug and update I1 analysis
tony Mar 7, 2026
ad7058f
docs(plan): Expand L4 APIs, fix I7 stale claim, add height/with_env_v…
tony Mar 7, 2026
05404a8
docs(plan): Add missing post and target keys from parity cross-reference
tony Mar 7, 2026
fb045f3
docs(comparison): Add synchronize deprecation, pane shell_command_bef…
tony Mar 7, 2026
81c0291
docs(parity-tmuxinator): Add synchronize deprecation and pane_title_f…
tony Mar 7, 2026
311c9fb
docs(parity-teamocil): Add v1.0 rewrite context from README
tony Mar 7, 2026
9efe080
docs(import-tmuxinator): Note synchronize deprecation in summary table
tony Mar 7, 2026
357960d
docs(import-teamocil): Update date after source verification
tony Mar 7, 2026
4d95da0
docs(plan): Add synchronize deprecation context to T1
tony Mar 7, 2026
a59bcbd
docs(plan): Fix accuracy issues from issue #1016 review
tony Mar 7, 2026
f960030
docs(parity-tmuxinator): Fix fallback order, add missing CLI details
tony Mar 7, 2026
ef39891
docs(parity-teamocil): Add layout-per-pane behavior and path expansion
tony Mar 7, 2026
07b33d0
docs(plan): Add test coverage gaps section from fixture analysis
tony Mar 7, 2026
00da754
docs(import-tmuxinator): Add YAML aliases and numeric/emoji name find…
tony Mar 7, 2026
22d45b3
ai(claude[command]): Add /check:audit parity audit command
tony Mar 7, 2026
3cb9e2d
ai(claude[command]): Add /check:plan parity plan command
tony Mar 7, 2026
f80de27
fix(importers[import_tmuxinator]): Fix pre/pre_window mapping to corr…
tony Mar 7, 2026
fc0d1bb
feat(importers[import_tmuxinator]): Use shlex.split for cli_args/tmux…
tony Mar 7, 2026
5b51471
fix(importers[import_teamocil]): Replace filter loop with direct assi…
tony Mar 7, 2026
c7598a0
test(importers[import_teamocil]): Add v1.x format test fixture
tony Mar 7, 2026
ac009ef
feat(importers[import_tmuxinator]): Add rvm, pre_tab, startup, and sy…
tony Mar 7, 2026
3090519
feat(importers[import_teamocil]): Add focus, options, and height hand…
tony Mar 7, 2026
cf011c8
feat(importers): Add logging for unsupported/dropped keys and remove …
tony Mar 7, 2026
114e7d2
docs(notes[plan]): Mark L1/L2/L3 as resolved in libtmux v0.55.0 and r…
tony Mar 15, 2026
0d3cd40
docs(notes[plan]): Fix stale libtmux and builder line references
tony Mar 15, 2026
932c685
feat(loader[expand]): Desugar synchronize shorthand into options/opti…
tony Mar 15, 2026
92eb6db
test(builder,loader): Add synchronize config key tests
tony Mar 15, 2026
342e032
docs(notes[plan]): Mark T1 synchronize as complete
tony Mar 15, 2026
422a5c8
feat(builder[config_after_window],loader[expand]): Add shell_command_…
tony Mar 15, 2026
ae402b4
test(builder,loader): Add shell_command_after tests
tony Mar 15, 2026
873faf0
docs(notes[plan]): Mark T3 shell_command_after as complete
tony Mar 15, 2026
b155e46
feat(loader[expand],builder[iter_create_panes]): Add pane title confi…
tony Mar 15, 2026
d30213b
test(builder,loader): Add pane title config key tests
tony Mar 15, 2026
7d8c76e
docs(notes[plan]): Mark T2 pane titles as complete
tony Mar 15, 2026
ab74763
feat(cli[load],builder): Add --here flag to reuse current window
tony Mar 15, 2026
ffda900
test(builder): Add here mode integration test
tony Mar 15, 2026
02188aa
docs(notes[plan]): Mark T4 --here CLI flag as complete
tony Mar 15, 2026
56d2ac6
feat(cli[stop]): Add tmuxp stop command to kill sessions
tony Mar 15, 2026
5fa64ca
test(cli[stop]): Add stop command tests
tony Mar 15, 2026
e5ee005
docs(notes[plan]): Mark T5 stop command as complete
tony Mar 15, 2026
ff2c661
test(cli[stop]): Register stop in help examples validation tests
tony Mar 15, 2026
f14d4c7
feat(cli[new,copy,delete]): Add config management commands
tony Mar 15, 2026
8c894bf
test(cli[new,copy,delete]): Add config management command tests
tony Mar 15, 2026
f3330a6
docs(notes[plan]): Mark T10 config management commands as complete
tony Mar 15, 2026
10c5334
feat(cli[load]): Add --no-shell-command-before flag
tony Mar 15, 2026
f05db44
test(cli[load]): Add --no-shell-command-before flag tests
tony Mar 15, 2026
e6dfca2
docs(notes[plan]): Mark T7 --no-shell-command-before as complete
tony Mar 15, 2026
afce7b4
feat(cli[load]): Add --debug flag to show tmux commands during build
tony Mar 15, 2026
0a9c50c
test(cli[load]): Add --debug flag tests
tony Mar 15, 2026
d5b8f93
docs(notes[plan]): Mark T9 --debug CLI flag as complete
tony Mar 15, 2026
7d2e079
feat(util,builder,cli[load,stop],loader): Add lifecycle hook config keys
tony Mar 15, 2026
249f842
test(util,builder,cli[load,stop],loader): Add lifecycle hook tests
tony Mar 15, 2026
56a5b29
docs(notes[plan]): Mark T6 lifecycle hook config keys as complete
tony Mar 15, 2026
220a6d5
fix(importers[tmuxinator]): Convert startup_window/startup_pane to fo…
tony Mar 15, 2026
f5ec12f
test(importers[tmuxinator]): Add startup_window/startup_pane focus tests
tony Mar 15, 2026
f1fae72
docs(notes[plan]): Mark I1-I7 importer fixes as complete, update prio…
tony Mar 15, 2026
0ce9ab6
feat(builder[config_after_window]): Handle clear config key for windo…
tony Mar 16, 2026
8688e34
test(builder): Add clear config key tests
tony Mar 16, 2026
d8a951c
docs(notes[plan]): Mark clear config key as complete
tony Mar 16, 2026
67efc40
fix(cli[load]): Read socket_name, socket_path, config from workspace …
tony Mar 16, 2026
84f7906
test(cli[load]): Add config key precedence tests for load_workspace
tony Mar 16, 2026
ee2c7f3
docs(notes[plan]): Mark dead config keys (config, socket_name) as com…
tony Mar 16, 2026
75ee9fc
feat(loader,cli[load]): Add {{ variable }} config templating with --s…
tony Mar 16, 2026
3a9eca0
test(loader,cli[load]): Add config templating and --set flag tests
tony Mar 16, 2026
2a76f2a
docs(notes[plan]): Mark T8 config templating as complete
tony Mar 16, 2026
9472024
fix(importers[tmuxinator]): Coerce window names to str, convert named…
tony Mar 16, 2026
95c6bb2
test(importers[tmuxinator]): Add edge case tests for window names, al…
tony Mar 16, 2026
ad84794
docs(notes[plan]): Mark edge case test coverage as complete
tony Mar 16, 2026
e4ee51c
fix(cli[load]): Only fire on_project_start when load proceeds
tony Mar 16, 2026
beb81f4
fix(cli[load]): Only fire on_project_restart after user confirms
tony Mar 16, 2026
1b80e9d
docs(cli[copy,delete,new,stop]): Add doctests to create_*_subparser f…
tony Mar 16, 2026
709dc85
docs(CHANGES): Add 1.68.0 release notes for parity features
tony Mar 16, 2026
94ae202
docs(cli[stop,new,copy,delete]): Add command docs and API pages
tony Mar 16, 2026
7cb0230
docs(cli[load]): Document new flags and config templating
tony Mar 16, 2026
47d6178
docs(config[top-level]): Document new config keys and lifecycle hooks
tony Mar 16, 2026
49d9ff1
docs(config[examples]): Add examples and tests for new features
tony Mar 16, 2026
9534366
docs(comparison): Update feature tables for parity
tony Mar 16, 2026
5fd1328
docs(index,import): Add comparison to toctree and update import notes
tony Mar 16, 2026
2ed81f3
cli(stop,new,copy,delete[help]): Show help when called with no arguments
tony Mar 17, 2026
228b73c
fix(builder[here]): Use shlex.quote for start_directory in --here mode
tony Mar 21, 2026
4a763ea
docs(cli[copy,delete,new,stop]): Add doctests to command_* entrypoints
tony Mar 21, 2026
29fe884
docs(cli[load]): Add doctest to _load_here_in_current_session
tony Mar 21, 2026
9e6c042
fix(importers[tmuxinator]): Warn when explicit socket_name overrides …
tony Mar 21, 2026
5298c7a
fix(util[run_hook_commands]): Add 120s timeout to hook subprocess
tony Mar 21, 2026
5b52733
fix(importers[tmuxinator]): Join list pre values before assigning to …
tony Mar 21, 2026
3186a02
fix(builder[here]): Clean existing panes before rebuilding in --here …
tony Mar 21, 2026
b8ed190
fix(cli[load]): Clean up debug handler on early parse/expand failures
tony Mar 21, 2026
cb5a1a5
fix(cli[new]): Split EDITOR env var with shlex for flag support
tony Mar 21, 2026
41279b2
fix(importers[tmuxinator]): Pass through pane title and lifecycle hoo…
tony Mar 21, 2026
dc68200
fix(importers[tmuxinator]): Warn on silently dropped tmux_command, at…
tony Mar 21, 2026
c9725bf
fix(loader[expand]): Validate pane_title_position against top/bottom/off
tony Mar 21, 2026
2666ac2
test(cli[load]): Assert --no-shell-command-before actually strips com…
tony Mar 21, 2026
f46dae9
fix(cli[new]): Handle missing EDITOR binary gracefully
tony Mar 21, 2026
6a56f50
fix(importers[tmuxinator]): Map standalone pre_window/pre_tab without…
tony Mar 22, 2026
47b44dd
fix(importers[tmuxinator]): Log info on numeric startup_window/pane i…
tony Mar 22, 2026
0929d2e
fix(builder[here]): Detect duplicate session name before renaming in …
tony Mar 22, 2026
e25e434
fix(builder[here]): Provision environment and window_shell in --here …
tony Mar 22, 2026
0e5b95a
fix(cli[copy]): Respect TMUXP_CONFIGDIR even when directory doesn't e…
tony Mar 22, 2026
eaf96fb
fix(importers[tmuxinator]): Drop dead on_project_first_start key from…
tony Mar 22, 2026
066db98
fix(importers[tmuxinator]): Join pre_window list with "; " when pre i…
tony Mar 22, 2026
5b84a1c
docs(cli[import]): Fix pre mapping description (before_script, not on…
tony Mar 22, 2026
a753426
fix(util[run_hook_commands]): Catch OSError for nonexistent cwd
tony Mar 22, 2026
917d4e4
fix(cli[stop]): Enable current-session fallback when no args given
tony Mar 22, 2026
2e05c47
fix(cli[stop]): Require TMUX env for no-args current-session fallback
tony Mar 22, 2026
81256aa
fix(importers[tmuxinator]): Use exclusive rbenv/rvm/pre_tab/pre_windo…
tony Mar 22, 2026
c0aa981
fix(builder[hooks]): Add cwd to on_project_exit run-shell command
tony Mar 22, 2026
705b1ac
fix(cli[load]): Make --here and --append mutually exclusive
tony Mar 22, 2026
30148bc
fix(cli[load]): Warn when --here used outside tmux
tony Mar 22, 2026
b4333c2
test(cli[help]): Add safety test for dangerous subprocess tmuxp calls
tony Mar 22, 2026
3e9361f
fix(importers[tmuxinator]): Map pre to on_project_start instead of be…
tony Mar 23, 2026
cd46b4a
fix(builder[here]): Move rename-conflict check before session mutation
tony Mar 23, 2026
151c693
fix(cli[stop]): Exit with code 1 on SessionNotFound
tony Mar 23, 2026
92ba6f4
fix(cli[load]): Add --detached to --here/--append mutual exclusion group
tony Mar 23, 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
241 changes: 241 additions & 0 deletions .claude/commands/check/audit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
---
description: Idempotent parity audit — checks deliverables, tmuxinator/teamocil parity, DX, pytest conventions, and test coverage
---

# /check:audit — Parity Audit

Idempotent status check for tmuxinator/teamocil parity work (issue #1016). Launches sub-agents to assess 6 dimensions, then synthesizes a status report with prioritized TODOs.

## Workflow

### Batch 1: Launch 3 Explore agents in parallel

#### Agent 1: Deliverable Check

Read these files and check each item:

- `src/tmuxp/workspace/importers.py`
- `src/tmuxp/workspace/builder.py` (search for `shell_command_after`, `synchronize`)
- `src/tmuxp/cli/load.py` (search for `--here`, `here`)
- `src/tmuxp/cli/__init__.py` (search for `stop`, `new`, `copy`, `delete`)

**Checklist** (mark ✅ done, ❌ missing, 🔧 partially done):

| ID | Item | What to check |
|----|------|---------------|
| I1 | `pre`/`pre_window` mapping | `pre` → `before_script` (not `shell_command`/`shell_command_before`). `pre_window` → `shell_command_before` |
| I2 | `cli_args`/`tmux_options` parsing | Uses `shlex.split()` token iteration, not `.replace("-f", "")` |
| I3 | Filter loop fix | Direct assignment with truthiness guard, not `for _b in` loop |
| I4 | v1.x teamocil format | String panes and `commands` key handled |
| I5 | Missing tmuxinator keys | `rvm`, `pre_tab`, `startup_window`, `startup_pane` handled |
| I6 | Missing teamocil keys | `focus`, `target`, `options` explicitly copied (not accidental mutation) |
| I7 | Importer TODOs | `with_env_var` → window `environment`, stale TODO docstring removed |
| T1 | `synchronize` desugar | Desugared to `options`/`options_after` in importer |
| T3 | `shell_command_after` | Processed in `config_after_window()` in builder |
| T4 | `--here` CLI flag | Flag exists in load.py, mutually exclusive with `--append` |
| T5 | `tmuxp stop` | Command registered in CLI |
| T10 | `tmuxp new/copy/delete` | Commands registered in CLI |

#### Agent 2: Tmuxinator Parity

Read `src/tmuxp/workspace/importers.py` (function `import_tmuxinator`).

If available, also read tmuxinator Ruby source at `~/study/ruby/tmuxinator/lib/tmuxinator/project.rb`.

For each tmuxinator config key, check if it's handled in the importer and if a test fixture covers it:

| Key | Handled? | Mapping correct? | Test fixture? |
|-----|----------|-------------------|---------------|
| `name` | | | |
| `project_name` | | | |
| `root` / `project_root` | | | |
| `pre` (string) | | | |
| `pre` (list) | | | |
| `pre_window` | | | |
| `pre_tab` | | | |
| `rbenv` | | | |
| `rvm` | | | |
| `tmux_options` / `cli_args` | | | |
| `socket_name` | | | |
| `startup_window` | | | |
| `startup_pane` | | | |
| `synchronize` (true/before/after/false) | | | |
| `tabs` (alias for windows) | | | |
| `on_project_start/exit/stop` | | | |
| `enable_pane_titles` | | | |
| `pane_title_position/format` | | | |
| window `pre` | | | |
| window `root` | | | |
| window `layout` | | | |
| window `panes` (list of strings) | | | |
| window `panes` (list of dicts) | | | |

#### Agent 3: Teamocil Parity

Read `src/tmuxp/workspace/importers.py` (function `import_teamocil`).

If available, also read teamocil Ruby source at `~/study/ruby/teamocil/lib/teamocil/tmux/`.

For each teamocil config key, check if it's handled in the importer and if a test fixture covers it:

| Key | Handled? | v0.x? | v1.x? | Test fixture? |
|-----|----------|-------|-------|---------------|
| `session.name` | | | | |
| `session.root` | | | | |
| `windows[].name` | | | | |
| `windows[].root` | | | | |
| `windows[].layout` | | | | |
| `windows[].clear` | | | | |
| `windows[].filters.before` | | | | |
| `windows[].filters.after` | | | | |
| `windows[].with_env_var` | | | | |
| `windows[].cmd_separator` | | | | |
| `windows[].focus` | | | | |
| `windows[].options` | | | | |
| `splits` (alias for panes) | | | | |
| `panes[].cmd` (string) | | | | |
| `panes[].cmd` (list) | | | | |
| `panes[].commands` (v1.x) | | | | |
| `panes[]` as string (v1.x) | | | | |
| `panes[]` as None | | | | |
| `panes[].focus` | | | | |
| `panes[].target` | | | | |
| `panes[].width` | | | | |
| `panes[].height` | | | | |

### Batch 2: Launch 3 more Explore agents in parallel

#### Agent 4: DX Happiness

Read:
- `src/tmuxp/cli/load.py` — flags, help strings, error messages
- `src/tmuxp/cli/import_config.py` — import flow warnings
- `src/tmuxp/util.py` — `run_before_script()` behavior

Check:
- Import CLI warns about manual adjustments after import
- Unsupported keys (width, height) produce log warnings (not silent drops)
- Multi-command `pre` lists warn with actionable guidance
- `--here` outside tmux gives clear error (not cryptic traceback)
- Schema validation catches bad imports before tmux session creation
- `tmuxp stop` has `--yes` flag for scripting

Report each issue with severity: **blocker** / **warning** / **nice-to-have**.

#### Agent 5: Pytest Happiness

Read all test files in:
- `tests/workspace/test_import_tmuxinator.py`
- `tests/workspace/test_import_teamocil.py`
- `tests/workspace/test_builder.py`
- `tests/cli/test_load.py` (if exists)

And all fixture files in:
- `tests/fixtures/import_tmuxinator/*.py`
- `tests/fixtures/import_teamocil/*.py`

**Convention checklist** (from CLAUDE.md):

| Convention | Status | Evidence |
|------------|--------|----------|
| Functional tests only (no `class TestFoo:`) | | |
| `NamedTuple` fixture classes with `test_id` | | |
| `@pytest.mark.parametrize` with `ids=` | | |
| Fixture modules export `*_yaml`, `*_dict`, `expected` | | |
| Tests call `validation.validate_schema()` | | |
| No `unittest.mock` (use `monkeypatch`) | | |
| No `tempfile` (use `tmp_path`) | | |
| `from __future__ import annotations` | | |
| `import typing as t` namespace | | |

List any violations with file path and line number.

#### Agent 6: Test Coverage

Read `src/tmuxp/workspace/importers.py` and enumerate every branch/condition.
Read all test files and fixtures to determine which branches are covered.

**`import_tmuxinator()` branches**:

| Branch | Condition | Tested? | Test ID |
|--------|-----------|---------|---------|
| session name | `project_name` present | | |
| session name | `name` present | | |
| session name | neither → `None` | | |
| start dir | `project_root` present | | |
| start dir | `root` present | | |
| cli args | `cli_args` with `-f` | | |
| cli args | `tmux_options` with `-f` | | |
| cli args | multi-flag (`-f -L`) | | |
| socket | `socket_name` present | | |
| pre | `pre` string only | | |
| pre | `pre` list single cmd | | |
| pre | `pre` list multi cmd (warning) | | |
| pre | `pre` + `pre_window` combo | | |
| pre_window | string | | |
| pre_window | list | | |
| pre_tab | alias for pre_window | | |
| rbenv | present | | |
| rvm | present | | |
| tabs | alias for windows | | |
| synchronize | true / "before" | | |
| synchronize | "after" | | |
| synchronize | false | | |
| startup_window | present | | |
| startup_pane | present | | |
| window | string value | | |
| window | None value | | |
| window | list value | | |
| window | dict with pre/panes/root/layout | | |

**`import_teamocil()` branches**:

| Branch | Condition | Tested? | Test ID |
|--------|-----------|---------|---------|
| session wrapper | `session` key present | | |
| session name | `name` present / absent | | |
| session root | `root` present | | |
| window clear | `clear` present | | |
| filters before | non-empty list | | |
| filters before | empty list | | |
| filters after | non-empty list | | |
| filters after | empty list | | |
| with_env_var | true | | |
| with_env_var | false | | |
| window root | present | | |
| splits alias | `splits` → `panes` | | |
| pane cmd | string | | |
| pane cmd | list | | |
| pane commands | v1.x key | | |
| pane string | v1.x format | | |
| pane None | blank pane | | |
| pane focus | present | | |
| pane target | present | | |
| pane width | warning | | |
| pane height | warning | | |
| window layout | present | | |
| window focus | present | | |
| window options | present | | |

### Synthesis

After all 6 agents complete, synthesize results into:

**Status Summary** — one line per dimension:
```
1. Deliverables: X/12 items complete
2. Tmuxinator: X/Y keys handled, X tested
3. Teamocil: X/Y keys handled, X tested
4. DX: X blockers, Y warnings
5. Pytest: X/Y conventions met
6. Coverage: X/Y branches tested
```

**Prioritized TODO** — ordered by impact:
1. Blockers (broken behavior, data loss)
2. Missing features (unhandled keys)
3. Test gaps (untested branches)
4. Convention violations
5. Nice-to-have DX improvements

**Ready to ship?** — Yes / No, with blocking items listed.
78 changes: 78 additions & 0 deletions .claude/commands/check/parity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# /check:parity — Feature Parity Analysis

Deep-dive analysis of tmuxp vs tmuxinator and teamocil. Updates comparison docs and parity notes.

## Workflow

1. **Read source code** of all three projects:
- tmuxp: `src/tmuxp/workspace/` (builder.py, loader.py, importers.py), `src/tmuxp/cli/load.py`
- tmuxinator: `~/study/ruby/tmuxinator/lib/tmuxinator/` (project.rb, window.rb, pane.rb, hooks/, assets/template.erb)
- teamocil: `~/study/ruby/teamocil/lib/teamocil/tmux/` (session.rb, window.rb, pane.rb)

2. **Read existing docs** for baseline:
- `docs/about.md` — tmuxp's own feature description
- `docs/comparison.md` — feature comparison table (create if missing)
- `notes/parity-tmuxinator.md` — tmuxinator parity analysis (create if missing)
- `notes/parity-teamocil.md` — teamocil parity analysis (create if missing)

3. **Update `docs/comparison.md`** with tabular feature comparison:
- Overview table (language, min tmux, config format, architecture)
- Configuration keys table (every key across all three, with ✓/✗)
- CLI commands table (side-by-side)
- Architecture comparison (ORM vs script generation vs command objects)
- Include version numbers for each project

4. **Update `notes/parity-tmuxinator.md`** with:
- Features tmuxinator has that tmuxp lacks (with source locations)
- Import behavior analysis (what the current importer handles vs misses)
- WorkspaceBuilder requirements for 100% feature support
- Code quality issues in current importer

5. **Update `notes/parity-teamocil.md`** with:
- Features teamocil has that tmuxp lacks (with source locations)
- v0.x vs v1.4.2 format differences (current importer targets v0.x only)
- Import behavior analysis
- WorkspaceBuilder requirements for full parity

6. **Commit each file separately**

## Key areas to verify

- Check `importers.py` line-by-line against actual tmuxinator/teamocil config keys
- Verify `load_workspace()` actually reads config keys it claims to support
- Cross-reference CHANGELOGs for version-specific features
- Check test fixtures match real-world configs

---

# Import Behavior

Study tmuxp, teamocil, and tmuxinator source code. Find any syntax they support that tmuxp's native syntax doesn't.

Create/update:
- `notes/import-teamocil.md`
- `notes/import-tmuxinator.md`

## Syntax Level Differences / Limitations

For each config key and syntax pattern discovered, classify as:

### Differences (Translatable)

Syntax that differs but can be automatically converted during import. Document the mapping.

### Limitations (tmuxp needs to add support)

Syntax/features that cannot be imported because tmuxp lacks the underlying capability. For each, note:
1. What the feature does in the source tool
2. Why it can't be imported
3. What tmuxp would need to add

---

# WorkspaceBuilder

Analyze what WorkspaceBuilder needs to:

1. **Auto-detect config format** — Determine heuristics to identify tmuxinator vs teamocil vs tmuxp configs transparently
2. **100% feature support** — List every feature/behavior needed for complete compatibility, including behavioral idiosyncrasies
Loading
Loading