惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
Spread Privacy
Spread Privacy
GbyAI
GbyAI
F
Fortinet All Blogs
小众软件
小众软件
B
Blog RSS Feed
博客园_首页
量子位
Y
Y Combinator Blog
美团技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Vercel News
Vercel News
Last Week in AI
Last Week in AI
F
Full Disclosure
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
A
About on SuperTechFans
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tenable Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
Engineering at Meta
Engineering at Meta
博客园 - 叶小钗
S
SegmentFault 最新的问题
T
Threat Research - Cisco Blogs
博客园 - 司徒正美
MyScale Blog
MyScale Blog
云风的 BLOG
云风的 BLOG
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost
S
Schneier on Security
Latest news
Latest news
I
Intezer
A
Arctic Wolf
T
Threatpost

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
如何开发一个 Raycast 扩展? - 少数派
2025-08-29 · via 少数派

前言

是的,我已经将 Alfred 换为 Raycast 了,后者的免费功能足够好用。

但也没有完全丢掉 Alfred,还在用它的剪贴板历史功能。

此前看到一个帖子说:Alfred 用户一定要试试 Raycast。当时我不以为意。

用了七、八年的 Alfred 几乎没怎么“变过”,有种不思进取的感觉。特别是近几年 AI 的发展,它好像还没反应过来一样。

对比

在使用 Alfred 时,用得最多的功能是:

  • Web Search - 快速跳转,通常用于搜索文档等。
  • Clipboard History - 剪贴板历史,没什么好说的,用过都说好用。
  • Workflow - 工作流,比如翻译、打开项目等,写过一两个插件,开发体验不好,能做的有限。

这些在 Raycast 都有替代方案,甚至更好。除此之外,Raycast 的界面更现代一些,跟最新的 macOS 风格更加契合。并且可以完全通过键盘完成一系列操作。

最重要的是,Raycast Extension 的开发体验比 Alfred 好太多了。官方有提供很多了 API,统一的 UI 风格,有统一的分发 Store,不用网上到处搜索。活跃度很高,目前扩展数量 2200+

比较麻烦的是,在 Raycast 发布扩展,需要经过官方审核,通过后才会上传到 Store,审核周期较慢。好处是能在一定程度上把控整体的风格,避免各扩展之间外观上参差不齐,能从官方角度提一些更好的交互建议。

开始之前

技术栈

Node.js + TypeScript + React

虽然使用 React 构建,但只能使用官方提供的一些 API 或内置组件,不能过多地自定义(可能是 React to macOS Native 的缘故吧),好处是 UI 风格较为统一。

安装扩展

  • 键入 Store 搜索安装
  • 键入 Import Extension 在本地导入

键入 Manage Extensions 可以管理本地扩展。

卸载扩展

  • 键入关键词,选中要卸载的扩展,在 Action Panel 选择 Uninstall Extension 操作即可,快捷键「⌃ + X」。
  • 键入 Manage Extension 可管理本地扩展。

在 Raycast 中卸载本地扩展(即非通过 Store 安装的扩展)时,本地扩展文件不会被删除。

扩展路径 ~/Library/Application Support/com.raycast.macos/extensions

创建扩展

键入 Create Extension 回车输入必要信息,便创建好了。

官方提供了多个模板,可以选择简单的 Show Detail 模板。

接着:

$ cd <your-extension-path>
$ npm install
$ npm run dev

调试扩展

当我们执行 npm run dev(即 ray develop)时,它会自动安装扩展,并以开发模式启动 Raycast 应用。

为了方便调试,在 Preferences - Advanced - Developer Tools 下勾选几个选项:

  • Auto-reload on Save
  • Open Raycast in development mode
  • Keep window always visible during development

这对开发体验尤为重要。一是开发过程中文件修改可以自动重载,二是使 Raycast 始终显示,以避免切换其他应用时窗口关闭。

在开发模式下,使用 console.log() 可以在终端上显示打印信息。

如果没有正确使用 API、组件或快捷键冲突,此处也会有 Warning 显示。

发布扩展

如果想要将你的扩展发布到 Store 上,是需要官方审核的。

为避免审核不通过,你的扩展应满足 Prepare an Extension for Store 要求。

二选一:

  • Fork 官方仓库,将你的扩展放在仓库 extensions 目录下,提交 PR。
  • 创建独立仓库,然后通过 ray publish 提交。

提交 PR 时,建议附上视频,或许可以更快地审核。我之前写了一个微信开发工具的扩展,由于他们没有小程序项目,流程上它们跑不通,可能会要求附上视频辅助审核,例如这个

If you add a new extension or command, include a screencast (or screenshot for straightforward changes). A good screencast will make the review much faster - especially if your extension requires registration in other services.

提交 PR 之后,机器人 greptile-apps 可能会提一些 Review 意见,按需调整即可。

想要吐槽的是,审核很慢,看 commit 记录一天只处理几个。

开发

Raycast Extension 官方开发文档

命名规范

遵循 Apple Style Guide,详见这里

示例:

  • 扩展标题:尽量使用名词,而不是动词,比如 WeChat DevTool。
  • 扩展描述:一句话准确、简洁地描述扩展程序的功能。
  • 命令标题:动名词组合,尽可能具体地描述命令的作用,比如 Open Project。
  • 命令副标题:为标题提供上下文信息。如果副标题几乎与命令标题重复,那么你可能不需要它。不指定时,该位置会显示扩展标题。
    • 示例:命令标题 Search Package,命令副标题 NPM,
    • 示例:命令标题 Search NPM Package,无命名副标题。
    • 以上示例,对于使用者来说,都是非常清晰明确的。
  • 命令描述:一句话准确、简洁地描述命令的功能。

本地化

很遗憾,目前 Raycast 扩展仅支持美式英文,不支持本地化语言,更多请看这里

不上传到 Store 可忽略。

扩展信息

基本上都在 package.json 声明,列举一些基本字段:

{
  "name": "wechat-devtool", // 包名
  "title": "WeChat DevTool", // 扩展标题
  "description": "Quickly open WeChat Mini Program projects via official CLI.", // 扩展描述
  "icon": "icon.png", // 扩展图标 512 × 512 的 PNG 图片
  "author": "tofrankie", // Raycast 账户用户名
  "contributors": ["someone"], // 贡献者 Raycast 用户名
  "license": "MIT", // 协议
  "categories": ["Developer Tools"], // 扩展分类
  "commands": [ // 命令列表
    {
      "name": "open-project", // 名称,跟入口文件同名
      "title": "Open Project", // 标题
      "description": "Open Mini Program projects via WeChat DevTool.", // 描述
      "mode": "view" // 模式
    },
    {
      "name": "configure-projects",
      "title": "Configure Projects",
      "description": "Configure Mini Program projects.",
      "mode": "view"
    }
  ],
  "preferences": [ // 扩展偏好设置
    {
      "name": "wechat-devtool-path", // 名称
      "type": "textfield", // 类型
      "title": "WeChat DevTool Path", // 标题
      "description": "The path to the WeChat DevTool executable.", // 描述
      "required": false // 是否必需
    }
  ],
  "keywords": [ // 关键词,可供 Store 搜索使用
    "Developer Tools",
    "WeChat",
    "WeChat DevTool",
    "WeChat Mini Program"
  ],
  // ...
}

目录结构:

.
├── assets                      # 静态资源目录
│   └── icon.png
├── CHANGELOG.md                # 变更日志
├── metadata                    # 扩展截图
│   ├── wechat-devtool-1.png
│   └── wechat-devtool-2.png
├── package.json                # 扩展信息等
├── README.md                   # About This Extension 会显示这个
├── src
│   ├── configure-projects.tsx  # 入口文件(跟 commands name 同名)
│   └── open-project.tsx        # 入口文件
└── tsconfig.json

一些注意点:

  • name:不能与 Store 已有扩展重复,可以在这里搜索一下。将用于发布后的扩展链接,比如: https://www.raycast.com/tofrankie/wechat-devtool
  • icon:图标放在 /assets 目录。其他需要跟扩展一同打包的静态资源都要放在此目录下。
  • author:是 Raycast 用户名,不是 GitHub 用户名。
  • license:若要发布到 Store,只能是 MIT 协议。
  • categories:至少选择一个,可选分类看这里
  • commands
    • mode:可选值 viewno-viewmenu-bar。比如,打开链接等不需要界面的命令操作,可以选择 no-view
  • preferences:偏好设置时可以同步的。
    • required:当设为 true 时,用户设置后才能使用其他命令。

更多请看 Extension PropertiesExtension Schemas

命令入口文件

入口文件放在 /src 目录下,文件名要与 commands[].name 保持一致。

命令为 view 模式,可以用官方提供的组件来构建界面,详见 User Interface

  • List 列表类型
  • Grid 网格类型
  • Detail 渲染 Markdown 内容、展示图片
  • Form 表单类型

虽然是用 React 编写的界面,但不能自由使用类似 div 或第三方组件库来构建复杂界面。

Action Panel

当我们使用 List、Detail、Form 等构建命令界面时,通常需要声明 Action Panel 来提供更多选项。

<List.Item
  // others...
  actions={
    <ActionPanel>
      <Action
        title="Open Project"
        icon={Icon.Terminal}
        onAction={() => {
          // do something...
        }}
      />
      <Action.Push
        title="Go to Configuration"
        icon={Icon.Gear}
        target={<ConfigureProjects />}
      />
      <Action.CopyToClipboard
        title="Copy Project Path"
        content={project.path}
        shortcut={{ modifiers: ["cmd", "shift"], key: "," }}
      />
      <Action
        title="Delete Project"
        icon={Icon.Trash}
        style={Action.Style.Destructive}
        onAction={() => {
          // do something...
        }}
      />
    </ActionPanel>
  }
/>

Raycast 提供了 Action.OpenAction.PushAction.CopyToClipboardAction.OpenInBrowser 等一系列内置命令以轻松完成常用操作,更多请看这里

对于危险操作,可以声明为 Action.Style.Destructive 以高亮显示,可以配合 confirmAlert 二次确认。

Action 快捷键

在 Action Panel 中,将第一、第二个操作作为 Primary Action 和 Secondary Action,它们会自动分配快捷键。

  • 在 List、Grid、Detail 页面分别 Enter、⌘ + Enter
  • 在 Form 页面分别是 ⌘ + Enter、⌘ + ⇧ + Enter

设定 Action 快捷键时,可以参考 Raycast 官方推荐的常用快捷键,以便使用各插件有一致的用户体验,更多请看这里

NamemacOSWindows
Copy⌘ + ⇧ + Cctrl + shift + C
CopyDeeplink⌘ + ⇧ + Cctrl + shift + C
CopyName⌘ + ⇧ + .ctrl + alt + C
CopyPath⌘ + ⇧ + ,alt + shift + C
Save⌘ + Sctrl + S
Duplicate⌘ + Dctrl + shift + S
Edit⌘ + Ectrl + E
MoveDown⌘ + ⇧ + ↓ctrl + shift + ↓
MoveUp⌘ + ⇧ + ↑ctrl + shift + ↑
New⌘ + Nctrl + N
Open⌘ + Octrl + O
OpenWith⌘ + ⇧ + Octrl + shift + O
Pin⌘ + ⇧ + Pctrl + .
Refresh⌘ + Rctrl + R
Remove⌃ + Xctrl + D
RemoveAll⌃ + ⇧ + Xctrl + shift + D
ToggleQuickLook⌘ + Yctrl + Y

图标、图片

开发扩展免不了使用图片,Raycast 已经内置了很多图标可直接使用,详见这里

还可以指定远程图片、本地文件等。

type ImageLike = URL | Asset | Icon | FileIcon | Image

type ImageSource = URL | Asset | Icon | { light: URL | Asset; dark: URL | Asset }
  • URL:如 HTTP 链接
  • Assetassets 目录的图片文件
  • Icon:Raycast 内置的图标
  • FileIcon:该文件/目录在 Finder 所显示的图标
  • Image:类型如 ImageSource,还可以指定浅色、深色主题的图片,命名形式 icon.pngicon@dark.png

图片着色:

import { Color, Icon, List } from "@raycast/api"

const tintedIcon = { source: Icon.RaycastLogoPos, tintColor: Color.Blue }

export default function Example() {
  return (
    <List>
      <List.Item title="Blue" icon={tintedIcon} />
    </List>
  )
}

本地 svg 图片同样也是可以着色的。

导航

  • 在 Action Panel 可以用 Action.Push 跳转目标页
  • 在页面可以使用 const { push, pop } = useNavigation() 跳转下一页或返回上一页
  • 使用 popToRoot() 可以返回 Raycast 根界面
  • 使用 closeMainWindow() 可以主动关闭 Raycast 窗口

搜索

使用 List 构建的页面带有一个搜索栏用于筛选,来源是 List.Item 的 titlekeywords 字段。

我发现,它没有根页面输入框那么智能,对筛选中文或拼音不太灵光的样子。

这种情况下,有两种解决方法:

  • 自定义搜索规则:searchText + onSearchTextChange
  • 丰富 keywords 内容

List Props

已后者为例,可以将项目名称、项目路径、项目名称拼音(若有中文)添加到 keywords 字段,参考 pinyin.ts

图片展示

若要展示一张图片,似乎只有 Detail + Markdown 的方式了。

export default function ImageView({ url }: { url: string }) {
  // 可通过 example.png?raycast-width=250&raycast-height=250 指定宽高
  const markdown = `![](${url})`;
  return <Detail markdown={markdown} />;
}

表单

没什么好说的,文档很详尽了,请看这里

Toast、Loading、Alert

提供的 API 有:

  • showToast 有 Success、Failure、Animated 三种,后者为 Loading 圈圈。如果 Raycast 窗口关闭了,会回退到 showHUD
  • showFailureToast 显示错误信息优先选择这个
  • showHUD Raycast 窗口时在屏幕下方显示一条信息
  • confirmAlert 用于危险操作的二次确认弹窗

环境信息

可以在 environment 获取:

import { useNavigation, showToast, Toast, showHUD, environment } from "@raycast/api";

environment.raycastVersion // 1.102.5
environment.ownerOrAuthorName // tofrankie
environment.extensionName // wechat-devtool
environment.commandName // open-project
environment.commandMode // view
environment.assetsPath // /Users/frankie/.config/raycast/extensions/wechat-devtool/assets
environment.supportPath // /Users/frankie/Library/Application Support/com.raycast.macos/extensions/wechat-devtool
environment.isDevelopment // true
environment.appearance // light
environment.textSize // medium
environment.launchType // userInitiated

扩展相关文件

  • assetsPath 扩展安装到 Raycast 的产物路径
  • supportPath 扩展相关文件,比如扩展记录一个配置文件,可以放在该目录下

需要注意的是,Raycast 不会同步 supportPath 目录的文件。

之前我想着把一些配置写入 supportPath 的文件,使其在 Raycast 中进行同步。但这是不行的,对扩展来说,只同步 preferences 的配置,而 preferences 又没办法动态更新。

Shell 环境

有时我们要在 Raycast 扩展中执行一些 Shell 命令。

下面是默认情况下的一些变量值。

$ echo $SHELL
/bin/zsh
$ echo $PATH
/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin:.
$ printenv
SUPPORT_PATH=/Users/frankie/Library/Application Support/com.raycast.macos/extensions/wechat-devtool
TMPDIR=/var/folders/z4/nxcp1z415jgff4rwrrf8v3y00000gn/T
ASSETS_PATH=/Users/frankie/.config/raycast/extensions/wechat-devtool/assets
LC_ALL=en_CN-u-hc-h23-u-ca-gregory-u-nu-latn
__CF_USER_TEXT_ENCODING=0x1F5:0x19:0x34
EXTENSION_NAME=wechat-devtool
RAYCAST_VERSION=1.102.5
PWD=/
FAVICON_PROVIDER=legacy
NODE_PATH=/Applications/Raycast.app/Contents/Resources/RaycastNodeExtensions_RaycastNodeExtensions.bundle/Contents/Resources/api/node_modules
NODE_ENV=development
SHLVL=1
HOME=/Users/frankie
COMMAND_NAME=open-project
RAYCAST_BUNDLE_ID=com.raycast.macos
_=/usr/bin/printenv

通常我们会在 ~/.zshrc 中配置 export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH" 以使用 Homebrew 安装的命令,但 Raycast 扩展执行 Shell 不会加载 ~/.zshrc 因此无法直接使用里面的命令。

可以这样处理(仅供参考):

import { exec } from "child_process";
import { promisify } from "util";

const execAsync = promisify(exec);

function execCommand(command: string, cwd?: sting) {
  const env = getEnv();
  await execAsync(command, { cwd, env });
  // do something...
}

function getEnv() {
  return { ...process.env, PATH: joinHomebrewPath() };
}

function joinHomebrewPath() {
  return [process.env.PATH, "/usr/local/bin", "/opt/homebrew/bin", "/opt/homebrew/sbin"].filter(Boolean).join(":");
}

Change Log

开发完成后,需要在 CHANGELOG.md 补充一条变更记录。

遵循 Keep a Changelog 写法,要求如下:

  • 格式必须是 ## [xxx] - {PR_MERGE_DATE}
  • [] 内的为本次变更的标题
  • {PR_MERGE_DATE} 为合并日期。因为从提交 PR 到审核通过可能要好几天,被合并时会自动替换

更多请看这里

# WeChat DevTool Changelog

## [New Version] - {PR_MERGE_DATE}

- Add something
- Improve something
- Fix something

## [First Release] - 2025-07-11

- **Open Project** - Open configured mini program project via WeChat DevTool CLI.
- **Graphical Configuration** - Complete graphical interface for dynamic project management.

截图

存放在 metadata 目录下,可提供 1 ~ 6 张截图。

Raycast 内置提供了截屏功能,在 Raycast Settings - Advanced - Window Capture 中设置快捷键(如 ⌥ + ⇧ + ⌘ + M)。

npm run dev 模式下启动扩展,按下快捷键,便可调出截屏窗口,并勾选上「Save to Metadata」,就会自动保存到扩展的 metadata 目录,更多请看这里

Raycast 提供了一些高清壁纸,请看这里

贡献

如果想对已发布的扩展作出贡献:

  1. fork raycast/extensions
  2. 功能调整...
  3. 将你的 Raycast 用户名添加到 package.json 的 contributors 字段
  4. 提交 PR,等待审核发布

由于审核较慢,如果同时多个扩展做出贡献,可以创建不同的分支去处理,如 ext/extension-a、ext/extension-b。