-
Notifications
You must be signed in to change notification settings - Fork 0
Progress
LiManshiang edited this page Sep 11, 2026
·
1 revision
注:本文档为历史记录(截至 1.0.53)。当前进度与路线图见 ROADMAP.md。
日期: 2026-08-04 分支: 1.0.6(开发)+ fix/crash-issues(崩溃/权限修复,未合并) 版本: 1.0.53 Git 钩子: pre-commit 自动升级小版本号
| # | 简述 | 提交 | 文件 |
|---|---|---|---|
| 1 | Agent 检测(pgrep 子进程) | b425a6f | TerminalManager.swift |
| 2 | LaunchMode 追踪(bash/agent) | b425a6f | SessionRestore.swift |
| 3 | Restore 时从后端回退 cbcSessionID | ad3e5b6 | ContentViewModel.swift |
| 4 | Polling 优化(不再无条件重赋值 selectedSession) | d739ce1 | ContentViewModel.swift |
| 5 | SessionDetailView 移除条件分支(PTYTerminalView 位置固定) | 多次 | SessionDetailView.swift |
| 6 | Scrollback 降至 50K 行 | 6c5926e | TerminalManager.swift |
| 7 | Split pane overlay 方式实现 | 多次 | SessionDetailView.swift |
| 8 | Split ratio 控制 terminal 高度(不可见时高度 0) | 7809ed4 | SessionDetailView.swift |
| 9 | 性能: isIdle 节流(2s 而非每次 data chunk) | c358f6d | TerminalManager.swift |
| 10 | 闪退修复: SwiftTerm 回调 dispatch 到 main queue | 8cbb0d4 | TerminalManager.swift |
| 11 | 合并 perf/optimize-v1 性能优化 | 0e1e863 | 多文件 |
| 12 | 新建 session 直接启动 agent 而非 bash | 8d14476 | SessionDetailView.swift, ContentViewModel.swift |
| 13 | 侧边栏版本号 + 自动 bump | 2689ed4 | Version.swift, bump-version.sh, .githooks/ |
| # | 简述 | 提交 | 文件 |
|---|---|---|---|
| 14 | 行为修正: 新建 session 无历史 → 进 bash(非 agent);有历史 → 跟随历史进 agent | da95ae3 | SessionDetailView.swift, ContentViewModel.swift |
| 15 | Restore 仅对 agent 模式做 JSONL 扫描(bash 模式不再被历史会话劫持) | da95ae3 | ContentViewModel.swift |
| 16 | DispatchIO 双重 close 防护(closeBackendIO 单次关闭)+ retryBackend 先关 IO 再 kill(防 EV_VANISHED) | d837686 | ContentViewModel.swift |
| 17 | connect/connectBash 启动失败检测(executable 存在 + shellPid>0)+ onConnectError 上抛 UI | b997b7a | TerminalManager.swift, ContentViewModel.swift |
| 18 | bash scrollback 1M→200K 行;detach() 停止 agent 检测 timer | b997b7a | TerminalManager.swift |
| 19 | SessionRowView 用 terminalManagerIfExists 只读查询(不再为每行建空壳 manager) | 0ffd56c | SessionListView.swift, ContentViewModel.swift |
| 20 | SessionRestore.loadAll() 走 ioQueue + 内存缓存(main 不再同步读盘) | 0ffd56c | SessionRestore.swift |
| 21 | refreshSessions 比较整个数组内容(status/pid 变化可刷新) | 0ffd56c | ContentViewModel.swift |
| 22 | K3: split pane PTYTerminalView 加 .id() 稳定 NSView 身份 |
2f708b1 | SessionDetailView.swift |
| 23 | 通知权限仅在 .notDetermined 时请求;Info.plist 删除日历/照片/通讯录多余 usage key |
58a933f | App.swift, Info.plist |
| 24 | 新增 NSAppleMusicUsageDescription/NSPhotoLibraryUsageDescription(声明不使用),使拒绝状态可持久化、弹窗收敛为一次 | 812a521 | Info.plist |
| 25 |
make run 检测源码变更,.app 未过期时跳过重建,保持签名/TCC 权限稳定 |
e2f9bdc | Makefile |
| 26 | 终端内容覆盖 header:容器 clipsToBounds + stretch 的 dx/dy clamp 到 >=0 |
5679d5a | TerminalView.swift |
| 27 | 拖拽文件到终端:容器注册 .fileURL/.string 拖拽类型,插入 shell 引用路径(多文件空格分隔) | 9a1dda3 | TerminalView.swift, TerminalManager.swift |
| 28 |
历史对话恢复:resumeArgs 用 --resume <id> 而非 --session-id(后者只固定 ID 不恢复消息);验证 codebuddy 恢复历史成功 |
ab35b53 | Session.swift |
| 29 |
find-session 只返回有效会话:scanner 完整扫描(去掉 ai-title 提前 break)+ 仅选有 assistant 回复的会话(排除残留 stub)+ 缓存 TTL 30s;agent 检测 extractSessionID 支持 --resume
|
c560f56 | scanner.go, TerminalManager.swift |
| 30 |
恢复前校验 cbc 有效性:新增 GET /api/codebuddy/session/{id}(valid=无 assistant 回复则 false);restore/connect 时无效 cbc 自动重新 find-session 并写回后端修正 |
7519d16 | handlers.go, server.go, APIClient.swift, ContentViewModel.swift, SessionDetailView.swift |
| 31 | 启动只恢复最后选中的 session(UserDefaults 持久化 lastSelectedSessionID),其余 session 点击时惰性连接;codebuddy 进程数 7→1 | ccb998c | ContentViewModel.swift |
注:#28 排查过程中曾尝试"新建 session 自动扫描目录历史进 agent",用户确认期望新建 session 一律进 bash,已撤销该方向(connectToSession 保持 无 cbc→bash / 有 cbc→agent)。 注:#29-30 复现"change session aba8d82a 不恢复":find-session 返回了残留 stub 会话(只有 user 消息,如 d217dbdb),--resume 失败后 codebuddy 自动切换提示。修复后重启自动将 cbc 从 d217dbdb 修正为 aba8d82a,恢复正常。
| # | 描述 | 状态 | 分析 |
|---|---|---|---|
| K1 |
/skills 命令导致对话重载 |
已知,不可修复 | Agent 层面行为(CSI 3 J 尝试过,SwiftTerm patch 尝试过,都不是根因) |
| K2 | 窗口缩放导致对话重载 | 已知,标准行为 | SIGWINCH → source → codebuddy 重绘。Terminal.app 同样有,只是速度快不明显 |
| K3 | Split pane toggle 可能导致 NSView 重建 | ✅ 已修复 |
.id("main/split-terminal-\(sid)") 稳定身份(fix/crash-issues 2f708b1) |
| K4 | 启动弹音乐/相册/下载/文稿等 TCC 权限 | 已缓解,根治需稳定签名 | TCC 权限绑定 code signature + bundle id + 路径;ad-hoc 签名无 TeamIdentifier,重签即视为新 app 全部重弹。make run 跳过重建 + usage description 已缓解;根治:Developer ID 签名 |
- 代码层面完全兼容:部署目标
.macOS(.v12),无 macOS 13+ 专属 API(已全量 grep) - 目标机为 Intel x86_64;
swift build --arch x86_64交叉编译可行 -
坑:后端
go-sqlite3需 CGO。交叉编译 amd64 必须CGO_ENABLED=1+CC="clang -target x86_64-apple-macos12.0 -isysroot $(xcrun --show-sdk-path)",否则编出 stub 后端(启动即崩) - 交付物:
lmux-app/.build/lmux.app(x86_64 前端 + x86_64 CGO 后端,已 ad-hoc 签名,21MB) - 12.5 原生编译:Xcode 14 (Swift 5.7) + Go;
Package.swift引用绝对路径/Volumes/Developer/CodeBuddy/Projects/lmux/SwiftTerm,换路径需改相对路径../SwiftTerm;SwiftTerm 含本地 backport commit(44339a2),须随目录拷贝
- lmux 代码/二进制零调用音乐、相册 API(无 MediaPlayer/Photos 链接、无 usage key 依赖)
- TCC 弹窗由 code signature + bundle id + 磁盘路径 三者绑定,任一变化 → 系统视为新 app → 对默认敏感服务集(MediaLibrary、Photos、Downloads/Documents/Desktop 等)批量重新授权弹窗
- ad-hoc 签名(
TeamIdentifier=not set)无稳定身份 → 每次make app重签都触发重弹 - 实测:内容不变时 ad-hoc 签名 cdhash 稳定(两次相同);
make run跳过重建后启动无新 TCC 记录(不再弹) - 根治方案:Developer ID 证书签名(稳定 TeamIdentifier)
lmux-app/Sources/LMUX/
Utils/
TerminalManager.swift — agent 检测 + 闪退修复 + 性能优化 + 启动失败检测 + scrollback
SessionRestore.swift — LaunchMode 追踪 + ioQueue 缓存读
Version.swift — 版本号定义(1.0.53)
Views/
SessionDetailView.swift — split pane overlay + 启动路由(bash/agent)+ .id()
SessionListView.swift — 只读 manager 查询
ContentView.swift — 侧边栏版本号显示
TerminalView.swift — frame 更新优化 + 裁剪/防溢出 + 文件拖拽
ViewModels/
ContentViewModel.swift — restore 路由(lazy 恢复)+ cbc 校验 + polling 优化 + DispatchIO 防护
Models/
Session.swift — AgentType 枚举 + resume 参数(--resume)
Network/
APIClient.swift — find-session + session 有效性校验
Info.plist — About 版本号
bump-version.sh — 版本号升级脚本
.githooks/pre-commit — 自动升级版本号
- 合并 fix/crash-issues → 1.0.6(用户确认后再合)
- 在 Intel macOS 12.5 真机跑修复版(Swift ABI 理论兼容,需真机验证;验证
/skills、窗口缩放、split pane、权限弹窗、header 覆盖、拖拽文件、历史恢复、启动速度) - 12.5 机器上若改代码路径,改
Package.swift为相对路径../SwiftTerm - K4 根治:申请 Apple Developer ID 证书,
make app用codesign --sign "Developer ID Application: ..."(替换 Makefile 里的 ad-hoc 签名) - 其他中低风险项(可选):backend/lmux 二进制为构建产物,避免提交;codebuddy --resume 历史渲染速度(SwiftTerm 渲染层面)
master ─── 最终稳定代码
1.0.6 ─── 开发主线(bash 修复已合入 da95ae3)
fix/crash-issues ─── 崩溃/权限/性能/渲染/功能修复(18 项,d837686..ccb998c),未合并
perf/optimize-v1 ─── 性能优化(已合并到 1.0.6)