一个轻量的原生 macOS LaunchAgent 管理器,用 SwiftUI 查看轮值任务、调整运行计划、排查日志。
支持 macOS 13 及以上;无需管理员权限、第三方依赖或常驻后台服务。
从 Releases 下载对应架构的 ZIP,解压后将「轮值台.app」拖入「应用程序」。
发布包使用 ad-hoc 签名,未经 Apple 公证。如果 macOS 拦截首次打开,在「系统设置 → 隐私与安全性」确认来源后选择「仍要打开」,也可以自行从源码构建。
- 任务清单:读取
~/Library/LaunchAgents第一层的有效 plist,支持搜索、状态筛选和隐藏项目。 - 状态概览:区分等待、运行、最近失败、未启用和未知状态,展示运行次数、退出码及配置详情。
- 运行控制:启用、停用、立即运行、停止本次。会在操作前说明影响并请求确认。
- 运行计划:编辑间隔、每日或每周时间;复杂触发条件只读显示。
- 日志工作台:查看标准输出、错误输出、业务日志或合并视图,支持搜索、按需刷新和 Finder 定位。
- 日志位置:保存时保留原有计划;已加载任务等待用户手动应用新配置。
- 原生界面:浅色、深色外观;紧凑窗口;保存后保持当前页面;成功操作使用非阻塞提示。
「等待中」表示任务已加载,当前没有活动进程;「运行失败」表示上次退出码非零,后续计划仍可能继续触发。
首次启动只读扫描任务,不自动加载、运行、改写计划或创建隐藏标记目录。修改 plist 时保留同目录备份,重新加载失败时尝试回滚。
仅管理当前用户的 LaunchAgents,不访问系统级 LaunchDaemons。扫描拒绝符号链接和非普通 plist,日志读取拒绝 FIFO、目录及符号链接,防止阻塞。日志读取移到后台并限制读取大小;合并日志会单独显示无法读取的文件。
隐藏仅写入 ~/Library/Application Support/轮值台/隐藏项目 中的标记,不改变真实 LaunchAgent。用户手动复制的标记不会被自动删除。
立即运行后会短时跟踪该次执行,最长 5 分钟;不进行持续后台轮询。关闭最后一个窗口即退出,正在保存的操作完成后才结束进程。
独立业务日志使用 EnvironmentVariables.LAUNCHD_LAST_LOG,需要任务脚本自行支持读取此变量。保留了早期版本对两个本地 wrapper 的名称和日志约定兼容;项目不包含这些脚本、个人 LaunchAgents、账号配置或真实日志。
安装 Xcode Command Line Tools 或完整 Xcode,在项目目录运行:
./scripts/build_app.sh
open "dist/轮值台.app"产物位于 dist/轮值台.app。原有构建产物自动保留到 dist/backups/。
默认使用 SwiftPM Release 构建。如果检测到旧 Command Line Tools 遗留的重复 SwiftBridging 模块,脚本使用项目内的临时 VFS 覆盖和直接 Swift 编译;不修改系统工具链。也可用 LAUNCHDDESK_DIRECT_BUILD=1 ./scripts/build_app.sh 手动选择无依赖直接编译。
打包已构建的 App,并核验解压后的签名及 SHA-256:
./scripts/package_release.sh./scripts/run_core_checks.sh # 隔离的文件、状态与进程回归检查
./scripts/run_ui_smoke.sh # 需要图形登录会话;渲染真实 SwiftUI 视图
swift test # 需要带 XCTest 的完整 Xcode核心检查只使用临时目录和模拟 launchctl。UI 检查使用模拟任务、日志和独立偏好设置,截图位于 dist/ui-smoke/;不触发真实用户任务。UI 渲染检查不替代真实任务端到端验收。
GitHub Actions 在 Intel 与 Apple Silicon macOS 上运行 XCTest、核心检查和 App 构建。
快捷键:⌘R 刷新任务,⇧⌘R 刷新当前日志。
图标源文件位于 Resources/AppIcon.png,修改后运行 ./scripts/build_icon.sh。
