用自然语言生成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)等字段。插件的工作流是:

  1. 解析自然语言描述:Claude Code理解你的需求(如“每天上午9点检查天气,如果温度低于10°C,发送通知提醒带外套”)
  2. 映射到Shortcuts动作:插件内部维护了一个动作映射表,将“检查天气”映射到com.apple.shortcuts.actions.GetCurrentWeather等动作
  3. 生成plist结构:生成符合Shortcuts规范的二进制plist文件
  4. 输出到Finder:文件保存为.shortcut格式,双击即可导入

为什么需要插件?直接让Claude写plist不行吗?

我试过直接让Claude写plist,结果翻车率极高。原因是:

  • Shortcuts的plist结构复杂,嵌套层级深,Claude容易遗漏关键字段(如WFWorkflowClientReleaseWFWorkflowMinimumClientVersion
  • 动作参数格式不统一:有些用UUID,有些用字符串,Claude经常搞混
  • 生成的plist即使格式正确,导入后也可能因为版本不匹配而无法运行

Shortcuts Playground通过预置的模板和校验逻辑,大幅降低了出错率。

完整安装步骤(Mac用户专用)

当前仅支持macOS,iOS版本尚未发布。

前提条件

  • 安装Claude Code(需要Claude Pro订阅)
  • macOS 14.0+(测试环境为macOS 15.2)
  • 允许Claude Code访问文件系统(系统设置→隐私与安全性→完全磁盘访问权限→添加Claude Code)

安装插件

bash
1 2 3 4 5 6 7 8 9 10 11
# 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中添加:

bash
1 2
export SHORTCUTS_PLAYGROUND_PATH="/path/to/ShortcutsPlayground"
export SHORTCUTS_OUTPUT_DIR="$HOME/Desktop/Shortcuts"

实战:差Prompt vs 好Prompt

场景1:生成一个定时提醒快捷指令

差Prompt:

text
1
创建一个提醒我喝水的快捷指令

输出结果:

  • 生成一个简单的“显示提醒”动作,没有定时逻辑
  • 无法设置重复频率
  • 没有检查是否已有提醒的防重复机制

好Prompt:

text
1 2 3 4 5 6
创建一个快捷指令,名为“喝水提醒”:
1. 每天早上9点到晚上9点之间,每隔90分钟触发一次
2. 触发时显示弹窗提醒,内容为“该喝水了!已经过了90分钟”
3. 弹窗包含两个按钮:“好的”和“再提醒我一次”(再提醒一次则延迟15分钟)
4. 如果当前时间在晚上9点后,不触发任何提醒
5. 使用系统通知,不要用第三方App

输出结果:

  • 生成一个包含WFDelayUntilWFShowNotificationActionWFSwitch等动作的完整shortcut
  • 自动设置了WFWorkflowMinimumClientVersion为最新版本
  • 双击导入后直接运行,无报错

场景2:批量处理截图并生成PDF

差Prompt:

text
1
把最近10张截图变成PDF

输出结果:

  • 只选择了最近10张图片(不一定是截图)
  • 没有排序逻辑,顺序随机
  • PDF没有命名规则,直接叫“Untitled.pdf”

好Prompt:

text
1 2 3 4 5 6 7
创建一个快捷指令,名为“截图转PDF”:
1. 从“最近项目”中筛选出最近24小时内创建的截图(文件名包含“截图”或“Screenshot”的图片)
2. 按创建时间升序排列
3. 将选中的图片合并为一个PDF文件
4. PDF文件名格式为“截图合集_YYYYMMDD_HHmm.pdf”
5. 保存到桌面“截图PDF”文件夹(如果不存在则创建)
6. 完成后弹出通知,显示PDF路径和总页数

输出结果:

  • 正确筛选了截图(通过文件名和创建时间双重过滤)
  • 生成了带时间戳的PDF文件名
  • 自动创建了目标文件夹
  • 通知中显示了正确的页数

提示词模板(可直接复制)

模板1:通用快捷指令生成器

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
创建一个Apple Shortcut,名为{{NAME}}。

需求描述:
{{详细描述你的需求,包括:
- 触发条件(手动/定时/事件)
- 输入(文本/图片/文件/位置)
- 处理逻辑(过滤/转换/计算)
- 输出(通知/文件/URL/其他App)
- 异常处理(如果失败怎么办)}}

约束条件:
- 使用系统原生动作,避免第三方App依赖
- 所有变量名使用英文驼峰命名
- 如果涉及网络请求,添加超时处理(10秒)
- 生成后导出为.shortcut文件,保存在{{OUTPUT_PATH}}

模板2:定时自动化快捷指令

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
创建一个自动化快捷指令,名为{{NAME}}。

自动化类型:{{时间触发/日历事件触发/充电触发}}

触发条件:
- 时间:{{每天/工作日/周末}} {{具体时间}}
- 频率:{{一次/重复/仅在特定日期}}

执行内容:
{{详细描述每个步骤,用数字编号}}

特殊要求:
- 如果上次执行失败,跳过本次执行
- 执行完成后发送系统通知
- 记录执行日志到“快捷指令日志”文件

效果演示:输入→输出对比

输入(自然语言)

text
1
创建一个快捷指令:当我连接公司WiFi时,自动打开Slack和Notion,并关闭个人VPN。同时,发送一条通知告诉我已进入工作模式。

输出(生成的Shortcut结构)

yaml
1 2 3 4 5 6 7 8 9
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。

bash
1 2
# 在终端中运行
shortcuts run "Shortcuts Playground" <<< "创建一个快捷指令,它能每天自动备份我的Desktop文件夹到iCloud Drive,只保留最近7天的备份"

变体2:批量生成测试用Shortcut

如果你是开发者,需要测试Shortcuts在不同场景下的表现:

bash
1 2 3 4
# 生成10个不同功能的测试Shortcut
for i in {1..10}; do
  claude code --prompt "创建一个测试快捷指令,功能为:获取当前时间,如果小时数%2==0则发送通知,否则静默退出。命名为Test_$i"
done

变体3:集成到CI/CD流水线

在GitHub Actions中自动生成Shortcut,用于自动化测试:

yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
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格式错误或版本号不匹配。

解决方案:

bash
1 2
# 手动修复版本号
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)的入口。这意味着:

  1. 降低了门槛:不需要记住每个动作的UUID,不需要理解plist结构
  2. 提高了效率:从想法到可运行的Shortcut,时间从15分钟缩短到3分钟
  3. 可版本控制:生成的.shortcut文件可以直接提交到Git仓库

但缺点也很明显:

  • 当前仅支持macOS,iOS用户无法直接使用
  • 对复杂逻辑(如嵌套循环、多条件分支)支持不够好,生成后需要手动调整
  • 依赖Claude Code,意味着每次生成都需要消耗API额度

如果你经常写Shortcut,这个插件值得一试。至少,下次你老婆让你“做个自动发早安短信的快捷指令”时,你只需要说一句话——剩下的交给Claude。

延伸阅读