Merged
Conversation
- 使用 /Users/syc/Documents/Gemini_Generated/icon.iconset 覆盖 AppIcon.appiconset 的 10 张标准尺寸 PNG - 保持 Contents.json 映射结构不变,仅更新图标位图资源 - 本地执行 xcodebuild 资源编译与整体验证,确认 AppIcon 生成与构建通过
iamsyc
added a commit
that referenced
this pull request
Feb 26, 2026
* Create LICENSE
* add new image
* refactor: delete some unused items from project copy resources
* feat: add resolution options
* feat: Increase `hiDPI` to 1000
* add PR templates
* feat: change destroy button color
* Create LICENSE_CGVirtualDisplay
* feat: Add flexible virtual display configuration
- Add AspectRatio enum with common ratios (16:9, 16:10, 4:3, 21:9, 32:9)
- Add DisplayCalculator for computing physical size and pixels
- Redesign create display UI with composable configuration:
- Screen diagonal input (inches)
- Aspect ratio picker
- HiDPI toggle with real-time preview
- Auto-calculated physical size (mm), pixels, and PPI
- Add 1440x900 resolution option
- Fix 'Creat' typo to 'Create'
* fix: Improve UI layout and add localization support
- Replace Form with VStack+GroupBox for better layout control
- Fix truncated labels by setting fixed width (120pt)
- Increase window size to 480x520
- Add Chinese translations for all new UI elements:
Basic Info, Physical Display, Screen Size, Aspect Ratio,
Physical Size, Logical Resolution, Physical Pixels, etc.
* feat: Add display settings modification feature
- Create EditDisplaySettingsView for editing existing virtual display settings
- Allow modifying HiDPI toggle and resolution at runtime
- Display read-only info (name, serial number, physical size)
- Add Edit button to VirtualDisplayView display list
- Add Chinese translations for Edit, Display Info, Display Settings, Apply
* style: Improve form UI padding and Toggle alignment
- Replace empty Text placeholder with .padding(.leading, 120) for Toggle
- Change .padding(.vertical, 8) to .padding(8) for better horizontal spacing
- Applied to both CreatVirtualDisplayObjectView and EditDisplaySettingsView
* feat: 改进虚拟显示器创建功能
- 新增 ResolutionSelection 数据模型,支持预设和自定义分辨率
- 扩展 AppHelper,添加 createDisplay() 方法和错误处理
- 重写 CreateVirtualDisplay 视图,使用 Form 布局
- 实现多模式支持,允许添加/删除多个分辨率
- 支持自定义分辨率输入(宽×高@刷新率)
- 添加重复模式和空名称验证
- 添加宽高比动态预览矩形
* fix: 修复 Xcode 警告
- HttpHelper.swift: 使用 UTType.jpeg 替代弃用的 kUTTypeJPEG
- ScreenCaptureFunction.swift: 移除不必要的 nil 合并操作符
* feat: 支持每个分辨率单独设置 HiDPI
- ResolutionSelection 新增 enableHiDPI 属性
- AppHelper.createDisplay() 根据每个模式的 HiDPI 设置生成对应模式
- UI 中每个分辨率旁边有独立的 HiDPI 开关
- 新添加的模式默认启用 HiDPI,用户可随后关闭
* fix: 修复编辑视图显示为空白的 bug
- 使用 Form 布局重写 EditDisplaySettingsView
- 统一使用中文 UI
- 支持多分辨率模式和每个分辨率独立的 HiDPI 开关
- 与 CreateVirtualDisplay 保持一致的用户体验
* feat: 实现虚拟显示器启用/停用功能
- 新增 VirtualDisplayConfig 配置存储模型
- AppHelper 扩展 displayConfigs 管理和 enable/disable 方法
- VirtualDisplayView 显示状态指示器和启用/停用按钮
- 停用时保存配置,启用时恢复显示器
- 添加启用失败的错误提示 alert
* fix: 多语言化虚拟显示器文案并整理字符串
* chore: 接受 Xcode 对 String Catalog 的规范化
* fix: 创建虚拟显示器表单焦点无法释放
* fix: 分辨率模式 HiDPI 状态显示与去重逻辑
* fix: SwiftUI-only focus handling in create display form
* fix: keep custom resolution inputs on one line
* Use verbatim for mode text
* Update virtual display default name
* 修复 HiDPI 分辨率显示问题}{
* Fix virtual display edit flow
* Enable full edit of virtual display
* Add screen capture permission UI
* Fix screen monitoring sessions and permission UI
* Add Chinese alert localization
* 评估 SwiftUI 状态管理迁移改进
* Adopt Observation for SwiftUI state
- Replace ObservableObject/@Published/@EnvironmentObject/@StateObject with @observable + environment injection
- Refactor AppHelper as @mainactor @observable app model (no singleton)
- Move SCStream output model Capture to Observation and fix concurrency warnings
- Remove Combine usage and replace onReceive with onChange
- Decouple WebServer from global state via injected frame provider
- Update previews to provide AppHelper environment
- Apply Xcode upgrade build setting updates
* Diagnose LLDB duplicate attach
* 删除调试文件
删除调试文件
* Allow xcodebuild tests without paid证
* refactor: 拆分 AppHelper 职责并模块化采集/共享链路
- 将虚拟显示、监听、共享、Web 控制拆分为独立 service,并由 AppHelper 负责组装同步
- 为 Share/Capture 视图引入 ViewModel,减少视图内业务编排
- 重构屏幕采集并发管线与 Web 路由处理,补充统一日志与错误映射
- 增强虚拟显示配置持久化迁移/清洗逻辑并清理部分历史冗余代码
* test: 补齐核心行为测试矩阵
- 增加 HTTP 解析/路由/响应测试覆盖
- 增加 LAN IPv4 选择策略与共享服务状态机单测
- 扩展虚拟显示配置迁移、清洗与串号冲突相关测试
* docs: 更新中英文说明与重构执行计划
- 重写 README,补充架构边界、调试入口、无付费证书测试方式与故障定位
- 同步中文文档内容并新增执行计划状态节
* chore: 修正 CreateVirtualDisplay 文件命名 typo
- 将 CreatVirtualDisplayObjectView.swift 重命名为 CreateVirtualDisplayObjectView.swift
- 同步更新中英文 README 中的文件路径引用
* refactor: 移除旧配置兼容并新增设置页重置功能
* fix: stabilize save-and-rebuild flow and virtual display detection
* 设置签名
* 修改签名
* Refactor web sharing stream pipeline and harden capture concurrency
* Refactor WebServer main-actor handoff and request handling
* Harden HTTP routing with normalized strict path matching
* Make HTTP parser preserve raw body bytes for binary payloads
* Harden web sharing endpoints with explicit GET-only routing
* Classify expected client disconnects in web sharing logs
* Add Content-Length headers for text HTTP error responses
* Extract MJPEG frame payload builder and cover with tests
* Expand expected disconnect POSIX classification for web streams
* Rename stream disconnect APIs to reflect all-client behavior
* Return explicit 400 response for malformed HTTP requests
* refactor: reorganize app sources into feature-first structure
* build: add no-sign unit test workflow and remove .github from app target
* test: reorganize unit tests into feature-first folders
* test(ui): add home smoke test identifiers and enable UI target in scheme
* ci: add non-blocking macOS UI smoke workflow
* ci: upload xcresult artifacts on test failures
* ci: add workflow concurrency cancellation
* ci: limit test workflows with path filters
* test(sharing): add workflow smoke test and extract web service test double
* ci: cache xcode metadata for faster test workflows
* test(sharing): add web request-routing integration smoke tests
* ci(ui): retry smoke test once before failing
* ci(unit): explicitly skip UI target in unit test run
* ci: add workflow-run summary gate for test pipelines
* ci(summary): add sticky PR comment updates for workflow status changes
* test(ui): isolate startup side effects via ui test mode
* ci(test): pin macOS test destination to arm64
* sharing(web): register network state handlers before start
* sharing(web): extract stream hub with multi-client regression tests
* sharing(web): move listener IO off main queue
* sharing(web): extract request-header accumulator and chunk tests
* test(sharing): add socket integration coverage for web streaming
* test(app): skip bootstrap startup when running under XCTest
* test(sharing): harden socket integration startup retries
* test(sharing): verify stream broadcast to concurrent socket clients
* test(sharing): verify slow client backpressure does not block broadcast
* test(sharing): extract socket test support and verify disconnect on stop
* test(sharing): stabilize socket integration tests
* test(sharing): avoid socket-test port conflicts
* test(sharing): use ephemeral ports for socket integration
* refactor(sharing): avoid duplicate timer-stop logs
* refactor(sharing): standardize web log levels and context
* refactor(sharing): reduce duplicate stop-sharing info logs
* refactor(sharing): make web-service stop idempotent logs
* feat(sharing-ui): add refresh toolbar and sharing loading state
* feat(ui): add display reorder and localize sharing status UI
* refactor(i18n): normalize localization usage and prune stale strings
* feat(sharing): unify screen-capture permission flow and improve permission UI feedback
* feat(sharing-ui): redesign in-progress sharing panel and fill missing localizations
* feat(ui): 统一列表行组件并优化显示器列表视觉与交互
* refactor(sharing-ui): unify display classification and add permission/audit support
* refactor(ui): replace screen monitoring icon with capture-oriented symbol
* docs: remove obsolete localization audit and refactor plan
* feat(ui): switch virtual display status to dot labels and enforce explicit row model fields
* fix(ui): unify top inset spacing for monitor and sharing lists
* refactor(ui): align display rows with native macOS list interaction
* refactor(ui): 统一显示器页操作入口并优化列表紧凑度
- 将打开系统设置从行内重复操作调整为页面级工具栏按钮
- 为齿轮按钮新增本地化悬浮提示:打开系统显示器设置
- 调整列表行高与垂直内边距,减少行间稀疏感
- 更新 UI smoke 断言,改为校验新的全局操作入口
* test(ui): add centralized ui-test runtime and fixture injection
* test(ui): expand smoke coverage and stabilize accessibility ids
* test(ui): run launch test once with baseline ui-test env
* feat(ShareView): improve UI with compact status, copy button, and grid layout
- Combine address and client count into single row for compact status area
- Add copy button for address with one-click clipboard functionality
- Change Share button to blue filled style (.borderedProminent)
- Add refresh button in empty state for better discoverability
- Implement responsive grid layout (2-column when width > 500pt)
- Update subtitle text to use .secondary color for subtler appearance
* feat(sharing): refactor to concurrent multi-display web sharing
- split page and stream routing into /display* and /stream* targets
- add persistent display share IDs and coordinator-backed multi-session state
- update app/viewmodel/view for per-display share links and controls
- add socket/integration/service/id-store tests and refresh docs/localization
* refactor: 显示器列表和监控会话列表改为响应式 Grid 布局
- DisplaysView: List 替换为 GeometryReader + LazyVGrid/LazyVStack
- IsCapturing: List 替换为 GeometryReader + LazyVGrid/LazyVStack
- 宽度 > 500pt 时双列网格,否则单列
- 与 ShareView 的响应式布局模式保持一致
* feat(sharing): add per-display client count tracking
* refactor(ui): add corner ribbon and rounded display tags
* refactor(sharing-ui): redesign share status panel and row actions
* refactor(sharing): 优化屏幕共享页面 UI 和交互
- 去胶囊化: 连接地址和客户端人数移除 Capsule 背景,改为内联文本
- 布局优化: 右侧信息从 VStack 两行改为 HStack 单行排列
- 共享状态指示: 整行绿色描边改为左侧绿色竖条
- 按钮改进: 添加 play.fill/stop.fill 图标,移除不必要的加载中间态
- 独立操作: 各显示器共享按钮互不影响,startingDisplayID 改为 Set
- 清理代码: 移除多余的 withDisplayStartLock 封装
* refine(sharing): 优化共享页面状态显示与交互细节
UI 改进:
- 共享状态: LIVE 胶囊 badge 改为点状指示器 (🟢共享中 / ⚪未共享),始终显示避免布局跳跃
- 连接人数: 始终显示,有连接时图标变蓝色 (accentColor)
- 共享按钮: 添加 play.fill/stop.fill 图标,ZStack 固定宽度防止切换跳动
- 链接图标: 未共享时灰色且不可点击,共享时蓝色可点击
- 移除左侧绿色竖条,状态由点状指示器统一表达
代码清理:
- 移除工具栏 Open Share Page 按钮
- 移除 openSharePage 及相关错误处理方法
- 重命名 displayBadges 为 displayTypeBadges,职责更明确
- 清理过期本地化字符串 (LIVE, LAN IP unavailable 等)
- 简化 ShareViewModel,移除冗余方法
* refine(sharing): 精简状态面板与工具栏
- 状态面板从多行卡片精简为单行摘要 (🟢服务运行中 · 共享 0/2 · 👤 0)
- 共享数改为 活跃/总数 格式,语义更清晰
- 服务状态文案加 '服务' 前缀,避免歧义
- 移除 statusMetricColumn 辅助方法和渐变背景
- 移除工具栏 '停止全部共享' 按钮,减少冗余操作
- Loading 指示器居中显示
* refine(sharing): 按回调能力收敛刷新入口与显示器监听
- 新增 DisplayReconfigurationMonitor,监听显示器拓扑变化并自动刷新列表
- 回调注册成功时隐藏工具栏 Refresh,注册失败时保留手动刷新兜底
- ShareView 在 onDisappear 主动 stop monitor,避免视图销毁后继续接收回调
- 回调 userInfo 改为 passRetained/release 管理,修复潜在悬挂引用风险
- deinit 改为状态断言,注销路径收敛到 stop 以避免线程不确定性
* refine(capture): 监听窗口按画面比例自适应宽度
- 监听窗口内容改为黑底容器,避免画面两侧出现白色留边
- 捕获到首帧后根据实际分辨率设置 window.contentAspectRatio
- 以当前内容高度反推目标宽度并一次性调整窗口 frame
- 新增 WindowAccessor 获取 NSWindow 以应用动态宽高比
- No Data 文案改为浅色,保证黑底下可见性
* fix(capture): 消除屏幕监听窗口黑边与漂移
- scaledToFit → scaledToFill + clipped,消除宽高比微差导致的黑边
- 窗口初始尺寸从屏幕高度 60% 出发按内容比例计算,避免 SwiftUI 默认尺寸过宽
- 用 hasAppliedInitialSize 标志确保 setFrame 只执行一次,防止每帧重定位导致窗口向下漂移
- contentAspectRatio 约束确保用户手动拖拽时保持正确比例
* refine(capture): 屏幕监听改为主区直列并补齐并发防护
- 移除监听页加号弹窗入口,主内容区直接展示可监听显示器
- 新增监听状态行内切换与会话 fallback,支持权限缺失时停止现有监听
- 为监听启动增加显示器级并发锁,避免同屏重复创建会话
- 监听按钮新增启动中禁用与 loading 态,降低连点竞态
- 补充 CaptureChooseViewModel 并发单测并更新 HomeSmokeTests 断言
- 补齐 Monitoring / Not Monitoring 本地化文案
* refactor(ShareView): 重新设计服务已停止空状态 UI
- 替换纯文本+默认按钮为居中引导式布局
- 添加 xserve 服务器图标 (44pt)
- 标题改用 .headline,添加说明性副标题
- 按钮升级为 .borderedProminent + .controlSize(.large)
- 布局改为全屏居中,与权限引导页风格一致
* fix: 提高双列网格断点阈值至 680pt
CaptureChoose 和 DisplaysView 的双列网格阈值从 500pt 提高到
680pt,避免窗口较窄时卡片内容被严重截断。
* refactor(VirtualDisplayView): 响应式编辑/删除按钮布局
- 使用 ViewThatFits 根据水平空间自动切换布局
- 宽屏:编辑/删除按钮内联显示
- 窄屏:编辑/删除收缩到快捷操作菜单
- 移动按钮提前到所有操作按钮前面
- 提取 moveButtons 方法避免代码重复
* style(VirtualDisplayView): 优化编辑/删除按钮视觉层级
- 编辑/删除改为 borderless 图标按钮,降低视觉权重
- 编辑图标改用 square.and.pencil 增加视觉质量
- 删除图标使用红色前景色标识危险操作
* refine(navigation): 修复标题下横线并改为页面级工具栏背景控制
- 监听与共享页面内容容器重排,消除异常顶部横线来源
- 监听页面将活跃会话 fallback 挂到顶部 safeAreaInset,避免布局分隔线串页
- 共享页面移除冗余外层 VStack,统一与其他页面内容边界
- HomeView 改为按页面显式设置 windowToolbar 背景可见性
- 显示器/虚拟显示器使用 automatic,监听/共享使用 hidden,避免状态继承污染
* test(e2e): 增加真实环境共享链路用例与可测标识
- 新增不启用 UI_TEST_MODE 的共享页真实环境 E2E 用例
- 共享行增加 per-display 地址与操作按钮的 accessibilityIdentifier
- 共享操作按钮增加 sharing/idle accessibilityValue 便于状态断言
- Test PreAction 增加进程清理,避免手动退出 Xcode 运行实例
* fix(virtual-display): 保护无物理屏场景下主虚拟显示器停用
- 停用虚拟显示器前增加安全校验,阻止无物理屏时停用当前主显示器
- 将停用链路改为 throws,在 AppHelper 与界面层透传并展示错误
- 监听屏幕参数变化刷新视图,保证主显示器状态展示及时同步
* Revert "fix(virtual-display): 保护无物理屏场景下主虚拟显示器停用"
This reverts commit e0a6cb2.
* refine(localization): 分离共享状态 token 与文案本地化
- 共享按钮 accessibilityValue 改为 verbatim 状态 token,避免进入本地化提取
- E2E 用例复用同一组状态 token 常量,消除硬编码分散
- 保持状态值稳定,避免多语言词条表再次混入机器状态键
* fix: stabilize primary display state and safe rebuild flow
- compare runtime displayID with CGMainDisplayID for primary badge correctness
- add display reconfiguration monitor to refresh virtual display page on topology changes
- harden rebuild lifecycle with generation tracking and teardown timeout
- block rebuilding a running main virtual display and provide save-only UX
* fix: harden virtual display teardown and rebuild lifecycle
* test: add offline wait coverage for virtual display service
* fix(runtime-state): 收敛服务启动与虚拟显示器状态一致性
- WebService 启动改为异步就绪确认:仅在 listener ready 后标记 running,并在异常停止时回调同步状态,避免先成功后失败的假阳性
- 采集监控会话增加 starting -> active 状态流转:窗口打开前不提前标记为活跃,startCapture 成功后再晋升,失败时自动回滚会话
- 虚拟显示器启用/重建引入 teardown settlement(终止回调 + 离线确认)机制,并补充主显示器监听注册失败时的轮询降级与恢复,降低回调丢失导致的误判
- 清理启用链路临时调试日志,保留告警/错误日志用于线上排障
- 同步更新 sharing/capture/virtual-display 相关测试与 mock
* feat: optimize virtual display rebuild UX and cancellation handling
* Refactor virtual display edit save flow to direct actions
* refactor(virtual-display): simplify edit save actions and sync localization catalog
* fix(virtual-display): 根治主屏切换后镜像折叠并补齐拓扑恢复测试
* chore(xcode): sync shared scheme XML escaping
* fix(virtual-display): 稳定无物理屏主屏连续性并清理拓扑诊断噪音
* refactor(testability): 协议化核心服务边界并注入 AppHelper 与 ViewModel 依赖
* test(guardrail): 补齐 AppHelper/Sharing/Capture 关键路径测试与测试支撑
* ci(test): 引入单测硬门禁、覆盖率棘轮与 UI smoke 失败归因产物
* docs(review): 归档拓扑健康审查结果
* docs: rewrite README to be user-focused
- Replace developer-centric content with feature highlights, getting started guide, and user-friendly troubleshooting
- Add dedicated 'For Developers' section with build/test commands and debug entry points
- Update both English and Chinese versions
* chore(headers): remove legacy author headers from post-fork files
* refactor(core): rewrite legacy resolution/http/launch modules with compatibility layer
* chore(headers): remove legacy author headers after module rewrites
* chore(project): 全局重命名项目 FreelyDisplay 为 VoidDisplay
- 将项目名、Target、Scheme 及相关源代码目录从 FreelyDisplay 全局重命名为 VoidDisplay
- 更新 CI/CD 工作流文件及本地测试运行脚本,以适配新的项目体系
- 更新 `.gitignore` 规则,排除 `*.xcresult/` 测试结果产物
- 修复中英文 Readme 文档中的 Emoji 字符显示乱码问题
* chore: 将中文名从「随显」重命名为「虚幕」
* chore: 迁移 Bundle Identifier 从 com.0xyuchen 到 com.developerchen
* fix(virtual-display): 修复主屏保存重建镜像回退并收敛重建日志
* chore(i18n): 同步 Localizable 字符串并清理主屏重建限制文案
* test(重构前测试): 加固虚拟显示主链路可测性并稳定重构前门禁
变更摘要:
- 抽离可单测纯逻辑组件:编辑保存分析、创建输入校验、行展示组装、主显示回退协调
- 将重建展示态生命周期下沉为内部状态归约器,并由 AppHelper 统一驱动
- 在不修改外部协议签名的前提下,为持久化服务引入可注入存储依赖,提升测试可控性
覆盖率与门禁:
- 将 coverage baseline 的总门槛提升到 40%
- 扩展 tracked files,覆盖虚拟显示主链路关键文件
- 新增重构前风险清单文档,并保持 coverage guard 全部通过
测试补强:
- 新增逻辑层与持久化回退分支测试
- 加强 AppHelper 重建链路测试(并发保护、失败重试、成功标记生命周期)
- 稳定拓扑恢复测试(串行执行与更稳健的超时参数)
- 新增大体量 VirtualDisplay 视图的渲染 smoke 测试
- 为自定义分辨率增加硬限制与溢出防护,并补齐对应测试
- 将 View Body smoke suite 串行化,并稳定 AppKit 启动路径以降低抖动
* ci(test): 修正 UI smoke 用例选择并新增本机授权预热脚本
* fix(navigation): 修复屏幕共享切回显示器顶部横线回归
- 将 windowToolbar 背景可见性统一到 detail NavigationStack 容器层,避免页面级状态串扰\n\n- 切换侧边栏时按 selection 重建 NavigationStack,清理共享页 toolbar 视觉残留
* fix(navigation): 统一详情区 toolbar 背景策略并消除切页横线
- 移除按页面切换 windowToolbar 背景可见性的逻辑,避免屏幕共享与显示器页面之间状态串扰\n\n- detail NavigationStack 固定使用 hidden 背景,杜绝从共享页返回显示器时出现顶部横线
* fix(navigation): 根治 toolbar separator 横线——消除异步加载引起的滚动容器切换
根因:IsCapturing 和 ShareView 的 onAppear 触发异步加载(权限检查、
显示器列表),导致视图从非滚动容器(VStack)切换到滚动容器(ScrollView)。
NavigationStack 的 toolbar separator 自动检测在此切换过程中出错,
错误地显示分隔线。DisplaysView 和 VirtualDisplayView 不受影响,
因为它们同步加载或初始即为滚动容器(List)。
修复方式:将 IsCapturing 和 ShareView 中所有非滚动的初始状态
(加载中、错误、服务未启动等)包裹在 ScrollView 中,确保首帧渲染
即有滚动容器,避免容器类型切换触发 separator。
同时移除 HomeView 中之前的掩盖性修复
(.id(activeSelection) 和 .toolbarBackgroundVisibility(.hidden)),
不再需要。
* refactor(i18n): 统一本地化英文键并清理过期条目
* 添加重构文档
添加重构文档
* 重构收尾:CI烟测收口、虚拟显示重建协调器收敛与屏幕监听响应式布局优化 (#1)
* fix(viewmodel,test): 修复显示列表异步加载竞态并补齐teardown覆盖率门禁
- 修复 ShareViewModel 与 CaptureChooseViewModel 的显示列表加载竞态问题
- 引入 in-flight 加载任务句柄(displayLoadTask)
- 引入请求代次(requestID)实现 last-request-wins
- 新请求会取消旧请求,避免旧任务晚到回写新状态
- 仅允许当前有效请求提交 success/error/loading 状态
- 新增 ViewModel 内部取消能力
- 增加 cancelInFlightDisplayLoad()
- 在权限拒绝、服务停止、状态不满足时主动取消在途加载
- 避免视图状态已切换后旧任务继续回填 displays / error / loading
- 补充 View 生命周期取消钩子
- ShareView.onDisappear 取消显示列表加载任务
- CaptureChoose.onDisappear 取消显示列表加载任务
- 减少页面离开后的无意义异步回写与测试不稳定性
- 修复过期请求错误日志污染
- 将 Share/Capture 两个 ViewModel 中的加载失败日志记录移动到 requestID 校验之后
- 被新请求替代或已取消的旧请求失败不再记录为真实错误日志
- 保持诊断信号干净,避免将预期的陈旧请求失败误判为故障
- 新增并发/竞态单测(ViewModel)
- ShareViewModelTests
- loadDisplaysIgnoresLateResultFromSupersededRequest
- stopServiceCancelsInFlightDisplayLoadAndPreventsLateWrite
- CaptureChooseViewModelTests
- loadDisplaysIgnoresLateResultFromSupersededRequest
- refreshPermissionDeniedCancelsInFlightDisplayLoad
- 使用可控异步 loader gate 复现旧请求晚到覆盖新状态场景,稳定约束行为
- 新增 DisplayTeardownCoordinator 直接单测(提升覆盖率并稳定门禁)
- waitForManagedDisplayOfflineReturnsTrueImmediatelyWhenAlreadyOffline
- waitForTeardownSettlementTerminationObservedEarlyShortCircuitsAsSettled
- waitForTeardownSettlementOfflineConfirmedEarlyReturnsWithoutTermination
- 直接覆盖 teardown settlement 的短路分支与离线快速返回分支
- 验证
- unit_gate(VoidDisplayTests)通过
- coverage_guard 通过
- display_teardown_coordinator 覆盖率提升至门禁阈值以上
- 后续日志去噪微调已回归验证 Share/Capture ViewModel 测试子集通过
* refactor(app): 拆分应用层控制器与启动编排
- 将 AppHelper 调整为组合根,暴露 capture/sharing/virtualDisplay controller
- 引入 CaptureController、SharingController、VirtualDisplayController,收敛状态与业务调用边界
- 新增 AppSettingsView、CaptureDisplayWindowRoot 与 UI Test fixture/service 支持
- 更新 AppHelper / controller 相关单测覆盖启动与委托行为
* refactor(sharing): 拆分共享控制层与列表子组件
- 拆分 ShareDisplayList 与 ShareStatusPanel,收敛 ShareView 的展示职责
- 清理 DisplaySharingCoordinator 与 DisplayShareIDStore 的共享注册/映射逻辑
- 同步调整 WebServiceController 细节并补充 DisplaySharingCoordinatorTests
* refactor(capture): 抽取监看显示行组件并整理展示视图
- 新增 CaptureDisplayRow 组件承载监看卡片展示与交互
- 精简 CaptureDisplayView,减少行内 UI 逻辑耦合
* refactor(virtual-display): 拆分虚拟显示服务与拓扑基础设施
- 从 VirtualDisplayService 抽取 DisplayTeardownCoordinator,集中管理 teardown/offline waiter 状态与结算逻辑
- 新增 DisplayTopology 与 TopologyHealthEvaluator,分离拓扑快照与健康评估职责
- 引入 VirtualDisplayServiceProtocol,降低控制层对具体实现的耦合
- 抽取/统一显示重配置监控实现(含共享 DebouncingDisplayReconfigurationMonitor)
- 精简 VirtualDisplayPersistenceService 细节并收敛 VDS 依赖边界
* refactor(virtual-display): 拆分虚拟显示页面与行组件
- 新增 VirtualDisplayRow 组件,承载单行状态展示与操作按钮
- 精简 VirtualDisplayView,收敛列表行内逻辑与状态渲染
- 同步调整创建/编辑相关视图以适配拆分后的结构
* test(virtual-display): 补充拓扑与展示回归测试并更新覆盖率基线
- 新增 DisplayTopologyTests、TopologyHealthEvaluatorTests、VirtualDisplayRowTests
- 扩展 VirtualDisplayTopologyRecoveryTests 与相关 smoke/offline wait/persistence 测试
- 同步调整 coverage-baseline,纳入新增拆分文件并设置门禁阈值
* chore(i18n): 同步重构后的本地化字符串
- 更新 Localizable.xcstrings 以匹配重构后的视图/组件文案与键使用情况
* docs(test): 补充重构后续说明与虚拟显示回归门禁脚本
- 新增 refactoring_followup 审查问题与后续修复方案文档
- 新增虚拟显示主链路再启用问题说明文档
- 新增虚拟显示回归门禁脚本用于重构后回归验证
* docs(plan): 完善AppHelper重构执行约束
* refactor(app): 移除AppHelper并改为直接注入控制器
* fix(virtual-display): fast模式首帧即返回避免重复拓扑修复
* chore(ci): 调整UI烟测并拆分重建协调器
* test(coverage): 补充轻量单测并调平基线
* test(service): 轻量单测补充覆盖
* fix(ci): UI烟测确定性失败立即终止
* refactor(virtual-display): enable重建路径收敛到协调器
* test(coverage): 恢复0.55基线并补齐覆盖
* fix(capture-ui): 优化屏幕监听响应式布局
- 将屏幕监听列表改为 LazyVGrid + GridItem(.adaptive) 自适应网格,由 SwiftUI 根据可用宽度自动决定列数。
- 将 minimumAdaptiveCardWidth 下调到 380,让双列在常见窗口宽度下更容易出现。
- 保持按钮右对齐,并通过 fixedSize/layoutPriority 尽量保证按钮文案完整显示。
* perf(virtual-display): 非主屏单屏重建使用fast拓扑恢复
* perf(virtual-display): 非主屏重建增加短离线快路径
* fix(ci): 升级GitHub Actions macOS runner以兼容项目格式
* fix(test-target): 下调测试目标macOS部署版本以兼容CI
* fix(ci): 为旧版Swift编译器开启IsolatedDeinit特性开关
* fix(ci): 兼容Xcode16并移除IsolatedDeinit实验开关
* docs(readme): 更新项目来源表述与新仓库链接
* ci(workflows): 重构 CI 主编排与可复用工作流(shadow 阶段) (#1)
* ci(workflow): 修复 CI 汇总并发与状态判定
- 为 CI Summary 并发分组加入 workflow_run event 维度
- Unit Tests 未完成时延后裁决,避免 summary 首轮误红
- PR 评论查找支持分页并调整 UI smoke 失败分类顺序
* ci(workflow): 收敛 Unit Tests 触发路径
- 移除 VoidDisplayUITests/** 路径触发
- 减少仅修改 UI 测试时的单测运行
* ci(workflows): 中文 重构CI主编排与可复用工作流
- 新增主编排CI并引入ci-gate与ci-summary职责划分
- 抽取Unit与UI Smoke为reusable workflows并输出结构化结果
- 新增Xcode选择composite action与手动UI smoke dispatch入口
* ci(workflows): 中文 修复reusable工作流调用语法限制
- 移除ci.yml中reusable job不支持的continue-on-error配置
- 为UI smoke reusable新增enforce_failure输入区分信息模式与调试模式
- 手动dispatch保持失败可见,主CI调用改为非阻塞信息项
* test(ci): 中文 稳定化虚拟显示时序相关单测
- 为易受调度影响的虚拟显示测试套件启用串行执行
- 放宽离线等待与回退协调器测试超时窗口以降低CI抖动误报
- 提高拓扑恢复与自适应冷却用例时间参数容错
* ci(workflows): 清理旧工作流并补充新 CI 文档 (#2)
* ci(workflows): 中文 清理旧工作流并补充新CI说明
- 删除旧Unit Tests、UI Smoke Tests、CI Summary工作流
- 保留主编排与reusable workflows作为唯一CI实现
- 新增docs/testing/ci-workflows.md说明门禁语义与手动UI烟测入口
* ci(workflows): 中文 扩大CI路径过滤覆盖工作流清理场景
- 将ci.yml路径过滤收敛为.github/workflows/**与.github/actions/**
- 确保工作流文件删除/重构时仍会触发ci-gate required check
- 修复cleanup PR因路径过滤未命中导致无CI状态的问题
* refactor(virtual-display): 完成终态收口与配置存储边界重构
* refactor(virtual-display): 完成终态收口与配置存储边界重构
- 重构 VirtualDisplay 配置存储链路为 ConfigRepository 单一规则落点并删除 PersistenceService
- 收紧非沙盒 FileManager 路径、schemaVersion=3/displayName、加载失败阻断写盘与显式错误展示
- 收口 Capture/Sharing/VirtualDisplay 依赖注入与测试稳定性,补齐回归测试并通过全量验证
* chore(ci): 同步覆盖率基线与重构后文件清单
- 移除已删除的 VirtualDisplayPersistenceService 覆盖率追踪项
- 下调 CaptureChooseViewModel 覆盖率门槛以匹配重构后当前基线
- 保持 CI 覆盖率门禁可用于后续增量回归
* test(ci): 恢复覆盖率门槛并补足 CaptureChooseViewModel 覆盖\n\n- 恢复 capture_choose_view_model 覆盖率基线到 0.6\n- 新增 CaptureChooseViewModel helper/权限/取消路径测试\n- 本地 coverage guard 通过,不降低 CI 标准
* test(topology): 修复拓扑恢复用例在 CI 偶发失败
- 放宽 postEnableMirrorCollapse 用例稳定性超时到 2.0 秒
- 将修复次数断言从精确 2 次调整为至少 1 次
- 保留主屏锚点与受管显示集合断言以确保行为正确
* ci(workflow): 强化 main PR 的 CI 门禁并行 UI smoke (#4)
- UI smoke 改为 baseline/permissionDenied/rebuildFailed 三路矩阵并行
- ci-gate 按事件分流:main PR 要求 unit+ui,其余仅 unit
- UI unstable 重试耗尽改为可阻塞并为矩阵补充 artifact 后缀
* ci(workflow): 统一 CI 默认 Xcode 到 26.3 (#5)
* ci(workflow): 统一 CI 默认 Xcode 到 26.3
- unit-tests reusable workflow 默认优先选择 Xcode_26.3
- ui-smoke reusable workflow 默认优先选择 Xcode_26.3
- 保留 Xcode.app 作为 fallback 以兼容 runner 差异
* ci(cache): 禁止跨 Xcode 版本回退缓存
- 移除 unit-tests 的通用 restore key 以避免命中旧版本 DerivedData
- 移除 ui-smoke 的通用 restore key 以避免命中旧版本 DerivedData
- 保留同版本前缀回退,兼顾缓存命中与工具链一致性
* ci(workflow): 将默认 Xcode 版本切换为 26.2
- unit-tests 默认优先路径改为 Xcode_26.2
- ui-smoke 默认优先路径改为 Xcode_26.2
- 保留 Xcode.app fallback 以兼容 runner 差异
* fix(assets): 修复 CI 中 AppIcon 资源编译崩溃
- 将 AppIcon 从 .icon 格式迁移为传统 AppIcon.appiconset
- 使用 1024 源图自动生成 macOS 所需尺寸图标集
- 移除 AppIcon.icon 以避免 actool Distill 随机崩溃
* fix(concurrency): 修复 SCDisplay 注入闭包隔离边界编译失败
- 将 display catalog loader 的加载闭包改为 MainActor 隔离,避免 nonisolated(nonsending) 与非 Sendable SCDisplay 冲突
- 移除 capture/share view model 中不必要的 @sendable SCDisplay 闭包签名,统一为 MainActor 闭包
- 将加载任务执行保持在 MainActor,去除多余 MainActor.run 跳转并保持状态更新原子性
* ci(release): 解耦发版触发并改为手动或标签发布 (#6)
- 新增 release 工作流,仅支持 workflow_dispatch 与 v*.*.* 标签触发
- 手动触发时校验语义化版本标签并为指定 ref 创建注释 tag
- 标签推送后自动发布 GitHub Release,避免 main 每次合并自动发版
* ci(release): 支持 tag 发布 arm64 与 intel64 双 DMG (#7)
- 新增 build_dmg 矩阵任务,分别构建 arm64 与 x86_64 并打包对应 DMG
- 生成并上传每个安装包的 sha256 校验文件,作为 release 资产一并发布
- publish_release 依赖构建产物并附加上传,保留自动生成发布说明
* chore(assets): 替换应用图标为 image2icon 生成版本 (#8)
- 使用 /Users/syc/Documents/Gemini_Generated/icon.iconset 覆盖 AppIcon.appiconset 的 10 张标准尺寸 PNG
- 保持 Contents.json 映射结构不变,仅更新图标位图资源
- 本地执行 xcodebuild 资源编译与整体验证,确认 AppIcon 生成与构建通过
* docs(ci): 更新 CI 工作流文档与门禁说明 (#9)
- 同步 main PR 与非 main 事件的 ci-gate 判定规则
- 补充 UI smoke 三场景矩阵与 unstable 重试语义
- 记录当前默认 Xcode 选择路径为 26.2 优先
* fix(assets): 修复应用图标灰边与系统壳叠加问题 (#10)
- 将 AppIcon 10 个尺寸重新采样并统一为不透明像素输出
- 保持现有图标设计元素不变,仅修正透明角导致的灰边显示
- 本地 xcodebuild 无签名构建验证通过,确保资源编译正常
* feat(virtual-display): 汇总当前虚拟显示重构改动
- 重构虚拟显示服务与协调器职责并补充域模型
- 更新创建流程与主屏策略、配置管理和运行时跟踪
- 同步调整并新增相关测试及文档资源
* refactor(virtual-display): 教科书级最优终态一次性收敛
- 引入 Runtime Driver 层并将 CGVirtualDisplay 私有类型收敛到基础设施实现,消除业务层 CG 泄漏
- 完成 Orchestrator/Facade 命名与边界收口,移除 Service 时代残留并收紧 Controller 可写状态
- 重构 Sharing 启动语义与端口策略(结果类型化、端口偏好持久化、内联校验提示)并同步重建测试体系
* chore(gitignore): 清理并忽略 derivedData 前缀目录
- 新增 .derivedData-*/derivedData-* 忽略规则,防止本地派生产物再次入库
- 将已跟踪的 .derivedData-* 目录从 Git 索引移除,仅取消跟踪不删除本地文件
- 收敛仓库状态,避免测试构建缓存污染后续提交
* chore(git): 增加 derivedData 提交防呆钩子
- 新增 .githooks/pre-commit 拦截 derivedData 路径进入提交
- 命中后自动从暂存区移除并阻断本次提交
- 配合 .gitignore 形成双层保护避免构建产物污染历史
* fix(virtual-display): 消除重建协调器未使用变量告警并统一序列号来源
- fleet 重建循环统一使用 runtimeSerialNum 作为运行时序列号
- teardown 结算与离线确认改为使用同一序列号来源避免语义分叉
- 清理编译器告警并保持重建流程行为一致
* refactor(virtual-display): 清理合并分支回流的旧 service 文件
- 删除已淘汰的 VirtualDisplayService 与协议文件
- 删除旧命名测试文件避免与 Orchestrator 终态并存
- 保持集成分支与终态架构一致用于 PR 合并
* test(virtual-display): 修复拓扑恢复测试在 CI 的时序抖动失败
- 为 TopologyRecovery 测试注入 TestVirtualDisplayClock 替代真实时钟
- 消除 waitForStableTopology 对 runner 调度抖动的依赖
- 保持测试语义不变并提升 CI 稳定性
---------
Co-authored-by: Phineas Guo <31276761+kwokzl@users.noreply.github.com>
Co-authored-by: Phineas Guo <31276761+guoPhineas@users.noreply.github.com>
Co-authored-by: Chen <sunyuchen1990@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
变更内容
image2icon生成的图标集替换项目 App 图标资源。/Users/syc/Documents/Gemini_Generated/icon.iconsetAppIcon.appiconset中 10 张标准尺寸 PNG,不修改Contents.json。验证
xcodebuild -scheme VoidDisplay -project VoidDisplay.xcodeproj -configuration Debug -destination 'platform=macOS,arch=arm64' -derivedDataPath .derivedData-icon-check CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO buildBUILD SUCCEEDED,actool正常生成AppIcon.icns。影响范围