mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-22 08:02:24 +00:00
The `tty7` CLI was built by every release run and thrown away: all four bundle scripts copied only `tty7-app`, and the upload glob covers `dist/`, which the CLI never reached. Nothing put it on PATH either, so the agent-facing half of the product was unreachable from a shipped install. Bundle it on all four platforms, and have the GUI link it up itself rather than hiding the step behind a menu item most people never find. The install has two halves. The environment half prepends the CLI's directory to this process's PATH before the daemon is spawned, so every pane inherits it — that alone makes `tty7` work where agents actually run, writes nothing to disk, and behaves the same everywhere. The on-disk half symlinks into a directory already on PATH (Unix) or appends to HKCU\Environment (Windows), and is allowed to fail. Candidate directories are a fixed list intersected with PATH, not the first writable entry on it: pyenv/rbenv/asdf/mise shim directories sit at the front of PATH on many machines and are writable, and anything dropped there is deleted on the next rehash — silently, days later. Debug builds get the environment half only. `target/debug` holds a `tty7` too, so otherwise a `cargo run` would repoint the developer's real `tty7` at a debug binary, and each isolated dev-verify instance would rewrite the PATH of the machine it is meant to stay away from.
71 lines
3.3 KiB
PowerShell
71 lines
3.3 KiB
PowerShell
# Usage: bundle-windows.ps1 <target-triple> <arch-label>
|
|
# Package the release binary twice from one staged payload:
|
|
# dist/tty7-<version>-windows-<arch>.zip portable (unzip anywhere)
|
|
# dist/tty7-<version>-windows-<arch>-setup.exe Inno Setup installer
|
|
# (Program Files or per-user, Start Menu shortcut, "Apps" uninstall entry)
|
|
#
|
|
# Fonts are embedded via include_bytes! and the app icon is compiled into the
|
|
# executable as a resource (see build.rs). So the payload is tty7-app.exe plus a
|
|
# sibling completions\ dir (loaded at runtime — see terminal::signature) and the
|
|
# license/readme. Both artifacts are unsigned builds — SmartScreen will
|
|
# warn on first launch.
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
$Target = $args[0]
|
|
$Arch = $args[1]
|
|
$Version = (Select-String -Path Cargo.toml -Pattern '^version\s*=\s*"([^"]+)"').Matches[0].Groups[1].Value
|
|
$Name = "tty7-$Version-windows-$Arch"
|
|
$Stage = "dist/$Name"
|
|
|
|
Remove-Item -Recurse -Force dist -ErrorAction SilentlyContinue
|
|
New-Item -ItemType Directory -Force -Path $Stage | Out-Null
|
|
|
|
Copy-Item "target/$Target/release/tty7-app.exe" "$Stage/tty7-app.exe"
|
|
# The CLI, staged beside the GUI so both the zip and the installer carry it.
|
|
# `core::cli_install` resolves it relative to tty7-app.exe and puts that
|
|
# directory on the user's PATH.
|
|
Copy-Item "target/$Target/release/tty7.exe" "$Stage/tty7.exe"
|
|
New-Item -ItemType Directory -Force -Path "$Stage/completions" | Out-Null
|
|
Copy-Item "assets/completions/*.json" "$Stage/completions/"
|
|
Copy-Item LICENSE "$Stage/LICENSE.txt"
|
|
Copy-Item README.md "$Stage/README.md"
|
|
|
|
# The Linux musl `tty7-server`, staged at server/ so a WSL distro can be handed
|
|
# the binary this client shipped with (WSL downloads nothing). The
|
|
# lookup path is a contract with `daemon::install::wsl` — it searches
|
|
# <dir of tty7-app.exe>/server/<asset> first — so this directory name is not free to
|
|
# change on its own. Missing is a warning, not an error, matching `server-musl`'s
|
|
# own skip-don't-fail probe; WSL then fails at connect time with a message
|
|
# naming the directories it searched.
|
|
#
|
|
# The *filename* is a contract too, not just the directory: `wsl.rs` looks for
|
|
# `<dir>/<asset name>`, so this string has to stay whatever
|
|
# `install::asset::ASSET_X86_64` says it is.
|
|
$ServerAsset = "tty7-server-linux-x86_64-musl"
|
|
$ServerSrc = "bundled-server/$ServerAsset"
|
|
if (Test-Path $ServerSrc) {
|
|
New-Item -ItemType Directory -Force -Path "$Stage/server" | Out-Null
|
|
Copy-Item $ServerSrc "$Stage/server/$ServerAsset"
|
|
Write-Host "OK bundled $ServerAsset"
|
|
} else {
|
|
Write-Warning "no $ServerAsset to bundle - this build cannot serve WSL distros"
|
|
}
|
|
|
|
Compress-Archive -Path "$Stage/*" -DestinationPath "dist/$Name.zip" -Force
|
|
|
|
# Installer, built from the same staged payload. ISCC is on PATH on GitHub's
|
|
# windows-latest image; fall back to the default install location.
|
|
$Iscc = (Get-Command ISCC.exe -ErrorAction SilentlyContinue).Source
|
|
if (-not $Iscc) { $Iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe" }
|
|
& $Iscc `
|
|
"/DAppVersion=$Version" `
|
|
"/DStageDir=$((Resolve-Path $Stage).Path)" `
|
|
"/DOutputDir=$((Resolve-Path dist).Path)" `
|
|
"/DOutputName=$Name-setup" `
|
|
.github/scripts/windows-installer.iss
|
|
if ($LASTEXITCODE -ne 0) { throw "ISCC exited with $LASTEXITCODE" }
|
|
|
|
Remove-Item -Recurse -Force $Stage
|
|
Write-Host "OK dist/$Name.zip"
|
|
Write-Host "OK dist/$Name-setup.exe"
|