Files
Netcatty/resources/et
陈大猫 01e7edc006 feat(mosh): integrate MoshCatty pure Rust client (no Cygwin legacy) (#2085)
* 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.
2026-07-10 20:24:24 +08:00
..

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

  1. .github/workflows/build-et-binaries.yml builds et on relevant pushes/PRs, or on a manual workflow_dispatch. It uses scripts/build-et/build-linux.sh and scripts/build-et/build-macos.sh for Linux/macOS, and scripts/build-et/build-windows.ps1 for Windows:

    target provenance
    linux-x64 upstream source, manylinux2014, vcpkg static deps + glibc
    linux-arm64 upstream source, manylinux2014, vcpkg static deps + glibc
    darwin-universal upstream source, lipo arm64 + x86_64, macOS system dylibs only
    win32-x64 upstream 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).

  2. When manually dispatched with release_tag, that workflow publishes the binaries to the dedicated binaricat/Netcatty-et-bin repository. The release gets a tag like et-bin-6.2.10-1, with SHA256SUMS attached.

  3. Release packaging runs scripts/resolve-et-bin-release.cjs before npm run fetch:et. It uses an explicit workflow input first, then the ET_BIN_RELEASE repository variable, then the latest non-draft et-bin-* GitHub Release from the dedicated binary repository. The fetch step pulls the binaries into resources/et/<platform-arch>/. For local packaging, set ET_BIN_RELEASE yourself before running the same fetch command. Override ET_BIN_OWNER / ET_BIN_REPO only when testing a different binary repository. electron-builder.config.cjs then copies the matching binary into Resources/et/et[.exe].

    Local dev uses the same binary path: npm run dev runs npm run fetch:et:dev first, which downloads the host platform's bundled et into this gitignored directory. Netcatty does not fall back to a system-installed et; 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_REF track upstream release tags automatically.