* feat(mosh): default bundled client to MoshCatty releases Wire Netcatty packaging and npm run dev to pull pure Rust mosh-client binaries from binaricat/MoshCatty (moshcatty-* tags), document the cutover, and mark the old Cygwin Windows fetch path as legacy-only. * fix(mosh): accept pure MoshCatty packages (exe-only, no dlls/terminfo) Align fetch/packaging with MoshCatty pure-Rust releases: require only mosh-client[.exe], treat Cygwin dll bags and terminfo as optional legacy layout. Document moshcatty-0.1.1 (ConPTY Ctrl+C + static MSVC CRT). * refactor(mosh): drop Cygwin legacy; MoshCatty-only pipeline Remove FluentTerminal/mosh-bin fallbacks, build-mosh C++ CI, and dll/terminfo runtime helpers. Fetch accepts only moshcatty-* pure binaries; packaging ships a single mosh-client per platform. * docs: align ET checklist and et README with MoshCatty-only mosh Update mosh template references after removing Cygwin build pipeline and legacy fallbacks. Point ET packaging notes at fetch-mosh / MoshCatty instead of deleted build-mosh-binaries workflow. * docs(mosh): require MoshCatty 0.1.2+ for Linux glibc floors Codex review vs main: defaulting to MoshCatty Linux binaries built on ubuntu-latest required GLIBC 2.34, above Netcatty's package floors (x64 2.28 / arm64 2.31). Document the floors, prefer moshcatty-0.1.2+, and drop trailing whitespace in the design note. Upstream MoshCatty release CI now builds in almalinux:8 / debian:bullseye with assert. * fix(mosh): reject MoshCatty releases below 0.1.2 Codex re-review: docs alone still allowed MOSH_BIN_RELEASE=moshcatty-0.1.0/0.1.1, which produce packages that fail to start on Netcatty's Linux glibc floors. Validate the minimum tag in resolve and fetch, skip pre-0.1.2 when picking latest, and cover the reject path in unit tests. * fix(mosh): pin MoshCatty owner and reject floor prereleases Codex review vs main (P2): - Always default MOSH_BIN owner/repo to binaricat/MoshCatty; do not inherit fork owner from GITHUB_REPOSITORY in resolve or fetch. - Treat moshcatty-X.Y.Z-rcN as below final X.Y.Z so pins like moshcatty-0.1.2-rc1 cannot bypass the glibc floor. * fix(mosh): accept build metadata in MoshCatty release tags TAG_RE rejected '+' so moshcatty-0.1.2+build.1 failed validation even though the version parser and isAtLeastMinRelease accepted it. Align the regex and require a successful semver parse.
Bundled EternalTerminal et client
This directory holds the EternalTerminal client binary (et) bundled
with the Netcatty installer. Netcatty launches this bundled et directly
(see electron/bridges/terminalBridge/etSession.cjs); et performs its
own SSH bootstrap and EternalTerminal protocol handshake against the remote
etserver / etterminal.
Like MoshCatty mosh-client, et is a pure network-transport client and does not
render a terminal locally, so there is no terminfo bundle here — only the
single et (et.exe on Windows) binary.
How binaries land here
-
.github/workflows/build-et-binaries.ymlbuildseton relevant pushes/PRs, or on a manualworkflow_dispatch. It usesscripts/build-et/build-linux.shandscripts/build-et/build-macos.shfor Linux/macOS, andscripts/build-et/build-windows.ps1for Windows:target provenance linux-x64upstream source, manylinux2014, vcpkg static deps + glibc linux-arm64upstream source, manylinux2014, vcpkg static deps + glibc darwin-universalupstream source, lipo arm64 + x86_64, macOS system dylibs only win32-x64upstream source, MSVC + vcpkg x64-windows-static(no DLLs)win32-arm64(not built — add after a tested arm64 client is available) ET builds with CMake + Ninja + vcpkg (
cmake -DDISABLE_TELEMETRY=ON -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo). -
When manually dispatched with
release_tag, that workflow publishes the binaries to the dedicatedbinaricat/Netcatty-et-binrepository. The release gets a tag likeet-bin-6.2.10-1, withSHA256SUMSattached. -
Release packaging runs
scripts/resolve-et-bin-release.cjsbeforenpm run fetch:et. It uses an explicit workflow input first, then theET_BIN_RELEASErepository variable, then the latest non-draftet-bin-*GitHub Release from the dedicated binary repository. The fetch step pulls the binaries intoresources/et/<platform-arch>/. For local packaging, setET_BIN_RELEASEyourself before running the same fetch command. OverrideET_BIN_OWNER/ET_BIN_REPOonly when testing a different binary repository.electron-builder.config.cjsthen copies the matching binary intoResources/et/et[.exe].Local dev uses the same binary path:
npm run devrunsnpm run fetch:et:devfirst, which downloads the host platform's bundledetinto this gitignored directory. Netcatty does not fall back to a system-installedet; if the bundled binary is missing, ET startup fails loudly instead of using whatever happens to be installed on the developer machine.
The directory is otherwise empty (binaries are gitignored).
Licenses
- EternalTerminal is licensed under Apache-2.0 (https://github.com/MisterTea/EternalTerminal).
- Netcatty is GPL-3.0; Apache-2.0 is one-way compatible with GPL-3.0, so redistribution as part of the installer is permitted.
- vcpkg-managed deps (boost Boost-License, libsodium ISC, protobuf BSD-3-Clause, gflags BSD-3-Clause) are compatible with GPL-3.0.
Reproducible build
To reproduce the Linux binary locally:
docker run --rm -v $PWD:/workspace -w /workspace \
-e ET_REF=et-v6.2.10 -e ARCH=x64 -e OUT_DIR=/workspace/out \
quay.io/pypa/manylinux2014_x86_64 \
bash scripts/build-et/build-linux.sh
For macOS the build needs an Xcode toolchain; see
scripts/build-et/build-macos.sh. For Windows see
scripts/build-et/build-windows.ps1.
Roadmap
- Add Windows arm64 only after a tested standalone arm64 client is available.
- Make
ET_REFtrack upstream release tags automatically.