使用说明
mirroir技能
社区市场 模式 和 技能 为了 mirroir mcp --AI驱动的真正iOS设备自动化。
模式vs技能
mirroir使用了两个互补的概念:
- 模式 (声明性)-教mirroir iOS应用程序是什么样子以及它们的行为方式。只读知识。
- 技能 (势在必行)——人工智能执行的循序渐进的流程。行动。
模式有三种尺度——相同的概念,不同的粒度:
| 比例 | 描述内容 | 位置 |
|---|---|---|
| 元素模式 | 行级UI组件(表行、选项卡栏、按钮) | patterns/elements/ |
| 屏幕图案 | 根据元素组合(仪表板、提要)筛选原型 | patterns/screens/ |
| 应用程序模式 | 应用级结构、障碍、跳过列表(App.md) | patterns/apps/ |
mirroir-skills/
├── patterns/
│ ├── elements/ # 34 iOS UI element definitions
│ ├── screens/ # 7 screen archetype recipes
│ └── apps/ # APP.md app descriptions
├── skills/
│ ├── apps/ # Per-app automation flows
│ ├── workflows/ # Cross-app sequences
│ └── testing/ # Test flows
└── legacy/ # Old YAML skills (deterministic runners)
APP.md——描述你的应用程序
你能贡献的最有影响力的东西是你最喜欢的iOS应用程序的APP.md。告诉mirroir这个应用程序是什么,危险在哪里,以及会遇到什么障碍:
---
version: 1
app: Santé
locale: fr_CA
archetype: dashboard
obstacle_mode: auto
---
## Structure
Dashboard with 4 tabs: Résumé, Partage, Parcourir, Profil.
## Résumé Tab
- Summary cards for health metrics that drill down to charts
## Obstacles
- Health Access permission → tap "Autoriser"
- Notification permission → tap "Ne pas autoriser"
## Skip
- Supprimer les données de Santé
- Réinitialiser
这 archetype field告诉mirroir应用程序如何导航(dashboard, social-feed, settings-list, content-grid, conversation-list, utility-display, detail-form).在探索过程中,障碍物会自动排除。跳过元素永远不会被点击。结构作为AI上下文注入到生成的技能中。
什么是技能?
技能将多步骤iOS自动化描述为 意图,而不是脚本。像“点击电子邮件”这样的步骤并没有硬编码坐标——人工智能通过OCR找到元素,并适应屏幕布局、本地化和意外对话框。
主要格式为 技能.md --带有YAML前端的markdown文件:
---
version: 1
name: Send Slack Message
app: Slack
tags: ["slack", "messaging"]
---
Send a direct message to a contact in Slack.
## Steps
1. Launch **Slack**
2. Wait for "Home" to appear
3. Tap "Direct Messages"
4. Tap "${RECIPIENT}"
5. Tap "Message"
6. Type "${MESSAGE:-Hey, just checking in!}"
7. Press **Return**
8. Screenshot: "message_sent"
Legacy YAML format (used by mirroir test and mirroir compile)
name: Send Slack Message
app: Slack
description: Send a direct message to a contact in Slack
steps:
- launch: "Slack"
- wait_for: "Home"
- tap: "Direct Messages"
- tap: "${RECIPIENT}"
- tap: "Message"
- type: "${MESSAGE:-Hey, just checking in!}"
- press_key: "return"
- screenshot: "message_sent"
YAML文件位于 legacy/ 目录。它们被确定性使用 mirroir test 和 mirroir compile 需要结构化步骤定义的CLI工具。使用 mirroir migrate 将YAML转换为SKILL.md格式。
安装
克劳德代码
claude plugin marketplace add jfarcand/mirroir-skills
claude plugin install skills@mirroir-skills
GitHub Copilot命令行界面
copilot plugin marketplace add jfarcand/mirroir-skills
copilot plugin install skills@mirroir-skills
两者都安装 技能.md 它教AI如何解释和执行技能步骤。
手册(所有其他客户)
克隆到您的全局技能目录:
git clone https://github.com/jfarcand/mirroir-skills ~/.mirroir-mcp/skills
或者放入项目本地目录:
git clone https://github.com/jfarcand/mirroir-skills .mirroir-mcp/skills
这两条路径都由递归扫描 list_skills.
可用技能
应用技能
| 技能 | 描述 |
|---|---|
skills/apps/appstore/install-app |
在app Store中搜索并安装应用程序 |
skills/apps/calendar/create-event |
创建新的日历事件 |
skills/apps/calendar/check-today |
使用以下方式阅读今天的活动 remember 提取会议详细信息 |
skills/apps/clock/set-alarm |
创建新警报 |
skills/apps/clock/set-timer |
启动倒计时器并验证其是否正在运行 |
skills/apps/mail/email-triage |
检查收件箱中是否有未读电子邮件——根据内容存档或标记 |
skills/apps/mail/batch-archive |
将所有未读电子邮件循环存档,直到收件箱为空 |
skills/apps/maps/save-directions |
搜索目的地,获取路线,提取旅行时间 remember |
skills/apps/photos/share-recent |
长按最近的照片并通过消息分享 |
skills/apps/settings/check-about |
通过以下方式提取设备型号、iOS版本和存储 remember |
skills/apps/settings/check-about-fr |
与检查相同,但适用于法国地区(Réglages) |
skills/apps/settings/list-apps |
从iPhone存储中列出已安装的应用程序大小 |
skills/apps/settings/uninstall-app |
通过“设置”>“通用”>“iPhone存储”删除应用程序 |
skills/apps/slack/send-message |
向联系人发送DM |
skills/apps/slack/check-unread |
使用频道名称和消息预览读取未读通知 |
skills/apps/weather/check-forecast |
提取当前状况和10天预测 remember |
skills/apps/weather/add-city |
将城市添加到天气 |
测试
| 技能 | 描述 |
|---|---|
skills/testing/expo-go/login-flow |
使用条件分支对注册与现有帐户进行测试登录 |
skills/testing/expo-go/shake-debug-menu |
通过shake打开React Native调试菜单 |
skills/testing/expo-go/qa-smoke-pack |
视觉回归测试——截图关键屏幕和使用 remember 检测UI异常 |
工作流
| 技能 | 描述 |
|---|---|
skills/workflows/morning-briefing |
阅读天气+日历,撰写并通过iMessage发送晨间总结 |
skills/workflows/commute-eta-notify |
从Waze获取预计到达时间,通过消息发送给你的老板 |
skills/workflows/standup-autoposter |
从日历中阅读今天的会议,在Slack上发布会议记录 |
工作流演示 跨应用数据提取 --AI从一个应用程序中读取动态内容,并将其组合成另一个应用中的动作。这是只有AI执行者才能做到的。
变量替换
技能使用 ${VAR} 从环境变量中解析出占位符。使用 ${VAR:-default} 用于回退值。
# Set credentials for testing skills
export TEST_EMAIL=user@example.com
export TEST_PASSWORD=secret
# Or use direnv
echo 'export TEST_EMAIL=user@example.com' >> .envrc
direnv allow
没有默认值的未求解变量保持不变——人工智能将在继续之前询问值。
条件
技能支持分支 condition 步骤。AI检查屏幕并执行匹配的分支:
steps:
- launch: "Mail"
- wait_for: "Inbox"
- condition:
if_visible: "Unread"
then:
- tap: "Unread"
- tap: "Archive"
- assert_visible: "Archived"
else:
- screenshot: "empty_inbox"
条件步骤包括:
if_visible或if_not_visible--屏幕上要检查的标签then(必填)--条件为真时运行的步骤else(可选)--条件为false时运行的步骤
分支内的步骤是常规步骤,包括嵌套条件。看 skills/apps/mail/email-triage.md 举个完整的例子。
重复
技能支持循环 repeat 步骤。AI在每次迭代前检查屏幕状态:
steps:
- launch: "Mail"
- wait_for: "Inbox"
- repeat:
while_visible: "Unread"
max: 10
steps:
- tap: "Unread"
- tap: "Archive"
- tap: "< Back"
- wait_for: "Inbox"
重复步骤有:
- 循环模式 (正好一个):
while_visible,until_visible,或times max(必填)——安全界限,防止无限循环steps(必需)--运行每次迭代的步骤
看 skills/apps/mail/batch-archive.md 举个完整的例子。
从YAML迁移
这 mirroir migrate 命令将YAML技能转换为SKILL.md格式:
mirroir migrate apps/settings/check-about.yaml # single file
mirroir migrate --dir ../iphone-mirroir-skills/apps # entire directory
mirroir migrate --dry-run apps/mail/email-triage.yaml # preview without writing
旧的YAML文件存在于 legacy/ 目录,并保持确定性的可访问性 mirroir test 和 mirroir compile CLI工具。
验证
运行验证脚本以检查必填字段、有效元数据和正确变量语法的所有技能:
python3 scripts/validate-skills.py
这将验证SKILL.md文件(在 skills/)以及传统的YAML文件(in legacy/).APP.md文件是模式,不是技能,会被跳过。它通过GitHub Actions在推送和PR上自动运行。
贡献
欢迎投稿!提交pull请求或补丁,即表示您同意 贡献者许可协议您的Git提交元数据(姓名和电子邮件)用作您的电子签名,无需单独签名。
CLA确保项目可以在一致的许可证下长期维护。您保留对您的贡献的完全所有权——CLA只是授予维护者将其作为项目的一部分分发的权利。
如何做出贡献
- 复刻此仓库
- 在相应的目录中创建文件:
patterns/apps/<app-name>/APP.md--描述应用程序(结构、障碍、原型)patterns/elements/--新UI组件的元素模式patterns/screens/--屏幕原型食谱skills/apps/<app-name>/--单应用程序自动化skills/testing/<framework>/--移动测试和QAskills/workflows/--跨应用程序提取数据的多应用程序序列
- 使用SKILL.md格式:
--- version: 1 name: Human-readable name app: App Name ios_min: "17.0" locale: "en_US" tags: ["app-name", "category", "action-type"] --- What this skill does. ## Steps 1. Launch **App Name** 2. Wait for "Expected Element" to appear 3. Tap "Element Label" 4. Type "${VAR:-sensible default}" 5. Verify "Success Indicator" is visible 6. Screenshot: "result" - 使用
${VAR:-default}对于可配置的值,永远不要硬编码凭据 - 至少包括一个“验证”步骤,以便技能能够自我验证
- 提交拉取请求