From 0fb1c09041cfc0a1eb83cda489ff5526151bcc7b Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Thu, 27 Aug 2026 23:55:15 -0400 Subject: [PATCH] t3code-patched-bin: T3 Code with the environment-theme patches Built from the environment-theme branch of ryanrhughes/t3code (tag v0.0.35-omarchy.1) until upstream ships it: the app follows themes the machine publishes into its state directory -- Omarchy retints it live -- and t3 theme set works. Same packaging as t3code-bin, conflicts with it, and the next upstream release supersedes it after a rebase. --- .../t3code-patched-bin/.omarchy/package.json | 3 + pkgbuilds/t3code-patched-bin/LICENSE | 21 +++ pkgbuilds/t3code-patched-bin/PKGBUILD | 123 ++++++++++++++++++ pkgbuilds/t3code-patched-bin/t3-launcher.sh | 10 ++ .../t3code-patched-bin/t3code-launcher.sh | 31 +++++ 5 files changed, 188 insertions(+) create mode 100644 pkgbuilds/t3code-patched-bin/.omarchy/package.json create mode 100644 pkgbuilds/t3code-patched-bin/LICENSE create mode 100644 pkgbuilds/t3code-patched-bin/PKGBUILD create mode 100755 pkgbuilds/t3code-patched-bin/t3-launcher.sh create mode 100644 pkgbuilds/t3code-patched-bin/t3code-launcher.sh diff --git a/pkgbuilds/t3code-patched-bin/.omarchy/package.json b/pkgbuilds/t3code-patched-bin/.omarchy/package.json new file mode 100644 index 0000000..2a9719d --- /dev/null +++ b/pkgbuilds/t3code-patched-bin/.omarchy/package.json @@ -0,0 +1,3 @@ +{ + "source": "local" +} diff --git a/pkgbuilds/t3code-patched-bin/LICENSE b/pkgbuilds/t3code-patched-bin/LICENSE new file mode 100644 index 0000000..55ee675 --- /dev/null +++ b/pkgbuilds/t3code-patched-bin/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 T3 Tools Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/pkgbuilds/t3code-patched-bin/PKGBUILD b/pkgbuilds/t3code-patched-bin/PKGBUILD new file mode 100644 index 0000000..75d6168 --- /dev/null +++ b/pkgbuilds/t3code-patched-bin/PKGBUILD @@ -0,0 +1,123 @@ +# Maintainer: Ryan Hughes + +# T3 Code built from the environment-theme branch of ryanrhughes/t3code, until +# upstream ships it: the desktop follows the machine's published themes +# (Omarchy retints it live) and `t3 theme set` works. Packaging matches +# t3code-bin exactly, so this installs in its place and the AppImage is +# unpacked the same way. Rebase: rebase the branch on the upstream release, +# `pnpm dist:desktop:linux` with the release's version, retag, update pkgver, +# _patchtag, and checksums, and reset pkgrel. + +pkgname=t3code-patched-bin +pkgver=0.0.35 +pkgrel=1 +pkgdesc="Open-source control plane for coding agents, with Omarchy environment-theme patches" +arch=('x86_64') +url="https://t3.codes" +license=('MIT') + +depends=( + 'alsa-lib' + 'at-spi2-core' + 'cairo' + 'dbus' + 'expat' + 'gcc-libs' + 'glib2' + 'glibc' + 'gtk3' + 'hicolor-icon-theme' + 'libcups' + 'libnotify' + 'libx11' + 'libxcb' + 'libxcomposite' + 'libxdamage' + 'libxext' + 'libxfixes' + 'libxkbcommon' + 'libxrandr' + 'mesa' + 'nspr' + 'nss' + 'pango' + 'systemd-libs' + 'xdg-utils' +) + +optdepends=( + 'claude-code: drive Claude Code from the app' + 'cursor-cli: drive Cursor from the app' + 'github-copilot-cli: drive Copilot from the app' + 'openai-codex: drive Codex from the app' +) + +provides=("t3code=${pkgver}") +conflicts=('t3code' 't3code-bin') +options=('!debug' '!strip') + +_patchtag="v${pkgver}-omarchy.1" +_appimage="T3-Code-${pkgver}-x86_64.AppImage" +source=('t3code-launcher.sh' 't3-launcher.sh' 'LICENSE') +source_x86_64=("${_appimage}::https://github.com/ryanrhughes/t3code/releases/download/${_patchtag}/${_appimage}") +noextract=("${_appimage}") +sha256sums=('cb905ff341372ef2ef6e402cf485959f8bd1df8f0efebee4cda1afdd5e6abc0a' + 'c5b3f2a9f0b14b12cfd973b79319f0f018b7ae49a1d43d8ca346100c3f7de28f' + '935d8f2af0c703f9c39517ee57cc4930b19d02d533be930b63f0e82f93614b43') +sha256sums_x86_64=('67d28ce705b9efe8ff496733a46fefc42d298505cb07c83b36890368625e182f') + +prepare() { + chmod +x "${srcdir}/${_appimage}" + rm -rf "${srcdir}/squashfs-root" + "${srcdir}/${_appimage}" --appimage-extract >/dev/null +} + +package() { + cd "${srcdir}/squashfs-root" + + # The AppImage's usr/ tree is compatibility libraries for distributions that + # lack them, and Arch is not one; its icons are the only part worth keeping. + # A release that starts shipping something else there stops the build rather + # than having it deleted quietly on the way past. + local unexpected + unexpected=$(find usr \( -type f -o -type l \) | grep -vE \ + '^usr/share/icons/hicolor/[0-9]+x[0-9]+/apps/t3code\.png$|^usr/lib/lib(Xss\.so\.1|Xtst\.so\.6|appindicator\.so\.1|gconf-2\.so\.4|indicator\.so\.7|notify\.so\.4)$' || true) + if [[ -n "${unexpected}" ]]; then + echo "Unexpected files in the AppImage's usr/ tree:" >&2 + echo "${unexpected}" >&2 + return 1 + fi + + local icon size + for icon in usr/share/icons/hicolor/*/apps/t3code.png; do + size="${icon#usr/share/icons/hicolor/}" + install -Dm644 "${icon}" "${pkgdir}/usr/share/icons/hicolor/${size%%/*}/apps/t3code.png" + done + + # Upstream's own entry rather than a hand-written one: it carries the + # t3code:// scheme handlers that make the app's deep links resolve. + # The name drops the "(Alpha)" upstream's electron-builder still appends; the + # app itself now calls that string legacy and keeps its data under t3code. + sed -e 's|^Exec=.*|Exec=t3code %U|' -e 's|^Name=.*|Name=T3 Code|' \ + -e '/^X-AppImage-Version=/d' t3code.desktop \ + > "${srcdir}/t3code.desktop.arch" + install -Dm644 "${srcdir}/t3code.desktop.arch" \ + "${pkgdir}/usr/share/applications/t3code.desktop" + + rm -rf AppRun .DirIcon usr t3code.desktop t3code.png + install -d "${pkgdir}/usr/lib/t3code" + cp -a . "${pkgdir}/usr/lib/t3code/" + chmod -R a+rX "${pkgdir}/usr/lib/t3code" + + # Arch ships Chromium's and Electron's own sandbox helper setuid, which is + # what keeps the sandbox up on a kernel that denies unprivileged user + # namespaces -- linux-hardened, mainly -- instead of aborting the app. + chmod 4755 "${pkgdir}/usr/lib/t3code/chrome-sandbox" + + install -Dm755 "${srcdir}/t3code-launcher.sh" "${pkgdir}/usr/bin/t3code" + # The server CLI, run through the bundled Electron as Node. Same entrypoint + # npm's `t3` package runs, so `t3 serve`, `t3 pair`, and the rest work + # without a separate install. + install -Dm755 "${srcdir}/t3-launcher.sh" "${pkgdir}/usr/bin/t3" + install -Dm644 "${srcdir}/LICENSE" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" +} diff --git a/pkgbuilds/t3code-patched-bin/t3-launcher.sh b/pkgbuilds/t3code-patched-bin/t3-launcher.sh new file mode 100755 index 0000000..af1988f --- /dev/null +++ b/pkgbuilds/t3code-patched-bin/t3-launcher.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# The T3 Code server CLI (`t3`) ships inside the app bundle; upstream only +# distributes it separately through npm. The bundled Electron doubles as the +# Node runtime for it, so the desktop package can put the CLI on PATH without +# shipping a second runtime. Electron's fs layer reads app.asar transparently +# in this mode. +set -euo pipefail + +export ELECTRON_RUN_AS_NODE=1 +exec /usr/lib/t3code/t3code /usr/lib/t3code/resources/app.asar/apps/server/dist/bin.mjs "$@" diff --git a/pkgbuilds/t3code-patched-bin/t3code-launcher.sh b/pkgbuilds/t3code-patched-bin/t3code-launcher.sh new file mode 100644 index 0000000..2157d1c --- /dev/null +++ b/pkgbuilds/t3code-patched-bin/t3code-launcher.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -euo pipefail + +user_flags=() +config_home="${XDG_CONFIG_HOME:-}" +[[ -n "$config_home" || -z "${HOME:-}" ]] || config_home="$HOME/.config" +flags_file="${config_home:+$config_home/t3code-flags.conf}" + +if [[ -n "$flags_file" && -f "$flags_file" && -r "$flags_file" ]]; then + while IFS= read -r line || [[ -n "$line" ]]; do + line="${line%%#*}" + [[ -n "${line//[[:space:]]/}" ]] || continue + read -r -a flags <<<"$line" + user_flags+=("${flags[@]}") + done <"$flags_file" +fi + +# Chromium's own Ozone detection falls back to XWayland often enough to matter, +# and the result is a blurry window on every scaled display. +platform_flags=() +if [[ -n "${WAYLAND_DISPLAY:-}" || "${XDG_SESSION_TYPE:-}" == wayland ]]; then + platform_flags=(--ozone-platform=wayland) + + for flag in "${user_flags[@]}" "$@"; do + case "$flag" in + --ozone-platform=* | --ozone-platform-hint=*) platform_flags=() ;; + esac + done +fi + +exec /usr/lib/t3code/t3code "${platform_flags[@]}" "${user_flags[@]}" "$@"