Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
6a14635
Clojure(fix[fixtures]): Await worker termination
tony Sep 20, 2026
4d049df
Clojure(fix[fixtures]): Match socket aliases
tony Sep 20, 2026
f8a0ff6
Clojure(docs[lifecycle]): Explain lazy scopes
tony Sep 20, 2026
c8fb4a6
Clojure(test[async]): Await cancelled completion
tony Sep 20, 2026
9980ba4
Clojure(fix[fixture]): Identify the tmux daemon
tony Sep 20, 2026
f1a46b0
Clojure(test[clients]): Cover switch and detach
tony Sep 20, 2026
0e117d5
Clojure(fix[async]): Await callback cancellation
tony Sep 20, 2026
899eaf4
Clojure(ci[matrix]): Cover runtime grid
tony Sep 20, 2026
06ff545
Server(fix): Enforce the tmux 3.3a floor
tony Oct 17, 2026
ad8ffed
CLI(fix): Check tmux and Python backend versions
tony Oct 17, 2026
bb66111
Facades(test): Model tmux version probes
tony Oct 17, 2026
6244d79
Support(chore): Set the tmux floor to 3.3a
tony Oct 17, 2026
0b73743
Migration(docs): Explain the tmux 3.3a floor
tony Oct 17, 2026
362b9d6
Changelog(docs): Record the tmux 3.3a floor
tony Oct 17, 2026
e49547a
Support(fix): Accept configured tmux names
tony Oct 17, 2026
63c4c5e
TypingTest(fix): Join wrapped capture rows
tony Oct 17, 2026
c2280b2
CI(fix): Qualify the Python core source
tony Oct 17, 2026
01a9a55
tmux(docs): Record version and capture quirks
tony Oct 17, 2026
6b5187a
Migration(docs): Explain Python source overlay
tony Oct 17, 2026
4261686
Changelog(docs): Note tmux executable names
tony Oct 17, 2026
3e1cd95
MCP(test): Synchronize pane output fixtures
tony Oct 17, 2026
8cc6b04
Server(fix): Probe the daemon version without firing hooks
tony Oct 17, 2026
dae97cf
Docs(fix): Describe the hook-free version probe
tony Oct 17, 2026
f069c0b
MCP(test): Let the shell settle before typing into it
tony Oct 17, 2026
58ce1ee
Changelog(docs): Note the hook-free version probe
tony Oct 17, 2026
8a1046a
MCP(style): Format the shell settle wait
tony Oct 17, 2026
d08b759
Kotlin(test): Block only the control attach in the stalled fixture
tony Oct 17, 2026
a64be93
Workspace(fix): Require Python optional feature policy v2
tony Oct 17, 2026
569a5f2
Features(fix): Refuse unsafe optional operations before their effects
tony Oct 17, 2026
3eec31d
Control(fix): Qualify the daemon and pin its socket before control
tony Oct 17, 2026
d6d8e9e
Docs(fix): Document per-feature tmux requirements
tony Oct 17, 2026
34e4e22
Migration(docs): Explain the optional tmux requirements
tony Oct 17, 2026
034b245
Changelog(docs): Record the optional tmux requirements
tony Oct 17, 2026
4b73231
Control(fix): Read the control identity without firing hooks
tony Oct 17, 2026
67f3606
Pushdown(test): Count the new version probe by its verb
tony Oct 17, 2026
c0f0d10
Cats(test): Give the lifecycle programs a budget the version check fi…
tony Oct 17, 2026
e4cd832
Docs(fix): Key the observer example by the verb a call ends with
tony Oct 17, 2026
a19c29b
Server(fix): Report a daemon that exits under the probe as not alive
tony Oct 17, 2026
96f4fe8
Support(test): Hold the version grammar to the canonical vectors
tony Oct 17, 2026
b742596
Modules(test): Let the staged Ox consumer accept the control refusal
tony Oct 17, 2026
1e18e94
Support(fix): Order release candidates in the natural version order
tony Oct 17, 2026
9348719
Server(fix): Ask a known daemon once and read it again when the fence…
tony Oct 17, 2026
61b4df0
CI(test): Run real 3.2a and 3.3 binaries as refusal lanes, and a 3.8 …
tony Oct 17, 2026
e0b0b0f
Docs(fix): Drop the stale probe counts and the 3.2a floor from the gu…
tony Oct 17, 2026
926bac2
Migration(docs): Explain the version order and strict parse
tony Oct 17, 2026
5c5968b
Changelog(docs): Record the version cache and the version order
tony Oct 17, 2026
3caa596
MCP(test): Expect no version probe between a final preflight and its …
tony Oct 17, 2026
b8ede38
Control(fix): Use the natural version order for the control floor
tony Oct 17, 2026
02e8ebb
Names(fix): Refuse a delimiter in a name on exact 3.7 before dispatch
tony Oct 17, 2026
279000d
Migration(docs): List the exact-3.7 name rule
tony Oct 17, 2026
38a9dc7
Changelog(docs): Record the exact-3.7 name rule
tony Oct 17, 2026
edafb7d
Clojure(chore[build]): Wire the Clojure modules into the build
tony Oct 17, 2026
a36c8c6
Clojure(feat[facade]): Add native Clojure facade
tony Sep 20, 2026
9a4b549
Clojure(fix[api]): Follow master's exceptions, capture view and admis…
tony Oct 17, 2026
1ddf7e9
Clojure(feat[control]): Build control on stable 3.7 and master's subs…
tony Oct 17, 2026
397f402
Clojure(ci): Run on JDK 25 and the 3.3a tmux matrix, pinned
tony Oct 17, 2026
53626b8
Changelog(docs): Record the Clojure facade's Java additions
tony Oct 17, 2026
b77f7a1
Clojure(test): Count one admission probe for a capture
tony Oct 17, 2026
b2be463
CI(fix): Let the rejection lanes pass in modules without the version …
tony Oct 17, 2026
b569d98
Docs(fix): Remove the remaining 3.2a floor claims
tony Oct 17, 2026
8103d10
Tests(chore): Share the PTY driver and add a native terminal client
tony Oct 17, 2026
f7a8e83
Examples(test): Run the watching examples only where control is avail…
tony Oct 17, 2026
f7442db
Server(feat): Capture a server's graph as one view and reserve releas…
tony Oct 17, 2026
f63657e
Clojure(ci): Run Gradle on JDK 25 and the Clojure on the lane's JDK
tony Oct 17, 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
12 changes: 6 additions & 6 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ answerable for how the whole library is tested.

## Building

You need JDK 25 or newer and tmux on `PATH`. Nothing else — Gradle provisions
the toolchain, and the library has no runtime dependencies. The workspace CLI
adds its own runtime dependencies; its terminal regression tests also require
Python 3 for the standard-library PTY driver and Bash on `PATH` for interactive
completion tests. On macOS, install Bash with Homebrew; the system Bash lacks
You need JDK 25 or newer and tmux on `PATH`. Gradle provisions the toolchain,
and the library has no runtime dependencies. Native terminal test fixtures need
Python 3 for its standard-library PTY driver. The workspace CLI adds its own
runtime dependencies; its interactive completion tests also need Bash on
`PATH`. On macOS, install Bash with Homebrew; the system Bash lacks
the completion test's Readline hooks.

`./gradlew` is the only supported entry point. A locally installed `gradle` is
Expand Down Expand Up @@ -232,7 +232,7 @@ toolchain and `options.release` in
version matrix in the CI workflow, which builds on 25 and 27, and the claim
`README.md` makes under `Requirements`.

**tmux 3.2a through 3.7c is the supported range**, and it is not a claim: the
**tmux 3.3a through 3.7c is the supported range**, and it is not a claim: the
whole real-tmux suite runs against every one of those releases, and each lane
checks it really ran the tmux it is named after. Moving the range means moving
`workflows/tmux-matrix.yml` and the README together.
Expand Down
6 changes: 3 additions & 3 deletions .github/WRITING.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Four things near the top are compatibility claims, and they move together:
exported identifiers without a deprecation period, pin an exact version, not
recommended for production. `CHANGELOG.md` and the `Status` section say the
same thing in the same words.
- **The requirements are JDK 25 or newer, and tmux 3.2a through 3.7c.** The tmux
- **The requirements are JDK 25 or newer, and tmux 3.3a through 3.7c.** The tmux
range is not a claim — the matrix runs every lane of it — so it may not drift
from `workflows/tmux-matrix.yml`.
- **Coordinates are group `io.github.libtmux`, imported through
Expand Down Expand Up @@ -120,7 +120,7 @@ Order it capability, then consequence, then compatibility:

> 0.0.1-alpha.7 adds streaming capture, and rejects `windowId` at pane scope
> rather than ignoring it. Pass `scope: window` to read at window scope. JDK 25
> and tmux 3.2a through 3.7c are unchanged.
> and tmux 3.3a through 3.7c are unchanged.

The title is plain — the version, optionally preceded by `libtmux for Java`.
Never "we are excited to announce"; state what shipped.
Expand Down Expand Up @@ -321,7 +321,7 @@ Bad (Delete):
Good (Keep):

```java
// tmux < 3.2 reports the pane ID only after the command completes,
// Some releases report the pane ID only after the command completes,
// so this query must stay separate.
```

Expand Down
11 changes: 11 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,17 @@ jobs:
run: |
python3 -m venv "$RUNNER_TEMP/workspace-python"
"$RUNNER_TEMP/workspace-python/bin/python" -m pip install 'tmuxp==1.74.0'
# Source-overlay qualification: released tmuxp still pins libtmux~=0.61.
# Reviewed PR780 supplies optional policy; these are not a released pair.
git init --quiet "$RUNNER_TEMP/python-libtmux-core"
git -C "$RUNNER_TEMP/python-libtmux-core" fetch --quiet --depth=1 \
https://github.com/tmux-python/libtmux.git 54b277bb673e208820fc9c795abe4444e2ded272
git -C "$RUNNER_TEMP/python-libtmux-core" checkout --quiet --detach \
54b277bb673e208820fc9c795abe4444e2ded272
PYTHONPATH="$RUNNER_TEMP/python-libtmux-core/src" "$RUNNER_TEMP/workspace-python/bin/python" -c \
'import sys, libtmux; from pathlib import Path; from libtmux.common import TMUX_MIN_VERSION, TMUX_OPTIONAL_FEATURE_POLICY_VERSION as policy; assert type(policy) is int and policy >= 2, policy; assert TMUX_MIN_VERSION == "3.3a", TMUX_MIN_VERSION; assert Path(libtmux.__file__).resolve() == Path(sys.argv[1]).resolve() / "libtmux" / "__init__.py", libtmux.__file__; print(TMUX_MIN_VERSION, policy, libtmux.__file__)' \
"$RUNNER_TEMP/python-libtmux-core/src"
echo "PYTHONPATH=$RUNNER_TEMP/python-libtmux-core/src" >> "$GITHUB_ENV"
echo "TMUX_WORKSPACE_TEST_PYTHON=$RUNNER_TEMP/workspace-python/bin/python" >> "$GITHUB_ENV"

# Runs every check task instead of stopping at the first failure, so one run names them all.
Expand Down
246 changes: 246 additions & 0 deletions .github/workflows/clojure-compatibility.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
name: Clojure compatibility

on:
push:
branches: [master]
pull_request:
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name == 'pull_request' && github.ref || github.sha }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

jobs:
check:
name: Clojure checks (JDK ${{ matrix.java }}, Clojure ${{ matrix.clojure }})
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
java: ['25', '27']
clojure: ['1.12.4', '1.12.6']
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Install tmux
run: |
sudo apt-get update
sudo apt-get install --no-install-recommends -y tmux
tmux -V

- uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6
with:
distribution: temurin
# Gradle runs on 25 in every lane (last entry is JAVA_HOME); the lane's JDK runs the Clojure.
java-version: |
${{ matrix.java }}
25

- uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
with:
validate-wrappers: true

- name: Run Clojure checks and publish local artifacts
run: >-
./gradlew check clojureDependencyMetadata platformCoversEveryPublishedModule
publishToMavenLocal --rerun-tasks --stacktrace
-PlibtmuxJavaVersion=${{ matrix.java }}
-PlibtmuxClojureVersion=${{ matrix.clojure }}

- name: No tmux server outlived the suite
if: always()
run: |
left="$(pgrep -c tmux || true)"
if [ "${left:-0}" -ne 0 ]; then
echo "::error::$left tmux server(s) survived the suite"
for p in $(pgrep tmux); do tr '\0' ' ' < "/proc/$p/cmdline"; echo; done
exit 1
fi
echo "no tmux server survived the suite"

- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
if: failure()
with:
name: reports-clojure-jdk${{ matrix.java }}-${{ matrix.clojure }}
path: '**/build/reports/**'
retention-days: 7

tmux:
name: Clojure tmux ${{ matrix.tmux }} (JDK ${{ matrix.java }}, Clojure ${{ matrix.clojure }})
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
java: ['25', '27']
clojure: ['1.12.4', '1.12.6']
tmux: ['3.3a', '3.4', '3.5', '3.6', '3.7', '3.7a', '3.7b', '3.7c']
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Build tmux dependencies
run: |
sudo apt-get update
sudo apt-get install --no-install-recommends -y \
build-essential libevent-dev libncurses-dev bison pkg-config

- name: Restore tmux ${{ matrix.tmux }}
id: tmux-cache
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ~/tmux-builds/${{ matrix.tmux }}
key: tmux-${{ matrix.tmux }}-${{ runner.os }}-${{ runner.arch }}

- name: Build tmux ${{ matrix.tmux }}
if: steps.tmux-cache.outputs.cache-hit != 'true'
env:
LANE: ${{ matrix.tmux }}
run: |
set -eux
work="$(mktemp -d)"
curl -fsSL -o "$work/tmux.tar.gz" \
"https://github.com/tmux/tmux/releases/download/$LANE/tmux-$LANE.tar.gz"
tar -xzf "$work/tmux.tar.gz" -C "$work"
cd "$work/tmux-$LANE"
./configure --prefix="$HOME/tmux-builds/$LANE"
make -j"$(nproc)"
make install

- name: The lane runs the tmux it is named after
env:
LANE: ${{ matrix.tmux }}
run: |
"$HOME/tmux-builds/$LANE/bin/tmux" -V

- uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6
with:
distribution: temurin
# Gradle runs on 25 in every lane (last entry is JAVA_HOME); the lane's JDK runs the Clojure.
java-version: |
${{ matrix.java }}
25

- uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
with:
validate-wrappers: true

- name: Run the native Clojure real-tmux suite
env:
LANE: ${{ matrix.tmux }}
run: |
./gradlew :integration-tests:clojureIntegrationTest --rerun-tasks --stacktrace \
-PlibtmuxJavaVersion=${{ matrix.java }} \
-PlibtmuxClojureVersion=${{ matrix.clojure }} \
"-PlibtmuxTmuxBinary=$HOME/tmux-builds/$LANE/bin/tmux" \
"-PlibtmuxTmuxExpected=$LANE"

- name: No tmux server outlived the suite
if: always()
run: |
left="$(pgrep -c tmux || true)"
if [ "${left:-0}" -ne 0 ]; then
echo "::error::$left tmux server(s) survived the suite"
for p in $(pgrep tmux); do tr '\0' ' ' < "/proc/$p/cmdline"; echo; done
exit 1
fi
echo "no tmux server survived the suite"

- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
if: failure()
with:
name: reports-clojure-tmux-${{ matrix.tmux }}-jdk${{ matrix.java }}-${{ matrix.clojure }}
path: '**/build/reports/**'
retention-days: 7

macos:
name: Clojure macOS tmux ${{ matrix.tmux }} (JDK ${{ matrix.java }}, Clojure ${{ matrix.clojure }})
runs-on: macos-latest
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
java: ['25', '27']
clojure: ['1.12.4', '1.12.6']
tmux: ['3.3a', '3.7c']
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7

- name: Build tmux dependencies
run: brew install libevent ncurses bison pkg-config

- name: Restore tmux ${{ matrix.tmux }}
id: tmux-cache
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6
with:
path: ~/tmux-builds/${{ matrix.tmux }}
key: tmux-${{ matrix.tmux }}-${{ runner.os }}-${{ runner.arch }}

- name: Build tmux ${{ matrix.tmux }}
if: steps.tmux-cache.outputs.cache-hit != 'true'
env:
LANE: ${{ matrix.tmux }}
run: |
set -eux
work="$(mktemp -d)"
curl -fsSL -o "$work/tmux.tar.gz" \
"https://github.com/tmux/tmux/releases/download/$LANE/tmux-$LANE.tar.gz"
tar -xzf "$work/tmux.tar.gz" -C "$work"
cd "$work/tmux-$LANE"
libevent_prefix="$(brew --prefix libevent)"
ncurses_prefix="$(brew --prefix ncurses)"
export PKG_CONFIG_PATH="$libevent_prefix/lib/pkgconfig:$ncurses_prefix/lib/pkgconfig"
export CPPFLAGS="-I$ncurses_prefix/include"
export LDFLAGS="-L$ncurses_prefix/lib"
./configure --prefix="$HOME/tmux-builds/$LANE" --disable-utf8proc
make -j"$(sysctl -n hw.logicalcpu)"
make install

- name: The lane runs the tmux it is named after
env:
LANE: ${{ matrix.tmux }}
run: |
"$HOME/tmux-builds/$LANE/bin/tmux" -V

- uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6
with:
distribution: temurin
# Gradle runs on 25 in every lane (last entry is JAVA_HOME); the lane's JDK runs the Clojure.
java-version: |
${{ matrix.java }}
25

- uses: gradle/actions/setup-gradle@3f5f9adaf7d9fecd50b5935e54106014257a94e6 # v6.4.0
with:
validate-wrappers: true

- name: Run the native Clojure smoke and lifecycle suite
env:
LANE: ${{ matrix.tmux }}
run: |
./gradlew :integration-tests:clojureIntegrationTest --rerun-tasks --stacktrace \
-PlibtmuxJavaVersion=${{ matrix.java }} \
-PlibtmuxClojureVersion=${{ matrix.clojure }} \
"-PlibtmuxTmuxBinary=$HOME/tmux-builds/$LANE/bin/tmux" \
"-PlibtmuxTmuxExpected=$LANE"

- name: No tmux server outlived the suite
if: always()
run: |
left="$(pgrep -c tmux || true)"
if [ "${left:-0}" -ne 0 ]; then
echo "::error::$left tmux server(s) survived the suite"
for p in $(pgrep tmux); do ps -o command= -p "$p"; done
exit 1
fi
echo "no tmux server survived the suite"

- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
if: failure()
with:
name: reports-clojure-macos-${{ matrix.tmux }}-jdk${{ matrix.java }}-${{ matrix.clojure }}
path: '**/build/reports/**'
retention-days: 7
2 changes: 2 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ jobs:
libtmux-jackson/build/libs/*.jar
libtmux-junit5/build/libs/*.jar
libtmux-kotlin/build/libs/*.jar
libtmux-clojure/build/libs/*.jar
libtmux-clojure-core-async/build/libs/*.jar
libtmux-mcp/build/libs/*.jar
libtmux-workspace/build/libs/*.jar
libtmux-workspace-cli/build/libs/*.jar
Expand Down
25 changes: 22 additions & 3 deletions .github/workflows/tmux-matrix.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: tmux matrix

# The README claims tmux 3.2a through 3.7c, and says that range is not a claim because the suite runs
# The README claims tmux 3.3a through 3.7c, and says that range is not a claim because the suite runs
# against every one of them. This is where that stops depending on someone running it locally.

on:
Expand All @@ -27,7 +27,7 @@ jobs:
lanes:
# Preview lanes carry their own label: this is the only place a reader sees which entries the
# supported range does not include, since the README and the matrix property list only the rest.
name: tmux ${{ matrix.tmux }}${{ matrix.experimental && ' (preview, not supported)' || '' }}
name: tmux ${{ matrix.tmux }}${{ matrix.experimental && ' (preview, not supported)' || '' }}${{ matrix.rejection && ' (must be refused)' || '' }}
runs-on: ubuntu-latest
timeout-minutes: ${{ matrix.tmux == 'master' && 25 || 15 }}
continue-on-error: ${{ matrix.experimental == true }}
Expand All @@ -38,11 +38,19 @@ jobs:
# (its `lanes` list), which is the source of truth. The agree step below fails if they drift
# apart. This is also what DocumentationFactsTest reads the README's claimed range from, so a
# preview lane belongs in `include` below and never here.
tmux: ['3.2a', '3.3', '3.3a', '3.4', '3.5', '3.6', '3.7', '3.7a', '3.7b', '3.7c']
tmux: ['3.3a', '3.4', '3.5', '3.6', '3.7', '3.7a', '3.7b', '3.7c']
# Ahead of the supported range, matching the plugin's `previewLanes` list: 3.8-rc2 is a
# candidate for a release not yet cut, and master is upstream's development branch, not a
# version. Both may fail and neither moves the README's claimed range.
include:
# Below the floor, matching the plugin's `rejectionLanes`: the real binary must refuse
# every call and leave a sentinel session, option and buffer untouched.
- tmux: '3.2a'
rejection: true
- tmux: '3.3'
rejection: true
- tmux: '3.8'
experimental: true
- tmux: '3.8-rc2'
experimental: true
- tmux: master
Expand Down Expand Up @@ -132,6 +140,17 @@ jobs:
run: |
python3 -m venv "$RUNNER_TEMP/workspace-python"
"$RUNNER_TEMP/workspace-python/bin/python" -m pip install 'tmuxp==1.74.0'
# Source-overlay qualification: released tmuxp still pins libtmux~=0.61.
# Reviewed PR780 supplies optional policy; these are not a released pair.
git init --quiet "$RUNNER_TEMP/python-libtmux-core"
git -C "$RUNNER_TEMP/python-libtmux-core" fetch --quiet --depth=1 \
https://github.com/tmux-python/libtmux.git 54b277bb673e208820fc9c795abe4444e2ded272
git -C "$RUNNER_TEMP/python-libtmux-core" checkout --quiet --detach \
54b277bb673e208820fc9c795abe4444e2ded272
PYTHONPATH="$RUNNER_TEMP/python-libtmux-core/src" "$RUNNER_TEMP/workspace-python/bin/python" -c \
'import sys, libtmux; from pathlib import Path; from libtmux.common import TMUX_MIN_VERSION, TMUX_OPTIONAL_FEATURE_POLICY_VERSION as policy; assert type(policy) is int and policy >= 2, policy; assert TMUX_MIN_VERSION == "3.3a", TMUX_MIN_VERSION; assert Path(libtmux.__file__).resolve() == Path(sys.argv[1]).resolve() / "libtmux" / "__init__.py", libtmux.__file__; print(TMUX_MIN_VERSION, policy, libtmux.__file__)' \
"$RUNNER_TEMP/python-libtmux-core/src"
echo "PYTHONPATH=$RUNNER_TEMP/python-libtmux-core/src" >> "$GITHUB_ENV"
echo "TMUX_WORKSPACE_TEST_PYTHON=$RUNNER_TEMP/workspace-python/bin/python" >> "$GITHUB_ENV"

# One lane rather than testTmuxMatrix: each version builds and runs on its own runner, so the
Expand Down
Loading
Loading