diff --git a/bin/omarchy-install-ai-t3-code b/bin/omarchy-install-ai-t3-code index e93e9b15..b9e3af38 100755 --- a/bin/omarchy-install-ai-t3-code +++ b/bin/omarchy-install-ai-t3-code @@ -7,40 +7,22 @@ set -e T3CODE_HOME="${T3CODE_HOME:-$HOME/.t3}" T3CODE_STATE_DIR="$T3CODE_HOME/userdata" -T3CODE_SETTINGS_PATH="$T3CODE_STATE_DIR/settings.json" - -# Ask T3 Code to open on the palette this machine publishes. `t3 theme set` -# is the supported way, but the desktop package ships only the GUI -- the CLI -# is a separate npm distribution -- so fall back to the setting it writes. -# Both run before the first launch, so neither races a running server. -set_default_theme() { - if omarchy-cmd-present t3; then - t3 theme set omarchy --base-dir "$T3CODE_HOME" >/dev/null && return - fi - - local tmp - mkdir -p "$T3CODE_STATE_DIR" - [[ -f $T3CODE_SETTINGS_PATH ]] || echo '{}' >"$T3CODE_SETTINGS_PATH" - - tmp=$(mktemp "$T3CODE_SETTINGS_PATH.XXXXXX") - if jq '.defaultTheme = "omarchy"' "$T3CODE_SETTINGS_PATH" >"$tmp"; then - mv "$tmp" "$T3CODE_SETTINGS_PATH" - else - rm -f "$tmp" - echo "Could not set the default theme in $T3CODE_SETTINGS_PATH." >&2 - fi -} echo "Installing T3 Code..." omarchy-pkg-add t3code-bin -# The palette itself, and the request to open on it, are both first-run -# concerns. `defaultTheme` only decides what a client with no theme of its own -# starts on, so choosing a theme in T3 Code later is never overridden. echo "Matching T3 Code to the current theme..." mkdir -p "$T3CODE_STATE_DIR" + +# An updated user's current theme may have been staged before this template existed. +if [[ ! -f $HOME/.local/state/omarchy/current/theme/t3code.json ]]; then + omarchy-theme-refresh +fi + omarchy-theme-set-t3code -set_default_theme + +# The packaged CLI selects the published palette before the app's first launch. +t3 theme set omarchy --base-dir "$T3CODE_HOME" echo "Opening T3 Code..." setsid uwsm-app -- gtk-launch t3code >/dev/null 2>&1 & diff --git a/test/shell.d/t3code-install-test.sh b/test/shell.d/t3code-install-test.sh new file mode 100755 index 00000000..66bc9ecd --- /dev/null +++ b/test/shell.d/t3code-install-test.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +set -euo pipefail + +source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh" + +test_tmp=$(mktemp -d) +trap 'rm -rf "$test_tmp"' EXIT + +test_home="$test_tmp/home" +mock_bin="$test_tmp/bin" +mkdir -p "$mock_bin" + +# Run the real theme refresh, renderer and publisher in a throwaway home. +# Only package installation, the T3 CLI and desktop launch are stubbed. +cat >"$mock_bin/omarchy-pkg-add" <<'SH' +#!/bin/bash +[[ $1 == "t3code-bin" ]] +SH + +cat >"$mock_bin/t3" <<'SH' +#!/bin/bash +[[ $1 == "theme" && $2 == "set" && $3 == "omarchy" && $4 == "--base-dir" && $5 == "$T3CODE_HOME" ]] || exit 1 +palette="$T3CODE_HOME/userdata/themes/omarchy.json" +if [[ ! -f $palette ]] || ! jq -e '.name == "Omarchy" and (.accent | test("^#[0-9a-fA-F]{6}$"))' "$palette" >/dev/null; then + echo "No published Omarchy theme" + exit 1 +fi +if [[ ${OMARCHY_TEST_T3_FAIL:-0} == "1" ]]; then + echo "T3 theme selection failed" + exit 1 +fi +echo "T3 selected Omarchy" +SH + +cat >"$mock_bin/setsid" <<'SH' +#!/bin/bash +exit 0 +SH +chmod +x "$mock_bin"/* + +run_installer() { + HOME="$test_home" T3CODE_HOME="$test_tmp/custom t3 home" \ + OMARCHY_PATH="$ROOT" PATH="$mock_bin:$ROOT/bin:$PATH" \ + OMARCHY_THEME_HEADLESS=1 XDG_RUNTIME_DIR="$test_tmp" \ + "$ROOT/bin/omarchy-install-ai-t3-code" >"$test_tmp/output" 2>&1 +} + +state="$test_home/.local/state/omarchy/current" +palette="$test_tmp/custom t3 home/userdata/themes/omarchy.json" +settings="$test_tmp/custom t3 home/userdata/settings.json" +mkdir -p "$state/theme" +echo 'tokyo-night' >"$state/theme.name" +cp "$ROOT/themes/tokyo-night/colors.toml" "$state/theme/colors.toml" + +run_installer || fail "installing after an update succeeds" "$(cat "$test_tmp/output")" +[[ -f $state/theme/t3code.json && -f $palette ]] || fail "the missing palette is rendered and published" +cmp -s "$state/theme/t3code.json" "$palette" || fail "T3 receives the current theme's palette" +grep -q 'T3 selected Omarchy' "$test_tmp/output" || fail "the published palette is selected" +grep -q 'Opening T3 Code' "$test_tmp/output" || fail "the themed app opens" +[[ ! -e $test_home/.t3 ]] || fail "the custom T3 home is respected" +pass "an update with no staged T3 palette renders, publishes and selects it before launch" + +# Preserve an already rendered palette, including a user-supplied color. +jq '.accent = "#abcdef"' "$state/theme/t3code.json" >"$test_tmp/palette.json" +cp "$test_tmp/palette.json" "$state/theme/t3code.json" +run_installer || fail "installing with an existing palette succeeds" "$(cat "$test_tmp/output")" +cmp -s "$test_tmp/palette.json" "$palette" || fail "an existing palette is published without re-staging" +pass "an existing palette is used without refreshing the current theme" + +printf '{"defaultTheme":"dark","keep":"existing settings"}\n' >"$settings" +cp "$settings" "$test_tmp/settings-before.json" +if OMARCHY_TEST_T3_FAIL=1 run_installer; then + fail "a failed T3 theme selection fails the installer" +fi +grep -q 'T3 theme selection failed' "$test_tmp/output" || fail "the CLI failure is visible" +if grep -Eq 'Opening T3 Code|T3 Code has been installed' "$test_tmp/output"; then + fail "a failed selection does not report successful setup" +fi +cmp -s "$test_tmp/settings-before.json" "$settings" || fail "a failed selection does not rewrite settings" +pass "a CLI failure remains visible and leaves the existing settings intact"