关于 macos-menubar-tuist-app
用于构建和维护 macOS 菜单栏应用的 skill,采用 Tuist 优先的工作流。它为编码 Agent 提供项目结构指导,并强调网络、状态与 UI 的可测试分层,以及可重复的构建和启动脚本。
主要功能
- 01以 Tuist 清单管理项目
- 02分离网络、状态与 UI
- 03按模型、客户端和 Store 分层
- 04通过脚本启动应用
- 05验证构建与 Shell 脚本
适用场景
- 01创建 macOS 菜单栏应用
- 02维护由 Tuist 管理的项目
- 03避免在 SwiftUI 视图中处理网络逻辑
- 04排查构建和启动流程问题
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dimillian/ skills --skill macos-menubar-tuist-app安装后在 Claude Code 中输入/macos-menubar-tuist-app确认已加载。
附带文件agents/openai.yaml
详细介绍
macos-menubar-tuist-app
使用 Tuist 优先的工作流和稳定的启动脚本来构建和维护 macOS 菜单栏应用。保持严格的架构边界,确保网络、状态和 UI 仍然可测试且行为可预测。
核心规则
- 除非明确要求,否则应用应仅运行于菜单栏。默认使用
LSUIElement = true。 - 将传输和解码逻辑放在视图之外。不要在 SwiftUI 视图主体中调用网络请求。
- 将状态转换放在存储层(
@Observable或等效实现),而不是行或视图的展示代码中。 - 让模型解码能够适应 API 变动:使用可选字段、安全回退和防御性解析。
- 将 Tuist 清单视为唯一可信来源。不要依赖手动编辑生成的 Xcode 构建产物。
- 当
tuist run无法可靠解析 macOS 目标或设备时,本地迭代优先使用脚本启动。 - 在本地运行脚本中构建生成的项目时,优先使用
tuist xcodebuild build,而不是原始的xcodebuild。
预期文件结构
默认使用以下文件布局:
Project.swift:应用目标、设置、资源、Info.plist键Sources/*Model*.swift:API/领域模型和解码Sources/*Client*.swift:请求、响应映射、传输相关逻辑Sources/*Store*.swift:可观察状态、刷新策略、筛选、缓存Sources/*Menu*View*.swift:菜单组合和顶层 UI 状态Sources/*Row*View*.swift:行渲染和轻量交互run-menubar.sh:规范的本地重启/构建/启动路径stop-menubar.sh:必要时使用的显式停止辅助脚本
工作流
- 确认 Tuist 管理范围
- 确认
Tuist.swift和Project.swift(或工作区清单)存在。 - 更改启动行为前,先阅读现有运行脚本。
- 编写代码前先探查后端行为
- 使用
curl验证端点结构、身份验证要求和分页行为。 - 如果端点忽略
limit/page,则实现完整列表处理,并在存储层本地截取。
- 自底向上实现各层
- 先定义/调整模型。
- 添加或更新客户端请求/解码逻辑。
- 更新存储层的刷新、筛选和缓存策略。
- 最后接入视图。
- 精简应用接线代码
- 让应用入口专注于场景/菜单接线和依赖注入。
- 避免在
App或菜单场景声明中嵌入业务逻辑。
- 统一启动体验
- 确保运行脚本在重新启动前会先停止已有实例。
- 确保运行脚本不会意外打开 Xcode。
- 需要生成项目时使用
tuist generate --no-open。 - 运行脚本需要构建生成的项目时,优先使用
TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build ...,而不是直接调用原始的xcodebuild。
验证矩阵
编辑后运行验证:
TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build -scheme <TargetName> -configuration Debug
如果启动工作流发生变化:
./run-menubar.sh
如果 Shell 脚本发生变化:
bash -n run-menubar.sh
bash -n stop-menubar.sh
./run-menubar.sh
故障模式和修复方向
-
tuist run无法解析 macOS 目标位置: 将运行/停止脚本作为规范的本地运行路径。 -
刷新后菜单 UI 卡顿或状态不一致: 将派生状态和筛选逻辑移入存储层;让视图只负责渲染。
-
API 负载变化导致解码失败: 放宽模型解码要求,使用可选字段和默认值,然后在 UI 中安全地展示缺失数据。
-
功能需求只是快速修补 UI: 在更改行/菜单展示之前,先追踪模型/客户端/存储层中的根本原因。
完成检查清单
- 除非明确要求更改,否则保留仅运行于菜单栏的行为。
- 不要在 SwiftUI 视图主体中放置网络和状态逻辑。
- 确保 Tuist 清单和运行脚本与实际构建/运行流程保持一致。
- 对已修改的部分运行验证矩阵。
- 报告实际运行的命令及其结果。
评论
支持 Markdown