用自然语言生成Apple Shortcuts:Claude Code插件实战指南
一句话描述需求,AI自动生成可运行的Apple Shortcuts,这不再是概念——Shortcuts Playground插件做到了。
上周,MacStories的Federico Viticci发布了Shortcuts Playground插件,它能让Claude Code和Codex根据自然语言描述直接生成Apple Shortcuts。我花了两天时间深度测试,今天把完整用法、翻车案例和优化技巧全部分享给你。
这个插件解决什么问题?
Apple Shortcuts的拖拽式编辑器对非开发者友好,但对技术人来说,手动拖拽30个动作来做一个批量处理脚本,效率极低。更关键的是:
- 你想实现一个复杂逻辑(比如:获取当天日历事件→过滤特定关键词→生成Markdown摘要→发送到Slack),拖拽编辑器需要10分钟+调试
- 没有版本控制,改一次就可能全崩
- 跨设备同步后,快捷键经常冲突
Shortcuts Playground把这个问题反转了:你写自然语言描述 → 插件调用Claude Code生成.shortcut文件 → 双击导入Shortcuts app。整个过程不到3分钟。
核心思路:插件如何工作?
原理拆解
Shortcuts Playground本质上是一个Claude Code的插件(plugin),它利用Claude Code的代码生成能力,将自然语言翻译成Shortcuts的plist格式文件。
Shortcuts文件本质上是一个二进制plist,里面包含了动作列表(WFWorkflowActions)、输入输出配置(WFWorkflowInputContentItemClasses)等字段。插件的工作流是:
- 解析自然语言描述:Claude Code理解你的需求(如“每天上午9点检查天气,如果温度低于10°C,发送通知提醒带外套”)
- 映射到Shortcuts动作:插件内部维护了一个动作映射表,将“检查天气”映射到
com.apple.shortcuts.actions.GetCurrentWeather等动作 - 生成plist结构:生成符合Shortcuts规范的二进制plist文件
- 输出到Finder:文件保存为
.shortcut格式,双击即可导入
为什么需要插件?直接让Claude写plist不行吗?
我试过直接让Claude写plist,结果翻车率极高。原因是:
- Shortcuts的plist结构复杂,嵌套层级深,Claude容易遗漏关键字段(如
WFWorkflowClientRelease、WFWorkflowMinimumClientVersion) - 动作参数格式不统一:有些用UUID,有些用字符串,Claude经常搞混
- 生成的plist即使格式正确,导入后也可能因为版本不匹配而无法运行
Shortcuts Playground通过预置的模板和校验逻辑,大幅降低了出错率。
完整安装步骤(Mac用户专用)
当前仅支持macOS,iOS版本尚未发布。
前提条件
- 安装Claude Code(需要Claude Pro订阅)
- macOS 14.0+(测试环境为macOS 15.2)
- 允许Claude Code访问文件系统(系统设置→隐私与安全性→完全磁盘访问权限→添加Claude Code)
安装插件
# 1. 克隆仓库到本地
git clone https://github.com/macstories/ShortcutsPlayground.git
# 2. 进入目录
cd ShortcutsPlayground
# 3. 安装依赖
pip install -r requirements.txt
# 4. 注册插件到Claude Code
claude plugins install .
配置环境变量
在~/.zshrc或~/.bash_profile中添加:
export SHORTCUTS_PLAYGROUND_PATH="/path/to/ShortcutsPlayground"
export SHORTCUTS_OUTPUT_DIR="$HOME/Desktop/Shortcuts"
实战:差Prompt vs 好Prompt
场景1:生成一个定时提醒快捷指令
差Prompt:
创建一个提醒我喝水的快捷指令
输出结果:
- 生成一个简单的“显示提醒”动作,没有定时逻辑
- 无法设置重复频率
- 没有检查是否已有提醒的防重复机制
好Prompt:
创建一个快捷指令,名为“喝水提醒”:
1. 每天早上9点到晚上9点之间,每隔90分钟触发一次
2. 触发时显示弹窗提醒,内容为“该喝水了!已经过了90分钟”
3. 弹窗包含两个按钮:“好的”和“再提醒我一次”(再提醒一次则延迟15分钟)
4. 如果当前时间在晚上9点后,不触发任何提醒
5. 使用系统通知,不要用第三方App
输出结果:
- 生成一个包含
WFDelayUntil、WFShowNotificationAction、WFSwitch等动作的完整shortcut - 自动设置了
WFWorkflowMinimumClientVersion为最新版本 - 双击导入后直接运行,无报错
场景2:批量处理截图并生成PDF
差Prompt:
把最近10张截图变成PDF
输出结果:
- 只选择了最近10张图片(不一定是截图)
- 没有排序逻辑,顺序随机
- PDF没有命名规则,直接叫“Untitled.pdf”
好Prompt:
创建一个快捷指令,名为“截图转PDF”:
1. 从“最近项目”中筛选出最近24小时内创建的截图(文件名包含“截图”或“Screenshot”的图片)
2. 按创建时间升序排列
3. 将选中的图片合并为一个PDF文件
4. PDF文件名格式为“截图合集_YYYYMMDD_HHmm.pdf”
5. 保存到桌面“截图PDF”文件夹(如果不存在则创建)
6. 完成后弹出通知,显示PDF路径和总页数
输出结果:
- 正确筛选了截图(通过文件名和创建时间双重过滤)
- 生成了带时间戳的PDF文件名
- 自动创建了目标文件夹
- 通知中显示了正确的页数
提示词模板(可直接复制)
模板1:通用快捷指令生成器
创建一个Apple Shortcut,名为{{NAME}}。
需求描述:
{{详细描述你的需求,包括:
- 触发条件(手动/定时/事件)
- 输入(文本/图片/文件/位置)
- 处理逻辑(过滤/转换/计算)
- 输出(通知/文件/URL/其他App)
- 异常处理(如果失败怎么办)}}
约束条件:
- 使用系统原生动作,避免第三方App依赖
- 所有变量名使用英文驼峰命名
- 如果涉及网络请求,添加超时处理(10秒)
- 生成后导出为.shortcut文件,保存在{{OUTPUT_PATH}}
模板2:定时自动化快捷指令
创建一个自动化快捷指令,名为{{NAME}}。
自动化类型:{{时间触发/日历事件触发/充电触发}}
触发条件:
- 时间:{{每天/工作日/周末}} {{具体时间}}
- 频率:{{一次/重复/仅在特定日期}}
执行内容:
{{详细描述每个步骤,用数字编号}}
特殊要求:
- 如果上次执行失败,跳过本次执行
- 执行完成后发送系统通知
- 记录执行日志到“快捷指令日志”文件
效果演示:输入→输出对比
输入(自然语言)
创建一个快捷指令:当我连接公司WiFi时,自动打开Slack和Notion,并关闭个人VPN。同时,发送一条通知告诉我已进入工作模式。
输出(生成的Shortcut结构)
WFWorkflowActions:
- WFGetWiFiNetworkAction: 获取当前WiFi名称
- WFConditionAction: 如果WiFi名称等于“Company_WiFi”
- WFSwitchAction: 关闭VPN(通过URL Scheme: vpn://disconnect)
- WFOpensURLAction: 打开Slack
- WFOpensURLAction: 打开Notion
- WFShowNotificationAction: 显示“已进入工作模式”
- WFConditionAction: 否则
- WFShowNotificationAction: 显示“未检测到公司WiFi”
实际效果: 双击生成的.shortcut文件,导入Shortcuts app后,在“自动化”标签页中设置WiFi触发条件即可运行。
变体和扩展用法
变体1:用Shortcut生成Shortcut(元编程)
这是最酷的用法:你可以创建一个Shortcut,它调用Claude Code API,然后生成新的Shortcut。
# 在终端中运行
shortcuts run "Shortcuts Playground" <<< "创建一个快捷指令,它能每天自动备份我的Desktop文件夹到iCloud Drive,只保留最近7天的备份"
变体2:批量生成测试用Shortcut
如果你是开发者,需要测试Shortcuts在不同场景下的表现:
# 生成10个不同功能的测试Shortcut
for i in {1..10}; do
claude code --prompt "创建一个测试快捷指令,功能为:获取当前时间,如果小时数%2==0则发送通知,否则静默退出。命名为Test_$i"
done
变体3:集成到CI/CD流水线
在GitHub Actions中自动生成Shortcut,用于自动化测试:
name: Generate Test Shortcuts
on:
push:
branches: [main]
jobs:
generate:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install Shortcuts Playground
run: |
git clone https://github.com/macstories/ShortcutsPlayground.git
cd ShortcutsPlayground && pip install -r requirements.txt
- name: Generate Shortcut
run: |
claude code --prompt "创建一个快捷指令,用于运行我们的单元测试,并将结果发送到Slack"
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: generated-shortcuts
path: ~/Desktop/Shortcuts/*.shortcut
注意事项与翻车修复
常见问题1:生成的Shortcut无法导入
原因: plist格式错误或版本号不匹配。
解决方案:
# 手动修复版本号
plutil -replace WFWorkflowMinimumClientVersion -integer 1500 your_shortcut.shortcut
常见问题2:动作执行报错“找不到App”
原因: 插件生成的URL Scheme不适用于当前系统版本。
解决方案: 在Prompt中明确指定App名称的完整拼写,而不是缩写。例如用“Slack”而不是“Slk”。
常见问题3:定时触发不生效
原因: 自动化的触发条件需要手动在Shortcuts app中配置。
解决方案: 生成快捷指令后,打开Shortcuts app → 自动化 → 创建个人自动化 → 选择触发条件(如WiFi连接),然后选择生成的快捷指令。
我的看法
Shortcuts Playground最让我兴奋的不是它能生成Shortcut,而是它把自然语言变成了Shortcuts领域特定语言(DSL)的入口。这意味着:
- 降低了门槛:不需要记住每个动作的UUID,不需要理解plist结构
- 提高了效率:从想法到可运行的Shortcut,时间从15分钟缩短到3分钟
- 可版本控制:生成的.shortcut文件可以直接提交到Git仓库
但缺点也很明显:
- 当前仅支持macOS,iOS用户无法直接使用
- 对复杂逻辑(如嵌套循环、多条件分支)支持不够好,生成后需要手动调整
- 依赖Claude Code,意味着每次生成都需要消耗API额度
如果你经常写Shortcut,这个插件值得一试。至少,下次你老婆让你“做个自动发早安短信的快捷指令”时,你只需要说一句话——剩下的交给Claude。