Skip to content

feat(macos): 终端环境补充 TERM_PROGRAM_VERSION - #1416

Merged
1lck merged 1 commit into
1lck:previewfrom
icefery:feat/macos-terminal-program-version
Oct 22, 2026
Merged

1lck merged 1 commit into
1lck:previewfrom
icefery:feat/macos-terminal-program-version

Conversation

@icefery

@icefery icefery commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

背景

  • Windows 端已随 TERM_PROGRAM 一并导出 TERM_PROGRAM_VERSION(windows/tauri/crates/terminal/src/connection.rs:268),macOS 端缺失,同一产品两平台环境不一致。
  • 工具按版本门控终端能力是既有惯例(如 oh-my-pi 以该变量区分 tmux 版本行为);Lithe 引入新的外部可观察能力(如背景变更推送)后,也需要一个版本位供 TUI 安全启用。

改动

  • TerminalTransport 协议新增 termProgramVersion: String?(无法取得时为 nil),extension 默认 nil
  • TerminalSession 构建终端环境时导出 TERM_PROGRAM_VERSION
  • macOS 取应用打包版本(CFBundleShortVersionString),与 Windows 报告的打包版本一致
  • TerminalModuleTests 新增 2 个用例(导出、无法取得不写入);更新 terminal-shell.json 能力矩阵

验证

  • TerminalModuleTests 11 用例通过(含 2 个新增);平台能力矩阵门禁通过
  • 真机:新开终端 echo $TERM_PROGRAM_VERSION 输出应用打包版本,与「关于」一致

@lithe-code-review

lithe-code-review Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← feat/macos-terminal-program-version · head: ac7da26

Findings

  1. [P2] 版本未知时清除继承的终端版本
    macos/Sources/LitheTerminalModule/Runtime/TerminalSession.swift:181

    • 实际影响:当 transport 无法提供版本时,子进程仍可能收到父进程继承的 TERM_PROGRAM_VERSION。此时 TERM_PROGRAM=Lithe,但版本却属于外层终端,工具可能据此错误判断 Lithe 的能力。
    • 触发条件:defaultEnvironment() 包含 TERM_PROGRAM_VERSION,且 termProgramVersion 为 nil。
    • 复现步骤:令默认环境包含 TERM_PROGRAM_VERSION=outer,令 transport 的版本为 nil,创建会话;子进程环境仍含 outer。现有新增测试使用不包含该键的默认环境,未覆盖此情况。
    • 来源:本次引入。新增协议注释和测试表达了版本未知时应不设置该变量,但当前分支仅跳过覆盖,没有移除默认环境中的继承值。

Scope Check

  • 关联 Issue 或需求是否完成:未找到可验证的关联 Issue。新增版本变量的已知版本路径已实现;版本未知时保证变量缺省的路径尚未覆盖继承环境。
  • 已完成范围:macOS transport 提供应用短版本号,session 将其加入终端环境,能力矩阵已更新。
  • 未完成范围:版本为 nil 时未清除默认环境中的同名变量。
  • 是否复用了已有上游能力,或对自研边界给出充分证据:不涉及 IDE 领域能力;沿用 macOS Bundle 信息和现有终端 transport 边界。
  • 每个 Finding 是否由本次变更引入或加剧:是;Finding 指向新增的版本未知处理路径及其声明语义。
  • 是否属于本次变更职责范围:是,直接影响新增环境变量的正确性。

Suggestions

  1. 在应用可选版本前先从环境字典移除 TERM_PROGRAM_VERSION,或将可选值直接赋给字典下标以确保 nil 会删除继承值;增加默认环境已含该键且版本为 nil 的断言。

Summary

已知版本路径较为直接,并与 Windows 端通过打包版本提供该变量的做法一致。建议补齐未知版本与继承环境组合下的行为。本问题为非阻塞建议。

Verification

  • 实际检查的文件、提交和调用链:检查指定 base...head 的五个文件;追踪 TerminalSession 的默认环境构造、macOS Bundle 版本来源及 Windows 终端版本设置路径。
  • 已提供的测试或 CI 结果:PR 正文声称 11 个 TerminalModuleTests 用例及平台能力矩阵门禁通过;head 暂无 Check Run,未独立验证该声明。
  • 本次未运行的测试:未运行测试或仓库代码,符合只读审查范围。
  • 仍存在的非阻塞风险或平台验证缺口:未知版本且父环境已含 TERM_PROGRAM_VERSION 时的结果尚未验证;视觉改动不涉及。

@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 22, 2026
## 背景

- Windows 端已随 `TERM_PROGRAM` 一并导出 `TERM_PROGRAM_VERSION`(`windows/tauri/crates/terminal/src/connection.rs:268`),macOS 端缺失,同一产品两平台环境不一致。
- 工具按版本门控终端能力是既有惯例(如 oh-my-pi 以该变量区分 tmux 版本行为);Lithe 引入新的外部可观察能力(如背景变更推送)后,也需要一个版本位供 TUI 安全启用。

## 改动

- `TerminalTransport` 协议新增 `termProgramVersion: String?`(无法取得时为 nil),extension 默认 nil
- `TerminalSession` 以可选值直赋导出 `TERM_PROGRAM_VERSION`,版本未知时同时清除从外层终端继承的同名值
- macOS 取应用打包版本(`CFBundleShortVersionString`),与 Windows 报告的打包版本一致
- `TerminalModuleTests` 新增 3 个用例(导出、无法取得不写入、清除继承值);更新 `terminal-shell.json` 能力矩阵

## 验证

- `TerminalModuleTests` 全绿(含 3 个新增)
- 平台能力矩阵门禁通过
@icefery
icefery force-pushed the feat/macos-terminal-program-version branch from ac7da26 to 7f72a52 Compare October 22, 2026 04:14

@xiaoyumuxi xiaoyumuxi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

跨 PR 审查(head 7f72a526)

结论:独立变更较集中,未发现明确新逻辑缺陷;建议同步最新 preview 后完成合并验证。 当前 GitHub mergeable=false,各项 CI 结果显示通过。

实现从 bundle 的 CFBundleShortVersionString 报告 termProgramVersion,在 TerminalSession 中写入 TERM_PROGRAM_VERSION;未知时使用 environment["TERM_PROGRAM_VERSION"] = nil 的字典语义删除从父进程继承的旧值,之前对此边界的审查不应继续标为未修复。

建议合并后用真实打包 app + 开发运行环境分别检查:TERM_PROGRAM=Lithe 时版本有值且与包一致;无版本时不会误沿用 Terminal.app/iTerm 外层的版本;终端 shell 仍可收到调用方显式环境覆盖。若与 #1415、已合并 #1414 共用终端接线,需复查组合环境,不要通过复制一份新的 transport 实现来合并冲突。

本轮未独立执行 macOS 终端。

@1lck
1lck merged commit bad347e into 1lck:preview Oct 22, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants