feat: UI 商业化改造 + 连接前 tmux 会话选择(真机验证)
按 Claude Design 定稿(归档在 docs/design/)重做 UI,并把 tmux 从 「从不自动进」修成「连接前探测 → 让用户选会话」。 设计令牌与导航地基 - Theme 拆三层:TXAccent(恒定 blurple) / TXChrome(中性阶×4 表) / TXFlavor(Catppuccin 终端) - vendor JetBrains Mono 四权重(附 OFL 许可) - AppRouter + SessionManager:多会话并存,路由与会话生命周期解耦 - SessionCanvas 常驻挂载会话 surface(摘除即丢内容,也是缩回动画的前提) 按设计稿落地的屏 - 沉浸轨道页:56pt 轨道 + 浮起标题/状态胶囊 + 侧边栏三态(遮罩不 resize、Pin 各一次) - 首页:活动会话卡(readViewportText 文本镜像)+ 主机网格 + 筛选 chips - 关闭二次确认(tmux 仅断开 / 原生窗口两套文案)、分屏菜单、pane 拖拽条 - 空状态:首次运行 / 无会话 / 搜索无命中 / 连接中·失败·已关闭 tmux 真实链路(真机查出并修掉 4 个 bug) - 全代码库从来没人发起 attach → 连接前探测 + 会话选择器(接回 / 新建 / 原生终端) - format 分隔符 tab 经 PTY 变成下划线 → 改用 |:| - controller 变化不冒泡到 session → Combine 转发(否则数据解析对了 UI 不刷新) - 当前会话名不能靠 session_attached 反推 → 改用 display-message 传输层:SSH connect 加超时(原来阻塞到系统 TCP 超时 75s+) 无头验证设施:假会话 fixture · terminalx://ui/* 驱动 · 横屏截图脚本 · 对拍走查法 TXCore 45 tests 绿(新增 5 个会话探测单测) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
39
scripts/tx-shot.sh
Executable file
39
scripts/tx-shot.sh
Executable file
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
# 无头截图取证:装 → 启(可带启动参数)→ 截图 → 修正方向。
|
||||
#
|
||||
# 本环境没有 GUI,模拟器帧缓冲恒为竖屏;带 -txLandscape 1 时 app 会经
|
||||
# requestGeometryUpdate 把「内容」转成横屏(设计基准 iPad Pro 13″ 1366×1024),
|
||||
# 但帧缓冲仍是竖的,故截完用 sips 转回来,Read 出来才是设计稿的方向。
|
||||
#
|
||||
# 用法:
|
||||
# scripts/tx-shot.sh /tmp/shot.png # 只截当前画面
|
||||
# scripts/tx-shot.sh /tmp/shot.png -- -txUIFixture 1 -txLandscape 1 # 重启并带参数
|
||||
set -euo pipefail
|
||||
|
||||
UDID="${TX_UDID:-2EA9055E-4557-4B20-82AF-56A68AC1D454}"
|
||||
BUNDLE=ai.athom.terminalx
|
||||
OUT="${1:?usage: tx-shot.sh <out.png> [-- <launch args>]}"
|
||||
shift || true
|
||||
|
||||
if [ "${1:-}" = "--" ]; then
|
||||
shift
|
||||
APP=$(find ~/Library/Developer/Xcode/DerivedData/TerminalX-*/Build/Products/Debug-iphonesimulator \
|
||||
-maxdepth 1 -name TerminalX.app | head -1)
|
||||
[ -n "$APP" ] || { echo "TerminalX.app not found — build first" >&2; exit 1; }
|
||||
xcrun simctl terminate "$UDID" "$BUNDLE" 2>/dev/null || true
|
||||
xcrun simctl install "$UDID" "$APP"
|
||||
xcrun simctl launch "$UDID" "$BUNDLE" --args "$@" >/dev/null
|
||||
# 等 surface attach + OutputGate flush(tmux/多 pane 场景需要更久)
|
||||
sleep "${TX_SETTLE:-6}"
|
||||
LANDSCAPE=0
|
||||
for a in "$@"; do [ "$a" = "-txLandscape" ] && LANDSCAPE=1; done
|
||||
else
|
||||
LANDSCAPE="${TX_LANDSCAPE:-1}"
|
||||
fi
|
||||
|
||||
xcrun simctl io "$UDID" screenshot "$OUT" >/dev/null 2>&1
|
||||
if [ "$LANDSCAPE" = "1" ]; then
|
||||
sips -r 90 "$OUT" >/dev/null # landscapeRight 内容 → 正向
|
||||
fi
|
||||
sips -g pixelWidth -g pixelHeight "$OUT" | tail -2
|
||||
echo "wrote $OUT"
|
||||
Reference in New Issue
Block a user