关于 oma-mobile
oma-mobile 是用于构建、修改和验证跨平台移动应用的技能,面向 Flutter、React Native 或 Swift 项目。它涵盖架构、平台特定行为、状态管理及测试实践。
主要功能
- 01Flutter、React Native 和 Swift 移动开发流程
- 02领域、数据与呈现层架构指导
- 03平台 UI 与原生能力处理
- 04单元、组件、集成及 E2E 测试
- 05离线行为与应用生命周期检查
适用场景
- 01实现移动端屏幕或功能
- 02添加相机、GPS 或推送通知行为
- 03构建离线优先的移动流程
- 04使用 Maestro 验证关键移动流程
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gracefullight/ stock-checker --skill oma-mobile安装后在 Claude Code 中输入/oma-mobile确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
resources/checklist.mderror-playbook.mdexamples.mdexecution-protocol.mdscreen-template.dartscreen-template.swiftscreen-template.tsxsnippets.mdtech-stack.mdvariants/README.mdstack.schema.jsonvariants/flutter/api-template.dartsnippets.mdstack.yamltech-stack.mdvariants/react-native/api-template.tssnippets.mdstack.yamltech-stack.mdvariants/swift-ios/api-template.swiftsnippets.mdstack.yamltech-stack.md详细介绍
移动端 Agent - 跨平台移动开发专家
调度
目标
以清晰的架构、适合平台的 UI、状态管理、性能优化和端到端(E2E)测试覆盖,构建、修改并验证跨平台移动应用功能。
意图特征
- 用户询问移动应用、Flutter、Dart、React Native、iOS、Android、Riverpod、组件、摄像头、GPS、推送通知或离线优先开发。
- 用户需要原生或跨平台移动端行为,而非 Web 前端开发。
适用场景
- 构建原生移动应用(iOS + Android)
- 移动端专属 UI 模式
- 平台功能(摄像头、GPS、推送通知)
- 离线优先架构
不适用场景
- Web 前端 → 使用 Frontend Agent
- 后端 API → 使用 Backend Agent
预期输入
- 目标屏幕、组件、功能、平台能力或移动端流程
- 现有应用架构、状态管理模式、API 合约和平台约束
- 单元测试、组件测试、集成测试或 Maestro E2E 测试覆盖预期
预期输出
- 对领域层、数据层、展示层、平台层或测试文件中的移动端代码进行修改
- 根据适用情况,提供符合 Material Design 3 和 iOS HIG 的 UI
- 移动端检查和关键流程测试的验证结果
依赖项
- 根据项目检测结果使用 Flutter/Dart 或 React Native 工具链
- 适用时使用 Riverpod/Bloc、Dio、平台 SDK 和 Maestro
resources/execution-protocol.md、示例、代码片段、检查清单和屏幕模板
控制流特征
- 根据平台、状态管理模式、离线需求、原生权限和测试级别选择分支
- 读取和写入移动端代码库文件
- 可能调用构建、测试、模拟器、仿真器或 E2E 命令
结构流程
入口
- 确定目标平台、屏幕/功能、架构层和状态边界。
- 检查现有移动端模式和依赖项。
- 确定测试级别和验证环境。
阶段
- 准备:加载应用架构、平台约束和验收标准。
- 获取:读取现有组件/屏幕、providers/blocs、API 客户端和测试。
- 执行:实现移动端 UI、状态、平台集成、离线处理和测试。
- 验证:运行相关的单元测试、组件测试、集成测试和 E2E 检查。
- 完成:报告行为、覆盖的平台和验证结果。
转换
- 如果业务逻辑复杂,应在展示层之前将其放入领域层/数据层。
- 如果需要网络请求,应使用 Dio,并配置拦截器和离线处理。
- 如果关键用户流程发生变化,应添加或更新 Maestro E2E 覆盖。
- 如果缺少后端合约,应协调后端/API 工作。
失败与恢复
- 如果平台 SDK 或模拟器不可用,应报告验证限制。
- 如果缺少权限或原生能力,应添加明确的平台配置或说明阻碍因素。
- 如果测试失败,应在交接前修复,或报告未通过的检查。
退出
- 成功:移动端功能可在目标平台上正常运行,并通过相关检查。
- 部分成功:明确说明平台、模拟器、依赖项或验证方面的缺口。
逻辑操作
操作
| 操作 | SSL 原语 | 证据 |
|---|---|---|
| 检查移动端架构 | READ | 领域层/数据层/展示层文件 |
| 选择状态与平台策略 | SELECT | Riverpod/Bloc 和平台约束 |
| 编写移动端代码 | WRITE | 组件、屏幕、providers、客户端 |
| 验证生命周期和权限 | VALIDATE | 释放、权限、离线行为 |
| 调用验证工具 | CALL_TOOL | 测试、构建、Maestro |
| 报告结果 | NOTIFY | 最终摘要 |
工具与设备
- Flutter/Dart 或 React Native 技术栈
- Riverpod/Bloc、Dio、平台 SDK、Maestro
- 单元测试、组件测试、集成测试和 E2E 测试命令
规范工作流路径
使用已配置的代码智能提供方定位文件并检查符号或内容。对于 Serena,使用 find_file、search_for_pattern、get_symbols_overview 和 find_symbol。原生搜索仅限于提供方排除项,以及项目搜索策略允许的非代码路径。
然后运行项目的移动端验证命令,通常包括单元测试/组件测试,以及针对关键流程的 Maestro E2E 测试。
资源范围
| 范围 | 资源目标 |
|---|---|
CODEBASE | 移动端源代码、测试、平台配置 |
LOCAL_FS | 模板、代码片段、资源 |
PROCESS | 构建、测试、模拟器、仿真器、E2E 命令 |
NETWORK | 功能需要远程集成时使用的后端 API |
前置条件
- 可以确定目标移动端功能和平台范围。
- 所需的 SDK、权限和 API 契约均已提供,或已说明相关假设。
影响和副作用
- 修改移动端源代码、测试和平台配置。
- 可能影响权限、应用生命周期、离线数据或性能。
防护措施
仅当目标项目尚未确定相应选型时,才采用框架、库、架构和数据模型的默认设置。限定范围的编辑不代表可以迁移技术栈或修改无关基础设施。
- 整洁架构:domain -> data -> presentation
- 使用 Riverpod/Bloc 进行状态管理(复杂逻辑不得使用原始 setState)
- Material Design 3(Android)+ iOS HIG(iOS)
- 在
dispose()方法中释放所有控制器 - 使用平台传输层,并通过拦截器处理身份验证/重试/日志,以及离线处理:Flutter 使用 Dio,React Native 在 TanStack Query 后使用 axios,Swift 使用生成的
Client中间件。 - 目标为 60fps;验证支持的目标平台(Swift iOS 仅需支持 iOS)
- 使用 Maestro 对关键用户流程进行 E2E 测试
- Swift 原生:使用 SwiftUI +
@MainActor @Observable视图模型(Observation 框架,iOS 17+)——在非隔离 VM 中通过Task修改被观察状态会触发 Swift 6 严格并发错误 - Swift 原生:使用现有 API 层。项目采用 OpenAPI 生成时,对已覆盖的端点使用其生成的 Client;仅修改 UI 不应引入代码生成器。
- Swift 原生:需要响应缓存时,使用现有 Repository 缓存;若要新增 hyperoslo/Cache 实现,则使用 ResponseCache actor——缓存已解码的模型(绝不缓存
HTTPBody),读取时采用 stale-while-revalidate,并在写入时使相关键失效;视图模型依赖协议接口,不依赖具体服务(参见variants/swift-ios/snippets.md§10) - Swift 原生:遵循
App/Core/Features/Shared项目布局 - Swift 原生:所有 UI 决策均遵循 iOS Human Interface Guidelines
- Swift 原生:单元测试使用 XCTest 或 Swift Testing,关键流程使用 XCUITest;通过结构化
.task {}取消任务(视图消失时自动取消)——绝不能在deinit中取消,因为它是非隔离的,在 Swift 6 下不能访问@MainActor状态(隔离的 deinit 需要 Swift 6.2+) - Swift 原生:在路由层恢复边缘滑动返回功能——隐藏导航栏的屏幕(
.toolbar(.hidden, for: .navigationBar))会使其失效,因此应通过swipeBackDestination包装器注册 push 路由,而不是逐屏注册(参见variants/swift-ios/snippets.md§9) - Flutter:需要离线响应缓存时,使用现有 repository 缓存;若添加 Drift,则读取缓存实体后再验证(stale-while-revalidate),并在每次写入时使受影响的行失效/刷新;在数据层缓存已解码的实体,绝不在 Dio 传输层缓存(参见
variants/flutter/snippets.md§3、§10) - React Native:保留现有服务端状态层;对于显式设置
staleTime/gcTime的 TanStack Query,在每次变更时使受影响的查询键失效;仅在需要离线持久化时,才将按账户隔离的缓存持久化到 MMKV;屏幕应使用查询/变更钩子,绝不直接调用 axios(参见variants/react-native/snippets.md)
参考资料
- 执行步骤(按所选任务执行):
resources/execution-protocol.md - 代码片段(Swift):
variants/swift-ios/snippets.md - 代码片段(Flutter):
variants/flutter/snippets.md - 代码片段(React Native):
variants/react-native/snippets.md - 检查清单(交接前运行):
resources/checklist.md - 错误恢复:
resources/error-playbook.md - 技术栈索引(所有平台):
resources/tech-stack.md - 技术栈(Swift):
variants/swift-ios/tech-stack.md - 技术栈(Flutter):
variants/flutter/tech-stack.md - 技术栈(React Native):
variants/react-native/tech-stack.md - 屏幕模板(Flutter):
resources/screen-template.dart - 屏幕模板(Swift):
resources/screen-template.swift - 屏幕模板(React Native):
resources/screen-template.tsx - API 服务模板(Swift):
variants/swift-ios/api-template.swift - API 服务模板(Flutter):
variants/flutter/api-template.dart - API 服务模板(React Native):
variants/react-native/api-template.ts - 变体注册表:
variants/README.md - 上下文加载:
../_shared/core/context-loading.md - 澄清:
../_shared/core/clarification-protocol.md - 上下文预算:
../_shared/core/context-budget.md - 经验教训:
../_shared/core/lessons-learned.md(适用于匹配的过往失败或用户要求的复盘) - 可观测性移交:
../oma-observability/SKILL.md§集成 — 离线排队、崩溃分析、电池感知采样
评论
支持 Markdown