Repository navigation
Ship dt-pty-host in the Devolutions.Terminal.Control NuGet package - #60
Merged
Marc-André Moreau (mamoreau-devolutions) merged 2 commits intoOct 24, 2026
Conversation
docs/parity-status.md still listed notarization and DMG as out of scope for macOS, while docs/macos.md documents signed, notarized .dmg release artifacts built in CI by scripts/Release-MacOsPackage.ps1. Align the distribution row and the final UI results bullet with macos.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Control package only carried the Windows ConPTY hosts, so embedding apps on Linux and macOS failed with "The Unix PTY host is missing." Pack dt-pty-host for linux-x64, linux-arm64, osx-x64 and osx-arm64 as runtimes/<rid>/native assets. LinuxPtyConnection now also probes runtimes/<rid>/native, where NuGet places the host for RID-less builds, and restores the execute bit that NuGet drops. A buildTransitive UnixPtyHost.targets marks the host executable when building on Linux or macOS. CI builds the four hosts on one macOS runner, packs with RequireUnixPtyHosts=true, validates the package with scripts/Test-ControlNuGetPackage.ps1, and runs the sample's new headless --pty-smoke mode on Windows, Linux x64/ARM64 and macOS ARM64. The sample and PACKAGE.md now launch $SHELL on Unix, because ProfileSettings defaults to Windows PowerShell on every OS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Marc-André Moreau (mamoreau-devolutions)
requested a review
from a team
as a code owner
October 23, 2026 21:32
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 23, 2026 21:36 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 23, 2026 21:36 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 23, 2026 21:37 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
deployed
to
publish-dry-run
October 23, 2026 21:37 — with
GitHub Actions
Active
Marc-André Moreau (mamoreau-devolutions)
merged commit Oct 24, 2026
dc1cd26
into
master
54 checks passed
Marc-André Moreau (mamoreau-devolutions)
deleted the
claude/dt-missing-features-a28685
branch
October 24, 2026 13:55
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Devolutions.Terminal.Controlonly packed the Windows ConPTY hosts. Avalonia apps embedding it on Linux or macOS failed at startup withFileNotFoundException: The Unix PTY host is missing., even though PACKAGE.md said one package reference was enough on every platform. This PR packsdt-pty-hostfor all four Unix RIDs and adds CI that proves a shell actually starts from the packed package.Changes
Package
Devolutions.Terminal.Control.csprojpacksruntimes/{linux,osx}-{x64,arm64}/native/dt-pty-hostfromnative/linux-pty/<rid>/.-p:RequireUnixPtyHosts=truefails the pack if any host is missing. Local packs report the missing hosts and continue, because macOS hosts can only be built on macOS.buildTransitive/Devolutions.Terminal.Control.targetsimports the existingConPtyHost.targetsplus a newUnixPtyHost.targets. The new targets runchmod +xon the host after build and publish when building on Linux or macOS.Runtime (
Devolutions.Terminal.Connection)UnixPtyHosthelper.LinuxPtyConnectionnow looks for the host next to the app first, then underruntimes/<rid>/native/, which is where NuGet puts it for RID-less builds.CI (
build-terminal.yml)unix-pty-hostsjob: builds all four hosts on onemacos-26runner. macOS hosts use Apple clang; Linux hosts cross-compile with Zig viaBuild-LinuxPtyHost.ps1.nuget-packpacks withRequireUnixPtyHosts=true, then:scripts/Test-ControlNuGetPackage.ps1(required entries, plus ELF/Mach-O format and architecture of each host);nuget-pack-unix-smokejob (Linux x64, Linux ARM64, macOS ARM64) runs the sample's--pty-smokefrom the packed package in three cases: RID-less build, host with the execute bit removed, and RID-specific publish.releasenow depends on it.Sample and docs
--pty-smokemode and launches$SHELLon Unix. Before this, it couldn't open a shell on Linux even with the host present, becauseProfileSettingsdefaults to the Windows PowerShell path on every OS. PACKAGE.md and release.md now say so.tree/mainsample link totree/master;MeasureCell(profile, scale)parameter name.This branch also carries a small doc fix:
docs/parity-status.mdnow says signed, notarized macOS DMGs ship from CI, matchingdocs/macos.md.Testing
Verified locally on Windows:
UnixPtyHostTests: 7 passed; the 2 execute-bit cases are Unix-only and skipped.RequireUnixPtyHosts=truefails when the macOS hosts are missing.Test-ControlNuGetPackage.ps1accepts a correct package and rejects a host built for the wrong architecture. I checked this with Zig-built dummy Mach-O binaries.runtimes/linux-*/native/dt-pty-host; and--pty-smokestarts a ConPTY session.Not verified locally: running the host on Linux or macOS. The new
unix-pty-hostsandnuget-pack-unix-smokejobs are the first real test there. In particular, cross-compiling the Linux hosts with Zig on the macOS runner has not run yet.Reviewer notes
.nupkgcan't carry Unix file modes (it is packed on Windows, and NuGet doesn't preserve them on extraction anyway). That's why the execute bit is restored both at build time and at runtime.🤖 Generated with Claude Code